From 41a4afa4dae0697afad121f64b5d6f98eea24b08 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 23 Jan 2025 17:38:33 +1100 Subject: [PATCH 01/54] Added blacksmithy. --- maps/modpack_testing/modpack_testing.dm | 1 + maps/shaded_hills/shaded_hills-inn.dmm | 122 ++++++++-- maps/shaded_hills/shaded_hills-woods.dmm | 2 +- maps/shaded_hills/shaded_hills.dm | 1 + mods/content/blacksmithy/_blacksmithy.dm | 3 + mods/content/blacksmithy/_blacksmithy.dme | 19 ++ mods/content/blacksmithy/anvil.dm | 134 +++++++++++ mods/content/blacksmithy/billet.dm | 208 ++++++++++++++++++ mods/content/blacksmithy/boulder.dm | 23 ++ mods/content/blacksmithy/forge_fire.dm | 82 +++++++ mods/content/blacksmithy/forging_step.dm | 100 +++++++++ .../content/blacksmithy/forging_step_armor.dm | 37 ++++ .../blacksmithy/forging_step_billets.dm | 47 ++++ .../blacksmithy/forging_step_blades.dm | 59 +++++ .../blacksmithy/forging_step_components.dm | 15 ++ .../blacksmithy/forging_step_ornate.dm | 22 ++ .../content/blacksmithy/forging_step_tools.dm | 56 +++++ mods/content/blacksmithy/forging_types.dm | 41 ++++ mods/content/blacksmithy/icons/anvil.dmi | Bin 0 -> 558 bytes .../content/blacksmithy/icons/anvil_crude.dmi | Bin 0 -> 640 bytes .../blacksmithy/icons/anvil_crude_alt.dmi | Bin 0 -> 647 bytes .../blacksmithy/icons/anvil_improvised.dmi | Bin 0 -> 674 bytes mods/content/blacksmithy/icons/billet.dmi | Bin 0 -> 891 bytes mods/content/blacksmithy/icons/forge.dmi | Bin 0 -> 8551 bytes mods/content/blacksmithy/icons/tongs.dmi | Bin 0 -> 715 bytes mods/content/blacksmithy/tongs.dm | 32 +++ .../submaps/woods/bear_den/bear_den.dmm | 2 +- .../woods/chemistry_shack/chemistry_shack.dmm | 2 +- .../submaps/woods/hunter_camp/hunter_camp.dmm | 2 +- .../submaps/woods/old_cabin/old_cabin.dmm | 2 +- .../suspicious_cabin/suspicious_cabin.dmm | 2 +- mods/~compatibility/patches/fantasy.dm | 4 + .../patches/fantasy/forging_fantasy.dm | 2 + sound/effects/anvil1.ogg | Bin 0 -> 14190 bytes sound/effects/anvil2.ogg | Bin 0 -> 15947 bytes sound/effects/anvil3.ogg | Bin 0 -> 16630 bytes sound/effects/anvil4.ogg | Bin 0 -> 16206 bytes sound/effects/anvil5.ogg | Bin 0 -> 16458 bytes 38 files changed, 993 insertions(+), 27 deletions(-) create mode 100644 mods/content/blacksmithy/_blacksmithy.dm create mode 100644 mods/content/blacksmithy/_blacksmithy.dme create mode 100644 mods/content/blacksmithy/anvil.dm create mode 100644 mods/content/blacksmithy/billet.dm create mode 100644 mods/content/blacksmithy/boulder.dm create mode 100644 mods/content/blacksmithy/forge_fire.dm create mode 100644 mods/content/blacksmithy/forging_step.dm create mode 100644 mods/content/blacksmithy/forging_step_armor.dm create mode 100644 mods/content/blacksmithy/forging_step_billets.dm create mode 100644 mods/content/blacksmithy/forging_step_blades.dm create mode 100644 mods/content/blacksmithy/forging_step_components.dm create mode 100644 mods/content/blacksmithy/forging_step_ornate.dm create mode 100644 mods/content/blacksmithy/forging_step_tools.dm create mode 100644 mods/content/blacksmithy/forging_types.dm create mode 100644 mods/content/blacksmithy/icons/anvil.dmi create mode 100644 mods/content/blacksmithy/icons/anvil_crude.dmi create mode 100644 mods/content/blacksmithy/icons/anvil_crude_alt.dmi create mode 100644 mods/content/blacksmithy/icons/anvil_improvised.dmi create mode 100644 mods/content/blacksmithy/icons/billet.dmi create mode 100644 mods/content/blacksmithy/icons/forge.dmi create mode 100644 mods/content/blacksmithy/icons/tongs.dmi create mode 100644 mods/content/blacksmithy/tongs.dm create mode 100644 mods/~compatibility/patches/fantasy/forging_fantasy.dm create mode 100644 sound/effects/anvil1.ogg create mode 100644 sound/effects/anvil2.ogg create mode 100644 sound/effects/anvil3.ogg create mode 100644 sound/effects/anvil4.ogg create mode 100644 sound/effects/anvil5.ogg diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index e6dea707f305..8a080bb87a59 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -24,6 +24,7 @@ #include "../../mods/content/shackles/_shackles.dme" #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" + #include "../../mods/content/blacksmithy/_blacksmithy.dme" #include "../../mods/content/item_sharpening/_item_sharpening.dme" #include "../../mods/gamemodes/cult/_cult.dme" diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 7dc097ab79b6..0213b0de86c0 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -148,6 +148,10 @@ /obj/structure/cask_rack/large/mapped, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) +"fM" = ( +/obj/structure/working/bellows, +/turf/floor/path/basalt, +/area/shaded_hills/stable) "fR" = ( /turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) @@ -214,6 +218,10 @@ }, /turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) +"gJ" = ( +/mob/living/simple_animal/passive/horse/small, +/turf/floor/straw, +/area/shaded_hills/stable) "gL" = ( /obj/structure/reagent_dispensers/barrel/ebony/oil, /turf/floor/path/herringbone/basalt, @@ -232,6 +240,10 @@ "gU" = ( /turf/wall/brick/basalt, /area/shaded_hills/inn/kitchen) +"gW" = ( +/obj/structure/closet/crate/chest/ebony, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/stable) "hb" = ( /obj/structure/wall_sconce/lantern{ dir = 4; @@ -446,6 +458,10 @@ /obj/item/shears, /turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) +"mD" = ( +/obj/structure/bed/chair/rustic, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/stable) "mG" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 4 @@ -677,6 +693,10 @@ /obj/abstract/landmark/organize/horizontal, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) +"tH" = ( +/obj/structure/reagent_dispensers/barrel/ebony/wine, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/stable) "tS" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 8 @@ -771,6 +791,21 @@ /obj/structure/closet/crate/chest/ebony, /turf/floor/path/basalt, /area/shaded_hills/general_store) +"wp" = ( +/obj/structure/wall_sconce/lantern{ + dir = 4 + }, +/obj/structure/bed/chair/rustic{ + dir = 1 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/stable) +"xa" = ( +/obj/item/stack/material/bar/mapped/iron/thirty, +/obj/structure/table/wood/reinforced/ebony, +/obj/item/tongs, +/turf/floor/path/basalt, +/area/shaded_hills/stable) "xh" = ( /obj/structure/table/wood/ebony, /obj/item/chems/condiment/large/salt, @@ -785,6 +820,10 @@ "xH" = ( /turf/wall/brick/basalt, /area/shaded_hills/slaughterhouse) +"xI" = ( +/obj/structure/fire_source/forge, +/turf/floor/path/basalt, +/area/shaded_hills/stable) "xJ" = ( /obj/structure/table/desk/dresser/ebony, /turf/floor/carpet/rustic, @@ -893,6 +932,9 @@ /obj/structure/wall_sconce/lantern, /turf/floor/wood/rough/walnut, /area/shaded_hills/shrine/kitchen) +"At" = ( +/turf/wall/log/walnut/shutter/open, +/area/shaded_hills/stable) "Aw" = ( /obj/structure/railing/mapped/wooden/walnut{ dir = 4 @@ -922,6 +964,10 @@ /obj/item/bag/sack, /turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) +"AS" = ( +/mob/living/simple_animal/passive/horse, +/turf/floor/straw, +/area/shaded_hills/stable) "AW" = ( /obj/structure/railing/mapped/wooden/walnut, /obj/structure/flora/bush/brflowers, @@ -1186,6 +1232,10 @@ /obj/item/chems/glass/handmade/jar, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine/kitchen) +"HM" = ( +/obj/structure/reagent_dispensers/barrel/ebony/water, +/turf/floor/path/basalt, +/area/shaded_hills/stable) "HP" = ( /obj/structure/table/end/alt, /obj/item/flame/candle/handmade{ @@ -1283,6 +1333,12 @@ /obj/structure/wall_sconce/lantern, /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) +"JS" = ( +/obj/structure/bed/chair/rustic{ + dir = 1 + }, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/stable) "JU" = ( /obj/structure/railing/mapped/wooden/walnut, /turf/floor/wood/rough/walnut, @@ -1326,6 +1382,13 @@ }, /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) +"LA" = ( +/obj/structure/closet/crate/chest/ebony, +/obj/item/stack/material/brick/mapped/graphite/forty, +/obj/item/rock/flint/striker, +/obj/item/bladed/knife/iron, +/turf/floor/path/basalt, +/area/shaded_hills/stable) "LH" = ( /obj/structure/table/wood/ebony, /obj/item/chems/glass/bucket/wood, @@ -1419,6 +1482,10 @@ "Pa" = ( /turf/floor/path/running_bond/basalt, /area/shaded_hills/outside/downlands/poi) +"Pb" = ( +/obj/structure/closet/cabinet/wooden/ebony, +/turf/floor/wood/rough/walnut, +/area/shaded_hills/stable) "Pd" = ( /turf/floor/carpet/rustic, /area/shaded_hills/farmhouse) @@ -1450,6 +1517,10 @@ /obj/structure/reagent_dispensers/barrel/ebony/oil, /turf/floor/wood/rough/walnut, /area/shaded_hills/storehouse) +"Qa" = ( +/obj/structure/reagent_dispensers/barrel/ebony/oil, +/turf/floor/path/basalt, +/area/shaded_hills/stable) "Qb" = ( /turf/floor/carpet, /area/shaded_hills/inn) @@ -1502,6 +1573,11 @@ /obj/abstract/landmark/start/shaded_hills/innkeeper, /turf/floor/wood/walnut, /area/shaded_hills/inn) +"Rk" = ( +/obj/structure/anvil, +/obj/item/tool/hammer/forge/iron, +/turf/floor/path/basalt, +/area/shaded_hills/stable) "Rl" = ( /turf/floor/mud, /area/shaded_hills/outside/downlands) @@ -1818,6 +1894,10 @@ /obj/machinery/portable_atmospherics/hydroponics/soil, /turf/floor/mud, /area/shaded_hills/outside/shrine) +"ZC" = ( +/obj/structure/table/wood/ebony, +/turf/floor/wood/walnut, +/area/shaded_hills/stable) "ZD" = ( /obj/abstract/landmark/start/shaded_hills/bartender, /turf/floor/path/herringbone/basalt, @@ -13138,7 +13218,7 @@ nn nn nn nn -nn +At nn nn nn @@ -13287,19 +13367,19 @@ TR nn jA HP -js +Pb nn -js -js -js +mD +ZC +JS js nn +LA Ak Ak Ak Ak -Ak -Ak +HM nn TR TR @@ -13448,10 +13528,10 @@ js kE Ak Ak +fM Ak Ak -Ak -Ak +Qa nn aU TR @@ -13590,20 +13670,20 @@ TR TR nn bu -jf +wp js nn js jf -js -js +tH +gW nn Ak Ak +xI Ak Ak -Ak -Ak +xa HE KG EV @@ -13752,7 +13832,7 @@ nn nn Ak Ak -Ak +Rk Ak Ak Ak @@ -14198,19 +14278,19 @@ HI TR nn Wk -PA +Wk Wk nn Wk -PA +Wk Wk nn Wk -PA +Wk Wk nn Wk -PA +Wk Wk nn aU @@ -14350,7 +14430,7 @@ HI TR nn PA -PA +AS PA nn PA @@ -14358,7 +14438,7 @@ PA PA nn PA -PA +gJ PA nn PA diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 06a9695d6345..854c4bb10df2 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -8,7 +8,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/outside/woods) "cN" = ( -/obj/item/bladed/knife, +/obj/item/bladed/knife/iron, /turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "dp" = ( diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index ae5cb32e9460..0d7f2b5f7708 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -7,6 +7,7 @@ #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work #include "../../mods/content/item_sharpening/_item_sharpening.dme" #include "../../mods/content/fantasy/_fantasy.dme" + #include "../../mods/content/blacksmithy/_blacksmithy.dme" #include "areas/_areas.dm" #include "areas/downlands.dm" diff --git a/mods/content/blacksmithy/_blacksmithy.dm b/mods/content/blacksmithy/_blacksmithy.dm new file mode 100644 index 000000000000..978dbebe0d6e --- /dev/null +++ b/mods/content/blacksmithy/_blacksmithy.dm @@ -0,0 +1,3 @@ +/decl/modpack/blacksmithy + name = "Blacksmithy" + diff --git a/mods/content/blacksmithy/_blacksmithy.dme b/mods/content/blacksmithy/_blacksmithy.dme new file mode 100644 index 000000000000..3421d65d10fe --- /dev/null +++ b/mods/content/blacksmithy/_blacksmithy.dme @@ -0,0 +1,19 @@ +#ifndef MODPACK_BLACKSMITHY +#define MODPACK_BLACKSMITHY +// BEGIN_INCLUDE +#include "_blacksmithy.dm" +#include "anvil.dm" +#include "billet.dm" +#include "boulder.dm" +#include "forge_fire.dm" +#include "forging_step.dm" +#include "forging_step_armor.dm" +#include "forging_step_billets.dm" +#include "forging_step_blades.dm" +#include "forging_step_components.dm" +#include "forging_step_ornate.dm" +#include "forging_step_tools.dm" +#include "forging_types.dm" +#include "tongs.dm" +// END_INCLUDE +#endif diff --git a/mods/content/blacksmithy/anvil.dm b/mods/content/blacksmithy/anvil.dm new file mode 100644 index 000000000000..0968a7806ce5 --- /dev/null +++ b/mods/content/blacksmithy/anvil.dm @@ -0,0 +1,134 @@ +// Cut up from https://freesound.org/people/MrAuralization/sounds/274846/ (Avil, MrAuralization) (CC-BY-4) +/datum/composite_sound/anvil_strike + mid_sounds = list( + 'sound/effects/anvil1.ogg', + 'sound/effects/anvil2.ogg', + 'sound/effects/anvil3.ogg', + 'sound/effects/anvil4.ogg', + 'sound/effects/anvil5.ogg', + ) + mid_length = 1.5 SECONDS + var/mob/user + +/datum/composite_sound/anvil_strike/Destroy() + user = null + return ..() + +// This is a bit evil, but it should be cleaner than trying to run a second timing loop for the hammer strikes. +/datum/composite_sound/anvil_strike/play(soundfile) + . = ..() + for(var/obj/structure/anvil/anvil in output_atoms) + if(user) + user.do_attack_animation(anvil, user.get_active_held_item()) + anvil.shake_animation() + for(var/obj/item/thing in anvil.loc?.get_contained_external_atoms()) + thing.shake_animation() + spark_at(get_turf(anvil), amount = 1, spark_type = /datum/effect/effect/system/spark_spread/silent) + +/obj/structure/anvil + name = "anvil" + desc = "A heavy block of material used as support for hammering things into shape." + icon = 'mods/content/blacksmithy/icons/anvil.dmi' + icon_state = ICON_STATE_WORLD + anchored = TRUE + density = TRUE + opacity = FALSE + atom_flags = ATOM_FLAG_CLIMBABLE + w_class = ITEM_SIZE_STRUCTURE //_LARGE + material = /decl/material/solid/metal/iron + max_health = 1000 + structure_flags = STRUCTURE_FLAG_SURFACE + material_alteration = MAT_FLAG_ALTERATION_ALL + hitsound = 'sound/effects/anvil1.ogg' + var/datum/composite_sound/anvil_strike/clang + +/obj/structure/anvil/Initialize() + . = ..() + clang = new(list(src), FALSE) + +/obj/structure/anvil/Destroy() + QDEL_NULL(clang) + return ..() + +/obj/structure/anvil/proc/start_working(mob/user) + if(clang) + clang.user = user + if(!clang.started) + clang.start() + +/obj/structure/anvil/proc/stop_working() + if(clang) + clang.user = null + if(clang.started) + clang.stop() + +/obj/structure/anvil/on_update_icon() + . = ..() + icon_state = initial(icon_state) + switch(get_health_percent()) + if(0 to 0.35) + icon_state = "[icon_state]-damage-heavy" + if(0.35 to 0.65) + icon_state = "[icon_state]-damage-light" + +/obj/structure/anvil/attackby(obj/item/used_item, mob/user, click_params) + + // Put the bar from tongs onto the anvil. + if(istype(used_item, /obj/item/tongs)) + var/obj/item/tongs/tongs = used_item + if(tongs.holding_bar) + used_item = tongs.holding_bar + tongs.holding_bar.dropInto(loc) + // Flow through into procs below. + + // Put the bar onto the anvil (need to do this to avoid repairs in ..()) + if(istype(used_item, /obj/item/stack/material/bar)) + var/obj/item/stack/material/bar/bar = used_item + if(used_item.material != material || current_health >= get_max_health()) + if(bar.get_amount() > 1) + bar = bar.split(1) + if(bar.loc == user) + if(!user.try_unequip(bar, get_turf(src))) + return TRUE + else + bar.dropInto(get_turf(src)) + qdel(bar) + used_item = new /obj/item/billet(loc, used_item.material?.type) + // Flow through to billet placement below. + + // Place things onto the anvil. + if(!user.check_intent(I_FLAG_HARM) && (istype(used_item, /obj/item/tool/hammer/forge) || istype(used_item, /obj/item/tongs) || istype(used_item, /obj/item/billet))) + if(used_item.loc == user) + if(!user.try_unequip(used_item, get_turf(src))) + return TRUE + else + used_item.dropInto(get_turf(src)) + auto_align(used_item, click_params) + return TRUE + + . = ..() + +// Chipped out of a boulder with a pick. +/obj/structure/anvil/boulder + name_prefix = "crude" + icon = 'mods/content/blacksmithy/icons/anvil_crude.dmi' + desc = "A crude anvil chipped out of a chunk of stone. It probably won't last very long." + material = /decl/material/solid/stone/granite + max_health = 500 + +/obj/structure/anvil/boulder/Initialize(ml, _mat, _reinf_mat) + . = ..() + if(prob(50)) + set_icon('mods/content/blacksmithy/icons/anvil_crude_alt.dmi') + +// Improvised with spaceman materials. +/obj/structure/anvil/improvised + name_prefix = "improvised" + icon = 'mods/content/blacksmithy/icons/anvil_improvised.dmi' + desc = "A anvil roughly improvised out of scrap metal. It probably won't last very long." + material = /decl/material/solid/metal/steel + max_health = 500 + +/decl/stack_recipe/steel/furniture + result_type = /obj/structure/anvil/improvised + difficulty = MAT_VALUE_HARD_DIY diff --git a/mods/content/blacksmithy/billet.dm b/mods/content/blacksmithy/billet.dm new file mode 100644 index 000000000000..ac67f93bc68f --- /dev/null +++ b/mods/content/blacksmithy/billet.dm @@ -0,0 +1,208 @@ +// Turning billets back into bars. +/obj/item/stack/material/bar/attackby(obj/item/used_item, mob/user) + if(istype(used_item, /obj/item/billet) && used_item.material == material && !reinf_material) + var/obj/item/billet/billet = used_item + if(billet.current_forging_step && billet.current_forging_step.type != /decl/forging_step/billet) + to_chat(user, SPAN_WARNING("\The [used_item] will need to be melted down and recast before you can reuse it as a bar.")) + return TRUE + if(!user.try_unequip(used_item, loc)) + return TRUE + if(get_amount() >= get_max_amount()) + return TRUE + add(1) + qdel(used_item) + return TRUE + . = ..() + +/obj/item/proc/hot_enough_to_forge(melting_point_percent = 0.25) + if(!istype(material) || isnull(material.melting_point) || !material.forgable) + return FALSE + // Defaults to >25% of the way to melting to be considered 'forgable' + return temperature >= ((material.melting_point - T20C) * melting_point_percent) + T20C + +/obj/item/billet + name = "billet" + desc = "An unworked or partially-worked length of metal used to forge items and tools." + icon = 'mods/content/blacksmithy/icons/billet.dmi' + icon_state = ICON_STATE_WORLD + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL + var/decl/forging_step/current_forging_step = /decl/forging_step/billet + +/obj/item/billet/Initialize(ml, material_key) + if(ispath(current_forging_step)) + set_forging_step(current_forging_step, force = TRUE) + . = ..() + +/obj/item/billet/proc/set_forging_step(decl/forging_step/new_step, force) + if(ispath(new_step)) + new_step = GET_DECL(new_step) + if(!istype(new_step) || (!force && current_forging_step == new_step)) + return FALSE + current_forging_step = new_step + . = current_forging_step.apply_to(src) + if(!QDELETED(src)) + update_name() + update_icon() + update_heat_glow(anim_time = 0) // reset heat color to avoid weird visual jitter + +/obj/item/billet/attackby(obj/item/used_item, mob/user) + + // Merging billets back into bars. + if(istype(used_item, /obj/item/billet) && material == used_item.material) + if(current_forging_step && current_forging_step.type != /decl/forging_step/billet) + to_chat(user, SPAN_WARNING("\The [src] will need to be melted down and recast before you can reuse it as a bar.")) + return TRUE + var/obj/item/billet/billet = used_item + if(billet.current_forging_step && billet.current_forging_step.type != /decl/forging_step/billet) + to_chat(user, SPAN_WARNING("\The [billet] will need to be melted down and recast before you can reuse it as a bar.")) + return TRUE + if(user.try_unequip(used_item, loc)) + var/obj/item/stack/material/bar/bars = new(loc, 2, material.type) + bars.dropInto(loc) + qdel(used_item) + qdel(src) + return TRUE + + // Picking up in tongs. + if(istype(used_item, /obj/item/tongs)) + var/obj/item/tongs/tongs = used_item + if(tongs.holding_bar) + return ..() + var/mob/holder = loc + if(istype(holder)) + if(!holder.try_unequip(src, tongs)) + return TRUE + else if(loc?.storage) + if(!loc.storage.remove_from_storage(user, src, tongs)) + return TRUE + else + forceMove(tongs) + if(loc == tongs) + tongs.holding_bar = src + tongs.update_icon() + return TRUE + + if(!istype(used_item, /obj/item/tool/hammer/forge) || user.check_intent(I_FLAG_HARM)) + return ..() + + // Check for surface. + var/obj/structure/anvil/anvil = locate() in loc + if(!istype(anvil)) + to_chat(user, SPAN_WARNING("\The [src] can only be worked on an anvil.")) + return TRUE + + // Check for heat. + if(!hot_enough_to_forge()) + to_chat(user, SPAN_WARNING("\The [src] is too cold to be worked on the anvil.")) + return TRUE + + // Sanity check. + if(!length(current_forging_step?.steps)) // how tho + to_chat(user, SPAN_WARNING("You cannot see any further way to refine \the [src].")) + return TRUE + + // Handle the actual forging process. + var/last_step = current_forging_step + var/decl/forging_step/next_step = show_radial_menu(user, src, current_forging_step.get_radial_choices(), radius = 42, use_labels = RADIAL_LABELS_CENTERED, require_near = TRUE, check_locs = list(src)) + + if(!standard_forging_checks(user, used_item, last_step, next_step, anvil)) + return TRUE + + if(user.get_stamina() < 10) + to_chat(user, SPAN_WARNING("You are too exhausted to swing \the [used_item].")) + return TRUE + + user.adjust_stamina(-10) + anvil.start_working(user) + + // Skill checks! + if(!user.do_skilled(3 SECONDS, next_step.work_skill, anvil)) + anvil?.stop_working() + return TRUE + + if(!istype(next_step) || (next_step.skill_fail_prob && user.skill_fail_prob(next_step.work_skill, next_step.skill_fail_prob, next_step.skill_level, next_step.skill_factor))) + to_chat(user, SPAN_WARNING("You fumble the work and fail to reshape \the [src].")) + anvil?.stop_working() + return TRUE + + // Since we have a sleep() above, we recheck our basic conditions. + if(!standard_forging_checks(user, used_item, last_step, next_step, anvil)) + anvil?.stop_working() + return TRUE + + if(user.get_stamina() < 10) + to_chat(user, SPAN_WARNING("You are too exhausted to keep swinging \the [used_item].")) + anvil?.stop_working() + return TRUE + + user.adjust_stamina(-10) + + // Update the billet (which may produce an item!) + var/obj/item/forged_thing = set_forging_step(next_step) + if(istype(forged_thing)) + user.visible_message(SPAN_NOTICE("\The [user] has [next_step.work_verb] the billet into \a [forged_thing].")) + // Forging gradually degrades anvils. + if(!QDELETED(anvil)) + anvil.stop_working() + anvil.take_damage(rand(10, 20), BRUTE, silent = TRUE) // We are already going CLANG CLANG CLANG, don't need a THUNK + return TRUE + +/obj/item/billet/examine(mob/user, distance, infix, suffix) + . = ..() + for(var/decl/forging_step/next_step in current_forging_step?.steps) + if(user.skill_check(next_step.work_skill, next_step.skill_level)) + to_chat(user, SPAN_INFO("It can be [next_step.work_verb] into \a [next_step.get_product_name(material)] on an anvil.")) + +/obj/item/billet/proc/standard_forging_checks(mob/user, obj/item/used_item, decl/forging_step/last_step, decl/forging_step/next_step, obj/structure/anvil/anvil) + // We cancelled or changed state, abort. + if(!next_step || current_forging_step != last_step || !(next_step in current_forging_step.steps)) + return FALSE + // Something has been destroyed since we started forging. + if(QDELETED(src) || QDELETED(used_item) || QDELETED(anvil) || QDELETED(user)) + return FALSE + // Something else has changed, very unfortunate. + if(loc != anvil.loc || !CanPhysicallyInteract(user) || user.get_active_held_item() != used_item) + return FALSE + return hot_enough_to_forge() + +/obj/item/billet/on_update_icon() + . = ..() + if(!istype(current_forging_step)) + return + if(current_forging_step.billet_icon) + set_icon(current_forging_step.billet_icon) + else + set_icon(initial(icon)) + icon_state = get_world_inventory_state() + if(current_forging_step.billet_icon_state) + icon_state = "[icon_state]-[current_forging_step.billet_icon_state]" + +/obj/item/billet/get_world_inventory_state() + if(!current_forging_step?.billet_icon_state) + return ..() + if(!check_state_in_icon("[ICON_STATE_INV]-[current_forging_step.billet_icon_state]", icon)) + return ICON_STATE_WORLD + return ..() + +/obj/item/billet/update_name() + if(!istype(current_forging_step)) + base_name = initial(base_name) + name_prefix = initial(name_prefix) + desc = initial(desc) + return ..() + base_name = current_forging_step.billet_name + name_prefix = current_forging_step.billet_name_prefix + . = ..() + desc = current_forging_step.billet_desc + if(istype(material)) + desc = "[desc] This one is made of [material.solid_name]." + +/obj/item/billet/ProcessAtomTemperature() + . = ..() + update_heat_glow() + +// Arbitrary value to give people enough time to forge the bloody thing. +/obj/item/billet/get_thermal_mass_coefficient(delta) + // Only delay cooling if we're over our forging point. + return delta < 0 && hot_enough_to_forge() ? 0.01 : ..() diff --git a/mods/content/blacksmithy/boulder.dm b/mods/content/blacksmithy/boulder.dm new file mode 100644 index 000000000000..73ce542cf98a --- /dev/null +++ b/mods/content/blacksmithy/boulder.dm @@ -0,0 +1,23 @@ +/obj/structure/boulder/get_alt_interactions(mob/user) + . = ..() + LAZYADD(., /decl/interaction_handler/chip_anvil) + +/decl/interaction_handler/chip_anvil + name = "Chip Into Anvil" + expected_target_type = /obj/structure/boulder + var/work_skill = SKILL_CONSTRUCTION + +/decl/interaction_handler/chip_anvil/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() && istype(prop) && IS_PICK(prop) && prop.material?.hardness >= target.get_material()?.hardness && user.skill_check(work_skill, SKILL_BASIC) + +/decl/interaction_handler/chip_anvil/invoked(atom/target, mob/user, obj/item/prop) + user.visible_message(SPAN_NOTICE("\The [user] begins chipping \the [target] into a rough anvil using \the [prop].")) + if(!user.do_skilled(10 SECONDS, work_skill, target)) + return FALSE + if(QDELETED(user) || QDELETED(target) || QDELETED(prop) || user.get_active_held_item() != prop || !CanPhysicallyInteractWith(user, target)) + return FALSE + if(!is_possible(target, user, prop)) + return FALSE + user.visible_message(SPAN_NOTICE("\The [user] chips \the [target] into a rough anvil using \the [prop].")) + new /obj/structure/anvil/boulder(get_turf(target), target.get_material()?.type) + return TRUE diff --git a/mods/content/blacksmithy/forge_fire.dm b/mods/content/blacksmithy/forge_fire.dm new file mode 100644 index 000000000000..437c9cd1c1c8 --- /dev/null +++ b/mods/content/blacksmithy/forge_fire.dm @@ -0,0 +1,82 @@ +/datum/storage/forge + can_hold = list( + /obj/item/stack/material/bar, + /obj/item/billet + ) + max_storage_space = ITEM_SIZE_NORMAL * 10 // Fairly spacious + max_w_class = ITEM_SIZE_LARGE + +/datum/storage/forge/consolidate_stacks() + return // We want to keep them as single bars. + +/obj/structure/fire_source/forge + name = "forge fire" + desc = "A sturdy hearth used to heat metal bars for forging on an anvil." + density = TRUE + icon = 'mods/content/blacksmithy/icons/forge.dmi' + icon_state = "forge" + storage = /datum/storage/forge + +/obj/structure/fire_source/forge/proc/get_forgable_contents() + . = list() + for(var/obj/item/thing in get_stored_inventory()) + if(thing.material?.forgable && (istype(thing, /obj/item/billet) || istype(thing, /obj/item/stack/material/bar))) + . += thing + +/obj/structure/fire_source/forge/attackby(obj/item/used_item, mob/user) + + // Raw materials. + if(istype(used_item, /obj/item/stack/material/bar)) + var/obj/item/stack/material/bar/bar = used_item + if(used_item.material != material || current_health >= get_max_health()) + if(bar.get_amount() > 1) + bar = bar.split(1) + if(bar.loc == user) + if(!user.try_unequip(bar, get_turf(src))) + return TRUE + else + bar.dropInto(get_turf(src)) + qdel(bar) + used_item = new /obj/item/billet(loc, used_item.material?.type) + // Flows through to below. + + // Partially worked billets. + if(istype(used_item, /obj/item/billet)) + if(used_item.loc == user) + user.try_unequip(used_item, loc) + else + used_item.dropInto(loc) + if(storage.can_be_inserted(used_item, user)) + storage.handle_item_insertion(user, used_item) + update_icon() + return TRUE + + // Tongs holding bars or partially worked billets. + if(istype(used_item, /obj/item/tongs) && !user.check_intent(I_FLAG_HARM)) + + // Put whatever's in the tongs into storage. + var/obj/item/tongs/tongs = used_item + if(tongs.holding_bar) + return attackby(tongs.holding_bar, user) + + // Check if we have any bars. + var/list/bars = get_forgable_contents() + if(!length(bars)) + to_chat(user, SPAN_WARNING("There are no bars in \the [src] to retrieve.")) + return TRUE + + // Get the hottest bar. + var/obj/item/hottest_bar + for(var/obj/item/bar in bars) + if(!hottest_bar || bar.temperature > hottest_bar) + hottest_bar = bar + + // Extract a single bar from the forge with the tongs. + if(storage.remove_from_storage(user, hottest_bar, tongs)) + tongs.holding_bar = hottest_bar + if(tongs.holding_bar) + user.visible_message(SPAN_NOTICE("\The [user] pulls \the [tongs.holding_bar] from \the [src] with \the [tongs].")) + tongs.update_icon() + return TRUE + + return ..() diff --git a/mods/content/blacksmithy/forging_step.dm b/mods/content/blacksmithy/forging_step.dm new file mode 100644 index 000000000000..44eaa8824a74 --- /dev/null +++ b/mods/content/blacksmithy/forging_step.dm @@ -0,0 +1,100 @@ +/decl/forging_step + abstract_type = /decl/forging_step + /// Base name, generated from billet_name and billet_name_prefix. + var/name + /// Name to use for the actual billet item. + var/billet_name = "billet" + /// Name prefix to use for the billet at this stage. + var/billet_name_prefix + /// Description to use for the billet at this stage. + var/billet_desc + /// Icon state modifier to use for the billet at this stage. + var/billet_icon_state + /// Icon to use for the billet (for modpacks/downstreams) + var/billet_icon = 'mods/content/blacksmithy/icons/billet.dmi' + /// List of available /decl/forging_step instances. + var/list/steps + /// Probability of failing this step if we're below skill_level. + var/skill_fail_prob = 30 + /// Impact of skill against probability of failure. + var/skill_factor = 1 + /// Skill level where failing this step becomes impossible. + var/skill_level = SKILL_ADEPT + /// What skill this step requires. + var/work_skill = SKILL_CONSTRUCTION + /// Descriptive string for this action. + var/work_verb = "forged" + +/decl/forging_step/Initialize() + + // Resolve our types now to get it out of the way. + for(var/step in steps) + steps -= step + steps += GET_DECL(step) + + if(billet_name_prefix) + name = jointext(list(billet_name_prefix, billet_name), " ") + else + name = billet_name + + . = ..() + +/decl/forging_step/validate() + . = ..() + if(!istext(name)) + . += "null or invalid name" + if(!istext(billet_desc)) + . += "null or invalid billet_desc" + if(!length(steps) && !istype(src, /decl/forging_step/product)) + . += "null or empty steps list" + if(billet_icon_state) + if(billet_icon) + if(!check_state_in_icon("[ICON_STATE_WORLD]-[billet_icon_state]", billet_icon)) + . += "missing billet icon state '[ICON_STATE_WORLD]-[billet_icon_state]' from icon '[billet_icon]'" + else + . += "missing billet_icon" + +/decl/forging_step/proc/get_product_name(decl/material/billet_material) + . = billet_name + if(billet_material) + . = "[billet_material.adjective_name] [.]" + if(billet_name_prefix) + . = "[billet_name_prefix] [.]" + +/decl/forging_step/proc/get_radial_choices() + for(var/decl/forging_step/step in steps) + var/image/radial_button = new + radial_button.name = capitalize(step.name) + LAZYSET(., step, radial_button) + +/decl/forging_step/proc/apply_to(obj/item/billet/billet) + return billet + +// There are effectively finished products. +/decl/forging_step/product + // Dummy strings to avoid validate() fails; shouldn't be used anywhere. + name = "finished product" + billet_desc = "A finished product." + abstract_type = /decl/forging_step/product + var/product_type = /obj/item/stick + +/decl/forging_step/product/get_product_name(decl/material/billet_material) + return atom_info_repository.get_name_for(product_type, billet_material?.type) + +/decl/forging_step/product/apply_to(obj/item/billet/billet) + var/obj/item/thing = new product_type(null, billet.material?.type) + thing.dropInto(billet.loc) + thing.pixel_x = billet.pixel_x + thing.pixel_y = billet.pixel_y + thing.pixel_w = billet.pixel_w + thing.pixel_z = billet.pixel_z + thing.temperature = billet.temperature + thing.update_heat_glow(anim_time = 0) + + if(billet.paint_color) + thing.paint_color = billet.paint_color + thing.update_icon() + qdel(billet) + thing.base_name = name + thing.update_name() + return thing diff --git a/mods/content/blacksmithy/forging_step_armor.dm b/mods/content/blacksmithy/forging_step_armor.dm new file mode 100644 index 000000000000..f0633652912e --- /dev/null +++ b/mods/content/blacksmithy/forging_step_armor.dm @@ -0,0 +1,37 @@ +/decl/forging_step/armour_plates + billet_desc = "A set of worked metal plates, a few steps and fittings away from forming some kind of armour." + billet_name = "armour plates" + billet_icon_state = "armour" + steps = list( + /decl/forging_step/product/breastplate, + /decl/forging_step/product/cuirass, + /decl/forging_step/product/banded + ) + +/decl/forging_step/armour_segments + billet_desc = "A set of small worked metal plates, a few steps and fittings away from forming a helmet, or arm or leg armour." + billet_name = "armour segments" + billet_icon_state = "helmet" + steps = list( + /decl/forging_step/product/helmet, + /decl/forging_step/product/sabatons, + /decl/forging_step/product/vambraces + ) + +/decl/forging_step/product/breastplate + product_type = /obj/item/clothing/suit/armor/forged/breastplate + +/decl/forging_step/product/cuirass + product_type = /obj/item/clothing/suit/armor/forged/cuirass + +/decl/forging_step/product/banded + product_type = /obj/item/clothing/suit/armor/forged/banded + +/decl/forging_step/product/helmet + product_type = /obj/item/clothing/head/helmet/plumed + +/decl/forging_step/product/sabatons + product_type = /obj/item/clothing/shoes/sabatons + +/decl/forging_step/product/vambraces + product_type = /obj/item/clothing/gloves/vambrace diff --git a/mods/content/blacksmithy/forging_step_billets.dm b/mods/content/blacksmithy/forging_step_billets.dm new file mode 100644 index 000000000000..f1c23273b93a --- /dev/null +++ b/mods/content/blacksmithy/forging_step_billets.dm @@ -0,0 +1,47 @@ +/decl/forging_step/billet + billet_desc = "An unworked length of metal used to forge items and tools." + steps = list( + /decl/forging_step/thin_billet, + /decl/forging_step/curved_billet, + /decl/forging_step/flat_bar, + /decl/forging_step/punched_billet + ) + +/decl/forging_step/thin_billet + billet_name_prefix = "thin" + billet_icon_state = "thin" + billet_desc = "A thin, elongated length of metal used to forge items and tools." + steps = list( + /decl/forging_step/blade_blank, + /decl/forging_step/ornate_blank + ) + +/decl/forging_step/curved_billet + billet_name_prefix = "curved" + billet_icon_state = "curved" + billet_desc = "A curved length of metal used to forge items and tools." + steps = list( + /decl/forging_step/product/hook, + /decl/forging_step/product/chain, + /decl/forging_step/product/horseshoe + ) + +/decl/forging_step/flat_bar + billet_name = "bar" + billet_name_prefix = "flat" + billet_icon_state = "flat" + billet_desc = "A flattened bar of metal used to forge armour components and plates." + steps = list( + /decl/forging_step/armour_plates, + /decl/forging_step/armour_segments, + /decl/forging_step/product/shield_fasteners + ) + +/decl/forging_step/punched_billet + billet_name_prefix = "punched" + billet_icon_state = "punched" + billet_desc = "A punched bar of metal used to forge items and tools" + steps = list( + /decl/forging_step/tool_head_blank, + /decl/forging_step/product/tongs + ) diff --git a/mods/content/blacksmithy/forging_step_blades.dm b/mods/content/blacksmithy/forging_step_blades.dm new file mode 100644 index 000000000000..253a1dd73321 --- /dev/null +++ b/mods/content/blacksmithy/forging_step_blades.dm @@ -0,0 +1,59 @@ +/decl/forging_step/blade_blank + billet_name = "blade blank" + billet_icon_state = "blade" + billet_desc = "A roughly shaped, dull blade. It will need further refinement before it can be finished." + steps = list( + /decl/forging_step/long_blade_blank, + /decl/forging_step/short_sword_blank + ) + +/decl/forging_step/long_blade_blank + billet_name = "blade blank" + billet_name_prefix = "long" + billet_desc = "A long, dull and unrefined blade, only a step from being a finished product." + + steps = list( + /decl/forging_step/product/longsword_blade, + /decl/forging_step/product/broadsword_blade, + /decl/forging_step/product/rapier_blade + ) + +/decl/forging_step/short_sword_blank + billet_name = "blade blank" + billet_name_prefix = "short" + billet_desc = "A short, dull and unrefined blade, only a step from being a finished product." + steps = list( + /decl/forging_step/product/poignard_blade, + /decl/forging_step/product/knife_blade, + /decl/forging_step/product/shortsword_blade, + /decl/forging_step/product/spear_head + ) + +// TODO: make these blades, add weapon crafting. +/decl/forging_step/product/longsword_blade + billet_name = "longsword" + product_type = /obj/item/bladed/longsword/forged + +/decl/forging_step/product/broadsword_blade + billet_name = "broadsword" + product_type = /obj/item/bladed/broadsword/forged + +/decl/forging_step/product/rapier_blade + billet_name = "rapier" + product_type = /obj/item/bladed/rapier/forged + +/decl/forging_step/product/poignard_blade + billet_name = "poignard" + product_type = /obj/item/bladed/poignard/forged + +/decl/forging_step/product/knife_blade + billet_name = "knife" + product_type = /obj/item/bladed/knife/forged + +/decl/forging_step/product/shortsword_blade + billet_name = "shortsword" + product_type = /obj/item/bladed/shortsword/forged + +/decl/forging_step/product/spear_head + billet_name = "spear" + product_type = /obj/item/bladed/polearm/spear/forged diff --git a/mods/content/blacksmithy/forging_step_components.dm b/mods/content/blacksmithy/forging_step_components.dm new file mode 100644 index 000000000000..6e508d3aa528 --- /dev/null +++ b/mods/content/blacksmithy/forging_step_components.dm @@ -0,0 +1,15 @@ +/decl/forging_step/product/hook + billet_name = "hook" + product_type = /obj/item/hook + +/decl/forging_step/product/chain + billet_name = "chain" + product_type = /obj/item/chain + +/decl/forging_step/product/horseshoe + billet_name = "horseshoe" + product_type = /obj/item/horseshoe + +/decl/forging_step/product/shield_fasteners + billet_name = "shield fasteners" + product_type = /obj/item/shield_fasteners diff --git a/mods/content/blacksmithy/forging_step_ornate.dm b/mods/content/blacksmithy/forging_step_ornate.dm new file mode 100644 index 000000000000..515d9d57d21f --- /dev/null +++ b/mods/content/blacksmithy/forging_step_ornate.dm @@ -0,0 +1,22 @@ +/decl/forging_step/ornate_blank + billet_name = "blank" + billet_name_prefix = "ornate" + billet_icon_state = "ornate" + billet_desc = "An ornate piece of worked metal. It still needs some last touches to be made into something useful." + steps = list( + /decl/forging_step/product/candelabra, + /decl/forging_step/product/decanter, + /decl/forging_step/product/goblet + ) + +/decl/forging_step/product/candelabra + billet_name = "candelabra" + product_type = /obj/item/candelabra + +/decl/forging_step/product/goblet + billet_name = "goblet" + product_type = /obj/item/chems/glass/handmade/fancy/goblet + +/decl/forging_step/product/decanter + billet_name = "decanter" + product_type =/obj/item/chems/glass/handmade/fancy/decanter \ No newline at end of file diff --git a/mods/content/blacksmithy/forging_step_tools.dm b/mods/content/blacksmithy/forging_step_tools.dm new file mode 100644 index 000000000000..d7cfb50501bb --- /dev/null +++ b/mods/content/blacksmithy/forging_step_tools.dm @@ -0,0 +1,56 @@ +/decl/forging_step/tool_head_blank + billet_desc = "A heavy piece of shaped metal, almost suitable for use as the head of a tool. It still needs some last touches to be made into something useful." + billet_name = "tool head blank" + billet_icon_state = "tool_head" + steps = list( + /decl/forging_step/product/hoe_head, + /decl/forging_step/product/shovel_head, + /decl/forging_step/hammer_head_blank, + /decl/forging_step/product/chisel_head + ) + +/decl/forging_step/hammer_head_blank + billet_name = "hammer head blank" + billet_desc = "A worked slab of material in the rough shape of a hammer head, only a step from being a finished product." + steps = list( + /decl/forging_step/product/pickaxe_head, + /decl/forging_step/product/sledge_head, + /decl/forging_step/product/hammer_head, + /decl/forging_step/product/forging_hammer_head + ) + +/decl/forging_step/product/tongs + billet_name = "tongs" + product_type = /obj/item/tongs + +/decl/forging_step/product/chisel_head + billet_name = "chisel head" + product_type = /obj/item/tool_component/head/chisel + +/decl/forging_step/product/hammer_head + billet_name = "hammer head" + product_type = /obj/item/tool_component/head/hammer + +/decl/forging_step/product/shovel_head + billet_name = "shovel head" + product_type = /obj/item/tool_component/head/shovel + +/decl/forging_step/product/hoe_head + billet_name = "hoe head" + product_type = /obj/item/tool_component/head/hoe + +/decl/forging_step/product/handaxe_head + billet_name = "handaxe head" + product_type = /obj/item/tool_component/head/handaxe + +/decl/forging_step/product/pickaxe_head + billet_name = "pickaxe head" + product_type = /obj/item/tool_component/head/pickaxe + +/decl/forging_step/product/sledge_head + billet_name = "sledge head" + product_type = /obj/item/tool_component/head/sledgehammer + +/decl/forging_step/product/forging_hammer_head + billet_name = "forging hammer head" + product_type = /obj/item/tool_component/head/forging_hammer diff --git a/mods/content/blacksmithy/forging_types.dm b/mods/content/blacksmithy/forging_types.dm new file mode 100644 index 000000000000..f766d39982da --- /dev/null +++ b/mods/content/blacksmithy/forging_types.dm @@ -0,0 +1,41 @@ +/obj/item/bladed/longsword/forged + material = /decl/material/solid/metal/iron + hilt_material = null + guard_material = null + pommel_material = null + +/obj/item/bladed/broadsword/forged + material = /decl/material/solid/metal/iron + hilt_material = null + guard_material = null + pommel_material = null + +/obj/item/bladed/rapier/forged + material = /decl/material/solid/metal/iron + hilt_material = null + guard_material = null + pommel_material = null + +/obj/item/bladed/poignard/forged + material = /decl/material/solid/metal/iron + hilt_material = null + guard_material = null + pommel_material = null + +/obj/item/bladed/knife/forged + material = /decl/material/solid/metal/iron + hilt_material = null + guard_material = null + pommel_material = null + +/obj/item/bladed/shortsword/forged + material = /decl/material/solid/metal/iron + hilt_material = null + guard_material = null + pommel_material = null + +/obj/item/bladed/polearm/spear/forged + material = /decl/material/solid/metal/iron + hilt_material = null + guard_material = null + pommel_material = null diff --git a/mods/content/blacksmithy/icons/anvil.dmi b/mods/content/blacksmithy/icons/anvil.dmi new file mode 100644 index 0000000000000000000000000000000000000000..403390e3251b07446c3c448e3f7d64e7d9893ddb GIT binary patch literal 558 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 Vg97Go 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 literal 0 HcmV?d00001 diff --git a/sound/effects/anvil3.ogg b/sound/effects/anvil3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ad3747c0f32fbe5f0d6f60c275e70ed9cdb6cd6d GIT binary patch literal 16630 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 ONR&I~X$+$##{U8Q#p2}v literal 0 HcmV?d00001 diff --git a/sound/effects/anvil4.ogg b/sound/effects/anvil4.ogg new file mode 100644 index 0000000000000000000000000000000000000000..88da5eb8bb66880789be7fd18d0278b51e0d7a48 GIT binary patch literal 16206 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 V5~2G)C3d>}#lZ5jpaCoJKLFIUyC47n literal 0 HcmV?d00001 diff --git a/sound/effects/anvil5.ogg b/sound/effects/anvil5.ogg new file mode 100644 index 0000000000000000000000000000000000000000..80533e38aebe040c69ced978ad7645330c86c1a4 GIT binary patch literal 16458 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 EAEQgt;{X5v literal 0 HcmV?d00001 From 5f370594df16a744c97d3890089dc6b0113f332b Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 2 Feb 2025 00:52:13 +0000 Subject: [PATCH 02/54] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 3 +++ html/changelogs/AutoChangeLog-pr-4796.yml | 4 ---- 3 files changed, 9 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4796.yml diff --git a/html/changelog.html b/html/changelog.html index 2c838c27eee2..447a6de969fa 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

02 February 2025

+

Penelope Haze updated:

+
    +
  • Modified liquid and coating presentation to be more fancy.
  • +
+

29 January 2025

MistakeNot4892 updated:

From 7ff55da4db3376d7e4595a546119bf445440d2ab Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 7 Feb 2025 08:47:20 +1100 Subject: [PATCH 13/54] Automatic changelog generation for PR #4837 [ci skip] --- html/changelogs/AutoChangeLog-pr-4837.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4837.yml diff --git a/html/changelogs/AutoChangeLog-pr-4837.yml b/html/changelogs/AutoChangeLog-pr-4837.yml new file mode 100644 index 000000000000..7cf93b0c976a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4837.yml @@ -0,0 +1,5 @@ +author: Penelope Haze +changes: + - {tweak: 'Shears are now used to add or remove padding from objects. Wirecutters + still work as a backup, though.'} +delete-after: true From ef859787e5a391e406bcec95dcaa1a707c952da8 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 4 Feb 2025 03:03:14 -0500 Subject: [PATCH 14/54] Make chairs not a subtype of bed --- code/controllers/subsystems/jobs.dm | 2 +- code/datums/supplypacks/medical.dm | 2 +- .../effects/decals/Cleanable/humans.dm | 4 +- code/game/objects/effects/footprints.dm | 2 +- .../objects/items/weapons/extinguisher.dm | 2 +- code/game/objects/structures/beds/bed.dm | 27 +-- .../game/objects/structures/beds/rollerbed.dm | 1 + code/game/objects/structures/benches/bench.dm | 34 +-- .../game/objects/structures/benches/lounge.dm | 6 +- code/game/objects/structures/benches/pew.dm | 8 +- code/game/objects/structures/chairs/chairs.dm | 229 ++++++++++-------- .../structures/chairs/rustic_chairs.dm | 6 +- .../objects/structures/chairs/wheelchair.dm | 22 +- code/game/objects/structures/flaps.dm | 6 +- code/game/objects/structures/janicart.dm | 30 ++- .../recipes_hardness_integrity.dm | 20 +- .../crafting/stack_recipes/recipes_planks.dm | 4 +- code/modules/holodeck/HolodeckObjects.dm | 2 +- .../mob/living/human/human_movement.dm | 2 +- .../simple_animal/hostile/retaliate/parrot.dm | 2 +- code/modules/random_map/drop/droppod.dm | 2 +- maps/away/bearcat/bearcat.dm | 2 +- .../ascent/structures/ship_furniture.dm | 6 +- tools/map_migrations/4838_chairs.txt | 2 + 24 files changed, 226 insertions(+), 197 deletions(-) create mode 100644 tools/map_migrations/4838_chairs.txt diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index 28244f810e9d..311b9f487c0f 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -503,7 +503,7 @@ SUBSYSTEM_DEF(jobs) spawnpoint.after_join(H) // Moving wheelchair if they have one - if(H.buckled && istype(H.buckled, /obj/structure/bed/chair/wheelchair)) + if(H.buckled && istype(H.buckled, /obj/structure/chair/wheelchair)) H.buckled.forceMove(H.loc) H.buckled.set_dir(H.dir) diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index bdf9b34ff936..855a5d525731 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -80,7 +80,7 @@ /decl/hierarchy/supply_pack/medical/wheelchair name = "Equipment - Wheelchair crate" - contains = list(/obj/structure/bed/chair/wheelchair) + contains = list(/obj/structure/chair/wheelchair) containertype = /obj/structure/closet/crate/large containername = "\improper Wheelchair crate" diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index f2198e90718e..115e71b7df9d 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -113,8 +113,8 @@ if(!isliving(AM) || amount < 1) return var/mob/living/walker = AM - if(istype(walker.buckled, /obj/structure/bed/chair/wheelchair)) - var/obj/structure/bed/chair/wheelchair/wheelchair = walker.buckled + if(istype(walker.buckled, /obj/structure/chair/wheelchair)) + var/obj/structure/chair/wheelchair/wheelchair = walker.buckled wheelchair.bloodiness = 4 else walker.add_walking_contaminant(chemical, amount, (blood_data ? blood_data[pick(blood_data)] : null)) diff --git a/code/game/objects/effects/footprints.dm b/code/game/objects/effects/footprints.dm index 09ea5bddc7bb..3f38937b7aa0 100644 --- a/code/game/objects/effects/footprints.dm +++ b/code/game/objects/effects/footprints.dm @@ -48,7 +48,7 @@ return null if(buckled || current_posture?.prone) return 'icons/mob/footprints/footprints_trail.dmi' - if(istype(buckled, /obj/structure/bed/chair)) + if(istype(buckled, /obj/structure/chair)) return 'icons/mob/footprints/footprints_wheelchair.dmi' var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) if(istype(shoes) && shoes.footprint_icon) diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index b48963aecd7a..5610bf4cf254 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -69,7 +69,7 @@ if(O.anchored || !(O.movable_flags & MOVABLE_FLAG_WHEELED)) return - var/obj/structure/bed/chair/C = istype(O, /obj/structure/bed/chair)? O : null + var/obj/structure/chair/C = istype(O, /obj/structure/chair)? O : null //#TODO: That could definitely be improved. Would suggest to use process_momentum but its only for thrownthing var/list/move_speed = list(1, 1, 1, 2, 2, 3) for(var/i in 1 to 6) diff --git a/code/game/objects/structures/beds/bed.dm b/code/game/objects/structures/beds/bed.dm index ad432669f7d5..058eff22fd9f 100644 --- a/code/game/objects/structures/beds/bed.dm +++ b/code/game/objects/structures/beds/bed.dm @@ -1,7 +1,4 @@ // Beds... get your mind out of the gutter, they're for sleeping! -// TODO by end of Q2 2025: Repath /obj/structure/bed/chair to just /obj/structure/chair. -// Remaining steps: -// - Move padding interactions and padding_color var onto an extension /obj/structure/bed name = "bed" desc = "A raised, padded platform for sleeping on. This one has straps for ensuring restful snoozing in microgravity." @@ -19,6 +16,7 @@ parts_type = /obj/item/stack/material/rods user_comfort = 1 obj_flags = OBJ_FLAG_SUPPORT_MOB + monetary_worth_multiplier = 2.5 // Utility structures should be worth more than their matter (wheelchairs, rollers, etc). /// The padding extension type for this bed. If null, no extension is created and this bed cannot be padded. var/padding_extension_type = /datum/extension/padding var/decl/material/initial_padding_material @@ -34,9 +32,6 @@ return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT) return ..() -/obj/structure/bed/get_base_value() - . = round(..() * 2.5) // Utility structures should be worth more than their matter (wheelchairs, rollers, etc). - /obj/structure/bed/get_surgery_surface_quality(mob/living/victim, mob/living/user) return OPERATE_PASSABLE @@ -56,35 +51,29 @@ new_name = "[name_prefix] [new_name]" SetName(new_name) -/obj/structure/bed/update_material_desc() +/obj/structure/bed/update_material_desc(override_desc) + var/base_desc = override_desc || initial(desc) var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__) var/decl/material/padding_material = padding_extension?.get_padding_material() if(padding_material) - desc = "[initial(desc)] It's made of [material.use_name] and covered with [padding_material.use_name]." + desc = "[base_desc] It's made of [material.use_name] and covered with [padding_material.use_name]." else - desc = "[initial(desc)] It's made of [material.use_name]." - -/obj/structure/bed/proc/get_base_icon() - return ICON_STATE_WORLD + desc = "[base_desc] It's made of [material.use_name]." /obj/structure/bed/on_update_icon() ..() - icon_state = get_base_icon() + icon_state = ICON_STATE_WORLD var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__) var/decl/material/padding_material = padding_extension?.get_padding_material() if(padding_material) add_overlay(overlay_image(icon, "[icon_state]_padding", material_alteration & MAT_FLAG_ALTERATION_COLOR ? padding_extension.get_padding_color() : null, RESET_COLOR|RESET_ALPHA)) +// Used to allow things to pass over dense beds, e.g. rollerbeds, ironing boards /obj/structure/bed/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(istype(mover) && mover.checkpass(PASS_FLAG_TABLE)) - return 1 + return TRUE return ..() -/obj/structure/bed/explosion_act(severity) - . = ..() - if(. && !QDELETED(src) && (severity == 1 || (severity == 2 && prob(50)) || (severity == 3 && prob(5)))) - physically_destroyed() - /obj/structure/bed/psych name = "psychiatrist's couch" desc = "For prime comfort during psychiatric evaluations." diff --git a/code/game/objects/structures/beds/rollerbed.dm b/code/game/objects/structures/beds/rollerbed.dm index 657d86c04c9d..a919d9f30bc9 100644 --- a/code/game/objects/structures/beds/rollerbed.dm +++ b/code/game/objects/structures/beds/rollerbed.dm @@ -15,6 +15,7 @@ var/iv_attached = 0 var/iv_stand = TRUE +// this completely circumvents normal bed icon updating, does this really even need to be a bed subtype? /obj/structure/bed/roller/on_update_icon() cut_overlays() if(density) diff --git a/code/game/objects/structures/benches/bench.dm b/code/game/objects/structures/benches/bench.dm index 97be5c19b7f1..30cf502c7213 100644 --- a/code/game/objects/structures/benches/bench.dm +++ b/code/game/objects/structures/benches/bench.dm @@ -1,5 +1,5 @@ // These are benches with backs. For backless benches that can't be buckled to, check for /obj/structure/table/bench. -/obj/structure/bed/chair/bench +/obj/structure/chair/bench name = "bench" desc = "A simple slatted bench." icon = 'icons/obj/structures/furniture/bench.dmi' @@ -12,73 +12,73 @@ /// A bitfield of connected neighbors. var/neighbors = 0 -/obj/structure/bed/chair/bench/should_have_alpha_mask() +/obj/structure/chair/bench/should_have_alpha_mask() if(!simulated || !isturf(loc)) return FALSE - var/obj/structure/bed/chair/bench/south_neighbor = locate() in get_step(loc, SOUTH) + var/obj/structure/chair/bench/south_neighbor = locate() in get_step(loc, SOUTH) if(can_visually_connect_to(south_neighbor)) // if we're connected to a south neighbor don't add an alpha mask return TRUE return TRUE // TODO: make this use the generic structure smoothing system? -/obj/structure/bed/chair/bench/can_visually_connect_to(var/obj/structure/bed/chair/bench/other) +/obj/structure/chair/bench/can_visually_connect_to(var/obj/structure/chair/bench/other) return istype(other) && other.dir == dir && other.icon == icon && other.material == material -/obj/structure/bed/chair/bench/Initialize(mapload) +/obj/structure/chair/bench/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD -/obj/structure/bed/chair/bench/LateInitialize(mapload) +/obj/structure/chair/bench/LateInitialize(mapload) ..() if(mapload) recalculate_connections() else update_neighbors() -/obj/structure/bed/chair/bench/Destroy() +/obj/structure/chair/bench/Destroy() var/oldloc = loc . = ..() update_neighbors(oldloc) -/obj/structure/bed/chair/bench/set_dir() +/obj/structure/chair/bench/set_dir() var/olddir = dir . = ..() if(.) update_neighbors(update_dir = olddir, skip_icon_update = TRUE) update_neighbors(update_dir = dir) -/obj/structure/bed/chair/bench/Move() +/obj/structure/chair/bench/Move() var/oldloc = loc . = ..() if(.) update_neighbors(oldloc, skip_icon_update = TRUE) update_neighbors(loc) -/obj/structure/bed/chair/bench/proc/update_neighbors(update_loc = loc, update_dir = dir, skip_icon_update) +/obj/structure/chair/bench/proc/update_neighbors(update_loc = loc, update_dir = dir, skip_icon_update) if(!skip_icon_update) recalculate_connections() if(!isturf(update_loc)) return for(var/stepdir in list(turn(update_dir, -90), turn(update_dir, 90))) - for(var/obj/structure/bed/chair/bench/other in get_step(update_loc, stepdir)) + for(var/obj/structure/chair/bench/other in get_step(update_loc, stepdir)) other.recalculate_connections() // TODO: Make this use base structure smoothing eventually? Somehow? -/obj/structure/bed/chair/bench/proc/recalculate_connections() +/obj/structure/chair/bench/proc/recalculate_connections() neighbors = 0 if(!isturf(loc)) neighbors = 0 else for(var/checkdir in list(turn(dir, -90), turn(dir, 90))) var/turf/check_turf = get_step(loc, checkdir) - for(var/obj/structure/bed/chair/bench/other in check_turf) + for(var/obj/structure/chair/bench/other in check_turf) // TODO: Make this use normal structure smoothing helpers. if(other.dir == dir && other.icon == icon && other.material == material) neighbors |= checkdir break update_icon() -/obj/structure/bed/chair/bench/get_base_icon() +/obj/structure/chair/bench/get_base_icon() . = ..() var/left_dir = turn(dir, -90) var/right_dir = turn(dir, 90) @@ -92,13 +92,13 @@ else . += "_standing" -/obj/structure/bed/chair/bench/get_material_icon() +/obj/structure/chair/bench/get_material_icon() return material?.bench_icon || initial(icon) -/obj/structure/bed/chair/bench/mahogany +/obj/structure/chair/bench/mahogany color = WOOD_COLOR_RICH material = /decl/material/solid/organic/wood/mahogany -/obj/structure/bed/chair/bench/ebony +/obj/structure/chair/bench/ebony color = WOOD_COLOR_BLACK material = /decl/material/solid/organic/wood/ebony diff --git a/code/game/objects/structures/benches/lounge.dm b/code/game/objects/structures/benches/lounge.dm index 38863dd68cf3..a1bc8fc097a8 100644 --- a/code/game/objects/structures/benches/lounge.dm +++ b/code/game/objects/structures/benches/lounge.dm @@ -1,13 +1,13 @@ -/obj/structure/bed/chair/bench/lounge +/obj/structure/chair/bench/lounge name = "lounge" desc = "An elegant lounge, perfect for reclining on." icon = 'icons/obj/structures/furniture/lounge.dmi' // Just use the existing icon. -/obj/structure/bed/chair/bench/lounge/get_material_icon() +/obj/structure/chair/bench/lounge/get_material_icon() return icon || initial(icon) -/obj/structure/bed/chair/bench/lounge/mapped +/obj/structure/chair/bench/lounge/mapped color = /decl/material/solid/organic/wood/mahogany::color material = /decl/material/solid/organic/wood/mahogany initial_padding_material = /decl/material/solid/organic/cloth diff --git a/code/game/objects/structures/benches/pew.dm b/code/game/objects/structures/benches/pew.dm index 0b5f9211d815..fe5425214c0b 100644 --- a/code/game/objects/structures/benches/pew.dm +++ b/code/game/objects/structures/benches/pew.dm @@ -1,15 +1,15 @@ -/obj/structure/bed/chair/bench/pew +/obj/structure/chair/bench/pew name = "pew" desc = "A long bench with a backboard, commonly found in places of worship, courtrooms and so on. Not known for being particularly comfortable." icon = 'icons/obj/structures/furniture/pew.dmi' -/obj/structure/bed/chair/bench/pew/get_material_icon() +/obj/structure/chair/bench/pew/get_material_icon() return material?.pew_icon || initial(icon) -/obj/structure/bed/chair/bench/pew/mahogany +/obj/structure/chair/bench/pew/mahogany color = /decl/material/solid/organic/wood/mahogany::color material = /decl/material/solid/organic/wood/mahogany -/obj/structure/bed/chair/bench/pew/ebony +/obj/structure/chair/bench/pew/ebony color = /decl/material/solid/organic/wood/ebony::color material = /decl/material/solid/organic/wood/ebony diff --git a/code/game/objects/structures/chairs/chairs.dm b/code/game/objects/structures/chairs/chairs.dm index f91dfcc4119e..5bc36823d97e 100644 --- a/code/game/objects/structures/chairs/chairs.dm +++ b/code/game/objects/structures/chairs/chairs.dm @@ -1,41 +1,68 @@ -//YES, chairs are a type of bed. Hopefully this will be fixed by the end of Q2 2025. -/obj/structure/bed/chair +/obj/structure/chair name = "chair" desc = "You sit in this, either by will or force." icon = 'icons/obj/structures/furniture/chair.dmi' - icon_state = "world_preview" + icon_state = ICON_STATE_WORLD + "_preview" + anchored = TRUE + can_buckle = TRUE + buckle_lying = FALSE // force people to sit up in chairs when buckled + buckle_sound = 'sound/effects/buckle.ogg' + material = DEFAULT_FURNITURE_MATERIAL + material_alteration = MAT_FLAG_ALTERATION_ALL + tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + parts_amount = 2 + parts_type = /obj/item/stack/material/rods color = "#666666" - buckle_dir = 0 - buckle_lying = 0 //force people to sit up in chairs when buckled obj_flags = OBJ_FLAG_ROTATABLE | OBJ_FLAG_SUPPORT_MOB user_comfort = 0.5 + monetary_worth_multiplier = 2.5 // Utility structures should be worth more than their matter (wheelchairs, rollers, etc). var/propelled = 0 // Check for fire-extinguisher-driven chairs var/has_special_overlay = FALSE + /// The padding extension type for this chair. If null, no extension is created and this chair cannot be padded. + var/padding_extension_type = /datum/extension/padding + var/decl/material/initial_padding_material + var/initial_padding_color -/obj/structure/bed/chair/do_simple_ranged_interaction(var/mob/user) +/obj/structure/chair/Initialize(ml, _mat, _reinf_mat) + . = ..() + if(padding_extension_type && initial_padding_material) + get_or_create_extension(src, padding_extension_type, initial_padding_material, initial_padding_color) + +/obj/structure/chair/do_simple_ranged_interaction(var/mob/user) if(!buckled_mob && user) rotate(user) return TRUE -/obj/structure/bed/chair/post_buckle_mob() +/obj/structure/chair/post_buckle_mob() update_icon() return ..() +// Allow self-buckling even without dexterity. +// Copied from beds; do we actually want this? +/obj/structure/chair/user_can_mousedrop_onto(mob/user, atom/being_dropped, incapacitation_flags, params) + if(user == being_dropped) + return user.Adjacent(src) && !user.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_KNOCKOUT) + return ..() + /// Returns an alternate icon based on our material. /// Mostly used by benches. /// TODO: Refactor to eliminate? -/obj/structure/bed/chair/proc/get_material_icon() +/obj/structure/chair/proc/get_material_icon() return icon -/obj/structure/bed/chair/update_materials() +/obj/structure/chair/update_materials() . = ..() var/icon/material_icon = get_material_icon() if(material_icon) icon = material_icon -/obj/structure/bed/chair/on_update_icon() - ..() // handles setting icon_state to get_base_icon(), and adds padding +/obj/structure/chair/proc/get_base_icon() + return ICON_STATE_WORLD + +/obj/structure/chair/on_update_icon() + ..() + icon_state = get_base_icon() var/base_color = get_color() var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__) var/use_padding_color = padding_extension?.get_padding_color(material_alteration & MAT_FLAG_ALTERATION_COLOR) @@ -48,6 +75,7 @@ I.layer = use_layer add_overlay(I) if(padding_extension?.get_padding_material()) + add_overlay(overlay_image(icon, "[icon_state]_padding", padding_extension.get_padding_color(material_alteration & MAT_FLAG_ALTERATION_COLOR), RESET_COLOR|RESET_ALPHA)) I = overlay_image(icon, "[icon_state]_padding_over", use_padding_color, RESET_COLOR) I.layer = use_layer add_overlay(I) @@ -59,7 +87,18 @@ I.layer = use_layer add_overlay(I) -/obj/structure/bed/chair/rotate(mob/user) +// No name override, a cotton-padded metal chair shouldn't be a cotton chair, it should be a metal chair. + +/obj/structure/chair/update_material_desc(override_desc) + var/base_desc = override_desc || initial(desc) + var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__) + var/decl/material/padding_material = padding_extension?.get_padding_material() + if(padding_material) + desc = "[base_desc] It's made of [material.use_name] and padded with [padding_material.use_name]." + else + desc = "[base_desc] It's made of [material.use_name]." + +/obj/structure/chair/rotate(mob/user) if(!CanPhysicallyInteract(user)) to_chat(user, SPAN_NOTICE("You can't interact with \the [src] right now!")) return @@ -67,60 +106,60 @@ set_dir(turn(dir, 90)) update_icon() -/obj/structure/bed/chair/padded +/obj/structure/chair/padded initial_padding_material = /decl/material/solid/organic/cloth -/obj/structure/bed/chair/padded/red +/obj/structure/chair/padded/red initial_padding_color = "#9d2300" -/obj/structure/bed/chair/padded/brown +/obj/structure/chair/padded/brown initial_padding_material = /decl/material/solid/organic/leather -/obj/structure/bed/chair/padded/teal +/obj/structure/chair/padded/teal initial_padding_color = "#00e1ff" -/obj/structure/bed/chair/padded/black +/obj/structure/chair/padded/black initial_padding_color = "#505050" -/obj/structure/bed/chair/padded/green +/obj/structure/chair/padded/green initial_padding_color = "#b7f27d" -/obj/structure/bed/chair/padded/purple +/obj/structure/chair/padded/purple initial_padding_color = "#9933ff" -/obj/structure/bed/chair/padded/blue +/obj/structure/chair/padded/blue initial_padding_color = "#46698c" -/obj/structure/bed/chair/padded/beige +/obj/structure/chair/padded/beige initial_padding_color = "#ceb689" -/obj/structure/bed/chair/padded/lime +/obj/structure/chair/padded/lime initial_padding_color = "#62e36c" -/obj/structure/bed/chair/padded/yellow +/obj/structure/chair/padded/yellow initial_padding_color = "#ffbf00" // Leaving this in for the sake of compilation. -/obj/structure/bed/chair/comfy +/obj/structure/chair/comfy name = "comfy chair" desc = "It's a chair. It looks comfy." icon = 'icons/obj/structures/furniture/chair_comfy.dmi' initial_padding_material = /decl/material/solid/organic/cloth -/obj/structure/bed/chair/comfy/unpadded +/obj/structure/chair/comfy/unpadded initial_padding_material = null -/obj/structure/bed/chair/comfy/brown +/obj/structure/chair/comfy/brown initial_padding_material = /decl/material/solid/organic/leather -/obj/structure/bed/chair/comfy/red +/obj/structure/chair/comfy/red initial_padding_color = "#9d2300" -/obj/structure/bed/chair/comfy/teal +/obj/structure/chair/comfy/teal initial_padding_color = "#00e1ff" -/obj/structure/bed/chair/comfy/black +/obj/structure/chair/comfy/black initial_padding_color = "#505050" -/obj/structure/bed/chair/comfy/green +/obj/structure/chair/comfy/green initial_padding_color = "#b7f27d" -/obj/structure/bed/chair/comfy/purple +/obj/structure/chair/comfy/purple initial_padding_color = "#9933ff" -/obj/structure/bed/chair/comfy/blue +/obj/structure/chair/comfy/blue initial_padding_color = "#46698c" -/obj/structure/bed/chair/comfy/beige +/obj/structure/chair/comfy/beige initial_padding_color = "#ceb689" -/obj/structure/bed/chair/comfy/lime +/obj/structure/chair/comfy/lime initial_padding_color = "#62e36c" -/obj/structure/bed/chair/comfy/yellow +/obj/structure/chair/comfy/yellow initial_padding_color = "#ffbf00" -/obj/structure/bed/chair/comfy/captain +/obj/structure/chair/comfy/captain name = "captain chair" desc = "It's a chair. Only for the highest ranked asses." icon = 'icons/obj/structures/furniture/chair_captain.dmi' @@ -130,36 +169,36 @@ initial_padding_color = "#46698c" has_special_overlay = TRUE -/obj/structure/bed/chair/armchair +/obj/structure/chair/armchair name = "armchair" desc = "It's an armchair. It looks comfy." icon = 'icons/obj/structures/furniture/armchair.dmi' initial_padding_material = /decl/material/solid/organic/cloth -/obj/structure/bed/chair/armchair/unpadded +/obj/structure/chair/armchair/unpadded initial_padding_material = null -/obj/structure/bed/chair/armchair/brown +/obj/structure/chair/armchair/brown initial_padding_material = /decl/material/solid/organic/leather -/obj/structure/bed/chair/armchair/red +/obj/structure/chair/armchair/red initial_padding_color = "#9d2300" -/obj/structure/bed/chair/armchair/teal +/obj/structure/chair/armchair/teal initial_padding_color = "#00e1ff" -/obj/structure/bed/chair/armchair/black +/obj/structure/chair/armchair/black initial_padding_color = "#505050" -/obj/structure/bed/chair/armchair/green +/obj/structure/chair/armchair/green initial_padding_color = "#b7f27d" -/obj/structure/bed/chair/armchair/purple +/obj/structure/chair/armchair/purple initial_padding_color = "#9933ff" -/obj/structure/bed/chair/armchair/blue +/obj/structure/chair/armchair/blue initial_padding_color = "#46698c" -/obj/structure/bed/chair/armchair/beige +/obj/structure/chair/armchair/beige initial_padding_color = "#ceb689" -/obj/structure/bed/chair/armchair/lime +/obj/structure/chair/armchair/lime initial_padding_color = "#62e36c" -/obj/structure/bed/chair/armchair/yellow +/obj/structure/chair/armchair/yellow initial_padding_color = "#ffbf00" -/obj/structure/bed/chair/office +/obj/structure/chair/office name = "office chair" icon = 'icons/obj/structures/furniture/chair_office.dmi' anchored = FALSE @@ -167,7 +206,7 @@ movable_flags = MOVABLE_FLAG_WHEELED initial_padding_material = /decl/material/solid/organic/cloth -/obj/structure/bed/chair/office/Move() +/obj/structure/chair/office/Move() . = ..() if(buckled_mob) var/mob/living/occupant = buckled_mob @@ -179,7 +218,7 @@ else unbuckle_mob() -/obj/structure/bed/chair/office/Bump(atom/A) +/obj/structure/chair/office/Bump(atom/A) ..() if(!buckled_mob) return @@ -205,66 +244,66 @@ victim.apply_damage(10, BRUTE, def_zone) occupant.visible_message("[occupant] crashed into \the [A]!") -/obj/structure/bed/chair/office/light +/obj/structure/chair/office/light initial_padding_color = "#f0f0f0" -/obj/structure/bed/chair/office/dark +/obj/structure/chair/office/dark initial_padding_color = "#505050" -/obj/structure/bed/chair/office/comfy +/obj/structure/chair/office/comfy name = "comfy office chair" desc = "It's an office chair. It looks comfy." icon = 'icons/obj/structures/furniture/chair_comfy_office.dmi' -/obj/structure/bed/chair/office/comfy/unpadded +/obj/structure/chair/office/comfy/unpadded initial_padding_material = null -/obj/structure/bed/chair/office/comfy/brown +/obj/structure/chair/office/comfy/brown initial_padding_material = /decl/material/solid/organic/leather -/obj/structure/bed/chair/office/comfy/red +/obj/structure/chair/office/comfy/red initial_padding_color = "#9d2300" -/obj/structure/bed/chair/office/comfy/teal +/obj/structure/chair/office/comfy/teal initial_padding_color = "#00e1ff" -/obj/structure/bed/chair/office/comfy/black +/obj/structure/chair/office/comfy/black initial_padding_color = "#505050" -/obj/structure/bed/chair/office/comfy/green +/obj/structure/chair/office/comfy/green initial_padding_color = "#b7f27d" -/obj/structure/bed/chair/office/comfy/purple +/obj/structure/chair/office/comfy/purple initial_padding_color = "#9933ff" -/obj/structure/bed/chair/office/comfy/blue +/obj/structure/chair/office/comfy/blue initial_padding_color = "#46698c" -/obj/structure/bed/chair/office/comfy/beige +/obj/structure/chair/office/comfy/beige initial_padding_color = "#ceb689" -/obj/structure/bed/chair/office/comfy/lime +/obj/structure/chair/office/comfy/lime initial_padding_color = "#62e36c" -/obj/structure/bed/chair/office/comfy/yellow +/obj/structure/chair/office/comfy/yellow initial_padding_color = "#ffbf00" -/obj/structure/bed/chair/rounded +/obj/structure/chair/rounded name = "rounded chair" desc = "It's a rounded chair. It looks comfy." icon = 'icons/obj/structures/furniture/chair_rounded.dmi' -/obj/structure/bed/chair/rounded/brown +/obj/structure/chair/rounded/brown initial_padding_material = /decl/material/solid/organic/leather -/obj/structure/bed/chair/rounded/red +/obj/structure/chair/rounded/red initial_padding_color = "#9d2300" -/obj/structure/bed/chair/rounded/teal +/obj/structure/chair/rounded/teal initial_padding_color = "#00e1ff" -/obj/structure/bed/chair/rounded/black +/obj/structure/chair/rounded/black initial_padding_color = "#505050" -/obj/structure/bed/chair/rounded/green +/obj/structure/chair/rounded/green initial_padding_color = "#b7f27d" -/obj/structure/bed/chair/rounded/purple +/obj/structure/chair/rounded/purple initial_padding_color = "#9933ff" -/obj/structure/bed/chair/rounded/blue +/obj/structure/chair/rounded/blue initial_padding_color = "#46698c" -/obj/structure/bed/chair/rounded/beige +/obj/structure/chair/rounded/beige initial_padding_color = "#ceb689" -/obj/structure/bed/chair/rounded/lime +/obj/structure/chair/rounded/lime initial_padding_color = "#62e36c" -/obj/structure/bed/chair/rounded/yellow +/obj/structure/chair/rounded/yellow initial_padding_color = "#ffbf00" -/obj/structure/bed/chair/shuttle +/obj/structure/chair/shuttle name = "shuttle seat" desc = "A comfortable, secure seat. It has a sturdy-looking buckling system for smoother flights." icon = 'icons/obj/structures/furniture/chair_shuttle.dmi' @@ -273,19 +312,19 @@ initial_padding_material = /decl/material/solid/organic/cloth has_special_overlay = TRUE -/obj/structure/bed/chair/shuttle/get_base_icon() +/obj/structure/chair/shuttle/get_base_icon() . = ..() if (buckled_mob) . += "_buckled" -/obj/structure/bed/chair/shuttle/blue +/obj/structure/chair/shuttle/blue initial_padding_color = "#46698c" -/obj/structure/bed/chair/shuttle/black +/obj/structure/chair/shuttle/black initial_padding_color = "#505050" -/obj/structure/bed/chair/shuttle/white +/obj/structure/chair/shuttle/white initial_padding_color = "#f0f0f0" -/obj/structure/bed/chair/wood +/obj/structure/chair/wood name_prefix = "classic" desc = "Old is never too old to not be in fashion." icon = 'icons/obj/structures/furniture/chair_wooden.dmi' @@ -293,37 +332,37 @@ material = /decl/material/solid/organic/wood/oak padding_extension_type = null // Cannot be padded. -/obj/structure/bed/chair/wood/mahogany +/obj/structure/chair/wood/mahogany color = WOOD_COLOR_RICH material = /decl/material/solid/organic/wood/mahogany -/obj/structure/bed/chair/wood/maple +/obj/structure/chair/wood/maple color = WOOD_COLOR_PALE material = /decl/material/solid/organic/wood/maple -/obj/structure/bed/chair/wood/ebony +/obj/structure/chair/wood/ebony color = WOOD_COLOR_BLACK material = /decl/material/solid/organic/wood/ebony -/obj/structure/bed/chair/wood/walnut +/obj/structure/chair/wood/walnut color = WOOD_COLOR_CHOCOLATE material = /decl/material/solid/organic/wood/walnut -/obj/structure/bed/chair/wood/wings +/obj/structure/chair/wood/wings name = "winged chair" icon = 'icons/obj/structures/furniture/chair_wooden_wings.dmi' -/obj/structure/bed/chair/wood/wings/mahogany +/obj/structure/chair/wood/wings/mahogany color = WOOD_COLOR_RICH material = /decl/material/solid/organic/wood/mahogany -/obj/structure/bed/chair/wood/wings/maple +/obj/structure/chair/wood/wings/maple color = WOOD_COLOR_PALE material = /decl/material/solid/organic/wood/maple -/obj/structure/bed/chair/wood/wings/ebony +/obj/structure/chair/wood/wings/ebony color = WOOD_COLOR_BLACK material = /decl/material/solid/organic/wood/ebony -/obj/structure/bed/chair/wood/wings/walnut +/obj/structure/chair/wood/wings/walnut color = WOOD_COLOR_CHOCOLATE material = /decl/material/solid/organic/wood/walnut -/obj/structure/bed/chair/backed +/obj/structure/chair/backed name_prefix = "backed" desc = "A tall chair with a sturdy back. Not very comfortable." icon = 'icons/obj/structures/furniture/chair_backed.dmi' @@ -331,10 +370,10 @@ material = /decl/material/solid/organic/wood/oak color = /decl/material/solid/organic/wood/oak::color -/obj/structure/bed/chair/backed/get_material_icon() +/obj/structure/chair/backed/get_material_icon() return material?.backed_chair_icon || initial(icon) -/obj/structure/bed/chair/slatted +/obj/structure/chair/slatted name = "seat" name_prefix = "slatted" // slatted wooden seat vs wooden slatted seat icon = 'icons/obj/structures/furniture/chair_slatted.dmi' @@ -342,5 +381,5 @@ material = /decl/material/solid/organic/wood/oak color = /decl/material/solid/organic/wood/oak::color -/obj/structure/bed/chair/slatted/get_material_icon() +/obj/structure/chair/slatted/get_material_icon() return material?.slatted_seat_icon || initial(icon) \ No newline at end of file diff --git a/code/game/objects/structures/chairs/rustic_chairs.dm b/code/game/objects/structures/chairs/rustic_chairs.dm index fff98ecac558..840678cb077e 100644 --- a/code/game/objects/structures/chairs/rustic_chairs.dm +++ b/code/game/objects/structures/chairs/rustic_chairs.dm @@ -1,4 +1,4 @@ -/obj/structure/bed/chair/rustic +/obj/structure/chair/rustic name_prefix = "rustic" desc = "A simple, rustic-looking chair. Looks like it'd hurt to sit on for too long..." icon = 'icons/obj/structures/furniture/chair_rustic.dmi' @@ -6,7 +6,7 @@ color = /decl/material/solid/organic/wood/walnut::color user_comfort = -0.5 -/obj/structure/bed/chair/rustic_fancy +/obj/structure/chair/rustic_fancy name_prefix = "fancy" desc = "An ornate, detailed chair made from wood. It has armrests!" icon = 'icons/obj/structures/furniture/chair_rustic_fancy.dmi' @@ -16,5 +16,5 @@ initial_padding_color = COLOR_CHERRY_RED user_comfort = 1.25 -/obj/structure/bed/chair/rustic_fancy/ebony +/obj/structure/chair/rustic_fancy/ebony material = /decl/material/solid/organic/wood/ebony diff --git a/code/game/objects/structures/chairs/wheelchair.dm b/code/game/objects/structures/chairs/wheelchair.dm index fa52fcb9b6e4..31fb6781e1a7 100644 --- a/code/game/objects/structures/chairs/wheelchair.dm +++ b/code/game/objects/structures/chairs/wheelchair.dm @@ -1,4 +1,4 @@ -/obj/structure/bed/chair/wheelchair +/obj/structure/chair/wheelchair name = "wheelchair" desc = "Now we're getting somewhere." icon = 'icons/obj/structures/furniture/wheelchair.dmi' @@ -17,19 +17,19 @@ // TODO: Replace with reagent holder? This doesn't even properly handle non-human bloodstains. var/bloodiness -/obj/structure/bed/chair/wheelchair/Initialize() +/obj/structure/chair/wheelchair/Initialize() . = ..() if(!item_form_type) verbs -= .verb/collapse -/obj/structure/bed/chair/wheelchair/attack_hand(mob/user) +/obj/structure/chair/wheelchair/attack_hand(mob/user) if(!user.check_dexterity(DEXTERITY_SIMPLE_MACHINES, TRUE)) return ..() user_unbuckle_mob(user) return TRUE -/obj/structure/bed/chair/wheelchair/Bump(atom/A) +/obj/structure/chair/wheelchair/Bump(atom/A) ..() if(!buckled_mob) return @@ -58,7 +58,7 @@ victim.apply_damage(10, BRUTE, def_zone) occupant.visible_message(SPAN_DANGER("\The [occupant] crashed into \the [A]!")) -/obj/structure/bed/chair/wheelchair/proc/create_track() +/obj/structure/chair/wheelchair/proc/create_track() var/obj/effect/decal/cleanable/blood/tracks/B = new(loc) var/newdir = get_dir(get_step(loc, dir), loc) if(newdir == dir) @@ -73,11 +73,11 @@ bloodiness-- /proc/equip_wheelchair(mob/living/human/H) //Proc for spawning in a wheelchair if a new character has no legs. Used in new_player.dm - var/obj/structure/bed/chair/wheelchair/W = new(get_turf(H)) + var/obj/structure/chair/wheelchair/W = new(get_turf(H)) if(isturf(H.loc)) W.buckle_mob(H) -/obj/structure/bed/chair/wheelchair/verb/collapse() +/obj/structure/chair/wheelchair/verb/collapse() set name = "Collapse Wheelchair" set category = "Object" set src in oview(1) @@ -105,7 +105,7 @@ K.add_fingerprint(usr) qdel(src) -/obj/structure/bed/chair/wheelchair/handle_buckled_relaymove(var/datum/movement_handler/mh, var/mob/mob, var/direction, var/mover) +/obj/structure/chair/wheelchair/handle_buckled_relaymove(var/datum/movement_handler/mh, var/mob/mob, var/direction, var/mover) if(isspaceturf(loc)) return // No wheelchair driving in space . = MOVEMENT_HANDLED @@ -115,7 +115,7 @@ direction = mob.AdjustMovementDirection(direction, mover) DoMove(direction, mob) -/obj/structure/bed/chair/wheelchair/relaymove(mob/user, direction) +/obj/structure/chair/wheelchair/relaymove(mob/user, direction) if(user) user.glide_size = glide_size step(src, direction) @@ -128,7 +128,7 @@ icon_state = ICON_STATE_WORLD w_class = ITEM_SIZE_LARGE max_health = 50 - var/structure_form_type = /obj/structure/bed/chair/wheelchair + var/structure_form_type = /obj/structure/chair/wheelchair /obj/item/wheelchair_kit/attack_self(mob/user) if(!structure_form_type) @@ -136,7 +136,7 @@ user.visible_message("[user] starts to lay out \the [src].") if(do_after(user, 4 SECONDS, src)) - var/obj/structure/bed/chair/wheelchair/W = new structure_form_type(get_turf(user)) + var/obj/structure/chair/wheelchair/W = new structure_form_type(get_turf(user)) user.visible_message("[user] lays out \the [W].") W.add_fingerprint(user) qdel(src) diff --git a/code/game/objects/structures/flaps.dm b/code/game/objects/structures/flaps.dm index 00e3257a5b64..3208d09cc814 100644 --- a/code/game/objects/structures/flaps.dm +++ b/code/game/objects/structures/flaps.dm @@ -23,8 +23,8 @@ if(istype(A) && A.checkpass(PASS_FLAG_GLASS)) return prob(60) - var/obj/structure/bed/B = A - if (istype(A, /obj/structure/bed) && B.buckled_mob)//if it's a bed/chair and someone is buckled, it will not pass + var/atom/movable/moving_movable = A + if (ismovable(A) && moving_movable.buckled_mob)//if someone is buckled, it will not pass return 0 if(istype(A, /obj/vehicle)) //no vehicles @@ -32,7 +32,7 @@ var/mob/living/M = A if(istype(M)) - if(M.current_posture.prone) + if(M.current_posture.prone && !M.buckled) return ..() for(var/mob_type in mobs_can_pass) if(istype(A, mob_type)) diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index cc5633a1eab5..49c960dd32e4 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -172,36 +172,34 @@ /datum/movement_handler/move_relay_self/janicart/MayMove(mob/mover, is_external) . = ..() if(. == MOVEMENT_PROCEED && !is_external && !(locate(/obj/item/janicart_key) in mover.get_held_items())) - var/obj/structure/bed/chair/janicart/janicart = host + var/obj/structure/janicart/janicart = host to_chat(mover, SPAN_WARNING("You'll need the keys in one of your hands to drive this [istype(janicart) ? janicart.callme : host.name].")) return MOVEMENT_STOP //old style cart -/obj/structure/bed/chair/janicart +/obj/structure/janicart name = "janicart" icon = 'icons/obj/vehicles.dmi' icon_state = "pussywagon" + can_buckle = TRUE + buckle_lying = FALSE // force people to sit up when buckled to it + buckle_sound = 'sound/effects/buckle.ogg' + buckle_layer_above = TRUE + buckle_movable = TRUE color = null anchored = FALSE density = TRUE material_alteration = MAT_FLAG_ALTERATION_NONE atom_flags = ATOM_FLAG_OPEN_CONTAINER - buckle_layer_above = TRUE - buckle_movable = TRUE movement_handlers = list( /datum/movement_handler/deny_multiz, /datum/movement_handler/delay = list(1), /datum/movement_handler/move_relay_self/janicart ) - padding_extension_type = null - var/obj/item/bag/trash/mybag = null var/callme = "pimpin' ride" //how do people refer to it? -/obj/structure/bed/chair/janicart/get_base_icon() - return initial(icon_state) - -/obj/structure/bed/chair/janicart/Initialize() +/obj/structure/janicart/Initialize() // Handled in init due to dirs needing to be stringified buckle_pixel_shift = list( "[NORTH]" = list("x" = 0, "y" = 4, "z" = 0), @@ -212,14 +210,14 @@ . = ..() create_reagents(100) -/obj/structure/bed/chair/janicart/examine(mob/user, distance) +/obj/structure/janicart/examine(mob/user, distance) . = ..() if(distance <= 1) to_chat(user, "[html_icon(src)] This [callme] contains [reagents.total_volume] unit\s of water!") if(mybag) to_chat(user, "\A [mybag] is hanging on the [callme].") -/obj/structure/bed/chair/janicart/attackby(obj/item/I, mob/user) +/obj/structure/janicart/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/mop)) if(reagents.total_volume > 1) @@ -243,27 +241,27 @@ . = ..() -/obj/structure/bed/chair/janicart/attack_hand(mob/user) +/obj/structure/janicart/attack_hand(mob/user) if(!mybag || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) return ..() user.put_in_hands(mybag) mybag = null return TRUE -/obj/structure/bed/chair/janicart/handle_buckled_relaymove(var/datum/movement_handler/mh, var/mob/mob, var/direction, var/mover) +/obj/structure/janicart/handle_buckled_relaymove(var/datum/movement_handler/mh, var/mob/mob, var/direction, var/mover) if(isspaceturf(loc)) return . = MOVEMENT_HANDLED DoMove(mob.AdjustMovementDirection(direction, mover), mob) -/obj/structure/bed/chair/janicart/relaymove(mob/user, direction) +/obj/structure/janicart/relaymove(mob/user, direction) if(user.incapacitated(INCAPACITATION_DISRUPTED)) unbuckle_mob() user.glide_size = glide_size step(src, direction) set_dir(direction) -/obj/structure/bed/chair/janicart/bullet_act(var/obj/item/projectile/Proj) +/obj/structure/janicart/bullet_act(var/obj/item/projectile/Proj) if(buckled_mob) if(prob(85)) return buckled_mob.bullet_act(Proj) diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 423740def134..bf877bfbab75 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -49,14 +49,14 @@ category = "seating" /decl/stack_recipe/hardness/integrity/furniture/bench - result_type = /obj/structure/bed/chair/bench + result_type = /obj/structure/chair/bench category = "seating" /decl/stack_recipe/hardness/integrity/furniture/bench/pew - result_type = /obj/structure/bed/chair/bench/pew + result_type = /obj/structure/chair/bench/pew /decl/stack_recipe/hardness/integrity/furniture/bench/lounge - result_type = /obj/structure/bed/chair/bench/lounge + result_type = /obj/structure/chair/bench/lounge difficulty = MAT_VALUE_VERY_HARD_DIY /decl/stack_recipe/hardness/integrity/furniture/closet @@ -70,27 +70,27 @@ result_type = /obj/structure/closet/coffin /decl/stack_recipe/hardness/integrity/furniture/chair - result_type = /obj/structure/bed/chair + result_type = /obj/structure/chair category = "seating" /decl/stack_recipe/hardness/integrity/furniture/chair/office - result_type = /obj/structure/bed/chair/office/comfy/unpadded + result_type = /obj/structure/chair/office/comfy/unpadded available_to_map_tech_level = MAP_TECH_LEVEL_SPACE /decl/stack_recipe/hardness/integrity/furniture/chair/comfy - result_type = /obj/structure/bed/chair/comfy/unpadded + result_type = /obj/structure/chair/comfy/unpadded /decl/stack_recipe/hardness/integrity/furniture/chair/arm - result_type = /obj/structure/bed/chair/armchair/unpadded + result_type = /obj/structure/chair/armchair/unpadded /decl/stack_recipe/hardness/integrity/furniture/chair/roundedchair - result_type = /obj/structure/bed/chair/rounded + result_type = /obj/structure/chair/rounded /decl/stack_recipe/hardness/integrity/furniture/chair/backed - result_type = /obj/structure/bed/chair/backed + result_type = /obj/structure/chair/backed /decl/stack_recipe/hardness/integrity/furniture/chair/slatted - result_type = /obj/structure/bed/chair/slatted + result_type = /obj/structure/chair/slatted /decl/stack_recipe/hardness/integrity/furniture/drying_rack result_type = /obj/structure/drying_rack diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index 00f4f0f41b6c..797c346a9dd1 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -187,11 +187,11 @@ result_type = /obj/structure/bookcase/cart /decl/stack_recipe/planks/furniture/chair - result_type = /obj/structure/bed/chair/wood + result_type = /obj/structure/chair/wood category = "seating" /decl/stack_recipe/planks/furniture/chair/fancy - result_type = /obj/structure/bed/chair/wood/wings + result_type = /obj/structure/chair/wood/wings /decl/stack_recipe/planks/furniture/chest result_type = /obj/structure/closet/crate/chest diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index e151a9bbbc48..59d962b20a63 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -186,7 +186,7 @@ holographic = TRUE material = /decl/material/solid/metal/aluminium/holographic -/obj/structure/bed/chair/holochair +/obj/structure/chair/holochair tool_interaction_flags = 0 holographic = TRUE material = /decl/material/solid/metal/aluminium/holographic diff --git a/code/modules/mob/living/human/human_movement.dm b/code/modules/mob/living/human/human_movement.dm index a3af65028c19..012f9071302a 100644 --- a/code/modules/mob/living/human/human_movement.dm +++ b/code/modules/mob/living/human/human_movement.dm @@ -25,7 +25,7 @@ if(can_feel_pain() && get_shock() >= 10) tally += (get_shock() / 10) //pain shouldn't slow you down if you can't even feel it - if(istype(buckled, /obj/structure/bed/chair/wheelchair)) + if(istype(buckled, /obj/structure/chair/wheelchair)) for(var/organ_name in list(BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM)) var/obj/item/organ/external/E = GET_EXTERNAL_ORGAN(src, organ_name) tally += E ? E.get_movement_delay(4) : 4 diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm index 8ca034e24a4f..3b185823bcb5 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/parrot.dm @@ -49,7 +49,7 @@ //These vars store their preffered perch and if they dont have one, what they can use as a perch var/obj/parrot_perch = null var/static/list/desired_perches = list( - /obj/structure/bed/chair, + /obj/structure/chair, /obj/structure/table, /obj/machinery/constructable_frame/computerframe, /obj/structure/displaycase, diff --git a/code/modules/random_map/drop/droppod.dm b/code/modules/random_map/drop/droppod.dm index 926ed6b2d0bd..7c81af16f087 100644 --- a/code/modules/random_map/drop/droppod.dm +++ b/code/modules/random_map/drop/droppod.dm @@ -124,7 +124,7 @@ get_spawned_drop(T) /datum/random_map/droppod/proc/get_spawned_drop(var/turf/T) - var/obj/structure/bed/chair/C = new(T) + var/obj/structure/chair/C = new(T) C.set_light(3, 1, l_color = "#cc0000") var/mob/living/drop // This proc expects a list of mobs to be passed to the spawner. diff --git a/maps/away/bearcat/bearcat.dm b/maps/away/bearcat/bearcat.dm index 37d26d36b557..df252e2c4c3a 100644 --- a/maps/away/bearcat/bearcat.dm +++ b/maps/away/bearcat/bearcat.dm @@ -113,7 +113,7 @@ if(!istype(corpse)) return corpse.SetName("Captain") - var/obj/structure/bed/chair/C = locate() in loc + var/obj/structure/chair/C = locate() in loc if(C) C.buckle_mob(corpse) qdel(src) diff --git a/mods/species/ascent/structures/ship_furniture.dm b/mods/species/ascent/structures/ship_furniture.dm index 812a9ae2cd0d..d9192bf07875 100644 --- a/mods/species/ascent/structures/ship_furniture.dm +++ b/mods/species/ascent/structures/ship_furniture.dm @@ -1,9 +1,9 @@ -MANTIDIFY(/obj/structure/bed/chair/padded/purple, "mantid nest", "resting place") // sets up name, description and color +MANTIDIFY(/obj/structure/chair/padded/purple, "mantid nest", "resting place") // sets up name, description and color -/obj/structure/bed/chair/padded/purple/ascent // sets up icon and offsets +/obj/structure/chair/padded/purple/ascent // sets up icon and offsets icon = 'mods/species/ascent/icons/furniture/chair_nest.dmi' -/obj/structure/bed/chair/padded/purple/ascent/gyne +/obj/structure/chair/padded/purple/ascent/gyne name = "mantid throne" icon = 'mods/species/ascent/icons/furniture/chair_nest_large.dmi' diff --git a/tools/map_migrations/4838_chairs.txt b/tools/map_migrations/4838_chairs.txt new file mode 100644 index 000000000000..a49c4df623eb --- /dev/null +++ b/tools/map_migrations/4838_chairs.txt @@ -0,0 +1,2 @@ +/obj/structure/bed/chair/janicart/@SUBTYPES : /obj/structure/janicart/@SUBTYPES{@OLD} +/obj/structure/bed/chair/@SUBTYPES : /obj/structure/chair/@SUBTYPES{@OLD} \ No newline at end of file From 617cef6754c06aae0f56e2966079485f97d9766a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Tue, 4 Feb 2025 13:16:16 -0500 Subject: [PATCH 15/54] Repath chairs in maps to not be beds --- maps/antag_spawn/ert/ert_base.dmm | 28 +- maps/antag_spawn/mercenary/mercenary_base.dmm | 22 +- maps/away/bearcat/bearcat-2.dmm | 18 +- maps/away/casino/casino.dmm | 82 ++-- maps/away/derelict/derelict-station.dmm | 8 +- maps/away/errant_pisces/errant_pisces.dmm | 38 +- maps/away/liberia/liberia.dmm | 52 +-- .../lost_supply_base/lost_supply_base.dmm | 20 +- maps/away/magshield/magshield.dmm | 22 +- maps/away/mining/mining-signal.dmm | 24 +- maps/away/smugglers/smugglers.dmm | 6 +- maps/away/unishi/unishi-2.dmm | 34 +- maps/away/unishi/unishi-3.dmm | 38 +- maps/away/yacht/yacht.dmm | 6 +- maps/exodus/exodus-1.dmm | 24 +- maps/exodus/exodus-2.dmm | 432 +++++++++--------- maps/exodus/exodus-admin.dmm | 84 ++-- maps/ministation/ministation-0.dmm | 26 +- maps/ministation/ministation-1.dmm | 64 +-- maps/ministation/ministation-2.dmm | 52 +-- maps/ministation/space.dmm | 20 +- .../crashed_pod/crashed_pod.dmm | 12 +- .../deserted_lab/deserted_lab.dmm | 4 +- maps/random_ruins/exoplanet_ruins/hut/hut.dmm | 2 +- .../exoplanet_ruins/hydrobase/hydrobase.dmm | 4 +- .../exoplanet_ruins/lodge/lodge.dmm | 4 +- .../exoplanet_ruins/marooned/marooned.dmm | 6 +- .../exoplanet_ruins/playablecolony/colony.dmm | 28 +- .../exoplanet_ruins/radshrine/radshrine.dmm | 4 +- .../spider_nest/spider_nest.dmm | 4 +- maps/shaded_hills/shaded_hills-dungeon.dmm | 30 +- maps/shaded_hills/shaded_hills-grassland.dmm | 6 +- maps/shaded_hills/shaded_hills-inn.dmm | 48 +- maps/shaded_hills/shaded_hills-swamp.dmm | 2 +- maps/tradeship/tradeship-0.dmm | 6 +- maps/tradeship/tradeship-2.dmm | 34 +- maps/tradeship/tradeship-3.dmm | 2 +- .../away_sites/lar_maria/lar_maria-1.dmm | 34 +- .../away_sites/lar_maria/lar_maria-2.dmm | 46 +- .../exoplanet_ruins/oldpod/oldpod.dmm | 4 +- .../suspicious_cabin/suspicious_cabin.dmm | 8 +- .../generic_shuttles/tanker/tanker.dmm | 6 +- .../government/away_sites/icarus/icarus-1.dmm | 24 +- .../government/away_sites/icarus/icarus-2.dmm | 30 +- .../ruins/ec_old_crash/ec_old_crash.dmm | 2 +- mods/gamemodes/heist/heist_base.dmm | 12 +- mods/gamemodes/ninja/maps/ninja_base.dmm | 4 +- 47 files changed, 733 insertions(+), 733 deletions(-) diff --git a/maps/antag_spawn/ert/ert_base.dmm b/maps/antag_spawn/ert/ert_base.dmm index 703d909d0c3a..445cad5e6ae8 100644 --- a/maps/antag_spawn/ert/ert_base.dmm +++ b/maps/antag_spawn/ert/ert_base.dmm @@ -91,7 +91,7 @@ /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) "ay" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/unsimulated/floor/dark, /area/map_template/rescue_base/base) "az" = ( @@ -405,7 +405,7 @@ /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "bq" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/unsimulated/floor/dark, @@ -1036,7 +1036,7 @@ /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "cP" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/unsimulated/floor/dark, @@ -1386,7 +1386,7 @@ /turf/unsimulated/floor/rescue_base, /area/map_template/rescue_base/base) "dO" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "dQ" = ( @@ -1469,7 +1469,7 @@ /turf/unsimulated/floor/vault, /area/map_template/rescue_base/base) "eg" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/unsimulated/floor/vault, @@ -1741,7 +1741,7 @@ /turf/unsimulated/floor/cult, /area/map_template/rescue_base/base) "eI" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /turf/unsimulated/floor/cult, @@ -1913,13 +1913,13 @@ /turf/floor/tiled/dark, /area/map_template/rescue_base/start) "fg" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/tiled/dark, /area/map_template/rescue_base/start) "fh" = ( -/obj/structure/bed/chair/shuttle, +/obj/structure/chair/shuttle, /turf/floor/tiled/dark, /area/map_template/rescue_base/start) "fi" = ( @@ -2192,7 +2192,7 @@ /turf/floor/tiled/dark, /area/map_template/rescue_base/start) "fT" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/light{ @@ -2206,7 +2206,7 @@ /turf/floor/tiled/dark, /area/map_template/rescue_base/start) "fV" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light{ @@ -2251,7 +2251,7 @@ /turf/floor/tiled/dark, /area/map_template/rescue_base/start) "gb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/dark, @@ -2468,7 +2468,7 @@ pixel_x = 27; dir = 8 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light{ @@ -2527,7 +2527,7 @@ /turf/floor/plating, /area/map_template/rescue_base/start) "gV" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/dark, @@ -2581,7 +2581,7 @@ /turf/unsimulated/floor/asteroid, /area/map_template/rescue_base/base) "hd" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/light{ diff --git a/maps/antag_spawn/mercenary/mercenary_base.dmm b/maps/antag_spawn/mercenary/mercenary_base.dmm index f75023f8eb7d..152355b9aab0 100644 --- a/maps/antag_spawn/mercenary/mercenary_base.dmm +++ b/maps/antag_spawn/mercenary/mercenary_base.dmm @@ -149,7 +149,7 @@ /turf/floor/shuttle/darkred, /area/map_template/merc_shuttle) "aq" = ( -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 1 }, /obj/structure/cable{ @@ -269,7 +269,7 @@ /turf/floor/reinforced, /area/map_template/merc_shuttle) "aC" = ( -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 1 }, /turf/floor/shuttle/darkred, @@ -383,7 +383,7 @@ pixel_x = -21; req_access = list("ACCESS_MERCENARY") }, -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 4 }, /turf/floor/shuttle/darkred, @@ -421,7 +421,7 @@ /turf/floor/shuttle/darkred, /area/map_template/merc_shuttle) "aP" = ( -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 8 }, /obj/effect/floor_decal/industrial/warning/corner{ @@ -487,7 +487,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 8 }, -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 4 }, /turf/floor/shuttle/darkred, @@ -1639,11 +1639,11 @@ /obj/effect/floor_decal/industrial/warning{ dir = 1 }, -/obj/structure/bed/chair/office, +/obj/structure/chair/office, /turf/floor/tiled, /area/map_template/merc_spawn) "ec" = ( -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 8 }, /turf/floor/tiled, @@ -1849,7 +1849,7 @@ /turf/floor/plating, /area/map_template/merc_spawn) "jE" = ( -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 8 }, /obj/machinery/recharger/wallcharger{ @@ -1907,7 +1907,7 @@ dir = 8; icon_state = "warningcorner" }, -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 1 }, /turf/floor/tiled, @@ -2632,7 +2632,7 @@ /obj/effect/floor_decal/industrial/warning{ icon_state = "warning" }, -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 1 }, /turf/floor/tiled, @@ -2695,7 +2695,7 @@ /obj/effect/floor_decal/industrial/warning/corner{ dir = 1 }, -/obj/structure/bed/chair/office, +/obj/structure/chair/office, /turf/floor/tiled, /area/map_template/merc_spawn) "Vw" = ( diff --git a/maps/away/bearcat/bearcat-2.dmm b/maps/away/bearcat/bearcat-2.dmm index 2d9318f06d47..375413801273 100644 --- a/maps/away/bearcat/bearcat-2.dmm +++ b/maps/away/bearcat/bearcat-2.dmm @@ -63,7 +63,7 @@ /area/ship/scrap/command/bridge) "aj" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/abstract/landmark/corpse/deadcap, @@ -126,7 +126,7 @@ /turf/wall/r_wall, /area/ship/scrap/command/bridge) "au" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/power/apc/derelict{ @@ -152,7 +152,7 @@ dir = 4; }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/dark/usedup, @@ -407,7 +407,7 @@ /turf/floor/laminate, /area/ship/scrap/command/captain) "aV" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /turf/floor/laminate, /area/ship/scrap/command/captain) "aW" = ( @@ -1090,7 +1090,7 @@ /obj/structure/cable{ icon_state = "0-4" }, -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled/usedup, /area/ship/scrap/crew/saloon) "cn" = ( @@ -1106,7 +1106,7 @@ /area/ship/scrap/crew/saloon) "co" = ( /obj/structure/emergency_dispenser/north, -/obj/structure/bed/chair/wood, +/obj/structure/chair/wood, /obj/item/deck/tarot, /turf/floor/tiled/usedup, /area/ship/scrap/crew/saloon) @@ -1585,7 +1585,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /turf/floor/tiled/usedup, @@ -2216,7 +2216,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 9 }, -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/structure/cable{ icon_state = "4-8" }, @@ -3775,7 +3775,7 @@ /turf/floor/tiled/usedup, /area/ship/scrap/maintenance/engineering) "hr" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /obj/effect/floor_decal/corner/yellow{ dir = 5 }, diff --git a/maps/away/casino/casino.dmm b/maps/away/casino/casino.dmm index 77f3aee176a2..9351a57a678b 100644 --- a/maps/away/casino/casino.dmm +++ b/maps/away/casino/casino.dmm @@ -139,7 +139,7 @@ /turf/floor/plating, /area/casino/casino_bridge) "au" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/effect/decal/cleanable/blood/splatter, @@ -188,13 +188,13 @@ /turf/floor/plating, /area/casino/casino_maintenance) "aE" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, /area/casino/casino_bridge) "aF" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/decal/cleanable/blood/splatter, @@ -688,7 +688,7 @@ /turf/floor/plating, /area/casino/casino_security) "bQ" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/plating, /area/casino/casino_security) "bR" = ( @@ -999,7 +999,7 @@ /turf/floor/tiled, /area/casino/casino_security) "cS" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/decal/cleanable/blood, @@ -1229,7 +1229,7 @@ /turf/floor/tiled, /area/casino/casino_cutter) "dG" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/door/window, @@ -1273,7 +1273,7 @@ /turf/floor/plating/airless, /area/space) "dM" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 8 }, /turf/floor/plating, @@ -1313,7 +1313,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dR" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/plating, /area/casino/casino_storage) "dS" = ( @@ -1323,7 +1323,7 @@ /turf/floor/plating, /area/casino/casino_storage) "dT" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /turf/floor/plating, /area/casino/casino_storage) "dU" = ( @@ -1344,20 +1344,20 @@ /obj/random/cash, /obj/random/cash, /obj/random/cash, -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 1 }, /turf/floor/shuttle/yellow, /area/casino/casino_cutter) "dY" = ( -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 1 }, /obj/item/bag/cash, /turf/floor/shuttle/yellow, /area/casino/casino_cutter) "dZ" = ( -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 1 }, /turf/floor/shuttle/yellow, @@ -1366,7 +1366,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 1 }, /turf/floor/shuttle/yellow, @@ -1531,7 +1531,7 @@ /turf/floor/plating, /area/casino/casino_storage) "ey" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/plating, /area/casino/casino_storage) @@ -1999,7 +1999,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "fL" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 1 }, /turf/floor/carpet, @@ -2165,27 +2165,27 @@ /turf/floor/tiled, /area/casino/casino_crew_cantina) "gk" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/effect/decal/cleanable/blood/splatter, /turf/floor/tiled, /area/casino/casino_crew_cantina) "gl" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, /area/casino/casino_crew_cantina) "gm" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/item/chems/drinks/flask/shiny, /turf/floor/tiled, /area/casino/casino_crew_cantina) "gn" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/random/snack, @@ -2357,7 +2357,7 @@ /turf/floor/tiled, /area/casino/casino_mainfloor) "gI" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled, @@ -2393,7 +2393,7 @@ /turf/wall, /area/casino/casino_solar_control) "gX" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/casino/casino_mainfloor) "gY" = ( @@ -2720,7 +2720,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "hZ" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 4 }, /turf/floor/carpet, @@ -2736,7 +2736,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "ic" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 8 }, /turf/floor/carpet, @@ -2848,7 +2848,7 @@ /turf/floor/tiled, /area/casino/casino_kitchen) "ip" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 4 }, /obj/item/knife/combat, @@ -3123,7 +3123,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "jc" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 8 }, /turf/floor/carpet, @@ -3576,7 +3576,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "kl" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 1 }, /turf/floor/carpet, @@ -4196,7 +4196,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "lV" = ( -/obj/structure/bed/chair/comfy/black, +/obj/structure/chair/comfy/black, /turf/floor/carpet, /area/casino/casino_mainfloor) "lX" = ( @@ -4212,7 +4212,7 @@ /turf/floor/plating, /area/casino/casino_bow) "lY" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4232,7 +4232,7 @@ /turf/floor/laminate, /area/casino/casino_private_vip) "mb" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 8 }, /turf/floor/laminate, @@ -4245,7 +4245,7 @@ /turf/floor/laminate, /area/casino/casino_private_vip) "md" = ( -/obj/structure/bed/chair/comfy/red, +/obj/structure/chair/comfy/red, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/laminate, /area/casino/casino_private1) @@ -4257,7 +4257,7 @@ /turf/floor/laminate, /area/casino/casino_private1) "mf" = ( -/obj/structure/bed/chair/comfy/red, +/obj/structure/chair/comfy/red, /obj/item/flame/fuelled/lighter/zippo/random, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/laminate, @@ -4295,7 +4295,7 @@ /turf/floor/plating, /area/casino/casino_bow) "ml" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/decal/cleanable/blood/splatter, @@ -4319,7 +4319,7 @@ /turf/floor/plating, /area/casino/casino_bow) "mp" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -4337,7 +4337,7 @@ /turf/floor/laminate, /area/casino/casino_private_vip) "ms" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 8 }, /obj/item/bag/cash, @@ -4358,7 +4358,7 @@ /turf/floor/laminate, /area/casino/casino_private1) "mv" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 8 }, /turf/floor/laminate, @@ -4376,7 +4376,7 @@ /turf/floor/laminate, /area/casino/casino_private2) "my" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 8 }, /turf/floor/laminate, @@ -4603,7 +4603,7 @@ /turf/floor/plating/airless, /area/casino/casino_bow) "nj" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/item/radio/intercom{ dir = 4; pixel_x = -22 @@ -4624,7 +4624,7 @@ /turf/wall/r_wall, /area/casino/casino_bow) "nm" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/status_display{ pixel_x = -32; dir = 8 @@ -4639,7 +4639,7 @@ /turf/floor/plating, /area/casino/casino_bow) "nn" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/status_display{ pixel_x = -32; dir = 8 @@ -4654,7 +4654,7 @@ /turf/floor/plating, /area/casino/casino_bow) "no" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/status_display{ pixel_x = -32; dir = 8 @@ -5000,7 +5000,7 @@ /turf/floor/carpet, /area/casino/casino_mainfloor) "Fb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/decal/cleanable/blood, diff --git a/maps/away/derelict/derelict-station.dmm b/maps/away/derelict/derelict-station.dmm index e1b3af10b024..dbb6946ec806 100644 --- a/maps/away/derelict/derelict-station.dmm +++ b/maps/away/derelict/derelict-station.dmm @@ -177,7 +177,7 @@ /turf/floor/plating, /area/derelict/ship) "aA" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, @@ -408,7 +408,7 @@ /turf/floor/tiled, /area/derelict/ship) "bk" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, @@ -578,7 +578,7 @@ /turf/floor/tiled/dark/airless, /area/constructionsite/bridge) "bT" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/derelict/ship) "bU" = ( @@ -1244,7 +1244,7 @@ /turf/floor/plating/airless/broken, /area/constructionsite/storage) "et" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 1 }, /turf/floor/tiled/dark/airless, diff --git a/maps/away/errant_pisces/errant_pisces.dmm b/maps/away/errant_pisces/errant_pisces.dmm index df04d63c3a72..79a6b2c6d3a1 100644 --- a/maps/away/errant_pisces/errant_pisces.dmm +++ b/maps/away/errant_pisces/errant_pisces.dmm @@ -578,7 +578,7 @@ /turf/floor/plating, /area/errant_pisces/enginering) "bM" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/plating, @@ -947,7 +947,7 @@ /turf/floor/plating, /area/errant_pisces/enginering) "cT" = ( -/obj/structure/bed/chair/janicart, +/obj/structure/janicart, /obj/machinery/light/small{ dir = 8 }, @@ -2542,7 +2542,7 @@ /turf/floor/laminate, /area/errant_pisces/rooms) "gt" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /turf/floor/laminate, @@ -2556,7 +2556,7 @@ /turf/floor/laminate, /area/errant_pisces/rooms) "gv" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /turf/floor/laminate, @@ -2659,7 +2659,7 @@ /turf/floor/plating/airless, /area/space) "gL" = ( -/obj/structure/bed/chair/comfy/green, +/obj/structure/chair/comfy/green, /obj/machinery/light{ dir = 8; icon_state = "tube1" @@ -2677,7 +2677,7 @@ /turf/floor/laminate, /area/errant_pisces/rooms) "gO" = ( -/obj/structure/bed/chair/comfy/teal, +/obj/structure/chair/comfy/teal, /obj/machinery/light{ dir = 8; icon_state = "tube1" @@ -2694,7 +2694,7 @@ /turf/floor/laminate, /area/errant_pisces/rooms) "gR" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -2892,7 +2892,7 @@ /turf/floor/laminate, /area/errant_pisces/rooms) "ht" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /obj/structure/cable/green{ icon_state = "1-2" }, @@ -2931,7 +2931,7 @@ pixel_y = -25; req_access = newlist() }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /turf/floor/laminate, @@ -3071,7 +3071,7 @@ /turf/floor/tiled, /area/errant_pisces/infirmary) "hY" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/errant_pisces/infirmary) "hZ" = ( @@ -3792,7 +3792,7 @@ /turf/floor/tiled, /area/errant_pisces/science_wing) "kg" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/tiled, @@ -3984,7 +3984,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/tiled, @@ -5658,7 +5658,7 @@ /turf/floor/tiled, /area/errant_pisces/bridge) "oT" = ( -/obj/structure/bed/chair/comfy/captain, +/obj/structure/chair/comfy/captain, /turf/floor/tiled, /area/errant_pisces/bridge) "oU" = ( @@ -5778,7 +5778,7 @@ /turf/floor/laminate, /area/errant_pisces/bridge) "pm" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /turf/floor/laminate, @@ -5919,7 +5919,7 @@ /turf/floor/tiled, /area/errant_pisces/bridge) "pL" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /turf/floor/tiled, /area/errant_pisces/bridge) "pM" = ( @@ -6051,7 +6051,7 @@ /turf/floor/tiled, /area/errant_pisces/bridge) "qb" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/tiled, @@ -6279,7 +6279,7 @@ /turf/wall/r_wall, /area/space) "qN" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/plating, /area/errant_pisces/fishing_wing) "qO" = ( @@ -6356,7 +6356,7 @@ /turf/space, /area/space) "qU" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/plating, @@ -6373,7 +6373,7 @@ /turf/floor/plating, /area/errant_pisces/fishing_wing) "qX" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/item/flame/match, diff --git a/maps/away/liberia/liberia.dmm b/maps/away/liberia/liberia.dmm index 5d5473d9c567..0824627ff7e7 100644 --- a/maps/away/liberia/liberia.dmm +++ b/maps/away/liberia/liberia.dmm @@ -23,7 +23,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/dockinghall) "ad" = ( -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 4 }, /obj/effect/floor_decal/corner/blue/mono, @@ -326,7 +326,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/engineeringengines) "aO" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/tiled/steel_grid, @@ -624,7 +624,7 @@ /turf/floor/plating, /area/liberia/bridge) "bn" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/effect/floor_decal/borderfloor{ dir = 4 }, @@ -838,7 +838,7 @@ /turf/floor/carpet/blue2, /area/liberia/mule) "bE" = ( -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 8 }, /turf/floor/carpet/blue2, @@ -1114,7 +1114,7 @@ req_access = list("ACCESS_MERCHANT"); dir = 1 }, -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 8 }, /turf/floor/carpet/blue2, @@ -1460,7 +1460,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/engineeringengines) "cG" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/effect/floor_decal/spline/fancy/wood{ dir = 9 }, @@ -1546,7 +1546,7 @@ /turf/floor/tiled/dark, /area/liberia/mule) "cQ" = ( -/obj/structure/bed/chair/office/comfy/brown{ +/obj/structure/chair/office/comfy/brown{ dir = 4 }, /obj/structure/cable/blue{ @@ -3301,7 +3301,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 9 }, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /turf/floor/carpet, @@ -3321,13 +3321,13 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 5 }, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 8 }, /turf/floor/carpet, /area/liberia/bar) "fR" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /obj/machinery/alarm/liberia{ @@ -3345,7 +3345,7 @@ /turf/floor/laminate/ebony, /area/liberia/bar) "fT" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 8 }, /obj/machinery/power/apc/liberia{ @@ -3473,7 +3473,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/tiled, @@ -3492,7 +3492,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /turf/floor/carpet, @@ -3507,7 +3507,7 @@ /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 8 }, /turf/floor/carpet, @@ -3516,7 +3516,7 @@ /turf/floor/laminate/ebony, /area/liberia/bar) "gj" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/abstract/submap_landmark/spawnpoint/liberia, /turf/floor/laminate/ebony, @@ -3576,7 +3576,7 @@ /turf/floor/tiled/monotile, /area/liberia/officeroom) "gp" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -4176,7 +4176,7 @@ /turf/floor/carpet/red, /area/liberia/captain) "hq" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/carpet/red, @@ -4776,7 +4776,7 @@ /turf/floor/tiled/dark/monotile, /area/liberia/bridge) "iN" = ( -/obj/structure/bed/chair/comfy/blue{ +/obj/structure/chair/comfy/blue{ dir = 4 }, /obj/effect/floor_decal/corner/blue/mono, @@ -5160,7 +5160,7 @@ /obj/machinery/alarm/liberia{ pixel_y = 24 }, -/obj/structure/bed/chair/office/comfy/beige, +/obj/structure/chair/office/comfy/beige, /turf/floor/carpet, /area/liberia/library) "jM" = ( @@ -5188,7 +5188,7 @@ /turf/floor/tiled/monotile, /area/liberia/officeroom) "jR" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/effect/floor_decal/spline/fancy/wood{ dir = 8 }, @@ -5214,7 +5214,7 @@ /turf/floor/tiled/dark, /area/liberia/bridge) "jU" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/effect/floor_decal/spline/fancy/wood{ dir = 4 }, @@ -5239,7 +5239,7 @@ /turf/floor/tiled/techfloor/grid, /area/liberia/merchantstorage) "jW" = ( -/obj/structure/bed/chair/office/comfy/beige{ +/obj/structure/chair/office/comfy/beige{ dir = 4 }, /turf/floor/carpet, @@ -5307,7 +5307,7 @@ /area/liberia/guestroom2) "kb" = ( /obj/effect/floor_decal/spline/fancy/wood, -/obj/structure/bed/chair/office/comfy/beige{ +/obj/structure/chair/office/comfy/beige{ dir = 4 }, /turf/floor/carpet, @@ -5475,7 +5475,7 @@ /turf/floor/carpet, /area/liberia/library) "kq" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/effect/floor_decal/spline/fancy/wood{ @@ -6288,7 +6288,7 @@ /turf/floor/tiled/steel_grid, /area/liberia/atmos) "nH" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/abstract/submap_landmark/spawnpoint/liberia, /turf/floor/tiled, /area/liberia/hallway) @@ -7734,7 +7734,7 @@ /turf/wall/prepainted, /area/liberia/bar) "Ja" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/effect/floor_decal/borderfloor{ dir = 8 }, diff --git a/maps/away/lost_supply_base/lost_supply_base.dmm b/maps/away/lost_supply_base/lost_supply_base.dmm index 55d862015336..4981010ff903 100644 --- a/maps/away/lost_supply_base/lost_supply_base.dmm +++ b/maps/away/lost_supply_base/lost_supply_base.dmm @@ -353,7 +353,7 @@ /turf/floor/tiled/airless, /area/lost_supply_base/office) "aT" = ( -/obj/structure/bed/chair/comfy/captain, +/obj/structure/chair/comfy/captain, /turf/floor/tiled/airless, /area/lost_supply_base/office) "aU" = ( @@ -1170,7 +1170,7 @@ /turf/floor/tiled/airless, /area/lost_supply_base/common) "dy" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/airless, @@ -1190,7 +1190,7 @@ /area/lost_supply_base/common) "dB" = ( /obj/item/utensil/fork, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled/airless, @@ -1249,16 +1249,16 @@ /turf/floor/shuttle/blue, /area/space) "dT" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/random/handgun, /turf/floor/shuttle/blue, /area/space) "dU" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/shuttle/blue, /area/space) "dV" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/random/smokes, /turf/floor/shuttle/blue, /area/space) @@ -1306,7 +1306,7 @@ /turf/floor/tiled/airless, /area/lost_supply_base/common) "ef" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled/airless, @@ -1405,7 +1405,7 @@ /turf/floor/shuttle/blue, /area/space) "ex" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/item/key, @@ -1473,13 +1473,13 @@ /turf/floor/shuttle/blue, /area/space) "eM" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/shuttle/blue, /area/space) "eN" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/random/voidhelmet, diff --git a/maps/away/magshield/magshield.dmm b/maps/away/magshield/magshield.dmm index de625ae93469..6608162f7c71 100644 --- a/maps/away/magshield/magshield.dmm +++ b/maps/away/magshield/magshield.dmm @@ -641,7 +641,7 @@ /turf/floor/plating/airless, /area/magshield/smes_storage) "bY" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light/small{ @@ -711,7 +711,7 @@ /turf/floor/plating, /area/magshield/smes_storage) "ci" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/cable/yellow{ @@ -1318,7 +1318,7 @@ /turf/floor/plating/airless, /area/magshield/north) "dP" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/plating/airless, @@ -2079,7 +2079,7 @@ /turf/floor/tiled, /area/magshield/west) "fZ" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/floor/tiled, @@ -2492,7 +2492,7 @@ /turf/floor/tiled/white, /area/magshield/west) "hp" = ( -/obj/structure/bed/chair/comfy/captain, +/obj/structure/chair/comfy/captain, /turf/floor/tiled/white, /area/magshield/west) "hq" = ( @@ -2655,7 +2655,7 @@ /turf/floor/carpet/blue, /area/magshield/west) "hS" = ( -/obj/structure/bed/chair/comfy/red, +/obj/structure/chair/comfy/red, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -3057,7 +3057,7 @@ /turf/floor/tiled, /area/magshield/south) "je" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/magshield/south) "jf" = ( @@ -3148,7 +3148,7 @@ /turf/floor/tiled, /area/magshield/south) "js" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled, @@ -3160,7 +3160,7 @@ /turf/floor/tiled, /area/magshield/south) "ju" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light{ @@ -3177,7 +3177,7 @@ /turf/floor/tiled, /area/magshield/south) "jw" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, @@ -3424,7 +3424,7 @@ /turf/floor/tiled, /area/magshield/south) "kh" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, diff --git a/maps/away/mining/mining-signal.dmm b/maps/away/mining/mining-signal.dmm index 867c49b56143..1f697ed949c4 100644 --- a/maps/away/mining/mining-signal.dmm +++ b/maps/away/mining/mining-signal.dmm @@ -150,7 +150,7 @@ /turf/floor/tiled, /area/outpost/abandoned) "aK" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8; icon_state = "officechair_dark" }, @@ -158,7 +158,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "aL" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4; icon_state = "officechair_dark" }, @@ -332,7 +332,7 @@ /turf/floor/tiled/white, /area/outpost/abandoned) "bs" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/floor_decal/corner/purple{ dir = 5 }, @@ -778,7 +778,7 @@ /turf/floor/carpet/blue, /area/outpost/abandoned) "cP" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/light/small{ dir = 1 }, @@ -1061,12 +1061,12 @@ /area/outpost/abandoned) "dK" = ( /obj/abstract/landmark/mapped_fluid/fuel, -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled/airless, /area/outpost/abandoned) "dL" = ( /obj/abstract/landmark/mapped_fluid/fuel, -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/light/small/emergency{ dir = 1; icon_state = "bulb1" @@ -1074,7 +1074,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "dM" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled/airless, /area/outpost/abandoned) "dN" = ( @@ -1746,7 +1746,7 @@ /turf/floor/tiled/dark, /area/outpost/abandoned) "fV" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/floor/tiled/dark, @@ -1780,7 +1780,7 @@ /turf/wall/titanium, /area/outpost/abandoned) "ga" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/decal/cleanable/dirt/visible, @@ -2126,7 +2126,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "hb" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/floor_decal/industrial/warning{ dir = 1; icon_state = "warning" @@ -2176,7 +2176,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "hk" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/floor_decal/industrial/warning{ @@ -2190,7 +2190,7 @@ /turf/floor/tiled/airless, /area/outpost/abandoned) "hm" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled/airless, diff --git a/maps/away/smugglers/smugglers.dmm b/maps/away/smugglers/smugglers.dmm index a0dbd7960366..ab98bd7f708f 100644 --- a/maps/away/smugglers/smugglers.dmm +++ b/maps/away/smugglers/smugglers.dmm @@ -682,7 +682,7 @@ /turf/floor/tiled, /area/smugglers/office) "bL" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 8 }, /obj/machinery/light{ @@ -865,7 +865,7 @@ /turf/floor/plating/airless, /area/smugglers/dorms) "cr" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/light, @@ -889,7 +889,7 @@ /turf/floor/tiled, /area/smugglers/dorms) "cu" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light, diff --git a/maps/away/unishi/unishi-2.dmm b/maps/away/unishi/unishi-2.dmm index f31f2097fe4d..32aca273e7c6 100644 --- a/maps/away/unishi/unishi-2.dmm +++ b/maps/away/unishi/unishi-2.dmm @@ -19,13 +19,13 @@ /turf/floor/carpet/red, /area/unishi/library) "af" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /turf/floor/carpet/red, /area/unishi/library) "ah" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on, @@ -289,7 +289,7 @@ /turf/floor/tiled/white, /area/unishi/chem) "aU" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/white, @@ -334,7 +334,7 @@ /turf/floor, /area/unishi/common) "bb" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/machinery/light{ @@ -430,7 +430,7 @@ /turf/floor, /area/unishi/common) "bt" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled/dark, /area/unishi/classroom) "bu" = ( @@ -446,7 +446,7 @@ /turf/floor/tiled/dark, /area/unishi/classroom) "bv" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -844,7 +844,7 @@ /turf/floor/tiled, /area/unishi/meeting) "cA" = ( -/obj/structure/bed/chair/office/comfy/black, +/obj/structure/chair/office/comfy/black, /turf/floor/tiled, /area/unishi/meeting) "cB" = ( @@ -954,7 +954,7 @@ /turf/floor/reinforced, /area/space) "cM" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 4 }, /turf/floor/tiled, @@ -1014,7 +1014,7 @@ /turf/floor/reinforced, /area/unishi/toxins) "cW" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -1084,13 +1084,13 @@ /turf/floor/reinforced, /area/unishi/toxins) "df" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 1 }, /turf/floor/tiled, /area/unishi/meeting) "dg" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 1 }, /obj/machinery/alarm{ @@ -1286,13 +1286,13 @@ /turf/wall/titanium, /area/unishi/hydro) "dK" = ( -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 1 }, /turf/floor/tiled, /area/unishi/rnd) "dL" = ( -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -1310,7 +1310,7 @@ /turf/floor/tiled, /area/unishi/rnd) "dN" = ( -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -2001,7 +2001,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fB" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 4 }, /obj/machinery/light, @@ -2020,7 +2020,7 @@ /turf/floor/tiled/dark, /area/unishi/common) "fE" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 1 }, /turf/floor/tiled/dark, @@ -2042,7 +2042,7 @@ /turf/floor/tiled/white/monotile, /area/unishi/common) "fH" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 1 }, /obj/machinery/atmospherics/unary/vent_pump/on{ diff --git a/maps/away/unishi/unishi-3.dmm b/maps/away/unishi/unishi-3.dmm index f1b508bf2884..24e50a4e253e 100644 --- a/maps/away/unishi/unishi-3.dmm +++ b/maps/away/unishi/unishi-3.dmm @@ -58,7 +58,7 @@ /turf/floor/tiled, /area/unishi/bridge) "an" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, @@ -70,7 +70,7 @@ /turf/floor/tiled/white/monotile, /area/unishi/bridge) "ap" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/light, @@ -449,7 +449,7 @@ /turf/floor/tiled, /area/unishi/living) "bD" = ( -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 1 }, /turf/floor/tiled, @@ -526,7 +526,7 @@ /turf/floor, /area/unishi/living) "bL" = ( -/obj/structure/bed/chair/janicart, +/obj/structure/janicart, /obj/item/key, /obj/structure/hygiene/sink/kitchen{ dir = 8; @@ -626,7 +626,7 @@ /turf/floor/tiled/white, /area/unishi/med) "cb" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /turf/floor/tiled/white, /area/unishi/med) "cc" = ( @@ -637,7 +637,7 @@ /turf/floor/tiled/white, /area/unishi/med) "cd" = ( -/obj/structure/bed/chair/armchair/black, +/obj/structure/chair/armchair/black, /turf/floor/laminate, /area/unishi/lounge) "ce" = ( @@ -862,7 +862,7 @@ /turf/floor, /area/unishi/living) "cC" = ( -/obj/structure/bed/chair/padded/brown, +/obj/structure/chair/padded/brown, /obj/machinery/light{ dir = 1; icon_state = "tube1" @@ -873,23 +873,23 @@ /turf/floor/tiled, /area/unishi/living) "cD" = ( -/obj/structure/bed/chair/padded/black, +/obj/structure/chair/padded/black, /obj/machinery/computer/modular/telescreen/preset/generic, /turf/floor/tiled, /area/unishi/living) "cE" = ( -/obj/structure/bed/chair/padded/black, +/obj/structure/chair/padded/black, /turf/floor/tiled, /area/unishi/living) "cF" = ( /obj/structure/noticeboard{ default_pixel_y = 25 }, -/obj/structure/bed/chair/padded/black, +/obj/structure/chair/padded/black, /turf/floor/tiled, /area/unishi/living) "cG" = ( -/obj/structure/bed/chair/armchair/beige{ +/obj/structure/chair/armchair/beige{ dir = 4 }, /turf/floor/laminate, @@ -966,13 +966,13 @@ /turf/floor/tiled, /area/unishi/living) "cP" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 1 }, /turf/floor/laminate, /area/unishi/lounge) "cQ" = ( -/obj/structure/bed/chair/padded/brown{ +/obj/structure/chair/padded/brown{ dir = 1 }, /obj/effect/floor_decal/corner/brown{ @@ -981,7 +981,7 @@ /turf/floor/tiled, /area/unishi/living) "cR" = ( -/obj/structure/bed/chair/padded/black{ +/obj/structure/chair/padded/black{ dir = 1 }, /turf/floor/tiled, @@ -1014,7 +1014,7 @@ /turf/floor/tiled, /area/unishi/kitchen) "cX" = ( -/obj/structure/bed/chair/padded/brown{ +/obj/structure/chair/padded/brown{ dir = 4 }, /obj/effect/floor_decal/corner/brown{ @@ -1029,7 +1029,7 @@ /turf/floor/tiled, /area/unishi/living) "cZ" = ( -/obj/structure/bed/chair/padded/black{ +/obj/structure/chair/padded/black{ dir = 8 }, /obj/machinery/light, @@ -1728,7 +1728,7 @@ /turf/floor/laminate, /area/unishi/living) "eK" = ( -/obj/structure/bed/chair/office, +/obj/structure/chair/office, /obj/machinery/light/small{ dir = 4; icon_state = "bulb1" @@ -1776,7 +1776,7 @@ /turf/floor/tiled, /area/unishi/living) "eR" = ( -/obj/structure/bed/chair/office/comfy/black{ +/obj/structure/chair/office/comfy/black{ dir = 4 }, /turf/floor/laminate, @@ -1866,7 +1866,7 @@ /turf/floor, /area/unishi/living) "fc" = ( -/obj/structure/bed/chair/armchair/black, +/obj/structure/chair/armchair/black, /turf/floor/laminate, /area/unishi/living) "fd" = ( diff --git a/maps/away/yacht/yacht.dmm b/maps/away/yacht/yacht.dmm index 4cec95db85f5..9cc85f9666d9 100644 --- a/maps/away/yacht/yacht.dmm +++ b/maps/away/yacht/yacht.dmm @@ -42,7 +42,7 @@ /area/yacht/bridge) "ak" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/structure/bed/chair/comfy/captain, +/obj/structure/chair/comfy/captain, /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, /turf/floor/laminate/walnut, @@ -192,7 +192,7 @@ /turf/floor/laminate/yew, /area/yacht/living) "aF" = ( -/obj/structure/bed/chair/wood/wings{ +/obj/structure/chair/wood/wings{ dir = 4 }, /obj/effect/decal/cleanable/dirt/visible, @@ -465,7 +465,7 @@ /turf/floor/carpet/purple, /area/yacht/living) "bw" = ( -/obj/structure/bed/chair/comfy/red{ +/obj/structure/chair/comfy/red{ dir = 4 }, /turf/floor/carpet/purple, diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index bd953735089c..a25c16112a44 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -405,7 +405,7 @@ /turf/floor/carpet, /area/exodus/maintenance/sub/port) "bi" = ( -/obj/structure/bed/chair/wood/wings, +/obj/structure/chair/wood/wings, /turf/floor/plating, /area/exodus/maintenance/sub/port) "bj" = ( @@ -414,7 +414,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/port) "bk" = ( -/obj/structure/bed/chair/wood/wings{ +/obj/structure/chair/wood/wings{ dir = 4 }, /turf/floor/plating, @@ -461,13 +461,13 @@ /turf/floor/plating, /area/exodus/maintenance/sub/port) "bs" = ( -/obj/structure/bed/chair/wood/wings{ +/obj/structure/chair/wood/wings{ dir = 1 }, /turf/floor/laminate, /area/exodus/maintenance/sub/port) "bt" = ( -/obj/structure/bed/chair/wood/wings{ +/obj/structure/chair/wood/wings{ dir = 1 }, /turf/floor/plating, @@ -1044,13 +1044,13 @@ /turf/floor/plating, /area/exodus/maintenance/sub/starboard) "dw" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/plating, /area/exodus/maintenance/sub/starboard) "dx" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/plating, @@ -1105,7 +1105,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/starboard) "dE" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /turf/floor/plating, /area/exodus/maintenance/sub/starboard) "dF" = ( @@ -1278,7 +1278,7 @@ /turf/floor/plating, /area/exodus/maintenance/sub/port) "dZ" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/floor/plating, @@ -1683,7 +1683,7 @@ /turf/floor/bluegrid, /area/exodus/maintenance/sub/command) "fc" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -3674,7 +3674,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/plating, @@ -3716,7 +3716,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/atmos) "jM" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/abstract/landmark/start{ @@ -5714,7 +5714,7 @@ /turf/floor/tiled/dark/monotile, /area/exodus/maintenance/telecomms) "Bc" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/lino, diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index d97c31997955..f323c39ad5fd 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -1034,7 +1034,7 @@ /turf/floor/plating, /area/exodus/maintenance/foresolar) "acn" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/item/radio/intercom{ @@ -1386,7 +1386,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "acZ" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/machinery/atmospherics/unary/vent_scrubber/on, @@ -1523,7 +1523,7 @@ /obj/structure/sign/warning/vacuum{ pixel_x = 32 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/plating, @@ -1775,7 +1775,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "adV" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/abstract/landmark/start{ name = "Security Officer" }, @@ -1962,7 +1962,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/main) "aep" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -2049,7 +2049,7 @@ /turf/floor/plating, /area/exodus/crew_quarters/heads/hos) "aex" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/structure/cable/green{ @@ -2119,7 +2119,7 @@ /turf/wall/prepainted, /area/exodus/security/warden) "aeG" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/structure/cable/green{ @@ -2306,7 +2306,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "afb" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/structure/cable/green{ @@ -2342,7 +2342,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "afe" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/structure/cable/green{ @@ -2506,7 +2506,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/meeting) "afx" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/structure/cable/green{ @@ -2556,7 +2556,7 @@ /turf/floor/plating, /area/exodus/maintenance/security_starboard) "afB" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/light/small/emergency{ @@ -2689,7 +2689,7 @@ /area/shuttle/escape_pod_3) "afQ" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/steel_grid, @@ -2822,7 +2822,7 @@ /turf/floor/plating, /area/exodus/security/meeting) "agh" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/status_display{ @@ -3560,7 +3560,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "ahM" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/light/small/emergency{ @@ -3583,7 +3583,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/carpet, /area/exodus/crew_quarters/heads/hos) "ahO" = ( @@ -3743,7 +3743,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/security/brig/processing) "aik" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/floor/tiled/dark, @@ -3829,7 +3829,7 @@ /turf/floor/plating, /area/exodus/maintenance/dormitory) "aiv" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled/steel_grid, /area/exodus/security/brig/processing) "aiw" = ( @@ -3875,7 +3875,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/security/brig) "aiC" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/plating, @@ -3885,7 +3885,7 @@ /turf/floor/plating, /area/exodus/maintenance/security_port) "aiE" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/cable/green{ @@ -3911,7 +3911,7 @@ /turf/floor/plating, /area/exodus/security/brig/interrogation) "aiG" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/power/apc{ @@ -3946,7 +3946,7 @@ /turf/floor/plating, /area/exodus/maintenance/substation/security) "aiK" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/abstract/landmark/start{ @@ -4039,7 +4039,7 @@ /turf/floor/tiled/dark, /area/exodus/security/warden) "aiV" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/cable/green{ @@ -4056,7 +4056,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/brig/processing) "aiX" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -4133,7 +4133,7 @@ /turf/floor/tiled/dark, /area/exodus/security/brig/processing) "ajf" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 1 }, /obj/abstract/landmark/start{ @@ -4207,7 +4207,7 @@ /turf/floor/tiled/dark, /area/exodus/security/warden) "ajk" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 8 }, /obj/machinery/status_display{ @@ -5480,7 +5480,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/security/brig/processing) "alC" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/abstract/landmark/start{ @@ -5765,7 +5765,7 @@ /turf/wall/prepainted, /area/exodus/lawoffice) "amj" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/machinery/button/alternate/door{ @@ -5800,7 +5800,7 @@ /turf/wall/prepainted, /area/exodus/security/main) "amm" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/machinery/button/alternate/door{ @@ -6074,7 +6074,7 @@ /turf/floor/plating, /area/exodus/security/prison) "amP" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/abstract/landmark/start{ name = "Internal Affairs Agent" }, @@ -6723,7 +6723,7 @@ /turf/floor/lino, /area/exodus/security/detectives_office) "aoe" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/abstract/landmark/start{ @@ -6753,7 +6753,7 @@ /area/exodus/security/detectives_office) "aoh" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/dark, @@ -7340,7 +7340,7 @@ /turf/floor/plating, /area/exodus/maintenance/dormitory) "apw" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -7394,7 +7394,7 @@ /turf/floor/plating, /area/exodus/maintenance/dormitory) "apC" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/status_display{ @@ -7416,7 +7416,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/corner/red{ @@ -7428,7 +7428,7 @@ /turf/floor/laminate, /area/exodus/maintenance/dormitory) "apG" = ( -/obj/structure/bed/chair/wood/wings, +/obj/structure/chair/wood/wings, /turf/floor/laminate, /area/exodus/maintenance/dormitory) "apH" = ( @@ -7539,7 +7539,7 @@ /turf/floor/tiled/dark, /area/exodus/lawoffice) "apS" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/floor/tiled/white, @@ -7630,7 +7630,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/prison) "aqb" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -7646,7 +7646,7 @@ id_tag = "air_in"; use_power = 1 }, -/obj/structure/bed/chair, +/obj/structure/chair, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -7668,7 +7668,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/prison) "aqe" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/structure/cable/green{ icon_state = "4-8" }, @@ -7729,7 +7729,7 @@ /turf/floor/plating, /area/exodus/maintenance/dormitory) "aqj" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/cable/green{ @@ -7856,7 +7856,7 @@ /turf/floor/laminate, /area/exodus/maintenance/dormitory) "aqv" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/disposalpipe/segment{ @@ -7879,7 +7879,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/brig/solitaryB) "aqy" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/abstract/landmark/start{ @@ -8107,7 +8107,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/prison) "aqY" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/cable/green{ @@ -8668,13 +8668,13 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/security/brig/solitaryB) "asa" = ( -/obj/structure/bed/chair/wood/wings{ +/obj/structure/chair/wood/wings{ dir = 1 }, /turf/floor/laminate, /area/exodus/maintenance/dormitory) "asb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/plating, @@ -8752,7 +8752,7 @@ /turf/floor/plating/airless, /area/exodus/solar/auxstarboard) "asi" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/steel_grid, @@ -8766,7 +8766,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/maintenance/dormitory) "ask" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -8883,7 +8883,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/security/brig/solitaryA) "asx" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/status_display{ @@ -9151,7 +9151,7 @@ /turf/wall/prepainted, /area/exodus/security/prison/dorm) "asX" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /mob/living/simple_animal/passive/mouse, @@ -9893,7 +9893,7 @@ /turf/wall/prepainted, /area/exodus/maintenance/arrivals) "auR" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/structure/cable/green{ @@ -10145,7 +10145,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/security/prison) "avt" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/alarm{ @@ -10557,7 +10557,7 @@ /turf/floor/laminate/walnut, /area/exodus/crew_quarters/sleep/bedrooms) "awk" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/alarm{ @@ -11512,7 +11512,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/pods) "ays" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 1 }, /obj/effect/floor_decal/industrial/warning, @@ -13171,7 +13171,7 @@ /turf/floor/tiled/dark, /area/exodus/ai_monitored/storage/eva) "aBR" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/cable{ @@ -13398,7 +13398,7 @@ /turf/floor/plating, /area/exodus/storage/emergency2) "aCr" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -13541,7 +13541,7 @@ /turf/floor/plating, /area/exodus/bridge) "aCI" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/industrial/hatch/yellow, @@ -14549,7 +14549,7 @@ /turf/floor/tiled/dark, /area/exodus/security/checkpoint2) "aEO" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -16405,7 +16405,7 @@ /obj/effect/floor_decal/corner/white{ dir = 10 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/abstract/landmark/latejoin, @@ -16526,7 +16526,7 @@ /obj/effect/floor_decal/corner/white{ dir = 5 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/abstract/landmark/latejoin, @@ -16567,7 +16567,7 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /turf/floor/tiled/dark/monotile, @@ -16814,7 +16814,7 @@ /turf/floor/lino, /area/exodus/chapel/office) "aJk" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/structure/disposalpipe/segment{ dir = 4; icon_state = "pipe-c" @@ -16828,7 +16828,7 @@ /obj/abstract/landmark/start{ name = "Chaplain" }, -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/atmospherics/pipe/simple/hidden/supply, /turf/floor/lino, /area/exodus/chapel/office) @@ -17152,7 +17152,7 @@ /turf/floor/tiled/monotile, /area/exodus/storage/primary) "aJW" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -17205,7 +17205,7 @@ /turf/floor/plating, /area/exodus/maintenance/substation/civilian_west) "aKb" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -17732,7 +17732,7 @@ /turf/wall/prepainted, /area/exodus/hydroponics) "aLi" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/machinery/firealarm{ pixel_y = 24 }, @@ -17761,7 +17761,7 @@ /turf/floor/laminate/walnut, /area/exodus/library) "aLm" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/dark, @@ -17829,7 +17829,7 @@ name = "north bump"; pixel_y = 24 }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/structure/cable/green{ @@ -18144,7 +18144,7 @@ /turf/floor/plating, /area/exodus/maintenance/library) "aMg" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/floor/laminate/walnut, @@ -18187,7 +18187,7 @@ /obj/machinery/firealarm{ pixel_y = 24 }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /obj/item/radio/intercom{ @@ -18218,7 +18218,7 @@ /turf/floor/lino, /area/exodus/crew_quarters/bar) "aMq" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/laminate/walnut, @@ -18431,7 +18431,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/research/docking) "aMN" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -18525,14 +18525,14 @@ /turf/floor/plating, /area/exodus/maintenance/arrivals) "aMX" = ( -/obj/structure/bed/chair/comfy/beige, +/obj/structure/chair/comfy/beige, /turf/floor/lino, /area/exodus/hallway/secondary/entry/starboard) "aMY" = ( /turf/floor/lino, /area/exodus/hallway/secondary/entry/starboard) "aMZ" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/structure/cable/green{ @@ -18566,7 +18566,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hydroponics) "aNd" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -18630,7 +18630,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/port) "aNj" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/laminate/walnut, @@ -19123,7 +19123,7 @@ /turf/floor/lino, /area/exodus/crew_quarters/bar) "aOf" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/structure/disposalpipe/segment, @@ -19425,7 +19425,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/alarm{ pixel_y = 22 }, @@ -20546,7 +20546,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/library) "aRn" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /obj/machinery/button/windowtint{ @@ -20762,7 +20762,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/port) "aRJ" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 1 }, /turf/floor/lino, @@ -20997,7 +20997,7 @@ /area/exodus/medical/medbay) "aSl" = ( /obj/machinery/light/small, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/alarm{ @@ -21287,7 +21287,7 @@ /turf/floor/plating, /area/exodus/maintenance/locker) "aSP" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /turf/floor/laminate/walnut, @@ -21458,7 +21458,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/hallway/secondary/entry/aft) "aTk" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 8 }, /turf/floor/laminate/walnut, @@ -21784,7 +21784,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_one) "aTW" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/effect/floor_decal/corner/yellow/full, @@ -22522,7 +22522,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/storage/tools) "aVN" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/steel_grid, @@ -22555,7 +22555,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/bridge) "aVS" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aVT" = ( @@ -22581,11 +22581,11 @@ /obj/structure/cable/green{ icon_state = "1-4" }, -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aVX" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) @@ -22619,7 +22619,7 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /obj/structure/disposalpipe/segment, /turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) @@ -22734,7 +22734,7 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "aWl" = ( -/obj/structure/bed/chair/comfy/black, +/obj/structure/chair/comfy/black, /turf/floor/laminate/walnut, /area/exodus/library) "aWm" = ( @@ -22835,7 +22835,7 @@ /obj/abstract/landmark/start{ name = "Librarian" }, -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /turf/floor/laminate/walnut, /area/exodus/library) "aWA" = ( @@ -23622,7 +23622,7 @@ /turf/floor/lino, /area/exodus/security/vacantoffice) "aYt" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 8 }, /turf/floor/laminate/walnut, @@ -23834,7 +23834,7 @@ /turf/floor/plating, /area/exodus/maintenance/locker) "aYS" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -24057,7 +24057,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/bridge) "aZg" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -24164,7 +24164,7 @@ /turf/floor/plating, /area/exodus/research/xenobiology/xenoflora) "aZr" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 1 }, /turf/floor/laminate/walnut, @@ -24239,7 +24239,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 1 }, /turf/floor/laminate/walnut, @@ -24272,7 +24272,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 6 }, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 1 }, /turf/floor/laminate/walnut, @@ -24312,13 +24312,13 @@ dir = 4 }, /obj/structure/disposalpipe/segment, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 1 }, /turf/floor/laminate/walnut, /area/exodus/crew_quarters/bar) "aZL" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/structure/window/reinforced{ @@ -24388,13 +24388,13 @@ /turf/wall/prepainted, /area/exodus/engineering/engine_eva) "aZV" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/floor/lino, /area/exodus/security/vacantoffice) "aZW" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/floor/lino, @@ -25085,7 +25085,7 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/kitchen) "bbs" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_scrubber/on{ @@ -25184,7 +25184,7 @@ /turf/floor/tiled/dark, /area/exodus/security/vacantoffice) "bbE" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 4 }, /turf/floor/laminate/walnut, @@ -25502,7 +25502,7 @@ /turf/floor/plating/airless, /area/exodus/turret_protected/ai) "bcm" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -25979,7 +25979,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/aft) "bdk" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/lino, @@ -26282,7 +26282,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bdR" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/floor_decal/corner/lime{ @@ -26389,7 +26389,7 @@ dir = 8; icon_state = "pipe-c" }, -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /turf/floor/laminate/walnut, @@ -26505,7 +26505,7 @@ /turf/floor/tiled/dark, /area/exodus/security/vacantoffice) "bex" = ( -/obj/structure/bed/chair/comfy/black, +/obj/structure/chair/comfy/black, /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bey" = ( @@ -26543,7 +26543,7 @@ /turf/floor/plating, /area/exodus/maintenance/locker) "beC" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/structure/cable/green{ @@ -26564,7 +26564,7 @@ /turf/floor/laminate/walnut, /area/exodus/library) "beE" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /obj/structure/cable/green{ @@ -26869,7 +26869,7 @@ /turf/floor/plating, /area/exodus/quartermaster/office) "bfj" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 4 }, /obj/structure/cable/green{ @@ -26882,7 +26882,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bfl" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/atmospherics/unary/vent_pump/on, @@ -27015,7 +27015,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/exit) "bfB" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 8 }, /obj/structure/cable/green{ @@ -27570,7 +27570,7 @@ /turf/floor/carpet, /area/exodus/bridge/meeting_room) "bgQ" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /turf/floor/carpet, @@ -27653,7 +27653,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/aft) "bgZ" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /turf/floor/carpet, @@ -27682,7 +27682,7 @@ /turf/floor/laminate/walnut, /area/exodus/crew_quarters/captain) "bhd" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 4 }, /turf/floor/carpet, @@ -27698,7 +27698,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "bhf" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 8 }, /turf/floor/carpet, @@ -29966,7 +29966,7 @@ /turf/floor/bluegrid, /area/exodus/turret_protected/ai) "blE" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/abstract/landmark/start{ @@ -30464,7 +30464,7 @@ name = "north bump"; pixel_y = 24 }, -/obj/structure/bed/chair/wheelchair, +/obj/structure/chair/wheelchair, /obj/structure/cable/green{ icon_state = "0-2" }, @@ -30861,7 +30861,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/carpet, /area/exodus/crew_quarters/captain) "bns" = ( @@ -31088,7 +31088,7 @@ /turf/floor/tiled/dark, /area/exodus/turret_protected/ai) "bnK" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/tiled/white, @@ -31121,7 +31121,7 @@ /turf/floor/tiled/freezer, /area/exodus/medical/patient_wing/washroom) "bnQ" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -31337,7 +31337,7 @@ /turf/floor/tiled/dark, /area/exodus/turret_protected/ai_upload) "bou" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -31482,7 +31482,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/workshop) "boK" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 1 }, /obj/abstract/landmark/start{ @@ -31560,7 +31560,7 @@ /obj/effect/floor_decal/corner/purple{ dir = 5 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 1 }, /obj/effect/floor_decal/industrial/warning{ @@ -31569,7 +31569,7 @@ /turf/floor/tiled/white, /area/exodus/research/lab) "boT" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /turf/floor/tiled/white, @@ -33845,7 +33845,7 @@ pixel_x = -16; pixel_y = 28 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/abstract/landmark/start{ @@ -33979,7 +33979,7 @@ pixel_x = 6; pixel_y = 28 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/abstract/landmark/start{ @@ -34038,7 +34038,7 @@ /turf/floor/carpet, /area/exodus/crew_quarters/captain) "btT" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -34583,7 +34583,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "buT" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/firealarm{ @@ -35239,7 +35239,7 @@ /obj/abstract/landmark/start{ name = "Cargo Technician" }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /turf/floor/tiled/steel_grid, @@ -35303,7 +35303,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/quartermaster/office) "bws" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -35416,7 +35416,7 @@ /turf/floor/plating, /area/exodus/storage/emergency) "bwG" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/structure/disposalpipe/segment{ @@ -35457,7 +35457,7 @@ /obj/structure/cable/green{ icon_state = "2-8" }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/white, @@ -35518,7 +35518,7 @@ /turf/floor/tiled/dark, /area/exodus/turret_protected/ai_upload) "bwR" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -35995,7 +35995,7 @@ /turf/floor/tiled/dark, /area/exodus/research) "bxQ" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/structure/cable/green{ @@ -37848,7 +37848,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/quartermaster/office) "bBw" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled/steel_grid, @@ -38128,7 +38128,7 @@ /turf/floor/tiled/white, /area/exodus/medical/medbay3) "bCb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light, @@ -38496,7 +38496,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_three) "bCR" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -38532,7 +38532,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/hop) "bCT" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled/steel_grid, @@ -41003,7 +41003,7 @@ /turf/floor/reinforced, /area/exodus/research/misc_lab) "bHH" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/abstract/landmark/start{ name = "Quartermaster" }, @@ -41170,7 +41170,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_three) "bHV" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /turf/floor/tiled/dark, /area/exodus/research/server) "bHW" = ( @@ -41540,7 +41540,7 @@ /turf/floor/plating, /area/exodus/medical/genetics/cloning) "bIH" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/abstract/landmark/start{ name = "Geneticist" }, @@ -42632,7 +42632,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/qm) "bKO" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/steel_grid, @@ -43149,7 +43149,7 @@ /turf/floor/plating/airless, /area/exodus/research/test_area) "bLU" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/steel_grid, @@ -43267,7 +43267,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -43837,7 +43837,7 @@ /turf/floor, /area/exodus/quartermaster/miningdock) "bNh" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /obj/effect/floor_decal/corner/purple/diagonal{ @@ -44233,7 +44233,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/crew_quarters/heads/cmo) "bOe" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 5 }, @@ -44243,7 +44243,7 @@ /turf/floor/tiled/white, /area/exodus/crew_quarters/heads/cmo) "bOf" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled/white, /area/exodus/crew_quarters/heads/cmo) "bOg" = ( @@ -45722,7 +45722,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/medical/medbay) "bRc" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/abstract/landmark/start{ @@ -46444,7 +46444,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/abstract/landmark/start{ @@ -46503,7 +46503,7 @@ /obj/machinery/camera/network/medbay{ c_tag = "Medbay Examination Room" }, -/obj/structure/bed/chair/wheelchair, +/obj/structure/chair/wheelchair, /turf/floor/tiled/white, /area/exodus/medical/exam_room) "bSz" = ( @@ -46511,7 +46511,7 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/effect/floor_decal/corner/pink{ dir = 9 }, @@ -46522,7 +46522,7 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/effect/floor_decal/corner/pink{ dir = 9 }, @@ -46607,7 +46607,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/research/storage) "bSJ" = ( -/obj/structure/bed/chair/comfy/teal{ +/obj/structure/chair/comfy/teal{ dir = 8 }, /obj/effect/floor_decal/corner/paleblue{ @@ -46763,7 +46763,7 @@ /turf/floor/plating, /area/exodus/storage/tech) "bTc" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -47563,7 +47563,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/bed/chair/comfy/teal{ +/obj/structure/chair/comfy/teal{ dir = 4 }, /obj/effect/floor_decal/corner/paleblue{ @@ -47659,7 +47659,7 @@ /turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "bUY" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/status_display{ @@ -48034,7 +48034,7 @@ /turf/floor/tiled/airless, /area/exodus/research/test_area) "bVM" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/item/radio/intercom{ @@ -48366,7 +48366,7 @@ /turf/floor/tiled/white, /area/exodus/medical/patient_wing) "bWx" = ( -/obj/structure/bed/chair/comfy/teal, +/obj/structure/chair/comfy/teal, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -48451,7 +48451,7 @@ /turf/floor/tiled/white, /area/exodus/research/misc_lab) "bWH" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 1 }, /obj/abstract/landmark/start{ @@ -48815,7 +48815,7 @@ /obj/abstract/landmark/start{ name = "Station Engineer" }, -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /turf/floor/carpet, /area/exodus/engineering/break_room) "bXv" = ( @@ -49517,7 +49517,7 @@ /turf/floor/plating, /area/exodus/engineering/storage) "bYH" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -49600,7 +49600,7 @@ /obj/abstract/landmark/start{ name = "Station Engineer" }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /turf/floor/carpet, @@ -49951,7 +49951,7 @@ /turf/floor/tiled/freezer, /area/exodus/medical/patient_wing/washroom) "bZH" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/plating, @@ -50168,7 +50168,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/chief) "cae" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /obj/abstract/landmark/start{ @@ -50207,7 +50207,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/crew_quarters/heads/chief) "cag" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/structure/cable/green{ @@ -50377,7 +50377,7 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair/comfy/teal{ +/obj/structure/chair/comfy/teal{ dir = 4 }, /obj/effect/floor_decal/corner/pink/three_quarters{ @@ -50439,7 +50439,7 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/effect/floor_decal/corner/pink{ @@ -50714,7 +50714,7 @@ /obj/abstract/landmark/start{ name = "Atmospheric Technician" }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /turf/floor/carpet, @@ -52167,7 +52167,7 @@ /obj/abstract/landmark/start{ name = "Station Engineer" }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /turf/floor/carpet, @@ -52176,7 +52176,7 @@ /obj/abstract/landmark/start{ name = "Atmospheric Technician" }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /turf/floor/carpet, @@ -52282,7 +52282,7 @@ /turf/floor/laminate/walnut, /area/exodus/engineering/break_room) "cel" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /obj/machinery/firealarm{ @@ -52447,7 +52447,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/foyer) "ceB" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/effect/floor_decal/corner/white/diagonal, /turf/floor/tiled/steel_grid, /area/exodus/engineering/break_room) @@ -52554,7 +52554,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/medical/surgeryobs) "ceP" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled/steel_grid, /area/exodus/medical/surgeryobs) "ceQ" = ( @@ -53075,7 +53075,7 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /turf/floor/carpet/blue, @@ -53225,7 +53225,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/foyer) "cgp" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /obj/abstract/landmark/start{ name = "Psychiatrist" }, @@ -53312,7 +53312,7 @@ icon_state = "1-8" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /obj/abstract/landmark/start{ @@ -54138,7 +54138,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply{ dir = 4 }, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -54801,7 +54801,7 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /obj/abstract/landmark/start{ @@ -54844,7 +54844,7 @@ /area/exodus/research/xenobiology/xenoflora) "cjG" = ( /obj/machinery/atmospherics/pipe/simple/hidden/supply, -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -55493,7 +55493,7 @@ /turf/floor/plating, /area/exodus/maintenance/engi_engine) "cle" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/cyan, @@ -56425,7 +56425,7 @@ /turf/floor/tiled/white, /area/exodus/medical/surgery) "cmY" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 4 }, /obj/effect/floor_decal/corner/blue{ @@ -56657,7 +56657,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /turf/floor/tiled/steel_grid, /area/exodus/engineering/engineering_monitoring) "cnA" = ( @@ -57703,7 +57703,7 @@ /turf/floor/plating/airless, /area/space) "cqa" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -58055,7 +58055,7 @@ /turf/floor/plating, /area/exodus/maintenance/engi_shuttle) "cre" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 4 }, /obj/abstract/landmark/start{ @@ -59039,7 +59039,7 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/atmospherics/unary/vent_scrubber/on, /obj/machinery/camera/network/medbay{ c_tag = "Virology Monkey Pen" @@ -59471,7 +59471,7 @@ /turf/floor/tiled/white, /area/exodus/medical/virology) "cuN" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /obj/structure/disposalpipe/segment, @@ -59494,7 +59494,7 @@ /turf/floor/tiled/white, /area/exodus/medical/virology) "cuR" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/tiled/white, @@ -60054,7 +60054,7 @@ /obj/effect/floor_decal/corner/white{ dir = 5 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/abstract/landmark/latejoin, @@ -60360,7 +60360,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/workshop) "cyz" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/abstract/landmark/start{ name = "Station Engineer" }, @@ -60405,7 +60405,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/secondary/entry/port) "cyI" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 1 }, @@ -60658,13 +60658,13 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/plating, /area/exodus/maintenance/engi_shuttle) "czE" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/structure/cable/green{ @@ -60697,7 +60697,7 @@ /turf/floor/plating, /area/exodus/maintenance/engi_shuttle) "czO" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/power/apc{ @@ -61202,7 +61202,7 @@ /turf/wall/r_wall/prepainted, /area/exodus/engineering/engine_airlock) "cDt" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/floor_decal/industrial/warning{ dir = 1 }, @@ -61241,7 +61241,7 @@ /turf/floor/tiled/techfloor/grid, /area/exodus/engineering/engine_airlock) "cDy" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/plating, @@ -61544,7 +61544,7 @@ /turf/floor/tiled/white, /area/exodus/medical/virology) "cEV" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/plating, @@ -61755,7 +61755,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/engineering/engine_monitoring) "cGn" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/abstract/landmark/start{ name = "Station Engineer" }, @@ -61949,7 +61949,7 @@ /turf/floor/plating, /area/exodus/engineering/drone_fabrication) "cHg" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/floor_decal/industrial/warning, @@ -62923,7 +62923,7 @@ pixel_y = 25; tag_door = "engineering_shuttle_hatch" }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/light{ @@ -62980,7 +62980,7 @@ /turf/floor/tiled/dark, /area/ship/exodus_pod_engineering) "cLk" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/dark, @@ -63031,7 +63031,7 @@ /turf/floor/plating, /area/ship/exodus_pod_engineering) "cLu" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/light, @@ -63708,7 +63708,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/central_two) "gOE" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/abstract/landmark/latejoin, @@ -63824,7 +63824,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/hallway/primary/starboard) "hWZ" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/light{ dir = 4 }, @@ -63844,7 +63844,7 @@ /obj/structure/cable/green{ icon_state = "2-4" }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/steel_grid, @@ -63878,7 +63878,7 @@ /obj/effect/floor_decal/corner/white{ dir = 10 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/abstract/landmark/latejoin, @@ -63924,13 +63924,13 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /turf/floor/tiled/dark/monotile, /area/shuttle/arrival/station) "iTt" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/structure/cable/green{ @@ -64031,7 +64031,7 @@ /obj/structure/cable/green{ icon_state = "1-4" }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/white, @@ -64096,7 +64096,7 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/industrial/hatch/yellow, @@ -64198,7 +64198,7 @@ /turf/floor/plating, /area/ship/exodus_pod_research) "mYp" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/window/reinforced{ @@ -64305,7 +64305,7 @@ /obj/structure/cable/green{ icon_state = "1-8" }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/steel_grid, @@ -64354,7 +64354,7 @@ /turf/floor/tiled/dark, /area/exodus/chapel/main) "pqS" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/cable/green{ @@ -64516,7 +64516,7 @@ /obj/structure/cable/green{ icon_state = "1-2" }, -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/light{ dir = 8 }, @@ -64740,7 +64740,7 @@ /turf/floor/plating, /area/ship/exodus_pod_mining) "tQY" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light, @@ -65065,7 +65065,7 @@ /turf/floor/tiled/steel_grid, /area/exodus/quartermaster/office) "xVx" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/abstract/landmark/latejoin, diff --git a/maps/exodus/exodus-admin.dmm b/maps/exodus/exodus-admin.dmm index 97ee913e4191..cde6caa5150c 100644 --- a/maps/exodus/exodus-admin.dmm +++ b/maps/exodus/exodus-admin.dmm @@ -207,7 +207,7 @@ /turf/unsimulated/floor/steel, /area/centcom) "auW" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/unsimulated/floor/steel, @@ -254,7 +254,7 @@ /turf/space, /area/space) "ayg" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/unsimulated/floor/steel, @@ -330,7 +330,7 @@ /turf/space, /area/shuttle/supply_shuttle) "aBA" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/floor_decal/industrial/warning/corner{ dir = 4 }, @@ -343,7 +343,7 @@ /turf/unsimulated/floor/steel, /area/centcom) "aBC" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/floor_decal/industrial/warning/corner{ dir = 1 }, @@ -408,7 +408,7 @@ /turf/unsimulated/floor/steel, /area/centcom) "aCv" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/unsimulated/floor/steel, /area/centcom) "aCx" = ( @@ -520,7 +520,7 @@ /obj/machinery/light/small{ dir = 1 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 4 }, /obj/effect/floor_decal/corner/red/half{ @@ -558,7 +558,7 @@ /turf/floor/tiled/dark, /area/shuttle/escape_shuttle) "aGE" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 1 }, /obj/effect/floor_decal/corner/blue/diagonal, @@ -756,7 +756,7 @@ /obj/machinery/light{ dir = 4 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /turf/floor/tiled/monotile, @@ -785,7 +785,7 @@ /turf/floor/plating, /area/shuttle/escape_shuttle) "aIS" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /turf/floor/tiled/monotile, @@ -937,7 +937,7 @@ dir = 8; pixel_x = 22 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/effect/floor_decal/corner/red/half{ @@ -982,7 +982,7 @@ /turf/unsimulated/floor/white, /area/space) "aLc" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 4 }, /obj/effect/floor_decal/corner/red/half{ @@ -997,7 +997,7 @@ /turf/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "aLe" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/effect/floor_decal/corner/red/half{ @@ -1006,7 +1006,7 @@ /turf/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "aLf" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/floor_decal/corner/green{ @@ -1024,7 +1024,7 @@ /turf/floor/tiled/white, /area/shuttle/escape_shuttle) "aLm" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/machinery/button/blast_door{ desc = "A remote control switch for port-side blast doors."; id_tag = "CentComPort"; @@ -1297,7 +1297,7 @@ /turf/unsimulated/floor/grass, /area/centcom/holding) "aMp" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/corner/green{ @@ -1339,19 +1339,19 @@ dir = 4; pixel_x = -22 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 4 }, /turf/floor/tiled/monotile, /area/shuttle/escape_shuttle) "aMz" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/unsimulated/floor/steel, /area/centcom/holding) "aMA" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/unsimulated/floor/steel, @@ -1400,7 +1400,7 @@ /turf/unsimulated/floor/steel, /area/centcom/holding) "aMR" = ( -/obj/structure/bed/chair/wood/wings{ +/obj/structure/chair/wood/wings{ dir = 4 }, /turf/unsimulated/floor/laminate, @@ -1422,7 +1422,7 @@ c_tag = "Shuttle East"; dir = 4 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 4 }, /turf/floor/tiled/monotile, @@ -1457,7 +1457,7 @@ /turf/unsimulated/floor/laminate, /area/centcom/holding) "aNa" = ( -/obj/structure/bed/chair/wood/wings{ +/obj/structure/chair/wood/wings{ dir = 8 }, /turf/unsimulated/floor/laminate, @@ -1508,7 +1508,7 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "aNo" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/corner/green{ @@ -1530,7 +1530,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 4 }, /turf/floor/tiled/monotile, @@ -1683,7 +1683,7 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "aPK" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/floor_decal/corner/green, @@ -1737,7 +1737,7 @@ /turf/unsimulated/floor/laminate, /area/centcom/holding) "aZb" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/structure/table/laminate{ @@ -1751,7 +1751,7 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "bgb" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/structure/table/laminate{ @@ -1766,7 +1766,7 @@ /turf/unsimulated/floor/lino, /area/centcom/holding) "bjb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/corner/green{ @@ -1883,7 +1883,7 @@ /turf/floor/tiled, /area/shuttle/escape_shuttle) "cEu" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/camera/network/crescent{ @@ -1905,7 +1905,7 @@ /turf/floor/tiled/dark/monotile, /area/shuttle/escape_shuttle) "cIe" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/unsimulated/floor/lino, /area/tdome/tdomeadmin) "cIv" = ( @@ -1921,7 +1921,7 @@ /turf/floor/tiled/dark, /area/shuttle/escape_shuttle) "cQH" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/abstract/landmark{ @@ -1944,7 +1944,7 @@ name = "Emergency NanoMed"; pixel_x = 28 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/effect/floor_decal/corner/blue/border{ @@ -1979,7 +1979,7 @@ /obj/effect/floor_decal/corner/green{ dir = 9 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/unsimulated/floor/steel, @@ -2085,7 +2085,7 @@ /turf/unsimulated/floor/vault, /area/tdome) "fRC" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/unsimulated/floor/vault, @@ -2116,7 +2116,7 @@ /turf/floor/tiled, /area/shuttle/escape_shuttle) "ghj" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/unsimulated/floor/vault, @@ -2163,7 +2163,7 @@ /turf/floor/tiled/dark, /area/shuttle/escape_shuttle) "hlP" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 4 }, /turf/floor/tiled/dark/monotile, @@ -2202,7 +2202,7 @@ /turf/floor/tiled/dark, /area/shuttle/escape_shuttle) "hMN" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/structure/disposalpipe/segment, @@ -2252,7 +2252,7 @@ /turf/floor/tiled/monotile, /area/shuttle/escape_shuttle) "jlk" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /turf/floor/tiled/dark/monotile, @@ -2289,7 +2289,7 @@ /turf/unsimulated/floor/lino, /area/tdome/tdomeadmin) "jSH" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 1 }, /obj/effect/floor_decal/corner/blue{ @@ -2302,7 +2302,7 @@ /turf/unsimulated/floor/white, /area/tdome) "kfk" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/abstract/landmark{ name = "tdomeobserve" }, @@ -2314,7 +2314,7 @@ /turf/unsimulated/floor/lino, /area/tdome/tdomeobserve) "kjk" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 1 }, /obj/effect/floor_decal/corner/blue/diagonal{ @@ -2403,7 +2403,7 @@ /turf/unsimulated/floor/lino, /area/tdome/tdomeadmin) "lQy" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/structure/disposalpipe/segment, /obj/abstract/landmark{ name = "tdomeobserve" @@ -2505,7 +2505,7 @@ /turf/unsimulated/floor/vault, /area/tdome/tdome2) "nPB" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 4 }, /turf/floor/tiled/monotile, diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index 35b21cdc415d..1ee33475b72d 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -436,7 +436,7 @@ /turf/floor/tiled, /area/ministation/cargo) "cg" = ( -/obj/structure/bed/chair/comfy, +/obj/structure/chair/comfy, /turf/floor/carpet/blue2, /area/ministation/hall/s1) "cj" = ( @@ -1655,7 +1655,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 6 }, -/obj/structure/bed/chair/office, +/obj/structure/chair/office, /turf/floor/tiled, /area/ministation/cargo) "gt" = ( @@ -2599,7 +2599,7 @@ dir = 1; pixel_y = -23 }, -/obj/structure/bed/chair/janicart{ +/obj/structure/janicart{ dir = 4 }, /turf/floor/tiled, @@ -2811,7 +2811,7 @@ /turf/floor/plating, /area/ministation/smcontrol) "lA" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 8 }, /turf/floor/laminate/walnut, @@ -3386,7 +3386,7 @@ /turf/floor/pool, /area/ministation/dorms) "od" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 1 }, /turf/floor/laminate/walnut, @@ -4579,7 +4579,7 @@ /turf/floor/tiled, /area/ministation/hall/s1) "uj" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/corner/beige{ @@ -4678,7 +4678,7 @@ /area/ministation/smcontrol) "uH" = ( /obj/machinery/light, -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 1 }, /turf/floor/laminate/walnut, @@ -4927,7 +4927,7 @@ "vK" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/effect/decal/cleanable/dirt/visible, -/obj/structure/bed/chair/wood{ +/obj/structure/chair/wood{ dir = 8 }, /obj/machinery/camera/autoname{ @@ -4964,7 +4964,7 @@ /area/ministation/hall/s1) "vY" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/steel_grid, @@ -5021,7 +5021,7 @@ /turf/floor/tiled/monotile, /area/ministation/atmospherics) "wk" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 8 }, /obj/machinery/alarm{ @@ -6115,7 +6115,7 @@ /area/ministation/mining) "Bq" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, -/obj/structure/bed/chair/wood{ +/obj/structure/chair/wood{ dir = 8 }, /turf/floor/tiled, @@ -10572,7 +10572,7 @@ /obj/abstract/landmark/start{ name = "Head Engineer" }, -/obj/structure/bed/chair/office{ +/obj/structure/chair/office{ dir = 6 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -12176,7 +12176,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/obj/structure/bed/chair/office, +/obj/structure/chair/office, /turf/floor/tiled, /area/ministation/smcontrol) "SO" = ( diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index d8e968288635..68b588d80e87 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -167,7 +167,7 @@ /turf/floor/plating, /area/ministation/maint/l2centraln) "aH" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/ministation/hall/w2) "aL" = ( @@ -540,7 +540,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "cR" = ( -/obj/structure/bed/chair/office/comfy/brown, +/obj/structure/chair/office/comfy/brown, /obj/abstract/landmark/start{ name = "Detective" }, @@ -1268,7 +1268,7 @@ /area/ministation/detective) "gL" = ( /obj/effect/floor_decal/corner/paleblue/diagonal, -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 4 }, /turf/floor/tiled/dark, @@ -1359,7 +1359,7 @@ /turf/floor/tiled, /area/ministation/security) "hh" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/abstract/landmark/start{ name = "Medical Doctor" }, @@ -1384,7 +1384,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "hm" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/atmospherics/pipe/simple/hidden{ dir = 6 }, @@ -1488,7 +1488,7 @@ /obj/abstract/landmark/start{ name = "Medical Doctor" }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /obj/effect/floor_decal/corner/paleblue{ @@ -1817,7 +1817,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "iG" = ( -/obj/structure/bed/chair/office/comfy/brown{ +/obj/structure/chair/office/comfy/brown{ dir = 1 }, /turf/floor/carpet/red, @@ -2423,7 +2423,7 @@ /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/status_display{ pixel_x = -32; dir = 8 @@ -2496,7 +2496,7 @@ /turf/floor/tiled, /area/ministation/hydro) "lR" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -3218,7 +3218,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "pQ" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 4 }, /obj/effect/floor_decal/corner/paleblue{ @@ -3382,10 +3382,10 @@ /turf/floor/tiled/white, /area/ministation/medical) "qz" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 4 }, -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 4 }, /obj/effect/floor_decal/corner/paleblue{ @@ -3408,7 +3408,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "qF" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 8 }, /obj/machinery/light{ @@ -4426,7 +4426,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/bed/chair/armchair/red{ +/obj/structure/chair/armchair/red{ dir = 1 }, /turf/floor/tiled, @@ -4636,7 +4636,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "uG" = ( -/obj/structure/bed/chair/office/comfy/brown{ +/obj/structure/chair/office/comfy/brown{ dir = 8 }, /obj/structure/disposalpipe/segment{ @@ -5384,7 +5384,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "xd" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /obj/machinery/alarm{ @@ -6034,7 +6034,7 @@ /turf/floor/tiled/dark, /area/ministation/cafe) "zi" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /turf/floor/carpet/red, /area/ministation/security) "zj" = ( @@ -6051,7 +6051,7 @@ /area/ministation/maint/l2centrals) "zn" = ( /obj/effect/floor_decal/corner/paleblue/diagonal, -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 1 }, /turf/floor/tiled/dark, @@ -6244,7 +6244,7 @@ /turf/floor/laminate, /area/ministation/detective) "zZ" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 1 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, @@ -6546,7 +6546,7 @@ /turf/floor/lino, /area/ministation/cafe) "Bs" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 4 }, @@ -7080,7 +7080,7 @@ /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/structure/bed/chair/comfy/beige, +/obj/structure/chair/comfy/beige, /turf/floor/carpet, /area/ministation/hall/w2) "Es" = ( @@ -7315,7 +7315,7 @@ /obj/machinery/firealarm{ pixel_y = 32 }, -/obj/structure/bed/chair/comfy/beige, +/obj/structure/chair/comfy/beige, /turf/floor/carpet, /area/ministation/hall/w2) "Ga" = ( @@ -8169,7 +8169,7 @@ /turf/floor/tiled, /area/ministation/security) "KW" = ( -/obj/structure/bed/chair/office/comfy/brown{ +/obj/structure/chair/office/comfy/brown{ dir = 1 }, /obj/structure/cable{ @@ -8266,7 +8266,7 @@ /turf/floor/tiled, /area/ministation/hall/w2) "LK" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /obj/structure/railing/mapped{ @@ -9148,7 +9148,7 @@ /turf/floor/tiled/white, /area/ministation/medical) "Qj" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 1 }, /turf/floor/tiled, @@ -9284,7 +9284,7 @@ /turf/floor/tiled, /area/ministation/security) "Rd" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 1 }, /obj/effect/floor_decal/corner/paleblue/diagonal, @@ -9596,7 +9596,7 @@ /turf/floor/plating, /area/ministation/maint/l2centraln) "Te" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, @@ -9775,7 +9775,7 @@ /area/ministation/cafe) "Ue" = ( /obj/effect/floor_decal/corner/paleblue/diagonal, -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 8 }, /turf/floor/tiled/dark, @@ -9895,7 +9895,7 @@ /turf/floor/plating, /area/ministation/maint/l2centraln) "UN" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/plating, @@ -9907,7 +9907,7 @@ /turf/space, /area/space) "UW" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/ministation/hall/e2) "UY" = ( @@ -9930,7 +9930,7 @@ /turf/wall/r_wall/hull, /area/ministation/arrival) "Va" = ( -/obj/structure/bed/chair/wheelchair, +/obj/structure/chair/wheelchair, /obj/machinery/camera/network/medbay{ req_access = list("ACCESS_CAMERAS") }, @@ -10478,7 +10478,7 @@ /turf/floor/plating, /area/ministation/security) "Yj" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/abstract/landmark/start{ name = "Security Officer" }, diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index b087edf407c3..3b9ba99954de 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -421,7 +421,7 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/structure/bed/chair/comfy/captain, +/obj/structure/chair/comfy/captain, /turf/floor/tiled, /area/ministation/bridge) "bA" = ( @@ -486,7 +486,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 4 }, /obj/machinery/camera/network/command{ @@ -1594,7 +1594,7 @@ /turf/floor/tiled/white, /area/ministation/science) "gN" = ( -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on, @@ -2053,7 +2053,7 @@ /obj/abstract/landmark/start{ name = "Scientist" }, -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/item/radio/intercom{ dir = 8; pixel_x = 22 @@ -2752,7 +2752,7 @@ /obj/effect/floor_decal/corner/red{ dir = 5 }, -/obj/structure/bed/chair/padded/blue{ +/obj/structure/chair/padded/blue{ dir = 1 }, /turf/floor/tiled, @@ -2771,7 +2771,7 @@ /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 1 }, /obj/structure/extinguisher_cabinet{ @@ -2927,7 +2927,7 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 1 }, /turf/floor/tiled, @@ -3322,7 +3322,7 @@ /obj/effect/floor_decal/corner/yellow{ dir = 5 }, -/obj/structure/bed/chair/padded/blue{ +/obj/structure/chair/padded/blue{ dir = 1 }, /turf/floor/tiled, @@ -4619,7 +4619,7 @@ /turf/floor/tiled/white, /area/ministation/science) "Bb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/structure/disposalpipe/segment, @@ -4756,7 +4756,7 @@ /turf/floor/lino, /area/ministation/telecomms) "BE" = ( -/obj/structure/bed/chair/padded/blue{ +/obj/structure/chair/padded/blue{ dir = 1 }, /turf/floor/lino, @@ -5304,7 +5304,7 @@ /turf/floor/carpet/green, /area/ministation/library) "DS" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/atmospherics/unary/vent_pump/on{ @@ -5370,7 +5370,7 @@ /turf/floor/carpet/magenta, /area/ministation/science) "Ex" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 4 }, /turf/floor/carpet/green, @@ -5795,7 +5795,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 4 }, -/obj/structure/bed/chair/wood/maple{ +/obj/structure/chair/wood/maple{ dir = 8 }, /obj/abstract/landmark/start{ @@ -6180,7 +6180,7 @@ /turf/floor/plating, /area/ministation/maint/l3central) "LT" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 4 }, /turf/floor/laminate/mahogany, @@ -6319,7 +6319,7 @@ /turf/floor/tiled/white, /area/ministation/science) "MJ" = ( -/obj/structure/bed/chair/armchair/black, +/obj/structure/chair/armchair/black, /turf/floor/carpet/green, /area/ministation/library) "MP" = ( @@ -6560,7 +6560,7 @@ /turf/floor/tiled, /area/ministation/bridge) "Od" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /turf/floor/laminate/yew, @@ -6573,7 +6573,7 @@ /turf/wall/titanium, /area/ministation/shuttle/outgoing) "Om" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 8 }, /turf/floor/carpet/green, @@ -6630,7 +6630,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 6 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/floor/tiled/white, @@ -6810,7 +6810,7 @@ /turf/floor/laminate/mahogany, /area/ministation/library) "PE" = ( -/obj/structure/bed/chair/armchair/black{ +/obj/structure/chair/armchair/black{ dir = 8 }, /turf/floor/laminate/mahogany, @@ -6883,7 +6883,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply{ dir = 10 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -6904,7 +6904,7 @@ /turf/floor/tiled/white, /area/ministation/science) "Qh" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /obj/machinery/light{ @@ -7480,7 +7480,7 @@ dir = 5 }, /obj/effect/overmap/visitable/ship/ministation, -/obj/structure/bed/chair/padded/blue, +/obj/structure/chair/padded/blue, /turf/floor/tiled, /area/ministation/bridge) "TF" = ( @@ -7783,7 +7783,7 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ dir = 10 }, -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 8 }, /obj/machinery/camera/autoname{ @@ -8077,7 +8077,7 @@ /turf/floor/tiled, /area/ministation/hall/n3) "Xe" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /obj/machinery/light, @@ -8483,7 +8483,7 @@ /turf/floor/plating, /area/ministation/maint/l3ne) "Zt" = ( -/obj/structure/bed/chair/wood/walnut{ +/obj/structure/chair/wood/walnut{ dir = 4 }, /obj/machinery/firealarm{ @@ -8550,7 +8550,7 @@ /turf/floor/tiled, /area/ministation/hall/s3) "ZS" = ( -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ diff --git a/maps/ministation/space.dmm b/maps/ministation/space.dmm index ec8b28cf0179..54f8c3513fd8 100644 --- a/maps/ministation/space.dmm +++ b/maps/ministation/space.dmm @@ -56,7 +56,7 @@ /turf/floor/shuttle/blue, /area/shuttle/escape_shuttle) "ao" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ icon_state = "shuttle_chair"; dir = 1 }, @@ -67,7 +67,7 @@ /turf/floor/shuttle/blue, /area/shuttle/escape_shuttle) "aq" = ( -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ icon_state = "shuttle_chair"; dir = 1 }, @@ -120,7 +120,7 @@ icon_state = "stripe"; dir = 1 }, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, @@ -135,7 +135,7 @@ icon_state = "stripe"; dir = 1 }, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, @@ -146,7 +146,7 @@ icon_state = "stripe"; dir = 5 }, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, @@ -176,7 +176,7 @@ /turf/floor/shuttle/blue, /area/shuttle/escape_shuttle) "aC" = ( -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, @@ -187,7 +187,7 @@ icon_state = "stripe"; dir = 4 }, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, @@ -207,7 +207,7 @@ /area/shuttle/escape_shuttle) "aG" = ( /obj/effect/floor_decal/industrial/traffic, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, @@ -219,7 +219,7 @@ /area/shuttle/escape_shuttle) "aH" = ( /obj/effect/floor_decal/industrial/traffic, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, @@ -230,7 +230,7 @@ icon_state = "stripe"; dir = 6 }, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ icon_state = "shuttle_chair"; dir = 1 }, diff --git a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm index ac68a3de9626..45318e7f6b90 100644 --- a/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm +++ b/maps/random_ruins/exoplanet_ruins/crashed_pod/crashed_pod.dmm @@ -688,7 +688,7 @@ pixel_x = -24; locked = 0 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/effect/decal/cleanable/dirt/visible, @@ -955,7 +955,7 @@ /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bC" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/effect/decal/cleanable/dirt/visible, @@ -992,13 +992,13 @@ /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "bH" = ( -/obj/structure/bed/chair/shuttle/black, +/obj/structure/chair/shuttle/black, /obj/abstract/submap_landmark/spawnpoint/crashed_pod_survivor, /obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) "bI" = ( -/obj/structure/bed/chair/shuttle/black, +/obj/structure/chair/shuttle/black, /obj/structure/window/reinforced{ dir = 4 }, @@ -1143,7 +1143,7 @@ /turf/floor/tiled/white, /area/map_template/crashed_pod) "bW" = ( -/obj/structure/bed/chair/shuttle/black, +/obj/structure/chair/shuttle/black, /obj/structure/window/reinforced{ dir = 8 }, @@ -1200,7 +1200,7 @@ /turf/floor/tiled/techfloor, /area/map_template/crashed_pod) "ca" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/decal/cleanable/dirt/visible, /turf/floor/tiled/dark, /area/map_template/crashed_pod) diff --git a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm index 1552d243610f..b52a0a83c822 100644 --- a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm +++ b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm @@ -109,7 +109,7 @@ /turf/floor/tiled/steel_ridged, /area/template_noop) "ax" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/structure/emergency_dispenser/east, /turf/floor/tiled/white, /area/template_noop) @@ -231,7 +231,7 @@ /area/template_noop) "aU" = ( /obj/random/junk, -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /turf/floor/carpet/blue2, /area/template_noop) "aV" = ( diff --git a/maps/random_ruins/exoplanet_ruins/hut/hut.dmm b/maps/random_ruins/exoplanet_ruins/hut/hut.dmm index 21fc564bfdd4..a3ba0e14396d 100644 --- a/maps/random_ruins/exoplanet_ruins/hut/hut.dmm +++ b/maps/random_ruins/exoplanet_ruins/hut/hut.dmm @@ -36,7 +36,7 @@ /turf/floor/tiled/dark, /area/template_noop) "k" = ( -/obj/structure/bed/chair/wheelchair, +/obj/structure/chair/wheelchair, /turf/floor/tiled/dark, /area/template_noop) "l" = ( diff --git a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm index 7677b177ff42..ea2408b5f99e 100644 --- a/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm +++ b/maps/random_ruins/exoplanet_ruins/hydrobase/hydrobase.dmm @@ -1389,7 +1389,7 @@ /obj/structure/sign/warning/smoking{ pixel_y = 32 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /turf/floor/tiled, @@ -1524,7 +1524,7 @@ /turf/floor/fixed/alium, /area/map_template/hydrobase/station/processing) "ei" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 1 }, /turf/floor/tiled, diff --git a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm index c3b5df5467f1..a98e2f8fec67 100644 --- a/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm +++ b/maps/random_ruins/exoplanet_ruins/lodge/lodge.dmm @@ -86,7 +86,7 @@ /turf/floor/wood, /area/template_noop) "p" = ( -/obj/structure/bed/chair/wood{ +/obj/structure/chair/wood{ dir = 8 }, /obj/effect/floor_decal/spline/fancy/wood/corner, @@ -162,7 +162,7 @@ /turf/floor/tiled/monotile, /area/template_noop) "D" = ( -/obj/structure/bed/chair/wood{ +/obj/structure/chair/wood{ dir = 8 }, /obj/effect/floor_decal/spline/fancy/wood{ diff --git a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm index 13485f43f126..430aedf95a2c 100644 --- a/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm +++ b/maps/random_ruins/exoplanet_ruins/marooned/marooned.dmm @@ -51,7 +51,7 @@ /area/map_template/marooned) "am" = ( /obj/abstract/landmark/corpse/marooned_officer, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/effect/decal/cleanable/blood, @@ -183,7 +183,7 @@ /obj/structure/handrail{ dir = 4 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/item/trash/liquidfood, @@ -207,7 +207,7 @@ /obj/structure/handrail{ dir = 4 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/industrial/outline, diff --git a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm index cd6082a3b661..7008a642da99 100644 --- a/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm +++ b/maps/random_ruins/exoplanet_ruins/playablecolony/colony.dmm @@ -317,7 +317,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/command) "aW" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/effect/floor_decal/techfloor{ @@ -849,7 +849,7 @@ /turf/floor/reinforced/oxygen, /area/map_template/colony/atmospherics) "bX" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/floor_decal/corner/red{ @@ -2468,7 +2468,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "fn" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/effect/floor_decal/spline/fancy/wood{ @@ -2477,7 +2477,7 @@ /turf/floor/laminate/walnut, /area/map_template/colony/messhall) "fo" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/structure/sign/double/maltesefalcon/right{ @@ -2548,7 +2548,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/atmospherics) "fu" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /obj/structure/sign/double/maltesefalcon/left{ @@ -2725,7 +2725,7 @@ /area/map_template/colony/messhall) "fK" = ( /obj/machinery/atmospherics/unary/vent_scrubber/on, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /obj/machinery/light{ @@ -3790,7 +3790,7 @@ dir = 9 }, /obj/effect/floor_decal/corner/red, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled/techfloor, @@ -4158,7 +4158,7 @@ /obj/machinery/recharger/wallcharger{ pixel_y = 36 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled/techfloor, @@ -4865,7 +4865,7 @@ /obj/effect/floor_decal/techfloor{ dir = 6 }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /obj/effect/floor_decal/corner/red{ @@ -5636,7 +5636,7 @@ /turf/floor/lino, /area/map_template/colony) "kQ" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /turf/floor/lino, @@ -6338,7 +6338,7 @@ /turf/floor/tiled/techfloor, /area/map_template/colony/airlock) "mi" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /turf/floor/tiled/techfloor/grid, @@ -6709,7 +6709,7 @@ /turf/floor/concrete, /area/map_template/colony/mineralprocessing) "mR" = ( -/obj/structure/bed/chair/comfy/beige{ +/obj/structure/chair/comfy/beige{ dir = 4 }, /obj/effect/floor_decal/techfloor, @@ -6950,7 +6950,7 @@ /turf/floor/tiled/dark/monotile, /area/map_template/colony/jail) "np" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/effect/floor_decal/corner/red{ dir = 6 }, @@ -7075,7 +7075,7 @@ /turf/floor/tiled/dark/monotile, /area/map_template/colony/jail) "nD" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/effect/floor_decal/corner/red{ diff --git a/maps/random_ruins/exoplanet_ruins/radshrine/radshrine.dmm b/maps/random_ruins/exoplanet_ruins/radshrine/radshrine.dmm index b4b342d006d0..8d586cbed4b2 100644 --- a/maps/random_ruins/exoplanet_ruins/radshrine/radshrine.dmm +++ b/maps/random_ruins/exoplanet_ruins/radshrine/radshrine.dmm @@ -10,7 +10,7 @@ /turf/wall/uranium, /area/template_noop) "e" = ( -/obj/structure/bed/chair/wood, +/obj/structure/chair/wood, /obj/effect/decal/cleanable/cobweb, /turf/floor/carpet/red, /area/template_noop) @@ -30,7 +30,7 @@ /turf/floor/reinforced, /area/template_noop) "I" = ( -/obj/structure/bed/chair/wood, +/obj/structure/chair/wood, /turf/floor/carpet/red, /area/template_noop) diff --git a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm index c3c28c3bdc98..5e646433908f 100644 --- a/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm +++ b/maps/random_ruins/exoplanet_ruins/spider_nest/spider_nest.dmm @@ -53,7 +53,7 @@ /turf/floor/lino, /area/template_noop) "l" = ( -/obj/structure/bed/chair/office/comfy/blue, +/obj/structure/chair/office/comfy/blue, /obj/item/pen, /obj/effect/spider/stickyweb, /obj/effect/decal/cleanable/blood/drip, @@ -174,7 +174,7 @@ /turf/floor/reinforced, /area/template_noop) "F" = ( -/obj/structure/bed/chair/office/comfy/purple, +/obj/structure/chair/office/comfy/purple, /obj/effect/decal/cleanable/blood/drip, /obj/effect/decal/cleanable/filth, /turf/floor/lino, diff --git a/maps/shaded_hills/shaded_hills-dungeon.dmm b/maps/shaded_hills/shaded_hills-dungeon.dmm index 52330b32d366..61a7c7421733 100644 --- a/maps/shaded_hills/shaded_hills-dungeon.dmm +++ b/maps/shaded_hills/shaded_hills-dungeon.dmm @@ -34,7 +34,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "dA" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /obj/item/remains/human, @@ -66,7 +66,7 @@ /turf/floor/rock/basalt, /area/shaded_hills/caves/dungeon/poi) "fW" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/item/stack/medical/bandage/crafted/five, @@ -86,7 +86,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "hz" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /turf/floor/path/running_bond/basalt, @@ -115,7 +115,7 @@ /turf/floor/mud, /area/shaded_hills/caves/dungeon) "jU" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/item/food/grown/dried_tobacco/bad, @@ -147,7 +147,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "kN" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /obj/item/stack/material/bolt/mapped/cloth/five, @@ -176,13 +176,13 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "nD" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "nE" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/item/bladed/folding, @@ -243,7 +243,7 @@ /turf/floor/path/basalt, /area/shaded_hills/caves/dungeon/inn) "oW" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /turf/floor/path/herringbone/basalt, @@ -336,13 +336,13 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "wa" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "wg" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /obj/random/hostile/dungeon, @@ -397,7 +397,7 @@ /turf/floor/path/basalt, /area/shaded_hills/caves/dungeon/poi) "Bk" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /obj/item/food/grown/dried_tobacco/bad, @@ -443,7 +443,7 @@ /turf/floor/path/basalt, /area/shaded_hills/caves/dungeon/poi) "Eq" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/item/stack/material/bolt/mapped/cloth/five, @@ -554,7 +554,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "ME" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /obj/item/stack/medical/bandage/crafted/five, @@ -609,7 +609,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/caves/dungeon/poi) "Rt" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/random/hostile/dungeon, @@ -624,7 +624,7 @@ /turf/floor/path/running_bond/basalt, /area/shaded_hills/caves/dungeon/poi) "SN" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/item/remains/human, diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index 3adbafa7443c..4fa441d975f4 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -8,7 +8,7 @@ /turf/floor/grass, /area/shaded_hills/outside) "cy" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/abstract/landmark/start/shaded_hills/miner, @@ -92,7 +92,7 @@ /turf/floor/mud, /area/shaded_hills/caves) "mG" = ( -/obj/structure/bed/chair/bench/ebony, +/obj/structure/chair/bench/ebony, /obj/item/bladed/folding, /obj/abstract/landmark/start/shaded_hills/miner, /turf/floor/barren, @@ -364,7 +364,7 @@ /turf/wall/natural/basalt/shaded_hills, /area/shaded_hills/caves/river) "YB" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 8 }, /obj/abstract/landmark/start/shaded_hills/miner, diff --git a/maps/shaded_hills/shaded_hills-inn.dmm b/maps/shaded_hills/shaded_hills-inn.dmm index 0213b0de86c0..df16c776c0b2 100644 --- a/maps/shaded_hills/shaded_hills-inn.dmm +++ b/maps/shaded_hills/shaded_hills-inn.dmm @@ -27,7 +27,7 @@ /turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "bv" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 4 }, /turf/floor/wood/walnut, @@ -249,13 +249,13 @@ dir = 4; start_lit = 1 }, -/obj/structure/bed/chair/rustic_fancy/ebony{ +/obj/structure/chair/rustic_fancy/ebony{ dir = 1 }, /turf/floor/carpet, /area/shaded_hills/inn) "hc" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 1 }, /turf/floor/wood/rough/walnut, @@ -305,7 +305,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) "ij" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 4 }, /turf/floor/wood/walnut, @@ -350,7 +350,7 @@ /turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "jk" = ( -/obj/structure/bed/chair/bench/pew/mahogany{ +/obj/structure/chair/bench/pew/mahogany{ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/cleric, @@ -406,7 +406,7 @@ /turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "kI" = ( -/obj/structure/bed/chair/bench/pew/ebony{ +/obj/structure/chair/bench/pew/ebony{ dir = 4 }, /turf/floor/wood/walnut, @@ -433,7 +433,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn) "lL" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, @@ -459,7 +459,7 @@ /turf/floor/wood/rough/walnut, /area/shaded_hills/farmhouse) "mD" = ( -/obj/structure/bed/chair/rustic, +/obj/structure/chair/rustic, /turf/floor/wood/rough/walnut, /area/shaded_hills/stable) "mG" = ( @@ -488,7 +488,7 @@ /turf/wall/log/walnut, /area/shaded_hills/stable) "nx" = ( -/obj/structure/bed/chair/bench/pew/ebony{ +/obj/structure/chair/bench/pew/ebony{ dir = 8 }, /obj/structure/railing/mapped/wooden/ebony{ @@ -532,7 +532,7 @@ /turf/floor/grass, /area/shaded_hills/outside/downlands) "pd" = ( -/obj/structure/bed/chair/bench/pew/mahogany{ +/obj/structure/chair/bench/pew/mahogany{ dir = 1 }, /turf/floor/wood/mahogany, @@ -705,13 +705,13 @@ /turf/floor/grass, /area/shaded_hills/outside/downlands) "tZ" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 4 }, /turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "uk" = ( -/obj/structure/bed/chair/bench/pew/ebony{ +/obj/structure/chair/bench/pew/ebony{ dir = 8 }, /obj/effect/floor_decal/spline/fancy/wood/walnut{ @@ -795,7 +795,7 @@ /obj/structure/wall_sconce/lantern{ dir = 4 }, -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 1 }, /turf/floor/wood/rough/walnut, @@ -869,7 +869,7 @@ /turf/wall/brick/basalt, /area/shaded_hills/general_store) "yJ" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 1 }, /obj/abstract/landmark/start/shaded_hills/farmer, @@ -995,7 +995,7 @@ /turf/floor/grass, /area/shaded_hills/outside/shrine) "BG" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 1 }, /turf/floor/wood/walnut, @@ -1065,7 +1065,7 @@ /turf/floor/wood/walnut, /area/shaded_hills/general_store) "Er" = ( -/obj/structure/bed/chair/bench/pew/ebony{ +/obj/structure/chair/bench/pew/ebony{ dir = 4 }, /obj/structure/railing/mapped/wooden/ebony{ @@ -1311,7 +1311,7 @@ /turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "Jw" = ( -/obj/structure/bed/chair/rustic, +/obj/structure/chair/rustic, /turf/floor/wood/rough/walnut, /area/shaded_hills/inn/porch) "Jz" = ( @@ -1334,7 +1334,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/shrine) "JS" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 1 }, /turf/floor/wood/rough/walnut, @@ -1355,7 +1355,7 @@ /turf/wall/log/walnut/shutter/open, /area/shaded_hills/shrine) "KD" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 1 }, /turf/floor/wood/walnut, @@ -1493,7 +1493,7 @@ /obj/structure/wall_sconce/lantern{ dir = 8 }, -/obj/structure/bed/chair/bench/pew/ebony{ +/obj/structure/chair/bench/pew/ebony{ dir = 4 }, /turf/floor/wood/walnut, @@ -1540,7 +1540,7 @@ /turf/wall/log/walnut, /area/shaded_hills/shrine) "QL" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 1 }, /obj/structure/wall_sconce/lantern{ @@ -1621,7 +1621,7 @@ /turf/floor/mud, /area/shaded_hills/outside/shrine) "Sw" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 8 }, /turf/floor/wood/rough/walnut, @@ -1669,7 +1669,7 @@ /turf/floor/path/herringbone/basalt, /area/shaded_hills/inn/kitchen) "Td" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 8 }, /turf/floor/wood/walnut, @@ -1723,7 +1723,7 @@ /turf/floor/wood/rough/walnut, /area/shaded_hills/shrine) "US" = ( -/obj/structure/bed/chair/rustic{ +/obj/structure/chair/rustic{ dir = 4 }, /turf/floor/wood/walnut, diff --git a/maps/shaded_hills/shaded_hills-swamp.dmm b/maps/shaded_hills/shaded_hills-swamp.dmm index bbd09a8b2284..f3d064b8b2ba 100644 --- a/maps/shaded_hills/shaded_hills-swamp.dmm +++ b/maps/shaded_hills/shaded_hills-swamp.dmm @@ -9,7 +9,7 @@ /turf/floor/mud/water, /area/shaded_hills/outside/river/swamp) "cS" = ( -/obj/structure/bed/chair/wood/ebony{ +/obj/structure/chair/wood/ebony{ dir = 8 }, /turf/floor/wood/rough/walnut, diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 1e1c08af1588..ff571e169d9f 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -1334,7 +1334,7 @@ /turf/floor/tiled, /area/ship/trade/disused) "rt" = ( -/obj/structure/bed/chair/padded/beige, +/obj/structure/chair/padded/beige, /turf/floor/carpet/red, /area/ship/trade/disused) "rv" = ( @@ -1767,7 +1767,7 @@ /turf/floor/carpet/green, /area/ship/trade/disused) "IG" = ( -/obj/structure/bed/chair/comfy/green{ +/obj/structure/chair/comfy/green{ dir = 1 }, /obj/machinery/power/apc{ @@ -2107,7 +2107,7 @@ /turf/floor/tiled/techfloor/grid, /area/ship/trade/livestock) "Ua" = ( -/obj/structure/bed/chair/wood/walnut, +/obj/structure/chair/wood/walnut, /turf/floor/carpet/red, /area/ship/trade/disused) "Ug" = ( diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index d00b923a361d..dae19f721128 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -3,7 +3,7 @@ /turf/space, /area/space) "ab" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/effect/floor_decal/corner/beige{ @@ -467,7 +467,7 @@ /turf/floor/carpet/blue, /area/ship/trade/command/captain) "aW" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /turf/floor/carpet/blue, /area/ship/trade/command/captain) "aX" = ( @@ -575,7 +575,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 6 }, -/obj/structure/bed/chair/shuttle/black{ +/obj/structure/chair/shuttle/black{ dir = 8 }, /obj/machinery/firealarm{ @@ -593,7 +593,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 6 }, -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 8 }, /turf/floor/tiled/steel_ridged, @@ -1121,7 +1121,7 @@ /turf/floor/tiled/steel_ridged, /area/ship/trade/dock) "cw" = ( -/obj/structure/bed/chair/comfy/teal{ +/obj/structure/chair/comfy/teal{ dir = 1 }, /obj/abstract/landmark/start{ @@ -1265,7 +1265,7 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{ dir = 8 }, -/obj/structure/bed/chair/wood, +/obj/structure/chair/wood, /turf/floor/tiled, /area/ship/trade/crew/saloon) "da" = ( @@ -2414,7 +2414,7 @@ /turf/floor/tiled/freezer, /area/ship/trade/crew/wash) "fV" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/abstract/landmark/start{ name = "Head Doctor" }, @@ -3216,7 +3216,7 @@ /turf/floor/tiled/techfloor, /area/ship/trade/maintenance/engineering) "hW" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /obj/abstract/landmark/start{ name = "Head Engineer" }, @@ -3690,7 +3690,7 @@ /obj/effect/floor_decal/corner/white{ dir = 6 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, @@ -3779,7 +3779,7 @@ /turf/floor/reinforced/airmix, /area/ship/trade/maintenance/atmos) "jb" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/machinery/media/jukebox/old, @@ -4670,7 +4670,7 @@ /obj/effect/floor_decal/corner/white{ dir = 6 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, @@ -5047,7 +5047,7 @@ /turf/wall/r_wall/hull, /area/ship/trade/maintenance/atmos) "rH" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled/dark, @@ -5074,7 +5074,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/structure/bed/chair/shuttle/white{ +/obj/structure/chair/shuttle/white{ dir = 4 }, /turf/floor/tiled/steel_ridged, @@ -6641,7 +6641,7 @@ /turf/floor/tiled/monotile, /area/ship/trade/command/hallway) "Jk" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /obj/abstract/landmark/start{ name = "First Mate" }, @@ -7090,7 +7090,7 @@ /obj/effect/floor_decal/corner/beige{ dir = 9 }, -/obj/structure/bed/chair/shuttle/blue{ +/obj/structure/chair/shuttle/blue{ dir = 4 }, /obj/item/radio/intercom{ @@ -7234,7 +7234,7 @@ dir = 4; id_tag = "tradeship_rescue_shuttle_pump" }, -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /obj/effect/floor_decal/corner/white{ @@ -7995,7 +7995,7 @@ /obj/effect/floor_decal/corner/white{ dir = 6 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index bc596cfeecd4..e23bb22f61a3 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -47,7 +47,7 @@ /turf/floor/plating, /area/ship/trade/maintenance/solars) "ai" = ( -/obj/structure/bed/chair/wood, +/obj/structure/chair/wood, /turf/floor/reinforced/airless, /area/space) "aj" = ( diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm index d6d797ba1b0f..7b0313e2d201 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-1.dmm @@ -560,7 +560,7 @@ /turf/floor/tiled/white, /area/lar_maria/vir_main) "bL" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 8 }, /turf/floor/tiled/white, @@ -571,7 +571,7 @@ /turf/floor/tiled/white, /area/lar_maria/vir_main) "bN" = ( -/obj/structure/bed/chair/office/dark{ +/obj/structure/chair/office/dark{ dir = 1 }, /turf/floor/tiled/white, @@ -585,7 +585,7 @@ /turf/floor/tiled, /area/lar_maria/cells) "bR" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled, @@ -597,7 +597,7 @@ /area/lar_maria/cells) "bT" = ( /obj/machinery/light, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, @@ -969,7 +969,7 @@ /obj/machinery/light{ dir = 1 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, @@ -1527,13 +1527,13 @@ /turf/floor/tiled, /area/lar_maria/sec_wing) "ev" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, /area/lar_maria/sec_wing) "ew" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/abstract/landmark/corpse/lar_maria/zhp_guard, @@ -1652,7 +1652,7 @@ /turf/floor/tiled, /area/lar_maria/sec_wing) "eK" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, @@ -1762,7 +1762,7 @@ /turf/floor/tiled/white, /area/lar_maria/vir_aux) "eZ" = ( -/obj/structure/bed/chair/office/dark, +/obj/structure/chair/office/dark, /turf/floor/tiled/white, /area/lar_maria/vir_aux) "fa" = ( @@ -1782,7 +1782,7 @@ /area/lar_maria/cells) "fd" = ( /obj/machinery/light, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /mob/living/simple_animal/hostile/lar_maria/test_subject, @@ -2376,7 +2376,7 @@ /turf/floor/plating, /area/lar_maria/sec_wing) "gj" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/abstract/landmark/corpse/lar_maria/test_subject, @@ -2680,7 +2680,7 @@ /turf/floor/plating, /area/lar_maria/cells) "hb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/alarm{ @@ -2789,7 +2789,7 @@ /turf/floor/plating, /area/lar_maria/cells) "ht" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/lar_maria/vir_access) "hu" = ( @@ -2861,7 +2861,7 @@ /turf/floor/tiled, /area/lar_maria/vir_access) "hF" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{ @@ -3050,7 +3050,7 @@ /turf/floor/tiled, /area/lar_maria/vir_access) "hZ" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -3373,7 +3373,7 @@ /turf/floor/tiled, /area/lar_maria/vir_access) "iK" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/item/gun/energy/taser, @@ -3384,7 +3384,7 @@ /turf/floor/tiled, /area/lar_maria/sec_wing) "iM" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /mob/living/simple_animal/hostile/lar_maria/guard, diff --git a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm index 68f05027666b..7707209d40df 100644 --- a/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm +++ b/mods/content/corporate/away_sites/lar_maria/lar_maria-2.dmm @@ -899,7 +899,7 @@ /obj/structure/window/basic{ dir = 1 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/floor/tiled, @@ -920,7 +920,7 @@ /obj/structure/window/basic{ dir = 4 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/floor/tiled, @@ -1006,7 +1006,7 @@ /turf/floor/plating, /area/lar_maria/atmos) "cY" = ( -/obj/structure/bed/chair/comfy/purple{ +/obj/structure/chair/comfy/purple{ dir = 1 }, /turf/floor/laminate, @@ -1021,7 +1021,7 @@ /turf/floor/laminate, /area/lar_maria/dorms) "db" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 1 }, /turf/floor/laminate, @@ -1031,7 +1031,7 @@ /turf/floor/laminate, /area/lar_maria/dorms) "de" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 1 }, /turf/floor/laminate, @@ -1062,7 +1062,7 @@ /turf/floor/tiled, /area/lar_maria/library) "dj" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /turf/floor/tiled, @@ -1338,7 +1338,7 @@ /obj/structure/window/basic{ dir = 4 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /turf/floor/tiled, @@ -1358,7 +1358,7 @@ /obj/structure/window/basic{ dir = 4 }, -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 8 }, /obj/machinery/light, @@ -1386,7 +1386,7 @@ /turf/floor/tiled, /area/lar_maria/library) "ei" = ( -/obj/structure/bed/chair/comfy/beige, +/obj/structure/chair/comfy/beige, /turf/floor/laminate, /area/lar_maria/dorms) "ej" = ( @@ -1394,7 +1394,7 @@ /turf/floor/laminate, /area/lar_maria/dorms) "ek" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /turf/floor/laminate, /area/lar_maria/dorms) "el" = ( @@ -1414,7 +1414,7 @@ /turf/floor/laminate, /area/lar_maria/dorms) "eo" = ( -/obj/structure/bed/chair/comfy/green, +/obj/structure/chair/comfy/green, /turf/floor/laminate, /area/lar_maria/dorms) "ep" = ( @@ -1488,7 +1488,7 @@ /turf/floor/tiled, /area/lar_maria/office) "eD" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/abstract/landmark/corpse/lar_maria/virologist_female, /obj/effect/decal/cleanable/blood, /turf/floor/tiled, @@ -1696,7 +1696,7 @@ /turf/floor/tiled, /area/lar_maria/office) "fo" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /turf/floor/tiled, /area/lar_maria/office) "fp" = ( @@ -1783,7 +1783,7 @@ /obj/machinery/light{ dir = 8 }, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled, @@ -1794,7 +1794,7 @@ /turf/floor/tiled, /area/lar_maria/office) "fB" = ( -/obj/structure/bed/chair/office/light, +/obj/structure/chair/office/light, /obj/effect/decal/cleanable/blood, /turf/floor/tiled, /area/lar_maria/office) @@ -2001,7 +2001,7 @@ /turf/floor/tiled, /area/lar_maria/office) "gl" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 1 }, /turf/floor/tiled, @@ -2188,7 +2188,7 @@ /turf/floor/tiled, /area/lar_maria/mess_hall) "gQ" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled, @@ -2200,7 +2200,7 @@ /turf/floor/tiled, /area/lar_maria/mess_hall) "gS" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, @@ -2255,7 +2255,7 @@ /turf/floor/plating, /area/lar_maria/hallway) "hd" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /obj/machinery/light/small{ @@ -2303,7 +2303,7 @@ /turf/floor/tiled, /area/lar_maria/mess_hall) "hj" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, @@ -2765,7 +2765,7 @@ /turf/floor/tiled, /area/lar_maria/mess_hall) "iz" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/abstract/landmark/corpse/lar_maria/virologist, @@ -3052,7 +3052,7 @@ /turf/floor/plating, /area/space) "kb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light/small{ @@ -3061,7 +3061,7 @@ /turf/floor/plating, /area/lar_maria/solar_control) "lb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/light/small{ diff --git a/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm index 1edbe07fd68b..b89a49fad8d1 100644 --- a/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm +++ b/mods/content/corporate/random_ruins/exoplanet_ruins/oldpod/oldpod.dmm @@ -87,7 +87,7 @@ /turf/floor/tiled/monotile, /area/map_template/oldpod) "ao" = ( -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /obj/structure/window/reinforced{ @@ -97,7 +97,7 @@ /turf/floor/tiled/monotile, /area/map_template/oldpod) "ap" = ( -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ dir = 4 }, /obj/structure/window/reinforced{ diff --git a/mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm b/mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm index c79f214b00dc..c362ae5342f8 100644 --- a/mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm +++ b/mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm @@ -3,7 +3,7 @@ /turf/template_noop, /area/template_noop) "d" = ( -/obj/structure/bed/chair/wood/ebony{ +/obj/structure/chair/wood/ebony{ dir = 1 }, /turf/floor/wood/walnut, @@ -33,7 +33,7 @@ /turf/floor/wood/walnut, /area/template_noop) "r" = ( -/obj/structure/bed/chair/bench/ebony{ +/obj/structure/chair/bench/ebony{ dir = 4 }, /turf/floor/wood/walnut, @@ -50,7 +50,7 @@ /turf/wall/log/walnut/shutter, /area/template_noop) "w" = ( -/obj/structure/bed/chair/wood/ebony, +/obj/structure/chair/wood/ebony, /turf/floor/wood/walnut, /area/template_noop) "x" = ( @@ -96,7 +96,7 @@ /turf/floor/path/basalt, /area/template_noop) "P" = ( -/obj/structure/bed/chair/bench/ebony, +/obj/structure/chair/bench/ebony, /turf/floor/wood/walnut, /area/template_noop) "Q" = ( diff --git a/mods/content/generic_shuttles/tanker/tanker.dmm b/mods/content/generic_shuttles/tanker/tanker.dmm index ff28ca555215..c189bc9b389f 100644 --- a/mods/content/generic_shuttles/tanker/tanker.dmm +++ b/mods/content/generic_shuttles/tanker/tanker.dmm @@ -257,7 +257,7 @@ /turf/floor/tiled/steel_grid, /area/tanker) "yG" = ( -/obj/structure/bed/chair/office, +/obj/structure/chair/office, /turf/floor/tiled/steel_grid, /area/tanker) "An" = ( @@ -315,7 +315,7 @@ /obj/machinery/atmospherics/unary/vent_scrubber/on{ dir = 4 }, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/floor/tiled/steel_grid, @@ -475,7 +475,7 @@ /obj/machinery/atmospherics/unary/vent_pump/on{ dir = 4 }, -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/floor/tiled/steel_grid, diff --git a/mods/content/government/away_sites/icarus/icarus-1.dmm b/mods/content/government/away_sites/icarus/icarus-1.dmm index fc98131743c2..00df803d74e4 100644 --- a/mods/content/government/away_sites/icarus/icarus-1.dmm +++ b/mods/content/government/away_sites/icarus/icarus-1.dmm @@ -37,15 +37,15 @@ /turf/floor/grass/wild, /area/icarus/open) "am" = ( -/obj/structure/bed/chair/comfy/black, +/obj/structure/chair/comfy/black, /turf/floor/laminate, /area/icarus/vessel) "an" = ( -/obj/structure/bed/chair/comfy/captain, +/obj/structure/chair/comfy/captain, /turf/floor/laminate, /area/icarus/vessel) "ao" = ( -/obj/structure/bed/chair/comfy/black, +/obj/structure/chair/comfy/black, /obj/item/secure_storage/briefcase, /turf/floor/laminate, /area/icarus/vessel) @@ -99,7 +99,7 @@ /turf/floor/laminate, /area/icarus/vessel) "aB" = ( -/obj/structure/bed/chair/comfy/black{ +/obj/structure/chair/comfy/black{ dir = 1 }, /turf/floor/laminate, @@ -467,7 +467,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bP" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled, @@ -928,13 +928,13 @@ /turf/floor/tiled, /area/icarus/vessel) "dk" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, /area/icarus/vessel) "dl" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/decal/cleanable/dirt/visible, @@ -980,7 +980,7 @@ /turf/floor/tiled, /area/icarus/open) "dt" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/decal/cleanable/dirt/visible, @@ -1095,7 +1095,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dN" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/decal/cleanable/dirt/visible, @@ -1185,7 +1185,7 @@ /turf/floor/tiled, /area/icarus/vessel) "eb" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/hidden/supply{ @@ -1201,7 +1201,7 @@ /turf/floor/tiled, /area/icarus/vessel) "ed" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/effect/decal/cleanable/dirt/visible, @@ -1424,7 +1424,7 @@ "eO" = ( /obj/effect/decal/cleanable/dirt/visible, /obj/effect/decal/cleanable/dirt/visible, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/unsimulated/floor/sand, diff --git a/mods/content/government/away_sites/icarus/icarus-2.dmm b/mods/content/government/away_sites/icarus/icarus-2.dmm index 57e1757f4eb2..9d2175f2af71 100644 --- a/mods/content/government/away_sites/icarus/icarus-2.dmm +++ b/mods/content/government/away_sites/icarus/icarus-2.dmm @@ -38,7 +38,7 @@ /turf/floor/tiled, /area/icarus/vessel) "al" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/tiled, @@ -115,7 +115,7 @@ /turf/floor/tiled, /area/icarus/open) "aA" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/abstract/landmark/corpse/bridgeofficer, @@ -127,7 +127,7 @@ /turf/floor/tiled, /area/icarus/vessel) "aD" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/tiled, @@ -180,7 +180,7 @@ /turf/floor/tiled, /area/icarus/vessel) "aO" = ( -/obj/structure/bed/chair/comfy/captain{ +/obj/structure/chair/comfy/captain{ dir = 8 }, /turf/floor/tiled, @@ -199,7 +199,7 @@ /turf/floor/tiled/dark, /area/icarus/vessel) "aR" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/tiled, @@ -478,7 +478,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bH" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /turf/floor/tiled, @@ -493,7 +493,7 @@ /turf/floor/tiled, /area/icarus/vessel) "bK" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 8 }, /turf/floor/tiled, @@ -572,7 +572,7 @@ /turf/floor/tiled, /area/icarus/vessel) "ca" = ( -/obj/structure/bed/chair/comfy/brown, +/obj/structure/chair/comfy/brown, /turf/floor/tiled, /area/icarus/vessel) "cb" = ( @@ -604,7 +604,7 @@ /turf/floor/tiled, /area/icarus/vessel) "cf" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/abstract/landmark/corpse/engineer, @@ -1006,7 +1006,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dl" = ( -/obj/structure/bed/chair/comfy/brown{ +/obj/structure/chair/comfy/brown{ dir = 4 }, /obj/abstract/landmark/corpse/scientist, @@ -1101,7 +1101,7 @@ /turf/floor/tiled, /area/icarus/vessel) "dz" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/tiled, /area/icarus/vessel) "dA" = ( @@ -1429,7 +1429,7 @@ }, /area/icarus/vessel) "eB" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /turf/floor/shuttle/white, /area/icarus/vessel) "eC" = ( @@ -1475,7 +1475,7 @@ /turf/floor/shuttle/white, /area/icarus/open) "eK" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/shuttle/white, @@ -1521,7 +1521,7 @@ /turf/floor/plating, /area/icarus/vessel) "eS" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/shuttle/white, @@ -1532,7 +1532,7 @@ }, /area/icarus/vessel) "eU" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 1 }, /turf/floor/shuttle/white, diff --git a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm index 5aa3911fe646..049ae42287b1 100644 --- a/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm +++ b/mods/content/government/ruins/ec_old_crash/ec_old_crash.dmm @@ -1529,7 +1529,7 @@ /turf/floor, /area/map_template/ecship/engineering) "dr" = ( -/obj/structure/bed/chair, +/obj/structure/chair, /obj/machinery/atmospherics/pipe/simple/visible/cyan{ dir = 4 }, diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm index 5a445c37f40b..656c74be4a27 100644 --- a/mods/gamemodes/heist/heist_base.dmm +++ b/mods/gamemodes/heist/heist_base.dmm @@ -830,7 +830,7 @@ /turf/floor/shuttle/red, /area/map_template/skipjack_station/start) "cL" = ( -/obj/structure/bed/chair/shuttle{ +/obj/structure/chair/shuttle{ dir = 8 }, /turf/floor/shuttle/red, @@ -856,7 +856,7 @@ /turf/floor/shuttle/red, /area/map_template/skipjack_station/start) "cN" = ( -/obj/structure/bed/chair/office/light{ +/obj/structure/chair/office/light{ dir = 4 }, /turf/floor/shuttle/red, @@ -1229,7 +1229,7 @@ /turf/floor/plating, /area/map_template/skipjack_station/start) "dM" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /obj/machinery/light/small{ @@ -1243,7 +1243,7 @@ /turf/floor/shuttle/red, /area/map_template/skipjack_station/start) "dO" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /obj/machinery/light/small{ @@ -1298,7 +1298,7 @@ /turf/floor/plating, /area/map_template/skipjack_station/start) "dX" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/floor/shuttle/red, @@ -1310,7 +1310,7 @@ /turf/floor/shuttle/red, /area/map_template/skipjack_station/start) "dZ" = ( -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 8 }, /turf/floor/shuttle/red, diff --git a/mods/gamemodes/ninja/maps/ninja_base.dmm b/mods/gamemodes/ninja/maps/ninja_base.dmm index 9b4d2bb2ad4f..f4de17a60585 100644 --- a/mods/gamemodes/ninja/maps/ninja_base.dmm +++ b/mods/gamemodes/ninja/maps/ninja_base.dmm @@ -896,7 +896,7 @@ /area/map_template/ninja_dojo/start) "cS" = ( /obj/effect/floor_decal/industrial/outline/grey, -/obj/structure/bed/chair{ +/obj/structure/chair{ dir = 4 }, /turf/unsimulated/floor/dark, @@ -976,7 +976,7 @@ /turf/unsimulated/floor/dark, /area/map_template/ninja_dojo/start) "da" = ( -/obj/structure/bed/chair/shuttle, +/obj/structure/chair/shuttle, /turf/unsimulated/floor/dark, /area/map_template/ninja_dojo/start) "db" = ( From 77bef4b087ea87c509ac4e1500f16f6ff219a122 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Fri, 7 Feb 2025 00:50:11 +0000 Subject: [PATCH 16/54] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ++++++ html/changelogs/.all_changelog.yml | 4 ++++ html/changelogs/AutoChangeLog-pr-4837.yml | 5 ----- 3 files changed, 10 insertions(+), 5 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4837.yml diff --git a/html/changelog.html b/html/changelog.html index efce7ec1bd11..0ecd632b9e44 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->
+

07 February 2025

+

Penelope Haze updated:

+
    +
  • Shears are now used to add or remove padding from objects. Wirecutters still work as a backup, though.
  • +
+

02 February 2025

Penelope Haze updated:

    diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e0829a79b288..07cfc97b702b 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14978,3 +14978,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2025-02-02: Penelope Haze: - tweak: Modified liquid and coating presentation to be more fancy. +2025-02-07: + Penelope Haze: + - tweak: Shears are now used to add or remove padding from objects. Wirecutters + still work as a backup, though. diff --git a/html/changelogs/AutoChangeLog-pr-4837.yml b/html/changelogs/AutoChangeLog-pr-4837.yml deleted file mode 100644 index 7cf93b0c976a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4837.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: Penelope Haze -changes: - - {tweak: 'Shears are now used to add or remove padding from objects. Wirecutters - still work as a backup, though.'} -delete-after: true From 44ead5f6bcba75806e62e6057fcf2982b760c5be Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 Jan 2025 16:43:50 +1100 Subject: [PATCH 17/54] Tweaking flooring procs to allow for multiple flooring layers. --- code/game/machinery/CableLayer.dm | 2 +- code/game/machinery/floorlayer.dm | 2 +- code/game/machinery/pipe/pipelayer.dm | 2 +- code/game/turfs/flooring/_flooring.dm | 12 +- code/game/turfs/flooring/flooring_grass.dm | 6 +- code/game/turfs/flooring/flooring_snow.dm | 2 +- code/game/turfs/floors/_floor.dm | 141 +--------- code/game/turfs/floors/floor_acts.dm | 2 +- code/game/turfs/floors/floor_damage.dm | 2 +- code/game/turfs/floors/floor_layers.dm | 258 ++++++++++++++++++ .../turfs/floors/subtypes/floor_carpet.dm | 67 +++-- .../turfs/floors/subtypes/floor_circuit.dm | 30 +- .../turfs/floors/subtypes/floor_concrete.dm | 20 +- code/game/turfs/floors/subtypes/floor_misc.dm | 84 +++--- .../turfs/floors/subtypes/floor_natural.dm | 174 ++++++------ code/game/turfs/floors/subtypes/floor_path.dm | 26 +- .../turfs/floors/subtypes/floor_reinforced.dm | 17 +- .../turfs/floors/subtypes/floor_shuttle.dm | 22 +- .../turfs/floors/subtypes/floor_static.dm | 22 +- .../game/turfs/floors/subtypes/floor_tiled.dm | 136 ++++----- code/game/turfs/floors/subtypes/floor_wood.dm | 74 ++--- code/game/turfs/turf_changing.dm | 2 + code/modules/holodeck/HolodeckObjects.dm | 146 +++++----- code/modules/mob/living/bot/floorbot.dm | 2 +- code/unit_tests/turf_icons.dm | 3 +- .../submaps/woods/fairy_rings/fairy_ring.dmm | 4 +- .../system/psionics/null/turf_floor.dm | 4 +- mods/gamemodes/cult/cultify/turf.dm | 16 +- mods/species/ascent/turfs/ship.dm | 44 +-- mods/species/skrell/turfs/flooring.dm | 20 +- nebula.dme | 1 + 31 files changed, 751 insertions(+), 592 deletions(-) create mode 100644 code/game/turfs/floors/floor_layers.dm diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 55054da3de1e..1b6472cef11e 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -87,7 +87,7 @@ if(istype(new_turf, /turf/floor)) var/turf/floor/T = new_turf if(!T.is_plating()) - T.set_flooring(null, place_product = !T.is_floor_damaged()) + T.clear_flooring(place_product = !T.is_floor_damaged()) return new_turf.is_plating() /obj/machinery/cablelayer/proc/layCable(var/turf/new_turf,var/M_Dir) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index b8628b7e508a..e70e3c250776 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -82,7 +82,7 @@ if(istype(new_turf, /turf/floor)) var/turf/floor/T = new_turf if(!T.is_plating()) - T.set_flooring(null, place_product = !T.is_floor_damaged()) + T.clear_flooring(place_product = !T.is_floor_damaged()) return new_turf.is_plating() /obj/machinery/floorlayer/proc/TakeNewStack() diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index fdc1b122ef33..d6761c4858ca 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -111,7 +111,7 @@ if(istype(new_turf, /turf/floor)) var/turf/floor/T = new_turf if(!T.is_plating()) - T.set_flooring(null, place_product = !T.is_floor_damaged()) + T.clear_flooring(place_product = !T.is_floor_damaged()) return new_turf.is_plating() /obj/machinery/pipelayer/proc/layPipe(var/turf/w_turf,var/M_Dir,var/old_dir) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 7618f0600eaa..01d6ff0d4bbb 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -300,7 +300,7 @@ var/global/list/flooring_cache = list() if(!user.do_skilled(remove_timer, SKILL_CONSTRUCTION, floor) || floor.get_topmost_flooring() != src) return TRUE to_chat(user, SPAN_NOTICE("You remove the [get_surface_descriptor()] with \the [item].")) - floor.set_flooring(null, place_product = TRUE) + floor.remove_flooring(floor.get_topmost_flooring(), place_product = TRUE) playsound(floor, 'sound/items/Deconstruct.ogg', 80, 1) return TRUE @@ -313,21 +313,21 @@ var/global/list/flooring_cache = list() if(floor.get_topmost_flooring() != src) return to_chat(user, SPAN_NOTICE("You remove the broken [get_surface_descriptor()].")) - floor.set_flooring(null) + floor.remove_flooring(floor.get_topmost_flooring()) else if(flooring_flags & TURF_IS_FRAGILE) if(!user.do_skilled(remove_timer, SKILL_CONSTRUCTION, floor, 0.15)) return TRUE if(floor.get_topmost_flooring() != src) return to_chat(user, SPAN_DANGER("You forcefully pry off the [get_surface_descriptor()], destroying them in the process.")) - floor.set_flooring(null) + floor.remove_flooring(floor.get_topmost_flooring()) else if(flooring_flags & TURF_REMOVE_CROWBAR) if(!user.do_skilled(remove_timer, SKILL_CONSTRUCTION, floor)) return TRUE if(floor.get_topmost_flooring() != src) return to_chat(user, SPAN_NOTICE("You lever off the [get_surface_descriptor()].")) - floor.set_flooring(null, place_product = TRUE) + floor.remove_flooring(floor.get_topmost_flooring(), place_product = TRUE) else return playsound(floor, 'sound/items/Crowbar.ogg', 80, 1) @@ -339,7 +339,7 @@ var/global/list/flooring_cache = list() if(!user.do_skilled(remove_timer, SKILL_CONSTRUCTION, floor) || floor.get_topmost_flooring() != src) return TRUE to_chat(user, SPAN_NOTICE("You unscrew and remove the [get_surface_descriptor()].")) - floor.set_flooring(null, place_product = TRUE) + floor.remove_flooring(floor.get_topmost_flooring(), place_product = TRUE) playsound(floor, 'sound/items/Screwdriver.ogg', 80, 1) return TRUE @@ -347,7 +347,7 @@ var/global/list/flooring_cache = list() if(!user.do_skilled(remove_timer, SKILL_CONSTRUCTION, floor) || floor.get_topmost_flooring() != src) return TRUE to_chat(user, SPAN_NOTICE("You unwrench and remove the [get_surface_descriptor()].")) - floor.set_flooring(null, place_product = TRUE) + floor.remove_flooring(floor.get_topmost_flooring(), place_product = TRUE) playsound(floor, 'sound/items/Ratchet.ogg', 80, 1) return TRUE diff --git a/code/game/turfs/flooring/flooring_grass.dm b/code/game/turfs/flooring/flooring_grass.dm index 8ac33265fdb8..e557193db38d 100644 --- a/code/game/turfs/flooring/flooring_grass.dm +++ b/code/game/turfs/flooring/flooring_grass.dm @@ -17,12 +17,12 @@ /decl/flooring/grass/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if(target.get_topmost_flooring() == src && (exposed_temperature > T0C + 200 && prob(5)) || exposed_temperature > T0C + 1000) - target.set_flooring(null) + target.remove_flooring(target.get_topmost_flooring()) return TRUE return ..() /decl/flooring/grass/handle_turf_digging(turf/floor/target) - target.set_flooring(null) + target.remove_flooring(target.get_topmost_flooring()) return FALSE /decl/flooring/grass/wild @@ -42,7 +42,7 @@ if(IS_KNIFE(item) && harvestable && istype(floor_material) && floor_material.dug_drop_type) if(item.do_tool_interaction(TOOL_KNIFE, user, floor, 3 SECONDS, start_message = "harvesting", success_message = "harvesting") && !QDELETED(floor) && floor.get_topmost_flooring() == src) new floor_material.dug_drop_type(floor, rand(2,5)) - floor.set_flooring(/decl/flooring/grass) + floor.remove_flooring(src) return TRUE return ..() diff --git a/code/game/turfs/flooring/flooring_snow.dm b/code/game/turfs/flooring/flooring_snow.dm index f1d1dded76ed..7ef511ab0e33 100644 --- a/code/game/turfs/flooring/flooring_snow.dm +++ b/code/game/turfs/flooring/flooring_snow.dm @@ -26,7 +26,7 @@ /decl/flooring/snow/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!target.reagents?.total_volume) if(target.get_topmost_flooring() == src) - target.set_flooring(/decl/flooring/permafrost) + target.remove_flooring(src) else if(target.get_base_flooring() == src) target.set_base_flooring(/decl/flooring/permafrost) return diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index d7e8441fda07..7dc51d0f1746 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -24,10 +24,6 @@ // Flooring data. var/floor_icon_state_override - // TODO: - VAR_PROTECTED/decl/flooring/_base_flooring = /decl/flooring/plating - VAR_PROTECTED/decl/flooring/_flooring - var/const/TRENCH_DEPTH_PER_ACTION = 100 /turf/floor/Initialize(var/ml, var/floortype) @@ -39,17 +35,19 @@ set_turf_materials(floor_material, skip_update = TRUE) - if(!floortype && ispath(_flooring)) + if(!floortype && (ispath(_flooring) || islist(_flooring))) floortype = _flooring + else + floortype = null if(floortype) - set_flooring(GET_DECL(floortype), skip_update = TRUE) + _flooring = null + set_flooring(floortype, skip_update = TRUE) fill_to_zero_height() // try to refill turfs that act as fluid sources if(floor_material || get_topmost_flooring()) - if(ml) - queue_icon_update() - else + update_from_flooring() + if(!ml) for(var/direction in global.alldirs) var/turf/target_turf = get_step_resolving_mimic(src, direction) if(istype(target_turf)) @@ -59,13 +57,14 @@ target_turf.update_icon() update_icon() + /turf/floor/ChangeTurf(turf/N, tell_universe, force_lighting_update, keep_air, update_open_turfs_above, keep_height) if(is_processing) STOP_PROCESSING(SSobj, src) . = ..() /turf/floor/Destroy() - set_flooring(null) + clear_flooring() if(is_processing) STOP_PROCESSING(SSobj, src) return ..() @@ -79,9 +78,6 @@ /turf/floor/can_climb_from_below(var/mob/climber) return TRUE -/turf/floor/proc/has_flooring() - return istype(_flooring) - /turf/floor/is_plating() if(density) return FALSE @@ -101,118 +97,6 @@ fill_to_zero_height() update_floor_strings() -/turf/floor/proc/set_base_flooring(new_base_flooring, skip_update) - if(ispath(new_base_flooring, /decl/flooring)) - new_base_flooring = GET_DECL(new_base_flooring) - else if(!istype(new_base_flooring, /decl/flooring)) - new_base_flooring = null - if(_base_flooring == new_base_flooring) - return - _base_flooring = new_base_flooring - if(!_base_flooring) // We can never have a null base flooring. - _base_flooring = GET_DECL(initial(_base_flooring)) || GET_DECL(/decl/flooring/plating) - update_from_flooring(skip_update) - -/turf/floor/proc/get_base_flooring() - RETURN_TYPE(/decl/flooring) - if(ispath(_base_flooring)) - return GET_DECL(_base_flooring) - return _base_flooring - -/turf/floor/proc/get_topmost_flooring() - RETURN_TYPE(/decl/flooring) - if(isnull(_flooring)) - return get_base_flooring() - if(ispath(_flooring)) - return GET_DECL(_flooring) - return _flooring - -/turf/floor/proc/set_flooring(var/decl/flooring/newflooring, skip_update, place_product) - - if(ispath(newflooring, /decl/flooring)) - newflooring = GET_DECL(newflooring) - else if(!istype(newflooring, /decl/flooring)) - newflooring = null - - if(_flooring == newflooring) - return FALSE - - if(istype(_flooring)) - - LAZYCLEARLIST(decals) - for(var/obj/effect/decal/writing/W in src) - qdel(W) - - _flooring.on_flooring_remove(src) - if(_flooring.build_type && place_product) - // If build type uses material stack, check for it - // Because material stack uses different arguments - // And we need to use build material to spawn stack - if(ispath(_flooring.build_type, /obj/item/stack/material)) - var/decl/material/M = GET_DECL(_flooring.build_material) - if(!M) - CRASH("[src] at ([x], [y], [z]) cannot create stack because it has a bad build_material path: '[_flooring.build_material]'") - M.create_object(src, _flooring.build_cost, _flooring.build_type) - else - var/obj/item/stack/tile/new_tile = new _flooring.build_type(src) - if(_flooring.can_paint && paint_color) - new_tile.paint_color = paint_color - - if(_flooring.has_environment_proc && is_processing) - STOP_PROCESSING(SSobj, src) - - _flooring = null - set_floor_broken(skip_update = TRUE) - set_floor_burned() - - else if(is_processing) - - STOP_PROCESSING(SSobj, src) - - _flooring = newflooring - floor_icon_state_override = null - update_from_flooring(skip_update) - - return TRUE - -/turf/floor/proc/update_from_flooring(skip_update) - - var/decl/flooring/copy_from = get_topmost_flooring() - if(!istype(copy_from)) - return // this should never be the case - - update_floor_strings() - - gender = copy_from.gender - layer = copy_from.floor_layer - turf_flags = copy_from.turf_flags - z_flags = copy_from.z_flags - - if(copy_from.turf_light_range || copy_from.turf_light_power || copy_from.turf_light_color) - set_light(copy_from.turf_light_range, copy_from.turf_light_power, copy_from.turf_light_color) - else - set_light(0) - - if(z_flags & ZM_MIMIC_BELOW) - enable_zmimic(z_flags) - else - disable_zmimic() - - if(copy_from.has_environment_proc && !is_processing) - START_PROCESSING(SSobj, src) - - levelupdate() - - for(var/obj/effect/footprints/print in src) - qdel(print) - - if(!skip_update) - update_icon() - for(var/dir in global.alldirs) - var/turf/neighbor = get_step_resolving_mimic(src, dir) - if(istype(neighbor)) - neighbor.update_icon() - /turf/floor/can_engrave() var/decl/flooring/flooring = get_topmost_flooring() return flooring ? flooring.can_engrave : can_engrave @@ -269,13 +153,6 @@ return my_material.color return color -/turf/floor/proc/get_all_flooring() - . = list() - if(istype(_flooring)) - . += _flooring - if(istype(_base_flooring)) - . += _base_flooring - /turf/floor/Process() for(var/decl/flooring/flooring in get_all_flooring()) if(flooring.has_environment_proc) diff --git a/code/game/turfs/floors/floor_acts.dm b/code/game/turfs/floors/floor_acts.dm index 38bf80eed757..1280fd30cfa9 100644 --- a/code/game/turfs/floors/floor_acts.dm +++ b/code/game/turfs/floors/floor_acts.dm @@ -42,7 +42,7 @@ if(!is_floor_burned() && prob(5)) burn_tile(exposed_temperature) else if(temp_destroy && exposed_temperature >= (temp_destroy + 100) && prob(1) && has_flooring()) - set_flooring(null) //destroy the tile, exposing plating + remove_flooring(get_topmost_flooring()) //destroy the tile, exposing plating burn_tile(exposed_temperature) return ..() diff --git a/code/game/turfs/floors/floor_damage.dm b/code/game/turfs/floors/floor_damage.dm index 05e7630e0a13..1fed09cc4c2e 100644 --- a/code/game/turfs/floors/floor_damage.dm +++ b/code/game/turfs/floors/floor_damage.dm @@ -1,6 +1,6 @@ /turf/floor/proc/break_tile_to_plating() if(has_flooring()) - set_flooring(null) + clear_flooring() break_tile() /turf/floor/proc/break_tile() diff --git a/code/game/turfs/floors/floor_layers.dm b/code/game/turfs/floors/floor_layers.dm new file mode 100644 index 000000000000..76ef3df043a9 --- /dev/null +++ b/code/game/turfs/floors/floor_layers.dm @@ -0,0 +1,258 @@ +/turf/floor + VAR_PROTECTED/decl/flooring/_base_flooring = /decl/flooring/plating + VAR_PROTECTED/list/decl/flooring/_flooring + VAR_PRIVATE/decl/flooring/_topmost_flooring + +/turf/floor/proc/get_all_flooring() + . = list() + if(istype(_flooring)) + . += _flooring + else if(ispath(_flooring)) + . += GET_DECL(_flooring) + else if(islist(_flooring)) + for(var/floor in _flooring) + if(ispath(floor)) + _flooring += GET_DECL(floor) + else if(istype(floor, /decl/flooring)) + _flooring += floor + if(_base_flooring) + . += get_base_flooring() + +/turf/floor/proc/has_flooring() + return !isnull(_flooring) + +/turf/floor/proc/set_base_flooring(new_base_flooring, skip_update) + if(ispath(new_base_flooring, /decl/flooring)) + new_base_flooring = GET_DECL(new_base_flooring) + else if(!istype(new_base_flooring, /decl/flooring)) + new_base_flooring = null + if(_base_flooring == new_base_flooring) + return + _base_flooring = new_base_flooring + if(!_base_flooring) // We can never have a null base flooring. + _base_flooring = GET_DECL(initial(_base_flooring)) || GET_DECL(/decl/flooring/plating) + update_from_flooring(skip_update) + +/turf/floor/proc/get_base_flooring() + RETURN_TYPE(/decl/flooring) + if(ispath(_base_flooring)) + _base_flooring = GET_DECL(_base_flooring) + return _base_flooring + +/turf/floor/proc/get_topmost_flooring() + RETURN_TYPE(/decl/flooring) + + if(isnull(_topmost_flooring)) + var/flooring_length = length(_flooring) + if(isnull(_flooring)) + _topmost_flooring = FALSE + else if(islist(_flooring) && flooring_length) + _topmost_flooring = _flooring[flooring_length] + else if(istype(_flooring, /decl/flooring)) + _topmost_flooring = _flooring + + if(istype(_topmost_flooring)) + return _topmost_flooring + return get_base_flooring() + +/turf/floor/proc/clear_flooring(skip_update = FALSE, place_product) + if(isnull(_flooring)) + return FALSE + if(islist(_flooring)) + for(var/floor in _flooring) + remove_flooring(floor, TRUE, place_product) + else if(_flooring) + remove_flooring(_flooring, TRUE, place_product) + if(!skip_update) + update_from_flooring() + return TRUE + +/turf/floor/proc/remove_flooring(var/decl/flooring/flooring, skip_update, place_product) + + // Remove floor layers one by one. + _topmost_flooring = null + if(islist(flooring)) + for(var/floor in UNLINT(flooring)) + if(remove_flooring(floor, TRUE, place_product)) + . = TRUE + if(. && !skip_update) + set_floor_broken(skip_update = TRUE) + set_floor_burned(skip_update = TRUE) + update_from_flooring() + return + + // Validate our input. + if(ispath(flooring)) + flooring = GET_DECL(flooring) + if(!istype(flooring)) + return + + // Remove this turf from the layer stack. + var/was_topmost = (flooring == get_topmost_flooring()) + if(islist(_flooring)) + LAZYREMOVE(_flooring, flooring) + if(LAZYLEN(_flooring) == 1) + _flooring = _flooring[1] + else if(_flooring == flooring) + _flooring = null + + // If the turf was not the topmost turf, then we don't really need to care about it. + if(!was_topmost) + return + + LAZYCLEARLIST(decals) + for(var/obj/effect/decal/writing/W in src) + qdel(W) + + flooring.on_flooring_remove(src) + + if(flooring.build_type && place_product) + // If build_type uses material stack, check for it + // Because material stack uses different arguments + // And we need to use build material to spawn stack + if(ispath(flooring.build_type, /obj/item/stack/material)) + var/decl/material/M = GET_DECL(flooring.build_material) + if(!M) + CRASH("[src] at ([x], [y], [z]) cannot create stack because it has a bad build_material path: '[flooring.build_material]'") + M.create_object(src, flooring.build_cost, flooring.build_type) + else + var/obj/item/stack/tile/new_tile = new flooring.build_type(src) + if(flooring.can_paint && paint_color) + new_tile.paint_color = paint_color + + if(flooring.has_environment_proc && is_processing) + STOP_PROCESSING(SSobj, src) + + floor_icon_state_override = null + + if(!skip_update) + set_floor_broken(skip_update = TRUE) + set_floor_burned(skip_update = TRUE) + update_from_flooring() + +/turf/floor/proc/set_flooring(var/decl/flooring/newflooring, skip_update, place_product) + + _topmost_flooring = null + + // Clear this here to get it out of the way. + floor_icon_state_override = null + + // If _flooring is unset, we can shortcut a lot of these steps. + if(isnull(_flooring)) + + if(isnull(newflooring)) + return FALSE + + if(islist(newflooring)) + _flooring = list() + for(var/floor in UNLINT(newflooring)) + if(ispath(floor)) + floor = GET_DECL(floor) + if(istype(floor, /decl/flooring)) + _flooring += floor + else if(ispath(newflooring)) + _flooring = GET_DECL(newflooring) + else if(istype(newflooring)) + _flooring = newflooring + else + return FALSE + + if(!skip_update) + update_from_flooring() + return TRUE + + + // If we already have a flooring state, we need to do some cleanup and housekeeping. + clear_flooring(skip_update = TRUE, place_product = place_product) + if(!isnull(newflooring)) + add_flooring(newflooring, skip_update, place_product) + if(!skip_update) + update_from_flooring(skip_update) + +/turf/floor/proc/add_flooring(decl/flooring/newflooring, skip_update) + + _topmost_flooring = null + + // Add floor layers one by one. + if(islist(newflooring)) + for(var/floor in UNLINT(newflooring)) + if(add_flooring(floor, skip_update = FALSE)) + . = TRUE + if(!skip_update) + set_floor_broken(skip_update = TRUE) + set_floor_burned(skip_update = TRUE) + update_from_flooring() + return + + // We only want to work with references. + if(ispath(newflooring, /decl/flooring)) + newflooring = GET_DECL(newflooring) + else if(!istype(newflooring, /decl/flooring)) + return FALSE + + // Check if the layer is already present. + if(_flooring) + if(islist(_flooring)) + if(newflooring in _flooring) + return FALSE + else if(newflooring == _flooring) + return FALSE + + // Add our layer to the top of layers. + if(isnull(_flooring)) + _flooring = newflooring + else + if(!islist(_flooring)) + _flooring = list(_flooring) + _flooring |= newflooring + + // Update for the new top layer. + if(!skip_update) + set_floor_broken(skip_update = TRUE) + set_floor_burned(skip_update = TRUE) + update_from_flooring() + + return TRUE + +/turf/floor/proc/update_from_flooring(skip_update) + + _topmost_flooring = null + + var/decl/flooring/copy_from = get_topmost_flooring() + if(!istype(copy_from)) + return // this should never be the case + + update_floor_strings() + + gender = copy_from.gender + layer = copy_from.floor_layer + turf_flags = copy_from.turf_flags + z_flags = copy_from.z_flags + + if(copy_from.turf_light_range || copy_from.turf_light_power || copy_from.turf_light_color) + set_light(copy_from.turf_light_range, copy_from.turf_light_power, copy_from.turf_light_color) + else + set_light(0) + + if(z_flags & ZM_MIMIC_BELOW) + enable_zmimic(z_flags) + else + disable_zmimic() + + if(copy_from.has_environment_proc) + if(!is_processing) + START_PROCESSING(SSobj, src) + else if(is_processing) + STOP_PROCESSING(SSobj, src) + + levelupdate() + + for(var/obj/effect/footprints/print in src) + qdel(print) + + if(!skip_update) + update_icon() + for(var/dir in global.alldirs) + var/turf/neighbor = get_step_resolving_mimic(src, dir) + if(istype(neighbor)) + neighbor.update_icon() diff --git a/code/game/turfs/floors/subtypes/floor_carpet.dm b/code/game/turfs/floors/subtypes/floor_carpet.dm index 8292e7cbdc86..32ce9f728b92 100644 --- a/code/game/turfs/floors/subtypes/floor_carpet.dm +++ b/code/game/turfs/floors/subtypes/floor_carpet.dm @@ -1,9 +1,8 @@ - /turf/floor/carpet - name = "brown carpet" - icon = 'icons/turf/flooring/carpet.dmi' - icon_state = "brown" - _flooring = /decl/flooring/carpet + name = "brown carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "brown" + _flooring = /decl/flooring/carpet /turf/floor/carpet/broken _floor_broken = TRUE @@ -15,49 +14,49 @@ set_floor_broken(setting_broken) /turf/floor/carpet/blue - name = "blue carpet" - icon_state = "blue1" - _flooring = /decl/flooring/carpet/blue + name = "blue carpet" + icon_state = "blue1" + _flooring = /decl/flooring/carpet/blue /turf/floor/carpet/blue2 - name = "pale blue carpet" - icon_state = "blue2" - _flooring = /decl/flooring/carpet/blue2 + name = "pale blue carpet" + icon_state = "blue2" + _flooring = /decl/flooring/carpet/blue2 /turf/floor/carpet/blue3 - name = "sea blue carpet" - icon_state = "blue3" - _flooring = /decl/flooring/carpet/blue3 + name = "sea blue carpet" + icon_state = "blue3" + _flooring = /decl/flooring/carpet/blue3 /turf/floor/carpet/magenta - name = "magenta carpet" - icon_state = "magenta" - _flooring = /decl/flooring/carpet/magenta + name = "magenta carpet" + icon_state = "magenta" + _flooring = /decl/flooring/carpet/magenta /turf/floor/carpet/purple - name = "purple carpet" - icon_state = "purple" - _flooring = /decl/flooring/carpet/purple + name = "purple carpet" + icon_state = "purple" + _flooring = /decl/flooring/carpet/purple /turf/floor/carpet/orange - name = "orange carpet" - icon_state = "orange" - _flooring = /decl/flooring/carpet/orange + name = "orange carpet" + icon_state = "orange" + _flooring = /decl/flooring/carpet/orange /turf/floor/carpet/green - name = "green carpet" - icon_state = "green" - _flooring = /decl/flooring/carpet/green + name = "green carpet" + icon_state = "green" + _flooring = /decl/flooring/carpet/green /turf/floor/carpet/red - name = "red carpet" - icon_state = "red" - _flooring = /decl/flooring/carpet/red + name = "red carpet" + icon_state = "red" + _flooring = /decl/flooring/carpet/red /turf/floor/carpet/rustic - name = "rustic carpet" - icon = 'icons/turf/flooring/simple_carpet.dmi' - icon_state = "carpet" - _flooring = /decl/flooring/carpet/rustic + name = "rustic carpet" + icon = 'icons/turf/flooring/simple_carpet.dmi' + icon_state = "carpet" + _flooring = /decl/flooring/carpet/rustic paint_color = COLOR_CHESTNUT - color = COLOR_CHESTNUT \ No newline at end of file + color = COLOR_CHESTNUT \ No newline at end of file diff --git a/code/game/turfs/floors/subtypes/floor_circuit.dm b/code/game/turfs/floors/subtypes/floor_circuit.dm index f050f13a93e4..7684009c32a4 100644 --- a/code/game/turfs/floors/subtypes/floor_circuit.dm +++ b/code/game/turfs/floors/subtypes/floor_circuit.dm @@ -1,26 +1,26 @@ /turf/floor/bluegrid - name = "mainframe floor" - icon = 'icons/turf/flooring/circuit.dmi' - icon_state = "bcircuit" - _flooring = /decl/flooring/reinforced/circuit + name = "mainframe floor" + icon = 'icons/turf/flooring/circuit.dmi' + icon_state = "bcircuit" + _flooring = /decl/flooring/reinforced/circuit /turf/floor/bluegrid/airless - name = "airless floor" + name = "airless floor" initial_gas = null temperature = TCMB /turf/floor/bluegrid/mainframe - name = "mainframe base" // TODO: force name overriding flooring? + name = "mainframe base" // TODO: force name overriding flooring? temperature = 263 /turf/floor/greengrid - name = "mainframe floor" - icon = 'icons/turf/flooring/circuit.dmi' - icon_state = "gcircuit" - _flooring = /decl/flooring/reinforced/circuit/green + name = "mainframe floor" + icon = 'icons/turf/flooring/circuit.dmi' + icon_state = "gcircuit" + _flooring = /decl/flooring/reinforced/circuit/green /turf/floor/greengrid/airless - name = "airless floor" + name = "airless floor" initial_gas = null temperature = TCMB @@ -28,7 +28,7 @@ initial_gas = list(/decl/material/gas/nitrogen = MOLES_N2STANDARD) /turf/floor/blackgrid - name = "mainframe floor" - icon = 'icons/turf/flooring/circuit.dmi' - icon_state = "rcircuit" - _flooring = /decl/flooring/reinforced/circuit/red + name = "mainframe floor" + icon = 'icons/turf/flooring/circuit.dmi' + icon_state = "rcircuit" + _flooring = /decl/flooring/reinforced/circuit/red diff --git a/code/game/turfs/floors/subtypes/floor_concrete.dm b/code/game/turfs/floors/subtypes/floor_concrete.dm index 2c1380031ff0..7e8056a04c70 100644 --- a/code/game/turfs/floors/subtypes/floor_concrete.dm +++ b/code/game/turfs/floors/subtypes/floor_concrete.dm @@ -7,23 +7,23 @@ floor_material = /decl/material/solid/stone/concrete /turf/floor/concrete/smooth - icon_state = "concrete" + icon_state = "concrete" /turf/floor/concrete/flooded - flooded = /decl/material/liquid/water - color = COLOR_LIQUID_WATER + flooded = /decl/material/liquid/water + color = COLOR_LIQUID_WATER /turf/floor/concrete/reinforced - name = "reinforced concrete" - icon_state = "hexacrete" - _flooring = /decl/flooring/concrete/reinforced + name = "reinforced concrete" + icon_state = "hexacrete" + _flooring = /decl/flooring/concrete/reinforced /turf/floor/concrete/reinforced/damaged/LateInitialize() . = ..() set_floor_broken(TRUE) /turf/floor/concrete/reinforced/road - name = "asphalt" - color = COLOR_GRAY40 - icon_state = "concrete" - _flooring = /decl/flooring/concrete/asphalt + name = "asphalt" + color = COLOR_GRAY40 + icon_state = "concrete" + _flooring = /decl/flooring/concrete/asphalt diff --git a/code/game/turfs/floors/subtypes/floor_misc.dm b/code/game/turfs/floors/subtypes/floor_misc.dm index 91c472fc284a..ad32a2b3b417 100644 --- a/code/game/turfs/floors/subtypes/floor_misc.dm +++ b/code/game/turfs/floors/subtypes/floor_misc.dm @@ -1,54 +1,54 @@ /turf/floor/lino - name = "lino" - icon = 'icons/turf/flooring/linoleum.dmi' - icon_state = "lino" - _flooring = /decl/flooring/linoleum + name = "lino" + icon = 'icons/turf/flooring/linoleum.dmi' + icon_state = "lino" + _flooring = /decl/flooring/linoleum /turf/floor/crystal - name = "crystal floor" - icon = 'icons/turf/flooring/crystal.dmi' - icon_state = "crystal" - _flooring = /decl/flooring/crystal + name = "crystal floor" + icon = 'icons/turf/flooring/crystal.dmi' + icon_state = "crystal" + _flooring = /decl/flooring/crystal /turf/floor/glass - name = "glass floor" - icon = 'icons/turf/flooring/glass.dmi' - icon_state = "glass" - _flooring = /decl/flooring/glass + name = "glass floor" + icon = 'icons/turf/flooring/glass.dmi' + icon_state = "glass" + _flooring = /decl/flooring/glass /turf/floor/glass/boro - _flooring = /decl/flooring/glass/boro + _flooring = /decl/flooring/glass/boro /turf/floor/pool - name = "pool floor" - icon = 'icons/turf/flooring/pool.dmi' - icon_state = "pool" - height = -(FLUID_OVER_MOB_HEAD) - 50 - _flooring = /decl/flooring/pool + name = "pool floor" + icon = 'icons/turf/flooring/pool.dmi' + icon_state = "pool" + height = -(FLUID_OVER_MOB_HEAD) - 50 + _flooring = /decl/flooring/pool /turf/floor/pool/deep - height = -FLUID_DEEP - 50 + height = -FLUID_DEEP - 50 /turf/floor/fake_grass - name = "grass patch" - icon = 'icons/turf/flooring/fakegrass.dmi' - icon_state = "grass0" - _flooring = /decl/flooring/grass/fake + name = "grass patch" + icon = 'icons/turf/flooring/fakegrass.dmi' + icon_state = "grass0" + _flooring = /decl/flooring/grass/fake /turf/floor/woven - name = "floor" - icon = 'icons/turf/flooring/woven.dmi' - icon_state = "woven" - color = COLOR_BEIGE - _flooring = /decl/flooring/woven + name = "floor" + icon = 'icons/turf/flooring/woven.dmi' + icon_state = "woven" + color = COLOR_BEIGE + _flooring = /decl/flooring/woven /turf/floor/straw - name = "loose straw" - icon = 'icons/turf/flooring/straw.dmi' - icon_state = "straw" - color = COLOR_WHEAT - _flooring = /decl/flooring/straw + name = "loose straw" + icon = 'icons/turf/flooring/straw.dmi' + icon_state = "straw" + color = COLOR_WHEAT + _flooring = /decl/flooring/straw // Defining this here as a dummy mapping shorthand so mappers can search for 'plating'. /turf/floor/plating @@ -63,7 +63,7 @@ _flooring = /decl/flooring/dirt /turf/floor/plating/broken - _floor_broken = TRUE + _floor_broken = TRUE /turf/floor/plating/broken/Initialize(ml, floortype) . = ..() @@ -72,12 +72,12 @@ set_floor_broken(setting_broken) /turf/floor/plating/airless - name = "airless plating" - initial_gas = null - temperature = TCMB + name = "airless plating" + initial_gas = null + temperature = TCMB /turf/floor/plating/airless/broken - _floor_broken = TRUE + _floor_broken = TRUE /turf/floor/plating/airless/broken/Initialize(ml, floortype) . = ..() @@ -86,13 +86,13 @@ set_floor_broken(setting_broken) /turf/floor/plating/broken/one - _floor_broken = "broken1" + _floor_broken = "broken1" /turf/floor/plating/broken/two - _floor_broken = "broken2" + _floor_broken = "broken2" /turf/floor/plating/broken/three - _floor_broken = "broken3" + _floor_broken = "broken3" /turf/floor/plating/broken/four - _floor_broken = "broken4" + _floor_broken = "broken4" diff --git a/code/game/turfs/floors/subtypes/floor_natural.dm b/code/game/turfs/floors/subtypes/floor_natural.dm index 5851afd8ab9c..f265dea98b1f 100644 --- a/code/game/turfs/floors/subtypes/floor_natural.dm +++ b/code/game/turfs/floors/subtypes/floor_natural.dm @@ -1,104 +1,116 @@ /turf/floor/barren - name = "ground" - icon = 'icons/turf/flooring/barren.dmi' - icon_state = "barren" - _base_flooring = /decl/flooring/barren + name = "ground" + icon = 'icons/turf/flooring/barren.dmi' + icon_state = "barren" + _base_flooring = /decl/flooring/barren /turf/floor/dirt - name = "dirt" - icon = 'icons/turf/flooring/dirt.dmi' - icon_state = "dirt" - color = /decl/material/solid/soil::color // preview color - _base_flooring = /decl/flooring/dirt + name = "dirt" + icon = 'icons/turf/flooring/dirt.dmi' + icon_state = "dirt" + color = /decl/material/solid/soil::color // preview color + _base_flooring = /decl/flooring/dirt /turf/floor/chlorine_sand - name = "chlorinated sand" - icon = 'icons/turf/flooring/chlorine_sand.dmi' - icon_state = "chlorine0" - _base_flooring = /decl/flooring/sand/chlorine + name = "chlorinated sand" + icon = 'icons/turf/flooring/chlorine_sand.dmi' + icon_state = "chlorine0" + _base_flooring = /decl/flooring/sand/chlorine /turf/floor/chlorine_sand/marsh - name = "chlorine marsh" + name = "chlorine marsh" + _base_flooring = /decl/flooring/sand/chlorine/marsh + height = -(FLUID_SHALLOW) fill_reagent_type = /decl/material/gas/chlorine - _base_flooring = /decl/flooring/sand/chlorine/marsh - height = -(FLUID_SHALLOW) /turf/floor/lava - name = "lava" - icon = 'icons/turf/flooring/lava.dmi' - icon_state = "lava" - _base_flooring = /decl/flooring/lava + name = "lava" + icon = 'icons/turf/flooring/lava.dmi' + icon_state = "lava" + _base_flooring = /decl/flooring/lava /turf/floor/grass - name = "grass" - icon = 'icons/turf/flooring/grass.dmi' - icon_state = "grass0" - color = "#5e7a3b" - _flooring = /decl/flooring/grass - _base_flooring = /decl/flooring/dirt + name = "grass" + icon = 'icons/turf/flooring/grass.dmi' + icon_state = "grass0" + color = "#5e7a3b" + _flooring = /decl/flooring/grass + _base_flooring = /decl/flooring/dirt + +/turf/floor/grass/snow + name = "snow" + icon = 'icons/turf/flooring/snow.dmi' + icon_state = "snow0" + _flooring = list( + /decl/flooring/grass, + /decl/flooring/snow + ) /turf/floor/grass/wild - name = "wild grass" - icon = 'icons/turf/flooring/wildgrass.dmi' - icon_state = "wildgrass" - _flooring = /decl/flooring/grass/wild - _base_flooring = /decl/flooring/dirt + name = "wild grass" + icon = 'icons/turf/flooring/wildgrass.dmi' + icon_state = "wildgrass" + _flooring = list( + /decl/flooring/grass, + /decl/flooring/grass/wild + ) + _base_flooring = /decl/flooring/dirt /turf/floor/ice - name = "ice" - icon = 'icons/turf/flooring/ice.dmi' - icon_state = "ice" - color = COLOR_LIQUID_WATER - _flooring = /decl/flooring/ice - _base_flooring = /decl/flooring/dirt + name = "ice" + icon = 'icons/turf/flooring/ice.dmi' + icon_state = "ice" + color = COLOR_LIQUID_WATER + _flooring = /decl/flooring/ice + _base_flooring = /decl/flooring/dirt /turf/floor/snow - name = "snow" - icon = 'icons/turf/flooring/snow.dmi' - icon_state = "snow0" - _flooring = /decl/flooring/snow - _base_flooring = /decl/flooring/dirt + name = "snow" + icon = 'icons/turf/flooring/snow.dmi' + icon_state = "snow0" + _flooring = /decl/flooring/snow + _base_flooring = /decl/flooring/dirt /turf/floor/clay - name = "clay" - icon = 'icons/turf/flooring/clay.dmi' - icon_state = "clay" - _base_flooring = /decl/flooring/clay + name = "clay" + icon = 'icons/turf/flooring/clay.dmi' + icon_state = "clay" + _base_flooring = /decl/flooring/clay /turf/floor/clay/flooded - flooded = /decl/material/liquid/water + flooded = /decl/material/liquid/water /turf/floor/mud - name = "mud" - icon = 'icons/turf/flooring/mud.dmi' - icon_state = "mud" - color = /decl/material/solid/soil::color // preview color - _base_flooring = /decl/flooring/mud + name = "mud" + icon = 'icons/turf/flooring/mud.dmi' + icon_state = "mud" + color = /decl/material/solid/soil::color // preview color + _base_flooring = /decl/flooring/mud /turf/floor/mud/water - color = COLOR_SKY_BLUE + color = COLOR_SKY_BLUE + height = -(FLUID_SHALLOW) fill_reagent_type = /decl/material/liquid/water - height = -(FLUID_SHALLOW) /turf/floor/mud/water/deep - color = COLOR_BLUE - height = -(FLUID_DEEP) + color = COLOR_BLUE + height = -(FLUID_DEEP) /turf/floor/mud/flooded - flooded = /decl/material/liquid/water + flooded = /decl/material/liquid/water /turf/floor/dry - name = "dry mud" - icon = 'icons/turf/flooring/seafloor.dmi' - icon_state = "seafloor" - _base_flooring = /decl/flooring/dry_mud + name = "dry mud" + icon = 'icons/turf/flooring/seafloor.dmi' + icon_state = "seafloor" + _base_flooring = /decl/flooring/dry_mud /turf/floor/rock/sand - name = "sand" - icon = 'icons/turf/flooring/sand.dmi' - icon_state = "sand0" - color = "#ae9e66" - _flooring = /decl/flooring/sand + name = "sand" + icon = 'icons/turf/flooring/sand.dmi' + icon_state = "sand0" + color = "#ae9e66" + _flooring = /decl/flooring/sand /turf/floor/rock/basalt/sand name = "sand" @@ -108,30 +120,30 @@ _flooring = /decl/flooring/sand /turf/floor/rock/sand/water - color = COLOR_SKY_BLUE + color = COLOR_SKY_BLUE + height = -(FLUID_SHALLOW) fill_reagent_type = /decl/material/liquid/water - height = -(FLUID_SHALLOW) /turf/floor/rock/sand/water/deep - color = COLOR_BLUE - height = -(FLUID_DEEP) + color = COLOR_BLUE + height = -(FLUID_DEEP) /turf/floor/seafloor - name = "sea floor" - icon = 'icons/turf/flooring/seafloor.dmi' - icon_state = "seafloor" - _base_flooring = /decl/flooring/seafloor + name = "sea floor" + icon = 'icons/turf/flooring/seafloor.dmi' + icon_state = "seafloor" + _base_flooring = /decl/flooring/seafloor /turf/floor/seafloor/flooded - flooded = /decl/material/liquid/water - color = COLOR_LIQUID_WATER + flooded = /decl/material/liquid/water + color = COLOR_LIQUID_WATER /turf/floor/shrouded - name = "packed sand" - icon = 'icons/turf/flooring/shrouded.dmi' - icon_state = "shrouded0" - _base_flooring = /decl/flooring/shrouded + name = "packed sand" + icon = 'icons/turf/flooring/shrouded.dmi' + icon_state = "shrouded0" + _base_flooring = /decl/flooring/shrouded /turf/floor/shrouded/tar - height = -(FLUID_SHALLOW) + height = -(FLUID_SHALLOW) fill_reagent_type = /decl/material/liquid/tar diff --git a/code/game/turfs/floors/subtypes/floor_path.dm b/code/game/turfs/floors/subtypes/floor_path.dm index 8a984656793a..65e09e4733c7 100644 --- a/code/game/turfs/floors/subtypes/floor_path.dm +++ b/code/game/turfs/floors/subtypes/floor_path.dm @@ -1,14 +1,14 @@ /turf/floor/path - name = "path" - gender = NEUTER - desc = "A cobbled path made of loose stones." - color = COLOR_GRAY - icon = 'icons/turf/flooring/path.dmi' - icon_state = "cobble" - _flooring = /decl/flooring/path/cobblestone - floor_material = /decl/material/solid/stone/sandstone - _base_flooring = /decl/flooring/dirt + name = "path" + gender = NEUTER + desc = "A cobbled path made of loose stones." + color = COLOR_GRAY + icon = 'icons/turf/flooring/path.dmi' + icon_state = "cobble" + _flooring = /decl/flooring/path/cobblestone + floor_material = /decl/material/solid/stone/sandstone + _base_flooring = /decl/flooring/dirt /turf/floor/path/Initialize(mapload, no_update_icon) . = ..() @@ -28,12 +28,12 @@ LAZYADD(decals, moss) /turf/floor/path/running_bond - icon_state = "runningbond" - _flooring = /decl/flooring/path/running_bond + icon_state = "runningbond" + _flooring = /decl/flooring/path/running_bond /turf/floor/path/herringbone - icon_state = "herringbone" - _flooring = /decl/flooring/path/herringbone + icon_state = "herringbone" + _flooring = /decl/flooring/path/herringbone // Material subtypes. #define PATH_MATERIAL_SUBTYPES(material_name) \ diff --git a/code/game/turfs/floors/subtypes/floor_reinforced.dm b/code/game/turfs/floors/subtypes/floor_reinforced.dm index 60239d44d9cd..5ea377aa3961 100644 --- a/code/game/turfs/floors/subtypes/floor_reinforced.dm +++ b/code/game/turfs/floors/subtypes/floor_reinforced.dm @@ -1,14 +1,17 @@ /turf/floor/reinforced - name = "reinforced floor" - icon = 'icons/turf/flooring/tiles.dmi' - icon_state = "reinforced" - _flooring = /decl/flooring/reinforced + name = "reinforced floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "reinforced" + _flooring = /decl/flooring/reinforced /turf/floor/reinforced/airless initial_gas = null /turf/floor/reinforced/airmix - initial_gas = list(/decl/material/gas/oxygen = MOLES_O2ATMOS, /decl/material/gas/nitrogen = MOLES_N2ATMOS) + initial_gas = list( + /decl/material/gas/oxygen = MOLES_O2ATMOS, + /decl/material/gas/nitrogen = MOLES_N2ATMOS + ) /turf/floor/reinforced/nitrogen initial_gas = list(/decl/material/gas/nitrogen = ATMOSTANK_NITROGEN) @@ -20,7 +23,7 @@ initial_gas = list(/decl/material/gas/oxygen = ATMOSTANK_OXYGEN) /turf/floor/reinforced/nitrogen/engine - name = "engine floor" + name = "engine floor" initial_gas = list(/decl/material/gas/nitrogen = MOLES_N2STANDARD) /turf/floor/reinforced/hydrogen/fuel @@ -33,6 +36,6 @@ initial_gas = list(/decl/material/gas/nitrous_oxide = ATMOSTANK_NITROUSOXIDE) /turf/floor/reinforced/airless - name = "vacuum floor" + name = "vacuum floor" initial_gas = null temperature = TCMB diff --git a/code/game/turfs/floors/subtypes/floor_shuttle.dm b/code/game/turfs/floors/subtypes/floor_shuttle.dm index 10b72a1f1051..24c79df35f49 100644 --- a/code/game/turfs/floors/subtypes/floor_shuttle.dm +++ b/code/game/turfs/floors/subtypes/floor_shuttle.dm @@ -1,33 +1,33 @@ /turf/floor/shuttle - name = "shuttle floor" - icon = 'icons/turf/flooring/shuttle.dmi' - desc = "A synthetic floor plate commonly seen in shuttles and other vehicles." - _flooring = /decl/flooring/reinforced/shuttle + name = "shuttle floor" + icon = 'icons/turf/flooring/shuttle.dmi' + desc = "A synthetic floor plate commonly seen in shuttles and other vehicles." + _flooring = /decl/flooring/reinforced/shuttle /turf/floor/shuttle/blue icon_state = "floor" - _flooring = /decl/flooring/reinforced/shuttle/blue + _flooring = /decl/flooring/reinforced/shuttle/blue /turf/floor/shuttle/yellow icon_state = "floor2" - _flooring = /decl/flooring/reinforced/shuttle/yellow + _flooring = /decl/flooring/reinforced/shuttle/yellow /turf/floor/shuttle/white icon_state = "floor3" - _flooring = /decl/flooring/reinforced/shuttle/white + _flooring = /decl/flooring/reinforced/shuttle/white /turf/floor/shuttle/red icon_state = "floor4" - _flooring = /decl/flooring/reinforced/shuttle/red + _flooring = /decl/flooring/reinforced/shuttle/red /turf/floor/shuttle/purple icon_state = "floor5" - _flooring = /decl/flooring/reinforced/shuttle/purple + _flooring = /decl/flooring/reinforced/shuttle/purple /turf/floor/shuttle/darkred icon_state = "floor6" - _flooring = /decl/flooring/reinforced/shuttle/darkred + _flooring = /decl/flooring/reinforced/shuttle/darkred /turf/floor/shuttle/black icon_state = "floor7" - _flooring = /decl/flooring/reinforced/shuttle/black + _flooring = /decl/flooring/reinforced/shuttle/black diff --git a/code/game/turfs/floors/subtypes/floor_static.dm b/code/game/turfs/floors/subtypes/floor_static.dm index 47cf104cd6ad..e990493c61a4 100644 --- a/code/game/turfs/floors/subtypes/floor_static.dm +++ b/code/game/turfs/floors/subtypes/floor_static.dm @@ -2,12 +2,12 @@ // Use this to bypass the flooring system entirely ie. event areas, holodeck, etc. /turf/floor/fixed - name = "floor" - icon = 'icons/turf/flooring/tiles.dmi' - icon_state = "steel" - _flooring = null + name = "floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "steel" + _flooring = null footstep_type = /decl/footsteps/plating - is_outside = OUTSIDE_AREA + is_outside = OUTSIDE_AREA /turf/floor/fixed/attackby(var/obj/item/C, var/mob/user) if(istype(C, /obj/item/stack) && !IS_COIL(C)) @@ -24,10 +24,10 @@ return /turf/floor/fixed/alium - name = "alien plating" - desc = "This obviously wasn't made for your feet." - icon = 'icons/turf/flooring/alium.dmi' - icon_state = "jaggy" + name = "alien plating" + desc = "This obviously wasn't made for your feet." + icon = 'icons/turf/flooring/alium.dmi' + icon_state = "jaggy" /turf/floor/fixed/alium/attackby(var/obj/item/C, var/mob/user) if(IS_CROWBAR(C)) @@ -45,8 +45,8 @@ icon_state = "[style][(x*y) % 7]" /turf/floor/fixed/alium/airless - initial_gas = null - temperature = TCMB + initial_gas = null + temperature = TCMB /turf/floor/fixed/alium/explosion_act(severity) SHOULD_CALL_PARENT(FALSE) diff --git a/code/game/turfs/floors/subtypes/floor_tiled.dm b/code/game/turfs/floors/subtypes/floor_tiled.dm index b92260c905e4..33dc224c1966 100644 --- a/code/game/turfs/floors/subtypes/floor_tiled.dm +++ b/code/game/turfs/floors/subtypes/floor_tiled.dm @@ -1,117 +1,117 @@ //Tiled floor + sub-types /turf/floor/tiled - name = "floor" - icon = 'icons/turf/flooring/tiles.dmi' - icon_state = "tiled" - _flooring = /decl/flooring/tiling + name = "floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "tiled" + _flooring = /decl/flooring/tiling /turf/floor/tiled/dark - name = "dark floor" - icon_state = "dark" - _flooring = /decl/flooring/tiling/dark + name = "dark floor" + icon_state = "dark" + _flooring = /decl/flooring/tiling/dark /turf/floor/tiled/dark/monotile - name = "floor" - icon_state = "monotiledark" - _flooring = /decl/flooring/tiling/mono/dark + name = "floor" + icon_state = "monotiledark" + _flooring = /decl/flooring/tiling/mono/dark /turf/floor/tiled/dark/monotile/telecomms - name = "telecomms dark floor" // TODO: force name overriding flooring? - temperature = 263 + name = "telecomms dark floor" // TODO: force name overriding flooring? + temperature = 263 /turf/floor/tiled/dark/airless - initial_gas = null + initial_gas = null /turf/floor/tiled/white - name = "white floor" - icon_state = "white" - _flooring = /decl/flooring/tiling/white + name = "white floor" + icon_state = "white" + _flooring = /decl/flooring/tiling/white /turf/floor/tiled/white/monotile - name = "floor" - icon_state = "monotile" - _flooring = /decl/flooring/tiling/mono/white + name = "floor" + icon_state = "monotile" + _flooring = /decl/flooring/tiling/mono/white /turf/floor/tiled/monofloor - name = "floor" - icon_state = "steel_monofloor" - _flooring = /decl/flooring/tiling/mono + name = "floor" + icon_state = "steel_monofloor" + _flooring = /decl/flooring/tiling/mono /turf/floor/tiled/white/airless - name = "airless floor" - initial_gas = null - temperature = TCMB + name = "airless floor" + initial_gas = null + temperature = TCMB /turf/floor/tiled/freezer - name = "tiles" - icon_state = "freezer" - _flooring = /decl/flooring/tiling/freezer + name = "tiles" + icon_state = "freezer" + _flooring = /decl/flooring/tiling/freezer /turf/floor/tiled/freezer/kitchen - name = "kitchen freezer floor" // TODO: force override of flooring name - temperature = 263 + name = "kitchen freezer floor" // TODO: force override of flooring name + temperature = 263 /turf/floor/tiled/techmaint - name = "floor" - icon = 'icons/turf/flooring/tiles.dmi' - icon_state = "techmaint" - _flooring = /decl/flooring/tiling/new_tile/techmaint + name = "floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "techmaint" + _flooring = /decl/flooring/tiling/new_tile/techmaint /turf/floor/tiled/monofloor - name = "floor" - icon_state = "steel_monofloor" - _flooring = /decl/flooring/tiling/new_tile/monofloor + name = "floor" + icon_state = "steel_monofloor" + _flooring = /decl/flooring/tiling/new_tile/monofloor /turf/floor/tiled/techfloor - name = "floor" - icon = 'icons/turf/flooring/techfloor.dmi' - icon_state = "techfloor_gray" - _flooring = /decl/flooring/tiling/tech + name = "floor" + icon = 'icons/turf/flooring/techfloor.dmi' + icon_state = "techfloor_gray" + _flooring = /decl/flooring/tiling/tech /turf/floor/tiled/monotile - name = "floor" - icon_state = "steel_monotile" - _flooring = /decl/flooring/tiling/mono + name = "floor" + icon_state = "steel_monotile" + _flooring = /decl/flooring/tiling/mono /turf/floor/tiled/steel_grid - name = "floor" - icon_state = "steel_grid" - _flooring = /decl/flooring/tiling/new_tile/steel_grid + name = "floor" + icon_state = "steel_grid" + _flooring = /decl/flooring/tiling/new_tile/steel_grid /turf/floor/tiled/steel_ridged - name = "floor" - icon_state = "steel_ridged" - _flooring = /decl/flooring/tiling/new_tile/steel_ridged + name = "floor" + icon_state = "steel_ridged" + _flooring = /decl/flooring/tiling/new_tile/steel_ridged /turf/floor/tiled/old_tile - name = "floor" - icon_state = "tile_full" - _flooring = /decl/flooring/tiling/new_tile + name = "floor" + icon_state = "tile_full" + _flooring = /decl/flooring/tiling/new_tile /turf/floor/tiled/old_cargo - name = "floor" - icon_state = "cargo_one_full" - _flooring = /decl/flooring/tiling/new_tile/cargo_one + name = "floor" + icon_state = "cargo_one_full" + _flooring = /decl/flooring/tiling/new_tile/cargo_one /turf/floor/tiled/kafel_full - name = "floor" - icon_state = "kafel_full" - _flooring = /decl/flooring/tiling/new_tile/kafel + name = "floor" + icon_state = "kafel_full" + _flooring = /decl/flooring/tiling/new_tile/kafel /turf/floor/tiled/stone - name = "stone slab floor" - icon_state = "stone" - _flooring = /decl/flooring/tiling/stone + name = "stone slab floor" + icon_state = "stone" + _flooring = /decl/flooring/tiling/stone /turf/floor/tiled/techfloor/grid - name = "floor" - icon_state = "techfloor_grid" - _flooring = /decl/flooring/tiling/tech/grid + name = "floor" + icon_state = "techfloor_grid" + _flooring = /decl/flooring/tiling/tech/grid /turf/floor/tiled/airless - name = "airless floor" - initial_gas = null - temperature = TCMB + name = "airless floor" + initial_gas = null + temperature = TCMB /turf/floor/tiled/airless/broken _floor_broken = TRUE diff --git a/code/game/turfs/floors/subtypes/floor_wood.dm b/code/game/turfs/floors/subtypes/floor_wood.dm index eff98a2a1176..c2d1dcb87500 100644 --- a/code/game/turfs/floors/subtypes/floor_wood.dm +++ b/code/game/turfs/floors/subtypes/floor_wood.dm @@ -1,18 +1,18 @@ /turf/floor/wood - name = "wooden floor" - icon = 'icons/turf/flooring/wood.dmi' - icon_state = "wood0" - color = /decl/material/solid/organic/wood/oak::color - _flooring = /decl/flooring/wood + name = "wooden floor" + icon = 'icons/turf/flooring/wood.dmi' + icon_state = "wood0" + color = /decl/material/solid/organic/wood/oak::color + _flooring = /decl/flooring/wood #define WOOD_FLOOR_SUBTYPE(BASE, WOOD) \ /turf/floor/##BASE/##WOOD { \ - color = /decl/material/solid/organic/wood/##WOOD::color; \ - _flooring = /decl/flooring/##BASE/##WOOD; \ + color = /decl/material/solid/organic/wood/##WOOD::color; \ + _flooring = /decl/flooring/##BASE/##WOOD; \ } /turf/floor/wood/broken - icon_state = "wood_broken0" + icon_state = "wood_broken0" _floor_broken = TRUE /turf/floor/wood/broken/Initialize() @@ -22,19 +22,19 @@ set_floor_broken(setting_broken) /turf/floor/wood/broken/one - icon_state = "wood_broken1" + icon_state = "wood_broken1" _floor_broken = "broken1" /turf/floor/wood/broken/two - icon_state = "wood_broken2" + icon_state = "wood_broken2" _floor_broken = "broken2" /turf/floor/wood/broken/three - icon_state = "wood_broken3" + icon_state = "wood_broken3" _floor_broken = "broken3" /turf/floor/wood/broken/four - icon_state = "wood_broken4" + icon_state = "wood_broken4" _floor_broken = "broken4" WOOD_FLOOR_SUBTYPE(wood, mahogany) @@ -46,11 +46,11 @@ WOOD_FLOOR_SUBTYPE(wood, yew) // Rough wood floors; lower skill requirement, more wasteful to craft. /turf/floor/wood/rough - name = "rough-hewn wooden floor" - icon = 'icons/turf/flooring/wood_alt.dmi' - icon_state = "wood_peasant0" - color = /decl/material/solid/organic/wood/oak::color - _flooring = /decl/flooring/wood + name = "rough-hewn wooden floor" + icon = 'icons/turf/flooring/wood_alt.dmi' + icon_state = "wood_peasant0" + color = /decl/material/solid/organic/wood/oak::color + _flooring = /decl/flooring/wood WOOD_FLOOR_SUBTYPE(wood/rough, mahogany) WOOD_FLOOR_SUBTYPE(wood/rough, maple) @@ -61,14 +61,14 @@ WOOD_FLOOR_SUBTYPE(wood/rough, yew) // Laminate floor; basically identical to wood, but uses older smoother icons. /turf/floor/laminate - name = "wooden laminate floor" - icon = 'icons/turf/flooring/laminate.dmi' - icon_state = "wood" - color = /decl/material/solid/organic/wood/chipboard::color - _flooring = /decl/flooring/laminate + name = "wooden laminate floor" + icon = 'icons/turf/flooring/laminate.dmi' + icon_state = "wood" + color = /decl/material/solid/organic/wood/chipboard::color + _flooring = /decl/flooring/laminate /turf/floor/laminate/broken - icon_state = "wood_broken0" + icon_state = "wood_broken0" _floor_broken = TRUE /turf/floor/laminate/broken/Initialize() @@ -78,37 +78,37 @@ WOOD_FLOOR_SUBTYPE(wood/rough, yew) set_floor_broken(setting_broken) /turf/floor/laminate/broken/one - icon_state = "wood_broken1" + icon_state = "wood_broken1" _floor_broken = "broken1" /turf/floor/laminate/broken/two - icon_state = "wood_broken2" + icon_state = "wood_broken2" _floor_broken = "broken2" /turf/floor/laminate/broken/three - icon_state = "wood_broken3" + icon_state = "wood_broken3" _floor_broken = "broken3" /turf/floor/laminate/broken/four - icon_state = "wood_broken4" + icon_state = "wood_broken4" _floor_broken = "broken4" /turf/floor/laminate/mahogany - color = /decl/material/solid/organic/wood/chipboard/mahogany::color - _flooring = /decl/flooring/laminate/mahogany + color = /decl/material/solid/organic/wood/chipboard/mahogany::color + _flooring = /decl/flooring/laminate/mahogany /turf/floor/laminate/maple - color = /decl/material/solid/organic/wood/chipboard/maple::color - _flooring = /decl/flooring/laminate/maple + color = /decl/material/solid/organic/wood/chipboard/maple::color + _flooring = /decl/flooring/laminate/maple /turf/floor/laminate/ebony - color = /decl/material/solid/organic/wood/chipboard/ebony::color - _flooring = /decl/flooring/laminate/ebony + color = /decl/material/solid/organic/wood/chipboard/ebony::color + _flooring = /decl/flooring/laminate/ebony /turf/floor/laminate/walnut - color = /decl/material/solid/organic/wood/chipboard/walnut::color - _flooring = /decl/flooring/laminate/walnut + color = /decl/material/solid/organic/wood/chipboard/walnut::color + _flooring = /decl/flooring/laminate/walnut /turf/floor/laminate/yew - color = /decl/material/solid/organic/wood/chipboard/yew::color - _flooring = /decl/flooring/laminate/yew + color = /decl/material/solid/organic/wood/chipboard/yew::color + _flooring = /decl/flooring/laminate/yew diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index 19db7607c2ec..a43c8994c4d4 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -207,6 +207,8 @@ // Unlint this to copy the actual raw vars. UNLINT(_flooring = other._flooring) + if(islist(_flooring)) + _flooring = _flooring.Copy() UNLINT(_base_flooring = other._base_flooring) set_floor_broken(other._floor_broken, TRUE) set_floor_burned(other._floor_burned) diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index e151a9bbbc48..7ff1626de489 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -14,103 +14,103 @@ // HOLOFLOOR DOES NOT GIVE A FUCK /turf/floor/holofloor/carpet - name = "brown carpet" - icon = 'icons/turf/flooring/carpet.dmi' - icon_state = "brown" - _flooring = /decl/flooring/carpet + name = "brown carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "brown" + _flooring = /decl/flooring/carpet /turf/floor/holofloor/concrete - name = "brown carpet" - icon = 'icons/turf/flooring/carpet.dmi' - icon_state = "brown" - _flooring = /decl/flooring/carpet + name = "brown carpet" + icon = 'icons/turf/flooring/carpet.dmi' + icon_state = "brown" + _flooring = /decl/flooring/carpet /turf/floor/holofloor/concrete - name = "floor" - icon = 'icons/turf/flooring/misc.dmi' - icon_state = "concrete" - _flooring = null + name = "floor" + icon = 'icons/turf/flooring/misc.dmi' + icon_state = "concrete" + _flooring = null /turf/floor/holofloor/tiled - name = "floor" - icon = 'icons/turf/flooring/tiles.dmi' - icon_state = "steel" - _flooring = /decl/flooring/tiling + name = "floor" + icon = 'icons/turf/flooring/tiles.dmi' + icon_state = "steel" + _flooring = /decl/flooring/tiling /turf/floor/holofloor/tiled/dark - name = "dark floor" - icon_state = "dark" - _flooring = /decl/flooring/tiling/dark + name = "dark floor" + icon_state = "dark" + _flooring = /decl/flooring/tiling/dark /turf/floor/holofloor/tiled/stone - name = "stone floor" - icon_state = "stone" - _flooring = /decl/flooring/tiling/stone + name = "stone floor" + icon_state = "stone" + _flooring = /decl/flooring/tiling/stone /turf/floor/holofloor/lino - name = "lino" - icon = 'icons/turf/flooring/linoleum.dmi' - icon_state = "lino" - _flooring = /decl/flooring/linoleum + name = "lino" + icon = 'icons/turf/flooring/linoleum.dmi' + icon_state = "lino" + _flooring = /decl/flooring/linoleum /turf/floor/holofloor/wood - name = "wooden floor" - icon = 'icons/turf/flooring/wood.dmi' - icon_state = "wood0" - color = WOOD_COLOR_CHOCOLATE - _flooring = /decl/flooring/wood + name = "wooden floor" + icon = 'icons/turf/flooring/wood.dmi' + icon_state = "wood0" + color = WOOD_COLOR_CHOCOLATE + _flooring = /decl/flooring/wood /turf/floor/holofloor/grass - name = "lush grass" - icon = 'icons/turf/flooring/fakegrass.dmi' - icon_state = "grass0" - _flooring = /decl/flooring/grass/fake + name = "lush grass" + icon = 'icons/turf/flooring/fakegrass.dmi' + icon_state = "grass0" + _flooring = /decl/flooring/grass/fake /turf/floor/holofloor/snow - name = "snow" - icon = 'icons/turf/flooring/snow.dmi' - icon_state = "snow0" - _flooring = /decl/flooring/snow/fake + name = "snow" + icon = 'icons/turf/flooring/snow.dmi' + icon_state = "snow0" + _flooring = /decl/flooring/snow/fake /turf/floor/holofloor/space - name = "\proper space" - icon = 'icons/turf/flooring/fake_space.dmi' - icon_state = "space0" - _flooring = /decl/flooring/fake_space + name = "\proper space" + icon = 'icons/turf/flooring/fake_space.dmi' + icon_state = "space0" + _flooring = /decl/flooring/fake_space /turf/floor/holofloor/reinforced - icon = 'icons/turf/flooring/tiles.dmi' - _flooring = /decl/flooring/reinforced - name = "reinforced holofloor" - icon_state = "reinforced" + name = "reinforced holofloor" + icon = 'icons/turf/flooring/tiles.dmi' + _flooring = /decl/flooring/reinforced + icon_state = "reinforced" /turf/floor/holofloor/beach - desc = "Uncomfortably gritty for a hologram." - icon = 'icons/misc/beach.dmi' - _flooring = /decl/flooring/sand/fake + desc = "Uncomfortably gritty for a hologram." + icon = 'icons/misc/beach.dmi' + _flooring = /decl/flooring/sand/fake abstract_type = /turf/floor/holofloor/beach /turf/floor/holofloor/beach/sand - name = "sand" - icon_state = "desert0" + name = "sand" + icon_state = "desert0" /turf/floor/holofloor/beach/coastline - name = "coastline" - icon = 'icons/misc/beach2.dmi' - icon_state = "sandwater" - _flooring = /decl/flooring/sand/fake + name = "coastline" + icon = 'icons/misc/beach2.dmi' + icon_state = "sandwater" + _flooring = /decl/flooring/sand/fake /turf/floor/holofloor/beach/water - name = "water" - icon_state = "seashallow" - _flooring = /decl/flooring/fake_water + name = "water" + icon_state = "seashallow" + _flooring = /decl/flooring/fake_water /turf/floor/holofloor/desert - name = "desert sand" - desc = "Uncomfortably gritty for a hologram." - icon_state = "barren" - icon = 'icons/turf/flooring/barren.dmi' - _flooring = /decl/flooring/sand/fake + name = "desert sand" + desc = "Uncomfortably gritty for a hologram." + icon = 'icons/turf/flooring/barren.dmi' + icon_state = "barren" + _flooring = /decl/flooring/sand/fake /turf/floor/holofloor/desert/Initialize(var/ml) . = ..() @@ -118,19 +118,19 @@ LAZYADD(decals, image('icons/turf/flooring/decals.dmi', "asteroid[rand(0,9)]")) /obj/structure/holostool - name = "stool" - desc = "Apply butt." - icon = 'icons/obj/furniture.dmi' - icon_state = "stool_padded_preview" - anchored = TRUE + name = "stool" + desc = "Apply butt." + icon = 'icons/obj/furniture.dmi' + icon_state = "stool_padded_preview" + anchored = TRUE /obj/item/clothing/gloves/boxing/hologlove - name = "boxing gloves" - desc = "Because you really needed another excuse to punch your crewmates." + name = "boxing gloves" + desc = "Because you really needed another excuse to punch your crewmates." /obj/structure/window/reinforced/holowindow/full - dir = NORTHEAST - icon_state = "rwindow_full" + dir = NORTHEAST + icon_state = "rwindow_full" /obj/structure/window/reinforced/holowindow/attackby(obj/item/weapon, mob/user) if(IS_SCREWDRIVER(weapon) || IS_CROWBAR(weapon) || IS_WRENCH(weapon)) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 7f0e4f675410..5f924e281515 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -165,7 +165,7 @@ anchored = TRUE if(do_after(src, 50, F)) if(F.is_floor_damaged()) - F.set_flooring(null) + F.remove_flooring(F.get_topmost_flooring()) anchored = FALSE target = null busy = 0 diff --git a/code/unit_tests/turf_icons.dm b/code/unit_tests/turf_icons.dm index 3319864ee2a7..8ee6c20e0d5c 100644 --- a/code/unit_tests/turf_icons.dm +++ b/code/unit_tests/turf_icons.dm @@ -188,9 +188,10 @@ // Procs used for validation below. /turf/floor/validate_turf() . = ..() + if(!istype(_base_flooring)) . += "null or invalid _base_flooring ([_base_flooring || "NULL"])" - if(_flooring && !istype(_flooring)) + if(_flooring && !islist(_flooring) && !istype(_flooring, /decl/flooring)) . += "invalid post-init type for _flooring ([_flooring || "NULL"])" var/decl/flooring/check_flooring = get_topmost_flooring() diff --git a/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm index 2611fe47b348..7d554d6fc8a4 100644 --- a/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm +++ b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm @@ -1,10 +1,10 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( -/turf/floor/fake_grass, +/turf/floor/grass, /area/fantasy/outside/point_of_interest/fairy_ring) "w" = ( /obj/structure/flora/plant/random_mushroom, -/turf/floor/fake_grass, +/turf/floor/grass, /area/fantasy/outside/point_of_interest/fairy_ring) "D" = ( /turf/floor/grass/wild, diff --git a/mods/content/psionics/system/psionics/null/turf_floor.dm b/mods/content/psionics/system/psionics/null/turf_floor.dm index 4a470f77bdc6..f13498b21cc0 100644 --- a/mods/content/psionics/system/psionics/null/turf_floor.dm +++ b/mods/content/psionics/system/psionics/null/turf_floor.dm @@ -3,6 +3,6 @@ return (flooring && flooring.is_psi_null()) ? src : ..() /turf/floor/tiled/nullglass - name = "nullglass floor" + name = "nullglass floor" icon_state = "nullglass" - _flooring = /decl/flooring/tiling/nullglass + _flooring = /decl/flooring/tiling/nullglass diff --git a/mods/gamemodes/cult/cultify/turf.dm b/mods/gamemodes/cult/cultify/turf.dm index 4e7669850ec9..77d554cbcea2 100644 --- a/mods/gamemodes/cult/cultify/turf.dm +++ b/mods/gamemodes/cult/cultify/turf.dm @@ -17,10 +17,10 @@ return ..() /turf/floor/cult - name = "engraved floor" - icon = 'icons/turf/flooring/cult.dmi' - icon_state = "cult" - _flooring = /decl/flooring/reinforced/cult + name = "engraved floor" + icon = 'icons/turf/flooring/cult.dmi' + icon_state = "cult" + _flooring = /decl/flooring/reinforced/cult /turf/wall/on_defilement() var/new_material @@ -38,12 +38,12 @@ //Cult wall /turf/wall/cult - icon_state = "cult" - color = COLOR_RED_GRAY - material = /decl/material/solid/stone/cult + icon_state = "cult" + color = COLOR_RED_GRAY + material = /decl/material/solid/stone/cult /turf/wall/cult/reinf - icon_state = "reinforced_cult" + icon_state = "reinforced_cult" reinf_material = /decl/material/solid/stone/cult/reinforced /turf/wall/cult/dismantle_turf(devastated, explode, no_product, keep_air = TRUE) diff --git a/mods/species/ascent/turfs/ship.dm b/mods/species/ascent/turfs/ship.dm index 1886013ae555..e62ba1cbab16 100644 --- a/mods/species/ascent/turfs/ship.dm +++ b/mods/species/ascent/turfs/ship.dm @@ -17,40 +17,46 @@ broken_states = null /turf/wall/ascent - color = COLOR_PURPLE + color = COLOR_PURPLE /turf/wall/ascent/on_update_icon() . = ..() - color = COLOR_PURPLE + color = COLOR_PURPLE /turf/wall/r_wall/ascent - color = COLOR_PURPLE + color = COLOR_PURPLE /turf/wall/r_wall/ascent/on_update_icon() . = ..() - color = COLOR_PURPLE + color = COLOR_PURPLE /turf/floor/shuttle_ceiling/ascent - color = COLOR_PURPLE - icon_state = "jaggy" - icon = 'icons/turf/flooring/alium.dmi' + color = COLOR_PURPLE + icon_state = "jaggy" + icon = 'icons/turf/flooring/alium.dmi' /turf/floor/ascent - name = "mantid plating" - color = COLOR_GRAY20 - initial_gas = list(/decl/material/gas/methyl_bromide = MOLES_CELLSTANDARD * 0.5, /decl/material/gas/oxygen = MOLES_CELLSTANDARD * 0.5) + name = "mantid plating" + color = COLOR_GRAY20 _base_flooring = /decl/flooring/plating/ascent - icon_state = "curvy" - icon = 'icons/turf/flooring/alium.dmi' + icon_state = "curvy" + icon = 'icons/turf/flooring/alium.dmi' + initial_gas = list( + /decl/material/gas/methyl_bromide = MOLES_CELLSTANDARD * 0.5, + /decl/material/gas/oxygen = MOLES_CELLSTANDARD * 0.5 + ) /turf/floor/ascent/Initialize() . = ..() - icon_state = "curvy[rand(0,6)]" + icon_state = "curvy[rand(0,6)]" /turf/floor/tiled/ascent - name = "mantid tiling" - icon_state = "jaggy" - icon = 'icons/turf/flooring/alium.dmi' - color = COLOR_GRAY40 - initial_gas = list(/decl/material/gas/methyl_bromide = MOLES_CELLSTANDARD * 0.5, /decl/material/gas/oxygen = MOLES_CELLSTANDARD * 0.5) - _flooring = /decl/flooring/tiling_ascent + name = "mantid tiling" + icon = 'icons/turf/flooring/alium.dmi' + icon_state = "jaggy" + color = COLOR_GRAY40 + _flooring = /decl/flooring/tiling_ascent + initial_gas = list( + /decl/material/gas/methyl_bromide = MOLES_CELLSTANDARD * 0.5, + /decl/material/gas/oxygen = MOLES_CELLSTANDARD * 0.5 + ) diff --git a/mods/species/skrell/turfs/flooring.dm b/mods/species/skrell/turfs/flooring.dm index 255c64ebb71b..8ddfdf54d665 100644 --- a/mods/species/skrell/turfs/flooring.dm +++ b/mods/species/skrell/turfs/flooring.dm @@ -1,33 +1,33 @@ /turf/floor/tiled/skrell - icon = 'mods/species/skrell/icons/turf/skrellturf.dmi' + icon = 'mods/species/skrell/icons/turf/skrellturf.dmi' icon_state = "skrellblack" - _flooring = /decl/flooring/reinforced/shuttle/skrell + _flooring = /decl/flooring/reinforced/shuttle/skrell /turf/floor/tiled/skrell/white icon_state = "skrellwhite" - _flooring = /decl/flooring/reinforced/shuttle/skrell/white + _flooring = /decl/flooring/reinforced/shuttle/skrell/white /turf/floor/tiled/skrell/red icon_state = "skrellred" - _flooring = /decl/flooring/reinforced/shuttle/skrell/red + _flooring = /decl/flooring/reinforced/shuttle/skrell/red /turf/floor/tiled/skrell/blue icon_state = "skrellblue" - _flooring = /decl/flooring/reinforced/shuttle/skrell/blue + _flooring = /decl/flooring/reinforced/shuttle/skrell/blue /turf/floor/tiled/skrell/orange icon_state = "skrellorange" - _flooring = /decl/flooring/reinforced/shuttle/skrell/orange + _flooring = /decl/flooring/reinforced/shuttle/skrell/orange /turf/floor/tiled/skrell/green icon_state = "skrellgreen" - _flooring = /decl/flooring/reinforced/shuttle/skrell/green + _flooring = /decl/flooring/reinforced/shuttle/skrell/green ///////////////////////////////////////////////////////////////////////// /decl/flooring/reinforced/shuttle/skrell - icon = 'mods/species/skrell/icons/turf/skrellturf.dmi' - icon_base = "skrellblack" + icon = 'mods/species/skrell/icons/turf/skrellturf.dmi' + icon_base = "skrellblack" /decl/flooring/reinforced/shuttle/skrell/white icon_base = "skrellwhite" @@ -42,4 +42,4 @@ icon_base = "skrellorange" /decl/flooring/reinforced/shuttle/skrell/green - icon_base = "skrellgreen" \ No newline at end of file + icon_base = "skrellgreen" diff --git a/nebula.dme b/nebula.dme index 5519d2e270c7..9c2daf6c6355 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1590,6 +1590,7 @@ #include "code\game\turfs\floors\floor_digging.dm" #include "code\game\turfs\floors\floor_height.dm" #include "code\game\turfs\floors\floor_icon.dm" +#include "code\game\turfs\floors\floor_layers.dm" #include "code\game\turfs\floors\floor_materials.dm" #include "code\game\turfs\floors\subtypes\floor_carpet.dm" #include "code\game\turfs\floors\subtypes\floor_circuit.dm" From 8d951137c982b17a234d9170b1deb2cf52156687 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 5 Feb 2025 20:11:58 -0500 Subject: [PATCH 18/54] Fix oversights in map migrations --- tools/map_migrations/4344_soup.txt | 14 ++++++++++++++ tools/map_migrations/4533_animal_cubes.txt | 2 +- tools/map_migrations/4535_rations_crate.txt | 1 + tools/map_migrations/4647_dirt.txt | 2 +- tools/map_migrations/4740_sulphur_sulfur.txt | 1 + tools/map_migrations/4790_shuttle_ceilings.txt | 1 + 6 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 tools/map_migrations/4344_soup.txt create mode 100644 tools/map_migrations/4535_rations_crate.txt create mode 100644 tools/map_migrations/4740_sulphur_sulfur.txt create mode 100644 tools/map_migrations/4790_shuttle_ceilings.txt diff --git a/tools/map_migrations/4344_soup.txt b/tools/map_migrations/4344_soup.txt new file mode 100644 index 000000000000..2c04d0126bc0 --- /dev/null +++ b/tools/map_migrations/4344_soup.txt @@ -0,0 +1,14 @@ +/obj/item/food/beetsoup : /obj/item/chems/glass/bowl/mapped/beet{@OLD} +/obj/item/food/bloodsoup : /obj/item/chems/glass/bowl/mapped/blood{@OLD} +/obj/item/food/meatballsoup : /obj/item/chems/glass/bowl/mapped/meatball{@OLD} +/obj/item/food/milosoup : /obj/item/chems/glass/bowl/mapped/meatball{@OLD} +/obj/item/food/mushroomsoup : /obj/item/chems/glass/bowl/mapped/mushroom{@OLD} +/obj/item/food/vegetablesoup : /obj/item/chems/glass/bowl/mapped/vegetable{@OLD} +/obj/item/food/tomatosoup : /obj/item/chems/glass/bowl/mapped/tomato{@OLD} +/obj/item/food/nettlesoup : /obj/item/chems/glass/bowl/mapped/nettle{@OLD} +/obj/item/food/stew : /obj/item/chems/glass/bowl/mapped/stew{@OLD} +/obj/item/food/hotchili : /obj/item/chems/glass/bowl/mapped/chili/hot{@OLD} +/obj/item/food/coldchili : /obj/item/chems/glass/bowl/mapped/chili/cold{@OLD} +/obj/item/food/katsucurry : /obj/item/chems/glass/bowl/mapped/curry/katsu{@OLD} + +/obj/item/food/mysterysoup : /obj/item/chems/glass/bowl/mystery{@OLD} \ No newline at end of file diff --git a/tools/map_migrations/4533_animal_cubes.txt b/tools/map_migrations/4533_animal_cubes.txt index d1572223795f..1a3a15a3b76f 100644 --- a/tools/map_migrations/4533_animal_cubes.txt +++ b/tools/map_migrations/4533_animal_cubes.txt @@ -1,5 +1,5 @@ /obj/item/box/monkeycubes/spidercubes/@SUBTYPES : /obj/item/box/animal_cubes/spiders/@SUBTYPES{@OLD} -/obj/item/box/monkeycubes/@SUBTYPES : /obj/item/box/animal_cubes/monkey/@SUBTYPES{@OLD} +/obj/item/box/monkeycubes/@SUBTYPES : /obj/item/box/animal_cubes/monkeys/@SUBTYPES{@OLD} /obj/item/food/monkeycube/wrapped/spidercube/@SUBTYPES : /obj/item/food/animal_cube/wrapped/spider/@SUBTYPES{@OLD} /obj/item/food/monkeycube/spidercube/@SUBTYPES : /obj/item/food/animal_cube/spider/@SUBTYPES{@OLD} /obj/item/food/monkeycube/wrapped/@SUBTYPES : /obj/item/food/animal_cube/wrapped/monkey/@SUBTYPES{@OLD} diff --git a/tools/map_migrations/4535_rations_crate.txt b/tools/map_migrations/4535_rations_crate.txt new file mode 100644 index 000000000000..addcc538ebd7 --- /dev/null +++ b/tools/map_migrations/4535_rations_crate.txt @@ -0,0 +1 @@ +/obj/structure/closet/crate/freezer/rations : /obj/structure/closet/crate/plastic/rations{@OLD} \ No newline at end of file diff --git a/tools/map_migrations/4647_dirt.txt b/tools/map_migrations/4647_dirt.txt index 262db2c52ce3..fde23f21533c 100644 --- a/tools/map_migrations/4647_dirt.txt +++ b/tools/map_migrations/4647_dirt.txt @@ -1,2 +1,2 @@ -/obj/effect/decal/cleanable/dirt/@SUBTYPES : /obj/effect/decal/cleanable/dirt/visible/@SUBTYPES{@OLD} +/obj/effect/decal/cleanable/dirt : /obj/effect/decal/cleanable/dirt/visible{@OLD} diff --git a/tools/map_migrations/4740_sulphur_sulfur.txt b/tools/map_migrations/4740_sulphur_sulfur.txt new file mode 100644 index 000000000000..20cc37ab7457 --- /dev/null +++ b/tools/map_migrations/4740_sulphur_sulfur.txt @@ -0,0 +1 @@ +/obj/item/chems/glass/beaker/sulphuric/@SUBTYPES : /obj/item/chems/glass/beaker/sulfuric/@SUBTYPES{@OLD} \ No newline at end of file diff --git a/tools/map_migrations/4790_shuttle_ceilings.txt b/tools/map_migrations/4790_shuttle_ceilings.txt new file mode 100644 index 000000000000..083b1b9f32d6 --- /dev/null +++ b/tools/map_migrations/4790_shuttle_ceilings.txt @@ -0,0 +1 @@ +/turf/unsimulated/floor/shuttle_ceiling : /turf/floor/shuttle_ceiling{@OLD} \ No newline at end of file From 65bae3773d188e30b18acb9948e96a3743453aa0 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sat, 8 Feb 2025 00:48:09 +0000 Subject: [PATCH 19/54] Automatic changelog generation [ci skip] --- html/changelog.html | 6 ------ 1 file changed, 6 deletions(-) diff --git a/html/changelog.html b/html/changelog.html index 0ecd632b9e44..e8361317d54b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -128,12 +128,6 @@

    Penelope Haze updated:

    • Makes weather effects slightly more transparent.
    - -

    07 December 2024

    -

    MistakeNot4892 updated:

    -
      -
    • Most wooden floors and tables on space maps are now chipboard laminate instead.
    • -
From d21758dc479c1c048ae8727366532ced8fab51bb Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 8 Feb 2025 20:50:50 +1100 Subject: [PATCH 20/54] Fixing drones/robots/bots spawning meat when gibbed. --- code/modules/mob/living/bot/bot.dm | 3 +++ code/modules/mob/living/human/human.dm | 10 ++++++++++ code/modules/mob/living/silicon/silicon.dm | 2 ++ .../living/simple_animal/hostile/bad_drone.dm | 6 +++++- .../simple_animal/hostile/retaliate/drone.dm | 3 +++ code/modules/mob/mob.dm | 3 +++ code/modules/mob/mob_helpers.dm | 16 ---------------- 7 files changed, 26 insertions(+), 17 deletions(-) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 933e58b3afbb..3676b16c4004 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -38,6 +38,9 @@ layer = HIDING_MOB_LAYER +/mob/living/bot/isSynthetic() + return TRUE + /mob/living/bot/Initialize() . = ..() update_icon() diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 5f1ec5dc359f..4936094e5b04 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -1174,3 +1174,13 @@ /mob/living/human/get_attack_telegraph_delay() return client ? 0 : DEFAULT_ATTACK_COOLDOWN + +/mob/living/human/isSynthetic() + if(isnull(full_prosthetic)) + robolimb_count = 0 + var/list/limbs = get_external_organs() + for(var/obj/item/organ/external/E in limbs) + if(BP_IS_PROSTHETIC(E)) + robolimb_count++ + full_prosthetic = robolimb_count > 0 && (robolimb_count == LAZYLEN(limbs)) //If no organs, no way to tell + return full_prosthetic diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 7ad7fb9b96fb..4eef94b03615 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -461,3 +461,5 @@ stance_damage = 0 return +/mob/living/silicon/isSynthetic() + return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm index e87d75f9e444..c18ea28f6984 100644 --- a/code/modules/mob/living/simple_animal/hostile/bad_drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/bad_drone.dm @@ -12,6 +12,7 @@ mob_size = MOB_SIZE_TINY gene_damage = -1 attack_delay = DEFAULT_QUICK_COOLDOWN + butchery_data = /decl/butchery_data/synthetic ai = /datum/mob_controller/aggressive/rogue_drone var/corpse = /obj/effect/decal/cleanable/blood/gibs/robot @@ -43,4 +44,7 @@ if(. && !gibbed) if(corpse) new corpse (loc) - qdel(src) \ No newline at end of file + qdel(src) + +/mob/living/simple_animal/hostile/rogue_drone/isSynthetic() + return TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 072c2951071f..17f21fcf27a2 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -258,6 +258,9 @@ C.origin_tech = @'{"[TECH_ESOTERIC]":[rand(3, 6)]}' return ..() +/mob/living/simple_animal/hostile/malf_drone/isSynthetic() + return TRUE + /obj/item/projectile/beam/drone damage = 15 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 854b125787fe..bc565d7b0193 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1488,3 +1488,6 @@ /mob/proc/has_magnetised_footing() var/obj/item/shoes = get_equipped_item(slot_shoes_str) return istype(shoes) && (shoes.item_flags & ITEM_FLAG_MAGNETISED) + +/mob/proc/isSynthetic() + return FALSE diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 5fb27df3f1d2..727b13160819 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -8,22 +8,6 @@ /proc/mob_size_difference(var/mob_size_A, var/mob_size_B) return round(log(2, mob_size_A/mob_size_B), 1) -/mob/proc/isSynthetic() - return 0 - -/mob/living/human/isSynthetic() - if(isnull(full_prosthetic)) - robolimb_count = 0 - var/list/limbs = get_external_organs() - for(var/obj/item/organ/external/E in limbs) - if(BP_IS_PROSTHETIC(E)) - robolimb_count++ - full_prosthetic = robolimb_count > 0 && (robolimb_count == LAZYLEN(limbs)) //If no organs, no way to tell - return full_prosthetic - -/mob/living/silicon/isSynthetic() - return 1 - /mob/proc/isMonkey() return 0 From 0872878bbd38b1b566f482a2f605fe548c385bda Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 8 Feb 2025 20:59:51 +1100 Subject: [PATCH 21/54] Cleans up bot card and access on Destroy()/gib() --- code/modules/mob/living/bot/bot.dm | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 3676b16c4004..75a92f0e0570 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -15,6 +15,7 @@ var/light_strength = 3 var/busy = 0 + // Dummy object used to hold bot access strings. TODO: just put it on the mob. var/obj/access_scanner = null var/list/req_access = list() @@ -38,9 +39,6 @@ layer = HIDING_MOB_LAYER -/mob/living/bot/isSynthetic() - return TRUE - /mob/living/bot/Initialize() . = ..() update_icon() @@ -442,3 +440,17 @@ . = ..() if(istype(botcard) && !is_type_in_list(botcard, exceptions)) LAZYDISTINCTADD(., botcard) + +// We don't want to drop these on gib(). +/mob/living/bot/physically_destroyed(skip_qdel) + QDEL_NULL(botcard) + QDEL_NULL(access_scanner) + return ..() + +/mob/living/bot/Destroy() + QDEL_NULL(botcard) + QDEL_NULL(access_scanner) + return ..() + +/mob/living/bot/isSynthetic() + return TRUE From 48ea68547e28837407a003604a6242369692997a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 10 Feb 2025 00:03:44 +1100 Subject: [PATCH 22/54] Tweaks/fixes to welder pack refuelling. --- .../objects/items/weapons/weldbackpack.dm | 74 +++++++++++++------ code/modules/reagents/reagent_dispenser.dm | 24 +++--- 2 files changed, 65 insertions(+), 33 deletions(-) diff --git a/code/game/objects/items/weapons/weldbackpack.dm b/code/game/objects/items/weapons/weldbackpack.dm index fe4bfd67ad24..368be1abdd2c 100644 --- a/code/game/objects/items/weapons/weldbackpack.dm +++ b/code/game/objects/items/weapons/weldbackpack.dm @@ -62,15 +62,35 @@ //Welder Pack //////////////////////////////////////////////////////////// /obj/item/chems/weldpack - name = "welding kit" - desc = "An unwieldy, heavy backpack with two massive fuel tanks. Comes with an attached welder gun." - icon = 'icons/obj/items/welderpack.dmi' - icon_state = ICON_STATE_WORLD - slot_flags = SLOT_BACK - w_class = ITEM_SIZE_HUGE - volume = 350 + name = "welding kit" + desc = "An unwieldy, heavy backpack with two massive fuel tanks. Comes with an attached welder gun." + icon = 'icons/obj/items/welderpack.dmi' + icon_state = ICON_STATE_WORLD + slot_flags = SLOT_BACK + w_class = ITEM_SIZE_HUGE + atom_flags = ATOM_FLAG_OPEN_CONTAINER + volume = 350 var/obj/item/weldingtool/weldpack/welder = /obj/item/weldingtool/weldpack +// Duplicated from welder tanks. +/obj/item/chems/weldpack/afterattack(obj/O, mob/user, proximity, click_parameters) + if (!ATOM_IS_OPEN_CONTAINER(src) || !proximity) + return + if(standard_dispenser_refill(user, O)) + return TRUE + if(standard_pour_into(user, O)) + return TRUE + if(handle_eaten_by_mob(user, O) != EATEN_INVALID) + return TRUE + if(user.a_intent == I_HURT) + if(standard_splash_mob(user, O)) + return TRUE + if(reagents && reagents.total_volume) + to_chat(user, SPAN_DANGER("You splash the contents of \the [src] onto \the [O].")) + reagents.splash(O, reagents.total_volume) + return TRUE + return ..() + /obj/item/chems/weldpack/populate_reagents() add_to_reagents(/decl/material/liquid/fuel, reagents.maximum_volume) @@ -85,31 +105,41 @@ QDEL_NULL(welder) . = ..() -/obj/item/chems/weldpack/attackby(obj/item/W, mob/user) - if(W.isflamesource() && get_fuel() && W.get_heat() >= 700 && prob(50)) +/obj/item/chems/weldpack/attackby(obj/item/used_item, mob/user) + + if(used_item.isflamesource() && get_fuel() && used_item.get_heat() >= 700 && prob(50)) playsound(src, 'sound/items/Welder2.ogg', 90, TRUE) try_detonate_reagents() log_and_message_admins("triggered a fueltank explosion.", user) return TRUE - if(IS_WELDER(W)) - var/obj/item/weldingtool/T = W - if(T.welding) - user.visible_message(SPAN_DANGER("\The [user] singes \his [src] with \his [W]!"), SPAN_DANGER("You singed your [src] with your [W]!")) - - if(W == welder) + if(IS_WELDER(used_item)) + var/obj/item/weldingtool/tool = used_item + if(tool.welding) + user.visible_message( + SPAN_DANGER("\The [user] singes \his [src] with \his [used_item]!"), + SPAN_DANGER("You singed your [src] with your [used_item]!") + ) + if(used_item == welder) return reattach_gun(user) - if(!T.tank) - to_chat(user, "\The [T] has no tank attached!") - reagents.trans_to_obj(T.tank, T.tank.reagents.maximum_volume) - to_chat(user, SPAN_NOTICE("You refuel \the [W].")) + if(!tool.tank) + to_chat(user, SPAN_WARNING("\The [tool] has no tank attached!")) + return TRUE + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty!")) + return TRUE + reagents.trans_to_obj(tool.tank, tool.tank.reagents.maximum_volume) + to_chat(user, SPAN_NOTICE("You refuel \the [used_item].")) playsound(src, 'sound/effects/refill.ogg', 50, TRUE, -6) return TRUE - else if(istype(W, /obj/item/chems/welder_tank)) - var/obj/item/chems/welder_tank/tank = W + else if(istype(used_item, /obj/item/chems/welder_tank)) + if(!reagents?.total_volume) + to_chat(user, SPAN_WARNING("\The [src] is empty!")) + return TRUE + var/obj/item/chems/welder_tank/tank = used_item reagents.trans_to_obj(tank, tank.reagents.maximum_volume) - to_chat(user, SPAN_NOTICE("You refuel \the [W].")) + to_chat(user, SPAN_NOTICE("You refuel \the [used_item].")) playsound(src, 'sound/effects/refill.ogg', 50, TRUE, -6) return TRUE diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 29069da55822..7acdde9dd4e6 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -185,26 +185,28 @@ update_icon() return TRUE -/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/W, mob/user) - add_fingerprint(user) - if(istype(W,/obj/item/assembly_holder)) +/obj/structure/reagent_dispensers/fueltank/attackby(obj/item/used_item, mob/user) + + if(istype(used_item, /obj/item/assembly_holder)) if (rig) to_chat(user, SPAN_WARNING("There is another device already in the way.")) return ..() - visible_message(SPAN_NOTICE("\The [user] begins rigging \the [W] to \the [src].")) - if(do_after(user, 20, src) && user.try_unequip(W, src)) - visible_message(SPAN_NOTICE("\The [user] rigs \the [W] to \the [src].")) - var/obj/item/assembly_holder/H = W + visible_message(SPAN_NOTICE("\The [user] begins rigging \the [used_item] to \the [src].")) + if(do_after(user, 20, src) && user.try_unequip(used_item, src)) + visible_message(SPAN_NOTICE("\The [user] rigs \the [used_item] to \the [src].")) + var/obj/item/assembly_holder/H = used_item if (istype(H.a_left,/obj/item/assembly/igniter) || istype(H.a_right,/obj/item/assembly/igniter)) log_and_message_admins("rigged a fuel tank for explosion at [loc.loc.name].") - rig = W + rig = used_item update_icon() return TRUE - if(W.isflamesource()) - log_and_message_admins("triggered a fuel tank explosion with \the [W].") - visible_message(SPAN_DANGER("\The [user] puts \the [W] to \the [src]!")) + + if(used_item.isflamesource()) + log_and_message_admins("triggered a fuel tank explosion with \the [used_item].") + visible_message(SPAN_DANGER("\The [user] puts \the [used_item] to \the [src]!")) try_detonate_reagents() return TRUE + . = ..() /obj/structure/reagent_dispensers/fueltank/on_update_icon() From d61b75f76f234221c43404007e757520b1fe21d0 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 3 Feb 2025 22:50:24 +1100 Subject: [PATCH 23/54] examine() -> get_examine_strings(), examined_by(). --- code/_onclick/click.dm | 2 +- code/_onclick/ghost.dm | 4 +- code/_onclick/hud/screen/_screen.dm | 2 +- code/_onclick/hud/screen/screen_intent.dm | 4 +- code/_onclick/hud/screen/screen_maneuver.dm | 11 +- .../extensions/assembly/assembly_damage.dm | 6 +- code/datums/uplink/services.dm | 8 +- code/datums/wires/wires.dm | 4 +- code/game/atoms.dm | 41 ++++-- code/game/atoms_movable_interactions.dm | 2 +- .../gamemodes/endgame/ftl_jump/ftl_jump.dm | 4 +- code/game/machinery/CableLayer.dm | 4 +- code/game/machinery/OpTable.dm | 4 +- code/game/machinery/Sleeper.dm | 14 +- .../machine_construction/airlock.dm | 2 +- .../machine_construction/default.dm | 2 +- .../machine_construction/wall_frame.dm | 2 +- .../machinery/_machines_base/machinery.dm | 40 +++--- .../stock_parts/_stock_parts.dm | 13 +- .../_machines_base/stock_parts/access_lock.dm | 6 +- .../_machines_base/stock_parts/item_holder.dm | 3 +- .../stock_parts/network_lock.dm | 4 +- code/game/machinery/alarm.dm | 4 +- code/game/machinery/atmoalter/meter.dm | 12 +- code/game/machinery/bodyscanner.dm | 4 +- code/game/machinery/camera/camera.dm | 4 +- code/game/machinery/cell_charger.dm | 6 +- code/game/machinery/computer/arcade_orion.dm | 11 +- code/game/machinery/computer/guestpass.dm | 8 +- code/game/machinery/cryopod.dm | 4 +- code/game/machinery/dehumidifier.dm | 8 +- code/game/machinery/doors/_door.dm | 14 +- code/game/machinery/doors/airlock.dm | 10 +- code/game/machinery/doors/airlock_control.dm | 16 +-- code/game/machinery/doors/blast_door.dm | 4 +- code/game/machinery/doors/braces.dm | 4 +- code/game/machinery/doors/firedoor.dm | 13 +- code/game/machinery/floorlayer.dm | 9 +- .../kitchen/cooking_machines/_cooker.dm | 6 +- code/game/machinery/kitchen/gibber.dm | 4 +- code/game/machinery/lightswitch.dm | 6 +- code/game/machinery/nuclear_bomb.dm | 5 +- code/game/machinery/oxygen_pump.dm | 6 +- code/game/machinery/pipe/construction.dm | 5 - code/game/machinery/pipe/pipelayer.dm | 4 +- code/game/machinery/recharger.dm | 11 +- code/game/machinery/rechargestation.dm | 6 +- code/game/machinery/self_destruct.dm | 8 +- code/game/machinery/slide_projector.dm | 4 +- code/game/machinery/spaceheater.dm | 9 +- code/game/machinery/status_display.dm | 6 +- code/game/machinery/teleporter.dm | 5 +- code/game/machinery/vitals_monitor.dm | 12 +- code/game/machinery/washing_machine.dm | 4 +- code/game/objects/__objs.dm | 6 +- .../effects/decals/Cleanable/humans.dm | 4 +- code/game/objects/items/__item.dm | 5 +- code/game/objects/items/_item_drying.dm | 2 +- code/game/objects/items/crutches.dm | 4 +- code/game/objects/items/cryobag.dm | 13 +- code/game/objects/items/devices/boombox.dm | 6 +- .../objects/items/devices/cable_painter.dm | 4 +- code/game/objects/items/devices/dociler.dm | 4 +- code/game/objects/items/devices/geiger.dm | 6 +- code/game/objects/items/devices/gps.dm | 4 +- .../game/objects/items/devices/holowarrant.dm | 10 +- .../objects/items/devices/lightreplacer.dm | 4 +- code/game/objects/items/devices/modkit.dm | 4 +- .../objects/items/devices/paint_sprayer.dm | 4 +- .../game/objects/items/devices/radio/radio.dm | 8 +- code/game/objects/items/devices/spy_bug.dm | 10 +- .../objects/items/devices/suit_cooling.dm | 15 +- .../items/devices/suit_sensor_jammer.dm | 7 +- .../objects/items/devices/taperecorder.dm | 10 +- code/game/objects/items/devices/tvcamera.dm | 8 +- code/game/objects/items/documents.dm | 4 +- .../game/objects/items/flame/flame_fuelled.dm | 14 +- .../objects/items/flashlights/_flashlight.dm | 4 +- code/game/objects/items/hourglass.dm | 4 +- code/game/objects/items/paintkit.dm | 8 +- code/game/objects/items/rescuebag.dm | 24 ++-- code/game/objects/items/spirit_board.dm | 6 +- .../items/stacks/medical/medical_bandage.dm | 4 +- code/game/objects/items/stacks/stack.dm | 8 +- code/game/objects/items/toys.dm | 10 +- code/game/objects/items/weapons/RCD.dm | 12 +- code/game/objects/items/weapons/RPD.dm | 4 +- code/game/objects/items/weapons/RSF.dm | 6 +- code/game/objects/items/weapons/broom.dm | 4 +- code/game/objects/items/weapons/cards_ids.dm | 19 +-- code/game/objects/items/weapons/defib.dm | 6 +- code/game/objects/items/weapons/ecigs.dm | 22 +-- .../objects/items/weapons/flamethrower.dm | 10 +- .../items/weapons/grenades/chem_grenade.dm | 4 +- .../objects/items/weapons/grenades/grenade.dm | 12 +- code/game/objects/items/weapons/handcuffs.dm | 4 +- .../objects/items/weapons/material/ashtray.dm | 10 +- .../objects/items/weapons/material/coins.dm | 4 +- .../objects/items/weapons/material/swiss.dm | 7 +- .../objects/items/weapons/material/urn.dm | 4 +- code/game/objects/items/weapons/mop.dm | 4 +- .../objects/items/weapons/secrets_disk.dm | 12 +- .../objects/items/weapons/storage/belt.dm | 2 +- .../items/weapons/storage/fancy/_fancy.dm | 4 +- .../items/weapons/storage/med_pouch.dm | 4 +- .../game/objects/items/weapons/storage/mre.dm | 5 +- .../items/weapons/storage/parachute.dm | 6 +- .../objects/items/weapons/storage/secure.dm | 5 +- code/game/objects/items/weapons/stunbaton.dm | 4 +- .../objects/items/weapons/tanks/jetpack.dm | 4 +- .../game/objects/items/weapons/tanks/tanks.dm | 9 +- code/game/objects/items/weapons/tape.dm | 4 +- code/game/objects/items/weapons/tech_disks.dm | 4 +- code/game/objects/items/weapons/towels.dm | 4 +- .../objects/items/welding/electric_welder.dm | 10 +- .../objects/items/welding/weldbackpack.dm | 4 +- .../game/objects/items/welding/weldingtool.dm | 8 +- .../objects/items/welding/weldingtool_tank.dm | 8 +- code/game/objects/structures/__structure.dm | 39 +++--- .../objects/structures/barrels/cask_rack.dm | 4 +- code/game/objects/structures/barsign.dm | 10 +- code/game/objects/structures/bedsheet_bin.dm | 8 +- code/game/objects/structures/coathanger.dm | 6 +- code/game/objects/structures/compost.dm | 16 +-- .../crates_lockers/closets/__closet.dm | 16 +-- .../crates_lockers/closets/coffin.dm | 4 +- .../structures/crates_lockers/crates.dm | 4 +- code/game/objects/structures/displaycase.dm | 6 +- code/game/objects/structures/door_assembly.dm | 20 +-- code/game/objects/structures/drain.dm | 8 +- code/game/objects/structures/drying_rack.dm | 4 +- code/game/objects/structures/fences.dm | 11 +- code/game/objects/structures/fires.dm | 14 +- code/game/objects/structures/flora/plant.dm | 6 +- .../objects/structures/grandfather_clock.dm | 4 +- code/game/objects/structures/inflatable.dm | 4 +- code/game/objects/structures/ironing_board.dm | 4 +- code/game/objects/structures/iv_drip.dm | 18 +-- code/game/objects/structures/janicart.dm | 10 +- code/game/objects/structures/memorial.dm | 5 +- code/game/objects/structures/mop_bucket.dm | 4 +- code/game/objects/structures/pit.dm | 12 +- code/game/objects/structures/signs/diploma.dm | 8 +- code/game/objects/structures/skele_stand.dm | 4 +- code/game/objects/structures/stasis_cage.dm | 4 +- code/game/objects/structures/tables.dm | 4 +- .../game/objects/structures/tank_dispenser.dm | 4 +- code/game/objects/structures/wall_frame.dm | 4 +- code/game/objects/structures/watercloset.dm | 8 +- code/game/objects/structures/window.dm | 16 +-- code/game/turfs/open/_open.dm | 4 +- code/game/turfs/turf.dm | 4 +- code/game/turfs/walls/_wall.dm | 18 ++- code/modules/assembly/assembly.dm | 6 +- code/modules/assembly/holder.dm | 6 +- code/modules/assembly/mousetrap.dm | 4 +- .../binary_devices/oxyregenerator.dm | 4 +- .../atmospherics/components/shutoff.dm | 4 +- .../components/unary/cold_sink.dm | 4 +- .../components/unary/heat_source.dm | 4 +- .../components/unary/vent_pump.dm | 8 +- .../components/unary/vent_scrubber.dm | 10 +- code/modules/atmospherics/components/valve.dm | 4 +- code/modules/augment/augment.dm | 10 +- code/modules/banners/__banner.dm | 4 +- .../brain_interface/_brain_interface.dm | 6 +- code/modules/butchery/butchery_products.dm | 8 +- code/modules/clothing/_clothing.dm | 30 ++-- code/modules/clothing/badges/_badge.dm | 4 +- code/modules/clothing/badges/holobadge.dm | 4 +- .../clothing/gloves/jewelry/rings/_ring.dm | 2 +- code/modules/clothing/masks/cig_crafting.dm | 5 +- code/modules/clothing/masks/gasmask.dm | 4 +- .../clothing/neck/necklace/__necklace.dm | 4 +- .../modules/clothing/sensors/vitals_sensor.dm | 10 +- code/modules/clothing/shoes/_shoes.dm | 8 +- code/modules/clothing/shoes/magboots.dm | 4 +- code/modules/clothing/spacesuits/breaches.dm | 4 +- .../spacesuits/rig/modules/modules.dm | 8 +- code/modules/clothing/spacesuits/rig/rig.dm | 16 +-- .../modules/clothing/spacesuits/spacesuits.dm | 4 +- code/modules/clothing/spacesuits/void/void.dm | 8 +- code/modules/clothing/webbing/holster.dm | 2 +- code/modules/codex/codex_atom.dm | 8 -- code/modules/codex/codex_cataloguer.dm | 4 +- .../crafting/slapcrafting/_crafting_holder.dm | 6 +- code/modules/detectivework/forensics.dm | 7 +- .../detectivework/tools/evidencebag.dm | 9 +- .../tools/sample_kits/_sample.dm | 4 +- code/modules/economy/worth_cash.dm | 8 +- code/modules/fabrication/_fabricator.dm | 4 +- code/modules/fishing/fishing_rod.dm | 6 +- code/modules/food/assembled.dm | 4 +- .../cooking_vessels/_cooking_vessel.dm | 8 +- code/modules/food/plates/plate_tray.dm | 6 +- code/modules/games/boardgame.dm | 2 +- code/modules/games/cards.dm | 12 +- .../goals/definitions/department_clerical.dm | 6 +- .../modules/hydroponics/beekeeping/beehive.dm | 4 +- code/modules/hydroponics/grown.dm | 6 +- code/modules/hydroponics/seed_packets.dm | 4 +- code/modules/hydroponics/trays/tray.dm | 26 ++-- .../integrated_electronics/core/assemblies.dm | 22 +-- .../core/integrated_circuit.dm | 2 +- .../integrated_electronics/subtypes/memory.dm | 4 +- code/modules/interactions/_interactions.dm | 2 +- code/modules/item_effects/item_effect_item.dm | 2 +- code/modules/locks/key.dm | 6 +- code/modules/locks/keyring.dm | 9 +- code/modules/locks/lock_construct.dm | 6 +- .../materials/material_stack_animal.dm | 8 +- code/modules/mechs/components/_components.dm | 8 +- code/modules/mechs/components/arms.dm | 2 +- code/modules/mechs/components/body.dm | 7 +- code/modules/mechs/components/frame.dm | 20 +-- code/modules/mechs/components/head.dm | 11 +- code/modules/mechs/components/legs.dm | 2 +- code/modules/mechs/equipment/_equipment.dm | 6 +- code/modules/mechs/equipment/utility.dm | 16 +-- code/modules/mechs/mech.dm | 18 ++- code/modules/mechs/mech_interaction.dm | 2 +- .../mining/machinery/material_extractor.dm | 10 +- code/modules/mining/ore_box.dm | 8 +- code/modules/mob/examine.dm | 28 ++-- code/modules/mob/grab/grab_object.dm | 6 +- code/modules/mob/living/bot/medibot.dm | 12 +- code/modules/mob/living/bot/remotebot.dm | 4 +- code/modules/mob/living/human/examine.dm | 129 +++++++++--------- code/modules/mob/living/human/human.dm | 4 +- code/modules/mob/living/living.dm | 20 ++- code/modules/mob/living/silicon/ai/examine.dm | 53 ++++--- .../modules/mob/living/silicon/pai/examine.dm | 29 ++-- .../living/silicon/robot/drone/drone_items.dm | 4 +- .../silicon/robot/drone/drone_manufacturer.dm | 4 +- .../mob/living/silicon/robot/examine.dm | 65 ++++----- .../mob/living/silicon/robot/robot_items.dm | 18 +-- .../simple_animal/friendly/farm_animals.dm | 30 ++-- code/modules/mob/mob.dm | 8 +- code/modules/mob/observer/eye/eye.dm | 4 +- .../computers/modular_computer/interaction.dm | 11 +- code/modules/multiz/zmimic/mimic_movable.dm | 12 +- code/modules/organs/external/_external.dm | 16 +-- code/modules/organs/external/head.dm | 5 +- code/modules/organs/internal/brain.dm | 13 +- .../modules/organs/internal/brain_computer.dm | 11 +- code/modules/organs/organ.dm | 14 +- code/modules/overmap/contacts/tracker.dm | 4 +- code/modules/overmap/disperser/disperser.dm | 4 +- code/modules/overmap/ftl_shunt/core.dm | 10 +- code/modules/paperwork/clipboard.dm | 8 +- code/modules/paperwork/folders.dm | 4 +- code/modules/paperwork/handlabeler.dm | 12 +- code/modules/paperwork/paper.dm | 8 +- code/modules/paperwork/paper_bundle.dm | 2 +- code/modules/paperwork/paper_sticky.dm | 6 +- code/modules/paperwork/paperbin.dm | 8 +- code/modules/paperwork/photography.dm | 16 +-- code/modules/persistence/graffiti.dm | 4 +- code/modules/persistence/noticeboards.dm | 2 +- code/modules/posters/_poster.dm | 4 +- code/modules/power/apc.dm | 10 +- code/modules/power/breaker_box.dm | 6 +- code/modules/power/cable.dm | 12 +- code/modules/power/cell.dm | 6 +- code/modules/power/debug_items.dm | 2 +- code/modules/power/geothermal/_geothermal.dm | 6 +- code/modules/power/lighting.dm | 10 +- code/modules/power/port_gen.dm | 32 ++--- code/modules/power/singularity/collector.dm | 5 +- .../particle_accelerator.dm | 26 ++-- code/modules/power/smes.dm | 4 +- code/modules/power/stirling.dm | 13 +- code/modules/power/terminal.dm | 4 +- code/modules/projectiles/ammunition.dm | 10 +- .../projectiles/ammunition/magnetic.dm | 4 +- code/modules/projectiles/gun.dm | 6 +- code/modules/projectiles/guns/energy.dm | 10 +- .../projectiles/guns/energy/capacitor.dm | 4 +- .../projectiles/guns/launcher/bows/_bow.dm | 4 +- .../guns/launcher/bows/crossbow_powered.dm | 4 +- .../projectiles/guns/launcher/foam_gun.dm | 8 +- .../guns/launcher/grenade_launcher.dm | 6 +- .../projectiles/guns/launcher/money_cannon.dm | 13 +- .../projectiles/guns/launcher/pneumatic.dm | 8 +- .../projectiles/guns/launcher/rocket.dm | 4 +- .../projectiles/guns/launcher/syringe_gun.dm | 4 +- .../projectiles/guns/magnetic/magnetic.dm | 10 +- code/modules/projectiles/guns/projectile.dm | 8 +- .../projectiles/guns/projectile/automatic.dm | 6 +- .../projectiles/guns/projectile/dartgun.dm | 10 +- .../projectiles/guns/projectile/flaregun.dm | 4 +- code/modules/projectiles/secure.dm | 4 +- code/modules/reagents/dispenser/cartridge.dm | 10 +- code/modules/reagents/dispenser/dispenser2.dm | 4 +- code/modules/reagents/reagent_containers.dm | 6 +- .../reagents/reagent_containers/_glass.dm | 9 +- .../reagents/reagent_containers/beaker.dm | 4 +- .../reagents/reagent_containers/borghydro.dm | 5 +- .../drinkingglass/drinkingglass.dm | 11 +- .../reagents/reagent_containers/drinks.dm | 12 +- .../reagent_containers/drinks/juicebox.dm | 6 +- .../reagents/reagent_containers/food.dm | 16 +-- .../reagent_containers/food/canned/_canned.dm | 6 +- .../reagent_containers/food/sandwich.dm | 4 +- .../reagents/reagent_containers/hypospray.dm | 6 +- .../reagents/reagent_containers/inhaler.dm | 6 +- .../reagents/reagent_containers/spray.dm | 6 +- code/modules/reagents/reagent_dispenser.dm | 26 ++-- code/modules/reagents/storage/pill_foil.dm | 6 +- code/modules/recycling/wrapped_package.dm | 6 +- code/modules/scanners/mining.dm | 4 +- code/modules/sealant_gun/sealant_gun.dm | 6 +- code/modules/sealant_gun/sealant_tank.dm | 4 +- .../shield_generators/floor_diffuser.dm | 6 +- .../shield_generators/handheld_diffuser.dm | 4 +- code/modules/tools/archetypes/tool_item.dm | 4 +- .../tools/subtypes/xenoarchaeology_picks.dm | 4 +- code/modules/tools/tool.dm | 4 +- code/modules/vehicles/cargo_train.dm | 14 +- code/modules/vehicles/train.dm | 6 +- code/modules/weather/_weather.dm | 4 +- .../finds/find_types/fossils.dm | 8 +- .../machinery/suspension_generator.dm | 8 +- .../xenoarcheaology/tools/core_sampler.dm | 4 +- maps/away/mining/mining.dm | 5 +- mods/content/bigpharma/chems.dm | 2 +- mods/content/bigpharma/pill_bottle.dm | 2 +- mods/content/blacksmithy/billet.dm | 4 +- mods/content/psionics/items/id_card.dm | 6 +- .../endgame_cascade/cascade_blob.dm | 6 +- .../supermatter/machinery/supermatter.dm | 6 +- mods/content/tabloids/tabloid.dm | 4 +- mods/content/xenobiology/slime/examine.dm | 22 +-- .../cult/mobs/constructs/constructs.dm | 6 +- .../cult/mobs/constructs/soulstone.dm | 8 +- mods/gamemodes/cult/ritual.dm | 8 +- mods/gamemodes/cult/runes.dm | 16 +-- mods/mobs/dionaea/mob/gestalt/_gestalt.dm | 5 +- mods/species/ascent/mobs/insectoid_egg.dm | 18 ++- mods/species/vox/gear/gear_shoes.dm | 4 +- mods/species/vox/gear/gun_spikethrower.dm | 4 +- mods/species/vox/organs_vox.dm | 9 +- 342 files changed, 1439 insertions(+), 1466 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 372ede052d3c..d3692ea62f06 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -271,7 +271,7 @@ /atom/proc/ShiftClick(var/mob/user) if(user.client && user.client.eye == user) - user.examinate(src) + user.examine_verb(src) return /* diff --git a/code/_onclick/ghost.dm b/code/_onclick/ghost.dm index 7bee520bdb59..d36410ef6aea 100644 --- a/code/_onclick/ghost.dm +++ b/code/_onclick/ghost.dm @@ -35,7 +35,7 @@ AltClickOn(A) return if(modifiers["shift"]) - examinate(A) + examine_verb(A) return A.attack_ghost(src) @@ -44,7 +44,7 @@ if(!istype(user)) return if(user.client && user.client.inquisitive_ghost) - user.examinate(src) + user.examine_verb(src) return if(user.client?.holder || user.antagHUD) storage?.show_to(user) diff --git a/code/_onclick/hud/screen/_screen.dm b/code/_onclick/hud/screen/_screen.dm index b3608bbf1cd9..da0c7b5478af 100644 --- a/code/_onclick/hud/screen/_screen.dm +++ b/code/_onclick/hud/screen/_screen.dm @@ -96,7 +96,7 @@ /obj/screen/Click(location, control, params) var/list/paramlist = params2list(params) if(paramlist["shift"]) - return examine(usr, 0) + return examined_by(usr, 0) if(ismob(usr) && usr.client && usr.canClick() && (!user_incapacitation_flags || !usr.incapacitated(user_incapacitation_flags))) return handle_click(usr, params) return FALSE diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index f05060384fb4..5a5797d0b0d8 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -34,10 +34,10 @@ if(. && intent && parent) parent.set_intent(intent) -/obj/screen/intent_button/examine(mob/user, distance) +/obj/screen/intent_button/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) if(desc) - to_chat(user, desc) + return list(desc) /obj/screen/intent_button/on_update_icon() . = ..() diff --git a/code/_onclick/hud/screen/screen_maneuver.dm b/code/_onclick/hud/screen/screen_maneuver.dm index 1a66910e8d51..27a37ceedef4 100644 --- a/code/_onclick/hud/screen/screen_maneuver.dm +++ b/code/_onclick/hud/screen/screen_maneuver.dm @@ -8,15 +8,12 @@ var/mob/living/user_living = user user_living.prepare_maneuver() -/obj/screen/maneuver/examine(mob/user, distance) +/obj/screen/maneuver/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - if(!isliving(user)) - return var/mob/living/user_living = user - if(user_living.prepared_maneuver) - to_chat(src, SPAN_NOTICE("You are prepared to [user_living.prepared_maneuver.name].")) - else - to_chat(src, SPAN_NOTICE("You are not prepared to perform a maneuver.")) + if(istype(user_living) && user_living.prepared_maneuver) + return list(SPAN_NOTICE("You are prepared to [user_living.prepared_maneuver.name].")) + return list(SPAN_NOTICE("You are not prepared to perform a maneuver.")) /obj/screen/maneuver/on_update_icon() var/mob/living/owner = owner_ref?.resolve() diff --git a/code/datums/extensions/assembly/assembly_damage.dm b/code/datums/extensions/assembly/assembly_damage.dm index feb5d9aa8a76..f05a10282769 100644 --- a/code/datums/extensions/assembly/assembly_damage.dm +++ b/code/datums/extensions/assembly/assembly_damage.dm @@ -1,8 +1,8 @@ -/datum/extension/assembly/proc/examine(mob/user) +/datum/extension/assembly/proc/examine_assembly(mob/user) if(damage > broken_damage) - to_chat(user, SPAN_DANGER("It is heavily damaged!")) + return SPAN_DANGER("It is heavily damaged!") else if(damage) - to_chat(user, "It is damaged.") + return "It is damaged." /datum/extension/assembly/proc/break_apart() var/atom/movable/H = holder diff --git a/code/datums/uplink/services.dm b/code/datums/uplink/services.dm index 03d4b72eebe6..b81dfc3ec323 100644 --- a/code/datums/uplink/services.dm +++ b/code/datums/uplink/services.dm @@ -71,16 +71,16 @@ deactivate() . = ..() -/obj/item/uplink_service/examine(mob/user, distance) +/obj/item/uplink_service/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) switch(state) if(AWAITING_ACTIVATION) - to_chat(user, "It is labeled '[service_label]' and appears to be awaiting activation.") + LAZYADD(., "It is labeled '[service_label]' and appears to be awaiting activation.") if(CURRENTLY_ACTIVE) - to_chat(user, "It is labeled '[service_label]' and appears to be active.") + LAZYADD(., "It is labeled '[service_label]' and appears to be active.") if(HAS_BEEN_ACTIVATED) - to_chat(user, "It is labeled '[service_label]' and appears to be permanently disabled.") + LAZYADD(., "It is labeled '[service_label]' and appears to be permanently disabled.") /obj/item/uplink_service/attack_self(var/mob/user) if(state != AWAITING_ACTIVATION) diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm index ea8bcbc016f7..5d2b817165d4 100644 --- a/code/datums/wires/wires.dm +++ b/code/datums/wires/wires.dm @@ -182,7 +182,7 @@ var/global/list/wireColourNames = list("darkred" = "dark red") to_chat(L, "You need a remote signaller!") else if(href_list["examine"]) var/colour = href_list["examine"] - to_chat(usr, examine(GetIndex(colour), usr)) + to_chat(usr, examine_wire(GetIndex(colour), usr)) // Update Window Interact(usr) @@ -203,7 +203,7 @@ var/global/list/wireColourNames = list("darkred" = "dark red") /datum/wires/proc/UpdatePulsed(var/index) return -/datum/wires/proc/examine(index, mob/user) +/datum/wires/proc/examine_wire(index, mob/user) . = "You aren't sure what this wire does." var/datum/wire_description/wd = get_description(index) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index bac188e9ee35..cf302e4faad7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -272,7 +272,7 @@ Overrides should either return the result of ..() or `TRUE` if not calling it. Calls to ..() should generally not supply any arguments and instead rely on BYOND's automatic argument passing. There is no need to check the return - value of ..(), this is only done by the calling `/examinate()` proc to validate + value of ..(), this is only done by the calling `/examine_verb()` proc to validate the call chain. - `user`: The mob examining this atom @@ -282,16 +282,36 @@ - Return: `TRUE` when the call chain is valid, otherwise `FALSE` - Events: `atom_examined` */ -/atom/proc/examine(mob/user, distance, infix = "", suffix = "") +/atom/proc/examined_by(mob/user, distance, infix, suffix) + var/list/examine_lines + for(var/add_lines in list(get_examine_header(user, distance, infix, suffix), get_examine_strings(user, distance, infix, suffix), get_examine_hints(user, distance, infix, suffix))) + if(islist(add_lines) && LAZYLEN(add_lines)) + LAZYADD(examine_lines, add_lines) + if(LAZYLEN(examine_lines)) + to_chat(user, jointext(examine_lines, "
")) + RAISE_EVENT(/decl/observ/atom_examined, src, user, distance) + return TRUE + +// Name, displayed at the top. +/atom/proc/get_examine_header(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(TRUE) //This reformats names to get a/an properly working on item descriptions when they are bloody or coated in reagents. var/examine_prefix = get_examine_prefix() if(examine_prefix) examine_prefix += " " // add a space to the end to be polite - var/composed_name = ADD_ARTICLE_GENDER("[examine_prefix][name]", gender) + return list("[html_icon(src)] That's [ADD_ARTICLE_GENDER("[examine_prefix][name]", gender)][infix][get_examine_punctuation()] [suffix]") + +// Main body of examine, displayed after the header and before hints. +/atom/proc/get_examine_strings(mob/user, distance, infix, suffix) + SHOULD_CALL_PARENT(TRUE) + . = list() + if(desc) + . += desc - to_chat(user, "[html_icon(src)] That's [composed_name][infix][get_examine_punctuation()] [suffix]") - to_chat(user, desc) +// Addendum to examine, displayed at the bottom +/atom/proc/get_examine_hints(mob/user, distance, infix, suffix) + + SHOULD_CALL_PARENT(TRUE) var/list/alt_interactions = get_alt_interactions(user) if(LAZYLEN(alt_interactions)) @@ -301,11 +321,14 @@ if(interaction.examine_desc && (interaction.always_show_on_examine || interaction.is_possible(src, user, user?.get_active_held_item()))) interaction_strings += emote_replace_target_tokens(interaction.examine_desc, src) if(length(interaction_strings)) - to_chat(user, SPAN_INFO("Alt-click on \the [src] to [english_list(interaction_strings, and_text = " or ")].")) + LAZYADD(., SPAN_INFO("Alt-click on \the [src] to [english_list(interaction_strings, and_text = " or ")].")) - RAISE_EVENT(/decl/observ/atom_examined, src, user, distance) - return TRUE + var/decl/interaction_handler/handler = get_quick_interaction_handler(user) + if(handler) + LAZYADD(., SPAN_NOTICE("Ctrl-click \the [src] while in your inventory to [lowertext(handler.name)].")) + if(user?.get_preference_value(/datum/client_preference/inquisitive_examine) == PREF_ON && user.can_use_codex() && SScodex.get_codex_entry(get_codex_value(user))) + LAZYADD(., SPAN_NOTICE("The codex has
relevant information available.")) /** Relay movement to this atom. @@ -842,7 +865,7 @@ if(href_list["look_at_me"] && istype(user)) var/turf/T = get_turf(src) if(T.CanUseTopic(user, global.view_topic_state) != STATUS_CLOSE) - user.examinate(src) + user.examine_verb(src) return TOPIC_HANDLED . = ..() diff --git a/code/game/atoms_movable_interactions.dm b/code/game/atoms_movable_interactions.dm index 8cf50ef5bc47..81905ffd4920 100644 --- a/code/game/atoms_movable_interactions.dm +++ b/code/game/atoms_movable_interactions.dm @@ -17,7 +17,7 @@ examine_desc = "examine $TARGET_THEM$" /decl/interaction_handler/look/invoked(atom/target, mob/user, obj/item/prop) - target.examine(user, get_dist(user, target)) + target.examined_by(user, get_dist(user, target)) /decl/interaction_handler/grab name = "Grab" diff --git a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm index aed8aa4e95eb..77f579113835 100644 --- a/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm +++ b/code/game/gamemodes/endgame/ftl_jump/ftl_jump.dm @@ -114,9 +114,9 @@ /obj/effect/bluegoast/proc/mirror_dir(var/atom/movable/am, var/old_dir, var/new_dir) set_dir(global.reverse_dir[new_dir]) -/obj/effect/bluegoast/examine() +/obj/effect/bluegoast/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - return daddy.examine(arglist(args)) + return daddy.examined_by(user, distance, infix, suffix) /obj/effect/bluegoast/proc/blueswitch() var/mob/living/human/H diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 1b6472cef11e..298ac37c5170 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -51,9 +51,9 @@ return TRUE return ..() -/obj/machinery/cablelayer/examine(mob/user) +/obj/machinery/cablelayer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "\The [src]'s cable reel has [cable.amount] length\s left.") + . += "\The [src]'s cable reel has [cable.amount] length\s left." /obj/machinery/cablelayer/proc/load_cable(var/obj/item/stack/cable_coil/CC) if(istype(CC) && CC.amount) diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 0c9c319aacfe..37f33f20daca 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -24,9 +24,9 @@ computer.table = src break -/obj/machinery/optable/examine(mob/user) +/obj/machinery/optable/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, SPAN_NOTICE("The neural suppressors are switched [suppressing ? "on" : "off"].")) + . += SPAN_NOTICE("The neural suppressors are switched [suppressing ? "on" : "off"].") /obj/machinery/optable/grab_attack(obj/item/grab/grab, mob/user) if(isliving(grab.affecting) && check_table(grab.affecting)) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 0efbfce6cd4d..24e826c1739b 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -106,21 +106,21 @@ beaker = new /obj/item/chems/glass/beaker/large(src) update_icon() -/obj/machinery/sleeper/examine(mob/user, distance) +/obj/machinery/sleeper/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (distance <= 1) if(beaker) - to_chat(user, SPAN_NOTICE("It is loaded with a beaker.")) + . += SPAN_NOTICE("It is loaded with \a [beaker].") if(occupant) - occupant.examine(arglist(args)) + . += occupant.get_examine_strings(user, distance, infix, suffix) if(emagged && user.skill_check(SKILL_MEDICAL, SKILL_EXPERT)) - to_chat(user, SPAN_NOTICE("The chemical input system looks like it has been tampered with.")) + . += SPAN_NOTICE("The chemical input system looks like it has been tampered with.") if(length(loaded_canisters)) - to_chat(user, SPAN_NOTICE("There are [length(loaded_canisters)] chemical canister\s loaded:")) + . += SPAN_NOTICE("There are [length(loaded_canisters)] chemical canister\s loaded:") for(var/thing in loaded_canisters) - to_chat(user, SPAN_NOTICE("- \The [thing]")) + . += SPAN_NOTICE("- \The [thing]") else - to_chat(user, SPAN_NOTICE("There are no chemical canisters loaded.")) + . += SPAN_NOTICE("There are no chemical canisters loaded.") /obj/machinery/sleeper/proc/has_room_in_beaker() return beaker && beaker.reagents.total_volume < beaker.reagents.maximum_volume diff --git a/code/game/machinery/_machines_base/machine_construction/airlock.dm b/code/game/machinery/_machines_base/machine_construction/airlock.dm index 835402c5484b..faa00f9d3775 100644 --- a/code/game/machinery/_machines_base/machine_construction/airlock.dm +++ b/code/game/machinery/_machines_base/machine_construction/airlock.dm @@ -21,7 +21,7 @@ var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) - machine.display_parts(user) + machine.display_parts(user, show_directly = TRUE) return TRUE return FALSE diff --git a/code/game/machinery/_machines_base/machine_construction/default.dm b/code/game/machinery/_machines_base/machine_construction/default.dm index c178a598eb4a..21a9a8a50d2e 100644 --- a/code/game/machinery/_machines_base/machine_construction/default.dm +++ b/code/game/machinery/_machines_base/machine_construction/default.dm @@ -35,7 +35,7 @@ var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) - machine.display_parts(user) + machine.display_parts(user, show_directly = TRUE) return TRUE return FALSE diff --git a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm index e050c23ff8f3..59d9ccaf7342 100644 --- a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm @@ -32,7 +32,7 @@ var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) - machine.display_parts(user) + machine.display_parts(user, show_directly = TRUE) return TRUE return down_interaction(I, user, machine) diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index cff48f06503d..f31c8098c6f4 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -403,45 +403,51 @@ Class Procs: /datum/proc/remove_visual(mob/M) return -/obj/machinery/proc/display_parts(mob/user) - to_chat(user, "Following parts detected in the machine:") +/obj/machinery/proc/display_parts(mob/user, show_directly) + . = list() + . += SPAN_NOTICE("The following parts are detected in \the [src]:") for(var/obj/item/C in component_parts) - var/line = " [C.name]" + var/line = SPAN_NOTICE(" [C.name]") if(!C.current_health) - line = " [C.name] (destroyed)" + line = SPAN_WARNING(" [C.name] (destroyed)") else if(C.get_percent_health() < 75) - line = " [C.name] (damaged)" - to_chat(user, line) + line = SPAN_NOTICE(" [C.name] (damaged)") + . += line for(var/path in uncreated_component_parts) var/obj/item/thing = path - to_chat(user, " [initial(thing.name)] ([uncreated_component_parts[path] || 1])") + . += SPAN_NOTICE(" [initial(thing.name)] ([uncreated_component_parts[path] || 1])") + if(length(.) && show_directly) + to_chat(user, jointext(., "
")) -/obj/machinery/examine(mob/user) +/obj/machinery/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(component_parts && (hasHUD(user, HUD_SCIENCE) || (construct_state && construct_state.visible_components))) - display_parts(user) + . += display_parts(user) if(stat & NOSCREEN) - to_chat(user, "It is missing a screen, making it hard to interact with.") + . += SPAN_WARNING("It is missing a screen, making it hard to interact with.") else if(stat & NOINPUT) - to_chat(user, "It is missing any input device.") + . += SPAN_WARNING("It is missing any input device.") if((stat & NOPOWER)) if(interact_offline) - to_chat(user, "It is not receiving power.") + . += SPAN_WARNING("It is not receiving power.") else - to_chat(user, "It is not receiving power, making it hard to interact with.") + . += SPAN_WARNING("It is not receiving power, making it hard to interact with.") + + if(construct_state?.mechanics_info()) + . += SPAN_NOTICE("It can be manipulated using tools.") - if(construct_state && construct_state.mechanics_info()) - to_chat(user, "It can be manipulated using tools.") var/list/missing = missing_parts() if(missing) var/list/parts = list() for(var/type in missing) var/obj/item/fake_thing = type parts += "[num2text(missing[type])] [initial(fake_thing.name)]" - to_chat(user, "\The [src] is missing [english_list(parts)], rendering it inoperable.") + . += SPAN_WARNING("\The [src] is missing [english_list(parts)], rendering it inoperable.") for(var/obj/item/stock_parts/part in component_parts) - part.on_machine_examined(user) + var/part_strings = part.on_machine_examined(user) + if(LAZYLEN(part_strings)) + . += part_strings // This is really pretty crap and should be overridden for specific machines. /obj/machinery/fluid_act(var/datum/reagents/fluids) diff --git a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm index 7ce4792bc9fa..c8fdd39f53bd 100644 --- a/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm +++ b/code/game/machinery/_machines_base/stock_parts/_stock_parts.dm @@ -91,17 +91,17 @@ /obj/item/stock_parts/proc/is_functional() return (!can_take_damage()) || (current_health > 0) -/obj/item/stock_parts/examine(mob/user) +/obj/item/stock_parts/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(can_take_damage()) if(!is_functional()) - to_chat(user, SPAN_WARNING("It is completely broken.")) + . += SPAN_WARNING("It is completely broken.") else if(get_percent_health() < 50) - to_chat(user, SPAN_WARNING("It is heavily damaged.")) + . += SPAN_WARNING("It is heavily damaged.") else if(get_percent_health() < 75) - to_chat(user, SPAN_NOTICE("It is showing signs of damage.")) + . += SPAN_NOTICE("It is showing signs of damage.") else if(is_damaged()) - to_chat(user, SPAN_NOTICE("It is showing some wear and tear.")) + . += SPAN_NOTICE("It is showing some wear and tear.") //Machines handle damaging for us, so don't do it twice /obj/item/stock_parts/explosion_act(severity) @@ -118,4 +118,5 @@ . = list() /// A stub for showing messages based on part status when a machine is examined. -/obj/item/stock_parts/proc/on_machine_examined(mob/user) \ No newline at end of file +/obj/item/stock_parts/proc/on_machine_examined(mob/user) + SHOULD_CALL_PARENT(TRUE) diff --git a/code/game/machinery/_machines_base/stock_parts/access_lock.dm b/code/game/machinery/_machines_base/stock_parts/access_lock.dm index f5ae7df7558d..2f4935ed6731 100644 --- a/code/game/machinery/_machines_base/stock_parts/access_lock.dm +++ b/code/game/machinery/_machines_base/stock_parts/access_lock.dm @@ -47,12 +47,12 @@ . = ..() locked = FALSE -/obj/item/stock_parts/access_lock/examine(mob/user) +/obj/item/stock_parts/access_lock/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(locked) - to_chat(user, "The lock is engaged.") + . += "The lock is engaged." if(emagged && user.skill_check_multiple(list(SKILL_FORENSICS = SKILL_EXPERT, SKILL_COMPUTER = SKILL_EXPERT))) - to_chat(user, SPAN_WARNING("On close inspection, there is something odd about the interface. You suspect it may have been tampered with.")) + . += SPAN_WARNING("On close inspection, there is something odd about the interface. You suspect it may have been tampered with.") /obj/item/stock_parts/access_lock/attackby(obj/item/W, mob/user) var/obj/machinery/machine = loc diff --git a/code/game/machinery/_machines_base/stock_parts/item_holder.dm b/code/game/machinery/_machines_base/stock_parts/item_holder.dm index d6404088a4c5..707acd2dbd00 100644 --- a/code/game/machinery/_machines_base/stock_parts/item_holder.dm +++ b/code/game/machinery/_machines_base/stock_parts/item_holder.dm @@ -43,8 +43,9 @@ return /obj/item/stock_parts/item_holder/on_machine_examined(mob/user) + . = ..() if(is_item_inserted()) - to_chat(user, SPAN_INFO("It has \a [get_inserted()] in \the [src].")) + LAZYADD(., SPAN_INFO("It has \a [get_inserted()] in \the [src].")) ///Handle putting the object in the component's contents. Doesn't trigger any callbacks, or messages. /obj/item/stock_parts/item_holder/proc/set_inserted(var/obj/O) diff --git a/code/game/machinery/_machines_base/stock_parts/network_lock.dm b/code/game/machinery/_machines_base/stock_parts/network_lock.dm index 540984384085..d5d6e187fdee 100644 --- a/code/game/machinery/_machines_base/stock_parts/network_lock.dm +++ b/code/game/machinery/_machines_base/stock_parts/network_lock.dm @@ -70,10 +70,10 @@ return list("NO_PERMISSIONS_DENY_ALL") return list() -/obj/item/stock_parts/network_receiver/network_lock/examine(mob/user) +/obj/item/stock_parts/network_receiver/network_lock/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(emagged && user.skill_check_multiple(list(SKILL_FORENSICS = SKILL_EXPERT, SKILL_COMPUTER = SKILL_EXPERT))) - to_chat(user, SPAN_WARNING("On close inspection, there is something odd about the interface. You suspect it may have been tampered with.")) + . += SPAN_WARNING("On closer inspection, there is something odd about the interface. You suspect it may have been tampered with.") /obj/item/stock_parts/network_receiver/network_lock/attackby(obj/item/W, mob/user) . = ..() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 11d4e5c9b63b..4096611b87e7 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -850,11 +850,11 @@ FIRE ALARM var/sound_id var/datum/sound_token/sound_token -/obj/machinery/firealarm/examine(mob/user) +/obj/machinery/firealarm/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(isContactLevel(loc.z)) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) - to_chat(user, "The current alert level is [security_state.current_security_level.name].") + . += "The current alert level is [security_state.current_security_level.name]." /obj/machinery/firealarm/on_update_icon() cut_overlays() diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 3b0ef569f603..cabf2a5d56e2 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -78,23 +78,23 @@ else icon_state = "meter4" -/obj/machinery/meter/examine(mob/user, distance) +/obj/machinery/meter/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 3 && !(isAI(user) || isghost(user))) - to_chat(user, "You are too far away to read it.") + . += SPAN_WARNING("You are too far away to read it.") else if(stat & (NOPOWER|BROKEN)) - to_chat(user, "The display is off.") + . += SPAN_WARNING("The display is off.") else if(src.target) var/datum/gas_mixture/environment = target.return_air() if(environment) - to_chat(user, "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]°C).") + . += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]°C)." else - to_chat(user, "The sensor error light is blinking.") + . += "The sensor error light is blinking." else - to_chat(user, "The connect error light is blinking.") + . += "The connect error light is blinking." // turf meter -- prioritizes turfs over pipes for target acquisition diff --git a/code/game/machinery/bodyscanner.dm b/code/game/machinery/bodyscanner.dm index 5658432aa1fa..9ae5ed360527 100644 --- a/code/game/machinery/bodyscanner.dm +++ b/code/game/machinery/bodyscanner.dm @@ -20,10 +20,10 @@ for(var/obj/O in get_contained_external_atoms()) O.dropInto(loc) -/obj/machinery/bodyscanner/examine(mob/user) +/obj/machinery/bodyscanner/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (occupant && user.Adjacent(src)) - occupant.examine(arglist(args)) + occupant.get_examine_strings(user, distance, infix, suffix) /obj/machinery/bodyscanner/relaymove(mob/user) ..() diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 3262bf5a4230..98bac3c1fd33 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -46,10 +46,10 @@ var/affected_by_emp_until = 0 -/obj/machinery/camera/examine(mob/user) +/obj/machinery/camera/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(stat & BROKEN) - to_chat(user, SPAN_WARNING("It is completely demolished.")) + . += SPAN_WARNING("It is completely demolished.") /obj/machinery/camera/apply_visual(mob/living/human/M) if(!M.client || !istype(M)) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index dac2d458472a..5a27cca96219 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -32,13 +32,13 @@ else overlays.Cut() -/obj/machinery/cell_charger/examine(var/mob/user, var/distance) +/obj/machinery/cell_charger/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 5) var/obj/item/cell/cell = get_cell() - to_chat(user, "There's [cell ? "a" : "no"] cell in the charger.") + . += "There's [cell ? "a" : "no"] cell in the charger." if(cell) - to_chat(user, "Current charge: [cell.charge].") + . += "Current charge: [cell.charge]." /obj/machinery/cell_charger/component_stat_change(obj/item/stock_parts/part, old_stat, flag) . = ..() diff --git a/code/game/machinery/computer/arcade_orion.dm b/code/game/machinery/computer/arcade_orion.dm index a076d6efc4df..1a0469832b59 100644 --- a/code/game/machinery/computer/arcade_orion.dm +++ b/code/game/machinery/computer/arcade_orion.dm @@ -487,14 +487,11 @@ ) var/active = 0 //if the ship is on -/obj/item/orion_ship/examine(mob/user) +/obj/item/orion_ship/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(!(in_range(user, src))) - return - if(!active) - to_chat(user, "There's a little switch on the bottom. It's flipped down.") - else - to_chat(user, "There's a little switch on the bottom. It's flipped up.") + if(in_range(user, src)) + . += SPAN_NOTICE("There's a little switch on the bottom. It's flipped [active ? "up" : "down"].") + /obj/item/orion_ship/attack_self(mob/user) if(active) return diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index af53c701163e..6b52228b8ec4 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -15,12 +15,12 @@ /obj/item/card/id/guest/GetAccess() return temp_access -/obj/item/card/id/guest/examine(mob/user) +/obj/item/card/id/guest/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if (!expired) - to_chat(user, SPAN_NOTICE("This pass expires at [worldtime2stationtime(expiration_time)].")) + if (expired) + . += SPAN_WARNING("It expired at [worldtime2stationtime(expiration_time)].") else - to_chat(user, SPAN_WARNING("It expired at [worldtime2stationtime(expiration_time)].")) + . += SPAN_NOTICE("This pass expires at [worldtime2stationtime(expiration_time)].") /obj/item/card/id/guest/read() if (expired) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index bfb361cfc83e..1892189e038e 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -294,10 +294,10 @@ return TRUE -/obj/machinery/cryopod/examine(mob/user) +/obj/machinery/cryopod/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (occupant && user.Adjacent(src)) - occupant.examine(arglist(args)) + . += occupant.get_examine_strings(user, distance, infix, suffix) //Lifted from Unity stasis.dm and refactored. /obj/machinery/cryopod/Process() diff --git a/code/game/machinery/dehumidifier.dm b/code/game/machinery/dehumidifier.dm index eaef14277b26..f5cfe0fc3318 100644 --- a/code/game/machinery/dehumidifier.dm +++ b/code/game/machinery/dehumidifier.dm @@ -34,15 +34,15 @@ if(panel_open) overlays.Add("dhum-open") -/obj/machinery/dehumidifier/examine(mob/user) +/obj/machinery/dehumidifier/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(.) - to_chat(user, "The dehumidifier is [active ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"].") + . += "The dehumidifier is [active ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"]." var/obj/item/cell/cell = get_cell() if(panel_open) - to_chat(user, "The power cell is [cell ? "installed" : "missing"].") + . += "The power cell is [cell ? "installed" : "missing"]." else - to_chat(user, "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%") + . += "The charge meter reads [cell ? round(cell.percent(), 1) : 0]%" /obj/machinery/dehumidifier/proc/set_active(new_active) if(active != new_active) diff --git a/code/game/machinery/doors/_door.dm b/code/game/machinery/doors/_door.dm index e76fe49edfef..39628fe7da0b 100644 --- a/code/game/machinery/doors/_door.dm +++ b/code/game/machinery/doors/_door.dm @@ -377,24 +377,24 @@ return 0 . = round((1 - current_health/current_max_health) * damage) -/obj/machinery/door/examine(mob/user) +/obj/machinery/door/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(current_health <= 0) - to_chat(user, "\The [src] is broken!") + . += SPAN_DANGER("\The [src] is broken!") else var/current_max_health = get_max_health() if(current_health < current_max_health / 4) - to_chat(user, "\The [src] looks like it's about to break!") + . += SPAN_DANGER("\The [src] looks like it's about to break!") else if(current_health < current_max_health / 2) - to_chat(user, "\The [src] looks seriously damaged!") + . += SPAN_DANGER("\The [src] looks seriously damaged!") else if(current_health < current_max_health * 3/4) - to_chat(user, "\The [src] shows signs of damage!") + . += SPAN_WARNING("\The [src] shows signs of damage!") else if(current_health < current_max_health && get_dist(src, user) <= 1) - to_chat(user, "\The [src] has some minor scuffing.") + . += SPAN_WARNING("\The [src] has some minor scuffing.") var/mob/living/human/H = user if (emagged && istype(H) && (H.skill_check(SKILL_COMPUTER, SKILL_ADEPT) || H.skill_check(SKILL_ELECTRICAL, SKILL_ADEPT))) - to_chat(user, SPAN_WARNING("\The [src]'s control panel looks fried.")) + . += SPAN_WARNING("\The [src]'s control panel looks fried.") /obj/machinery/door/set_broken(new_state, cause) . = ..() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index b845e67c52b3..004f0fc02a44 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1119,15 +1119,15 @@ About the new airlock wires panel: ..() update_icon() -/obj/machinery/door/airlock/examine(mob/user) +/obj/machinery/door/airlock/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (lock_cut_state == BOLTS_EXPOSED) - to_chat(user, "The bolt cover has been cut open.") + . += SPAN_WARNING("The bolt cover has been cut open.") if (lock_cut_state == BOLTS_CUT) - to_chat(user, "The door bolts have been cut.") + . += SPAN_DANGER("The door bolts have been cut!") if(brace) - to_chat(user, "\The [brace] is installed on \the [src], preventing it from opening.") - to_chat(user, brace.examine_health()) + . += "\The [brace] is installed on \the [src], preventing it from opening." + . += brace.examine_health() /obj/machinery/door/airlock/autoname/Initialize() var/area/A = get_area(src) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index afaf24809e82..579e29e33112 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -134,14 +134,14 @@ . = ..() update_icon() -/obj/machinery/airlock_sensor/examine(mob/user, distance, infix, suffix) +/obj/machinery/airlock_sensor/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance < 2) - to_chat(user, SPAN_INFO("The pressure indicator reads '[pressure? round(pressure, 0.1) : 0] kPa'.")) + . += SPAN_INFO("The pressure indicator reads '[pressure? round(pressure, 0.1) : 0] kPa'.") if(master_cycling) - to_chat(user, SPAN_WARNING("It's warning that the master airlock is cycling!")) + . += SPAN_WARNING("It's warning that the master airlock is cycling!") if(alert) - to_chat(user, SPAN_WARNING("The low-pressure warning light is blinking!")) + . += SPAN_WARNING("The low-pressure warning light is blinking!") /obj/machinery/airlock_sensor/on_update_icon() cut_overlays() @@ -307,12 +307,12 @@ /obj/item/stock_parts/power/apc, ) -/obj/machinery/button/access/examine(mob/user, distance, infix, suffix) +/obj/machinery/button/access/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance < 2) - to_chat(user, SPAN_INFO("The button reads '[command]'.")) + if(distance <= 1) + . += SPAN_INFO("The button reads '[command]'.") if(master_cycling) - to_chat(user, SPAN_WARNING("It's warning that the master airlock is cycling!")) + . += SPAN_WARNING("It's warning that the master airlock is cycling!") /obj/machinery/button/access/on_update_icon() cut_overlays() diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 8b1112a39edf..1fc6bb6afe3a 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -57,10 +57,10 @@ implicit_material = GET_DECL(/decl/material/solid/metal/plasteel) . = ..() -/obj/machinery/door/blast/examine(mob/user) +/obj/machinery/door/blast/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if((stat & BROKEN)) - to_chat(user, "It's broken.") + . += SPAN_DANGER("It's broken.") // Proc: Bumped() // Parameters: 1 (AM - Atom that tried to walk through this object) diff --git a/code/game/machinery/doors/braces.dm b/code/game/machinery/doors/braces.dm index b55afe45495f..137c4cddb4f1 100644 --- a/code/game/machinery/doors/braces.dm +++ b/code/game/machinery/doors/braces.dm @@ -27,9 +27,9 @@ var/obj/item/stock_parts/circuitboard/airlock_electronics/brace/electronics -/obj/item/airlock_brace/examine(mob/user) +/obj/item/airlock_brace/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, examine_health()) + . += examine_health() // This is also called from airlock's examine, so it's a different proc to prevent code copypaste. /obj/item/airlock_brace/proc/examine_health() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index d6e1916fb871..07662d11a6ab 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -117,16 +117,17 @@ RETURN_TYPE(/decl/material) return GET_DECL(/decl/material/solid/metal/steel) -/obj/machinery/door/firedoor/examine(mob/user, distance) +/obj/machinery/door/firedoor/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1 || !density) return if(pdiff >= FIREDOOR_MAX_PRESSURE_DIFF) - to_chat(user, "WARNING: Current pressure differential is [pdiff]kPa! Opening door may result in injury!") - to_chat(user, "Sensor readings:") + . += SPAN_DANGER("WARNING: Current pressure differential is [pdiff]kPa! Opening door may result in injury!") + + . += "Sensor readings:" for(var/index = 1; index <= tile_info.len; index++) - var/o = "  " + var/list/o = list("  ") switch(index) if(1) o += "NORTH: " @@ -146,13 +147,13 @@ o += "[celsius]°C " o += "" o += "[pressure]kPa" - to_chat(user, o) + . += JOINTEXT(o) if(islist(users_to_open) && users_to_open.len) var/users_to_open_string = users_to_open[1] if(users_to_open.len >= 2) for(var/i = 2 to users_to_open.len) users_to_open_string += ", [users_to_open[i]]" - to_chat(user, "These people have opened \the [src] during an alert: [users_to_open_string].") + . += "These people have opened \the [src] during an alert: [users_to_open_string]." /obj/machinery/door/firedoor/Bumped(atom/AM) if(panel_open || operating) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index e70e3c250776..692a92da7944 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -67,13 +67,12 @@ return TRUE return ..() -/obj/machinery/floorlayer/examine(mob/user) +/obj/machinery/floorlayer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/dismantle = mode["dismantle"] - var/laying = mode["laying"] - var/collect = mode["collect"] - var/message = "\The [src] [!T?"don't ":""]has [!T?"":"[T.get_amount()] [T] "]tile\s, dismantle is [dismantle?"on":"off"], laying is [laying?"on":"off"], collect is [collect?"on":"off"]." - to_chat(user, message) + var/laying = mode["laying"] + var/collect = mode["collect"] + . += SPAN_NOTICE("\The [src] [!T?"don't ":""]has [!T?"":"[T.get_amount()] [T] "]tile\s, dismantle is [dismantle?"on":"off"], laying is [laying?"on":"off"], collect is [collect?"on":"off"].") /obj/machinery/floorlayer/proc/reset() on = 0 diff --git a/code/game/machinery/kitchen/cooking_machines/_cooker.dm b/code/game/machinery/kitchen/cooking_machines/_cooker.dm index e632cedf9b8f..699f0670a3b1 100644 --- a/code/game/machinery/kitchen/cooking_machines/_cooker.dm +++ b/code/game/machinery/kitchen/cooking_machines/_cooker.dm @@ -37,12 +37,12 @@ cooking_obj = null return ..() -/obj/machinery/cooker/examine(mob/user) +/obj/machinery/cooker/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(cooking_obj) - to_chat(user, "You can see \a [cooking_obj] inside.") + . += "You can see \a [cooking_obj] inside." if(panel_open) - to_chat(user, "The panel is open.") + . += "The service panel is open." /obj/machinery/cooker/components_are_accessible(path) return !cooking && ..() diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index ce3f44d19386..aa537a6a9965 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -54,9 +54,9 @@ src.startgibbing(user) return TRUE -/obj/machinery/gibber/examine(mob/user) +/obj/machinery/gibber/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "The safety guard is [emagged ? SPAN_DANGER("disabled") : "enabled"].") + . += "The safety guard is [emagged ? SPAN_DANGER("disabled") : "enabled"]." /obj/machinery/gibber/emag_act(var/remaining_charges, var/mob/user) emagged = !emagged diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 8fc6978ab6f4..7bcf166a9089 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -3,7 +3,7 @@ // can also operate on non-loc area through "otherarea" var /obj/machinery/light_switch name = "light switch" - desc = "It turns lights on and off. What are you, simple?" + desc = "It switches lights on and off, obviously." icon = 'icons/obj/power.dmi' icon_state = "light0" obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED @@ -59,10 +59,10 @@ set_light(2, 0.25, on ? "#82ff4c" : "#f86060") z_flags |= ZMM_MANGLE_PLANES -/obj/machinery/light_switch/examine(mob/user, distance) +/obj/machinery/light_switch/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance) - to_chat(user, "A light switch. It is [on? "on" : "off"].") + . += "It is [on? "on" : "off"]." /obj/machinery/light_switch/proc/set_state(var/newstate) if(on != newstate) diff --git a/code/game/machinery/nuclear_bomb.dm b/code/game/machinery/nuclear_bomb.dm index 28272033fa96..ac2a4f67cec2 100644 --- a/code/game/machinery/nuclear_bomb.dm +++ b/code/game/machinery/nuclear_bomb.dm @@ -407,9 +407,10 @@ var/global/bomb_set /obj/item/modular_computer/laptop/preset/custom_loadout/cheap ) -/obj/item/secure_storage/briefcase/nukedisk/examine(mob/user) +/obj/item/secure_storage/briefcase/nukedisk/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user,"On closer inspection, you see \a [global.using_map.company_name] emblem is etched into the front of it.") + if(distance <= 1) + . += "On closer inspection, you see \a [global.using_map.company_name] emblem is etched into the front of it." /obj/item/folder/envelope/nuke_instructions name = "instructions envelope" diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index 615a1243831f..3cfa2dd57bbe 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -159,12 +159,12 @@ return TRUE return FALSE // TODO: should this be a parent call? do we want this to be (de)constructable? -/obj/machinery/oxygen_pump/examine(mob/user) +/obj/machinery/oxygen_pump/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(tank) - to_chat(user, "The meter shows [round(tank.air_contents.return_pressure())].") + . += "The meter shows [round(tank.air_contents.return_pressure())]." else - to_chat(user, SPAN_WARNING("It is missing a tank!")) + . += SPAN_WARNING("It is missing a tank!") /obj/machinery/oxygen_pump/Process() if(istype(breather)) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 57fe940fe0b4..e117f2087257 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -117,11 +117,6 @@ Buildable meters . = ..() set_extension(src, /datum/extension/parts_stash) -/obj/item/machine_chassis/examine(mob/user, distance) - . = ..() - if(distance <= 2) - to_chat(user, "Use a wrench to secure \the [src] here.") - /obj/item/machine_chassis/attackby(var/obj/item/W, var/mob/user) if(!IS_WRENCH(W)) return ..() diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index d6761c4858ca..229fb0d3c4f1 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -79,9 +79,9 @@ return TRUE return ..() -/obj/machinery/pipelayer/examine(mob/user) +/obj/machinery/pipelayer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated.") + . += "\The [src] has [metal] sheet\s, is set to produce [P_type_t], and auto-dismantling is [!a_dis?"de":""]activated." /obj/machinery/pipelayer/proc/reset() on=0 diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index b507e3092765..9a05621916b9 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -109,14 +109,11 @@ else icon_state = icon_state_idle -/obj/machinery/recharger/examine(mob/user) +/obj/machinery/recharger/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(isnull(charging)) - return - - var/obj/item/cell/C = charging.get_cell() - if(!isnull(C)) - to_chat(user, "Item's charge at [round(C.percent())]%.") + var/obj/item/cell/cell = charging?.get_cell() + if(cell) + . += "\The [charging] is charged to [round(cell.percent())]%." /obj/machinery/recharger/wallcharger name = "wall recharger" diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index bed171138642..1be2e054aaaa 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -95,13 +95,13 @@ var/charge_used = diff - use_power_oneoff(diff / CELLRATE, LOCAL) * CELLRATE target.give(charge_used) -/obj/machinery/recharge_station/examine(mob/user) +/obj/machinery/recharge_station/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/obj/item/cell/cell = get_cell() if(cell) - to_chat(user, "The charge meter reads: [cell.percent()]%.") + . += "The charge meter reads: [cell.percent()]%." else - to_chat(user, "The indicator shows that the cell is missing.") + . += "The indicator shows that the cell is missing." /obj/machinery/recharge_station/relaymove(mob/user) if(user.stat) diff --git a/code/game/machinery/self_destruct.dm b/code/game/machinery/self_destruct.dm index 3d1f841884df..badb1853918b 100644 --- a/code/game/machinery/self_destruct.dm +++ b/code/game/machinery/self_destruct.dm @@ -101,16 +101,16 @@ visible_message(SPAN_DANGER("\The [src] dents and chars.")) damaged = 1 -/obj/machinery/self_destruct/examine(mob/user) +/obj/machinery/self_destruct/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(damaged) - to_chat(user, "[src] is damaged, it needs repairs.") + . += SPAN_WARNING("\The [src] is damaged and needs to be repaired.") return if(armed) - to_chat(user, "[src] is armed and ready.") + . += SPAN_DANGER("\The [src] is armed and ready.") return if(cylinder) - to_chat(user, "[src] is loaded and ready to be armed.") + . += "\the [src] is loaded and ready to be armed." /obj/machinery/self_destruct/on_update_icon() if(armed) diff --git a/code/game/machinery/slide_projector.dm b/code/game/machinery/slide_projector.dm index de4cb556fb3b..85b2db3f4664 100644 --- a/code/game/machinery/slide_projector.dm +++ b/code/game/machinery/slide_projector.dm @@ -143,13 +143,13 @@ desc = "It's currently showing \the [I]." update_icon() -/obj/effect/projection/examine(mob/user, distance) +/obj/effect/projection/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/obj/item/slide = source.resolve() if(!istype(slide)) qdel(src) return - return slide.examine(user, 1) + . += slide.get_examine_strings(user, distance, infix, suffix) /obj/effect/projection/photo alpha = 170 diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 30d1ae2ef8c6..ab59748f0d8e 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -40,15 +40,14 @@ if(panel_open) add_overlay("sheater-open") -/obj/machinery/space_heater/examine(mob/user) +/obj/machinery/space_heater/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - - to_chat(user, "The heater is [on ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"].") + . += "\The [src] is [on ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"]." var/obj/item/cell/cell = get_cell() if(panel_open) - to_chat(user, "The power cell is [cell ? "installed" : "missing"].") + . += "The power cell is [cell ? "installed" : "missing"]." else - to_chat(user, "The charge meter reads [cell ? round(cell.percent(),1) : 0]%") + . += "The charge meter reads [cell ? round(cell.percent(),1) : 0]%" /obj/machinery/space_heater/state_transition(decl/machine_construction/new_state, mob/user) . = ..() diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 34e9ec988eff..f42cb1070087 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -141,13 +141,13 @@ return 1 return 0 -/obj/machinery/status_display/examine(mob/user) +/obj/machinery/status_display/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(mode != STATUS_DISPLAY_BLANK && mode != STATUS_DISPLAY_ALERT) - to_chat(user, "The display says:
\t[sanitize(message1)]
\t[sanitize(message2)]") + . += "The display says:
\t[sanitize(message1)]
\t[sanitize(message2)]" if(mode == STATUS_DISPLAY_ALERT) var/decl/security_state/security_state = GET_DECL(global.using_map.security_state) - to_chat(user, "The current alert level is [security_state.current_security_level.name].") + . += "The current alert level is [security_state.current_security_level.name]." /obj/machinery/status_display/proc/set_message(m1, m2) if(m1) diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index f48d05b08d79..0b61d1782680 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -42,12 +42,11 @@ // Lose memory locked = null -/obj/machinery/computer/teleporter/examine(mob/user) +/obj/machinery/computer/teleporter/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(locked) var/turf/T = get_turf(locked) - to_chat(user, SPAN_NOTICE("The console is locked on to \[[T.loc.name]\].")) - + . += SPAN_NOTICE("The console is locked on to \[[T.loc.name]\].") /obj/machinery/computer/teleporter/attackby(var/obj/I, var/mob/user) diff --git a/code/game/machinery/vitals_monitor.dm b/code/game/machinery/vitals_monitor.dm index f23583386a9a..d62d255d74db 100644 --- a/code/game/machinery/vitals_monitor.dm +++ b/code/game/machinery/vitals_monitor.dm @@ -19,14 +19,14 @@ victim = null . = ..() -/obj/machinery/vitals_monitor/examine(mob/user) +/obj/machinery/vitals_monitor/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(victim) if(stat & NOPOWER) - to_chat(user, SPAN_NOTICE("It's unpowered.")) + . += SPAN_NOTICE("It's unpowered.") return - to_chat(user, SPAN_NOTICE("Vitals of [victim]:")) - to_chat(user, SPAN_NOTICE("Pulse: [victim.get_pulse_as_string(GETPULSE_TOOL)]")) + . += SPAN_NOTICE("Vitals of [victim]:") + . += SPAN_NOTICE("Pulse: [victim.get_pulse_as_string(GETPULSE_TOOL)]") var/brain_activity = "none" var/obj/item/organ/internal/brain = GET_INTERNAL_ORGAN(victim, BP_BRAIN) @@ -41,7 +41,7 @@ brain_activity = "extremely weak" else brain_activity = "some" - to_chat(user, SPAN_NOTICE("Brain activity: [brain_activity]")) + . += SPAN_NOTICE("Brain activity: [brain_activity]") var/breathing = "none" var/obj/item/organ/internal/lungs/lungs = victim.get_organ(BP_LUNGS, /obj/item/organ/internal/lungs) @@ -51,7 +51,7 @@ else if(lungs.breath_fail_ratio < 1) breathing = "shallow" - to_chat(user, SPAN_NOTICE("Breathing: [breathing]")) + . += SPAN_NOTICE("Breathing: [breathing]") /obj/machinery/vitals_monitor/Process() if(QDELETED(victim)) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 6f573835da35..1beca6b072f1 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -62,9 +62,9 @@ create_reagents(100) . = ..() -/obj/machinery/washing_machine/examine(mob/user) +/obj/machinery/washing_machine/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, SPAN_NOTICE("The detergent port is [atom_flags & ATOM_FLAG_OPEN_CONTAINER ? "open" : "closed"].")) + . += SPAN_NOTICE("The detergent port is [atom_flags & ATOM_FLAG_OPEN_CONTAINER ? "open" : "closed"].") /obj/machinery/washing_machine/proc/wash() if(operable()) diff --git a/code/game/objects/__objs.dm b/code/game/objects/__objs.dm index 23cf27f6002e..91241dd59401 100644 --- a/code/game/objects/__objs.dm +++ b/code/game/objects/__objs.dm @@ -168,12 +168,12 @@ /obj/proc/can_embed() return FALSE -/obj/examine(mob/user, distance, infix, suffix) +/obj/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if((obj_flags & OBJ_FLAG_ROTATABLE)) - to_chat(user, SPAN_SUBTLE("\The [src] can be rotated with alt-click.")) + . += SPAN_SUBTLE("\The [src] can be rotated with alt-click.") if((obj_flags & OBJ_FLAG_ANCHORABLE)) - to_chat(user, SPAN_SUBTLE("\The [src] can be anchored or unanchored with a wrench.")) + . += SPAN_SUBTLE("\The [src] can be anchored or unanchored with a wrench.") /obj/proc/rotate(mob/user) if(!CanPhysicallyInteract(user)) diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm index 115e71b7df9d..5fae22fc6003 100644 --- a/code/game/objects/effects/decals/Cleanable/humans.dm +++ b/code/game/objects/effects/decals/Cleanable/humans.dm @@ -202,11 +202,11 @@ else icon_state = "writing1" -/obj/effect/decal/cleanable/blood/writing/examine(mob/user) +/obj/effect/decal/cleanable/blood/writing/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/processed_message = user.handle_reading_literacy(user, message) if(processed_message) - to_chat(user, "It reads: \"[message]\"") + . += "It reads: \"[message]\"" /obj/effect/decal/cleanable/blood/gibs name = "gibs" diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 27bc8a998ed6..83baef59cca6 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -324,7 +324,7 @@ return FALSE return wielder.can_twohand_item(src) -/obj/item/examine(mob/user, distance) +/obj/item/get_examine_strings(mob/user, distance, infix, suffix) var/list/desc_comp = list() desc_comp += "It is a [w_class_description()] item." @@ -403,8 +403,7 @@ desc_comp += "It is covered in [coating.get_coated_name()]." // It is covered in dilute oily slimy bloody mud. if(check_rights(R_DEBUG, 0, user)) - to_chat(user, "\The [src] has a temperature of [temperature]K.") - + desc_comp += "\The [src] has a temperature of [temperature]K." return ..(user, distance, "", jointext(desc_comp, "
")) diff --git a/code/game/objects/items/_item_drying.dm b/code/game/objects/items/_item_drying.dm index f9575e2dc961..c3044b33be21 100644 --- a/code/game/objects/items/_item_drying.dm +++ b/code/game/objects/items/_item_drying.dm @@ -46,7 +46,7 @@ /obj/item/proc/get_max_drying_wetness() return initial(drying_wetness) || drying_wetness || 1 -// Returns a string used in drying rack examine(). +// Returns a string used in drying rack examined_by(). /obj/item/proc/get_dryness_text(var/obj/rack) var/moistness = drying_wetness / get_max_drying_wetness() if(moistness > 0.65) diff --git a/code/game/objects/items/crutches.dm b/code/game/objects/items/crutches.dm index 4f22b7a8f2ca..9e5b661a4ffa 100644 --- a/code/game/objects/items/crutches.dm +++ b/code/game/objects/items/crutches.dm @@ -43,13 +43,13 @@ overlay.add_overlay(overlay_image(icon, "[overlay.icon_state]-padding", padding_extension.get_padding_color(material_alteration & MAT_FLAG_ALTERATION_COLOR), RESET_COLOR | RESET_ALPHA)) . = ..() -/obj/item/crutch/examine(mob/user, distance, infix, suffix) +/obj/item/crutch/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/datum/extension/padding/padding_extension = get_extension(src, __IMPLIED_TYPE__) var/decl/material/padding_material = padding_extension?.get_padding_material() if(padding_material) var/padding_paint_color = padding_extension.get_padding_color(FALSE) // do not include material color - to_chat(user, "It has been padded with [padding_paint_color ? "[padding_material.paint_verb] " : null][padding_material.use_name].") + . += "It has been padded with [padding_paint_color ? "[padding_material.paint_verb] " : null][padding_material.use_name]." /obj/item/crutch/aluminum material = /decl/material/solid/metal/aluminium diff --git a/code/game/objects/items/cryobag.dm b/code/game/objects/items/cryobag.dm index b5d5f68a3e08..f7856942decb 100644 --- a/code/game/objects/items/cryobag.dm +++ b/code/game/objects/items/cryobag.dm @@ -101,13 +101,16 @@ return airtank ..() -/obj/structure/closet/body_bag/cryobag/examine(mob/user) +/obj/structure/closet/body_bag/cryobag/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + . += "The stasis meter shows '[stasis_power]x'." + +/obj/structure/closet/body_bag/cryobag/examined_by(mob/user, distance, infix, suffix) . = ..() - to_chat(user,"The stasis meter shows '[stasis_power]x'.") if(Adjacent(user)) //The bag's rather thick and opaque from a distance. - to_chat(user, "You peer into \the [src].") - for(var/mob/living/L in contents) - L.examine(arglist(args)) + to_chat(user, SPAN_INFO("You peer into \the [src].")) + for(var/mob/living/patient in contents) + . += patient.examined_by(user, distance, infix, suffix) /obj/item/usedcryobag name = "used stasis bag" diff --git a/code/game/objects/items/devices/boombox.dm b/code/game/objects/items/devices/boombox.dm index 1b9c5ecbc428..fc3850c843bc 100644 --- a/code/game/objects/items/devices/boombox.dm +++ b/code/game/objects/items/devices/boombox.dm @@ -36,12 +36,12 @@ /obj/item/boombox/emp_act(severity) boombox_break() -/obj/item/boombox/examine(mob/user) +/obj/item/boombox/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(!panel) - to_chat(user, SPAN_NOTICE("The front panel is unhinged.")) + . += SPAN_NOTICE("The front panel is unhinged.") if(broken) - to_chat(user, SPAN_WARNING("It's broken.")) + . += SPAN_WARNING("It's broken.") /obj/item/boombox/Destroy() stop() diff --git a/code/game/objects/items/devices/cable_painter.dm b/code/game/objects/items/devices/cable_painter.dm index f645ac96109e..80cbe215f4a5 100644 --- a/code/game/objects/items/devices/cable_painter.dm +++ b/code/game/objects/items/devices/cable_painter.dm @@ -11,10 +11,10 @@ . = ..() color_selection = pick(get_global_cable_colors()) -/obj/item/cable_painter/examine(mob/user, distance) +/obj/item/cable_painter/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "The color is currently set to [lowertext(color_selection)].") + . += "The color is currently set to [lowertext(color_selection)]." /obj/item/cable_painter/attack_self(mob/user) var/new_color_selection = input("What color would you like to use?", "Choose a Color", color_selection) as null|anything in get_global_cable_colors() diff --git a/code/game/objects/items/devices/dociler.dm b/code/game/objects/items/devices/dociler.dm index ac9af7d349e3..6e66017549c6 100644 --- a/code/game/objects/items/devices/dociler.dm +++ b/code/game/objects/items/devices/dociler.dm @@ -11,9 +11,9 @@ var/loaded = 1 var/mode = "completely" -/obj/item/dociler/examine(mob/user) +/obj/item/dociler/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It is currently set to [mode] docile mode.") + . += SPAN_NOTICE("It is currently set to '[mode] docile' mode.") /obj/item/dociler/attack_self(var/mob/user) if(mode == "somewhat") diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 4f641b1f350e..75ed00418bac 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -46,13 +46,13 @@ radiation_count = SSradiation.get_rads_at_turf(get_turf(src)) update_icon() -/obj/item/geiger/examine(mob/user) +/obj/item/geiger/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/msg = "[scanning ? "ambient" : "stored"] Radiation level: [radiation_count ? radiation_count : "0"] Roentgen." if(radiation_count > RAD_LEVEL_LOW) - to_chat(user, "[msg]") + . += SPAN_DANGER("[msg]") else - to_chat(user, "[msg]") + . += SPAN_NOTICE("[msg]") /obj/item/geiger/attack_self(var/mob/user) scanning = !scanning diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 7704fb75550a..d592062c4312 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -40,10 +40,10 @@ var/global/list/all_gps_units = list() update_holder() update_icon() -/obj/item/gps/examine(mob/user, distance) +/obj/item/gps/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, SPAN_NOTICE("\The [src]'s screen shows: [get_coordinates()].")) + . += SPAN_NOTICE("\The [src]'s screen shows: [get_coordinates()].") /obj/item/gps/proc/get_coordinates() var/turf/T = get_turf(src) diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index 63575144f887..ff3fe45f5725 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -24,14 +24,14 @@ set_extension(src, /datum/extension/network_device/lazy) //look at it -/obj/item/holowarrant/examine(mob/user, distance) +/obj/item/holowarrant/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(active) - to_chat(user, "It's a holographic warrant for '[active.fields["namewarrant"]]'.") + . += "It's a holographic warrant for '[active.fields["namewarrant"]]'." if(distance <= 1) - show_content(user) + show_content(user) // opens a browser else - to_chat(user, "You have to be closer if you want to read it.") + . += SPAN_WARNING("You have to be closer if you want to read it.") //hit yourself with it /obj/item/holowarrant/attack_self(mob/user) @@ -103,7 +103,7 @@ SPAN_NOTICE("\The [user] holds up a warrant projector and shows the contents to \the [target]."), SPAN_NOTICE("You show the warrant to \the [target].") ) - target.examinate(src) + target.examine_verb(src) return TRUE /obj/item/holowarrant/on_update_icon() diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 34115f49b63e..4d9877a67ead 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -57,10 +57,10 @@ var/emagged = 0 var/charge = 0 -/obj/item/lightreplacer/examine(mob/user, distance) +/obj/item/lightreplacer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2) - to_chat(user, "It has [uses] light\s remaining.") + . += "It has [uses] light\s remaining." /obj/item/lightreplacer/resolve_attackby(var/atom/A, mob/user) diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index 1bdc6b37d749..b5eb44262b35 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -62,6 +62,6 @@ if(!parts) qdel(src) -/obj/item/modkit/examine(mob/user) +/obj/item/modkit/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) - to_chat(user, "It looks as though it modifies hardsuits to fit [target_bodytype] users.") + . += "It looks as though it modifies hardsuits to fit [target_bodytype] users." diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index 3c6f08681458..90c99edcaacc 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -361,9 +361,9 @@ update_icon() -/obj/item/paint_sprayer/examine(mob/user) +/obj/item/paint_sprayer/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) - to_chat(user, "It is configured to produce the '[decal]' decal with a direction of '[paint_dir]' using [spray_color] paint.") + . += "It is configured to produce the '[decal]' decal with a direction of '[paint_dir]' using [spray_color] paint." /obj/item/paint_sprayer/CtrlClick() if (!isturf(loc)) diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 2b4353629192..081365675f01 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -445,16 +445,16 @@ if(can_transmit_binary()) LAZYADD(., "- Robot talk: [prefix]+") -/obj/item/radio/examine(mob/user, distance) +/obj/item/radio/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (distance <= 1 || loc == user) var/list/channel_descriptions = get_accessible_channel_descriptions(user) if(length(channel_descriptions)) - to_chat(user, "\The [src] has the following channel [length(channel_descriptions) == 1 ? "shortcut" : "shortcuts"] configured:") + . += "\The [src] has the following channel [length(channel_descriptions) == 1 ? "shortcut" : "shortcuts"] configured:" for(var/line in channel_descriptions) - to_chat(user, line) + . += line if(panel_open) - to_chat(user, SPAN_WARNING("A panel on the back of \the [src] is hanging open.")) + . += SPAN_WARNING("A panel on the back of \the [src] is hanging open.") /obj/item/radio/attackby(obj/item/W, mob/user) user.set_machine(src) diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index ec7786717f7b..c3cf46fe3b81 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -29,11 +29,11 @@ QDEL_NULL(radio) return ..() -/obj/item/spy_bug/examine(mob/user, distance) +/obj/item/spy_bug/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 0) - to_chat(user, "It's a tiny camera, microphone, and transmission device in a happy union.") - to_chat(user, "Needs to be both configured and brought in contact with monitor device to be fully functional.") + . += "It's a tiny camera, microphone, and transmission device in a happy union." + . += "Needs to be both configured and brought in contact with monitor device to be fully functional." /obj/item/spy_bug/attack_self(mob/user) radio.attack_self(user) @@ -79,10 +79,10 @@ cameras.Cut() return ..() -/obj/item/spy_monitor/examine(mob/user, distance) +/obj/item/spy_monitor/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "The time '12:00' is blinking in the corner of the screen and \the [src] looks very cheaply made.") + . += "The time '12:00' is blinking in the corner of the screen and \the [src] looks very cheaply made." /obj/item/spy_monitor/attack_self(mob/user) radio.attack_self(user) diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index 670c9f9856fe..27b044c6a1d0 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -156,18 +156,15 @@ if(-INFINITY to 17) add_overlay("[icon_state]-battery-5") -/obj/item/suit_cooling_unit/examine(mob/user, distance) +/obj/item/suit_cooling_unit/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance >= 1) + if(distance > 1) return - if (on) - to_chat(user, "It's switched on and running.") + . += "It's switched on and running." else - to_chat(user, "It is switched off.") - + . += "It is switched off." if (cover_open) - to_chat(user, "The panel is open.") - + . += "The panel is open." if (cell) - to_chat(user, "The charge meter reads [round(cell.percent())]%.") + . += "The charge meter reads [round(cell.percent())]%." diff --git a/code/game/objects/items/devices/suit_sensor_jammer.dm b/code/game/objects/items/devices/suit_sensor_jammer.dm index 62a947a27ad3..af12560327a1 100644 --- a/code/game/objects/items/devices/suit_sensor_jammer.dm +++ b/code/game/objects/items/devices/suit_sensor_jammer.dm @@ -80,17 +80,16 @@ var/new_range = range + (rand(0,6) / severity) - (rand(0,3) / severity) set_range(new_range) -/obj/item/suit_sensor_jammer/examine(mob/user, distance) +/obj/item/suit_sensor_jammer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 3) - var/list/message = list() - message += "This device appears to be [active ? "" : "in"]active and " + var/message = "This device appears to be [active ? "" : "in"]active and " var/obj/item/cell/cell = get_cell() if(cell) message += "displays a charge level of [cell.percent()]%." else message += "is lacking a cell." - to_chat(user, jointext(message,.)) + . += message /obj/item/suit_sensor_jammer/CanUseTopic(user, state) var/obj/item/cell/cell = get_cell() diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 22eba630568e..54ecd2dfd4ef 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -90,10 +90,10 @@ mytape = null update_icon() -/obj/item/taperecorder/examine(mob/user, distance) +/obj/item/taperecorder/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && maintenance) - to_chat(user, "The wires are exposed.") + . += SPAN_NOTICE("The wires are exposed.") /obj/item/taperecorder/hear_talk(mob/living/M, msg, var/verb="says", decl/language/speaking=null) if(mytape && recording) @@ -532,9 +532,9 @@ /obj/item/magnetic_tape/loose/get_loose_tape() return -/obj/item/magnetic_tape/loose/examine(mob/user, distance) +/obj/item/magnetic_tape/loose/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "It looks long enough to hold [max_capacity] seconds worth of recording.") + . += SPAN_NOTICE("It looks long enough to hold [max_capacity] seconds worth of recording.") if(doctored && user.skill_check(SKILL_FORENSICS, SKILL_PROF)) - to_chat(user, "It has been tampered with...") + . += SPAN_WARNING("It has been tampered with...") diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index 272de8433723..914286faa0f3 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -30,11 +30,11 @@ global.listening_objects += src . = ..() -/obj/item/camera/tvcamera/examine(mob/user) +/obj/item/camera/tvcamera/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "Video feed is currently: [video_enabled ? "Online" : "Offline"]") - to_chat(user, "Audio feed is currently: [radio.broadcasting ? "Online" : "Offline"]") - to_chat(user, "Photography setting is currently: [turned_on ? "On" : "Off"]") + . += "Video feed is currently: [video_enabled ? "Online" : "Offline"]" + . += "Audio feed is currently: [radio.broadcasting ? "Online" : "Offline"]" + . += "Photography setting is currently: [turned_on ? "On" : "Off"]" /obj/item/camera/tvcamera/attack_self(mob/user) add_fingerprint(user) diff --git a/code/game/objects/items/documents.dm b/code/game/objects/items/documents.dm index 28dfc7099b75..151aa5b302e3 100644 --- a/code/game/objects/items/documents.dm +++ b/code/game/objects/items/documents.dm @@ -10,7 +10,7 @@ _base_attack_force = 0 var/description_antag = "These conversations contain a massive amount of dirt on major figures: drugs, sex, money..." -/obj/item/documents/examine(mob/user) +/obj/item/documents/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(description_antag) - to_chat(user, description_antag) + . += description_antag diff --git a/code/game/objects/items/flame/flame_fuelled.dm b/code/game/objects/items/flame/flame_fuelled.dm index 07bcfe40859e..ce4c864b0a82 100644 --- a/code/game/objects/items/flame/flame_fuelled.dm +++ b/code/game/objects/items/flame/flame_fuelled.dm @@ -49,26 +49,26 @@ // End boilerplate. -/obj/item/flame/fuelled/examine(mob/user, distance) +/obj/item/flame/fuelled/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && user) var/decl/material/fuel_reagent = GET_DECL(fuel_type) if(fuel_reagent) - to_chat(user, SPAN_NOTICE("\The [src] is designed to burn [fuel_reagent.liquid_name].")) + . += SPAN_NOTICE("\The [src] is designed to burn [fuel_reagent.liquid_name].") if(reagents?.maximum_volume) switch(reagents.total_volume / reagents.maximum_volume) if(0 to 0.1) - to_chat(user, SPAN_WARNING("\The [src] is nearly empty.")) + . += SPAN_WARNING("\The [src] is nearly empty.") if(0.1 to 0.25) - to_chat(user, SPAN_NOTICE("\The [src] is one-quarter full.")) + . += SPAN_NOTICE("\The [src] is one-quarter full.") if(0.25 to 0.5) - to_chat(user, SPAN_NOTICE("\The [src] is half full.")) + . += SPAN_NOTICE("\The [src] is half full.") if(0.5 to 0.75) - to_chat(user, SPAN_NOTICE("\The [src] is three-quarters full.")) + . += SPAN_NOTICE("\The [src] is three-quarters full.") else - to_chat(user, SPAN_NOTICE("\The [src] is full.")) + . += SPAN_NOTICE("\The [src] is full.") /obj/item/flame/fuelled/get_fuel() return REAGENT_VOLUME(reagents, fuel_type) diff --git a/code/game/objects/items/flashlights/_flashlight.dm b/code/game/objects/items/flashlights/_flashlight.dm index fcde3cd9ffee..74663d15a37d 100644 --- a/code/game/objects/items/flashlights/_flashlight.dm +++ b/code/game/objects/items/flashlights/_flashlight.dm @@ -73,10 +73,10 @@ else set_light(0) -/obj/item/flashlight/examine(mob/user, distance) +/obj/item/flashlight/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(light_wedge && isturf(loc)) - to_chat(user, FONT_SMALL(SPAN_NOTICE("\The [src] is facing [dir2text(dir)]."))) + . += FONT_SMALL(SPAN_NOTICE("\The [src] is facing [dir2text(dir)].")) /obj/item/flashlight/dropped(mob/user) . = ..() diff --git a/code/game/objects/items/hourglass.dm b/code/game/objects/items/hourglass.dm index 98bb75f12811..75b4acd6de5b 100644 --- a/code/game/objects/items/hourglass.dm +++ b/code/game/objects/items/hourglass.dm @@ -43,7 +43,7 @@ /obj/item/hourglass/proc/sand_is_falling() return (world.time - last_flipped) < sand_duration -/obj/item/hourglass/examine(mob/user, distance, infix, suffix) +/obj/item/hourglass/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2) var/sand_string = "not falling" @@ -60,7 +60,7 @@ sand_string = "almost halfway done falling" if(0.75 to 1) sand_string = "just starting to fall" - to_chat(user, SPAN_NOTICE("The [sand_material.solid_name] in \the [src] is [sand_string].")) + . += SPAN_NOTICE("The [sand_material.solid_name] in \the [src] is [sand_string].") /obj/item/hourglass/proc/get_sand_state(world_inventory_state) /// This is a fraction of the sand_duration. diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm index fc70e8902a54..9e99fdea07d2 100644 --- a/code/game/objects/items/paintkit.dm +++ b/code/game/objects/items/paintkit.dm @@ -13,9 +13,9 @@ /obj/item/kit/get_single_monetary_worth() . = max(round(..()), (custom ? 100 : 750) * uses) // Luxury good, value is entirely artificial. -/obj/item/kit/examine(mob/user) +/obj/item/kit/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It has [uses] use\s left.") + . += "It has [uses] use\s left." /obj/item/kit/inherit_custom_item_data(var/datum/custom_item/citem) custom = TRUE @@ -74,9 +74,9 @@ desc = "A kit containing all the needed tools and parts to repaint an exosuit." abstract_type = /obj/item/kit/paint -/obj/item/kit/paint/examine(mob/user) +/obj/item/kit/paint/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "This kit will add a '[new_name]' decal to an exosuit'.") + . += "This kit will add a '[new_name]' decal to an exosuit'." // exosuit kits. /obj/item/kit/paint/flames_red diff --git a/code/game/objects/items/rescuebag.dm b/code/game/objects/items/rescuebag.dm index 6e69603618ea..e51ebc60adb3 100644 --- a/code/game/objects/items/rescuebag.dm +++ b/code/game/objects/items/rescuebag.dm @@ -49,13 +49,13 @@ else return ..() -/obj/item/bodybag/rescue/examine(mob/user) +/obj/item/bodybag/rescue/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(airtank) - to_chat(user,"The pressure meter on \the [airtank] shows '[airtank.air_contents.return_pressure()] kPa'.") - to_chat(user,"The distribution valve on \the [airtank] is set to '[airtank.distribute_pressure] kPa'.") + . += "The pressure meter on \the [airtank] shows '[airtank.air_contents.return_pressure()] kPa'." + . += "The distribution valve on \the [airtank] is set to '[airtank.distribute_pressure] kPa'." else - to_chat(user, "The air tank is missing.") + . += SPAN_WARNING("The air tank is missing.") /obj/structure/closet/body_bag/rescue name = "rescue bag" @@ -126,15 +126,17 @@ /obj/structure/closet/body_bag/rescue/return_air() //Used to make stasis bags protect from vacuum. return atmo -/obj/structure/closet/body_bag/rescue/examine(mob/user) +/obj/structure/closet/body_bag/rescue/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(airtank) - to_chat(user,"The pressure meter on \the [airtank] shows '[airtank.air_contents.return_pressure()] kPa'.") - to_chat(user,"The distribution valve on \the [airtank] is set to '[airtank.distribute_pressure] kPa'.") + . += "The pressure meter on \the [airtank] shows '[airtank.air_contents.return_pressure()] kPa'." + . += "The distribution valve on \the [airtank] is set to '[airtank.distribute_pressure] kPa'." else - to_chat(user, "The air tank is missing.") - to_chat(user,"The pressure meter on [src] shows '[atmo.return_pressure()] kPa'.") + . += SPAN_WARNING("The air tank is missing.") + . += "The pressure meter on [src] shows '[atmo.return_pressure()] kPa'." + +/obj/structure/closet/body_bag/rescue/examined_by(mob/user, distance, infix, suffix) if(Adjacent(user)) //The bag's rather thick and opaque from a distance. - to_chat(user, "You peer into \the [src].") + . += SPAN_INFO("You peer into \the [src].") for(var/mob/living/L in contents) - L.examine(arglist(args)) + L.examined_by(user, distance, infix, suffix) diff --git a/code/game/objects/items/spirit_board.dm b/code/game/objects/items/spirit_board.dm index 6134ada23b94..8a539d6f69d0 100644 --- a/code/game/objects/items/spirit_board.dm +++ b/code/game/objects/items/spirit_board.dm @@ -9,9 +9,9 @@ var/planchette = "A" var/lastuser = null -/obj/item/spirit_board/examine(mob/user) - ..() - to_chat(user, "The planchette is sitting at \"[planchette]\".") +/obj/item/spirit_board/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + . += "The planchette is sitting at \"[planchette]\"." /obj/item/spirit_board/attack_hand(mob/user) if(user.check_intent(I_FLAG_GRAB) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) diff --git a/code/game/objects/items/stacks/medical/medical_bandage.dm b/code/game/objects/items/stacks/medical/medical_bandage.dm index 4e13efa76e4e..23d81504abf9 100644 --- a/code/game/objects/items/stacks/medical/medical_bandage.dm +++ b/code/game/objects/items/stacks/medical/medical_bandage.dm @@ -30,11 +30,11 @@ . += "[poultice_reagent_requirements[reagent]] unit\s of [reagent_decl.liquid_name]" . = english_list(.) -/obj/item/stack/medical/bandage/examine(mob/user, distance) +/obj/item/stack/medical/bandage/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/poultice_requirement_string = get_poultice_requirement_string() if(poultice_requirement_string) - to_chat(user, SPAN_NOTICE("With a mixture of [poultice_requirement_string], you could use a bandage to make a herbal poultice.")) + . += SPAN_NOTICE("With a mixture of [poultice_requirement_string], you could use a bandage to make a herbal poultice.") /obj/item/stack/medical/bandage/attackby(obj/item/used_item, mob/living/user) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 2010f99039de..c434ba259dc5 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -76,13 +76,13 @@ return TRUE return FALSE -/obj/item/stack/examine(mob/user, distance) +/obj/item/stack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - if(!uses_charge) - to_chat(user, "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s in the stack.") + if(uses_charge) + . += "There is enough charge for [get_amount()]." else - to_chat(user, "There is enough charge for [get_amount()].") + . += "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s in the stack." /obj/item/stack/on_update_icon() . = ..() diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 6a100e476002..15e634163ec3 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -56,10 +56,10 @@ overlay.icon_state = "[overlay.icon_state]_empty" . = ..() -/obj/item/chems/water_balloon/examine(mob/user, distance, infix, suffix) +/obj/item/chems/water_balloon/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance == 1) - to_chat(user, "It's [reagents?.total_volume > 0? "filled with liquid sloshing around" : "empty"].") + if(distance <= 1) + . += "It's [reagents?.total_volume > 0? "filled with liquid sloshing around" : "empty"]." /obj/item/chems/water_balloon/on_reagent_change() if(!(. = ..())) @@ -672,10 +672,10 @@ _base_attack_force = 1 var/rule_info -/obj/item/toy/chess/examine(mob/user, distance, infix, suffix) +/obj/item/toy/chess/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(rule_info) - to_chat(user, SPAN_NOTICE(rule_info)) + . += SPAN_NOTICE(rule_info) /obj/item/toy/chess/pawn name = "oversized white pawn" diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm index f48b28762d0e..6f571b425613 100644 --- a/code/game/objects/items/weapons/RCD.dm +++ b/code/game/objects/items/weapons/RCD.dm @@ -40,11 +40,11 @@ /obj/item/rcd/proc/can_use(var/mob/user,var/turf/T) return (user.Adjacent(T) && user.get_active_held_item() == src && !user.incapacitated()) -/obj/item/rcd/examine(mob/user) +/obj/item/rcd/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(src.type == /obj/item/rcd && loc == user) - to_chat(user, "The current mode is '[work_mode]'.") - to_chat(user, "It currently holds [stored_matter]/[max_stored_matter] matter-units.") + if(src.type == /obj/item/rcd && loc == user) // why tho + . += "The current mode is '[work_mode]'." + . += "It currently holds [stored_matter]/[max_stored_matter] matter-units." /obj/item/rcd/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/rcd_ammo)) @@ -133,10 +133,10 @@ /decl/material/solid/glass = sheets ) -/obj/item/rcd_ammo/examine(mob/user, distance) +/obj/item/rcd_ammo/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "It has [remaining] unit\s of matter left.") + . += SPAN_NOTICE("It has [remaining] unit\s of matter left.") /obj/item/rcd_ammo/large name = "high-capacity matter cartridge" diff --git a/code/game/objects/items/weapons/RPD.dm b/code/game/objects/items/weapons/RPD.dm index cf1a465a2e33..6a4725991050 100644 --- a/code/game/objects/items/weapons/RPD.dm +++ b/code/game/objects/items/weapons/RPD.dm @@ -150,11 +150,11 @@ var/global/list/rpd_pipe_selection_skilled = list() if(prob(20)) spark_at(src, amount = 5, holder = src) -/obj/item/rpd/examine(var/mob/user, distance) +/obj/item/rpd/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(user.skill_check(SKILL_ATMOS,SKILL_BASIC)) - to_chat(user, "Current selection reads: [P]") + . += "[SPAN_NOTICE("Current selection reads:")] [P]" else to_chat(user, SPAN_WARNING("The readout is flashing some atmospheric jargon, you can't understand.")) diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm index 0f0a7ecb4d02..19fd6dc47b10 100644 --- a/code/game/objects/items/weapons/RSF.dm +++ b/code/game/objects/items/weapons/RSF.dm @@ -22,10 +22,10 @@ RSF /decl/material/solid/metal/silver = MATTER_AMOUNT_TRACE ) -/obj/item/rsf/examine(mob/user, distance) +/obj/item/rsf/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance <= 0) - to_chat(user, "It currently holds [stored_matter]/30 fabrication-units.") + if(distance <= 1) + . += "It currently holds [stored_matter]/30 fabrication-units." /obj/item/rsf/attackby(obj/item/W, mob/user) if (istype(W, /obj/item/rcd_ammo)) diff --git a/code/game/objects/items/weapons/broom.dm b/code/game/objects/items/weapons/broom.dm index aaa799ed5a84..e6ac21587bba 100644 --- a/code/game/objects/items/weapons/broom.dm +++ b/code/game/objects/items/weapons/broom.dm @@ -5,11 +5,11 @@ matter = list(/decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY) var/bristle_material = /decl/material/solid/organic/plantmatter/grass/dry -/obj/item/staff/broom/examine(mob/user, distance, infix, suffix) +/obj/item/staff/broom/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(bristle_material) var/decl/material/bristle_mat = GET_DECL(bristle_material) - to_chat(user, "\The [src]'s bristles are made from [bristle_mat.name].") + . += "\The [src]'s bristles are made from [bristle_mat.name]." /obj/item/staff/broom/Initialize(ml, material_key, bristles_key) if(!isnull(bristles_key)) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index e8e041f23016..37ebe84e2db5 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -28,12 +28,12 @@ slot_flags = SLOT_ID var/signed_by -/obj/item/card/union/examine(mob/user) +/obj/item/card/union/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(signed_by) - to_chat(user, "It has been signed by [signed_by].") + . += "It has been signed by [signed_by]." else - to_chat(user, "It has a blank space for a signature.") + . += "It has a blank space for a signature." /obj/item/card/union/attackby(var/obj/item/thing, var/mob/user) if(IS_PEN(thing)) @@ -144,10 +144,10 @@ var/global/const/NO_EMAG_ACT = -50 disguise(card_choices[picked], usr) -/obj/item/card/emag/examine(mob/user) +/obj/item/card/emag/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user.skill_check(SKILL_DEVICES,SKILL_ADEPT)) - to_chat(user, SPAN_WARNING("This ID card has some form of non-standard modifications.")) + . += SPAN_WARNING("This ID card has some form of non-standard modifications.") /obj/item/card/id name = "identification card" @@ -203,13 +203,16 @@ var/global/const/NO_EMAG_ACT = -50 if(href_list["look_at_id"] && istype(user)) var/turf/T = get_turf(src) if(T.CanUseTopic(user, global.view_topic_state) != STATUS_CLOSE) - user.examinate(src) + user.examine_verb(src) return TOPIC_HANDLED . = ..() -/obj/item/card/id/examine(mob/user, distance) +/obj/item/card/id/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + . += "It says '[get_display_name()]'." + +/obj/item/card/id/examined_by(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It says '[get_display_name()]'.") if(distance <= 1) show(user) diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index 5b9e2a62d934..8fb5342ed6e6 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -52,12 +52,12 @@ else add_overlay("[icon_state]-nocell") -/obj/item/defibrillator/examine(mob/user) +/obj/item/defibrillator/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(bcell) - to_chat(user, "The charge meter is showing [bcell.percent()]% charge left.") + . += "The charge meter is showing [bcell.percent()]% charge left." else - to_chat(user, "There is no cell inside.") + . += SPAN_WARNING("There is no cell inside.") /obj/item/defibrillator/ui_action_click() toggle_paddles() diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 11fa6ec87de2..55789ad967b9 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -36,12 +36,12 @@ desc = "A cheap Lucky 1337 electronic cigarette, styled like a traditional cigarette." icon = 'icons/clothing/mask/smokables/cigarette_electronic_cheap.dmi' -/obj/item/clothing/mask/smokable/ecig/simple/examine(mob/user) +/obj/item/clothing/mask/smokable/ecig/simple/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(ec_cartridge) - to_chat(user,SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.")) + . += SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.") else - to_chat(user,SPAN_NOTICE("There's no cartridge connected.")) + . += SPAN_NOTICE("There's no cartridge connected.") /obj/item/clothing/mask/smokable/ecig/util name = "electronic cigarette" @@ -55,12 +55,12 @@ . = ..() set_color(pick(ecig_colors)) -/obj/item/clothing/mask/smokable/ecig/util/examine(mob/user) +/obj/item/clothing/mask/smokable/ecig/util/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(ec_cartridge) - to_chat(user,SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.")) + . += SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.") else - to_chat(user,SPAN_NOTICE("There's no cartridge connected.")) + . += SPAN_NOTICE("There's no cartridge connected.") /obj/item/clothing/mask/smokable/ecig/deluxe name = "deluxe electronic cigarette" @@ -71,12 +71,12 @@ loaded_cell_type = loaded_cell_type || /obj/item/cell/device/high return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) //enough for four cartridges -/obj/item/clothing/mask/smokable/ecig/deluxe/examine(mob/user) +/obj/item/clothing/mask/smokable/ecig/deluxe/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(ec_cartridge) - to_chat(user,SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.")) + . += SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] units of liquid remaining.") else - to_chat(user,SPAN_NOTICE("There's no cartridge connected.")) + . += SPAN_NOTICE("There's no cartridge connected.") /obj/item/clothing/mask/smokable/ecig/proc/Deactivate() lit = FALSE @@ -187,9 +187,9 @@ volume = 20 atom_flags = ATOM_FLAG_OPEN_CONTAINER -/obj/item/chems/ecig_cartridge/examine(mob/user)//to see how much left +/obj/item/chems/ecig_cartridge/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "The cartridge has [reagents.total_volume] units of liquid remaining.") + . += "The cartridge has [reagents.total_volume] units of liquid remaining." //flavours /obj/item/chems/ecig_cartridge/blank diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index cc1018b16393..99b4cb049def 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -33,17 +33,17 @@ update_icon() -/obj/item/flamethrower/examine(mob/user, distance) +/obj/item/flamethrower/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(tank) - to_chat(user, SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(tank.air_contents.return_pressure(), 10)] kPa left in it.")) + . += SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(tank.air_contents.return_pressure(), 10)] kPa left in it.") else - to_chat(user, SPAN_WARNING("It has no tank installed.")) + . += SPAN_WARNING("It has no tank installed.") if(igniter) - to_chat(user, SPAN_NOTICE("It has \an [igniter] installed.")) + . += SPAN_NOTICE("It has \an [igniter] installed.") else - to_chat(user, SPAN_WARNING("It has no igniter installed.")) + . += SPAN_WARNING("It has no igniter installed.") /obj/item/flamethrower/Destroy() QDEL_NULL(welding_tool) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 020e4634208d..be47c0d7390d 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -189,10 +189,10 @@ qdel(src) -/obj/item/grenade/chem_grenade/examine(mob/user) +/obj/item/grenade/chem_grenade/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(detonator) - to_chat(user, "With attached [detonator.name]") + . += "It has \a [detonator] attached." /obj/item/grenade/chem_grenade/large name = "large chem grenade" diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 1f91dc035d8c..29b99d979ac2 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -47,15 +47,13 @@ return 0 return 1 -/obj/item/grenade/examine(mob/user, distance) +/obj/item/grenade/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance <= 0) + if(distance <= 0 && !isnull(det_time)) if(det_time > 1) - to_chat(user, "The timer is set to [det_time/10] seconds.") - return - if(det_time == null) - return - to_chat(user, "\The [src] is set for instant detonation.") + . += "The timer is set to [det_time/10] seconds." + else + . += "\The [src] is set for instant detonation." /obj/item/grenade/attack_self(mob/user) if(active) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index fa45d10b388f..6ef925bfad78 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -33,13 +33,13 @@ loc.visible_message(SPAN_WARNING("\The [src] attached to \the [loc] snap and fall away!"), range = 1) . = ..() -/obj/item/handcuffs/examine(mob/user) +/obj/item/handcuffs/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (current_health > 0 && get_max_health() > 0) var display = get_percent_health() if (display > 66) return - to_chat(user, SPAN_WARNING("They look [display < 33 ? "badly ": ""]damaged.")) + . += SPAN_WARNING("They look [display < 33 ? "badly ": ""]damaged.") /obj/item/handcuffs/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/game/objects/items/weapons/material/ashtray.dm b/code/game/objects/items/weapons/material/ashtray.dm index 41b4cae00d92..babc46c5ba58 100644 --- a/code/game/objects/items/weapons/material/ashtray.dm +++ b/code/game/objects/items/weapons/material/ashtray.dm @@ -5,17 +5,15 @@ icon_state = "ashtray" randpixel = 5 material = /decl/material/solid/metal/bronze - material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME + material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC var/max_butts = 10 -/obj/item/ashtray/examine(mob/user) +/obj/item/ashtray/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(material) - to_chat(user, "It's made of [material.solid_name].") if(contents.len >= max_butts) - to_chat(user, "It's full.") + . += SPAN_WARNING("It's full.") else if(contents.len) - to_chat(user, "It has [contents.len] cig butts in it.") + . += "It has [contents.len] cigarette butt\s in it." /obj/item/ashtray/on_update_icon() . = ..() diff --git a/code/game/objects/items/weapons/material/coins.dm b/code/game/objects/items/weapons/material/coins.dm index 1cdd0270a96d..7c63fbb4358f 100644 --- a/code/game/objects/items/weapons/material/coins.dm +++ b/code/game/objects/items/weapons/material/coins.dm @@ -85,11 +85,11 @@ ..() transform = null -/obj/item/coin/examine(mob/user, distance) +/obj/item/coin/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(denomination && (distance <= 1 || loc == user) && user.skill_check(SKILL_FINANCE, SKILL_ADEPT)) var/decl/currency/map_cur = GET_DECL(global.using_map.default_currency) - to_chat(user, "It looks like an antiquated minting of \a [denomination.name]. These days it would be worth around [map_cur.format_value(get_combined_monetary_worth())].") + . += "It looks like an antiquated minting of \a [denomination.name]. These days it would be worth around [map_cur.format_value(get_combined_monetary_worth())]." // Subtypes. /obj/item/coin/gold diff --git a/code/game/objects/items/weapons/material/swiss.dm b/code/game/objects/items/weapons/material/swiss.dm index 69d051a3aa9f..5d8c473145fb 100644 --- a/code/game/objects/items/weapons/material/swiss.dm +++ b/code/game/objects/items/weapons/material/swiss.dm @@ -86,9 +86,12 @@ add_fingerprint(user) return TRUE -/obj/item/knife/folding/swiss/examine(mob/user) +/obj/item/knife/folding/swiss/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, active_tool == SWISSKNF_CLOSED ? "It is closed." : "Its [lowertext(active_tool)] is folded out.") + if(active_tool == SWISSKNF_CLOSED) + . += "It is closed." + else + . += "Its [lowertext(active_tool)] is folded out." /obj/item/knife/folding/swiss/update_attack_force() ..() diff --git a/code/game/objects/items/weapons/material/urn.dm b/code/game/objects/items/weapons/material/urn.dm index fe640bd26a46..cf3257dbc06f 100644 --- a/code/game/objects/items/weapons/material/urn.dm +++ b/code/game/objects/items/weapons/material/urn.dm @@ -26,7 +26,7 @@ A.dropInto(loc) user.visible_message("\The [user] pours \the [A] out from \the [src].", "You pour \the [A] out from \the [src].") -/obj/item/urn/examine(mob/user) +/obj/item/urn/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(contents.len) - to_chat(user, "\The [src] is full.") \ No newline at end of file + . += "\The [src] is full." diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index e46bd9dddc49..87d93544aebe 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -109,9 +109,9 @@ if(reagents.total_volume < reagents.maximum_volume) add_to_reagents(refill_reagent, refill_rate) -/obj/item/mop/advanced/examine(mob/user) +/obj/item/mop/advanced/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, SPAN_NOTICE("The condenser switch is set to [refill_enabled ? "ON" : "OFF"].")) + . += SPAN_NOTICE("The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") /obj/item/mop/advanced/Destroy() STOP_PROCESSING(SSobj, src) diff --git a/code/game/objects/items/weapons/secrets_disk.dm b/code/game/objects/items/weapons/secrets_disk.dm index ec806c4132fc..afcf3d485403 100644 --- a/code/game/objects/items/weapons/secrets_disk.dm +++ b/code/game/objects/items/weapons/secrets_disk.dm @@ -47,17 +47,15 @@ name = "'[pick(get_secret_project_codenames())]' project data disk" subject = "[pick(get_secret_project_types())] [pick(get_secret_project_nouns())] [pick(get_secret_project_descriptors())]" -/obj/item/disk/secret_project/examine(mob/user) +/obj/item/disk/secret_project/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(!locked) - to_chat(user, "With the disk's classified contents unlocked, \ - you peer into its preview screen and see [subject].") + if(locked) + . += "The disk is locked, you cannot see its contents." else - to_chat(user, "The disk is locked, you cannot see its contents.") + . += "With the disk's classified contents unlocked, you peer into its preview screen and see [subject]." /obj/item/disk/secret_project/emag_act(var/remaining_charges, var/mob/user) - to_chat(user, "The cryptographic lock on this disk is far too complex. \ - Your sequencer can't break the code.") + to_chat(user, "The cryptographic lock on this disk is far too complex. Your sequencer can't break the code.") return 0 /obj/item/disk/secret_project/attackby(obj/item/W, mob/user) diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index e53ef9f89e04..d4b056a508c0 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -71,7 +71,7 @@ return TRUE return ..() -/obj/item/belt/holster/examine(mob/user) +/obj/item/belt/holster/examined_by(mob/user, distance, infix, suffix) . = ..() var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) holster.examine_holster(user) diff --git a/code/game/objects/items/weapons/storage/fancy/_fancy.dm b/code/game/objects/items/weapons/storage/fancy/_fancy.dm index 66774d7abaeb..7dbc2d00ee76 100644 --- a/code/game/objects/items/weapons/storage/fancy/_fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy/_fancy.dm @@ -44,9 +44,9 @@ if(add_contents_overlays()) compile_overlays() -/obj/item/box/fancy/examine(mob/user, distance) +/obj/item/box/fancy/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1 || !key_type) return var/key_count = count_by_type(contents, key_type) - to_chat(user, "There [key_count == 1? "is" : "are"] [key_count] [initial(key_type.name)]\s in the box.") + . += "There [key_count == 1? "is" : "are"] [key_count] [initial(key_type.name)]\s in the box." diff --git a/code/game/objects/items/weapons/storage/med_pouch.dm b/code/game/objects/items/weapons/storage/med_pouch.dm index dbf2b2a6950a..5151fadcfdd9 100644 --- a/code/game/objects/items/weapons/storage/med_pouch.dm +++ b/code/game/objects/items/weapons/storage/med_pouch.dm @@ -38,9 +38,9 @@ Single Use Emergency Pouches add_overlay(cross_overlay) icon_state = "pack[!!(storage?.opened)]" -/obj/item/med_pouch/examine(mob/user) +/obj/item/med_pouch/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "Please read instructions before use.") + . += "Please read instructions before use." /obj/item/med_pouch/CanUseTopic() return STATUS_INTERACTIVE diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index 70bbf23d7775..247a52d5c5a2 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -30,9 +30,10 @@ MRE Stuff if(length(contents) && storage) storage.make_exact_fit() -/obj/item/mre/examine(mob/user) +/obj/item/mre/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, meal_desc) + if(meal_desc) + . += meal_desc /obj/item/mre/attack_self(mob/user) . = ..() diff --git a/code/game/objects/items/weapons/storage/parachute.dm b/code/game/objects/items/weapons/storage/parachute.dm index 3f6f6ac9f8c1..e129add2b64e 100644 --- a/code/game/objects/items/weapons/storage/parachute.dm +++ b/code/game/objects/items/weapons/storage/parachute.dm @@ -10,13 +10,13 @@ if(storage) storage.max_storage_space = max(1, round(storage.max_storage_space * 0.5)) -/obj/item/backpack/parachute/examine(mob/user) +/obj/item/backpack/parachute/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(Adjacent(user)) if(packed) - to_chat(user, SPAN_NOTICE("The parachute seems to be packed and ready to deploy.")) + . += SPAN_NOTICE("The parachute seems to be packed and ready to deploy.") else - to_chat(user, SPAN_DANGER("The parachute is unpacked.")) + . += SPAN_DANGER("The parachute is unpacked.") /obj/item/backpack/parachute/attack_self(mob/user) if(!user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 19eed2008471..860536919b89 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -67,11 +67,12 @@ var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) lock.ui_interact(user) -/obj/item/secure_storage/examine(mob/user, distance, infix, suffix) +/obj/item/secure_storage/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) - to_chat(user, SPAN_INFO("The service panel is [lock.open ? "open" : "closed"].")) + if(lock) + . += SPAN_INFO("The service panel is [lock.open ? "open" : "closed"].") /obj/item/secure_storage/emag_act(remaining_charges, mob/user, feedback) var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index f1d555da4d0b..4a176ec5298b 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -151,10 +151,10 @@ hitcost = 20 // Addition made by Techhead0, thanks for fullfilling the todo! -/obj/item/baton/robot/examine(mob/user, distance, infix, suffix) +/obj/item/baton/robot/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance == 1) - to_chat(user, SPAN_NOTICE("The baton is running off an external power supply.")) + . += SPAN_NOTICE("The baton is running off an external power supply.") // Override proc for the stun baton module, found in PC Security synthetics // Refactored to fix #14470 - old proc defination increased the hitcost beyond diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index a69f68703139..a14c457a73d1 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -25,10 +25,10 @@ QDEL_NULL(ion_trail) . = ..() -/obj/item/tank/jetpack/examine(mob/living/user) +/obj/item/tank/jetpack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(air_contents.total_moles < 5) - to_chat(user, "The meter on \the [src] indicates you are almost out of gas!") + . += SPAN_DANGER("The meter on \the [src] indicates you are almost out of gas!") /obj/item/tank/jetpack/verb/toggle_rockets() set name = "Toggle Jetpack Stabilization" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index b2ecbe81e5ab..23aa1b6ab20e 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -85,7 +85,7 @@ var/global/list/global/tank_gauge_cache = list() . += gas_data.get_value() * air_contents.gas[gas] * GAS_WORTH_MULTIPLIER . = max(1, round(.)) -/obj/item/tank/examine(mob/user) +/obj/item/tank/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/descriptive if(!air_contents) @@ -107,13 +107,12 @@ var/global/list/global/tank_gauge_cache = list() descriptive = "cold" else descriptive = "bitterly cold" - to_chat(user, "\The [src] feels [descriptive].") + . += SPAN_NOTICE("\The [src] feels [descriptive].") if(proxyassembly.assembly || wired) - to_chat(user, "It seems to have [wired? "some wires ": ""][wired && proxyassembly.assembly? "and ":""][proxyassembly.assembly ? "some sort of assembly ":""]attached to it.") + . += SPAN_WARNING("It seems to have [wired? "some wires ": ""][wired && proxyassembly.assembly? "and ":""][proxyassembly.assembly ? "some sort of assembly ":""]attached to it.") if(valve_welded) - to_chat(user, "\The [src] emergency relief valve has been welded shut!") - + . += SPAN_WARNING("\The [src] emergency relief valve has been welded shut!") /obj/item/tank/attackby(var/obj/item/W, var/mob/user) if (istype(loc, /obj/item/assembly)) diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index 8a9364e1e328..a8ed869e79aa 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -187,8 +187,8 @@ /obj/item/duct_tape/attackby(obj/item/W, mob/user) return stuck? stuck.attackby(W, user) : ..() -/obj/item/duct_tape/examine() - return stuck ? stuck.examine(arglist(args)) : ..() +/obj/item/duct_tape/examined_by(mob/user, distance, infix, suffix) + return stuck ? stuck.examined_by(arglist(args)) : ..() /obj/item/duct_tape/proc/attach(var/obj/item/W) stuck = W diff --git a/code/game/objects/items/weapons/tech_disks.dm b/code/game/objects/items/weapons/tech_disks.dm index 012acea79a65..c33fceca35b6 100644 --- a/code/game/objects/items/weapons/tech_disks.dm +++ b/code/game/objects/items/weapons/tech_disks.dm @@ -137,9 +137,9 @@ color = COLOR_DARK_BROWN var/data = 0 -/obj/item/disk/survey/examine(mob/user) +/obj/item/disk/survey/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "A tiny indicator on \the [src] shows it holds [data] good explorer point\s.") + . += "A tiny indicator on \the [src] shows it holds [data] good explorer point\s." /obj/item/disk/survey/get_base_value() . = holographic ? 0 : (sqrt(data) * 5) diff --git a/code/game/objects/items/weapons/towels.dm b/code/game/objects/items/weapons/towels.dm index 23bada102c8c..498f1abd25fc 100644 --- a/code/game/objects/items/weapons/towels.dm +++ b/code/game/objects/items/weapons/towels.dm @@ -37,7 +37,7 @@ // would this have any use aside from fluff strings? sandpaper grit maybe? desc = "A [is_soft ? "soft" : "rugged"] [material.adjective_name] [base_name][additional_description ? " [additional_description]" : null]." // 'a soft cotton towel' by default. also supports 'a rugged leather doormat used to blah blah' etc -/obj/item/towel/examine(mob/user, distance, infix, suffix) +/obj/item/towel/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(reagents?.total_volume && distance <= 1) var/liquid_adjective = "damp" @@ -52,7 +52,7 @@ liquid_adjective = "soaked through" if(1) liquid_adjective = "entirely saturated" - to_chat(user, "It is [liquid_adjective] with [reagents.get_coated_name()].") + . += "It is [liquid_adjective] with [reagents.get_coated_name()]." /obj/item/towel/set_material(new_material) . = ..() diff --git a/code/game/objects/items/welding/electric_welder.dm b/code/game/objects/items/welding/electric_welder.dm index b3bd71761965..c46aa882f571 100644 --- a/code/game/objects/items/welding/electric_welder.dm +++ b/code/game/objects/items/welding/electric_welder.dm @@ -17,13 +17,15 @@ loaded_cell_type = loaded_cell_type || /obj/item/cell/high return ..(loaded_cell_type, /obj/item/cell, /datum/extension/loaded_cell, charge_value) -/obj/item/weldingtool/electric/examine(mob/user, distance) +/obj/item/weldingtool/electric/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/obj/item/cell/cell = get_cell() - if(!cell) - to_chat(user, "There is no [welding_resource] source attached.") + if(cell) + if(distance == 0) + . += "It has [get_fuel()] [welding_resource] remaining." + . += "\The [cell] is attached." else - to_chat(user, (distance == 0 ? "It has [get_fuel()] [welding_resource] remaining. " : "") + "[cell] is attached.") + . += "There is no [welding_resource] source attached." /obj/item/weldingtool/electric/afterattack(var/obj/O, var/mob/user, var/proximity) if(proximity && istype(O, /obj/structure/reagent_dispensers/fueltank) && !welding) diff --git a/code/game/objects/items/welding/weldbackpack.dm b/code/game/objects/items/welding/weldbackpack.dm index fe4bfd67ad24..6291c9d2a951 100644 --- a/code/game/objects/items/welding/weldbackpack.dm +++ b/code/game/objects/items/welding/weldbackpack.dm @@ -146,9 +146,9 @@ welder_image.pixel_x = 15 add_overlay(welder_image) -/obj/item/chems/weldpack/examine(mob/user) +/obj/item/chems/weldpack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "[html_icon(src)] [reagents.total_volume] unit\s of fuel left!") + . += "[html_icon(src)] [reagents.total_volume] unit\s of fuel left!" /obj/item/chems/weldpack/dropped(mob/user) . = ..() diff --git a/code/game/objects/items/welding/weldingtool.dm b/code/game/objects/items/welding/weldingtool.dm index 6a2158acb84d..f46f50010915 100644 --- a/code/game/objects/items/welding/weldingtool.dm +++ b/code/game/objects/items/welding/weldingtool.dm @@ -62,10 +62,12 @@ /obj/item/weldingtool/isflamesource() . = isOn() -/obj/item/weldingtool/examine(mob/user, distance) +/obj/item/weldingtool/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if (tank) - to_chat(user, (distance <= 1 ? "It has [round(get_fuel(), 0.1)] [welding_resource] remaining. " : "") + "[tank] is attached.") + if(distance <= 1) + . += "It has [round(get_fuel(), 0.1)] [welding_resource] remaining." + if (tank) + . += "\The [tank] is attached." /obj/item/weldingtool/proc/insert_tank(var/obj/item/chems/welder_tank/T, var/mob/user, var/no_updates = FALSE, var/quiet = FALSE) if(tank && !ispath(tank)) diff --git a/code/game/objects/items/welding/weldingtool_tank.dm b/code/game/objects/items/welding/weldingtool_tank.dm index 7b5b455663a0..7cb3e5bd84a0 100644 --- a/code/game/objects/items/welding/weldingtool_tank.dm +++ b/code/game/objects/items/welding/weldingtool_tank.dm @@ -23,15 +23,15 @@ /obj/item/chems/welder_tank/populate_reagents() add_to_reagents(/decl/material/liquid/fuel, reagents.maximum_volume) -/obj/item/chems/welder_tank/examine(mob/user, distance) +/obj/item/chems/welder_tank/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1) return if(reagents.total_volume <= 0) - to_chat(user, "It is empty.") + . += SPAN_WARNING("It is empty.") else - to_chat(user, "It contains [reagents.total_volume] units of liquid.") - to_chat(user, " It can hold up to [reagents.maximum_volume] units.") + . += "It contains [reagents.total_volume] units of liquid." + . += "It can hold up to [reagents.maximum_volume] units." /obj/item/chems/welder_tank/afterattack(obj/O, mob/user, proximity, click_parameters) if (!ATOM_IS_OPEN_CONTAINER(src) || !proximity) diff --git a/code/game/objects/structures/__structure.dm b/code/game/objects/structures/__structure.dm index 33bb9fb91026..b7c19446d471 100644 --- a/code/game/objects/structures/__structure.dm +++ b/code/game/objects/structures/__structure.dm @@ -70,57 +70,54 @@ if(!CanFluidPass()) fluid_update(TRUE) -/obj/structure/examine(mob/user, distance, infix, suffix) +/obj/structure/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance <= 3) - if(distance <= 1 && lock) - to_chat(user, SPAN_NOTICE("\The [src] appears to have a lock, opened by '[lock.lock_data]'.")) - + . += SPAN_NOTICE("\The [src] appears to have a lock, opened by '[lock.lock_data]'.") var/damage_desc = get_examined_damage_string() if(length(damage_desc)) - to_chat(user, damage_desc) - + . += damage_desc if(paint_color) var/decl/pronouns/structure_pronouns = get_pronouns() // so we can do 'have' for plural objects like sheets - to_chat(user, "\The [src] [structure_pronouns.has] been [paint_verb].") + . += "\The [src] [structure_pronouns.has] been [paint_verb]." +/obj/structure/get_examine_hints(mob/user, distance, infix, suffix) + . = ..() + if(distance <= 3) if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) - to_chat(user, SPAN_SUBTLE("Can be unanchored with a wrench or hammer, and moved around.")) + LAZYADD(., SPAN_SUBTLE("Can be unanchored with a wrench or hammer, and moved around.")) else - to_chat(user, SPAN_SUBTLE("Can be anchored in place with a wrench or hammer.")) - + LAZYADD(., SPAN_SUBTLE("Can be anchored in place with a wrench or hammer.")) if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) var/removed_with = "a crowbar or hammer" if(material && material.removed_by_welder) removed_with = "a welding torch" if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(anchored) - to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) + LAZYADD(., SPAN_SUBTLE("Can be deconstructed with [removed_with].")) else - to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench or hammer first.")) + LAZYADD(., SPAN_SUBTLE("Can be deconstructed with [removed_with], if anchored down with a wrench or hammer first.")) else - to_chat(user, SPAN_SUBTLE("Can be deconstructed with [removed_with].")) - + LAZYADD(., SPAN_SUBTLE("Can be deconstructed with [removed_with].")) if(tool_interaction_flags & TOOL_INTERACTION_WIRING) if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) if(wired) if(anchored) - to_chat(user, SPAN_SUBTLE("Can have its wiring removed with wirecutters.")) + LAZYADD(., SPAN_SUBTLE("Can have its wiring removed with wirecutters.")) else - to_chat(user, SPAN_SUBTLE("Can have its wiring removed with wirecutters, if anchored down with a wrench first.")) + LAZYADD(., SPAN_SUBTLE("Can have its wiring removed with wirecutters, if anchored down with a wrench first.")) else if(anchored) - to_chat(user, SPAN_SUBTLE("Can have wiring installed with a cable coil.")) + LAZYADD(., SPAN_SUBTLE("Can have wiring installed with a cable coil.")) else - to_chat(user, SPAN_SUBTLE("Can have wiring installed with a cable coil, if anchored down with a wrench first.")) + LAZYADD(., SPAN_SUBTLE("Can have wiring installed with a cable coil, if anchored down with a wrench first.")) else if(wired) - to_chat(user, SPAN_SUBTLE("Can have its wiring removed with wirecutters.")) + LAZYADD(., SPAN_SUBTLE("Can have its wiring removed with wirecutters.")) else - to_chat(user, SPAN_SUBTLE("Can have wiring installed with a cable coil.")) + LAZYADD(., SPAN_SUBTLE("Can have wiring installed with a cable coil.")) /obj/structure/proc/mob_breakout(var/mob/living/escapee) set waitfor = FALSE diff --git a/code/game/objects/structures/barrels/cask_rack.dm b/code/game/objects/structures/barrels/cask_rack.dm index cbe68ef5f7ee..c8e5cebc6184 100644 --- a/code/game/objects/structures/barrels/cask_rack.dm +++ b/code/game/objects/structures/barrels/cask_rack.dm @@ -19,10 +19,10 @@ if(try_stack_barrel(stackable) && length(contents) >= max_stack) return -/obj/structure/cask_rack/examine(mob/user, distance, infix, suffix) +/obj/structure/cask_rack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(length(contents)) - to_chat(user, SPAN_NOTICE("It contains [english_list(contents)].")) + . += SPAN_NOTICE("It contains [english_list(contents)].") /obj/structure/cask_rack/handle_mouse_drop(atom/over, mob/user, params) if(isturf(over) && user.Adjacent(over) && Adjacent(over) && try_unstack_barrel(target = over, user = user)) diff --git a/code/game/objects/structures/barsign.dm b/code/game/objects/structures/barsign.dm index b867efb2361b..d47f2eef2fd7 100644 --- a/code/game/objects/structures/barsign.dm +++ b/code/game/objects/structures/barsign.dm @@ -17,17 +17,17 @@ if(initial) . -= "Off" -/obj/structure/sign/double/barsign/examine(mob/user) +/obj/structure/sign/double/barsign/get_examine_strings(mob/user, distance, infix, suffix) . = ..() switch(icon_state) if("Off") - to_chat(user, "It appears to be switched off.") + . += "It appears to be switched off." if("narsiebistro") - to_chat(user, "It shows a picture of a large black and red being. Spooky!") + . += "It shows a picture of a large black and red being. Spooky!" if("on", "empty") - to_chat(user, "The lights are on, but there's no picture.") + . += "The lights are on, but there's no picture." else - to_chat(user, "It says '[icon_state]'.") + . += "It says '[icon_state]'." /obj/structure/sign/double/barsign/Initialize() . = ..() diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 5f4dcebb62d3..ccfe1f59c914 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -116,16 +116,16 @@ LINEN BINS /obj/structure/bedsheetbin/proc/get_amount() return stored + LAZYLEN(sheets) -/obj/structure/bedsheetbin/examine(mob/user) +/obj/structure/bedsheetbin/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/curamount = get_amount() if(curamount < 1) - to_chat(user, "There are no bed sheets in the bin.") + . += "There are no bed sheets in the bin." return if(curamount == 1) - to_chat(user, "There is one bed sheet in the bin.") + . += "There is one bed sheet in the bin." return - to_chat(user, "There are [curamount] bed sheets in the bin.") + . += "There are [curamount] bed sheets in the bin." /obj/structure/bedsheetbin/on_update_icon() ..() diff --git a/code/game/objects/structures/coathanger.dm b/code/game/objects/structures/coathanger.dm index 089425bcc9dc..3462edc0b082 100644 --- a/code/game/objects/structures/coathanger.dm +++ b/code/game/objects/structures/coathanger.dm @@ -53,12 +53,12 @@ update_icon() return TRUE -/obj/structure/coatrack/examine(mob/user, distance) +/obj/structure/coatrack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(length(contents)) - to_chat(user, SPAN_NOTICE("It has the following [length(contents) == 1 ? "article" : "articles"] hanging on it:")) + . += SPAN_NOTICE("It has the following [length(contents) == 1 ? "article" : "articles"] hanging on it:") for(var/obj/item/thing in contents) - to_chat(user, "- \icon[thing] \The [thing].") + . += "- \icon[thing] \The [thing]." /obj/structure/coatrack/proc/can_hang(var/obj/item/thing) if(!istype(thing)) diff --git a/code/game/objects/structures/compost.dm b/code/game/objects/structures/compost.dm index 938eb620d3e1..407a6d38600d 100644 --- a/code/game/objects/structures/compost.dm +++ b/code/game/objects/structures/compost.dm @@ -47,7 +47,7 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME else add_overlay(overlay_image(icon, "[icon_state]-hinges", null, RESET_COLOR)) -/obj/structure/reagent_dispensers/compost_bin/examine(mob/user, distance) +/obj/structure/reagent_dispensers/compost_bin/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) @@ -57,15 +57,15 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME switch(worms) if(0) - to_chat(user, SPAN_WARNING("There are no worms in \the [src].")) + . += SPAN_WARNING("There are no worms in \the [src].") if(1) - to_chat(user, SPAN_NOTICE("A lonely worm wiggles around in \the [src].")) + . += SPAN_NOTICE("A lonely worm wiggles around in \the [src].") if(2 to 3) - to_chat(user, SPAN_NOTICE("A few worms wiggle around in \the [src].")) + . += SPAN_NOTICE("A few worms wiggle around in \the [src].") if(4 to 6) - to_chat(user, SPAN_NOTICE("A healthy number of worms wiggle around in \the [src].")) + . += SPAN_NOTICE("A healthy number of worms wiggle around in \the [src].") else - to_chat(user, SPAN_NOTICE("A thriving worm colony wiggles around in \the [src].")) + . += SPAN_NOTICE("A thriving worm colony wiggles around in \the [src].") var/list/composting = list() for(var/thing in get_stored_inventory()) @@ -73,9 +73,9 @@ var/global/const/COMPOST_WORM_HUNGER_FACTOR = MINIMUM_CHEMICAL_VOLUME composting += thing if(length(composting)) - to_chat(user, SPAN_NOTICE("[capitalize(english_list(composting, summarize = TRUE))] [length(composting) == 1 ? "is" : "are"] composting inside \the [src].")) + . += SPAN_NOTICE("[capitalize(english_list(composting, summarize = TRUE))] [length(composting) == 1 ? "is" : "are"] composting inside \the [src].") else - to_chat(user, SPAN_NOTICE("Nothing is composting within \the [src].")) + . += SPAN_NOTICE("Nothing is composting within \the [src].") /obj/structure/reagent_dispensers/compost_bin/Entered(var/atom/movable/AM, atom/old_loc) . = ..() diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index 6bfeca7cfe85..67dda1ac39ba 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -61,7 +61,7 @@ var/global/list/closets = list() /obj/structure/closet/can_install_lock() return !(setup & CLOSET_HAS_LOCK) // CLOSET_HAS_LOCK refers to the access lock, not a physical lock. -/obj/structure/closet/examine(mob/user, distance) +/obj/structure/closet/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && !opened) var/content_size = 0 @@ -69,19 +69,19 @@ var/global/list/closets = list() if(!AM.anchored) content_size += content_size(AM) if(!content_size) - to_chat(user, "It is empty.") + . += "It is empty." else if(storage_capacity > content_size*4) - to_chat(user, "It is barely filled.") + . += "It is barely filled." else if(storage_capacity > content_size*2) - to_chat(user, "It is less than half full.") + . += "It is less than half full." else if(storage_capacity > content_size) - to_chat(user, "There is still some free space.") + . += "There is still some free space." else - to_chat(user, "It is full.") + . += "It is full." var/mob/observer/ghost/G = user if(isghost(G) && (G.client?.holder || G.antagHUD)) - to_chat(user, "It contains: [counting_english_list(contents)]") + . += "It contains: [counting_english_list(contents)]" /obj/structure/closet/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(air_group || (height==0 || wall_mounted)) return 1 @@ -367,7 +367,7 @@ var/global/list/closets = list() /obj/structure/closet/attack_ghost(mob/ghost) if(ghost.client && ghost.client.inquisitive_ghost) - ghost.examinate(src) + ghost.examine_verb(src) if (!opened) to_chat(ghost, "It contains: [english_list(contents)].") diff --git a/code/game/objects/structures/crates_lockers/closets/coffin.dm b/code/game/objects/structures/crates_lockers/closets/coffin.dm index 8e98073aef57..7b06ff2b19d8 100644 --- a/code/game/objects/structures/crates_lockers/closets/coffin.dm +++ b/code/game/objects/structures/crates_lockers/closets/coffin.dm @@ -7,10 +7,10 @@ var/screwdriver_time_needed = 7.5 SECONDS -/obj/structure/closet/coffin/examine(mob/user, distance) +/obj/structure/closet/coffin/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && !opened) - to_chat(user, "The lid is [locked ? "tightly secured with screws." : "unsecured and can be opened."]") + . += "The lid is [locked ? "tightly secured with screws." : "unsecured and can be opened."]" /obj/structure/closet/coffin/can_open(mob/user) . = ..() diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 9182d57f4e69..59d02b4c8c5a 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -22,7 +22,7 @@ for(var/obj/item/assembly/A in src) A.activate() -/obj/structure/closet/crate/examine(mob/user) +/obj/structure/closet/crate/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(rigged && opened) var/list/devices = list() @@ -30,7 +30,7 @@ devices += H for(var/obj/item/assembly/A in src) devices += A - to_chat(user,"There are some wires attached to the lid, connected to [english_list(devices)].") + . += "There are some wires attached to the lid, connected to [english_list(devices)]." /obj/structure/closet/crate/attackby(obj/item/W, mob/user) if(opened) diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index b07bef0480ef..06455c87a1fc 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -28,13 +28,13 @@ return req_access = A.req_access.Copy() -/obj/structure/displaycase/examine(mob/user, distance) +/obj/structure/displaycase/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(contents.len) - to_chat(user, "Inside you see [english_list(contents)].") + . += "Inside you see [english_list(contents)]." if(distance <= 1) - to_chat(user, "It looks [locked ? "locked. You can open it with your ID card" : "unlocked"].") + . += "It looks [locked ? "locked. You can open it with your ID card" : "unlocked"]." /obj/structure/displaycase/explosion_act(severity) ..() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index adb261b01e9f..9aba1e77c074 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -46,27 +46,27 @@ bound_width = world.icon_size bound_height = width * world.icon_size -/obj/structure/door_assembly/examine(mob/user) - . = ..() +/obj/structure/door_assembly/get_examine_hints(mob/user, distance, infix, suffix) + . = ..() || list() switch(state) if(0) - to_chat(user, "Use a wrench to [anchored ? "un" : ""]anchor it.") + LAZYADD(., "Use a wrench to [anchored ? "un" : ""]anchor it.") if(!anchored) if(glass == 1) var/decl/material/glass_material_datum = GET_DECL(glass_material) if(glass_material_datum) var/mat_name = glass_material_datum.solid_name || glass_material_datum.name - to_chat(user, "Use a welder to remove the [mat_name] plating currently attached.") + LAZYADD(., "Use a welder to remove the [mat_name] plating currently attached.") else - to_chat(user, "Use a welder to disassemble completely.") + LAZYADD(., "Use a welder to disassemble completely.") else - to_chat(user, "Use a cable coil to wire in preparation for electronics.") + LAZYADD(., "Use a cable coil to wire in preparation for electronics.") if(1) - to_chat(user, "Use a wirecutter to remove the wiring and expose the frame.") - to_chat(user, "Insert electronics to proceed with construction.") + LAZYADD(., "Use a wirecutter to remove the wiring and expose the frame.") + LAZYADD(., "Insert electronics to proceed with construction.") if(2) - to_chat(user, "Use a crowbar to remove the electronics.") - to_chat(user, "Use a screwdriver to complete assembly.") + LAZYADD(., "Use a crowbar to remove the electronics.") + LAZYADD(., "Use a screwdriver to complete assembly.") /obj/structure/door_assembly/door_assembly_hatch icon = 'icons/obj/doors/hatch/door.dmi' diff --git a/code/game/objects/structures/drain.dm b/code/game/objects/structures/drain.dm index cca6fa3bebf6..3b8e57ce9f49 100644 --- a/code/game/objects/structures/drain.dm +++ b/code/game/objects/structures/drain.dm @@ -11,10 +11,10 @@ can_drain = 1 var/welded -/obj/structure/hygiene/drain/examine(mob/user) +/obj/structure/hygiene/drain/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(welded) - to_chat(user, "It is welded shut.") + . += "It is welded shut." /obj/structure/hygiene/drain/attackby(var/obj/item/thing, var/mob/user) if(IS_WELDER(thing)) @@ -85,9 +85,9 @@ else icon_state = "[initial(icon_state)][closed ? "-closed" : ""]" -/obj/structure/hygiene/drain/bath/examine(mob/user) +/obj/structure/hygiene/drain/bath/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It is [closed ? "closed" : "open"]") + . += "It is [closed ? "closed" : "open"]" /obj/structure/hygiene/drain/bath/Process() if(closed) diff --git a/code/game/objects/structures/drying_rack.dm b/code/game/objects/structures/drying_rack.dm index ae03e3470486..6bfacec89299 100644 --- a/code/game/objects/structures/drying_rack.dm +++ b/code/game/objects/structures/drying_rack.dm @@ -43,10 +43,10 @@ drying.update_icon() update_icon() -/obj/structure/drying_rack/examine(mob/user, distance, infix, suffix) +/obj/structure/drying_rack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(drying) - to_chat(user, "\The [drying] is [drying.get_dryness_text()].") + . += "\The [drying] is [drying.get_dryness_text()]." /obj/structure/drying_rack/on_update_icon() ..() diff --git a/code/game/objects/structures/fences.dm b/code/game/objects/structures/fences.dm index ddeb006f1aaa..8a127ce484fe 100644 --- a/code/game/objects/structures/fences.dm +++ b/code/game/objects/structures/fences.dm @@ -31,17 +31,18 @@ update_cut_status() return ..() -/obj/structure/fence/examine(mob/user, dist) +/obj/structure/fence/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - switch(hole_size) if(MEDIUM_HOLE) - to_chat(user, "There is a large hole in \the [src].") + . += SPAN_DANGER("There is a large hole in \the [src].") if(LARGE_HOLE) - to_chat(user, "\The [src] has been completely cut through.") + . += SPAN_DANGER("\The [src] has been completely cut through.") +/obj/structure/fence/get_examine_hints(mob/user, distance, infix, suffix) + . = ..() if(cuttable && hole_size < MAX_HOLE_SIZE) - to_chat(user, "Use wirecutters to [hole_size > NO_HOLE ? "expand the":"cut a"] hole into the fence, allowing passage.") + LAZYADD(., SPAN_SUBTLE("Use wirecutters to [hole_size > NO_HOLE ? "expand the":"cut a"] hole into the fence, allowing passage.")) /obj/structure/fence/end icon_state = "end" diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index e112d5cc5374..2c7dbb75097f 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -186,24 +186,24 @@ /obj/structure/fire_source/proc/get_removable_atoms() return get_contained_external_atoms() -/obj/structure/fire_source/examine(mob/user, distance) +/obj/structure/fire_source/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(has_draught) - to_chat(user, "\The [src]'s draught is [draught_values[current_draught]].") + . += "\The [src]'s draught is [draught_values[current_draught]]." var/list/burn_strings = get_descriptive_temperature_strings(get_effective_burn_temperature()) if(length(burn_strings)) - to_chat(user, "\The [src] is burning hot enough to [english_list(burn_strings)].") + . += "\The [src] is burning hot enough to [english_list(burn_strings)]." var/list/removable = get_removable_atoms() if(length(removable)) - to_chat(user, "Looking within \the [src], you see:") + . += "Looking within \the [src], you see:" for(var/atom/thing in removable) - to_chat(user, "\icon[thing] \the [thing]") + . += "\icon[thing] \the [thing]" else - to_chat(user, "\The [src] is empty.") + . += "\The [src] is empty." if(check_rights(R_DEBUG, 0, user)) - to_chat(user, "\The [src] has a temperature of [temperature]K, an effective burn temperature of [get_effective_burn_temperature()]K and a fuel value of [fuel].") + . += "\The [src] has a temperature of [temperature]K, an effective burn temperature of [get_effective_burn_temperature()]K and a fuel value of [fuel]." /obj/structure/fire_source/attack_hand(var/mob/user) diff --git a/code/game/objects/structures/flora/plant.dm b/code/game/objects/structures/flora/plant.dm index ceb0b5e205e3..02ccd36a6567 100644 --- a/code/game/objects/structures/flora/plant.dm +++ b/code/game/objects/structures/flora/plant.dm @@ -26,12 +26,12 @@ // update icon/harvestability as appropriate */ -/obj/structure/flora/plant/examine(mob/user, distance) +/obj/structure/flora/plant/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(dead) - to_chat(user, SPAN_OCCULT("It is dead.")) + . += SPAN_OCCULT("It is dead.") else if(harvestable) - to_chat(user, SPAN_NOTICE("You can see [harvestable] harvestable fruit\s.")) + . += SPAN_NOTICE("You can see [harvestable] harvestable fruit\s.") /obj/structure/flora/plant/dismantle_structure(mob/user) if(plant) diff --git a/code/game/objects/structures/grandfather_clock.dm b/code/game/objects/structures/grandfather_clock.dm index 76cc0c8295d7..24882cb59e6c 100644 --- a/code/game/objects/structures/grandfather_clock.dm +++ b/code/game/objects/structures/grandfather_clock.dm @@ -19,12 +19,12 @@ START_PROCESSING(SSobj, src) update_icon() -/obj/structure/grandfather_clock/examine(mob/user, distance, infix, suffix) +/obj/structure/grandfather_clock/get_examine_strings(mob/user, distance, infix, suffix) . = ..() // TODO: check literacy? if(isnull(last_time)) last_time = stationtime2text() - to_chat(user, SPAN_NOTICE("The face of \the [src] reads [last_time].")) + . += SPAN_NOTICE("The face of \the [src] reads [last_time].") // TODO: don't magically make the time update when swinging is restarted // TODO: alt interaction to interfere with the clock? diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 825e04a5ba66..6963ec745c48 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -66,10 +66,10 @@ STOP_PROCESSING(SSobj,src) return ..() -/obj/structure/inflatable/examine(mob/user, distance) +/obj/structure/inflatable/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(taped) - to_chat(user, SPAN_NOTICE("It's been duct taped in few places.")) + . += SPAN_NOTICE("It's been duct taped in few places.") /obj/structure/inflatable/Process() check_environment() diff --git a/code/game/objects/structures/ironing_board.dm b/code/game/objects/structures/ironing_board.dm index dbbc798426ab..1376dfe8758c 100644 --- a/code/game/objects/structures/ironing_board.dm +++ b/code/game/objects/structures/ironing_board.dm @@ -42,10 +42,10 @@ . = ..() -/obj/structure/bed/roller/ironingboard/examine(mob/user) +/obj/structure/bed/roller/ironingboard/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(cloth) - to_chat(user, "\The [html_icon(cloth)] [cloth] lies on it.") + . += SPAN_NOTICE("\The [html_icon(cloth)] [cloth] lies on it.") /obj/structure/bed/roller/ironingboard/on_update_icon() if(density) diff --git a/code/game/objects/structures/iv_drip.dm b/code/game/objects/structures/iv_drip.dm index 8dfa1d6269d2..ffc24bfd1b37 100644 --- a/code/game/objects/structures/iv_drip.dm +++ b/code/game/objects/structures/iv_drip.dm @@ -186,24 +186,20 @@ mode = !mode to_chat(usr, "The IV drip is now [mode ? "injecting" : "taking blood"].") -/obj/structure/iv_drip/examine(mob/user, distance) +/obj/structure/iv_drip/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if (distance >= 2) return - - to_chat(user, "The IV drip is [mode ? "injecting" : "taking blood"].") - to_chat(user, "It is set to transfer [transfer_amount]u of chemicals per cycle.") - + . += "The IV drip is [mode ? "injecting" : "taking blood"]." + . += "It is set to transfer [transfer_amount]u of chemicals per cycle." if(beaker) if(beaker.reagents && beaker.reagents.total_volume) - to_chat(usr, SPAN_NOTICE("Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.")) + . += SPAN_NOTICE("Attached is \a [beaker] with [beaker.reagents.total_volume] units of liquid.") else - to_chat(usr, SPAN_NOTICE("Attached is an empty [beaker].")) + . += SPAN_NOTICE("Attached is an empty [beaker].") else - to_chat(usr, SPAN_NOTICE("No chemicals are attached.")) - - to_chat(usr, SPAN_NOTICE("[attached ? attached : "No one"] is hooked up to it.")) + . += SPAN_NOTICE("No chemicals are attached.") + . += SPAN_NOTICE("[attached ? attached : "No one"] is hooked up to it.") /obj/structure/iv_drip/proc/rip_out() visible_message("The needle is ripped out of [src.attached], doesn't that hurt?") diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 49c960dd32e4..4d58c9790cbf 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -18,10 +18,10 @@ . = ..() create_reagents(180) -/obj/structure/janitorialcart/examine(mob/user, distance) +/obj/structure/janitorialcart/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "[src] [html_icon(src)] contains [reagents.total_volume] unit\s of liquid!") + . += "\The [src] [html_icon(src)] contains [reagents.total_volume] unit\s of liquid!" /obj/structure/janitorialcart/attackby(obj/item/I, mob/user) @@ -210,12 +210,12 @@ . = ..() create_reagents(100) -/obj/structure/janicart/examine(mob/user, distance) +/obj/structure/janicart/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "[html_icon(src)] This [callme] contains [reagents.total_volume] unit\s of water!") + . += "[html_icon(src)] This [callme] contains [reagents.total_volume] unit\s of water!" if(mybag) - to_chat(user, "\A [mybag] is hanging on the [callme].") + . += "\A [mybag] is hanging on the [callme]." /obj/structure/janicart/attackby(obj/item/I, mob/user) diff --git a/code/game/objects/structures/memorial.dm b/code/game/objects/structures/memorial.dm index a320fee22452..5a99c067a93d 100644 --- a/code/game/objects/structures/memorial.dm +++ b/code/game/objects/structures/memorial.dm @@ -21,7 +21,8 @@ return TRUE return ..() -/obj/structure/memorial/examine(mob/user, distance) +/obj/structure/memorial/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (distance <= 2 && fallen.len) - to_chat(user, "The fallen: [jointext(fallen, "
")]") + . += "The fallen:" + . += fallen diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index afc4805a96ed..4a4adca8fb22 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -12,10 +12,10 @@ . = ..() create_reagents(180) -/obj/structure/mopbucket/examine(mob/user, distance) +/obj/structure/mopbucket/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "[src] [html_icon(src)] contains [reagents.total_volume] unit\s of water!") + . += "\The [src] [html_icon(src)] contains [reagents.total_volume] unit\s of water!" /obj/structure/mopbucket/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/mop)) diff --git a/code/game/objects/structures/pit.dm b/code/game/objects/structures/pit.dm index d45cdbc6ebbe..3e906526c8db 100644 --- a/code/game/objects/structures/pit.dm +++ b/code/game/objects/structures/pit.dm @@ -157,14 +157,14 @@ var/destruction_finish_message = "hacking at" var/gravemarker_type = /obj/item/gravemarker -/obj/structure/gravemarker/examine(mob/user, distance) +/obj/structure/gravemarker/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance < 2) var/processed_message = user.handle_reading_literacy(user, message) if(processed_message) - to_chat(user, "It says: '[processed_message]'") + . += "It says: '[processed_message]'" else if(message) - to_chat(user, "You can't read the inscription from here.") + . += "You can't read the inscription from here." /obj/structure/gravemarker/attackby(obj/item/used_item, mob/user) // we can dig it up with a shovel if the destruction tool is not a shovel, or if we're not on harm intent @@ -234,14 +234,14 @@ material = /decl/material/solid/stone/granite gravemarker_type = /obj/structure/gravemarker/gravestone -/obj/item/gravemarker/examine(mob/user, distance) +/obj/item/gravemarker/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance < 2) var/processed_message = user.handle_reading_literacy(user, message) if(processed_message) - to_chat(user, "It says: '[processed_message]'") + . += "It says: '[processed_message]'" else if(message) - to_chat(user, "You can't read the inscription from here.") + . += "You can't read the inscription from here." /obj/item/gravemarker/attack_self(mob/user) if(!user.check_intent(I_FLAG_HARM)) diff --git a/code/game/objects/structures/signs/diploma.dm b/code/game/objects/structures/signs/diploma.dm index d36a52bafd34..a6bbf52d992b 100644 --- a/code/game/objects/structures/signs/diploma.dm +++ b/code/game/objects/structures/signs/diploma.dm @@ -70,10 +70,10 @@ /obj/structure/sign/plaque/diploma/update_description() desc = details.get_description_string() -/obj/structure/sign/plaque/diploma/examine(mob/user, distance, infix, suffix) +/obj/structure/sign/plaque/diploma/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2) - to_chat(user, details.get_examine_string()) + . += details.get_examine_string() //////////////////////////////////////////////////////// // Diploma Item @@ -120,10 +120,10 @@ /obj/item/sign/diploma/proc/update_description() desc = details.get_description_string() -/obj/item/sign/diploma/examine(mob/user, distance, infix, suffix) +/obj/item/sign/diploma/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2) - to_chat(user, details.get_examine_string()) + . += details.get_examine_string() /obj/item/sign/diploma/attackby(obj/item/pen/W, mob/user) if(IS_PEN(W)) diff --git a/code/game/objects/structures/skele_stand.dm b/code/game/objects/structures/skele_stand.dm index e45d1c326ea9..95ce5fb549c2 100644 --- a/code/game/objects/structures/skele_stand.dm +++ b/code/game/objects/structures/skele_stand.dm @@ -47,14 +47,14 @@ /obj/structure/skele_stand/Bumped(atom/thing) rattle_bones(null, thing) -/obj/structure/skele_stand/examine(mob/user) +/obj/structure/skele_stand/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(swag.len) var/list/swagnames = list() for(var/slot in swag) var/obj/item/clothing/C = swag[slot] swagnames += C.get_examine_line() - to_chat(user,"[gender == MALE ? "He" : "She"] is wearing [english_list(swagnames)].") + . += "[gender == MALE ? "He" : "She"] is wearing [english_list(swagnames)]." /obj/structure/skele_stand/attackby(obj/item/W, mob/user) if(IS_PEN(W)) diff --git a/code/game/objects/structures/stasis_cage.dm b/code/game/objects/structures/stasis_cage.dm index fd144cae9096..2ac55e2afe1d 100644 --- a/code/game/objects/structures/stasis_cage.dm +++ b/code/game/objects/structures/stasis_cage.dm @@ -47,10 +47,10 @@ else icon_state = initial(icon_state) -/obj/structure/stasis_cage/examine(mob/user) +/obj/structure/stasis_cage/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(contained) - to_chat(user, "\The [contained] is kept inside.") + . += "\The [contained] is kept inside." /obj/structure/stasis_cage/proc/contain(var/mob/living/simple_animal/animal) if(contained || !istype(animal)) diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index 68fba3649734..98a4918cb530 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -276,10 +276,10 @@ return TRUE -/obj/structure/table/examine(mob/user, distance) +/obj/structure/table/get_examine_hints(mob/user, distance, infix, suffix) . = ..() if(felted || reinf_material || additional_reinf_material) - to_chat(user, SPAN_SUBTLE("The cladding must be removed with a screwdriver prior to deconstructing \the [src].")) + LAZYADD(., SPAN_SUBTLE("The cladding must be removed with a screwdriver prior to deconstructing \the [src].")) /obj/structure/table/update_material_name(override_name) if(reinf_material) diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm index cba831c4d3d3..9f3fe1060a3c 100644 --- a/code/game/objects/structures/tank_dispenser.dm +++ b/code/game/objects/structures/tank_dispenser.dm @@ -31,9 +31,9 @@ update_icon() -/obj/structure/tank_rack/examine(mob/user, distance) +/obj/structure/tank_rack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, SPAN_NOTICE("It is holding [LAZYLEN(oxygen_tanks)] air tank\s and [LAZYLEN(hydrogen_tanks)] hydrogen tank\s.")) + . += SPAN_NOTICE("It is holding [LAZYLEN(oxygen_tanks)] air tank\s and [LAZYLEN(hydrogen_tanks)] hydrogen tank\s.") /obj/structure/tank_rack/Destroy() QDEL_NULL_LIST(hydrogen_tanks) diff --git a/code/game/objects/structures/wall_frame.dm b/code/game/objects/structures/wall_frame.dm index 3aaf589d466e..b4d8c7a46054 100644 --- a/code/game/objects/structures/wall_frame.dm +++ b/code/game/objects/structures/wall_frame.dm @@ -41,10 +41,10 @@ update_connections(1) update_icon() -/obj/structure/wall_frame/examine(mob/user) +/obj/structure/wall_frame/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(paint_color) - to_chat(user, SPAN_NOTICE("It has a smooth coat of paint applied.")) + . += SPAN_NOTICE("It has a smooth coat of paint applied.") /obj/structure/wall_frame/get_examined_damage_string() if(!can_take_damage()) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 6a9c9f095515..93cf5851a2da 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -68,10 +68,10 @@ var/global/list/hygiene_props = list() return TRUE . = ..() -/obj/structure/hygiene/examine(mob/user) +/obj/structure/hygiene/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(clogged > 0) - to_chat(user, SPAN_WARNING("It seems to be badly clogged.")) + . += SPAN_WARNING("It seems to be badly clogged.") /obj/structure/hygiene/Process() if(clogged <= 0) @@ -582,6 +582,6 @@ var/global/list/hygiene_props = list() if(open) water_flow() -/obj/structure/hygiene/faucet/examine(mob/user) +/obj/structure/hygiene/faucet/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It is turned [open ? "on" : "off"].") + . += "It is turned [open ? "on" : "off"]." diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 7b9c56f71107..a45fd6efacc8 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -387,24 +387,24 @@ return 1 return 0 -/obj/structure/window/examine(mob/user) +/obj/structure/window/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) if(reinf_material) - to_chat(user, SPAN_NOTICE("It is reinforced with the [reinf_material.solid_name] lattice.")) + . += SPAN_NOTICE("It is reinforced with the [reinf_material.solid_name] lattice.") if (reinf_material) switch (construction_state) if (CONSTRUCTION_STATE_NO_FRAME) - to_chat(user, SPAN_WARNING("The window is not in the frame.")) + . += SPAN_WARNING("The window is not in the frame.") if (CONSTRUCTION_STATE_IN_FRAME) - to_chat(user, SPAN_WARNING("The window is pried into the frame but not yet fastened.")) + . += SPAN_WARNING("The window is pried into the frame but not yet fastened.") if (CONSTRUCTION_STATE_FASTENED) - to_chat(user, SPAN_NOTICE("The window is fastened to the frame.")) + . += SPAN_NOTICE("The window is fastened to the frame.") if (anchored) - to_chat(user, SPAN_NOTICE("It is fastened to \the [get_turf(src)].")) + . += SPAN_NOTICE("It is fastened to \the [get_turf(src)].") else - to_chat(user, SPAN_WARNING("It is not fastened to anything.")) + . += SPAN_WARNING("It is not fastened to anything.") if (polarized) - to_chat(user, SPAN_NOTICE("It appears to be wired.")) + . += SPAN_NOTICE("It appears to be wired.") /obj/structure/window/set_anchored(new_anchored) if((. = ..())) diff --git a/code/game/turfs/open/_open.dm b/code/game/turfs/open/_open.dm index 9ba40c9bfe32..e763a49a8384 100644 --- a/code/game/turfs/open/_open.dm +++ b/code/game/turfs/open/_open.dm @@ -37,13 +37,13 @@ if(!QDELETED(AM)) AM.fall() -/turf/open/examine(mob/user, distance, infix, suffix) +/turf/open/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2) var/depth = 1 for(var/turf/T = GetBelow(src); (istype(T) && T.is_open()); T = GetBelow(T)) depth += 1 - to_chat(user, "It is about [depth] level\s deep.") + . += "It is about [depth] level\s deep." /turf/open/is_open() return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 86e5fbd5b82c..2fac278f3f5d 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -140,10 +140,10 @@ return INITIALIZE_HINT_NORMAL -/turf/examine(mob/user, distance, infix, suffix) +/turf/examined_by(mob/user, distance, infix, suffix) . = ..() if(user && weather) - weather.examine(user) + weather.examined_by(user, distance, infix, suffix) /turf/Destroy() diff --git a/code/game/turfs/walls/_wall.dm b/code/game/turfs/walls/_wall.dm index 973d7105635d..3ad1fc1f62d8 100644 --- a/code/game/turfs/walls/_wall.dm +++ b/code/game/turfs/walls/_wall.dm @@ -172,26 +172,24 @@ var/global/list/wall_fullblend_objects = list( . = ..() //Appearance -/turf/wall/examine(mob/user) +/turf/wall/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(!isnull(shutter_state)) - to_chat(user, SPAN_NOTICE("The shutter is [shutter_state ? "open" : "closed"].")) - + . += SPAN_NOTICE("The shutter is [shutter_state ? "open" : "closed"].") if(!damage) - to_chat(user, SPAN_NOTICE("It looks fully intact.")) + . += SPAN_NOTICE("It looks fully intact.") else var/dam = damage / material.integrity if(dam <= 0.3) - to_chat(user, SPAN_WARNING("It looks slightly damaged.")) + . += SPAN_WARNING("It looks slightly damaged.") else if(dam <= 0.6) - to_chat(user, SPAN_WARNING("It looks moderately damaged.")) + . += SPAN_WARNING("It looks moderately damaged.") else - to_chat(user, SPAN_DANGER("It looks heavily damaged.")) + . += SPAN_DANGER("It looks heavily damaged.") if(paint_color) - to_chat(user, get_paint_examine_message()) + . += get_paint_examine_message() if(locate(/obj/effect/overlay/wallrot) in src) - to_chat(user, SPAN_WARNING("There is fungus growing on [src].")) + . += SPAN_WARNING("There is fungus growing on [src].") /turf/wall/proc/get_paint_examine_message() return SPAN_NOTICE("It has had a coat of paint applied.") diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 47dcc913a450..785f34bb3799 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -104,13 +104,13 @@ return PROCESS_KILL -/obj/item/assembly/examine(mob/user, distance) +/obj/item/assembly/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 || loc == user) if(secured) - to_chat(user, "\The [src] is ready!") + . += "\The [src] is ready!" else - to_chat(user, "\The [src] can be attached!") + . += "\The [src] can be attached!" /obj/item/assembly/attack_self(mob/user) diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 9a794b2c9006..d809c53896d6 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -168,13 +168,13 @@ if(a_left) a_left.hear_talk(M,msg,verb,speaking) -/obj/item/assembly_holder/examine(mob/user, distance) +/obj/item/assembly_holder/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (distance <= 1 || src.loc == user) if (src.secured) - to_chat(user, "\The [src] is ready!") + . += "\The [src] is ready!" else - to_chat(user, "\The [src] can be attached!") + . += "\The [src] can be attached!" /obj/item/assembly_holder/on_update_icon() . = ..() diff --git a/code/modules/assembly/mousetrap.dm b/code/modules/assembly/mousetrap.dm index f062f3b01c22..c3e057a13a5f 100644 --- a/code/modules/assembly/mousetrap.dm +++ b/code/modules/assembly/mousetrap.dm @@ -11,10 +11,10 @@ . = ..() set_extension(src, /datum/extension/tool, list(TOOL_HEMOSTAT = TOOL_QUALITY_WORST)) -/obj/item/assembly/mousetrap/examine(mob/user) +/obj/item/assembly/mousetrap/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(armed) - to_chat(user, "It looks like it's armed.") + . += "It looks like it's armed." /obj/item/assembly/mousetrap/on_update_icon() . = ..() diff --git a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm index d6c54d48acc2..d38b7277bb12 100644 --- a/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm +++ b/code/modules/atmospherics/components/binary_devices/oxyregenerator.dm @@ -41,9 +41,9 @@ power_rating *= initial(power_rating) ..() -/obj/machinery/atmospherics/binary/oxyregenerator/examine(user) +/obj/machinery/atmospherics/binary/oxyregenerator/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user,"Its outlet port is to the [dir2text(dir)].") + . += "Its outlet port is to the [dir2text(dir)]." /obj/machinery/atmospherics/binary/oxyregenerator/Process(wait, tick) ..() diff --git a/code/modules/atmospherics/components/shutoff.dm b/code/modules/atmospherics/components/shutoff.dm index 4cefcb52bc45..6286484bb901 100644 --- a/code/modules/atmospherics/components/shutoff.dm +++ b/code/modules/atmospherics/components/shutoff.dm @@ -19,9 +19,9 @@ var/global/list/shutoff_valves = list() icon_state = "vclamp[open]" build_device_underlays(FALSE) -/obj/machinery/atmospherics/valve/shutoff/examine(mob/user) +/obj/machinery/atmospherics/valve/shutoff/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "The automatic shutoff circuit is [close_on_leaks ? "enabled" : "disabled"].") + . += "The automatic shutoff circuit is [close_on_leaks ? "enabled" : "disabled"]." /obj/machinery/atmospherics/valve/shutoff/Initialize() . = ..() diff --git a/code/modules/atmospherics/components/unary/cold_sink.dm b/code/modules/atmospherics/components/unary/cold_sink.dm index 5a15543df5ab..f65afc65962f 100644 --- a/code/modules/atmospherics/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/components/unary/cold_sink.dm @@ -130,7 +130,7 @@ power_setting = new_power_setting power_rating = max_power_rating * (power_setting/100) -/obj/machinery/atmospherics/unary/freezer/examine(mob/user) +/obj/machinery/atmospherics/unary/freezer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(panel_open) - to_chat(user, "The maintenance hatch is open.") + . += "The maintenance hatch is open." diff --git a/code/modules/atmospherics/components/unary/heat_source.dm b/code/modules/atmospherics/components/unary/heat_source.dm index 17e7623e7e71..cb7df0f6098a 100644 --- a/code/modules/atmospherics/components/unary/heat_source.dm +++ b/code/modules/atmospherics/components/unary/heat_source.dm @@ -117,7 +117,7 @@ power_setting = new_power_setting power_rating = max_power_rating * (power_setting/100) -/obj/machinery/atmospherics/unary/heater/examine(mob/user) +/obj/machinery/atmospherics/unary/heater/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(panel_open) - to_chat(user, "The maintenance hatch is open.") + . += "The maintenance hatch is open." diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm index d304cd337cbd..33a2df620b92 100644 --- a/code/modules/atmospherics/components/unary/vent_pump.dm +++ b/code/modules/atmospherics/components/unary/vent_pump.dm @@ -320,14 +320,14 @@ return ..() -/obj/machinery/atmospherics/unary/vent_pump/examine(mob/user, distance) +/obj/machinery/atmospherics/unary/vent_pump/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W.") + . += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W." else - to_chat(user, "You are too far away to read the gauge.") + . += "You are too far away to read the gauge." if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." /obj/machinery/atmospherics/unary/vent_pump/cannot_transition_to(state_path, mob/user) if(state_path == /decl/machine_construction/default/deconstructed) diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index 89acda89fbd5..b5b6b81e8fde 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -240,16 +240,16 @@ return ..() -/obj/machinery/atmospherics/unary/vent_scrubber/examine(mob/user, distance) +/obj/machinery/atmospherics/unary/vent_scrubber/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W.") + . += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W." else - to_chat(user, "You are too far away to read the gauge.") + . += "You are too far away to read the gauge." if(welded) - to_chat(user, "It seems welded shut.") + . += "It seems welded shut." if(!(stat & NOPOWER) && use_power && user.skill_check(SKILL_ATMOS,SKILL_BASIC)) - to_chat(user, "It's running in [scrubbing] mode.") + . += "It's running in [scrubbing] mode." /obj/machinery/atmospherics/unary/vent_scrubber/refresh() ..() diff --git a/code/modules/atmospherics/components/valve.dm b/code/modules/atmospherics/components/valve.dm index 8e70f7cc077c..8b639036d738 100644 --- a/code/modules/atmospherics/components/valve.dm +++ b/code/modules/atmospherics/components/valve.dm @@ -119,9 +119,9 @@ return FALSE return TRUE -/obj/machinery/atmospherics/valve/examine(mob/user) +/obj/machinery/atmospherics/valve/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It is [open ? "open" : "closed"].") + . += "It is [open ? "open" : "closed"]." /decl/public_access/public_variable/valve_open expected_type = /obj/machinery/atmospherics/valve diff --git a/code/modules/augment/augment.dm b/code/modules/augment/augment.dm index ef122136d5c5..b65a6776d09c 100644 --- a/code/modules/augment/augment.dm +++ b/code/modules/augment/augment.dm @@ -65,14 +65,14 @@ parent_organ = BP_CHEST descriptor = "chest." -/obj/item/organ/internal/augment/examine(mob/user, distance) +/obj/item/organ/internal/augment/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "It is configured to be attached to the [descriptor].") + . += "It is configured to be attached to the [descriptor]." if(augment_flags & AUGMENTATION_MECHANIC && augment_flags & AUGMENTATION_ORGANIC) - to_chat(user, "It can interface with both prosthetic and fleshy organs.") + . += "It can interface with both prosthetic and fleshy organs." else if(augment_flags & AUGMENTATION_MECHANIC) - to_chat(user, "It can interface with prosthetic organs.") + . += "It can interface with prosthetic organs." else if(augment_flags & AUGMENTATION_ORGANIC) - to_chat(user, "It can interface with fleshy organs.") + . += "It can interface with fleshy organs." diff --git a/code/modules/banners/__banner.dm b/code/modules/banners/__banner.dm index 34727eaa11b7..21f331a8f1f7 100644 --- a/code/modules/banners/__banner.dm +++ b/code/modules/banners/__banner.dm @@ -66,11 +66,11 @@ var/global/list/banner_type_to_symbols = list() . = ..() -/obj/item/banner/examine(mob/user, distance, infix, suffix) +/obj/item/banner/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/decorations = get_decal_string() if(decorations) - to_chat(user, "\The [src] is decorated with [decorations].") + . += "\The [src] is decorated with [decorations]." /obj/item/banner/proc/get_decal_string() for(var/decl/banner_symbol/decal in decals) diff --git a/code/modules/brain_interface/_brain_interface.dm b/code/modules/brain_interface/_brain_interface.dm index 23005d26d032..2bca80610c73 100644 --- a/code/modules/brain_interface/_brain_interface.dm +++ b/code/modules/brain_interface/_brain_interface.dm @@ -49,15 +49,15 @@ else icon_state = "[icon_state]-full" -/obj/item/organ/internal/brain_interface/examine(mob/user, distance) +/obj/item/organ/internal/brain_interface/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) var/mob/living/brain/brainmob = get_brainmob() if(istype(brainmob)) if(brainmob.emp_damage) - to_chat(user, SPAN_WARNING("The neural interface socket is damaged.")) + . += SPAN_WARNING("The neural interface socket is damaged.") else - to_chat(user, SPAN_NOTICE("It is undamaged.")) + . += SPAN_NOTICE("It is undamaged.") /obj/item/organ/internal/brain_interface/attackby(var/obj/item/O, var/mob/user) diff --git a/code/modules/butchery/butchery_products.dm b/code/modules/butchery/butchery_products.dm index f4e76d9af464..bc653e3776f9 100644 --- a/code/modules/butchery/butchery_products.dm +++ b/code/modules/butchery/butchery_products.dm @@ -137,15 +137,15 @@ var/_cleaned = FALSE var/work_skill = SKILL_CONSTRUCTION -/obj/item/food/butchery/offal/examine(mob/user, distance) +/obj/item/food/butchery/offal/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && user.skill_check(work_skill, SKILL_BASIC) && !dry) if(_cleaned && drying_wetness) - to_chat(user, "\The [src] can be hung on a drying rack to dry it in preparation for being twisted into thread.") + . += "\The [src] can be hung on a drying rack to dry it in preparation for being twisted into thread." else if(!_cleaned) - to_chat(user, "\The [src] can be scraped clean with a sharp object like a knife.") + . += "\The [src] can be scraped clean with a sharp object like a knife." else if(!drying_wetness) - to_chat(user, "\The [src] can be soaked in water to prepare it for drying.") + . += "\The [src] can be soaked in water to prepare it for drying." /obj/item/food/butchery/offal/attackby(obj/item/W, mob/user) if(IS_KNIFE(W) && !_cleaned && !dry) diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 032f327ee0fa..64d08080a018 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -324,43 +324,45 @@ if(LAZYLEN(accessories) > LAZYLEN(ties)) .+= ". \[See accessories\]" -/obj/item/clothing/examine(mob/user) +/obj/item/clothing/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/datum/extension/armor/ablative/armor_datum = get_extension(src, /datum/extension/armor/ablative) if(istype(armor_datum) && LAZYLEN(armor_datum.get_visible_damage())) - to_chat(user, SPAN_WARNING("It has some damage.")) + . += SPAN_WARNING("It has some damage.") if(LAZYLEN(accessories)) - to_chat(user, "It has the following attached: [counting_english_list(accessories)]") + . += "It has the following attached: [counting_english_list(accessories)]" switch(ironed_state) if(WRINKLES_WRINKLY) - to_chat(user, "It's wrinkly.") + . += "It's wrinkly." if(WRINKLES_NONE) - to_chat(user, "It's completely wrinkle-free!") - - var/rags = RAG_COUNT(src) - if(rags) - to_chat(user, SPAN_SUBTLE("With a sharp object, you could cut \the [src] up into [rags] section\s.")) + . += "It's completely wrinkle-free!" var/obj/item/clothing/sensor/vitals/sensor = locate() in accessories if(sensor) switch(sensor.sensor_mode) if(VITALS_SENSOR_OFF) - to_chat(user, "Its sensors appear to be disabled.") + . += "Its sensors appear to be disabled." if(VITALS_SENSOR_BINARY) - to_chat(user, "Its binary life sensors appear to be enabled.") + . += "Its binary life sensors appear to be enabled." if(VITALS_SENSOR_VITAL) - to_chat(user, "Its vital tracker appears to be enabled.") + . += "Its vital tracker appears to be enabled." if(VITALS_SENSOR_TRACKING) - to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + . += "Its vital tracker and tracking beacon appear to be enabled." + +/obj/item/clothing/get_examine_hints(mob/user, distance, infix, suffix) + . = ..() + var/rags = RAG_COUNT(src) + if(rags) + LAZYADD(., SPAN_SUBTLE("With a sharp object, you could cut \the [src] up into [rags] section\s.")) if(length(clothing_state_modifiers)) var/list/interactions = list() for(var/modifier_type in clothing_state_modifiers) var/decl/clothing_state_modifier/modifier = GET_DECL(modifier_type) interactions += modifier.name - to_chat(user, SPAN_SUBTLE("Use alt-click to [english_list(interactions, and_text = " or ")].")) + LAZYADD(., SPAN_SUBTLE("Use alt-click to [english_list(interactions, and_text = " or ")].")) #undef RAG_COUNT diff --git a/code/modules/clothing/badges/_badge.dm b/code/modules/clothing/badges/_badge.dm index c894afd0e080..b0861d93680e 100644 --- a/code/modules/clothing/badges/_badge.dm +++ b/code/modules/clothing/badges/_badge.dm @@ -38,10 +38,10 @@ . = ..() . += " \[View\]" -/obj/item/clothing/badge/examine(user) +/obj/item/clothing/badge/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(stored_name) - to_chat(user,"It reads: [stored_name], [badge_string].") + . += "It reads: [stored_name], [badge_string]." /obj/item/clothing/badge/attack_self(mob/user) diff --git a/code/modules/clothing/badges/holobadge.dm b/code/modules/clothing/badges/holobadge.dm index 31aed4af787d..90a5cd0e0411 100644 --- a/code/modules/clothing/badges/holobadge.dm +++ b/code/modules/clothing/badges/holobadge.dm @@ -20,10 +20,10 @@ badge_number = random_id(type,1000,9999) name = "[name] ([badge_number])" -/obj/item/clothing/badge/holo/examine(user) +/obj/item/clothing/badge/holo/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(badge_number) - to_chat(user,"The badge number is [badge_number].") + . += "The badge number is [badge_number]." /obj/item/clothing/badge/holo/attack_self(mob/user) if(!stored_name) diff --git a/code/modules/clothing/gloves/jewelry/rings/_ring.dm b/code/modules/clothing/gloves/jewelry/rings/_ring.dm index aadeedab5589..ea58b6662b83 100644 --- a/code/modules/clothing/gloves/jewelry/rings/_ring.dm +++ b/code/modules/clothing/gloves/jewelry/rings/_ring.dm @@ -71,7 +71,7 @@ if(istype(user)) var/mob/living/human/H = get_recursive_loc_of_type(/mob/living/human) if(H.Adjacent(user)) - user.examinate(src) + user.examine_verb(src) return TOPIC_HANDLED return ..() diff --git a/code/modules/clothing/masks/cig_crafting.dm b/code/modules/clothing/masks/cig_crafting.dm index c3405f77bdf1..1fbe74668f2b 100644 --- a/code/modules/clothing/masks/cig_crafting.dm +++ b/code/modules/clothing/masks/cig_crafting.dm @@ -10,10 +10,10 @@ /obj/item/clothing/mask/smokable/cigarette/rolled/populate_reagents() return -/obj/item/clothing/mask/smokable/cigarette/rolled/examine(mob/user) +/obj/item/clothing/mask/smokable/cigarette/rolled/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(filter) - to_chat(user, "Capped off one end with a filter.") + . += "\The [src] is capped off at one end with a filter." /////////// //Ported Straight from TG. I am not sorry. - BloodyMan //YOU SHOULD BE //ROLLING// @@ -22,7 +22,6 @@ name = "rolling paper" desc = "A thin piece of paper used to make smokeables." icon = 'icons/obj/items/paperwork/cigarette_paper.dmi' - icon_state = "cig_paper" w_class = ITEM_SIZE_TINY diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 053646a9f6a4..94a34507783c 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -27,10 +27,10 @@ var/gas_filter_strength = 1 //For gas mask filters -/obj/item/clothing/mask/gas/examine(mob/user) +/obj/item/clothing/mask/gas/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(clogged) - to_chat(user, "The intakes are clogged with [clogged]!") + . += SPAN_WARNING("The intakes are clogged with [clogged]!") /obj/item/clothing/mask/gas/filters_water() return (filter_water && !clogged) diff --git a/code/modules/clothing/neck/necklace/__necklace.dm b/code/modules/clothing/neck/necklace/__necklace.dm index d94e49bf2675..0c477fb4e725 100644 --- a/code/modules/clothing/neck/necklace/__necklace.dm +++ b/code/modules/clothing/neck/necklace/__necklace.dm @@ -22,10 +22,10 @@ update_icon() return TRUE -/obj/item/clothing/neck/necklace/examine(mob/user) +/obj/item/clothing/neck/necklace/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(istype(pendant)) - to_chat(user, "There is \a [pendant] attached.") + . += "There is \a [pendant] attached." /obj/item/clothing/neck/necklace/on_update_icon() . = ..() diff --git a/code/modules/clothing/sensors/vitals_sensor.dm b/code/modules/clothing/sensors/vitals_sensor.dm index 8ed94b74013e..706d9b99dd2d 100644 --- a/code/modules/clothing/sensors/vitals_sensor.dm +++ b/code/modules/clothing/sensors/vitals_sensor.dm @@ -28,17 +28,17 @@ sensors_locked = new_state update_removable() -/obj/item/clothing/sensor/vitals/examine(mob/user) +/obj/item/clothing/sensor/vitals/get_examine_strings(mob/user, distance, infix, suffix) . = ..() switch(sensor_mode) if(VITALS_SENSOR_OFF) - to_chat(user, "It appears to be disabled.") + . += "It appears to be disabled." if(VITALS_SENSOR_BINARY) - to_chat(user, "Its binary life tracker appear to be enabled.") + . += "Its binary life tracker appear to be enabled." if(VITALS_SENSOR_VITAL) - to_chat(user, "Its vital tracker appears to be enabled.") + . += "Its vital tracker appears to be enabled." if(VITALS_SENSOR_TRACKING) - to_chat(user, "Its vital tracker and tracking beacon appear to be enabled.") + . += "Its vital tracker and tracking beacon appear to be enabled." /obj/item/clothing/sensor/vitals/on_attached(var/obj/item/clothing/holder, var/mob/user) . = ..() diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index bd4284407d85..0190bce747b3 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -39,15 +39,15 @@ if (attached_cuffs) QDEL_NULL(attached_cuffs) -/obj/item/clothing/shoes/examine(mob/user) +/obj/item/clothing/shoes/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (attached_cuffs) - to_chat(user, SPAN_WARNING("They are connected by \the [attached_cuffs].")) + . += SPAN_WARNING("They are connected by \the [attached_cuffs].") if (hidden_item) if (loc == user) - to_chat(user, SPAN_ITALIC("\An [hidden_item] is inside.")) + . += SPAN_ITALIC("\An [hidden_item] is inside.") else if (get_dist(src, user) == 1) - to_chat(user, SPAN_ITALIC("Something is hidden inside.")) + . += SPAN_ITALIC("Something is hidden inside.") /obj/item/clothing/shoes/attack_hand(var/mob/user) if(user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE) && remove_hidden(user)) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 2ca4054eebf9..7a2984ecccef 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -113,9 +113,9 @@ covering_shoes = null user.update_floating() -/obj/item/clothing/shoes/magboots/examine(mob/user) +/obj/item/clothing/shoes/magboots/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/state = "disabled" if(item_flags & ITEM_FLAG_MAGNETISED) state = "enabled" - to_chat(user, "Its mag-pulse traction system appears to be [state].") + . += "Its mag-pulse traction system appears to be [state]." diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm index 82a201e5fcf9..158b3754b767 100644 --- a/code/modules/clothing/spacesuits/breaches.dm +++ b/code/modules/clothing/spacesuits/breaches.dm @@ -258,11 +258,11 @@ return TRUE return ..() -/obj/item/clothing/suit/space/examine(mob/user) +/obj/item/clothing/suit/space/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(can_breach && breaches && breaches.len) for(var/datum/breach/B in breaches) - to_chat(user, SPAN_DANGER("It has \a [B.descriptor].")) + . += SPAN_DANGER("It has \a [B.descriptor].") /obj/item/clothing/suit/space/get_pressure_weakness(pressure) . = ..() diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index a616b18c7574..1e7b7d610017 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -59,15 +59,15 @@ var/list/stat_rig_module/stat_modules = new() -/obj/item/rig_module/examine(mob/user) +/obj/item/rig_module/get_examine_strings(mob/user, distance, infix, suffix) . = ..() switch(damage) if(0) - to_chat(user, "It is undamaged.") + . += "It is undamaged." if(1) - to_chat(user, "It is badly damaged.") + . += "It is badly damaged." if(2) - to_chat(user, "It is almost completely destroyed.") + . += "It is almost completely destroyed." /obj/item/rig_module/attackby(obj/item/W, mob/user) diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index 719db3034b77..0eeb19c3a578 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -113,22 +113,20 @@ /obj/item/rig/get_cell() return cell -/obj/item/rig/examine(mob/user) +/obj/item/rig/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(wearer) for(var/obj/item/piece in list(helmet,gloves,chest,boots)) if(!piece || piece.loc != wearer) continue - to_chat(user, "[html_icon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed.") - + . += "[html_icon(piece)] \The [piece] [piece.gender == PLURAL ? "are" : "is"] deployed." if(src.loc == user) - to_chat(user, "The access panel is [locked? "locked" : "unlocked"].") - to_chat(user, "The maintenance panel is [open ? "open" : "closed"].") - to_chat(user, "The wire panel is [p_open ? "open" : "closed"].") - to_chat(user, "Hardsuit systems are [offline ? SPAN_BAD("offline") : SPAN_GOOD("online")].") - + . += "The access panel is [locked? "locked" : "unlocked"]." + . += "The maintenance panel is [open ? "open" : "closed"]." + . += "The wire panel is [p_open ? "open" : "closed"]." + . += "Hardsuit systems are [offline ? SPAN_BAD("offline") : SPAN_GOOD("online")]." if(open) - to_chat(user, "It's equipped with [english_list(installed_modules)].") + . += "It's equipped with [english_list(installed_modules)]." /obj/item/rig/Initialize() . = ..() diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 3c7ecb38b48b..95b0612b4f9e 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -70,10 +70,10 @@ else to_chat(user, "Camera deactivated.") -/obj/item/clothing/head/helmet/space/examine(mob/user, distance) +/obj/item/clothing/head/helmet/space/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && camera) - to_chat(user, "This helmet has a built-in camera. It's [!ispath(camera) && camera.status ? "" : "in"]active.") + . += "This helmet has a built-in camera. It's [!ispath(camera) && camera.status ? "" : "in"]active." /obj/item/clothing/head/helmet/space/proc/update_tint() if(tinted) diff --git a/code/modules/clothing/spacesuits/void/void.dm b/code/modules/clothing/spacesuits/void/void.dm index d0836d07b4cb..37c5d360b4d2 100644 --- a/code/modules/clothing/spacesuits/void/void.dm +++ b/code/modules/clothing/spacesuits/void/void.dm @@ -84,14 +84,14 @@ else if(##equipment_var) {\ QDEL_NULL(helmet) QDEL_NULL(tank) -/obj/item/clothing/suit/space/void/examine(user,distance) +/obj/item/clothing/suit/space/void/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - var/list/part_list = new + var/list/part_list = list() for(var/obj/item/I in list(helmet,boots,tank)) part_list += "\a [I]" - to_chat(user, "\The [src] has [english_list(part_list)] installed.") + . += "\The [src] has [english_list(part_list)] installed." if(tank && distance <= 1) - to_chat(user, "The wrist-mounted pressure gauge reads [max(round(tank.air_contents.return_pressure()),0)] kPa remaining in \the [tank].") + . += SPAN_NOTICE("The wrist-mounted pressure gauge reads [max(round(tank.air_contents.return_pressure()),0)] kPa remaining in \the [tank].") /obj/item/clothing/suit/space/void/refit_for_bodytype(target_bodytype, skip_rename = FALSE) ..() diff --git a/code/modules/clothing/webbing/holster.dm b/code/modules/clothing/webbing/holster.dm index 1d49eaabc2b7..c607d16c13e9 100644 --- a/code/modules/clothing/webbing/holster.dm +++ b/code/modules/clothing/webbing/holster.dm @@ -26,7 +26,7 @@ return TRUE return ..() -/obj/item/clothing/webbing/holster/examine(mob/user) +/obj/item/clothing/webbing/holster/examined_by(mob/user, distance, infix, suffix) . = ..(user) var/datum/extension/holster/holster = get_extension(src, /datum/extension/holster) holster.examine_holster(user) diff --git a/code/modules/codex/codex_atom.dm b/code/modules/codex/codex_atom.dm index 49d718ebbffe..fb59c1858464 100644 --- a/code/modules/codex/codex_atom.dm +++ b/code/modules/codex/codex_atom.dm @@ -33,11 +33,3 @@ /atom/proc/get_lore_info() return - -/atom/examine(mob/user, distance, infix = "", suffix = "") - . = ..() - var/decl/interaction_handler/handler = get_quick_interaction_handler(user) - if(handler) - to_chat(user, SPAN_NOTICE("Ctrl-click \the [src] while in your inventory to [lowertext(handler.name)].")) - if(user?.get_preference_value(/datum/client_preference/inquisitive_examine) == PREF_ON && user.can_use_codex() && SScodex.get_codex_entry(get_codex_value(user))) - to_chat(user, SPAN_NOTICE("The codex has relevant information available.")) diff --git a/code/modules/codex/codex_cataloguer.dm b/code/modules/codex/codex_cataloguer.dm index 8e1918f2e8d9..2d9dc6a4803c 100644 --- a/code/modules/codex/codex_cataloguer.dm +++ b/code/modules/codex/codex_cataloguer.dm @@ -111,10 +111,10 @@ return TRUE return ..() -/obj/item/cataloguer/examine(mob/user, distance, infix, suffix) +/obj/item/cataloguer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(loaded_disk) - to_chat(user, "It has \a [loaded_disk] slotted into the storage port. The display indicates it currently holds [loaded_disk.data] good explorer point\s.") + . += "It has \a [loaded_disk] slotted into the storage port. The display indicates it currently holds [loaded_disk.data] good explorer point\s." /obj/item/cataloguer/proc/stop_scan(var/interrupted = TRUE, var/mob/user, var/fade_out = 0) diff --git a/code/modules/crafting/slapcrafting/_crafting_holder.dm b/code/modules/crafting/slapcrafting/_crafting_holder.dm index b89a73d69a18..4cb7990226cb 100644 --- a/code/modules/crafting/slapcrafting/_crafting_holder.dm +++ b/code/modules/crafting/slapcrafting/_crafting_holder.dm @@ -6,7 +6,7 @@ var/decl/crafting_stage/current_crafting_stage var/label_name -/obj/item/crafting_holder/examine(mob/user, distance) +/obj/item/crafting_holder/get_examine_hints(mob/user, distance, infix, suffix) . = ..() if(current_crafting_stage) var/list/next_steps = list() @@ -22,9 +22,9 @@ if(length(next_products)) for(var/thing in next_products) - to_chat(user, SPAN_NOTICE("With [thing], you could finish building [next_products[thing]].")) + LAZYADD(., SPAN_NOTICE("With [thing], you could finish building [next_products[thing]].")) if(length(next_steps)) - to_chat(user, SPAN_NOTICE("You could continue to work on this with [english_list(next_steps, and_text = " or ")].")) + LAZYADD(., SPAN_NOTICE("You could continue to work on this with [english_list(next_steps, and_text = " or ")].")) /obj/item/crafting_holder/Initialize(var/ml, var/decl/crafting_stage/initial_stage, var/obj/item/target, var/obj/item/tool, var/mob/user) diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index eb2d5eb8f534..327a42c20a22 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -61,12 +61,13 @@ forensics.add_from_atom(/datum/forensics/trace_dna, M) // On examination get hints of evidence -/obj/item/examine(mob/user, distance) +/obj/item/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance <= 1 && user.skill_check(SKILL_FORENSICS, SKILL_ADEPT)) - to_chat(user, SPAN_INFO("As a murder weapon, it's [english_list(get_autopsy_descriptors())].")) + . += SPAN_INFO("As a murder weapon, it's [english_list(get_autopsy_descriptors())].") +/obj/item/examined_by(mob/user, distance, infix, suffix) + . = ..() // Detective is on the case var/datum/extension/forensic_evidence/forensics = get_extension(src, /datum/extension/forensic_evidence) if(forensics?.check_spotting(user) && user.has_client_color(/datum/client_color/noir)) diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index f7e2f917669d..89ef0ed1ba69 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -38,11 +38,11 @@ //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up. if(I.loc?.storage) //in a container. return ..() - + var/sdepth = I.storage_depth(user) if (sdepth == -1 || sdepth > 1) return ..() //too deeply nested to access - + user.drop_from_inventory(I) user.visible_message( \ @@ -92,6 +92,7 @@ w_class = initial(w_class) update_icon() -/obj/item/evidencebag/examine(mob/user) +/obj/item/evidencebag/examined_by(mob/user, distance, infix, suffix) . = ..() - if (stored_item) user.examinate(stored_item) + if (stored_item) + user.examine_verb(stored_item) diff --git a/code/modules/detectivework/tools/sample_kits/_sample.dm b/code/modules/detectivework/tools/sample_kits/_sample.dm index f8c89d94b7c1..d56d685faaa9 100644 --- a/code/modules/detectivework/tools/sample_kits/_sample.dm +++ b/code/modules/detectivework/tools/sample_kits/_sample.dm @@ -19,10 +19,10 @@ . = ..() QDEL_NULL_LIST(evidence) -/obj/item/forensics/sample/examine(mob/user, distance) +/obj/item/forensics/sample/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && object) - to_chat(user, "The label says: '[object]'.") + . += "The label says: '[object]'." /obj/item/forensics/sample/proc/copy_evidence(var/atom/supplied) var/datum/extension/forensic_evidence/forensics = get_extension(supplied, /datum/extension/forensic_evidence) diff --git a/code/modules/economy/worth_cash.dm b/code/modules/economy/worth_cash.dm index 5091a764f833..6f6c38ca5811 100644 --- a/code/modules/economy/worth_cash.dm +++ b/code/modules/economy/worth_cash.dm @@ -233,16 +233,16 @@ loaded_worth = 0 update_icon() -/obj/item/charge_stick/examine(mob/user, distance) +/obj/item/charge_stick/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) if(distance <= 2 || user == loc) var/datum/extension/lockable/lock = get_extension(src, /datum/extension/lockable) if(lock.locked) - to_chat(user, SPAN_WARNING("\The [src] is locked.")) + . += SPAN_WARNING("\The [src] is locked.") else - to_chat(user, SPAN_NOTICE("Id: [id].")) var/decl/currency/cur = GET_DECL(currency) - to_chat(user, SPAN_NOTICE("[capitalize(cur.name)] remaining: [floor(loaded_worth / cur.absolute_value)].")) + . += SPAN_NOTICE("Id: [id].") + . += SPAN_NOTICE("[capitalize(cur.name)] remaining: [floor(loaded_worth / cur.absolute_value)].") /obj/item/charge_stick/get_base_value() . = holographic ? 0 : loaded_worth diff --git a/code/modules/fabrication/_fabricator.dm b/code/modules/fabrication/_fabricator.dm index 43ae48853311..b4c227c101a6 100644 --- a/code/modules/fabrication/_fabricator.dm +++ b/code/modules/fabrication/_fabricator.dm @@ -70,14 +70,14 @@ QDEL_NULL(sound_token) . = ..() -/obj/machinery/fabricator/examine(mob/user) +/obj/machinery/fabricator/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(length(storage_capacity)) var/list/material_names = list() for(var/thing in storage_capacity) var/decl/material/mat = GET_DECL(thing) material_names += "[storage_capacity[thing]] [mat.use_name]" - to_chat(user, SPAN_NOTICE("It can store [english_list(material_names)].")) + . += SPAN_NOTICE("It can store [english_list(material_names)].") /obj/machinery/fabricator/Initialize() diff --git a/code/modules/fishing/fishing_rod.dm b/code/modules/fishing/fishing_rod.dm index 6fcea93840a2..33961e74c429 100644 --- a/code/modules/fishing/fishing_rod.dm +++ b/code/modules/fishing/fishing_rod.dm @@ -144,13 +144,13 @@ line = null return ..() -/obj/item/fishing_rod/examine(mob/user, distance) +/obj/item/fishing_rod/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user && distance <= 1) if(line) - to_chat(user, "\The [src] has been strung with some [get_line_damage()] [line.name].") + . += "\The [src] has been strung with some [get_line_damage()] [line.name]." if(bait) - to_chat(user, "\The [src] has been baited with \a [bait].") + . += "\The [src] has been baited with \a [bait]." /obj/item/fishing_rod/apply_additional_mob_overlays(mob/living/user_mob, bodytype, image/overlay, slot, bodypart, use_fallback_if_icon_missing = TRUE) if(overlay) diff --git a/code/modules/food/assembled.dm b/code/modules/food/assembled.dm index 5e0955f53d22..9df85094417f 100644 --- a/code/modules/food/assembled.dm +++ b/code/modules/food/assembled.dm @@ -103,7 +103,7 @@ return food.try_create_combination(src, user) return FALSE -/obj/item/food/examine(mob/user, distance) +/obj/item/food/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1) return @@ -120,7 +120,7 @@ product_string = english_list(names, and_text = " or ") else product_string = "\a [atom_info_repository.get_name_for(product)]" - to_chat(user, SPAN_NOTICE("With this and \a [ispath(thing_type) ? atom_info_repository.get_name_for(thing_type): thing_type], you could make [product_string].")) + . += SPAN_NOTICE("With this and \a [ispath(thing_type) ? atom_info_repository.get_name_for(thing_type): thing_type], you could make [product_string].") /obj/item/food/bun/get_combined_food_products() var/static/list/combined_food_products = list( diff --git a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm index fcd1cea0e1eb..0258f2e665a8 100644 --- a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm +++ b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm @@ -87,16 +87,16 @@ else . += "[reagents.liquid_volumes[liquid_type]]u of [reagent_name]" -/obj/item/chems/cooking_vessel/examine(mob/user, distance) +/obj/item/chems/cooking_vessel/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user && distance <= 1) var/list/contents_strings = get_cooking_contents_strings() if(length(contents_strings)) - to_chat(user, SPAN_NOTICE("\The [src] contains:")) + . += SPAN_NOTICE("\The [src] contains:") for(var/content_string in contents_strings) - to_chat(user, SPAN_NOTICE("- [content_string]")) + . += SPAN_NOTICE("- [content_string]") else - to_chat(user, SPAN_NOTICE("\The [src] is empty.")) + . += SPAN_NOTICE("\The [src] is empty.") /obj/item/chems/cooking_vessel/Process() var/decl/recipe/recipe = select_recipe(cooking_category, src, temperature) diff --git a/code/modules/food/plates/plate_tray.dm b/code/modules/food/plates/plate_tray.dm index 5bc0488090ce..d38ce43225d5 100644 --- a/code/modules/food/plates/plate_tray.dm +++ b/code/modules/food/plates/plate_tray.dm @@ -122,16 +122,16 @@ I.appearance_flags |= RESET_COLOR add_vis_contents(I) -/obj/item/plate/tray/examine(mob/user) // So when you look at the tray you can see whats on it. +/obj/item/plate/tray/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(.) if(contents.len) var/tray_examine = list() for(var/obj/item/I in contents) tray_examine += "\a [I.name]" - to_chat(user, "There is [english_list(tray_examine)] on the tray.") + . += "There is [english_list(tray_examine)] on the tray." else - to_chat(user, "\The [src] is empty.") + . += "\The [src] is empty." /* ----------------------------------------------------------------- diff --git a/code/modules/games/boardgame.dm b/code/modules/games/boardgame.dm index 4aa01e0697da..263020f25f41 100644 --- a/code/modules/games/boardgame.dm +++ b/code/modules/games/boardgame.dm @@ -20,7 +20,7 @@ /obj/item/board/attack_hand(mob/M) if(M.machine == src) return ..() - M.examinate(src) + M.examine_verb(src) return TRUE /obj/item/board/attackby(obj/item/I, mob/user) diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index cd9bf8848097..069c27f6b493 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -139,11 +139,11 @@ var/global/list/card_decks = list() draw_card(user) return TRUE -/obj/item/deck/examine(mob/user) +/obj/item/deck/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(cards.len) - to_chat(user, "
There [cards.len == 1 ? "is" : "are"] still [cards.len] card\s.") - to_chat(user, SPAN_NOTICE("You can deal cards at a table by clicking on it with grab intent.")) + . += "
There [cards.len == 1 ? "is" : "are"] still [cards.len] card\s." + . += SPAN_NOTICE("You can deal cards at a table by clicking on it with grab intent.") /obj/item/deck/attackby(obj/O, mob/user) if(istype(O,/obj/item/hand)) @@ -333,12 +333,12 @@ var/global/list/card_decks = list() user.put_in_hands(new_hand) return TRUE -/obj/item/hand/examine(mob/user) +/obj/item/hand/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if((!concealed || src.loc == user) && cards.len) - to_chat(user, "It contains:") + . += "It contains:" for(var/datum/playingcard/P in cards) - to_chat(user, "\The [APPEND_FULLSTOP_IF_NEEDED(P.name)]") + . += "\The [APPEND_FULLSTOP_IF_NEEDED(P.name)]" /obj/item/hand/on_update_icon() . = ..() diff --git a/code/modules/goals/definitions/department_clerical.dm b/code/modules/goals/definitions/department_clerical.dm index 9538699b3860..75ac548eb873 100644 --- a/code/modules/goals/definitions/department_clerical.dm +++ b/code/modules/goals/definitions/department_clerical.dm @@ -120,13 +120,13 @@ . = ..() icon_state = "[icon_state][length(has_signed) || ""]" -/obj/item/paperwork/examine(mob/user, distance) +/obj/item/paperwork/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(length(needs_signed)) - to_chat(user, SPAN_WARNING("It needs [length(needs_signed)] more signature\s before it can be filed: [english_list(needs_signed)].")) + . += SPAN_WARNING("It needs [length(needs_signed)] more signature\s before it can be filed: [english_list(needs_signed)].") if(length(has_signed)) - to_chat(user, SPAN_NOTICE("It has been signed by: [english_list(has_signed)].")) + . += SPAN_NOTICE("It has been signed by: [english_list(has_signed)].") /obj/item/paperwork/attackby(obj/item/W, mob/user) if(IS_PEN(W)) diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index e2c2d1bc219d..8b2219be907f 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -40,10 +40,10 @@ if(81 to 100) overlays += "bees5" -/obj/machinery/beehive/examine(mob/user) +/obj/machinery/beehive/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(!closed) - to_chat(user, "The lid is open.") + . += "The lid is open." /obj/machinery/beehive/attackby(var/obj/item/I, var/mob/user) if(IS_CROWBAR(I)) diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 7083722c41ca..e453199fe213 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -15,13 +15,13 @@ var/seeds_extracted = FALSE var/datum/seed/seed -/obj/item/food/grown/examine(mob/user, distance) +/obj/item/food/grown/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user && distance <= 1 && seed && user.skill_check(work_skill, SKILL_BASIC)) if(seed.grown_is_seed) - to_chat(user, SPAN_NOTICE("\The [src] can be planted directly, without having to extract any seeds.")) + . += SPAN_NOTICE("\The [src] can be planted directly, without having to extract any seeds.") else if(!seeds_extracted && seed.min_seed_extracted) - to_chat(user, SPAN_NOTICE("With a knife, you could extract at least [seed.min_seed_extracted] seed\s.")) + . += SPAN_NOTICE("With a knife, you could extract at least [seed.min_seed_extracted] seed\s.") /obj/item/food/grown/update_name() if(!seed) diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 21efe8deead6..2b291d791c3e 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -83,10 +83,10 @@ SetName("sample of [seed.product_name] [seed.seed_noun]") desc = "It's labelled as coming from \a [seed.display_name]." -/obj/item/seeds/examine(mob/user) +/obj/item/seeds/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(seed && !seed.roundstart) - to_chat(user, "It's tagged as variety #[seed.uid].") + . += "It's tagged as variety #[seed.uid]." /obj/item/seeds/extracted name = "handful of seeds" diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index cc12942e6f05..bc714325733c 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -574,24 +574,24 @@ return TRUE return FALSE -/obj/machinery/portable_atmospherics/hydroponics/examine(mob/user) - . = ..(user) +/obj/machinery/portable_atmospherics/hydroponics/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() if(!seed) - to_chat(user, "\The [src] is empty.") + . += "\The [src] is empty." return - to_chat(user, SPAN_NOTICE("\A [seed.display_name] is growing here.")) + . += SPAN_NOTICE("\A [seed.display_name] is growing here.") if(user.skill_check(SKILL_BOTANY, SKILL_BASIC)) if(weedlevel >= 5) - to_chat(user, "\The [src] is infested with weeds!") + . += "\The [src] is infested with weeds!" if(pestlevel >= 5) - to_chat(user, "\The [src] is infested with tiny worms!") + . += "\The [src] is infested with tiny worms!" if(dead) - to_chat(user, "The [seed.display_name] is dead.") + . += "The [seed.display_name] is dead." else if(plant_health <= (seed.get_trait(TRAIT_ENDURANCE)/ 2)) - to_chat(user, "The [seed.display_name] looks unhealthy.") + . += "The [seed.display_name] looks unhealthy." if(!Adjacent(user)) return @@ -617,14 +617,14 @@ var/light_available = T.get_lumcount() * 5 light_string = "a light level of [light_available] lumens" - to_chat(user, "Water: [round(waterlevel,0.1)]/100") - to_chat(user, "Nutrient: [round(nutrilevel,0.1)]/10") - to_chat(user, "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K.") + . += "Water: [round(waterlevel,0.1)]/100" + . += "Nutrient: [round(nutrilevel,0.1)]/10" + . += "The tray's sensor suite is reporting [light_string] and a temperature of [environment.temperature]K." else if(waterlevel < 20) - to_chat(user, SPAN_WARNING("The [seed.display_name] is dry.")) + . += SPAN_WARNING("The [seed.display_name] is dry.") if(nutrilevel < 2) - to_chat(user, SPAN_WARNING("The [seed.display_name]'s growth is stunted due to a lack of nutrients.")) + . += SPAN_WARNING("The [seed.display_name]'s growth is stunted due to a lack of nutrients.") /obj/machinery/portable_atmospherics/hydroponics/verb/close_lid_verb() set name = "Toggle Tray Lid" diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index 7d4a7ce5774f..e8637643e086 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -47,7 +47,7 @@ COLOR_ASSEMBLY_PURPLE ) -/obj/item/electronic_assembly/examine(mob/user) +/obj/item/electronic_assembly/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(obj_flags & OBJ_FLAG_ANCHORABLE) to_chat(user, "The anchoring bolts [anchored ? "are" : "can be"] wrenched in place and the maintenance panel [opened ? "can be" : "is"] screwed in place.") @@ -62,6 +62,16 @@ if((isobserver(user) && ckeys_allowed_to_scan[user.ckey]) || check_rights(R_ADMIN, 0, user)) to_chat(user, "You can scan this circuit."); +/obj/item/electronic_assembly/examined_by(mob/user, distance, infix, suffix) + . = ..() + for(var/I in assembly_components) + var/obj/item/integrated_circuit/IC = I + IC.external_examine(user) + if(opened) + IC.internal_examine(user) + if(opened) + interact(user) + /obj/item/electronic_assembly/check_health(lastdamage, lastdamtype, lastdamflags, consumed) if(!can_take_damage()) return @@ -294,16 +304,6 @@ return add_overlay(overlay_image('icons/obj/assemblies/electronic_setups.dmi', "[icon_state]-color", detail_color)) -/obj/item/electronic_assembly/examine(mob/user) - . = ..() - for(var/I in assembly_components) - var/obj/item/integrated_circuit/IC = I - IC.external_examine(user) - if(opened) - IC.internal_examine(user) - if(opened) - interact(user) - //This only happens when this EA is loaded via the printer /obj/item/electronic_assembly/proc/post_load() for(var/I in assembly_components) diff --git a/code/modules/integrated_electronics/core/integrated_circuit.dm b/code/modules/integrated_electronics/core/integrated_circuit.dm index b37f0c5fe0a9..fe377c2824e9 100644 --- a/code/modules/integrated_electronics/core/integrated_circuit.dm +++ b/code/modules/integrated_electronics/core/integrated_circuit.dm @@ -31,7 +31,7 @@ a creative player the means to solve many problems. Circuits are held inside an electronic assembly, and are wired using special tools. */ -/obj/item/integrated_circuit/examine(mob/user) +/obj/item/integrated_circuit/examined_by(mob/user, distance, infix, suffix) . = ..() external_examine(user) diff --git a/code/modules/integrated_electronics/subtypes/memory.dm b/code/modules/integrated_electronics/subtypes/memory.dm index b105438a0377..bdd5916a2a97 100644 --- a/code/modules/integrated_electronics/subtypes/memory.dm +++ b/code/modules/integrated_electronics/subtypes/memory.dm @@ -18,7 +18,7 @@ complexity = number_of_pins . = ..() -/obj/item/integrated_circuit/memory/examine(mob/user) +/obj/item/integrated_circuit/memory/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/i for(i = 1, i <= outputs.len, i++) @@ -30,7 +30,7 @@ data = "[d]" else if(!isnull(O.data)) data = O.data - to_chat(user, "\The [src] has [data] saved to address [i].") + . += "\The [src] has [data] saved to address [i]." /obj/item/integrated_circuit/memory/do_work() for(var/i = 1 to inputs.len) diff --git a/code/modules/interactions/_interactions.dm b/code/modules/interactions/_interactions.dm index 3d515a3000d0..1898e27ee8c4 100644 --- a/code/modules/interactions/_interactions.dm +++ b/code/modules/interactions/_interactions.dm @@ -3,7 +3,7 @@ var/name /// A string displayed when examining an atom that provides this handler as an alt interaction. var/examine_desc - /// If set to TRUE, alt interactions will skip is_possible() before displaying in examine(). + /// If set to TRUE, alt interactions will skip is_possible() before displaying in examined_by(). var/always_show_on_examine = FALSE var/icon var/icon_state diff --git a/code/modules/item_effects/item_effect_item.dm b/code/modules/item_effects/item_effect_item.dm index ea1be1cfd241..197c22d8a01f 100644 --- a/code/modules/item_effects/item_effect_item.dm +++ b/code/modules/item_effects/item_effect_item.dm @@ -176,7 +176,7 @@ listening_effect.hear_speech(src, M, text, speaking) // VISIBLE effects -/obj/item/examine(mob/user, distance) +/obj/item/examined_by(mob/user, distance, infix, suffix) . = ..() if(!user) return diff --git a/code/modules/locks/key.dm b/code/modules/locks/key.dm index ff44c88321a1..ecfebc2fdc59 100644 --- a/code/modules/locks/key.dm +++ b/code/modules/locks/key.dm @@ -8,13 +8,13 @@ material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC var/key_data -/obj/item/key/examine(mob/user, distance) +/obj/item/key/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(key_data) - to_chat(user, SPAN_NOTICE("\The [src] unlocks '[key_data]'.")) + . += SPAN_NOTICE("\The [src] unlocks '[key_data]'.") else - to_chat(user, SPAN_NOTICE("\The [src] is blank.")) + . += SPAN_NOTICE("\The [src] is blank.") /obj/item/key/proc/get_data(var/mob/user) return key_data diff --git a/code/modules/locks/keyring.dm b/code/modules/locks/keyring.dm index 8b92a6154316..75225770e11b 100644 --- a/code/modules/locks/keyring.dm +++ b/code/modules/locks/keyring.dm @@ -9,9 +9,8 @@ material = /decl/material/solid/metal/brass material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC -/obj/item/keyring/examine(mob/user, distance) +/obj/item/keyring/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(length(contents) && distance <= 1) var/key_strings = list() for(var/obj/item/key/key in contents) @@ -19,11 +18,9 @@ key_strings += SPAN_NOTICE("\The [key] unlocks '[key.key_data]'.") else key_strings += SPAN_NOTICE("\The [key] is blank.") - if(length(key_strings)) - to_chat(user, "\The [src] holds [length(key_strings)] key\s:") - for(var/key_string in key_strings) - to_chat(user, key_string) + . += "\The [src] holds [length(key_strings)] key\s:" + . += key_strings /obj/item/keyring/on_update_icon() . = ..() diff --git a/code/modules/locks/lock_construct.dm b/code/modules/locks/lock_construct.dm index 0a27464efde2..e36d93797a60 100644 --- a/code/modules/locks/lock_construct.dm +++ b/code/modules/locks/lock_construct.dm @@ -11,13 +11,13 @@ . = ..() lock_data = generateRandomString(round(material.integrity/50)) -/obj/item/lock_construct/examine(mob/user, distance) +/obj/item/lock_construct/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user && distance <= 1) if(lock_data) - to_chat(user, SPAN_NOTICE("\The [src] is unlocked with '[lock_data]'.")) + . += SPAN_NOTICE("\The [src] is unlocked with '[lock_data]'.") else - to_chat(user, SPAN_NOTICE("\The [src] is blank. Use a key on the lock to pair the two items.")) + . += SPAN_NOTICE("\The [src] is blank. Use a key on the lock to pair the two items.") /obj/item/lock_construct/attackby(var/obj/item/I, var/mob/user) if(istype(I, /obj/item/key)) diff --git a/code/modules/materials/material_stack_animal.dm b/code/modules/materials/material_stack_animal.dm index 1ca093a9c26f..f4d1d30f8090 100644 --- a/code/modules/materials/material_stack_animal.dm +++ b/code/modules/materials/material_stack_animal.dm @@ -10,15 +10,15 @@ var/_cleaned = FALSE var/work_skill = SKILL_CONSTRUCTION -/obj/item/stack/material/skin/examine(mob/user, distance) +/obj/item/stack/material/skin/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user && distance <= 1 && user.skill_check(work_skill, SKILL_BASIC) && material?.tans_to) if(_cleaned && drying_wetness) - to_chat(user, SPAN_NOTICE("\The [src] is ready for tanning on a drying rack or in a drying oven.")) + . += SPAN_NOTICE("\The [src] is ready for tanning on a drying rack or in a drying oven.") else if(!_cleaned) - to_chat(user, SPAN_NOTICE("\The [src] must be scraped clean with a knife or other sharp object before it can be tanned.")) + . += SPAN_NOTICE("\The [src] must be scraped clean with a knife or other sharp object before it can be tanned.") else if(!drying_wetness) - to_chat(user, SPAN_NOTICE("\The [src] must be soaked in water before it can be tanned.")) + . += SPAN_NOTICE("\The [src] must be soaked in water before it can be tanned.") /obj/item/stack/material/skin/proc/set_cleaned() if(_cleaned) diff --git a/code/modules/mechs/components/_components.dm b/code/modules/mechs/components/_components.dm index 64ecc2a71d2c..6f93e83e1a93 100644 --- a/code/modules/mechs/components/_components.dm +++ b/code/modules/mechs/components/_components.dm @@ -29,12 +29,14 @@ for(var/obj/item/thing in contents) thing.emp_act(severity) -/obj/item/mech_component/examine(mob/user) +/obj/item/mech_component/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(ready_to_install()) - to_chat(user, SPAN_NOTICE("It is ready for installation.")) + . += SPAN_NOTICE("It is ready for installation.") else - show_missing_parts(user) + var/list/missing_parts = show_missing_parts(user) + if(length(missing_parts)) + . += missing_parts //These icons have multiple directions but before they're attached we only want south. /obj/item/mech_component/set_dir() diff --git a/code/modules/mechs/components/arms.dm b/code/modules/mechs/components/arms.dm index 009f02efd0cd..9d5fe7a3a7d5 100644 --- a/code/modules/mechs/components/arms.dm +++ b/code/modules/mechs/components/arms.dm @@ -16,7 +16,7 @@ /obj/item/mech_component/manipulators/show_missing_parts(var/mob/user) if(!motivator) - to_chat(user, SPAN_WARNING("It is missing an actuator.")) + return list(SPAN_WARNING("It is missing an actuator.")) /obj/item/mech_component/manipulators/ready_to_install() return motivator diff --git a/code/modules/mechs/components/body.dm b/code/modules/mechs/components/body.dm index e60ba0724037..ca4a65fadc05 100644 --- a/code/modules/mechs/components/body.dm +++ b/code/modules/mechs/components/body.dm @@ -82,12 +82,13 @@ storage_compartment = locate() in src /obj/item/mech_component/chassis/show_missing_parts(var/mob/user) + . = list() if(!cell) - to_chat(user, SPAN_WARNING("It is missing a power cell.")) + . += SPAN_WARNING("It is missing a power cell.") if(!diagnostics) - to_chat(user, SPAN_WARNING("It is missing a diagnostics unit.")) + . += SPAN_WARNING("It is missing a diagnostics unit.") if(!m_armour) - to_chat(user, SPAN_WARNING("It is missing exosuit armour plating.")) + . += SPAN_WARNING("It is missing exosuit armour plating.") /obj/item/mech_component/chassis/proc/update_air(var/take_from_supply) diff --git a/code/modules/mechs/components/frame.dm b/code/modules/mechs/components/frame.dm index fd03301f1e8c..16a24e639de0 100644 --- a/code/modules/mechs/components/frame.dm +++ b/code/modules/mechs/components/frame.dm @@ -33,26 +33,26 @@ QDEL_NULL(body) . = ..() -/obj/structure/heavy_vehicle_frame/examine(mob/user) +/obj/structure/heavy_vehicle_frame/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(!arms) - to_chat(user, SPAN_WARNING("It is missing manipulators.")) + . += SPAN_WARNING("It is missing manipulators.") if(!legs) - to_chat(user, SPAN_WARNING("It is missing propulsion.")) + . += SPAN_WARNING("It is missing propulsion.") if(!head) - to_chat(user, SPAN_WARNING("It is missing sensors.")) + . += SPAN_WARNING("It is missing sensors.") if(!body) - to_chat(user, SPAN_WARNING("It is missing a chassis.")) + . += SPAN_WARNING("It is missing a chassis.") if(is_wired == FRAME_WIRED) - to_chat(user, SPAN_WARNING("It has not had its wiring adjusted.")) + . += SPAN_WARNING("It has not had its wiring adjusted.") else if(!is_wired) - to_chat(user, SPAN_WARNING("It has not yet been wired.")) + . += SPAN_WARNING("It has not yet been wired.") if(is_reinforced == FRAME_REINFORCED) - to_chat(user, SPAN_WARNING("It has not had its internal reinforcement secured.")) + . += SPAN_WARNING("It has not had its internal reinforcement secured.") else if(is_reinforced == FRAME_REINFORCED_SECURE) - to_chat(user, SPAN_WARNING("It has not had its internal reinforcement welded in.")) + . += SPAN_WARNING("It has not had its internal reinforcement welded in.") else if(!is_reinforced) - to_chat(user, SPAN_WARNING("It does not have any internal reinforcement.")) + . += SPAN_WARNING("It does not have any internal reinforcement.") /obj/structure/heavy_vehicle_frame/on_update_icon() ..() diff --git a/code/modules/mechs/components/head.dm b/code/modules/mechs/components/head.dm index 984433994662..84791a488886 100644 --- a/code/modules/mechs/components/head.dm +++ b/code/modules/mechs/components/head.dm @@ -19,12 +19,13 @@ . = ..() /obj/item/mech_component/sensors/show_missing_parts(var/mob/user) + . = list() if(!radio) - to_chat(user, SPAN_WARNING("It is missing a radio.")) + . += SPAN_WARNING("It is missing a radio.") if(!camera) - to_chat(user, SPAN_WARNING("It is missing a camera.")) + . += SPAN_WARNING("It is missing a camera.") if(!software) - to_chat(user, SPAN_WARNING("It is missing a software control module.")) + . += SPAN_WARNING("It is missing a software control module.") /obj/item/mech_component/sensors/prebuild() radio = new(src) @@ -111,9 +112,9 @@ var/list/installed_software = list() var/max_installed_software = 2 -/obj/item/mech_component/control_module/examine(mob/user) +/obj/item/mech_component/control_module/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, SPAN_NOTICE("It has [max_installed_software - LAZYLEN(installed_software)] empty slot\s remaining out of [max_installed_software].")) + . += SPAN_NOTICE("It has [max_installed_software - LAZYLEN(installed_software)] empty slot\s remaining out of [max_installed_software].") /obj/item/mech_component/control_module/attackby(var/obj/item/thing, var/mob/user) if(istype(thing, /obj/item/stock_parts/circuitboard/exosystem)) diff --git a/code/modules/mechs/components/legs.dm b/code/modules/mechs/components/legs.dm index 39c096f7153e..40bf191e02f6 100644 --- a/code/modules/mechs/components/legs.dm +++ b/code/modules/mechs/components/legs.dm @@ -14,7 +14,7 @@ /obj/item/mech_component/propulsion/show_missing_parts(var/mob/user) if(!motivator) - to_chat(user, SPAN_WARNING("It is missing an actuator.")) + return list(SPAN_WARNING("It is missing an actuator.")) /obj/item/mech_component/propulsion/ready_to_install() return motivator diff --git a/code/modules/mechs/equipment/_equipment.dm b/code/modules/mechs/equipment/_equipment.dm index 9df6c6915979..ca8273afd3b2 100644 --- a/code/modules/mechs/equipment/_equipment.dm +++ b/code/modules/mechs/equipment/_equipment.dm @@ -48,13 +48,13 @@ else return 0 -/obj/item/mech_equipment/examine(mob/user, distance) +/obj/item/mech_equipment/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user.skill_check(SKILL_DEVICES, SKILL_BASIC)) if(length(restricted_software)) - to_chat(user, SPAN_SUBTLE("It seems it would require [english_list(restricted_software)] to be used.")) + . += SPAN_SUBTLE("It seems it would require [english_list(restricted_software)] to be used.") if(length(restricted_hardpoints)) - to_chat(user, SPAN_SUBTLE("You figure it could be mounted in the [english_list(restricted_hardpoints)].")) + . += SPAN_SUBTLE("You figure it could be mounted in the [english_list(restricted_hardpoints)].") /obj/item/mech_equipment/proc/deactivate() active = FALSE diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index 02bd1abf172a..bfd2be06d01f 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -355,9 +355,9 @@ if (10 to 50) . = "is very worn" else . = "looks close to breaking" -/obj/item/drill_head/examine(mob/user, distance) +/obj/item/drill_head/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It [get_visible_durability()].") + . += "It [get_visible_durability()]." /obj/item/drill_head/steel material = /decl/material/solid/metal/steel @@ -404,14 +404,14 @@ return "Integrity: [drill_head.get_percent_durability()]%" return -/obj/item/mech_equipment/drill/examine(mob/user, distance) +/obj/item/mech_equipment/drill/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (drill_head) - to_chat(user, "It has a[distance > 3 ? "" : " [drill_head.material.name]"] drill head installed.") + . += "It has a[distance > 3 ? "" : " [drill_head.material.name]"] drill head installed." if (distance < 4) - to_chat(user, "The drill head [drill_head.get_visible_durability()].") + . += "The drill head [drill_head.get_visible_durability()]." else - to_chat(user, "It does not have a drill head installed.") + . += "It does not have a drill head installed." /obj/item/mech_equipment/drill/proc/attach_head(obj/item/drill_head/DH, mob/user) if (user && !user.try_unequip(DH)) @@ -742,10 +742,10 @@ var/datum/extension/network_device/camera/mech/D = get_extension(src, /datum/extension/network_device) D.display_name = "unregistered exocamera" -/obj/item/mech_equipment/camera/examine(mob/user) +/obj/item/mech_equipment/camera/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/datum/extension/network_device/camera/mech/D = get_extension(src, /datum/extension/network_device) - to_chat(user, "Channel: [english_list(D.channels)]; Feed is currently: [active ? "Online" : "Offline"].") + . += "Channel: [english_list(D.channels)]; Feed is currently: [active ? "Online" : "Offline"]." /obj/item/mech_equipment/camera/proc/activate() passive_power_use = 0.2 KILOWATTS diff --git a/code/modules/mechs/mech.dm b/code/modules/mechs/mech.dm index 899c1d05203f..c3dc8ec0e892 100644 --- a/code/modules/mechs/mech.dm +++ b/code/modules/mechs/mech.dm @@ -179,26 +179,24 @@ . = ..() -/mob/living/exosuit/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/exosuit/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..() if(LAZYLEN(pilots) && (!hatch_closed || body.pilot_coverage < 100 || body.transparent_cabin)) - to_chat(user, "It is being piloted by [english_list(pilots, nothing_text = "nobody")].") + . += "It is being piloted by [english_list(pilots, nothing_text = "nobody")]." if(body && LAZYLEN(body.pilot_positions)) - to_chat(user, "It can seat [body.pilot_positions.len] pilot\s total.") + . += "It can seat [body.pilot_positions.len] pilot\s total." if(hardpoints.len) - to_chat(user, "It has the following hardpoints:") + . += "It has the following hardpoints:" for(var/hardpoint in hardpoints) var/obj/item/I = hardpoints[hardpoint] - to_chat(user, "- [hardpoint]: [istype(I) ? "[I]" : "nothing"].") + . += "- [hardpoint]: [istype(I) ? "[I]" : "nothing"]." else - to_chat(user, "It has no visible hardpoints.") - + . += "It has no visible hardpoints." for(var/obj/item/mech_component/thing in list(arms, legs, head, body)) if(!thing) continue - var/damage_string = thing.get_damage_string() - to_chat(user, "Its [thing.name] [thing.gender == PLURAL ? "are" : "is"] [damage_string].") - to_chat(user, "It menaces with reinforcements of [material].") + . += "Its [thing.name] [thing.gender == PLURAL ? "are" : "is"] [thing.get_damage_string()]." + . += "It menaces with reinforcements of [material]." /mob/living/exosuit/return_air() return (body && body.pilot_coverage >= 100 && hatch_closed && body.cockpit) ? body.cockpit : loc?.return_air() diff --git a/code/modules/mechs/mech_interaction.dm b/code/modules/mechs/mech_interaction.dm index f67589fa7a40..50188cb87fc2 100644 --- a/code/modules/mechs/mech_interaction.dm +++ b/code/modules/mechs/mech_interaction.dm @@ -99,7 +99,7 @@ var/modifiers = params2list(params) if(modifiers["shift"]) - user.examinate(A) + user.examine_verb(A) return if(modifiers["ctrl"] && selected_system == A) diff --git a/code/modules/mining/machinery/material_extractor.dm b/code/modules/mining/machinery/material_extractor.dm index 2481dfbd8b4e..863f9fc59b21 100644 --- a/code/modules/mining/machinery/material_extractor.dm +++ b/code/modules/mining/machinery/material_extractor.dm @@ -56,17 +56,15 @@ connection.connect(port) -/obj/machinery/material_processing/extractor/examine(mob/user) +/obj/machinery/material_processing/extractor/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - var/datum/extension/atmospherics_connection/connection = get_extension(src, /datum/extension/atmospherics_connection) if(connection.connected_port) - to_chat(user, SPAN_NOTICE("It is connected to \the [connection.connected_port].")) + . += SPAN_NOTICE("It is connected to \the [connection.connected_port].") else - to_chat(user, SPAN_NOTICE("It may be connected to an atmospherics connector port with a wrench.")) - + . += SPAN_NOTICE("It may be connected to an atmospherics connector port with a wrench.") if(output_container) - to_chat(user, SPAN_NOTICE("It has \a [output_container] inserted.")) + . += SPAN_NOTICE("It has \a [output_container] inserted.") /obj/machinery/material_processing/extractor/Process() if(!use_power || (stat & (BROKEN|NOPOWER))) diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index f4090637855f..84acc94e834e 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -116,18 +116,18 @@ total_ores = 0 return TRUE -/obj/structure/ore_box/examine(mob/user, distance) +/obj/structure/ore_box/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1) //Can only check the contents of ore boxes if you can physically reach them. return add_fingerprint(user) if(total_ores <= 0) - to_chat(user, "It is empty.") + . += "It is empty." return - to_chat(user, "It holds:") + . += "It holds:" for(var/ore in stored_ore) - to_chat(user, "- [stored_ore[ore]] [ore]") + . += "- [stored_ore[ore]] [ore]" /obj/structure/ore_box/explosion_act(severity) . = ..() diff --git a/code/modules/mob/examine.dm b/code/modules/mob/examine.dm index 033c9499a247..c9e19f366257 100644 --- a/code/modules/mob/examine.dm +++ b/code/modules/mob/examine.dm @@ -10,14 +10,14 @@ . |= thing.flags_inv return . & EQUIPMENT_VISIBILITY_FLAGS -/mob/proc/show_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) - to_chat(user, "[html_icon(src)] That's \a [src][infix]. [suffix]") - to_chat(user, desc) - -/mob/proc/show_examined_worn_held_items(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) - +/mob/proc/get_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = list() + . += "[html_icon(src)] That's \a [src][infix]. [suffix]" + if(desc) + . += desc +/mob/proc/get_examined_worn_held_items(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) + . = list() var/slot_datums = get_inventory_slots() if(length(slot_datums)) for(var/slot in slot_datums) @@ -27,23 +27,19 @@ var/slot_desc = inv_slot.get_examined_string(src, user, distance, hideflags, pronouns) if(slot_desc) . += slot_desc - if(buckled) if(user == src) . += SPAN_WARNING("You are [html_icon(buckled)] buckled to [buckled]!") else . += SPAN_WARNING("[pronouns.He] [pronouns.is] [html_icon(buckled)] buckled to [buckled]!") - if(length(.)) - to_chat(user, jointext(., "\n")) - -/mob/proc/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/proc/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) return -/mob/examine(mob/user, distance, infix, suffix) +/mob/get_examine_strings(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - . = TRUE + . = list() // Collect equipment visibility flags. var/hideflags = get_equipment_visibility() @@ -54,7 +50,7 @@ // Show our equipment, held items, desc, etc. var/decl/pronouns/pronouns = get_visible_pronouns(hideflags) // to_chat(user, "
") // these don't work in BYOND's native output panel. If we switch to browser output instead, you can readd this - show_examined_short_description(user, distance, infix, suffix, hideflags, pronouns) - show_examined_worn_held_items(user, distance, infix, suffix, hideflags, pronouns) - show_other_examine_strings(user, distance, infix, suffix, hideflags, pronouns) + . += get_examined_short_description(user, distance, infix, suffix, hideflags, pronouns) + . += get_examined_worn_held_items(user, distance, infix, suffix, hideflags, pronouns) + . += get_other_examine_strings(user, distance, infix, suffix, hideflags, pronouns) // to_chat(user, "
") // see above diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index d5a9c3c8705c..f8237442c7b0 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -82,14 +82,14 @@ return TRUE return FALSE -/obj/item/grab/examine(mob/user) +/obj/item/grab/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/mob/M = get_affecting_mob() var/obj/item/O = get_targeted_organ() if(M && O) - to_chat(user, "A grip on \the [M]'s [O.name].") + . += "A grip on \the [M]'s [O.name]." else - to_chat(user, "A grip on \the [affecting].") + . += "A grip on \the [affecting]." /obj/item/grab/Process() current_grab.process(src) diff --git a/code/modules/mob/living/bot/medibot.dm b/code/modules/mob/living/bot/medibot.dm index 8ba09af58d39..037c13b9ffa2 100644 --- a/code/modules/mob/living/bot/medibot.dm +++ b/code/modules/mob/living/bot/medibot.dm @@ -40,22 +40,22 @@ //The last time we were tipped/righted and said a voice line, to avoid spam var/last_tipping_action_voice = 0 -/mob/living/bot/medbot/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/bot/medbot/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..() if(tipped_status == MEDBOT_PANIC_NONE) return switch(tipped_status) if(MEDBOT_PANIC_NONE to MEDBOT_PANIC_LOW) - to_chat(user, "It appears to be tipped over, and is quietly waiting for someone to set it right.") + . += "It appears to be tipped over, and is quietly waiting for someone to set it right." if(MEDBOT_PANIC_LOW to MEDBOT_PANIC_MED) - to_chat(user, "It is tipped over and requesting help.") + . += "It is tipped over and requesting help." if(MEDBOT_PANIC_MED to MEDBOT_PANIC_HIGH) - to_chat(user, SPAN_WARNING("They are tipped over and appear visibly distressed.")) // now we humanize the medbot as a they, not an it + . += SPAN_WARNING("They are tipped over and appear visibly distressed.") // now we humanize the medbot as a they, not an it if(MEDBOT_PANIC_HIGH to MEDBOT_PANIC_FUCK) - to_chat(user, SPAN_WARNING("They are tipped over and visibly panicking!")) + . += SPAN_WARNING("They are tipped over and visibly panicking!") if(MEDBOT_PANIC_FUCK to INFINITY) - to_chat(user, SPAN_DANGER("They are freaking out from being tipped over!")) + . += SPAN_DANGER("They are freaking out from being tipped over!") /mob/living/bot/medbot/handleIdle() if(vocal && prob(1)) diff --git a/code/modules/mob/living/bot/remotebot.dm b/code/modules/mob/living/bot/remotebot.dm index 1d50e2f72c6d..fa28520aa3e5 100644 --- a/code/modules/mob/living/bot/remotebot.dm +++ b/code/modules/mob/living/bot/remotebot.dm @@ -17,10 +17,10 @@ tally += (2 * holding.w_class) return tally -/mob/living/bot/remotebot/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/bot/remotebot/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..() if(holding) - to_chat(user, "It is holding \the [html_icon(holding)] [holding].") + . += SPAN_NOTICE("It is holding \the [html_icon(holding)] [holding].") /mob/living/bot/remotebot/gib(do_gibs = TRUE) var/turf/my_turf = get_turf(src) diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index 2a7c10feffc7..7aab22fa06df 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -1,5 +1,5 @@ -/mob/living/human/show_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) - var/msg = list("*---------*\n[user == src ? "You are" : "This is"] [name]") +/mob/living/human/get_examined_short_description(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) + var/msg = list("*---------*
[user == src ? "You are" : "This is"] [name]") if(!(hideflags & HIDEJUMPSUIT) || !(hideflags & HIDEFACE)) var/species_name = "\improper " if(isSynthetic() && species.cyborg_noun) @@ -18,9 +18,11 @@ msg += "
*---------*" msg += "
[print_flavour]" msg += "
*---------*" - to_chat(user, jointext(msg, null)) + return list(jointext(msg, null)) -/mob/living/human/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/human/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) + + . = ..() var/self_examine = (user == src) var/use_He = self_examine ? "You" : pronouns.He @@ -33,80 +35,71 @@ var/use_him = self_examine ? "you" : pronouns.him var/use_looks = self_examine ? "look" : "looks" - var/list/msg = list() //Jitters var/jitteriness = GET_STATUS(src, STAT_JITTER) if(jitteriness >= 300) - msg += "[use_He] [use_is] convulsing violently!\n" + . += "[use_He] [use_is] convulsing violently!" else if(jitteriness >= 200) - msg += "[use_He] [use_is] extremely jittery.\n" + . += "[use_He] [use_is] extremely jittery." else if(jitteriness >= 100) - msg += "[use_He] [use_is] twitching ever so slightly.\n" + . += "[use_He] [use_is] twitching ever so slightly." //Disfigured face if(!(hideflags & HIDEFACE)) //Disfigurement only matters for the head currently. var/obj/item/organ/external/limb = GET_EXTERNAL_ORGAN(src, BP_HEAD) if(limb && (limb.status & ORGAN_DISFIGURED)) //Check to see if we even have a head and if the head's disfigured. if(limb.species) //Check to make sure we have a species - msg += limb.species.disfigure_msg(src) + . += limb.species.disfigure_msg(src) else //Just in case they lack a species for whatever reason. - msg += "[use_His] face is horribly mangled!\n" + . += "[use_His] face is horribly mangled!" //splints for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)) var/obj/item/organ/external/limb = GET_EXTERNAL_ORGAN(src, organ) if(limb && limb.splinted && limb.splinted.loc == limb) - msg += "[use_He] [use_has] \a [limb.splinted] on [use_his] [limb.name]!\n" + . += "[use_He] [use_has] \a [limb.splinted] on [use_his] [limb.name]!" if (src.stat) - msg += "[use_He] [use_is]n't responding to anything around [use_him] and seems to be unconscious.\n" + . += "[use_He] [use_is]n't responding to anything around [use_him] and seems to be unconscious." if((stat == DEAD || is_asystole() || src.ticks_since_last_successful_breath) && distance <= 3) - msg += "[use_He] [use_does] not appear to be breathing.\n" - if(ishuman(user) && !user.incapacitated() && Adjacent(user)) - spawn(0) - user.visible_message("\The [user] checks \the [src]'s pulse.", "You check \the [src]'s pulse.") - if(do_after(user, 15, src)) - if(get_pulse() == PULSE_NONE) - to_chat(user, "[use_He] [use_has] no pulse.") - else - to_chat(user, "[use_He] [use_has] a pulse!") + . += "[use_He] [use_does] not appear to be breathing." var/datum/reagents/touching_reagents = get_contact_reagents() if(touching_reagents?.total_volume >= 1) var/saturation = touching_reagents.total_volume / touching_reagents.maximum_volume if(saturation > 0.9) - msg += "[use_He] [use_is] completely saturated.\n" + . += "[use_He] [use_is] completely saturated." else if(saturation > 0.6) - msg += "[use_He] [use_is] looking half-drowned.\n" + . += "[use_He] [use_is] looking half-drowned." else if(saturation > 0.3) - msg += "[use_He] [use_is] looking notably soggy.\n" + . += "[use_He] [use_is] looking notably soggy." else - msg += "[use_He] [use_is] looking a bit soggy.\n" + . += "[use_He] [use_is] looking a bit soggy." var/fire_level = get_fire_intensity() if(fire_level > 0) - msg += "[use_He] [use_is] looking highly flammable!\n" + . += "[use_He] [use_is] looking highly flammable!" else if(fire_level < 0) - msg += "[use_He] [use_is] looking rather incombustible.\n" + . += "[use_He] [use_is] looking rather incombustible." if(is_on_fire()) - msg += "[use_He] [use_is] on fire!\n" + . += "[use_He] [use_is] on fire!" var/ssd_msg = species.get_ssd(src) if(ssd_msg && (!should_have_organ(BP_BRAIN) || has_brain()) && stat != DEAD) if(!key) - msg += "[use_He] [use_is] [ssd_msg]. It doesn't look like [use_he] [use_is] waking up anytime soon.\n" + . += "[use_He] [use_is] [ssd_msg]. It doesn't look like [use_he] [use_is] waking up anytime soon." else if(!client) - msg += "[use_He] [use_is] [ssd_msg].\n" + . += "[use_He] [use_is] [ssd_msg]." var/obj/item/organ/external/head/H = get_organ(BP_HEAD, /obj/item/organ/external/head) if(istype(H) && H.forehead_graffiti && H.graffiti_style) - msg += "[use_He] [use_has] \"[H.forehead_graffiti]\" written on [use_his] [H.name] in [H.graffiti_style]!\n" + . += "[use_He] [use_has] \"[H.forehead_graffiti]\" written on [use_his] [H.name] in [H.graffiti_style]!" if(became_younger) - msg += "[use_He] [use_looks] a lot younger than you remember.\n" + . += "[use_He] [use_looks] a lot younger than you remember." if(became_older) - msg += "[use_He] [use_looks] a lot older than you remember.\n" + . += "[use_He] [use_looks] a lot older than you remember." var/list/wound_flavor_text = list() var/applying_pressure = "" @@ -121,13 +114,13 @@ var/obj/item/organ/external/limb = GET_EXTERNAL_ORGAN(src, organ_tag) if(!limb) - wound_flavor_text[organ_descriptor] = "[use_He] [use_is] missing [use_his] [organ_descriptor].\n" + wound_flavor_text[organ_descriptor] = "[use_He] [use_is] missing [use_his] [organ_descriptor]." continue wound_flavor_text[limb.name] = "" if(limb.applied_pressure == src) - applying_pressure = "[use_He] [use_is] applying pressure to [use_his] [limb.name].
" + applying_pressure = "[use_He] [use_is] applying pressure to [use_his] [limb.name]." var/obj/item/clothing/hidden for(var/slot in global.standard_clothing_slots) @@ -146,7 +139,7 @@ wound_flavor_text[limb.name] = "[use_He] [use_has] a [limb.name].\n" var/wounddesc = limb.get_wounds_desc() if(wounddesc != "nothing") - wound_flavor_text[limb.name] += "[use_He] [use_has] [wounddesc] on [use_his] [limb.name].
" + wound_flavor_text[limb.name] += "[use_He] [use_has] [wounddesc] on [use_his] [limb.name]." if(!hidden || distance <=1) if(limb.is_dislocated()) wound_flavor_text[limb.name] += "[use_His] [limb.joint] is dislocated!
" @@ -154,11 +147,11 @@ wound_flavor_text[limb.name] += "[use_His] [limb.name] is dented and swollen!
" if(limb.status & ORGAN_DEAD) if(BP_IS_PROSTHETIC(limb) || BP_IS_CRYSTAL(limb)) - wound_flavor_text[limb.name] += "[use_His] [limb.name] is irrecoverably damaged!
" + wound_flavor_text[limb.name] += "[use_His] [limb.name] is irrecoverably damaged!" else wound_flavor_text[limb.name] += "[use_His] [limb.name] is grey and necrotic!
" else if(limb.get_organ_damage() >= limb.max_damage && limb.germ_level >= INFECTION_LEVEL_TWO) - wound_flavor_text[limb.name] += "[use_His] [limb.name] is likely beyond saving, and has begun to decay!
" + wound_flavor_text[limb.name] += "[use_His] [limb.name] is likely beyond saving, and has begun to decay!" for(var/datum/wound/wound in limb.wounds) var/list/embedlist = wound.embedded_objects @@ -171,21 +164,21 @@ else if(!parsedembed.Find("multiple [embedded.name]")) parsedembed.Remove(embedded.name) parsedembed.Add("multiple "+embedded.name) - wound_flavor_text["[limb.name]"] += "The [wound.desc] on [use_his] [limb.name] has \a [english_list(parsedembed, and_text = " and a ", comma_text = ", a ")] sticking out of it!
" + wound_flavor_text["[limb.name]"] += "The [wound.desc] on [use_his] [limb.name] has \a [english_list(parsedembed, and_text = " and a ", comma_text = ", a ")] sticking out of it!" for(var/hidden in hidden_bleeders) - wound_flavor_text[hidden] = "[use_He] [use_has] blood soaking through [hidden] around [use_his] [english_list(hidden_bleeders[hidden])]!
" + wound_flavor_text[hidden] = "[use_He] [use_has] blood soaking through [hidden] around [use_his] [english_list(hidden_bleeders[hidden])]!" - msg += "" + . += "" for(var/limb in wound_flavor_text) - msg += wound_flavor_text[limb] - msg += "" + . += wound_flavor_text[limb] + . += "" for(var/obj/implant in get_visible_implants(0)) if(implant in shown_objects) continue - msg += "[src] [use_has] \a [implant.name] sticking out of [use_his] flesh!\n" + . += "[src] [use_has] \a [implant.name] sticking out of [use_his] flesh!" if(digitalcamo) - msg += "[use_He] [use_is] repulsively uncanny!\n" + . += "[use_He] [use_is] repulsively uncanny!" if(hasHUD(user, HUD_SECURITY)) var/perpname = "wot" @@ -204,8 +197,8 @@ if(R) criminal = R.get_criminalStatus() - msg += "Criminal status: \[[criminal]\]\n" - msg += "Security records: \[View\]\n" + . += "Criminal status: \[[criminal]\]" + . += "Security records: \[View\]" if(hasHUD(user, HUD_MEDICAL)) var/perpname = "wot" @@ -223,45 +216,55 @@ if(R) medical = R.get_status() - msg += "Physical status: \[[medical]\]\n" - msg += "Medical records: \[View\]\n" + . += "Physical status: \[[medical]\]" + . += "Medical records: \[View\]" // Show IC/OOC info if available. if(comments_record_id) var/datum/character_information/comments = SScharacter_info.get_record(comments_record_id) if(comments?.show_info_on_examine && (comments.ic_info || comments.ooc_info)) - msg += "*---------*
" + . += "*---------*" if(comments.ic_info) if(length(comments.ic_info) <= 40) - msg += "IC Info:
    [comments.ic_info]
" + . += "IC Info:" + . += "    [comments.ic_info]" else - msg += "IC Info:
    [copytext_preserve_html(comments.ic_info,1,37)]... More...
" + . += "IC Info:" + . += "    [copytext_preserve_html(comments.ic_info,1,37)]... More..." if(comments.ooc_info) if(length(comments.ooc_info) <= 40) - msg += "OOC Info:
    [comments.ooc_info]
" + . += "OOC Info:" + . += "    [comments.ooc_info]" else - msg += "OOC Info:
    [copytext_preserve_html(comments.ooc_info,1,37)]... More...
" + . += "OOC Info:" + . += "    [copytext_preserve_html(comments.ooc_info,1,37)]... More..." - msg += "*---------*

" - msg += applying_pressure + . += "*---------*
" + . += applying_pressure if (pose) if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. - msg += "[use_He] [pose]\n" + . += "[use_He] [pose]" var/list/human_examines = decls_repository.get_decls_of_subtype(/decl/human_examination) for(var/exam in human_examines) var/decl/human_examination/HE = human_examines[exam] var/adding_text = HE.do_examine(user, distance, src) if(adding_text) - msg += adding_text - - to_chat(user, jointext(msg, null)) - - ..() + . += adding_text + + // Foul, todo fix this + if(stat && ishuman(user) && !user.incapacitated() && Adjacent(user)) + spawn(0) + user.visible_message("\The [user] checks \the [src]'s pulse.", "You check \the [src]'s pulse.") + if(do_after(user, 15, src)) + if(get_pulse() == PULSE_NONE) + to_chat(user, "[use_He] [use_has] no pulse.") + else + to_chat(user, "[use_He] [use_has] a pulse!") -//Helper procedure. Called by /mob/living/human/examine() and /mob/living/human/Topic() to determine HUD access to security and medical records. +//Helper procedure. Called by /mob/living/human/examined_by() and /mob/living/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M, hudtype) return !!M.getHUDsource(hudtype) diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index e943d63d6f17..2efb51f3b3ca 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -129,13 +129,13 @@ if (href_list["lookitem"]) var/obj/item/I = locate(href_list["lookitem"]) if(I) - src.examinate(I) + src.examine_verb(I) return TOPIC_HANDLED if (href_list["lookmob"]) var/mob/M = locate(href_list["lookmob"]) if(M) - src.examinate(M) + src.examine_verb(M) return TOPIC_HANDLED return ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index bf16d1caf0fc..a2bb5d26fa26 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -21,11 +21,12 @@ return my_species.ai return ..() -/mob/living/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) + . = ..() if(admin_paralyzed) - to_chat(user, SPAN_OCCULT("OOC: [pronouns.He] [pronouns.has] been paralyzed by staff. Please avoid interacting with [pronouns.him] unless cleared to do so by staff.")) + . += SPAN_OCCULT("OOC: [pronouns.He] [pronouns.has] been paralyzed by staff. Please avoid interacting with [pronouns.him] unless cleared to do so by staff.") if(!length(get_external_organs()) && length(embedded)) // fallback for simple embedding used by limbless mobs - to_chat(user, SPAN_WARNING("[pronouns.He] [pronouns.has] [inline_counting_english_list(embedded, determiners = DET_INDEFINITE)] embedded in [pronouns.him].")) + . += SPAN_WARNING("[pronouns.He] [pronouns.has] [inline_counting_english_list(embedded, determiners = DET_INDEFINITE)] embedded in [pronouns.him].") //mob verbs are faster than object verbs. See above. /mob/living/pointed(atom/A as mob|obj|turf in view()) @@ -1964,23 +1965,20 @@ default behaviour is: set_moving_slowly() start_automove(target, metadata = upset ? _flee_automove_metadata : _annoyed_automove_metadata) -/mob/living/examine(mob/user, distance, infix, suffix) - +/mob/living/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(has_extension(src, /datum/extension/shearable)) var/datum/extension/shearable/shearable = get_extension(src, /datum/extension/shearable) if(world.time >= shearable.next_fleece || shearable.has_fleece) - to_chat(user, SPAN_NOTICE("\The [src] can be sheared with shears, or a similar tool.")) + . += SPAN_NOTICE("\The [src] can be sheared with shears, or a similar tool.") else - to_chat(user, SPAN_WARNING("\The [src] will be ready to be sheared in [ceil((shearable.next_fleece-world.time) / 10)] second\s.")) - + . += SPAN_WARNING("\The [src] will be ready to be sheared in [ceil((shearable.next_fleece-world.time) / 10)] second\s.") if(has_extension(src, /datum/extension/milkable)) var/datum/extension/milkable/milkable = get_extension(src, /datum/extension/milkable) if(milkable.udder.total_volume > 0) - to_chat(user, SPAN_NOTICE("\The [src] can be milked into a bucket or other container.")) + . += SPAN_NOTICE("\The [src] can be milked into a bucket or other container.") else - to_chat(user, SPAN_WARNING("\The [src] cannot currently be milked.")) + . += SPAN_WARNING("\The [src] cannot currently be milked.") /mob/living/proc/get_age() . = LAZYACCESS(appearance_descriptors, "age") || 30 diff --git a/code/modules/mob/living/silicon/ai/examine.dm b/code/modules/mob/living/silicon/ai/examine.dm index 42b3821b4ab8..8807ed377466 100644 --- a/code/modules/mob/living/silicon/ai/examine.dm +++ b/code/modules/mob/living/silicon/ai/examine.dm @@ -1,36 +1,33 @@ -/mob/living/silicon/ai/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/silicon/ai/examined_by(mob/user, distance, infix, suffix) . = ..() + user?.showLaws(src) - var/msg = "" - if (src.stat == DEAD) - msg += "It appears to be powered-down.\n" +/mob/living/silicon/ai/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) + . = ..() + if(stat == DEAD) + . += "It appears to be powered-down." else - msg += "" - if (src.get_damage(BRUTE)) - if (src.get_damage(BRUTE) < 30) - msg += "It looks slightly dented.\n" - else - msg += "It looks severely dented!\n" - if (src.get_damage(BURN)) - if (src.get_damage(BURN) < 30) - msg += "It looks slightly charred.\n" - else - msg += "Its casing is melted and heat-warped!\n" + var/brute_damage = get_damage(BRUTE) + if (brute_damage >= 30) + . += SPAN_WARNING("It looks severely dented!") + else if(brute_damage) + . += SPAN_WARNING("It looks slightly dented.") + var/burn_damage = get_damage(BURN) + if(burn_damage >= 30) + . += SPAN_WARNING("Its casing is melted and heat-warped!") + else if(burn_damage) + . += SPAN_WARNING("It looks slightly charred.") if (!has_power()) - if (src.get_damage(OXY) > 175) - msg += "It seems to be running on backup power. Its display is blinking a \"BACKUP POWER CRITICAL\" warning.\n" - else if(src.get_damage(OXY) > 100) - msg += "It seems to be running on backup power. Its display is blinking a \"BACKUP POWER LOW\" warning.\n" + var/oxy_damage = get_damage(OXY) + if (oxy_damage > 175) + . += SPAN_WARNING("It seems to be running on backup power. Its display is blinking a \"BACKUP POWER CRITICAL\" warning.") + else if(oxy_damage > 100) + . += SPAN_WARNING("It seems to be running on backup power. Its display is blinking a \"BACKUP POWER LOW\" warning.") else - msg += "It seems to be running on backup power.\n" - - if (src.stat == UNCONSCIOUS) - msg += "It is non-responsive and displaying the text: \"RUNTIME: Sensory Overload, stack 26/3\".\n" - msg += "" - msg += "*---------*" - to_chat(user, msg) - user.showLaws(src) - return + . += SPAN_WARNING("It seems to be running on backup power.") + if (stat == UNCONSCIOUS) + . += SPAN_WARNING("It is non-responsive and displaying the text: \"RUNTIME: Sensory Overload, stack 26/3\".") + . += "*---------*" /mob/proc/showLaws(var/mob/living/silicon/S) return diff --git a/code/modules/mob/living/silicon/pai/examine.dm b/code/modules/mob/living/silicon/pai/examine.dm index d781e3d136d1..270afeef3012 100644 --- a/code/modules/mob/living/silicon/pai/examine.dm +++ b/code/modules/mob/living/silicon/pai/examine.dm @@ -1,19 +1,18 @@ -/mob/living/silicon/pai/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) - . = ..(user, distance, infix = ", personal AI") - - var/msg = "" - switch(src.stat) +/mob/living/silicon/pai/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) + infix = ", personal AI" + . = ..() + switch(stat) if(CONSCIOUS) - if(!src.client) msg += "\nIt appears to be in stand-by mode." //afk - if(UNCONSCIOUS) msg += "\nIt doesn't seem to be responding." - if(DEAD) msg += "\nIt looks completely unsalvageable." - msg += "\n*---------*" - - if(print_flavor_text()) msg += "\n[print_flavor_text()]\n" - + if(!src.client) + . += "It appears to be in stand-by mode." //afk + if(UNCONSCIOUS) + . += "It doesn't seem to be responding." + if(DEAD) + . += "It looks completely unsalvageable." + . += "*---------*" + if(print_flavor_text()) + . += "[print_flavor_text()]" if (pose) if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. - msg += "\nIt is [pose]" - - to_chat(user, msg) + . += "It is [pose]" diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index c57b494d1002..ff180bd1016f 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -142,10 +142,10 @@ /obj/item/stack/material ) -/obj/item/gripper/examine(mob/user) +/obj/item/gripper/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(wrapped) - to_chat(user, "It is holding \a [wrapped].") + . += "It is holding \a [wrapped]." /obj/item/gripper/attack_self(mob/user) if(wrapped) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index fcf266c47ee3..2bfdc4c3ec64 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -69,10 +69,10 @@ if(drone_progress >= 100) visible_message("\The [src] voices a strident beep, indicating a drone chassis is prepared.") -/obj/machinery/drone_fabricator/examine(mob/user) +/obj/machinery/drone_fabricator/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(produce_drones && drone_progress >= 100 && isghost(user) && get_config_value(/decl/config/toggle/on/allow_drone_spawn) && count_drones() < get_config_value(/decl/config/num/max_maint_drones)) - to_chat(user, "
A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone.") + . += "A drone is prepared. Select 'Join As Drone' from the Ghost tab to spawn as a maintenance drone." /obj/machinery/drone_fabricator/proc/create_drone(var/client/player) diff --git a/code/modules/mob/living/silicon/robot/examine.dm b/code/modules/mob/living/silicon/robot/examine.dm index a822685d3461..6fb6983f9f25 100644 --- a/code/modules/mob/living/silicon/robot/examine.dm +++ b/code/modules/mob/living/silicon/robot/examine.dm @@ -1,43 +1,38 @@ -/mob/living/silicon/robot/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) - var/custom_infix = custom_name ? ", [modtype] [braintype]" : "" - . = ..(user, distance, infix = custom_infix) - - var/msg = "" - msg += "" - if (src.get_damage(BRUTE)) - if (src.get_damage(BRUTE) < 75) - msg += "It looks slightly dented.\n" - else - msg += "It looks severely dented!\n" - if (src.get_damage(BURN)) - if (src.get_damage(BURN) < 75) - msg += "It looks slightly charred.\n" - else - msg += "It looks severely burnt and heat-warped!\n" - msg += "" +/mob/living/silicon/robot/examined_by(mob/user, distance, infix, suffix) + . = ..() + user?.showLaws(src) +/mob/living/silicon/robot/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) + infix = custom_name ? ", [modtype] [braintype]" : "" + . = ..() + var/brute_damage = get_damage(BRUTE) + if (brute_damage >= 75) + . += SPAN_WARNING("It looks severely dented!") + else if(brute_damage) + . += SPAN_WARNING("It looks slightly dented.") + var/burn_damage = get_damage(BURN) + if (burn_damage >= 75) + . += SPAN_WARNING("It looks severely burnt and heat-warped!") + else if(burn_damage) + . += SPAN_WARNING("It looks slightly charred.") if(opened) - msg += "Its cover is open and the power cell is [cell ? "installed" : "missing"].\n" + . += SPAN_WARNING("Its cover is open and the power cell is [cell ? "installed" : "missing"].") else - msg += "Its cover is closed.\n" - + . += "Its cover is closed." if(!has_power) - msg += "It appears to be running on backup power.\n" - - switch(src.stat) + . += SPAN_WARNING("It appears to be running on backup power.") + switch(stat) if(CONSCIOUS) - if(!src.client) msg += "It appears to be in stand-by mode.\n" //afk - if(UNCONSCIOUS) msg += "It doesn't seem to be responding.\n" - if(DEAD) msg += "It looks completely unsalvageable.\n" - msg += "*---------*" - - if(print_flavor_text()) msg += "\n[print_flavor_text()]\n" - + if(!client) + . += "It appears to be in stand-by mode." //afk + if(UNCONSCIOUS) + . += SPAN_WARNING("It doesn't seem to be responding.") + if(DEAD) + . += "It looks completely unsalvageable." + . += "*---------*" + if(print_flavor_text()) + . += "[print_flavor_text()]" if (pose) if( findtext(pose,".",length(pose)) == 0 && findtext(pose,"!",length(pose)) == 0 && findtext(pose,"?",length(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. - msg += "\nIt [pose]" - - to_chat(user, msg) - user.showLaws(src) - return + . += "It [pose]" diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 71c952c9dbde..c2fde015d1df 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -68,14 +68,14 @@ flick("portable_analyzer_load", src) icon_state = "portable_analyzer_full" -/obj/item/portable_destructive_analyzer/examine(mob/user, distance) +/obj/item/portable_destructive_analyzer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(loaded_item) - to_chat(user, "It is holding \the [loaded_item].") - to_chat(user, "It has the following data saved:") + . += "It is holding \the [loaded_item]." + . += "It has the following data saved:" for(var/tech in saved_tech_levels) - to_chat(user, "[tech]: [saved_tech_levels[tech]]") + . += "[tech]: [saved_tech_levels[tech]]" //This is used to unlock other borg covers. /obj/item/card/robot //This is not a child of id cards, as to avoid dumb typechecks on computers. @@ -233,10 +233,10 @@ max_doors = 5 max_health = ITEM_HEALTH_NO_DAMAGE -/obj/item/inflatable_dispenser/examine(mob/user) +/obj/item/inflatable_dispenser/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.") - to_chat(user, "It is set to deploy [mode ? "doors" : "walls"]") + . += "It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored." + . += "It is set to deploy [mode ? "doors" : "walls"]" /obj/item/inflatable_dispenser/attack_self(mob/user) mode = !mode @@ -326,9 +326,9 @@ var/capacity = 1 //How many objects can be held. var/list/obj/item/held = list() //What is being held. -/obj/item/robot_rack/examine(mob/user) +/obj/item/robot_rack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It can hold up to [capacity] item\s.") + . += "It can hold up to [capacity] item\s." /obj/item/robot_rack/Initialize(mapload, starting_objects = 0) . = ..() diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 6571031649c7..7a00faca3d58 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -149,21 +149,21 @@ var/decl/skill/examine_skill = SKILL_BOTANY // for maps that change the default skills, or for alien eggs that need science/medical/anatomy instead var/examine_difficulty = SKILL_ADEPT -/mob/living/simple_animal/chick/examine(mob/user, distance, infix, suffix) +/mob/living/simple_animal/chick/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(!user.skill_check(examine_skill, examine_difficulty)) var/decl/skill/examine_skill_decl = GET_DECL(examine_skill) - to_chat(user, SPAN_SUBTLE("If you knew more about [lowertext(examine_skill_decl.name)], you could learn additional information about this.")) + . += SPAN_SUBTLE("If you knew more about [lowertext(examine_skill_decl.name)], you could learn additional information about this.") return switch(amount_grown) if(0 to 20) - to_chat(user, SPAN_NOTICE("It's still young.")) + . += SPAN_NOTICE("It's still young.") if(20 to 40) - to_chat(user, SPAN_NOTICE("It's starting to grow in its adult feathers.")) + . += SPAN_NOTICE("It's starting to grow in its adult feathers.") if(40 to 80) - to_chat(user, SPAN_NOTICE("It's grown in almost all its adult feathers.")) + . += SPAN_NOTICE("It's grown in almost all its adult feathers.") if(80 to 100) - to_chat(user, SPAN_NOTICE("It's almost fully grown.")) + . += SPAN_NOTICE("It's almost fully grown.") /datum/mob_controller/chick emote_speech = list("Cherp.","Cherp?","Chirrup.","Cheep!") @@ -304,19 +304,19 @@ var/global/chicken_count = 0 var/decl/skill/examine_skill = SKILL_BOTANY // for maps that change the default skills, or for alien eggs that need science/medical/anatomy instead var/examine_difficulty = SKILL_ADEPT -/obj/item/food/egg/examine(mob/user, distance, infix, suffix) +/obj/item/food/egg/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(isnull(examine_difficulty) || !ispath(examine_skill)) return if(!user.skill_check(examine_skill, examine_difficulty)) var/decl/skill/examine_skill_decl = GET_DECL(examine_skill) - to_chat(user, SPAN_SUBTLE("If you knew more about [lowertext(examine_skill_decl.name)], you could learn additional information about this.")) + . += SPAN_SUBTLE("If you knew more about [lowertext(examine_skill_decl.name)], you could learn additional information about this.") return if(distance > 1) - to_chat(user, SPAN_SUBTLE("You're too far away to learn anything about this.")) + . += SPAN_SUBTLE("You're too far away to learn anything about this.") return if(!user.get_held_slot_for_item(src)) - to_chat(user, SPAN_NOTICE("You need to be holding \the [src] to examine it closer.")) + . += SPAN_NOTICE("You need to be holding \the [src] to examine it closer.") return // need a lit candle or lantern to check var/too_hot = FALSE @@ -329,18 +329,18 @@ var/global/chicken_count = 0 if(!too_hot) break if(too_hot) - to_chat(user, SPAN_WARNING("You can't use \the [candle] to examine \the [src], that would fry it!")) + . += SPAN_WARNING("You can't use \the [candle] to examine \the [src], that would fry it!") return else if(!candle) - to_chat(user, SPAN_NOTICE("You need to be holding a light source to examine this closer.")) + . += SPAN_NOTICE("You need to be holding a light source to examine this closer.") return switch(amount_grown) if(0) - to_chat(user, SPAN_NOTICE("\The [src] is unfertilized.")) + . += SPAN_NOTICE("\The [src] is unfertilized.") if(10 to 80) - to_chat(user, SPAN_NOTICE("There's something growing inside \the [src].")) + . += SPAN_NOTICE("There's something growing inside \the [src].") if(80 to 100) - to_chat(user, SPAN_NOTICE("\The [src] is about to hatch!")) + . += SPAN_NOTICE("\The [src] is about to hatch!") /obj/item/food/egg/Destroy() if(amount_grown) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e10cf8f47e54..eafaddbed548 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -377,8 +377,8 @@ /mob/proc/get_additional_stripping_options() return -//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 for why this isn't atom/verb/examine() -/mob/verb/examinate(atom/A as mob|obj|turf in view()) +//mob verbs are faster than object verbs. See http://www.byond.com/forum/?post=1326139&page=2#comment8198716 +/mob/verb/examine_verb(atom/A as mob|obj|turf in view()) set name = "Examine" set category = "IC" @@ -418,8 +418,8 @@ RAISE_EVENT(/decl/observ/mob_examining, src, A) - if(!A.examine(src, distance)) - PRINT_STACK_TRACE("Improper /examine() override: [log_info_line(A)]") + if(!A.examined_by(src, distance)) + PRINT_STACK_TRACE("Improper /examined_by() override: [log_info_line(A)]") /mob/verb/pointed(atom/A as mob|obj|turf in view()) set name = "Point To" diff --git a/code/modules/mob/observer/eye/eye.dm b/code/modules/mob/observer/eye/eye.dm index fa4a89fdb28a..ad313eeff1f4 100644 --- a/code/modules/mob/observer/eye/eye.dm +++ b/code/modules/mob/observer/eye/eye.dm @@ -41,7 +41,7 @@ set_dir(ndir) return 1 -/mob/observer/eye/examinate() +/mob/observer/eye/examine_verb() set popup_menu = 0 set src = usr.contents return 0 @@ -51,7 +51,7 @@ set src = usr.contents return 0 -/mob/observer/eye/examine(mob/user) +/mob/observer/eye/examined_by(mob/user) SHOULD_CALL_PARENT(FALSE) return TRUE diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 4adb8e75dd2e..d4fa1b3bd2e7 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -103,16 +103,17 @@ return ..() -/obj/item/modular_computer/examine(mob/user) +/obj/item/modular_computer/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/datum/extension/assembly/assembly = get_extension(src, /datum/extension/assembly) if(assembly.enabled) - to_chat(user, "The time [stationtime2text()] is displayed in the corner of the screen.") - + . += "The time [stationtime2text()] is displayed in the corner of the screen." var/obj/item/stock_parts/computer/card_slot/card_slot = assembly.get_component(PART_CARD) if(card_slot && card_slot.stored_card) - to_chat(user, "\The [card_slot.stored_card] is inserted into it.") - assembly.examine(user) + . += "\The [card_slot.stored_card] is inserted into it." + var/assembly_string = assembly.examine_assembly(user) + if(assembly_string) + . += assembly_string /obj/item/modular_computer/afterattack(atom/target, mob/user, proximity) . = ..() diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index 2cbf1c065f4e..f328a743f362 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -155,9 +155,9 @@ to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) return TRUE -/atom/movable/openspace/mimic/examine(...) +/atom/movable/openspace/mimic/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - . = associated_atom.examine(arglist(args)) // just pass all the args to the copied atom + . = associated_atom.examined_by(user, distance, infix, suffix) // just pass all the args to the copied atom /atom/movable/openspace/mimic/forceMove(turf/dest) var/atom/old_loc = loc @@ -205,9 +205,9 @@ /atom/movable/openspace/turf_proxy/attack_generic(mob/user as mob) loc.attack_generic(user) -/atom/movable/openspace/turf_proxy/examine(mob/examiner) +/atom/movable/openspace/turf_proxy/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - . = loc.examine(examiner) + . = loc.examined_by(user, distance, infix, suffix) // -- TURF MIMIC -- @@ -234,6 +234,6 @@ /atom/movable/openspace/turf_mimic/attack_generic(mob/user as mob) to_chat(user, SPAN_NOTICE("You cannot reach \the [src] from here.")) -/atom/movable/openspace/turf_mimic/examine(mob/examiner) +/atom/movable/openspace/turf_mimic/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - . = delegate.examine(examiner) + . = delegate.examined_by(user, distance, infix, suffix) diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 07ca8655bb3f..3f7d22a0bfc3 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -226,23 +226,23 @@ return //no eating the limb until everything's been removed return ..() -/obj/item/organ/external/examine(mob/user, distance) +/obj/item/organ/external/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 || isghost(user)) for(var/obj/item/embedded in contents) if(istype(embedded, /obj/item/organ)) continue - to_chat(user, SPAN_DANGER("There is \a [embedded] sticking out of it.")) + . += SPAN_DANGER("There is \a [embedded] sticking out of it.") var/ouchies = get_wounds_desc() if(ouchies != "nothing") - to_chat(user, SPAN_NOTICE("There is [ouchies] visible on it.")) + . += SPAN_NOTICE("There is [ouchies] visible on it.") - return - -/obj/item/organ/external/show_decay_status(mob/user) - ..(user) +/obj/item/organ/external/get_decay_status(mob/user) + . = ..() for(var/obj/item/organ/external/child in children) - child.show_decay_status(user) + var/decay_status = child.get_decay_status(user) + if(decay_status) + . += decay_status /obj/item/organ/external/attackby(obj/item/used_item, mob/user) diff --git a/code/modules/organs/external/head.dm b/code/modules/organs/external/head.dm index 3fdae586b029..e2d32062fb37 100644 --- a/code/modules/organs/external/head.dm +++ b/code/modules/organs/external/head.dm @@ -54,11 +54,10 @@ /obj/item/organ/external/head/get_manual_dexterity() . = DEXTERITY_SIMPLE_MACHINES | DEXTERITY_HOLD_ITEM | DEXTERITY_EQUIP_ITEM | DEXTERITY_KEYBOARDS | DEXTERITY_TOUCHSCREENS -/obj/item/organ/external/head/examine(mob/user) +/obj/item/organ/external/head/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(forehead_graffiti && graffiti_style) - to_chat(user, "It has \"[forehead_graffiti]\" written on it in [graffiti_style]!") + . += SPAN_NOTICE("It has \"[forehead_graffiti]\" written on it in [graffiti_style]!") /obj/item/organ/external/head/proc/write_on(var/mob/penman, var/style) var/head_name = name diff --git a/code/modules/organs/internal/brain.dm b/code/modules/organs/internal/brain.dm index ff2409019c4a..0a83423de539 100644 --- a/code/modules/organs/internal/brain.dm +++ b/code/modules/organs/internal/brain.dm @@ -58,16 +58,19 @@ QDEL_NULL(_brainmob) . = ..() -/obj/item/organ/internal/brain/examine(mob/user, var/distance) +/obj/item/organ/internal/brain/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - show_brain_status(user) + var/brain_status = get_brain_status(user) + if(brain_status) + . += brain_status -/obj/item/organ/internal/brain/proc/show_brain_status(mob/user) +/obj/item/organ/internal/brain/proc/get_brain_status(mob/user) + . = list() if(istype(_brainmob) && _brainmob?.client) //if thar be a brain inside... the brain. - to_chat(user, "You can feel the small spark of life still left in this one.") + . += "You can feel the small spark of life still left in this one." else - to_chat(user, "This one seems particularly lifeless. Perhaps it will regain some of its luster later.") + . += "This one seems particularly lifeless. Perhaps it will regain some of its luster later." /obj/item/organ/internal/brain/do_install(mob/living/target, affected, in_place, update_icon, detached) if(!(. = ..())) diff --git a/code/modules/organs/internal/brain_computer.dm b/code/modules/organs/internal/brain_computer.dm index 919b10e056d7..3a3d946954fd 100644 --- a/code/modules/organs/internal/brain_computer.dm +++ b/code/modules/organs/internal/brain_computer.dm @@ -74,19 +74,20 @@ if(response == "Yes" && brainmob && !brainmob?.key && G.assess_candidate(user)) G.transfer_personality(user, brainmob) -/obj/item/organ/internal/brain/robotic/show_brain_status(mob/user) +/obj/item/organ/internal/brain/robotic/get_brain_status(mob/user) + . = list() var/mob/living/brainmob = get_brainmob() if(brainmob?.key) switch(brainmob.stat) if(CONSCIOUS) if(!brainmob.client) - to_chat(user, SPAN_WARNING("It appears to be in stand-by mode.")) + . += SPAN_WARNING("It appears to be in stand-by mode.") if(UNCONSCIOUS) - to_chat(user, SPAN_WARNING("It doesn't seem to be responsive.")) + . += SPAN_WARNING("It doesn't seem to be responsive.") if(DEAD) - to_chat(user, SPAN_WARNING("It appears to be completely inactive.")) + . += SPAN_WARNING("It appears to be completely inactive.") else - to_chat(user, SPAN_WARNING("It appears to be completely inactive.")) + . += SPAN_WARNING("It appears to be completely inactive.") /obj/item/organ/internal/brain/robotic/get_synthetic_owner_name() return "Robot" diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index b052ca899bbd..dbc48e5e4b13 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -281,13 +281,17 @@ return TRUE return FALSE -/obj/item/organ/examine(mob/user) - . = ..(user) - show_decay_status(user) +/obj/item/organ/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() + var/decay_status = get_decay_status(user) + if(decay_status) + . += decay_status -/obj/item/organ/proc/show_decay_status(mob/user) +/obj/item/organ/proc/get_decay_status(mob/user) + SHOULD_CALL_PARENT(TRUE) + . = list() if(status & ORGAN_DEAD) - to_chat(user, "The decay has set into \the [src].") + . += SPAN_WARNING("Decay has set into \the [src].") // TODO: bodytemp rework that handles this with better respect to // individual organs vs. expected body temperature for other organs. diff --git a/code/modules/overmap/contacts/tracker.dm b/code/modules/overmap/contacts/tracker.dm index feb89fe461ff..f8fbff10d09f 100644 --- a/code/modules/overmap/contacts/tracker.dm +++ b/code/modules/overmap/contacts/tracker.dm @@ -23,6 +23,6 @@ . = ..() icon_state = enabled ? "enabled" : "disabled" -/obj/item/ship_tracker/examine(var/mob/user) +/obj/item/ship_tracker/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It appears to be [enabled ? "enabled" : "disabled"]") \ No newline at end of file + . += "It appears to be [enabled ? "enabled" : "disabled"]" diff --git a/code/modules/overmap/disperser/disperser.dm b/code/modules/overmap/disperser/disperser.dm index 77110bc3f4e5..4b8660f0c0ee 100644 --- a/code/modules/overmap/disperser/disperser.dm +++ b/code/modules/overmap/disperser/disperser.dm @@ -7,10 +7,10 @@ anchored = TRUE construct_state = /decl/machine_construction/default/panel_closed -/obj/machinery/disperser/examine(mob/user) +/obj/machinery/disperser/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(panel_open) - to_chat(user, "The maintenance panel is open.") + . += "The maintenance panel is open." /obj/machinery/disperser/attackby(obj/item/I, mob/user) if(IS_WRENCH(I)) diff --git a/code/modules/overmap/ftl_shunt/core.dm b/code/modules/overmap/ftl_shunt/core.dm index c497e066fdab..a6e6e567046e 100644 --- a/code/modules/overmap/ftl_shunt/core.dm +++ b/code/modules/overmap/ftl_shunt/core.dm @@ -98,19 +98,19 @@ animate(S, alpha = 255, time = 5.9 SECONDS) add_overlay(S) -/obj/machinery/ftl_shunt/core/examine(mob/user) +/obj/machinery/ftl_shunt/core/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(sabotaged) if(user.skill_check(SKILL_ENGINES, SKILL_ADEPT)) switch(sabotaged) if(SHUNT_SABOTAGE_MINOR) - to_chat(user, SPAN_WARNING("It looks like it's been tampered with in some way, and the accelerator vanes seem out of place.")) + . += SPAN_WARNING("It looks like it's been tampered with in some way, and the accelerator vanes seem out of place.") if(SHUNT_SABOTAGE_MAJOR) - to_chat(user, SPAN_WARNING("Light behaves oddly around the core of [src], and it looks to have been tampered with! The vanes are definitely out of place.")) + . += SPAN_WARNING("Light behaves oddly around the core of [src], and it looks to have been tampered with! The vanes are definitely out of place.") if(SHUNT_SABOTAGE_CRITICAL) - to_chat(user, SPAN_DANGER("Light bends around the core of [src] in a manner that eerily reminds you of a singularity... the vanes look completely misaligned!")) + . += SPAN_DANGER("Light bends around the core of [src] in a manner that eerily reminds you of a singularity... the vanes look completely misaligned!") else - to_chat(user, SPAN_WARNING("It looks like it's been tampered with, but you're not sure to what extent.")) + . += SPAN_WARNING("It looks like it's been tampered with, but you're not sure to what extent.") /obj/machinery/ftl_shunt/core/attackby(var/obj/item/O, var/mob/user) if(istype(O, /obj/item/stack/telecrystal)) diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index cd40acd76d99..4b0f3ee39662 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -26,14 +26,14 @@ stored_pen = null return ..() -/obj/item/clipboard/examine(mob/user, distance, infix, suffix) +/obj/item/clipboard/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(stored_pen) - to_chat(user, "It's holding \a [stored_pen].") + . += "It's holding \a [stored_pen]." if(!LAZYLEN(papers)) - to_chat(user, "It contains [length(papers)] / [max_papers] paper\s.") + . += "It contains [length(papers)] / [max_papers] paper\s." else - to_chat(user, "It has room for [max_papers] paper\s.") + . += "It has room for [max_papers] paper\s." /obj/item/clipboard/proc/top_paper() return LAZYACCESS(papers, 1) diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index a6a51a71675b..ccc5e1d77c8c 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -100,9 +100,9 @@ else icon_state = "envelope[contents.len > 0]" -/obj/item/folder/envelope/examine(mob/user) +/obj/item/folder/envelope/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "The seal is [sealed ? "intact" : "broken"].") + . += "The seal is [sealed ? "intact" : "broken"]." /obj/item/folder/envelope/proc/sealcheck(user) var/ripperoni = alert("Are you sure you want to break the seal on \the [src]?", "Confirmation","Yes", "No") diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index 24666d60883e..225646088bf6 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -28,10 +28,10 @@ var/safety = TRUE //Whether the safety is on or off. Set to FALSE to allow labeler to interact with things var/mode = HAND_LABELER_MODE_ADD //What operation the labeler is set to do -/obj/item/hand_labeler/examine(mob/user, distance, infix, suffix) +/obj/item/hand_labeler/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance < 1) - to_chat(user, safety? "Safety is on." : SPAN_WARNING("Safety is off!")) + . += safety? "Safety is on." : SPAN_WARNING("Safety is off!") var/modename switch(mode) if(HAND_LABELER_MODE_ADD) @@ -40,12 +40,12 @@ modename = HAND_LABELER_MODE_REM_NAME if(HAND_LABELER_MODE_REMALL) modename = HAND_LABELER_MODE_REMALL_NAME - to_chat(user, "It's set to '[SPAN_ITALIC(modename)]' mode.") - to_chat(user, "It has [get_labels_left()]/[max_labels] label(s).") + . += "It's set to '[SPAN_ITALIC(modename)]' mode." + . += "It has [get_labels_left()]/[max_labels] label(s)." if(length(label)) - to_chat(user, "Its label text reads '[SPAN_ITALIC(label)]'.") + . += "Its label text reads '[SPAN_ITALIC(label)]'." else - to_chat(user, SPAN_NOTICE("You're too far away to tell much more.")) + . += SPAN_NOTICE("You're too far away to tell much more.") /obj/item/hand_labeler/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) return FALSE diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 02428e20f704..c0dd0d858629 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -110,11 +110,13 @@ if(new_text) free_space -= length(strip_html_properly(new_text)) -/obj/item/paper/examine(mob/user, distance) +/obj/item/paper/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(name != initial(name)) - to_chat(user, "It's titled '[name]'.") + . += "It's titled '[name]'." +/obj/item/paper/examined_by(mob/user, distance, infix, suffix) + . = ..() if(distance <= 1) interact(user, readonly = TRUE) else @@ -161,7 +163,7 @@ SPAN_NOTICE("You show the paper to [target]."), SPAN_NOTICE("[user] holds up a paper and shows it to [target].") ) - target.examinate(src) + target.examine_verb(src) return TRUE target_zone = check_zone(target_zone) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 16a2f1f7ab97..27d047e94b87 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -187,7 +187,7 @@ "You hold \the [P] up to \the [src], burning it slowly.") addtimer(CALLBACK(src, PROC_REF(burn_callback), P, user, span_class), 2 SECONDS) -/obj/item/paper_bundle/examine(mob/user, distance) +/obj/item/paper_bundle/examined_by(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) interact(user) diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index 7c7e69565c3a..e9f2b4b5cf2b 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -50,10 +50,10 @@ return . return ..() -/obj/item/sticky_pad/examine(mob/user) +/obj/item/sticky_pad/examined_by(mob/user, distance, infix, suffix) . = ..() - to_chat(user, SPAN_NOTICE("It has [papers] sticky note\s left.")) - to_chat(user, SPAN_NOTICE("You can click it on grab intent to pick it up.")) + . += SPAN_NOTICE("It has [papers] sticky note\s left.") + . += SPAN_NOTICE("You can click it on grab intent to pick it up.") /obj/item/sticky_pad/dragged_onto(mob/user) user.put_in_hands(top) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 3622d047f5c7..0dfa1d4f831b 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -103,15 +103,15 @@ return TRUE return ..() -/obj/item/paper_bin/examine(mob/user, distance) +/obj/item/paper_bin/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1) return if(amount) - to_chat(user, SPAN_NOTICE("There [(amount > 1 ? "are [amount] papers" : "is one paper")] in the bin.")) + . += SPAN_NOTICE("There [(amount > 1 ? "are [amount] papers" : "is one paper")] in the bin.") else - to_chat(user, SPAN_NOTICE("There are no papers in the bin.")) - to_chat(user, SPAN_NOTICE("It can contain at most [max_amount] papers.")) + . += SPAN_NOTICE("There are no papers in the bin.") + . += SPAN_NOTICE("It can contain at most [max_amount] papers.") /obj/item/paper_bin/on_update_icon() . = ..() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 6bd2a2524065..4c9d0671b539 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -42,12 +42,12 @@ update_icon() return TRUE -/obj/item/camera_film/examine(mob/user, distance, infix, suffix) +/obj/item/camera_film/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(uses_left < 1) - to_chat(user, SPAN_WARNING("This cartridge is completely spent!")) + . += SPAN_WARNING("This cartridge is completely spent!") else - to_chat(user, "[uses_left] uses left.") + . += "[uses_left] uses left." /obj/item/camera_film/proc/get_remaining() return uses_left @@ -88,7 +88,7 @@ return clone /obj/item/photo/attack_self(mob/user) - user.examinate(src) + user.examine_verb(src) /obj/item/photo/get_matter_amount_modifier() return 0.2 @@ -117,7 +117,7 @@ return TRUE return ..() -/obj/item/photo/examine(mob/user, distance) +/obj/item/photo/examined_by(mob/user, distance, infix, suffix) . = ..() if(distance > 1) to_chat(user, SPAN_NOTICE("It is too far away.")) @@ -336,12 +336,12 @@ to_chat(user, SPAN_NOTICE("[film.get_remaining()] photo\s left.")) return TRUE -/obj/item/camera/examine(mob/user) +/obj/item/camera/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(film) - to_chat(user, "It has [film?.get_remaining()] photo\s left.") + . += "It has [film?.get_remaining()] photo\s left." else - to_chat(user, "It doesn't have a film cartridge.") + . += "It doesn't have a film cartridge." /obj/item/camera/proc/captureimage(atom/target, mob/living/user, flag) var/x_c = target.x - (field_of_view-1)/2 diff --git a/code/modules/persistence/graffiti.dm b/code/modules/persistence/graffiti.dm index 0bd85389b6f4..ea6e391a7909 100644 --- a/code/modules/persistence/graffiti.dm +++ b/code/modules/persistence/graffiti.dm @@ -31,11 +31,11 @@ SSpersistence.forget_value(src, /decl/persistence_handler/graffiti) . = ..() -/obj/effect/decal/writing/examine(mob/user) +/obj/effect/decal/writing/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) var/processed_message = user.handle_reading_literacy(user, message) if(processed_message) - to_chat(user, "It reads \"[processed_message]\".") + . += "It reads \"[processed_message]\"." /obj/effect/decal/writing/attackby(var/obj/item/thing, var/mob/user) if(IS_WELDER(thing) && thing.do_tool_interaction(TOOL_WELDER, user, src, 3 SECONDS)) diff --git a/code/modules/persistence/noticeboards.dm b/code/modules/persistence/noticeboards.dm index d0b5af670daa..28a2f6479136 100644 --- a/code/modules/persistence/noticeboards.dm +++ b/code/modules/persistence/noticeboards.dm @@ -87,7 +87,7 @@ interact(user) return TRUE -/obj/structure/noticeboard/examine(mob/user, distance, infix, suffix) +/obj/structure/noticeboard/examined_by(mob/user, distance, infix, suffix) . = ..() interact(user) diff --git a/code/modules/posters/_poster.dm b/code/modules/posters/_poster.dm index 2f3ca709b56c..d874171cc744 100644 --- a/code/modules/posters/_poster.dm +++ b/code/modules/posters/_poster.dm @@ -93,10 +93,10 @@ set_icon_state(poster_design.icon_state) update_icon() -/obj/structure/sign/poster/examine(mob/user, distance, infix, suffix) +/obj/structure/sign/poster/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "The bottom right of \the [src] reads: '[poster_design.serial_number]'.") + . += "The bottom right of \the [src] reads: '[poster_design.serial_number]'." /obj/structure/sign/poster/proc/set_design(var/decl/poster_design/_design_path) if(ispath(_design_path, /decl)) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 11e314053cea..52776be8e59f 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -246,18 +246,18 @@ var/global/list/all_apcs = list() if(term && (!functional_only || term.is_functional())) return term.terminal -/obj/machinery/power/apc/examine(mob/user, distance) +/obj/machinery/power/apc/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) if(stat & BROKEN) - to_chat(user, "Looks broken.") + . += "Looks broken." return var/terminal = terminal() - to_chat(user, "\The [src] is [terminal ? "" : "not "]connected to external power.") + . += "\The [src] is [terminal ? "" : "not "]connected to external power." if(!panel_open) - to_chat(user, "The cover is closed.") + . += "The cover is closed." else - to_chat(user, "The cover is [cover_removed ? "removed" : "open"] and the power cell is [ get_cell(FALSE) ? "installed" : "missing"].") + . += "The cover is [cover_removed ? "removed" : "open"] and the power cell is [ get_cell(FALSE) ? "installed" : "missing"]." // Broken/missing board should be shown by parent. // update the APC icon to show the three base states diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 5cb140c727e3..38477765ac00 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -37,12 +37,12 @@ set_state(1) . = ..() -/obj/machinery/power/breakerbox/examine(mob/user) +/obj/machinery/power/breakerbox/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(on) - to_chat(user, "It seems to be online.") + . += "It seems to be online." else - to_chat(user, "It seems to be offline.") + . += "It seems to be offline." /obj/machinery/power/breakerbox/attack_ai(mob/living/silicon/ai/user) if(update_locked) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 0aa55c1c1e15..f00722b2d3c9 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -111,7 +111,7 @@ By design, d1 is the smallest direction and d2 is the highest // Ghost examining the cable -> tells him the power /obj/structure/cable/attack_ghost(mob/user) if(user.client && user.client.inquisitive_ghost) - user.examinate(src) + user.examine_verb(src) // following code taken from attackby (multitool) if(powernet && (powernet.avail > 0)) to_chat(user, SPAN_WARNING("[get_wattage()] in power network.")) @@ -614,18 +614,16 @@ By design, d1 is the smallest direction and d2 is the highest else w_class = ITEM_SIZE_SMALL -/obj/item/stack/cable_coil/examine(mob/user, distance) +/obj/item/stack/cable_coil/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1) return - if(get_amount() == 1) - to_chat(user, "\A [singular_name] of cable.") + . += "\A [singular_name] of cable." else if(get_amount() == 2) - to_chat(user, "Two [plural_name] of cable.") + . += "Two [plural_name] of cable." else - to_chat(user, "A coil of power cable. There are [get_amount()] [plural_name] of cable in the coil.") - + . += "A coil of power cable. There are [get_amount()] [plural_name] of cable in the coil." /obj/item/stack/cable_coil/verb/make_restraint() set name = "Make Cable Restraints" diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index f6dada5b25d4..8af653291679 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -79,10 +79,10 @@ update_icon() return amount_used -/obj/item/cell/examine(mob/user) +/obj/item/cell/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "The label states it's capacity is [maxcharge] Wh.") - to_chat(user, "The charge meter reads [round(src.percent(), 0.1)]%.") + . += "The label states it's capacity is [maxcharge] Wh." + . += "The charge meter reads [round(src.percent(), 0.1)]%." /obj/item/cell/emp_act(severity) // remove this if EMPs are ever rebalanced so that they don't instantly drain borg cells diff --git a/code/modules/power/debug_items.dm b/code/modules/power/debug_items.dm index 01eb4198060e..3c725c6dd430 100644 --- a/code/modules/power/debug_items.dm +++ b/code/modules/power/debug_items.dm @@ -5,7 +5,7 @@ density = TRUE var/show_extended_information = 1 // Set to 0 to disable extra information on examining (for example, when used on admin events) -/obj/machinery/power/debug_items/examine(mob/user) +/obj/machinery/power/debug_items/examined_by(mob/user) . = ..() if(show_extended_information) show_info(user) diff --git a/code/modules/power/geothermal/_geothermal.dm b/code/modules/power/geothermal/_geothermal.dm index 3425a37cd2cd..138a38cd1cf4 100644 --- a/code/modules/power/geothermal/_geothermal.dm +++ b/code/modules/power/geothermal/_geothermal.dm @@ -160,11 +160,11 @@ var/global/const/MAX_GEOTHERMAL_PRESSURE = 12000 if(G?.anchored) G.refresh_neighbors() -/obj/machinery/geothermal/examine(mob/user, distance) +/obj/machinery/geothermal/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance < 2) - to_chat(user, SPAN_INFO("Pressure: [current_pressure]kPa")) - to_chat(user, SPAN_INFO("Output: [last_generated]W")) + . += SPAN_INFO("Pressure: [current_pressure]kPa") + . += SPAN_INFO("Output: [last_generated]W") ///Attempts to connect to any existing geothermal vents in our turf. /obj/machinery/geothermal/proc/setup_vent() diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 76c85e46b822..c2866b277c96 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -215,18 +215,18 @@ update_icon() // examine verb -/obj/machinery/light/examine(mob/user) +/obj/machinery/light/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/fitting = get_fitting_name() switch(get_status()) if(LIGHT_OK) - to_chat(user, "It is turned [on? "on" : "off"].") + . += "It is turned [on? "on" : "off"]." if(LIGHT_EMPTY) - to_chat(user, "The [fitting] has been removed.") + . += "The [fitting] has been removed." if(LIGHT_BURNED) - to_chat(user, "The [fitting] is burnt out.") + . += "The [fitting] is burnt out." if(LIGHT_BROKEN) - to_chat(user, "The [fitting] has been smashed.") + . += "The [fitting] has been smashed." /obj/machinery/light/proc/get_fitting_name() var/obj/item/light/L = light_type diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index d869748a7b40..e10a4f9c6d13 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -71,14 +71,14 @@ return STATUS_CLOSE return ..() -/obj/machinery/port_gen/examine(mob/user, distance) +/obj/machinery/port_gen/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance > 1) - return - if(active) - to_chat(user, "The generator is on.") - else - to_chat(user, "The generator is off.") + if(distance <= 1) + if(active) + . += SPAN_NOTICE("The generator is on.") + else + . += SPAN_NOTICE("The generator is off.") + /obj/machinery/port_gen/emp_act(severity) if(!active) return @@ -139,21 +139,21 @@ var/overheating = 0 //if this gets high enough the generator explodes var/max_overheat = 150 -/obj/machinery/port_gen/pacman/examine(mob/user) +/obj/machinery/port_gen/pacman/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(active) - to_chat(user, "\The [src] appears to be producing [power_gen*power_output] W.") + . += "\The [src] appears to be producing [power_gen*power_output] W." else - to_chat(user, "\The [src] is turned off.") + . += "\The [src] is turned off." if(IsBroken()) - to_chat(user, SPAN_WARNING("\The [src] seems to have broken down.")) + . += SPAN_WARNING("\The [src] seems to have broken down.") if(overheating) - to_chat(user, SPAN_DANGER("\The [src] is overheating!")) + . += SPAN_DANGER("\The [src] is overheating!") if(sheet_path && sheet_material) var/decl/material/mat = GET_DECL(sheet_material) var/obj/item/stack/material/sheet = sheet_path - to_chat(user, "There [sheets == 1 ? "is" : "are"] [sheets] [sheets == 1 ? initial(sheet.singular_name) : initial(sheet.plural_name)] left in the hopper.") - to_chat(user, SPAN_SUBTLE("\The [src] uses [mat.solid_name] [initial(sheet.plural_name)] as fuel to produce power.")) + . += "There [sheets == 1 ? "is" : "are"] [sheets] [sheets == 1 ? initial(sheet.singular_name) : initial(sheet.plural_name)] left in the hopper." + . += SPAN_SUBTLE("\The [src] uses [mat.solid_name] [initial(sheet.plural_name)] as fuel to produce power.") /obj/machinery/port_gen/pacman/Initialize() . = ..() @@ -463,9 +463,9 @@ create_reagents(120) . = ..() -/obj/machinery/port_gen/pacman/super/potato/examine(mob/user) +/obj/machinery/port_gen/pacman/super/potato/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "Auxilary tank shows [reagents.total_volume]u of liquid in it.") + . += "Auxilary tank shows [reagents.total_volume]u of liquid in it." /obj/machinery/port_gen/pacman/super/potato/UseFuel() if(reagents.has_reagent(/decl/material/liquid/alcohol/vodka)) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 7a915e305aa2..d915bac98433 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -133,11 +133,10 @@ var/global/list/rad_collectors = list() return TRUE return ..() -/obj/machinery/rad_collector/examine(mob/user, distance) +/obj/machinery/rad_collector/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (distance <= 3 && !(stat & BROKEN)) - to_chat(user, "The meter indicates that \the [src] is collecting [last_power] W.") - return 1 + . += "The meter indicates that \the [src] is collecting [last_power] W." /obj/machinery/rad_collector/explosion_act(severity) if(severity != 1) diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index 077fd4e5a037..d30617004668 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -86,21 +86,20 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin icon_state = "end_cap" reference = "end_cap" -/obj/structure/particle_accelerator/examine(mob/user) +/obj/structure/particle_accelerator/get_examine_strings(mob/user, distance, infix, suffix) . = ..() switch(construction_state) if(0) - to_chat(user, "Looks like it's not attached to the flooring.") + . += "Looks like it's not attached to the flooring." if(1) - to_chat(user, "It is missing some cables.") + . += "It is missing some cables." if(2) - to_chat(user, "The panel is open.") + . += "The panel is open." if(3) if(powered) - to_chat(user, desc_holder) + . += desc_holder else - to_chat(user, "\The [src] is assembled.") - + . += "\The [src] is assembled." /obj/structure/particle_accelerator/attackby(obj/item/W, mob/user) if(has_extension(W, /datum/extension/tool)) @@ -227,21 +226,20 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin /obj/machinery/particle_accelerator/on_update_icon() return -/obj/machinery/particle_accelerator/examine(mob/user) +/obj/machinery/particle_accelerator/get_examine_strings(mob/user, distance, infix, suffix) . = ..() switch(construction_state) if(0) - to_chat(user, "Looks like it's not attached to the flooring.") + . += "Looks like it's not attached to the flooring." if(1) - to_chat(user, "It is missing some cables.") + . += "It is missing some cables." if(2) - to_chat(user, "The panel is open.") + . += "The panel is open." if(3) if(powered) - to_chat(user, desc_holder) + . += desc_holder else - to_chat(user, "\The [src] is assembled.") - + . += "\The [src] is assembled." /obj/machinery/particle_accelerator/attackby(obj/item/W, mob/user) if(has_extension(W, /datum/extension/tool)) diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 2201e1fc430b..99f418ed6272 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -336,6 +336,6 @@ update_icon() ..() -/obj/machinery/power/smes/examine(mob/user) +/obj/machinery/power/smes/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "The service hatch is [panel_open ? "open" : "closed"].") + . += "The service hatch is [panel_open ? "open" : "closed"]." diff --git a/code/modules/power/stirling.dm b/code/modules/power/stirling.dm index 2b0c633059ff..f7a7ed33d8b1 100644 --- a/code/modules/power/stirling.dm +++ b/code/modules/power/stirling.dm @@ -133,14 +133,13 @@ last_genlev = genlev update_networks() -/obj/machinery/atmospherics/binary/stirling/examine(mob/user, distance) +/obj/machinery/atmospherics/binary/stirling/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance > 1) - return - if(active) - to_chat(user, "\The [src] is generating [round(last_gen/1000, 0.1)] kW") - if(!inserted_cylinder) - to_chat(user, "There is no piston cylinder inserted into \the [src].") + if(distance <= 1) + if(active) + . += "\The [src] is generating [round(last_gen/1000, 0.1)] kW" + if(!inserted_cylinder) + . += "There is no piston cylinder inserted into \the [src]." /obj/machinery/atmospherics/binary/stirling/attackby(var/obj/item/W, var/mob/user) if((istype(W, /obj/item/tank/stirling))) diff --git a/code/modules/power/terminal.dm b/code/modules/power/terminal.dm index 70c6cb0f425a..ac6c076a7029 100644 --- a/code/modules/power/terminal.dm +++ b/code/modules/power/terminal.dm @@ -56,11 +56,11 @@ return TRUE . = ..() -/obj/machinery/power/terminal/examine(mob/user) +/obj/machinery/power/terminal/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/obj/machinery/machine = master_machine() if(machine) - to_chat(user, "It is attached to \the [machine].") + . += "It is attached to \the [machine]." /obj/machinery/power/terminal/proc/master_machine() var/obj/machinery/machine = master && master.loc diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 613ae77ae768..8fceb8e096d6 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -127,12 +127,12 @@ if(!BB) SetName("spent [name]") -/obj/item/ammo_casing/examine(mob/user) +/obj/item/ammo_casing/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(caliber) - to_chat(user, "Its caliber is [caliber].") + . += "Its caliber is [caliber]." if (!BB) - to_chat(user, "This one is spent.") + . += "This one is spent." //An item that holds casings and can be used to put them inside guns /obj/item/ammo_magazine @@ -258,10 +258,10 @@ break icon_state = (new_state)? new_state : initial(icon_state) -/obj/item/ammo_magazine/examine(mob/user) +/obj/item/ammo_magazine/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/self_ammo_count = get_stored_ammo_count() - to_chat(user, "There [(self_ammo_count == 1)? "is" : "are"] [self_ammo_count] round\s left!") + . += "There [(self_ammo_count == 1)? "is" : "are"] [self_ammo_count] round\s left!" //magazine icon state caching var/global/list/magazine_icondata_keys = list() diff --git a/code/modules/projectiles/ammunition/magnetic.dm b/code/modules/projectiles/ammunition/magnetic.dm index 893bde26c0ca..51ea0ffed07a 100644 --- a/code/modules/projectiles/ammunition/magnetic.dm +++ b/code/modules/projectiles/ammunition/magnetic.dm @@ -11,6 +11,6 @@ origin_tech = @'{"combat":1}' var/remaining = 9 -/obj/item/magnetic_ammo/examine(mob/user) +/obj/item/magnetic_ammo/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "There [(remaining == 1)? "is" : "are"] [remaining] [projectile_name]\s left!") + . += "There [(remaining == 1)? "is" : "are"] [remaining] [projectile_name]\s left!" diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index bb477976f9d3..61c107de985b 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -630,14 +630,14 @@ accuracy = initial(accuracy) screen_shake = initial(screen_shake) -/obj/item/gun/examine(mob/user) +/obj/item/gun/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user.skill_check(SKILL_WEAPONS, SKILL_BASIC)) if(firemodes.len > 1) var/datum/firemode/current_mode = firemodes[sel_mode] - to_chat(user, "The fire selector is set to [current_mode.name].") + . += "The fire selector is set to [current_mode.name]." if(has_safety) - to_chat(user, "The safety is [safety() ? "on" : "off"].") + . += "The safety is [safety() ? "on" : "off"]." last_safety_check = world.time /obj/item/gun/proc/try_switch_firemodes(mob/user) diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index f03639047cbb..f7d2efa622be 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -85,16 +85,16 @@ var/global/list/registered_cyborg_weapons = list() return 0 return round(power_supply.charge / charge_cost) -/obj/item/gun/energy/examine(mob/user) - . = ..(user) +/obj/item/gun/energy/get_examine_strings(mob/user, distance, infix, suffix) + . = ..() var/obj/item/cell/power_supply = get_cell() if(!power_supply) - to_chat(user, "Seems like it's dead.") + . += "Seems like it's dead." return if (charge_cost == 0) - to_chat(user, "This gun seems to have an unlimited number of shots.") + . += "This gun seems to have an unlimited number of shots." else - to_chat(user, "Has [get_shots_remaining()] shot\s remaining.") + . += "Has [get_shots_remaining()] shot\s remaining." /obj/item/gun/energy/proc/get_charge_ratio() . = 0 diff --git a/code/modules/projectiles/guns/energy/capacitor.dm b/code/modules/projectiles/guns/energy/capacitor.dm index f0ac3df942ae..c9e7239f2100 100644 --- a/code/modules/projectiles/guns/energy/capacitor.dm +++ b/code/modules/projectiles/guns/energy/capacitor.dm @@ -77,10 +77,10 @@ var/global/list/laser_wavelengths power_supply_extension_type = power_supply_extension_type || /datum/extension/loaded_cell/secured return ..(loaded_cell_type, accepted_cell_type, power_supply_extension_type, charge_value) -/obj/item/gun/energy/capacitor/examine(mob/user, distance) +/obj/item/gun/energy/capacitor/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(loc == user || distance <= 1) - to_chat(user, "The wavelength selector is dialled to [selected_wavelength.name].") + . += "The wavelength selector is dialled to [selected_wavelength.name]." /obj/item/gun/energy/capacitor/Destroy() if(capacitors) diff --git a/code/modules/projectiles/guns/launcher/bows/_bow.dm b/code/modules/projectiles/guns/launcher/bows/_bow.dm index c9379e21674c..d4182d48fddb 100644 --- a/code/modules/projectiles/guns/launcher/bows/_bow.dm +++ b/code/modules/projectiles/guns/launcher/bows/_bow.dm @@ -184,7 +184,7 @@ overlay.overlays += overlay_image(overlay.icon, loaded_state, _loaded.color, RESET_COLOR) return ..() -/obj/item/gun/launcher/bow/examine(mob/user) +/obj/item/gun/launcher/bow/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/list/strings = list() if(material_alteration & MAT_FLAG_ALTERATION_DESC) @@ -195,4 +195,4 @@ strings += "has \a [_loaded] ready" if(!length(strings)) return - to_chat(user, "It [english_list(strings)].") + . += "It [english_list(strings)]." diff --git a/code/modules/projectiles/guns/launcher/bows/crossbow_powered.dm b/code/modules/projectiles/guns/launcher/bows/crossbow_powered.dm index d3b40093e7a9..c048a4141f93 100644 --- a/code/modules/projectiles/guns/launcher/bows/crossbow_powered.dm +++ b/code/modules/projectiles/guns/launcher/bows/crossbow_powered.dm @@ -151,6 +151,6 @@ ratio = max(round(ratio, 0.25) * 100, 25) add_overlay("[get_world_inventory_state()][ratio]") -/obj/item/gun/launcher/bow/crossbow/powered/rapidcrossbowdevice/examine(mob/user) +/obj/item/gun/launcher/bow/crossbow/powered/rapidcrossbowdevice/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It currently holds [stored_matter]/[max_stored_matter] matter-units.") + . += "It currently holds [stored_matter]/[max_stored_matter] matter-units." diff --git a/code/modules/projectiles/guns/launcher/foam_gun.dm b/code/modules/projectiles/guns/launcher/foam_gun.dm index 8bdb703a1a1d..d0933d5b31de 100644 --- a/code/modules/projectiles/guns/launcher/foam_gun.dm +++ b/code/modules/projectiles/guns/launcher/foam_gun.dm @@ -75,10 +75,10 @@ release_force = 3 throw_distance = 12 -/obj/item/gun/launcher/foam/revolver/tampered/examine(mob/user, distance) +/obj/item/gun/launcher/foam/revolver/tampered/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "The hammer is a lot more resistant than you'd expect.") + . += "The hammer is a lot more resistant than you'd expect." /obj/item/gun/launcher/foam/machine_gun name = "foam machine gun" @@ -120,10 +120,10 @@ /obj/item/foam_dart/tampered _base_attack_force = 1 -/obj/item/foam_dart/tampered/examine(mob/user, distance) +/obj/item/foam_dart/tampered/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, SPAN_WARNING("Closer inspection reveals some weights in the rubber dome.")) + . += SPAN_WARNING("Closer inspection reveals some weights in the rubber dome.") //boxes of the projectile /obj/item/box/foam_darts diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index caf74b0989ca..f2d830571f6d 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -46,13 +46,13 @@ to_chat(M, "You pump [src], but the magazine is empty.") update_icon() -/obj/item/gun/launcher/grenade/examine(mob/user, distance) +/obj/item/gun/launcher/grenade/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2) var/grenade_count = grenades.len + (chambered? 1 : 0) - to_chat(user, "Has [grenade_count] grenade\s remaining.") + . += "Has [grenade_count] grenade\s remaining." if(chambered) - to_chat(user, "\A [chambered] is chambered.") + . += "\A [chambered] is chambered." /obj/item/gun/launcher/grenade/proc/load(obj/item/grenade/G, mob/user) if(!can_load_grenade_type(G, user)) diff --git a/code/modules/projectiles/guns/launcher/money_cannon.dm b/code/modules/projectiles/guns/launcher/money_cannon.dm index 6b19d382aec6..64755e6f24ca 100644 --- a/code/modules/projectiles/guns/launcher/money_cannon.dm +++ b/code/modules/projectiles/guns/launcher/money_cannon.dm @@ -130,19 +130,16 @@ else return ..() -/obj/item/gun/launcher/money/examine(mob/user) +/obj/item/gun/launcher/money/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) var/decl/currency/cur = GET_DECL(global.using_map.default_currency) - to_chat(user, "It is configured to dispense [dispensing] [cur.name_singular] at a time.") - + . += "It is configured to dispense [dispensing] [cur.name_singular] at a time." if(receptacle_value >= 1) - to_chat(user, "The receptacle is loaded with [receptacle_value] [cur.name_singular].") - + . += "The receptacle is loaded with [receptacle_value] [cur.name_singular]." else - to_chat(user, "The receptacle is empty.") - + . += "The receptacle is empty." if(emagged) - to_chat(user, "Its motors are severely overloaded.") + . += SPAN_NOTICE("Its motors are severely overloaded.") /obj/item/gun/launcher/money/handle_suicide(mob/living/user) if(!ishuman(user)) diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 0d1824a83a2d..3c0b6e2885c9 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -99,15 +99,15 @@ storage.remove_from_storage((ismob(firer) ? firer : null), launched, src) return launched -/obj/item/gun/launcher/pneumatic/examine(mob/user, distance) +/obj/item/gun/launcher/pneumatic/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 2) return - to_chat(user, "The valve is dialed to [pressure_setting]%.") + . += "The valve is dialed to [pressure_setting]%." if(tank) - to_chat(user, "The tank dial reads [tank.air_contents.return_pressure()] kPa.") + . += "The tank dial reads [tank.air_contents.return_pressure()] kPa." else - to_chat(user, "Nothing is attached to the tank valve!") + . += "Nothing is attached to the tank valve!" /obj/item/gun/launcher/pneumatic/update_release_force(obj/item/projectile) if(tank) diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index d8d3d2e48bd8..57b101eface7 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -17,10 +17,10 @@ var/max_rockets = 1 var/list/rockets = new/list() -/obj/item/gun/launcher/rocket/examine(mob/user, distance) +/obj/item/gun/launcher/rocket/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2) - to_chat(user, "[rockets.len] / [max_rockets] rockets.") + . += SPAN_NOTICE("[rockets.len]/[max_rockets] rocket\s.") /obj/item/gun/launcher/rocket/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/ammo_casing/rocket)) diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 2750cecee523..02693dc1c5ff 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -164,7 +164,7 @@ . = ..() add_overlay("[icon_state]-loaded") -/obj/item/gun/launcher/syringe/disguised/examine(mob/user, distance) +/obj/item/gun/launcher/syringe/disguised/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1) - to_chat(user, "The button is a little stiff.") + . += "The button is a little stiff." diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 0a4116856851..7ebf59d143bd 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -87,16 +87,16 @@ if(loaded) to_chat(user, "It has \a [loaded] loaded.") -/obj/item/gun/magnetic/examine(mob/user) +/obj/item/gun/magnetic/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(!get_cell() || !capacitor) - to_chat(user, "The capacitor charge indicator is blinking [SPAN_RED("red")]. Maybe you should check the cell or capacitor.") + . += SPAN_NOTICE("The capacitor charge indicator is blinking [SPAN_RED("red")]. Maybe you should check the cell or capacitor.") else - to_chat(user, "The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%.") + . += SPAN_NOTICE("The installed [capacitor.name] has a charge level of [round((capacitor.charge/capacitor.max_charge)*100)]%.") if(capacitor.charge < power_cost) - to_chat(user, "The capacitor charge indicator is [SPAN_ORANGE("amber")].") + . += SPAN_NOTICE("The capacitor charge indicator is [SPAN_ORANGE("amber")].") else - to_chat(user, "The capacitor charge indicator is [SPAN_GREEN("green")].") + . += SPAN_NOTICE("The capacitor charge indicator is [SPAN_GREEN("green")].") /obj/item/gun/magnetic/attackby(var/obj/item/thing, var/mob/user) diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index e34fd58e0619..358e3a8a4ca6 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -314,14 +314,14 @@ ammo_magazine = null update_icon() //make sure to do this after unsetting ammo_magazine -/obj/item/gun/projectile/examine(mob/user) +/obj/item/gun/projectile/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(is_jammed && user.skill_check(SKILL_WEAPONS, SKILL_BASIC)) - to_chat(user, "It looks jammed.") + . += SPAN_WARNING("It looks jammed.") if(ammo_magazine) - to_chat(user, "It has \a [ammo_magazine] loaded.") + . += "It has \a [ammo_magazine] loaded." if(user.skill_check(SKILL_WEAPONS, SKILL_ADEPT)) - to_chat(user, "Has [getAmmo()] round\s remaining.") + . += "Has [getAmmo()] round\s remaining." /obj/item/gun/projectile/proc/getAmmo() var/bullets = 0 diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 802b1f93863c..86e54de2533c 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -116,12 +116,12 @@ else ..() -/obj/item/gun/projectile/automatic/assault_rifle/grenade/examine(mob/user) +/obj/item/gun/projectile/automatic/assault_rifle/grenade/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(launcher.chambered) - to_chat(user, "\The [launcher] has \a [launcher.chambered] loaded.") + . += "\The [launcher] has \a [launcher.chambered] loaded." else - to_chat(user, "\The [launcher] is empty.") + . += "\The [launcher] is empty." /obj/item/gun/projectile/automatic/assault_rifle/grenade/toggle_safety(mob/user) . = ..() diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index ee2edcdcfaed..56ba8fb6d614 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -52,20 +52,18 @@ fill_dart(dart) return dart -/obj/item/gun/projectile/dartgun/examine(mob/user) +/obj/item/gun/projectile/dartgun/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (beakers.len) - to_chat(user, "\The [src] contains:") + . += SPAN_NOTICE("\The [src] contains:") for(var/obj/item/chems/glass/beaker/B in beakers) if(B.reagents && LAZYLEN(B.reagents?.reagent_volumes)) for(var/ltype in B.reagents.liquid_volumes) var/decl/material/R = GET_DECL(ltype) - to_chat(user, "[LIQUID_VOLUME(B.reagents, ltype)] units of [R.get_reagent_name(B.reagents, MAT_PHASE_LIQUID)]") - + . += SPAN_NOTICE("[LIQUID_VOLUME(B.reagents, ltype)] units of [R.get_reagent_name(B.reagents, MAT_PHASE_LIQUID)]") for(var/stype in B.reagents.solid_volumes) var/decl/material/R = GET_DECL(stype) - to_chat(user, "[SOLID_VOLUME(B.reagents, stype)] units of [R.get_reagent_name(B.reagents, MAT_PHASE_SOLID)]") - + . += SPAN_NOTICE("[SOLID_VOLUME(B.reagents, stype)] units of [R.get_reagent_name(B.reagents, MAT_PHASE_SOLID)]") /obj/item/gun/projectile/dartgun/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/chems/glass)) diff --git a/code/modules/projectiles/guns/projectile/flaregun.dm b/code/modules/projectiles/guns/projectile/flaregun.dm index 283e7ceb8d07..6ff9c0074e04 100644 --- a/code/modules/projectiles/guns/projectile/flaregun.dm +++ b/code/modules/projectiles/guns/projectile/flaregun.dm @@ -20,10 +20,10 @@ /obj/item/gun/projectile/flare/loaded ammo_type = /obj/item/ammo_casing/shotgun/flash -/obj/item/gun/projectile/flare/examine(mob/user, distance) +/obj/item/gun/projectile/flare/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 2 && loaded.len) - to_chat(user, "\A [loaded[1]] is chambered.") + . += "\A [loaded[1]] is chambered." /obj/item/gun/projectile/flare/special_check() if(loaded.len && !istype(loaded[1], /obj/item/ammo_casing/shotgun/flash)) diff --git a/code/modules/projectiles/secure.dm b/code/modules/projectiles/secure.dm index 6902b3bddb1e..a9196955008e 100644 --- a/code/modules/projectiles/secure.dm +++ b/code/modules/projectiles/secure.dm @@ -21,10 +21,10 @@ global.registered_weapons -= src . = ..() -/obj/item/gun/examine(mob/user, distance) +/obj/item/gun/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 0 && is_secure_gun()) - to_chat(user, "The registration screen shows, \"" + (registered_owner ? "[registered_owner]" : "unregistered") + "\".") + . += "The registration screen shows, \"" + (registered_owner ? "[registered_owner]" : "unregistered") + "\"." /obj/item/gun/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/card/id) && is_secure_gun()) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index 62f5d50a7e32..60c0df079836 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -15,15 +15,15 @@ if(populate && reagents.primary_reagent) setLabel(reagents.get_primary_reagent_name()) -/obj/item/chems/chem_disp_cartridge/examine(mob/user) +/obj/item/chems/chem_disp_cartridge/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It has a capacity of [volume] units.") + . += "It has a capacity of [volume] units." if(reagents.total_volume <= 0) - to_chat(user, "It is empty.") + . += "It is empty." else - to_chat(user, "It contains [reagents.total_volume] units of reagents.") + . += "It contains [reagents.total_volume] units of reagents." if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user, "The cap is sealed.") + . += "The cap is sealed." /obj/item/chems/chem_disp_cartridge/verb/verb_set_label(L as text) set name = "Set Cartridge Label" diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 668594fcd717..696dab904873 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -42,9 +42,9 @@ for(var/type in spawn_cartridges) add_cartridge(new type(src)) -/obj/machinery/chemical_dispenser/examine(mob/user) +/obj/machinery/chemical_dispenser/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more.") + . += "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more." /obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/chems/chem_disp_cartridge/C, mob/user) . = FALSE diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index de18007e761a..7b669a97daea 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -137,15 +137,15 @@ if(user.get_target_zone() != BP_MOUTH) //in case it is ever used as a surgery tool return ..() -/obj/item/chems/examine(mob/user) +/obj/item/chems/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(!reagents) return if(hasHUD(user, HUD_SCIENCE)) var/prec = user.skill_fail_chance(SKILL_CHEMISTRY, 10) - to_chat(user, SPAN_NOTICE("\The [src] contains: [reagents.get_reagents(precision = prec)].")) + . += SPAN_NOTICE("\The [src] contains: [reagents.get_reagents(precision = prec)].") else if((loc == user) && user.skill_check(SKILL_CHEMISTRY, SKILL_EXPERT)) - to_chat(user, SPAN_NOTICE("Using your chemistry knowledge, you identify the following reagents in \the [src]: [reagents.get_reagents(!user.skill_check(SKILL_CHEMISTRY, SKILL_PROF), 5)].")) + . += SPAN_NOTICE("Using your chemistry knowledge, you identify the following reagents in \the [src]: [reagents.get_reagents(!user.skill_check(SKILL_CHEMISTRY, SKILL_PROF), 5)].") /obj/item/chems/shatter(consumed) //Skip splashing if we are in nullspace, since splash isn't null guarded diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index f381c8a44bba..eca2d528301a 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -43,17 +43,16 @@ ) return _can_be_placed_into -/obj/item/chems/glass/examine(mob/user, distance) +/obj/item/chems/glass/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 2) return - if(reagents?.total_volume) - to_chat(user, SPAN_NOTICE("It contains [reagents.total_volume] units of reagents.")) + . += SPAN_NOTICE("It contains [reagents.total_volume] units of reagents.") else - to_chat(user, SPAN_NOTICE("It is empty.")) + . += SPAN_NOTICE("It is empty.") if(!ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user,SPAN_NOTICE("The airtight lid seals it completely.")) + . += SPAN_NOTICE("The airtight lid seals it completely.") /obj/item/chems/glass/proc/can_lid() return TRUE diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index 3a769fdec137..d666aeb0f75f 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -11,9 +11,9 @@ presentation_flags = PRESENTATION_FLAG_NAME var/lid_color = COLOR_BEASTY_BROWN -/obj/item/chems/glass/beaker/examine(mob/user, distance) +/obj/item/chems/glass/beaker/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, " It can hold up to [volume] units.") + . += "It can hold up to [volume] units." /obj/item/chems/glass/beaker/on_picked_up(mob/user) . = ..() diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 862b3d655059..bf1306f42ce1 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -107,13 +107,12 @@ to_chat(user, "Synthesizer is now producing '[initial(R.name)]'.") return TOPIC_REFRESH -/obj/item/chems/borghypo/examine(mob/user, distance) +/obj/item/chems/borghypo/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 2) return - var/decl/material/R = reagent_ids[mode] - to_chat(user, "It is currently producing [initial(R.name)] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left.") + . += SPAN_NOTICE("It is currently producing [initial(R.name)] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left.") /obj/item/chems/borghypo/service name = "cyborg drink synthesizer" diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 386ad49b09a5..502c21330a30 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -94,7 +94,7 @@ var/global/const/DRINK_ICON_NOISY = "noise" return FALSE return TRUE -/obj/item/chems/drinks/glass2/examine(mob/user, distance) +/obj/item/chems/drinks/glass2/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(!istype(user)) return @@ -106,14 +106,13 @@ var/global/const/DRINK_ICON_NOISY = "noise" else if(istype(extra, /obj/item/food/processed_grown/slice)) LAZYADD(extra_text, "There is \a [extra] on the rim.") else - to_chat(user, "There is \a [extra] somewhere on the glass. Somehow.") + . += "There is \a [extra] somewhere on the glass. Somehow." if(length(extra_text)) - to_chat(user, SPAN_NOTICE(jointext(extra_text," "))) + . += SPAN_NOTICE(jointext(extra_text," ")) if(has_ice()) - to_chat(user, "There is some ice floating in the drink.") + . += "There is some ice floating in the drink." if(has_fizz()) - to_chat(user, "It is fizzing slightly.") - + . += "It is fizzing slightly." /obj/item/chems/drinks/glass2/proc/get_filling_overlay(amount, overlay) var/image/I = new() diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index d80b593cf60f..73f240c3b34f 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -63,20 +63,20 @@ /obj/item/chems/drinks/standard_pour_into(var/mob/user, var/atom/target) return do_open_check(user) && ..() -/obj/item/chems/drinks/examine(mob/user, distance) +/obj/item/chems/drinks/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance > 1) return if(!reagents || reagents.total_volume == 0) - to_chat(user, SPAN_NOTICE("\The [src] is empty!")) + . += SPAN_NOTICE("\The [src] is empty!") else if (reagents.total_volume <= volume * 0.25) - to_chat(user, SPAN_NOTICE("\The [src] is almost empty!")) + . += SPAN_NOTICE("\The [src] is almost empty!") else if (reagents.total_volume <= volume * 0.66) - to_chat(user, SPAN_NOTICE("\The [src] is half full!")) + . += SPAN_NOTICE("\The [src] is half full!") else if (reagents.total_volume <= volume * 0.90) - to_chat(user, SPAN_NOTICE("\The [src] is almost full!")) + . += SPAN_NOTICE("\The [src] is almost full!") else - to_chat(user, SPAN_NOTICE("\The [src] is full!")) + . += SPAN_NOTICE("\The [src] is full!") /obj/item/chems/drinks/proc/get_filling_state() var/percent = round((reagents.total_volume / volume) * 100) diff --git a/code/modules/reagents/reagent_containers/drinks/juicebox.dm b/code/modules/reagents/reagent_containers/drinks/juicebox.dm index 92cbf0ea8855..fc558edf2991 100644 --- a/code/modules/reagents/reagent_containers/drinks/juicebox.dm +++ b/code/modules/reagents/reagent_containers/drinks/juicebox.dm @@ -52,12 +52,12 @@ appearance = new_appearance -/obj/item/chems/drinks/juicebox/examine(mob/user, distance) +/obj/item/chems/drinks/juicebox/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(atom_flags & ATOM_FLAG_OPEN_CONTAINER) - to_chat(user, SPAN_NOTICE("It has a straw stuck through the foil seal on top.")) + . += SPAN_NOTICE("It has a straw stuck through the foil seal on top.") else - to_chat(user, SPAN_NOTICE("It has a straw stuck to the side and the foil seal is intact.")) + . += SPAN_NOTICE("It has a straw stuck to the side and the foil seal is intact.") /obj/item/chems/drinks/juicebox/open(mob/user) playsound(loc,'sound/effects/bonebreak1.ogg', rand(10,50), 1) diff --git a/code/modules/reagents/reagent_containers/food.dm b/code/modules/reagents/reagent_containers/food.dm index 55309ff3d2cc..0d8435d02954 100644 --- a/code/modules/reagents/reagent_containers/food.dm +++ b/code/modules/reagents/reagent_containers/food.dm @@ -105,26 +105,22 @@ /obj/item/food/dragged_onto(var/mob/user) return attack_self(user) -/obj/item/food/examine(mob/user, distance) +/obj/item/food/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(distance > 1) return - if(backyard_grilling_rawness > 0 && backyard_grilling_rawness != initial(backyard_grilling_rawness)) - to_chat(user, "\The [src] is [get_backyard_grilling_text()].") - + . += "\The [src] is [get_backyard_grilling_text()]." if(plate) - to_chat(user, SPAN_NOTICE("\The [src] has been arranged on \a [plate].")) - + . += SPAN_NOTICE("\The [src] has been arranged on \a [plate].") if (bitecount==0) return else if (bitecount==1) - to_chat(user, SPAN_NOTICE("\The [src] was bitten by someone!")) + . += SPAN_NOTICE("\The [src] was bitten by someone!") else if (bitecount<=3) - to_chat(user, SPAN_NOTICE("\The [src] was bitten [bitecount] time\s!")) + . += SPAN_NOTICE("\The [src] was bitten [bitecount] time\s!") else - to_chat(user, SPAN_NOTICE("\The [src] was bitten multiple times!")) + . += SPAN_NOTICE("\The [src] was bitten multiple times!") /obj/item/food/proc/is_sliceable() return (slice_num && slice_path && slice_num > 0) diff --git a/code/modules/reagents/reagent_containers/food/canned/_canned.dm b/code/modules/reagents/reagent_containers/food/canned/_canned.dm index 63fa762a18d6..0959b584dbcd 100644 --- a/code/modules/reagents/reagent_containers/food/canned/_canned.dm +++ b/code/modules/reagents/reagent_containers/food/canned/_canned.dm @@ -19,10 +19,10 @@ if(!sealed) unseal() -/obj/item/food/can/examine(mob/user) +/obj/item/food/can/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It is [!ATOM_IS_OPEN_CONTAINER(src) ? "" : "un"]sealed.") - to_chat(user, "It looks [open_complexity ? "hard" : "easy "] to open.") + . += "It is [!ATOM_IS_OPEN_CONTAINER(src) ? "" : "un"]sealed." + . += "It looks [open_complexity ? "hard" : "easy "] to open." /obj/item/food/can/proc/unseal(mob/user) playsound(src, 'sound/effects/canopen.ogg', rand(10, 50), 1) diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index ca69321a7499..a3451736dbde 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -83,10 +83,10 @@ qdel(O) return ..() -/obj/item/food/csandwich/examine(mob/user) +/obj/item/food/csandwich/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) var/obj/item/O = pick(contents) - to_chat(user, "You think you can see [O.name] in there.") + . += SPAN_WARNING("You think you can see [O.name] in there.") /obj/item/food/csandwich/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) var/obj/item/shard = locate() in get_contained_external_atoms() // grab early in case of qdele diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index 70dc6661c2a2..98b6ee139ba9 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -203,12 +203,12 @@ if(reagents?.total_volume <= 0) icon_state = "[icon_state]_used" -/obj/item/chems/hypospray/autoinjector/examine(mob/user) +/obj/item/chems/hypospray/autoinjector/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) if(reagents?.total_volume) - to_chat(user, SPAN_NOTICE("It is currently loaded.")) + . += SPAN_NOTICE("It is currently loaded.") else - to_chat(user, SPAN_NOTICE("It is spent.")) + . += SPAN_NOTICE("It is spent.") //////////////////////////////////////////////////////////////////////////////// // Autoinjector - Stabilizer diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 19eaaa9cd1d0..69bd0710eaec 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -109,10 +109,10 @@ return TRUE . = ..() -/obj/item/chems/inhaler/examine(mob/user, distance) +/obj/item/chems/inhaler/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) if(distance <= 1) if(reagents.total_volume > 0) - to_chat(user, SPAN_NOTICE("It is currently loaded.")) + . += SPAN_NOTICE("It is currently loaded.") else - to_chat(user, SPAN_WARNING("It is spent.")) + . += SPAN_WARNING("It is spent.") diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index c3b4cbd9ff8e..400f96445fd3 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -99,12 +99,12 @@ safety = !safety to_chat(user, SPAN_NOTICE("You switch the safety [safety ? "on" : "off"].")) -/obj/item/chems/spray/examine(mob/user, distance) +/obj/item/chems/spray/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(loc == user) - to_chat(user, "[round(reagents.total_volume)] unit\s left.") + . += "[round(reagents.total_volume)] unit\s left." if(has_safety() && distance <= 1) - to_chat(user, "The safety is [safety ? "on" : "off"].") + . += "The safety is [safety ? "on" : "off"]." /obj/item/chems/spray/get_alt_interactions(mob/user) . = ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 778ed37be452..41a24df50d42 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -59,32 +59,28 @@ if(. && unwrenched) leak() -/obj/structure/reagent_dispensers/examine(mob/user, distance) +/obj/structure/reagent_dispensers/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(unwrenched) - to_chat(user, SPAN_WARNING("Someone has wrenched open its tap - it's spilling everywhere!")) - + . += SPAN_WARNING("Someone has wrenched open its tap - it's spilling everywhere!") if(distance <= 2) - if(wrenchable) if(ATOM_IS_OPEN_CONTAINER(src)) - to_chat(user, "Its refilling cap is open.") + . += "Its refilling cap is open." else - to_chat(user, "Its refilling cap is closed.") - - to_chat(user, SPAN_NOTICE("It contains:")) + . += "Its refilling cap is closed." + . += SPAN_NOTICE("It contains:") if(LAZYLEN(reagents?.reagent_volumes)) for(var/rtype in reagents.liquid_volumes) var/decl/material/R = GET_DECL(rtype) - to_chat(user, SPAN_NOTICE("[LIQUID_VOLUME(reagents, rtype)] unit\s of [R.get_reagent_name(reagents, MAT_PHASE_LIQUID)].")) + . += SPAN_NOTICE("[LIQUID_VOLUME(reagents, rtype)] unit\s of [R.get_reagent_name(reagents, MAT_PHASE_LIQUID)].") for(var/rtype in reagents.solid_volumes) var/decl/material/R = GET_DECL(rtype) - to_chat(user, SPAN_NOTICE("[SOLID_VOLUME(reagents, rtype)] unit\s of [R.get_reagent_name(reagents, MAT_PHASE_SOLID)].")) + . += SPAN_NOTICE("[SOLID_VOLUME(reagents, rtype)] unit\s of [R.get_reagent_name(reagents, MAT_PHASE_SOLID)].") else - to_chat(user, SPAN_NOTICE("Nothing.")) - + . += SPAN_NOTICE("Nothing.") if(reagents?.maximum_volume) - to_chat(user, "It may contain up to [reagents.maximum_volume] unit\s of fluid.") + . += "It may contain up to [reagents.maximum_volume] unit\s of fluid." /obj/structure/reagent_dispensers/attackby(obj/item/W, mob/user) @@ -170,10 +166,10 @@ /obj/structure/reagent_dispensers/fueltank/populate_reagents() add_to_reagents(/decl/material/liquid/fuel, reagents.maximum_volume) -/obj/structure/reagent_dispensers/fueltank/examine(mob/user, distance) +/obj/structure/reagent_dispensers/fueltank/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(rig && distance < 2) - to_chat(user, SPAN_WARNING("There is some kind of device rigged to the tank.")) + . += SPAN_WARNING("There is some kind of device rigged to the tank.") /obj/structure/reagent_dispensers/fueltank/attack_hand(var/mob/user) if (!rig || !user.check_dexterity(DEXTERITY_HOLD_ITEM, TRUE)) diff --git a/code/modules/reagents/storage/pill_foil.dm b/code/modules/reagents/storage/pill_foil.dm index 40f7efcbab38..0d7f1d36fa7f 100644 --- a/code/modules/reagents/storage/pill_foil.dm +++ b/code/modules/reagents/storage/pill_foil.dm @@ -49,8 +49,8 @@ add_overlay(I) offset -= 3 -/obj/item/pill_bottle/foil_pack/examine(mob/user) +/obj/item/pill_bottle/foil_pack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, SPAN_NOTICE("It has the following pills in it:")) + . += SPAN_NOTICE("It has the following pills in it:") for(var/obj/item/chems/pill/C in pill_positions) - to_chat(user, SPAN_NOTICE("[html_icon(C)] [C.name]")) + . += SPAN_NOTICE("[html_icon(C)] [C.name]") diff --git a/code/modules/recycling/wrapped_package.dm b/code/modules/recycling/wrapped_package.dm index da2a33bfd701..a18575b5f536 100644 --- a/code/modules/recycling/wrapped_package.dm +++ b/code/modules/recycling/wrapped_package.dm @@ -72,14 +72,14 @@ var/image/I = image('icons/obj/items/storage/deliverypackage.dmi', "delivery_label", pixel_x = off_x, pixel_y = off_y) add_overlay(I) -/obj/item/parcel/examine(mob/user, distance) +/obj/item/parcel/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance < 3) var/datum/extension/sorting_tag/S = get_extension(src, /datum/extension/sorting_tag) if(S) - to_chat(user, S.tag_description()) + . += S.tag_description() if(length(attached_note)) - to_chat(user, "It has a note attached, which reads:'[attached_note]'.") + . += "It has a note attached, which reads:'[attached_note]'." /obj/item/parcel/get_mechanics_info() . = ..() diff --git a/code/modules/scanners/mining.dm b/code/modules/scanners/mining.dm index 1058c4817160..2b9095692b27 100644 --- a/code/modules/scanners/mining.dm +++ b/code/modules/scanners/mining.dm @@ -19,9 +19,9 @@ scan_sound = 'sound/effects/ping.ogg' -/obj/item/scanner/mining/examine(mob/user) +/obj/item/scanner/mining/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user,"A tiny indicator on \the [src] shows it holds [survey_data] good explorer point\s.") + . += "A tiny indicator on \the [src] shows it holds [survey_data] good explorer point\s." /obj/item/scanner/mining/is_valid_scan_target(turf/T) return istype(T) diff --git a/code/modules/sealant_gun/sealant_gun.dm b/code/modules/sealant_gun/sealant_gun.dm index 6f0d91966447..37d42c36a6e8 100644 --- a/code/modules/sealant_gun/sealant_gun.dm +++ b/code/modules/sealant_gun/sealant_gun.dm @@ -54,13 +54,13 @@ unload_tank(user) return TRUE -/obj/item/gun/launcher/sealant/examine(mob/user, distance) +/obj/item/gun/launcher/sealant/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(loc == user) if(loaded_tank) - to_chat(user, SPAN_NOTICE("The loaded tank has about [loaded_tank.foam_charges] liter\s of sealant left.")) + . += SPAN_NOTICE("The loaded tank has about [loaded_tank.foam_charges] liter\s of sealant left.") else - to_chat(user, SPAN_WARNING("\The [src] has no sealant loaded.")) + . += SPAN_WARNING("\The [src] has no sealant loaded.") /obj/item/gun/launcher/sealant/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/sealant_tank) && user.try_unequip(W, src)) diff --git a/code/modules/sealant_gun/sealant_tank.dm b/code/modules/sealant_gun/sealant_tank.dm index d9c3a1f6fef7..890b4746992b 100644 --- a/code/modules/sealant_gun/sealant_tank.dm +++ b/code/modules/sealant_gun/sealant_tank.dm @@ -11,10 +11,10 @@ . = ..() add_overlay("fill_[floor((foam_charges/max_foam_charges) * 5)]") -/obj/item/sealant_tank/examine(mob/user, distance) +/obj/item/sealant_tank/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(loc == user) - to_chat(user, SPAN_NOTICE("\The [src] has about [foam_charges] liter\s of sealant left.")) + . += SPAN_NOTICE("\The [src] has about [foam_charges] liter\s of sealant left.") /obj/item/sealant_tank/Initialize(ml, material_key) . = ..() diff --git a/code/modules/shield_generators/floor_diffuser.dm b/code/modules/shield_generators/floor_diffuser.dm index b9d29391db32..5cef0619144f 100644 --- a/code/modules/shield_generators/floor_diffuser.dm +++ b/code/modules/shield_generators/floor_diffuser.dm @@ -59,8 +59,8 @@ alarm = round(max(alarm, duration)) update_icon() -/obj/machinery/shield_diffuser/examine(mob/user) +/obj/machinery/shield_diffuser/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It is [enabled ? "enabled" : "disabled"].") + . += "It is [enabled ? "enabled" : "disabled"]." if(alarm) - to_chat(user, "A red LED labeled \"Proximity Alarm\" is blinking on the control panel.") + . += "A red LED labeled \"Proximity Alarm\" is blinking on the control panel." diff --git a/code/modules/shield_generators/handheld_diffuser.dm b/code/modules/shield_generators/handheld_diffuser.dm index 4a546c0241f5..629ddc4f99c6 100644 --- a/code/modules/shield_generators/handheld_diffuser.dm +++ b/code/modules/shield_generators/handheld_diffuser.dm @@ -50,6 +50,6 @@ STOP_PROCESSING(SSobj, src) to_chat(user, "You turn \the [src] [enabled ? "on" : "off"].") -/obj/item/shield_diffuser/examine(mob/user) +/obj/item/shield_diffuser/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It is [enabled ? "enabled" : "disabled"].") + . += "It is [enabled ? "enabled" : "disabled"]." diff --git a/code/modules/tools/archetypes/tool_item.dm b/code/modules/tools/archetypes/tool_item.dm index b98add0989b9..31496c04010a 100644 --- a/code/modules/tools/archetypes/tool_item.dm +++ b/code/modules/tools/archetypes/tool_item.dm @@ -66,7 +66,7 @@ to_chat(user, SPAN_WARNING(failure_message)) return FALSE -/obj/item/examine(mob/user, distance, infix, suffix) +/obj/item/get_examine_strings(mob/user, distance, infix, suffix) . = ..() @@ -89,4 +89,4 @@ LAZYADD(tool_strings, tool_string) if(length(tool_strings)) - to_chat(user, "[gender == PLURAL ? "They look" : "It looks"] like [english_list(tool_strings)].") + . += "[gender == PLURAL ? "They look" : "It looks"] like [english_list(tool_strings)]." diff --git a/code/modules/tools/subtypes/xenoarchaeology_picks.dm b/code/modules/tools/subtypes/xenoarchaeology_picks.dm index 2a335b9fa4ca..0dc4160e3a39 100644 --- a/code/modules/tools/subtypes/xenoarchaeology_picks.dm +++ b/code/modules/tools/subtypes/xenoarchaeology_picks.dm @@ -30,10 +30,10 @@ var/static/list/tool_qualities = list(TOOL_PICK = TOOL_QUALITY_DEFAULT) return tool_qualities -/obj/item/tool/xeno/examine(mob/user) +/obj/item/tool/xeno/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(IS_PICK(src)) - to_chat(user, "This tool has a [get_tool_property(TOOL_PICK, TOOL_PROP_EXCAVATION_DEPTH) || 0] centimetre excavation depth.") + . += "This tool has a [get_tool_property(TOOL_PICK, TOOL_PROP_EXCAVATION_DEPTH) || 0] centimetre excavation depth." /obj/item/tool/xeno/brush name = "wire brush" diff --git a/code/modules/tools/tool.dm b/code/modules/tools/tool.dm index 953a751ebbb2..af7ac841f205 100644 --- a/code/modules/tools/tool.dm +++ b/code/modules/tools/tool.dm @@ -17,7 +17,7 @@ /// Material used for binding. var/decl/material/binding_material = /decl/material/solid/organic/meat/gut -/obj/item/tool/examine(mob/user) +/obj/item/tool/get_examine_strings(mob/user, distance, infix, suffix) . = ..() var/list/descriptor_strings = list() if(material == handle_material) @@ -27,7 +27,7 @@ descriptor_strings += "the handle is made of [handle_material.use_name]" if(binding_material) descriptor_strings += "the binding is made of [binding_material.use_name]" - to_chat(user, "[capitalize(english_list(descriptor_strings))].") + . += "[capitalize(english_list(descriptor_strings))]." /obj/item/tool/Initialize(ml, material_key, _handle_material, _binding_material, override_tool_qualities, override_tool_properties) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 4a61ea40daac..740bef47107c 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -187,17 +187,11 @@ else return ..() -/obj/vehicle/train/cargo/engine/examine(mob/user, distance) +/obj/vehicle/train/cargo/engine/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - - if(distance > 1) - return - - if(!ishuman(user)) - return - - to_chat(user, "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition.") - to_chat(user, "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%") + if(distance <= 1) + . += "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." + . += "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%" /obj/vehicle/train/cargo/engine/verb/start_engine() set name = "Start engine" diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 3d82b2252058..7c62d658b2e8 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -29,12 +29,12 @@ if(T.lead || T.is_train_head()) latch(T) -/obj/vehicle/train/examine(mob/user) +/obj/vehicle/train/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (lead) - to_chat(user, SPAN_NOTICE("It is hitched to \the [lead].")) + . += SPAN_NOTICE("It is hitched to \the [lead].") if (tow) - to_chat(user, SPAN_NOTICE("It is towing \the [tow].")) + . += SPAN_NOTICE("It is towing \the [tow].") /obj/vehicle/train/Move() var/old_loc = get_turf(src) diff --git a/code/modules/weather/_weather.dm b/code/modules/weather/_weather.dm index 9c1a6493a533..00e996e256d8 100644 --- a/code/modules/weather/_weather.dm +++ b/code/modules/weather/_weather.dm @@ -80,8 +80,8 @@ QDEL_NULL(lightning_overlay) . = ..() -// Called by /turf/examine() to show current weather status. -/obj/abstract/weather_system/examine(mob/user, distance) +// Called by /turf/examined_by() to show current weather status. +/obj/abstract/weather_system/examined_by(mob/user, distance) SHOULD_CALL_PARENT(FALSE) var/decl/state/weather/weather_state = weather_system.current_state if(istype(weather_state)) diff --git a/code/modules/xenoarcheaology/finds/find_types/fossils.dm b/code/modules/xenoarcheaology/finds/find_types/fossils.dm index 00c2680ab6af..f06c6c37784b 100644 --- a/code/modules/xenoarcheaology/finds/find_types/fossils.dm +++ b/code/modules/xenoarcheaology/finds/find_types/fossils.dm @@ -75,12 +75,12 @@ . = ..() required_bones = rand(6)+3 -/obj/structure/skeleton/examine(mob/user, distance) +/obj/structure/skeleton/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(bone_count < required_bones) - to_chat(user, "It's incomplete, looks like it could use [required_bones - bone_count] more bones.") - if(.) - to_chat(user, "The plaque reads \'[plaque_contents]\'.") + . += "It's incomplete, looks like it could use [required_bones - bone_count] more bones." + if(distance <= 1) + . += "The plaque reads \'[plaque_contents]\'." /obj/structure/skeleton/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/fossil/animal)) diff --git a/code/modules/xenoarcheaology/machinery/suspension_generator.dm b/code/modules/xenoarcheaology/machinery/suspension_generator.dm index 9bacddc8f9c1..3a2cc181ec82 100644 --- a/code/modules/xenoarcheaology/machinery/suspension_generator.dm +++ b/code/modules/xenoarcheaology/machinery/suspension_generator.dm @@ -105,11 +105,11 @@ density = TRUE var/victim_number //number of mobs it affected, needed for generator powerdraw calc -/obj/effect/suspension_field/examine(mob/user) +/obj/effect/suspension_field/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(.) - to_chat(user, SPAN_NOTICE("You can see something floating inside it:")) - to_chat(user, SPAN_NOTICE(english_list(contents))) + if(distance <= 1) + . += SPAN_NOTICE("You can see something floating inside it:") + . += SPAN_NOTICE(english_list(contents)) /obj/effect/suspension_field/Initialize() . = ..() diff --git a/code/modules/xenoarcheaology/tools/core_sampler.dm b/code/modules/xenoarcheaology/tools/core_sampler.dm index 21d5bd0cb6dd..8aba4e264c0c 100644 --- a/code/modules/xenoarcheaology/tools/core_sampler.dm +++ b/code/modules/xenoarcheaology/tools/core_sampler.dm @@ -9,10 +9,10 @@ matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) var/obj/item/sample -/obj/item/core_sampler/examine(mob/user, distance) +/obj/item/core_sampler/get_examine_strings(mob/user, distance, infix, suffix) . = ..(user) if(distance <= 2) - to_chat(user, SPAN_NOTICE("This one is [sample ? "full" : "empty"]")) + . += SPAN_NOTICE("This one is [sample ? "full" : "empty"]") /obj/item/core_sampler/proc/sample_item(var/item_to_sample, var/mob/user) var/datum/extension/geological_data/GD = get_extension(item_to_sample, /datum/extension/geological_data) diff --git a/maps/away/mining/mining.dm b/maps/away/mining/mining.dm index 4f6cec271604..dcd99e53aeeb 100644 --- a/maps/away/mining/mining.dm +++ b/maps/away/mining/mining.dm @@ -215,10 +215,9 @@ . = ..() number = rand(10,99) -/obj/structure/totem/examine(mob/user) +/obj/structure/totem/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It's been engraved with the symbols 'RWH QaG [number]'.") //i am not a linguist - + . += "It's been engraved with the symbols 'RWH QaG [number]'." /obj/item/stool/stone/Initialize(mapload) . = ..(mapload, /decl/material/solid/stone/sandstone) diff --git a/mods/content/bigpharma/chems.dm b/mods/content/bigpharma/chems.dm index 5aa5a0963695..a1cf00ae7118 100644 --- a/mods/content/bigpharma/chems.dm +++ b/mods/content/bigpharma/chems.dm @@ -12,7 +12,7 @@ . = ..() handle_med_obfuscation(src) -/obj/item/chems/examine(mob/user, distance, infix, suffix) +/obj/item/chems/examined_by(mob/user, distance, infix, suffix) . = ..() var/datum/extension/obfuscated_medication/meds = get_extension(src, /datum/extension/obfuscated_medication) if(meds && user && (user.skill_check(SKILL_CHEMISTRY, meds.skill_threshold) || user.skill_check(SKILL_MEDICAL, meds.skill_threshold))) diff --git a/mods/content/bigpharma/pill_bottle.dm b/mods/content/bigpharma/pill_bottle.dm index 24d2a2db6153..b0a70757af6d 100644 --- a/mods/content/bigpharma/pill_bottle.dm +++ b/mods/content/bigpharma/pill_bottle.dm @@ -12,7 +12,7 @@ . = ..() handle_med_obfuscation(src) -/obj/item/pill_bottle/examine(mob/user) +/obj/item/pill_bottle/examined_by(mob/user, distance, infix, suffix) . = ..() var/datum/extension/obfuscated_medication/meds = get_extension(src, /datum/extension/obfuscated_medication) if(meds && user && (user.skill_check(SKILL_CHEMISTRY, meds.skill_threshold) || user.skill_check(SKILL_MEDICAL, meds.skill_threshold))) diff --git a/mods/content/blacksmithy/billet.dm b/mods/content/blacksmithy/billet.dm index ac67f93bc68f..da40b1fcd00d 100644 --- a/mods/content/blacksmithy/billet.dm +++ b/mods/content/blacksmithy/billet.dm @@ -148,11 +148,11 @@ anvil.take_damage(rand(10, 20), BRUTE, silent = TRUE) // We are already going CLANG CLANG CLANG, don't need a THUNK return TRUE -/obj/item/billet/examine(mob/user, distance, infix, suffix) +/obj/item/billet/get_examine_hints(mob/user, distance, infix, suffix) . = ..() for(var/decl/forging_step/next_step in current_forging_step?.steps) if(user.skill_check(next_step.work_skill, next_step.skill_level)) - to_chat(user, SPAN_INFO("It can be [next_step.work_verb] into \a [next_step.get_product_name(material)] on an anvil.")) + LAZYADD(., SPAN_INFO("It can be [next_step.work_verb] into \a [next_step.get_product_name(material)] on an anvil.")) /obj/item/billet/proc/standard_forging_checks(mob/user, obj/item/used_item, decl/forging_step/last_step, decl/forging_step/next_step, obj/structure/anvil/anvil) // We cancelled or changed state, abort. diff --git a/mods/content/psionics/items/id_card.dm b/mods/content/psionics/items/id_card.dm index 27d4d5be4057..521e1d2be180 100644 --- a/mods/content/psionics/items/id_card.dm +++ b/mods/content/psionics/items/id_card.dm @@ -15,14 +15,14 @@ icon = 'icons/obj/id/id_warrantcard.dmi' detail_color = null -/obj/item/card/id/foundation/examine(mob/user, distance) +/obj/item/card/id/foundation/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(distance <= 1 && isliving(user)) var/datum/ability_handler/psionics/psi = user.get_ability_handler(/datum/ability_handler/psionics) if(psi) - to_chat(user, SPAN_WARNING("There is a psionic compulsion surrounding \the [src], forcing anyone who reads it to perceive it as a legitimate document of authority. The actual text just reads 'I can do what I want.'")) + . += SPAN_WARNING("There is a psionic compulsion surrounding \the [src], forcing anyone who reads it to perceive it as a legitimate document of authority. The actual text just reads 'I can do what I want.'") else - to_chat(user, SPAN_NOTICE("This is the real deal, stamped by [global.using_map.boss_name]. It gives the holder the full authority to pursue their goals. You believe it implicitly.")) + . += SPAN_NOTICE("This is the real deal, stamped by [global.using_map.boss_name]. It gives the holder the full authority to pursue their goals. You believe it implicitly.") /obj/item/card/id/foundation/attack_self(var/mob/user) . = ..() diff --git a/mods/content/supermatter/endgame_cascade/cascade_blob.dm b/mods/content/supermatter/endgame_cascade/cascade_blob.dm index 6cd76d142330..92b7c96b491e 100644 --- a/mods/content/supermatter/endgame_cascade/cascade_blob.dm +++ b/mods/content/supermatter/endgame_cascade/cascade_blob.dm @@ -52,14 +52,14 @@ /turf/unsimulated/wall/cascade/attack_robot(mob/user) . = attack_hand_with_interaction_checks(user) if(!.) - user.examinate(src) + user.examine_verb(src) // /vg/: Don't let ghosts fuck with this. /turf/unsimulated/wall/cascade/attack_ghost(mob/user) - user.examinate(src) + user.examine_verb(src) /turf/unsimulated/wall/cascade/attack_ai(mob/living/silicon/ai/user) - user.examinate(src) + user.examine_verb(src) /turf/unsimulated/wall/cascade/attack_hand(mob/user) if(try_supermatter_consume(null, user, src, TRUE)) diff --git a/mods/content/supermatter/machinery/supermatter.dm b/mods/content/supermatter/machinery/supermatter.dm index f05b56abdaac..2a876bd55ea4 100644 --- a/mods/content/supermatter/machinery/supermatter.dm +++ b/mods/content/supermatter/machinery/supermatter.dm @@ -354,7 +354,7 @@ var/global/list/supermatter_delam_accent_sounds = list( explosion(TS, explosion_power/2, explosion_power, explosion_power * 2, explosion_power * 4, 1) qdel(src) -/obj/machinery/power/supermatter/examine(mob/user) +/obj/machinery/power/supermatter/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(user.skill_check(SKILL_ENGINES, SKILL_EXPERT)) var/integrity_message @@ -365,12 +365,12 @@ var/global/list/supermatter_delam_accent_sounds = list( integrity_message = "It appears to be losing cohesion!" else integrity_message = "At a glance, it seems to be in sound shape." - to_chat(user, integrity_message) + . += integrity_message if(user.skill_check(SKILL_ENGINES, SKILL_PROF)) var/display_power = power display_power *= (0.85 + 0.3 * rand()) display_power = round(display_power, 20) - to_chat(user, "Eyeballing it, you place the relative EER at around [display_power] MeV/cm3.") + . += "Eyeballing it, you place the relative EER at around [display_power] MeV/cm3." //Changes color and luminosity of the light to these values if they were not already set /obj/machinery/power/supermatter/proc/shift_light(var/lum, var/clr) diff --git a/mods/content/tabloids/tabloid.dm b/mods/content/tabloids/tabloid.dm index 6fc781a7ee64..579820aabfab 100644 --- a/mods/content/tabloids/tabloid.dm +++ b/mods/content/tabloids/tabloid.dm @@ -18,10 +18,10 @@ if(length(tabloid_headlines) && tabloid_headlines[headline]) article_body = tabloid_headlines[headline] -/obj/item/tabloid/examine(mob/user, distance, infix, suffix) +/obj/item/tabloid/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(headline) - to_chat(user, "The headline screams, \"[headline]\"") + . += "The headline screams, \"[headline]\"" /obj/item/tabloid/attack_self(mob/user) . = ..() diff --git a/mods/content/xenobiology/slime/examine.dm b/mods/content/xenobiology/slime/examine.dm index 34d23565b8ea..318435bc62b3 100644 --- a/mods/content/xenobiology/slime/examine.dm +++ b/mods/content/xenobiology/slime/examine.dm @@ -1,16 +1,18 @@ -/mob/living/slime/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/slime/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..() - var/list/msg = list() if(stat == DEAD) - msg += "It is limp and unresponsive." + . += "It is limp and unresponsive." else if(src.get_damage(BRUTE) >= 40) - msg += SPAN_DANGER("It has severe punctures and tears in its flesh!") + . += SPAN_DANGER("It has severe punctures and tears in its flesh!") else if(src.get_damage(BRUTE)) - msg += SPAN_WARNING("It has some punctures in its flesh!") + . += SPAN_WARNING("It has some punctures in its flesh!") switch(powerlevel) - if(2 to 3) msg += SPAN_WARNING("It is flickering gently with a little electrical activity.") - if(4 to 5) msg += SPAN_WARNING("It is glowing gently with moderate levels of electrical activity.") - if(6 to 9) msg += SPAN_DANGER("It is glowing brightly with high levels of electrical activity.") - if(10) msg += SPAN_DANGER("It is radiating with massive levels of electrical activity!") - to_chat(user, jointext(msg, "
")) + if(2 to 3) + . += SPAN_WARNING("It is flickering gently with a little electrical activity.") + if(4 to 5) + . += SPAN_WARNING("It is glowing gently with moderate levels of electrical activity.") + if(6 to 9) + . += SPAN_DANGER("It is glowing brightly with high levels of electrical activity.") + if(10) + . += SPAN_DANGER("It is radiating with massive levels of electrical activity!") diff --git a/mods/gamemodes/cult/mobs/constructs/constructs.dm b/mods/gamemodes/cult/mobs/constructs/constructs.dm index ce9913eb9f33..228b834cc2d9 100644 --- a/mods/gamemodes/cult/mobs/constructs/constructs.dm +++ b/mods/gamemodes/cult/mobs/constructs/constructs.dm @@ -79,14 +79,14 @@ return return ..() -/mob/living/simple_animal/construct/show_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) +/mob/living/simple_animal/construct/get_other_examine_strings(mob/user, distance, infix, suffix, hideflags, decl/pronouns/pronouns) . = ..(user) var/current_max_health = get_max_health() if(current_health < current_max_health) if(current_health >= current_max_health/2) - to_chat(user, SPAN_WARNING("It looks slightly dented.")) + . += SPAN_WARNING("It looks slightly dented.") else - to_chat(user, SPAN_DANGER("It looks severely dented!")) + . += SPAN_DANGER("It looks severely dented!") /////////////////Juggernaut/////////////// diff --git a/mods/gamemodes/cult/mobs/constructs/soulstone.dm b/mods/gamemodes/cult/mobs/constructs/soulstone.dm index 69e5d0ef21e4..19e1c55448e9 100644 --- a/mods/gamemodes/cult/mobs/constructs/soulstone.dm +++ b/mods/gamemodes/cult/mobs/constructs/soulstone.dm @@ -37,14 +37,14 @@ QDEL_NULL(shade) return ..() -/obj/item/soulstone/examine(mob/user) +/obj/item/soulstone/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(full == SOULSTONE_EMPTY) - to_chat(user, "The shard still flickers with a fraction of the full artifact's power, but it needs to be filled with the essence of someone's life before it can be used.") + . += "The shard still flickers with a fraction of the full artifact's power, but it needs to be filled with the essence of someone's life before it can be used." if(full == SOULSTONE_ESSENCE) - to_chat(user,"The shard has gone transparent, a seeming window into a dimension of unspeakable horror.") + . += "The shard has gone transparent, a seeming window into a dimension of unspeakable horror." if(full == SOULSTONE_CRACKED) - to_chat(user, "This one is cracked and useless.") + . += "This one is cracked and useless." /obj/item/soulstone/attackby(var/obj/item/I, var/mob/user) if(is_evil && istype(I, /obj/item/nullrod)) diff --git a/mods/gamemodes/cult/ritual.dm b/mods/gamemodes/cult/ritual.dm index 72d49fc92495..a6c6a1a3f748 100644 --- a/mods/gamemodes/cult/ritual.dm +++ b/mods/gamemodes/cult/ritual.dm @@ -17,12 +17,12 @@ else to_chat(user, "Hold \the [src] in your hand while drawing a rune to use it.") -/obj/item/book/tome/examine(mob/user) +/obj/item/book/tome/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(!iscultist(user)) - to_chat(user, "An old, dusty tome with frayed edges and a sinister looking cover.") + if(iscultist(user)) + . += "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." else - to_chat(user, "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though.") + . += "An old, dusty tome with frayed edges and a sinister looking cover." /obj/item/book/tome/afterattack(var/atom/A, var/mob/user, var/proximity) if(!proximity || !iscultist(user)) diff --git a/mods/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm index b47524935736..709f47f4bc37 100644 --- a/mods/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -39,10 +39,10 @@ color = bcolor desc = "A strange collection of symbols drawn in [blood]." -/obj/effect/rune/examine(mob/user) +/obj/effect/rune/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(iscultist(user)) - to_chat(user, "This is \a [cultname] rune.") + . += "This is \a [cultname] rune." /obj/effect/rune/attackby(var/obj/item/used_item, var/mob/user) if(istype(used_item, /obj/item/book/tome) && iscultist(user)) @@ -177,10 +177,10 @@ A.forceMove(T) return ..() -/obj/effect/rune/teleport/examine(mob/user) +/obj/effect/rune/teleport/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(iscultist(user)) - to_chat(user, "Its name is [destination].") + . += "Its name is [destination]." /obj/effect/rune/teleport/cast(var/mob/living/user) if(user.loc == src) @@ -297,16 +297,16 @@ rune = null return ..() -/obj/effect/cultwall/examine(mob/user) +/obj/effect/cultwall/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(iscultist(user)) var/current_max_health = get_max_health() if(current_health == current_max_health) - to_chat(user, SPAN_NOTICE("It is fully intact.")) + . += SPAN_NOTICE("It is fully intact.") else if(current_health > current_max_health * 0.5) - to_chat(user, SPAN_WARNING("It is damaged.")) + . += SPAN_WARNING("It is damaged.") else - to_chat(user, SPAN_DANGER("It is about to dissipate.")) + . += SPAN_DANGER("It is about to dissipate.") /obj/effect/cultwall/attack_hand(var/mob/user) SHOULD_CALL_PARENT(FALSE) diff --git a/mods/mobs/dionaea/mob/gestalt/_gestalt.dm b/mods/mobs/dionaea/mob/gestalt/_gestalt.dm index c9475121df87..d4216b018272 100644 --- a/mods/mobs/dionaea/mob/gestalt/_gestalt.dm +++ b/mods/mobs/dionaea/mob/gestalt/_gestalt.dm @@ -40,6 +40,7 @@ nymphs.Cut() . = ..() -/obj/structure/diona_gestalt/examine(mob/user) +/obj/structure/diona_gestalt/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(nymphs) to_chat(user, "It seems to be composed of at least [nymphs.len] nymph\s.") + if(nymphs) + . += "It seems to be composed of at least [nymphs.len] nymph\s." diff --git a/mods/species/ascent/mobs/insectoid_egg.dm b/mods/species/ascent/mobs/insectoid_egg.dm index 74619efb53e9..685b62a50aa4 100644 --- a/mods/species/ascent/mobs/insectoid_egg.dm +++ b/mods/species/ascent/mobs/insectoid_egg.dm @@ -50,25 +50,23 @@ var/global/default_gyne else icon_state = "egg" -/obj/structure/insectoid_egg/examine(mob/user) +/obj/structure/insectoid_egg/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - if(hatched || !current_health) - to_chat(user, "\icon[src] \The [src] lays in shambles, having been hatched or broken.") + . += "\icon[src] \The [src] lays in shambles, having been hatched or broken." return - if(maturity < 5) - to_chat(user, "\icon[src] \The [src] is freshly laid and sticky.") + . += "\icon[src] \The [src] is freshly laid and sticky." else if(maturity < 15) - to_chat(user, "\icon[src] \The [src] is small and still to the touch.") + . += "\icon[src] \The [src] is small and still to the touch." else if(maturity < 30) - to_chat(user, "\icon[src] \The [src] has swollen in size; a faint glow can be seen inside the shell.") + . += "\icon[src] \The [src] has swollen in size; a faint glow can be seen inside the shell." else if(maturity < 50) - to_chat(user, "\icon[src] \The [src] emanates a faint glow and moves from time to time.") + . += "\icon[src] \The [src] emanates a faint glow and moves from time to time." else if(maturity < 75) - to_chat(user, "\icon[src] \The [src] appears to be close to hatching.") + . += "\icon[src] \The [src] appears to be close to hatching." else - to_chat(user, "\icon[src] \The [src] is lively and appears ready to hatch at any moment.") + . += "\icon[src] \The [src] is lively and appears ready to hatch at any moment." /obj/structure/insectoid_egg/Process() if(!current_health || hatched || hatching || (world.time <= (last_tick + maturity_rate))) diff --git a/mods/species/vox/gear/gear_shoes.dm b/mods/species/vox/gear/gear_shoes.dm index 2e44270e3e54..fcb9d4e39cfb 100644 --- a/mods/species/vox/gear/gear_shoes.dm +++ b/mods/species/vox/gear/gear_shoes.dm @@ -39,7 +39,7 @@ canremove = TRUE update_icon() -/obj/item/clothing/shoes/magboots/vox/examine(mob/user) +/obj/item/clothing/shoes/magboots/vox/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if (magpulse) - to_chat(user, "It would be hard to take these off without relaxing your grip first.")//theoretically this message should only be seen by the wearer when the claws are equipped. + . += "It would be hard to take these off without relaxing your grip first." diff --git a/mods/species/vox/gear/gun_spikethrower.dm b/mods/species/vox/gear/gun_spikethrower.dm index a3270b98636f..25461355159c 100644 --- a/mods/species/vox/gear/gun_spikethrower.dm +++ b/mods/species/vox/gear/gun_spikethrower.dm @@ -21,9 +21,9 @@ last_regen = world.time update_icon() -/obj/item/gun/launcher/alien/examine(mob/user) +/obj/item/gun/launcher/alien/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - to_chat(user, "It has [ammo] [ammo_name]\s remaining.") + . += "It has [ammo] [ammo_name]\s remaining." /obj/item/gun/launcher/alien/consume_next_projectile() if(ammo < 1) return null diff --git a/mods/species/vox/organs_vox.dm b/mods/species/vox/organs_vox.dm index 202e2b3931d8..e2e43ad49331 100644 --- a/mods/species/vox/organs_vox.dm +++ b/mods/species/vox/organs_vox.dm @@ -183,18 +183,17 @@ . = ..(mapload, material_key, supplied_appearance, dna_species?.base_internal_prosthetics_model) do_backup() -/obj/item/organ/internal/voxstack/examine(mob/user) +/obj/item/organ/internal/voxstack/get_examine_strings(mob/user, distance, infix, suffix) . = ..() - var/user_vox = user.get_species_name() == SPECIES_VOX // TODO use bodytype flags instead so subspecies are included if (istype(backup)) var/owner_viable = find_dead_player(stored_ckey, TRUE) if (user_vox) - to_chat(user, SPAN_NOTICE("The integrity light on [src] blinks [owner_viable ? "rapidly. It can be implanted." : "slowly. It is dormant."]")) + . += SPAN_NOTICE("The integrity light on [src] blinks [owner_viable ? "rapidly. It can be implanted." : "slowly. It is dormant."]") else - to_chat(user, SPAN_NOTICE("A light on [src] blinks [owner_viable ? "rapidly" : "slowly"].")) + . += SPAN_NOTICE("A light on [src] blinks [owner_viable ? "rapidly" : "slowly"].") else if (user_vox) - to_chat(user, SPAN_NOTICE("The integrity light on [src] is off. It is empty and lifeless.")) + . += SPAN_NOTICE("The integrity light on [src] is off. It is empty and lifeless.") /obj/item/organ/internal/voxstack/emp_act() return From 14d7f0c06402d86cb69c429da95da8701f432c4e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 6 Feb 2025 15:57:08 +1100 Subject: [PATCH 24/54] Adjusting for feedback from PR. --- code/_onclick/hud/screen/screen_intent.dm | 3 ++- code/_onclick/hud/screen/screen_maneuver.dm | 6 +++-- code/game/machinery/doors/firedoor.dm | 24 +++++++++---------- code/game/objects/items/cryobag.dm | 3 ++- code/game/objects/items/rescuebag.dm | 8 ++++--- code/game/objects/items/weapons/tape.dm | 2 +- .../detectivework/tools/evidencebag.dm | 2 +- code/modules/multiz/zmimic/mimic_movable.dm | 6 ++--- code/modules/paperwork/paper_sticky.dm | 7 ++++-- 9 files changed, 35 insertions(+), 26 deletions(-) diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index 5a5797d0b0d8..f3fba3b8563f 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -37,7 +37,8 @@ /obj/screen/intent_button/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) if(desc) - return list(desc) + to_chat(user, desc) + return TRUE /obj/screen/intent_button/on_update_icon() . = ..() diff --git a/code/_onclick/hud/screen/screen_maneuver.dm b/code/_onclick/hud/screen/screen_maneuver.dm index 27a37ceedef4..ddfdf15d7d6c 100644 --- a/code/_onclick/hud/screen/screen_maneuver.dm +++ b/code/_onclick/hud/screen/screen_maneuver.dm @@ -12,8 +12,10 @@ SHOULD_CALL_PARENT(FALSE) var/mob/living/user_living = user if(istype(user_living) && user_living.prepared_maneuver) - return list(SPAN_NOTICE("You are prepared to [user_living.prepared_maneuver.name].")) - return list(SPAN_NOTICE("You are not prepared to perform a maneuver.")) + to_chat(user, SPAN_NOTICE("You are prepared to [user_living.prepared_maneuver.name].")) + else + to_chat(user, SPAN_NOTICE("You are not prepared to perform a maneuver.")) + return TRUE /obj/screen/maneuver/on_update_icon() var/mob/living/owner = owner_ref?.resolve() diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 07662d11a6ab..a7dc1926b760 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -127,27 +127,27 @@ . += "Sensor readings:" for(var/index = 1; index <= tile_info.len; index++) - var/list/o = list("  ") + var/list/direction_strings = list("  ") switch(index) if(1) - o += "NORTH: " + direction_strings += "NORTH: " if(2) - o += "SOUTH: " + direction_strings += "SOUTH: " if(3) - o += "EAST: " + direction_strings += "EAST: " if(4) - o += "WEST: " + direction_strings += "WEST: " if(tile_info[index] == null) - o += "DATA UNAVAILABLE" - to_chat(user, o) + direction_strings += "DATA UNAVAILABLE" + . += JOINTEXT(direction_strings) continue var/celsius = convert_k2c(tile_info[index][1]) var/pressure = tile_info[index][2] - o += "" - o += "[celsius]°C " - o += "" - o += "[pressure]kPa" - . += JOINTEXT(o) + direction_strings += "" + direction_strings += "[celsius]°C " + direction_strings += "" + direction_strings += "[pressure]kPa" + . += JOINTEXT(direction_strings) if(islist(users_to_open) && users_to_open.len) var/users_to_open_string = users_to_open[1] if(users_to_open.len >= 2) diff --git a/code/game/objects/items/cryobag.dm b/code/game/objects/items/cryobag.dm index f7856942decb..f045c550ad9d 100644 --- a/code/game/objects/items/cryobag.dm +++ b/code/game/objects/items/cryobag.dm @@ -110,7 +110,8 @@ if(Adjacent(user)) //The bag's rather thick and opaque from a distance. to_chat(user, SPAN_INFO("You peer into \the [src].")) for(var/mob/living/patient in contents) - . += patient.examined_by(user, distance, infix, suffix) + patient.examined_by(user, distance, infix, suffix) + return TRUE /obj/item/usedcryobag name = "used stasis bag" diff --git a/code/game/objects/items/rescuebag.dm b/code/game/objects/items/rescuebag.dm index e51ebc60adb3..4ae13e1cd418 100644 --- a/code/game/objects/items/rescuebag.dm +++ b/code/game/objects/items/rescuebag.dm @@ -136,7 +136,9 @@ . += "The pressure meter on [src] shows '[atmo.return_pressure()] kPa'." /obj/structure/closet/body_bag/rescue/examined_by(mob/user, distance, infix, suffix) + . = ..() if(Adjacent(user)) //The bag's rather thick and opaque from a distance. - . += SPAN_INFO("You peer into \the [src].") - for(var/mob/living/L in contents) - L.examined_by(user, distance, infix, suffix) + to_chat(user, SPAN_INFO("You peer into \the [src].")) + for(var/mob/living/patient in contents) + patient.examined_by(user, distance, infix, suffix) + return TRUE \ No newline at end of file diff --git a/code/game/objects/items/weapons/tape.dm b/code/game/objects/items/weapons/tape.dm index a8ed869e79aa..eaec2caa5867 100644 --- a/code/game/objects/items/weapons/tape.dm +++ b/code/game/objects/items/weapons/tape.dm @@ -188,7 +188,7 @@ return stuck? stuck.attackby(W, user) : ..() /obj/item/duct_tape/examined_by(mob/user, distance, infix, suffix) - return stuck ? stuck.examined_by(arglist(args)) : ..() + return stuck ? stuck.examined_by(user, distance, infix, suffix) : ..() /obj/item/duct_tape/proc/attach(var/obj/item/W) stuck = W diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 89ef0ed1ba69..8bb5a9810e9a 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -95,4 +95,4 @@ /obj/item/evidencebag/examined_by(mob/user, distance, infix, suffix) . = ..() if (stored_item) - user.examine_verb(stored_item) + user.examined_by(user, distance, infix, suffix) diff --git a/code/modules/multiz/zmimic/mimic_movable.dm b/code/modules/multiz/zmimic/mimic_movable.dm index f328a743f362..7fa5849e54f8 100644 --- a/code/modules/multiz/zmimic/mimic_movable.dm +++ b/code/modules/multiz/zmimic/mimic_movable.dm @@ -157,7 +157,7 @@ /atom/movable/openspace/mimic/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - . = associated_atom.examined_by(user, distance, infix, suffix) // just pass all the args to the copied atom + return associated_atom.examined_by(user, distance, infix, suffix) /atom/movable/openspace/mimic/forceMove(turf/dest) var/atom/old_loc = loc @@ -207,7 +207,7 @@ /atom/movable/openspace/turf_proxy/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - . = loc.examined_by(user, distance, infix, suffix) + return loc.examined_by(user, distance, infix, suffix) // -- TURF MIMIC -- @@ -236,4 +236,4 @@ /atom/movable/openspace/turf_mimic/examined_by(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(FALSE) - . = delegate.examined_by(user, distance, infix, suffix) + return delegate.examined_by(user, distance, infix, suffix) diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index e9f2b4b5cf2b..aaa0ad746036 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -50,10 +50,13 @@ return . return ..() -/obj/item/sticky_pad/examined_by(mob/user, distance, infix, suffix) +/obj/item/sticky_pad/get_examine_strings(mob/user, distance, infix, suffix) . = ..() . += SPAN_NOTICE("It has [papers] sticky note\s left.") - . += SPAN_NOTICE("You can click it on grab intent to pick it up.") + +/obj/item/sticky_pad/get_examine_hints(mob/user, distance, infix, suffix) + . = ..() + LAZYADD(., SPAN_NOTICE("You can click it on grab intent to pick it up.")) /obj/item/sticky_pad/dragged_onto(mob/user) user.put_in_hands(top) From e821679550eb1f81c25632ce55d73f581b650bba Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 7 Feb 2025 11:33:04 +1100 Subject: [PATCH 25/54] display_parts() no longer displays itself. --- .../_machines_base/machine_construction/airlock.dm | 3 ++- .../_machines_base/machine_construction/default.dm | 3 ++- .../_machines_base/machine_construction/wall_frame.dm | 3 ++- code/game/machinery/_machines_base/machinery.dm | 6 ++---- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/_machines_base/machine_construction/airlock.dm b/code/game/machinery/_machines_base/machine_construction/airlock.dm index faa00f9d3775..27f29d03070d 100644 --- a/code/game/machinery/_machines_base/machine_construction/airlock.dm +++ b/code/game/machinery/_machines_base/machine_construction/airlock.dm @@ -21,7 +21,8 @@ var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) - machine.display_parts(user, show_directly = TRUE) + for(var/line in machine.get_part_info_strings(user)) + to_chat(user, line) return TRUE return FALSE diff --git a/code/game/machinery/_machines_base/machine_construction/default.dm b/code/game/machinery/_machines_base/machine_construction/default.dm index 21a9a8a50d2e..928954909b4e 100644 --- a/code/game/machinery/_machines_base/machine_construction/default.dm +++ b/code/game/machinery/_machines_base/machine_construction/default.dm @@ -35,7 +35,8 @@ var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) - machine.display_parts(user, show_directly = TRUE) + for(var/line in machine.get_part_info_strings(user)) + to_chat(user, line) return TRUE return FALSE diff --git a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm index 59d9ccaf7342..9c01dcc5db7c 100644 --- a/code/game/machinery/_machines_base/machine_construction/wall_frame.dm +++ b/code/game/machinery/_machines_base/machine_construction/wall_frame.dm @@ -32,7 +32,8 @@ var/obj/item/part_replacer/replacer = I if(replacer.remote_interaction) machine.part_replacement(user, replacer) - machine.display_parts(user, show_directly = TRUE) + for(var/line in machine.get_part_info_strings(user)) + to_chat(user, line) return TRUE return down_interaction(I, user, machine) diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index f31c8098c6f4..859257e83c48 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -403,7 +403,7 @@ Class Procs: /datum/proc/remove_visual(mob/M) return -/obj/machinery/proc/display_parts(mob/user, show_directly) +/obj/machinery/proc/get_part_info_strings(mob/user) . = list() . += SPAN_NOTICE("The following parts are detected in \the [src]:") for(var/obj/item/C in component_parts) @@ -416,13 +416,11 @@ Class Procs: for(var/path in uncreated_component_parts) var/obj/item/thing = path . += SPAN_NOTICE(" [initial(thing.name)] ([uncreated_component_parts[path] || 1])") - if(length(.) && show_directly) - to_chat(user, jointext(., "
")) /obj/machinery/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(component_parts && (hasHUD(user, HUD_SCIENCE) || (construct_state && construct_state.visible_components))) - . += display_parts(user) + . += get_part_info_strings(user) if(stat & NOSCREEN) . += SPAN_WARNING("It is missing a screen, making it hard to interact with.") else if(stat & NOINPUT) From c9eb48e2f9d7acd5de53b5c280d4e206bd39e95c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 10 Feb 2025 11:43:32 +1100 Subject: [PATCH 26/54] Removing remaining uses of pronoun macros. --- code/game/objects/items/welding/weldbackpack.dm | 6 +++++- code/modules/mob/living/human/unarmed_attack.dm | 3 ++- test/check-paths.sh | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/welding/weldbackpack.dm b/code/game/objects/items/welding/weldbackpack.dm index fe4bfd67ad24..9198dbb6f271 100644 --- a/code/game/objects/items/welding/weldbackpack.dm +++ b/code/game/objects/items/welding/weldbackpack.dm @@ -95,7 +95,11 @@ if(IS_WELDER(W)) var/obj/item/weldingtool/T = W if(T.welding) - user.visible_message(SPAN_DANGER("\The [user] singes \his [src] with \his [W]!"), SPAN_DANGER("You singed your [src] with your [W]!")) + var/decl/pronouns/pronouns = user.get_pronouns() + user.visible_message( + SPAN_DANGER("\The [user] singes [pronouns.his] [name] with [pronouns.his] [W.name]!"), + SPAN_DANGER("You singed your [name] with your [W.name]!") + ) if(W == welder) return reattach_gun(user) diff --git a/code/modules/mob/living/human/unarmed_attack.dm b/code/modules/mob/living/human/unarmed_attack.dm index 41a7fc311551..ce18cfa97bfb 100644 --- a/code/modules/mob/living/human/unarmed_attack.dm +++ b/code/modules/mob/living/human/unarmed_attack.dm @@ -210,7 +210,8 @@ attack_damage = clamp(attack_damage, 1, 5) // We expect damage input of 1 to 5 for this proc. But we leave this check juuust in case. if(target == user) - user.visible_message("[user] [pick(attack_verb)] \himself in \the [affecting]!") + var/decl/pronouns/pronouns = user.get_pronouns() + user.visible_message(SPAN_DANGER("\The [user] [pick(attack_verb)] [pronouns.self] in \the [affecting]!")) return 0 target.update_personal_goal(/datum/goal/achievement/fistfight, TRUE) diff --git a/test/check-paths.sh b/test/check-paths.sh index 852c681ae6ca..f2cc61b20e2b 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -49,6 +49,7 @@ exactly 0 "global-marked member variables" '\t+/?var.*/global/' -P exactly 0 "static-marked globally scoped variables" '^/?var.*/static/.+' -P exactly 1 "direct usage of decls_repository.get_decl()" 'decls_repository\.get_decl\(' -P exactly 19 "direct loc set" '[^ ,(/]\bloc\s*=(?!=)' -P +exactly 6 "pronoun macro use" '\\(he|she|him|her|his|hers|himself|herself|He|She|Him|Her|His|Hers|Himself|Herself)\b' -P exactly 0 "magic number mouse opacity set" 'mouse_opacity\s*=\s*[0-2]' -P exactly 0 "magic number density set" '\bdensity\s*=\s*[01]\b' -P exactly 0 "magic number anchored set" '\banchored\s*=\s*[01]\b' -P From 2f3cdd150320d06a220c0fe7958ed2508b20f056 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 10 Feb 2025 00:18:55 +1100 Subject: [PATCH 27/54] Fixing cola display name breaking. --- code/modules/reagents/chems/chems_drinks.dm | 4 ++-- .../reagent_containers/drinkingglass/drinkingglass.dm | 6 ++++++ .../reagent_containers/drinkingglass/glass_types.dm | 3 --- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index 51539ecf078e..b9ea85a8a9c7 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -582,8 +582,8 @@ /decl/material/liquid/drink/cola/build_presentation_name_from_reagents(var/obj/item/prop, var/supplied) if(prop.reagents.has_reagent(/decl/material/liquid/drink/milk)) - . = "pilk" - . = ..(prop, .) + supplied = "pilk" + . = ..() /decl/material/liquid/drink/citrussoda name = "citrus soda" diff --git a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm index 502c21330a30..6bc197a3de5f 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/drinkingglass.dm @@ -32,6 +32,12 @@ var/global/const/DRINK_ICON_NOISY = "noise" var/custom_name var/custom_desc +/obj/item/chems/drinks/glass2/update_name() + if(custom_name) + SetName(custom_name) + return + return ..() + // Reverse the matter effect of the hollow flag, keep the force effect. // Glasses are so tiny that their effective matter is ten times lower than forks/knives due to OBJ_FLAG_HOLLOW. /obj/item/chems/drinks/glass2/get_matter_amount_modifier() diff --git a/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm b/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm index ccff0201716f..d7e62d41dae3 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/glass_types.dm @@ -50,7 +50,6 @@ icon = 'icons/obj/drink_glasses/shot.dmi' filling_states = @"[33,66,100]" volume = 5 - material = /decl/material/solid/glass possible_transfer_amounts = @"[1,2,5]" rim_pos = @'{"y":17,"x_left":13,"x_right":21}' @@ -61,7 +60,6 @@ icon = 'icons/obj/drink_glasses/pint.dmi' filling_states = @"[16,33,50,66,83,100]" volume = 60 - material = /decl/material/solid/glass possible_transfer_amounts = @"[5,10,15,30,60]" rim_pos = @'{"y":25,"x_left":12,"x_right":21}' @@ -106,7 +104,6 @@ icon = 'icons/obj/drink_glasses/carafe.dmi' filling_states = @"[10,20,30,40,50,60,70,80,90,100]" volume = 120 - material = /decl/material/solid/glass possible_transfer_amounts = @"[5,10,15,30,60,120]" rim_pos = @'{"y":26,"x_left":12,"x_right":21}' center_of_mass = @'{"x":16,"y":7}' From 1da37352abff6eec3aa720593968d8d920506190 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 6 Feb 2025 20:45:34 +1100 Subject: [PATCH 28/54] Moving organ damage var/procs onto /internal. --- code/datums/ai/human.dm | 2 +- .../objects/items/flashlights/_flashlight.dm | 4 +-- code/game/objects/items/stacks/nanopaste.dm | 2 +- code/modules/mob/living/human/examine.dm | 2 +- .../mob/living/human/human_attackhand.dm | 2 +- code/modules/mob/living/human/life.dm | 8 ++--- .../mob/living/silicon/robot/analyzer.dm | 2 +- code/modules/organs/external/_external.dm | 11 +++++-- code/modules/organs/internal/_internal.dm | 33 +++++++++++++++++++ code/modules/organs/organ.dm | 23 ++----------- code/modules/organs/organ_prosthetics.dm | 2 +- code/modules/surgery/robotics.dm | 4 +-- .../psionics/complexus/complexus_process.dm | 2 +- mods/gamemodes/cult/runes.dm | 4 +-- 14 files changed, 60 insertions(+), 41 deletions(-) diff --git a/code/datums/ai/human.dm b/code/datums/ai/human.dm index 1a8541041aa1..a813e73bb1fa 100644 --- a/code/datums/ai/human.dm +++ b/code/datums/ai/human.dm @@ -45,7 +45,7 @@ else H.custom_emote("rubs [pronouns.his] [damaged_organ.name] carefully.") - for(var/obj/item/organ/organ in H.get_internal_organs()) + for(var/obj/item/organ/internal/organ in H.get_internal_organs()) if((organ.status & ORGAN_DEAD) || BP_IS_PROSTHETIC(organ)) continue if(organ.get_organ_damage() > 2 && prob(1)) diff --git a/code/game/objects/items/flashlights/_flashlight.dm b/code/game/objects/items/flashlights/_flashlight.dm index 74663d15a37d..17f4b6655d97 100644 --- a/code/game/objects/items/flashlights/_flashlight.dm +++ b/code/game/objects/items/flashlights/_flashlight.dm @@ -135,13 +135,13 @@ return ..() -/obj/item/flashlight/proc/inspect_vision(obj/item/organ/vision, mob/living/user) +/obj/item/flashlight/proc/inspect_vision(obj/item/organ/internal/vision, mob/living/user) var/mob/living/human/H = vision.owner if(H == user) //can't look into your own eyes buster return - if(!BP_IS_PROSTHETIC(vision)) + if(istype(vision) && !BP_IS_PROSTHETIC(vision)) if(vision.owner.stat == DEAD || H.is_blind()) //mob is dead or fully blind to_chat(user, SPAN_WARNING("\The [H]'s pupils do not react to the light!")) diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm index 3090f86744d5..405c08b1f34c 100644 --- a/code/game/objects/items/stacks/nanopaste.dm +++ b/code/game/objects/items/stacks/nanopaste.dm @@ -50,7 +50,7 @@ to_chat(user, SPAN_WARNING("\The [target]'s [affecting.name] is flesh and blood, and cannot be repaired with \the [src].")) return TRUE - if(affecting.get_organ_damage() >= 30 && affecting.hatch_state != HATCH_OPENED) + if((affecting.brute_dam + affecting.burn_dam) >= 30 && affecting.hatch_state != HATCH_OPENED) to_chat(user, SPAN_WARNING("The damage to \the [affecting] is too severe to repair without an open maintenance hatch.")) return TRUE diff --git a/code/modules/mob/living/human/examine.dm b/code/modules/mob/living/human/examine.dm index 7aab22fa06df..1c3dabe29148 100644 --- a/code/modules/mob/living/human/examine.dm +++ b/code/modules/mob/living/human/examine.dm @@ -150,7 +150,7 @@ wound_flavor_text[limb.name] += "[use_His] [limb.name] is irrecoverably damaged!" else wound_flavor_text[limb.name] += "[use_His] [limb.name] is grey and necrotic!
" - else if(limb.get_organ_damage() >= limb.max_damage && limb.germ_level >= INFECTION_LEVEL_TWO) + else if((limb.brute_dam + limb.burn_dam) >= limb.max_damage && limb.germ_level >= INFECTION_LEVEL_TWO) wound_flavor_text[limb.name] += "[use_His] [limb.name] is likely beyond saving, and has begun to decay!" for(var/datum/wound/wound in limb.wounds) diff --git a/code/modules/mob/living/human/human_attackhand.dm b/code/modules/mob/living/human/human_attackhand.dm index 2ea129a6301d..00c8a932b860 100644 --- a/code/modules/mob/living/human/human_attackhand.dm +++ b/code/modules/mob/living/human/human_attackhand.dm @@ -59,7 +59,7 @@ . += "irrecoverably damaged" else . += "grey and necrotic" - else if(_organ_damage >= max_damage && germ_level >= INFECTION_LEVEL_TWO) + else if((brute_dam + burn_dam) >= max_damage && germ_level >= INFECTION_LEVEL_TWO) . += "likely beyond saving and decay has set in" if(!is_usable() || is_dislocated()) // This one is special and has a different message for visible/pain modes. diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index 40053b33242a..5beb8833681b 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -246,11 +246,11 @@ SET_HUD_ALERT(src, HUD_PRESSURE, -1) else var/list/obj/item/organ/external/parts = get_damageable_organs() - for(var/obj/item/organ/external/organ in parts) - if(QDELETED(organ) || !(organ.owner == src)) + for(var/obj/item/organ/external/limb in parts) + if(QDELETED(limb) || !(limb.owner == src)) continue - if(organ.get_organ_damage() + (LOW_PRESSURE_DAMAGE) < organ.min_broken_damage) //vacuum does not break bones - organ.take_damage(LOW_PRESSURE_DAMAGE, inflicter = "Low Pressure") + if(limb.brute_dam + limb.burn_dam + (LOW_PRESSURE_DAMAGE) < limb.min_broken_damage) //vacuum does not break bones + limb.take_damage(LOW_PRESSURE_DAMAGE, inflicter = "Low Pressure") if(getOxyLossPercent() < 55) // 11 OxyLoss per 4 ticks when wearing internals; unconsciousness in 16 ticks, roughly half a minute take_damage(4) // 16 OxyLoss per 4 ticks when no internals present; unconsciousness in 13 ticks, OXY, roughly twenty seconds SET_HUD_ALERT(src, HUD_PRESSURE, -2) diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 98fb44ff5d5a..1434763bfa9b 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -89,7 +89,7 @@ to_chat(user, "
") to_chat(user, SPAN_NOTICE("Internal prosthetics:")) organ_found = null - for(var/obj/item/organ/organ in H.get_internal_organs()) + for(var/obj/item/organ/internal/organ in H.get_internal_organs()) if(!BP_IS_PROSTHETIC(organ)) continue organ_found = 1 diff --git a/code/modules/organs/external/_external.dm b/code/modules/organs/external/_external.dm index 3f7d22a0bfc3..1a68409f94da 100644 --- a/code/modules/organs/external/_external.dm +++ b/code/modules/organs/external/_external.dm @@ -767,6 +767,10 @@ This function completely restores a damaged organ to perfect condition. pain = 0 ..() + //check if we've hit max_damage + if((brute_dam + burn_dam) >= max_damage) + die() + //Updating germ levels. Handles organ germ levels and necrosis. /* The INFECTION_LEVEL values defined in setup.dm control the time it takes to reach the different @@ -952,7 +956,6 @@ Note that amputating the affected organ does in fact remove the infection from t clamped |= wound.clamped number_wounds += wound.amount - _organ_damage = brute_dam + burn_dam update_damage_ratios() /obj/item/organ/external/proc/update_damage_ratios() @@ -1548,7 +1551,7 @@ Note that amputating the affected organ does in fact remove the infection from t else if(status & ORGAN_BROKEN) . += max_delay * 3/8 else if(BP_IS_PROSTHETIC(src)) - . += max_delay * CLAMP01(_organ_damage/max_damage) + . += max_delay * CLAMP01((brute_dam + burn_dam) / max_damage) /obj/item/organ/external/proc/is_robotic() return bodytype.is_robotic @@ -1563,7 +1566,7 @@ Note that amputating the affected organ does in fact remove the infection from t /obj/item/organ/external/die() //External organs dying on a dime causes some real issues in combat if(!BP_IS_PROSTHETIC(src) && !BP_IS_CRYSTAL(src)) - var/decay_rate = _organ_damage/(max_damage*2) + var/decay_rate = (brute_dam + burn_dam) / (max_damage*2) germ_level += round(rand(decay_rate,decay_rate*1.5)) //So instead, we're going to say the damage is so severe its functions are slowly failing due to the extensive damage else //TODO: more advanced system for synths if(istype(src,/obj/item/organ/external/chest) || istype(src,/obj/item/organ/external/groin)) @@ -1639,3 +1642,5 @@ Note that amputating the affected organ does in fact remove the infection from t _sprite_accessories = null update_icon() +/obj/item/organ/external/is_broken() + return (brute_dam + burn_dam) >= min_broken_damage || ..() diff --git a/code/modules/organs/internal/_internal.dm b/code/modules/organs/internal/_internal.dm index 6aab47bbcb60..8c7939f7ed43 100644 --- a/code/modules/organs/internal/_internal.dm +++ b/code/modules/organs/internal/_internal.dm @@ -27,6 +27,9 @@ /// Whether or not we should try to transfer a brainmob when removed or replaced in a mob. var/transfer_brainmob_with_organ = FALSE + // Current damage to the organ + VAR_PRIVATE/_organ_damage = 0 + /obj/item/organ/internal/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance, decl/bodytype/new_bodytype) if(!alive_icon) alive_icon = initial(icon_state) @@ -160,6 +163,9 @@ /obj/item/organ/internal/Process() SHOULD_CALL_PARENT(TRUE) ..() + //check if we've hit max_damage + if(_organ_damage >= max_damage) + die() if(owner && _organ_damage && !(status & ORGAN_DEAD)) handle_damage_effects() @@ -295,3 +301,30 @@ /obj/item/organ/internal/preserve_in_cryopod(var/obj/machinery/cryopod/pod) var/mob/living/brainmob = get_brainmob() return brainmob?.key + +/obj/item/organ/internal/proc/set_organ_damage(amt) + _organ_damage = amt + +/obj/item/organ/internal/proc/adjust_organ_damage(amt) + _organ_damage = clamp(_organ_damage + amt, 0, max_damage) + +/obj/item/organ/internal/proc/get_organ_damage() + return _organ_damage // TODO: get_max_health() - current_health, unify organ/item damage handling. + +/obj/item/organ/internal/is_broken() + return _organ_damage >= min_broken_damage || ..() + +/obj/item/organ/internal/die() + _organ_damage = max_damage + return ..() + +/obj/item/organ/internal/rejuvenate(var/ignore_organ_traits) + _organ_damage = 0 + return ..() + +/obj/item/organ/internal/heal_damage(amount) + if(can_recover()) + _organ_damage = clamp(_organ_damage - round(amount, 0.1), 0, max_damage) + if(owner) + owner.update_health() + diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index dbc48e5e4b13..87196b4663d6 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -27,7 +27,6 @@ var/meat_name // Taken from first owner. // Damage vars. - VAR_PRIVATE/_organ_damage = 0 // Current damage to the organ var/min_broken_damage = 30 // Damage before becoming broken var/max_damage = 30 // Damage cap, including scarring var/absolute_max_damage = 0 // Lifetime damage cap, ignoring scarring. @@ -63,17 +62,8 @@ /obj/item/organ/attack_self(var/mob/user) return (owner && loc == owner && owner == user) -/obj/item/organ/proc/set_organ_damage(amt) - _organ_damage = amt - -/obj/item/organ/proc/adjust_organ_damage(amt) - _organ_damage = clamp(_organ_damage + amt, 0, max_damage) - -/obj/item/organ/proc/get_organ_damage() - return _organ_damage // TODO: get_max_health() - current_health, unify organ/item damage handling. - /obj/item/organ/proc/is_broken() - return (get_organ_damage() >= min_broken_damage || (status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN) || (status & ORGAN_DEAD)) + return (status & ORGAN_CUT_AWAY) || (status & ORGAN_BROKEN) || (status & ORGAN_DEAD) //Third argument may be a dna datum; if null will be set to holder's dna. /obj/item/organ/Initialize(mapload, material_key, datum/mob_snapshot/supplied_appearance) @@ -206,7 +196,6 @@ reset_status() /obj/item/organ/proc/die() - _organ_damage = max_damage status |= ORGAN_DEAD STOP_PROCESSING(SSobj, src) QDEL_NULL_LIST(ailments) @@ -253,10 +242,6 @@ for(var/datum/ailment/ailment in ailments) handle_ailment(ailment) - //check if we've hit max_damage - if(get_organ_damage() >= max_damage) - die() - /obj/item/organ/proc/handle_ailment(var/datum/ailment/ailment) if(ailment.treated_by_reagent_type) for(var/datum/reagents/source as anything in owner.get_metabolizing_reagent_holders()) @@ -360,7 +345,6 @@ SHOULD_CALL_PARENT(TRUE) if(!owner) PRINT_STACK_TRACE("rejuvenate() called on organ of type [type] with no owner.") - _organ_damage = 0 reset_status() QDEL_NULL_LIST(ailments) if(!ignore_organ_traits) @@ -400,10 +384,7 @@ return ..() /obj/item/organ/proc/heal_damage(amount) - if(can_recover()) - _organ_damage = clamp(_organ_damage - round(amount, 0.1), 0, max_damage) - if(owner) - owner.update_health() + return /obj/item/organ/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) if(BP_IS_PROSTHETIC(src) || !istype(target) || !istype(user) || (user != target && user.check_intent(I_FLAG_HELP))) diff --git a/code/modules/organs/organ_prosthetics.dm b/code/modules/organs/organ_prosthetics.dm index 6b039adba87e..09635dcdf8a8 100644 --- a/code/modules/organs/organ_prosthetics.dm +++ b/code/modules/organs/organ_prosthetics.dm @@ -48,7 +48,7 @@ // Checks if an organ (or the parent of one) is in a fit state for modular limb stuff to happen. /obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/human/user) - . = _organ_damage >= min_broken_damage || (status & ORGAN_BROKEN) // can't use is_broken() as the limb has ORGAN_CUT_AWAY + . = (brute_dam + burn_dam) >= min_broken_damage || (status & ORGAN_BROKEN) // can't use is_broken() as the limb has ORGAN_CUT_AWAY // Human mob procs: // Checks the organ list for limbs meeting a predicate. Way overengineered for such a limited use diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm index b92483b02e3c..07dd1eb2d65d 100644 --- a/code/modules/surgery/robotics.dm +++ b/code/modules/surgery/robotics.dm @@ -369,7 +369,7 @@ /decl/surgery_step/robotics/fix_organ_robotic/begin_step(mob/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - for(var/obj/item/organ/organ in affected.internal_organs) + for(var/obj/item/organ/internal/organ in affected.internal_organs) if(organ.get_organ_damage() > 0) if(BP_IS_PROSTHETIC(organ)) user.visible_message("[user] starts mending the damage to [target]'s [organ.name]'s mechanisms.", \ @@ -378,7 +378,7 @@ /decl/surgery_step/robotics/fix_organ_robotic/end_step(mob/living/user, mob/living/target, target_zone, obj/item/tool) var/obj/item/organ/external/affected = GET_EXTERNAL_ORGAN(target, target_zone) - for(var/obj/item/organ/organ in affected.internal_organs) + for(var/obj/item/organ/internal/organ in affected.internal_organs) if(organ.get_organ_damage() > 0) if(BP_IS_PROSTHETIC(organ)) user.visible_message("[user] repairs [target]'s [organ.name] with [tool].", \ diff --git a/mods/content/psionics/system/psionics/complexus/complexus_process.dm b/mods/content/psionics/system/psionics/complexus/complexus_process.dm index 32c9d435e6f5..44f3258b9cec 100644 --- a/mods/content/psionics/system/psionics/complexus/complexus_process.dm +++ b/mods/content/psionics/system/psionics/complexus/complexus_process.dm @@ -183,7 +183,7 @@ // Heal organ damage. if(heal_internal) - for(var/obj/item/organ/organ in H.get_internal_organs()) + for(var/obj/item/organ/internal/organ in H.get_internal_organs()) if(BP_IS_PROSTHETIC(organ) || BP_IS_CRYSTAL(organ)) continue diff --git a/mods/gamemodes/cult/runes.dm b/mods/gamemodes/cult/runes.dm index 709f47f4bc37..4ed65a929f5f 100644 --- a/mods/gamemodes/cult/runes.dm +++ b/mods/gamemodes/cult/runes.dm @@ -576,13 +576,13 @@ if(!charges) return statuses var/list/obj/item/organ/damaged = list() - for(var/obj/item/organ/organ in user.internal_organs) + for(var/obj/item/organ/internal/organ in user.internal_organs) if(organ.get_organ_damage()) damaged += organ if(damaged.len) statuses += "you feel pain inside for a moment that passes quickly" while(charges && damaged.len) - var/obj/item/organ/fix = pick(damaged) + var/obj/item/organ/internal/fix = pick(damaged) fix.adjust_organ_damage(-(min(charges, 1))) charges = max(charges - 1, 0) if(fix.get_organ_damage() <= 0) From c2b5b4dcc6417d5c22e9b42e6f8ff0ea9bf28bbd Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 11 Feb 2025 14:52:10 +1100 Subject: [PATCH 29/54] Generalizing lid overlay states for glass containers. --- code/game/objects/items/waterskin.dm | 3 ++- code/game/objects/items/weapons/paint.dm | 2 +- code/modules/paperwork/pen/quill_and_ink.dm | 2 +- .../reagents/reagent_containers/_glass.dm | 26 +++++++++++++++++++ .../reagents/reagent_containers/beaker.dm | 14 +++++----- .../reagents/reagent_containers/bucket.dm | 7 +---- .../reagent_containers/glass/bottle.dm | 17 ++++-------- .../reagents/reagent_containers/retort.dm | 7 +++-- .../finds/find_types/chem_containers.dm | 5 +++- 9 files changed, 53 insertions(+), 30 deletions(-) diff --git a/code/game/objects/items/waterskin.dm b/code/game/objects/items/waterskin.dm index 73852feaef06..f38bc2e4d130 100644 --- a/code/game/objects/items/waterskin.dm +++ b/code/game/objects/items/waterskin.dm @@ -37,7 +37,8 @@ update_icon() return TRUE -/obj/item/chems/glass/waterskin/on_update_icon() // TODO: filled/empty sprites +// TODO: filled/empty sprites +/obj/item/chems/glass/waterskin/update_overlays() . = ..() // cuts overlays var/image/stopper_overlay = get_stopper_overlay() if(stopper_overlay) diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 37304ae49fcc..fdc6af58d22a 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -28,7 +28,7 @@ /obj/item/chems/glass/paint/get_utensil_food_type() return null -/obj/item/chems/glass/paint/on_update_icon() +/obj/item/chems/glass/paint/update_overlays() . = ..() if(reagents?.total_volume) add_overlay(overlay_image('icons/obj/reagentfillings.dmi', "paintbucket", reagents.get_color())) diff --git a/code/modules/paperwork/pen/quill_and_ink.dm b/code/modules/paperwork/pen/quill_and_ink.dm index 4944165f4e5b..1bb926b7342b 100644 --- a/code/modules/paperwork/pen/quill_and_ink.dm +++ b/code/modules/paperwork/pen/quill_and_ink.dm @@ -75,7 +75,7 @@ . = ..() add_to_reagents(/decl/material/liquid/pigment/black/ink, rand(starting_volume_low, starting_volume_high)) -/obj/item/chems/glass/inkwell/on_update_icon() +/obj/item/chems/glass/inkwell/update_overlays() . = ..() icon_state = get_world_inventory_state() if(locate(/obj/item/pen/fancy/quill) in src) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index 3d609f811c77..608f538a00a3 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -64,6 +64,32 @@ var/decl/material/drinking = reagents.get_primary_reagent_decl() return drinking ? !drinking.is_unsafe_to_drink(drinker) : FALSE +#ifdef UNIT_TEST +// Will get generated during atom creation/deletion tests so no need for a distinct unit test. +var/global/list/lid_check_glass_types = list() +/obj/item/chems/glass/Initialize() + . = ..() + if(can_lid() && !global.lid_check_glass_types[type]) + if(!check_state_in_icon("[icon_state]_lid", icon)) + log_error("Liddable vessel [type] missing lid state from [icon]!") + global.lid_check_glass_types[type] = TRUE +#endif + +/obj/item/chems/glass/on_update_icon() + . = ..() + update_overlays() + compile_overlays() + +/obj/item/chems/glass/proc/get_lid_color() + return COLOR_WHITE + +/obj/item/chems/glass/proc/get_lid_flags() + return RESET_COLOR | RESET_ALPHA + +/obj/item/chems/glass/proc/update_overlays() + if (can_lid() && !ATOM_IS_OPEN_CONTAINER(src)) + add_overlay(overlay_image(icon, "[icon_state]_lid", get_lid_color(), get_lid_flags())) + /obj/item/chems/glass/attack_self(mob/user) if(can_lid() && user.a_intent == I_HELP) diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index 727d8fd45e40..5bfdf532c0f4 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -1,4 +1,3 @@ - /obj/item/chems/glass/beaker name = "beaker" desc = "A beaker." @@ -11,6 +10,9 @@ presentation_flags = PRESENTATION_FLAG_NAME var/lid_color = COLOR_BEASTY_BROWN +/obj/item/chems/glass/beaker/get_lid_color() + return lid_color + /obj/item/chems/glass/beaker/examine(mob/user, distance) . = ..() to_chat(user, " It can hold up to [volume] units.") @@ -27,9 +29,7 @@ . = ..() update_icon() -/obj/item/chems/glass/beaker/on_update_icon() - . = ..() - cut_overlays() +/obj/item/chems/glass/beaker/update_overlays() if(reagents?.total_volume) var/image/filling = mutable_appearance(icon, "[icon_state]1", reagents.get_color()) @@ -53,8 +53,7 @@ shine.alpha = material.reflectiveness * 3 add_overlay(shine) - if (!ATOM_IS_OPEN_CONTAINER(src)) - add_overlay(mutable_appearance(icon, "[icon_state]_lid", lid_color)) + . = ..() compile_overlays() @@ -108,6 +107,9 @@ obj_flags = OBJ_FLAG_HOLLOW | OBJ_FLAG_INSULATED_HANDLE material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME | MAT_FLAG_ALTERATION_DESC +/obj/item/chems/glass/beaker/kettle/can_lid() + return FALSE + /obj/item/chems/glass/beaker/noreact name = "cryostasis beaker" desc = "A cryostasis beaker that allows for chemical storage without reactions." diff --git a/code/modules/reagents/reagent_containers/bucket.dm b/code/modules/reagents/reagent_containers/bucket.dm index bf25af27044d..0693adcbf126 100644 --- a/code/modules/reagents/reagent_containers/bucket.dm +++ b/code/modules/reagents/reagent_containers/bucket.dm @@ -34,11 +34,6 @@ return TRUE return ..() -/obj/item/chems/glass/bucket/on_update_icon() - . = ..() - if (!ATOM_IS_OPEN_CONTAINER(src)) - add_overlay("lid_[initial(icon_state)]") - /obj/item/chems/glass/bucket/get_reagents_overlay(state_prefix) if(!ATOM_IS_OPEN_CONTAINER(src)) return null // no overlay while closed! @@ -70,7 +65,7 @@ overlay.add_overlay(overlay_image(icon, "[overlay.icon_state]_overlay", rivet_material.get_reagent_color(), RESET_COLOR | RESET_ALPHA)) return ..() -/obj/item/chems/glass/bucket/wood/on_update_icon() +/obj/item/chems/glass/bucket/wood/update_overlays() . = ..() add_overlay(overlay_image(icon, "[icon_state]_overlay", rivet_material.get_reagent_color(), RESET_COLOR | RESET_ALPHA)) diff --git a/code/modules/reagents/reagent_containers/glass/bottle.dm b/code/modules/reagents/reagent_containers/glass/bottle.dm index 12f89307eb5f..094887c87ac4 100644 --- a/code/modules/reagents/reagent_containers/glass/bottle.dm +++ b/code/modules/reagents/reagent_containers/glass/bottle.dm @@ -22,6 +22,9 @@ var/lid_color = COLOR_GRAY80 var/autolabel = TRUE // if set, will add label with the name of the first initial reagent +/obj/item/chems/glass/bottle/get_lid_color() + return lid_color + /obj/item/chems/glass/bottle/on_picked_up(mob/user) . = ..() update_icon() @@ -34,30 +37,20 @@ . = ..() update_icon() -/obj/item/chems/glass/bottle/on_update_icon() - . = ..() - cut_overlays() - +/obj/item/chems/glass/bottle/update_overlays() if(reagents?.total_volume) var/percent = round(reagents.total_volume / volume * 100, 25) add_overlay(mutable_appearance(icon, "[icon_state]_filling_[percent]", reagents.get_color())) - var/image/overglass = mutable_appearance(icon, "[icon_state]_over", color) overglass.alpha = alpha * ((alpha/255) ** 3) add_overlay(overglass) - if(material.reflectiveness >= MAT_VALUE_SHINY) var/mutable_appearance/shine = mutable_appearance(icon, "[icon_state]_shine", adjust_brightness(color, 20 + material.reflectiveness)) shine.alpha = material.reflectiveness * 3 add_overlay(shine) - if(label_text) add_overlay(mutable_appearance(icon, "[icon_state]_label", label_color)) - - if (!ATOM_IS_OPEN_CONTAINER(src)) - add_overlay(mutable_appearance(icon, "[icon_state]_lid", lid_color)) - - compile_overlays() + . = ..() /obj/item/chems/glass/bottle/Initialize() . = ..() diff --git a/code/modules/reagents/reagent_containers/retort.dm b/code/modules/reagents/reagent_containers/retort.dm index d19e473ee337..2a886712e141 100644 --- a/code/modules/reagents/reagent_containers/retort.dm +++ b/code/modules/reagents/reagent_containers/retort.dm @@ -8,14 +8,16 @@ material = /decl/material/solid/glass material_alteration = MAT_FLAG_ALTERATION_ALL +/obj/item/chems/glass/retort/can_lid() + return FALSE + /obj/item/chems/glass/retort/copper material = /decl/material/solid/metal/copper /obj/item/chems/glass/retort/earthenware material = /decl/material/solid/stone/pottery -/obj/item/chems/glass/retort/on_update_icon() - . = ..() +/obj/item/chems/glass/retort/update_overlays() if(reagents?.total_volume && (!material || material.opacity < 1)) for(var/reagent in reagents.reagent_volumes) var/decl/material/mat = GET_DECL(reagent) @@ -23,6 +25,7 @@ add_overlay(overlay_image(icon, "[icon_state]-fill-boil", reagents.get_color(), (RESET_ALPHA|RESET_COLOR))) return add_overlay(overlay_image(icon, "[icon_state]-fill", reagents.get_color(), (RESET_ALPHA|RESET_COLOR))) + . = ..() /obj/item/chems/glass/retort/on_reagent_change() . = ..() diff --git a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm index 957c9204a4d0..053816858394 100644 --- a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm +++ b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm @@ -27,6 +27,9 @@ material = /decl/material/solid/stone/ceramic var/spawning_id +/obj/item/chems/glass/replenshing/can_lid() + return FALSE + /obj/item/chems/glass/replenishing/Initialize() . = ..() spawning_id = pick(list( @@ -42,4 +45,4 @@ START_PROCESSING(SSobj, src) /obj/item/chems/glass/replenishing/Process() - add_to_reagents(spawning_id, 0.3) \ No newline at end of file + add_to_reagents(spawning_id, 0.3) From 5c7535274149bfd7839f9254863f0cc1c7f8932b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 11 Feb 2025 15:56:17 +1100 Subject: [PATCH 30/54] Reworking buckets. --- code/datums/supplypacks/nonessent.dm | 14 +++---- code/game/objects/items/weapons/paint.dm | 39 +++++++----------- code/modules/detectivework/tools/rag.dm | 3 ++ .../reagents/reagent_containers/bucket.dm | 12 +++++- .../reagents/reagent_containers/mortar.dm | 3 ++ .../finds/find_types/chem_containers.dm | 2 +- icons/mob/onmob/items/lefthand.dmi | Bin 57999 -> 57210 bytes icons/mob/onmob/items/righthand.dmi | Bin 57201 -> 57324 bytes icons/obj/items/bucket.dmi | Bin 1479 -> 1687 bytes icons/obj/items/paint_bucket.dmi | Bin 317 -> 597 bytes icons/obj/items/wooden_bucket.dmi | Bin 2542 -> 2610 bytes icons/obj/reagentfillings.dmi | Bin 853 -> 0 bytes maps/away/bearcat/bearcat-1.dmm | 2 +- .../deserted_lab/deserted_lab.dmm | 2 +- maps/tradeship/tradeship-1.dmm | 2 +- maps/tradeship/tradeship-3.dmm | 2 +- .../xenobiology/colours/colour_pyrite.dm | 2 +- mods/species/ascent/icons/ascent_bucket.dmi | Bin 0 -> 398 bytes mods/species/ascent/items/tools.dm | 2 +- tools/map_migrations/4854_buckets.txt | 1 + 20 files changed, 46 insertions(+), 40 deletions(-) delete mode 100644 icons/obj/reagentfillings.dmi create mode 100644 mods/species/ascent/icons/ascent_bucket.dmi create mode 100644 tools/map_migrations/4854_buckets.txt diff --git a/code/datums/supplypacks/nonessent.dm b/code/datums/supplypacks/nonessent.dm index 6575ca30fd0c..e3e9d7dc889b 100644 --- a/code/datums/supplypacks/nonessent.dm +++ b/code/datums/supplypacks/nonessent.dm @@ -15,13 +15,13 @@ /obj/item/camera, /obj/item/camera_film = 2, /obj/item/photo_album, - /obj/item/chems/glass/paint/red, - /obj/item/chems/glass/paint/green, - /obj/item/chems/glass/paint/blue, - /obj/item/chems/glass/paint/yellow, - /obj/item/chems/glass/paint/purple, - /obj/item/chems/glass/paint/black, - /obj/item/chems/glass/paint/white, + /obj/item/chems/glass/bucket/paint/red, + /obj/item/chems/glass/bucket/paint/green, + /obj/item/chems/glass/bucket/paint/blue, + /obj/item/chems/glass/bucket/paint/yellow, + /obj/item/chems/glass/bucket/paint/purple, + /obj/item/chems/glass/bucket/paint/black, + /obj/item/chems/glass/bucket/paint/white, /obj/item/poster, /obj/item/stack/package_wrap/fifty = 2, /obj/item/stack/package_wrap/gift/fifty = 2 diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index fdc6af58d22a..49426d67046f 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -1,69 +1,58 @@ -//NEVER USE THIS IT SUX -PETETHEGOAT -//THE GOAT WAS RIGHT - RKF - -/obj/item/chems/glass/paint - desc = "It's a paint bucket." +/obj/item/chems/glass/bucket/paint name = "paint bucket" + desc = "It's a paint bucket." icon = 'icons/obj/items/paint_bucket.dmi' - icon_state = "paintbucket" - item_state = "paintcan" material = /decl/material/solid/metal/aluminium w_class = ITEM_SIZE_NORMAL amount_per_transfer_from_this = 10 possible_transfer_amounts = @"[10,20,30,60]" volume = 60 - atom_flags = ATOM_FLAG_OPEN_CONTAINER var/pigment -/obj/item/chems/glass/paint/populate_reagents() +/obj/item/chems/glass/bucket/paint/populate_reagents() var/amt = reagents.maximum_volume if(pigment) amt = round(amt/2) add_to_reagents(pigment, amt) add_to_reagents(/decl/material/liquid/paint, amt) -/obj/item/chems/glass/paint/get_edible_material_amount(mob/eater) +/obj/item/chems/glass/bucket/paint/get_edible_material_amount(mob/eater) return 0 -/obj/item/chems/glass/paint/get_utensil_food_type() +/obj/item/chems/glass/bucket/paint/get_utensil_food_type() return null -/obj/item/chems/glass/paint/update_overlays() - . = ..() - if(reagents?.total_volume) - add_overlay(overlay_image('icons/obj/reagentfillings.dmi', "paintbucket", reagents.get_color())) - -/obj/item/chems/glass/paint/red +/obj/item/chems/glass/bucket/paint/red name = "red paint bucket" pigment = /decl/material/liquid/pigment/red -/obj/item/chems/glass/paint/yellow +/obj/item/chems/glass/bucket/paint/yellow name = "yellow paint bucket" pigment = /decl/material/liquid/pigment/yellow -/obj/item/chems/glass/paint/green +/obj/item/chems/glass/bucket/paint/green name = "green paint bucket" pigment = /decl/material/liquid/pigment/green -/obj/item/chems/glass/paint/blue +/obj/item/chems/glass/bucket/paint/blue name = "blue paint bucket" pigment = /decl/material/liquid/pigment/blue -/obj/item/chems/glass/paint/purple +/obj/item/chems/glass/bucket/paint/purple name = "purple paint bucket" pigment = /decl/material/liquid/pigment/purple -/obj/item/chems/glass/paint/black +/obj/item/chems/glass/bucket/paint/black name = "black paint bucket" pigment = /decl/material/liquid/pigment/black -/obj/item/chems/glass/paint/white +/obj/item/chems/glass/bucket/paint/white name = "white paint bucket" pigment = /decl/material/liquid/pigment/white -/obj/item/chems/glass/paint/random +/obj/item/chems/glass/bucket/paint/random name = "odd paint bucket" -/obj/item/chems/glass/paint/random/Initialize() +/obj/item/chems/glass/bucket/paint/random/Initialize() pigment = pick(decls_repository.get_decl_paths_of_subtype(/decl/material/liquid/pigment)) . = ..() diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 039b3ea46818..919f9aba0022 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -15,6 +15,9 @@ var/on_fire = 0 var/burn_time = 20 //if the rag burns for too long it turns to ashes +/obj/item/chems/glass/rag/can_lid() + return FALSE + /obj/item/chems/glass/rag/get_edible_material_amount(mob/eater) return 0 diff --git a/code/modules/reagents/reagent_containers/bucket.dm b/code/modules/reagents/reagent_containers/bucket.dm index 0693adcbf126..2d358f1dca9a 100644 --- a/code/modules/reagents/reagent_containers/bucket.dm +++ b/code/modules/reagents/reagent_containers/bucket.dm @@ -15,6 +15,13 @@ drop_sound = 'sound/foley/donk1.ogg' pickup_sound = 'sound/foley/pickup2.ogg' +/obj/item/chems/glass/bucket/proc/get_handle_overlay() + return overlay_image(icon, "[icon_state]-handle", COLOR_WHITE, RESET_COLOR) + +/obj/item/chems/glass/bucket/update_overlays() + add_overlay(get_handle_overlay()) + . = ..() + /obj/item/chems/glass/bucket/get_edible_material_amount(mob/eater) return 0 @@ -69,5 +76,8 @@ . = ..() add_overlay(overlay_image(icon, "[icon_state]_overlay", rivet_material.get_reagent_color(), RESET_COLOR | RESET_ALPHA)) +/obj/item/chems/glass/bucket/wood/get_handle_overlay() + return overlay_image(icon, "[icon_state]-handle", rivet_material.get_reagent_color(), RESET_COLOR | RESET_ALPHA) + /obj/item/chems/glass/bucket/wood/can_lid() - return FALSE // todo: add lid sprite? \ No newline at end of file + return FALSE // todo: add lid sprite? diff --git a/code/modules/reagents/reagent_containers/mortar.dm b/code/modules/reagents/reagent_containers/mortar.dm index fe85a5c09fee..77d192b38af0 100644 --- a/code/modules/reagents/reagent_containers/mortar.dm +++ b/code/modules/reagents/reagent_containers/mortar.dm @@ -15,6 +15,9 @@ return return try_grind(using_item, user) +/obj/item/chems/glass/mortar/can_lid() + return FALSE + /obj/item/chems/glass/mortar/proc/try_grind(obj/item/using_item, mob/living/user) if(!istype(using_item)) return FALSE diff --git a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm index 053816858394..a37325a99327 100644 --- a/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm +++ b/code/modules/xenoarcheaology/finds/find_types/chem_containers.dm @@ -27,7 +27,7 @@ material = /decl/material/solid/stone/ceramic var/spawning_id -/obj/item/chems/glass/replenshing/can_lid() +/obj/item/chems/glass/replenishing/can_lid() return FALSE /obj/item/chems/glass/replenishing/Initialize() diff --git a/icons/mob/onmob/items/lefthand.dmi b/icons/mob/onmob/items/lefthand.dmi index 2714bd1248b79e13a6f32c7381c3d67d6e4c81ac..d6caad0f37ce3b1c225bddd7476cd83d2ff7d1cc 100644 GIT binary patch delta 37433 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 delta 38358 zcmbTd2UJtf7cLq=1shdFKtMr6`cIJF1*Hi{ZvrY!K&teTgN5F^^xgsi>7Ag6Gy#D? z=)L!rKp-La;J@7U?z->Zx87MfZ8B%ho;iDF@7dosr>!JW9VF3ooO5JXAP`6;$8A3d zUKJCCL@g# zng(!Aek-FLJ+2}xXQ;`|5|h}~b%)b!%qdqD&o~0NuHHX9eRLh&zge1OR#qNcEj_Ka zTUH(!p|>+U?Rvl9;S{|fUxduHP>ouQKh1>5y|<{F{MscZiBd}N(4h>j$2BxMzHza^wn zCzRtJM8T4)ORfkxUPRPXSeq1mm3|UK{QT29pp%Ux^0f*?=hgCXVErfB-GX~w1-6Xe zlB`rZD4bt7Y*cA^znQN?>4zlnT~uy`CDT&y^-!w#EpF<#RZ4r4;s@8c-S$#{?8qJ{ z1>{LOxiUJM!KgKk$nMy`iSfE3T0&b-^1^;Pva_PfWxn>+Q(LWHlRu@d+j)n55|Q6i z0_+Q6#slU$45Uz3&fbSoB&kmEqv`(F_iswR6xR;H(U^U`W!4bR)-_D$5G4@#bC&du z^=a-leMCV18t>_JEEOf96M@XhQ(ij`9!wo+a8ZZ1up!sesa^IlWRZe<4Qv zHA>KL;urnV#|0Z4AcA8|7U6J9BU_8aMLYL_Z~^N-4PW1x5E?P6n^6C>h`8?UgS}iQ0@uWY9uN7HIY$GDF zm5jW6i+yhKIoS5r?<37~#Z!s2mpuLBjaJ8QQm#sAs|GzQjv6SmwvtiE>pr}Urw6LI zC5W0*lJS3J+beH975{2-^!sM9W+VGVH&to^D@$!f@OlDk&`9mV1NJRqUo!gS|GJp(Bc9Z;hyxvrE zOYr{VEv>n=X@0eyAF_q>jAD8Y8cQ0$9lS{R!qQcxd+JpJU+bh=5}V7ArRR$zrX{ga zQWI5Atoh`&pY*Tr$uf9w3+OdEL}|&snTzm#erq96SY;r2ls4FF^>-t&#|}?kl|x(G z)5a%PuFY0`CDwN!)m>2MCCc3y^!Er)7g9F7LH5ljm*LyNBC#+-q>7aMvr0i-Mu1<@ zhP(LwfQ`TUcvW*eE7Z5;1VC7a#h0f~w$=oE?6%aNEEXcZhDtCR$m6mck8v>d2q~m> z3a@--$-q+cgj?&jjciUmDGP>ygMCgD$;=<4LcGvVL%#yQkN4*|&$nzjW1%?F6mDiU zGW9-X@Ud@l<+%AL!i${Lk269l)wp;2aD|*dRn!S5cBH!h+a&r|Rh>QDpJc1R+JX29 zQxUveQb3w?nBHcu&-O#`l_zhlYQ#j7ke9@6$cKIs{j9sFS-h&RfGHn7L+liuMX{6- zt|$I<8%zncv#F}QoT3VJ>T6CDSO_-^pQun%DqKpCx^w&fgKK1DJvrG6#38hyBjwlM z)#QBAspjGv(F?n7#Cx*6Kyi&XY~qwR=GpCMn#!`Tg6~}ee_dQePhFtEm#fNME=hud z)+?y6U*~Hm_0Fr{+2xXXgr@E+19<$=dBNcrGa7S=jAL zkAayp*v=|xc7H<|gWNhP1o>cQ6MPzS>H9(*U5VL99T3%waxJJ$*b+shKC`x!vztMT9HFys}m>rERdIU#G(+0{}o=N+DB&T z(@h?`UzBWhnqPHz7YscHv%vqG<)MVf&J!3A$vAbVB=eLAQgh#*1Oj>IqD)XN{q*S* zjp=c-=l%jmNh=f^d!A%4((=49D{JnHpW5yIv`rYz7bry5o`*dW@tza{xmUmg^>NN8 zHK@7V<%AJRF7vu{Aq&%AS>zLYlwp~7%LHWu8#7tfzN$upZ=r zT^->8V}OH~-8xjN$+M(&qDaR!-qxFQyb_s(3{M<*SojTr_ecs;TNT(ulVdsNv6wF1 z=~1`1SxYJ+cCzcTq5TBxN(5tX4uwqC>|UB5P?{8dk6kgU$FMJ@yQI8txpkcqz~efN zARcdVE5{bLt@+O_Lj~^}8rs@^>?-0RuJ0R!lJMAohyu{9Y>?uiyjEE>(sa?K{)=|b(tgYJN+*&t02jB&mV^;A-`qcO1c}{N`K@J(TO0FvjiHs@vS|RvNmfseE+xB=93>`k+>;wUDPgahHmzX z6V|0zsR{bF8Dz+c(iyCO;hd?vcP;bkk}{k@^NwYatrm4egKve{&05}lc+=FR3M zYG6D2PjMsE+S^RneoAMx-j}g$zy$APNJd8m3Xa<<1U!Xr`z)UYZBO>fpiImZmcT2+ ztK~V$!v(*NmMVe{EIXR)dgSLd&M?nRsx(Hip`^1T65dBelGrhZ^$*SkcSr7evQpc7 z>RnbT{hh+%X`FofKJLz02>DreBy1KqYzx&;r=^NX+9l{s;w!)cHX^M1=Y-1xY4BHA zg}77=)tOj#EbI{i#T@Q;UJ;g)B9Ug`@vY04Yw9q5G~2QyakMhO*S4hvlpRrTl?=AF zWoGpz2Vwg()Y^O;RID23;fFRu)y27};XE7d@p_xMJ)=DV_qCmoCZLXrdmeupaV&neRt414_Lhu%yUr3v}npCeTbjC4hImYZ}T2Bi=<1`MW38_u76NYlsr)?*cz)k_pzTLxV^le z{vSzf?`ApNW`guEMTQlhC50AbrX+)i`S60-u zwW*wZ+duUc!IoF84P?sRnkjIKd7peMJ=xM0Jk7lp-zBDXJB1tPn9e+Nf+VNKSiTLI z$W~t~_gx$ZXl`NfgOxm*47*XZo2~5wfLP(_O^81u_%YS2%AuQN0pfO-pOt=bJh?MJ zZgRv3ft*|-y4(7bhUQ|x!UaOeFV6ngaX!?-7grG9FaJp*oBNwk@Be>D_}BRNf6VfK zFXVrh!(T&6U|(~2^;Awaijw?dgoey%H$icODD-E4=KFUqIe{r{g}_4%Xupf?WlT&+ z6s$Wgvns8K>DCe1JnMy(fJm<(ukmmuxZ#qZrAhTv>1{8aJm6+ufP z1TAmB#^DO<`B`9d%D~dzo16HxlEuPqX8BVI0NvN9-(tOyk_ohcAQz6uEQ?2sd z{M*@ZdfE4HFW)8mO3c2o?&W2aVd&#+n!z<^*l6T6oeQj!#wX0;RK*H)85PS{)AZ~g zAh1b~Sz4b>ZF&{Cvv9!(<8+(LRW&TVFb$a`dl}qoR};h}rk$d4V|bv2`PWrb=(+~X zZF5xM{n)pIy}N4gH|>GSo1^gDvgN=ev(vZ~$@QqwjOjClJf3g~KR@+R(wvIbNkGw! z5RN&h0PamNk1(`}*iZeu`I0ow=hpVvi;Psx7n?Cm&HUZ{iSOi3h7S*r?BnAJ8#w}T z-bf2Csd1NQ9*V!dEr;&Fx?M8L;XU0ML2T0d@v-q&6qi%DWs;Cr*tKjs=uJ?&DsWL{ z`!VtbJUQ#C}&+WBC05n*QCIx)|UQ|o2lk;iz2UaO*NQwdyuL9s3E!S zC-by~=%i6vQen-?LbGIphf}TQ;gblIl(*L+AC(w0nOlpr7pMffH)b*DwuTJFoL#`D z;ij?rKw|Z1Q@(O;X5LyMo6$z%-I}GN=cEtdXa^gaGZnGL1a+g0Q;8D>8 zMEZ3W_WO|C`G#ga#SO1$6Oj)-d4iNF)c>eisYHQYD$y5)DD#W0Fg;a0%g~mJir4|a9z*>lrlRb!fVT=CwU)Z0C!A>2*bP9LWJ)pE92zq}Il=x38` zrbyCD(fx7X){AH?j>v-53IcW!cyp^779W$|o4{G;3v9>Dx-Nc)`i>F7EFY>~=pl6HgHI0dI*BvEKG%W|VQo@;u{^?NM<*noMEUl}QiEJEw zDOEEyhq>c;HnKf>xy3t)v}JP1U8G$4K}^}7l=@0Wa*b{OdLG5&H_==>mgf}c-yT%WN=Zvn4F3qyf>O`pVFxgDxzdC1@VOP@CNi&~{7 zLV~+i;7z?GOD+7nIvTU1V~xkl=`dh*Q7|d^3i!*_B;)ft3{+bnDtwz&q>H*2RQNKvv zd*^>CeVc)TnMEt>hMUar`d7u5-b7hee+`G|C(0eQn~;^iW}@x!7bizs$UiiHO+@5^ z+x!d?@|qcR)4{Th_Jl1s7VNtqItmx<;V;Z-QeK4qp3n3^ej1bm_>UkLazuXnxly11 zAFBD!{2@!gl;q#`^}?9yBOQm7(q~{^`R!%ujw7!|9ETn~B<~1CV?kpDnz%OhWAz4E z@-2yYgMB+v43kQ;N6%%`o87t<(u6FZqZq{z!MF_PBIOO#|7lmjlb4DPs`e?0PM1^*!`!-kENlT7NQ|K&UUYG{x@+ZVo|4x`Q_)4gE zHfLfwtFKrL-|d@k4|>Mw5m+1_+a5%rFA?~el%i4K$~_%F?_T{p4zeN z$Tu%3dbgR<=ox8iq*qmGVBe;4>drdsEfb)GNt8@SBmgTiROY z^|5P<-&g9I9_o_R$j4sy)AsDyzOdI6*Og=bKgH741dg=y7N@&$JJaYMVcsI>|Y@sKI#J| z{@+j9l;_nxEl8>NT+ zx`^ZqyREy)z_LAZ%^3OhvH4wkU>7_gi!^h6hp*QzrUtuyZ~=yeIezWdWgP8H8{Zt+ zyYqVOPd3cM@dKg1qT*SV4X;&@BgYjLvT~^4{?*W(=_YQ8J9@Y=cyH&Bl}fp{wPi8f zIJJnpE~Bv4!9K^KW&b&RaqS<;urt|!zMVSM;%jh>F0l!FB6`Z}R9OL3R0K5HNL|9m zD2Bl+%w>iQE2qXPSi0GwZlA3kn`^>)8aIjAixsPp*RM6rG6iLpdt18dg6CcA zfXY)9nuKxQ;TUHNcc542DyN!crn&uFzjIk#t{*5lMQ<_440g|<1m}qK`wTBSH`Q(S z?P!#H%XxLFdG4_UWr`L@(bhMU3PsbS(nYw5&QLdp@?duRTLJ-_iBgaXlr~%~`FY|w zKC@BeD_wP3=M?%(9W9|%Cq1hg5{&cu?GqXCJz_Ihr*wb?0#HsCXrz`+z#G+5g!#{K z%N?wU%)%e%K5nzGRj1vR$2%wMLVd^WQ^K1aEauL4I>125rMMPqMm5R@z9@Jjts}p; zyAd?!!LLqb%@PH%^>(%)7*=e;c6VEo)g_pAFEnk-KYN`caqK~5)b-||h|KUNGt@R*QTL(k^pi`-B-h~nHDdBB(78zymaCD7xaG;h@^)+iut z+9nejxsBCQikq`+9JW`!`=65_!96}$X;Rp}SLVu8Ejr>!%`yJtGQnc}oz!uMWiI!~ z^y%}I(KAt^yB~8TZW(Fwpqn@{?tRfWA59zAn}~f9Q`Pa65|BROvHmr$V4E%JyeX4}l3lQ1zlt!lA;GqKV2Pd*i%{NiK_-cB_7C}UAurx>(NcFq`7&>$Ya zPwK%!0LFT^^OH=qM*Ozi;P)H~Fp34iv0gbADz3-MCT^cvyKiZ3qRRCf#KbZ%oM$|m z#~!q9I{77ARSK4wwA0&GC{ftZ2;L;OoGwqzqukA&U*@c|vIVzQr5T}Y4bO6Th%RcJ zm5Di5A2RHXIy_!Pb8EVoPF9V0*$<3*r>i4@8$U)%^vhMGY{2N{s+70G&;#A+PE(YC zGgOX#;LBASBdo#W#_47`e|f{w6-|uWI)jgI-gkWK z_r%6+>X^PH1KTsb82%=;xSffN+rh6~Tq<8ZUb@E4dhp}B$a3pu#)IX@8bRjiJqB?<)g5?r2_t8iS}a?3jasc z_1GwAa;H^QT0(wFL-iS8v0>t37hmJReXF4*vnz8avP|#g`c@sexV{O#{?jJijsA5z}X&;U2VQPN=wmLZ0CoqrrIh}vPj^b%{^fl;Q#W4whx&UEU<6VoH;@viT z_Y-EXX(hI&J*9?KODT3`G43U0!&bI$478Vw0 zS~H`g@3r`#^-KfyNX{_yhN^VKzbtw@SNOjIxbs?B4K;}=3HBU_wBLlQo9e*LgF2hx zJo~!ZUte~)17BsIAFcqU+)LNo`ha1m%?PV!|2zx+tRa`Seh#2D(olLultHBr>6@Q1$os@CO1CL4u$cmCBadpG&HxDKAF zA-MVY61~wdnE)NP>?t+J^JB#G(V>p&$H~IXG9jLqeLF&Fhic(s^TrBXL2V+vpB6%C zxmf|2t}~R)GVkkczLw{}Yp(P+(XS09PDzF@`CTsM`&X|&R8dvU&&yK)8v%yT(9gi( z<0j6T*Gu!mY|I7hC86e=`_sK?5QykU_8bdjg+@W>qnKcpduye%ItA#W4ZG-Ev1=;U zymkMxsoMiB%TY5eK6Pt=_$3pMf3-BsEC_#S0^u%#NWL@D>gh(UVIr%+}h2xaTWKo023 zQ*ctL>fb?v!`T`Yr9>j4Zc63Fi};^E6_k~fMCZ-kK77j>lu2@bPG}AsfA?zmR^2pN zbI>&t>c~qM?)t^XH%I9jrx|Vl+$om#CS69~fyi=P{N*pdaV=Vo;_G04xgDzP<1Ur| z*wc&ogOhB~5jhM@s@b7g@~7{?*)?qi&$A)JlLdMD+KC|={{kEY%vWyM{oJF1*>*)H z_!|!6HY;nL;OPBM7FF~ccsh20$Fiv*@(Vpc*27jqYV>EW zY4oSSbI3nxhgLbY4m6vdPA}+UDrF7b%p`Os&fvVS?8cKkyv8QJ2ohe7bFbr1(Q$C& zx*oPDX)e~DIw@kx$%PhX2;~zRetzCFvjv?e*-i`5qPnJ=1W|+hhmBx}aj**6CnEDe zJ5@yAB*`5}AlLHQt43Ip{x0@V(-m=?<~mr*?a3q(Y{mxJ+Rq!6e2$kg94t4J*|&Ct zWZmGN^S7c2TD$qFar5#`JkjgeV(kK0zG_lWCkt>_@1(T8N5b~#(d@Z;nCp4=TJ(&Z zkmKl!+pR5Kb$B93;s~VgcAbNRYfDzP4CIA?&uA$S{G$+`vN~R6B_{MlUqPJkvJ|YN z{dBF`6%5O3saomV%8GV3X2i$#M)fC=Ml`7<3iU9Hh`i# zcR}C6DURQaq!l!`x(Ma4g8}U@=(zHZK{mG7}DyY zK*A1Gk$3m_9Jc9kbeUFCaGibtpbH0$ywD0pqB>k2G?D^v#l|126F+JaXMfZMw_?vC zdUhXfS|L61Fpc!+XUiTR@@mb*#sSBB)a$DSL1>RI529wnDyxG+iVsUob*Szhk*rrlIIpZk6844wa}E;>ZaFrXip=^7fwh-OHEz zc{C+J?C8a2ZwH=_4?$7uFd_~+Gwu&0T}eGAck3Emt=N(hBtE{nN8o+E8n-yr|xmhCoVm23&hNL6!(I| zH;QqV$G%@u9)AerkV?^-o7#*{FWuIEh_N_a>2q;LgpF`2E64J!s@U1UTW3z(#undC z!)jDyj$dKN8$OSG&tV;J_Nt<3N5ekkvL+O>p-0&tmu7v9frGKuTN#>M4p7pfnGOXjj(4QSk`zqrc?AO0zA;gn(tmL{QCa0GtM z>LXN}lPw<UQtZSckT*<5{za(;Uin-9n zucyC1F~KDdw@4!Mtd*ez)U-i1$ivWwk~GbBR$6Oi>Z144Xq_N`mZ}D%X<{m0-%$hp zqpClpd0!#TZu4#Mv$75b%Kh8o-~unQcaaAaAe}!anF|$bL`j|oqxa+~xX;YBZ71qN9UqB#;iugN#Da&7@;~Rzg3vWQ?i2q}T z;z-}$jQeA!0L~@20LpvqWz4V_rL+o1q!3EJi#$Y?=Bw&#c9*H}k2`Ulf}R4G{P{0} zIAs1|r?2w(Ha^5)C>Jgq{T2>$Qg@xfOIk940jOAr1y)+t)-s%uie@J&muY2+J|ZD#rt?2U+1s2c!?bcopa}dPZZUJ8Q4T>*>t1o=iz>& zpO9wNbJ};wO=aS8mQR6eR^@SLESo&)q>Cjh?mEXZqlRG8hXY$*IsE~7@;Pv@^MNV~ zMubSwr%8>)fY3W?ckTL%1>{BvfGTMun+841EPSm?juqwCv7{01RpV4)KQ`8R(xK2Z zo#s-O>B)TfsP_okYPi7B0^NgsE=6R%ym>PKw1*KW{P@8@?kG+pQfc!xoT(*al-H;i zyz5E?n1wdZcP^VqQE>VfW~P?K#>R%hYMGcRtJq z*E~Ub$StVmyX0GdXiF^Ap%Lt3f4D&J)BDl#6>ADTncn`yt-6^66PJ{f#EDmU9tnws zm+w%i;PrOwunxv}SLF%%({m4mo0s22b>%-_M@^?=6K^|{0nd2cRE<)UjC{~>1{-Lb zVONR~)Qg>gG_emogz}S$;iL$mhnNje1)P_n-xY400?EZvjL ztr;c0CH{j>? zVoO6^J@R+5U?C3O1uFZO_IG@Yc5AdRj&wJ)E6?|D)Vv<2q8jI~gz-eHC(GzD$Lia) zY-x*`TOM^QDp-^S2lE)XD=h8bpiMfh{0ew9HZ0z5IsO%B;4J^eUn!vF5YP88D*K*V9}9$Q(H zdO`WuvL9E2hYQv8la8kDMX9Aegiq88alK0M2VK*VLKb*TKOKUna;xAQ$@-M4OpJpJ z3*Rtd*R=tLm$CR>X+rI>-+QpGXlLPn>RlS1k zi{t(<3JGa%&a#4@+pj#}{5^J6Q}w(UvBTIdEn*c}5K_B(pVUdOmAmTf&Cq@9;lYaG zbgc(B%K&VoB&V^@6?L524ZtP6YXkF&9A-FDb*^{F02tnPrP5m;ZQ4mgwm@ydvF#|Wk|&FKjdO^e#r z%{@CXM%}IT_6773L?OG3<|C)3khDSgN@Yc$>33K7L|P$3ntMU1so`xUQnXsUD$vw8 zdbW%+4=U3zI%!C7KF_xuh?))ALB&ZdZ%i2@H>=DzS?qpclep5YA02-H3lF*gQz-An zT=ZW+2Ts+yb`z5R9{~T}Qr-OvI2;0rVf$YV2N~ABi}g)6n_C(u<_&im{zaiVv)p<> zaMxFF=bHXy>=5;T6EA}W_|u5pZsYY*NI(1CUbFi_!*J||rOfbW>!L%rJ+rv&*S9ZP zL;!JylS@5v8Kb^63AO_feRpYnyg zs+f)rUFqNA|B>f!ORDg&_e*8fEyWmxP3~GV{kMKgCuhE>pHP|2|Gw=)2=%3RkaE{& zZ{4(W^wuZ-asVIU=P<`*7c6mzAc#_dC#Pq#;et9q2f7~ckZie)x{R{h(Kf(r z$z$>SS}^w-p6D&@1wtlj1x`$DfBmMf35=o_v^Id={32Vs0lynpm~A7nFr>kj7XaKGnS^gpCGk$DzhT_V4A*F5XFJ)vg% zAKv1iJ6G!v$wEXXxN6o-eSit|yyalx{`!=2VcO7vwU$f0fsv5yqhm=d0gR+cD4Jz& zu>VrsPbBofGysNPUU`i~M#2egi%0T$$*{vWeOtDhS%aoCst)1P19+mBzxHYOlst?^b^XClY6zFr~FH?zva-C6Z$LMB0DXT^prR~IoKlq+uMPV5Ymw)9 z9!ejU&R2Cz5P}u_AU_Z!hE#`df}9pu8yuzV)3y&`wsG21os-?J$D4Ov2xC@GzMRSb z6(e(T^(N?PQ~xI$f;O~4Y2#9Q8C0>yGzR~Ay3WOABdQYZlqe}UpR|nfTLsp*k=?~I zD&GSgmlIIr%8#-q$_&5F8#ipCHC`0(4arJePPy>yemH8WUzk#75#0rIwk+c2pE#cE9NsX z)<2b;@WynSG}a0Wy!Tf201$59J|BaW7ixPl0Oaa4K9FeAn$B|Ge()ahX*20F&xlY- zrmKo0r?rqwE^c$y0dFeJJ@o*a`96-GP*>JZ%Ff2;SYFw0r)QoXb(qvcFwP419-Y13 zc*+!!0Z&aL?5~O5Gf@|Bl;c|;QCKMT*2;iAB@u4R5&(XCv2Vzb; z^(?rrY)0Fe4(W%useAR69Fb2Z3BRA=pxNz;Z_1G30tz!vi+`t~>Ty0&0@4W)?7Yhj z5|dqleP_1CIZ60YgX`AfK5IhXD?x6T={r=}=Nsp!8{>j|`jsB1EwSPUHuSi4V0l-D zVP1^O4C=G~}nr$sXb7+HLu-ng42HaxVHIL`@lB|NtoI?e6H5A5jo69z(C^Rasdt zjt6^=07v12^b?=SFmE|?7XWY#w37I;S!BsdE=NjP0}F}-_I6T-atES|DCDB5)&C^_ zDKri&EQ*nzP@cTa>4K_KT>iwDy3`)UUDmY|Pa)&LIWWz{&nUbb_wwnRk(B8shgb@| zq>(hix`T0KQeT&jpW>~bOMY*b`nGjTmMp|x`qty@ZpNy|pqt!#WzK;{>4!eVZ4wvZ zaNd4f4v};3FF14neI<61-xBN7%XV%8;=q5tPOwP)vq?5DZkHSkA-`w4nl@-~b8A{H zQu_4OvV2Y$s2|x)7V`(X2Yts9n>cn@2`Kr{U&-~YcB*z7dDXT-g!_t{Br_SEFElpo zbeJz0SIEx;_#m8YXS~iDHVU;F6HquT8ms4aww@Mc7XDjGSIBlsZli-K*0D|`x+-Od zN;RET2Dg{|A``Fu0&~f~jw^$#)XDxx2{M#qx;e5V zT1xd(ysG`Ur&I9(W2}vPVq;qtOKnloOSre9#IbE z0+o&3)j-Sr>vXh+B%}|DH=)pk(tb1c0rhz@Du};Fj?^uwwQ|D6o1EJ0_0!5t&j)&n z0Iv<$zlY=Tn1({wLpAY`O7fn%Nye@%v0WD#QL8!syaSmjcS!k3gGeqh1d@FZ0DZii zg`c7CM^YL)K@Q8@2v9`jZ_u0R7|-@HS&Qk3B>>2oByJb(x8b2xBCAR z-}C=Vjtfrc|DQtc{cA-6WRQV3u~H_3wP#3^W5P(Tpk!9Iv?9K!@ffTf)jUq3WOy=BRt)vmKzNWuc}LI`xR7%pyojF^|W0(rs&?9saMJ zT%gA@%P8#nwUU6vibD`ynC{ubLx@JiZBpkwT%TAr^VI^_Nu}|A>S%XEV$X?mY z>GUZHFQb1Uxm$=?<;a`gG%ptSCj$av(zW(~>f@2!5z1cCM&0on?N z$>5CMR;SbiEp8sM1Kk{Q{$Uq6^H3di%y>#A#Y=?yYdoXr;;dc!UUIieuYO(JT(ZZ~irMp!Z++{B^b1M$v@pc@HxmgTOhJk*@O*8v%!uAtO>z=T{HqM+< z@TYl(3B+F-Eb{Z=Jv$f)a9-Q?0IJ2+J=JO)Mt)ShTyyn9Jg#ABcPT%e32BrsySt?{ zT}1L9PUtd=qEyZ!__=3|5T@m=;r=vL19l~qjXV%+V-Q`K718bomFZug_*RKi@}Q7B zZ!4adwy(Lpfv-u%e3m53wW5rEvpjT}XWKDJ`gUywgix?< z3rq(;V(2WpW7#tz^YPtPOJ;;ew__}lh0Fu1yMffiG~!#d+at2If4SEMk8rVwMqE4+06N-v)#AFStUld6U#*$5|wN($AD^!MW^WhD9^ryCNs3Pp&2yY&UTMR8X^BJA*h-nV*dLM7V!RRBqn3$ouG*41Qu8{|II2F{s7=&h=OV(CX&oYyj6tc{^wg zadLEYbSS@im6lgfkl}i|UbyMQO{n{mRsMIe-?ed;ATW>1xx^0VZ9*5qjua2S$GE8kN zhAOIuXysGW>1)JOYpO*0z1nbwPuNIYO^pOQzSRL>A%?KlFl=}ma97&5e$>P&bXjRuIPLSki#C1?VYjX>ld8zcqB(T2x{!>o=+iI~AI9KM~%h zbft=!XA3kIv@D>e@*?C$ZAiZIMt7FLnK{reSC6+i1+Dwz!3>Ndg)hHI?7qC5F9Z2x zxv!&(Y3llz*1S-qftAt^h{FeBp{Kxlp%KDt-$Kcs@o#t1?9nT7yCl~X*q?F{4;&n; zFz?(-mv9GpL=2{yi1T8Okl>32e0v{BNYAxhA2sJDxsJlZXt$e!q@?&YlJB$r zxtP)=fMG{g%b$WSr*kGXFLPwg@a zzyAX+L7S}Ig`OO566p53jlrUok=%1%94}0{KOOnjtl2sB*PPFTaJ|h^-MAwCzu5ZE zYxO=G;=N)evyi_qI%H4k4F1FQiY13FG2|`dU#2X`U|N$Y7r!V6B1-h1B+9n9H?a(H zwy{+Io1GkxYexMIMd55W;)`L%bq=hom9`^X^g`b8mT&vA{(*~3o$m<1MPkA`wQ}yV z+yTp`R3OzuYoP@nCi%U!+_+8xlMM;JYv5Oi+{G{xZQbcSWy&t~Rb95W3T3~X!;^0> znOGSg`=XocQ8bRn4_s6R>Z@dirlHF7kR@wiCCq?&$P=VfLm+Bk6g+`FG10n~w?fB3 zoo^r()%Nq;!YmQ)CVAoYbK>bm@~e1^-DQD0)dFzKUh=Mb&h(l@v;_Fd;=!Jne~Nf4 z4YlqGOawPIh~3@r$g3>nNp^j$)ddbp3h@JV*$w*8UG$wT`0^T}C^46i1A_v*Lq={R zk!Uq*gxh=k*|Gk`u8X*B18=nLJT0i26&Hq{Pfx!%!|LZm5|n8N1<1jeW^M9lW-njU z?-*xM5N1eK_8UiRJk8f>6SdELKALh$DVU6VgmRpCvWfd}O^O^&S$9w^`@6&@GWw0XtGV-|PN8v$N5WLaB7 z&!Yy%9c6>IdMii3?!isw#kbo7|b z__7U}oBzAD`GsC5kI_7gy1dE+u%>H>Hn}u+`wRMvv`c^U#g`%Q9hXI3G=p~-Rv0)h~*tuQ3Om7AX-1@bbuaj z#+)e>pnrCwtPdx4X_80daK+d+QJr-}l49)abx=IG9`O~Av$HcRYivr2w-)%_$}Agz zrlQ!P;MP^wzsS4_lUdqWja^bOXn~MxUv?WzKxW=%3>RmDn#8ek?=Q}Ssgmo-3#MjXU~6Y$ePIBDUGpGsev~>t0HEw|6A?9BZQ(#vC92#Zy$v( zVagd=w+9;Vy=z+{Sz+35qN5F^PKn#fK`7c|YwWSl@GrG03Xtes57LwX6%`eW-HetX zaK+LSpUz08s%d5ooN@@2-@v+&oTX9J!eSI6C08@|`EroFK0afz=2K5Kb4O;p=MR;w zKQp|`=@i#lPqDyi`zKop`PEfKct2D^4)td6;ayXEfm0I59^0&R3SehCt~^@C6m#bH z>eVY6su;EoMa)W{@mx31je0MxLA-*#+5t`*nAat*-r+DQNmZ7DHBvM7g$x@BtH*%f zF8v#I=zMALuqHZYTB33q*N!u(v?o;mVg^N|Es0^U!sky==tH8}zoi=4#ll7P`) zaD&cG{s&R!h;t5?2K*s*=VO;fa1~coj$6SDWM+SdZP8q;ISn$JfQ_&aQBPPAkhAyO zQ!c6XGiyA)+CAA&*Y5}NvMA~G+KBG?a|P};r~6oT5pd6Kjizgl`z9OoD;Wz%8~MTV zSV7v2KV$>DE7Ow-oXL9?K@S~)=nTTSIs9zmO$$)#hyPLBzTP7J0s)c%Mx^0V8j)Y_ zr(_H|Li`;-RxX6-2?t`VC+5<~6Cf7HW%oY)W8*4<@CZR2V|>7&JOEc&S)x0`P#!sv zw@}oTp@P;~>K%%ZnV1xv8v&c6<%iq$%ki*mY@3_>Gv*rza{Lv@nic1KhzW!&XAn;f zjFgdBA{OPZBE<}^g6j%2{ZtEhq!xOkHPL^3sA5D27}5}7o=LZ7c|$S84gq@@o9&U0 zn}LadDKKGo>3{I{-eFNR-M;9EA_@v3Nd-j783mCHq991lAW)OX6DxTe&4=(-*fi4_m6XKKhN}ZS65e6S5>dIYK32aza}#w1U#f( z5r6o6{?VhG*{=$@@ zX*lsWLIl7+>d9*)RCW6DnZe3Q({&x?--uvc)`C7p@i=idE@?Mg$BrKm+J$QBHjb-} zv|-Fm*jGj8oxan8a4icIBQr5+twnRD7hn9m0)ux^X8TGI@pZ!wXJ3iNlzT4bP;>dY zf3x-YLtVIZUXk02kk6-jY_iKcA3Uk#WC2w19*#E?dtuR$yW=`6;j7-UEd>`J>6jJj zR`Nw(1j}Mre>jMD`SpD_l*OUpcE~_)gNJ`mP}mL0$3`AzzL9eNdICG0Wn+GFw8K*rdC>7 z@U^8oxZy5`6qv@Sd1Op9yVsbefI3pttYGP)76qLqpGtRi7Yl*M*)CBo!H{<*x_{|C zjpMh$K4o2|_mOIjfl#M>ja$3B!`PhcHn#N(qup*V{pg2-gOVCZ580?RQ`>S1QoDwm zR#FDKj{tv0k~_N&(yJ1ID`p_AQrIVnR=OqR$X&kF9pPnI zD^hCw9I-Na)u`w1F z9pEgC1O%;++&)!$y*a~kgp8*g2-)5|>eB&-%u6N-8--Sf#7Opvj8E?D>oe<94F=TW z`=2Ou$-iw(R(Hi@D{>o|zB)`99|ea+(8i=^hqN1hoz0;bsfQp%rp21rpWJUhb?P3_ zul7roz2mxd`I6Vw%p&C&3nJDPGXLi%qh;q~Wky+Tc-FjC4kqsip{69!=+#S5N~aihXT7k6H|F-M*@|w33?^vAkuHl^DwM^C0g@^!~=kSoEN; z_W{+4+Pu62%K0m5pr7iISeCmQ4xNZwfZJRxSaSjXo2Cbn`>|h@ujblcxnIF|m2c{0 zYND`)PGh{)2Iv?4sxFAkM%Lp9ZB>}CvD?*B?R!(IAzp`hk5qPKCI#fYWn2?zqIU1+ z4=xIA@Y0W_kE9e`SokpZHgYo;+WgYqp`hm2xGAo+F*H$VZJbHBv0xT%gF(1YHLR|4 zXfh(!$2D`>8|F3zEqPh_%jBxXT;mEffmqelc(&a_W=!@S(sb-WBG#T8)Ql2y1#ne; z{8h$Vr-V7iKDQky)Xh&ie15R1z1nuvr|~?|NM}ycZ}Kr1)?^c}*o1_f(}T6#!NI|b zFirP{&ki{UR$9mlg4|rjYkKc3S_{=N*TX)V7|rePA{ZJ6i*9FUXLF#_lM};7da}~O zX@yjJ?1xyP0;g{Kp{L-qcdzzi{Q%R$p(-E{*)&M4mMm4Dhq*)qpn`9C9B2 zfRa5uj+Xs`6-YhAE)LCk^6$j*6W16Scn;Llry5<{$s^c3%`)}-~DfJni63BBd%x(j1a`Iow$ z3hh_X{ix~*vhM>~V|rr&N0$L=OCYf4ZVQ&`A~)`TJY|*@emgO|y}`DB4W>r>R|5)z zF_iz%P>8EygSm~lBpJ+&I7t-!KW+YZ{wBPMoZc^|EIv4MJ+2MH;yd+kXe4a=n;Zle z?OD6)(OG=5R&!gW8JL(WZfWwBj1tlGB_{l*7*1Ga=#dv-=XZpE4u@)jYaw~7d-ILQ z$Gcx|cKYQI^{FixOp3b>16kwzU(@kRle1tl0SyHOnbna{>;Evt=iNs3oP(*?El+UE z;nIY`3RWM4JSJtu#ieZXCH>2YPYC<$g@2Tc!(OR9MU3I!Jh!ynpujN%PkX z4*@>|0+<>T-Z0@1NBs)x(T z#2Iz1iF~RG4!Xr}{`cq9@U1O-?oh}rLUifok7D3QZ~MFHt@?ol*yFwG8`p~?PS6cR zhpdd#DO0G5p5PsHJ{x1khI>Y@zVxKhhH{REJ{+f%9hRJVIXS=K&mo!b5P|^PcT+$+ zGEJfo<5lBU;8zUE^`)7PUFJ7x80|48PZ6++Nbq`1uX8IByjxG+U&-IE{m_!1HLLgj z%FXLL0Pr9)sL}J{$ZDjnf!OQypn{(f^kU{fdF1PPTp4i^dR#}u7)>u(?9)hmd()?( zVC4b5T+_;}(B!Eb)g28SUpxJbRuGsCFTX#F8}OHKVs1r{j2Ywoavmi3dFTo+hSYG*sC701hG6NvcuFkbpXe73ag}R%@T1+TnKkpuDdp zMD*r3*{Sw(cbv^}A3LwG(;OA&ABx@Poqxa4cW8xfv&@1WseUl7b$&N%&>U>EKV z_}h$;HA+bDx3o@u#k9~1Sli=rZgMq2bs%h8q_%dj(oWYC7?~{45%jyWp?o1h!&r%E zVMYzM2r0iDfp|MSHF+bkx*a&jv6mxm;*L2GMD`_VFIkaCuQ}F8F5Wz+>68&hho?Gk zyu-rZph+a*4@S|(INZZonVTX6Z{`g>j7kO+OATXJFhsCB(_zSK@F@WG_5La?>!ka7 z6u$L8!)b?Zv30hS!-orfyxN9sSBpMz|hm8k7+UV`;_xRXPVr+ zPP`rTplFSt%RQuow?-drf{eA8yTP_XU>H0oqOTZ8ti35Kll7RRV_>44`bBcO^JM_;vW4QqLGAq2jt;HI&iQw$y@AoHnb|vgq++cpx{gXr`ydoXG4=*Z z4x(aFh&xo>N)oVAv38~?yri^vYujTp*{1m;7aTd?qw{>{Cvp5L79~@ZciG#qp0QtM z$BI9JXT{M4F&5cvvHI%=7}#b)kB_e_b`&alcn`nb|Bu(4!qKMan7GTV+4~RREh-y= zFJ}6_8Ovza!gKEG!rt7w54qXDT)V;cC-Sb#PN3kx!@6H>KQ9cB(YUl6lDR9@1h#>B zdWk}_jkPMmNyCfA_3y;J#vn;V2fKFJ@Vp~YEdlI~C*|+I>3U6+|776){LgFHL_mxO zPlCbz+XU$UJj9P;1cr4pKT*93^0KPJjd$ee@zf@VD14dIIoG`)5|^G=xOvkK+E z&+~{=QX4Uja%k&#VADHUoz8))!+GnOJ^k+9hIOvQdEa106tg#7<>cWQS%Al{?N)cX z**wdSX7dBZyqf}Ku)?n3mtw`G2UKiB0nG5OpU5?tZuU!N#*TDI)=df)9)ElJ9Eiiu z4KcqVZXzQ?J^egG=?6C_uSTMTT9K>_HF6I@`7Ap4YxFf4V3&c-E>d|qxJ}PRRq1!+ zDs<&42pyY5Iq_fh^!LX%LlR3+i?ti;l10_DFH`sqq_V8WBO5a6imh;e00q$0i7U*m zm@-UOY74#Y>>uU1emy(gPY#+-pX{dFP91r^vIS|+6G4AqWs=VR_fA^1&%0GqOpan3 zP1|yJQ8r<*Htn>AvuBj9EN;1p!?@|3n1<4hd1NBtb?;qNSC;vf-P<3pwWCf{^wmoe zQd&?gH~19j+LdRrJ)c$bjH4|O_vSZN++`YZBT2LOM)Zu|p6rXU>O<7^ZM^CeGRQgd z#i_HBCM8m()^9x18!Bz5(EV9EXUDCQ-Ry|xl_t|F_FTvtJCzkbIv&hlEpf7_B3%G- z>fb2#M%Ymu;`eF=Qjf=P$t`yl!5in9f623+{jz~$6`ja7t>4^s+@YM?CX(fhXto7T zS5i#VbaBt2Q>q%WS)lq;jq>vzbUIyP# z#$E-_b8d@S+HW}A3Y~jrj^5h++sMI=~}@-!+xq+f5$vZs7Bt#$rd&9 z=6W^>F|jR_4x~Hl%VQ+`Z?1fmwGojmtXJHFT!G%iVzSDi%%fvA>qz$MEL{Y=tb=vI zC@EKS1>SsRX|iGxjx=&-*mrx5oYg*A;DbJ?)oIki5uQv#YiNw_9S8TjLfBdO^W6KD z(AG#{ViK!s!{m23@9*5YM z4mb7D?psGV9}O0vxF0h@pF(17n&YY)ybl|le3Ivg-b+|guA5YSE;|T38DDYyV8S@b zsloIc7WME$=yyQw6?AkGuFwhJ%jQ_VIvY@Pj2)<9SkXF7ru07{ZB9SLaI7%yBqGnU z_3_OgYLp@zsCa~NN!9_4PjrPC_7CDLVGmjZr;bA{q5Je?W1;Zq;ZxAHIPXnbPWY}p zFzX9>R-JCu!kH^EO069aOxq2v1@gDL&o%4#gfdrwm+)NE=hqt(BYuH*Bd)I4Tiw_j z#*A+2%V^yCaimq8jbZlBW5+Y5QpTRh#t8I)Fi8>e#}Be` z$q|3&IAt)$@&WEAAZ1nfQQ)gv=N|{s(FSUw(vB^Znn%Ifwjy8n;k0*OgZ>Xkv6dvZ zQg%ZetpJ08si<+keU(sA?M{i%VNSdh_Q#x4bzdFn6j!?gb#YGCAVf0;b!F$Sm9V+S zxp=!%!7o5MGUhweV=L98_Hp5LQqj2y^)%&Ib7swN?Ovo2!QD5foP;&cqHx&iAo&gJ zq9bp9r}`T}W-HJ%fB(D;qwMCJzc|S})cWFANY~;o-XNoPWlZ#jhvOFV_LN)jA*%I2 zNPB8QIjwki@EY3?n36#p%di*n+S)y0rCze-M-V9REYQ8o$^Ka-vV%V!{_z`DXf2*Z z)~UZa0-c*#2LMQ7^l_PA{a`_@C*-g23_#Ay82(lFzCM%%s}4%Epl0flKc5< zDT8#`4e6m=wvBcJoJJdeg;b@d=WaWRKq4QYJb60-eB18KwMr0Ts>jmu%}|_sHBpHv zG5td1_$!QjB?MDk{6_2#9f)0w6n-wVkpplu&MZIA+ac5bu}j= zIb*P1&zR+GLSmFoP#BatQ<3LR38t4vVz-+3yk9tdT zoJX#Ox4u{4+wgP8?y#}Hsh<`j)d2~^(Qg+lKu4oO(gC+`sT?mQhpR`r5ewEyslw> zY5lCi^yA7rjP0hRg00FePW8&81!l(IIT{_xE49h17y)T(7p;QwNkCXUDN}0=<1sTF2l)jCgsBX@Q)`?E;>IscUyfXZZ9i0Z3|T>8$nr?uVPwlf$_&wjtZjF!Cdg? z{GsR)SHf<412PEJnQ0ed`u(-lgffZu0++5XXUG=fUAH?Yh#TeLUfW$7Pv+?V)j^W% zEW2Wedfh4bwFlw8R?<+aWj6jY1JzN|wTMX8&@j~Wp-Rkph#9Cu(vV#ZwZVljsm7k2^GEwLOl{R7elHa4LOKFFHBci(kwT+{F2O75xukyO9`#j6U4OOWXzi5I{o z+5L`YSWZ_y&EFg?&t1t8T^+s8 zPGS_{Tv>o2Hmip@jQf>IV!|>viu)fq&fY#prWt*c)wD}dC0{3l<$x(?w5>2>>}WX5 z4-(S~1FzQt?pSbWsHve(N0&1ty%@*~wA$5a64~~PN=!SQmc4O~65gHRE$}NCQepb$ zj|@YtfdA}e#HIhtQP1_Zb-NL`Bhw0WF-aJSn`kn+C}hK~&_T5>mOAN3IH*+y8Ecf- z<0d4xlq7QRJ{4Hts-NOpNKNhu!KdH43bEYf8JdP&coh7JrV}(x6h%)yTshWC#W-tp z_y_G#eP=X2g!Tg}&-mjBaGw^@bi5&Hh(A`zdbI!4y+zOP{kfBK{K*;x(%+|lq3ksj zIxIXB={+@T&gX9=uo@?^44L2}J>U=Uwtlq+)Z6q9KelGqUghmbsFRwCjUjgtEApqd zQ6!*UT{vZMg^7jHSph*CbEo7S(d<0mx{G4Vb06>e=xq?K#_Wazdo{y{{%3bWnuW_k zkLkoc)DAbNxfmG%@K!v4bIYMD&8sjB7eiJSnILCm_6RJ>P{H?7T{LShPTh76Fz28s zj|Y@axB}1?sQ=3oSs8Qe*~xAomT{9pRw1r&HiQd!63x_m`XoJ(zzUh}Ep^0}_y`^@ znk-zLn1%K#4`@d}?0!>2Zn2)Gc6&LL)N#zny^N<^l8=sKn@-T^7@4W;L45RmWY$iu zA$<-=_)#zwEwJ8}#UBH~oY3%JSb2n$&~JPSOz+XZFa3Kd^Z!!<^zVA{695)O%+iX$ zqAKF@T-$&P@*`oOys(am3D%d9=^CyfL7H#QiI(aCEmG0`+L$Wdt20&1Jpl}Aum*)& zMy(pZx}6bYp-yoOcsn`(o)ITFzCMCHe&xvV128>9%67{AhVzZ1FXma5cHUVQf(VWU z!p(dRx7p>0U~fR{dw+@HJT*G2$^hvtx)VWrQ09flwa&s z6Lz9~tl~%O;u|<(yY9TN@ySU8qqYNH1wRfXq6WroTdEaPV_t4h{g}x+D$p(@rJ13y zSm>nHFmCIN7Yfp#$cAwI&ns=?xu2KG0Gkn;@po172sMMG(mGdYC8pm9;kv?DHr#N& z=VHvVH+S!XrA=c=UY`6iFBKJ)eyD2`i&upbHKgnOh%$#W0le%%hL^V(aU(XHD2N2gr5&iOlV4J>Dv;!p>$1RisK{ zH@vxx9WRny!m&qR&t8}%#*Kt=jtLQR}pF zk{*o4d7vGAE}Yr5xzmtG52;E`%Zu|x&j_qrn?vI;wv+Y7@Z+m^0~CvO+p zNNKaML|(XFmo-m*GE$NL{`H4gQt8Dy$*u685n+uXTj=QM?av|G9&;1om%rLBa8CbH zf<-40c<#);iyQmq;Uw)3HDlY4NIy)%0u1VjGQy{MyNQx^?zvstTy1}auYLwAo%Y5_ z_J271c3M*L>g?iY&tS?bX(d@*jiR|=+N})@2gM#$`c+I@^7R>MYQ9Fj-QC4uY+83) zl;;jLA8!52w?0>HzOf$A$e6_t+hSPZR*$DY!A9JkHbD)ub*yZ`5OZ=uer2t=M!Po? z>Z;Ybtrr|4PnyM1oytVV!JThVtWQKK;`WMut zfAcBGmdIy^fJ&{rNd7PPxha0<%<6Fi9rMA3u=Yc;d06+ijr3uXS29)59loXr2Ph4< zSaW=~bbz8uG{(i}g-zqwCXe(C#j#d6c!VMv+7h|8h=H03YpSIym(`>$6Opx#@*$t+ z%aCq8xcH^Hi zY91>U52oepjuaYlF&xLC)6bjE;Mjx+G51RSP3I+GvKpv!A5Pwme#A2;sWeE!bPjG% zp!z7W8d4*AaWF>l(0CG0sp1PM?5q}66`%#=XvfG#x)NY>OFsiQ_?q`n%wuUd#(He> zeCHYx_v^t3L3iawI^cs&JICo5q)5p+4injPZwnWj{BHB3mV1+_-{;or^Q6BB$9>BW z!j`OB{dibLMQifRxCv)@#&H3EV0tB-vhC>=6FsGeIEqp=#e34wW&)iHF zCK`MBmaFQbXwz_?FlRJ>4p7-O(xw+>Jm$u)j}mlW)bw?RM1*#(+`1rQJrLKfDs6S) zM`}$@w%6z16K~&}^gEEb{ADYw#MesuUs+V>{xAfia92niHysWqF2!yBxJsbX zk0afZ^|9*!wz_1Ab<~fG2Q8TT+xcW6aZP3`wj>*lYUHRC96{Gj9l5rty49}aB!^Y> zY0=T3q1y=uU%xUVw$CDay<&_!Fz!N)9V`Q8I*AcZ4o9sEQ$M`A5&It>P9J^VVo1o& z_sc4T6cnwA?)@cFL16*8fU1G*%@6herJeJCN>Bh*!rMRp52)Y>vaswKt_TCL=(u(f zEUB*5=*i{{3RVZ-I*=njsR}ylP^%AGybOau=ET56bVSgn=5i$ieSF(;1mKVV7=1DI|wzE$VfM{8_hlCJE zXP;31xkO*NN?-hXv*1MkAYz~`Z=$v)FI_2BuOc1I0ctaV{ z_=-Lea5crV^U(0AfyKc6Th)q*yo}%^MCd^Jm(KzhBN>u=x9-T!@1cA(JU8s(l};qi z0d8d6cy(zaU_P{;sWrO`U6Vv)cdfOW?UpA2tY)oqXmV|nKC*oG)^Nj|(Yf~H_l?|MlHct^L zrtZF% zZ&;~#LjzWMCtl;Z#mNn>0Q&{;+i)bNDhz~rHG0a81x$kaHzBEGVsm0IrnSqVcEly4 zJs3wZ713X|cI++>maPY*kdm&Eigp+29ejOF#mA#<$!$x6+zj;g_A%-xRa_&xa!K7G zB5b2BsJ%Pgigp9J;-OBFaArSI^K1+!G5)dwivb@i%35n9%ba9L{qq2NjFkgiSZ55E;C4veNAed1~Dc!iEl5NfIe-R6W-_g@JVuWg{G`6TX`wf-58M^ z^-zjBd#n*D>u0|#Vkc@G<;S1lUp3wPb%AZ`C$7LjuB>(09olv=!ueI7nJ0BvUYvc$ zMRKs2n%>SM^@+94-H*|?cb($b!^>t7jnVE^Q>l|&QIe?CNkxchYyHk+F`o7mwhUqS z0!XQ0zt7po1{E;za>1-!N%@J8MCx=!e4$Qoko2@T+r| z_>!t2oL}b7N5|=YFbXl7tiwBI>ZfHoQ1QH+fO}V}9DTgA`Y}lA&5Vd)=$Yb4thA*{ zVl3y#Ii)YXx44v_j$)-Te4ZD}^Aw#jp4*G5*HguuReerQD>K54bD|}SV|>$fIu=7@ z-xjlliR|VCdJ}%hUyH4C7gs@t!gJCY$hCT7cMd1vp+Upce|C&1X88Mc=q(}JTZomF z^&EQlDJSRV%WUnMs=ZOPR*j5&;v!ERZyK?;(YqUJI9Vd^={lyIgmC+vz@N2#%lASX z8}XNCS5_fDGQmEXZp}12o%_VQ>`z(MeB-;p;HtInD9wtate5ZpfE=TSX3(j2!;#Ko zr-!=SF-1dt#S~qkzDX$wwgTs&fnqx$9){rc6YJEVAp2i6cl%?1ns)u2oSQ6dE9*s> zc90O&QD@O1Vwa30yKEIU)aU!I)06+U&$6_jH0v@Dr{x-bnua$KsS6@cJ?%Z5hSXglc&wuZS z?YY}-c4NhY&KXTwbjdTEP?v48Q8ziPDGVSy=G0ww6X({)9Dg1R^+D#+ZSA#etz%A> zINC@CGyI8KwUBcQ8h)_Pl6e1vE5rs))|#wG)2`&p3hJLqUL#@{V0nEL_@x4L#|epR z+2VKrly8^*WRs8ry30wB2`4@aHil-ikaf?%McL{43Rp?mt*C+1O?@W;(>T&06=h&QCfI%4* zajTCWUIO-9utl*NM|)|=a0-+%yro2?ea@*dsG)mg6a2Fhi@*H4;N8PwSCo#zW})Qo zb+zLxQn|GeBDc@2?ha`slGd(q4WE^{B$nPk;a?#uW^R|1nHML4edd_d5hp+TG%Djr zBFF5^W1uzjmWEMd&u3=4{S`el_L@h-tA(jW5dG%TPL+4cq}1jlqZ$Jgy-A(*^C{Xt zY1Y_9->5{}c zFfowLSKVy;-ki1PVwOEQLBm|Kc0;jpwd#;?7WzK4_~QdJptYzc9u+PZurpIz5&Gn9!tJ>``f<)-}L6k zd{MGn6fS7@+Yg?))tTia^*f4BB5#j@yC-pp;3V=gsBpUq$K(PD zvHGCo79GveV^$~g0fm{rtDYhq(o)!MX}TZE*TB;6`Mpb%u&dG}3%b*tCTO5~L+b9Z z=XS^z5rfygKWxo_*5%bR(z(?-JHK2j;T#7mB|)I14Id#?=x8a0j$f3+}wp$}@I z6BGG%pm;LUK3wE^Ew$f)>Sxu3Bq+7X*};YZ6E3DQ6gq(h0^c3#@9V3JiH&_6)9ufR?-f{889jvbI3 zUn`8o$qWSSQ0$8=r7$rzcjIeC({k+j5~UW^3rzpEzeM#f{j+{~GymV}O8#3_35S>aN%`sY zLf=EQ2{h^0BO47U-*c zo?ZLws)uYTz_)}R@;K~=;3i)G_?HbR57=yFWuAt6i@VBtq|O?U(ll{U{|SY}p7Ei_ zjBCI4?d+gzp1fT9m($y@m&>22r?}TSQz`F9AN1PIJ!^0VxMp*eRJ%J9Az72ho4ZyA zZ6sXtnUND+P@CL_(lORp?4`Q?s&XQqhQ5NEb+7#miV?rRUJ9lHoAd>W##j({8A6oK z9C*}6X2c^nH}l0UWZe9pqLN9L6#iiLM)qwq4{9b^S?R2PHas~1mColPllZ#2xRUCj zX(3ZC4gC;OC^9DR@GsOLftm--M_U{^&g!Q|9b`}ZY(_5?-p`a<*$~4rnLUkEsBz@3 zhZ;{k90DoHB=g571$}7t>7wPS3XON@QDJ|_^35=1JcJr}ezwKmcw8O(Sd)#k=8Tj4 zS;O(6xrJNao`gDRukN>r!R=ey#KFejl9&WB#2VK$r#?L-0|nfXku-*AT}|U9wY5iL z;zy(l3JT^Bm^z$(vD8`HR`MA%bF^uv)-`hT93Q(KhXyAJJV7O^Dt;2? z<+`}G3&z0h<5MIC8gt0Kwbm2pVzC2fTVYG{dFm#*qqzGcw(kekUbm$0ND_UU0%(S& zC#tTrw-4-9mD3+qN;j@*Ww{*EX%Si!R|F*#WoF#pPI8Nj86m2qjH`?j@g_~$(u&fY zYUnx_5Di3-sM`RiTGgE*iE^>(({Q<*>NL<@0>_6AXy?wLWk>R4wvl!q#h5=^!8Z29 z7C(NoD3!rUT&2)An?tb(31@Fy-v_9)^n27c;NIHO$vUT5?{z)~E7Te>=cRvj_rZ0r-?vb5MW8>nX# zABenb$HvH@D|q%?#@vwU#MV`%N;g1t^;Jb<>FFcun3TL{^bwu0kzIqs0Qb zrI$+0C6l@Y@pCEgTxsUG(`F>{lE=om@&PQ6P{s^N`!#eJ!g_%_AncAn81P?-RN9_c z_t+Z3_j9AK_qY3}smZaE_TKN(2)4rg5_RKT?)?hLi}YjiN`knXmexh`3M9w)0fYZi z+b>BD7=Ce~B-!hIgDlICI{ABG6hErh;(NBn0*A#og*T4!rPNi~vKSdu+HM~$Zf+qX zab1vD=`pF-L^Yev+YMzB)y04(^*1n%?cRHp;KSBAbsVFwGVY4LOn6-q@ov((I-Fw@ zKYI$vAW=`!3t-H8x$e<==Q=^rQ!dvjC;m*i(k4t zy=!5$^7r2-Bj62_UB@$6_X^(W1*rESOh(3UyDfMBXLvFoQw`arz^7#51ULEHY07R{ zs4}R1g(e+9j2qRZu}1nXQCl%=?Hr03mn?qx8`)4-jcFj*6)|}`iEvvJW%@qjfB;>S zTWQa+)R$_o7by_&!xK|bXg>Gd-);86QZ4X4VglYrH1ys@>!%ru5X^3j#zY=XEodei zOo<9Vxcl5himtRi!?EZzu*$vp%X%l51$fSh9|+l`+n5q0Y3$k+fzo5@j(YMx=axwO z$H&JR8F$xR`Yg3jnNMwOumL*Y?GRmKXW^xSWH;88q<~+&QI7?T*WvtcBFIO9&of6! zM&{5SCo|!?$`0k4`1twz%Wb_l08c(Pqargus4gVzc@5}FD1w(>`XzO?Y;pPBZEJWn zZ$@=AowqM2g4-~}C0&PuC5Ek^2e$6y?1=cc3YqvF=!Q^9$D|;8z3lwHfC^mgGppvc z2rwPf-Ma6)VGrXpD&ZH$w01W5g8D=kZ`h1w1lI3D5H3-Je8y0cSF~y|Gq5*ZOt)8f z?g|jXQsay~EgrMczbrP$`tvLx2kU3DB~Y2~Cd7JW>-{EQW6NpDx^xCCGQv`>NtOV6 zT=GVySdC}e?UARf@b3^1(Abf-k=~vlq?@mKaev5e30E3(auvQL6}0c@-ucF_l1ZMo zw(=O#Y4Ds&oLzOVH|$Z>oP-W?($^?x+(%QZ;F^F(y{K!{>ZMZVI|l|sCpByYa0>xm0+lR7HpP(BbdR_`F|gWS__;o)DsG7Hm6iuIp? zH#*BGl)5tWH>+F|N>m)$n2_3#n6X*%lMa_bjiHr%^}CYpbK|(*jFlod7u4P1sWX*Z zQa+di(LiYQM=*Heri&*JEha}Dyv~kycKe@@1s^qlPtxpSwjh%Xt1C$S=)-wX4nrEK!QSwVrkGD%zoZgYV~Ko5md*C(&zX#v z;q-2uwl%Eyv6any1>YP`Pdj+eB4v-;F9KgGzB!Qj;WqeTZMJ5-^wT9zYuD`?9H$Wz zuZs+-RaDo8Ai2op0j4ii;mZS0jy5KB|NijD;0G?V#Z98RzPpT%S7IPuF#}wM`&IyY z+Rz7w@|&o0Pd)I2K=Nd}Xr(m()C%wI>KXz#KO>%=o?bmkf|XLx;kcC>w%Tn?N5Xl& zeS(kgDF#LH{A}lG1YLfg#F622A*9PUjdul}8-ed73EB~OPx*j*CeXV}ck&KS65)P( z$>0Rn^AqvBo5v~qO`R*fNB9Mr8h?i`Q>bYS9Li@T>1GtX|F)6;7czztx&vE_! zEv>1%ONxHKuq)&VXJ0WxOw%Vjk)mi+@s#&mMJo7M#L=)deE0|=lcQ$=vO(gXMvvIh zdfHA0lpfB%o^%qaf)iXWHF1l#7jb^{}M+{*u!g*7#NH5+zElgj&LrUNuLQ7@Z zK{hER(Hz521wmc`EK=dVq&4zqg!#}!C4{I8`jkH}EpXDi7F^Wl`Uh7G_v_L-haJOV z?3y=rMv+#1X*Hp697e+k5>M(>S6h3s&#d+4L&J9H>2mc4bs+3qv+SVEstWzZelN8= z=c!(7ba!4+wIA*Pw?p|myizPr-Sp{~XwI1co^va=A+GpROBpU@!joq2(RAt=}+1~2vUU^kdCi_Nu*26)LF_J%1g z0pUN57y24h&yW+SF>qr&sv$iYt#=={Tzhoiyu(77GK*cG#asU^NTq6Gy~z~>O(Ap zZ$V0dV}fO`0xAzibh)YCmWVAM zt3QgkW~s@lI)MLu!%}O1n!&XXeV~DT8Cw?oolo68gCWtpOu%fjm%!t^%8}dN1%U4= zoqY$LjE%p3ewfDflp2cY&+YkmH<_5k!V6n5A$h^U{XnH*yJ|nR=*Hj%sjuzmRsO71 zQq0oT$Qx3BXk5?O@5o)MJKUHA!m3zg$KuGXa&m!Ktsn}n)I9U)S151D7J zf3`?}MiMv&d`;r_4DoxhdLH;wOgoQFyVLLEwo2-@L~Fc{96dpLH2vk?AnX|5BXaSl zQ*X1>-!R4C3nii9DG(r_E4+4q!z~b!nE%O;RSEYC9p3kza;WZzL2`f7xe&NuE*m_b z_c`Ygjbb3g8%;;tWf{d3FmPUzp`R_)HD*d=M@8^Y@8xhwNwz5w>1lB4Hu#LK16&W% zl8#=%^xeRc!)Y^7DcdlO7;-|7(zIN*dKdXc$xqydCle(}oEMTgo0Ctyl~Xo)DXA2( zWiltKw=Uc#HkQ)KQ_-0hrWR5dOwDw^J-XZ50xcdrk!}rt7qw*BInRNR4W;IPIUiJW z_=o9fgc^^2#kE|ycfR#l5Vy-!G70vIDI3TQ0!o-h6i}-2#|jbiYPdM;|2{jjgi8ra znbZrBlPF7n3b-SOOy-(zc~zE?)qKY8@l9(vhWP30WQq_v--WUyzF5LPVq|L*H9Nnc zg9z_H#j@)?;TB*Lo!FueHx__e+KDC(Kc_yB(#PP(I<7;r@s=yC|NIsX=&xrHePGYb ziIHm({&Oyid6&?Gld1gAt&yw9sq$V@^~Nf$(reR34Vpsk%KKpIu6#c^aen;a&=yR? zO3ebh&8^<$Y91^F6%&aZwA`OsbWh@X@@BLVO;qNsjmAzaqqvS|;F6I$ifZijj-&gr zUm=0rCwefqyE94oU}57`+JqXDG6>iaadYJsGI5)jRrU%db3MP(z^-pbw(MCj3nJxS_&;{`yx1n_>9!6&n*j^K= z+6U^*CIt#5wg|->rL+v?LsUMU+8ctKTtSaLCv~#NFg#tZzix>(cj4j^*HX%R2Rmk@ zmWs;v!6}WvbbclysNWFE#yUEYI&{jgjHSJ5h#&6z!jmh)jH~VSMs}pxwGP1M&ppp%)H~5w*X2~_3i~dm> zTy;V^Te2PL=M7EPTZG!rl(EE}a3&CA#_vN`9X0D#F``VOyy%AE!Ep+N7 zU6%lB{A-vdYGHdPvK4^%yvH&j@O|RGHN(UBe^qv+K}}szI7(3|EegugS{8$dqM)D% z1WMWx6l9MC*#u>AKsG^?CBU;Tgg}c#5r!pDfeK0h*~NfCs1OK?>=Fo(H3lMqvV<*3 zZ(@IRrqglye%&{7=G=GhJNM4nzH{K-(22o!rggwZwp~`;Bl``)r^ut+>mFyM*3OCK ze83F%mCZ(|aX8hUpB1%K`mO%e)bNg3>LexSv03~qvm+P66<$a_e!oU2GOYuJ0x+L&yCygH!>|aU)&t;?wg|lx#TrDgDc!3nc8To zj{Z{jdG{_}Y0&AnT$EvkI;yM6)26Rg1xvE75Aagk%*RLAIEr642db)6eNMM9g{Z=8 z0~WYX&=6RK)4c}aEh^#mHPGEylxN=tnjB9VEU`QvT@5vy|9PkQ+n-)Ra2dY5tH+1N zm|%H?u0xQLf8BQpT)gPhaVYwz`IjGKNf|2YcAJirFEMV0Z*bC zd0hq%eo*v}`Hu&g>-KY8P?7Z2D$A$P0!RT0T6?3&Tpy~yE>qGN%>hI|(YOlPEr=;3 z2aQz(-b`D4l0*A`(M~fR-h+0$PVue0L*c0P0>DS{W}9XqM3xF&w960XM4a-Ouo)%M zWP6fSFV!N97SH;c%57-L_8gK931oAn8pnT}bC^3#CIHkfaMODszf44N|&H+-><($}1+EVHLegM!$o?Me6O#Z^hAm>LY4edqr^O3o_ma>A z>DVgRFfZ{SG8{BdCI)#=k)04M_J}jOEW zp`I2kA$W@_-^8gK_Z)!3KT;~6_6Py0C0J3u9PC`t%&v^-E__5>&nVX+oy|X6rL6M% z%9(mvgTsiUcV@y~NMlO<#yRO$G%U}*clbEFbXcf8ee&pZQ7H0(bQjVNg(|IE&7>>d zXA0+euBfT%p>!In57Mq{uJrYu2JMa@cQ!}b+JtY5+6UwVmLfw?-L^9&qs14QZ;lf5 zjC-*K3(aA#*I8})Lmv4a*w`rI2mr8z)y>cY`XyOVt|kN269$A62wsFuJ>b(HCgP(5 z{Mc~+=;^~4{tBgCl9j6&v9%_%GLBPi=R!PeEd9dE{^Spd36T_NZ5$WYdY@~rm<{DP zLi{qlhOpF!`DEawk#(Q}{MrvMeE@7%=b~6Ee%H9`p8!0N|MMS}5rES6?-a!U@0oT$T8n!nz z4YuP~q-w!HUkEs2E+}C~;APUhgR5=Hx{G3=f}51Su}JS!i)<YGX)B$2 z4T%U{48C`yM(ZN9tPB&)4`A@7+e;H=?7r@nb)jRQ#?0k~Nb3E;QI+%@)UkRM$I!Ga z!2yF`MEdm%^KOvnD9br7YQrnQ(XO7WTPVZ)SR&qCnELj*9a{s#$~P+1d+|leLCiyW zp4RiO*Uo&38aw&5ru$Y_hHLS}I(%ci{UzY5JMhb=*hk`I?`(v5NS$pN>!?qfRxY)NH5ZR z4M-<+2qm<;!TSLCxF@H4>jnf0qbf>Rq7D?_0xEEG&bn5`?2m zsUcKi?dteOuW1sDhI*Td(k{*xBj$DvxhvR*Ua18J%?(P3&&=4wJ|-h;;y$bpxM$gU zu%XKPl$Jg)?K>Y}@CteA>=h$7x&73;x=!fP<1z4-O%hsia}C0Hy;si(SBm+IlYe1^ z?%$(}z4GQ^48dYwiTf+qwNEi0p~a7GPx5)iwCLTYp%1KyVA$LeuNBFCxt{{c8ZSa}hm4rHx;UCN6wS-)#TcQV2p zJ49AOlt?;sm`P-%MmuJ;Fc(=xW|nv69{gN0xReD?`qjf!67#$aUt!lzW}HkPEo{a^ zc^flmBUS|88aupb`FgG=Ci}Q0@mGwfWZZCZ0`tul(qh#@8y2Yv-J`P&<(Gk7+fS!_ zjwUU1o1d-5b;kh&6#k31%yhrA65n{fEO51(R)*>J_uYX0%zB?(wdA?=r+LQdANDhk zPsrTTW^#@*)$&;$4_u#mD}A;iyHy?JaRGZoR9(+em*F`82Hu(F_|Bmm;B){a|VsuD2sdXcV zAT9Gptq)WSH}8~Y1eym>VJ9B5WG?Zx#s7d9A%*`ke*RZE&h`Ai zXYo*d?xU5`4Xg)7U|cYN!3gG)cc*d5xk}Wgu1BknO_H>O5))+(EB?m4dny{yu)ck- zRi@L=a(p`7TI5ep(j9f%r7GiEU$tV1!xrk#Hy+$?(Hx;Rby}GGbjOAhBW3dA`*cyW>}MR{z4z~oK`I5ImtbRHLsGuFMVmH!UR%G zJwN<~um60>yb7rIKdbusR+qMX+fqzO@zY-p(}0EUr=jcuk5Zk;%^#`%Bt4!X{nSZ$ zgg>3@Kx0$C|AWY&m?4gf;tpkeE^5Q-&5v;AaE^DPmCZ&?W6exs`qz|$LVjR+bIhbg zq*V#mXs|5i)XyE(tzMOV6ebzeXc*+TZD!Z#t;>@4C;4Lnl)h|ks?N79T&&SzdZ%N` zbxou3m6@CQXgA|ZnXrHEBZI<)C4s)TtN94?@4N`;a*eP>LbhG@3-$8t1?%E+lE+G< zhZ7C{8JYw9{Zzc}6vJ7SlvXtl2$m1wmf0LSDQRUtF>v6b-H}h1r_+PF04GlR0~&b|wI=;r(8Zt#qo!W?ECXV9qoc+*Gtt zH&;|8{(h~wvFSz^wTmVGn8MR?k4fEBp$ zo_l$;#vjo>5@ijXKFQDk^(f{m{=s1Qej-zTwrL|~SY2cAf%2CyYDd<-Ghf)=GJG~9 z#P>eCZr=9RbZ6a{-F(l@Dz(>}odplyhE~fJrHT>IG^Q1#rh8)6IkcTu-eEM>W@`7Q>+*TN%u-Z)JlG}%?} z9I(@mQwb|la_?;qQq|uGj>Op|Ux2f#8k?727O)LIUpFb7dGpw7=i@~|`RS2WmQe;} zR>?&eX;wr{EozfNkJM*6YP7i;9Hb2-(=KbnHx^VXYxbZyhIQ#hF5%RU(j@CBl+M^; zSJafjhmT7oZ261*vL&ZaINpJJ3?D#FgBW0uh1%I2X$(*l~F2a9`lKXVKiEOuV%w9&?bUe|?yYK;zGEHiqr*{Pz_m?w(|H&4CuY<^7 z^Z2(r>!ZR+h5do4?q>7Z%IPctZKuyncj%EanNQoZUAa%05jEa??!}-Lri0A3B7<57 zO$0S=8_`@sLXN$^r(Qspw}if;Z8|!lrfXa+8M>yAU7KK{X@RiQW@6nkIn(jz;eje^ z{neT2tx)C!joj#R69%B8JC5x}>EiF8$xvHWrC1q@U_K`Apb3)pVur!Z)aErgyTYkw zbKd0r3^sLr%gaHF;lyEx@VSGzaN=cL=fF+yeAAvNDaU!-xYLfTfi16^0OEwA6m!N} zCciKmR&JKabpS&<*$R_h?O5Zm8vA8j;x+o@n+O1#ZLB~8sUNF)rjGZ_4hx|?He*k1 zYi60)de-=?zXbTyZ;Tg9(bK0rfEKMil$Vzus7A~XA`G!}3-Y#Y<;Ni*aw|l|4^F9~ zFF0E+Tmdb;$Z(CF)UkoI_jD2;US7Zc=ZZeJcV$5!D;rzKq1VBCnt4$7tlnNSMM+6x z0K!PWQG*8DdTOuUD5Fh^VEWvUpYlXK38+e6L3{QhqD4mFWTv-xnciTH6^}@lk#}lU z>O6PX@{6qU$HhqMaD~&oUPU>!)?7LMui#*1Qvk&rb~Yr#Q;WKiM-qN!miAD5pzRk5 zH@Z%+2*@m0P@Gp#&kdI~4z8fxwcO@Z4s(rs$dA9d3%%;A9Cd5^Al)*DsjD@AZduR+ zht~XLkf4=#G72l^H$K6G^fUSrWI4D++Y+IksPj=aMiJGL7MEu*Kp@S55K=~~P3s0? z6u6MS7$=$q4-m-RhNNG3F+bGkV|=ZkF}^z7fbWazLg@f+WU+8Yq1{KR9wHI~l2lPd9ajp09JWy1w0N0OM*Y-%~JCgo^PIof(_;sj5*n(8DUA;PkKJc(GRniY>0aNciJa%=_{3$^4ob5~-k{ zx#~HgY6`JxJSwsG*%hjcII~RGhI0MTiUl|=N$x&KM{ z`MS%3b}Q%SFA9e|-=)uEbW*Qv>&2XB7b4dlvHTue(1BI)S$rOL8idwwoN)l3H}*`< zOw{@I2wXH@z3Mkh>k0|hU)H>LPtR(^=kz;Pv%X6sCF{4iF}!Es`ffff;hruf4R-ER zW~b(!de52UwZjv&ytE|lt12?}ijSf?gqJOxMSd;D&*Uv$SQq$D#psNeO`=CM)w&HG zXk`OQ=^lm8Cm*z(!9>@bn!;c}!mamp68eSGuKnG|MaYYt`VaLVqs68vX_!~)dkugRXAX2O==?JP8Vzp>K zBv@OWZ!os*JCy4py&Im~$FJqC>KtK~Xj@a)g67Iy(m~rkb4lbiZ3q3odh3Ua;NYA0 zc%=1|Qp{Vn+IQXUMDx)Wq7ct%2k5}vISJXnD`(@5E_Pv5Ci9DACt1sF`=_)|)cwXtPIp#fQnlNL zQ$jY6oAv8k^N&1V=X#0nj1)P@@_LGtr&vM3ah1hOix!9V{V^)-{Z?=rQ$Tt-!l$oD|3GMVmX*C|M42h zJ33~EbIe2;1vlZhjzpI$f1}rtdry{^CSg~(1W*UoF~U#=fRt`ciY=-iYA@e5`b_1u zLB&30j%tEmXWhD+SX8CmDtk{8lzz}~uih|8iz-lg|JCSSm0+JM5F*-1f(JS21TT(l z?g~rC9oQ{P3SWgb8`NdhMd?Rk@uWlP93VuDlTBHhSlcZ!NNjWYv>_#iqJ-Rj437|8 z6!9CtipiKU=p8(|m?$0YnAxAg07YM>ImwU_dPD;@YTSrB#w7A>+ZI~fmxvmHy!f$u zb$e(2qYvSa8szt0aKUAK8RQh9iL~D}gC!U@`^0d^G*z`dBD6h~)+3nII33K$Yc1_f zJ{UtC&%4K+E=aR{V?6E%={#mRW|@iQ^xc}QH`1m{?SmTiEt5eYw}4#2gH4I!)q=X+ znXrWXdX0!)=vci*QSMC5jw1$F-7s^;{*fO^V(qYk^upIoK=;*|lnuGPb;Cr6<951{92@q^17swo!n z2a#moqXf?Tg zeZpFRj})>}UW!Rl2@AZvfLf*IAdj+08ba(MyWuA&V3j)eJ_%=g&xrkfl9}Q!^**l@ zi6`#Uig{|>v^{vG%)urbkxCz1_xiO1b|GI=k-wV25Uy7eRs2@P6mQCZ+Mc>*_QiTR zNzr%M8Cv5Q{Y#{!{FdR&3|`!XZZ#&aGMlNR$GE@|9%^Snq9>Q|Y$?euu- zYkYA}^S*l@cRIvwvXC1mys%(gaaV1_dxVdhPZun3+O^_ArZ=Y%y&Y%bsz@DdU9yYH zK;j%4iFh}kRS6zldW6|6yQvlH6Q+Qzy@eU*$(J6M_??f{*JLA>j-fAeoi|_%Lf+Eh z^kR=>FAkCF13m*8fTJT>Vh6tLW?k=x0QJ84Fv{!aF?ta1+08YTWcP2P$ENWbcQ2$E z>4{>q-x@?$FQ!DEmX_;ji&g~6koWqG z>V|D9p3lIP%K1h0pLlxZ>`$M%O!bOT0Ch#5L)&1YgFg#}bIeJqj?YKb7R^g@?7f(_ z5Rz+%w)#kx6SDT{NhGgfJ@q`HB?;*lr2ZnE$Rm>T^N0pRYS%BcKk_tknfX%7=WU?A zkZ|5=uan0Zr6!t!I$oS-1kN}j`UwX$`=lyqkZFZT1M9FkCJFkFZswlsY|PQc-k&I8 zIu=maBOJ_D7G0?in zPBaVd+(+`p7dbRaWy5Qe6-6;wwcE%rWt|tqfH)qR{GeY!6 zgqv+&ms0`Yx%Ec7;UZ zBd~gZvE1_A>GvW$-(C4fn4HTM;!El7?^pdmO8%N+u&qN;JolU-2-5xnmTQ(rLE=1WUm^i3_yjMqAAwfDeejsgVtP%k z1G|E-zio6VlQzUP{UXqw$9z^Jkwxm5g_E_E+bnOuAT|*E{8!N{>xuPX3Mu=HGhq% zMGZ&reZ_3Z5{1`B5&86{Egx+XjXn`wxpD^Xr1KVH-kMSY5rLU;XO@B=nzxSQpCeIx zcu$L(Y3krx-mnM!^(>yX@T-uqCsD2qcd=On)d|?m~hS5 zt>zA7zOfZLJrqm*v!&D)p(R>$71si5iMop9VOR5kk0SitpS*FcRDZgSTAR(FZUg~% z+E)chxE-=_lGlmheuP0Kj~&Ok{N|bfJjSQUlB{w55;Bdy(@*Fn;cjpM+jb8@Rp^%O zl~ghCkCNg}3SVXR9o_V)4{kP+`|N7Sf7rA%fd|&V$a!(aL3?B7u+7Zj|5YFK;;KW` z5s6&@7*jwXayEW9W|?T2awq}Irx4dwsU z`w0>tt(2QvmQ6Tt(w7hrcKTEv1o~x&ytJgo#Q)Jg1)sd(^9`W^rcBc;l#4r8B6#k` z|5#RZ^?+{{Ck4_>iHn55&$U|(IQ0R@Q*fDT&;j9|L=-|1f{JUP*{gAVV|{HuV)7Vw z#X~wgTEG4!_%{{w2%L>x>gco(ssaAY>elD=pmqnZV3Z_pAb;qR1~6^D1eZ0m_yztP z4OlPt_R6;J4G!IVj+q}(F0tB=86@whG9_=5fae-+w?pi#R~`c-X(3SYom-8U0p0dM z!pCcRCu4U%f!*`r(PV1m_F6|^b#MLbP_BAg=PmJiYii9L6}m8&<_(t5_9ALsu6YuQ8osoy{X_7SV@sIB({p>mi?u=Z z_Bm^9&o84f>Pu)_~-l5m2bp6Gl*EuX=>st2>YQy(3 zM|a3^(tAGL;HI+NH#ws}0hK`PbcPX=BekCc6o~YwpAvG4!${Y;QP`+P;_WbLL=o36 zp=IvWL>E@Vk8~Cs8#6BHo3#oHXb+SX*q(xwCAoCKgp9YMO1S8A*8&%@kdbv; zuEnSWbk=ZP5f-W-tv7v=CprMD`!h4blMbjt2yf}slv7{pDGHi?*TS6)9{$>_ZHKN; z*d5-L+&f~uQ_8TDXQ;o`!HpT9*;>sRBk8SeXh(d!Bd*ii^OULugKB1n zwTG6vlNRIk?V`-O;w`^@1Uv4v_gRi=+7rvI9@mnht^9$R6uL2?YK)l?N}GgURLA+U zcb7JiRb=O*n(Nln*ow|HE`jn}xudTaK3!eB@f6l8@qT`i0@<_(W$(<#2#5hX^=*U( zo0e0OWT?4LbzVH$7vBxG*EnSk75Ia$Q|<*P7=GfkRFNbzD%=)!f#aSY6>OsLWERzm z;kKlY+V(n^q(!|lEUcG@MUb&x|Ig&!z8~YKBLVLCjezLWC%D-_MB(CdbpziA4oBxT5F5YatNR>sl&GVH5LuNFG(VCvn}| z$oKu16ZZgNoznfV8c|uU{)(HOQF<%*^_BHGHoReeA^Se3+Rh$sWhrU9hYT zT6=ovFj#jaLuU0%%IUwPV8)syD7A00G(k<+HLX8ZAdQ zuecSHGEEjUKjMSs7zX+nS0&y@mKRWBmVJ9?M%3sn>kV;JzQFVC z*95++tts^kTyBNb$F^=!%PPH( zJkKA!a!_5Ee`!=lM~CC?LdPHg)5=xLN(U$-m`)w+3Q=saNt=nb>+)qiiQ5*-j`g2| z`*Lfhoe<$>>fop!zw=ai$XZ`D9T!Wxpy3sv!E*DhVP;D)>7>)V54N2~H7ihO4sB_y zCQ2k6XIKnpwdm4cr=e!<2zO!BPki?r+rOY2v${P;L(Is{-Md8rFlXnF#IUP&%6^of zAdljzD-RBCpUPGSA$rdUdcD@0{^MKqTW-XQ*_X2d^1_2w*tva+B0W9duKwi1N*_~{ zo_TBMpFgoK=#h}%_7S*#R%3!JZIP7wkjU&6d&Un`;0HQWfmpo<+)?d0Fa72ggNer3 zNDP5QDF86X^fgrd1qTX^st0D>e!C2BxJfA7M+Mxo=cgu*Qskb@TRie6b-$9Tzua*FIkM)Zf%}g!Q}jsMOKnHT63~mC=qN8Z|^`$50jN^>pe5czZ1{qvAjZB}y{9so9B2X0qnB%L-U5aQaDLYKpOkjZ=Il%B^P zHmCTwjugfGEZIMm=w;`Jmnz29L>%nDa#8{Yp`~GBegaRtc6i9it5#c*V5hBS0rnt@ zkzjLuX3lxo)>@)7zwt;ySg}`~M$kn-2(9 zv@f&DJuSp-%pi^A4Fs%jUS@21Ap7&OtVRo=N*AamN8G6w(nPa<1BK9OJ=iO~u6? zRq4*#;flOHq}07=oPrHT;NI|qYX9a;U5yP232nXDiQq8| zLCp1%w2{#8$I5)Z(?S)lxVOqzr%^B`Vo(c8$L&@x*p8tP6_>$kOb-oQIwaV6Yi1hT zCtw&d=%65##q0e!m}+6!%k$J-|8h%zZbB&fedhhJ8lO$yi|RiY?bz9hG7B<cqe14QHp~)SM%l#anVa+Vk(8n_N5;28I~E zWl2kyl$K^mYB@A5g@?yz>ggp02d^hjy|GRy-@gJn#pg`23Q8tSH+qr#o=-M+LN6|O zeNcC5Z+QAnm)X^of}-oYf~JP>W6;huMbo`spsfnvkT-DrpEV;7z)TDt-w263No}c^)edZrp)U`(d1q z+fc{=*@AQtgEe!nvnTb-#l}{AZ*=KSAOBE#l>gD@t6uk*JOBQb?M5^gcgf$wluNRd zT5G@O*So??pY@`kr!0f^dHK*is#L=5YE_9WEZKe5GeVN+YCu(D@%Y_}xcECZW>;R3>v*>SZ`}`r2`bFrkSTf>^=Kj z7bK@cWZWA>1=!fO{hVaBZo1ehbaEJ>?>5!hNU6T-XMFr;%3A&xaZ#yXcB1kZzqcTn zGeUa*CtxGOIjbZJkhuS@lpQ)hJIOMthn1LiP~<*6k4W95T>~}CIN=+o2_$_Zj8di} z@=r+O)8yi=mXnqaUs~({7q7(;`|>O2!WWLE*?Ax4Th$N>x5>$MFNU>KN5x8^iFvv# zx(5t`tjx?oj)(gFN$;ze_NdYIj)wLgQP>s$TZAv5T~WBL=Mu3TPC1m?{0^r)^i^P{ z=qdH8&r?8)Awh zAwzJpx7G@7GM!)rXACp~oum;)Y1Z#&$V3N3caOS-?Of7$g1yVOE=S1FA*3?OoB--67+?}W7 zesHCZy;!f__@mO#G-l|NJWk5BoOW#*0W4H47dcV66YDu@KQ?=Ow;aQ&#sA5k9H-&m z+OtkhN9pe{cOQr2|`g`UUg6?JGfP!&KEQe>MZDeFaQ#>Q&xA9r!t49q|J*ggW}Jt!>7O*57JB72--b;f!j>K+M+|Lg zAh9Fcsu_P`u0+M{mgB+z0_zZnQgG0y(BA#+-To2+aeEjUI1HH;%K}WM+y0>uHY8DV z&i@{NuUmu6b+=p@KzdRn7A-E0yB%UUNO2j$LmG0+yl>vStP{MAcZnuI2+C@S!5Ewf z`T8EW^o`uexGe+)4poqSj@T;F`7v~%&Rfs;YmZC$KNtt=eO&B7{BR*)NJcfBa~>6Z z-Erly{N?HXA!Pl#s~9CoKr;7Yc{B8OtStzg{15g(K@N)ay;6RDm;)3osxP6p^)7FE zGhC=JCg}2)F-Jy(JL$yOY2yVxlP>`zayB%m3{zjh?i~LB*G9xoD{lIM*wBdCJO6<_ zi2VhOamziV0pbdpDCf|k3N1IQsCW$Y_jE16q&2;Y)f1dzqFGyNqEG(|mJs_xNFgu$ zZ;)BC)rF5~{kv4%%WgoGj8GkR^m{(^f3FSkSMS4vyoicd9j6v%A^)GAS$@FQ^1mpK zpL;7Qu1g9s)njdi7qLp|DL_K^S#X|fo6s4RSzFXp=xs%qwynPOf9?D5a*7_*SMCQ7 z{naZwyhZ}!))gK-S;l90SBQ%)c^uy>#owh; z0;c@=o&j5O;3fmtH81=ttrqRtNJ4k$Tbq_WhC8SA3`5_{JiFXAyzrlR>MUnK_;h-& z6am-~F-W9KO$BamAFtj-Ez*4iy9tELE}edPV0#IUUIOS>#+58s)X~Xjfv{piv6~UmX;J| zaGa6~Y~%JQx)Y_c2BIT66Qx1d(-M^11dapbL<6_K2iZqCCi|ZQ{k=7L5wID)?Hlh( zRP;S5;9v{6Q-<(@)U?gM#L4_P9`Y}P4AwbM)*}nN?m`+OUMgq>(yq?B(Ji*fzV=}0 zA3>3zpi2N1bsF^y&i~Rx+lnAp*`@z-1WevS%5;)9OmH!2O5ry!q~2A|;Qv9_;((jX>2dH*o`}mx+9K=FU^!51MY2 ze+nOPCzrFiUS>GdiKP~KWCVU4)NvOSiVTp(Z)q-h_l9lrY#OmNi5rkGCG zBzT!MCl^O`ghbU31}VJL_LiMMKh;+=^1t;}OrRxodZw@aF`N221Iv3-^TRi}!}XY& zFKSs@7g}KPnWGru2SafQhjZ)$!zE+A+I=p=r8)M)=PTclQdlsR1c>cPc{klgmcISg zvdeO1&SmYi*1o7USkU+I$UWp>u)6N;<*>}3sxp`~yz=|I}8w?DB zua=&OGjXEa75NKAS&_9IGrSDse?ut>03LeWA-$ zm9h2fFX_X@)%yIA1Vr4Qz70ok5O)-i2z31t_cC3ivG3Ro5DrLgfqD;98RM`%%2z# zi?9(y*o4c9#{P~au8yo$y{-CLC~!)136lS!7MTUb;c}QrWBR{3#5BOJ0HOFt{-iFk zX`e37-0B6(nw)MTc0}x7F8$&x9OOFOq>hfr>HhHv5cic>2=coW-7vULcjz6a+-kfG z5x09RMP^GA?5N3^0xs|TGCmjVcyR<(^oY%|W7lYu_~6zkBQ0E>$2p%}5R04WqD54= zFb@*B?JAfKyM2JUpp3evfS)GWrSBHPAl0gJ$saUa5oj({k&hbY;9zFn&1b0JvNkp& zB1742m<>b!l2+y)sT}BaSG4v(^f!4QprHR9v&le=|qM4p@gf<_q5~vrn3m> z4|9aQtWo6a!rEPhdPPB&7z7+7c0UE3yYtl?U$v6=WXH&lK3SXZSEo;rkM;VT8Vg z`&mnx5|OqQg!-5x;N>5mQFi?l%4=frP_GNqA-`MZ|=sB8wzP; zSZL=;s&|!^uI{;L7XrZ# z6q|?L@^6D2KMLGm=2Lo&7O4u6pcF!+CCBwiJFK*B!cSxpv> z|8L0k=Kp4D0sl8u>+3Kw<-WLg<>N_@m#yB8YIZspk69HFVM+l;G6r!2MTa`$;pLvM zsw$y9&l;<&`!R)zVVl(_bVu*9YG5&Exw}UfxwR)3qlc4k4>zaJp3HqY{n|OaW`SH&OAA?Ba3gWrWp5!W_?SYH95yY=z_7~4x>HoM4sHw4@s#^MukQEQz zeFGu0uwp+AiFF!EK?yqUEh(>oF#S+kt7^1J{f7mx9{>1rEBsJ(p8fXlx(gT+%pM7 zLt3x|EoMs0#7K-zmGNNw_Qn8?Vh)i86A2Jj!;f?;9e#*{>9`}G>_M3DyPgJl^7TUyZYG{HIGzm~}u8m2BRE*?W)NjndFf_N@PeOg)?(3-|{ zgiq5@WQYwZ#Y`&mY?4KQ&}gNE=mY)wX;y9SGuFuZ_ez&mywyK)T`im(LB=i}?ac3v zmzX(PF8Ay%l=fnw;q0m22f9^dP8P>t{0QbZRq|bG4&YRG|3I4}f(8BNTdTbhrM9zq zH?C?8D=ZsxI=t9eH%oyaLTW2(_*#q7b#l9G}kC<%|^fJLt02Ab%_21lOqMAF z{>YBr-6;o&d9Obt*+QM2^njrW#M7%=Wqm+Xj$HmTdnEn^_SM%y%So@Ft z1|v8K%eOe_Cz}TQh0@ z@A}-^^Reo~p}Ec6?-D?FuvM*2OH87RLmi`s$pnisMrfi|5TUt)wx`#jddjKsYo7At z5r_sldzf9IMakOv4>D^FtLJ50dfUa-oQBfzA#)R-w^rUEO)!QZtP7VK?ms zW-zjGdDT%Gx8`BRqkce7KCZi?Qz_g8y*cOrDg<#CV*KP!j)R z#rT9Tyrb&H3#Fy=Qn-PVjY)f)BmKu4x?>kT2I>_lJutt8toGsBU2U8tS@IiH#}TMc zap|}p?lR@42D@?k7lYird+SI12hEh_V%7f^jA$CG8ki5F{i_GhGpR4@PZLHtTslSh zKKzyL*91}Aoq^_qG^=k$LwKTZ)+gOwS`Ftt22yw@I`;+>j-V>v>^k0a(vY2NRFIZq zGHavN)vkdZpsbQA%5j@hi;6sIZ8$$o6XeGv!zurq-1}!t?y3Jz*b@7{0taR=277X_ zK}jB^hp--Ej{P>IMyKIeMUHG?>{oPf>kTbsjJoJ`L0E6SJXJ>xvpzFOt)f$2FC&pu}`ZO?FoFECh4 zETlD6%xh+<#-eEGr|vw~YPd&8QF>wakT8Nl-1}&{*2Dvrpv{bXXh6(+wiK78QdxzQ zZ)ul6PkLPJ{$P>J;d68}><;U{VW}XTU*cWMT+^&xnA1D6>E^)(*6ecpn1mnB-yTn$ zKDR}OP}>Nfi6)1D>3Jl#sCF<(>Xb<@vvc)q*W^81VD;N1Eh8w=?V8ZroFnAqLLYXU zfA1eIUp)ZAS}&!(Gn=RR@~`{5S_ST2(s?1TVkS7EO9c+gpeRO8`5<>Kd zy?I>fMTmIKdE!=Hs*?&GdDIq}cl}AI(2X@LR9*L<9docUmGh7oW@fcw$GNte>4U>b zf|KT$e}wK-#7O7G4hGJ-NkitEa`EQva^C-Rd=Yx;9It^M_jU>RxfxvV_8K4ei_tfx zzfL>mRxUGupEDY;X*E=`7l(2I&$x$xAYJgpPqSq&`dC>m5hEA+n%7p&GY{$>IJ1M1 zoNuKhm}?=uk^iZCal8j5YIu+dFwM4TFY_E{d*LL98SOm(G@GQ@X#wBb9|y$1yYh;%(Z;-db#0>wTr zeD~kkD3{Z7!p^oqh`9OiVxHcK1;|&|IuChf+-27VcPiU?Z+ME&az6MF+zffhW;yUo zL?4?i|8`keL|;QoFHta>i>Y7VqCGm*-8lK-@UxnXcB&|3OeulL=s3$@?3Y^|3SH4V zf8Qg|Ci}shf{QJHW@t=E({#&^V1V5z9I;n(juQCk1_&uCo^6>K11VGI(CDyuIBw%~n9|9x;mf4yKu4zU9LM`qYPXDdDgLwY+c@*>CRd>Hnz0^k-J% z$1-zXn=IC6PuQ(+nz#1kGFQ)Zc!O1Dpmpg^U$zlX!M8M}pLjS04*JY7TY$82b`TKW z36jN`Cyg@Ug&^x_r0T2lMYYTI4nyk0lEP3hC&&(ZTi5%aoHwczL*;W7ZNmgk(7m1K zz7o%NZ>)~M6BB|SYgX6|FN8!H-KFVORTz+dKzJI0>`*aI3DoJQjQEnv|EfeI9?Z0O zq-fUh)ym{cn1z&TCmIW&z5{{aNL&|lc#-Npi&x(jBA@n0sAq&2hs7e?SJic^q5aC4nyH|WLQTVeg2~42 zn$w)^$t;Iyaf!ieGUvy~k{nX&i6=ovUMp_O*t)CV2CUoED+UK&a-r&{v8i7k}6i4O)Gb{Jo z21h|?zjF)MABmaf@BMLp);S+{M8^d=c^*-lvJ<%Y!|2&dT z#I?PTgoXg9dwRLS*ZRCf{d1khKGq8GX{;8aM{XI$9UM%S81IehS&jO5Gd{cn9f!IY zRkkOht2#WD!?LWCS&PU3BFMuu6BLa5!u{mymY-^Z_&29yU`j{drEdSEAp-35hc~~{ zoIPQAcS&dVPy9NzW``e7S~VG+6=t3~2bnYqP_($Ae3rpXl6NJB>L#oAgTTc{JV|6E z)uJ*Z?(o3SqVVzc)4O24@2`(=CUv*z@`I}ogVg$KxUD!y0VLxVEAZos_ivpfio~Et zPjJa)1*1bc)vYnc=9HJf)GfveqlCYp9168}>y+1(Ft0`h|8tAPjN#xG1%8)?y>r-n zKy3UxKE&5|(x~`lZUny761C3px2{WGXv{za!Wzw5e*+Y_v{9rZDW?9KFR{OoFo%bJB3ld3$BVAZ4V^6*775kX~!;AS! zzW|qL#{M|xwGv7~3(o%#Kafbs<@LWPRCUki2pJyjX#IzSgM?gCSoohu)#HWEXd$~nO(^XOprF6hWAL6ah9Q>(F7GFTinz%sUML2M0*598LHkESGC4-Sr5QKE)Q?6dL%wCEUrm zAQu!F9R~xie0UF!)`H4W`qN{dZHqkDBrhsr{bln!@O=aI#J?iHKp3&qDjWwUR=Xj= zgxOKyvHQY`QjAw2S32$yxPP`(*R(VujJtdtuIw5q?ZeB2i*WG21{nW-0g^tPQaDOu zHYT;f1W@Z?tOc0*i7R;t^7Dl=Owo-MZ%lN6c*|&sS3wsJcWEuR&T(0uZ2o_^dJ}l4 zzVLsXd`j|>ty0O7iXtSTY*X2{>|{@p!r1ris$^f1gsh3|L>R_0vW;EY8Ds4G*q333 z`JL(W{r-Rd|9@VuJLjHz&b{}n&vVZ6yr1V@#6Vk(@_T^_54=O>2>j_ADPW)d%d%M$7TROWKj|LJbo zacT5SQ23FdM6>woK6&$WaSd_k-%HD(p^>cFE-o%F4$7<*aP%KHkZ83jvF|PAdCP2a z!J%yKn6ZSX?=7kytDb;ng{mRjFm#ciYNRiBgIAL+ha zHZ%Uod1Ev1D=74iYHbnyiiK=tp_+~g&b}`z42U|F@t4Kqzia4M*g*pyQX*WkRN{Ec z{6@>3E)RAT5yMOF4gyY*uHW891xAS*X6RALG0gLWnsnU*tGj35~xvaDv^*4?KDteKUD|W_--Ox2gGlK;g+1t`z5|Y*ZVnzva@y4&VNM$2|~8uqM7+ce;8bI#xGGEJ}_L&amQ$ zPDK9Wf28KeKv)5mf~bI_EPzwdS*YEngngB86L0^q@)3c-#ogEaS#V5c&H%Q=0@k}+ z2`mn&sI0>hXmLWxz2RF{f=|hlkxhqap|%ysn930X4U*-)dXtA|y>>f#b>gSeg!e*f z=DNh|zUzCcVy8=lYaN(3v%qNoyS_Xf%z_Kjke{XWi}F;lBf*-PZZ*mBSI;y4~qW+G(;aL;S(Un6M1T|<2DSpv-q3u zSQ3BE%@E9+!8IA**@oPj)XTlH-@SEg_ zdt++~thL3VH==a_H0H@rdPf_T$2nRLBu_O1>35ANvKOS#iYQor&ORic4gWrL9jie7 z@E+(u=GYG`=yl_cPI>&=MI>6Js6OsH0QrcI@(GKPv*)|5b2|3? z&hoaNwxGv0mh|TM;Tl&ehg~1^ABA=A$HxAEoCE$2&WGNVrR`Fp89^%7sdw4b>j@cihA3$3}dv~)Me6$$2Z z{{yq^oE$q2D%&U!x3u3q|{Jo_sJGFEUc zbq6c6wu5v`IqocW#g*Xh3vM>R9%Fr)7A9NpQzyU+OE!LV9AmKo!cipcKCaHaX)8JzK& zQb3yKOp^+cEl&;2yS{Vl{Ax&jcHLsKZZU^bzl4i~AB6D;*H8|d37+w~nDa_HeQg$Q zO7^-8P6OJTKI}I;d*s{OYyimLB!I*sk7~r$^+tPqGZ#kXSgoqYD}FyX#lz|%U&L`w zYt+Nw;k{zB%JEwi(+nUfn)sxo{NM>e$o_-J3pL%^`48c1^`q+tM498)-wBdFvmHh@ z@+A;8FmGWbD!z;@qqC)G%kz95rt}?;|`!S4upuz=od#AfrM;$?ms6 zmop`7bE0{>bk&_Q-CcdeqmM7h_j6Q=G~1}uT7h64kZI=*T#GQ~;qaB|uM!Wl8s(mq zKN`9xY_~@-4&ibj%}&CouV_R)$&Ivtii1iCrBa2` zTBp4Qi?9q`Bgd^*O-WqHc_zj>>i@Ven6ZJ>DR1LS>s~=*RGn{3Oj#9?Os@X$E%2Xm z?$c*N-@0hg-DDO#*3)7tH~y`9viv4<#n6zCt*?ZdNz7A>Pj0ZSKxS@>iC}JEj!D63 z<>x0G4WIC|Ro}eI6B^jH9y50)**b1@>PwPcacx=*ZOjLz;)5>ry|I-#(cx26R5X-T z6Zl;Tq5=3w3?pveBiE(N&x=s_!iwoGkJ}YTXJC-ExjuCblW{k&dcSF z!;g8pgIy6uUrXDjdFkd^PT}P#VUdgI*|diXvbo~RjnY(Ml-guG33oZ|dDV}2ddjDY zsh;r)A99=O`hQOp2){a>y@9_LMBACY;Xmp1Cz+P}yzu9i7*C8!OTOniGy(Lkf0Ve| zTb@?P zteh_49bYW+P$Yp-u9rIfFem}a5xkEc}WG9kkBT}m^(##X{J8Ire|-XD0@F)&MQ-?91KpbTsnM`Lm$Rd`7oM}+4x=w7_W z2=7U~lPR%PNb`i+dar0aOCNwd8Ma=x$*!bt13N|^GxmgkZ#a0~W4`z9!_%B%{1@Ia zO(`E?0mb!#_6J`ds&UYS=Dq%Y0(jrF&XSi@NUo4#(csgnF;I zG_&Rh@JBIavx1Ao_H#o7ioLGZ;yt@oP{BM!GAxUV`3#&I`+ zHY#W%!L$Ch73Yzsj*hovQZ*CY9MODK?DSy9W#DhQ*Zz;6A!E%RLZ_XnPa?oD6MeM8jP{Atk~D z7yrKF4?x1&k)#VN9kBdG#ufShq96TN4Lj>{YybbK7x!Aw+6&2*N*Ue&;(vSA&`@A< zh7r0d@b_vM-m~`02C+=A9lxK^8H2oq5zFe-D-w!QDK=de*iNq@ zO}BY402&rUbv7u4>z?W9E8lJ1U#q*!=~yI@$ImT9e2QefCAgE-n?>OF!pO4Z$)0HI zD(A$e-lt70?1unV$d{v{eY{4i`Ke2jbn)eP+oP#n#@i~Si`HGJIuHAsf-)QXvT@T~ zW^_}?<(>5?+U3izS5KB)>~pzj0{nU3mI_#%7yui*`;$0?-}9QF@+1l!Yacw1xb4pS z>I)^JG7M@Z{yEgp__76^r}l@d((_@q7$rTCeW>Z%*{yf;KzaonpP`EoLHu5a?gaM( z_vL@5EV)>@%_zNS1Y8csMc%QU%bEBjgwAKP@Y8OM;S%QYk*lJ&`dF06*Fo0xnYyD7j=ANYbck-Z zwnJ7ucR~NS)XZ??72RYAtMd{H zbiUT{*~^mgOW0LYrHv=^jfwxX$7kdbTTb+DH{-58%hyN+1%M(X!WL*}!;_(6Yf$4U z-z8;j!~MvRfK+2y0^2TbrKDgrg6r6n{!QNU@%rv?-e<<+?ACyhH57i2IzzJ9G$`!K z(^5x_(m;@6ceyDyT3Xwmw*`^2a%Sq_U{j)TTUxWjQ0Ol5{Lx5Gj$Wm{u)%Ee_{{({ z5*YIo8)!(6Zz$<0$_^f+J@W2*)M2A6@13UXg;x2oHENVsoL7O*k*OqGN}gEIio>_* z`Edeq4n=#yFsO z_a)#%>u(&S=5e@kBUrL~R+C=Qe%ga9w1r2HsSC88B1`YjRKjo9$;g3$uHull1Keo6l6rfq3hdqs!l~Dj5N7~M(7whdlSIE~* z5aRvPZImNqmStY3Y__?is;{M$af3Vg)irffBx)4JXX+^hp3D15(rZ!2pW#o&uEvNt zG;vT?_=T8OPMAqAm(g;o)c#+(t6!3C$AD|EC*x2C$5;32%e* zj8`5L_C&~gV|4F$w3p+jol+wDw0H2swpL+YGxL6eNP~tWT+*61ZGer>2Np!_e$tBt zSyG*?s}V2VnlCn~QX;3}i>B18;y!;*HG}89;$O+TV4>an zF?n{X#v9GSa8=9tI0Pq0n;IpI}nuW?{33+x&x7^Us z+AXLMD}T2Cw%JTdaj{jZz%iN> zq=oaKKqjar^AjbWaO{YQwg2?L9mM+AWZ+?TqGvJ-b6B2l|Ji_164&s7rT0|hO15E% z`Bp2tqjIu1JPVvpdkgA+w_@IQ&{f4=104G!;9i{#Z)mImCwBSBM?`<-<~(V>nlbzo zyhlF3dkoC_11?F|Up8gtkS@GhoHjJttI9s<7x^ZmGb&SF2xe|nVVBvDLn0dTR+-edpkzT^yS&bjOXjc z3`Z^I_77>r$Qw=8EzV{GK)GyNG(0epxT;(BjVw~v!P328Xa-#zOQ+VYK;Gkh6q=`E z-o>8tiT^^cz^5_UWxDrs)R4s*No2FB6t(Q%r=qLyBLBAO{j$3^ZS1BRV~Ou-+Zx~N zR9{}B4d`W6IPJ;i*m#ONyVAVApJ=5%uzq-PFe_J2Pdo4aC``AaMp|*{OZ7MPC;s>Z z7WUs)2aX~c7BikeAbQtTDXCQ4Jtitj_QoM8pT15UKBn^Mmr>a(?Y#KQeH9=$cP`}y ze5}0xa=6*$xQyn3>%H4&6y&qM#~>S@A<<%&6lbhlYEs<#^fqfT*1t0ldm)Z=*MZ?1 zxOA<|X{zlAO6Pxfs_sS@{L7+a3{0AJc{{+}G&h+FI-6mvU|t`t;Ue&?nKz98?!`#6 zE8oiJ7Sv*^c6sDtX9e1OW7MU@IXuUm0V>P5zvr`nN{mI01>(u~*47v4I!1T0Vi2~2 zE&^~Hpy;0~d#22V|Js}_LKn`pcR{GuT;6z%d^4VFWnR_(;5g84@>?iZN=fg*BJhKd z&NQnFA+mKrdA^-FOuIGQbv&MD7ijkqDhAO@hfL;nROwS3RXGv;KX8&|BL|->~-?C}AA3={jb19%M;7GDsQt`Dw)P8Tg{zQkQ z+HOx>o`<~@z9MO2^1ICJSL$Jv5kv-h0y0~Xxi=|!X}mlnWp7L!U-9K4d%u7FlZ75M z##Ztg?~0qX`rBz7{aVQuCxM{ch#Hm&AhR0Q7Mxlbk50Wft6O2MI?`0w8!xF~OE(#? z=sOd6tSX=7Og?rYWISqZdd5pBb@Y0l0x0?WjZ0~{O|%U8S0b8AXq`!Jm?w~fMaY9) zG(U4JS!&KNetE?*-Zb3;VsfvMHqaiSrWmQm3b3suStFL5C+3YhfB2;SuClg)(fd z*KdkAri9b}+UgMeLo3Vq6rvkG-`Fox+|EWVWL~b7Jx0gP!q`@Vl9gT%H;4QQkA59D zpg$As0v%+IHzN6sb5C%sT*jUB59Z77-c>1a=<&5fGvLlUlje07^u0-g;SMKHcoyzImu4whH0?eIN)jV-?IM3KWGegCI9RL z-)BWE%-$ql_JapB&(wK;8K4bz5+#I+B-qvVi7rJqjuEq-!TX3H#HV2kn9?Z*pRZfn ztGJUgoQ<>$J_S(6rfx;SH(Yx`yEW>-c`@DBZD7^0g^l?DpywwE~f_#1r;+GR=Rd?IjdK(PZGV){(?zTTO5rU$b$IG4{I6PP*1iS2ht_){7 z+i(uE?-{bGF*5B~?lFn&VMU}8r=&1Gqz2CI);vO~@tWiIVNm5;@0{H)RZLZJOZnB< zSdJG>-z!|YS9|rfuGS9uHpukGG4`;7>5|5_c91yqt%kqODUosV~s0J@h+A?+#*_mF-8i<_PL`bl%v|n@Tw9p$;2q zJu>gE=PzH%@rL8)(0O3;v)2Z&BU!JZ{_ka0=;(&aL-4_TeHSZoYgy_2D#2WFbmI%m zwn6=^&J`421hj{|_j*9x99gaWMZ)pcwt+2N+=i0M{sp?->2M5tF#ADqi_{x%BWhWK znJ$Au4-Cy!^3Lr$3!C~75$}_2J6lA6U@J+4!%Gy~82xO?SieLhkWm+!?%tROf@3ok zi(zebCXco8Th`W_xTNY*FO_HRV8||y4XK1F$0>Ht{`l^_H5d&qJ4(g}8~1eYIaYRF z4Y~KR>B~G=1^_iD+eoPyN1Xk6ws|#6=e%&f9L@wRD9UZbh-RL)Z|B2%nPxnZ` z0-q^GIW`6(Uq3l2wSBFNR_H5tc6~jRRqc1w?J-*68{+4vAESjD9Z5N~8vNX24Q5e) z2hwwOOh~DCE#4Jd91V=i~8?g)FLT*h2;zr?340^l{5a>N4L{CZg96xTtn2W=M9`GB&=PcOWb%=uV0K1~N(I zZV1@er`k2mUvWA{;7%=&pE(`(nnGp|$TsI1d`VN60PzkyOYd0wyFFdhaHaT(3*@#} z0$d8*omw@TAoY)1&?PzT-PT+14s6-hEC@g36T zSW^m^=`@Khhcqb~1ONh<$90xn<+Q}=0js7~T(oVDygV<*;1d~Wnl6@;{9eL5_sRXD z@5maaHzBu&AgiK-`dcB<>KYhJ$<%Hky zYwRG1c}b4_fF95ux4ckSxh~Y`ZWai(HX=9DqJix34J2|Y9*rud-)KgoqUoKOrCcY| zeKWTR!|unLe*cx2hCI$n$+Hbj&sYo};99Q?#BW220+a0GMe!8AS)6oKJ@(^uk^M-y z_=oAfsgNgZi-i@LnU7nGaFb!7ktV2LP(g0)??JuADwdaKd7`@A#`of}z2o^FFxLXx zq0GE{c7OELq`)93QT)`Bt|vduXDP_=`V%QjB-1`DXQuvpb17XJ1IG1(m&lUEGvsye z;|jAtzQ`z0?pY6Y<=Vu^Mo_eqUehCsNGeSSbWk(>&`s%M_d2S$`{GFRKoy8`%~kUp zCmGl&gjs#tCOP_?UG6x5eWRLKYdb3zaQ0ygrJ*a2cYO+e9j}CQhy`$-!|tnn`LL|g zB#(LvqC>YBR z_VG>KI@@mx=Nx?&)Z0al0<`6p?Oj zl}72)Q2`ie1t64w2BEKL#u6av{PMv#uikzlD;(?D-4FwEzH8#j4G!d3IB1oQCY^h{K~`B zr_}2dMi6r8y4FOsN z^5b$TzSXFho_s~oN;yNhOH68A=Q4YJg;?~Zl$K_uPNA-5sIz{Krhby zILQ&WX=W40opklD`Pm7ENlN=Q`qiqdul&IpV<59#&m-9K zp0-pH(pw@>^K)Z2}<8GMKZ806z%ys9{R*dHu=|-z&<8fSA zRHggx-G5Tv=fP;*lmcyDySg9!>rPB z6IqHDAa>V=1DK39jI0D0+zKh3@b~>4R~lqWFL9|RKlESUWn8vtFt zs9o8-z5eJf)`N*9{l`3mtVPt#{(f4>-mM%g04R08dhk|ZnAJ&-iyUUjb7s3lAn-H^g7`r}2j)88!_ z@a8%5+?8a7;#yL9BqxYIyUGc^+k!0UiAz7T^Qg~zOE;}s;`twc+@~j!=@)hX314*HCNA7)3bE`}6J`sDRZC7XK?kP)S|DRgAogLJr*}_0 zeVOU9wqH%S(ohY%FCZjZ&g#Q<(}pJY`-4#=%?toA7ccRlJxUsJ0;7@o-g`yE6D4WzDEoauiyoeMe$xauSVW8Kc$KpJChrl zWXRwyx~ZDk1J(wQ^q{m*GoNWO_wli+dKw;PDek*UR6lW`(f*^=uAln_GTJG`dg-|0 z$)ifpshNAz$-UWZQ}#W-zJ_q}1DQ+$N=DKs+;He`2-eX;A)G$B6<_+MhK~;I)|EFq z4!1xE3b{6uGq@HmH`^*`p)`$Dzn(!=3~it2-FyFI7$O1&Szi&s?OrZ(MI_}EQv38Sj2WRZ2;I8gN@-2D?AihTgO0jj=I zug-yz)TXl(3Kqtqi!=rvC#p@U4R7|%9X>!w3dyiJ^$a(?UwC_`>zA&k%ni+$%iNgy zQ9(+mDYN?t|FJKVGAKWeJLt_`Y0$7gf49^>pO-?Ri{UC1ik(B$muH0&?7QFK)9XwV zz3deaHha&WCIThzyIkn~orK1O;+bqKuxyCM1guf+*hA|ufm9mS1yziCil*!9Yqwp0 z_!B*prETjTC`K3P z?Tf9CSL-SYnK&G^yjdo=^EuGrYCIjExdVUZy!f+bm$X>Myxacy-*x>7-~W;1Y03Q0 zy8apzBBGF1t2Y}~W~KxWm(~W67d3y0`JcyBjIlRqQAbCIZ$fJeR|wR>!~}&|TJ2N{ z)RD@AsiEn{$6vxCewtb?r9CsW&b3EkiY`Kwv=KSVt*2mdQ&Md+O3svPOy>Bs0G-`5 z5t$u?-O%^_$fbO2zosM(Vl+F!I9VDFS3D(E=@lEUZ?9Y05)r9U99FMzi_kJ{(wIt- z##V{OkNx?wVZWkaQZ=ZXJ*{!x2j5cxnn{e&4#(MJN!PRm70D^-LP9C1{`}^a1AqU4t z>rS1GzOBOCqiVvimYD*QHtV|_o;en@-d3ez$yHiGY7(em-5 z-+emuUZ-*p8h2Ng?5JG(j6NfL4){ODMPgc;UUsO-N!LR*AwrWrl*Ij{mLB5ije8sXl3i>(t>9O0bADZcRa{hs zVT}9QKlUAbFy!qmtNw$YwVqwz7*Hr$g;(dKEC!HW;ylPr?;SezuE+E6YJ?%oc@Q0~^Z0FRu;||sNv@3Xf zfBzD<;Hy+w2mM-R?7z;hHXw5xR7+)?PQ~${>VB2Q29`lezl`u*nVK0ZiF8!Nh@e{0n>2Ct*T4}x(J zJ(zXmyPQP+5kuSM^uR9yxKt}*C|0dBm`-Jx+G81vADkE)XmK8?uuH(R++}IOk68p9 zWN(Tid@~)SW|-<^6Aw1H2{-3DOmbd6CV1c!_ABqRo=ss{eh^{Z}v!+xv6 zw?W*oQ{0fpyDbE4T+hh$IV=sf8T4>oWq(uG$WYS6BcMW`a`4xWWECWR;^q1yeHOya16$$7m05@-bfU#-&Bpk6?S~@{#aI2BUgjgUS2KLo9nMFu!Q@$|?UgA2_SO&|m;a9TD?`$k35h?%m7+|a{WU?@t7BN% zYJF$Lz*2`7)e^-|4bzFd6X~ICZL!w?h@_+U_PKaolp=1J{c}X9vX-U({-)h?ey5y| zsM^W>MrLaqrGoliSWZ~nD~LhC4bgB>r-RS*3yAv6t~5vA?D;a z!X`*N4`+4YX81ienL@uP$RJv#+>akwFgGaCugw?SsB&9?j&Js#Cb+oaG>5i(@51srw0GJbPw%z#+c+&L4o94!wTjK9h@hW4b`5thf-+)&p}TF2ER^U!4H0=`D2l*_ifT6aJn+CO2tDL5 z)Vmo=s=Kd^H~gI``9vGfHckOgQ{^^=pHWb8-f2|TBc3nMe5`#}$Y}c;ZSV1v;TMJg2tPXq)$n@tNd_f_NtTXN8fX z8=@RZ2O-*jA0TN@7&zpC-t#EXus4%Ashe_!5;ET~$e&R#Nq4h%MwG$>C>i49!;KZ} zk4?mwlCr#yX(q%PDi4rv{=Ok(cf5X>UAChB_UN~)!K-O_mlJ=MnKVDIYTxy<^j%m|+9{zVGg%81^UQ^kauUV;vfelyqeFO5~gr#z_UVf4uP zTj2Q)b?%`O?7hR&|Ta62ibwF^7h|t zY^&3`SM+9aP0k%JO0I}lCN)Kd*7m&THj`S9ZL7P@+9JEe(jus-y&88`;eDne%;|l2 zpU8thZvaZW zAbh4Y`F9LeG=IQ7a*pi+t*iA8jiLPfb4rk#%GDLm)lJSDl2y1-ZePF5i~%1_lTXid zdIS6VwDw77+GlZc)r7~bH?Oy2RI8@#47z-O^i zEC2dfVVe5cil^#ch3(`E2>fSM2IN3C!k}BI8t7r1w}swZSN&=|su^%O2~93bC+Yc0@jgzYV-0Uf*3wxH zQ+_dTA^+mBN?y+P$;8|)=&qsRBaH$0^9a{oyl>qN-_@h1BILmW`fbL#{5o1v(oBr* zH^r!rahkG5vX?!+#`$vl^d=TVvd09gq`TJPB(H-raQ{U8-Al()NqtaJl_v#!oD`j`mM9df-Y?>TA?}W0uVa3D9zL#gV(~YE> z%&WCzSA5=6YAFr$BYbE9X3F)P07v-sc`TY_GxTI&9=9-E*T4(CjSX!(lol;0j7T0f zEIPY6n+u;`2s|h;H%o*T_3>v2F$pCbVBIDJmLy*a`Lrl26CkUo2wn$GT5we^xNU2$ z(_PF`p`Xa>BXB{`IpA2s)DNCN!tZ$wx*4-uW4^*4q0$BUkPc84ErMGE!fAV%F3dfo z9CSJvRu5Gf8?qYQAuok3llWZV=Lhual;D_|Brn(7n0+cya^7J4L5Qr_gxMsF4&i&K zvat8C90b|KcEe`%HpKgblGLyWX_G|qmvXkjF?0+5{jaP5Y<% zgN%uzmoNFwTr=XbT8)Zn8|xhkRXaLms`H;x`=PiH$g|Zn&&nwK_1Ngn5dGGO9n6H4 zT=S3bYQ}-(Xodv;YDE`nu)~K^N}GFQ+q4>Ouv_ zM`Vw-eNB7gxfNHXVHX4(=Vx5*r}80N8NRmi3b6>(Qt zA@E;>d3e|p;yYTcv)^2);RUsN>|eF2F#6-FrZ{I=(bh@c%qLVt0jtydS@5VwV*OU0w~-HTocf&+ zZI-IGAp2D|WjC`hZ6n`v%VN!-0P;{8!|M+jT<6bas&_VeZQx&ASf{Kvf>@&w-{7?e z-Qv`@OjqLbUT*Bv<$Bf_j@ivV2=2P=4$~%Mx8B>=ukl?%(T!2EfJ&%NeW)}V)&g%H znvyE@V4tC_3Z$?HDw}iaGET59O1Etz%Ku#Wd^D5hb9_VcY&yl&Yk^sJMM>tl4V7GMb$lJZPWErf4oSL8IHKPz+ zp?E0m_qU;$7sgUrY~CUPOCeudDN z_jDKJ?CD$h@5YP~??c>jKX63k&~h4zTIwbo6y94H=6HOj1!TP;{(7 zoPX0K)BSuca9L`MX)`bbf)2x9M}v;cbXXt-G*9YvvmQFn5h0|tUfdl=%`uG%zMaan zLcUz4*T?WnjN=+>06xg^#S9y!V=zR}q@&-eRT<64C$%kFe%K+h91gX|%?)h1cypIn zN4fv}-?A8}lg6AVzs-V_ofT|lbi)NUcDAX2! z?UFKJH=>}+8hh5DONXnRXUdm5S}Dl8Oa5DO4}^Ia>rucG&f;i~8~|`AlI{~4g%YJ) zd6aeF*B{8v(tN9Tr}|1Cy?a-0jvcSC!U##VwVvAqn_$M zVi^*q?AM8y)5)J~p{5dA*;^gxa9y?&g={(sM}Jyl4|m1YI>wN@E7n7+qg!KLN%0nH ztLXq4Np(6twm--4V4SgZu;?c7(a1pE=-~T}XokyefxH^Cvx-ra<9bQjXwFmUylKLi z`Q(p^#}3P8zl8}-Z#=<^+YK%J&m)=EQ1_{-9G0EU9`BBHDE#&h>l-2HyoYp|V=*|t zez#k1avcU`tJA+$)A}v{`1vWc&3R!5xXF&@h>2Z4dX}^y}=5`vjHlr`td|o#BZ2Hg-+*ctK%J zm&5op5a>8ci|8BFiYXm$+mlXgRkgSmzO_85i%oFWX(?9d#z)wPf}-Is)n1y>u)hL%HE{;a;JvvtHK@X?OlK>Q}%L7pX4pGB^G77?$5ngKwmdP*yQA2eMj3#<1JVR zyk&QG&&}~nPt@VsNr#R?!U>d1lq8S^GBi5Ls6a)YU~KjFcSQDY8^RTPywJo$ltnly zeAz)BWAl&EBw%a4?yr&hg}hl;LI-CT>waH+pm{_8mH%4x!ff?I8gQ&3=THafN9S2s z^a$~PjAIweCyhAI<(Q-6(|sV)hMbYpc6Zs!^@+kUi=Un)_83Hoi@-s9)Mb4l0Fwfs zUIM9m`-N&8Vg1Hg+c}dL(8$Ekg^Uu$SAAJq3c=jwe#)~U>y)`ueIw)hZ|G%Z)QwF; z4_*JGXe=(@PQo#tRQ2i)#FHdq6?`4Sk`pzE!wwT}ze_)&`1DU(Y{wPoZKd0fF~l*KYlhP03TrSwy)MmGzXo{Yg4=V-E&4m;sNRqZvvc`k9+lN4Av(y zh2v<}9KV`w4y808Y=YYdEN$|DPq-3yHJf7iNMeMEVi@usdDtC#c}zC)$x%yWOKG31SM=Fip26?Hzd;d83j>lx~v<77uG9n-G|_kn32>Q`3YaRDAXUYWs{kG~(b z|CWepAg+y_e|lQe8r)$EpzLM4X}(#5ctmG@&DzKGo}_DxyD{s}pVrxEKEd+^Z_LEN z%s&fT2)PPXgYTA27ZAe~r3o3N{YuOUqg_hP2SgxpNCHWWITp?7t6p4xXzNYdL^B>f zH8&SRjJrgrr`#{ynz4dMcU4`0Rq=7IjO2XJlJ5D5Me@fIWJY9scJ43Y;)u-GA$7OP z*zuvm-IZ*OWO1Vy!4J`wa#9Kdb_p|O_fau%FvvMx;&_b~3c-#5e?#lh|8es*v zhk599+)@31HV}WdThF|u4%1(&cdF;$c*blhVLre?Zsk^m{(v&R9 zK@y_VC7m@FKPT|zC9DM~w{~0jX%%hKk9j`EDoVP>=3`AkJDXcn|Lo}^H!~q(drbd< zWXRITP5r@9Xs8VE27NvW+v{=$w+)Ynwqpf87wG+}`JR!WcDiex9Bq7%moR)Jzxx}3 z`|Gm+aKy3@byZ*4J^~7!Vdn z2a`8PZ0q;8vOD?L>4XIY)Gjr?+gckXr(fRKBYPj?j&S9Ek(C!1_Xcz|RRD+>NIfW{ zyoO!;%#rt{K=vN584ckxzf7(lpLm+|4FO2y>R7DYBC${l<}7*aT4Xh&nKT8$7ODr*~QL5HD!T8!N%zA1n%@t(H9M zYv;?p0wqMi%wO4`luim8^c;`@gF&zVW%mp7VTUKje!C`>dU(R&%0t5q_bdJ1^#mq) zXbtMk7^cMrxsc~K#+rriK}C%Lzh3|U3;j!F!d!@D`gbaK>Aa{y){H0aq>CwZ!&v@B z_j|VQ6*Sz2?T#b^lSRfd=rb_6rFG9OGzihHu)sKfG;B;3v-|8$928+LFVMxNB%1mw zVgHmHi7t&+6m^`8u_>TQCan2 zG%^QQmYokgV{A!mrjQPhil2;Y?Ts=72$IoszLbp=clOOX?h_3R3-(V-BoTHCZd4W( zmhWl@*K!}yc>P8P$xuWvKmz3yb#u;^u(z}*cdqrM^H+ilxEK87IVcM|@VnSRfwO{N z+;Acb(=MFtZ{&Nkm$38G<}<(@s1C%vLtTscsS7YXf79CZ6{-DpA|pA}|ONi;SiRsw+c`7j-YOu{8k4ioF!T=Sln#Kkwt?3=XpA z54cIA@%Q(-Xs8<8&2PWUDch$_D;VQ)|C9nvc$e*L#irGlO&8$gPBDI_-7@xBXOuRq zyAS_DA;x{1?d`^xqV7{A@)f%Ng+p3#KZX+`ZtgR9h*htfXMg$#a1QNjQUT|y(@TRr zaoNB#6kpmxJ0yXacv%ZAm2(X}P(JI&+DxwjuOwJKx4oT6L-i=a`NA88OGSaG&H2U- zRI=$w*i4i}9lIk^WvIx)F~9wj>FGec9+z;wNyRtNKD*sT2=5w)8Z4OAMfd9W)0B@Q z#p?Gt2Z2TQs5=Iq7PXP;K-5lqceAwga_Yq@@J%v^YS_B=q(4{~-nHAa_lD1R@mnx% z1>lABAdW98Cw!788{(`6Usy1G=vF;FWX9%%i zD|rglRz}-5;s_KbsKCQBos{i=Pru9*qD4KK+isG5N}o> z!K%H+UbwX`Gg0lD6WYd8GdODx{W%U8LFPyn>|GP5J>B-trt}GzR-K)MT9!Fe$rH0B zzD&UxD%nTyO$TVZyQ3E>Eix?v%YM!_yCsH8()T~;J7FC+J~J2^p!|ymlfyuN@8Rob z3@6sGHGnvVDsg&jg-w(IT^Y8uX`eYpy3hpK`lOt&7QorW zzkPdRiP%xlLt2%Ayu1Xmf6h}sJq|4lDn( zPcI)0u-CHe!oS7Mb*9BE=s_3JS99yBmtMK`V)<`7o-u$@DW$uNbwyNMW(U2!wI|H7 za=KHfi#qccBTmY5?Nhbuf8o$`;6*WRg(&2Fgm%hAMa)3l{sO!25)a~mcz?__SQ{v+e@4AxZz(5PCtc= z`KR+czEW=E! zu+$zxEh?CyH92F@=H7E3P1cT-Gg%tHu@ENe?F$SKo-mQY2XPT=HtIA&HrW{-&yH%e8%1S=~=B+ z>&;_-4}q}rD`ug->%@guc-m)bJtn{7WIhb{9c}mz%JGX6Eqk+ZM`j%4{g>#Mu+^4g zpPS$K+J3~y3Hj4dagR1*d^#)SLJW))>OB^<1mB3i0$*;*^Mi<^g<+WkH(Bv`t^`>g zo#&Y{teNKs&s&IcTb(|S%kr?)NFwzJ#j@mUxup@w>Y}0l&#C>Ubwi}-#SnYqDXNEO zSRGfe3u9m9)L39_w2$XC3_V!2Z9jQUe1g&rd<8A%=r+x_)3`2v*IW@UVoa8 zfR?BE0Q&Bqj+ay~#p3kvm|{BRa!9Iz3zdQ$nlh1{v+6S%i) zWwjB*;OjqszWK^;S<|5`0$>F*)AzG565K{+^iV)0F&PXBG3v0r5LKuJ6Sg79Qi6F= zR2)f96~rJgNle}7U5F2DBf83dSmz`~>|7d@Gf2SRqLlQ2FVVk_oGrOWsQ9FQD^AXV zl$7#^><0Xdf)9?IT~4-}`JjTMuyun5OIGlxI@kgYC8<{QFkL8h9cA%<0*?T2|Nhf| z@*EL~Z^yP=T2B1>|I_ju>3skFaz_8t<&#S<^WLBHLCWuUX&f@`8vp_S&`fTJO7#>&^H(P55!_z=)r|v8RHKhn2gXtEZidGX&z3 zn)a#3nL&(F5jAAQUSCuECi~!im0hRcgMnCW7S^us*7w-%I3}2wES6-1a+s`rx^F>d zZ_v^;%gY4+kr8Gob8*tc+&aHy>8$-M-gYd4?Uu)5~Pi2Hhu=<^Y! z=&-OkE+9V%{!~C_dgdy(m(OkK=^2LWe9ypyO$pIQz0V-`M>?k<oRcg7OOnqh9RZA%dB}DDUA_G`)Xmy8&GDMDRiKZhpyFKRqUBuGgl4kZ;-W4hcyS%^aiPx zOaNaP$UmBT&LoHGKB&fX%@?lNRi_lP zHh03Gtc6)gO8m@jd&T}Au`ank^^^B~*29Ro_=npPV_d`Zvf-CKR|_&k8k>oifl^3`rq(s5bv2g2&X<(m%f6U4EILzzN4ovm{d;qIz)$@59fe zYRls|uHLEG?zK=o!KyqoO+k|mQ*RJ=xr{7NS$PTJy%V~;x2;+FC(C+l9uhuT2KzV9 zC@QXtT=5oqR3ndfv*!cxYKh?>741SWpvO0$bhGSJ*Y1mHYB|(j^WKGVzUmyMgegut zs4c4ZL6RLoFgI;IOK7RE>2Z0nFi*vZ`7%QMl}Z50P$g$@Vk2v-{nZ*Ndn+OhJg?t+`jQBkT|Iy(HAHL;)4*(}fVtZrZ;@h@v8$ z=DV>BB@dn+ ztrfSmLrZnM#~PQec$>zk2|a;dv;!ZCnw_(SLWhjZdNq_K5CPerFRsbI#I&(4Ntk_T zq&q$zUj@!))-xob^%zr5LL{T6(>Gn>T1NqWdv*iWVWpF``M_}t$g)O(QBD)BY8ks- z!j%ub%G-+7t~ysN@-_l?K3s`=Y^f?zOtAW*;je$s@t!5qwuRBClD}Ic*7o%{cE>$0 zdPMHWA&qyv(FinSD#w7%^>lDl-9Em6CHmM9$$?K=`YFAZc;MdG@@Kw`uYI)bmYDI|;ysi-0gmgTa3M=}C^tns!a7oeoWzm2 zJ?cBRJ3KsmJ(=4SQ<=>rM?1{D5;pTOUS~&Y4`|SJG54rCel;mfBD7V`t|pUS9RIS7 z!6|Q8$-rUsFXC;BN%EjcubnpuO6*rr3E@qBX74T?W-m;BZBxc(EB~Ff0y+FuWd;xE zkF#PnT??5PrDi#z(5_pb5;jID_CF?=-wO8%bD{9}qx5`Av@P%QTj$#eR=bwGsd&RG z!5_f-HTT@pTk*AV)O1`4qfN=mA(WnyHfK{5Qq>d^w&;wP#o{0HJu8jm;=E$tV4auQ zjOD>T;wd)mP0=;}$Tcmoo~%cJCOAKqE(w&daxe#zNUQ9m6sq}ms*+XSDhU{7%=m^S zdyzz26h7(arS`MnHan&$D5&>NnrZYS5PmBI%D2Bcs$RS{G1}>KS6LrX?G*if5xyZp zCSc)^NM>)9jX*NioIi<{;jyBwO@%4fWx34=+NO(he_yvL6f0}_%d;bCBdSlFH+QR;&>O8$z3h~@S;D$*9ID5FSmD@>0HmP9lTHY{UbC9AKuUDAtt4uoE zZkdttxAxbHnF0<~z7+3bnWg_Y_IJfM`X9Vz?wLOFZiPu^yn{WGu}r>CVN&Lp=DCX0 z^4r@+WOj0-dBju$R?IT)3dwwZ$zjY+T-8z!pE9N0MZVo;v=?FNfN3E7DGTP6V>+d% z1ZXJEeju+00)85spT>+ax1E_cKlzj~fTc0UklEZNJG=7dgREi?{)(haA1r&cuu(AC z3K5!VXYa?^@}3*@mpQE~e*hO(rqcV{cm1*J@kiHb3HgBl#HLKZuTRacU)QHAl)<#G zPPCF)zf5Xijq#;hHGv54u5VOB*^@$P?A+X{6P1G}Uy$nP4DsxZF=3g96eNtGw9N8< zf$RnJW`Fm!p?IEgDzjs%qQs*kUE|lBV}5gI)K$2mP17~nlee)Nj`wkGxOP427$35; z0#Ixy%(@9(YpAw7=T5WT@mOD=F_gjV4Fupm7)DzQfzkN&( zZ%IRDkuCP|9`5G4Km*I&q}#cyl)6pOKp zys`)=E^twv*U-+5R%Q;bV0;asgIdqAtAP|p5k6u{1GOkvn?ItS;6YHA&VflW!fq z%EB-L^Wi?po%W`Yd|;Rt){&=YwP~ap`~JH1z;;0&3znUxdgH*ENm?TfD6$pkAdyM; z_dVWQwIHRqw{MYJxYj5t7UuvH7Dhfx_7l)DY^`z9Cu)z`3D8O>+7?f|urJ)-lw)1-FRmCG=E|WTRB>IawxZ-$O%_5Y%NOg)@NvTAc1@9rxw05TjbK@e<<#( zb267Lk6tuDZ@1Bmm%0@Jh3D%Y<5kcSG)Gc*iFn9V;_LD1$pXYoZ);ed-EdBXuG$CP zM;0IG1k~y*d9$r2D(&82)NvA;+@yP~k|ONHQ+;&;C#2?Q;Uu{b!aD^f%c9OJ=LZ86 zdAlR*9hfr7o3l9WYVO}Fq!e7%Rd(v`(C1ySoP&T(p6CHglgk~)9XX)%BSN1(wZQ}V zxmcakP}a8gc_!GMkTv*OiOzm9(aGB?zaHK$ffLIY)|Wd%LcTt)O5Rc9jg5=Ck?$rf zp;|W0>O4tZ;h^()o)Q4u!!}iN@oVlNh9dX|IJVgYr8vX8xG@)SZqqnB?;@mCx0C%ZJwt9yU}e?018}WbiaS|$CPY?4aTs9)TEfttVXTj-8Pdt{5y~>Ty|`@ zXql&(3f{gpqo3};Qen0(c0yhbPSv@yR>V@HLa9ClrYd?YoBE%A8Be*-Bk4%E@99v( zFY*@Sr&-H)wypL98}m$O`Qu|3KNYROK|t@INMj$7r8_E?V1gN|cOGh3y_;vWT)V*7 zj}kWY(e{kBNpV6na$xw1mW(k@51r}-9mgI}#1FT-U4)0U0;+I*QI6-OZW4FR~Vt$Pt$6^n?o^!@-afvuiP&S#@W2&nJ22~_@ z`hXgM+vH|V_r?(~zJI;f#8Wrte#^@zU`k$*mf7)Kk{?%bNmby}oYNO0twXkFty-V= z$%x#WoSlH%`=#rrD@tMqfQg5bmC)f*eaa-QP4}rb)1Y)Rv*YB3(9;t7Vs(19(`6L~ z-1yid)gB64{0O)7fob&j&po0JpKf7}m0t65dN%!WC0)B=-yt}%gea+gnabtt8WbE0 ztI0g%=u%Uz=R2$E4ziR`44LS46tinElkjj%wg01z1?6!L*vXIfy#G8%M! zCQv&q)zcPw`}~`O=1D^DPCVF28Q;|2_nJxDIC>~`bCyWyy!~Mvy_26LU_QsHT zO;I2oxx{4p$M3|G-u{{+lV9ZUKS>Ar(oFNvXR4W zw;I{fKD!|Fobj7Bv=T+kneEA#H|06v2hCmVI#3U_bf!vA*>YV_Ke`*&p;Ga+FOHP^ zzL{qXSnSGJrdcq&)7(=+-PQ^Zyb2*^n8fGI&BT{&a|HEC(!TSuoH&8`uV;-mjqzr2 z$9M{njII!3mdV!a&10u6GRTMa#1?a2JgUUIX*!8$*d2g!U?Jz`NQOXR(P?q(TNz7Z zGfn4-mYTYBr&9$}e25|sO$(O>@xjfvo5#V@00a_5%qa2KJc-Dn{^!=C_dc`PybELT zTlrTnvrp=ux6bDyJ^Isk#?VJ+SCdZn*x5d@9IdK$A4wgt&FJ3?Vixt$F=9*~Ft;37 zCWAl#^1QGEX371X^|QZy{l)q~K1Bwi6v%&S*0@{2JK9l!?U6qrOTRX8C|vkskZ6<4 z+PwIiRmbbRtzQvT?td4$1e<`r3#w1MHPk=oW+Nd8MJ7;Q9k292yEs6s=g?|QrGxA* zUFz{PTYhQjz}BN~ePiQ$xiD<_a-c-XT3rHmIzq5RkHCV=fOB|Wt~ngPmJiXq9*jRT z=BCVHAS%tRLw1!FJgaWheoHu*(2T~1)NeTNzSAps!Epp_&sI}ds2jOn)ZpZS0nWku ze8X0?azrn^QV8_^{8s9?Zg4drmsTpd{O87}dTLz}RIdna1a8r!iyf_vCPr@t8I`0v zTHpUjWdf;rj-71d7bQn9LiKf_GoLsCCbyC?nxEG@xbkFTYmGJ=1U11Gpf?W*BGDc# z`BuKPkvQ3&t-8{%AUv9%HV*|=J}rG9(R}V+JRejoX3a>}8JE z4m!6UhXAy>yyS2iSX0l5R*&&3D?iB<+NY2jCluV=mBrf#waMpe=Piv%fhXSwZx}_u z`kbw>46ZQ&pSd#lE)4smWbDou>6@!x&Sz&y2*Wl~{b57L{mB5ptK8I^SmsZ9J5Bli zJdxK;t<=t4#M?)!6KB$}_1aWXw6q{xkGlZi?cNA-ygLV6tV`<*Q-V)k6qtAdKiOV zvh_6l#A{?CD5JMO0U+V81BG6H@vB(1uxr?r=yLK&e|C&?Uai^asm*}0pP$MaQOBP7 zR1b!(olaCOED=qrjDGG-Z`ufLFbex_lyRyN!z{^;-8gLbIkR}roFyds_*gm#J56G@ zU2{P{hWS~H*wQs9FibM-A9JhbmxXkgOxJi+`&G|D99({T0w@=Mfam4j+zskI^38W! zuj~s)Os#x6V>@Q0M7~u}Qgl75>n3SlcQJ?`HfY`mj6kMO0(ne z7zfNNqNO56fsYR}u8Idlh3ltmH_mUWe7?OEz1Dv z1U$($rp*l2(0RqWw9-MspVi?_AyEC4YtKCIqv z#TT(H@pc9zHN9n^HZ1tFo6E)eH8Sa(;Nycu=0Uwn0|= zM7Qp~zvd4luh8E`*LQ3NaEw@k*V%Tb;x}p1_5JCs361D2tR$XK?r#Wec2+LWDxdPE zC(5N<238naRN{iX+&L0Et!@C3qMt5WW454NRfJ|GU~5>b>`@5su8OpZl-IhEzeG$NKmb3C>N@TO!5o-4sS9OqdvC{b)CR1N3^7Xji1}VV5Q9 zXTp1{VGv00a-qa*^%e~A=LM~#1@cOelp|S+_!_FJfXSL8#IfEo6u5fz3MCqe9W#x zO3hg}g4mk&Q`5~?pf@>>q|ig{SOh0zN$hLs@(#LjWByNxv(Hg?t#8m*e+%&#<`M@` z8$%!wJgN&Fr6?(YP17C9l#t4Ja#o}kGNR;_?bd4A=CLn6;^%d$V0;OLs3;`GoH=Ev zIqBDkZVNdZtJlBEN~^|qsDQeh7<=`rB(~plP~Gg4ACh9z)TJLyvH~WTyH5MOPhYp~ zn&K*xWtG^t<=L#UHc;}Lr@io#)gt%UU|-J?Z0s2zfy=P6;19_d`I?dMKA3HD{`qv; z(wKHCGY#H*R$Awc%P_!4&Ky{J(a2?U;jf*19QavLLg4es3y%$4;uk%ZD?ZcGWRWVT zp_Q+fZ9HTgiy3hVp4Sv0(9w;`rrQF(sPsJHDtxHG0LkMo|uQBGC#q48~?QofNYySx5U4!S5^{qns5R< zhk#BF?hl`MmiYaC2w{HcbUop=IY~oVshLp~Y@nq!jTuZ1DyL|nxb1{aU97YlR{Hbs zt-w0cpbEU4XcCKpz5(4Z2<0t2hBxkW*9F?miJ`67P=N-OLqgp1+jx?*Pt**7Fox9? zC?hp>k8)g_9x+z{P5@VeM?sTx;ypiKy)@F0eEZLbYuG!A`+<}eR*IJ;bWQE6=3;N~ zE1&yGYvH*zTJXw-*mA6>Am6BjX^tN3f@{?TnpFGma>D&y{!zgAg$#>*g$P(StkZS$ zNP-nWrl063IMw+@Ndk|YQ=c8Q|88-y4Uo1j#bvi^s;zswNy&#Ro}k29E?*f<@wk94 zVy%Jg(4**e+M5}?Soi>)z%E3i8zC2&!PIaLBiYsqmAO_T*Z`YsCl2-#X!@dtV6f)2 zuPzf9EOkq_K(1p?&zNKeT`tbjo6++Kxr(DdONMVzNn|QI38s?%c}Cc6Siiy0|JHgs-CED-vFh zrHh~BjHo|{JvEci0$qx5#|=?~;%3Vcr^LuL6h)lo`?;D1dWC(l9p0{{vW#x3QK z0A>W(xwvRiQ_H_fDhs0{9-bPypLw8h z?+|xP5R))f+S?+Tg3Ts=B+<)=)A!GDx`n3=p#F5G=z42e=!@A$! z5j^GRU=_6e9f!MR>s>OIQqqwea*V0u`N&4ki`_+h2zM-;(l(|3z2oR~itE^|ag$s2 z1x*ghv)_-4MO~a|`kg<6J#INa$@Ewr8nN41>sBts)iFGOaQ3*TY|#+{2-MDD6nrO;SG-ryjF)4bF|WUdQ*fdI0M2E3rTtQlhsb{J$yBt zk<`4EzkmF?4ZBx&j+1k*W?6JxqO|Blb7BF_WRIty)z)Yl(?{rq}lL9XNxqz1yht057Nrayh zMpdWmpIUiABjmIKC82(qX))Fa zgVX)8#=5`Qb2EHsVDr3;UA|vqdz&RnbX1@7)HAYL+-ddtY-pThR(&+gz)zZLssrNu zfV3;){m5&1?O^^T#%;hLn!T9q^hbQNA(8U=M84Qs@pyZ>!aTSh4ea0{zk5%e>^M)B{B7L&&SWkntE7ZKd~v2Zv!{i?A( zUVs7HQ&8(1r&a1RuC==mH*bGx{{D(fI~n)8o^cdK?J;s`$F(oZ6BdA4#N_n%j16d3 z1~Xl0EF9lDI+2pr*|c5 zrQV^sjBBv|@7Ymbmm67u%&VI7Ifht?Ga`cqIG1#Fm_lzQg%Qz!NRH-)0Yf7_!B>m(#9CL-u+odch{ zU_3|bfiD;X9x*W!5YP8&@9z^^PW=N=#oj#~i)Vwubzb~yf;jXKa~kg%KkJj+E$@Dm zc(P_7UZ#y%%j2gdPErwue}@xCifU$fSXra#MUqXlqs09#Zfh?y89;EF%^+H#=xzX8 zpMkdO4&v>#-E!OJF)#`=p{j=p$O%rhXcT_xQT_yZ-Nw!&!$ z-KX%zhr=ch6!Z`6`sZA((J1`4dot%rz)pQW$#`fhg4(Fm#M!y{vGcRN!I-YDF4K0F zApBP^tY-h$EdI~Z_UcAOYG;Q{4qkLF7jwFaf-unVc#fEwdS*9WztYPo;y5;Yv_mp$ zL(JVl0*EQb^2>LVDBQjmyP4v&P7*X`z7xxtirI@8?`bf&&;6Yvq6_}fGuu?9>vUrT^^WrQ~ z*8fZ_S&n}!AB2Shr->6QVQK)&X2VQ=_Fn|fK>EUdMU!|M2g zDH&%U-C_&E#~W-4JgFrE%HGYZRDBel9+wRG7@3n1QHnF=wu$ft%sY*A!Us9TtULYO=3GxMjC8idr^X+LcOQrp| zuJc4~*QX(!JcPG6GE5H2R8nJ~H+2-D68h84q+KGjUFP6p;j=p3wUInF>YFoje|&L< z@2m_cJIf~bgp}W2T$%*5`z`vyg7aRP@M+y#?TglT<v}C`BLdUO`SiFQ-^d`Z=hLOLkS4dnPg^=xV`H~3#ll% zEKVXi;nytYw6N!a+h#Kbxf68`@apZN-9uPO>;IoIUElwqUnIPL^}jCGfrZHkj4?Es z!%BcwMd&M#CS6~5w2PyjDy=IRR_BqD0vCdJ^N6YgNETienjv5${{C6m+1-0{Vi9`h z;UHrSg8#H-&^LhM0`&r`o|a0}8XGZeSLGt4@N>1&)bxf-j#NO@*f6+if)Wa^&4Nqd zuUGR-><(GXX_dI>UzA~5?iWx)1E98>p3@bX#6XXvVta@4qq^5tUXd*7nlRezR<56&YGPjU zvuXLorKMwYT?Ka!51X!0sS&QgM+QCW0;801WK7~b>cyL1ZL746y11*TSl=!$E_U^c z1kPO*a%}=zv%jlpDGI8-_Vyco+AquUwR7r$yMlTtNXIWq;#K-f4L0ubwzkjlbIn}9 z>qkR**|?;JVpMhdugo`WYkf<-HUUvf_JwR~MR|H>{M@WAnrS>%j8Esy9veZ0U5Yta zKHqM=#fK*eBA{zXGnXV}ky%g68+@rrA*9z-WQ>dM#rav3Ky2N50B`YYoPr0qB4nYW zGvGoVI(lj=JCNGhlL%_7y8VI;!)MDbXZDE1&!2g@9utr$NXop8-|Nj~lniUW zu=CVCRz->HNzyW#??LH>R(I#$oY`C&BdS+9f4W844X4r6lagM2i#TyIJM^AD9`#(K2>P z95=ny2M4hed1-)TBc0xNny%Ba4rUa#{( zH*Gh8lM)N6m7|pJ-~>@{Xp5vaeCL9KvpKu*``YB2mc0xewOYxsA(9jkF`^T3zR$`E z?pkkToFC7Bj{Ee9J3|e&vj{wdJKZ?dD!JT$Ao_2Men_N7i2d3vuIZ`%VrSMUXZzn) zpLfqp9;(W@^uoWSGA%eAoD@Z7H8d3QH|d41p4U>}vDEF2u6h1Kn}WiGv*%axmpq*L zcLmg#kclg`;Y~s7%G(F>*(A--%n@jDL z|J&@q#2_lQ@R|oW{|(7Y~lel?|TQn-pwD{S{ckY@1f@me(;q9W7QH7xntX zlKVeohU6W{=R)FI)ZSHUHdk?Z{;NFpyS>1jp%0O<|M!*TGjDI=8Uz9GFZ~>q=N#JR z)iyOXl9yPEf`Na89z2$vLp2i0am4k%7O?zl0S(iTnm=P%(Ir?Eo^!yaD%1Yv!&Wo4 zmi0p6Ka42it=<6GJ1neFB>dhdgTj##ImG2bwACe^XL-Z~Zv<6t_-gf)my8WxaAx7b{D+WhkrS92} zE@F!^=o$alZ>*ODIQxQ1M_j@v3^iBvddbE^AhT$CNemvkuRO3#=L$)rO1lMeLQ8Y4 ze~t;d>X&JILF)+DF>yg4(YX1`ffx{U5|6{(Enzd7H%&)~zfZkvK&3L{XO=vQ9?GA0M5O~V_xlCO-Pt^iY z#FN1$Gy}JXo!?w!KQ_tb0}WfS+-UqvQDJ(<=73)ol-Gv!_AALj3!$x#h5ol8Eo2~$ z^dF4WrmW-3Hi$&uM1$r4Ic)~*jMp4d41Gd~&*|_LpH2#c31$~Hp&m?K>c++7)VIjj z&0iwW916d27C~0#R0|3~_*47Vnb7aMR|p$gbbN+tASr)Nr|)fAC{Erke$O>g5F>Ik zp$icE;y}#83NRa*6n&yD#cDt&`x?d`y(Xk!dt-Q_M@@v^CGX;+Xh_dE2LnO&Mg&Zu|Hzd4~;_t#c^{yM< zV)j^Y!T1Cox`%G|m9JH!Z8DwB{HcnBDopd-Vr$~pMTAexyY0%+WB2EoT-b6#Ty;+H zT*hfsNIuV~{Q~x5a~Zc;m}UOx4LFT2R%L5V-jaUQm(rAyKbn)SkYCvXPu#Vk`*0?{GNvQfM~uNK2~^sEWDE`d1cVYr(|N^VJa%oP$FFB4|^Doq4uO`r#5ev{%=v zXJb|g`c5#r*>>|eN*y=tWg4EFt=x;Eee)|v7Nb~H2mldQ>|@7p&K1O;dd#p}fCavV z++F37cXvaQoL&+9vfnAUfx*ci>QzmQB&sCQ95zYSPKK$yG;&v-z&tQBwG1ZzC?(RC zK0PxqZK9SlCZjaK(6?DIWFN2rydua=)x5w+`;mO$InV&jjHJif`bsh*~bfIB-K05eoxo#)gZwK3dFb z1ndd=0)b5dNhe7-{DcVN(>0BU+K>4&=$>(FVBgOrtwa0oaS&vEf5{7zJ+IlikObwA z!{f6^I#MT7SuC*p&@XMm<(`cmRa~mjMyh@;u)JmBhj_g8@qUE}`aW4>skUG9c}`*F z>l+mD%|#gY=B9dhB_Iwf(KuI!?TqChS@(2vWv9oJJ1#*eLqBae}9dVfVyx&)6%XWa!O-c{e&m^Hf7Ox=9__*F(>BHOnulHWI-ePiA? zbsViHda>&6kuDa+TxcRUHaGw?R9F5(1%*vJIEROPO%Kqmj1-S*YBaVDG#JmX0+rv+ zU6naA1wcwXcI)j=E!+EBjKAd7u8bZIt)$3H?h)RL^*8nEK8@~M=k+UaA={*(D)BB#RD5E~&KvVm~wBz=s4bHZ;_dx4`(O5K=2X(38wO$s9 zpYpP80WhK_64z}Ko3-+W>wWNt%xMXD4oK5og+ltct=f4~z8_vKDOG(RW3?js9{#Lz z7<5`#RDw>Qkp`3vnKyTx>x0es-avGL!lHjLN%#z`WZpRRDzfbTcBLsd#x;H zU~K-5l$qaz&kS_$>V&7y)r%ZnSZV9j%K}8(uCT2ZrEX6a;ogxk?d;T&&9mhyLTJ!qi!zy(lrKfPk^{z02w<=Adx-THCi<@wGUY(Eq? z5Z{TI19Y$t7VS^ZS(?@F!Mo`E_g3y!6#EMnLw}m3ipX04`vw$l*6o#c?p-;WFt~p4 z)VgEQ-KqBUUsF@i1 zryDo}6IkB4z`G_up0UTI!Kds-01$U|UzJ2)MC)8-Nvcj)+HOcy*sJ6&*Y55af8Mit zOl28YS!YjAVnc&ub5FR6q60?|TU@dEd3@r@z9CLr1qJKVt@OC5lA3N1(z~|682!(D zalDS}b+FURQzd!P6w(6^Ou#S^ zwVnXaXbKmQTQBV>^mZ~RGF2?ellEMRyYZ|>x)dvq8z>@jmFf)p-n^_8(IOdGo+^+OLB;@YN1W28^H5 zyr_ZjKbCk5FY&9rSmJgUS7OjR1|R{9LGSby%bXgyW7!KjD3^S6&&>~_Fr+SpI2cCA zb-9O#TsbsZcUL%jw2rx04llp!x>h)eOvfe3lDl5>^QT~{E%kYLhPrCW33P0>DyQy!xJ7a?ulQv@VU^Bl zC4%;6h|Mr(bhc93F)UfHn9gfW9lVWdMpC>7X}kNv(~`BK&kggfJ2V$T9zrj`cfW-m z^fQDHvNCZ(t(_xI)Ha0Bw=7Xx&4`jI0BWhtJmA+=bOa{Q042adipvKhkR?cb%?Gk| zRZZ(4xQG7!#}{{H7dUQ{PG~AnCsfn4UjAo`vEJpw-+Ua=Qv}~S3Zs)a7WQ47^KIM3 zUDai(e{QirS>h^<sGxA)d?zZp!^*Fe4JCP=q1>#=$DkYf6r8$FMkOVb#Ae?!?wwmg(Fy+BJI_A4| zagQRN$Dm2-Xj~KDmO;W#qrRcW^*dS!NY1*X+Y0&*B05hqTk7-_CZ5f@NX7pPyE6P1 zB|vkun+QsJ+{P-=bUv|_(4GB{pnG**B}?e7nPkM2o~wlRD+;LPG1JB5baKIH4d0E_ zbN`*ocRb3wb+6_e%-K>g4>B>@V+Skkmj<#LI3BEY-=EG;dGv|B3ZK8a%c%vuoR;}t9^_{nss6iB z1I}ujU1wYHz^yOLMDJTOzjye9|U?{^rtX2)1Zv9gD6`hgjfb1O_RZ6nV&7`n}owL0+U5fk*gG zi(%n@05EPR(QqAYiF2{0{mcb^8!!3d=ykssQ7sPcd-ra2P`EK1&AG=}?iT(NtlWDq zxPCJC@`jIox%=2(ncGWgz_Xcj?OBp;Zs_JV`R3^HB$BFySNvy<3V{Va?DP=Wc?2+> zFUiPCx`t#UTIu(`tTvHOH5NMDzAgNS z>5E=GGPlUP1mZK3JU7StnYb~pV3+J&grV+GELqglaH0B%N!%rspuoF2#RE>tbzSYc z^oOr<(ThnutH2abZm4t344ILQ|K%EOcs{(kJf|_@Mx!`@@F=Q=Tef)oL2qgHINej5V zxC~{Jg-|4x!5kAGlwSo{bo{i}zbX~g8XuX1%%KHH>Oq3Ozc+O&TbA=3iHtIUyG3Oi z!WoDBUy?l$g|HOk_F-B5CgUlMbj;tXc^jRkzwl9;!|gd%R`=D>$p-QJ5Xc)@2>7n2 zM~fp;tgMfKDaww5wCxO+*9;9i7 zZS-ltFs&yC~nn{HKGb z0ETi8Tt20%O))1Ik!(R`&l{{kCeF%1sVj?=ndqQf*tRz*-!E(#G}D4ThfG01cb=#y zaI3<##>a;Q%&$nG#KtqrhlbnY9Z4c)#O0IseqEne%+nfAQ^*P5^XHZ*^+@x8)+Zno z%7-efgGEyS;9_G%wbJ<%3lVa*Fc=3`;`Y)c`X`R254Z5vHY|T5buT17p$h7&?7Mzp zb`?;!S!Ie9W7@fH_u00_{jdkgo1uCyhrAP1*PCXh^^0DWsu!(Cvv=M%m1-+j0-(#KqL%Oo?Rz zRXd0ekD>$fqVJpgY4{(~l;v_+5J!l{SVv7UZWo+RcdLNUzH>2sWQh@69b;cz@cauF z@NyUL%CbtV{P$U9^iy7bep2)<^W-d4?5RK3t{<+6gZo-b;3Jk3GDgZYtG7T&=;}5f z>(FuZC#~2v^;9YUgO4C-=6|pr&lCk0t^ZjQ9w>$P^5I>nNfSTEgwFPS7+kkH+Q4SD zOm(8QCR|a9J8T&*z-DQmr?o}!;Eu<#Sj4TL2xtkv_Vn2&w9SXrJcLZ*=5zr)egC_3 zA4S#rPIWvWbBiPQyOw<6N(7+XuFuS7!qWrB*nh|_x7OHyc*$^5d(Af!eV+q1I6*-Z za+&-(x7=S2K{q8|U3`^)bXqdK&<>CdxLcl$$dg4BKMby5^*WA9nx70HYrt5;6xx-${HRG1q~7 z4}RDRa-bju>ho34yBY+Ae_ehaO7(xgsHC8)`tvd=CD|Zg!grE~?N>4?D9i);O&MIl zb$2C&_% z7MB#R&Gx#`tn=aK!D3bUdIG^CyCL?$Dk^7pa4mb*@1XJZ?M;*S&I26^EO!Hix2!En zmSn2s+^fBZz?hqocH$vZ4Tr&JLazs8y*DN}T18w)PWS%>ZJF|=m}iy)2ZDL$%ejT0 z=gWxN^Y?0I5_%__MsyLI^RMwaeU3RDogWBOglonSK!W%ixej!Cq^DVYT~-6JuVoC* zOw30&{vvT&#K~jt<$Ew3ckHWTh5Co+yL!;+>H`AeZphXp;@dcLS;1H0|C5&Wb>pU>iwC2C!oc%vYX(_1PJ zhWb1D50e5F}^fb~DF28@0KaN%z(@k!omF-?&uy=1X723Z{nQ2RnCN5^Nx5blc==fAK0FA_ISmUtFy8p(>vVmE7c zYPBQcf3dzQkF~KuKOfI-qaKXncga3J74{)C+%3eYIjDPF%FeSpb{gF~;AwGm%9496T|4ggpKx+-W z0|L29kNZOL>H*xLggXB4Ca~Es7z4x&sg2+-_=3dV~x}I7^#f1x4mVrt;aA|!g zSP~fctE6ucP0^15(Zb8G9IwJJwne#Syq~v1vv--9a)ko?g_Ljr-mE8%{317!C>7oa zfZx)_Jg)#*rMt@F$L7k4p$x0Hb;~EV#38ASAf}lIeq$Mz4UnB{j5>S7vcAAfX@CwK z(5>rE{;UFwy9DoYr5HZbb&ze6 zt^>6P8#W*+W$GR4bq7RB1d9XxizLvT?c`sDZk6nj zove~gWbctZLYZ-JY;o+(S-;ou{(S$BzsKWtpZmVgd9C|;UDx%xuIF{VDtvA>RzWio zI2-1k;OFis;w{Cwj<|+VD{ym+_Nw4<#MJ{8%wr%y}^g+rcq| z#2A4h4%sDl$DD3>0!-=S{9yj(qw*`lAZos~M-ulEWtWuesdCU(#3}b2@|n9Mza1HI zOX>zj^vV6|n!uG}_h2o97ZD?45f*tO9HT5kLOM=PP8s&!4cG>u>|7v775Xy8qCbD; z;?^s8p!-z58j09zGb$(kX3aIskDs4+*8}l%!DmGp2oZCfj7y!z82%T%23CMRxH=_f zIaYRR&kGljtSjcRQoNuu@g-okw^1dX3#0In15?-`D@cK0GtBBrvtCP~u9#|ImHcq|COr!!(9odK`yvKh?A8XF{%9*>vXxEV}> z2L}aUl!2pNJ=Ogpf;Xu@WSi7H=Q%2<$?@~hkha3ckb;~XVJD5)Ipu?$hZB#~whmel zW=wZx_CAc>XG;Y-G6L`m*qNttMW>#={3~f&wKKk(K6rOvU?9XT5=c5eHnuT+{pgf9 z_N2heltY5%Cvlmi-@Ic_XW9gzxXXntS{xW5q4-?KX4#C|_p1csZD>g*z4pJh!B|8^ z&oX6_0JQ`>wgNbP~GUjK9NUt?o^#kx2{ z0icNjk_3SLy`K)k5=nnljKK3A6J@RNKg$t4bf!B@_kJ8&sI^%RpXF(eHGn<(O~Qo1 zVC)}m0z4Qidjz^%J2rTHlHVoLY+PQo<|?&Vl;@9g>eVFL40s;bM5yhsRFNEATUoc3z{}^$^eJm`w zV{FmYB8HsLO0wUsP0pEc8C2PRqna{X{a5_Sp}{<^-)lpnK<4Jpo;+#SPy2o02B~>TAs574r4}WUwil@#VFzYWvJp8h znRigdn2V{l9Z@csWe2~8MA-@;`5%O-h}Uz+q5n1#a~+k#HLe>zt_l{%n~)pxIt}Qc zuc}q_dSLA^s!-~myv)x#`>1T6qN2MC>l~;DPhQ(Z9rq{r)UsAU3*rt+DKbmvloKw? z3~Gb5{khEi-&d-bLzCA;M^au=YtDYUa5<~}-mU)4fYF&hF7o9OzwmU zsqCtv*QsL8mRp#V$sR$gzOq^I!V^y}ESuZy{6r*T)xDO#_$XF;1nyb@ZFUSv2k!+Y z%sQ%Q5|2t^R-7-_Bwi>p35&V_%(}khxY{o#t}`miZmF{*m*4NqIuVbunO~H~&Ow1w zFj1zMX8{2*%q3?bmKn(?2~8<*92o~*u#qYvN48X<3;EAXe?G?m=_T0+V zjhT&;%efUNuDzmh(pP;8Wji&v?ohVvjn_Wj{&-1D5o7d?>2}n}PkEB^^=MXuGE@`_ z!%(fCGjk+7e~4y@m>CtvJ+Q9}Yy=Q{mqG~oWp<}i+@G|dg|U2<9B?mjR$VWyx-!H5 zeoL&nV?L@qCWR$@W=Y(CUQHGJYV*a-W8&JRhqv~^B$3$v=g0dqwlY*k&(BzBoj(0C z6waM#wx|iM;?Y2DHIF))E?$goF#~Mzjzk_%} z$f<4z`586Bn;AG-lm&XK3o%BVq=Y-SyFMn{BsnkE^&?Xls=0p`Q|5&ogGhiA4KBwm z{bsZA1+?_zs$0DN8?vb2b+TBCn8l@8UvW2wxsUV&BW8$cW>}7a%|23=V}Ms?6tBC7EH?H{ zA4tEnG0e9fXH)N6k*}E#PTMPV2iBBmw)I^F=_e64@7;bH5v%jZKQSFc$Qt+49w%6>+_Dv+c*hVI-A7VI|7DoyP|xn`=pd$Tm4 zuUUZ+LJjBWj1`W~_hpub#VtKfo6iTstq>()I{06s>fU%lLQV@@oNC8U3XK-(!R2=| zGfh8e&A_{1jTnodzYKx$Ede(?jFsSIg_3-bc)eOGVdO{>$!z79WAM;6=Z5H;FWS1giaqi7ExMxF z!Ec(I`jO=CrdX)X7M@em!;p}3e@99zdTt<)FV5Y3^u)-R_5>m@WclaE*Odw9{Wc|zcv6&;JB={ut1t@DX4kVPpK>TqrZ5af{|FY7|3)H)D&|bg zv@av{rRn4wE480EfyKSx-)}SK_)x2SX&6lE6Dg|cLU4Ne3P8TU0>J!7oyh9C+7jbH z<;1*vC7)=%gz@gfrJ@|35*0ESiF-corM$s==86^)nX9(FplQfJ#KqDE$Es1~-rdhY zm#ye;y5jF>+MW5BGA89E>PYcG9|A8rLl`WVE);J_88kfHviX#lhdJQH+aqU3@0#J( z;>={_+rDmKRq_cdiWf$8)QD5=UmCXFFNX1^$ktOH?g>(d8864wfMp=dJOMd~s>uJy z|6c=;Z7Md&7e8mMtZ1g0ue3OAN%PPZrKfvxOvuXwY<}X*GlpwG788__o}HARfnA51 zI?7lCeJyW#d9FqR&8NUun1glu#+8+aKGjgwyv|d_%}qtc z)FtCQ+Zw#RJE+zJ8a4cBZzEtfhPu4~8cq6>S?YPboNWP~v!#pp*Z$@lWAT%iPBfEa zk{U{(^ZNz`hIlU0*Y62w0K{U7V?ItN0)w{XO0b~;Z&S!51&I)*6@Itqcu);2uPWXTtUXZhqnLb z?UfZ1w#b4qM)SK>mB66ys#)A@MXoW7GKeGUY&TT^al@BU}ADx zkB?dF=JWZSqyvrxr}^1ai9YG%q4^0pOEviMGK^mRS~?qbW^7pEK+@=GdJ*ekYra(( zL4JSCg{dy1e=*8uZZ#=Y+!CiRWOkOHK3~vk#}RMQ3>p;|A)Kk@F{d^=gPo0>fIO%h z4sUPa{EWb@vfYGW0q-o{cV#sjkt=fwqiv|!K=|n67kQqL%#U8LZ@T9jqxwchO1D~bCr#4F492$~`zR(hgkC$oI^{taR6ayyi6g&m6HJsl54+570qwFCxp z24ozwOOj@8-4b6g~JM!PF5ezDp7nVT00x#w(KWsx*{-;_j51XO0??{@@T9O;)};s=wHR!IT`TepcZ2 z(o4XUL|kfZnO{uv3isH(Lmv=?doI4es-gM;+K4V{PzNk0o7+3|=J79=eu>@0Wf?`I z?J0-PDcDWpOCYFa!-T(GqF9M8QOGP{(8531MrKeBh{+h2vI(*&z*`UD2^A?SM^C!N z>A9Gb+|!+VY;ock3Up1+0}pERjy?E3Sn2A{6}Kju(Xo%hCs!+j@cSrUX4t?zh_*kM zMiuUY0rd>O72TQ}$1VJm+1`*+LlUcb39FShGpGdmkLNGn$goJP3KoD(o;H5h@anHR za=m&<(Za$4R~&!eup4)@vttrc=!~k4h31RaAGoUTzF(|5k9M1VWSic=fo*jmVh>oc zZyy-Hx-3Zab%6BUl5(MLfHbQ>In;W?9$8*Z2uY&ouDKJSFxu?KMza>Ai1_Nub;0vJ zkO6Olo_WXrC5q+PVNu@;3JR#(Ri5#n@94d&?3eRV+3x}s9oz!__OzW1?v|^btU<=K zVxx>lzZ;5-MJ;TgY#Z0MPr(v{AOBOm7RT~Bok?Svdr0jqpA5PI@~I8Fd8w1oFJmXc z?|!~|&8Yh+o`3!4ft1!)xT9EEerb_!y^W!(2?{;_UokK$?df;tCk-5j>+bh(TX?!_(J;^0RswP}|{jq$F_jD5+< zNd-l@B}R;7a!-*}wsCEU)g0uANTv8hv~cU(6vM9CtIjTX#Y-3yWj|H>@R26Y6nCKC|cTp^;j(G<`M! zB`BVc`M%Gw@^>Vo(3JoE#o%qCj?u%%q@zvJ(J7*C_X6Kkz`*UgLpW;hG>oonCnQZ)l56Xo|Wa1st45Qa-U(E z2Ajr6@dPyaV`SO{m(TI9tNpb)0hhgwUL3}U0T*kCo6JF73ueRM&9DxFIO|U=?V-C1 z`@+j^5*4E2jG?DX;>c@#@xZk>Qb1Sx4*Tqge8AOvnwr|z5}j;U#>?{|khtsBNSBj} zz})CyQKf3ual3hvroM1p+QF0;rXV)u`@xhUXHUSv;H_q(m6$JwGp z5QA@vSs)KWx~5%^I!f9ns~wvu%m7g&a?5BPw4LtXX+^NU$Wu;Qyc34KsWx=;eCqi~ zq`1Zr@!f>I6G~o3x8Sy+OTX}TPzi6ugAI;Fh6o$)Lo@M zY8>p-%DqLIKYx6*N10CQNJE{I2w6avXYKe?S~Nj~9O)w_`Ru#m-;WcPZO4 z>jeZJ3k5w(_#UoImqOE+>RXQ#7#86`#j5I$)oUJN2hC`2r>s4A(x`^RQ@@r|{+X~;| zfxS68`E%#nh!Qr>zL1%f@+rsf9oL){SZRjx=flJKx)KxaM;Cg6cl)Ef$|| zE;_*2Afg*hDxRrIvsHl?$$6xS4`~(r5i9X34-us-_&h$;=S*c?seKWt;YN0%{$x35 zTQr)fUBoos_glH_hHGloDv;~Q;Xw9(`igrT$lP0@m-=_+_nZUo5fOh;;0xNY~v>yi5OhgdKeA)d;f4 z`r0X4Be1}V@vicO1P}afhnO(o5)V2>;JX*luor>MdHF5-5wYAbzzP$(+F2{8rBh4FXI-hxVS2N|(dkMfm!=XtHjIMhutIh40wWN#j)yQ=jeK zx(@v8QVNlVd73G%8&mi5b#)-i#XyUEvi$7chG%*es)}--A6oN172=NVcUz0i67P4pUO)C4y*H92G<>l5Tg2vo4^(`%y zKRY+fnWC#O7tlMqH&vdk7%}!+VuRFcAo?!Qofh?rB}`>PxPP1Yy`JQYiQoo9) z<>vpb2b=z9H~TNCP0VT+H%S&lcXQU@W>aU7f6c5vXBUwKDGVm3H4eK4B(UNnJCKnd zfw=AZ{Z-Zi1oI7a(6B$I0?S2EGGjR}kO4232d#7^y${wW4P&`t7J4`pekFa;?EOdv z`xprpe{w73ZE{}kcv}|f>qP8rGuqMryW$Ze);$Yvgo5|a7zgz7PairoQbZ7cDvYLz zZ=6Cjc$c|PeILl~=g|itgFHr6>YfMd_kj*@HM3ijSL-~CMUP3sH8xr=-SMi)cDF~K zSw}=)oT)Pf7Z(?s5P_DK_T&nr>ZHltav01CcLr7pvIydS&-5X4*my)Q^4unn8{ON` z!Z%7^xDt?TVz)Y_Hgs<*{qZ6k7pY$H&)-w!td`QSVQzkXv_~g)B%qVbXYTElmmySgW%O*~R zG-)kLLfPC4dibtRWojcK|Hcr}(5V+knS3M2W)b>wZjY#I{@A)7LDcbqTK^sPv-iXu z6N3Iky-wp!69_3V=QZPl8sLR(s&SYp zvN>KY#GH{_3=X-sZ8AikL>WTVr;=tT!R0-d^!aQ z6yn&6h7|y?L{nkA$HmQ!q@@)v^w-y0N&LQeKdEb~ajIaSuxB}3XCe4{sw6SqDLxrW zy-{wB^tOnD-YrMZ#{`fT*y8KC%Bx8%JwK$*1#`wggo{~9(H#iXMfb<(f8wXqcsu-C zX-4k;*NOe`Lh=V)3!gr^^Rr&UHiC;_pKqAc%1&Y&cW!y5{~#{ao$>kkE=s7mg1J4v zu_8KDk0)}z%ku9oZV#c;6)Z4y1N!*drT*_y5(w%syj^PIb*~3=|_q_e;KF zQ#~f5JK)A%*7%!msH03)(I=V$2 z49qOsl;q_vN3LYBLCTH0{M~xEP6Ftdu%8%vq5CeT4NH$2g4(10>wRVqJ8K zmkEos<72Fdgv%(6rtYSZ6|V2g$-SI9BV_wmi)}zr?#d*M2_6{_bUp)&)2>eAp~KSS z4~62D@GLWLhN@*Mdz+i$F8^5GpSv907E0IA7*c2PjSD%TGuoRZ5*pO`MdrOGfw($W zYO%A}JHWRQ-JIR;(=S#@gfMwKbaAx>AKqxqsY~q$_gC}x`@?0$-V`?MpVbIh;}06| zs_f5~dt)f*6FLZVQu3_zc zS&#|2_WSGmWB@D`K(1(y6`MT`hX7PH4%~PO`bYKL<3hHIjc^xAX;ieDjYUhNc01+Q z2YvPUG|Wu5fD6iO`gnWC#mFGQ-isoAUwpdR5pl3zvT!Wmg0Nf5alTm7pGF3(i!> zQwQ+>@EOQXBIlf~0B^1|O*+9+#x7E3NcU$|*|9tzP7AE)wb=1-jU@`v7luGA%n_Sa z^^9xXHh3Kxjx591IHk{3*-lS*m}px`$Am)$<>Q0Z6jGxCwvj(qQ>Dsy|6C>`&OUoi znxCa!`@cOy160VC`Ua)I|4dgYKIU?d}hLMtcFI7b-HS_?XB7gCB zv_b?B{qY!UX;!oHxo%Rsd4i85t@8NEuJ}&?(#`~t4{OAPgoF-s4lvq2ggtV%@TL@f zA?x&mVyD&zlV<~_f;pg)?LSYMhmR#pecaqh1q?rbcLHMcJH;dO|3mrnKz@(N4!!2u z^By?xF)H=J`whm#KfO}>O(F)8{IkZXlyUwOu#Gr{ZN!7q+uqSzOv+`Pibcem#I=N< zTX4~v#L|{6kcU=-@xAtG@@e*>*k*tx=y0~3kn}zMhpL0vRB0U4*XU+&r zsV_k0McsgifON$507rg7tVDp*kE3y#hfGDi9Nj;}&i$_ndQe5jNfkHVyPUo_t#p1@ zog~3rZu%+pr!L)RdO=Wp1!in{$@~8#)|G#ejS)=0N9aL9I}XjcqMfsUfs=%~5!et!)(G2mjLS+_?(AbI80ShuK26)4##>8^uNvHO7d@TSWW`^S@;F zQFZE+_p;wD>!yL>)MtCA1fLQ1&+!=Bd2{ZjDGPUx$c$e3BuWr>eMBu`Hr@D1&H{(5 zhjB(UM$o;W-Y2sBAX;@S+C*NdIsIH4LByM>DJ$Gjg&~oyPAV#yMEx4ct zobc3wBx%$ph)5>lH-U4x^Gr?n6g4^YDbebiG*{Dia8Fg z0GIeGE+uS?p?UuFgx&jSi7$JbD$4`r-`=$E%!dGjT?}5P|2&N@&06pPrm?5PH>#xr z-8KqKGW&u})dw;F4S~sU?m>);>hn+0l7!$GhMF__fC^43#^H8uMC$kws^h6{y@Ev! zoO<4hk9m+5%896{Ou9IV@b}?uI9!>s=lBaK(bR^*wsHSVI4nLT=Oz|BIrnCjG9t9- z)J^RBg#jBsP-er+4?#f%H;;Uf8cA7}=8%H|Ts?KzZ< zgob)s1*ofurourV($&O!&!sMMY=1X+{v#OytJ z2Ku+%pT<;FSi3In0ZhpbKLRIu4IdPd=`wI#34G!Y?tUzbGA!92# z>>bA3(`jq4=Ly^*_M!!SE!P`wJx@V8z*A`9HL~RnXcOOK6hlpDo=$(f-NM_k9msql z8xgRAbO0w$%3rCRQic^m2KLXfvI!NFpSyG@li7RM6R+m&3)fnOxDAt8DWL3o!{Ql7 z2%S&9obukwiOSpF>9>*8Jvv%?`#}%FB8dHbu|b`q#2s?l`F+8A2f!$y??GKx=;m-_ zZ~8Sny>z?yC;MO)cD`n+egO`}$NSfoT{E_N;F`<)j%4*k>0J0O*eBZJN?Vqov%#?2lr>dB~&Kgd+ z@TiSB!+Oc8WV6=ndsvGeUQN^LvPAEbKMWE!e_wCw5M#o2Bgyg98Bis&wEU#d?%8|m zZV7978QK#Yywx`U$hY@fvgsL!KMtN|oxVKXqgOyh9kql#(8`uNpxpB&`f_b;eW`%E zO-YKaRYN(|JB!2aMhUG>ocPT^gC51~@T(gS&s*Zg=?lIsOBais+q0;so(Sor<`_muYWhlkQ|z<*-4sk^vJfm@DMNO&6~Knb|+jnd28x)RAwd5W{wG-n-3CzvNNt$&<$UKjw zGhE1ST-%`R6>DU_w?W~jtvnw0tu&|JR!6{_wK#!&vRV*+^my{1cX5yR0_=eUu=c3d z>j!p`pG))EPt@`uJ4pHS|X}3GtwUlWjYJrZMb%NMo}5JCMQf@{>MdyU%f^p5uUUx%IxJez}jss|3SH z?5@(rxPxT2XN5gIQD0AtclW9K=Sjgf?9?2jr4-K-1tykYSIG_o9)VHPUKm zrk7YDXw`^`36o`#v3)H^xs7Z8HHYtSos5}hDFRE(GS#(Y_a3>!^DZ526m41bOAP^5PyDq-*Au9^-*Lg?JBp^mlxR)UT8@aj zS1;N;@BP5sklE>~qIm+%g6-)?$?+BF2JOSLZvQa2`19Oxw`= zpleWQEQOsq-senMvJMNoEMw5M&vXCoo1 za1&DVKbD*5VC$pqUy2Qi9(n3nkxvr@P9>gc(NU$BGW3QCO^lhyV6WyiSf)j~&m(%` z>OyU63Ihon`sLP+tYU4@9kNCy@n%RbxzGZ2-TwRwob$&HQIFzh6V{aAODxRXhSzd# zU6vGkiIuj>eoR?r|3!C0%b+Czt(N(1|EzdVO^N(lPwQRZdx?{eTq;?OkHVnIZ6;!n z(GrX*)+RwYe8QsoZiPZZP92$bI`|L>hR_Uh`w%ifa9WGbg|0||SHu8Ok@9Io8w%TED)3%IQseqy13?9AMuk7L=e2 z*T#nD?S%D^&g6nH{3NaQ0VZ@|I}<)Io|WStZ>OhHZv3Gs@s-v!)lH?IRtd*7<=5Co zlAL{DM|6u$u5!(S{?$baD6$r1AfiGB_+OxOv@*fR5y#+x!%*$>O=}2lvEMasW7bIj z#|h(wO^kql#3rM}Y>ci+(y%TD1^X!94ob+4&1`(yh&RDB@r zYU3&WVgoNR4e}$vEMsO`0wv&tmO#n`BxdCGeNIKz#xmu)z;mkG_S{~#1+YXr3x`fw zGS1f$rvz!YRoq`q-*Grrv+@+Fth*;L2RZj7nUgLlFDGZ%;Z#0&(H_N>3F zP&ZhX593Al;-YwTi7-TUDuLHm+qmZNPcrR zyM!kU5Pm4RlAmy#Te6G~pVh22)_PHUlKk%DcO^P_9`47{KcC1v&hz01?!O$ee zsEF7M39KZ4=*?*_(Ya<}04-Kve7{H&=C#ILCn-yOY055V^0|W!d<1nm70PaHx{3vE zwAP^h!S(*vW7FRSvIn;jp#JjRn2Pb{lE%rw{#vv2oD$1T|=W=iq3h zz99#B(Nm!~XFy0f9Z0dd_g#zA;04PuRDS|X;PFzc$S{2(@6ziWI^o!cX@%e%p|pp^#&M61)^0q+ zB&;CPyt&Y-pP~xwu6zA1K;#KQPOr{MY(v>T9f;Lgg|(>66M= z1$IMqpq7C&+2Z6=RgPxgE#~tY0^dxQP6MD%kiY%8I_dsjRuY1k5E?~Z^&)$&SXQQd zcmPif6$b38$dwo{Jzf!YxpCcpV|Sp>FA|7*wXPH43B>9ElyBSE(c+8Ktq=>%(B zbe)fBp$|?*%D;UeF~8%?kw{jIPC1%}`gKQO9B5Lwu*-6RDhPrE$Mla5%(0=CV3XNM zBW7))TF~Oc0a+!n-yt-YiZm!RZ9|4nnUJwT+I&Y9MsYW)L}69geXl0-ts5&n5jhb; zK(k1H0zWVcPs39s**_VhY|dKmRi%TP)j$OS4_~uo3tQhI9Uq>4N~zzp`iacNoDTfX z;H0(j&i5x{Pu;f&aYbn&Zs+%hH^f=kbdA1ot-m$8`>CB>F5dVzjqN?#FAd2 zUycNo#s)nb-Jk%9G>xjLNyAb7#XdM%+Qaqp_z%->K|ysp+icX-3{p#J(Ax@bU{4J@ zJI9*ZT*=p1a^)WveyAK~D@0|M5^qx!2bCTD|$gStgTUYQ|%K(nZQjD#oQ^Bw|G(K%S^2dSybhydsk$3o}n}yvt~Ru zTd|PMe0N`pmc6rTBb!iqU32M{{&JROqgEWZrqqrtw?F5(H}PL@bK&&oK;>@7V#azB z0tU?Tn*pk52sd@6h=1qIy%mJug!nYYQtkS2-nt`R+(kKO8N0BuiV+Zjt%+Ziq9 z2ouuv;6J`(r|IpX=C&52kRrC0;IvB`jFwbR!Oz+ducJDUUDMru*XS5YG%Wl1q1fuw zj>f?x9V9s_fZvolu3oa9xcYHL*pGUF_Jpb`o$m7lGxKOk`J$$ZhM;nkbO>Y&+|s~# z|1_HUpm9-?0Pcy~8g@0#LGyaEPP^goDn)i;PbTicHfrwRX`b|{chl!b#IjRXR-Jzp zdD+oX3w%Cx-bFDPaC#5RPrq(B#$WP0$3r4(`Pl*+A9^B-RnvRkmiFgAh=JK*Kf>hg z1gArJtL3;TZ$cka&R-e&bV@Ci^~%eOp6N9eG46a-jTCjnRH?TgHnpELma5*@F9F*x zAQQ?O_H;cq`Xm;fg53`B@ADm)|Nd}5m@IGxY{saHD*$oANh(!N&IG^RbE7c{6Y^eL zm@v(S#HA5Om3)=u=D!Bsiq0=;Fu3J0AJx*Z{~)k&3tVqP)Rj4eL^~W}1gw$7iCWTpbS;rmxt<(^6eO3<<_Lqmv&P@KYe?cx z3ye(Q8|XEzJucsRH~86Jn2$P`3vsB|6QZP4$J;&fa&lJx=)@$SbM)O&OO@0onTH3n z)e?%$I=Vq{sCjD;wSdpD%NSJcoNWZ*_qK?&q^w;4>|0vcvtToNmpZrjyWk?zi<2oS|f^JT=EXJ8H`{gysZ9vX~mxDd^4XNlW;li3>v5g;6c9&xh8jic_Xe)!n> z$Fmz%F|{52IhJ6<2avigUIPI!{Z-!GI(t^&a5BGn{v+qA<-0t93hq6C`CBc5_ zs-IRIV$^lu!zK&ap8z6B!|F?2|u&c{eec6X3r&)@7=s&5(6Y<^jdH(Ev;1quh_68R`yjwW_w_- zwc^ZCz$*@2*xyTdHX$pwow%OWH+kEFW2!GNI84=f^eqHx)bIx@VySq^Mhi9S0iHFm z&3XF>8Gg6iX>Htqk7eG4QnYj$NTOFVeHr7|T?~~E>{M#V*=l;!L@;dvPB&dfkJZQ{ttD?>p=-4 zg!zqkC>=^ny^GrGY)?$hS%;Dqv{MFy6;Jl1@`IU#rmatWZQ%DT`*l;K&sC>HzppEs=@{te{!cG&Bd)ytMMEka1APYC}Ve6yXBH#0ARX>;yzH5`m{ zs5QCJcvT}$?pi-JEb0-gs4diasrwh?IA^{Sf4?F>I z(brpK&1uHLKK-Jwpwp+_Zv?aM{QAJ>A&iOs4s>sZcsx0^_&c8x(9g_(Gze?bvZ;&0=I>_rP~aq3vf8>$Uykh1=bB?~T12YJCtoI&lvhu!Ws{&BDpv+1B0% z#(5+Y)s!o?;YS?vB0md`DT4ee>?8AO_jj%A{d|2X+&hc?Zua{qQsIdrkZ<^p0 ze>3kWpG2&Uv~w42M~Kc|xQODhExe)HpvC0aN?o$monLTM!ueifNr`6j!*l*{5ZDV? z`A7H0;+|5pG@J))08a@g;_52&@}#$}TK$Y!_8xqQn(@llD;!S<^x8*_Hb~Y8wq>Do zORPhpp}9UO?qyE&SdXjE_8)Ms{t`L41-P%< zY+JanF;#DvE^tnx_3TAhCt~E3ci-#mCoBF+ckuZ33Ry%0?igKV7HB(FBJZpBx0?}A z(c9j4Scj17a#fU4qn2^T`3}N>OrJyL2Nfu(s1>TaY}~6O91h%9DsE5l(sf7vrDtKu zob@>4%Tf;#_U%P=Rfi}_IDbCn@Tbn>&ikro?&~5~x)<*o&L1<{Us!$lIQO_!$ta!( zCWZFL85244UMT#^WM~057?aVJq;T*?_t)yzTpd8eL4aX+E~V&^_|m8s1g_g#4n(q~ zzii)!+nPN(BwOLrJB_Y^DugvhOVeH%e+&EjP^0+u&x9oFS}XV;1F0chHby zfXgA5hV^=ah;_8VSDqmow`^qlHGE%44btp=cJlf`gSxHB^cj&XA+q$vD~ofb(77+_ zO2;j3Ha1S&0zY5STEHL3s{WS7)1tcZvHdeT#0UGb^q4b4Rs_wR6V*3mx8>1(Z$Qk3 zwv0VxXKM*LpE@Z~CD>m`fw+Wtvsmqh{_{PqPn@rI^E5k~>YhRt?gw3x`c5)&+-}zV zU#JRA+(bM}+)etNx~K8l#2@;1_VZu#gy1z}T|^J-16*5qpvb!ie%Wspn-l5;r9=wd zhZmI9Vk0tlt$4k=YG;c(tP8GPaJnu@A&uD!I?nr(JG+7(GOTyn)A^>gP-+r6f6``k zJ2HVk{|dXlV%-bO0mv5hl80l|8*ADwL9eCm{1X(rbz6!3cOVpI# zfcrvqk`Jx=*u_`sfYog1UUo7Yr4+F)e$BA5`Z$!i6+bqQB-+{)sfvXllz%@Eyss%m z!vvxyw~KE5JkXdGHXD>Pu2s?AUajpZxia1RStJ3)>>>Bmn2JS@P}t$~+Jt$JY6 zDaV8M3 z&|@@TqT&^AwqY3{uqq^wsb2du-{T;DnFNQ%661{YV{AfgBais;zc{F;!Yg>~`9c4P zL3c4b7B-ds;i1ix(Np7sXO%|BLhPwMJ^h$GNV=!hcq2)95>2?TFEGc~H|0FhP?uI| z-j0|j>^m%!rvS*+4F{9wIvRy4$<4hR5d`)+`T{ z6+q5zJ}y>CuD2Ut@Vp2VNJ*aaclQh2iQ={8t=+qe84!e(FhH4VsUG-=*!*Gp=gGqM z?!rMuTVV}?RAu$<7<&0IEr}_K=toz(LMSj{X_=xtD!UBxGuN_T<{mY1Hx1XHw*m3x zO3;_fv^)HMz3u;A@0`$}-?dmby0zp`HHwT-3j^+teHHuH4+! zFM2xkwt=WlC|P{acf6SH;{oqSDEfZcfNL9X++5d$o1=tT^yg|fz)p?tD^N*!-YDd0 z@AEC@M_?fLlbnOf&x~P^admOC9dG}?r?8u_msuxDcfJl#C+s^_dl;S7ndjWpfu1WiNj7-sqsspau>em0+W-InfSBd8M3#L4QXM$ozVtHh%)w_! zr{Dfo{?qC^B2v8^+j7lHbA<<(Blq#nKUYH!E4UNez1 z2cIEd-1swZ)22-|+MD>huJuDUZ36%R0K(w^2RKZ;#wqOhMF0Q*07*qoM6N<$f}cb` AhX4Qo diff --git a/icons/obj/items/bucket.dmi b/icons/obj/items/bucket.dmi index f84a2069ccc983bcf8cc71f41b216ed9b154274a..480546f19b0b56a43ee5aa728963f3a3455c9f9f 100644 GIT binary patch literal 1687 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 diff --git a/icons/obj/items/paint_bucket.dmi b/icons/obj/items/paint_bucket.dmi index b40bc590c84934211b46b89ab43119769cfa7555..fb01a26e693b305bd9ef6fa2375811eecd50a518 100644 GIT binary patch literal 597 zcmV-b0;>IqP)A0Z}krcds<$svgi)ep0003jNklf?Fl*{tBF@54HyH7 z1-J(rpa5?6VPd@PdF{Yx1=@kJ7xyG13pivr5Sf>dF#7j7!NU&gc}#Bz!;rMzw}OBq zuop=XNGW~zK^(`e1Tsky3F@(}7cgM!M#0Sf;u_RbrPLDClPt?tjUA{Yg&mBnFoFU5 zePai6`wa3gqm*^oYC)>D`R`b-1skg1pmrp|Xn#6J6hZ61ts4Y+y`~8?wFP4gO>ll( zh=LbYK=JUR>`8K@oED;`T%c zijb2hci^FB9T1|#8w{6zz&pm2nC? jH8OPH0Xz>F)ClkfiH}VS)*8>L*goTB&gB5vuDk^d;9kJ^XKb5eGP%i7)yfuf*Bm1-ADs+@~c83N?cNllZ!G7N;32F7#J$% z1cwzAm45#cT=4Ph6D@CDt#fD22X6>9xM=*~ks3~oSXys&>FhRE-Mm6VBkRP`nPF3A%;rke*52`JX9F)g19Pd&(%C6L zy?|DSdb&7gnz5MMq}^=+he2w|7EJ|i1BSJ!5}z0tUYPJ%9-qm<2eg2} M)78&qol`;+0QK{AO8@`> diff --git a/icons/obj/items/wooden_bucket.dmi b/icons/obj/items/wooden_bucket.dmi index ae01b083384963c40a93bcf39e067b874486f895..7a4768308be34afab73c2dad00f1d8149059d6fc 100644 GIT binary patch delta 2339 zcmV+;3EcMX6S5SLB!Aa>R9JLGWpiV4X>fFDZ*Bkpc$}?~O$)*>42I9^uL$$3__1p* zvLQR@Ul@_bwa~SY*2(_82f+_S)~UAy-ZyWaWCq)6S0A9<*P7!@^0 z*sMjS$+SA&nh-G(NXRdqt;$8F3~64{Bdqg(x|nrn2*Qh%DbVZxSNY>pUGExsqV zIE<=|>&ZpW!?cjQEnS(4{Maa!L7zKx-Y7VFHOzzcv9XOt_wS!GJilU>a;Y+iSk-HAnxFLBukdAvS}#t2T=G5 zYkkXl0q=Nco}JzAM?z5m?TiOMp4p#o>*vp(20-ICbq9bZBY=Pq0R)5yARt5l0ijpw z4gj$^J3XIfzxVm;$Ck^s2p~|v+3ERoJh{vLzDo!RAb+r=Bz%Xx{e_?%_fMuSA!HvA zSkhDBGc!Bv?YHt~#+NVyB0AY+;MV4b^FCOSHkbXqB7KQ^20ZScOpp5~OAQR_;kbXY zun#t#+?nt9!E>`;!ethWHh^cR=hMU9e(SKe-&*$532{q8wzauodH=@vVeA~hWcE?a zLfL8l^MBWmgs|q);Tuoxa{o>LUM!pfm>vwp3(uS8U3P$1)o!=%yWQ@6@P@_K*4FOZ z?e=~0`a_LDI&9mW&ZB?RA&g1O<#wdJb0HyigrT*zwsvo3_WJc}Gc$Yp_U*#&3q* z{eSi6-*$a-YgZSSs_r>+UV?6SIyM>(Z8RL(cBjJcw@R<=nK#C~CyiRTYKy0n;JOewo>PiK>?L^RTzya{WL!J3XH!OYJIss61zt*Xyc` zv2LOuPxaa7HbP6!K%x2?<2Y4Kq4R)AeYUgH^XWhT{5$`u zO8CtF-#1M!kBiRAWo#ofMPI8tPVIL4zT55ItGDrz!X>H?d;6{9{>j28Ulqb&eT{9Ls-|`qV~;0yw%zI2XgIXdaA@0|j?+PyRksnEqOUQI zC{xwcvPOJzy2NbuCUMzkEn^!B$NiIO$iBupPE}FM00Ob7-4Yat36tLjJd>~m34f2M zPZ)RGAzlvw^nm(=;rOag7;5}^E@;WlPS2;=`gnQY^SuqFP<{0^P9f_amNo;1sHIlL zwzKjc&F)&CaFuN+g|1IncH1HA9x?+08BxxFn9195FS;{d#x|5f_0`unC3O#X_I7P& zZ`XQ92h4ym$-W6(i^HtCjgZp)4KZCDCjI|1+73Ab5=iO z_mCOT1L_mTU!O44_!B@th$SeKuLUrZ%?S#V&IJp9UIXas`H*$1Lx<+_5gJ`}2Fg(Sb3uJRS3l%4`(J9CAfgPV&wxH_tA(uFwoKb0bi3XAcDr4P+J{B?>br7G z%5M8rSsO}hZEo0ja`z}0WxZj2Zri2p5C((6de8<-F)6$4(gT>(R=d8rH8ZpK z@7`E{|ND>1Z@XyQKpDKufay?NU0jwr1Nz!_(YF8iZ zT#SuEj{7ImoxR;h-`m;S4O$mo*?!r5U)QCQv; zK_LU6ZokYvumlB!m;q5p`l9so_Y@b!E7~u+51fWTA<1o7=_7v05y23*g;mkn>G{<4 zwX+08A)mi~Y-RU#njAi}*_gQA9L@{~C+S1(TpcvyG7}O&K!_zMAVdHGAp!^p5kNqb zx&;`2y%@k)>*4wCw`yEs{d*walL7QuveOHc4EaQ)2xE~M@%AEo8cJyP}`S;m(<+#K${wU_j88G_? zk7?)MXWy0M!eb!nhb1T=#1gb3+jeOi@q2cE3972Yw<_urA{Hz`0U@VH)2r*VHNAax zAIfa|!-o%Lbt_7R1DMoCOV>$HYNLgC13cAEQ`%Sep$f0RP6{tUlS{9%wb9J1(T^vG z8)iTU>iTSXM+8;p;}q?y`%s0~Ul&d@VBU3!O)t;^H%*@b3*V5Nu8o#_rN8gnQ|H4^ z)aTB2#f4^qa$Gc2U z`+!v#d@f906yk4Fb{kEf0l5+eQcVvaPelWh;RZUBumuhl{{h{is1@NF%TWLT002ov JPDHLkV1m}#t-AmK delta 2274 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 Zqa$6pt1aozL+^DUuBWS?%Q~loCIIPzh#mj{ diff --git a/maps/away/bearcat/bearcat-1.dmm b/maps/away/bearcat/bearcat-1.dmm index fa760ad09061..7b990dda9af0 100644 --- a/maps/away/bearcat/bearcat-1.dmm +++ b/maps/away/bearcat/bearcat-1.dmm @@ -356,7 +356,7 @@ /obj/structure/closet/crate/plastic, /obj/random/accessory, /obj/random/accessory, -/obj/item/chems/glass/paint/random, +/obj/item/chems/glass/bucket/paint/random, /turf/floor/tiled/usedup, /area/ship/scrap/cargo/lower) "aS" = ( diff --git a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm index f88a3a7043aa..b725f344f34b 100644 --- a/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm +++ b/maps/random_ruins/exoplanet_ruins/deserted_lab/deserted_lab.dmm @@ -185,7 +185,7 @@ /area/template_noop) "aM" = ( /obj/effect/decal/cleanable/vomit, -/obj/item/chems/glass/paint/random, +/obj/item/chems/glass/bucket/paint/random, /obj/structure/closet/medical_wall/filled{ pixel_y = 32 }, diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index 3c13e753b124..a758ba9410b4 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -512,7 +512,7 @@ /obj/structure/closet/crate/plastic, /obj/random/accessory, /obj/random/accessory, -/obj/item/chems/glass/paint/random, +/obj/item/chems/glass/bucket/paint/random, /turf/floor/tiled/monotile, /area/ship/trade/cargo/lower) "bf" = ( diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index 44cf19b1055a..e666e1f3cece 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -1076,7 +1076,7 @@ /turf/wall/r_wall/hull, /area/ship/trade/comms) "Pg" = ( -/obj/item/chems/glass/paint/yellow, +/obj/item/chems/glass/bucket/paint/yellow, /obj/effect/floor_decal/industrial/warning/corner{ dir = 4; icon_state = "warningcorner" diff --git a/mods/content/xenobiology/colours/colour_pyrite.dm b/mods/content/xenobiology/colours/colour_pyrite.dm index f87a9e8e65a8..739ba7a8910e 100644 --- a/mods/content/xenobiology/colours/colour_pyrite.dm +++ b/mods/content/xenobiology/colours/colour_pyrite.dm @@ -8,5 +8,5 @@ /decl/slime_colour/pyrite/handle_uranium_reaction(var/datum/reagents/holder) var/turf/location = get_turf(holder.get_reaction_loc()) if(location) - new /obj/item/chems/glass/paint/random(location) + new /obj/item/chems/glass/bucket/paint/random(location) return TRUE diff --git a/mods/species/ascent/icons/ascent_bucket.dmi b/mods/species/ascent/icons/ascent_bucket.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b9838cae4f9b3566581eef86b0ecec55c8285402 GIT binary patch literal 398 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iW*8>L*XvkVbIM$|nPijry zX#D@bwY4=+aK*~ig+(Qyp`oc}i!K5cGnNGT1v5B2yO9RuR91yVl(?i8Cl_TFlw{`T zF)&oj2@WeLD*gT?xZva0CtBXRTIbH358e=JaMAd|Bc1a;nkN~GdU|(Q7zY_&Huh4O z^JvnMNg)csD{b~`sJnJ{8>? Date: Mon, 10 Feb 2025 01:00:29 +1100 Subject: [PATCH 31/54] Fleshing out the robot HUD style. --- code/_onclick/hud/hud_types/robot.dm | 15 --------------- .../hud/screen/robot/screen_robot_modules.dm | 2 +- .../inventory_slots/inventory_gripper.dm | 13 +++++++++++++ .../client/ui_styles/_ui_style_states.dm | 4 +++- .../client/ui_styles/ui_style_subtypes.dm | 18 +++++++++++++++++- icons/mob/screen/styles/midnight/hands.dmi | Bin 2379 -> 2428 bytes icons/mob/screen/styles/minimalist/hands.dmi | Bin 1876 -> 2061 bytes icons/mob/screen/styles/old/hands.dmi | Bin 1628 -> 1769 bytes icons/mob/screen/styles/orange/hands.dmi | Bin 3023 -> 3179 bytes .../screen/styles/robot/attack_selector.dmi | Bin 0 -> 857 bytes icons/mob/screen/styles/robot/fire_intent.dmi | Bin 0 -> 4474 bytes icons/mob/screen/styles/robot/hands.dmi | Bin 0 -> 2481 bytes .../screen/styles/robot/interaction_drop.dmi | Bin 0 -> 439 bytes .../styles/robot/interaction_maneuver.dmi | Bin 0 -> 1008 bytes .../styles/robot/interaction_resist.dmi | Bin 0 -> 419 bytes .../screen/styles/robot/interaction_throw.dmi | Bin 0 -> 1021 bytes icons/mob/screen/styles/robot/inventory.dmi | Bin 916 -> 2470 bytes .../screen/styles/robot/modules_inventory.dmi | Bin 0 -> 1557 bytes icons/mob/screen/styles/robot/movement.dmi | Bin 0 -> 1584 bytes icons/mob/screen/styles/underworld/hands.dmi | Bin 3286 -> 3616 bytes icons/mob/screen/styles/white/hands.dmi | Bin 2875 -> 3084 bytes mods/mobs/dionaea/icons/ui_hands.dmi | Bin 649 -> 674 bytes mods/species/ascent/icons/ui_hands.dmi | Bin 648 -> 674 bytes 23 files changed, 34 insertions(+), 18 deletions(-) create mode 100644 icons/mob/screen/styles/robot/attack_selector.dmi create mode 100644 icons/mob/screen/styles/robot/fire_intent.dmi create mode 100644 icons/mob/screen/styles/robot/hands.dmi create mode 100644 icons/mob/screen/styles/robot/interaction_drop.dmi create mode 100644 icons/mob/screen/styles/robot/interaction_maneuver.dmi create mode 100644 icons/mob/screen/styles/robot/interaction_resist.dmi create mode 100644 icons/mob/screen/styles/robot/interaction_throw.dmi create mode 100644 icons/mob/screen/styles/robot/modules_inventory.dmi create mode 100644 icons/mob/screen/styles/robot/movement.dmi diff --git a/code/_onclick/hud/hud_types/robot.dm b/code/_onclick/hud/hud_types/robot.dm index 0f53b8f70777..9dd085ffe9c3 100644 --- a/code/_onclick/hud/hud_types/robot.dm +++ b/code/_onclick/hud/hud_types/robot.dm @@ -1,18 +1,6 @@ /mob/living/silicon/robot hud_used = /datum/hud/robot -/decl/ui_style/robot - name = "Stationbound" - restricted = TRUE - uid = "ui_style_robot" - override_icons = list( - (HUD_HEALTH) = 'icons/mob/screen/styles/robot/health.dmi', - (HUD_FIRE) = 'icons/mob/screen/styles/robot/status_fire.dmi', - (HUD_OXY) = 'icons/mob/screen/styles/robot/status_oxy.dmi', - (HUD_UP_HINT) = 'icons/mob/screen/styles/robot/uphint.dmi', - (HUD_ZONE_SELECT) = 'icons/mob/screen/styles/robot/zone_selector.dmi' - ) - /datum/hud/robot/get_ui_style_data() return GET_DECL(/decl/ui_style/robot) @@ -39,13 +27,10 @@ /datum/hud/proc/toggle_show_robot_modules() if(!isrobot(mymob)) return - var/mob/living/silicon/robot/r = mymob - r.shown_robot_modules = !r.shown_robot_modules update_robot_modules_display() - /datum/hud/proc/update_robot_modules_display() if(!isrobot(mymob) || !mymob.client) return diff --git a/code/_onclick/hud/screen/robot/screen_robot_modules.dm b/code/_onclick/hud/screen/robot/screen_robot_modules.dm index 8574676abda1..0e82b4fe44f6 100644 --- a/code/_onclick/hud/screen/robot/screen_robot_modules.dm +++ b/code/_onclick/hud/screen/robot/screen_robot_modules.dm @@ -5,7 +5,7 @@ /obj/screen/robot/module dir = SOUTHWEST - icon = 'icons/mob/screen/styles/robot/inventory.dmi' + icon = 'icons/mob/screen/styles/robot/modules_inventory.dmi' var/module_index /obj/screen/robot/module/handle_click(mob/user, params) diff --git a/code/datums/inventory_slots/inventory_gripper.dm b/code/datums/inventory_slots/inventory_gripper.dm index 334be51e15c7..08d90f5bd49e 100644 --- a/code/datums/inventory_slots/inventory_gripper.dm +++ b/code/datums/inventory_slots/inventory_gripper.dm @@ -32,3 +32,16 @@ /datum/inventory_slot/gripper/can_equip_to_slot(var/mob/user, var/obj/item/prop, var/disable_warning) return ..() && user.check_dexterity(DEXTERITY_EQUIP_ITEM, silent = disable_warning) + +// Stub definitions for future work and to pass CI. +/datum/inventory_slot/gripper/robot + abstract_type = /datum/inventory_slot/gripper/robot + +/datum/inventory_slot/gripper/robot/one + ui_label = "1" + +/datum/inventory_slot/gripper/robot/two + ui_label = "2" + +/datum/inventory_slot/gripper/robot/three + ui_label = "3" diff --git a/code/modules/client/ui_styles/_ui_style_states.dm b/code/modules/client/ui_styles/_ui_style_states.dm index 480ae2158929..95f6558e61a6 100644 --- a/code/modules/client/ui_styles/_ui_style_states.dm +++ b/code/modules/client/ui_styles/_ui_style_states.dm @@ -64,7 +64,8 @@ var/global/list/_ui_expected_states "hand_selected", "act_equip", "hand1", - "hand2" + "hand2", + "hand_blank" ), (HUD_HEALTH) = list( "health0", @@ -187,6 +188,7 @@ var/global/list/_ui_expected_states // Collect hand slot sates. for(var/slot in global.all_hand_slots) global._ui_expected_states[HUD_HANDS] |= "hand_[slot]" + for(var/gripper_type in subtypesof(/datum/inventory_slot/gripper)) var/datum/inventory_slot/gripper/gripper = gripper_type if(TYPE_IS_ABSTRACT(gripper)) diff --git a/code/modules/client/ui_styles/ui_style_subtypes.dm b/code/modules/client/ui_styles/ui_style_subtypes.dm index f80a00d7b8b1..7de6cc1183cd 100644 --- a/code/modules/client/ui_styles/ui_style_subtypes.dm +++ b/code/modules/client/ui_styles/ui_style_subtypes.dm @@ -95,7 +95,6 @@ /decl/ui_style/underworld name = "Underworld" uid = "ui_style_underworld" - restricted = FALSE override_icons = list( (HUD_ATTACK) = 'icons/mob/screen/styles/underworld/attack_selector.dmi', (HUD_FIRE_INTENT) = 'icons/mob/screen/styles/underworld/fire_intent.dmi', @@ -111,3 +110,20 @@ ) use_overlay_color = TRUE use_ui_color = TRUE + +/decl/ui_style/robot + name = "Stationbound" + uid = "ui_style_robot" + override_icons = list( + (HUD_ATTACK) = 'icons/mob/screen/styles/robot/attack_selector.dmi', + (HUD_FIRE_INTENT) = 'icons/mob/screen/styles/robot/fire_intent.dmi', + (HUD_HANDS) = 'icons/mob/screen/styles/robot/hands.dmi', + (HUD_DROP) = 'icons/mob/screen/styles/robot/interaction_drop.dmi', + (HUD_THROW) = 'icons/mob/screen/styles/robot/interaction_throw.dmi', + (HUD_RESIST) = 'icons/mob/screen/styles/robot/interaction_resist.dmi', + (HUD_MANEUVER) = 'icons/mob/screen/styles/robot/interaction_maneuver.dmi', + (HUD_INVENTORY) = 'icons/mob/screen/styles/robot/inventory.dmi', + (HUD_MOVEMENT) = 'icons/mob/screen/styles/robot/movement.dmi', + (HUD_UP_HINT) = 'icons/mob/screen/styles/robot/uphint.dmi', + (HUD_ZONE_SELECT) = 'icons/mob/screen/styles/robot/zone_selector.dmi' + ) diff --git a/icons/mob/screen/styles/midnight/hands.dmi b/icons/mob/screen/styles/midnight/hands.dmi index a55f123b2f97fdc99e5c083693dc6ea9dbc23a99..b80c4c83427a854d300a2fae17816428e1c218b4 100644 GIT binary patch literal 2428 zcmb7`do&aLAIC>7S?&$R5T{rwgj^e=B}48#MnkF<<=$M=tPu}238^q!p(lihkuY=V z^7ObZnlN*D+|sa(Fqb{+`Tfp${(FAs_s949{+{!BpYP}MJ?HZ}pKrRG%NZGmCZ0ErA853H`;K4ygETmD2!IrgN+?nW|h_f_P9|-MW?R!Slm5&%=TWlhU z(z{0Gvh@&-vU=KQ?J?#$ z119Ve_r3k8GGETKUuwS4$~$|UGPj3NZxT~lQ?y>MJI3Q>OB3k6y6N>5zp^pc61Ivh z3Y%2FQ6>Vkt#_y%0q|M?V0RP(ZtE3S$R?h3R=cYDUa$l^FPf@!c$ZT+ysU0E><91> zIHBCvEj_!I0V*5*9QCsO{S)Z9haW6nob#Z)Ndt>Au!TnsIffk?kpFa{fWz2a4BU58 zkQAk`j?~K$ zq9vb`+9@`8v`;9ZqTc@T`odc)!9C+e`pO^SJAuH*fRh{ad1#Oy!QvOqkefzc>z*4} zg7FT2u}7Vn0y5N!eOkrHDsO8HND|LqF$>lzvo z8*90#a=oyoMhXo6&LHqUsi00%@>iKet7U|P$llJmxu6hc@2SJlE-(b-0{+8gqfiAy zgj<^!P1XS(D0%SNt6hrjLn7&r?>IOp2Br{*uFMuQvBt^xr6k@~@R&{FIn}}1St~NNU~~r~BFy49vNywSU{Mm_ z+4clQ71TW-SrT1`UNaP0Cd%HfrB;oI7-%mp*y3ata61!W^Em&t{HB}X9}33Kw#bpUpZ1^K+*z`_%|Srhmv-@$GDaE3;g<_dnazUbuDf87H#*jf?49R-^>o!jt;ZTe6J((l=SRTL6yA( z9%7#w&B_2WR&+Mcp9)nIKlrR}?Kvhzj4bR9pacBrzeqaf$|vr-ym_ZLEWZLg{#BX8BBQ`2(d3@?9neH)-P-g%N_5c1nlY$lp|DT2Zi7k?w21v66m%3>F4vK4YX9zi z4gc~H%3al8NFh%ia3ZDUhF^JUg6z2NVO5b^{1UINu&Sg^y(i0Q$K8Oha@!-Wfv*>g z95ZMio}uh_A#`{E9YqXfqHIsDKFVC8-x8JuTU!a0flOP=#}#H)%o&-KJCwew;WkE} zM#eXXdXz;5dAavbH$9%^x&d*r(CKE+sn{Fa1&R^TkuFNInQm3ekyqZ7L-m?cGW4HP zm!Re@%D(3ejRG&lPw^{~g-93%ALIVZGm3VQZ8C|2grmB{f@&| z`omk2l&Q}?;XDi_A~Mb(vFoRu%sNY_b}`Qj97b^VjC%%onGdWiU_L4$=qy!m^3-Mb z{zHiom&ERLpq!f8zD*YDfoGO!1O+dQRA$cUYZ20J5@*P~z9EKp#WcIhT?oH|I7kT{7y#91+qId%4WQ{+S*%p2| zym*-QT8~N+2LySZ{tAlB?w#!SCLIC1&^Q-JW{v_YZKQS7S;cA#n)4NnhpT!Hx;1)uun8g#Bl^witK)_ug)*=QOZR3vliUorRx zk=!A16pI!C^Ork-WKT=%R14g%sP;!Q+V{*9l z-J!bx_m!_aT(dOa3JRnwc&n8}qlQEnrVRw$FF#4!pAS1Ro8aBOKSgGfwe%=A%TN`# zPX}deqL}^n5fmoG2mOO}Q79*jM}w?W*3;|uD&{WK2HNQtKgAI&eP5$u6XsitE3 wNA;uws8PikKH+bua7R?p9U{EwKQb){S~eI}K9{U6{7wN7r(NJxb{Ft}0aQwyY5)KL literal 2379 zcmZuzdpy%^8~<%)HaW~3_pl8ur%Fzhcrej}mj_7>WwE3YVG&Zc$)kguMp+(&LM5We z6lKClF;WTDSO<9=+ajBdcY2@a^S*z)f86)=xlZ@@bKjrq`d;@%Z%-FR`CsG#08n&u zb@q`;+WLY)rF(}x@wrqmlYIl?ox|cnPejDVN5n(}KvMCQe)A1!W(e8wT|)KqbCsia z12gn@pER;|w;KM!3NPwhnomSLQtzL&TW&sW9MoGKT^@c+_!~C7(6L<@dzt5CaKJmZ zx3b<n+OaXgo9$GM6@-Aih4I`W+jo4g19nB3l_v`Rl0)Yj%6MA;X7#Jx zq94a&Ix)cIsQ%7amztKNGlTw^$fOx|C|VHN-8xyYeUxgIet&D36iwFi?O^+x*H3W( z0P}KlcJxguo-MJ9(st44UTdfbEz}R|naHD)v(7@AZ5WZW>^;@GbQM&>nc9u4W)oAH zy}q-iSwZd$mXc9L>(lg^9S>iDbUORmEn+sQUS7V3V_5pvoIBuC(W9RD5G$Ynj{Rp_ z<|95(F{JYXqb4R(PTv}1FZR=77vZC(MJI7G_dLFvW$qkUoF1?`UX`$GQmWu+X1ZxH zS}WtN(+#zd_>|kEd=`EZ)~IsZD!dE$)IFayX1cFRl>jx?NVJ^iEK z-*zMlBPaLyP!R;7uc4`#qAfwPwcxrnz9v@+VJtXY*V!BDt%${)N1|Y=Yxq~K(-5fNnNQ!t?ig* zm~Sxj8mRcj)D6zuM=8vY*M$*eTM;M(^;Px)pn+*X8A~~MiBAAxM;SENPXemr zLve6$Bp7#p2Yz%$*2e~i*1>r&X{;n_$BX(WuNonT9*fW;Q6Gk%=BA}tSZy7&eX}#K zL*oRBQT|KD{Zi z@d7jr0oLZ$)SKTF_OkN{?OHPKBixC^NO0GKF-t+jffc$6p4@`FOUae%c*ZS&*4(|= zN0n?z%HjmUw7nA23*MNOKF&D8`#u&y*D#7^I8R_#GgzBf=m8&GB=%JKeo42r0HR-qmG7k8CXyCJk))3Gx!YKS=Re(3B z4Ao;eky}2ERXyS*xNZ4#qNgH0d<*ED-m2M{zXL@wrYr?w86RGDf|)_XGxhTOiE*Ui zIF+cmnG6pbxh!+r4Hs3Ou&@$gm;(}A&)i0~U9*ISjFV5i;GtvV>7JAI-#TqoqJAAw zpNdz~Aq2Dzkp!98Owjn_t^PzN77kJyj&5MLtJu8PNH!teRKCO{e%q0E(cP@i#JZtA zcX;pHKUY7N)$d1cIE5|_lv<@eyVIW7ir|vy4OwX$Idc$klk^w>Khe&35rrNp%(*v2 z2hLS2VP5#DYs~AGyd>_Z{>pD6HMO)VHtgMFQ`x~oU#&IC8$E5eqA?F-I>J~{=<`~Tna6RD|_Jl=08?W5*=Xu;-%E&kb(MEDCkLxa zg{U#z_4CQECOhtOV*c!g-M3%s4XSFh$AG)L!YDL`Rc zLhVbEso^QD2=H0BFLyP^q8;L4C08aAFZ1p*Ue$7PHmkz%iz2bLB^~g+%gM2o;@k=< z#gc;hK)y9nea;{?=jO#O#hI-`+Vq$95vMH2NdHLQfD;rW)a0xy(q zr?d&>QE&T72=~lNU6=`?ebybL{Xe{Xs=UB3;|{Pr{078a9*K8FDI}3+cig$mT{5}P ze&9kNA&~e#v=ru=mvGXF*?UW6c2U@fy!CVNK@fUS()W*}`FQXJ7{4htmJs55+Q$`8 z35_MNW^LMaakLBd6l(hZ-k6na#mE+dd{xVT#-^0{{`(#RstSC;IMA!mPWn3n-1c}n J-`yQ@_TOXyTJ!(_ diff --git a/icons/mob/screen/styles/minimalist/hands.dmi b/icons/mob/screen/styles/minimalist/hands.dmi index 05840e72af8e065f12088e218734615bee2ed508..ff094e024af34e35bd11dd98378259039fc9a0f6 100644 GIT binary patch literal 2061 zcma)7dpy&7AOB5ar7{gk_6*&`VyAGBt))rIE%)=u_`+9x9ug~Xw`TpC6@S-xgS5V^8e7ba(@XBV9eiuzpuAUdEHc@Wc=R2+v}4p_H1D5QPbIp_)y$ zT4~u&1-hH(waw_y%7s5_H%T@%H3}ro~ z_r0aj{5sN4Tr_&$o|se0>S;WnkCswsl+h3ObW=_ZE2Tw2ckzibc_iA3Ibc~3D@u}!RX77 zDLYmA=cgscBQXYu(iDBzsHuU@xzfv9LV9!zH+Mgr+1cfO_fGZDZ9~Bs2Zk3(tls^p z!=n0gTDp0xRI=|`c&z0`$)zAk==x30G;#gzj{t4j;g;W7mZ$jUQ|@npu>|%B$C4)B$Ef~ zfQ0xc*;mwWQ8I}T>RYd2_;#bBYCU*Zb`sU4>WdgQYvHRIYZYie{5dfytI0C4OSPlKSjTZ*1r!IoK(PCN- z3XN76Qr>fM9SeTovADRn^!4lSs5t+bOyL{#%8d(Oh17WEI285&IQ}>d!D)HX;QUi{T96KWqb{h`fH9}SMT1ngo{m^^MUTozw1^~AvI}6((A&EjeBIu80Vk<@E3Ur^PIqcup*dLtc?rP(_WFk$b^ms73lvnc zeE&@Q^GLWeA9^!X6Xe1g?5zQG-_NRIj>;7}&Ag3*IP;ZmvWHZhd^Kk}UYAuF+vw}O zstvV8yM}5gu)fPY|8!lfG@7caawq|Z&lxC6%%8~dRZOD6R>jh8c|yZD++O8?iutb7 zEXUy|H767N<;$&ICPV>B`!ZA-)mIt?WcJJ?$t+b`YdmTSmm~rf#q|02#)i|FFgii0 zjE)#YtIH!nC4H=c=qV0|!*8|&80nv8BF2QzD-qVdQ98cxt`pKdf`@bUcI*C6hX_5d zqT2@{jX7->(nX<7)p(Bs0h#TyMbdJadMst;T9QG&8FY#tW?_3yl^5B!f`?ZR3yh48 zYU<5iy`MxwsaaPTH_$H`+l$TAE+t26;>N_U!2CvZ!OkU(iIh_qxisx-UwXhyl<3Be zy&yZRo15}RhEyFQZDdHxN1Fw45ZFiVU1f@8=doD-+na80SImbtrb94W=ocRRjTg;U zi(PiWXWO=BS9wS-$z1(F?0<=icf_gFc$X1T&8ZMOg}-F`CzU3AGoNvGt*EQMhr_F^ zegE^Ss+nRr5yke(tJ3oO>0Mxzg##)s_7sMllRYq|*X4PW#rnsRC0x)xYp9T$aK$@x zCD5^gkki{q$mp^EHlEScLj3Xzfoz`2_BG9XnV}C}8Mh3{C|j!|M1`hnMoZU#;q&-{V5`Y3M@b|#O~(xZV9TuI^z_U8Dmfru+2 z)7rTa#olc|<^-NUqL?(gn@uULR`KA0i`C+)3DZdQEnbX^=jTITK$H8$`{jEu|Ci6c hh0UL=eRpObwY8Aa&Ad#T+xXuBTWbewnUzn>e*jf{;okrN literal 1876 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 LNkvXXu0mjf{HAIy literal 1628 zcmV-i2BZ0jP)V=-0C=30&@m5!Fc1acx&0Lv*o~lT7XvXQ!eGKo3O#L;0@@z>_Z^rVjK_8_ z`SS8|DV)l4)j&~K@`WL~c>)E;-Cl~fGh{)*A(z6UyIWdABuxkk600ZE^*UlAg>fN* zf=r5A&?Bz*w~Xjwy>+;Zqd-5}AX zC{iXR(xjyS4=8HMj!5(SOL1h=N@#KYOd)Nq&V#l;aVJDXR9r5Dw4SUoc~$X5bFWSQ zMY+%I56ww!Nl_3lG=Zy%zwz4i6D<&ey?p?9@&EqEZ;KB%Wm{4RgyJv!c7Qer!Cw6c zz>ELxKR>Pgd0)2ia8p|?7TuI*7z#E?`=aT%>clpAOI7G08AVLFmVXL z#329^cXIe4u(PJ3vFX7Wpnu=XJEe`cngaA0^Ed*8ZT|)pIdU;LhCcaX_woE(t zyfCvfM*MNkLLd~MZ5hqZSZfgY<4j+RAONPS5O87vcQQ3B$S4Hm#0q8^e)xbmGi(GscAwvKxH4g2H*9Xq_ zeyI(y52`l0{Mx~ZAWLk^DBn_J@OA5*skU35aAJ-7lJr<^&Lx)3wCU>-%e*h>kS>U?}zhC@zd<~G_q22%>=zmB!=A8Kv&d(36dq>;mr@xTe(}G{4mxy-P&y|IB5f*D!2(TXxY@_`q}ugo2&CqZMbC9-_1Hdj=lIQhxs%2-V zf~U0itM+!)vWGG0ejdQpIRG90 a2g(QADiL*hOt( zs}6juh+S<3Rbp?y^m%@Ne4pq0&-ahlJ> z`^WvTaR^7f>3FyKL}3SNqHNDLaKh&`wlUp1IP?<%)%85;ZE@ef{KZqa(>X<{>`<}ku6?6aerHlzLfl-mp%+w2~Qe-|5zkJJWcdQ_D84Q`KdWS1h zBFs5CBb#v;1xt_7JTv*F4ui&tXj|y(GPy=#vjh_PuK~75){|D?C+}fVj618r-W4hE zEfx2TR_+}5kJJ7!4Q9J9zH|FP|KsP6w6&($fYq<5N=k8gF3KgK8@llF+FFf&u9S0% zBY^l=z0N0)k&W-D8NR{=FaJ)gp^O+4iOPtbO8P!MYhh+YDNbsowoQrb@+ZPBUVvKtQ5*VU9|XxPmSKBXzR4 zZor<%Nk|G(2oa`#7_QbJSx(bmX8|h|j(%Go>;S|AoCN4*p}XQ#tZfOQaKyrxlQ!lK zauRuNYYc0AozYn0_P%v95=zE`dHpWr-<*Bi2nI7gauxJa=;d30qoUl=!&>F|oqCD~ zipa>HICg*2&|*vg(s_!|Vx^Mr1MnJOamt(B-Argpzs%L z;r4`D&V4__Ayw}ECn*QFhBkjeV>8&kYY}n@OZdGTd1t8YuG1e?EHqY5FZ(ht|Jg*_ zjG%*}VV>9ViK50pQQ!t8Xv)>;t~3g2M_QbJLCs=`X06Rj*RU-Y8vH3;fjySjVSq<9 z-z1E>4_7$sf#<@j_q3xR4MFVwfwzZR#iILa-nlK4%Ig6xtJ7HejIkCX)DZgph193+ zAFpe=m@j=e(S|r@>lfk;jz>UuDPS3SGAyJa%PqmAfj=uGd}&|j^+V8R$>=GKx5+@hg#8Pgy4^&W2K?yC=1?n5l-;;q9YLhOtbxS)JZe#?Gb2eX^ z_H&lPtLM0NO|fwm5)P5VTF~!8pl;&`9Jm%LaghFFTz}lNqf`K=eEbKU!(0Y<32$Q* z|0MxLl*)Wd4K1J_nr&LoDH(akQ(D70V@SZQDYmw&%lGG!i7F?BH9EdIC8r{2HA00A zd)I(MxWlb;cb2o)UQ7*D;NCV*77}=!MBLGW)E;i?AVK#T@!$e(U8ZbB9B`EIL0I8= z{r)}xKE!@Dw$Q-0PwprZ`|aLeDjlHqNJ+?36T;7_RgAl~|L&aHJZJTC;imTjdum3D zi#|m>cQVpellxJb5pZhk>n#v0IQ@Bk^R22jlqk2T7D)3*4G{}Y6SJg#ky^Z6tiX0X z zK|T*0u{`RwFbNzYcfkvID;Z4vZwSe@RdH%j1OeD zI%3N{!5&In2+YLZR?!C=$l|(L#`r@ubKKs;6IBEB=7cik$lQ~=hQ9xt-1Xg3Xsbfj z2pt&nGvEDxUggavA)4YGH-Ao`A>s>=6r)46;TIeOvhSL>N@S67ZkZ!LM8tpX*ax1X zoi>LEN5lO*@PRgpyZq{$Jx?g3`ss)S20;cFrOB9ulD4#2+8q zYyZGjAj<}<(HwywN;k0P>ixAV5prY`R#ou7)@-gs4#@PXU&@!4j4)*&j9?u@k}3O4 zSgGqCqKK8;?enJ&{S|4xIobQnYazq!nZNA-uTafaQ92SQAF65fOWo90V0&JJoObAs z$#nm1;+#ZSy}aTeHa!z}-QUnASi4Ky#3wz=0UfOXjSnMSr0z3gGaSWy8eTr!pPx*< ze<2U2!q-(5m5&jd(aOk(xRiALUXt19r+p@zSE^_u{}s55r>Nf|PO~+LWikU}n{#9s zj}EbW7u_#htsumE=nuirk<-L^Jr<4xfN z(mh)rfmfexN(LZyUkm8%xl1O=_b#kPe>iQYE2hc1b5mt7jMq-TUFqx?{;hkOAl>4h zDM^X?_Rp@@On_1NTH;#N{zaQP2IrWR`^U|n@)ajmquoi#7_k<U#oK8Kb~3XNCM;!{T+YCsjZkvk%lSH ze)bDc4c=@t`)|({=UT_~WLes)CvrVFaHN;z1#yO_u+AAjHMpc8l2!QsM1GDb!on zd160apj-oMp^Z^jt$IMXu`PNB>?cPS$CA=RA(-zvzeuEFf_5k^qjA2nL7J{8B|YiR zh;`99qYT%DJ%O+q&L0@{+(p!NHFypyp8EC`Zy$6ZH5yh!l$%zK`2FsUbWxv{h3IjP zTPCCL2XB+D>o+&5q-5Xdg59quwN&ZKUqOD61brZzdG{AaZu3o<8;?GAtNxqMjBf*U zx9?0z27SqAXLZkmZ@2f$1b@gzmvNKE6}JAdcvi2De96U?t_8(gu+{pFj z580lv(-M%dpn5RYHB85w>{#vB@{?2o)9-Zc3a%bM_5{KZ@Y50z6%#Yy#+FFCf0v&Mg5GSs; zBH$HD+poqhWnDBpr+9>2X0z(}V@%1EDiW7=sqJFf)epCW)GoBnptISuy&>BZQwji( z%}=ERKDDyTs-4oUGu~sR4=HxD9}Xf)c)Ao3`e6cF3!>&A#R;dO<;C9L z(#JVp0TZV33Zlfw}| zC9tHRouzhms00Y9Bl#al$nLKx%i_goPH8{CdO2{t0S(%1S&T&(Qn};Qs@LhW&mb6Z z{;Ak}->c>%%g1l2!vTb<=%2sYcKcac&+uE}do-+C-z5*#MN0lHKp3cMdn_d6SvBiJlp3}u-PdnD*UfSC+&ugqJ-y?_k1xmFefD}Ws*+KsCYP-*~qsYCz z@cDrB%v7Bc7qSCqPl|sIOi+o+lCj|i?mxBA&gTKHPdP0aRx9F6U^Gl0-f>CiSiCok zwS;1>>dYm4%&U%LV6A)MT1W5sI}i&@t5WVjbKOcA6JFzz{q^01_0P|beNgUW0Uho^ zipM#A`GR{%7|+YRw9h$T#u*-S*w5h(VERCy^!r-1c) O0Q9fk)GN`!h5aAz_uzQ| literal 3023 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 Ih92?%0!HJ;FaQ7m diff --git a/icons/mob/screen/styles/robot/attack_selector.dmi b/icons/mob/screen/styles/robot/attack_selector.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d28dd18a6fac674530224864f8b201dbbd47b2c5 GIT binary patch literal 857 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3-oHE$ONTQU(D&A+84w9FUWfGd4C3b!BSI zU|Q73kd~GvC@2V&XZX*+u$Y0NkbwcH-I75}Oj1ltESgz!4^WD+B*-tA!Qt7BG$3bl zRY*jMOKNd)QD#9&W_}(6L&cn_lTLFTG7xaRelonJOn=|Dyd|!?HtbhOmYS`Y8D+Hi zZ|&-voKCxT8_(e`ms@IeefqM{t6L}P3v(V{;P-0BO)tab<7JwB)tYM#-Ye4TXgsUL zoxt`sFOg^2ghhuvyvx;(Dj!Oi^e^=!^UatUjJ0~Ve;3XuN_?BRET*E0ZLaLig=IH) zKM!ECsN-G!hM=ptUu)NzPrteSDKpQ)Rt5$p2~QWtkc`H+ zQ8$yC6$Df~7Byx5|DS()=k!ZGke1a!DSq#Po-sVztOMlae4n|^;*Y8 zs!R8=>EHixX_DLA1?(S68?N253*s04-R5&h%pzi9_J(g^bL5M-W#;C}FSMT_v~OWv z<39fTOZVIl_*@$yd1%_9{>DoTZ({6^G3@&zUUQc3()%)z`=?&dXTNg3<<)g2h_ClDq`Zrl9@vg*eWz@A%)|((t2tp4^5a(mdKI;Vst04mdmUjP6A literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/robot/fire_intent.dmi b/icons/mob/screen/styles/robot/fire_intent.dmi new file mode 100644 index 0000000000000000000000000000000000000000..199ea12614553c1757ffad4d4ee6f85187ef586b GIT binary patch literal 4474 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 M07*qoM6N<$f`u2u4gdfE literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/robot/hands.dmi b/icons/mob/screen/styles/robot/hands.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7f919d72c34eafc200e2da9eccbb3bcc99fe5dc7 GIT binary patch literal 2481 zcma)8c{H1e7XK1bi7kz#?Wh(hVy6`pMRXXuF2+t{>w=~zwU2~`R#9y&WzeLSVVGDN zTeV4Sp&c4)OBpoOTB%0usd#42JMYYS@4R>3ANSsK?t1RMzkAM2J@05GCM+Wi0Dzc{ zwZ+AKN!}*{^uRt(_xC%xFPO1ExbaKueN^VxmuXd{DT!?=#ABgI9igQ24wL!Mia zD73q&~h6K^Byy|vW`c;mhXtOxj z9~w5VZqG-RP^sct-Yq{?PB@m| zZknPKL+IPjE>^My(;jufd^$Jz##S`{;HurPuG);xII}=T;*67gb1X_vd-tQ~ZeW8mI#sd1qI@o2 zhM-U=+F_FGkAWXlKevjDA?=y zO~}=&R|l)J4?q?`SL*j8tul}21UbnF_Y3qMbkEnEYV$QTRKdWZ)svu0vbi3cy831N zCHyY!@UN?2GV{vc)g*$~pt%H#?B|*w0|SE-x+j|62JJnxuYYzk2DHE`rs4PK3!)xC zbKK^Q;l*sTv}Wr;Kf}jLWCST+Zez)r<9up>w<1e>J5lKy96kZP+?iP{YsaoZ`wTUz;98K;JCq!)Yb0)D;2Ik6QOK_txaI@b`xZQN z5WAAY@iT&v%2TLRYIq%5=}Nv5*)Dbci0s`DT zV!d072B_+-nxkWiG-s9yEtC@;d?C~3A}gw{{HOm69ILeAuo5I_9?Flh5_kd71(GP_ zs3JbAg%0cq#fQ6rcZ~W%5!T-cR|@PniN)*XjXq`{^+{r@hlgM``Agi}=eC)y0KN7; zzA_OHmdP@+HqQM89pMaisdCoP)D-L0U7N)!vhS+%E`sO?`!_E z{0cqpJH{Sgc#D*S1afm*Omyk>g#;;*l~Py;%|CIyAhOrg02Ekk7KnHp{7MF9Xv)z(rrqNoOQ4Q_H1H6l-3c=eD;6iiDm0t;**Lt*jM*cgBhHry5980_Y=tf6GRB8N zvdvt}cD_b8quJ;K4j?h{zut#NwL?kl>4K=c^}8bZgIkBEpwBtVP`2X{8`J1O-U;2y zT@5)Jmw-To4$aNoM`#|4pY#V%pa0vgCDPJ zgLtjiyYU|-&f}_nPZmFOH)HC4Q`($)Vbo97d3W{-<)gZDE6J6U=IaS*9> z`Pf8*8iMjpj*q11VbEr0g0il}Ug{DdNIg>PJ3&{)5IT`>TCB*HtaDHXPC z{UywnPI~P2Ig#~jPMBZT!_2h2=ELMP)#vYevuUqJS^*8UTL|F1Cw zqC(RcdpWKxq76AxeFwo;2*y$>?hS);1~+;-?Ld`3Ifp%~y?mTUC}8T9wX^eKo^$elz)B{;d0_jA={*1G8UO-|YPZI{P7OIuy!z#4qHWwQ zR=bOH5t7#>q&j|ix(s;zt<_Zrp)`V=Wp_l^ee#^xL$=8_Z7QjM4%lg~6-4i86W@0U z0pinHLYOgn(c~djg}?w|9p})J2MX3_2VZG{B$J%RE0ge>p2-~>)K!H}W!Dpms@1+c zqUcQfjXWD(@m!g9S~{Eu+8?5jV(~`_pJ$fF*GUh2(={+dnpw+-d&f`#Qmc%ltlgv- z9t>7@#GSC@(nJa&Wd9`2e0Zi-+TOxfJ@4Od8xKx7bL*7#kaliAjaJGBsu} zEox*C6chwXGFUP&6f!U@W?%?nNJ~rGw~#FYD9Bh6eukTAW;z zSx}OhpU1#ZF(){zps4iwm*9erU!Q1s>uQ}lb3S-OsKG_!2aj~l`)HnIDC+6mVPPC( zeA(DbVa}sTM<#_R1Zx`ZRIyvCvEQMy+gNq;3JHyr6Gvx;O_?#9D^Xi}$FH3YzHAIL zZ%Kz2viO+*?LFq{;uxYaF*)G?LsLS-17oe-RIK}bDT>vZ}=_n zjt*qmmbxU@RjAM! literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/robot/interaction_maneuver.dmi b/icons/mob/screen/styles/robot/interaction_maneuver.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a59af200e49a0a5756d7f88af9ac6e3fcb732e82 GIT binary patch literal 1008 zcmVV=-0C=2r$~z8)AQVN>nmdXU?O&dsmd0QVg-*ecco7OQ0o3VR*lM?TvPyLQ zpeLwN)5$UUJwT%U{YhMY$qo`tO~SEXU4ABIlNl1lW&$54$9cE5AhGzEAW@O9(QN$m z3l3klL_aC0QPT~M$SOsN9@4@900S^dL_t(&f$f>kOB+EH$G=Iuwq0My6t z$Lupt;e?E3S*X=&H)m(|_2SHVu2Kd{hJ&u1MXMtkg>}0}lh;#IMvlS>?#DlU^BlA0 zCCnmF$UEo{vS{~2o3QSC`x$>xjzU`pC?P?s=D6ISN`aE}XWsJg& z$gFvZ#)gB2(s=x^Ze{J#ryETs{11#V&2B>?d{ENh2OPjT*X))hGazlgazLdFH1_pI zpi&;<!961oj?lWnDxRdl|8oqeLU|sC@?A5T zk4~Gf9MHA1VC;#2xgM5q*BG|LWLx?e&>!gY`-36;8>LZ1IiS^%Bj9@9h3|PraB$!Y z(CW})EB)!i$7wfYLpb4zL zTBWn#9{j3VB}1qgz`L8kBl&PD;cEc4qNg<8-2^a8W&{BI?0@wh{=yHm9Z}Q_sFWpi z3*NdrgowV&T#W+fT(l(?v#8HEi*($;R+xQe(I^Z=@^HzZ-;@;c4%o3CzmQLQCkTl3 zwh(Nre_p?zq`?maLH}A~jEU%LLyW`=0M$5uZQ@HBeC2?yoeg-HPx~UT?RDUsqifUe z1p5Phet$s6zjX!x02X|@J!wd2T2e|H{Adga{e9tx>M%oVL~QX*iV3leU|tq%Wh#ZeH{1p%J} e(w4N!L*7#kalOUQ(}GBsu} zEouZxFbE0?GFUP&EN1u*sM`wmjnK7FyQCoY*ubmBN z*%%%q$=GyvOgjX$d9A05V~EDYN>Y>&AG4?<6Zsw?{gf>j=u|zyg7R!%ewP- zY^$Hgs5D9!-?B=d=PIF+i z*|4E+%N9A2{S2XB6n-DoU97v9H@_mGMdD$=@qk9TsS*=;nHfCy`(3*rX!8l^a0X9T KKbLh*2~7Zur=3Co literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/robot/interaction_throw.dmi b/icons/mob/screen/styles/robot/interaction_throw.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b98a7ae01e26f1b091f16d7da7248b329f74fa26 GIT binary patch literal 1021 zcmVV=-0C=2r$~z8)AQVN>nmdXU?O*)0G%pxKp;ItKK`4|2Zglz9i?_ctE22RV1#kvWG<5knlEao}bBV*g~Q(3(xFRyyoa!L1GOlL!u_(lG*Lk zZ~FMcCHhH0jhb%s5i1pF3nH2T00TWqL_t(&f!&$COIuMCz<-89I~3v4h?oW>B!few z_)&_BO{k?qmsXI{y;IiEKf~3@|3DDeqTtgd4n_wvI7EYxCWzLHc5du&^K##dMqZxh zrO*Q*H|O5)yE*5ckGwnNI1c}VD#i^`Ga=Pd3P=AvM;b){Id(G4tKJ-J=A_m!l#^aDV)Z52H+FF32Py z5pU7Bj8UzdHQlIlDnoCC~?oq+kt25Xxw);3*Dt25WFTYBH%^lDTJ4Zu|9f~}Pn zTOEz%ck31k7ag6L0RWUzJ?C^@n>E`CxR%5|iZ5yat@ZsAi@-QA4H^x+V^|FYjr)LVGq=?BKzf<(<>>mkxUZGDi}ZW{W_Wu@OfYnSa0jmQ1Xl!zzGP* zk0b}^yf(4cGbE$U0sZjB43HXYSr4qcmhQDyifSbh56(}-?Ktu(;LpDHa}*MWA8i$w z13tIs&?Y9Ez$-~=2);+evQe!WLn-BZF$S!3ZKz<@N=xH1IKOcjK@zN-JWz+-O%%+y z@?45)rCJZpuTI%1F$1X7HN44`YP#siDo zwf7y>-iu-viM+4+z7THNZGMJ1&0=M)O1{3}5um z5Lq+!TD!9mPZw4>kv{>|I`A|Yzgo9^Sy!~mQy&nGy9GU3VG?&Un00000NkvXXu0mjfR!`!{ literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/robot/inventory.dmi b/icons/mob/screen/styles/robot/inventory.dmi index 23229b34424871afe05b7347e84554bace044d56..1a9f6f0397968a2c4582edb09e0146fe9f43ec6c 100644 GIT binary patch literal 2470 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 Hu0mjf?5F8T literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/robot/movement.dmi b/icons/mob/screen/styles/robot/movement.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f71eecbe8a66ab938e2511a2444642bab9463522 GIT binary patch literal 1584 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 N002ovPDHLkV1m`{o;Uyi delta 3221 zcmV;G3~KYB9M&0-7k_{V1^@s6jALRO0002QdQ@0+L}hbha%pgMX>V=-0C=30&an=H zFc1ddnLfn@W{se07XvXQ!eGKoial+U7PKuG-`;`I7_Zx1^4))b2FL1Dw@@}UThMtu zjlkis-Ld4QWl+FjU$8`>zN@eldnVw5>eMP(K=6_wc!!Xr(3G@)}Ui)K)@C6rCgJ}wdbd`RXrpa1|1%}GQ-RCt{2o!@I5*A>UVEA%ILjqw_r zQgHl`SgQ)`24_;Q!G17qteO_&swgNZvHf5OabqV>#SVS4t5#`CDUK51MGHoT7FRYR z4+%)d;MgFfl~XDSLXgM?SL^>_^B|wmox68t?(ELYnb|!b5TiRk@7(#$xxdbw&CSox zLlC&=;m&~2-IHGn8}xnG;9wzdgRqyeA&qcVah8A?(&TCUcz$p$g8>D zCr`g=y#3ZW06_KGTGLK_uf2lmvo-X+_6h*t_Vi4HyU;i>l^2zbj$WRo{r^o!h{p24Gq$H8~i!GD;_i>N+ZGZwU3 zrlyyi6R+pp%Dn`MPdz_rsTTmg`*s7@uHVGR*FVI&@4nxZ$cc^nI95|qjM)oPnKa`fk|-G6mR(rWzxG`)a97EfQVmaX3G zNdmQO^Z7i^{q9_o_-eIHqcADIewNRx{p+fJ6)oj{R{TYyP}q-JZPT|v)a@T!J)f#! zktF&3`+u-1FI%|F^3Q*oOnfFpExTTQgU!LhHl0uwocB6|9|qyAG_B25kcjpkC&?J^?iRk{7ZHV*iQcS{q>Hj>0GLoauS|R;G{Qrm-ylG z$WWasN~O|;B(J@&u<&V;*Gntx0<`hQG10Df2C(DVQ!14%Y(0N*YxkaAt=$BGt>-VC z|NYLh_51~P@7aY?sU#vq3Is?K-6TT2>rTRtPaTyo_mSV-Zc_BjJe!I@fqpaRE6XWFuul>()=Ne%jdQ|zz=kqvm>ZFsGLkADM-1d3HHb0qY1M2JbHXdOk%6}}P ziVuM6fgc{|!--QTQ7O+g$Qs3+mr8lAapKfT93JRv5+49udhZ?B=7n8=dK)n4t13Mm z_PbOQS!j!`u5Y-O>VwyX7*`&2;pyVj^JoLR0Cl{?M*_0_@Wt0|yhYlXV(C}a^BCM3>8biZ_&VO~h@(@ORKnes%Rj}R}(Z#0=G3cu-(|Kq~R+qac z92WHfo2z%D=&s+dgT1A-kC^z*34 z>!RnVg2P<%@|DrtS6_VT>U_|HrZlZvS*&7peIrym%nxdRuC8xjWwF|HJ%2S1wEXIe zFReR8sT81Y$#fwGIVk99<1`$z1q@pSU%oP$TUo3EK$DeGg*P-j==>iQBtEi&Bt$(A z0I;%H4b>x0r2t7RY7f_MaM^FjM%~ZLy+2Eku%*szJ~|; zTtcM0P(IYWg`uZXo@QAI|9AZa85VpRi6W)-y^I5K)Vr&>D_ zVO;3qTUo3+u^U@y{{cV`#f#IImGWF;a_WX7!pW%{pmdx<405UR>Sz%9HzZyzS=_zg zR@$BQdfgEl&4j2Tq-{}IKZ2|vu+z~|#YcHrUEgs2x5aZNL>1)uv44*MY{wP3cYn%B z$AOJsUr_JYubR#}Bm`Ap^?Kd7K1%4krjE_!E2FtqJ3PKqaU?k6-u)?@Ju~La`$d87 zkZLo{7UX)Rq9139am~>SZe{-2OI%4#!$qBkUZA=9CG_xUB)%wPHhYc#+0KZB9gG&z zMGuAR(wF-G03sKk34dKo{ly}_`*y>XrtP#|-R|c_<2M~A@Q|CIpSK>cj6;A?hdZ-D zz1Hl5%0&RT09;J+yWp3R7!tc?TImJ&eaeWWUF11k^0VLokp%4ifWVGLiXz;ZzQ4)u zPoH~M;|6j)*J1q<<^dM!mY zfuNtW-D`*i>~Qq?{V30=y6Uxx2vBGVF9(*ehyaC_ID2LclT$a^{#`#2V3!cJCwo4h zkHj}r1lR@8=YJGY6NM9t^nyDa{pVSuI;VQBb}XSx#R;smZ2{Yj4;S`YofaRj+iBSX zk{C=Oy8iLE&m(^bUh(l(7ON}|J?Z=JR6+|-EqDM;g-=BJ5cK$XfLnwB5)&fF{dY2< zs$hx_2kgWG(c{Cl5~9lnJur{ggRhk58gYF%#d-goihs2LDL$M|yYb<|5ELJemX-2s zeY+0^5Lkd^ma#fcx!lH9njz6XWHEDIhjooAPt_&aBfh zh@u^qmizBitSn%h@!@Rg)cAPaPM`qejt>`>PK%G%?Sz^Ojw3!?SUN2}UbkZ zg`pGU;}&&0*26Gy#fJ+^r^UzXcElM$U`6}^lVJ-Pf03`^x}4+3kF#E1ETF)O2vA@} z1Sqi5)CM%g4~hHNk)j|d?uqR^*v3!ELYZU%qXnc`B6=LSv_tu=*XwPC5A!-t7Rw~< zcvit@&x|=CxP)z_Orpng7>0f+GwPpb%`#FZ(GzF^^`C6bDpAD8>$EaS1D+Nzt8cie zdZcw>e}3uRbe^o1Nt!VVP_1IJRNa_<-?)|dcwXnpVwt2Jamnv;WGYVRYD9nnE8-24 zA*dH``h_BO8(02XK`da3QHPEwJRE)aUa!|-N~`;4VYWsDm{Ka`xyIpvK9|7s*fXZI zmmt%M2r#A8>vdPG843?V5gLNhKsG{!hyYWJe{SLQup>d~ECfrEaljNaFl=H_bv0000a_xt0$zJI>&`p$Ko^Lwsy-{-mS`}zIu=Q*)RLv2PnPC5Vp7xVLmQ4#7{k~ z?j>Gw%|H?@t9xO7PCY#$D()`jJT?HP5RI-9z5lr^MP=|II*3^LSGmQn5or-(Wxqu( z5@mW29DI%tsfWa*>ZJ`t^n6{_9t~^=o*5N_m-%`j*(^8R_0{Pc zBewO^jp3TMMN=m+6;5U9XR>Hcp}<^!=Gx(*)$#%+DMUPT-oESue3d}eOtM7 z`j^$E<;2OQg@noHpDYCq*IBbQjaQQH2n9g`pD5lxF8Ub*0CX$52z67;i_L6RqiHLy zXzZnM4FuGLm7eOJI``_~gU@536eID}RlHIvTo-aEo81RYW8(=r*@x8KxP^!28T|Rk zNLEpneA*%+F@UJ@32Nv?p4j*P)tG;!O4kPtN7aV}!{+5e$;VKQ{EQ?IfWuRSmpO`( z#rXe*A)vCVYTBA zLn9;OD`_Hxvsi4DP-+)%b||@DDdD`vW9 zr}IHULEdu10_i>VS3+N#%hcA@Rn^r+pPZcFv;m2ikk+|59`K?`88nIuBX8{QuHOM# zr=~c;B)gY?At@hg1&{#0-q36+{i0!=0+XvDTnZ(or3Ie1OIXLo#%z>5JUs={^z6WR z(b3VM!^G_DE^d7{a2~zYIKod{Tf1C6DF)a&JD+K6Y9!%&#R zfWcsBiEH%Y$rNdRZW+Vw^4?xv0HCO-sP<-ZXR2VVj5M{dz&F<%q)-`5kl_WY#EP%$ zI5Qu0g^{I*laqgKa15%_Pz`z?7fJ7s$v67@`V^JY9|INa6~IyH53S2NlB*| zePS4GY51Wg_wbg#ON%=i%~+y!LfV|Jn{c4%ht!^iH}#9`r0>Y*CnhE`+R*=qH-1N% zn>2$1_0?|sP@calPL$7kdmM$b>S;I^n>|oL{MmAKN+kwu(d0XFaWIG<0P7chDc$_>WNt;KmCRMWB#M_Jh|3993k;8O%gi-lMy zK61c?k9SLK{@b^2YU3P@QVI$y9WFT@zqT0p$;RgxSh&^ju$60(N&lD{!-f>T*OG*b*!%}He(OxaK=9F~ti=LWOD@jw7B9o%? z>}#rfG%(c~mLv|ZC*ZB*)-nZ%?_uzaOpy z!%VHk#l@*O=h#5I+tg>~=N;_%trq0|E`cE}BsXd6`}b~Z3k!_ddz-(DwB>=rNe2f9 z-`9Wq_#r7LH#*EG$>2tdx4$QyNvL5T)CbeIrHhInt&d9t*xU1at&~j*%49OQz2yXZ z!ra{aF+TzIJ}ZlB$)_HNQAd}Ix)C~aEuo(oCNh_o9TyJ|r_7XQb7G%iZr{HBdD*9U z)D5%!t#8m?fs^t0_x723E2f0S)>`zE&$XXF$+Z);@ypB0_YB)5ArDr_i}lgm3{ z#*_+t#WE?g*Tqsgwf+Emd1h|TJ}{7TH;{XKdt1_AxY)eR<3`Szt!Lqn(@t2UG(I4= zv8A>Jj(>qR;N{+3Fv+|xtJZ4%(1H`=3suG}r42rzm!lbFYy)uV>G666UnyOfdu97t zciRym9!Qvwiz-QpCnC*@>{ejheTH|B#Y;DTm?>f1WTtYl$n1j#V6&hRg}T8z)h@B+ z=WJyf@bPlW3kvOIzammjDZb=WXfx0BQ8=hh9mqgtU(UkRxK{QF;MD4k$a2l->ofQ{ zM=b7--2NR*j9)7-Swo$kG$d1DFX4_7QzPUlaXpSkZ6eUpCqRwfMOTOjir$jeLL6o9 z@82Z~fuUbjv%lfaiA+}iZOP0onS%;#qq#1T4>9fJ4MBG- z3slIqz{H!KjSWyvr(C}&vAfVVcq>F1unB3h>qws?8-FvSm|kxOkD!^^S^pX4=CNpc zO#)KV?XBf_Mk!*Vua6PH?2>5WU$^fiN)x1Q^S*3#`;;7dk-tWgv%lO2^AwYi;3{Rc z2qEi&y|i;L(FyeQ<0%@gzQ!| z?9RyU+C{AFLWNz7$cu8}T%;O59kt;9f^H=B&N$q7;OMmx`_8q75k*(eM@(o=d2jUX zTxnaY3t4TFpV{>TzRnaPpvBU*BXa9)`1iEeYaAy&)*HmKAd47iKQ`vwOe4%Yatms! zj>`KdKSj`EnGGmo?_-jSH6>%C6^$w_RwJ9jg!%5d+tTQtt3@{gk}@(5#VeaVGBPr; z*JYe(MlMd*S_|RO(?2#g#Kd|i0SjCd-tlz(B;`9D^~f_`kX2nBYeLxbA#p2^z5aoL z=5G3ms{x0wS$r5Y*SdThmkJ2y$`zWFynCc0w|cY~#({L8Nz)Ga4bbUC52_i>8y6b|848h8vRL zM$#VA8<)c81Ikp1XRJHJycIsdQCH++)5|%KdXdKEE&7(wCbn1Y3F8Dt!N3|7DBmK* g|EBQ2vD|$M9ES2V9nYvSg1`5Gu9hL9T*EfvUpiT{SpWb4 literal 2875 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 LBOIpM5Fh<7M^;UX diff --git a/mods/mobs/dionaea/icons/ui_hands.dmi b/mods/mobs/dionaea/icons/ui_hands.dmi index 422a397d49ba0dc4b648772133aaba6149a7b79e..c17a1f29ca11f67892286aa374285321f3438c6e 100644 GIT binary patch delta 620 zcmV-y0+aoT1)>EZiBL{Q4GJ0x0000DNk~Le0001>0001h1Oos70Det>D3KvUf7E(Z zSad{Xb7OL8aCB*JZU6vyoR!nP4uUWc0N|NEMFYDLaCI>lLm~_&%uS)EZ7e^wMPFY; zW5PgkoqE@Nce$o*L=VSPUec_{$rFrKeMk3nx7m{5rG%4Hk|rdOpl;HA6YIExDGYhz z7(7Nbgd`Bk*l8~&!PW2&^Qn{-S(rCC>nc?ocJD5 zv(JJX+j!Vk39Z^1hcz3$#_-Vvj-7Grf@2l3U4`to`V5wA_4b!6#j#rR?!HDNdMvZ~ zH@*SZ#Rfl$A4^XF00Bu!L_t(&f$i2YPQx%51>pDw)Dw)3lz}aZI6yEVf4ePc*2+T< z5UI+FH@dZ*BBru-;|Se36b=zM0s^7=K^@+gX0r11T(_}<;G;>`$*198V_}yVAILAJ zMNw3Xsw#@s6qg~*AT|dlJnyR6n@{u-7e8Z$^xb=hEzNfwolzvfU`9G_irdgT> z8C}CTjstha!vb};q5iUA_S(>Ws2ZkC-0;Akzr)#V-duz7{$iD>e}_l>Uv9TKx`ymJ z3Zv+f?tRE~Gf74F#%5v}o?Ah;r!ZxAk5mz)f5UoI zSad{Xb7OL8aCB*JZU6vyoRyL>3&JoEh3Di~gmxEOU0tL_3bupLIi$^L0!dSoRR6xU zir`R4rh9jM?|287l4E(Q8dB61et>n-4CFxen=M99$-S7HU5=3ec@zHAIL|!HGGV=^ zaG&IuV8o?$^DM*YYMF+wR>q8rfBJa@8#wKlgEh}T=|Dm6frruBOkM<`S!Coq_C!VB zB`mg$V725*>Mjgcbc%`*L)T&0ISjjmVQt{Lc6DD$%BEPp{RLcu*)lxJeXjrj0YOPb zK~!jg?UgZ3!!Q(v;~P*Bbmvew zMBo64+B`sA{x9)ly>|bo@T+N26xE`tieh?~j91{YYaj^$ zdY?KJ=Z002ovPDHLkV1kO`4r%}Z diff --git a/mods/species/ascent/icons/ui_hands.dmi b/mods/species/ascent/icons/ui_hands.dmi index c479fd12413685bf867833dae1677d8e04fe2af6..d60c12b14431a395ada9ace6dd843d4fde670eaa 100644 GIT binary patch delta 617 zcmV-v0+#)V1)>EZiBL{Q4GJ0x0000DNk~Le0001>0001h1Oos70Det>D3KvXf7E(Z zSad{Xb7OL8aCB*JZU6vyoR!nP4uUWc0N|NEMFYDLaCI>lLm~_&%uS)EZ7e^wMPFY; zW5PgkoqE@NyGfQbfL*qc;blZ_eDoQ|E;v>p%T>sFtMgs5)v+#Fiet6r-F=Nl^jK!| zZ+rt+&jvrU^mU5>00BlxL_t(&f$i2YZi6rs24LzFv_3&wl^sPn0D6K8e>~x^Mj3hl zq>9~BW+u{+6LjyA9aYMaYJys$wn=GtjWYZnVY2x3g9&yJe04K){cZTquI`8KrU&Zz zBG2>ksVwt+k*u;ZExW+iwtZ{+^W~JlmGuSf$^{NmP737ebB=Y@ zHQf5a?V+oV1r}C+6x6m5e`%;qkEI&=TfWeSjc?d=4R?NUclf#^ft8<>syNRq$8i$J zK_b^MilV?B(YQb!Hsl{0Ci{l&C)F_S;>HL5{tTDP$L<)F_aCz?{T^QMe|i7dZsi)P zd1kU~Cigv5sf!3n?u)HBHHKJjO;JRfib!tNQ*4@$S#DicOq&OHKg(h}2Svt)Omcf0 z*Klo#<#u0+Quo%-gaiNp000000000000000fYIIoYqquP0A`AC00000NkvXXu0mjf DlQbIL delta 591 zcmV-V0mz-f5UoI zSad{Xb7OL8aCB*JZU6vyoRyNn3c@f9hR^L&ln-4CFxen=M99$-S79U5=3ec@zGVIL|!HGGV=^ zaG&IuV8o?$b1lQ@YMF+wR>q8rfBN+ZHgMW82Wvh5qyq)L2OdUiGkFn))UO#uwX#HQD!f(HWEB*_oW#7vU)G{+!wvhJ&mAaCU(^b0000000000 d0000)d;k-!wd-^;>@NTS002ovPDHLkV1fs<1bF}e From c6fcdf555bd61c8f5f3483acfa54379289c362c2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 12 Feb 2025 22:02:50 +1100 Subject: [PATCH 32/54] Condensing sign macros/procs to fix OD issue. --- code/__defines/math_physics.dm | 7 +++++-- code/_helpers/game.dm | 6 +++--- code/_helpers/unsorted.dm | 9 ++------- code/modules/power/stirling.dm | 6 +++--- 4 files changed, 13 insertions(+), 15 deletions(-) diff --git a/code/__defines/math_physics.dm b/code/__defines/math_physics.dm index 5560282337ea..f1124b3f2612 100644 --- a/code/__defines/math_physics.dm +++ b/code/__defines/math_physics.dm @@ -34,5 +34,8 @@ #define TICKS_IN_DAY 24*60*60*10 #define TICKS_IN_SECOND 10 -#define SIMPLE_SIGN(X) ((X) < 0 ? -1 : 1) -#define SIGN(X) ((X) ? SIMPLE_SIGN(X) : 0) +#if DM_VERSION < 516 +#define SIGN(X) ((X) < 0 ? -1 : 1) +#else +#define SIGN(X) sign(X) +#endif diff --git a/code/_helpers/game.dm b/code/_helpers/game.dm index 57710a15858f..c33ecb8a33a8 100644 --- a/code/_helpers/game.dm +++ b/code/_helpers/game.dm @@ -223,7 +223,7 @@ if(Y1==Y2) return 1 //Light cannot be blocked on same tile else - var/s = SIMPLE_SIGN(Y2-Y1) + var/s = SIGN(Y2-Y1) Y1+=s while(Y1!=Y2) T=locate(X1,Y1,Z) @@ -233,8 +233,8 @@ else var/m=(32*(Y2-Y1)+(PY2-PY1))/(32*(X2-X1)+(PX2-PX1)) var/b=(Y1+PY1/32-0.015625)-m*(X1+PX1/32-0.015625) //In tiles - var/signX = SIMPLE_SIGN(X2-X1) - var/signY = SIMPLE_SIGN(Y2-Y1) + var/signX = SIGN(X2-X1) + var/signY = SIGN(Y2-Y1) if(X1 air 2, -1 for air2 -> air 1 - var/heat_dir = sign(delta_t) + var/heat_dir = SIGN(delta_t) // We multiply by the cycle frequency to get reasonable values for power generation. // Energy is still conserved, but the efficiency of the engine is slightly overestimated. From fd9e2f50e4e785e7349b0537ef3f78df6a96e548 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 9 Feb 2025 18:40:46 +1100 Subject: [PATCH 33/54] Bees need flowers to produce honey. --- code/__defines/hydroponics.dm | 1 + code/modules/genetics/plants/gene_biochemistry.dm | 4 ++++ code/modules/genetics/plants/trait_pollen.dm | 3 +++ code/modules/hydroponics/beekeeping/beehive.dm | 4 +++- code/modules/hydroponics/plant_types/seeds_herbs.dm | 1 + code/modules/hydroponics/plant_types/seeds_misc.dm | 1 + code/modules/hydroponics/seed.dm | 1 + code/modules/hydroponics/trays/tray.dm | 3 +++ code/modules/hydroponics/trays/tray_process.dm | 3 +++ nebula.dme | 1 + 10 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 code/modules/genetics/plants/trait_pollen.dm diff --git a/code/__defines/hydroponics.dm b/code/__defines/hydroponics.dm index 6aa4a63f761d..e40a83850d8b 100644 --- a/code/__defines/hydroponics.dm +++ b/code/__defines/hydroponics.dm @@ -4,6 +4,7 @@ // Defining these to point to the relevant decl types just to avoid a massive changeset. // TODO: rename to PLANT_TRAIT or bare decls to avoid mixing up with GetTrait etc. #define TRAIT_CHEMS /decl/plant_trait/chems +#define TRAIT_POLLEN /decl/plant_trait/pollen #define TRAIT_EXUDE_GASSES /decl/plant_trait/exude_gasses #define TRAIT_ALTER_TEMP /decl/plant_trait/alter_temp #define TRAIT_POTENCY /decl/plant_trait/potency diff --git a/code/modules/genetics/plants/gene_biochemistry.dm b/code/modules/genetics/plants/gene_biochemistry.dm index 9239b95f2929..296eebe4fbfe 100644 --- a/code/modules/genetics/plants/gene_biochemistry.dm +++ b/code/modules/genetics/plants/gene_biochemistry.dm @@ -17,6 +17,8 @@ if(seed.get_trait(trait) > 0) seed.set_trait(trait, seed.get_trait(trait), null, 1, 0.85) + seed.produces_pollen = LAZYACCESS(gene.values, TRAIT_POLLEN) + LAZYINITLIST(seed.chems) var/list/gene_value = LAZYACCESS(gene.values, TRAIT_CHEMS) for(var/rid in gene_value) @@ -42,10 +44,12 @@ LAZYREMOVE(gene.values, TRAIT_EXUDE_GASSES) LAZYREMOVE(gene.values, TRAIT_CHEMS) + LAZYREMOVE(gene.values, TRAIT_POLLEN) return ..() /decl/plant_gene/biochemistry/copy_initial_seed_values(datum/plantgene/gene, datum/seed/seed) LAZYSET(gene.values, TRAIT_CHEMS, seed.chems?.Copy()) LAZYSET(gene.values, TRAIT_EXUDE_GASSES, seed.exude_gasses?.Copy()) + LAZYSET(gene.values, TRAIT_POLLEN, seed.produces_pollen) return ..() diff --git a/code/modules/genetics/plants/trait_pollen.dm b/code/modules/genetics/plants/trait_pollen.dm new file mode 100644 index 000000000000..7dbbcbbd0df4 --- /dev/null +++ b/code/modules/genetics/plants/trait_pollen.dm @@ -0,0 +1,3 @@ +/decl/plant_trait/pollen + name = "pollen" + requires_master_gene = FALSE diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 8b2219be907f..e6622494592f 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -162,7 +162,9 @@ for(var/obj/machinery/portable_atmospherics/hydroponics/H in view(7, src)) if(H.seed && !H.dead) H.plant_health += 0.05 * coef - ++trays + if(H.pollen >= 1) + H.pollen-- + trays++ honeycombs = min(honeycombs + 0.1 * coef * min(trays, 5), frames * 100) /obj/machinery/honey_extractor diff --git a/code/modules/hydroponics/plant_types/seeds_herbs.dm b/code/modules/hydroponics/plant_types/seeds_herbs.dm index f03eede190ab..ec4273ebc4fc 100644 --- a/code/modules/hydroponics/plant_types/seeds_herbs.dm +++ b/code/modules/hydroponics/plant_types/seeds_herbs.dm @@ -1,6 +1,7 @@ /datum/seed/herb abstract_type = /datum/seed/herb allergen_flags = ALLERGEN_NONE // Do not make people allergic to the only medicine available on Shadyhills + produces_pollen = 0.5 /datum/seed/herb/New() ..() diff --git a/code/modules/hydroponics/plant_types/seeds_misc.dm b/code/modules/hydroponics/plant_types/seeds_misc.dm index e98328e4b399..8ee10be8c9dd 100644 --- a/code/modules/hydroponics/plant_types/seeds_misc.dm +++ b/code/modules/hydroponics/plant_types/seeds_misc.dm @@ -685,6 +685,7 @@ chems = list(/decl/material/liquid/nutriment = list(1,20)) slice_product = /obj/item/food/processed_grown/crushed slice_amount = 3 + produces_pollen = 1 /datum/seed/flower/New() ..() diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 1065eb1d8a22..d61f42d51ba0 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -32,6 +32,7 @@ var/scannable_result var/grown_is_seed = FALSE var/product_w_class = ITEM_SIZE_SMALL + var/produces_pollen = 0 // Dissection values. var/min_seed_extracted = 1 diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index bc714325733c..6745fdaf11c9 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -40,6 +40,9 @@ var/force_update // Set this to bypass the cycle time check. var/obj/temp_chem_holder // Something to hold reagents during process_reagents() + // Counter used by bees. + var/pollen = 0 + // Seed details/line data. var/datum/seed/seed = null // The currently planted seed diff --git a/code/modules/hydroponics/trays/tray_process.dm b/code/modules/hydroponics/trays/tray_process.dm index dbcf6f194470..a62c81a8d1e2 100644 --- a/code/modules/hydroponics/trays/tray_process.dm +++ b/code/modules/hydroponics/trays/tray_process.dm @@ -65,6 +65,9 @@ mutate((rand(100) < 15) ? 2 : 1) mutation_level = 0 + if(pollen < 10) + pollen += seed?.produces_pollen + // Maintain tray nutrient and water levels. if(seed.get_trait(TRAIT_REQUIRES_NUTRIENTS) && seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) > 0 && nutrilevel > 0 && prob(25)) nutrilevel -= max(0,seed.get_trait(TRAIT_NUTRIENT_CONSUMPTION) * growth_rate) diff --git a/nebula.dme b/nebula.dme index 9c2daf6c6355..480b5fa8efb4 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2523,6 +2523,7 @@ #include "code\modules\genetics\plants\trait_photosynthesis.dm" #include "code\modules\genetics\plants\trait_plant_colour.dm" #include "code\modules\genetics\plants\trait_plant_icon.dm" +#include "code\modules\genetics\plants\trait_pollen.dm" #include "code\modules\genetics\plants\trait_potency.dm" #include "code\modules\genetics\plants\trait_produces_power.dm" #include "code\modules\genetics\plants\trait_product_colour.dm" From 91f263c60faa37918e925f8ddcfdc80d5cea880f Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 28 Jul 2024 19:17:26 +1000 Subject: [PATCH 34/54] Modpacking beehives. --- code/datums/supplypacks/hydroponics.dm | 9 -- code/datums/trading/traders/ai.dm | 4 - .../circuitboards/machinery/household.dm | 14 +- .../crafting/stack_recipes/recipes_planks.dm | 7 - .../imprinter/designs_misc_circuits.dm | 5 +- maps/away/unishi/unishi.dm | 1 + maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/tradeship/tradeship.dm | 1 + mods/content/beekeeping/_beekeeping.dm | 2 + mods/content/beekeeping/_beekeeping.dme | 12 ++ .../content/beekeeping}/apiary_bees_etc.dmi | Bin mods/content/beekeeping/centrifuge.dm | 53 +++++++ mods/content/beekeeping/closets.dm | 15 ++ .../content/beekeeping/hives/_hive.dm | 139 +----------------- .../content/beekeeping/icons}/beekeeping.dmi | Bin mods/content/beekeeping/icons/smoker.dmi | Bin 0 -> 1019 bytes mods/content/beekeeping/items.dm | 75 ++++++++++ mods/content/beekeeping/recipes.dm | 10 ++ mods/content/beekeeping/trading.dm | 15 ++ nebula.dme | 1 - 21 files changed, 193 insertions(+), 172 deletions(-) create mode 100644 mods/content/beekeeping/_beekeeping.dm create mode 100644 mods/content/beekeeping/_beekeeping.dme rename {icons/obj => mods/content/beekeeping}/apiary_bees_etc.dmi (100%) create mode 100644 mods/content/beekeeping/centrifuge.dm create mode 100644 mods/content/beekeeping/closets.dm rename code/modules/hydroponics/beekeeping/beehive.dm => mods/content/beekeeping/hives/_hive.dm (57%) rename {icons/obj => mods/content/beekeeping/icons}/beekeeping.dmi (100%) create mode 100644 mods/content/beekeeping/icons/smoker.dmi create mode 100644 mods/content/beekeeping/items.dm create mode 100644 mods/content/beekeeping/recipes.dm create mode 100644 mods/content/beekeeping/trading.dm diff --git a/code/datums/supplypacks/hydroponics.dm b/code/datums/supplypacks/hydroponics.dm index 67de54be202e..bb368c5898ba 100644 --- a/code/datums/supplypacks/hydroponics.dm +++ b/code/datums/supplypacks/hydroponics.dm @@ -58,15 +58,6 @@ containername = "exotic Seeds crate" access = access_xenobiology -/decl/hierarchy/supply_pack/hydroponics/bee_keeper - name = "Equipment - Beekeeping" - contains = list(/obj/item/beehive_assembly, - /obj/item/bee_smoker, - /obj/item/honey_frame = 5, - /obj/item/bee_pack) - containername = "beekeeping crate" - access = access_hydroponics - /decl/hierarchy/supply_pack/hydroponics/hydrotray name = "Equipment - Hydroponics tray" contains = list(/obj/machinery/portable_atmospherics/hydroponics) diff --git a/code/datums/trading/traders/ai.dm b/code/datums/trading/traders/ai.dm index 2f77f6b20635..51d038d968b4 100644 --- a/code/datums/trading/traders/ai.dm +++ b/code/datums/trading/traders/ai.dm @@ -104,11 +104,7 @@ They sell generic supplies and ask for generic supplies. /obj/structure/ore_box = TRADER_THIS_TYPE, /obj/structure/coatrack = TRADER_THIS_TYPE, /obj/structure/bookcase = TRADER_THIS_TYPE, - /obj/item/bee_pack = TRADER_THIS_TYPE, - /obj/item/bee_smoker = TRADER_THIS_TYPE, - /obj/item/beehive_assembly = TRADER_THIS_TYPE, /obj/item/glass_jar = TRADER_THIS_TYPE, - /obj/item/honey_frame = TRADER_THIS_TYPE, /obj/item/training_dummy = TRADER_THIS_TYPE, /obj/item/training_dummy/syndicate = TRADER_THIS_TYPE, /obj/item/training_dummy/alien = TRADER_THIS_TYPE, diff --git a/code/game/objects/items/circuitboards/machinery/household.dm b/code/game/objects/items/circuitboards/machinery/household.dm index 8878ee43271c..5ce6f6ead15f 100644 --- a/code/game/objects/items/circuitboards/machinery/household.dm +++ b/code/game/objects/items/circuitboards/machinery/household.dm @@ -46,19 +46,15 @@ /obj/item/stock_parts/circuitboard/cooker/get_buildable_types() return subtypesof(/obj/machinery/cooker) -/obj/item/stock_parts/circuitboard/honey - name = "circuitboard (honey extractor)" - build_path = /obj/machinery/honey_extractor +/obj/item/stock_parts/circuitboard/seed_extractor + name = "circuitboard (seed extractor)" + build_path = /obj/machinery/seed_extractor board_type = "machine" origin_tech = @'{"biotech":2,"engineering":1}' req_components = list( /obj/item/stock_parts/manipulator = 2, - /obj/item/stock_parts/matter_bin = 2) - -/obj/item/stock_parts/circuitboard/honey/seed - name = "circuitboard (seed extractor)" - build_path = /obj/machinery/seed_extractor - board_type = "machine" + /obj/item/stock_parts/matter_bin = 2 + ) /obj/item/stock_parts/circuitboard/seed_storage name = "circuitboard (seed storage)" diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index 797c346a9dd1..e1e762675cfb 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -10,13 +10,6 @@ difficulty = MAT_VALUE_VERY_HARD_DIY category = "weapons" -/decl/stack_recipe/planks/beehive_assembly - result_type = /obj/item/beehive_assembly - category = "furniture" - -/decl/stack_recipe/planks/beehive_frame - result_type = /obj/item/honey_frame - /decl/stack_recipe/planks/zipgunframe result_type = /obj/item/zipgunframe difficulty = MAT_VALUE_VERY_HARD_DIY diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index 756507124ebc..845dfd8ed1c1 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -344,11 +344,8 @@ /datum/fabricator_recipe/imprinter/circuit/cooker path = /obj/item/stock_parts/circuitboard/cooker -/datum/fabricator_recipe/imprinter/circuit/honey_extractor - path = /obj/item/stock_parts/circuitboard/honey - /datum/fabricator_recipe/imprinter/circuit/seed_extractor - path = /obj/item/stock_parts/circuitboard/honey/seed + path = /obj/item/stock_parts/circuitboard/seed_extractor /datum/fabricator_recipe/imprinter/circuit/vending path = /obj/item/stock_parts/circuitboard/vending diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index 6808619093cc..bb5d0d2d9572 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -2,6 +2,7 @@ #include "unishi_jobs.dm" #include "../../../mods/content/xenobiology/_xenobiology.dme" #include "../../../mods/content/supermatter/_supermatter.dme" +#include "../../../mods/content/beekeeping/_beekeeping.dme" /obj/abstract/submap_landmark/joinable_submap/unishi name = "SRV Verne" diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 081ad6f823b1..47e23abbfe0b 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -3,6 +3,7 @@ #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/beekeeping/_beekeeping.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/government/_government.dme" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 4a4d02771021..4b103d995e43 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -43,6 +43,7 @@ Twice... #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/content/beekeeping/_beekeeping.dme" #include "../../mods/content/tabloids/_tabloids.dme" #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/species/tajaran/_tajaran.dme" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index e829a3299185..5a866a9c8b8b 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -11,6 +11,7 @@ #include "../../mods/content/government/away_sites/icarus/icarus.dm" #include "../../mods/content/corporate/away_sites/lar_maria/lar_maria.dm" + #include "../../mods/content/beekeeping/_beekeeping.dme" #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" diff --git a/mods/content/beekeeping/_beekeeping.dm b/mods/content/beekeeping/_beekeeping.dm new file mode 100644 index 000000000000..cfa1427bbeb1 --- /dev/null +++ b/mods/content/beekeeping/_beekeeping.dm @@ -0,0 +1,2 @@ +/decl/modpack/beekeeping + name = "Beekeeping Content" diff --git a/mods/content/beekeeping/_beekeeping.dme b/mods/content/beekeeping/_beekeeping.dme new file mode 100644 index 000000000000..2d950fe7a392 --- /dev/null +++ b/mods/content/beekeeping/_beekeeping.dme @@ -0,0 +1,12 @@ +#ifndef MODPACK_BEEKEEPING +#define MODPACK_BEEKEEPING +// BEGIN_INCLUDE +#include "_beekeeping.dm" +#include "centrifuge.dm" +#include "closets.dm" +#include "items.dm" +#include "recipes.dm" +#include "trading.dm" +#include "hives\_hive.dm" +// END_INCLUDE +#endif diff --git a/icons/obj/apiary_bees_etc.dmi b/mods/content/beekeeping/apiary_bees_etc.dmi similarity index 100% rename from icons/obj/apiary_bees_etc.dmi rename to mods/content/beekeeping/apiary_bees_etc.dmi diff --git a/mods/content/beekeeping/centrifuge.dm b/mods/content/beekeeping/centrifuge.dm new file mode 100644 index 000000000000..9b04168d744a --- /dev/null +++ b/mods/content/beekeeping/centrifuge.dm @@ -0,0 +1,53 @@ +/obj/machinery/honey_extractor + name = "honey extractor" + desc = "A machine used to extract honey and wax from a beehive frame." + icon = 'icons/obj/virology.dmi' + icon_state = "centrifuge" + anchored = TRUE + density = TRUE + construct_state = /decl/machine_construction/default/panel_closed + uncreated_component_parts = null + stat_immune = 0 + + var/processing = 0 + var/honey = 0 + +/obj/machinery/honey_extractor/components_are_accessible(path) + return !processing && ..() + +/obj/machinery/honey_extractor/cannot_transition_to(state_path, mob/user) + if(processing) + return SPAN_NOTICE("You must wait for \the [src] to finish first!") + return ..() + +/obj/machinery/honey_extractor/attackby(var/obj/item/I, var/mob/user) + if(processing) + to_chat(user, "\The [src] is currently spinning, wait until it's finished.") + return + if((. = component_attackby(I, user))) + return + if(istype(I, /obj/item/honey_frame)) + var/obj/item/honey_frame/H = I + if(!H.honey) + to_chat(user, "\The [H] is empty, put it into a beehive.") + return + user.visible_message("\The [user] loads \the [H] into \the [src] and turns it on.", "You load \the [H] into \the [src] and turn it on.") + processing = H.honey + icon_state = "centrifuge_moving" + qdel(H) + spawn(50) + new /obj/item/honey_frame(loc) + new /obj/item/stack/material/bar/wax(loc, 1) + honey += processing + processing = 0 + icon_state = "centrifuge" + else if(istype(I, /obj/item/chems/glass)) + if(!honey) + to_chat(user, "There is no honey in \the [src].") + return + var/obj/item/chems/glass/G = I + var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey) + G.add_to_reagents(/decl/material/liquid/nutriment/honey, transferred) + honey -= transferred + user.visible_message("\The [user] collects honey from \the [src] into \the [G].", "You collect [transferred] units of honey from \the [src] into \the [G].") + return 1 diff --git a/mods/content/beekeeping/closets.dm b/mods/content/beekeeping/closets.dm new file mode 100644 index 000000000000..224ff0561eb8 --- /dev/null +++ b/mods/content/beekeeping/closets.dm @@ -0,0 +1,15 @@ +/obj/structure/closet/crate/hydroponics/beekeeping + name = "beekeeping crate" + desc = "All you need to set up your own beehive." + +/obj/structure/closet/crate/hydroponics/beekeeping/Initialize() + . = ..() + new /obj/item/beehive_assembly(src) + new /obj/item/bee_smoker(src) + new /obj/item/honey_frame(src) + new /obj/item/honey_frame(src) + new /obj/item/honey_frame(src) + new /obj/item/honey_frame(src) + new /obj/item/honey_frame(src) + new /obj/item/bee_pack(src) + new /obj/item/crowbar(src) diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/mods/content/beekeeping/hives/_hive.dm similarity index 57% rename from code/modules/hydroponics/beekeeping/beehive.dm rename to mods/content/beekeeping/hives/_hive.dm index e6622494592f..edea2885862b 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/mods/content/beekeeping/hives/_hive.dm @@ -1,6 +1,6 @@ /obj/machinery/beehive name = "apiary" - icon = 'icons/obj/beekeeping.dmi' + icon = 'mods/content/beekeeping/icons/beekeeping.dmi' icon_state = "beehive-0" desc = "A wooden box designed specifically to house our buzzling buddies. Far more efficient than traditional hives. Just insert a frame and a queen, close it up, and you're good to go!" density = TRUE @@ -166,140 +166,3 @@ H.pollen-- trays++ honeycombs = min(honeycombs + 0.1 * coef * min(trays, 5), frames * 100) - -/obj/machinery/honey_extractor - name = "honey extractor" - desc = "A machine used to extract honey and wax from a beehive frame." - icon = 'icons/obj/virology.dmi' - icon_state = "centrifuge" - anchored = TRUE - density = TRUE - construct_state = /decl/machine_construction/default/panel_closed - uncreated_component_parts = null - stat_immune = 0 - - var/processing = 0 - var/honey = 0 - -/obj/machinery/honey_extractor/components_are_accessible(path) - return !processing && ..() - -/obj/machinery/honey_extractor/cannot_transition_to(state_path, mob/user) - if(processing) - return SPAN_NOTICE("You must wait for \the [src] to finish first!") - return ..() - -/obj/machinery/honey_extractor/attackby(var/obj/item/I, var/mob/user) - if(processing) - to_chat(user, "\The [src] is currently spinning, wait until it's finished.") - return TRUE - if(istype(I, /obj/item/honey_frame)) - var/obj/item/honey_frame/H = I - if(!H.honey) - to_chat(user, "\The [H] is empty, put it into a beehive.") - return TRUE - user.visible_message("\The [user] loads \the [H] into \the [src] and turns it on.", "You load \the [H] into \the [src] and turn it on.") - processing = H.honey - icon_state = "centrifuge_moving" - qdel(H) - spawn(50) - new /obj/item/honey_frame(loc) - new /obj/item/stack/material/bar/wax(loc, 1) - honey += processing - processing = 0 - icon_state = "centrifuge" - return TRUE - else if(istype(I, /obj/item/chems/glass)) - if(!honey) - to_chat(user, "There is no honey in \the [src].") - return TRUE - var/obj/item/chems/glass/G = I - var/transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, honey) - G.add_to_reagents(/decl/material/liquid/nutriment/honey, transferred) - honey -= transferred - user.visible_message("\The [user] collects honey from \the [src] into \the [G].", "You collect [transferred] units of honey from \the [src] into \the [G].") - return TRUE - return ..() // smack it, interact with components, etc. - -/obj/item/bee_smoker - name = "bee smoker" - desc = "A device used to calm down bees before harvesting honey." - icon = 'icons/obj/items/weapon/batterer.dmi' - icon_state = ICON_STATE_WORLD - w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/metal/steel - -/obj/item/honey_frame - name = "beehive frame" - desc = "A frame for the beehive that the bees will fill with honeycombs." - icon = 'icons/obj/beekeeping.dmi' - icon_state = "honeyframe" - w_class = ITEM_SIZE_SMALL - material = /decl/material/solid/organic/wood/oak - var/honey = 0 - -/obj/item/honey_frame/filled - name = "filled beehive frame" - desc = "A frame for the beehive that the bees have filled with honeycombs." - honey = 20 - material = /decl/material/solid/organic/wood/oak - -/obj/item/honey_frame/filled/Initialize() - . = ..() - overlays += "honeycomb" - -/obj/item/beehive_assembly - name = "beehive assembly" - desc = "Contains everything you need to build a beehive." - icon = 'icons/obj/apiary_bees_etc.dmi' - icon_state = "apiary" - material = /decl/material/solid/organic/wood/oak - -/obj/item/beehive_assembly/attack_self(var/mob/user) - to_chat(user, "You start assembling \the [src]...") - if(do_after(user, 30, src)) - user.visible_message("\The [user] constructs a beehive.", "You construct a beehive.") - new /obj/machinery/beehive(get_turf(user)) - qdel(src) - -/obj/item/bee_pack - name = "bee pack" - desc = "Contains a queen bee and some worker bees. Everything you'll need to start a hive!" - icon = 'icons/obj/beekeeping.dmi' - icon_state = "beepack" - material = /decl/material/solid/organic/plastic - var/full = 1 - -/obj/item/bee_pack/Initialize() - . = ..() - overlays += "beepack-full" - -/obj/item/bee_pack/proc/empty() - full = 0 - name = "empty bee pack" - desc = "A stasis pack for moving bees. It's empty." - overlays.Cut() - overlays += "beepack-empty" - -/obj/item/bee_pack/proc/fill() - full = initial(full) - SetName(initial(name)) - desc = initial(desc) - overlays.Cut() - overlays += "beepack-full" - -/obj/structure/closet/crate/hydroponics/beekeeping - name = "beekeeping crate" - desc = "All you need to set up your own beehive." - -/obj/structure/closet/crate/hydroponics/beekeeping/Initialize() - . = ..() - new /obj/item/beehive_assembly(src) - new /obj/item/bee_smoker(src) - new /obj/item/honey_frame(src) - new /obj/item/honey_frame(src) - new /obj/item/honey_frame(src) - new /obj/item/honey_frame(src) - new /obj/item/honey_frame(src) - new /obj/item/bee_pack(src) - new /obj/item/crowbar(src) diff --git a/icons/obj/beekeeping.dmi b/mods/content/beekeeping/icons/beekeeping.dmi similarity index 100% rename from icons/obj/beekeeping.dmi rename to mods/content/beekeeping/icons/beekeeping.dmi diff --git a/mods/content/beekeeping/icons/smoker.dmi b/mods/content/beekeeping/icons/smoker.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5109ca468e5ef5da3699da09349edda079fd7d91 GIT binary patch literal 1019 zcmeAS@N?(olHy`uVBq!ia0vp^4Is?H1|$#LC7uRSv#LTON?cNllZ!G7N;32F7#J$% z%ssuA>yUv&>qE<(UC!3we_qaV4f1OHCg$a}h;zwLg-)^e_ZBwqSg~U+^ZVe(cfMw| z$cXH}J;m0QW6N&a^ws7^9UqiDITKl5nrglCMUrB`+9^#dEsX6_Ib__KcD2>_F?7aFV0|T>+ zr;B4q#hkZybo-PXW!gU0=Z7uYafpMZ{YH=sL!*vo#$~pHn#UHTP1HEo@G2odTTrG! z`a$*4W$LF>#AhwC*SPn5dXGfLB(IMp9|c!UwmHwcYhS4?LrFKo5y1uvCINSbM;s0^ zj2+4hg$Efc-gkdm|7ZWc#D%)|o#meF)puJw@$2u}**ZT8t^+YTOJGB>lN>74Q2TL|7@B5{d1gxT;Ljp48Hp;*A7^Uznz{im04r@ z_w3^udjHSuJk+Ihi$jb3!Cw7KCVQ)VW-Tj<=X_o%SNh@NewH2gHeP-(r?^%1qnW^; z&<~qWoNx9^xBn)(;L~x3&8PdD;@>}3PMGtKi($R`ukQ>MJm7F)QRu@AEW(0|?n_;3 zds_5!r?A%PP0R286fyD(Ymh$WdAF{n#CD3;sltDSUK>;n?t&TQ9Asjmz5J!^WMUEug} zheAxVfl24n^zQO=rM4}88<{{U39A}3!I&%d91o>f`@8E{S5({YoArWOV40VxhkWBx-co9ECzaln6fAg}Pcw5$4JIeu>n;AS^{an^LB{Ts5PVTgY literal 0 HcmV?d00001 diff --git a/mods/content/beekeeping/items.dm b/mods/content/beekeeping/items.dm new file mode 100644 index 000000000000..69a888b28830 --- /dev/null +++ b/mods/content/beekeeping/items.dm @@ -0,0 +1,75 @@ +/obj/item/beehive_assembly + name = "beehive assembly" + desc = "Contains everything you need to build a beehive." + icon = 'mods/content/beekeeping/apiary_bees_etc.dmi' + icon_state = "apiary" + material = /decl/material/solid/organic/wood + +/obj/item/beehive_assembly/attack_self(var/mob/user) + to_chat(user, "You start assembling \the [src]...") + if(do_after(user, 30, src)) + user.visible_message("\The [user] constructs a beehive.", "You construct a beehive.") + new /obj/machinery/beehive(get_turf(user)) + qdel(src) + +/obj/item/stock_parts/circuitboard/honey + name = "circuitboard (honey extractor)" + build_path = /obj/machinery/honey_extractor + board_type = "machine" + origin_tech = @'{"biotech":2,"engineering":1}' + req_components = list( + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/matter_bin = 2) + +/obj/item/bee_smoker + name = "bee smoker" + desc = "A device used to calm down bees before harvesting honey." + icon = 'mods/content/beekeeping/icons/smoker.dmi' + icon_state = ICON_STATE_WORLD + w_class = ITEM_SIZE_SMALL + material = /decl/material/solid/metal/steel + +/obj/item/honey_frame + name = "beehive frame" + desc = "A frame for the beehive that the bees will fill with honeycombs." + icon = 'mods/content/beekeeping/icons/beekeeping.dmi' + icon_state = "honeyframe" + w_class = ITEM_SIZE_SMALL + material = /decl/material/solid/organic/wood + var/honey = 0 + +/obj/item/honey_frame/filled + name = "filled beehive frame" + desc = "A frame for the beehive that the bees have filled with honeycombs." + honey = 20 + material = /decl/material/solid/organic/wood + +/obj/item/honey_frame/filled/Initialize() + . = ..() + overlays += "honeycomb" + +/obj/item/bee_pack + name = "bee pack" + desc = "Contains a queen bee and some worker bees. Everything you'll need to start a hive!" + icon = 'mods/content/beekeeping/icons/beekeeping.dmi' + icon_state = "beepack" + material = /decl/material/solid/organic/plastic + var/full = 1 + +/obj/item/bee_pack/Initialize() + . = ..() + overlays += "beepack-full" + +/obj/item/bee_pack/proc/empty() + full = 0 + name = "empty bee pack" + desc = "A stasis pack for moving bees. It's empty." + overlays.Cut() + overlays += "beepack-empty" + +/obj/item/bee_pack/proc/fill() + full = initial(full) + SetName(initial(name)) + desc = initial(desc) + overlays.Cut() + overlays += "beepack-full" diff --git a/mods/content/beekeeping/recipes.dm b/mods/content/beekeeping/recipes.dm new file mode 100644 index 000000000000..03089d932ab9 --- /dev/null +++ b/mods/content/beekeeping/recipes.dm @@ -0,0 +1,10 @@ + +/decl/stack_recipe/planks/beehive_assembly + result_type = /obj/item/beehive_assembly + category = "furniture" + +/decl/stack_recipe/planks/beehive_frame + result_type = /obj/item/honey_frame + +/datum/fabricator_recipe/imprinter/circuit/honey_extractor + path = /obj/item/stock_parts/circuitboard/honey diff --git a/mods/content/beekeeping/trading.dm b/mods/content/beekeeping/trading.dm new file mode 100644 index 000000000000..1a119ddc99be --- /dev/null +++ b/mods/content/beekeeping/trading.dm @@ -0,0 +1,15 @@ +/datum/trader/trading_beacon/manufacturing/New() + LAZYSET(possible_trading_items, /obj/item/bee_pack, TRADER_THIS_TYPE) + LAZYSET(possible_trading_items, /obj/item/bee_smoker, TRADER_THIS_TYPE) + LAZYSET(possible_trading_items, /obj/item/beehive_assembly, TRADER_THIS_TYPE) + LAZYSET(possible_trading_items, /obj/item/honey_frame, TRADER_THIS_TYPE) + ..() + +/decl/hierarchy/supply_pack/hydroponics/bee_keeper + name = "Equipment - Beekeeping" + contains = list(/obj/item/beehive_assembly, + /obj/item/bee_smoker, + /obj/item/honey_frame = 5, + /obj/item/bee_pack) + containername = "beekeeping crate" + access = access_hydroponics diff --git a/nebula.dme b/nebula.dme index 480b5fa8efb4..d1296a75367d 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2590,7 +2590,6 @@ #include "code\modules\hydroponics\seed_mobs.dm" #include "code\modules\hydroponics\seed_packets.dm" #include "code\modules\hydroponics\seed_storage.dm" -#include "code\modules\hydroponics\beekeeping\beehive.dm" #include "code\modules\hydroponics\plant_types\seeds_herbs.dm" #include "code\modules\hydroponics\plant_types\seeds_misc.dm" #include "code\modules\hydroponics\spreading\spreading.dm" From d4a6695d6312728a3046ba5ffb2bbb5adb267802 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 18:17:22 -0500 Subject: [PATCH 35/54] Fix 'that's a space' when examining space --- code/_helpers/text.dm | 4 ++++ code/game/atoms.dm | 13 ++++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/_helpers/text.dm b/code/_helpers/text.dm index 103e0b49b97f..adccbbc543df 100644 --- a/code/_helpers/text.dm +++ b/code/_helpers/text.dm @@ -27,6 +27,10 @@ * from text that will be sent to the browser. */ #define strip_improper(input_text) replacetext(replacetext(input_text, "\proper", ""), "\improper", "") +var/global/regex/starts_uppercase_regex = regex(@"^[A-Z]") +var/global/regex/starts_lowercase_regex = regex(@"^[a-z]") +#define is_proper(input_text) ((findtext(input_text, "\proper") == 1) || findtext(input_text, starts_uppercase_regex)) +#define is_improper(input_text) ((findtext(input_text, "\improper") == 1 || findtext(input_text, starts_lowercase_regex))) //Used for preprocessing entered text //Added in an additional check to alert players if input is too long diff --git a/code/game/atoms.dm b/code/game/atoms.dm index cf302e4faad7..3d41801c8608 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -295,11 +295,14 @@ // Name, displayed at the top. /atom/proc/get_examine_header(mob/user, distance, infix, suffix) SHOULD_CALL_PARENT(TRUE) - //This reformats names to get a/an properly working on item descriptions when they are bloody or coated in reagents. - var/examine_prefix = get_examine_prefix() - if(examine_prefix) - examine_prefix += " " // add a space to the end to be polite - return list("[html_icon(src)] That's [ADD_ARTICLE_GENDER("[examine_prefix][name]", gender)][infix][get_examine_punctuation()] [suffix]") + var/article_name = name + if(is_improper(name)) // no 'that's bloody oily slimy Bob', that's just Bob + //This reformats names to get a/an properly working on item descriptions when they are bloody or coated in reagents. + var/examine_prefix = get_examine_prefix() + if(examine_prefix) + examine_prefix += " " // add a space to the end to be polite + article_name = ADD_ARTICLE_GENDER("[examine_prefix][name]", gender) + return list("[html_icon(src)] That's [article_name][infix][get_examine_punctuation()] [suffix]") // Main body of examine, displayed after the header and before hints. /atom/proc/get_examine_strings(mob/user, distance, infix, suffix) From bc3deb6f22e39da4e3f25dafb68188c5ee15aed9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 7 Feb 2025 19:43:56 -0500 Subject: [PATCH 36/54] Optimize pick-turf predicate helpers --- code/_helpers/areas.dm | 24 ++++++++++++------------ test/check-paths.sh | 2 +- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/code/_helpers/areas.dm b/code/_helpers/areas.dm index b252f96b537f..3238e0ec1018 100644 --- a/code/_helpers/areas.dm +++ b/code/_helpers/areas.dm @@ -36,28 +36,28 @@ */ /proc/pick_area_turf_by_flag(var/area_flags, var/list/predicates) var/list/turfs - for(var/sub_area_type in subtypesof(/area)) - var/area/sub_area = sub_area_type - if(!(initial(sub_area.area_flags) & area_flags)) + var/list/valid_areas = list() + for(var/area/candidate_area as anything in global.areas) + if(!(candidate_area.area_flags & area_flags)) continue - sub_area = locate(sub_area_type) - if(!sub_area) + valid_areas[candidate_area] = TRUE + // Each area contents loop is an in-world loop, so we just do one here. + for(var/turf/turf_candidate in world) + var/area/candidate_area = get_area(turf_candidate) + if(!valid_areas[candidate_area]) continue - for(var/turf/T in sub_area.contents) - if(!predicates || all_predicates_true(list(T), predicates)) - LAZYADD(turfs, T) + if(!predicates || all_predicates_true(list(turf_candidate), predicates)) + LAZYADD(turfs, turf_candidate) if(LAZYLEN(turfs)) return pick(turfs) /proc/pick_area_turf(var/areatype, var/list/predicates) var/list/turfs = get_area_turfs(areatype, predicates) - if(turfs && turfs.len) - return pick(turfs) + return SAFEPICK(turfs) /proc/pick_area(var/list/predicates) var/list/areas = get_filtered_areas(predicates) - if(LAZYLEN(areas)) - . = pick(areas) + return SAFEPICK(areas) /proc/pick_area_and_turf(var/list/area_predicates, var/list/turf_predicates) var/list/areas = get_filtered_areas(area_predicates) diff --git a/test/check-paths.sh b/test/check-paths.sh index f2cc61b20e2b..3af3d19be867 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -32,7 +32,7 @@ exactly 2 "/mob text paths" '"/mob' exactly 6 "/obj text paths" '"/obj' exactly 10 "/turf text paths" '"/turf' exactly 1 "world<< uses" 'world\s*<<' -exactly 74 "'in world' uses" '\s+\bin world\b(?=\s*$|\s*//|\s*\))' -P +exactly 75 "'in world' uses" '\s+\bin world\b(?=\s*$|\s*//|\s*\))' -P exactly 1 "world.log<< uses" 'world.log\s*<<' exactly 18 "<< uses" '(? Date: Fri, 7 Feb 2025 20:46:38 -0500 Subject: [PATCH 37/54] Fix cold protection item value calculation --- code/modules/economy/worth_items.dm | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/code/modules/economy/worth_items.dm b/code/modules/economy/worth_items.dm index 3c754456b70e..15998a7521f9 100644 --- a/code/modules/economy/worth_items.dm +++ b/code/modules/economy/worth_items.dm @@ -31,8 +31,14 @@ . += melee_accuracy_bonus * 2 var/total_coverage = get_percentage_body_cover(body_parts_covered) - var/cold_value = (5 * (-(min_cold_protection_temperature)/T20C) * get_percentage_body_cover(cold_protection)) - var/heat_value = (5 * (max_heat_protection_temperature/T20C) * get_percentage_body_cover(heat_protection)) + var/cold_value = 0 + if(!isnull(min_cold_protection_temperature) && cold_protection) + // Adds 5cr for every 20 degrees of protection below 20C at full coverage + cold_value = (5 * (T20C - min_cold_protection_temperature)/20 * get_percentage_body_cover(cold_protection)) + var/heat_value = 0 + if(!isnull(max_heat_protection_temperature) && heat_protection) + // Adds 5cr for every 20 degrees of protection over 20C at full coverage + heat_value = (5 * (max_heat_protection_temperature - T20C)/20 * get_percentage_body_cover(heat_protection)) var/additional_value = cold_value + heat_value if(total_coverage > 0) From ab4bf028a70771fad98391dda55e41b4a5880b07 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Fri, 7 Feb 2025 21:30:18 -0500 Subject: [PATCH 38/54] Fix invalid origin_tech interpolations --- .../simple_animal/hostile/retaliate/drone.dm | 21 ++++++++++--------- .../datacapsule/datacapsule.dm | 8 ++++++- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm index 662a6058c3d5..eb716d31d63a 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/drone.dm @@ -217,6 +217,7 @@ //spawn 1-4 boards of a random type var/spawnees = 0 var/num_boards = rand(1,4) + //TODO: Make these use actual subtypes instead var/list/options = list(1,2,4,8,16,32,64,128,256,512) for(var/i=0, i Date: Sun, 9 Feb 2025 14:24:53 -0500 Subject: [PATCH 39/54] Fix AI hologram admin verb --- code/modules/admin/holoverbs.dm | 33 ++++++--------------------------- 1 file changed, 6 insertions(+), 27 deletions(-) diff --git a/code/modules/admin/holoverbs.dm b/code/modules/admin/holoverbs.dm index 4f58af7018b6..97fc22616a48 100644 --- a/code/modules/admin/holoverbs.dm +++ b/code/modules/admin/holoverbs.dm @@ -13,33 +13,12 @@ var/mob/living/silicon/ai/AI = input("Which AI do you want to apply [appear] to as a hologram?") as null|anything in AIs if(!AI) return - var/image/I = image(appear.icon, appear.icon_state) - I.overlays = appear.overlays - I.underlays = appear.underlays - I.color = list( - 0.30, 0.30, 0.30, 0.0, // Greyscale and reduce the alpha of the icon - 0.59, 0.59, 0.59, 0.0, - 0.11, 0.11, 0.11, 0.0, - 0.00, 0.00, 0.00, 0.5, - 0.00, 0.00, 0.00, 0.0 - ) - var/image/scan = image('icons/effects/effects.dmi', "scanline") - scan.color = list( - 0.30,0.30,0.30,0.00, // Greyscale the scanline icon too - 0.59,0.59,0.59,0.00, - 0.11,0.11,0.11,0.00, - 0.00,0.00,0.00,1.00, - 0.00,0.00,0.00,0.00 - ) - scan.blend_mode = BLEND_MULTIPLY - - // Combine the mob image and the scanlines into a single KEEP_TOGETHER'd image - var/image/I2 = image(null) - I2.underlays += I - I2.overlays += scan - I2.appearance_flags = KEEP_TOGETHER - I2.color = rgb(125, 180, 225) // make it blue! - AI.holo_icon = I2 + var/icon/character_icon = getFlatIcon(appear) + if(character_icon) + qdel(AI.holo_icon)//Clear old icon so we're not storing it in memory. + qdel(AI.holo_icon_longrange) + AI.holo_icon = getHologramIcon(icon(character_icon), custom_tone = AI.custom_color_tone) + AI.holo_icon_longrange = getHologramIcon(icon(character_icon), hologram_color = HOLOPAD_LONG_RANGE) to_chat(AI, "Your hologram icon has been set to [appear].") log_and_message_admins("set [key_name(AI)]'s hologram icon to [key_name(appear)]") From 48d14ea726d265cbe5598417751cf1b75d3d7851 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 9 Feb 2025 16:27:18 -0500 Subject: [PATCH 40/54] Optimize check_tile_graphic and other gasmix procs --- code/modules/xgm/xgm_gas_mixture.dm | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/code/modules/xgm/xgm_gas_mixture.dm b/code/modules/xgm/xgm_gas_mixture.dm index e16bba237e7c..e567de48405c 100644 --- a/code/modules/xgm/xgm_gas_mixture.dm +++ b/code/modules/xgm/xgm_gas_mixture.dm @@ -13,7 +13,7 @@ var/group_multiplier = 1 //List of active tile overlays for this gas_mixture. Updated by check_tile_graphic() - var/list/graphic = list() + var/list/graphic //Cache of gas overlay objects var/list/tile_overlay_cache ///The last cached color of the gas mixture @@ -32,8 +32,6 @@ update_values() /datum/gas_mixture/proc/get_gas(gasid) - if(!gas.len) - return 0 //if the list is empty BYOND treats it as a non-associative list, which runtimes return gas[gasid] * group_multiplier /datum/gas_mixture/proc/get_total_moles() @@ -193,7 +191,7 @@ which is bit more realistic (natural log), and returns a fairly accurate entropy around room temperatures and pressures. */ /datum/gas_mixture/proc/specific_entropy_gas(var/gasid) - if (!(gasid in gas) || gas[gasid] == 0) + if (!gas[gasid]) return SPECIFIC_ENTROPY_VACUUM //that gas isn't here //group_multiplier gets divided out in volume/gas[gasid] - also, V/(m*T) = R/(partial pressure) @@ -367,9 +365,10 @@ //Two lists can be passed by reference if you need know specifically which graphics were added and removed. // Returns TRUE if the graphics list was mutated. /datum/gas_mixture/proc/check_tile_graphic(list/graphic_add = null, list/graphic_remove = null) - for(var/obj/effect/gas_overlay/O in graphic) - if(gas[O.material.type] <= O.material.gas_overlay_limit) - LAZYADD(graphic_remove, O) + if(LAZYLEN(graphic)) + for(var/obj/effect/gas_overlay/O in graphic) + if(gas[O.material.type] <= O.material.gas_overlay_limit) + LAZYADD(graphic_remove, O) for(var/g in gas) //Overlay isn't applied for this gas, check if it's valid and needs to be added. var/decl/material/mat = GET_DECL(g) @@ -381,13 +380,13 @@ LAZYADD(graphic_add, tile_overlay) . = FALSE //Apply changes - if(graphic_add && graphic_add.len) - graphic |= graphic_add + if(LAZYLEN(graphic_add)) + LAZYADD(graphic, graphic_add) . = TRUE - if(graphic_remove && graphic_remove.len) - graphic -= graphic_remove + if(LAZYLEN(graphic_remove)) + LAZYREMOVE(graphic, graphic_remove) . = TRUE - if(graphic.len) + if(LAZYLEN(graphic)) var/pressure_mod = clamp(return_pressure() / ONE_ATMOSPHERE, 0, 2) for(var/obj/effect/gas_overlay/O in graphic) var/concentration_mod = clamp(gas[O.material.type] / total_moles, 0.1, 1) From fb153fe0f16e295397d1d4f7b91d98c88e4f4127 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Sun, 9 Feb 2025 20:42:03 -0500 Subject: [PATCH 41/54] Fix invalid seed chems value --- .../maps/template_types/random_exoplanet/flora_generator.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/maps/template_types/random_exoplanet/flora_generator.dm b/code/modules/maps/template_types/random_exoplanet/flora_generator.dm index 86fd9fb00fc6..6bf9ff36f00d 100644 --- a/code/modules/maps/template_types/random_exoplanet/flora_generator.dm +++ b/code/modules/maps/template_types/random_exoplanet/flora_generator.dm @@ -162,6 +162,6 @@ S.set_trait(TRAIT_HARVEST_REPEAT, 1) S.set_trait(TRAIT_LARGE, 1) S.set_trait(TRAIT_LEAVES_COLOUR, color) - S.chems[/decl/material/solid/organic/wood] = 1 //#TODO: Maybe look at Why the seed creates injectable wood? + S.chems[/decl/material/solid/organic/wood] = list(1,0) //#TODO: Maybe look at Why the seed creates injectable wood? adapt_seed(S, atmos) LAZYADD(big_flora_types, S) From ae2fbc5bca566c65fb439b72899fdcfd7b56705d Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 12 Feb 2025 03:40:46 -0500 Subject: [PATCH 42/54] Fix incorrect proc indentation --- code/_helpers/icons.dm | 4 ++-- code/game/machinery/doors/firedoor.dm | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/_helpers/icons.dm b/code/_helpers/icons.dm index ee74c5f11efe..927bb8c195f1 100644 --- a/code/_helpers/icons.dm +++ b/code/_helpers/icons.dm @@ -271,8 +271,8 @@ world // make this icon fully opaque--transparent pixels become black /icon/proc/Opaque(background = "#000000") - SwapColor(null, background) - MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,1) + SwapColor(null, background) + MapColors(1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,0, 0,0,0,1) // Change a grayscale icon into a white icon where the original color becomes the alpha // I.e., black -> transparent, gray -> translucent white, white -> solid white diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index a7dc1926b760..673d87c5bdde 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -95,8 +95,8 @@ LAZYADD(areas_added, A) /obj/machinery/door/firedoor/proc/unregister_area(area/A) - LAZYREMOVE(A.all_doors, src) - LAZYREMOVE(areas_added, A) + LAZYREMOVE(A.all_doors, src) + LAZYREMOVE(areas_added, A) /obj/machinery/door/firedoor/proc/update_area_registrations() var/list/new_areas = list() From 286b9afb4fb9fbb2c24e7a8f74409b47749dcc3e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 12 Feb 2025 04:05:54 -0500 Subject: [PATCH 43/54] Simplify HE pipe temperature_interact --- code/modules/atmospherics/datum_pipeline.dm | 67 +++++---------------- 1 file changed, 16 insertions(+), 51 deletions(-) diff --git a/code/modules/atmospherics/datum_pipeline.dm b/code/modules/atmospherics/datum_pipeline.dm index 8cdb4d002dba..7ece1fe43700 100644 --- a/code/modules/atmospherics/datum_pipeline.dm +++ b/code/modules/atmospherics/datum_pipeline.dm @@ -199,61 +199,26 @@ var/total_heat_capacity = air.heat_capacity() var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) + var/datum/gas_mixture/target_air = target.return_air() if(total_heat_capacity <= 0) // Avoid div by zero. return - if(SHOULD_PARTICIPATE_IN_ZONES(target) && !target.blocks_air) - - if(partial_heat_capacity <= 0) - return - - var/delta_temperature = 0 - var/sharer_heat_capacity = 0 - if(target.zone) - delta_temperature = (air.temperature - target.zone.air.temperature) - sharer_heat_capacity = target.zone.air.heat_capacity() - else - delta_temperature = (air.temperature - target.air.temperature) - sharer_heat_capacity = target.air.heat_capacity() - - if(sharer_heat_capacity <= 0) - return - - var/self_temperature_delta = 0 - var/sharer_temperature_delta = 0 - var/heat = thermal_conductivity * delta_temperature * ( partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity + sharer_heat_capacity) ) - self_temperature_delta = -heat/total_heat_capacity - sharer_temperature_delta = heat/sharer_heat_capacity - air.temperature += self_temperature_delta - - if(target.zone) - target.zone.air.temperature += sharer_temperature_delta/target.zone.air.group_multiplier - else - target.air.temperature += sharer_temperature_delta - - else if(target.external_atmosphere_participation && !target.blocks_air) - - if(partial_heat_capacity <= 0) - return - - var/datum/gas_mixture/target_air = target.return_air() - var/sharer_heat_capacity = target_air?.heat_capacity() - - if(sharer_heat_capacity <= 0) - return - - var/delta_temperature = air.temperature - target_air.temperature - var/heat = thermal_conductivity * delta_temperature * ( partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity+sharer_heat_capacity) ) - air.temperature += -heat/total_heat_capacity - - else if((target.heat_capacity > 0) && (partial_heat_capacity > 0)) - var/delta_temperature = air.temperature - target.temperature - var/heat = thermal_conductivity * delta_temperature * ( partial_heat_capacity * target.heat_capacity / (partial_heat_capacity + target.heat_capacity) ) - air.temperature -= heat/total_heat_capacity - // Only increase the temperature of the target if it's simulated. - if(target.simulated) - target.temperature += heat/target.heat_capacity + if(target.blocks_air) + return + + if(partial_heat_capacity <= 0) + return + + var/sharer_heat_capacity = target_air.heat_capacity() + + if(sharer_heat_capacity <= 0) + return + + var/delta_temperature = (air.temperature - target_air.temperature) + var/heat = thermal_conductivity * delta_temperature * ( partial_heat_capacity * sharer_heat_capacity / (partial_heat_capacity + sharer_heat_capacity) ) + air.add_thermal_energy(-heat) + target_air.add_thermal_energy(heat) if(network) network.update = TRUE From 20dcfd4554863ee85f807ee07e5f93e434ec96ac Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 12 Feb 2025 04:06:18 -0500 Subject: [PATCH 44/54] Fix shoe cuff slowdowns --- code/modules/clothing/shoes/_shoes.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 0190bce747b3..ee2399b9cd40 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -78,7 +78,7 @@ return user.visible_message(SPAN_ITALIC("\The [user] attaches \the [cuffs] to \the [src]."), range = 2) verbs |= /obj/item/clothing/shoes/proc/try_remove_cuffs - LAZYINITLIST(slowdown_per_slot[slot_shoes_str]) + LAZYINITLIST(slowdown_per_slot) slowdown_per_slot[slot_shoes_str] += cuffs.elastic ? 10 : 15 attached_cuffs = cuffs @@ -104,7 +104,7 @@ return user.visible_message(SPAN_ITALIC("\The [user] removes \the [attached_cuffs] from \the [src]."), range = 2) attached_cuffs.add_fingerprint(user) - LAZYINITLIST(slowdown_per_slot[slot_shoes_str]) + LAZYINITLIST(slowdown_per_slot) slowdown_per_slot[slot_shoes_str] -= attached_cuffs.elastic ? 10 : 15 verbs -= /obj/item/clothing/shoes/proc/try_remove_cuffs attached_cuffs = null From 3d4716ec3dfa5ecf80dca7ea41b011c7fcaf406b Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 12 Feb 2025 04:09:02 -0500 Subject: [PATCH 45/54] Fix redundant recipe product spawns in crafting unit test --- code/unit_tests/materials.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/unit_tests/materials.dm b/code/unit_tests/materials.dm index 703f45346ba9..f55ade48d342 100644 --- a/code/unit_tests/materials.dm +++ b/code/unit_tests/materials.dm @@ -54,7 +54,8 @@ var/test_type = recipe.test_result_type || recipe.result_type if(!test_type || ispath(test_type, /turf)) // Cannot exist without a loc and doesn't have matter, cannot assess here. continue - var/atom/product = LAZYACCESS(recipe.spawn_result(null, null, 1, material, reinforced, null), 1) + var/list/results = recipe.spawn_result(null, null, 1, material, reinforced, null) + var/atom/product = LAZYACCESS(results, 1) var/list/failed = list() if(!product) failed += "no product returned" From c05a8eb5f48f15183c7014c9ff71436944ae9196 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 12 Feb 2025 04:10:07 -0500 Subject: [PATCH 46/54] Remove morph shapeshifter power --- code/__defines/genetics.dm | 1 - code/datums/genetics/genetic_conditions.dm | 5 -- code/modules/mob/living/human/human_verbs.dm | 73 -------------------- 3 files changed, 79 deletions(-) diff --git a/code/__defines/genetics.dm b/code/__defines/genetics.dm index 9744c4407e9a..e1af913787b9 100644 --- a/code/__defines/genetics.dm +++ b/code/__defines/genetics.dm @@ -5,7 +5,6 @@ #define GENE_COND_REMOTE_TALK /decl/genetic_condition/superpower/remotetalk #define GENE_COND_RUNNING /decl/genetic_condition/superpower/running #define GENE_COND_REMOTE_VIEW /decl/genetic_condition/superpower/remoteview -#define GENE_COND_SHAPESHIFTER /decl/genetic_condition/superpower/morph #define GENE_COND_NO_FINGERPRINTS /decl/genetic_condition/superpower/noprints #define GENE_COND_CLUMSY /decl/genetic_condition/disability/clumsy diff --git a/code/datums/genetics/genetic_conditions.dm b/code/datums/genetics/genetic_conditions.dm index 3d94ab5c0726..3b0a80e7532c 100644 --- a/code/datums/genetics/genetic_conditions.dm +++ b/code/datums/genetics/genetic_conditions.dm @@ -65,11 +65,6 @@ grant_verb = /mob/living/human/proc/remotesay activation_message = "You expand your mind outwards." -/decl/genetic_condition/superpower/morph - name = "Morph" - grant_verb = /mob/living/human/proc/morph - activation_message = "Your skin feels strange." - /decl/genetic_condition/superpower/cold_resist name = "Cold Resistance" underlay_state = "fire_s" diff --git a/code/modules/mob/living/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm index 28664c4d2323..c2f05a7ca4a7 100644 --- a/code/modules/mob/living/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -1,76 +1,3 @@ -/mob/living/human/proc/morph() - set name = "Morph" - set category = "Superpower" - - if(stat!=CONSCIOUS) - reset_view(0) - remoteview_target = null - return - - if(!has_genetic_condition(GENE_COND_SHAPESHIFTER)) - src.verbs -= /mob/living/human/proc/morph - return - - var/new_facial = input("Please select facial hair color.", "Character Generation", GET_FACIAL_HAIR_COLOR(src)) as color - if(new_facial) - SET_FACIAL_HAIR_COLOR(src, new_facial, TRUE) - - var/new_hair = input("Please select hair color.", "Character Generation", GET_HAIR_COLOR(src)) as color - if(new_hair) - SET_HAIR_COLOR(src, new_hair, TRUE) - - var/new_eyes = input("Please select eye color.", "Character Generation", get_eye_colour()) as color - if(new_eyes) - set_eye_colour(new_eyes) - - var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", "[35-skin_tone]") as text - - if (!new_tone) - new_tone = 35 - skin_tone = max(min(round(text2num(new_tone)), 220), 1) - skin_tone = -skin_tone + 35 - - // hair - var/list/all_hairs = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/hair) - var/list/hairs = list() - - // loop through potential hairs - for(var/x in all_hairs) - hairs += all_hairs[x] - - var/decl/new_style = input("Please select hair style", "Character Generation", GET_HAIR_STYLE(src)) as null|anything in hairs - - // if new style selected (not cancel) - if(new_style) - SET_HAIR_STYLE(src, new_style.type, TRUE) - - // facial hair - var/list/all_fhairs = decls_repository.get_decls_of_subtype(/decl/sprite_accessory/facial_hair) - var/list/fhairs = list() - - for(var/x in all_fhairs) - fhairs += all_fhairs[x] - - new_style = input("Please select facial style", "Character Generation", GET_FACIAL_HAIR_STYLE(src)) as null|anything in fhairs - - if(new_style) - SET_FACIAL_HAIR_STYLE(src, new_style.type, TRUE) - - var/new_gender = alert(usr, "Please select gender.", "Character Generation", "Male", "Female", "Neutral") - if (new_gender) - if(new_gender == "Male") - gender = MALE - else if(new_gender == "Female") - gender = FEMALE - else - gender = NEUTER - - update_hair() - try_refresh_visible_overlays() - - var/decl/pronouns/pronouns = get_pronouns() - visible_message("\The [src] morphs and changes [pronouns.his] appearance!", "You change your appearance!", "Oh, god! What the hell was that? It sounded like flesh getting squished and bone ground into a different shape!") - /mob/living/human/proc/remotesay() set name = "Project mind" set category = "Superpower" From c4493cf8a35f7d774f35eeaa6fa41a5281e1d7d4 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Wed, 12 Feb 2025 04:10:59 -0500 Subject: [PATCH 47/54] Remove defunct loot spawner definition --- code/modules/awaymissions/loot.dm | 25 ------------------------- nebula.dme | 1 - test/check-paths.sh | 2 +- 3 files changed, 1 insertion(+), 27 deletions(-) delete mode 100644 code/modules/awaymissions/loot.dm diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm deleted file mode 100644 index 76ee712b3b81..000000000000 --- a/code/modules/awaymissions/loot.dm +++ /dev/null @@ -1,25 +0,0 @@ -/obj/effect/spawner/lootdrop - icon = 'icons/effects/markers.dmi' - icon_state = "x2" - var/lootcount = 1 //how many items will be spawned - var/lootdoubles = 0 //if the same item can be spawned twice - var/loot = "" //a list of possible items to spawn- a string of paths - -/obj/effect/spawner/lootdrop/Initialize() - ..() - var/list/things = params2list(loot) - - if(things && things.len) - for(var/i = lootcount, i > 0, i--) - if(!things.len) - break - - var/loot_spawn = pick(things) - var/loot_path = text2path(loot_spawn) - - if(!loot_path || !lootdoubles) - things.Remove(loot_spawn) - continue - - new loot_path(get_turf(src)) - return INITIALIZE_HINT_QDEL diff --git a/nebula.dme b/nebula.dme index d1296a75367d..640eaf9baaf5 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1810,7 +1810,6 @@ #include "code\modules\awaymissions\corpse.dm" #include "code\modules\awaymissions\exile.dm" #include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\loot.dm" #include "code\modules\awaymissions\pamphlet.dm" #include "code\modules\awaymissions\trigger.dm" #include "code\modules\backgrounds\_background.dm" diff --git a/test/check-paths.sh b/test/check-paths.sh index 3af3d19be867..4e2cdcdf3f75 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -38,7 +38,7 @@ exactly 18 "<< uses" '(?> uses" '(?\\])>>(?!>)' -P exactly 0 "incorrect indentations" '^( {4,})' -P -exactly 23 "text2path uses" 'text2path' +exactly 22 "text2path uses" 'text2path' exactly 4 "update_icon() overrides" '\/update_icon\(' -P exactly 0 "goto uses" '\bgoto\b' exactly 9 "atom/New uses" '^/(obj|atom|area|mob|turf).*/New\(' From 6924392832387da20fde9ad66dcefaf9622b348f Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 15:09:56 -0500 Subject: [PATCH 48/54] Fix miscellaneous issues from TypeMaker branch --- code/_onclick/hud/action.dm | 2 +- code/datums/extensions/eye/_eye.dm | 1 + code/datums/extensions/radio_provider.dm | 6 +- code/datums/uplink/uplink_items.dm | 29 +++++---- code/game/area/area_power.dm | 9 +-- code/game/area/area_space.dm | 4 +- code/game/area/areas.dm | 8 ++- code/game/atoms.dm | 2 +- code/game/machinery/CableLayer.dm | 2 +- .../machinery/_machines_base/machinery.dm | 64 +++++++++++++------ .../_machines_base/machinery_components.dm | 3 +- .../_machines_base/stock_parts/power/power.dm | 2 +- .../stock_parts/power/terminal.dm | 2 +- code/game/machinery/computer/computer.dm | 5 -- code/game/machinery/floorlayer.dm | 2 +- code/game/machinery/pipe/pipelayer.dm | 2 +- code/game/machinery/turrets/_turrets.dm | 5 +- code/game/objects/__objs.dm | 8 ++- code/game/objects/effects/effect_system.dm | 6 +- code/game/objects/effects/landmarks.dm | 4 +- code/game/objects/items/__item.dm | 64 ++++++++++++------- code/game/objects/items/robot/robot_parts.dm | 12 ++-- code/game/objects/items/weapons/weaponry.dm | 6 +- code/game/objects/structures/ironing_board.dm | 7 +- code/game/objects/structures/window.dm | 2 +- code/game/sound.dm | 3 +- code/game/turfs/flooring/_flooring.dm | 6 +- code/game/turfs/flooring/flooring_misc.dm | 2 +- .../turfs/flooring/flooring_reinforced.dm | 10 +-- code/game/turfs/flooring/flooring_tiled.dm | 2 +- code/game/turfs/turf.dm | 7 +- code/modules/assembly/proximity.dm | 2 +- code/modules/food/nuggets.dm | 2 +- code/modules/materials/_materials.dm | 8 +-- code/modules/mining/drilling/drill.dm | 2 + code/modules/mob/grab/grab_object.dm | 1 + code/modules/mob/language/generic.dm | 2 +- code/modules/mob/language/language.dm | 27 +++++--- code/modules/mob/living/human/human_verbs.dm | 4 +- code/modules/mob/living/human/life.dm | 4 +- code/modules/mob/living/living_defines.dm | 9 +-- .../mob/living/silicon/robot/drone/drone.dm | 2 +- .../mob/living/simple_animal/friendly/cat.dm | 2 +- .../living/simple_animal/friendly/corgi.dm | 2 +- .../mob/living/simple_animal/friendly/crab.dm | 2 +- .../living/simple_animal/friendly/lizard.dm | 2 +- .../living/simple_animal/friendly/possum.dm | 2 +- code/modules/mob/mob_intent.dm | 2 +- code/modules/mob/mob_organs.dm | 10 +-- code/modules/mob/skills/antag_skill_setter.dm | 9 ++- code/modules/mob/skills/skill_buffs.dm | 17 +++-- code/modules/mob/skills/skill_verbs.dm | 49 +++++++------- code/modules/organs/organ_prosthetics.dm | 1 + code/modules/paperwork/photography.dm | 25 ++++---- .../particle_accelerator.dm | 2 +- .../power/singularity/singularity_stages.dm | 26 ++++---- code/modules/projectiles/gun.dm | 11 ++-- .../reagents/reagent_containers/dropper.dm | 4 +- code/modules/vehicles/bike.dm | 8 +-- .../xenoarcheaology/artifacts/artifact.dm | 2 +- mods/gamemodes/cult/flooring.dm | 2 +- mods/mobs/dionaea/mob/_nymph.dm | 2 +- mods/species/ascent/mobs/nymph/_nymph.dm | 2 +- 63 files changed, 303 insertions(+), 229 deletions(-) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 54ff72145076..e6599e5ac2b7 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -18,7 +18,7 @@ var/procname = null var/atom/movable/target = null var/check_flags = 0 - var/active = 0 + var/active = FALSE var/obj/screen/action_button/button = null var/button_icon = 'icons/obj/action_buttons/actions.dmi' var/button_icon_state = "default" diff --git a/code/datums/extensions/eye/_eye.dm b/code/datums/extensions/eye/_eye.dm index 89a6cef83eba..92f340dfcf9d 100644 --- a/code/datums/extensions/eye/_eye.dm +++ b/code/datums/extensions/eye/_eye.dm @@ -98,6 +98,7 @@ /datum/action/eye/CheckRemoval(mob/living/user) if(!user.eyeobj || !istype(user.eyeobj, eye_type)) return TRUE + return ..() // Every eye created using a subtype of this extension will have this action added for manual unlooking. /datum/action/eye/unlook diff --git a/code/datums/extensions/radio_provider.dm b/code/datums/extensions/radio_provider.dm index b5d98defa816..8be75d0da1ed 100644 --- a/code/datums/extensions/radio_provider.dm +++ b/code/datums/extensions/radio_provider.dm @@ -18,7 +18,8 @@ LAZYDISTINCTADD(., registered_radio.GetRadios(message_mode)) /datum/extension/radio_provider/proc/GetRadio(message_mode) - return LAZYACCESS(GetRadios(message_mode), 1) + var/list/radios = GetRadios(message_mode) + return LAZYACCESS(radios, 1) /atom/movable/proc/GetRadios(message_mode) var/datum/extension/radio_provider/radio_provider = get_extension(src, /datum/extension/radio_provider) @@ -31,7 +32,4 @@ . = ..() var/datum/extension/radio_provider/radio = get_or_create_extension(src, /datum/extension/radio_provider) radio.register_radio(some_radio) - -/atom/movable/get_radio(message_mode) - return LAZYACCESS(GetRadios(message_mode), 1) */ \ No newline at end of file diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm index 5ed21617c4cf..97db7fad4614 100644 --- a/code/datums/uplink/uplink_items.dm +++ b/code/datums/uplink/uplink_items.dm @@ -30,11 +30,13 @@ var/global/datum/uplink/uplink = new() var/name var/desc var/item_cost = 0 - var/list/antag_costs = list() // Allows specific antag roles to purchase at a different cost - var/datum/uplink_category/category // Item category - /// Antag roles this item is displayed to. If empty, display to all. If it includes 'Exclude", anybody except this role can view it - /// Examples: list(/decl/special_role/someone); list("Exclude", /decl/special_role/whoever); etc + /// Allows specific antag roles to purchase at a different cost + var/list/antag_costs = list() + var/datum/uplink_category/category + /// Antag roles this item is displayed to. If empty, display to all. var/list/decl/special_role/antag_roles + /// Antag roles this item will not be displayed to. If empty, display to all. + var/list/decl/special_role/exclude_antag_roles /datum/uplink_item/item var/path = null @@ -77,13 +79,18 @@ var/global/datum/uplink/uplink = new() if(!U.uplink_owner) return 0 - for(var/antag_role in antag_roles) - if(!ispath(antag_role, /decl/special_role)) - continue - var/decl/special_role/antag = GET_DECL(antag_role) - if(antag.is_antagonist(U.uplink_owner)) - return !("Exclude" in antag_roles) - return ("Exclude" in antag_roles) + if(LAZYLEN(exclude_antag_roles)) + for(var/antag_role in exclude_antag_roles) + var/decl/special_role/antag = GET_DECL(antag_role) + if(antag.is_antagonist(U.uplink_owner)) + return FALSE + if(LAZYLEN(antag_roles)) + for(var/antag_role in antag_roles) + var/decl/special_role/antag = GET_DECL(antag_role) + if(antag.is_antagonist(U.uplink_owner)) + return TRUE + return FALSE + return TRUE /datum/uplink_item/proc/cost(var/telecrystals, obj/item/uplink/U) . = item_cost diff --git a/code/game/area/area_power.dm b/code/game/area/area_power.dm index 1995fc374d17..c04f38bd0d99 100644 --- a/code/game/area/area_power.dm +++ b/code/game/area/area_power.dm @@ -4,11 +4,12 @@ #define ENVIRON 3 */ -/area/proc/powered(var/chan) // return true if the area has power to given channel +/// return true if the area has power to given channel +/area/proc/powered(var/chan) if(!requires_power) - return 1 + return TRUE if(always_unpowered) - return 0 + return FALSE switch(chan) if(EQUIP) return power_equip @@ -19,7 +20,7 @@ if(LOCAL) return FALSE // if you're running on local power, don't come begging for help here. - return 0 + return FALSE // called when power status changes /area/proc/power_change() diff --git a/code/game/area/area_space.dm b/code/game/area/area_space.dm index c4bc55dbe315..5c2f8c444715 100644 --- a/code/game/area/area_space.dm +++ b/code/game/area/area_space.dm @@ -3,8 +3,8 @@ var/global/area/space_area /area/space name = "\improper Space" icon_state = "space" - requires_power = 1 - always_unpowered = 1 + requires_power = TRUE + always_unpowered = TRUE dynamic_lighting = TRUE power_light = 0 power_equip = 0 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index b9d82e06c699..41fc989dd0b7 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -4,7 +4,7 @@ var/global/list/areas = list() /area - level = null + level = 0 name = "Unknown" icon = 'icons/turf/areas.dmi' icon_state = "unknown" @@ -20,8 +20,10 @@ var/global/list/areas = list() var/interior_ambient_light_modifier // If set, will apply ambient light of this colour to turfs under a ceiling. - var/proper_name /// Automatically set by SetName and Initialize; cached result of strip_improper(name). - var/holomap_color // Color of this area on the holomap. Must be a hex color (as string) or null. + /// Automatically set by SetName and Initialize; cached result of strip_improper(name). + var/tmp/proper_name + /// Color of this area on the holomap. Must be a hex color (as string) or null. + var/holomap_color var/fire var/party diff --git a/code/game/atoms.dm b/code/game/atoms.dm index cf302e4faad7..4766fa379b37 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -24,7 +24,7 @@ /// (DICTIONARY) A lazy map. The `key` is a MD5 player name and the `value` is the blood type. var/list/blood_DNA /// (BOOL) If this atom was bloodied before. - var/was_bloodied + var/was_bloodied = FALSE /// (COLOR) The color of the blood shown on blood overlays. var/blood_color /// (FALSE|DEFINES) How this atom is interacting with UV light. See misc.dm diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 298ac37c5170..e9da96a9a367 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -15,7 +15,7 @@ cable.amount = 100 /obj/machinery/cablelayer/Move(new_turf,M_Dir) - ..() + . = ..() layCable(new_turf,M_Dir) /obj/machinery/cablelayer/physical_attack_hand(mob/user) diff --git a/code/game/machinery/_machines_base/machinery.dm b/code/game/machinery/_machines_base/machinery.dm index 859257e83c48..c57624ee3c9e 100644 --- a/code/game/machinery/_machines_base/machinery.dm +++ b/code/game/machinery/_machines_base/machinery.dm @@ -91,37 +91,59 @@ Class Procs: var/stat = 0 var/waterproof = TRUE var/reason_broken = 0 - var/stat_immune = NOSCREEN | NOINPUT // The machine will never set stat to these flags. - var/emagged = 0 - var/datum/wires/wires //wire datum, if any. If you place a type path, it will be autoinitialized. + /// The machine will never set stat to these flags. + var/stat_immune = NOSCREEN | NOINPUT + var/emagged = FALSE + /// wire datum, if any. If you place a type path, it will be autoinitialized. + var/datum/wires/wires var/use_power = POWER_USE_IDLE //0 = dont run the auto //1 = run auto, use idle //2 = run auto, use active var/idle_power_usage = 0 var/active_power_usage = 0 - var/power_channel = EQUIP //EQUIP, ENVIRON or LIGHT - var/power_init_complete = FALSE // Helps with bookkeeping when initializing atoms. Don't modify. - var/list/component_parts //List of component instances. Expected type: /obj/item/stock_parts - var/list/uncreated_component_parts = list(/obj/item/stock_parts/power/apc) //List of component paths which have delayed init. Indeces = number of components. - var/list/maximum_component_parts = list(/obj/item/stock_parts = 10) //null - no max. list(type part = number max). + /// Valid values: EQUIP, ENVIRON, LIGHT. If it should use a direct terminal connection instead, use LOCAL. + var/power_channel = EQUIP + /// Helps with bookkeeping when initializing atoms. Don't modify. + var/power_init_complete = FALSE + /// List of component instances. Expected type: /obj/item/stock_parts + var/list/component_parts + /// List of component paths which have lazy init (created when needed). Keys are part typepaths, values are the number of components. + var/list/uncreated_component_parts = list(/obj/item/stock_parts/power/apc) + /// null - no max. list(type part = number max). + var/list/maximum_component_parts = list(/obj/item/stock_parts = 10) var/uid - var/panel_open = 0 + var/panel_open = FALSE var/static/gl_uid = 1 - var/interact_offline = 0 // Can the machine be interacted with while de-powered. - var/clicksound // sound played on succesful interface use by a carbon lifeform - var/clickvol = 40 // sound played on succesful interface use - var/core_skill = SKILL_DEVICES //The skill used for skill checks for this machine (mostly so subtypes can use different skills). - var/operator_skill // Machines often do all operations on Process(). This caches the user's skill while the operations are running. - var/base_type // For mapped buildable types, set this to be the base type actually buildable. - var/id_tag // This generic variable is to be used by mappers to give related machines a string key. In principle used by radio stock parts. - var/frame_type = /obj/machinery/constructable_frame/machine_frame/deconstruct // what is created when the machine is dismantled. + /// Can the machine be interacted with while de-powered. + var/interact_offline = FALSE + /// sound played on successful interface use + var/clicksound + /// volume of sound played on successful interface use + var/clickvol = 40 + ///The skill used for skill checks for this machine (mostly so subtypes can use different skills). + var/core_skill = SKILL_DEVICES + /// Machines often do all operations on Process(). This caches the user's skill while the operations are running. + var/operator_skill + /// For mapped buildable types, set this to be the base type actually buildable. + var/base_type + /// This generic variable is to be used by mappers to give related machines a string key. In principle used by radio stock parts. + var/id_tag + /// what is created when the machine is dismantled. + var/frame_type = /obj/machinery/constructable_frame/machine_frame/deconstruct var/required_interaction_dexterity = DEXTERITY_KEYBOARDS - var/list/processing_parts // Component parts queued for processing by the machine. Expected type: /obj/item/stock_parts - var/processing_flags // What is being processed - - var/list/initial_access // Used to setup network locks on machinery at populate_parts. + /// Component parts queued for processing by the machine. Expected type: /obj/item/stock_parts + var/list/processing_parts + /// Controls whether components, the machine itself, or both run their processing in Process(). + var/processing_flags + + /// Used to setup network locks on machinery at populate_parts. + /// list(a, b) means access requires either A or B. + /// list(list(a, b)) means access requires A and B. + /// These can be combined, e.g. list(a, list(b, c)) requires either a, or both b and c. + /// Null means no access requirement. + var/list/initial_access /obj/machinery/Initialize(mapload, d=0, populate_parts = TRUE) . = ..() diff --git a/code/game/machinery/_machines_base/machinery_components.dm b/code/game/machinery/_machines_base/machinery_components.dm index d775b0e80706..032e31d058a3 100644 --- a/code/game/machinery/_machines_base/machinery_components.dm +++ b/code/game/machinery/_machines_base/machinery_components.dm @@ -246,7 +246,7 @@ var/global/list/machine_path_to_circuit_type to_chat(user, SPAN_WARNING("The insertion point for \the [component] is inaccessible!")) return 0 for(var/path in maximum_component_parts) - if(istype(component, path) && (number_of_components(path) == maximum_component_parts[path])) + if(istype(component, path) && (number_of_components(path) >= maximum_component_parts[path])) to_chat(user, SPAN_WARNING("There are too many parts of this type installed in \the [src] already!")) return 0 return 1 @@ -335,6 +335,7 @@ Standard helpers for users interacting with machinery parts. return TRUE remove_part_and_give_to_user(path, user) return TRUE + return FALSE /obj/machinery/proc/remove_part_and_give_to_user(var/path, mob/user) var/obj/item/stock_parts/part = uninstall_component(get_component_of_type(path, TRUE)) diff --git a/code/game/machinery/_machines_base/stock_parts/power/power.dm b/code/game/machinery/_machines_base/stock_parts/power/power.dm index 7e8870ab3fc4..33082d485f73 100644 --- a/code/game/machinery/_machines_base/stock_parts/power/power.dm +++ b/code/game/machinery/_machines_base/stock_parts/power/power.dm @@ -28,7 +28,7 @@ // Doesn't actually do it. /obj/item/stock_parts/power/proc/can_use_power_oneoff(var/obj/machinery/machine, var/amount, var/channel) - return 0 + return FALSE // A request for the amount of power on the given channel. Returns the amount of power which could be provided. /obj/item/stock_parts/power/proc/use_power_oneoff(var/obj/machinery/machine, var/amount, var/channel) diff --git a/code/game/machinery/_machines_base/stock_parts/power/terminal.dm b/code/game/machinery/_machines_base/stock_parts/power/terminal.dm index 732d90839c9f..79cdd75518dd 100644 --- a/code/game/machinery/_machines_base/stock_parts/power/terminal.dm +++ b/code/game/machinery/_machines_base/stock_parts/power/terminal.dm @@ -154,7 +154,7 @@ return FALSE /obj/item/stock_parts/power/terminal/get_source_info() - . = "The machine can receive power by direct connection to the powernet. " + . = list("The machine can receive power by direct connection to the powernet.") if(terminal) if(!terminal.get_powernet()) . += "The power terminal must be connected to the powernet using additional cables." diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index d10ebf8b7763..82675b7f6f9e 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -83,11 +83,6 @@ I.appearance_flags |= RESET_COLOR return I -/obj/machinery/computer/proc/decode(text) - // Adds line breaks - text = replacetext(text, "\n", "
") - return text - /obj/machinery/computer/dismantle(mob/user) if(stat & BROKEN) to_chat(user, "The broken glass falls out.") diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 692a92da7944..ea04c68ba826 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -15,7 +15,7 @@ T = new /obj/item/stack/tile/floor(src) /obj/machinery/floorlayer/Move(new_turf,M_Dir) - ..() + . = ..() if(on) if(mode["dismantle"]) diff --git a/code/game/machinery/pipe/pipelayer.dm b/code/game/machinery/pipe/pipelayer.dm index 229fb0d3c4f1..d34c2d094474 100644 --- a/code/game/machinery/pipe/pipelayer.dm +++ b/code/game/machinery/pipe/pipelayer.dm @@ -22,7 +22,7 @@ W = new(src) /obj/machinery/pipelayer/Move(new_turf,M_Dir) - ..() + . = ..() if(on && a_dis) dismantle_floor(old_turf) diff --git a/code/game/machinery/turrets/_turrets.dm b/code/game/machinery/turrets/_turrets.dm index 957c34078890..dd6109cdf461 100644 --- a/code/game/machinery/turrets/_turrets.dm +++ b/code/game/machinery/turrets/_turrets.dm @@ -368,8 +368,7 @@ return TRUE if(!is_valid_target(target?.resolve()) && proj_gun.ammo_magazine.get_stored_ammo_count() != proj_gun.ammo_magazine.max_ammo) return TRUE - else - return FALSE + return FALSE /obj/machinery/turret/emag_act(remaining_charges, mob/user, emag_source) if(!emagged) @@ -386,7 +385,7 @@ state_machine.evaluate() /obj/machinery/turret/power_change() - ..() + . = ..() state_machine.evaluate() /obj/machinery/turret/on_component_failure() diff --git a/code/game/objects/__objs.dm b/code/game/objects/__objs.dm index 91241dd59401..8ea7caabc68b 100644 --- a/code/game/objects/__objs.dm +++ b/code/game/objects/__objs.dm @@ -15,11 +15,13 @@ var/list/matter //Used to store information about the contents of the object. var/w_class // Size of the object. - var/in_use = 0 // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! + var/in_use = FALSE // If we have a user using us, this will be set on. We will check if the user has stopped using us, and thus stop updating and LAGGING EVERYTHING! var/armor_penetration = 0 var/anchor_fall = FALSE - var/holographic = 0 //if the obj is a holographic object spawned by the holodeck - var/list/directional_offset ///JSON list of directions to x,y offsets to be applied to the object depending on its direction EX: @'{"NORTH":{"x":12,"y":5}, "EAST":{"x":10,"y":50}}' + /// if the obj is a holographic object spawned by the holodeck + var/holographic = FALSE + ///JSON list of directions to x,y offsets to be applied to the object depending on its direction EX: @'{"NORTH":{"x":12,"y":5}, "EAST":{"x":10,"y":50}}' + var/directional_offset /obj/Initialize(mapload) //Health should be set to max_health only if it's null. diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index d5bcac25da97..3b5ef1fd60b7 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -244,7 +244,7 @@ steam.start() -- spawns the effect time_to_live = 200 /obj/effect/effect/smoke/bad/Move() - ..() + . = ..() for(var/mob/living/M in get_turf(src)) affect_mob(M) @@ -268,7 +268,7 @@ steam.start() -- spawns the effect /obj/effect/effect/smoke/sleepy /obj/effect/effect/smoke/sleepy/Move() - ..() + . = ..() for(var/mob/living/M in get_turf(src)) affect_mob(M) @@ -290,7 +290,7 @@ steam.start() -- spawns the effect icon_state = "mustard" /obj/effect/effect/smoke/mustard/Move() - ..() + . = ..() for(var/mob/living/M in get_turf(src)) affect_mob(M) diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index e2e87ae2470e..827773adb4cc 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -37,8 +37,8 @@ /obj/abstract/landmark/costume/proc/make_costumes() var/list/options = typesof(/obj/abstract/landmark/costume) - var/PICK= options[rand(1,options.len)] - new PICK(loc) + var/costume = pick(options) + new costume(loc) //SUBCLASSES. Spawn a bunch of items and disappear likewise /obj/abstract/landmark/costume/chameleon/make_costumes() diff --git a/code/game/objects/items/__item.dm b/code/game/objects/items/__item.dm index 83baef59cca6..fb1c143c2752 100644 --- a/code/game/objects/items/__item.dm +++ b/code/game/objects/items/__item.dm @@ -20,7 +20,7 @@ /// This is used to determine on which slots an item can fit. var/slot_flags = SLOT_NONE /// If it's an item we don't want to log attack_logs with, set this to TRUE - var/no_attack_log = 0 + var/no_attack_log = FALSE var/obj/item/master = null var/origin_tech //Used by R&D to determine what research bonuses it grants. var/list/attack_verb = list("hit") //Used in attackby() to say how something was attacked "[x] has been [z.attack_verb] by [y] with [z]" @@ -31,12 +31,22 @@ /// Flag for ZAS based contamination (chlorine etc) var/contaminated = FALSE - var/heat_protection = 0 //flags which determine which body parts are protected from heat. Use the SLOT_HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. flags. See setup.dm - var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the SLOT_HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. flags. See setup.dm - var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags - var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - var/max_pressure_protection // Set this variable if the item protects its wearer against high pressures below an upper bound. Keep at null to disable protection. - var/min_pressure_protection // Set this variable if the item protects its wearer against low pressures above a lower bound. Keep at null to disable protection. 0 represents protection against hard vacuum. + /// flags which determine which body parts are protected from heat. Use the SLOT_HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. flags. See setup.dm + var/heat_protection = 0 + /// flags which determine which body parts are protected from cold. Use the SLOT_HEAD, SLOT_UPPER_BODY, SLOT_LOWER_BODY, etc. flags. See setup.dm + var/cold_protection = 0 + /// Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. + /// Keep at null to disable protection. Only protects areas set by heat_protection flags. + var/max_heat_protection_temperature + ///Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. + /// Keep at null to disable protection. Only protects areas set by cold_protection flags + var/min_cold_protection_temperature + /// Set this variable if the item protects its wearer against high pressures below an upper bound. + /// Keep at null to disable protection. + var/max_pressure_protection + /// Set this variable if the item protects its wearer against low pressures above a lower bound. + /// Keep at null to disable protection. 0 represents protection against hard vacuum. + var/min_pressure_protection var/datum/action/item_action/action var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. @@ -54,25 +64,31 @@ 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 var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit) - var/slowdown_general = 0 // How much clothing is slowing you down. Negative values speeds you up. This is a general slowdown, no matter equipment slot. - var/slowdown_per_slot // How much clothing is slowing you down. This is an associative list: item slot - slowdown - var/slowdown_accessory // How much an accessory will slow you down when attached to a worn article of clothing. - var/canremove = 1 //Mostly for Ninja code at this point but basically will not allow the item to be removed if set to 0. /N - var/material_armor_multiplier // if set, item will use material's armor values multiplied by this. + var/slowdown_general = 0 // How this item slows its holder down. Negative values speeds them up. This is a general slowdown, no matter the equipment slot. + /// How much this item slows its holder down, based on the slot it's in. This is an associative list: slot_string = slowdown + var/slowdown_per_slot + /// An additional slowdown amount, contributed by accessories attached to this item. Not to be confused with /obj/item/clothing/var/accessory_slowdown. + var/tmp/slowdown_accessory + /// If TRUE, the item cannot be removed except via destruction or using the force flag in unequip procs. + var/canremove = TRUE + /// if set, item will use material's armor values multiplied by this. + var/material_armor_multiplier var/armor_type = /datum/extension/armor var/list/armor var/armor_degradation_speed //How fast armor will degrade, multiplier to blocked damage to get armor damage value. var/list/allowed = null //suit storage stuff. var/obj/item/uplink/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers. var/zoomdevicename = null //name used for message when binoculars/scope is used - var/zoom = 0 //1 if item is actively being used to zoom. For scoped guns and binoculars. + /// if the item is actively being used to zoom. For scoped guns and binoculars. + var/zoom = FALSE - var/base_parry_chance // Will allow weapon to parry melee attacks if non-zero + var/base_parry_chance = 0 // Will allow weapon to parry melee attacks if non-zero var/wielded_parry_bonus = 15 var/use_alt_layer = FALSE // Use the slot's alternative layer when rendering on a mob - var/list/sprite_sheets // Assoc list of bodytype to icon for producing onmob overlays when this item is held or worn. + /// Assoc list of bodytype category to icon for producing onmob overlays when this item is held or worn. + var/list/sprite_sheets // Material handling for material weapons (not used by default, unless material is supplied or set) var/decl/material/material // Reference to material decl. If set to a string corresponding to a material ID, will init the item with that material. @@ -778,7 +794,7 @@ //handle_shield should return a positive value to indicate that the attack is blocked and should be prevented. //If a negative value is returned, it should be treated as a special return value for bullet_act() and handled appropriately. //For non-projectile attacks this usually means the attack is blocked. -//Otherwise should return 0 to indicate that the attack is not affected in any way. +//Otherwise should return FALSE to indicate that the attack is not affected in any way. /obj/item/proc/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") var/parry_chance = get_parry_chance(user) if(attacker) @@ -788,8 +804,8 @@ user.visible_message(SPAN_DANGER("\The [user] parries [attack_text] with \the [src]!")) playsound(user.loc, 'sound/weapons/punchmiss.ogg', 50, 1) on_parry(user, damage_source, attacker) - return 1 - return 0 + return TRUE + return FALSE /obj/item/proc/on_parry(mob/user, damage_source, mob/attacker) return @@ -802,18 +818,20 @@ if(is_held_twohanded()) . += wielded_parry_bonus +/// Occurs when a disarm attempt fails a skill check, resulting in the attacker being damaged. +/// Return TRUE to block further checks for other objects. /obj/item/proc/on_disarm_attempt(mob/target, mob/living/attacker) var/force = get_attack_force(attacker) if(force < 1) - return 0 + return FALSE if(!istype(attacker)) - return 0 + return FALSE var/decl/pronouns/pronouns = attacker.get_pronouns() attacker.apply_damage(force, atom_damage_type, attacker.get_active_held_item_slot(), used_weapon = src) attacker.visible_message(SPAN_DANGER("\The [attacker] hurts [pronouns.his] hand on \the [src]!")) playsound(target, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) playsound(target, hitsound, 50, 1, -1) - return 1 + return TRUE /obj/item/reveal_blood() if(was_bloodied && !fluorescent) @@ -893,7 +911,7 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. if(user.hud_used.is_hud_shown()) user.toggle_zoom_hud() // If the user has already limited their HUD this avoids them having a HUD when they zoom in user.client.view = viewsize - zoom = 1 + zoom = TRUE var/viewoffset = WORLD_ICON_SIZE * tileoffset switch(user.dir) @@ -925,7 +943,7 @@ modules/mob/living/human/life.dm if you die, you will be zoomed out. /obj/item/proc/unzoom(var/mob/user) if(!zoom) return - zoom = 0 + zoom = FALSE events_repository.unregister(/decl/observ/destroyed, user, src, TYPE_PROC_REF(/obj/item, unzoom)) events_repository.unregister(/decl/observ/moved, user, src, TYPE_PROC_REF(/obj/item, unzoom)) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 1ddf859d3386..3e99d2da0c52 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -41,7 +41,7 @@ name = "left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_arm" - model_info = 1 + model_info = TRUE bp_tag = BP_L_ARM material = /decl/material/solid/metal/steel @@ -49,7 +49,7 @@ name = "right arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_arm" - model_info = 1 + model_info = TRUE bp_tag = BP_R_ARM material = /decl/material/solid/metal/steel @@ -57,7 +57,7 @@ name = "left leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "l_leg" - model_info = 1 + model_info = TRUE bp_tag = BP_L_LEG material = /decl/material/solid/metal/steel @@ -65,7 +65,7 @@ name = "right leg" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." icon_state = "r_leg" - model_info = 1 + model_info = TRUE bp_tag = BP_R_LEG material = /decl/material/solid/metal/steel @@ -73,7 +73,7 @@ name = "head" desc = "A standard reinforced braincase, with spine-plugged neural socket and sensor gimbals." icon_state = "head" - model_info = 1 + model_info = TRUE bp_tag = BP_HEAD material = /decl/material/solid/metal/steel var/obj/item/flash/flash1 = null @@ -90,7 +90,7 @@ name = "torso" desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." icon_state = "chest" - model_info = 1 + model_info = TRUE bp_tag = BP_CHEST material = /decl/material/solid/metal/steel var/wires = 0.0 diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 3d6b8c86fc51..61276713a388 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -100,7 +100,7 @@ max_health = 25 var/countdown = 15 - var/temporary = 1 + var/temporary = TRUE var/mob/living/captured = null var/min_free_time = 50 var/max_free_time = 85 @@ -111,7 +111,7 @@ anchored = FALSE max_health = 5 - temporary = 0 + temporary = FALSE min_free_time = 5 max_free_time = 10 @@ -144,7 +144,7 @@ healthcheck() /obj/effect/energy_net/Move() - ..() + . = ..() if(buckled_mob) buckled_mob.forceMove(src.loc) diff --git a/code/game/objects/structures/ironing_board.dm b/code/game/objects/structures/ironing_board.dm index 1376dfe8758c..3248822f656e 100644 --- a/code/game/objects/structures/ironing_board.dm +++ b/code/game/objects/structures/ironing_board.dm @@ -35,13 +35,14 @@ // make a screeching noise to drive people mad /obj/structure/bed/roller/ironingboard/Move() + . = ..() + if(!.) + return var/turf/T = get_turf(src) if(isspaceturf(T) || istype(T, /turf/floor/carpet)) - return + return FALSE playsound(T, pick(move_sounds), 75, 1) - . = ..() - /obj/structure/bed/roller/ironingboard/get_examine_strings(mob/user, distance, infix, suffix) . = ..() if(cloth) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index a45fd6efacc8..dcc075f7e4f6 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -377,7 +377,7 @@ /obj/structure/window/Move() var/ini_dir = dir update_nearby_tiles(need_rebuild=1) - ..() + . = ..() set_dir(ini_dir) update_nearby_tiles(need_rebuild=1) diff --git a/code/game/sound.dm b/code/game/sound.dm index a729a23fb5bc..3f0d24378d25 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -14,8 +14,7 @@ if(!ignore_walls) //these sounds don't carry through walls listeners = listeners & hearers(maxdistance, turf_source) - for(var/P in listeners) - var/mob/M = P + for(var/mob/M as anything in listeners) if(!M || !M.client) continue diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 01d6ff0d4bbb..c0086e272b6c 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -35,12 +35,12 @@ var/global/list/flooring_cache = list() /// BYOND ticks. var/build_time = 0 - var/drop_material_on_remove + var/drop_material_on_remove = FALSE var/descriptor var/flooring_flags - var/remove_timer = 10 - var/can_paint + var/remove_timer = 1 SECOND + var/can_paint = FALSE var/can_engrave = TRUE var/can_collect = FALSE diff --git a/code/game/turfs/flooring/flooring_misc.dm b/code/game/turfs/flooring/flooring_misc.dm index cdedfb756198..d72c2f54d96d 100644 --- a/code/game/turfs/flooring/flooring_misc.dm +++ b/code/game/turfs/flooring/flooring_misc.dm @@ -3,7 +3,7 @@ desc = "A stretch of inlaid sections of flexible linoleum." icon = 'icons/turf/flooring/linoleum.dmi' icon_base = "lino" - can_paint = 1 + can_paint = TRUE build_type = /obj/item/stack/tile/linoleum flooring_flags = TURF_REMOVE_SCREWDRIVER footstep_type = /decl/footsteps/tiles diff --git a/code/game/turfs/flooring/flooring_reinforced.dm b/code/game/turfs/flooring/flooring_reinforced.dm index 0a46fa2d41ca..97ce3b7302e4 100644 --- a/code/game/turfs/flooring/flooring_reinforced.dm +++ b/code/game/turfs/flooring/flooring_reinforced.dm @@ -7,8 +7,8 @@ build_type = /obj/item/stack/material/sheet build_material = /decl/material/solid/metal/steel build_cost = 1 - build_time = 30 - can_paint = 1 + build_time = 3 SECONDS + can_paint = TRUE force_material = /decl/material/solid/metal/steel constructed = TRUE gender = NEUTER @@ -31,7 +31,7 @@ icon_base = "bcircuit" build_type = null flooring_flags = TURF_ACID_IMMUNE | TURF_REMOVE_WRENCH - can_paint = 1 + can_paint = TRUE can_engrave = FALSE turf_light_range = 2 turf_light_power = 3 @@ -44,7 +44,7 @@ /decl/flooring/reinforced/circuit/red icon_base = "rcircuit" flooring_flags = TURF_ACID_IMMUNE - can_paint = 0 + can_paint = FALSE turf_light_power = 2 turf_light_color = COLOR_RED @@ -54,7 +54,7 @@ icon = 'icons/turf/flooring/shuttle.dmi' build_type = null flooring_flags = TURF_ACID_IMMUNE | TURF_REMOVE_CROWBAR - can_paint = 1 + can_paint = TRUE can_engrave = FALSE gender = NEUTER diff --git a/code/game/turfs/flooring/flooring_tiled.dm b/code/game/turfs/flooring/flooring_tiled.dm index 96c1fb9c5e93..b8cf9e4c0154 100644 --- a/code/game/turfs/flooring/flooring_tiled.dm +++ b/code/game/turfs/flooring/flooring_tiled.dm @@ -8,7 +8,7 @@ damage_temperature = T0C+1400 flooring_flags = TURF_REMOVE_CROWBAR build_type = /obj/item/stack/tile/floor - can_paint = 1 + can_paint = TRUE footstep_type = /decl/footsteps/tiles force_material = /decl/material/solid/metal/steel wall_smooth = SMOOTH_ALL diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 2fac278f3f5d..36812e0f3f53 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -22,7 +22,8 @@ var/heat_capacity = 1 //Properties for both - var/blocks_air = 0 // Does this turf contain air/let air through? + /// Does this turf contain air/let air through? + var/blocks_air = FALSE // General properties. var/pathweight = 1 // How much does it cost to pathfind over this turf? @@ -30,10 +31,10 @@ var/list/decals // Used for slowdown. - var/movement_delay + var/movement_delay = 0 var/fluid_can_pass - var/fluid_blocked_dirs = 0 + var/fluid_blocked_dirs = null var/flooded // Whether or not this turf is absolutely flooded ie. a water source. var/footstep_type var/open_turf_type = /turf/open // Which open turf type to use by default above this turf in a multiz context. Overridden by area. diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index a451bcffec1e..f3cfba45efa1 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -99,7 +99,7 @@ holder.update_icon() /obj/item/assembly/prox_sensor/Move() - ..() + . = ..() sense() /obj/item/assembly/prox_sensor/interact(mob/user)//TODO: Change this to the wires thingy diff --git a/code/modules/food/nuggets.dm b/code/modules/food/nuggets.dm index c2171198fa13..b148b41b3aa9 100644 --- a/code/modules/food/nuggets.dm +++ b/code/modules/food/nuggets.dm @@ -2,7 +2,7 @@ name = "chicken nugget" icon = 'icons/obj/food/nuggets/nugget.dmi' icon_state = ICON_STATE_WORLD - nutriment_desc = "mild battered chicken" + nutriment_desc = list("mild battered chicken") nutriment_amt = 6 nutriment_type = /decl/material/solid/organic/meat/chicken material = /decl/material/solid/organic/meat/chicken diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 69abf8eb6399..11c69574016e 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -761,7 +761,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) thing.decontaminate() if(dirtiness <= DIRTINESS_STERILE) O.germ_level -= min(amount*20, O.germ_level) - O.was_bloodied = null + O.was_bloodied = FALSE if(dirtiness <= DIRTINESS_CLEAN) O.clean() @@ -979,7 +979,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) /decl/material/proc/affect_touch(var/mob/living/victim, var/removed, var/datum/reagents/holder) SHOULD_CALL_PARENT(TRUE) - + . = FALSE if(!istype(victim)) return FALSE @@ -991,8 +991,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(victim.germ_level < INFECTION_LEVEL_TWO) // rest and antibiotics is required to cure serious infections victim.germ_level -= min(removed*20, victim.germ_level) for(var/obj/item/organ in victim.contents) - organ.was_bloodied = null - victim.was_bloodied = null + organ.was_bloodied = FALSE + victim.was_bloodied = FALSE . = TRUE // TODO: clean should add the gross reagents washed off to a holder to dump on the loc. diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index acf7751d981a..cd4354ee4d0d 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -80,6 +80,8 @@ playsound(src, "button", 60) to_chat(user, SPAN_NOTICE("You turn \the [src] [use_power ? "on" : "off"].")) state_machine.evaluate() + return TRUE + return FALSE /obj/machinery/mining_drill/on_update_icon() icon_state = "mining_drill_[use_power == POWER_USE_ACTIVE ? "on" : "off"]" diff --git a/code/modules/mob/grab/grab_object.dm b/code/modules/mob/grab/grab_object.dm index f8237442c7b0..5c5e427cea5a 100644 --- a/code/modules/mob/grab/grab_object.dm +++ b/code/modules/mob/grab/grab_object.dm @@ -129,6 +129,7 @@ /obj/item/grab/can_be_dropped_by_client(mob/M) if(M == assailant) return TRUE + return FALSE /obj/item/grab/Destroy() var/atom/old_affecting = affecting diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index cb730ceb87ac..78301a7ca87a 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -4,7 +4,7 @@ desc = "Noises" key = "" flags = LANG_FLAG_RESTRICTED|LANG_FLAG_NONGLOBAL|LANG_FLAG_INNATE|LANG_FLAG_NO_TALK_MSG|LANG_FLAG_NO_STUTTER - hidden_from_codex = 1 + hidden_from_codex = TRUE /decl/language/noise/format_message(message, verb) return "[message]" diff --git a/code/modules/mob/language/language.dm b/code/modules/mob/language/language.dm index 8a89e28896c1..02b5199b390c 100644 --- a/code/modules/mob/language/language.dm +++ b/code/modules/mob/language/language.dm @@ -27,15 +27,24 @@ var/colour = "body" // CSS style to use for strings in this language. var/key = "" // Character used to speak in language var/flags = 0 // Various language flags. - var/list/syllables // Used when scrambling text for a non-speaker. - var/space_chance = 55 // Likelihood of getting a space in the random scramble string - var/machine_understands = 1 // Whether machines can parse and understand this language - var/shorthand = "???" // Shorthand that shows up in chat for this language. - var/list/partial_understanding // List of languages that can /somehwat/ understand it, format is: name = chance of understanding a word - var/hidden_from_codex // If it should not show up in Codex - var/list/scramble_cache = list() // Cached syllable strings for masking when heard by a non-speaker - var/list/speech_sounds // List of sounds to randomly play. - var/allow_repeated_syllables = TRUE // Control for handling some of the random lang/name gen. + /// Syllable list when scrambling text for display to a non-speaker. + var/list/syllables + /// Likelihood of getting a space in the random scramble string + var/space_chance = 55 + /// Whether machines can parse and understand this language + var/machine_understands = TRUE + /// Shorthand that shows up in chat for this language. + var/shorthand = "???" + /// List of languages that can /somehwat/ understand it, format is: typepath = chance of understanding a word + var/list/partial_understanding + /// If it should not show up in Codex + var/hidden_from_codex = FALSE + /// Cached syllable strings for masking when heard by a non-speaker + var/list/scramble_cache = list() + /// List of sounds to randomly play. + var/list/speech_sounds + /// Control for handling some of the random lang/name gen. + var/allow_repeated_syllables = TRUE /decl/language/proc/can_be_understood_by(var/mob/living/speaker, var/mob/living/listener) if(flags & LANG_FLAG_INNATE) diff --git a/code/modules/mob/living/human/human_verbs.dm b/code/modules/mob/living/human/human_verbs.dm index c2f05a7ca4a7..35812110f18b 100644 --- a/code/modules/mob/living/human/human_verbs.dm +++ b/code/modules/mob/living/human/human_verbs.dm @@ -13,7 +13,7 @@ var/list/creatures = list() for(var/mob/living/h in global.player_list) creatures += h - var/mob/target = input("Who do you want to project your mind to ?") as null|anything in creatures + var/mob/target = input(usr, "Who do you want to project your mind to?") as null|anything in creatures if (isnull(target)) return @@ -55,7 +55,7 @@ continue creatures += h - var/mob/target = input ("Who do you want to project your mind to ?") as mob in creatures + var/mob/target = input(usr, "Who do you want to project your mind to?") as mob in creatures if (target) remoteview_target = target diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index 5beb8833681b..83b79d2bf9cd 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -288,11 +288,11 @@ for(var/slot in global.standard_clothing_slots) var/obj/item/clothing/C = get_equipped_item(slot) if(istype(C)) - if(C.min_cold_protection_temperature && C.min_cold_protection_temperature <= temperature) + if(!isnull(C.min_cold_protection_temperature) && C.min_cold_protection_temperature <= temperature) . |= C.cold_protection if(LAZYLEN(C.accessories)) for(var/obj/item/clothing/accessory in C.accessories) - if(accessory.min_cold_protection_temperature && accessory.min_cold_protection_temperature <= temperature) + if(!isnull(accessory.min_cold_protection_temperature) && accessory.min_cold_protection_temperature <= temperature) . |= accessory.cold_protection diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4d894ca4fa90..b7ae767787e1 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -29,12 +29,13 @@ var/mob/living/cameraFollow = null var/list/datum/action/actions = list() - VAR_PRIVATE/_on_fire = 0 //The "Are we on fire?" var + /// The "Are we on fire?" var. Use of is_on_fire() is preferred instead. + VAR_PRIVATE/_on_fire = FALSE VAR_PRIVATE/_fire_intensity var/ticks_since_last_successful_breath = 0 //if we failed to breathe last tick - var/failed_last_breath = 0 //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. - var/possession_candidate // Can be possessed by ghosts if unplayed. + var/failed_last_breath = FALSE //This is used to determine if the mob failed a breath. If they did fail a brath, they will attempt to breathe each tick, otherwise just once per 4 ticks. + var/possession_candidate = FALSE // Can be possessed by ghosts if unplayed. var/job = null//Living var/list/obj/aura/auras = null //Basically a catch-all aura/force-field thing. @@ -91,7 +92,7 @@ var/weather_sensitive = FALSE /// Var used to track current step for footsteps sounds. - var/tmp/step_count + var/tmp/step_count = 0 /// Has this mob -ever- had a gripper? Used to skip hand checks in some cases. var/has_had_gripper = FALSE diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index e01e0ad52802..c1b984b8a6d5 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -15,7 +15,7 @@ integrated_light_power = 0.4 integrated_light_range = 3 local_transmit = 1 - possession_candidate = 1 + possession_candidate = TRUE speed = -1 can_pull_size = ITEM_SIZE_NORMAL diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index a9b8e6891b80..50c1c1aae4f0 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -54,7 +54,7 @@ maxbodytemp = 323 //Above 50 Degrees Celsius holder_type = /obj/item/holder mob_size = MOB_SIZE_SMALL - possession_candidate = 1 + possession_candidate = TRUE pass_flags = PASS_FLAG_TABLE butchery_data = /decl/butchery_data/animal/cat base_animal_type = /mob/living/simple_animal/passive/cat diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm index 64ea0d6d25f3..ab52e19b77ca 100644 --- a/code/modules/mob/living/simple_animal/friendly/corgi.dm +++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm @@ -8,7 +8,7 @@ response_disarm = "bops" see_in_dark = 5 mob_size = MOB_SIZE_SMALL - possession_candidate = 1 + possession_candidate = TRUE holder_type = /obj/item/holder/corgi pass_flags = PASS_FLAG_TABLE base_animal_type = /mob/living/simple_animal/corgi diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index bcd84ddc3dfa..a35f3dfa013a 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -6,7 +6,7 @@ mob_size = MOB_SIZE_SMALL speak_emote = list("clicks") response_harm = "stamps on" - possession_candidate = 1 + possession_candidate = TRUE pass_flags = PASS_FLAG_TABLE natural_armor = list( ARMOR_MELEE = ARMOR_MELEE_KNIVES diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index f585498c0620..e6bcea2be418 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -7,7 +7,7 @@ natural_weapon = /obj/item/natural_weapon/bite/weak response_harm = "stamps on" mob_size = MOB_SIZE_MINISCULE - possession_candidate = 1 + possession_candidate = TRUE pass_flags = PASS_FLAG_TABLE butchery_data = /decl/butchery_data/animal/reptile/small ai = /datum/mob_controller/lizard diff --git a/code/modules/mob/living/simple_animal/friendly/possum.dm b/code/modules/mob/living/simple_animal/friendly/possum.dm index 69f4f9973215..d57bba3eff9b 100644 --- a/code/modules/mob/living/simple_animal/friendly/possum.dm +++ b/code/modules/mob/living/simple_animal/friendly/possum.dm @@ -14,7 +14,7 @@ universal_speak = FALSE universal_understand = TRUE mob_size = MOB_SIZE_SMALL - possession_candidate = 1 + possession_candidate = TRUE can_pull_size = ITEM_SIZE_SMALL can_pull_mobs = MOB_PULL_SMALLER holder_type = /obj/item/holder diff --git a/code/modules/mob/mob_intent.dm b/code/modules/mob/mob_intent.dm index 37bf6fa6d50b..f9271fb64fec 100644 --- a/code/modules/mob/mob_intent.dm +++ b/code/modules/mob/mob_intent.dm @@ -36,7 +36,7 @@ /// State used to update intent selector. var/icon_state /// Whether or not this intent is available if you have an item in your hand. - var/requires_empty_hand + var/requires_empty_hand = FALSE /// Intents to be removed from the available list if this intent is present. var/list/blocks_other_intents diff --git a/code/modules/mob/mob_organs.dm b/code/modules/mob/mob_organs.dm index eb5b763c95fd..6aea72caa0ce 100644 --- a/code/modules/mob/mob_organs.dm +++ b/code/modules/mob/mob_organs.dm @@ -15,7 +15,9 @@ return /mob/proc/get_organs() - for(var/organ in get_external_organs()) - LAZYADD(., organ) - for(var/organ in get_internal_organs()) - LAZYADD(., organ) + var/list/external_organs = get_external_organs() + if(external_organs) + LAZYADD(., external_organs) + var/list/internal_organs = get_internal_organs() + if(internal_organs) + LAZYADD(., internal_organs) diff --git a/code/modules/mob/skills/antag_skill_setter.dm b/code/modules/mob/skills/antag_skill_setter.dm index 598b1d1c3ce8..8900b318fd79 100644 --- a/code/modules/mob/skills/antag_skill_setter.dm +++ b/code/modules/mob/skills/antag_skill_setter.dm @@ -1,9 +1,12 @@ //A datum that performs antag-related skill selection functions. /datum/antag_skill_setter - var/nm_type //A nano_module with custom ui, if any. - var/list/base_skill_list = list() //Format: list(path = value). - var/default_value = SKILL_DEFAULT //If not in base_skill_list or added in another way, skill value will be this. + /// The path of the nano_module to use with any custom UI handling, if any. If null, uses the base skillset's type. + var/nm_type + /// An associative list of base skill values to provide for free. Keys are skill paths, values are the skill level. + var/list/base_skill_list = list() + /// If not in base_skill_list or added in another way, skill value will be this. + var/default_value = SKILL_DEFAULT /datum/antag_skill_setter/proc/initialize_skills(datum/skillset/skillset) skillset.skill_list = base_skill_list.Copy() diff --git a/code/modules/mob/skills/skill_buffs.dm b/code/modules/mob/skills/skill_buffs.dm index bf99aa37ed7d..efe7434f2e6c 100644 --- a/code/modules/mob/skills/skill_buffs.dm +++ b/code/modules/mob/skills/skill_buffs.dm @@ -1,8 +1,10 @@ //The base type is suitable for generic buffs not needing special treatment. /datum/skill_buff var/list/buffs //Format: list(skill_path = amount) - var/limit //How many buffs of this type a skillset can have. null = no limit - var/datum/skillset/skillset //The skillset to which this buff belongs. + /// How many buffs of this type a skillset can have. null = no limit + var/limit + /// The skillset to which this buff belongs. + var/datum/skillset/skillset /datum/skill_buff/New(buff) buffs = buff @@ -17,7 +19,7 @@ //Clamps the buff amounts so that the target stays between SKILL_MIN and SKILL_MAX in all skills. /datum/skill_buff/proc/tailor_buff(mob/target) if(!buffs) - return + return 0 var/list/temp_buffs = buffs.Copy() for(var/skill_type in temp_buffs) var/has_now = target.get_skill_value(skill_type) @@ -28,10 +30,10 @@ /datum/skill_buff/proc/can_buff(mob/target) if(!length(buffs) || !istype(target)) - return //what are we even buffing? + return FALSE //what are we even buffing? if(target.too_many_buffs(type)) - return - return 1 + return FALSE + return TRUE /datum/skill_buff/proc/remove() var/datum/skillset/my_skillset = skillset @@ -78,4 +80,5 @@ /mob/proc/too_many_buffs(datum/skill_buff/buff_type) var/limit = initial(buff_type.limit) if(limit && (length(fetch_buffs_of_type(buff_type, 0)) >= limit)) - return 1 \ No newline at end of file + return TRUE + return FALSE \ No newline at end of file diff --git a/code/modules/mob/skills/skill_verbs.dm b/code/modules/mob/skills/skill_verbs.dm index fc051b139594..fb9e0d13929a 100644 --- a/code/modules/mob/skills/skill_verbs.dm +++ b/code/modules/mob/skills/skill_verbs.dm @@ -12,8 +12,10 @@ /datum/skill_verb var/datum/skillset/skillset //Owner, if any. var/the_verb //The verb to keep track of. Should be a mob verb. - var/cooldown //How long the verb cools down for after use. null = has no cooldown. - var/cooling_down = 0 //Whether it's currently cooling down. + /// The minimum time between uses of the verb. null = no wait between uses. + var/cooldown + /// If TRUE, the verb is currently unavailable. + var/cooling_down = FALSE /datum/skill_verb/Destroy() skillset = null @@ -37,17 +39,17 @@ /datum/skill_verb/proc/should_see_verb() if(cooling_down) - return - return 1 + return FALSE + return TRUE /datum/skill_verb/proc/remove_cooldown() - cooling_down = 0 + cooling_down = FALSE update_verb() /datum/skill_verb/proc/set_cooldown() if(!cooldown) return - cooling_down = 1 + cooling_down = TRUE update_verb() addtimer(CALLBACK(src, PROC_REF(remove_cooldown)), cooldown) /* @@ -59,18 +61,19 @@ Robots and antags can instruct. cooldown = 15 MINUTES /datum/skill_verb/instruct/should_have_verb(datum/skillset/given_skillset) - if(!..()) + . = FALSE + if(!(. = ..())) return if(!isliving(given_skillset.owner)) - return - return 1 + return FALSE + return TRUE /datum/skill_verb/instruct/should_see_verb() - if(!..()) + if(!(. = ..())) return for(var/decl/skill/S in global.using_map.get_available_skills()) if(skillset.owner.skill_check(S.type, SKILL_EXPERT)) - return 1 + return TRUE /mob/proc/can_instruct(mob/living/human/target, var/get_options = FALSE) @@ -127,10 +130,10 @@ Robots and antags can instruct. /datum/skill_buff/motivate/can_buff(mob/target) if(!..()) - return + return FALSE if(!ishuman(target)) - return - return 1 + return FALSE + return TRUE /* The Appraise verb. Used on objects to estimate their value. */ @@ -138,18 +141,18 @@ The Appraise verb. Used on objects to estimate their value. the_verb = /mob/proc/appraise /datum/skill_verb/appraise/should_have_verb(datum/skillset/given_skillset) - if(!..()) + if(!(. = ..())) return if(!isliving(given_skillset.owner)) - return - return 1 + return FALSE + return TRUE /datum/skill_verb/appraise/should_see_verb() - if(!..()) + if(!(. = ..())) return if(!skillset.owner.skill_check(SKILL_FINANCE, SKILL_BASIC)) - return - return 1 + return FALSE + return TRUE /mob/proc/appraise(obj/item as obj in get_equipped_items(1)) set category = "IC" @@ -200,11 +203,11 @@ The Appraise verb. Used on objects to estimate their value. return 1 /datum/skill_verb/noirvision/should_see_verb() - if(!..()) + if(!(. = ..())) return if(!skillset.owner.skill_check(SKILL_FORENSICS, SKILL_PROF)) - return - return 1 + return FALSE + return TRUE /mob/proc/noirvision() set category = "IC" diff --git a/code/modules/organs/organ_prosthetics.dm b/code/modules/organs/organ_prosthetics.dm index 09635dcdf8a8..dc864aa098da 100644 --- a/code/modules/organs/organ_prosthetics.dm +++ b/code/modules/organs/organ_prosthetics.dm @@ -28,6 +28,7 @@ // Note that this proc is checking if the organ can be attached -to-, not attached itself. /obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/human/user) var/list/limb_data = user?.get_bodytype()?.has_limbs[organ_tag] + . = FALSE if(islist(limb_data) && limb_data["has_children"] > 0) . = (LAZYLEN(children) < limb_data["has_children"]) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 4c9d0671b539..b6b39467524d 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -293,20 +293,21 @@ return TRUE return ..() -/obj/item/camera/proc/get_mobs(turf/the_turf) +/obj/item/camera/proc/get_mob_details(turf/the_turf) var/mob_detail - for(var/mob/living/A in the_turf) - if(A.invisibility) + for(var/mob/living/seen in the_turf) + if(seen.invisibility) continue var/holding - for(var/obj/item/thing in A.get_held_items()) + for(var/obj/item/thing in seen.get_held_items()) LAZYADD(holding, "\a [thing]") if(length(holding)) - holding = "They are holding [english_list(holding)]" + var/decl/pronouns/mob_pronouns = seen.get_pronouns() + holding = "[mob_pronouns.He] [mob_pronouns.is] holding [english_list(holding)]." if(!mob_detail) - mob_detail = "You can see [A] on the photo[A.get_health_ratio() < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]. " + mob_detail = "You can see [seen] on the photo[seen.get_health_ratio() < 0.75 ? " - [seen] looks hurt":""].[holding ? " [holding]":"."]. " else - mob_detail += "You can also see [A] on the photo[A.get_health_ratio() < 0.75 ? " - [A] looks hurt":""].[holding ? " [holding]":"."]." + mob_detail += "You can also see [seen] on the photo[seen.get_health_ratio() < 0.75 ? " - [seen] looks hurt":""].[holding ? " [holding]":"."]." return mob_detail /obj/item/camera/afterattack(atom/target, mob/user, flag) @@ -347,20 +348,20 @@ var/x_c = target.x - (field_of_view-1)/2 var/y_c = target.y + (field_of_view-1)/2 var/z_c = target.z - var/mobs = "" + var/mob_details = "" for(var/i = 1 to field_of_view) for(var/j = 1 to field_of_view) var/turf/T = locate(x_c, y_c, z_c) if(user.can_capture_turf(T)) - mobs += get_mobs(T) + mob_details += get_mob_details(T) x_c++ y_c-- x_c = x_c - field_of_view - var/obj/item/photo/p = createpicture(target, user, mobs, flag) + var/obj/item/photo/p = createpicture(target, user, mob_details, flag) printpicture(user, p) -/obj/item/camera/proc/createpicture(atom/target, mob/user, mobs, flag) +/obj/item/camera/proc/createpicture(atom/target, mob/user, new_description, flag) var/x_c = target.x - (field_of_view-1)/2 var/y_c = target.y - (field_of_view-1)/2 var/z_c = target.z @@ -368,7 +369,7 @@ var/obj/item/photo/p = new() p.img = photoimage - p.desc = mobs + p.desc = new_description p.photo_size = field_of_view p.update_icon() diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index d30617004668..7e5c523ea0f5 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -108,7 +108,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin return ..() /obj/structure/particle_accelerator/Move() - ..() + . = ..() if(master && master.active) master.toggle_power() investigate_log("was moved whilst active; it powered down.","singulo") diff --git a/code/modules/power/singularity/singularity_stages.dm b/code/modules/power/singularity/singularity_stages.dm index 2624c10e8183..f644a21e1ec2 100644 --- a/code/modules/power/singularity/singularity_stages.dm +++ b/code/modules/power/singularity/singularity_stages.dm @@ -3,25 +3,25 @@ var/name = "gravitational singularity" var/desc = "A gravitational singularity." /// What is the effective physical size of this singularity? - var/footprint + var/footprint = 1 /// What is the numerical size of this singularity? - var/stage_size + var/stage_size = 0 /// What is the minimum singularity energy to reach this sage? - var/min_energy + var/min_energy = -(INFINITY) /// What is the maximum singularity energy to stay at this sage? - var/max_energy + var/max_energy = 0 /// What icon should the singularity use at this stage? var/icon /// What icon_state should the singularity use at this stage? var/icon_state /// What x offset should the singularity use at this stage? - var/pixel_x + var/pixel_x = 0 /// What y offset should the singularity use at this stage? - var/pixel_y + var/pixel_y = 0 /// What is the pull range of a singularity at this stage? - var/grav_pull + var/grav_pull = 0 /// What is the feeding range of a singularity at this stage? - var/consume_range + var/consume_range = 0 /// If true, the singularity will lose energy in Process(). var/dissipates_over_time = TRUE /// How many Process() ticks do we have between dissipations? @@ -31,13 +31,13 @@ /// How much energy do we lose when we dissipate? var/dissipation_energy_loss = 1 /// What is the percent chance of an event each tick? - var/event_chance + var/event_chance = 0 /// Do we force a specific event when we proc events? var/decl/singularity_event/forced_event = null /// Will we wander around? - var/wander + var/wander = FALSE /// Can explosions destroy the singularity? - var/explosion_vulnerable + var/explosion_vulnerable = FALSE /// What is the heavy range for the EM pulse event in this stage? var/em_heavy_range = 8 /// What is the light range for the EM pulse event in this stage? @@ -55,8 +55,10 @@ . += "negative consume_range" if(grav_pull < 0) . += "negative grav_pull" - if(grav_pull >= 0 && consume_range >= 0 && grav_pull < consume_range) + else if(consume_range >= 0 && grav_pull < consume_range) . += "grav_pull is smaller than consume_range; consume_range will be truncated" + if(min_energy > max_energy) + . += "min_energy is larger than max_energy, stage will never be able to exist" /decl/singularity_stage/proc/handle_dissipation(obj/effect/singularity/source) if(dissipates_over_time) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 61c107de985b..91c1085e4327 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -706,14 +706,13 @@ last_handled = world.time /obj/item/gun/on_disarm_attempt(mob/target, mob/attacker) - var/list/turfs = list() - for(var/turf/T in view()) - turfs += T - if(turfs.len) + var/list/turfs = view() + if(length(turfs)) var/turf/shoot_to = pick(turfs) - target.visible_message("\The [src] goes off during the struggle!") + target.visible_message(SPAN_DANGER("\The [src] goes off during the struggle!")) afterattack(shoot_to,target) - return 1 + return TRUE + return FALSE /obj/item/gun/proc/can_autofire() return (autofire_enabled && world.time >= next_fire_time) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index bb8ea65e64bb..e762458818d5 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -56,8 +56,8 @@ admin_attack_log(user, M, "Squirted their victim with \a [src] (Reagents: [contained])", "Were squirted with \a [src] (Reagents: [contained])", "used \a [src] (Reagents: [contained]) to squirt at") var/spill_amt = M.incapacitated()? 0 : 30 - trans += reagents.splash(target, reagents.total_volume/2, max_spill = spill_amt) - trans += reagents.trans_to_mob(target, reagents.total_volume/2, CHEM_INJECT) //I guess it gets into the bloodstream through the eyes or something + trans += reagents.splash(M, reagents.total_volume/2, max_spill = spill_amt) + trans += reagents.trans_to_mob(M, reagents.total_volume/2, CHEM_INJECT) //I guess it gets into the bloodstream through the eyes or something user.visible_message(SPAN_DANGER("[user] squirts something into \the [target]'s eyes!"), SPAN_DANGER("You squirt [trans] unit\s into \the [target]'s eyes!")) return else diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index a5aa85daf86f..038fc40bbf4f 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -148,19 +148,19 @@ return Move(get_step(src, direction)) /obj/vehicle/bike/Move(var/turf/destination) - if(kickstand || (world.time <= l_move_time + move_delay)) return + if(kickstand || (world.time <= l_move_time + move_delay)) return FALSE //these things like space, not turf. Dragging shouldn't weigh you down. if(isspaceturf(destination)) if(!space_speed) - return 0 + return FALSE move_delay = space_speed else if(!land_speed) - return 0 + return FALSE move_delay = land_speed if(!engine || !engine.use_power()) turn_off() - return 0 + return FALSE return ..() /obj/vehicle/bike/turn_on() diff --git a/code/modules/xenoarcheaology/artifacts/artifact.dm b/code/modules/xenoarcheaology/artifacts/artifact.dm index af9441fae633..a39efb764ce0 100644 --- a/code/modules/xenoarcheaology/artifacts/artifact.dm +++ b/code/modules/xenoarcheaology/artifacts/artifact.dm @@ -111,7 +111,7 @@ physically_destroyed() /obj/structure/artifact/Move() - ..() + . = ..() if(my_effect) my_effect.UpdateMove() if(secondary_effect) diff --git a/mods/gamemodes/cult/flooring.dm b/mods/gamemodes/cult/flooring.dm index 71aff2a3ff30..7169311366c7 100644 --- a/mods/gamemodes/cult/flooring.dm +++ b/mods/gamemodes/cult/flooring.dm @@ -5,7 +5,7 @@ icon_base = "cult" build_type = null turf_flags = TURF_ACID_IMMUNE | TURF_REMOVE_WRENCH - can_paint = null + can_paint = FALSE /decl/flooring/reinforced/cult/on_flooring_remove(turf/removing_from) var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) diff --git a/mods/mobs/dionaea/mob/_nymph.dm b/mods/mobs/dionaea/mob/_nymph.dm index 296d0a20e8bc..d3e6f257ebe2 100644 --- a/mods/mobs/dionaea/mob/_nymph.dm +++ b/mods/mobs/dionaea/mob/_nymph.dm @@ -24,7 +24,7 @@ can_pull_mobs = MOB_PULL_SMALLER holder_type = /obj/item/holder/diona - possession_candidate = 1 + possession_candidate = TRUE atom_flags = ATOM_FLAG_NO_CHEM_CHANGE hud_used = /datum/hud/diona_nymph diff --git a/mods/species/ascent/mobs/nymph/_nymph.dm b/mods/species/ascent/mobs/nymph/_nymph.dm index f9ed8bb3b4a2..a1ea74d77e3c 100644 --- a/mods/species/ascent/mobs/nymph/_nymph.dm +++ b/mods/species/ascent/mobs/nymph/_nymph.dm @@ -27,7 +27,7 @@ can_pull_mobs = MOB_PULL_SMALLER holder_type = /obj/item/holder/ascent_nymph - possession_candidate = 1 + possession_candidate = TRUE atom_flags = ATOM_FLAG_NO_CHEM_CHANGE hud_used = /datum/hud/ascent_nymph From 8289e2e3c2551488c3294fbb9c8e363b752297b5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 15:16:55 -0500 Subject: [PATCH 49/54] Fix improper usage of shard_type on paper --- code/game/objects/items/weapons/material/shards.dm | 12 ++++++------ code/modules/materials/_materials.dm | 14 ++++++++------ .../materials/definitions/gasses/_mat_gas.dm | 2 +- .../definitions/solids/materials_solid_exotic.dm | 2 +- .../solids/materials_solid_gemstones.dm | 2 +- .../definitions/solids/materials_solid_glass.dm | 2 +- .../definitions/solids/materials_solid_organic.dm | 1 + .../definitions/solids/materials_solid_stone.dm | 2 +- .../definitions/solids/materials_solid_wood.dm | 2 +- code/modules/paperwork/papershredder.dm | 3 +++ .../psionics/system/psionics/null/material.dm | 2 +- mods/gamemodes/cult/materials.dm | 2 +- 12 files changed, 26 insertions(+), 20 deletions(-) diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index 52eb1d47f884..cd4ddfb14100 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -1,7 +1,7 @@ // Glass shards /obj/item/shard - name = "shard" + name = SHARD_SHARD icon = 'icons/obj/items/shards.dmi' desc = "Made of nothing. How does this even exist?" // set based on material, if this desc is visible it's a bug (shards default to being made of glass) icon_state = "large" @@ -14,7 +14,7 @@ material = /decl/material/solid/glass material_alteration = MAT_FLAG_ALTERATION_COLOR | MAT_FLAG_ALTERATION_NAME item_flags = ITEM_FLAG_CAN_HIDE_IN_SHOES - var/has_handle + var/has_handle = FALSE /obj/item/shard/Initialize(ml, material_key) . = ..() @@ -38,10 +38,10 @@ icon_state = "[material.shard_icon][pick("large", "medium", "small")]" update_icon() - if(material.shard_type) - SetName("[material.solid_name] [material.shard_type]") + if(material.shard_name) + SetName("[material.solid_name] [material.shard_name]") desc = "A small piece of [material.solid_name]. It looks sharp, you wouldn't want to step on it barefoot. Could probably be used as ... a throwing weapon?" - switch(material.shard_type) + switch(material.shard_name) if(SHARD_SPLINTER, SHARD_SHRAPNEL) gender = PLURAL else @@ -65,7 +65,7 @@ return TRUE if(istype(W, /obj/item/stack/cable_coil)) - if(!material || (material.shard_type in list(SHARD_SPLINTER, SHARD_SHRAPNEL))) + if(!material || (material.shard_name in list(SHARD_SPLINTER, SHARD_SHRAPNEL))) to_chat(user, SPAN_WARNING("\The [src] is not suitable for using as a shank.")) return TRUE if(has_handle) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 11c69574016e..8a54511cbb3f 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -1,5 +1,5 @@ var/global/list/_descriptive_temperature_strings -/proc/get_descriptive_temperature_strings(temperature) +/proc/get_descriptive_temperature_strings(temperature as num) if(!_descriptive_temperature_strings) _descriptive_temperature_strings = list() @@ -41,7 +41,7 @@ var/global/list/materials_by_gas_symbol = list() INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) -/obj/effect/gas_overlay/proc/update_alpha_animation(var/new_alpha) +/obj/effect/gas_overlay/proc/update_alpha_animation(var/new_alpha as num) animate(src, alpha = new_alpha) alpha = new_alpha animate(src, alpha = 0.8 * new_alpha, time = 10, easing = SINE_EASING | EASE_OUT, loop = -1) @@ -115,7 +115,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) var/can_backfill_floor_type // Shards/tables/structures - var/shard_type = SHARD_SHRAPNEL // Path of debris object. + var/shard_type = /obj/item/shard + var/shard_name = SHARD_SHRAPNEL as text // Path of debris object. var/shard_icon // Related to above. var/shard_can_repair = 1 // Can shards be turned into sheets with a welder? var/list/recipes // Holder for all recipes usable with a sheet of this material. @@ -434,7 +435,8 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) if(holographic) temperature_burn_milestone_material = null can_boil_to_gas = FALSE - shard_type = SHARD_NONE + shard_name = SHARD_NONE + shard_type = null conductive = 0 hidden_from_codex = TRUE value = 0 @@ -469,7 +471,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) temperature_damage_threshold = new_temperature_damage_threshold if(!shard_icon) - shard_icon = shard_type + shard_icon = shard_name if(!burn_armor) burn_armor = brute_armor if(!gas_symbol) @@ -694,7 +696,7 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) // As above. /decl/material/proc/place_shards(var/turf/target, var/amount = 1) - if(shard_type) + if(shard_name) return create_object(target, amount, /obj/item/shard) /**Places downa as many shards as needed for the given amount of matter units. Returns a list of all the cuttings. */ diff --git a/code/modules/materials/definitions/gasses/_mat_gas.dm b/code/modules/materials/definitions/gasses/_mat_gas.dm index 6c0703bda431..7cec0aa4a231 100644 --- a/code/modules/materials/definitions/gasses/_mat_gas.dm +++ b/code/modules/materials/definitions/gasses/_mat_gas.dm @@ -3,7 +3,7 @@ melting_point = 70 boiling_point = 180 // -90 C - cryogenic liquid threshold color = COLOR_GRAY80 - shard_type = SHARD_NONE + shard_name = SHARD_NONE conductive = 0 value = 0.15 burn_product = /decl/material/gas/carbon_dioxide diff --git a/code/modules/materials/definitions/solids/materials_solid_exotic.dm b/code/modules/materials/definitions/solids/materials_solid_exotic.dm index f0bc71d7a181..a7ac24e2f338 100644 --- a/code/modules/materials/definitions/solids/materials_solid_exotic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_exotic.dm @@ -43,7 +43,7 @@ icon_base = 'icons/turf/walls/stone.dmi' wall_flags = 0 table_icon_base = "stone" - shard_type = SHARD_SHARD + shard_name = SHARD_SHARD hardness = MAT_VALUE_RIGID flags = MAT_FLAG_FUSION_FUEL construction_difficulty = MAT_VALUE_HARD_DIY diff --git a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm index dcb3b5d38a62..d9a0253e53a4 100644 --- a/code/modules/materials/definitions/solids/materials_solid_gemstones.dm +++ b/code/modules/materials/definitions/solids/materials_solid_gemstones.dm @@ -3,7 +3,7 @@ cut_delay = 60 color = COLOR_DIAMOND opacity = 0.4 - shard_type = SHARD_SHARD + shard_name = SHARD_SHARD tableslam_noise = 'sound/effects/Glasshit.ogg' conductive = 0 ore_icon_overlay = "gems" diff --git a/code/modules/materials/definitions/solids/materials_solid_glass.dm b/code/modules/materials/definitions/solids/materials_solid_glass.dm index d22fbe2d7eae..c93baa2bc708 100644 --- a/code/modules/materials/definitions/solids/materials_solid_glass.dm +++ b/code/modules/materials/definitions/solids/materials_solid_glass.dm @@ -7,7 +7,7 @@ color = GLASS_COLOR opacity = 0.3 integrity = 50 - shard_type = SHARD_SHARD + shard_name = SHARD_SHARD tableslam_noise = 'sound/effects/Glasshit.ogg' hardness = MAT_VALUE_RIGID + 10 door_icon_base = "metal" diff --git a/code/modules/materials/definitions/solids/materials_solid_organic.dm b/code/modules/materials/definitions/solids/materials_solid_organic.dm index 26d720a8814d..e4e065676e6f 100644 --- a/code/modules/materials/definitions/solids/materials_solid_organic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_organic.dm @@ -130,6 +130,7 @@ conductive = FALSE value = 0.25 default_solid_form = /obj/item/stack/material/bolt + shard_name = SHARD_NONE shard_type = /obj/item/shreddedp exoplanet_rarity_plant = MAT_RARITY_NOWHERE exoplanet_rarity_gas = MAT_RARITY_NOWHERE diff --git a/code/modules/materials/definitions/solids/materials_solid_stone.dm b/code/modules/materials/definitions/solids/materials_solid_stone.dm index acf1e65ed86f..99c4a2bd31c3 100644 --- a/code/modules/materials/definitions/solids/materials_solid_stone.dm +++ b/code/modules/materials/definitions/solids/materials_solid_stone.dm @@ -2,7 +2,7 @@ name = null abstract_type = /decl/material/solid/stone color = "#d9c179" - shard_type = SHARD_STONE_PIECE + shard_name = SHARD_STONE_PIECE weight = MAT_VALUE_HEAVY hardness = MAT_VALUE_HARD - 5 reflectiveness = MAT_VALUE_MATTE diff --git a/code/modules/materials/definitions/solids/materials_solid_wood.dm b/code/modules/materials/definitions/solids/materials_solid_wood.dm index 2f7f3e8f7d87..6402e6aa627f 100644 --- a/code/modules/materials/definitions/solids/materials_solid_wood.dm +++ b/code/modules/materials/definitions/solids/materials_solid_wood.dm @@ -26,7 +26,7 @@ slatted_seat_icon = 'icons/obj/structures/furniture/chair_slatted_wood.dmi' backed_chair_icon = 'icons/obj/structures/furniture/chair_backed_wood.dmi' explosion_resistance = 2 - shard_type = SHARD_SPLINTER + shard_name = SHARD_SPLINTER shard_can_repair = 0 // you can't weld splinters back into planks hardness = MAT_VALUE_FLEXIBLE + 10 brute_armor = 1 diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index a5b56cf128fb..7f79ad78b273 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -129,6 +129,9 @@ /obj/machinery/papershredder/proc/create_shredded() for(var/key in shredder_bin) var/decl/material/M = GET_DECL(key) + var/shard_type = M.shard_type + if(!shard_type) + continue var/amt_per_shard = atom_info_repository.get_matter_for(M.shard_type, key, 1) if(shredder_bin[key] > amt_per_shard) LAZYADD(., M.place_cuttings(src, shredder_bin[key])) diff --git a/mods/content/psionics/system/psionics/null/material.dm b/mods/content/psionics/system/psionics/null/material.dm index c76d1bbaf8d6..e28146d5b44a 100644 --- a/mods/content/psionics/system/psionics/null/material.dm +++ b/mods/content/psionics/system/psionics/null/material.dm @@ -11,7 +11,7 @@ flags = MAT_FLAG_BRITTLE opacity = 0.5 integrity = 30 - shard_type = SHARD_SHARD + shard_name = SHARD_SHARD tableslam_noise = 'sound/effects/Glasshit.ogg' hardness = 80 weight = MAT_VALUE_HEAVY diff --git a/mods/gamemodes/cult/materials.dm b/mods/gamemodes/cult/materials.dm index 6b1165f2f05a..e014bd441ec4 100644 --- a/mods/gamemodes/cult/materials.dm +++ b/mods/gamemodes/cult/materials.dm @@ -4,7 +4,7 @@ icon_base = 'icons/turf/walls/cult.dmi' icon_reinf = 'icons/turf/walls/reinforced_cult.dmi' color = "#402821" - shard_type = SHARD_STONE_PIECE + shard_name = SHARD_STONE_PIECE conductive = 0 construction_difficulty = MAT_VALUE_NORMAL_DIY hidden_from_codex = TRUE From c739edbd9af30663c2b83e7664d89d5bd7a3afb5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 18:23:56 -0500 Subject: [PATCH 50/54] Optimize pick_area_turf_by_flag in the case of no suitable areas --- code/_helpers/areas.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/_helpers/areas.dm b/code/_helpers/areas.dm index 3238e0ec1018..e985579e0abe 100644 --- a/code/_helpers/areas.dm +++ b/code/_helpers/areas.dm @@ -41,6 +41,8 @@ if(!(candidate_area.area_flags & area_flags)) continue valid_areas[candidate_area] = TRUE + if(!length(valid_areas)) // no turfs at all have that flag + return FALSE // Each area contents loop is an in-world loop, so we just do one here. for(var/turf/turf_candidate in world) var/area/candidate_area = get_area(turf_candidate) From 9c52c317a71b2b0cbc9ce33ba0c0c16bbf269b3c Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 21:04:06 -0500 Subject: [PATCH 51/54] Move open_uis onto datum --- .../controllers/subsystems/processing/nano.dm | 79 ++++++++----------- code/datums/datum.dm | 2 +- code/modules/nano/nanoexternal.dm | 8 +- 3 files changed, 40 insertions(+), 49 deletions(-) diff --git a/code/controllers/subsystems/processing/nano.dm b/code/controllers/subsystems/processing/nano.dm index dd358012c92a..06ef7107fa5d 100644 --- a/code/controllers/subsystems/processing/nano.dm +++ b/code/controllers/subsystems/processing/nano.dm @@ -3,14 +3,11 @@ PROCESSING_SUBSYSTEM_DEF(nano) priority = SS_PRIORITY_NANO wait = 2 SECONDS - // a list of current open /nanoui UIs, grouped by src_object and ui_key - var/list/open_uis = list() - /** * Get an open /nanoui ui for the current user, src_object and ui_key and try to update it with data * * @param user /mob The mob who opened/owns the ui - * @param src_object /obj|/mob The obj or mob which the ui belongs to + * @param src_object /datum The datum which the ui belongs to * @param ui_key string A string key used for the ui * @param ui /datum/nanoui An existing instance of the ui (can be null) * @param data list The data to be passed to the ui, if it exists @@ -36,11 +33,11 @@ PROCESSING_SUBSYSTEM_DEF(nano) * * @return /nanoui Returns the found ui, or null if none exists */ -/datum/controller/subsystem/processing/nano/proc/get_open_ui(mob/user, src_object, ui_key) - if (!open_uis[src_object] || !open_uis[src_object][ui_key]) +/datum/controller/subsystem/processing/nano/proc/get_open_ui(mob/user, datum/src_object, ui_key) + if (!src_object.open_uis?[ui_key]) return - for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) + for (var/datum/nanoui/ui in src_object.open_uis[ui_key]) if (ui.user == user) return ui @@ -51,13 +48,13 @@ PROCESSING_SUBSYSTEM_DEF(nano) * * @return int The number of uis updated */ -/datum/controller/subsystem/processing/nano/proc/update_uis(src_object) +/datum/controller/subsystem/processing/nano/proc/update_uis(datum/src_object) . = 0 - if (!open_uis[src_object]) + if (!src_object.open_uis) return - for (var/ui_key in open_uis[src_object]) - for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) + for (var/ui_key in src_object.open_uis) + for (var/datum/nanoui/ui in src_object.open_uis[ui_key]) if(ui.src_object && ui.user && ui.src_object.nano_host()) ui.try_update(1) .++ @@ -71,16 +68,13 @@ PROCESSING_SUBSYSTEM_DEF(nano) * * @return int The number of uis close */ -/datum/controller/subsystem/processing/nano/proc/close_uis(src_object) +/datum/controller/subsystem/processing/nano/proc/close_uis(datum/src_object) . = 0 - if (!length(open_uis)) - return - - if (!open_uis[src_object]) + if (!length(src_object.open_uis)) return - for (var/ui_key in open_uis[src_object]) - for (var/datum/nanoui/ui in open_uis[src_object][ui_key]) + for (var/ui_key in src_object.open_uis) + for (var/datum/nanoui/ui in src_object.open_uis[ui_key]) ui.close() // If it's missing src_object or user, we want to close it even more. .++ @@ -93,12 +87,12 @@ PROCESSING_SUBSYSTEM_DEF(nano) * * @return int The number of uis updated */ -/datum/controller/subsystem/processing/nano/proc/update_user_uis(mob/user, src_object, ui_key = null, force_open = FALSE) +/datum/controller/subsystem/processing/nano/proc/update_user_uis(mob/user, datum/src_object, ui_key = null, force_open = FALSE) . = 0 - if (!length(user.open_uis)) + if (!length(user.opened_uis)) return // has no open uis - for (var/datum/nanoui/ui in user.open_uis) + for (var/datum/nanoui/ui in user.opened_uis) if ((isnull(src_object) || ui.src_object == src_object) && (isnull(ui_key) || ui.ui_key == ui_key)) ui.try_update(update = TRUE, force_open = force_open) .++ @@ -112,12 +106,12 @@ PROCESSING_SUBSYSTEM_DEF(nano) * * @return int The number of uis closed */ -/datum/controller/subsystem/processing/nano/proc/close_user_uis(mob/user, src_object, ui_key) +/datum/controller/subsystem/processing/nano/proc/close_user_uis(mob/user, datum/src_object, ui_key) . = 0 - if (!length(user.open_uis)) + if (!length(user.opened_uis)) return // has no open uis - for (var/datum/nanoui/ui in user.open_uis) + for (var/datum/nanoui/ui in user.opened_uis) if ((isnull(src_object) || ui.src_object == src_object) && (isnull(ui_key) || ui.ui_key == ui_key)) ui.close() .++ @@ -131,10 +125,10 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return nothing */ /datum/controller/subsystem/processing/nano/proc/ui_opened(datum/nanoui/ui) - var/src_object = ui.src_object - LAZYINITLIST(open_uis[src_object]) - LAZYDISTINCTADD(open_uis[src_object][ui.ui_key], ui) - LAZYDISTINCTADD(ui.user.open_uis, ui) + var/datum/src_object = ui.src_object + LAZYINITLIST(src_object.open_uis) + LAZYDISTINCTADD(src_object.open_uis[ui.ui_key], ui) + LAZYDISTINCTADD(ui.user.opened_uis, ui) START_PROCESSING(SSnano, ui) /** @@ -146,19 +140,15 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return int 0 if no ui was removed, 1 if removed successfully */ /datum/controller/subsystem/processing/nano/proc/ui_closed(var/datum/nanoui/ui) - var/src_object = ui.src_object - if (!open_uis[src_object] || !open_uis[src_object][ui.ui_key]) - return 0 // wasn't open + var/datum/src_object = ui.src_object + if (!src_object.open_uis?[ui.ui_key]) + return FALSE // wasn't open STOP_PROCESSING(SSnano, ui) if(ui.user) // Sanity check in case a user has been deleted (say a blown up borg watching the alarm interface) - LAZYREMOVE(ui.user.open_uis, ui) - open_uis[src_object][ui.ui_key] -= ui - if(!length(open_uis[src_object][ui.ui_key])) - open_uis[src_object] -= ui.ui_key - if(!length(open_uis[src_object])) - open_uis -= src_object - return 1 + LAZYREMOVE(ui.user.opened_uis, ui) + LAZYREMOVE(src_object.open_uis[ui.ui_key], ui) + return TRUE /** * This is called on user logout @@ -181,12 +171,11 @@ PROCESSING_SUBSYSTEM_DEF(nano) * @return nothing */ /datum/controller/subsystem/processing/nano/proc/user_transferred(mob/oldMob, mob/newMob) - if (!oldMob || !oldMob.open_uis) - return 0 // has no open uis + if (!oldMob?.opened_uis) + return FALSE // has no open uis - LAZYINITLIST(newMob.open_uis) - for (var/datum/nanoui/ui in oldMob.open_uis) + for (var/datum/nanoui/ui in oldMob.opened_uis) ui.user = newMob - newMob.open_uis += ui - oldMob.open_uis = null - return 1 // success + newMob.opened_uis += oldMob.opened_uis // if the new mob's list is null this just sets it to the old mob's list + oldMob.opened_uis = null + return TRUE // success diff --git a/code/datums/datum.dm b/code/datums/datum.dm index aa855c0b1e3b..d4d9d3f5a1b5 100644 --- a/code/datums/datum.dm +++ b/code/datums/datum.dm @@ -29,7 +29,7 @@ tag = null weakref = null // Clear this reference to ensure it's kept for as brief duration as possible. - if(istype(SSnano)) + if(length(open_uis)) // inline the open ui check to avoid unnecessary proc call overhead SSnano.close_uis(src) if(active_timers) diff --git a/code/modules/nano/nanoexternal.dm b/code/modules/nano/nanoexternal.dm index 0d0256206453..ea9cc195f21f 100644 --- a/code/modules/nano/nanoexternal.dm +++ b/code/modules/nano/nanoexternal.dm @@ -11,7 +11,7 @@ set name = "Reset NanoUI" set category = "OOC" - var/ui_amt = length(mob.open_uis) + var/ui_amt = length(mob.opened_uis) SSnano.close_user_uis(mob) to_chat(src, "[ui_amt] UI windows reset.") @@ -67,5 +67,7 @@ return list() // Not implemented. -// Used by SSnano (/datum/controller/subsystem/processing/nano) to track UIs opened by this mob -/mob/var/list/open_uis +/// Lazy associative list of /nanoui UIs opened on this object, according to ui_key. Not to be confused with opened_uis on mob. +/datum/var/tmp/list/open_uis +/// Used by SSnano (/datum/controller/subsystem/processing/nano) to track UIs opened by this mob. +/mob/var/list/opened_uis From e9804955fb8123c4266101d09213d00ca35c183e Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 21:04:23 -0500 Subject: [PATCH 52/54] Optimize get_movable_alpha_mask_state for space turfs --- code/game/turfs/space/space.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index 4dae8e230574..874422eae0b8 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -141,3 +141,7 @@ /turf/space/black icon_state = "black" + +// not how space works +/turf/space/get_movable_alpha_mask_state(atom/movable/mover) + return null \ No newline at end of file From 5db0b9012fe726bf4e7a241ebd3280572a5c1451 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 21:04:58 -0500 Subject: [PATCH 53/54] Simplify has_extension and remove_extension --- code/datums/extensions/extensions.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/datums/extensions/extensions.dm b/code/datums/extensions/extensions.dm index d89251818400..53985ff5862d 100644 --- a/code/datums/extensions/extensions.dm +++ b/code/datums/extensions/extensions.dm @@ -104,14 +104,14 @@ //Fast way to check if it has an extension, also doesn't trigger instantiation of lazy loaded extensions /proc/has_extension(var/datum/source, var/base_type) - return !!(source.extensions && source.extensions[base_type]) + return !!source.extensions?[base_type] /proc/construct_extension_instance(var/extension_type, var/datum/source, var/list/arguments) arguments = list(source) + arguments return new extension_type(arglist(arguments)) /proc/remove_extension(var/datum/source, var/base_type) - if(!source.extensions || !source.extensions[base_type]) + if(!source.extensions?[base_type]) return if(!islist(source.extensions[base_type])) qdel(source.extensions[base_type]) From 9c9e91c8c4c3a899c0885edba8e728ec50f56a36 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 13 Feb 2025 21:05:43 -0500 Subject: [PATCH 54/54] Optimize floor icons, smoothing, and topmost layer --- code/game/turfs/flooring/_flooring.dm | 53 +++++++++++++------------- code/game/turfs/floors/floor_icon.dm | 16 +++----- code/game/turfs/floors/floor_layers.dm | 15 ++++---- 3 files changed, 39 insertions(+), 45 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 01d6ff0d4bbb..c14041d860db 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -200,40 +200,39 @@ var/global/list/flooring_cache = list() var/decl/material/use_material = target.get_material() target.color = use_material?.color - var/edge_layer = (icon_edge_layer != FLOOR_EDGE_NONE) ? target.layer + icon_edge_layer : target.layer - var/list/edge_overlays = list() - var/has_border = 0 - for(var/step_dir in global.cardinal) - var/turf/T = get_step_resolving_mimic(target, step_dir) - if(!istype(T) || symmetric_test_link(target, T)) - continue - has_border |= step_dir - if(icon_edge_layer != FLOOR_EDGE_NONE) - if(has_internal_edges) - edge_overlays += get_flooring_overlay("[icon]_[icon_base]-edge-[step_dir]", edge_state, step_dir, edge_layer = edge_layer) - if(has_external_edges && target.can_draw_edge_over(T)) - edge_overlays += get_flooring_overlay("[icon]_[icon_base]-outer-edge-[step_dir]", outer_edge_state, step_dir, TRUE, edge_layer = edge_layer) - - if (has_internal_edges || has_external_edges) - var/has_smooth = ~(has_border & (NORTH | SOUTH | EAST | WEST)) - for(var/step_dir in global.cornerdirs) + if (icon_edge_layer != FLOOR_EDGE_NONE && (has_internal_edges || has_external_edges)) + var/edge_layer = target.layer + icon_edge_layer + var/list/edge_overlays = list() + var/has_border = 0 + for(var/step_dir in global.cardinal) var/turf/T = get_step_resolving_mimic(target, step_dir) if(!istype(T) || symmetric_test_link(target, T)) continue + has_border |= step_dir if(icon_edge_layer != FLOOR_EDGE_NONE) if(has_internal_edges) - if((has_smooth & step_dir) == step_dir) - edge_overlays += get_flooring_overlay("[icon]_[icon_base]-corner-[step_dir]", corner_state, step_dir, edge_layer = edge_layer) - else if((has_border & step_dir) == step_dir) - edge_overlays += get_flooring_overlay("[icon]_[icon_base]-edge-[step_dir]", edge_state, step_dir, edge_layer = edge_layer) + edge_overlays += get_flooring_overlay("[icon]_[icon_base]-edge-[step_dir]", edge_state, step_dir, edge_layer = edge_layer) if(has_external_edges && target.can_draw_edge_over(T)) - if((has_smooth & step_dir) == step_dir) - edge_overlays += get_flooring_overlay("[icon]_[icon_base]-outer-corner-[step_dir]", outer_corner_state, step_dir, TRUE, edge_layer = edge_layer) - else if((has_border & step_dir) == step_dir) - edge_overlays += get_flooring_overlay("[icon]_[icon_base]-outer-edge-[step_dir]", outer_edge_state, step_dir, TRUE, edge_layer = edge_layer) + edge_overlays += get_flooring_overlay("[icon]_[icon_base]-outer-edge-[step_dir]", outer_edge_state, step_dir, TRUE, edge_layer = edge_layer) + + var/has_smooth = ~(has_border & (NORTH | SOUTH | EAST | WEST)) + for(var/step_dir in global.cornerdirs) + var/turf/T = get_step_resolving_mimic(target, step_dir) + if(!istype(T) || symmetric_test_link(target, T)) + continue + if(has_internal_edges) + if((has_smooth & step_dir) == step_dir) + edge_overlays += get_flooring_overlay("[icon]_[icon_base]-corner-[step_dir]", corner_state, step_dir, edge_layer = edge_layer) + else if((has_border & step_dir) == step_dir) + edge_overlays += get_flooring_overlay("[icon]_[icon_base]-edge-[step_dir]", edge_state, step_dir, edge_layer = edge_layer) + if(has_external_edges && target.can_draw_edge_over(T)) + if((has_smooth & step_dir) == step_dir) + edge_overlays += get_flooring_overlay("[icon]_[icon_base]-outer-corner-[step_dir]", outer_corner_state, step_dir, TRUE, edge_layer = edge_layer) + else if((has_border & step_dir) == step_dir) + edge_overlays += get_flooring_overlay("[icon]_[icon_base]-outer-edge-[step_dir]", outer_edge_state, step_dir, TRUE, edge_layer = edge_layer) - if(length(edge_overlays)) - target.add_overlay(edge_overlays) + if(length(edge_overlays)) + target.add_overlay(edge_overlays) if(target.is_floor_broken()) target.add_overlay(get_damage_overlay(target._floor_broken)) diff --git a/code/game/turfs/floors/floor_icon.dm b/code/game/turfs/floors/floor_icon.dm index b7decba1b908..0946e0d363ed 100644 --- a/code/game/turfs/floors/floor_icon.dm +++ b/code/game/turfs/floors/floor_icon.dm @@ -172,20 +172,17 @@ return FALSE /decl/flooring/proc/test_link(var/turf/origin, var/turf/opponent) - if(!istype(origin) || !istype(opponent)) - return FALSE - // Just a normal floor if (istype(opponent, /turf/floor)) - var/turf/floor/floor_opponent = opponent - var/decl/flooring/opponent_flooring = floor_opponent.get_topmost_flooring() if (floor_smooth == SMOOTH_ALL) return TRUE + var/turf/floor/floor_opponent = opponent + var/decl/flooring/opponent_flooring = floor_opponent.get_topmost_flooring() //If the floor is the same as us,then we're linked, - else if (istype(opponent_flooring, neighbour_type)) + if (istype(opponent_flooring, neighbour_type)) return TRUE //If we get here it must be using a whitelist or blacklist - else if (floor_smooth == SMOOTH_WHITELIST) + if (floor_smooth == SMOOTH_WHITELIST) if (flooring_whitelist[opponent_flooring.type]) //Found a match on the typecache return TRUE @@ -194,9 +191,8 @@ //No match on the typecache return TRUE //Check for window frames. - if (wall_smooth == SMOOTH_ALL) - if(locate(/obj/structure/wall_frame) in opponent) - return TRUE + if (wall_smooth == SMOOTH_ALL && locate(/obj/structure/wall_frame) in opponent) + return TRUE // Wall turf else if(opponent.is_wall()) if(wall_smooth == SMOOTH_ALL) diff --git a/code/game/turfs/floors/floor_layers.dm b/code/game/turfs/floors/floor_layers.dm index 76ef3df043a9..e482d21fc5a4 100644 --- a/code/game/turfs/floors/floor_layers.dm +++ b/code/game/turfs/floors/floor_layers.dm @@ -1,7 +1,7 @@ /turf/floor VAR_PROTECTED/decl/flooring/_base_flooring = /decl/flooring/plating VAR_PROTECTED/list/decl/flooring/_flooring - VAR_PRIVATE/decl/flooring/_topmost_flooring + VAR_PRIVATE/tmp/decl/flooring/_topmost_flooring /turf/floor/proc/get_all_flooring() . = list() @@ -44,16 +44,15 @@ if(isnull(_topmost_flooring)) var/flooring_length = length(_flooring) - if(isnull(_flooring)) - _topmost_flooring = FALSE - else if(islist(_flooring) && flooring_length) + if(flooring_length) // no need to check islist, length is only nonzero for lists and strings, and strings are invalid here _topmost_flooring = _flooring[flooring_length] else if(istype(_flooring, /decl/flooring)) _topmost_flooring = _flooring - - if(istype(_topmost_flooring)) - return _topmost_flooring - return get_base_flooring() + else if(ispath(_flooring, /decl/flooring)) + _topmost_flooring = GET_DECL(_flooring) + else + _topmost_flooring = FALSE + return _topmost_flooring || get_base_flooring() /turf/floor/proc/clear_flooring(skip_update = FALSE, place_product) if(isnull(_flooring))