diff --git a/.github/workflows/autochangelog.yml b/.github/workflows/autochangelog.yml index 7953929ce5..71a53a5b2d 100644 --- a/.github/workflows/autochangelog.yml +++ b/.github/workflows/autochangelog.yml @@ -11,7 +11,7 @@ env: jobs: autochangelog: name: Autochangelog - runs-on: ubuntu-16.04 + runs-on: ubuntu-20.04 if: github.event.pull_request.merged == true steps: - uses: /actions/checkout@v2 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 33b71bb2aa..59319c4b8b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -10,7 +10,7 @@ env: jobs: file_tests: name: Run Linters - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Ensure +x on CI directory @@ -26,7 +26,7 @@ jobs: dreamchecker: name: DreamChecker - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 @@ -54,7 +54,7 @@ jobs: unit_tests: name: Integration Tests - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Ensure +x on CI directory @@ -69,7 +69,7 @@ jobs: run: | sudo dpkg --add-architecture i386 sudo apt update || true - sudo apt install libc6:i386 libgcc1:i386 libstdc++6:i386 libssl1.0.0:i386 zlib1g:i386 + sudo apt install zlib1g-dev:i386 libssl-dev:i386 pkg-config:i386 ldd librust_g.so - name: Unit Tests run: | diff --git a/.github/workflows/render_nanomaps.yml b/.github/workflows/render_nanomaps.yml index f3a50a5e94..fd5536ea48 100644 --- a/.github/workflows/render_nanomaps.yml +++ b/.github/workflows/render_nanomaps.yml @@ -14,7 +14,7 @@ on: jobs: generate_maps: name: 'Generate NanoMaps' - runs-on: ubuntu-18.04 + runs-on: ubuntu-20.04 steps: - name: Clone uses: actions/checkout@v2 diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 8d30c946ca..5817d0948e 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -296,7 +296,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 05922103ff..7d476e17b7 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -256,7 +256,7 @@ Thus, the two variables affect pump operation are set in New(): to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index a3a368852f..f0c5498fb3 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -91,7 +91,7 @@ playsound(src, W.usesound, 50, 1) if(do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 5b489441db..31f61ae55b 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -162,7 +162,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 10d7403541..eaae718b2e 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -62,7 +62,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 7deca38847..12c3fbfa13 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -340,7 +340,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm index bba26185e7..a3571fed8b 100644 --- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm +++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm @@ -81,7 +81,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index 5eeab2c8e4..b4991c0e5d 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -171,7 +171,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 488855a71f..4c843f5342 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -405,7 +405,7 @@ if(!src || !WT.isOn()) return playsound(src, WT.usesound, 50, 1) if(!welded) - user.visible_message("\The [user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + user.visible_message("\The [user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") welded = 1 update_icon() else @@ -453,7 +453,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 515cd37e7f..8b481a6d8c 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -281,7 +281,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index c890938100..9e88195bcc 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -301,7 +301,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm index f95948868d..5f384ed457 100644 --- a/code/ATMOSPHERICS/pipes/pipe_base.dm +++ b/code/ATMOSPHERICS/pipes/pipe_base.dm @@ -130,7 +130,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if (do_after(user, 10 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear a ratchet.") deconstruct() diff --git a/code/__defines/art.dm b/code/__defines/art.dm new file mode 100644 index 0000000000..473f7f3565 --- /dev/null +++ b/code/__defines/art.dm @@ -0,0 +1,5 @@ + +///tgui tab portrait categories- they're the same across all portrait tguis. +#define TAB_LIBRARY 1 +#define TAB_SECURE 2 +#define TAB_PRIVATE 3 diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index a71515643b..f4566e5101 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -51,7 +51,7 @@ GLOBAL_LIST_INIT(custom_species_bases, new) // Species that can be used for a Cu var/datum/category_collection/underwear/global_underwear = new() //Backpacks -var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag") +var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag", "Sports Bag") var/global/list/pdachoicelist = list("Default", "Slim", "Old", "Rugged", "Holographic", "Wrist-Bound") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg) @@ -121,7 +121,7 @@ GLOBAL_LIST_EMPTY(mannequins) var/list/paths //Hair - Initialise all /datum/sprite_accessory/hair into an list indexed by hair-style name - paths = typesof(/datum/sprite_accessory/hair) - /datum/sprite_accessory/hair + paths = subtypesof(/datum/sprite_accessory/hair) for(var/path in paths) var/datum/sprite_accessory/hair/H = new path() hair_styles_list[H.name] = H @@ -133,7 +133,7 @@ GLOBAL_LIST_EMPTY(mannequins) hair_styles_female_list += H.name //Facial Hair - Initialise all /datum/sprite_accessory/facial_hair into an list indexed by facialhair-style name - paths = typesof(/datum/sprite_accessory/facial_hair) - /datum/sprite_accessory/facial_hair + paths = subtypesof(/datum/sprite_accessory/facial_hair) for(var/path in paths) var/datum/sprite_accessory/facial_hair/H = new path() facial_hair_styles_list[H.name] = H @@ -145,27 +145,27 @@ GLOBAL_LIST_EMPTY(mannequins) facial_hair_styles_female_list += H.name //Body markings - Initialise all /datum/sprite_accessory/marking into an list indexed by marking name - paths = typesof(/datum/sprite_accessory/marking) - /datum/sprite_accessory/marking + paths = subtypesof(/datum/sprite_accessory/marking) for(var/path in paths) var/datum/sprite_accessory/marking/M = new path() body_marking_styles_list[M.name] = M //Surgery Steps - Initialize all /datum/surgery_step into a list - paths = typesof(/datum/surgery_step)-/datum/surgery_step + paths = subtypesof(/datum/surgery_step) for(var/T in paths) var/datum/surgery_step/S = new T surgery_steps += S sort_surgeries() //List of job. I can't believe this was calculated multiple times per tick! - paths = typesof(/datum/job)-/datum/job + paths = subtypesof(/datum/job) paths -= exclude_jobs for(var/T in paths) var/datum/job/J = new T joblist[J.title] = J //Languages - paths = typesof(/datum/language)-/datum/language + paths = subtypesof(/datum/language) for(var/T in paths) var/datum/language/L = new T if (isnull(GLOB.all_languages[L.name])) @@ -189,7 +189,7 @@ GLOBAL_LIST_EMPTY(mannequins) //Species var/rkey = 0 - paths = typesof(/datum/species) + paths = subtypesof(/datum/species) for(var/T in paths) rkey++ @@ -214,31 +214,31 @@ GLOBAL_LIST_EMPTY(mannequins) GLOB.whitelisted_species += S.name //Ores - paths = typesof(/ore)-/ore + paths = subtypesof(/ore) for(var/oretype in paths) var/ore/OD = new oretype() GLOB.ore_data[OD.name] = OD - paths = typesof(/datum/alloy)-/datum/alloy + paths = subtypesof(/datum/alloy) for(var/alloytype in paths) GLOB.alloy_data += new alloytype() //Closet appearances GLOB.closet_appearances = decls_repository.get_decls_of_type(/decl/closet_appearance) - paths = typesof(/datum/sprite_accessory/ears) - /datum/sprite_accessory/ears + paths = subtypesof(/datum/sprite_accessory/ears) for(var/path in paths) var/obj/item/clothing/head/instance = new path() ear_styles_list[path] = instance // Custom Tails - paths = typesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail - /datum/sprite_accessory/tail/taur + paths = subtypesof(/datum/sprite_accessory/tail) - /datum/sprite_accessory/tail/taur for(var/path in paths) var/datum/sprite_accessory/tail/instance = new path() tail_styles_list[path] = instance // Custom Wings - paths = typesof(/datum/sprite_accessory/wing) - /datum/sprite_accessory/wing + paths = subtypesof(/datum/sprite_accessory/wing) for(var/path in paths) var/datum/sprite_accessory/wing/instance = new path() wing_styles_list[path] = instance @@ -253,7 +253,7 @@ GLOBAL_LIST_EMPTY(mannequins) /* // Custom species traits - paths = typesof(/datum/trait) - /datum/trait + paths = subtypesof(/datum/trait) - /datum/trait for(var/path in paths) var/datum/trait/instance = new path() if(!instance.name) diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm index 16622d1ee6..87cd24a36f 100644 --- a/code/_helpers/global_lists_vr.dm +++ b/code/_helpers/global_lists_vr.dm @@ -492,6 +492,18 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, SPECIES_GOLEM, //Some special species that may or may not be ever used in event too, SPECIES_SHADEKIN) //Shadefluffers just poof away +/var/global/list/alt_titles_with_icons = list( + "Virologist", + "Apprentice Engineer", + "Medical Intern", + "Research Intern", + "Security Cadet", + "Jr. Cargo Tech", + "Jr. Explorer", + "Server", + "Electrician", + "Barista") + /var/global/list/existing_solargrubs = list() /hook/startup/proc/init_vore_datum_ref_lists() @@ -512,10 +524,10 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, var/cost = instance.cost traits_costs[path] = cost all_traits[path] = instance - + // Shakey shakey shake sortTim(all_traits, /proc/cmp_trait_datums_name, associative = TRUE) - + // Split 'em up for(var/traitpath in all_traits) var/datum/trait/T = all_traits[traitpath] @@ -529,7 +541,7 @@ var/global/list/remainless_species = list(SPECIES_PROMETHEAN, everyone_traits[traitpath] = T if(0.1 to INFINITY) positive_traits[traitpath] = T - + // Weaver recipe stuff paths = typesof(/datum/weaver_recipe/structure) - /datum/weaver_recipe/structure diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 5540fe8e08..6c3d63f129 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -686,12 +686,12 @@ Turf and target are seperate in case you want to teleport some distance from a t /proc/return_areas() var/list/area/areas = list() for(var/area/A in world) - areas += A + areas[A.name] = A return areas //Returns: all the areas in the world, sorted. /proc/return_sorted_areas() - return sortAtom(return_areas()) + return sortTim(return_areas(), /proc/cmp_text_asc) //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all areas of that type in the world. diff --git a/code/controllers/subsystems/persistence.dm b/code/controllers/subsystems/persistence.dm index 792bf63893..52adf3ae21 100644 --- a/code/controllers/subsystems/persistence.dm +++ b/code/controllers/subsystems/persistence.dm @@ -4,6 +4,10 @@ SUBSYSTEM_DEF(persistence) flags = SS_NO_FIRE var/list/tracking_values = list() var/list/persistence_datums = list() + + /// Places our subsystem can spawn paintings (helps with art spawning differently across maps) + var/list/obj/structure/sign/painting/painting_frames = list() + var/list/paintings = list() /datum/controller/subsystem/persistence/Initialize() . = ..() diff --git a/code/datums/outfits/jobs/civilian.dm b/code/datums/outfits/jobs/civilian.dm index cda81f977f..1d299a81db 100644 --- a/code/datums/outfits/jobs/civilian.dm +++ b/code/datums/outfits/jobs/civilian.dm @@ -68,6 +68,7 @@ backpack = /obj/item/weapon/storage/backpack/hydroponics satchel_one = /obj/item/weapon/storage/backpack/satchel/hyd messenger_bag = /obj/item/weapon/storage/backpack/messenger/hyd + sports_bag = /obj/item/weapon/storage/backpack/sport/hyd id_type = /obj/item/weapon/card/id/civilian/service/botanist //VOREStation Edit pda_type = /obj/item/device/pda/botanist diff --git a/code/datums/outfits/jobs/medical.dm b/code/datums/outfits/jobs/medical.dm index 6622d3b285..dd5cb7fbcb 100644 --- a/code/datums/outfits/jobs/medical.dm +++ b/code/datums/outfits/jobs/medical.dm @@ -65,6 +65,7 @@ suit = /obj/item/clothing/suit/storage/toggle/labcoat/chemist backpack = /obj/item/weapon/storage/backpack/chemistry satchel_one = /obj/item/weapon/storage/backpack/satchel/chem + sports_bag = /obj/item/weapon/storage/backpack/sport/chem id_type = /obj/item/weapon/card/id/medical/chemist pda_type = /obj/item/device/pda/chemist diff --git a/code/datums/outfits/jobs/science.dm b/code/datums/outfits/jobs/science.dm index 8920db9b7b..a7b7a71478 100644 --- a/code/datums/outfits/jobs/science.dm +++ b/code/datums/outfits/jobs/science.dm @@ -7,6 +7,7 @@ backpack = /obj/item/weapon/storage/backpack/toxins satchel_one = /obj/item/weapon/storage/backpack/satchel/tox messenger_bag = /obj/item/weapon/storage/backpack/messenger/tox + sports_bag = /obj/item/weapon/storage/backpack/sport/tox /decl/hierarchy/outfit/job/science/rd name = OUTFIT_JOB_NAME("Research Director") diff --git a/code/datums/outfits/jobs/security.dm b/code/datums/outfits/jobs/security.dm index ca4a0a4b85..4a044d8aaa 100644 --- a/code/datums/outfits/jobs/security.dm +++ b/code/datums/outfits/jobs/security.dm @@ -8,6 +8,7 @@ satchel_one = /obj/item/weapon/storage/backpack/satchel/sec backpack_contents = list(/obj/item/weapon/handcuffs = 1) messenger_bag = /obj/item/weapon/storage/backpack/messenger/sec + sports_bag = /obj/item/weapon/storage/backpack/sport/sec /decl/hierarchy/outfit/job/security/hos name = OUTFIT_JOB_NAME("Head of security") diff --git a/code/datums/outfits/outfit.dm b/code/datums/outfits/outfit.dm index 7791f95b0e..4292556300 100644 --- a/code/datums/outfits/outfit.dm +++ b/code/datums/outfits/outfit.dm @@ -56,6 +56,7 @@ var/list/outfits_decls_by_type_ var/satchel_one = /obj/item/weapon/storage/backpack/satchel/norm var/satchel_two = /obj/item/weapon/storage/backpack/satchel var/messenger_bag = /obj/item/weapon/storage/backpack/messenger + var/sports_bag = /obj/item/weapon/storage/backpack/sport var/flags // Specific flags @@ -76,6 +77,7 @@ var/list/outfits_decls_by_type_ if(3) back = satchel_one if(4) back = satchel_two if(5) back = messenger_bag + if(6) back = sports_bag else back = null /decl/hierarchy/outfit/proc/post_equip(mob/living/carbon/human/H) diff --git a/code/datums/supplypacks/hospitality.dm b/code/datums/supplypacks/hospitality.dm index 1ca6aee620..bcf472a0b9 100644 --- a/code/datums/supplypacks/hospitality.dm +++ b/code/datums/supplypacks/hospitality.dm @@ -79,6 +79,23 @@ containertype = /obj/structure/closet/crate/allico containername = "crate of gifts" +/datum/supply_pack/hospitality/painting + name = "Painting equipment" + contains = list( + /obj/item/paint_brush = 2, + /obj/item/paint_palette = 2, + /obj/item/weapon/reagent_containers/glass/rag = 2, + /obj/structure/easel = 1, // How does that even fit + /obj/item/canvas = 1, + /obj/item/canvas/nineteen_nineteen = 1, + /obj/item/canvas/twentyfour_twentyfour = 1, + /obj/item/canvas/twentythree_nineteen = 1, + /obj/item/canvas/twentythree_twentythree = 1 + ) + cost = 20 + containertype = /obj/structure/closet/crate/centauri + containername = "Painting equipment" + /datum/supply_pack/randomised/hospitality/ group = "Hospitality" diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index 94b362fca8..623291dde7 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -42,6 +42,7 @@ var/datum/antagonist/mercenary/mercs if(player.backbag == 3) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(player), slot_back) if(player.backbag == 4) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(player), slot_back) if(player.backbag == 5) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(player), slot_back) + if(player.backbag == 6) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/sport(player), slot_back) player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack) player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index f362f6b3a8..0fcded12c6 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -83,7 +83,8 @@ var/datum/antagonist/wizard/wizards if(wizard_mob.backbag == 2) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back) if(wizard_mob.backbag == 3) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(wizard_mob), slot_back) if(wizard_mob.backbag == 4) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(wizard_mob), slot_back) - if(wizard_mob.backbag == 5) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back) + if(wizard_mob.backbag == 5) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(wizard_mob), slot_back) + if(wizard_mob.backbag == 6) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/sport(wizard_mob), slot_back) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box(wizard_mob), slot_in_backpack) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand) diff --git a/code/game/gamemodes/cult/construct_spells.dm b/code/game/gamemodes/cult/construct_spells.dm index 48394146b5..62cdd5bf48 100644 --- a/code/game/gamemodes/cult/construct_spells.dm +++ b/code/game/gamemodes/cult/construct_spells.dm @@ -671,6 +671,6 @@ W.visible_message("\The [user] [attack_message] \the [W], obliterating it!") W.dismantle_wall(1) else - user.visible_message("\The [user] lowers its fist.") + user.visible_message("\The [user] lowers its fist.") return qdel(src) \ No newline at end of file diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm index 4e78a6ad36..88aa93f4c2 100644 --- a/code/game/gamemodes/technomancer/core_obj.dm +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -121,7 +121,7 @@ if(L.stat == DEAD) summoned_mobs -= L spawn(1) - L.visible_message("\The [L] begins to fade away...") + L.visible_message("\The [L] begins to fade away...") animate(L, alpha = 255, alpha = 0, time = 30) // Makes them fade into nothingness. sleep(30) qdel(L) diff --git a/code/game/gamemodes/technomancer/spells/abjuration.dm b/code/game/gamemodes/technomancer/spells/abjuration.dm index dd39e1982b..c14356cba8 100644 --- a/code/game/gamemodes/technomancer/spells/abjuration.dm +++ b/code/game/gamemodes/technomancer/spells/abjuration.dm @@ -27,7 +27,7 @@ to_chat(L, "\The [user] tried to teleport you far away, but failed.") return 0 else - visible_message("\The [L] vanishes!") + visible_message("\The [L] vanishes!") qdel(L) else if(istype(L, /mob/living/simple_mob/construct)) var/mob/living/simple_mob/construct/evil = L diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm index 0bbff7b016..f2a2b2051a 100644 --- a/code/game/gamemodes/technomancer/spells/blink.dm +++ b/code/game/gamemodes/technomancer/spells/blink.dm @@ -47,7 +47,7 @@ if(L.buckled) L.buckled.unbuckle_mob() AM.forceMove(destination) - AM.visible_message("\The [AM] vanishes!") + AM.visible_message("\The [AM] vanishes!") to_chat(AM, "You suddenly appear somewhere else!") new /obj/effect/effect/sparks(destination) new /obj/effect/effect/sparks(starting) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 72eda8b94a..ddf4b9be33 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -236,7 +236,7 @@ return C.registered_name /proc/get_all_job_icons() //For all existing HUD icons - return joblist + list("Prisoner") + return joblist + alt_titles_with_icons + list("Prisoner") /obj/proc/GetJobName() //Used in secHUD icon generation var/obj/item/weapon/card/id/I = GetID() diff --git a/code/game/jobs/job/assistant_vr.dm b/code/game/jobs/job/assistant_vr.dm index f2fac2e72b..48f240d0ca 100644 --- a/code/game/jobs/job/assistant_vr.dm +++ b/code/game/jobs/job/assistant_vr.dm @@ -16,8 +16,7 @@ access = list() //See /datum/job/intern/get_access() minimal_access = list() //See /datum/job/intern/get_access() outfit_type = /decl/hierarchy/outfit/job/assistant/intern - alt_titles = list("Intern" = /datum/alt_title/intern, - "Apprentice Engineer" = /datum/alt_title/intern_eng, + alt_titles = list("Apprentice Engineer" = /datum/alt_title/intern_eng, "Medical Intern" = /datum/alt_title/intern_med, "Research Intern" = /datum/alt_title/intern_sci, "Security Cadet" = /datum/alt_title/intern_sec, @@ -28,9 +27,6 @@ another job. Though they are part of the crew, they have no real authority." timeoff_factor = 0 // Interns, noh -/datum/alt_title/intern - title = "Intern" - /datum/alt_title/intern_eng title = "Apprentice Engineer" title_blurb = "An Apprentice Engineer attempts to provide whatever the Engineering department needs. They are not proper Engineers, and are \ diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 73c15fd667..e53cd7818c 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -382,7 +382,7 @@ beaker = I user.drop_item() I.loc = src - user.visible_message("\The [user] adds \a [I] to \the [src].", "You add \a [I] to \the [src].") + user.visible_message("\The [user] adds \a [I] to \the [src].", "You add \a [I] to \the [src].") else to_chat(user, "\The [src] has a beaker already.") return diff --git a/code/game/machinery/airconditioner_vr.dm b/code/game/machinery/airconditioner_vr.dm index 4e9ce2d22b..ea54edfa2e 100644 --- a/code/game/machinery/airconditioner_vr.dm +++ b/code/game/machinery/airconditioner_vr.dm @@ -76,7 +76,7 @@ return if(draw_power(idle_power_usage) < idle_power_usage) - visible_message("\The [src] shuts down.") + visible_message("\The [src] shuts down.") turn_off() return diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 2d5d0a8747..e5e4b65ab4 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -110,7 +110,7 @@ to_chat(user, "You begin to unfasten \the [src]...") if(do_after(user, 40 * W.toolspeed)) user.visible_message( \ - "\The [user] unfastens \the [src].", \ + "\The [user] unfastens \the [src].", \ "You have unfastened \the [src].", \ "You hear ratchet.") new /obj/item/pipe_meter(get_turf(src)) diff --git a/code/game/machinery/bioprinter.dm b/code/game/machinery/bioprinter.dm index cc507dad27..fe2c027eb1 100644 --- a/code/game/machinery/bioprinter.dm +++ b/code/game/machinery/bioprinter.dm @@ -163,7 +163,7 @@ printing = 1 update_icon() - visible_message("\The [src] begins churning.") + visible_message("\The [src] begins churning.") sleep(print_delay) @@ -211,7 +211,7 @@ /obj/machinery/organ_printer/proc/can_print(var/choice, var/masscount = 0) var/biomass = get_biomass_volume() if(biomass < masscount) - visible_message("\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [masscount] needed.'") + visible_message("\The [src] displays a warning: 'Not enough biomass. [biomass] stored and [masscount] needed.'") return 0 if(!loaded_dna || !loaded_dna["donor"]) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 4cfdb16dd0..40ce15d2b0 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -1,38 +1,84 @@ +#define CHARGER_EMPTY 0 +#define CHARGER_WORKING 1 +#define CHARGER_DONE 2 + /obj/machinery/cell_charger name = "heavy-duty cell charger" desc = "A much more powerful version of the standard recharger that is specially designed for charging power cells." icon = 'icons/obj/power.dmi' - icon_state = "ccharger0" + icon_state = "recharger" anchored = 1 use_power = USE_POWER_IDLE + power_channel = EQUIP idle_power_usage = 5 active_power_usage = 60000 //60 kW. (this the power drawn when charging) - var/efficiency = 60000 //will provide the modified power rate when upgraded - power_channel = EQUIP - var/obj/item/weapon/cell/charging = null - var/chargelevel = -1 circuit = /obj/item/weapon/circuitboard/cell_charger + + var/efficiency = 60000 //will provide the modified power rate when upgraded + var/obj/item/weapon/cell/charging = null + var/charging_vis_flags = NONE + var/charge_state = CHARGER_EMPTY /obj/machinery/cell_charger/Initialize() . = ..() default_apply_parts() /obj/machinery/cell_charger/update_icon() - icon_state = "ccharger[charging ? 1 : 0]" + var/new_state + if(!anchored) + new_state = "[initial(icon_state)]4" + return - if(charging && !(stat & (BROKEN|NOPOWER))) + if(stat & (BROKEN|NOPOWER)) + new_state = "[initial(icon_state)]3" + return - var/newlevel = round(charging.percent() * 4.0 / 99) - //to_world("nl: [newlevel]") + switch(charge_state) + if(CHARGER_EMPTY) + new_state = "[initial(icon_state)]0" + if(CHARGER_WORKING) + new_state = "[initial(icon_state)]1" + if(CHARGER_DONE) + new_state = "[initial(icon_state)]2" + + if(icon_state != new_state) + icon_state = new_state - if(chargelevel != newlevel) +/obj/machinery/cell_charger/proc/insert_item(obj/item/W, mob/user) + if(!W || !user) + return - cut_overlays() - add_overlay("ccharger-o[newlevel]") + user.drop_item() + charging = W + charging.loc = src + charging_vis_flags = charging.vis_flags + charging.vis_flags = VIS_INHERIT_ID + vis_contents += charging + + charge_state = CHARGER_WORKING + update_icon() - chargelevel = newlevel + if((stat & (BROKEN|NOPOWER)) || !anchored) + update_use_power(USE_POWER_OFF) else - cut_overlays() + update_use_power(USE_POWER_ACTIVE) + +/obj/machinery/cell_charger/proc/remove_item(mob/user) + if(!charging || !user) + return + + vis_contents -= charging + charging.vis_flags = charging_vis_flags + user.put_in_hands(charging) + charging = null + + charge_state = CHARGER_EMPTY + update_icon() + + if((stat & (BROKEN|NOPOWER)) || !anchored) + update_use_power(USE_POWER_OFF) + else + update_use_power(USE_POWER_IDLE) /obj/machinery/cell_charger/examine(mob/user) . = ..() @@ -60,11 +106,8 @@ to_chat(user, "\The [src] blinks red as you try to insert [W]!") return - user.drop_item() - W.loc = src - charging = W + insert_item(W, user) user.visible_message("[user] inserts [charging] into [src].", "You insert [charging] into [src].") - chargelevel = -1 update_icon() else if(W.is_wrench()) if(charging) @@ -85,12 +128,8 @@ add_fingerprint(user) if(charging) - user.put_in_hands(charging) - charging.update_icon() + remove_item(user) user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].") - - charging = null - chargelevel = -1 update_icon() /obj/machinery/cell_charger/attack_ai(mob/user) @@ -109,6 +148,9 @@ charging.emp_act(severity) ..(severity) +/obj/machinery/cell_charger/power_change() + . = ..() + update_icon() /obj/machinery/cell_charger/process() //to_world("ccpt [charging] [stat]") @@ -116,16 +158,22 @@ update_use_power(USE_POWER_OFF) return - if(charging && !charging.fully_charged()) - charging.give(efficiency*CELLRATE) - update_use_power(USE_POWER_ACTIVE) - + if(charging) + if(!charging.fully_charged()) + charge_state = CHARGER_WORKING + charging.give(efficiency*CELLRATE) + update_use_power(USE_POWER_ACTIVE) + else + charge_state = CHARGER_DONE + update_use_power(USE_POWER_IDLE) update_icon() - else - update_use_power(USE_POWER_IDLE) /obj/machinery/cell_charger/RefreshParts() var/E = 0 for(var/obj/item/weapon/stock_parts/capacitor/C in component_parts) E += C.rating - efficiency = active_power_usage * (1+ (E - 1)*0.5) \ No newline at end of file + efficiency = active_power_usage * (1+ (E - 1)*0.5) + +#undef CHARGER_EMPTY +#undef CHARGER_WORKING +#undef CHARGER_DONE \ No newline at end of file diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm index 8e162b6d56..c6156b7a31 100644 --- a/code/game/machinery/computer/ai_core.dm +++ b/code/game/machinery/computer/ai_core.dm @@ -234,21 +234,21 @@ GLOBAL_LIST_BOILERPLATE(all_deactivated_AI_cores, /obj/structure/AIcore/deactiva return else if(W.is_wrench()) if(anchored) - user.visible_message("\The [user] starts to unbolt \the [src] from the plating...") + user.visible_message("\The [user] starts to unbolt \the [src] from the plating...") playsound(src, W.usesound, 50, 1) if(!do_after(user,40 * W.toolspeed)) - user.visible_message("\The [user] decides not to unbolt \the [src].") + user.visible_message("\The [user] decides not to unbolt \the [src].") return - user.visible_message("\The [user] finishes unfastening \the [src]!") + user.visible_message("\The [user] finishes unfastening \the [src]!") anchored = 0 return else - user.visible_message("\The [user] starts to bolt \the [src] to the plating...") + user.visible_message("\The [user] starts to bolt \the [src] to the plating...") playsound(src, W.usesound, 50, 1) if(!do_after(user,40 * W.toolspeed)) - user.visible_message("\The [user] decides not to bolt \the [src].") + user.visible_message("\The [user] decides not to bolt \the [src].") return - user.visible_message("\The [user] finishes fastening down \the [src]!") + user.visible_message("\The [user] finishes fastening down \the [src]!") anchored = 1 return else diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index e23aa459be..23a451eb69 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -48,7 +48,7 @@ var/confirm = tgui_alert(usr, "Do you really want to deactivate this guest pass? (you can't reactivate it)", "Confirm Deactivation", list("Yes", "No")) if(confirm == "Yes") //rip guest pass 3 - user.visible_message("\The [user] deactivates \the [src].") + user.visible_message("\The [user] deactivates \the [src].") icon_state = "guest-invalid" update_icon() expiration_time = world.time diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 616205563d..9b4994892a 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -47,7 +47,7 @@ playsound(src, S.attack_sound, 75, 1) take_damage(damage) else - visible_message("\The [user] bonks \the [src] harmlessly.") + visible_message("\The [user] bonks \the [src] harmlessly.") user.do_attack_animation(src) /obj/machinery/door/New() diff --git a/code/game/machinery/gear_dispenser.dm b/code/game/machinery/gear_dispenser.dm index 562c9906f4..a2723a2597 100644 --- a/code/game/machinery/gear_dispenser.dm +++ b/code/game/machinery/gear_dispenser.dm @@ -258,13 +258,7 @@ var/list/dispenser_presets = list() if((dispenser_flags & GD_UNIQUE) && !emagged) unique_dispense_list |= user.ckey - flick("[icon_state]-scan",src) - visible_message("\The [src] scans its user.", runemessage = "hums") - sleep(30) - flick("[icon_state]-dispense",src) - dispenser_flags |= GD_BUSY - sleep(15) - dispenser_flags &= ~GD_BUSY + animate_dispensing() // Blocks here until animation is done var/turf/T = get_turf(src) if(!(S && T)) // in case we got destroyed while we slept @@ -277,6 +271,15 @@ var/list/dispenser_presets = list() if(greet && user && !user.stat) // in case we got destroyed while we slept to_chat(user,"[S.name] dispensing processed. Have a good day.") +/obj/machinery/gear_dispenser/proc/animate_dispensing() + flick("[icon_state]-scan",src) + visible_message("\The [src] scans its user.", runemessage = "hums") + sleep(30) + flick("[icon_state]-dispense",src) + dispenser_flags |= GD_BUSY + sleep(15) + dispenser_flags &= ~GD_BUSY + /obj/machinery/gear_dispenser/emag_act(remaining_charges, mob/user, emag_source) . = ..() if(!emagged) @@ -292,10 +295,100 @@ var/list/dispenser_presets = list() icon_state = "suitdispenser2" /obj/machinery/gear_dispenser/suit_old - name = "duit dispenser" + name = "suit dispenser" desc = "An industrial U-Tak-It Dispenser unit designed to fetch all kinds of space suits. An older model." icon_state = "suitdispenser" +/obj/machinery/gear_dispenser/suit_fancy + name = "suit dispenser" + desc = "An industrial U-Tak-It Dispenser unit designed to fetch all kinds of space suits. A newer model." + icon_state = "suit_storage_map" + var/obj/effect/overlay/vis/door + var/datum/gear_disp/held_gear_disp + var/special_frame + +/obj/machinery/gear_dispenser/suit_fancy/Initialize(mapload) + . = ..() + door = add_vis_overlay("closed", layer = 4, unique = TRUE) + icon_state = "suit_storage" + if(special_frame) + add_overlay(special_frame) + +/obj/machinery/gear_dispenser/suit_fancy/Destroy() + qdel_null(door) + held_gear_disp = null + return ..() + +/obj/machinery/gear_dispenser/suit_fancy/power_change() + . = ..() + update_icon() + +/obj/machinery/gear_dispenser/suit_fancy/update_icon() + cut_overlays() + + if(special_frame) + add_overlay(special_frame) + + if(needs_power && inoperable()) + add_overlay("nopower") + else + add_overlay("light1") + + if(held_gear_disp) + add_overlay("fullsuit") + if(operable()) + add_overlay("light2") + +/obj/machinery/gear_dispenser/suit_fancy/attack_hand(var/mob/living/carbon/human/user) + if(held_gear_disp) + var/turf/T = get_turf(user) + var/list/spawned = held_gear_disp.spawn_gear(T, user) + for(var/obj/item/I in spawned) + user.put_in_hands(I) + to_chat(user, "You remove the equipment from [src].") + held_gear_disp = null + animate_close() + return + return ..() + +/obj/machinery/gear_dispenser/suit_fancy/dispense(var/datum/gear_disp/S,var/mob/living/carbon/human/user,var/greet=TRUE) + if(!S.amount && !(dispenser_flags & GD_UNLIMITED)) + to_chat(user,"There are no more [S.name]s left!") + dispenser_flags &= ~GD_BUSY + return 1 + else if(!(dispenser_flags & GD_UNLIMITED)) + S.amount-- + if((dispenser_flags & GD_NOGREED) && !emagged) + gear_distributed_to["[type]"] |= user.ckey + if((dispenser_flags & GD_UNIQUE) && !emagged) + unique_dispense_list |= user.ckey + + held_gear_disp = S + + animate_dispensing() + dispenser_flags &= ~GD_BUSY + + if(emagged) + emagged = FALSE + if(greet && user && !user.stat) // in case we got destroyed while we slept + to_chat(user,"[S.name] dispensing processed. Have a good day.") + +/obj/machinery/gear_dispenser/suit_fancy/animate_dispensing() + add_overlay("working") + sleep(5 SECONDS) + add_overlay("fullsuit") + door.icon_state = "open" + flick("anim_open", door) + sleep(10.5) + add_overlay("light2") + cut_overlay("working") + +/obj/machinery/gear_dispenser/suit_fancy/proc/animate_close() + cut_overlay("fullsuit") + cut_overlay("light2") + door.icon_state = "closed" + flick("anim_close", door) + // For fluff/custom items /obj/machinery/gear_dispenser/custom name = "personal gear dispenser" @@ -467,6 +560,13 @@ var/list/dispenser_presets = list() dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED one_setting = /datum/gear_disp/voidsuit/autolok +/obj/machinery/gear_dispenser/suit_fancy/autolok + name = "AutoLok Suit Dispenser" + desc = "An industrial U-Tak-It Dispenser unit designed to fetch a specific AutoLok mass produced suit." + dispenser_flags = GD_ONEITEM|GD_NOGREED|GD_UNLIMITED + one_setting = /datum/gear_disp/voidsuit/autolok + special_frame = "frame_grey" + // Adminbuse /obj/machinery/gear_dispenser/vv_get_dropdown() . = ..() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 06323a4f06..8cb44be78a 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -253,7 +253,7 @@ /obj/machinery/media/jukebox/proc/explode() walk_to(src,0) - src.visible_message("\the [src] blows apart!", 1) + src.visible_message("\The [src] blows apart!", 1) explosion(src.loc, 0, 0, 1, rand(1,2), 1) diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index 757a056713..3f61837a16 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -133,6 +133,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) light_power = 0.9 light_range = 2 light_color = "#00ff00" + vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature var/isbroken = 0 //1 if someone banged it with something heavy var/ispowered = 1 //starts powered, changes with power_change() //var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored. @@ -333,6 +334,7 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) // Creating Messages // data["channel_name"] = channel_name data["msg"] = msg + data["title"] = title data["photo_data"] = !!photo_data // Printing menu @@ -445,11 +447,11 @@ GLOBAL_LIST_BOILERPLATE(allCasters, /obj/machinery/newscaster) return TRUE if("set_new_message") - msg = sanitize(input(usr, "Write your Feed story", "Network Channel Handler", "") as message|null) + msg = sanitize(tgui_input_message(usr, "Write your Feed story", "Network Channel Handler")) return TRUE if("set_new_title") - title = sanitize(input(usr, "Enter your Feed title", "Network Channel Handler", "") as message|null) + title = sanitize(tgui_input_text(usr, "Enter your Feed title", "Network Channel Handler")) return TRUE if("set_attachment") diff --git a/code/game/machinery/oxygen_pump.dm b/code/game/machinery/oxygen_pump.dm index ee0d44ede0..3673462534 100644 --- a/code/game/machinery/oxygen_pump.dm +++ b/code/game/machinery/oxygen_pump.dm @@ -55,7 +55,7 @@ /obj/machinery/oxygen_pump/attack_hand(mob/user as mob) if((stat & MAINT) && tank) - user.visible_message("\The [user] removes \the [tank] from \the [src].", "You remove \the [tank] from \the [src].") + user.visible_message("\The [user] removes \the [tank] from \the [src].", "You remove \the [tank] from \the [src].") user.put_in_hands(tank) src.add_fingerprint(user) tank.add_fingerprint(user) @@ -69,7 +69,7 @@ tank.forceMove(src) breather.remove_from_mob(contained) contained.forceMove(src) - src.visible_message("\The [user] makes \the [contained] rapidly retract back into \the [src]!") + src.visible_message("\The [user] makes \the [contained] rapidly retract back into \the [src]!") if(breather.internals) breather.internals.icon_state = "internal0" breather = null @@ -140,7 +140,7 @@ user.drop_item() W.forceMove(src) tank = W - user.visible_message("\The [user] installs \the [tank] into \the [src].", "You install \the [tank] into \the [src].") + user.visible_message("\The [user] installs \the [tank] into \the [src].", "You install \the [tank] into \the [src].") src.add_fingerprint(user) if(istype(W, /obj/item/weapon/tank) && !stat) to_chat(user, "Please open the maintenance hatch first.") diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index c458e78ebf..2155b62bcb 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -567,7 +567,7 @@ take_damage(incoming_damage) S.do_attack_animation(src) return 1 - visible_message("\The [L] bonks \the [src]'s casing!") + visible_message("\The [L] bonks \the [src]'s casing!") return ..() /obj/machinery/porta_turret/emag_act(var/remaining_charges, var/mob/user) @@ -1007,7 +1007,7 @@ return var/obj/item/weapon/gun/energy/E = I //typecasts the item to an energy gun if(!user.unEquip(I)) - to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in \the [src]") return installation = I.type //installation becomes I.type gun_charge = E.power_supply.charge //the gun's charge is stored in gun_charge @@ -1028,7 +1028,7 @@ if(isprox(I)) build_step = 5 if(!user.unEquip(I)) - to_chat(user, "\the [I] is stuck to your hand, you cannot put it in \the [src]") + to_chat(user, "\The [I] is stuck to your hand, you cannot put it in \the [src]") return to_chat(user, "You add the prox sensor to the turret.") qdel(I) diff --git a/code/game/machinery/reagents/pump.dm b/code/game/machinery/reagents/pump.dm index 04916d4d9b..b73ce06a4a 100644 --- a/code/game/machinery/reagents/pump.dm +++ b/code/game/machinery/reagents/pump.dm @@ -107,7 +107,7 @@ if(Output.get_pairing()) reagents.trans_to_holder(Output.reagents, Output.reagents.maximum_volume) if(prob(5)) - visible_message("\The [src] gurgles as it exports fluid.") + visible_message("\The [src] gurgles as it exports fluid.") if(!on) return @@ -148,7 +148,7 @@ on = 1 update_icon() if(loud) - visible_message("\The [src] turns on.") + visible_message("\The [src] turns on.") return 1 /obj/machinery/pump/proc/turn_off(var/loud = 0) @@ -156,7 +156,7 @@ set_light(0, 0) update_icon() if(loud) - visible_message("\The [src] shuts down.") + visible_message("\The [src] shuts down.") if(!on) return TRUE diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 761fbaa910..03a8ab1665 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -27,12 +27,13 @@ var/list/obj/machinery/requests_console/allConsoles = list() desc = "A console intended to send requests to different departments on the station." anchored = 1 icon = 'icons/obj/terminals_vr.dmi' //VOREStation Edit - icon_state = "req_comp0" + icon_state = "req_comp_0" layer = ABOVE_WINDOW_LAYER circuit = /obj/item/weapon/circuitboard/request blocks_emissive = NONE light_power = 0.25 light_color = "#00ff00" + vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department var/list/message_log = list() //List of all messages var/departmentType = 0 //Bitflag. Zero is reply-only. Map currently uses raw numbers instead of defines. @@ -221,8 +222,7 @@ var/list/obj/machinery/requests_console/allConsoles = list() for (var/obj/machinery/requests_console/Console in allConsoles) if(Console.department == department) Console.newmessagepriority = 0 - Console.icon_state = "req_comp0" - Console.set_light(1) + Console.update_icon() if(tempScreen == RCS_MAINMENU) reset_message() screen = tempScreen diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 20be7d52ca..c4d90818fc 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -12,11 +12,11 @@ deploy_path = /obj/machinery/power/supply_beacon/supermatter /obj/item/supply_beacon/attack_self(var/mob/user) - user.visible_message("\The [user] begins setting up \the [src].") + user.visible_message("\The [user] begins setting up \the [src].") if(!do_after(user, deploy_time)) return var/obj/S = new deploy_path(get_turf(user)) - user.visible_message("\The [user] deploys \the [S].") + user.visible_message("\The [user] deploys \the [S].") user.unEquip(src) qdel(src) diff --git a/code/game/machinery/virtual_reality/ar_console.dm b/code/game/machinery/virtual_reality/ar_console.dm index 5067c47600..6cf182e106 100644 --- a/code/game/machinery/virtual_reality/ar_console.dm +++ b/code/game/machinery/virtual_reality/ar_console.dm @@ -25,7 +25,7 @@ if(stat & (BROKEN)) if(occupant) go_out() - visible_message("\The [src] emits a low droning sound, before the pod door clicks open.") + visible_message("\The [src] emits a low droning sound, before the pod door clicks open.") return else if(eject_dead && occupant && occupant.stat == DEAD) visible_message("\The [src] sounds an alarm, swinging its hatch open.") diff --git a/code/game/machinery/virtual_reality/vr_console.dm b/code/game/machinery/virtual_reality/vr_console.dm index c529d45da1..0f10b19e7f 100644 --- a/code/game/machinery/virtual_reality/vr_console.dm +++ b/code/game/machinery/virtual_reality/vr_console.dm @@ -40,7 +40,7 @@ if(stat & (NOPOWER|BROKEN)) if(occupant) go_out() - visible_message("\The [src] emits a low droning sound, before the pod door clicks open.") + visible_message("\The [src] emits a low droning sound, before the pod door clicks open.") return else if(eject_dead && occupant && occupant.stat == DEAD) // If someone dies somehow while inside, spit them out. visible_message("\The [src] sounds an alarm, swinging its hatch open.") diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index c540bcf2c0..d472b73363 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1964,7 +1964,7 @@ if(ishuman(occupant)) GrantActions(occupant, 1) else - visible_message("\The [usr] starts to climb into [src.name]") + visible_message("\The [usr] starts to climb into [src.name]") if(enter_after(40,usr)) if(!src.occupant) moved_inside(usr) @@ -2604,11 +2604,11 @@ var/obj/item/mecha_parts/mecha_equipment/tool/passenger/P = passengers[pname] var/mob/occupant = P.occupant - user.visible_message("\The [user] begins opening the hatch on \the [P]...", "You begin opening the hatch on \the [P]...") + user.visible_message("\The [user] begins opening the hatch on \the [P]...", "You begin opening the hatch on \the [P]...") if (!do_after(user, 40)) return - user.visible_message("\The [user] opens the hatch on \the [P] and removes [occupant]!", "You open the hatch on \the [P] and remove [occupant]!") + user.visible_message("\The [user] opens the hatch on \the [P] and removes [occupant]!", "You open the hatch on \the [P] and remove [occupant]!") P.go_out() P.log_message("[occupant] was removed.") return @@ -2795,7 +2795,7 @@ if(prob(temp_deflect_chance))//Deflected src.log_append_to_last("Armor saved.") src.occupant_message("\The [user]'s attack is stopped by the armor.") - visible_message("\The [user] rebounds off [src.name]'s armor!") + visible_message("\The [user] rebounds off [src.name]'s armor!") user.attack_log += text("\[[time_stamp()]\] attacked [src.name]") playsound(src, 'sound/weapons/slash.ogg', 50, 1, -1) diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index dcbf63688a..d6b21ef674 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -236,7 +236,7 @@ last_itch = world.time to_chat(O.owner, "Your [O.name] itches...") else if(prob(1)) - src.visible_message("\The [src] skitters.") + src.visible_message("\The [src] skitters.") if(amount_grown >= 0) amount_grown += rand(0,2) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 403bb39f15..8c527334c0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -241,14 +241,15 @@ return var/old_loc = src.loc - src.pickup(user) if (istype(src.loc, /obj/item/weapon/storage)) var/obj/item/weapon/storage/S = src.loc - S.remove_from_storage(src) - + if(!S.remove_from_storage(src)) + return + + src.pickup(user) src.throwing = 0 if (src.loc == user) - if(!user.unEquip(src, null, src)) + if(!user.unEquip(src)) return else if(isliving(src.loc)) @@ -942,3 +943,8 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out. // Like the above, but used for RPED sorting of parts. /obj/item/proc/rped_rating() return get_rating() + +/// How are you described if at all when in pockets (or other 'usually not visible' places) +/obj/item/proc/pocket_description(mob/haver, mob/examiner) + return null // most things are hidden + \ No newline at end of file diff --git a/code/game/objects/items/devices/defib.dm b/code/game/objects/items/devices/defib.dm index 6e9cff65e9..90783c803c 100644 --- a/code/game/objects/items/devices/defib.dm +++ b/code/game/objects/items/devices/defib.dm @@ -86,7 +86,7 @@ reattach_paddles(user) else if(istype(W, /obj/item/weapon/cell)) if(bcell) - to_chat(user, "\the [src] already has a cell.") + to_chat(user, "\The [src] already has a cell.") else if(!user.unEquip(W)) return @@ -392,7 +392,7 @@ user.visible_message("\The [user] begins to place [src] on [H]'s chest.", "You begin to place [src] on [H]'s chest...") if(!do_after(user, 30, H)) return - user.visible_message("\The [user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest.") + user.visible_message("\The [user] places [src] on [H]'s chest.", "You place [src] on [H]'s chest.") playsound(src, 'sound/machines/defib_charge.ogg', 50, 0) var/error = can_defib(H) diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index facc87ae64..70e0d3d768 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -41,7 +41,7 @@ if(repairing) to_chat(user, "\The [src] is already being repaired!") return - user.visible_message("\The [user] starts trying to repair \the [src]'s bulb.") + user.visible_message("\The [user] starts trying to repair \the [src]'s bulb.") repairing = TRUE if(do_after(user, (40 SECONDS + rand(0, 20 SECONDS)) * W.toolspeed) && can_repair) if(prob(30)) @@ -50,7 +50,7 @@ update_icon() playsound(src, W.usesound, 50, 1) else - user.visible_message("\The [user] fails to repair \the [src].") + user.visible_message("\The [user] fails to repair \the [src].") repairing = FALSE else ..() diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 54e69c45fa..9595f1ba80 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -115,7 +115,7 @@ if(!vision) to_chat(user, "You can't find any [H.species.vision_organ ? H.species.vision_organ : "eyes"] on [H]!") - user.visible_message("\The [user] directs [src] to [M]'s eyes.", \ + user.visible_message("\The [user] directs [src] to [M]'s eyes.", \ "You direct [src] to [M]'s eyes.") if(H != user) //can't look into your own eyes buster if(M.stat == DEAD || M.blinded) //mob is dead or fully blind diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index 820229fd83..e299a4d390 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -49,7 +49,7 @@ playsound(src, O.usesound, 100, 1) - user.visible_message("\The [user] opens \the [src] and modifies \the [O].","You open \the [src] and modify \the [O].") + user.visible_message("\The [user] opens \the [src] and modifies \the [O].","You open \the [src] and modify \the [O].") I.refit_for_species(target_species) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 746fbd5eab..6fe9aea398 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -32,7 +32,7 @@ tool_qualities = list(TOOL_MULTITOOL) /obj/item/device/multitool/attack_self(mob/living/user) - var/choice = tgui_alert(usr, "What do you want to do with \the [src]?","Multitool Menu", "Switch Mode", list("Clear Buffers", "Cancel")) + var/choice = tgui_alert(usr, "What do you want to do with \the [src]?", "Multitool Menu", list("Switch Mode", "Clear Buffers", "Cancel")) switch(choice) if("Cancel") to_chat(user,"You lower \the [src].") diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm index 860b8dadd3..fb9f0dea79 100644 --- a/code/game/objects/items/devices/radio/intercom.dm +++ b/code/game/objects/items/devices/radio/intercom.dm @@ -11,6 +11,7 @@ light_color = "#00ff00" light_power = 0.25 blocks_emissive = NONE + vis_flags = VIS_HIDE // They have an emissive that looks bad in openspace due to their wall-mounted nature var/circuit = /obj/item/weapon/circuitboard/intercom var/number = 0 var/wiresexposed = 0 diff --git a/code/game/objects/items/devices/scanners_vr.dm b/code/game/objects/items/devices/scanners_vr.dm index 4280545743..b0c928e5a2 100644 --- a/code/game/objects/items/devices/scanners_vr.dm +++ b/code/game/objects/items/devices/scanners_vr.dm @@ -270,7 +270,7 @@ var/global/mob/living/carbon/human/dummy/mannequin/sleevemate_mob if(istype(target, /mob/living/carbon/human)) var/mob/living/carbon/human/H = target if(H.resleeve_lock && stored_mind.loaded_from_ckey != H.resleeve_lock) - to_chat(usr,"\[H] is protected from impersonation!") + to_chat(usr,"\The [H] is protected from impersonation!") return usr.visible_message("[usr] begins uploading someone's mind into [target]!","You begin uploading a mind into [target]!") diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 179170fcea..629a383433 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -108,7 +108,7 @@ return 1 else var/available = get_amount() - user.visible_message("\The [user] starts bandaging [M]'s [affecting.name].", \ + user.visible_message("\The [user] starts bandaging [M]'s [affecting.name].", \ "You start bandaging [M]'s [affecting.name]." ) var/used = 0 for (var/datum/wound/W in affecting.wounds) @@ -131,10 +131,10 @@ break if (W.current_stage <= W.max_bleeding_stage) - user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ + user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ "You bandage \a [W.desc] on [M]'s [affecting.name]." ) else - user.visible_message("\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].", \ + user.visible_message("\The [user] places a bandage over \a [W.desc] on [M]'s [affecting.name].", \ "You place a bandage over \a [W.desc] on [M]'s [affecting.name]." ) W.bandage() playsound(src, pick(apply_sounds), 25) @@ -177,7 +177,7 @@ return 1 else var/available = get_amount() - user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ + user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ "You start treating [M]'s [affecting.name]." ) var/used = 0 for (var/datum/wound/W in affecting.wounds) @@ -200,14 +200,14 @@ break if (W.current_stage <= W.max_bleeding_stage) - user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ + user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \ "You bandage \a [W.desc] on [M]'s [affecting.name]." ) //H.add_side_effect("Itch") else if (W.damage_type == BRUISE) - user.visible_message("\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].", \ + user.visible_message("\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].", \ "You place a bruise patch over \a [W.desc] on [M]'s [affecting.name]." ) else - user.visible_message("\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \ + user.visible_message("\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \ "You place a bandaid over \a [W.desc] on [M]'s [affecting.name]." ) W.bandage() // W.disinfect() // VOREStation - Tech1 should not disinfect @@ -250,7 +250,7 @@ to_chat(user, "The wounds on [M]'s [affecting.name] have already been salved.") return 1 else - user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \ + user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \ "You start salving the wounds on [M]'s [affecting.name]." ) if(!do_mob(user, M, 10, exclusive = TRUE)) to_chat(user, "You must stand still to salve wounds.") @@ -290,7 +290,7 @@ return 1 else var/available = get_amount() - user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ + user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \ "You start treating [M]'s [affecting.name]." ) var/used = 0 for (var/datum/wound/W in affecting.wounds) @@ -312,13 +312,13 @@ break if (W.current_stage <= W.max_bleeding_stage) - user.visible_message("\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \ + user.visible_message("\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \ "You clean and seal \a [W.desc] on [M]'s [affecting.name]." ) else if (W.damage_type == BRUISE) - user.visible_message("\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].", \ + user.visible_message("\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].", \ "You place a medical patch over \a [W.desc] on [M]'s [affecting.name]." ) else - user.visible_message("\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].", \ + user.visible_message("\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].", \ "You smear some bioglue over \a [W.desc] on [M]'s [affecting.name]." ) W.bandage() W.disinfect() @@ -358,7 +358,7 @@ to_chat(user, "The wounds on [M]'s [affecting.name] have already been salved.") return 1 else - user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \ + user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \ "You start salving the wounds on [M]'s [affecting.name]." ) if(!do_mob(user, M, 10, exclusive = TRUE)) to_chat(user, "You must stand still to salve wounds.") diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm index 7868d2d3ab..100fac14c2 100644 --- a/code/game/objects/items/weapons/autopsy.dm +++ b/code/game/objects/items/weapons/autopsy.dm @@ -177,7 +177,7 @@ if(!S.open) to_chat(user, "You have to cut [S] open first!") return - M.visible_message("\The [user] scans the wounds on [M]'s [S.name] with [src]") + M.visible_message("\The [user] scans the wounds on [M]'s [S.name] with [src]") src.add_data(S) diff --git a/code/game/objects/items/weapons/canes.dm b/code/game/objects/items/weapons/canes.dm index ea0a5fe62a..ff76a1cc4b 100644 --- a/code/game/objects/items/weapons/canes.dm +++ b/code/game/objects/items/weapons/canes.dm @@ -97,7 +97,7 @@ /obj/item/weapon/cane/white/collapsible/attack_self(mob/user as mob) on = !on if(on) - user.visible_message("\The [user] extends the white cane.",\ + user.visible_message("\The [user] extends the white cane.",\ "You extend the white cane.",\ "You hear an ominous click.") icon_state = "whitecane1out" @@ -106,7 +106,7 @@ force = 5 attack_verb = list("smacked", "struck", "cracked", "beaten") else - user.visible_message("\The [user] collapses the white cane.",\ + user.visible_message("\The [user] collapses the white cane.",\ "You collapse the white cane.",\ "You hear a click.") icon_state = "whitecane1in" diff --git a/code/game/objects/items/weapons/circuitboards/computer/research.dm b/code/game/objects/items/weapons/circuitboards/computer/research.dm index 791cd51cdc..8de61a2b91 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/research.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/research.dm @@ -9,7 +9,7 @@ /obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob) if(I.is_screwdriver()) playsound(src, I.usesound, 50, 1) - user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") + user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") if(build_path == /obj/machinery/computer/rdconsole/core) name = T_BOARD("RD Console - Robotics") build_path = /obj/machinery/computer/rdconsole/robotics diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm index 8049096292..4305ecf180 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm @@ -14,7 +14,7 @@ /obj/item/weapon/circuitboard/rdserver/attackby(obj/item/I as obj, mob/user as mob) if(I.is_screwdriver()) playsound(src, I.usesound, 50, 1) - user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") + user.visible_message("\The [user] adjusts the jumper on \the [src]'s access protocol pins.", "You adjust the jumper on the access protocol pins.") if(build_path == /obj/machinery/r_n_d/server/core) name = T_BOARD("RD Console - Robotics") build_path = /obj/machinery/r_n_d/server/robotics diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index cb3184a7f6..2162941ac3 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -11,6 +11,8 @@ var/stage = 0 var/state = 0 var/path = 0 + /// If TRUE, grenade is permanently sealed when fully assembled, useful for things like off-the-shelf grenades. + var/sealed = FALSE var/obj/item/device/assembly_holder/detonator = null var/list/beakers = new/list() var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle) @@ -93,7 +95,8 @@ if(active && prob(95)) to_chat(user, "You trigger the assembly!") detonate() - return + else if(sealed) + to_chat(user, "This grenade lacks a way to disassemble it.") else to_chat(user, "You unlock the assembly.") playsound(src, W.usesound, 50, -3) @@ -200,8 +203,10 @@ /obj/item/weapon/grenade/chem_grenade/metalfoam name = "metal-foam grenade" desc = "Used for emergency sealing of air breaches." + icon_state = "foam" path = 1 stage = 2 + sealed = TRUE /obj/item/weapon/grenade/chem_grenade/metalfoam/Initialize() . = ..() @@ -216,13 +221,14 @@ beakers += B1 beakers += B2 - icon_state = initial(icon_state) +"_locked" /obj/item/weapon/grenade/chem_grenade/incendiary name = "incendiary grenade" desc = "Used for clearing rooms of living things." + icon_state = "incendiary" path = 1 stage = 2 + sealed = TRUE /obj/item/weapon/grenade/chem_grenade/incendiary/Initialize() . = ..() @@ -239,13 +245,13 @@ beakers += B1 beakers += B2 - icon_state = initial(icon_state) +"_locked" /obj/item/weapon/grenade/chem_grenade/antiweed name = "weedkiller grenade" desc = "Used for purging large areas of invasive plant species. Contents under pressure. Do not directly inhale contents." path = 1 stage = 2 + sealed = TRUE /obj/item/weapon/grenade/chem_grenade/antiweed/Initialize() . = ..() @@ -266,8 +272,10 @@ /obj/item/weapon/grenade/chem_grenade/cleaner name = "cleaner grenade" desc = "BLAM!-brand foaming space cleaner. In a special applicator for rapid cleaning of wide areas." + icon_state = "cleaner" stage = 2 path = 1 + sealed = TRUE /obj/item/weapon/grenade/chem_grenade/cleaner/Initialize() . = ..() @@ -282,13 +290,14 @@ beakers += B1 beakers += B2 - icon_state = initial(icon_state) +"_locked" /obj/item/weapon/grenade/chem_grenade/teargas name = "tear gas grenade" desc = "Concentrated Capsaicin. Contents under pressure. Use with caution." + icon_state = "teargas" stage = 2 path = 1 + sealed = TRUE /obj/item/weapon/grenade/chem_grenade/teargas/Initialize() . = ..() @@ -305,4 +314,4 @@ beakers += B1 beakers += B2 - icon_state = initial(icon_state) +"_locked" \ No newline at end of file + \ No newline at end of file diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index 68867e03cd..f2cdabd5f8 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -301,7 +301,7 @@ var/last_chew = 0 return 1 /obj/item/weapon/handcuffs/legcuffs/bola/dropped() - visible_message("\The [src] falls apart!") + visible_message("\The [src] falls apart!") qdel(src) /obj/item/weapon/handcuffs/legcuffs/bola/place_legcuffs(var/mob/living/carbon/target, var/mob/user) @@ -313,7 +313,7 @@ var/last_chew = 0 return 0 if(!H.has_organ_for_slot(slot_legcuffed)) - H.visible_message("\The [src] slams into [H], but slides off!") + H.visible_message("\The [src] slams into [H], but slides off!") src.dropped() return 0 diff --git a/code/game/objects/items/weapons/material/kitchen.dm b/code/game/objects/items/weapons/material/kitchen.dm index ea16a3be20..349c212499 100644 --- a/code/game/objects/items/weapons/material/kitchen.dm +++ b/code/game/objects/items/weapons/material/kitchen.dm @@ -75,6 +75,26 @@ /obj/item/weapon/material/kitchen/utensil/fork/plastic default_material = "plastic" +/obj/item/weapon/material/kitchen/utensil/foon + name = "foon" + desc = "It's a foon. The forgotten cousin of the spork." + icon_state = "foon" + sharp = TRUE + edge = FALSE + +/obj/item/weapon/material/kitchen/utensil/foon/plastic + default_material = "plastic" + +/obj/item/weapon/material/kitchen/utensil/spork + name = "spork" + desc = "It's a spork. The (un)holy merger of a spoon and fork." + icon_state = "spork" + sharp = TRUE + edge = FALSE + +/obj/item/weapon/material/kitchen/utensil/spork/plastic + default_material = "plastic" + /obj/item/weapon/material/kitchen/utensil/spoon name = "spoon" desc = "It's a spoon. You can see your own upside-down face in it." diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 3086ceae31..44ffb44e39 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -123,6 +123,16 @@ icon_state = "render" applies_material_colour = 0 +/obj/item/weapon/material/knife/table + name = "table knife" + icon = 'icons/obj/kitchen.dmi' + icon_state = "knife_table" + sharp = FALSE // blunted tip + force_divisor = 0.1 + +/obj/item/weapon/material/knife/table/plastic + default_material = "plastic" + /obj/item/weapon/material/knife/butch name = "butcher's cleaver" icon_state = "butch" diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index 9cb6f78daa..f9b0c11a17 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -333,7 +333,7 @@ var/list/tape_roll_applications = list() /obj/item/tape/attack_hand(mob/user as mob) if (user.a_intent == I_HELP && src.allowed(user)) - user.show_viewers("\The [user] lifts \the [src], allowing passage.") + user.show_viewers("\The [user] lifts \the [src], allowing passage.") for(var/obj/item/tape/T in gettapeline()) T.lift(100) //~10 seconds else @@ -377,7 +377,7 @@ var/list/tape_roll_applications = list() if(user.a_intent == I_HELP) to_chat(user, "You refrain from breaking \the [src].") return - user.visible_message("\The [user] breaks \the [src]!","You break \the [src].") + user.visible_message("\The [user] breaks \the [src]!","You break \the [src].") for (var/obj/item/tape/T in gettapeline()) if(T == src) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index b296c58b96..e6370499a0 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -75,57 +75,69 @@ /obj/item/weapon/storage/backpack/cultpack name = "trophy rack" desc = "It's useful for both carrying extra gear and proudly declaring your insanity." - icon_state = "cultpack" + icon_state = "backpack_cult" /obj/item/weapon/storage/backpack/clown name = "Giggles von Honkerton" desc = "It's a backpack made by Honk! Co." - icon_state = "clownpack" + icon_state = "backpack_clown" + +/obj/item/weapon/storage/backpack/white + name = "white backpack" + icon_state = "backpack_white" + +/obj/item/weapon/storage/backpack/fancy + name = "fancy backpack" + icon_state = "backpack_fancy" + +/obj/item/weapon/storage/backpack/military + name = "military backpack" + icon_state = "backpack_military" /obj/item/weapon/storage/backpack/medic name = "medical backpack" desc = "It's a backpack especially designed for use in a sterile environment." - icon_state = "medicalpack" + icon_state = "backpack_medical" /obj/item/weapon/storage/backpack/security name = "security backpack" desc = "It's a very robust backpack." - icon_state = "securitypack" + icon_state = "backpack_security" /obj/item/weapon/storage/backpack/captain name = "site manager's backpack" desc = "It's a special backpack made exclusively for officers." - icon_state = "captainpack" + icon_state = "backpack_captain" /obj/item/weapon/storage/backpack/industrial name = "industrial backpack" desc = "It's a tough backpack for the daily grind of station life." - icon_state = "engiepack" + icon_state = "backpack_industrial" /obj/item/weapon/storage/backpack/toxins name = "laboratory backpack" desc = "It's a light backpack modeled for use in laboratories and other scientific institutions." - icon_state = "toxpack" + icon_state = "backpack_purple" /obj/item/weapon/storage/backpack/hydroponics name = "herbalist's backpack" desc = "It's a green backpack with many pockets to store plants and tools in." - icon_state = "hydpack" + icon_state = "backpack_hydro" /obj/item/weapon/storage/backpack/genetics name = "geneticist backpack" desc = "It's a backpack fitted with slots for diskettes and other workplace tools." - icon_state = "genpack" + icon_state = "backpack_blue" /obj/item/weapon/storage/backpack/virology name = "sterile backpack" desc = "It's a sterile backpack able to withstand different pathogens from entering its fabric." - icon_state = "viropack" + icon_state = "backpack_green" /obj/item/weapon/storage/backpack/chemistry name = "chemistry backpack" desc = "It's an orange backpack which was designed to hold beakers, pill bottles and bottles." - icon_state = "chempack" + icon_state = "backpack_orange" /* * Duffle Types @@ -162,7 +174,7 @@ /obj/item/weapon/storage/backpack/dufflebag/med name = "medical dufflebag" desc = "A large dufflebag for holding extra medical supplies." - icon_state = "duffle_med" + icon_state = "duffle_medical" /obj/item/weapon/storage/backpack/dufflebag/emt name = "EMT dufflebag" @@ -172,17 +184,27 @@ /obj/item/weapon/storage/backpack/dufflebag/sec name = "security dufflebag" desc = "A large dufflebag for holding extra security supplies and ammunition." - icon_state = "duffle_sec" + icon_state = "duffle_security" /obj/item/weapon/storage/backpack/dufflebag/eng name = "industrial dufflebag" desc = "A large dufflebag for holding extra tools and supplies." - icon_state = "duffle_eng" + icon_state = "duffle_industrial" /obj/item/weapon/storage/backpack/dufflebag/sci name = "science dufflebag" desc = "A large dufflebag for holding circuits and beakers." - icon_state = "duffle_sci" + icon_state = "duffle_science" + +/obj/item/weapon/storage/backpack/dufflebag/drone + name = "drone dufflebag" + desc = "A large dufflebag for holding small robots? Or maybe it's one used by robots!" + icon_state = "duffle_drone" + +/obj/item/weapon/storage/backpack/dufflebag/cursed + name = "cursed dufflebag" + desc = "That probably shouldn't be moving..." + icon_state = "duffle_cursed" /* * Satchel Types @@ -192,7 +214,6 @@ name = "leather satchel" desc = "It's a very fancy satchel made with fine leather." icon_state = "satchel" - item_state_slots = list(slot_r_hand_str = "briefcase", slot_l_hand_str = "briefcase") /obj/item/weapon/storage/backpack/satchel/withwallet starts_with = list(/obj/item/weapon/storage/wallet/random) @@ -200,67 +221,70 @@ /obj/item/weapon/storage/backpack/satchel/norm name = "satchel" desc = "A trendy looking satchel." - icon_state = "satchel-norm" + icon_state = "satchel_grey" + +/obj/item/weapon/storage/backpack/satchel/white + name = "white satchel" + icon_state = "satchel_white" + +/obj/item/weapon/storage/backpack/satchel/fancy + name = "fancy satchel" + icon_state = "satchel_fancy" + +/obj/item/weapon/storage/backpack/satchel/military + name = "military satchel" + icon_state = "satchel_military" /obj/item/weapon/storage/backpack/satchel/eng name = "industrial satchel" desc = "A tough satchel with extra pockets." - icon_state = "satchel-eng" - item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack") + icon_state = "satchel_industrial" /obj/item/weapon/storage/backpack/satchel/med name = "medical satchel" desc = "A sterile satchel used in medical departments." - icon_state = "satchel-med" - item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") + icon_state = "satchel_medical" /obj/item/weapon/storage/backpack/satchel/vir name = "virologist satchel" desc = "A sterile satchel with virologist colours." - icon_state = "satchel-vir" - item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack") + icon_state = "satchel_green" /obj/item/weapon/storage/backpack/satchel/chem name = "chemist satchel" desc = "A sterile satchel with chemist colours." - icon_state = "satchel-chem" - item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack") + icon_state = "satchel_orange" /obj/item/weapon/storage/backpack/satchel/gen name = "geneticist satchel" desc = "A sterile satchel with geneticist colours." - icon_state = "satchel-gen" - item_state_slots = list(slot_r_hand_str = "genpack", slot_l_hand_str = "genpack") + icon_state = "satchel_blue" /obj/item/weapon/storage/backpack/satchel/tox name = "scientist satchel" desc = "Useful for holding research materials." - icon_state = "satchel-tox" - item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack") + icon_state = "satchel_purple" /obj/item/weapon/storage/backpack/satchel/sec name = "security satchel" desc = "A robust satchel for security related needs." - icon_state = "satchel-sec" - item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack") + icon_state = "satchel_security" /obj/item/weapon/storage/backpack/satchel/hyd name = "hydroponics satchel" desc = "A green satchel for plant related work." - icon_state = "satchel_hyd" + icon_state = "satchel_hydro" /obj/item/weapon/storage/backpack/satchel/cap name = "site manager's satchel" desc = "An exclusive satchel for officers." - icon_state = "satchel-cap" - item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack") + icon_state = "satchel_captain" //ERT backpacks. /obj/item/weapon/storage/backpack/ert name = "emergency response team backpack" desc = "A spacious backpack with lots of pockets, used by members of the Emergency Response Team." icon_state = "ert_commander" - item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack") //Commander /obj/item/weapon/storage/backpack/ert/commander @@ -292,59 +316,106 @@ /obj/item/weapon/storage/backpack/messenger name = "messenger bag" desc = "A sturdy backpack worn over one shoulder." - icon_state = "courierbag" - item_state_slots = list(slot_r_hand_str = "backpack", slot_l_hand_str = "backpack") + icon_state = "courier" + item_state_slots = list(slot_r_hand_str = "satchel_grey", slot_l_hand_str = "satchel_grey") /obj/item/weapon/storage/backpack/messenger/chem name = "chemistry messenger bag" desc = "A serile backpack worn over one shoulder. This one is in Chemsitry colors." - icon_state = "courierbagchem" - item_state_slots = list(slot_r_hand_str = "chempack", slot_l_hand_str = "chempack") + icon_state = "courier_chemistry" + item_state_slots = list(slot_r_hand_str = "satchel_orange", slot_l_hand_str = "satchel_orange") /obj/item/weapon/storage/backpack/messenger/med name = "medical messenger bag" desc = "A sterile backpack worn over one shoulder used in medical departments." - icon_state = "courierbagmed" - item_state_slots = list(slot_r_hand_str = "medicalpack", slot_l_hand_str = "medicalpack") + icon_state = "courier_medical" + item_state_slots = list(slot_r_hand_str = "satchel_medical", slot_l_hand_str = "satchel_medical") /obj/item/weapon/storage/backpack/messenger/viro name = "virology messenger bag" desc = "A sterile backpack worn over one shoulder. This one is in Virology colors." - icon_state = "courierbagviro" - item_state_slots = list(slot_r_hand_str = "viropack", slot_l_hand_str = "viropack") + icon_state = "courier_virology" + item_state_slots = list(slot_r_hand_str = "satchel_green", slot_l_hand_str = "satchel_green") /obj/item/weapon/storage/backpack/messenger/tox name = "research messenger bag" desc = "A backpack worn over one shoulder. Useful for holding science materials." - icon_state = "courierbagtox" - item_state_slots = list(slot_r_hand_str = "toxpack", slot_l_hand_str = "toxpack") + icon_state = "courier_toxins" + item_state_slots = list(slot_r_hand_str = "satchel_purple", slot_l_hand_str = "satchel_purple") /obj/item/weapon/storage/backpack/messenger/com name = "command messenger bag" desc = "A special backpack worn over one shoulder. This one is made specifically for officers." - icon_state = "courierbagcom" - item_state_slots = list(slot_r_hand_str = "captainpack", slot_l_hand_str = "captainpack") + icon_state = "courier_captain" + item_state_slots = list(slot_r_hand_str = "satchel_captain", slot_l_hand_str = "satchel_captain") /obj/item/weapon/storage/backpack/messenger/engi name = "engineering messenger bag" - icon_state = "courierbagengi" - item_state_slots = list(slot_r_hand_str = "engiepack", slot_l_hand_str = "engiepack") + icon_state = "courier_industrial" + item_state_slots = list(slot_r_hand_str = "satchel_industrial", slot_l_hand_str = "satchel_industrial") /obj/item/weapon/storage/backpack/messenger/hyd name = "hydroponics messenger bag" desc = "A backpack worn over one shoulder. This one is designed for plant-related work." - icon_state = "courierbaghyd" + icon_state = "courier_hydro" + item_state_slots = list(slot_r_hand_str = "satchel_hydro", slot_l_hand_str = "satchel_hydro") /obj/item/weapon/storage/backpack/messenger/sec name = "security messenger bag" desc = "A tactical backpack worn over one shoulder. This one is in Security colors." - icon_state = "courierbagsec" - item_state_slots = list(slot_r_hand_str = "securitypack", slot_l_hand_str = "securitypack") + icon_state = "courier_security" + item_state_slots = list(slot_r_hand_str = "satchel_security", slot_l_hand_str = "satchel_security") /obj/item/weapon/storage/backpack/messenger/black - icon_state = "courierbagblk" + icon_state = "courier_black" +/* + * Sport Bags + */ + +/obj/item/weapon/storage/backpack/sport + name = "sports backpack" + icon_state = "backsport" + +/obj/item/weapon/storage/backpack/sport/white + name = "white sports backpack" + icon_state = "backsport_white" + +/obj/item/weapon/storage/backpack/sport/fancy + name = "fancy sports backpack" + icon_state = "backsport_fancy" + +/obj/item/weapon/storage/backpack/sport/vir + name = "virologist sports backpack" + desc = "A sterile sports backpack with virologist colours." + icon_state = "backsport_green" + +/obj/item/weapon/storage/backpack/sport/chem + name = "chemist sports backpack" + desc = "A sterile sports backpack with chemist colours." + icon_state = "backsport_orange" + +/obj/item/weapon/storage/backpack/sport/gen + name = "geneticist sports backpack" + desc = "A sterile sports backpack with geneticist colours." + icon_state = "backsport_blue" + +/obj/item/weapon/storage/backpack/sport/tox + name = "scientist sports backpack" + desc = "Useful for holding research materials." + icon_state = "backsport_purple" + +/obj/item/weapon/storage/backpack/sport/sec + name = "security sports backpack" + desc = "A robust sports backpack for security related needs." + icon_state = "backsport_security" + +/obj/item/weapon/storage/backpack/sport/hyd + name = "hydroponics sports backpack" + desc = "A green sports backpack for plant related work." + icon_state = "backsport_hydro" + //Purses /obj/item/weapon/storage/backpack/purse name = "purse" @@ -394,29 +465,29 @@ return if(!parachute) //This packs the parachute - H.visible_message("\The [H] starts to pack \the [src]!", \ + H.visible_message("\The [H] starts to pack \the [src]!", \ "You start to pack \the [src]!", \ "You hear the shuffling of cloth.") if(do_after(H, 50)) - H.visible_message("\The [H] finishes packing \the [src]!", \ + H.visible_message("\The [H] finishes packing \the [src]!", \ "You finish packing \the [src]!", \ "You hear the shuffling of cloth.") parachute = TRUE else - H.visible_message("\The [src] gives up on packing \the [src]!", \ + H.visible_message("\The [src] gives up on packing \the [src]!", \ "You give up on packing \the [src]!") return else //This unpacks the parachute - H.visible_message("\The [src] starts to unpack \the [src]!", \ + H.visible_message("\The [src] starts to unpack \the [src]!", \ "You start to unpack \the [src]!", \ "You hear the shuffling of cloth.") if(do_after(H, 25)) - H.visible_message("\The [src] finishes unpacking \the [src]!", \ + H.visible_message("\The [src] finishes unpacking \the [src]!", \ "You finish unpacking \the [src]!", \ "You hear the shuffling of cloth.") parachute = FALSE else - H.visible_message("\The [src] decides not to unpack \the [src]!", \ + H.visible_message("\The [src] decides not to unpack \the [src]!", \ "You decide not to unpack \the [src]!") return diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 3cf872effb..40d6cfbe23 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -53,6 +53,16 @@ icon_state = "trashbag2" else icon_state = "trashbag3" +/obj/item/weapon/storage/bag/trash/holding + name = "trash bag of holding" + desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage." + icon_state = "bluetrashbag" + origin_tech = list(TECH_BLUESPACE = 3) + max_w_class = ITEMSIZE_NORMAL + max_storage_space = ITEMSIZE_COST_NORMAL * 10 // Slightly less than BoH + +/obj/item/weapon/storage/bag/trash/holding/update_icon() + return // ----------------------------- // Plastic Bag diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 4d06d52314..673f54340e 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -236,7 +236,7 @@ if(istype(W, /obj/item/clothing/mask/smokable/cigarette)) var/obj/item/clothing/mask/smokable/cigarette/C = W reagents.trans_to_obj(C, (reagents.total_volume/contents.len)) - ..() + return ..() /obj/item/weapon/storage/fancy/cigarettes/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) if(!istype(M, /mob)) @@ -343,7 +343,7 @@ var/obj/item/clothing/mask/smokable/cigarette/cigar/C = W if(!istype(C)) return reagents.trans_to_obj(C, (reagents.total_volume/contents.len)) - ..() + return ..() /obj/item/weapon/storage/rollingpapers name = "rolling paper pack" diff --git a/code/game/objects/items/weapons/storage/pouches.dm b/code/game/objects/items/weapons/storage/pouches.dm new file mode 100644 index 0000000000..38d0660894 --- /dev/null +++ b/code/game/objects/items/weapons/storage/pouches.dm @@ -0,0 +1,186 @@ +#define INVENTORY_POUCH_SPACE ITEMSIZE_COST_SMALL*4 // 25% the size of a backpack for normal size + +// Pouches for small storage in pocket slots +/obj/item/weapon/storage/pouch + name = "storage pouch (medium)" + desc = "This storage pouch can be used to provide some additional storage for quick access." + icon = 'icons/obj/clothing/pouches.dmi' + slot_flags = SLOT_POCKET + drop_sound = 'sound/items/drop/backpack.ogg' + pickup_sound = 'sound/items/pickup/backpack.ogg' + + icon_state = "medium_generic" + max_w_class = ITEMSIZE_NORMAL + max_storage_space = INVENTORY_POUCH_SPACE + can_hold = null + pocketable = TRUE + + var/insert_delay = 0 + var/remove_delay = 2 SECONDS + +/obj/item/weapon/storage/pouch/stall_insertion(obj/item/W, mob/user) + // No delay if you have the pouch in your hands + if(user.get_active_hand() == src || user.get_inactive_hand() == src) + return TRUE // Skip delay + + if(insert_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE)) + return FALSE // Moved or whatever + + if(W in src) + return TRUE // Item is still inside + + return FALSE + +/obj/item/weapon/storage/pouch/stall_removal(obj/item/W, mob/user) + // No delay if you have the pouch in your hands + if(user.get_active_hand() == src || user.get_inactive_hand() == src) + return TRUE // Skip delay + + if(remove_delay && !do_after(user, 2 SECONDS, src, needhand = TRUE, exclusive = TRUE)) + return FALSE // Moved or whatever + + if(W in src) + return TRUE // Item is still inside + + return FALSE + +/obj/item/weapon/storage/pouch/pocket_description(mob/haver, mob/examiner) + return "[src]" + +/obj/item/weapon/storage/pouch/large + name = "storage pouch (large)" + desc = "This storage pouch can be used to provide a good amount of additional storage for quick access." + icon_state = "large_generic" + max_storage_space = ITEMSIZE_COST_SMALL*6 + +/obj/item/weapon/storage/pouch/small + name = "storage pouch (small)" + desc = "This storage pouch can be used to provide a small amount of additional storage for quick access." + icon_state = "small_generic" + max_storage_space = ITEMSIZE_COST_SMALL*2 + +/obj/item/weapon/storage/pouch/ammo + name = "storage pouch (ammo)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold ammunition and cells." + icon_state = "ammo" + max_storage_space = INVENTORY_POUCH_SPACE + can_hold = list(/obj/item/ammo_magazine, /obj/item/ammo_casing, /obj/item/weapon/cell/device/weapon) + +/obj/item/weapon/storage/pouch/eng_tool + name = "storage pouch (tools)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold tools." + icon_state = "engineering_tool" + max_storage_space = INVENTORY_POUCH_SPACE + can_hold = list( + /obj/item/weapon/tool, + /obj/item/weapon/weldingtool, + /obj/item/device/multitool, + /obj/item/device/flashlight, + /obj/item/device/t_scanner, + /obj/item/device/analyzer, + /obj/item/clothing/glasses, + /obj/item/clothing/gloves, + ) + +/obj/item/weapon/storage/pouch/eng_supply + name = "storage pouch (supplies)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold engineering supplies." + icon_state = "engineering_supply" + max_storage_space = INVENTORY_POUCH_SPACE + can_hold = list( + /obj/item/weapon/cell/device, + /obj/item/stack/cable_coil, + /obj/item/taperoll, + /obj/item/weapon/extinguisher/mini, + /obj/item/weapon/tape_roll + ) + +/obj/item/weapon/storage/pouch/eng_parts + name = "storage pouch (parts)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold machinery components." + icon_state = "part_pouch" + max_storage_space = INVENTORY_POUCH_SPACE + can_hold = list( + /obj/item/weapon/stock_parts, + /obj/item/stack/cable_coil, + /obj/item/weapon/circuitboard + ) + +/obj/item/weapon/storage/pouch/medical + name = "storage pouch (medical)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold medical supplies." + icon_state = "medical_supply" + max_storage_space = INVENTORY_POUCH_SPACE + can_hold = list( + /obj/item/device/healthanalyzer, + /obj/item/weapon/dnainjector, + /obj/item/weapon/reagent_containers/dropper, + /obj/item/weapon/reagent_containers/glass/beaker, + /obj/item/weapon/reagent_containers/glass/bottle, + /obj/item/weapon/reagent_containers/pill, + /obj/item/weapon/reagent_containers/syringe, + /obj/item/weapon/storage/quickdraw/syringe_case, + /obj/item/weapon/storage/pill_bottle, + /obj/item/stack/medical, + /obj/item/weapon/reagent_containers/hypospray, + /obj/item/weapon/storage/quickdraw/syringe_case + ) + +/obj/item/weapon/storage/pouch/flares + name = "storage pouch (flares)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can only hold flares and glowsticks." + icon_state = "flare" + storage_slots = 5 + can_hold = list(/obj/item/device/flashlight/flare, /obj/item/device/flashlight/glowstick) +/obj/item/weapon/storage/pouch/flares/full_flare + starts_with = list(/obj/item/device/flashlight/flare = 5) +/obj/item/weapon/storage/pouch/flares/full_glow + starts_with = list(/obj/item/device/flashlight/glowstick = 5) + +/obj/item/weapon/storage/pouch/flares/update_icon() + cut_overlays() + if(contents.len) + add_overlay("flare_[contents.len]") + ..() + +/obj/item/weapon/storage/pouch/holster + name = "storage pouch (holster)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one normal sized weapon." + icon_state = "pistol_holster" + storage_slots = 1 + can_hold = list(/obj/item/weapon/gun) + remove_delay = 0 +/obj/item/weapon/storage/pouch/holster/full_stunrevolver + starts_with = list(/obj/item/weapon/gun/energy/stunrevolver) +/obj/item/weapon/storage/pouch/holster/full_taser + starts_with = list(/obj/item/weapon/gun/energy/taser) + +/obj/item/weapon/storage/pouch/holster/update_icon() + cut_overlays() + if(contents.len) + add_overlay("pistol_layer") + ..() + +/obj/item/weapon/storage/pouch/baton + name = "storage pouch (baton)" + desc = "This storage pouch can be used to provide some additional storage for quick access. Can hold one standard baton." + icon_state = "baton_holster" + storage_slots = 1 + can_hold = list(/obj/item/weapon/melee/baton) + remove_delay = 0 +/obj/item/weapon/storage/pouch/baton/full + starts_with = list(/obj/item/weapon/melee/baton) + +/obj/item/weapon/storage/pouch/baton/update_icon() + cut_overlays() + if(contents.len) + add_overlay("baton_layer") + ..() + +/obj/item/weapon/storage/pouch/holding + name = "storage pouch of holding" + desc = "This storage pouch can be used to provide some additional storage for quick access. Seems to use extradimensional storage!" + icon_state = "holdingpouch" + max_storage_space = INVENTORY_STANDARD_SPACE // Size of a normal backpack, compared to a normal BoH, which is way bigger + +#undef INVENTORY_POUCH_SPACE \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index c0414036b5..8bc546a87a 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -49,6 +49,8 @@ var/use_sound = "rustle" //sound played when used. null for no sound. var/list/starts_with //Things to spawn on the box on spawn var/empty //Mapper override to spawn an empty version of a container that usually has stuff + /// If you can use this storage while in a pocket + var/pocketable = FALSE /obj/item/weapon/storage/Initialize() . = ..() @@ -101,6 +103,7 @@ count-- new newtype(src) starts_with = null //Reduce list count. + update_icon() calibrate_size() @@ -473,6 +476,9 @@ /obj/item/weapon/storage/proc/handle_item_insertion(obj/item/W as obj, prevent_warning = 0) if(!istype(W)) return 0 + if(!stall_insertion(W, usr)) // Can sleep here and delay removal for slow storage + return 0 + if(usr) usr.remove_from_mob(W,target = src) //If given a target, handles forceMove() W.on_enter_storage(src) @@ -506,6 +512,9 @@ /obj/item/weapon/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location) if(!istype(W)) return 0 + if(!stall_removal(W, usr)) // Can sleep here and delay removal for slow storage + return 0 + if(istype(src, /obj/item/weapon/storage/fancy)) var/obj/item/weapon/storage/fancy/F = src F.update_icon(1) @@ -534,6 +543,14 @@ update_icon() return 1 +/// Called before insertion completes, allowing you to delay or cancel it +/obj/item/weapon/storage/proc/stall_insertion(obj/item/W, mob/user) + return TRUE + +/// Called before removal completes, allowing you to delay or cancel it +/obj/item/weapon/storage/proc/stall_removal(obj/item/W, mob/user) + return TRUE + //This proc is called when you want to place an item into the storage item. /obj/item/weapon/storage/attackby(obj/item/W as obj, mob/user as mob) ..() @@ -579,7 +596,7 @@ return /obj/item/weapon/storage/attack_hand(mob/user as mob) - if(ishuman(user)) + if(ishuman(user) && !pocketable) var/mob/living/carbon/human/H = user if(H.l_store == src && !H.get_active_hand()) //Prevents opening if it's in a pocket. H.put_in_hands(src) diff --git a/code/game/objects/items/weapons/swords_axes_etc.dm b/code/game/objects/items/weapons/swords_axes_etc.dm index 6fc53235b5..0ff349f476 100644 --- a/code/game/objects/items/weapons/swords_axes_etc.dm +++ b/code/game/objects/items/weapons/swords_axes_etc.dm @@ -67,7 +67,7 @@ force = 15//quite robust attack_verb = list("smacked", "struck", "slapped") else - user.visible_message("\The [user] collapses their telescopic baton.",\ + user.visible_message("\The [user] collapses their telescopic baton.",\ "You collapse the baton.",\ "You hear a click.") icon_state = "telebaton0" diff --git a/code/game/objects/items/weapons/tools/weldingtool.dm b/code/game/objects/items/weapons/tools/weldingtool.dm index 8500af8180..30056ed7a4 100644 --- a/code/game/objects/items/weapons/tools/weldingtool.dm +++ b/code/game/objects/items/weapons/tools/weldingtool.dm @@ -508,7 +508,7 @@ if(mounted_pack.loc != src.loc && src.loc != mounted_pack) mounted_pack.return_nozzle() - visible_message("\The [src] retracts to its fueltank.") + visible_message("\The [src] retracts to its fueltank.") if(get_fuel() <= get_max_fuel()) mounted_pack.reagents.trans_to_obj(src, 1) diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index 3183d26fe7..48e62010cc 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -71,8 +71,8 @@ /obj/random/powercell name = "random powercell" desc = "This is a random powercell." - icon = 'icons/obj/power.dmi' - icon_state = "cell" + icon = 'icons/obj/power_cells.dmi' + icon_state = "random" /obj/random/powercell/item_to_spawn() return pick(prob(40);/obj/item/weapon/cell, @@ -133,8 +133,8 @@ /obj/random/tech_supply name = "random tech supply" desc = "This is a random piece of technology supplies." - icon = 'icons/obj/power.dmi' - icon_state = "cell" + icon = 'icons/obj/power_cells.dmi' + icon_state = "random" spawn_nothing_percentage = 25 /obj/random/tech_supply/item_to_spawn() @@ -955,3 +955,26 @@ prob(3);/obj/item/clothing/accessory/poncho/thermal/green, prob(3);/obj/item/clothing/accessory/poncho/thermal/purple, prob(3);/obj/item/clothing/accessory/poncho/thermal/blue) + +/obj/random/pouch + name = "Random Storage Pouch" + desc = "This is a random storage pouch." + icon = 'icons/obj/clothing/pouches.dmi' + icon_state = "random" + +/obj/random/pouch/item_to_spawn() + return pick( + prob(10);/obj/item/weapon/storage/pouch, // medium + prob(3);/obj/item/weapon/storage/pouch/large, + prob(8);/obj/item/weapon/storage/pouch/small, + prob(5);/obj/item/weapon/storage/pouch/ammo, + prob(5);/obj/item/weapon/storage/pouch/eng_tool, + prob(5);/obj/item/weapon/storage/pouch/eng_supply, + prob(5);/obj/item/weapon/storage/pouch/eng_parts, + prob(5);/obj/item/weapon/storage/pouch/medical, + prob(5);/obj/item/weapon/storage/pouch/flares/full_flare, + prob(5);/obj/item/weapon/storage/pouch/flares/full_glow, + prob(5);/obj/item/weapon/storage/pouch/holster, + prob(5);/obj/item/weapon/storage/pouch/baton/full, + prob(1);/obj/item/weapon/storage/pouch/holding + ) diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 87332c776f..f023f3e395 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -7,7 +7,7 @@ var/climb_delay = 3.5 SECONDS var/breakable var/parts - var/list/climbers = list() + var/list/climbers var/block_turf_edges = FALSE // If true, turf edge icons will not be made on the turf this occupies. var/list/connections = list("0", "0", "0", "0") @@ -35,7 +35,7 @@ if(H.species.can_shred(user)) attack_generic(user,1,"slices") - if(climbers.len && !(user in climbers)) + if(LAZYLEN(climbers) && !(user in climbers)) user.visible_message("[user.name] shakes \the [src].", \ "You shake \the [src].") structure_shaken() @@ -103,21 +103,21 @@ return usr.visible_message("[user] starts climbing onto \the [src]!") - climbers |= user + LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? climb_delay * 0.6 : climb_delay))) - climbers -= user + LAZYREMOVE(climbers, user) return if (!can_climb(user, post_climb_check=1)) - climbers -= user + LAZYREMOVE(climbers, user) return usr.forceMove(get_turf(src)) if (get_turf(user) == get_turf(src)) usr.visible_message("[user] climbs onto \the [src]!") - climbers -= user + LAZYREMOVE(climbers, user) /obj/structure/proc/structure_shaken() for(var/mob/living/M in climbers) @@ -204,7 +204,7 @@ if(can_visually_connect_to(S)) if(S.can_visually_connect()) if(propagate) - //S.update_connections() //Not here + S.update_connections() S.update_icon() dirs += get_dir(src, S) diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm new file mode 100644 index 0000000000..5324e21576 --- /dev/null +++ b/code/game/objects/structures/artstuff.dm @@ -0,0 +1,561 @@ + +/////////// +// EASEL // +/////////// + +/obj/structure/easel + name = "easel" + desc = "Only for the finest of art!" + icon = 'icons/obj/artstuff.dmi' + icon_state = "easel" + density = TRUE + //resistance_flags = FLAMMABLE + //max_integrity = 60 + var/obj/item/canvas/painting = null + +//Adding canvases +/obj/structure/easel/attackby(obj/item/I, mob/user, params) + if(istype(I, /obj/item/canvas)) + var/obj/item/canvas/canvas = I + user.drop_from_inventory(canvas) + painting = canvas + canvas.forceMove(get_turf(src)) + canvas.layer = layer+0.1 + user.visible_message("[user] puts \the [canvas] on \the [src].","You place \the [canvas] on \the [src].") + else + return ..() + + +//Stick to the easel like glue +/obj/structure/easel/Move() + var/turf/T = get_turf(src) + . = ..() + if(painting && painting.loc == T) //Only move if it's near us. + painting.forceMove(get_turf(src)) + else + painting = null + +/obj/item/canvas + name = "canvas" + desc = "Draw out your soul on this canvas!" + icon = 'icons/obj/artstuff.dmi' + icon_state = "11x11" + //flags_1 = UNPAINTABLE_1 + //resistance_flags = FLAMMABLE + var/width = 11 + var/height = 11 + var/list/grid + var/canvas_color = "#ffffff" //empty canvas color + var/used = FALSE + var/painting_name = "Untitled Artwork" //Painting name, this is set after framing. + var/finalized = FALSE //Blocks edits + var/author_name + var/author_ckey + var/icon_generated = FALSE + var/icon/generated_icon + ///boolean that blocks persistence from saving it. enabled from printing copies, because we do not want to save copies. + var/no_save = FALSE + + /// From the origin of the turf we're on, where should the left of the canvas pixel be + var/framed_offset_x = 11 + /// From the origin of the turf we're on, where should the bottom of the canvas be + var/framed_offset_y = 10 + /// The frame takes the painting's offset, then moves this X offset + var/frame_offset_x = -1 + /// The frame takes the painting's offset, then moves this Y offset + var/frame_offset_y = -1 + + pixel_x = 10 + pixel_y = 9 + +/obj/item/canvas/Initialize() + . = ..() + reset_grid() + +/obj/item/canvas/proc/reset_grid() + grid = new/list(width,height) + for(var/x in 1 to width) + for(var/y in 1 to height) + grid[x][y] = canvas_color + +/obj/item/canvas/attack_self(mob/user) + . = ..() + tgui_interact(user) + +/obj/item/canvas/dropped(mob/user) + pixel_x = initial(pixel_x) + pixel_y = initial(pixel_y) + return ..() + +/obj/item/canvas/tgui_state(mob/user) + if(finalized) + return GLOB.tgui_physical_obscured_state + else + return GLOB.tgui_default_state + +/obj/item/canvas/tgui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "Canvas", name) + ui.set_autoupdate(FALSE) + ui.open() + +/obj/item/canvas/attackby(obj/item/I, mob/living/user, params) + if(istype(I, /obj/item/paint_palette)) + var/choice = tgui_alert(user, "Adjusting the base color of this canvas will replace ALL pixels with the selected color. Are you sure?", "Confirm Color Fill", list("Yes", "No")) + if(choice == "No") + return + var/basecolor = input(user, "Select a base color for the canvas:", "Base Color", canvas_color) as null|color + if(basecolor && Adjacent(user, src) && Adjacent(user, I)) + canvas_color = basecolor + reset_grid() + user.visible_message("[user] smears paint on [src], covering the entire thing in paint.", "You smear paint on [src], changing the color of the entire thing.", runemessage = "smears paint") + update_appearance() + return + + if(user.a_intent == I_HELP) + tgui_interact(user) + else + return ..() + +/obj/item/canvas/tgui_data(mob/user) + . = ..() + .["grid"] = grid + .["name"] = painting_name + .["finalized"] = finalized + +/obj/item/canvas/examine(mob/user) + . = ..() + tgui_interact(user) + +/obj/item/canvas/tgui_act(action, params) + . = ..() + if(. || finalized) + return + var/mob/user = usr + switch(action) + if("paint") + var/obj/item/I = user.get_active_hand() + var/color = get_paint_tool_color(I) + if(!color) + return FALSE + var/x = text2num(params["x"]) + var/y = text2num(params["y"]) + grid[x][y] = color + used = TRUE + update_appearance() + . = TRUE + if("finalize") + . = TRUE + if(!finalized) + finalize(user) + +/obj/item/canvas/proc/finalize(mob/user) + finalized = TRUE + author_name = user.real_name + author_ckey = user.ckey + generate_proper_overlay() + try_rename(user) + +/obj/item/canvas/proc/update_appearance() + cut_overlays() + if(icon_generated) + var/mutable_appearance/detail = mutable_appearance(generated_icon) + detail.pixel_x = 1 + detail.pixel_y = 1 + add_overlay(detail) + return + if(!used) + return + + var/mutable_appearance/detail = mutable_appearance(icon, "[icon_state]wip") + detail.pixel_x = 1 + detail.pixel_y = 1 + add_overlay(detail) + +/obj/item/canvas/proc/generate_proper_overlay() + if(icon_generated) + return + var/png_filename = "data/persistent/paintings/temp_painting.png" + var/result = rustg_dmi_create_png(png_filename,"[width]","[height]",get_data_string()) + if(result) + CRASH("Error generating painting png : [result]") + generated_icon = new(png_filename) + icon_generated = TRUE + update_appearance() + +/obj/item/canvas/proc/get_data_string() + var/list/data = list() + for(var/y in 1 to height) + for(var/x in 1 to width) + data += grid[x][y] + return data.Join("") + +//Todo make this element ? +/obj/item/canvas/proc/get_paint_tool_color(obj/item/I) + if(!I) + return + if(istype(I, /obj/item/paint_brush)) + var/obj/item/paint_brush/P = I + return P.selected_color + else if(istype(I, /obj/item/weapon/pen/crayon)) + var/obj/item/weapon/pen/crayon/crayon = I + return crayon.colour + else if(istype(I, /obj/item/weapon/pen)) + var/obj/item/weapon/pen/P = I + switch(P.colour) + if("black") + return "#000000" + if("blue") + return "#0000ff" + if("red") + return "#ff0000" + return P.colour + else if(istype(I, /obj/item/weapon/soap) || istype(I, /obj/item/weapon/reagent_containers/glass/rag)) + return canvas_color + +/obj/item/canvas/proc/try_rename(mob/user) + var/new_name = stripped_input(user,"What do you want to name the painting?") + if(new_name != painting_name && new_name && CanUseTopic(user, GLOB.tgui_physical_state)) + painting_name = new_name + SStgui.update_uis(src) + +/obj/item/canvas/nineteen_nineteen + icon_state = "19x19" + width = 19 + height = 19 + pixel_x = 5 + pixel_y = 10 + framed_offset_x = 8 + framed_offset_y = 9 + +/obj/item/canvas/twentythree_nineteen + icon_state = "23x19" + width = 23 + height = 19 + pixel_x = 4 + pixel_y = 10 + framed_offset_x = 6 + framed_offset_y = 8 + +/obj/item/canvas/twentythree_twentythree + icon_state = "23x23" + width = 23 + height = 23 + pixel_x = 5 + pixel_y = 9 + framed_offset_x = 5 + framed_offset_y = 6 + +/obj/item/canvas/twentyfour_twentyfour + name = "ai universal standard canvas" + //desc = "Besides being very large, the AI can accept these as a display from their internal database after you've hung it up." // Not yet + icon_state = "24x24" + width = 24 + height = 24 + pixel_x = 2 + pixel_y = 2 + framed_offset_x = 4 + framed_offset_y = 4 + frame_offset_x = -2 + frame_offset_y = -2 + +/obj/item/paint_brush + name = "artist's paintbrush" + desc = "When you really want to put together a masterpiece!" + description_info = "Hit this on a palette to set the color, and use it on a canvas to paint with that color." + icon = 'icons/obj/artstuff.dmi' + icon_state = "brush" + var/selected_color = "#000000" + var/image/color_drop + var/hud_level = FALSE + +/obj/item/paint_brush/Initialize() + . = ..() + color_drop = image(icon, null, "brush_color") + color_drop.color = selected_color + +// When picked up +/obj/item/paint_brush/hud_layerise() + . = ..() + hud_level = TRUE + update_paint() + +// When put down +/obj/item/paint_brush/reset_plane_and_layer() + . = ..() + hud_level = FALSE + update_paint() + +/obj/item/paint_brush/proc/update_paint(var/new_color) + if(new_color) + selected_color = new_color + color_drop.color = new_color + + cut_overlays() + if(hud_level) + add_overlay(color_drop) + +/obj/item/paint_palette + name = "artist's palette" + desc = "Helps to have a paintbrush, too." + description_info = "You can hit this on a canvas to set the entire canvas color (but note that it will wipe out any works in progress). You can hit a paintbrush on this to set the color." + icon = 'icons/obj/artstuff.dmi' + icon_state = "palette" + +/obj/item/paint_palette/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/paint_brush)) + var/obj/item/paint_brush/P = W + var/newcolor = input(user, "Select a new paint color:", "Paint Palette", P.selected_color) as null|color + if(newcolor && Adjacent(user, P) && Adjacent(user, src)) + P.update_paint(newcolor) + else + return ..() + +/obj/item/frame/painting + name = "painting frame" + desc = "The perfect showcase for your favorite deathtrap memories." + icon = 'icons/obj/decals.dmi' + //custom_materials = list(/datum/material/wood = 2000) + //flags_1 = NONE + icon_state = "frame-empty" + +/obj/item/frame/painting/try_build(turf/on_wall, mob/user as mob) + if(get_dist(on_wall, user) > 1) + return + var/ndir = get_dir(on_wall, user) + if (!(ndir in cardinal)) + return + if(!istype(on_wall, /turf/simulated/wall)) + to_chat(user, "Frame cannot be placed on this spot.") + return + new /obj/structure/sign/painting(get_turf(user), ndir, TRUE) + qdel(src) + +/obj/structure/sign/painting + name = "Painting" + desc = "Art or \"Art\"? You decide." + icon = 'icons/obj/decals.dmi' + icon_state = "frame-empty" + var/base_icon_state = "frame" + //custom_materials = list(/datum/material/wood = 2000) + //buildable_sign = FALSE + ///Canvas we're currently displaying. + var/obj/item/canvas/current_canvas + ///Description set when canvas is added. + var/desc_with_canvas + var/persistence_id + +//Presets for art gallery mapping, for paintings to be shared across stations +/obj/structure/sign/painting/public + name = "\improper Public Painting Exhibit mounting" + desc = "For art pieces hung by the public." + desc_with_canvas = "A piece of art (or \"art\"). Anyone could've hung it." + persistence_id = "public" + +/obj/structure/sign/painting/library_secure + name = "\improper Curated Painting Exhibit mounting" + desc = "For masterpieces hand-picked by the curator." + desc_with_canvas = "A masterpiece hand-picked by the curator, supposedly." + persistence_id = "library" + req_one_access = list(access_library) + +/obj/structure/sign/painting/chapel_secure + name = "\improper Religious Painting Exhibit mounting" + desc = "For masterpieces hand-picked by the chaplain." + desc_with_canvas = "A masterpiece hand-picked by the chaplain, supposedly." + persistence_id = "chapel" + req_one_access = list(access_chapel_office) + +/obj/structure/sign/painting/library_private // keep your smut away from prying eyes, or non-librarians at least + name = "\improper Private Painting Exhibit mounting" + desc = "For art pieces deemed too subversive or too illegal to be shared outside of curators." + desc_with_canvas = "A painting hung away from lesser minds." + persistence_id = "library_private" + req_one_access = list(access_library) + +/obj/structure/sign/painting/Initialize(mapload, dir, building) + . = ..() + if(persistence_id) + SSpersistence.painting_frames += src + if(dir) + set_dir(dir) + if(building) + pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30) + pixel_y = (dir & 3)? (dir ==1 ? -30 : 30) : 0 + +/obj/structure/sign/painting/Destroy() + . = ..() + SSpersistence.painting_frames -= src + +/obj/structure/sign/painting/attackby(obj/item/I, mob/user, params) + if(!current_canvas && istype(I, /obj/item/canvas)) + frame_canvas(user, I) + else if(current_canvas && current_canvas.painting_name == initial(current_canvas.painting_name) && istype(I,/obj/item/weapon/pen)) + try_rename(user) + else if(current_canvas && I.is_wirecutter()) + unframe_canvas(user) + else + return ..() + +/obj/structure/sign/painting/examine(mob/user) + . = ..() + if(persistence_id) + . += "Any painting placed here will be archived at the end of the shift." + if(current_canvas) + current_canvas.tgui_interact(user) + . += "Use wirecutters to remove the painting." + +/obj/structure/sign/painting/proc/frame_canvas(mob/user,obj/item/canvas/new_canvas) + if(!allowed(user)) + to_chat(user, "You're not comfortable framing this canvas in such a prestigious spot!") + return + if(user.drop_from_inventory(new_canvas, src)) + current_canvas = new_canvas + if(!current_canvas.finalized) + current_canvas.finalize(user) + to_chat(user,"You frame [current_canvas].") + update_appearance() + +/obj/structure/sign/painting/proc/unframe_canvas(mob/living/user) + if(current_canvas) + current_canvas.forceMove(drop_location()) + current_canvas = null + to_chat(user, "You remove the painting from the frame.") + update_appearance() + +/obj/structure/sign/painting/proc/try_rename(mob/user) + if(current_canvas.painting_name == initial(current_canvas.painting_name)) + current_canvas.try_rename(user) + +/obj/structure/sign/painting/proc/update_appearance() + name = current_canvas ? "painting - [current_canvas.painting_name]" : initial(name) + desc = current_canvas ? desc_with_canvas : initial(desc) + icon_state = "[base_icon_state]-[current_canvas?.generated_icon ? "hidden" : "empty"]" + + cut_overlays() + + if(!current_canvas?.generated_icon) + return + + . = list() + var/mutable_appearance/MA = mutable_appearance(current_canvas.generated_icon) + MA.pixel_x = current_canvas.framed_offset_x + MA.pixel_y = current_canvas.framed_offset_y + . += MA + var/mutable_appearance/frame = mutable_appearance(current_canvas.icon,"[current_canvas.icon_state]frame") + frame.pixel_x = current_canvas.framed_offset_x + current_canvas.frame_offset_x + frame.pixel_y = current_canvas.framed_offset_y + current_canvas.frame_offset_y + . += frame + + add_overlay(.) + +/obj/item/canvas/proc/fill_grid_from_icon(icon/I) + var/h = I.Height() + 1 + for(var/x in 1 to width) + for(var/y in 1 to height) + grid[x][y] = I.GetPixel(x,h-y) + +/** + * Loads a painting from SSpersistence. Called globally by said subsystem when it inits + * + * Deleting paintings leaves their json, so this proc will remove the json and try again if it finds one of those. + */ +/obj/structure/sign/painting/proc/load_persistent() + if(!persistence_id || !SSpersistence.paintings) + return + var/list/painting_category = list() + for (var/list/P in SSpersistence.paintings) + if(P["persistence_id"] == persistence_id) + painting_category[++painting_category.len] = P + var/list/painting + while(!painting) + if(!length(painting_category)) + return //aborts loading anything this category has no usable paintings + var/list/chosen = pick(painting_category) + if(!fexists("data/persistent/paintings/[persistence_id]/[chosen["md5"]].png")) //shitmin deleted this art, lets remove json entry to avoid errors + painting_category -= list(chosen) + continue //and try again + painting = chosen + var/title = painting["title"] + var/author_name = painting["author"] + var/author_ckey = painting["ckey"] + var/png = "data/persistent/paintings/[persistence_id]/[painting["md5"]].png" + if(!title) + title = "Untitled Artwork" //legacy artwork allowed null names which was bad for the json, lets fix that + painting["title"] = title + var/icon/I = new(png) + var/obj/item/canvas/new_canvas + var/w = I.Width() + var/h = I.Height() + for(var/T in typesof(/obj/item/canvas)) + new_canvas = T + if(initial(new_canvas.width) == w && initial(new_canvas.height) == h) + new_canvas = new T(src) + break + new_canvas.fill_grid_from_icon(I) + new_canvas.generated_icon = I + new_canvas.icon_generated = TRUE + new_canvas.finalized = TRUE + new_canvas.painting_name = title + new_canvas.author_name = author_name + new_canvas.author_ckey = author_ckey + new_canvas.name = "painting - [title]" + current_canvas = new_canvas + update_appearance() + +/obj/structure/sign/painting/proc/save_persistent() + if(!persistence_id || !current_canvas || current_canvas.no_save) + return + if(sanitize_filename(persistence_id) != persistence_id) + stack_trace("Invalid persistence_id - [persistence_id]") + return + if(!current_canvas.painting_name) + current_canvas.painting_name = "Untitled Artwork" + var/data = current_canvas.get_data_string() + var/md5 = md5(lowertext(data)) + LAZYINITLIST(SSpersistence.paintings) + for(var/list/entry in SSpersistence.paintings) + if(entry["md5"] == md5) + return + var/png_directory = "data/persistent/paintings/[persistence_id]/" + var/png_path = png_directory + "[md5].png" + var/result = rustg_dmi_create_png(png_path,"[current_canvas.width]","[current_canvas.height]",data) + if(result) + CRASH("Error saving persistent painting: [result]") + SSpersistence.paintings += list(list( + "persistence_id" = persistence_id, + "title" = current_canvas.painting_name, + "md5" = md5, + "author" = current_canvas.author_name, + "ckey" = current_canvas.author_ckey + )) + +/obj/structure/sign/painting/vv_get_dropdown() + . = ..() + VV_DROPDOWN_OPTION("removepainting", "Remove Persistent Painting") + +/obj/structure/sign/painting/vv_do_topic(list/href_list) + . = ..() + if(href_list["removepainting"]) + if(!check_rights(NONE)) + return + var/mob/user = usr + if(!persistence_id || !current_canvas) + to_chat(user,"This is not a persistent painting.") + return + var/md5 = md5(lowertext(current_canvas.get_data_string())) + var/author = current_canvas.author_ckey + var/list/filenames_found = list() + for(var/list/entry in SSpersistence.paintings) + if(entry["md5"] == md5) + filenames_found += "data/persistent/paintings/[entry["persistence_id"]]/[entry["md5"]].png" + SSpersistence.paintings -= entry + for(var/png in filenames_found) + if(fexists(png)) + fdel(png) + for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) + if(P.current_canvas && md5(P.current_canvas.get_data_string()) == md5) + QDEL_NULL(P.current_canvas) + P.update_appearance() + log_and_message_admins("[key_name_admin(user)] has deleted persistent painting made by [author].") \ No newline at end of file diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 29498bb2df..c7bab19f0f 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -30,7 +30,7 @@ LINEN BINS /obj/item/weapon/bedsheet/attackby(obj/item/I, mob/user) if(is_sharp(I)) - user.visible_message("\The [user] begins cutting up [src] with [I].", "You begin cutting up [src] with [I].") + user.visible_message("\The [user] begins cutting up [src] with [I].", "You begin cutting up [src] with [I].") if(do_after(user, 50)) to_chat(user, "You cut [src] into pieces!") for(var/i in 1 to rand(2,5)) diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index 92aad9af87..d5dd625c67 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -160,7 +160,7 @@ burning = FALSE update_icon() STOP_PROCESSING(SSobj, src) - visible_message("\The [src] stops burning.") + visible_message("\The [src] stops burning.") /obj/structure/bonfire/proc/ignite() if(!burning && get_fuel_amount()) @@ -180,8 +180,9 @@ O.fire_act(null, 1000, 500) else if(isliving(A) && get_fuel_amount() > 4) var/mob/living/L = A - L.adjust_fire_stacks(get_fuel_amount() / 4) - L.IgniteMob() + if(!(L.is_incorporeal())) + L.adjust_fire_stacks(get_fuel_amount() / 4) + L.IgniteMob() /obj/structure/bonfire/update_icon() cut_overlays() @@ -353,7 +354,7 @@ burning = FALSE update_icon() STOP_PROCESSING(SSobj, src) - visible_message("\The [src] stops burning.") + visible_message("\The [src] stops burning.") /obj/structure/fireplace/proc/ignite() if(!burning && get_fuel_amount()) diff --git a/code/game/objects/structures/fitness_vr.dm b/code/game/objects/structures/fitness_vr.dm index 6459cd469b..99978fe27c 100644 --- a/code/game/objects/structures/fitness_vr.dm +++ b/code/game/objects/structures/fitness_vr.dm @@ -26,14 +26,14 @@ return usr.visible_message("[user] starts climbing onto \the [src]!") - climbers |= user + LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) - climbers -= user + LAZYREMOVE(climbers, user) return if(!can_climb(user, post_climb_check=1)) - climbers -= user + LAZYREMOVE(climbers, user) return if(get_turf(user) == get_turf(src)) @@ -42,7 +42,7 @@ usr.forceMove(get_turf(src)) usr.visible_message("[user] climbed over \the [src]!") - climbers -= user + LAZYREMOVE(climbers, user) /obj/structure/fitness/boxing_ropes/can_climb(var/mob/living/user, post_climb_check=0) //Sets it to keep people from climbing over into the next turf if it is occupied. if(!..()) @@ -84,14 +84,14 @@ return usr.visible_message("[user] starts climbing onto \the [src]!") - climbers |= user + LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) - climbers -= user + LAZYREMOVE(climbers, user) return if(!can_climb(user, post_climb_check=1)) - climbers -= user + LAZYREMOVE(climbers, user) return if(get_turf(user) == get_turf(src)) @@ -100,7 +100,7 @@ usr.forceMove(get_turf(src)) usr.visible_message("[user] climbed over \the [src]!") - climbers -= user + LAZYREMOVE(climbers, user) /obj/structure/fitness/boxing_ropes_bottom/can_climb(var/mob/living/user, post_climb_check=0) if(!..()) @@ -143,14 +143,14 @@ return usr.visible_message("[user] starts climbing onto \the [src]!") - climbers |= user + LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) - climbers -= user + LAZYREMOVE(climbers, user) return if(!can_climb(user, post_climb_check=1)) - climbers -= user + LAZYREMOVE(climbers, user) return if(get_turf(user) == get_turf(src)) @@ -159,7 +159,7 @@ usr.forceMove(get_turf(src)) usr.visible_message("[user] climbed over \the [src]!") - climbers -= user + LAZYREMOVE(climbers, user) /obj/structure/fitness/boxing_turnbuckle/can_climb(var/mob/living/user, post_climb_check=0) if(!..()) diff --git a/code/game/objects/structures/flora/trees.dm b/code/game/objects/structures/flora/trees.dm index 2ced6ba550..f2cf86e557 100644 --- a/code/game/objects/structures/flora/trees.dm +++ b/code/game/objects/structures/flora/trees.dm @@ -47,7 +47,7 @@ if(is_stump) if(istype(W,/obj/item/weapon/shovel)) if(do_after(user, 5 SECONDS)) - visible_message("\The [user] digs up \the [src] stump with \the [W].") + visible_message("\The [user] digs up \the [src] stump with \the [W].") qdel(src) return diff --git a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm index 1c88500020..a792e1b559 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods_vr.dm @@ -15,7 +15,7 @@ return if(!activated) - to_chat(user, "\the [src] has not yet been activated. Sorry.") + to_chat(user, "\The [src] has not yet been activated. Sorry.") return if(used) diff --git a/code/game/objects/structures/ledges.dm b/code/game/objects/structures/ledges.dm index 1afa2efb01..cf7c88fc48 100644 --- a/code/game/objects/structures/ledges.dm +++ b/code/game/objects/structures/ledges.dm @@ -55,14 +55,14 @@ return usr.visible_message("[user] starts climbing onto \the [src]!") - climbers |= user + LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) - climbers -= user + LAZYREMOVE(climbers, user) return if(!can_climb(user, post_climb_check=1)) - climbers -= user + LAZYREMOVE(climbers, user) return if(get_turf(user) == get_turf(src)) @@ -71,7 +71,7 @@ usr.forceMove(get_turf(src)) usr.visible_message("[user] climbed over \the [src]!") - climbers -= user + LAZYREMOVE(climbers, user) /obj/structure/ledge/can_climb(var/mob/living/user, post_climb_check=0) if(!..()) diff --git a/code/game/objects/structures/medical_stand_vr.dm b/code/game/objects/structures/medical_stand_vr.dm index 2da7daba7b..e2eca967ff 100644 --- a/code/game/objects/structures/medical_stand_vr.dm +++ b/code/game/objects/structures/medical_stand_vr.dm @@ -129,10 +129,10 @@ qdel(contained) contained = new mask_type(src) breather = null - src.visible_message("\The [contained] slips to \the [src]!") + src.visible_message("\The [contained] slips to \the [src]!") update_icon() return - usr.visible_message("\The [usr] begins carefully placing the mask onto [target].", + usr.visible_message("\The [usr] begins carefully placing the mask onto [target].", "You begin carefully placing the mask onto [target].") if(!do_mob(usr, target, 100) || !can_apply_to_target(target, usr)) return @@ -151,14 +151,14 @@ visible_message("\The [attached] is taken off \the [src]") attached = null else if(ishuman(target)) - usr.visible_message("\The [usr] begins inserting needle into [target]'s vein.", + usr.visible_message("\The [usr] begins inserting needle into [target]'s vein.", "You begin inserting needle into [target]'s vein.") if(!do_mob(usr, target, 50)) usr.visible_message("\The [usr]'s hand slips and pricks \the [target].", "Your hand slips and pricks \the [target].") target.apply_damage(3, BRUTE, pick(BP_R_ARM, BP_L_ARM)) return - usr.visible_message("\The [usr] hooks \the [target] up to \the [src].", + usr.visible_message("\The [usr] hooks \the [target] up to \the [src].", "You hook \the [target] up to \the [src].") attached = target START_PROCESSING(SSobj,src) @@ -184,13 +184,13 @@ to_chat(user, "There is no tank in \the [src]!") return else if (tank && is_loosen) - user.visible_message("\The [user] removes \the [tank] from \the [src].", "You remove \the [tank] from \the [src].>") + user.visible_message("\The [user] removes \the [tank] from \the [src].", "You remove \the [tank] from \the [src].>") user.put_in_hands(tank) tank = null update_icon() return else if (!is_loosen) - user.visible_message("\The [user] tries to removes \the [tank] from \the [src] but it won't budge.", "You try to removes \the [tank] from \the [src] but it won't budge.>") + user.visible_message("\The [user] tries to removes \the [tank] from \the [src] but it won't budge.", "You try to removes \the [tank] from \the [src] but it won't budge.>") return if ("Toggle valve") if (!tank) @@ -198,7 +198,7 @@ return else if (valve_opened) - src.visible_message("\The [user] closes valve on \the [src]!", + src.visible_message("\The [user] closes valve on \the [src]!", "You close valve on \the [src].") if(breather) breather.internals?.icon_state = "internal0" @@ -206,7 +206,7 @@ valve_opened = FALSE update_icon() else - src.visible_message("\The [user] opens valve on \the [src]!", + src.visible_message("\The [user] opens valve on \the [src]!", "You open valve on \the [src].") if(breather) breather.internal = tank @@ -319,7 +319,7 @@ user.drop_item() W.forceMove(src) tank = W - user.visible_message("\The [user] attaches \the [tank] to \the [src].", "You attach \the [tank] to \the [src].") + user.visible_message("\The [user] attaches \the [tank] to \the [src].", "You attach \the [tank] to \the [src].") src.add_fingerprint(user) update_icon() @@ -373,7 +373,7 @@ else qdel(contained) contained = new mask_type (src) - src.visible_message("\The [contained] slips to \the [src]!") + src.visible_message("\The [contained] slips to \the [src]!") breather = null update_icon() return diff --git a/code/game/objects/structures/props/beam_prism.dm b/code/game/objects/structures/props/beam_prism.dm index d70d72d089..a8d22fad50 100644 --- a/code/game/objects/structures/props/beam_prism.dm +++ b/code/game/objects/structures/props/beam_prism.dm @@ -90,11 +90,11 @@ /obj/structure/prop/prism/proc/rotate_auto(var/new_bearing) if(rotation_lock) - visible_message("\The [src] shudders.") + visible_message("\The [src] shudders.") playsound(src, 'sound/effects/clang.ogg', 50, 1) return - visible_message("\The [src] rotates to a bearing of [new_bearing].") + visible_message("\The [src] rotates to a bearing of [new_bearing].") var/rotate_degrees = new_bearing - degrees_from_north diff --git a/code/game/objects/structures/props/prop.dm b/code/game/objects/structures/props/prop.dm index ddabd200e5..1ddd91285e 100644 --- a/code/game/objects/structures/props/prop.dm +++ b/code/game/objects/structures/props/prop.dm @@ -115,6 +115,13 @@ icon = 'icons/obj/structures/decor32x64.dmi' icon_state = "eotp" +// gravity generator from Eris +/obj/structure/prop/gravygen + icon = 'icons/obj/structures/decor64x64.dmi' + icon_state = "bigdice" + bound_width = 64 + bound_height = 64 + // dna vault from /tg/ /obj/structure/prop/dna_vault icon = 'icons/obj/structures/decor96x96.dmi' @@ -271,6 +278,58 @@ /obj/structure/prop/nt_solifier/starts_on icon_state = "nt_solidifier_on" +/** + * Possible 'state' options for change_state(state) are: + * off: Boring, round + * on: Spinny glowy + */ +// conduit of soul from Eris +/obj/structure/prop/conduit + icon = 'icons/obj/structures/decor.dmi' + icon_state = "conduit_off" + +/obj/structure/prop/conduit/change_state(state) + . = ..() + switch(state) + if("on") + icon_state = "conduit_spin" + flick("conduit_starting", src) + if("off") + icon_state = "conduit_off" + flick("conduit_stopping", src) + +/obj/structure/prop/conduit/starts_on + icon_state = "conduit_spin" + +/** + * Possible 'state' options for change_state(state) are: + * on: Doing some kinda worky thing + * off: Not doing much of anything + * empty: No blue crystal thingy + * loaded: off but without the animation + */ +// some kinda NT thing from Eris +/obj/structure/prop/core + icon = 'icons/obj/structures/decor.dmi' + icon_state = "core_inactive" + +/obj/structure/prop/core/change_state(state) + . = ..() + switch(state) + if("on") + icon_state = "core_active" + flick("core_warmup", src) + if("off") + icon_state = "core_inactive" + flick("core_shutdown", src) + if("empty") + icon_state = "core_empty" + if("loaded") + icon_state = "core_inactive" + +/obj/structure/prop/core/starts_on + icon_state = "core_active" + /** * Possible 'state' options for change_state(state) are: * down: In the ground, glowing @@ -278,7 +337,6 @@ */ // experimental science destructor from /tg/ /obj/structure/prop/tube - icon = 'icons/obj/structures/decor.dmi' icon = 'icons/obj/structures/decor32x64.dmi' icon_state = "tube_open" @@ -393,6 +451,62 @@ /obj/structure/prop/nt_optable/starts_active icon_state = "nt_optable-active" +/** + * Possible 'state' options for change_state(state) are: + * idle: The default look + * active: Glowy lights in the center + * panel_open: Opened panel (wiring) + * panel_closed: Closed panel + */ +// trade beacon from Eris +/obj/structure/prop/tradebeacon + icon = 'icons/obj/structures/decor.dmi' + icon_state = "tradebeacon" + +/obj/structure/prop/tradebeacon/change_state(state) + . = ..() + switch(state) + if("idle") + icon_state = "tradebeacon" + if("active") + icon_state = "tradebeacon_active" + if("panel_open") + cut_overlay("tradebeacon_panel") + add_overlay("tradebeacon_panel") + if("panel_closed") + cut_overlay("tradebeacon_panel") + +/obj/structure/prop/tradebeacon/starts_active + icon_state = "tradebeacon_active" + +/** + * Possible 'state' options for change_state(state) are: + * idle: The default look + * active: Glowy lights in the center + * panel_open: Opened panel (wiring) + * panel_closed: Closed panel + */ +// another trade beacon from Eris +/obj/structure/prop/tradebeacon2 + icon = 'icons/obj/structures/decor.dmi' + icon_state = "tradebeacon" + +/obj/structure/prop/tradebeacon2/change_state(state) + . = ..() + switch(state) + if("idle") + icon_state = "tradebeacon_sending" + if("active") + icon_state = "tradebeacon_sending_active" + if("panel_open") + cut_overlay("tradebeacon_sending_panel") + add_overlay("tradebeacon_sending_panel") + if("panel_closed") + cut_overlay("tradebeacon_sending_panel") + +/obj/structure/prop/tradebeacon2/starts_active + icon_state = "tradebeacon_sending_active" + /** * Possible 'state' options for change_state(state) are: * off: Non-spinny @@ -414,6 +528,48 @@ /obj/structure/prop/nt_obelisk/starts_on icon_state = "nt_obelisk_on" +/** + * Possible 'state' options for change_state(state) are: + * off: Inert + * on: Hand destroying machinery + */ +// 'sorter' from Eris +/obj/structure/prop/sorter + icon = 'icons/obj/structures/decor.dmi' + icon_state = "sorter" + +/obj/structure/prop/sorter/change_state(state) + . = ..() + switch(state) + if("off") + icon_state = "sorter" + if("on") + icon_state = "sorter-process" + +/obj/structure/prop/sorter/starts_on + icon_state = "sorter-process" + +/** + * Possible 'state' options for change_state(state) are: + * off: Inert + * on: Hand destroying machinery + */ +// 'smelter' from Eris +/obj/structure/prop/smelter + icon = 'icons/obj/structures/decor.dmi' + icon_state = "smelter" + +/obj/structure/prop/smelter/change_state(state) + . = ..() + switch(state) + if("off") + icon_state = "smelter" + if("on") + icon_state = "smelter-process" + +/obj/structure/prop/smelter/starts_on + icon_state = "smelter-process" + /** * Possible 'state' options for change_state(state) are: * idle: Not doing anything, with yellow template exposed diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index e039f7806f..876e58c4e3 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -205,7 +205,7 @@ if(W.is_wrench() && !anchored) playsound(src, W.usesound, 50, 1) if(do_after(user, 20, src)) - user.visible_message("\The [user] dismantles \the [src].", "You dismantle \the [src].") + user.visible_message("\The [user] dismantles \the [src].", "You dismantle \the [src].") new /obj/item/stack/material/steel(get_turf(usr), 2) qdel(src) return @@ -216,13 +216,13 @@ if(F.welding) playsound(src, F.usesound, 50, 1) if(do_after(user, 20, src)) - user.visible_message("\The [user] repairs some damage to \the [src].", "You repair some damage to \the [src].") + user.visible_message("\The [user] repairs some damage to \the [src].", "You repair some damage to \the [src].") health = min(health+(maxhealth/5), maxhealth) // 20% repair per application return // Install if(W.is_screwdriver()) - user.visible_message(anchored ? "\The [user] begins unscrewing \the [src]." : "\The [user] begins fasten \the [src]." ) + user.visible_message(anchored ? "\The [user] begins unscrewing \the [src]." : "\The [user] begins fasten \the [src]." ) playsound(src, W.usesound, 75, 1) if(do_after(user, 10, src)) to_chat(user, (anchored ? "You have unfastened \the [src] from the floor." : "You have fastened \the [src] to the floor.")) @@ -286,14 +286,14 @@ return usr.visible_message("[user] starts climbing onto \the [src]!") - climbers |= user + LAZYDISTINCTADD(climbers, user) if(!do_after(user,(issmall(user) ? 20 : 34))) - climbers -= user + LAZYREMOVE(climbers, user) return if(!can_climb(user, post_climb_check=1)) - climbers -= user + LAZYREMOVE(climbers, user) return if(get_turf(user) == get_turf(src)) @@ -303,7 +303,7 @@ usr.visible_message("[user] climbed over \the [src]!") if(!anchored) take_damage(maxhealth) // Fatboy - climbers -= user + LAZYREMOVE(climbers, user) /obj/structure/railing/can_climb(var/mob/living/user, post_climb_check=0) if(!..()) diff --git a/code/game/objects/structures/salvageable.dm b/code/game/objects/structures/salvageable.dm index 18fe7ad080..faf6c788aa 100644 --- a/code/game/objects/structures/salvageable.dm +++ b/code/game/objects/structures/salvageable.dm @@ -18,7 +18,7 @@ playsound(src, I.usesound, 50, 1) var/actual_time = I.toolspeed * 170 user.visible_message( \ - "\The [user] begins salvaging from \the [src].", \ + "\The [user] begins salvaging from \the [src].", \ "You start salvaging from \the [src].") if(do_after(user, actual_time, target = src)) user.visible_message( \ diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index ad83b847b8..60bff00cec 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -324,7 +324,7 @@ to_chat(usr, "\The [thing] is empty.") return // Clear the vessel. - visible_message("\The [usr] tips the contents of \the [thing] into \the [src].") + visible_message("\The [usr] tips the contents of \the [thing] into \the [src].") thing.reagents.clear_reagents() thing.update_icon() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 2ae7c7adfc..6083a38a79 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -215,7 +215,7 @@ damage = damage / 2 take_damage(damage) else - visible_message("\The [user] bonks \the [src] harmlessly.") + visible_message("\The [user] bonks \the [src] harmlessly.") user.do_attack_animation(src) return 1 @@ -302,7 +302,7 @@ if (C.use(1)) playsound(src, 'sound/effects/sparks1.ogg', 75, 1) user.visible_message( \ - "\The [user] begins to wire \the [src] for electrochromic tinting.", \ + "\The [user] begins to wire \the [src] for electrochromic tinting.", \ "You begin to wire \the [src] for electrochromic tinting.", \ "You hear sparks.") if(do_after(user, 20 * C.toolspeed, src) && state == 0) diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 67524c05ef..f2902abdfe 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -77,14 +77,14 @@ for(var/thing in thing_to_check) if(isobj(thing)) var/obj/O = thing - if(O.throwing) + if(O.throwing || O.is_incorporeal()) continue . = TRUE O.lava_act() else if(isliving(thing)) var/mob/living/L = thing - if(L.hovering || L.throwing) // Flying over the lava. We're just gonna pretend convection doesn't exist. + if(L.hovering || L.throwing || L.is_incorporeal()) // Flying over the lava. We're just gonna pretend convection doesn't exist. continue . = TRUE L.lava_act() diff --git a/code/game/turfs/turf_changing.dm b/code/game/turfs/turf_changing.dm index e826867ab7..85292aa2b3 100644 --- a/code/game/turfs/turf_changing.dm +++ b/code/game/turfs/turf_changing.dm @@ -59,6 +59,7 @@ if(S.zone) S.zone.rebuild() cut_overlays(TRUE) + RemoveElement(/datum/element/turf_z_transparency) if(ispath(N, /turf/simulated/floor)) var/turf/simulated/W = new N( locate(src.x, src.y, src.z) ) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index a0a84ed52c..ff22e219f4 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -688,7 +688,7 @@ var/global/floorIsLava = 0 set desc="Announce your desires to the world" if(!check_rights(0)) return - var/message = input(usr, "Global message to send:", "Admin Announce", null, null) as message//todo: sanitize for all? + var/message = tgui_input_message(usr, "Global message to send:", "Admin Announce") if(message) if(!check_rights(R_SERVER,0)) message = sanitize(message, 500, extra = 0) diff --git a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm index 8b7d4b0234..594b3c34d2 100644 --- a/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm +++ b/code/modules/admin/secrets/admin_secrets/jump_shuttle.dm @@ -13,24 +13,25 @@ if (!shuttle_tag) return var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag] - - var/origin_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", return_areas()) + + var/list/area_choices = return_areas() + var/origin_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices) if (!origin_area) return - var/destination_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", return_areas()) + var/destination_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices) if (!destination_area) return var/long_jump = tgui_alert(user, "Is there a transition area for this jump?","Transition?", list("Yes","No")) if (long_jump == "Yes") - var/transition_area = tgui_input_list(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", return_areas()) + var/transition_area = tgui_input_list(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices) if (!transition_area) return var/move_duration = input(user, "How many seconds will this jump take?") as num - S.long_jump(origin_area, destination_area, transition_area, move_duration) + S.long_jump(area_choices[origin_area], area_choices[destination_area], area_choices[transition_area], move_duration) message_admins("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle", 1) log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle") else - S.short_jump(origin_area, destination_area) + S.short_jump(area_choices[origin_area], area_choices[destination_area]) message_admins("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle", 1) log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index dc3c696cf3..3868c4271a 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1278,7 +1278,7 @@ var/client/C = usr.client if(!isobserver(usr)) C.admin_ghost() sleep(2) - C.jumptomob(M) + C.do_jumptomob(M) else if(href_list["adminplayerobservefollow"]) if(!check_rights(R_MOD|R_ADMIN|R_SERVER)) //VOREStation Edit diff --git a/code/modules/admin/verbs/adminjump.dm b/code/modules/admin/verbs/adminjump.dm index 185d911b07..fc32742583 100644 --- a/code/modules/admin/verbs/adminjump.dm +++ b/code/modules/admin/verbs/adminjump.dm @@ -39,6 +39,7 @@ tgui_alert_async(usr, "Admin jumping disabled") return +/// Verb wrapper around do_jumptomob() /client/proc/jumptomob() set category = "Admin" set name = "Jump to Mob" @@ -47,24 +48,30 @@ if(!check_rights(R_ADMIN|R_MOD|R_DEBUG|R_EVENT)) return - if(config.allow_admin_jump) - var/mob/M = tgui_input_list(usr, "Pick a mob:", "Jump to Mob", mob_list) - if(!M) - return + var/mob/M = tgui_input_list(usr, "Pick a mob:", "Jump to Mob", mob_list) + if(!M) // Cancelled + return + do_jumptomob(M) + +/// Performs the jumps +/client/proc/do_jumptomob(var/mob/M) + if(!config.allow_admin_jump) + tgui_alert_async(usr, "Admin jumping disabled") + return + if(!M) + return + + var/mob/A = src.mob // Impossible to be unset, enforced by byond + var/turf/T = get_turf(M) + if(isturf(T)) + A.on_mob_jump() + A.forceMove(T) log_admin("[key_name(usr)] jumped to [key_name(M)]") message_admins("[key_name_admin(usr)] jumped to [key_name_admin(M)]", 1) - if(src.mob) - var/mob/A = src.mob - var/turf/T = get_turf(M) - if(T && isturf(T)) - feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - A.on_mob_jump() - A.forceMove(T) - else - to_chat(A, "This mob is not located in the game world.") + feedback_add_details("admin_verb","JM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! else - tgui_alert_async(usr, "Admin jumping disabled") - + to_chat(A, "This mob is not located in the game world.") + /client/proc/jumptocoord(tx as num, ty as num, tz as num) set category = "Admin" set name = "Jump to Coordinate" diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 79391fc29d..fe21599691 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -273,12 +273,12 @@ Ccomp's first proc. var/target = tgui_input_list(usr, "Select a ckey to allow to rejoin", "Allow Respawn Selector", GLOB.respawn_timers) if(!target) return - + if(GLOB.respawn_timers[target] == -1) // Their respawn timer is set to -1, which is 'not allowed to respawn' var/response = tgui_alert(src, "Are you sure you wish to allow this individual to respawn? They would normally not be able to.","Allow impossible respawn?",list("No","Yes")) if(response == "No") return - + GLOB.respawn_timers -= target var/found_client = FALSE @@ -295,7 +295,7 @@ Ccomp's first proc. if(!found_client) to_chat(src, "The associated client didn't appear to be connected, so they couldn't be notified, but they can now respawn if they reconnect.") - + log_admin("[key_name(usr)] allowed [found_client ? key_name(found_client) : target] to bypass the respawn time limit") message_admins("Admin [key_name_admin(usr)] allowed [found_client ? key_name_admin(found_client) : target] to bypass the respawn time limit", 1) @@ -483,7 +483,7 @@ Traitors and the like can also be revived with the previous role mostly intact. return new_character = new(spawnloc) - + if(sparks) anim(spawnloc,new_character,'icons/mob/mob.dmi',,"phasein",,new_character.dir) playsound(spawnloc, "sparks", 50, 1) @@ -538,6 +538,8 @@ Traitors and the like can also be revived with the previous role mostly intact. //A redraw for good measure new_character.regenerate_icons() + new_character.update_transform() //VOREStation Edit + //If we're announcing their arrival if(announce) AnnounceArrival(new_character, new_character.mind.assigned_role, "Common", new_character.z) diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm index 8219b07300..4211bb8add 100644 --- a/code/modules/client/preference_setup/general/01_basic.dm +++ b/code/modules/client/preference_setup/general/01_basic.dm @@ -100,7 +100,7 @@ return TOPIC_REFRESH else if(href_list["nickname"]) - var/raw_nickname = input(user, "Choose your character's nickname:", "Character Nickname") as text|null + var/raw_nickname = tgui_input_text(user, "Choose your character's nickname:", "Character Nickname", pref.nickname) if (!isnull(raw_nickname) && CanUseTopic(user)) var/new_nickname = sanitize_name(raw_nickname, pref.species, is_FBP()) if(new_nickname) @@ -140,7 +140,7 @@ return TOPIC_REFRESH else if(href_list["metadata"]) - var/new_metadata = sanitize(input(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)) as message|null, extra = 0) //VOREStation Edit + var/new_metadata = sanitize(tgui_input_message(user, "Enter any information you'd like others to see, such as Roleplay-preferences:", "Game Preference" , html_decode(pref.metadata)), extra = 0) //VOREStation Edit if(new_metadata && CanUseTopic(user)) pref.metadata = new_metadata return TOPIC_REFRESH diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index f1bf1c8c3f..6c0aa76730 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -36,8 +36,8 @@ pref.all_underwear -= underwear_category_name // TODO - Looks like this is duplicating the work of sanitize_character() if so, remove - if(pref.backbag > 5 || pref.backbag < 1) - pref.backbag = 1 //Same as above + if(pref.backbag > backbaglist.len || pref.backbag < 1) + pref.backbag = 2 //Same as above character.backbag = pref.backbag if(pref.pdachoice > 6 || pref.pdachoice < 1) diff --git a/code/modules/client/preference_setup/loadout/loadout_cosmetics_vr.dm b/code/modules/client/preference_setup/loadout/loadout_cosmetics_vr.dm new file mode 100644 index 0000000000..c538c66410 --- /dev/null +++ b/code/modules/client/preference_setup/loadout/loadout_cosmetics_vr.dm @@ -0,0 +1,20 @@ +/datum/gear/cosmetic/nailpolish + display_name = "nail polish (colorable)" + description = "Nail polish, available in every color of the rainbow! Doesn't come with nail polish remover." + path = /obj/item/weapon/nailpolish + +/datum/gear/cosmetic/nailpolish/New() + ..() + // can't set description, it'll look funny + gear_tweaks = list(gear_tweak_free_color_choice, gear_tweak_free_name) + +/datum/gear/cosmetic/nailpolish/spawn_item(var/location, var/metadata) + var/obj/item/weapon/nailpolish/polish = ..() + polish.set_colour(polish.color) + polish.color = null + return polish + +/datum/gear/cosmetic/nailpolish_remover + display_name = "nail polish remover" + description = "Nail polish remover, for when the fun's over. Doesn't come with nail polish." + path = /obj/item/weapon/nailpolish_remover \ No newline at end of file diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index 19df50973f..95a944e931 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -87,19 +87,19 @@ return TOPIC_REFRESH else if(href_list["weight_gain"]) - var/weight_gain_rate = input(user, "Choose your character's rate of weight gain between 100% \ + var/weight_gain_rate = tgui_input_num(user, "Choose your character's rate of weight gain between 100% \ (full realism body fat gain) and 0% (no body fat gain).\n\ (If you want to disable weight gain, set this to 0.01 to round it to 0%.)\ - ([WEIGHT_CHANGE_MIN]-[WEIGHT_CHANGE_MAX])", "Character Preference") as num|null + ([WEIGHT_CHANGE_MIN]-[WEIGHT_CHANGE_MAX])", "Character Preference", pref.weight_gain) if(weight_gain_rate) pref.weight_gain = round(text2num(weight_gain_rate),1) return TOPIC_REFRESH else if(href_list["weight_loss"]) - var/weight_loss_rate = input(user, "Choose your character's rate of weight loss between 100% \ + var/weight_loss_rate = tgui_input_num(user, "Choose your character's rate of weight loss between 100% \ (full realism body fat loss) and 0% (no body fat loss).\n\ (If you want to disable weight loss, set this to 0.01 round it to 0%.)\ - ([WEIGHT_CHANGE_MIN]-[WEIGHT_CHANGE_MAX])", "Character Preference") as num|null + ([WEIGHT_CHANGE_MIN]-[WEIGHT_CHANGE_MAX])", "Character Preference", pref.weight_loss) if(weight_loss_rate) pref.weight_loss = round(text2num(weight_loss_rate),1) return TOPIC_REFRESH diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 37b2c3598b..e58b71ca72 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -677,7 +677,7 @@ user.unEquip(I) I.forceMove(src) holding = I - user.visible_message("\The [user] shoves \the [I] into \the [src].") + user.visible_message("\The [user] shoves \the [I] into \the [src].") verbs |= /obj/item/clothing/shoes/proc/draw_knife update_icon() else diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index bb0ca1ee39..3abb4c223f 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -62,7 +62,7 @@ //TODO: Make inflating gloves a thing /*/obj/item/clothing/gloves/sterile/proc/Inflate(/mob/living/carbon/human/user) - user.visible_message("\The [src] expands!") + user.visible_message("\The [src] expands!") qdel(src)*/ /obj/item/clothing/gloves/sterile/latex diff --git a/code/modules/clothing/spacesuits/void/void_vr.dm b/code/modules/clothing/spacesuits/void/void_vr.dm index 1ee289ae06..ae10305eb5 100644 --- a/code/modules/clothing/spacesuits/void/void_vr.dm +++ b/code/modules/clothing/spacesuits/void/void_vr.dm @@ -141,13 +141,14 @@ /obj/item/clothing/suit/space/void/autolok name = "AutoLok pressure suit" desc = "A high-tech snug-fitting pressure suit. Fits any species. It offers very little physical protection, but is equipped with sensors that will automatically deploy the integral helmet to protect the wearer." + icon = 'icons/obj/clothing/suits_vr.dmi' icon_state = "autoloksuit" item_state = "autoloksuit" + item_state_slots = list(slot_r_hand_str = "space_suit_syndicate", slot_l_hand_str = "space_suit_syndicate") armor = list(melee = 15, bullet = 5, laser = 5,energy = 5, bomb = 5, bio = 100, rad = 80) slowdown = 0.5 siemens_coefficient = 1 species_restricted = list("exclude",SPECIES_DIONA,SPECIES_VOX) //this thing can autoadapt - icon = 'icons/obj/clothing/suits_vr.dmi' breach_threshold = 6 //this thing is basically tissue paper w_class = ITEMSIZE_NORMAL //if it's snug, high-tech, and made of relatively soft materials, it should be much easier to store! diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index 97140e6f29..4ec669a565 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -152,7 +152,7 @@ return if(A.reagents && A.reagents.trans_to_obj(src, reagents.maximum_volume)) - user.visible_message("\The [user] soaks [src] using [A].", "You soak [src] using [A].") + user.visible_message("\The [user] soaks [src] using [A].", "You soak [src] using [A].") update_name() return diff --git a/code/modules/economy/vending.dm b/code/modules/economy/vending.dm index e4b4998171..4086dcd921 100644 --- a/code/modules/economy/vending.dm +++ b/code/modules/economy/vending.dm @@ -580,7 +580,7 @@ GLOBAL_LIST_EMPTY(vending_products) if(prob(1)) sleep(3) if(R.get_product(get_turf(src))) - visible_message("\The [src] clunks as it vends an additional item.") + visible_message("\The [src] clunks as it vends an additional item.") playsound(src, "sound/[vending_sound]", 100, 1, 1) GLOB.items_sold_shift_roundstat++ diff --git a/code/modules/food/food/snacks.dm b/code/modules/food/food/snacks.dm index 5605a5a702..d9757b0c75 100644 --- a/code/modules/food/food/snacks.dm +++ b/code/modules/food/food/snacks.dm @@ -235,7 +235,7 @@ user.visible_message("\The [user] crudely slices \the [src] with [W]!", "You crudely slice \the [src] with your [W]!") slices_lost = rand(1,min(1,round(slices_num/2))) else - user.visible_message("\The [user] slices \the [src]!", "You slice \the [src]!") + user.visible_message("\The [user] slices \the [src]!", "You slice \the [src]!") var/reagents_per_slice = reagents.total_volume/slices_num for(var/i=1 to (slices_num-slices_lost)) @@ -1833,7 +1833,7 @@ Unwrap(user) /obj/item/weapon/reagent_containers/food/snacks/monkeycube/proc/Expand() - src.visible_message("\The [src] expands!") + src.visible_message("\The [src] expands!") var/mob/living/carbon/human/H = new(get_turf(src)) H.set_species(monkey_type) H.real_name = H.species.get_random_name() diff --git a/code/modules/food/food/snacks_vr.dm b/code/modules/food/food/snacks_vr.dm index 6b9f15ff5a..f8509d4392 100644 --- a/code/modules/food/food/snacks_vr.dm +++ b/code/modules/food/food/snacks_vr.dm @@ -476,7 +476,7 @@ . = ..() /obj/item/weapon/reagent_containers/food/snacks/cube/proc/Expand() - src.visible_message("\The [src] expands!") + src.visible_message("\The [src] expands!") new food_type(get_turf(src)) qdel(src) diff --git a/code/modules/food/kitchen/cooking_machines/_appliance.dm b/code/modules/food/kitchen/cooking_machines/_appliance.dm index d87fbfc902..1b090068f6 100644 --- a/code/modules/food/kitchen/cooking_machines/_appliance.dm +++ b/code/modules/food/kitchen/cooking_machines/_appliance.dm @@ -319,7 +319,7 @@ CI = new /datum/cooking_item/(CC) I.forceMove(src) cooking_objs.Add(CI) - user.visible_message("\The [user] puts \the [I] into \the [src].") + user.visible_message("\The [user] puts \the [I] into \the [src].") if (CC.check_contents() == 0)//If we're just putting an empty container in, then dont start any processing. return TRUE else @@ -333,7 +333,7 @@ CI.combine_target = selected_option // We can actually start cooking now. - user.visible_message("\The [user] puts \the [I] into \the [src].") + user.visible_message("\The [user] puts \the [I] into \the [src].") get_cooking_work(CI) cooking = TRUE @@ -433,7 +433,7 @@ /obj/machinery/appliance/proc/finish_cooking(var/datum/cooking_item/CI) - src.visible_message("\The [src] pings!") + src.visible_message("\The [src] pings!") if(cooked_sound) playsound(get_turf(src), cooked_sound, 50, 1) //Check recipes first, a valid recipe overrides other options diff --git a/code/modules/food/kitchen/cooking_machines/oven.dm b/code/modules/food/kitchen/cooking_machines/oven.dm index d58df7e6f6..bcebc851a0 100644 --- a/code/modules/food/kitchen/cooking_machines/oven.dm +++ b/code/modules/food/kitchen/cooking_machines/oven.dm @@ -148,7 +148,7 @@ /obj/machinery/appliance/cooker/oven/finish_cooking(var/datum/cooking_item/CI) if(CI.combine_target) CI.result_type = 3//Combination type. We're making something out of our ingredients - visible_message("\The [src] pings!") + visible_message("\The [src] pings!") combination_cook(CI) return else diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm index a92e17c6da..9162286858 100644 --- a/code/modules/food/kitchen/microwave.dm +++ b/code/modules/food/kitchen/microwave.dm @@ -77,24 +77,24 @@ if(src.broken > 0) if(src.broken == 2 && O.is_screwdriver()) // If it's broken and they're using a screwdriver user.visible_message( \ - "\The [user] starts to fix part of the microwave.", \ + "\The [user] starts to fix part of the microwave.", \ "You start to fix part of the microwave." \ ) playsound(src, O.usesound, 50, 1) if (do_after(user,20 * O.toolspeed)) user.visible_message( \ - "\The [user] fixes part of the microwave.", \ + "\The [user] fixes part of the microwave.", \ "You have fixed part of the microwave." \ ) src.broken = 1 // Fix it a bit else if(src.broken == 1 && O.is_wrench()) // If it's broken and they're doing the wrench user.visible_message( \ - "\The [user] starts to fix part of the microwave.", \ + "\The [user] starts to fix part of the microwave.", \ "You start to fix part of the microwave." \ ) if (do_after(user,20 * O.toolspeed)) user.visible_message( \ - "\The [user] fixes the microwave.", \ + "\The [user] fixes the microwave.", \ "You have fixed the microwave." \ ) src.icon_state = "mw" @@ -108,7 +108,7 @@ else if(src.dirty==100) // The microwave is all dirty so can't be used! if(istype(O, /obj/item/weapon/reagent_containers/spray/cleaner) || istype(O, /obj/item/weapon/soap)) // If they're trying to clean it then let them user.visible_message( \ - "\The [user] starts to clean the microwave.", \ + "\The [user] starts to clean the microwave.", \ "You start to clean the microwave." \ ) if (do_after(user,20)) diff --git a/code/modules/food/kitchen/smartfridge/hydroponics.dm b/code/modules/food/kitchen/smartfridge/hydroponics.dm index 1c2cb42246..93afa67b19 100644 --- a/code/modules/food/kitchen/smartfridge/hydroponics.dm +++ b/code/modules/food/kitchen/smartfridge/hydroponics.dm @@ -24,19 +24,6 @@ icon_state = "showcase" icon_base = "showcase" -/obj/machinery/smartfridge/drinks/update_icon() - cut_overlays() - if(stat & (BROKEN|NOPOWER)) - icon_state = "[icon_base]-off" - else - icon_state = icon_base - - if(panel_open) - add_overlay("[icon_base]-panel") - - if(!stat && contents.len) - add_overlay("[icon_base]-fill") - /obj/machinery/smartfridge/drinks/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/glass) || istype(O,/obj/item/weapon/reagent_containers/food/drinks) || istype(O,/obj/item/weapon/reagent_containers/food/condiment)) return TRUE diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 4d4ab53dca..8c333aaf10 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -111,7 +111,7 @@ cards -= P H.parentdeck = src H.update_icon() - user.visible_message("\The [user] draws a card.") + user.visible_message("\The [user] draws a card.") to_chat(user,"It's the [P].") /obj/item/weapon/deck/verb/deal_card() diff --git a/code/modules/ghosttrap/trap.dm b/code/modules/ghosttrap/trap.dm index 5de81594a9..594d6f2e45 100644 --- a/code/modules/ghosttrap/trap.dm +++ b/code/modules/ghosttrap/trap.dm @@ -83,7 +83,7 @@ var/list/ghost_traps to_chat(target, "Remember, the purpose of your existence is to serve the crew and the station. Above all else, do no harm.") to_chat(target, "Use say #b to speak to other artificial intelligences.") var/turf/T = get_turf(target) - T.visible_message("\The [src] chimes quietly.") + T.visible_message("\The [src] chimes quietly.") var/obj/item/device/mmi/digital/posibrain/P = target.loc if(!istype(P)) //wat return diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 35d7ee2fef..70fa60be35 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -513,5 +513,5 @@ derez() /mob/living/simple_mob/animal/space/carp/holodeck/proc/derez() - visible_message("\The [src] fades away!") + visible_message("\The [src] fades away!") qdel(src) diff --git a/code/modules/holomap/mapper.dm b/code/modules/holomap/mapper.dm index 430a4176ba..b99d2928c1 100644 --- a/code/modules/holomap/mapper.dm +++ b/code/modules/holomap/mapper.dm @@ -185,7 +185,7 @@ hud_item.off(FALSE) /obj/item/device/mapping_unit/proc/hide_device() - hud_datum.unapply_to_hud() + hud_datum?.unapply_to_hud() /obj/item/device/mapping_unit/proc/last_run() stop_updates() diff --git a/code/modules/hydroponics/seed.dm b/code/modules/hydroponics/seed.dm index 67e6dbeecb..dfa95aed2d 100644 --- a/code/modules/hydroponics/seed.dm +++ b/code/modules/hydroponics/seed.dm @@ -571,7 +571,7 @@ if(!degree || get_trait(TRAIT_IMMUTABLE) > 0) return - source_turf.visible_message("\The [display_name] quivers!") + source_turf.visible_message("\The [display_name] quivers!") //This looks like shit, but it's a lot easier to read/change this way. var/total_mutations = rand(1,1+degree) @@ -608,7 +608,7 @@ if(prob(degree*5)) set_trait(TRAIT_CARNIVOROUS, get_trait(TRAIT_CARNIVOROUS)+rand(-degree,degree),2, 0) if(get_trait(TRAIT_CARNIVOROUS)) - source_turf.visible_message("\The [display_name] shudders hungrily.") + source_turf.visible_message("\The [display_name] shudders hungrily.") if(6) set_trait(TRAIT_WEED_TOLERANCE, get_trait(TRAIT_WEED_TOLERANCE)+(rand(-2,2)*degree),10, 0) if(prob(degree*5)) @@ -629,7 +629,7 @@ set_trait(TRAIT_POTENCY, get_trait(TRAIT_POTENCY)+(rand(-20,20)*degree),200, 0) if(prob(degree*5)) set_trait(TRAIT_SPREAD, get_trait(TRAIT_SPREAD)+rand(-1,1),2, 0) - source_turf.visible_message("\The [display_name] spasms visibly, shifting in the tray.") + source_turf.visible_message("\The [display_name] spasms visibly, shifting in the tray.") if(prob(degree*3)) set_trait(TRAIT_SPORING, !get_trait(TRAIT_SPORING)) if(9) @@ -647,7 +647,7 @@ if(prob(degree*2)) set_trait(TRAIT_BIOLUM, !get_trait(TRAIT_BIOLUM)) if(get_trait(TRAIT_BIOLUM)) - source_turf.visible_message("\The [display_name] begins to glow!") + source_turf.visible_message("\The [display_name] begins to glow!") if(prob(degree*2)) set_trait(TRAIT_BIOLUM_COLOUR,"#[get_random_colour(0,75,190)]") source_turf.visible_message("\The [display_name]'s glow changes colour!") diff --git a/code/modules/hydroponics/seed_gene_mut.dm b/code/modules/hydroponics/seed_gene_mut.dm index 09147c72b9..35ced29739 100644 --- a/code/modules/hydroponics/seed_gene_mut.dm +++ b/code/modules/hydroponics/seed_gene_mut.dm @@ -4,7 +4,7 @@ return src var/datum/seed/S = diverge() //Let's not modify all of the seeds. - T.visible_message("\The [S.display_name] quivers!") //Mimicks the normal mutation. + T.visible_message("\The [S.display_name] quivers!") //Mimicks the normal mutation. G.mutate(S, T) return S @@ -94,7 +94,7 @@ if(prob(50)) S.set_trait(TRAIT_BIOLUM, !S.get_trait(TRAIT_BIOLUM)) if(S.get_trait(TRAIT_BIOLUM)) - T.visible_message("\The [S.display_name] begins to glow!") + T.visible_message("\The [S.display_name] begins to glow!") if(prob(50)) S.set_trait(TRAIT_BIOLUM_COLOUR,get_random_colour(0,75,190)) T.visible_message("\The [S.display_name]'s glow changes colour!") @@ -118,7 +118,7 @@ S.set_trait(TRAIT_MATURATION, S.get_trait(TRAIT_MATURATION)+rand(-1,1),30,0) if(prob(55)) S.set_trait(TRAIT_SPREAD, S.get_trait(TRAIT_SPREAD)+rand(-1,1),2,0) - T.visible_message("\The [S.display_name] spasms visibly, shifting in the tray.") + T.visible_message("\The [S.display_name] spasms visibly, shifting in the tray.") /decl/plantgene/fruit/mutate(var/datum/seed/S) if(prob(65)) diff --git a/code/modules/hydroponics/spreading/spreading_response.dm b/code/modules/hydroponics/spreading/spreading_response.dm index b448357187..ab22ae15df 100644 --- a/code/modules/hydroponics/spreading/spreading_response.dm +++ b/code/modules/hydroponics/spreading/spreading_response.dm @@ -68,12 +68,12 @@ var/mob/living/L = A if(!(user in buckled_mobs)) L.visible_message(\ - "\The [user] frees \the [L] from \the [src].",\ - "\The [user] frees you from \the [src].",\ + "\The [user] frees \the [L] from \the [src].",\ + "\The [user] frees you from \the [src].",\ "You hear shredding and ripping.") else L.visible_message(\ - "\The [L] struggles free of \the [src].",\ + "\The [L] struggles free of \the [src].",\ "You untangle \the [src] from around yourself.",\ "You hear shredding and ripping.") unbuckle() diff --git a/code/modules/integrated_electronics/core/assemblies.dm b/code/modules/integrated_electronics/core/assemblies.dm index f671b51569..69e8b69e18 100644 --- a/code/modules/integrated_electronics/core/assemblies.dm +++ b/code/modules/integrated_electronics/core/assemblies.dm @@ -268,7 +268,7 @@ if(S.scan(target)) scanned = TRUE if(scanned) - visible_message("\The [user] waves \the [src] around [target].") + visible_message("\The [user] waves \the [src] around [target].") /obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user) if(can_anchor && I.is_wrench()) diff --git a/code/modules/library/lib_machines.dm b/code/modules/library/lib_machines.dm index cd18f1c75e..db8905be0d 100644 --- a/code/modules/library/lib_machines.dm +++ b/code/modules/library/lib_machines.dm @@ -187,7 +187,7 @@ new /obj/item/weapon/book/tome(src.loc) var/datum/gender/T = gender_datums[user.get_visible_gender()] to_chat(user, "Your sanity barely endures the seconds spent in the vault's browsing window. The only thing to remind you of this when you stop browsing is a dusty old tome sitting on the desk. You don't really remember printing it.") - user.visible_message("\The [user] stares at the blank screen for a few moments, [T.his] expression frozen in fear. When [T.he] finally awakens from it, [T.he] looks a lot older.", 2) + user.visible_message("\The [user] stares at the blank screen for a few moments, [T.his] expression frozen in fear. When [T.he] finally awakens from it, [T.he] looks a lot older.", 2) src.arcanecheckout = 0 if(1) // Inventory diff --git a/code/modules/makeup/nailpolish.dm b/code/modules/makeup/nailpolish.dm new file mode 100644 index 0000000000..4cd989959f --- /dev/null +++ b/code/modules/makeup/nailpolish.dm @@ -0,0 +1,145 @@ +/obj/item/organ/external/var/datum/nail_polish/nail_polish + +/obj/item/weapon/nailpolish + name = "nail polish" + desc = "to paint your nails with. Or someone else's!" + icon = 'icons/obj/nailpolish_vr.dmi' + icon_state = "nailpolish" + var/colour = "#FFFFFF" + var/image/top_underlay + var/image/color_underlay + var/open = FALSE + drop_sound = 'sound/items/drop/glass.ogg' + pickup_sound = 'sound/items/pickup/glass.ogg' + +/obj/item/weapon/nailpolish/Initialize() + . = ..() + desc = "Nail polish, " + initial(desc) + top_underlay = image(icon, "top") + color_underlay = image(icon, "color") + update_icon() + +/obj/item/weapon/nailpolish/proc/set_colour(var/_colour) + colour = _colour + desc = "Nail polish, " + initial(desc) + update_icon() + +/obj/item/weapon/nailpolish/attack_self(var/mob/user) + open = !open + to_chat(user, SPAN_NOTICE("You [open ? "open" : "close"] \the [src].")) + update_icon() + +/obj/item/weapon/nailpolish/update_icon() + . = ..() + icon_state = "[initial(icon_state)][open ? "-open" : ""]" + top_underlay.icon_state = "top[open ? "-open" : ""]" + color_underlay.icon_state = "color[open ? "-open" : ""]" + color_underlay.color = colour + underlays = list(color_underlay, top_underlay) + +/obj/item/organ/external/proc/get_polish(var/colour) + var/static/forbidden_parts = BP_ALL - list(BP_L_HAND, BP_R_HAND, BP_L_FOOT, BP_R_FOOT) + if(organ_tag in forbidden_parts) + return FALSE + var/ico + var/icostate + if(length(markings)) + for(var/mark_name in markings) + var/mark_data = markings[mark_name] + var/datum/sprite_accessory/marking/mark = mark_data["datum"] + if(length(mark.body_parts & forbidden_parts)) + continue + ico = mark.icon + icostate = "[mark.icon_state]-[organ_tag]" + break + else + ico = 'icons/obj/nailpolish_vr.dmi' + icostate = organ_tag + return new /datum/nail_polish(ico, icostate, colour) + +/obj/item/weapon/nailpolish/attack(var/mob/user, var/mob/living/carbon/human/target) + if(!open) + return + + if(!istype(target)) + return + + var/bp = user.zone_sel.selecting + var/obj/item/organ/external/body_part = target.get_organ(bp) + if(!body_part) + to_chat(user, SPAN_WARNING("[target] is missing that limb!")) + return + if(body_part.nail_polish) + to_chat(user, SPAN_NOTICE("[target]'s [body_part.name] already has nail polish on!")) + return + var/datum/nail_polish/polish = body_part.get_polish(colour) + if(!polish) + to_chat(user, SPAN_NOTICE("You can't find any nails on [body_part] to paint.")) + return + if(user == target) + user.visible_message("\The [user] paints their nails with \the [src].", "You paint your nails with \the [src].") + else + if(do_after(user, 2 SECONDS, target)) + user.visible_message("\The [user] paints \the [target]'s nails with \the [src].", "You paint \the [target]'s nails with \the [src].") + else + to_chat(user, SPAN_NOTICE("Both you and [target] must stay still!")) + return + body_part.set_polish(polish) + +/obj/item/organ/external/proc/set_polish(var/datum/nail_polish/polish) + nail_polish = polish + owner?.update_icons_body() + +/obj/item/weapon/nailpolish_remover + name = "nail polish remover" + desc = "Paint thinner, acetone, nail polish remover; whatever you call it, it gets the job done." + drop_sound = 'sound/items/drop/helm.ogg' + pickup_sound = 'sound/items/pickup/helm.ogg' + icon = 'icons/obj/nailpolish_vr.dmi' + icon_state = "nailpolishremover" + var/open = FALSE + +/obj/item/weapon/nailpolish_remover/attack_self(var/mob/user) + open = !open + to_chat(user, SPAN_NOTICE("You [open ? "open" : "close"] \the [src].")) + update_icon() + +/obj/item/weapon/nailpolish_remover/update_icon() + . = ..() + icon_state = "[initial(icon_state)][open ? "-open" : ""]" + +/obj/item/weapon/nailpolish_remover/attack(var/mob/user, var/mob/living/carbon/human/target) + if(!open) + return + + if(!istype(target)) + return + + var/bp = user.zone_sel.selecting + var/obj/item/organ/external/body_part = target.get_organ(bp) + if(!body_part) + to_chat(user, SPAN_WARNING("[target] is missing that limb!")) + return + if(!body_part.nail_polish) + to_chat(user, SPAN_NOTICE("[target]'s [body_part.name] has no nail polish to remove!")) + return + if(user == target) + user.visible_message("\The [user] removes their nail polish with \the [src].", "You remove your nail polish with \the [src].") + else + if(do_after(user, 2 SECONDS, target)) + user.visible_message("\The [user] removes \the [target]'s nail polish with \the [src].", "You remove \the [target]'s nail polish with \the [src].") + else + to_chat(user, SPAN_NOTICE("Both you and [target] must stay still!")) + return + body_part.set_polish(null) + +/datum/nail_polish + var/icon = 'icons/obj/nailpolish_vr.dmi' + var/icon_state + var/color + +/datum/nail_polish/New(var/_icon, var/_icon_state, var/_color) + icon = _icon + icon_state = _icon_state + color = _color + \ No newline at end of file diff --git a/code/modules/maps/tg/reader.dm b/code/modules/maps/tg/reader.dm index 542a0b9582..bb320e27ae 100644 --- a/code/modules/maps/tg/reader.dm +++ b/code/modules/maps/tg/reader.dm @@ -152,7 +152,7 @@ GLOBAL_DATUM_INIT(_preloader, /dmm_suite/preloader, new) if(xcrd > world.maxx) if(cropMap) break - else + else if(!measureOnly) world.maxx = xcrd if(xcrd >= 1) diff --git a/code/modules/materials/materials/glass.dm b/code/modules/materials/materials/glass.dm index 9cfdba3555..dd1f09821e 100644 --- a/code/modules/materials/materials/glass.dm +++ b/code/modules/materials/materials/glass.dm @@ -33,8 +33,8 @@ to_chat(user, "You must be standing on open flooring to build a window.") return 1 - var/title = "Sheet-[used_stack.name] ([used_stack.get_amount()] sheet\s left)" - var/choice = tgui_input_list(title, "What would you like to construct?", "Window Selection", window_options) + var/message = "Sheet-[used_stack.name] ([used_stack.get_amount()] sheet\s left)" + var/choice = tgui_input_list(user, message, "Window Construction", window_options) if(!choice || !used_stack || !user || used_stack.loc != user || user.stat || user.loc != T) return 1 diff --git a/code/modules/materials/materials/organic/cloth.dm b/code/modules/materials/materials/organic/cloth.dm index 588a7ad86f..260c47f5b0 100644 --- a/code/modules/materials/materials/organic/cloth.dm +++ b/code/modules/materials/materials/organic/cloth.dm @@ -28,7 +28,12 @@ new /datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("belt pouch", /obj/item/weapon/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("crude bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), - new /datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]") + new /datum/stack_recipe("empty sandbag", /obj/item/stack/emptysandbag, 2, time = 2 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]"), + new /datum/stack_recipe("painting canvas (11x11)", /obj/item/canvas, 2, time = 2 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("painting canvas (19x19)", /obj/item/canvas/nineteen_nineteen, 3, time = 2 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("painting canvas (23x19)", /obj/item/canvas/twentythree_nineteen, 4, time = 3 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("painting canvas (23x23), AI", /obj/item/canvas/twentythree_twentythree, 5, time = 3 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("painting canvas (24x24)", /obj/item/canvas/twentyfour_twentyfour, 6, time = 3 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]") ) /datum/material/cloth/syncloth diff --git a/code/modules/materials/materials/organic/wood.dm b/code/modules/materials/materials/organic/wood.dm index ecdad547ca..5d82ec4875 100644 --- a/code/modules/materials/materials/organic/wood.dm +++ b/code/modules/materials/materials/organic/wood.dm @@ -43,7 +43,9 @@ new /datum/stack_recipe("crude fishing rod", /obj/item/weapon/material/fishing_rod/built, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), new /datum/stack_recipe("wooden standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), //VOREStation Add new /datum/stack_recipe("noticeboard", /obj/structure/noticeboard, 1, recycle_material = "[name]"), - new /datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]") + new /datum/stack_recipe("tanning rack", /obj/structure/tanning_rack, 3, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"), + new /datum/stack_recipe("painting easel", /obj/structure/easel, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]"), + new /datum/stack_recipe("painting frame", /obj/item/frame/painting, 5, one_per_turf = TRUE, time = 20, on_floor = TRUE, supplied_material = "[name]") ) /datum/material/wood/sif diff --git a/code/modules/materials/sheets/metals/rods.dm b/code/modules/materials/sheets/metals/rods.dm index 2d53c2d305..318ec68626 100644 --- a/code/modules/materials/sheets/metals/rods.dm +++ b/code/modules/materials/sheets/metals/rods.dm @@ -67,7 +67,7 @@ var/global/list/datum/stack_recipe/rods_recipes = list( \ var/obj/item/stack/medical/splint/ghetto/new_splint = new(get_turf(user)) new_splint.add_fingerprint(user) - user.visible_message("\The [user] constructs \a [new_splint] out of a [singular_name].", \ + user.visible_message("\The [user] constructs \a [new_splint] out of a [singular_name].", \ "You use make \a [new_splint] out of a [singular_name].") src.use(1) return diff --git a/code/modules/materials/sheets/organic/tanning/hide.dm b/code/modules/materials/sheets/organic/tanning/hide.dm index a8b229c9eb..e9617ba921 100644 --- a/code/modules/materials/sheets/organic/tanning/hide.dm +++ b/code/modules/materials/sheets/organic/tanning/hide.dm @@ -18,7 +18,7 @@ /obj/item/stack/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob) if(has_edge(W) || is_sharp(W)) //visible message on mobs is defined as visible_message(var/message, var/self_message, var/blind_message) - user.visible_message("\The [user] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") + user.visible_message("\The [user] starts cutting hair off \the [src]", "You start cutting the hair off \the [src]", "You hear the sound of a knife rubbing against flesh") var/scraped = 0 while(amount > 0 && do_after(user, 2.5 SECONDS)) // 2.5s per hide //Try locating an exisitng stack on the tile and add to there if possible diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index aa46981599..66a3088767 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -209,10 +209,10 @@ if(use_cell_power()) active = !active if(active) - visible_message("\The [src] lurches downwards, grinding noisily.") + visible_message("\The [src] lurches downwards, grinding noisily.") need_update_field = 1 else - visible_message("\The [src] shudders to a grinding halt.") + visible_message("\The [src] shudders to a grinding halt.") else to_chat(user, "The drill is unpowered.") else @@ -273,7 +273,7 @@ /obj/machinery/mining/drill/proc/system_error(var/error) if(error) - src.visible_message("\The [src] flashes a '[error]' warning.") + src.visible_message("\The [src] flashes a '[error]' warning.") faultreporter.autosay(error, src.name, "Supply") need_player_check = 1 active = 0 diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index b246835638..78e33a2d52 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -398,7 +398,7 @@ var/list/mining_overlay_cache = list() if (istype(W, /obj/item/device/measuring_tape)) var/obj/item/device/measuring_tape/P = W - user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].") + user.visible_message("\The [user] extends \a [P] towards \the [src].","You extend \the [P] towards \the [src].") if(do_after(user, 15)) to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.") return @@ -408,7 +408,7 @@ var/list/mining_overlay_cache = list() if(C.mode) //Mode means scanning C.depth_scanner.scan_atom(user, src) else - user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!") + user.visible_message("\The [user] extends \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!", "You extend \the [C] over \the [src], a flurry of red beams scanning \the [src]'s surface!") if(do_after(user, 15)) to_chat(user, "\The [src] has been excavated to a depth of [excavation_level]cm.") return diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9cb0f69e35..e0fc08d8ba 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -334,14 +334,15 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(src, "AntagHUD [antagHUD ? "Enabled" : "Disabled"]") /mob/observer/dead/proc/jumpable_areas() - var/list/areas = return_areas() + var/list/areas = return_sorted_areas() if(client?.holder) return areas - for(var/area/A as anything in areas) + for(var/key in areas) + var/area/A = areas[key] if(A.z in using_map?.secret_levels) - areas -= A - return areas + areas -= key + return areas /mob/observer/dead/proc/jumpable_mobs() var/list/mobs = getmobs() @@ -363,11 +364,13 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp to_chat(usr, "Not when you're not dead!") return - - var/area/A = tgui_input_list(usr, "Select an area:", "Ghost Teleport", jumpable_areas()) - if(!A) + var/list/areas = jumpable_areas() + var/input = tgui_input_list(usr, "Select an area:", "Ghost Teleport", areas) + if(!input) return + var/area/A = areas[input] + if(!A) return usr.forceMove(pick(get_area_turfs(A))) usr.on_mob_jump() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index c26629a8bb..f007b5c8dc 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -147,12 +147,9 @@ var/list/slot_equipment_priority = list( \ // If canremove or other conditions need to be checked then use unEquip instead. /mob/proc/drop_from_inventory(var/obj/item/W, var/atom/target) - if(W) - remove_from_mob(W, target) - if(!(W && W.loc)) - return 1 // self destroying objects (tk, grabs) - return 1 - return 0 + if(!W) + return 0 + return remove_from_mob(W, target) //Drops the item in our left hand /mob/proc/drop_l_hand(var/atom/Target) diff --git a/code/modules/mob/living/bot/edCLNbot.dm b/code/modules/mob/living/bot/edCLNbot.dm index d0ebbc91ad..bbb1e9861d 100644 --- a/code/modules/mob/living/bot/edCLNbot.dm +++ b/code/modules/mob/living/bot/edCLNbot.dm @@ -37,7 +37,7 @@ if(!red_switch && blue_switch && !green_switch && prob(50) || src.emagged) if(istype(loc, /turf/simulated)) var/turf/simulated/T = loc - visible_message("\The [src] squirts a puddle of water on the floor!") + visible_message("\The [src] squirts a puddle of water on the floor!") T.wet_floor() if(!red_switch && !blue_switch && green_switch && prob(10) || src.emagged) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index b6ce4ae0ad..f525230124 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -228,7 +228,7 @@ return busy = 1 update_icons() - visible_message("\The [src] begins to repair the hole.") + visible_message("\The [src] begins to repair the hole.") if(do_after(src, 50)) if(A && (locate(/obj/structure/lattice, A) && building == 1 || !locate(/obj/structure/lattice, A) && building == 2)) // Make sure that it still needs repairs var/obj/item/I @@ -245,7 +245,7 @@ if(F.broken || F.burnt) busy = 1 update_icons() - visible_message("\The [src] begins to remove the broken floor.") + visible_message("\The [src] begins to remove the broken floor.") if(do_after(src, 50, F)) if(F.broken || F.burnt) F.make_plating() @@ -255,7 +255,7 @@ else if(!F.flooring && amount) busy = 1 update_icons() - visible_message("\The [src] begins to improve the floor.") + visible_message("\The [src] begins to improve the floor.") if(do_after(src, 50)) if(!F.flooring) F.set_flooring(get_flooring_data(floor_build_type)) @@ -265,7 +265,7 @@ update_icons() else if(istype(A, /obj/item/stack/tile/floor) && amount < maxAmount) var/obj/item/stack/tile/floor/T = A - visible_message("\The [src] begins to collect tiles.") + visible_message("\The [src] begins to collect tiles.") busy = 1 update_icons() if(do_after(src, 20)) @@ -279,7 +279,7 @@ else if(istype(A, /obj/item/stack/material) && amount + 4 <= maxAmount) var/obj/item/stack/material/M = A if(M.get_material_name() == MAT_STEEL) - visible_message("\The [src] begins to make tiles.") + visible_message("\The [src] begins to make tiles.") busy = 1 update_icons() if(do_after(50)) diff --git a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm index 3adf6b34f0..450f47103f 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_attacks.dm @@ -18,6 +18,6 @@ return user.unEquip(W) wear_hat(W) - user.visible_message("\The [user] puts \the [W] on \the [src].") + user.visible_message("\The [user] puts \the [W] on \the [src].") return return ..() diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index b6c9a5e938..8f25d65430 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -58,7 +58,7 @@ to_chat(user, "\The [src] appears to reject this brain. It is incompatable.") return - user.visible_message("\The [user] sticks \a [O] into \the [src].") + user.visible_message("\The [user] sticks \a [O] into \the [src].") B.preserved = TRUE brainmob = B.brainmob diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index a3c75b649d..fa75fb5e91 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -133,6 +133,18 @@ if(accessories_visible.len) tie_msg += " Attached to it is [english_list(accessories_visible)]." + var/list/pocket_msg + if(l_store) + var/l_store_message = l_store.pocket_description(src, user) + if(l_store_message) + LAZYADD(pocket_msg, l_store_message) + if(r_store) + var/r_store_message = r_store.pocket_description(src, user) + if(r_store_message) + LAZYADD(pocket_msg, r_store_message) + if(LAZYLEN(pocket_msg)) + tie_msg += " Near the waist it has [english_list(pocket_msg)]." + if(w_uniform.blood_DNA) msg += "[T.He] [T.is] wearing [bicon(w_uniform)] [w_uniform.gender==PLURAL?"some":"a"] [(w_uniform.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [w_uniform.name]![tie_msg]" else diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b1fe390e78..bc914b5204 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1395,8 +1395,8 @@ /mob/living/carbon/human/drop_from_inventory(var/obj/item/W, var/atom/Target = null) if(W in organs) - return - ..() + return 0 + return ..() /mob/living/carbon/human/reset_view(atom/A, update_hud = 1) ..() diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 3ceea87f7b..feab80627a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -421,7 +421,7 @@ emp_act return if(!zone) - visible_message("\The [O] misses [src] narrowly!") + visible_message("\The [O] misses [src] narrowly!") return O.throwing = 0 //it hit, so stop moving diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm index 106ffb618d..9f3a928b9b 100644 --- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm +++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm @@ -164,7 +164,7 @@ var/list/wrapped_species_by_ref = list() return wrapped_species_by_ref["\ref[src]"] = new_species - visible_message("\The [src] shifts and contorts, taking the form of \a [new_species]!") + visible_message("\The [src] shifts and contorts, taking the form of \a [new_species]!") regenerate_icons() /mob/living/carbon/human/proc/shapeshifter_select_colour() diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index 8ec116221e..082ade0544 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -167,7 +167,7 @@ var/datum/species/shapeshifter/promethean/prometheans if(FEMALE) t_him = "her" - H.visible_message("\The [H] glomps [target] to make [t_him] feel better!", \ + H.visible_message("\The [H] glomps [target] to make [t_him] feel better!", \ "You glomp [target] to make [t_him] feel better!") H.apply_stored_shock_to(target) diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm index 42afbbdbfc..c2864e9f7c 100644 --- a/code/modules/mob/living/carbon/human/species/station/teshari.dm +++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm @@ -207,7 +207,7 @@ // Handled! if(!silent) to_chat(H, SPAN_NOTICE("You catch the air in your wings and greatly slow your fall.")) - landing.visible_message(SPAN_NOTICE("\The [H] glides down from above, landing safely.")) + landing.visible_message("\The [H] glides down from above, landing safely.") H.Stun(1) playsound(H, "rustle", 25, 1) return TRUE diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 7f8d44a742..0b77148d30 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -271,6 +271,11 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon() for(var/M in part.markings) icon_key += "[M][part.markings[M]["color"]]" + + // VOREStation Edit Start + if(part.nail_polish) + icon_key += "_[part.nail_polish.icon]_[part.nail_polish.icon_state]_[part.nail_polish.color]" + // VOREStation Edit End if(part.robotic >= ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" diff --git a/code/modules/mob/living/carbon/lick_wounds.dm b/code/modules/mob/living/carbon/lick_wounds.dm index 6f360a5e53..4dd039186e 100644 --- a/code/modules/mob/living/carbon/lick_wounds.dm +++ b/code/modules/mob/living/carbon/lick_wounds.dm @@ -51,7 +51,7 @@ return else - visible_message("\The [src] starts licking the wounds on [M]'s [affecting.name] clean.", \ + visible_message("\The [src] starts licking the wounds on [M]'s [affecting.name] clean.", \ "You start licking the wounds on [M]'s [affecting.name] clean." ) for (var/datum/wound/W in affecting.wounds) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 1951d370c6..d5de7e47e9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -719,8 +719,8 @@ /mob/living/carbon/drop_from_inventory(var/obj/item/W, var/atom/Target = null) if(W in internal_organs) - return - ..() + return 0 + return ..() /mob/living/touch_map_edge() diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index 6f83805372..7f84eebf6e 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -153,7 +153,7 @@ Whatever you did that made the last camera window disappear-- don't do that agai . = ..() /area/ai_multicam_room - name = "ai_multicam_room" + name = "AI Multicam Room" icon_state = "ai_camera_room" dynamic_lighting = FALSE ambience = list() diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm index 0d909652e0..7a8c3becc6 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_modules_vr.dm @@ -269,7 +269,7 @@ playsound(src, 'sound/weapons/Egloves.ogg', 50, 1, -1) R.cell.charge -= 666 else - user.visible_message("\the [user] affectionately licks all over \the [target]'s face!", "You affectionately lick all over \the [target]'s face!") + user.visible_message("\The [user] affectionately licks all over \the [target]'s face!", "You affectionately lick all over \the [target]'s face!") playsound(src, 'sound/effects/attackblob.ogg', 50, 1) water.use_charge(5) var/mob/living/carbon/human/H = target diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index afa61a5317..32cc4f32d4 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -173,7 +173,7 @@ var/list/mob_hat_cache = list() return user.unEquip(W) wear_hat(W) - user.visible_message("\The [user] puts \the [W] on \the [src].") + user.visible_message("\The [user] puts \the [W] on \the [src].") return else if(istype(W, /obj/item/borg/upgrade/)) to_chat(user, "\The [src] is not compatible with \the [W].") diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm index f777fe7996..cc0b3785b6 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/_thinktank.dm @@ -165,4 +165,4 @@ if(!recharge_complete && recharging_atom.percent() >= 100) recharge_complete = TRUE - visible_message(SPAN_NOTICE("\The [src] beeps and flashes a green light above \his recharging port.")) + visible_message("\The [src] beeps and flashes a green light above \his recharging port.") diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm index f9a78b4f12..0c981cb4b2 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_interactions.dm @@ -6,7 +6,7 @@ if(istype(recharging_atom) && !QDELETED(recharging_atom) && recharging_atom.loc == src) recharging_atom.dropInto(loc) user.put_in_hands(recharging_atom) - user.visible_message(SPAN_NOTICE("\The [user] pops \the [recharging_atom] out of \the [src]'s recharging port.")) + user.visible_message("\The [user] pops \the [recharging_atom] out of \the [src]'s recharging port.") recharging = null return TRUE @@ -24,7 +24,7 @@ W.forceMove(src) recharging = weakref(W) recharge_complete = FALSE - user.visible_message(SPAN_NOTICE("\The [user] slots \the [W] into \the [src]'s recharging port.")) + user.visible_message("\The [user] slots \the [W] into \the [src]'s recharging port.") return TRUE if(istype(W, /obj/item/device/floor_painter)) diff --git a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm index ec6d6f4267..6ffe75bfe3 100644 --- a/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm +++ b/code/modules/mob/living/silicon/robot/subtypes/thinktank/thinktank_storage.dm @@ -82,9 +82,9 @@ if(istype(ejecting) && !QDELETED(ejecting) && ejecting.loc == src) ejecting.dropInto(loc) if(user == src) - visible_message(SPAN_NOTICE("\The [src] ejects \the [ejecting] from its cargo compartment.")) + visible_message("\The [src] ejects \the [ejecting] from its cargo compartment.") else - user.visible_message(SPAN_NOTICE("\The [user] pulls \the [ejecting] from \the [src]'s cargo compartment.")) + user.visible_message("\The [user] pulls \the [ejecting] from \the [src]'s cargo compartment.") /mob/living/silicon/robot/platform/attack_ai(mob/user) if(isrobot(user) && user.Adjacent(src)) @@ -99,7 +99,7 @@ if(!istype(removing) || QDELETED(removing) || removing.loc != src) LAZYREMOVE(stored_atoms, remove_ref) else - user.visible_message(SPAN_NOTICE("\The [user] begins unloading \the [removing] from \the [src]'s cargo compartment.")) + user.visible_message("\The [user] begins unloading \the [removing] from \the [src]'s cargo compartment.") if(do_after(user, 3 SECONDS, src) && !QDELETED(removing) && removing.loc == src) drop_stored_atom(removing, user) return TRUE @@ -124,9 +124,9 @@ if(!can_mouse_drop(dropping, user) || !can_store_atom(dropping, user)) return FALSE if(user == src) - visible_message(SPAN_NOTICE("\The [src] begins loading \the [dropping] into its cargo compartment.")) + visible_message("\The [src] begins loading \the [dropping] into its cargo compartment.") else - user.visible_message(SPAN_NOTICE("\The [user] begins loading \the [dropping] into \the [src]'s cargo compartment.")) + user.visible_message("\The [user] begins loading \the [dropping] into \the [src]'s cargo compartment.") if(do_after(user, 3 SECONDS, src) && can_mouse_drop(dropping, user) && can_store_atom(dropping, user)) store_atom(dropping, user) return FALSE diff --git a/code/modules/mob/living/simple_mob/defense.dm b/code/modules/mob/living/simple_mob/defense.dm index b17274bd2f..b0d622cb20 100644 --- a/code/modules/mob/living/simple_mob/defense.dm +++ b/code/modules/mob/living/simple_mob/defense.dm @@ -64,7 +64,7 @@ MED.amount -= 1 if(MED.amount <= 0) qdel(MED) - visible_message("\The [user] applies the [MED] on [src].") + visible_message("\The [user] applies the [MED] on [src].") else var/datum/gender/T = gender_datums[src.get_visible_gender()] to_chat(user, "\The [src] is dead, medical items won't bring [T.him] back to life.") // the gender lookup is somewhat overkill, but it functions identically to the obsolete gender macros and future-proofs this code diff --git a/code/modules/mob/living/simple_mob/simple_mob_vr.dm b/code/modules/mob/living/simple_mob/simple_mob_vr.dm index c66b982b7d..749def3e84 100644 --- a/code/modules/mob/living/simple_mob/simple_mob_vr.dm +++ b/code/modules/mob/living/simple_mob/simple_mob_vr.dm @@ -161,9 +161,9 @@ vore_pounce_cooldown = world.time + 20 SECONDS // don't attempt another pounce for a while if(prob(successrate)) // pounce success! M.Weaken(5) - M.visible_message("\the [src] pounces on \the [M]!!") + M.visible_message("\The [src] pounces on \the [M]!!") else // pounce misses! - M.visible_message("\the [src] attempts to pounce \the [M] but misses!!") + M.visible_message("\The [src] attempts to pounce \the [M] but misses!!") playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) if(will_eat(M) && (!M.canmove || vore_standing_too)) //if they're edible then eat them too @@ -263,7 +263,7 @@ if(istype(tmob) && will_eat(tmob) && !istype(tmob, type) && prob(vore_bump_chance) && !ckey) //check if they decide to eat. Includes sanity check to prevent cannibalism. if(tmob.canmove && prob(vore_pounce_chance)) //if they'd pounce for other noms, pounce for these too, otherwise still try and eat them if they hold still tmob.Weaken(5) - tmob.visible_message("\the [src] [vore_bump_emote] \the [tmob]!!") + tmob.visible_message("\The [src] [vore_bump_emote] \the [tmob]!!") set_AI_busy(TRUE) spawn() animal_nom(tmob) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm index 5e1aab7290..b942f69d0f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse_vr.dm @@ -38,7 +38,7 @@ var/obj/item/weapon/storage/S = O var/obj/item/weapon/holder/H = new holder_type(get_turf(src),src) //this works weird, but it creates an empty holder, to see if that holder can fit if(S.can_be_inserted(H) && (src.size_multiplier <= 0.75)) - visible_message("\the [src] squeezes into \the [S].") + visible_message("\The [src] squeezes into \the [S].") H.forceMove(S) return 1 else diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 722ac3ffcd..3c8cd73f09 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -185,7 +185,7 @@ var/list/_cat_default_emotes = list( /mob/living/simple_mob/animal/passive/cat/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/pen) || istype(W, /obj/item/device/flashlight/pen)) if(named) - to_chat(user, "\the [name] already has a name!") + to_chat(user, "\The [name] already has a name!") else var/tmp_name = sanitizeSafe(input(user, "Give \the [name] a name", "Name"), MAX_NAME_LEN) if(length(tmp_name) > 50) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm index 0ac8d54c2b..7bb9db0b06 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/hooligan_crab.dm @@ -116,5 +116,5 @@ if(prob(10)) for(var/mob/living/L in hearers(holder)) if(!istype(L, holder)) // Don't follow other hooligan crabs. - holder.visible_message("\The [holder] starts to follow \the [L].") + holder.visible_message("\The [holder] starts to follow \the [L].") set_follow(L, rand(20 SECONDS, 40 SECONDS)) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm index 8c0e653ee9..3c01214918 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm @@ -181,7 +181,7 @@ if(holder.get_active_hand() && istype(holder.get_active_hand(), /obj/item/clothing/head) && !S.hat) var/obj/item/I = holder.get_active_hand() S.take_hat(S) - holder.visible_message("\The [holder] wears \the [I]") + holder.visible_message("\The [holder] wears \the [I]") /mob/living/simple_mob/animal/sif/sakimm/intelligent desc = "What appears to be an oversized rodent with hands. This one has a curious look in its eyes." @@ -327,7 +327,7 @@ if(istype(holder) && istype(holder.get_active_hand(), /obj/item/clothing/head) && !S.hat) var/obj/item/I = holder.get_active_hand() S.take_hat(S) - holder.visible_message("\The [holder] wears \the [I]") + holder.visible_message("\The [holder] wears \the [I]") carrying_item = TRUE if(istype(holder) && S.hat) // Do we have a hat? Hats are loot. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm index 7ca24f3174..dbf9b48159 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/bats.dm @@ -41,7 +41,7 @@ var/mob/living/L = A if(prob(scare_chance)) L.Stun(1) - L.visible_message("\the [src] scares \the [L]!") + L.visible_message("\The [src] scares \the [L]!") // Spookiest of bats /mob/living/simple_mob/animal/space/bats/cult diff --git a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm index 2e014482f2..ece32ca7a4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm +++ b/code/modules/mob/living/simple_mob/subtypes/mechanical/drones/mining_drone.dm @@ -116,7 +116,7 @@ my_storage.rangedload(T, src) if(my_storage.contents.len >= my_storage.max_storage_space) - visible_message("\The [src] emits a shrill beep, indicating its storage is full.") + visible_message("\The [src] emits a shrill beep, indicating its storage is full.") var/obj/structure/ore_box/OB = locate() in view(2, src) diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index 0a0f36d516..33d2494884 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -126,7 +126,7 @@ var/repair_upper_bound = A.melee_damage_upper * -1 adjustBruteLoss(rand(repair_lower_bound, repair_upper_bound)) adjustFireLoss(rand(repair_lower_bound, repair_upper_bound)) - user.visible_message("\The [user] mends some of \the [src]'s wounds.") + user.visible_message("\The [user] mends some of \the [src]'s wounds.") else to_chat(user, "\The [src] is undamaged.") return diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm index 1c4ac8876c..d65c9527b2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm @@ -48,7 +48,7 @@ var/mob/living/L = A if(prob(12)) L.Weaken(3) - L.visible_message("\the [src] knocks down \the [L]!") + L.visible_message("\The [src] knocks down \the [L]!") // Strong Variant /mob/living/simple_mob/faithless/strong diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm index a1afb7bbb2..fd4837b955 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/rat.dm @@ -160,7 +160,7 @@ hunger += 5 else food.Weaken(5) - food.visible_message("\the [src] pounces on \the [food]!!") + food.visible_message("\The [src] pounces on \the [food]!!") target_mob = food EatTarget() hunger = 0 diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm index 69ec5ceea5..d0a06f570a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/solargrub.dm @@ -69,7 +69,7 @@ List of things solar grubs should be able to do: if(attached) set_AI_busy(TRUE) if(prob(2)) - src.visible_message("\The [src] begins to sink power from the net.") + src.visible_message("\The [src] begins to sink power from the net.") if(prob(5)) var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread() sparks.set_up(5, 0, get_turf(src)) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 67eab03afa..1af7d10fb1 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -132,9 +132,7 @@ new_player_panel_proc() if(href_list["observe"]) - var/alert_time = ticker?.current_state <= GAME_STATE_SETTING_UP ? 1 : round(config.respawn_time/10/60) - - if(tgui_alert(src,"Are you sure you wish to observe? You will have to wait up to [alert_time] minute\s before being able to spawn into the game!","Player Setup",list("Yes","No")) == "Yes") + if(tgui_alert(src,"Are you sure you wish to observe? If you do, make sure to not use any knowledge gained from observing if you decide to join later.","Player Setup",list("Yes","No")) == "Yes") if(!client) return 1 //Make a new mannequin quickly, and allow the observer to take the appearance diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index 2cbf9a74f8..651ed85b14 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -29,7 +29,7 @@ all_underwear[WRC.name] = WRI.name - backbag = rand(1,5) + backbag = rand(1,6) pdachoice = rand(1,5) age = rand(current_species.min_age, current_species.max_age) b_type = RANDOM_BLOOD_TYPE diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 1e7184f965..8984efe214 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -23,7 +23,7 @@ var/icon_state // the icon_state of the accessory var/preview_state // a custom preview state for whatever reason - var/name // the preview name of the accessory + var/name = "ERROR - FIXME" // the preview name of the accessory // Determines if the accessory will be skipped or included in random hair generations var/gender = NEUTER @@ -1819,6 +1819,7 @@ shaved //Teshari things /datum/sprite_accessory/hair/teshari name = "Teshari Default" + icon_add = 'icons/mob/human_face_vr_add.dmi' icon_state = "teshari_default" species_allowed = list(SPECIES_TESHARI) @@ -1855,8 +1856,8 @@ shaved icon_state = "teshari_mohawk" /datum/sprite_accessory/hair/teshari/pointy - name = "Teshari Pointy" - icon_state = "teshari_pointy" + name = "Teshari Pointy" + icon_state = "teshari_pointy" /datum/sprite_accessory/hair/teshari/upright name = "Teshari Upright" @@ -1875,7 +1876,6 @@ shaved icon_state = "teshari_mushroom" //Tesh things ported from Ark Station - /datum/sprite_accessory/hair/teshari/twies name = "Teshari Twies" icon_state = "teshari_twies" diff --git a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm index 52d1d1923b..742480858c 100644 --- a/code/modules/mob/new_player/sprite_accessories_extra_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_extra_vr.dm @@ -5,732 +5,849 @@ color_blend_mode = ICON_ADD species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) //This lets all races use -/datum/sprite_accessory/marking/vr - icon = 'icons/mob/human_races/markings_vr.dmi' - -/datum/sprite_accessory/marking/vr/vulp_belly +/datum/sprite_accessory/marking/vr_vulp_belly name = "belly fur (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_belly" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/vulp_fullbelly +/datum/sprite_accessory/marking/vr_vulp_fullbelly name = "full belly fur (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_fullbelly" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/vulp_crest +/datum/sprite_accessory/marking/vr_vulp_crest name = "belly crest (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_crest" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/vulp_nose +/datum/sprite_accessory/marking/vr_vulp_nose name = "nose (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_nose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/vulp_short_nose +/datum/sprite_accessory/marking/vr_vulp_short_nose name = "nose, short (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_short_nose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/snoutstripe +/datum/sprite_accessory/marking/vr_snoutstripe name = "snout stripe (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "snoutstripe" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/vulp_face +/datum/sprite_accessory/marking/vr_vulp_face name = "face (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_face" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/vulp_facealt +/datum/sprite_accessory/marking/vr_vulp_facealt name = "face, alt. (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_facealt" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/vulp_earsface +/datum/sprite_accessory/marking/vr_vulp_earsface name = "ears and face (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_earsface" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/vulp_all +/datum/sprite_accessory/marking/vr_vulp_all name = "all head highlights (Vulp)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vulp_all" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/sergal_full +/datum/sprite_accessory/marking/vr_sergal_full name = "Sergal Markings" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "sergal_full" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) species_allowed = list("Sergal") -/datum/sprite_accessory/marking/vr/sergal_full_female +/datum/sprite_accessory/marking/vr_sergal_full_female name = "Sergal Markings (Female)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "sergal_full_female" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) species_allowed = list("Sergal") -/datum/sprite_accessory/marking/vr/monoeye +/datum/sprite_accessory/marking/vr_monoeye name = "Monoeye" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "monoeye" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/spidereyes +/datum/sprite_accessory/marking/vr_spidereyes name = "Spider Eyes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "spidereyes" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/sergaleyes +/datum/sprite_accessory/marking/vr_sergaleyes name = "Sergal Eyes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "eyes_sergal" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/closedeyes +/datum/sprite_accessory/marking/vr_closedeyes name = "Closed Eyes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "eyes_closed" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/brows +/datum/sprite_accessory/marking/vr_brows name = "Eyebrows" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "brows" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/nevrean_female +/datum/sprite_accessory/marking/vr_nevrean_female name = "Female Nevrean beak" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "nevrean_f" body_parts = list(BP_HEAD) color_blend_mode = ICON_MULTIPLY gender = FEMALE -/datum/sprite_accessory/marking/vr/nevrean_male +/datum/sprite_accessory/marking/vr_nevrean_male name = "Male Nevrean beak" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "nevrean_m" body_parts = list(BP_HEAD) color_blend_mode = ICON_MULTIPLY gender = MALE -/datum/sprite_accessory/marking/vr/spots +/datum/sprite_accessory/marking/vr_spots name = "Spots" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "spots" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) -/datum/sprite_accessory/marking/vr/shaggy_mane +/datum/sprite_accessory/marking/vr_shaggy_mane name = "Shaggy mane/feathers" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "shaggy" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO) -/datum/sprite_accessory/marking/vr/jagged_teeth +/datum/sprite_accessory/marking/vr_jagged_teeth name = "Jagged teeth" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "jagged" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/blank_face +/datum/sprite_accessory/marking/vr_blank_face name = "Blank round face (use with monster mouth)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "blankface" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/monster_mouth +/datum/sprite_accessory/marking/vr_monster_mouth name = "Monster mouth" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "monster" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/saber_teeth +/datum/sprite_accessory/marking/vr_saber_teeth name = "Saber teeth" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "saber" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/fangs +/datum/sprite_accessory/marking/vr_fangs name = "Fangs" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "fangs" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/tusks +/datum/sprite_accessory/marking/vr_tusks name = "Tusks" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "tusks" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/otie_face +/datum/sprite_accessory/marking/vr_otie_face name = "Otie face" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "otieface" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/otie_nose +/datum/sprite_accessory/marking/vr_otie_nose name = "Otie nose" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "otie_nose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/otienose_lite +/datum/sprite_accessory/marking/vr_otienose_lite name = "Short otie nose" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "otienose_lite" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/backstripes +/datum/sprite_accessory/marking/vr_backstripes name = "Back stripes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "otiestripes" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/belly_butt +/datum/sprite_accessory/marking/vr_belly_butt name = "Belly and butt" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "bellyandbutt" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_GROIN,BP_TORSO) -/datum/sprite_accessory/marking/vr/fingers_toes +/datum/sprite_accessory/marking/vr_fingers_toes name = "Fingers and toes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "fingerstoes" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) -/datum/sprite_accessory/marking/vr/otie_socks +/datum/sprite_accessory/marking/vr_otie_socks name = "Fingerless socks" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "otiesocks" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) -/datum/sprite_accessory/marking/vr/corvid_beak +/datum/sprite_accessory/marking/vr_corvid_beak name = "Corvid beak" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "corvidbeak" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/corvid_belly +/datum/sprite_accessory/marking/vr_corvid_belly name = "Corvid belly" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "corvidbelly" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_GROIN,BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/cow_body +/datum/sprite_accessory/marking/vr_cow_body name = "Cow markings" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "cowbody" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/cow_nose +/datum/sprite_accessory/marking/vr_cow_nose name = "Cow nose" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "cownose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/zmask +/datum/sprite_accessory/marking/vr_zmask name = "Eye mask" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zmask" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/zbody +/datum/sprite_accessory/marking/vr_zbody name = "Thick jagged stripes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zbody" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_GROIN,BP_TORSO) -/datum/sprite_accessory/marking/vr/znose +/datum/sprite_accessory/marking/vr_znose name = "Jagged snout" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "znose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/otter_nose +/datum/sprite_accessory/marking/vr_otter_nose name = "Otter nose" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "otternose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/otter_face +/datum/sprite_accessory/marking/vr_otter_face name = "Otter face" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "otterface" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/deer_face +/datum/sprite_accessory/marking/vr_deer_face name = "Deer face" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "deerface" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/sharkface +/datum/sprite_accessory/marking/vr_sharkface name = "Akula snout" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "sharkface" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/sheppy_face +/datum/sprite_accessory/marking/vr_sheppy_face name = "Shepherd snout" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "shepface" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/sheppy_back +/datum/sprite_accessory/marking/vr_sheppy_back name = "Shepherd back" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "shepback" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/zorren_belly_male +/datum/sprite_accessory/marking/vr_zorren_belly_male name = "Zorren Male Torso" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_belly" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/zorren_belly_female +/datum/sprite_accessory/marking/vr_zorren_belly_female name = "Zorren Female Torso" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_belly_female" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/zorren_back_patch +/datum/sprite_accessory/marking/vr_zorren_back_patch name = "Zorren Back Patch" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_backpatch" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO) -/datum/sprite_accessory/marking/vr/zorren_face_male +/datum/sprite_accessory/marking/vr_zorren_face_male name = "Zorren Male Face" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_face" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) gender = MALE -/datum/sprite_accessory/marking/vr/zorren_face_female +/datum/sprite_accessory/marking/vr_zorren_face_female name = "Zorren Female Face" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_face_female" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) gender = FEMALE -/datum/sprite_accessory/marking/vr/zorren_muzzle_male +/datum/sprite_accessory/marking/vr_zorren_muzzle_male name = "Zorren Male Muzzle" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_muzzle" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) gender = MALE -/datum/sprite_accessory/marking/vr/zorren_muzzle_female +/datum/sprite_accessory/marking/vr_zorren_muzzle_female name = "Zorren Female Muzzle" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_muzzle_female" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) gender = FEMALE -/datum/sprite_accessory/marking/vr/zorren_socks +/datum/sprite_accessory/marking/vr_zorren_socks name = "Zorren Socks" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_socks" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) -/datum/sprite_accessory/marking/vr/zorren_longsocks +/datum/sprite_accessory/marking/vr_zorren_longsocks name = "Zorren Longsocks" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "zorren_longsocks" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) -/datum/sprite_accessory/marking/vr/tesh_feathers +/datum/sprite_accessory/marking/vr_tesh_feathers name = "Teshari Feathers" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "tesh-feathers" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) -/datum/sprite_accessory/marking/vr/harpy_feathers +/datum/sprite_accessory/marking/vr_harpy_feathers name = "Rapala leg Feather" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "harpy-feathers" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG) -/datum/sprite_accessory/marking/vr/harpy_legs +/datum/sprite_accessory/marking/vr_harpy_legs name = "Rapala leg coloring" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "harpy-leg" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) -/datum/sprite_accessory/marking/vr/chooves +/datum/sprite_accessory/marking/vr_chooves name = "Cloven hooves" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "chooves" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT) -/datum/sprite_accessory/marking/vr/body_tone +/datum/sprite_accessory/marking/vr_body_tone name = "Body toning (for emergency contrast loss)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "btone" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) -/datum/sprite_accessory/marking/vr/gloss +/datum/sprite_accessory/marking/vr_gloss name = "Full body gloss" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "gloss" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/eboop_panels +/datum/sprite_accessory/marking/vr_eboop_panels name = "Eggnerd FBP panels" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "eboop" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/osocks_rarm +/datum/sprite_accessory/marking/vr_osocks_rarm name = "Modular Longsock (right arm)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "osocks" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_R_ARM,BP_R_HAND) -/datum/sprite_accessory/marking/vr/osocks_larm +/datum/sprite_accessory/marking/vr_osocks_larm name = "Modular Longsock (left arm)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "osocks" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_ARM,BP_L_HAND) -/datum/sprite_accessory/marking/vr/osocks_rleg +/datum/sprite_accessory/marking/vr_osocks_rleg name = "Modular Longsock (right leg)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "osocks" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_R_FOOT,BP_R_LEG) -/datum/sprite_accessory/marking/vr/osocks_lleg +/datum/sprite_accessory/marking/vr_osocks_lleg name = "Modular Longsock (left leg)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "osocks" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_L_LEG) -/datum/sprite_accessory/marking/vr/animeeyesinner +/datum/sprite_accessory/marking/vr_animeeyesinner name = "Anime Eyes Inner" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "animeeyesinner" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/animeeyesouter +/datum/sprite_accessory/marking/vr_animeeyesouter name = "Anime Eyes Outer" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "animeeyesouter" body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/panda_eye_marks +/datum/sprite_accessory/marking/vr_panda_eye_marks name = "Panda Eye Markings" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "eyes_panda" body_parts = list(BP_HEAD) species_allowed = list(SPECIES_EVENT1, SPECIES_EVENT2, SPECIES_EVENT3) -/datum/sprite_accessory/marking/vr/catwomantorso +/datum/sprite_accessory/marking/vr_catwomantorso name = "Catwoman chest stripes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "catwomanchest" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_TORSO) -/datum/sprite_accessory/marking/vr/catwomangroin +/datum/sprite_accessory/marking/vr_catwomangroin name = "Catwoman groin stripes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "catwomangroin" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_GROIN) -/datum/sprite_accessory/marking/vr/catwoman_rleg +/datum/sprite_accessory/marking/vr_catwoman_rleg name = "Catwoman right leg stripes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "catwomanright" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_R_LEG) -/datum/sprite_accessory/marking/vr/catwoman_lleg +/datum/sprite_accessory/marking/vr_catwoman_lleg name = "Catwoman left leg stripes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "catwomanleft" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG) -/datum/sprite_accessory/marking/vr/teshi_small_feathers +/datum/sprite_accessory/marking/vr_teshi_small_feathers name = "Teshari small wingfeathers" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "teshi_sf" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND,BP_TORSO) -/datum/sprite_accessory/marking/vr/spirit_lights +/datum/sprite_accessory/marking/vr_spirit_lights name = "Ward - Spirit FBP Lights" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "lights" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/spirit_lights_body +/datum/sprite_accessory/marking/vr_spirit_lights_body name = "Ward - Spirit FBP Lights (body)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "lights" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO) -/datum/sprite_accessory/marking/vr/spirit_lights_head +/datum/sprite_accessory/marking/vr_spirit_lights_head name = "Ward - Spirit FBP Lights (head)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "lights" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/spirit_panels +/datum/sprite_accessory/marking/vr_spirit_panels name = "Ward - Spirit FBP Panels" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "panels" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/spirit_panels_body +/datum/sprite_accessory/marking/vr_spirit_panels_body name = "Ward - Spirit FBP Panels (body)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "panels" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO) -/datum/sprite_accessory/marking/vr/spirit_panels_head +/datum/sprite_accessory/marking/vr_spirit_panels_head name = "Ward - Spirit FBP Panels (head)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "panels" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/tentacle_head +/datum/sprite_accessory/marking/vr_tentacle_head name = "Squid Head" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "tentaclehead" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/tentacle_mouth +/datum/sprite_accessory/marking/vr_tentacle_mouth name = "Tentacle Mouth" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "tentaclemouth" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/rosette +/datum/sprite_accessory/marking/vr_rosette name = "Rosettes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "rosette" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_GROIN,BP_TORSO,BP_HEAD) -/datum/sprite_accessory/marking/vr/werewolf_nose +/datum/sprite_accessory/marking/vr_werewolf_nose name = "Werewolf nose" + icon = 'icons/mob/human_races/markings_vr.dmi' icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' icon_state = "werewolf_nose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) species_allowed = list(SPECIES_WEREBEAST) -/datum/sprite_accessory/marking/vr/werewolf_face +/datum/sprite_accessory/marking/vr_werewolf_face name = "Werewolf face" + icon = 'icons/mob/human_races/markings_vr.dmi' icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' icon_state = "werewolf" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) species_allowed = list(SPECIES_WEREBEAST) -/datum/sprite_accessory/marking/vr/werewolf_belly +/datum/sprite_accessory/marking/vr_werewolf_belly name = "Werewolf belly" + icon = 'icons/mob/human_races/markings_vr.dmi' icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' icon_state = "werewolf" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_GROIN,BP_TORSO) species_allowed = list(SPECIES_WEREBEAST) -/datum/sprite_accessory/marking/vr/werewolf_socks +/datum/sprite_accessory/marking/vr_werewolf_socks name = "Werewolf socks" + icon = 'icons/mob/human_races/markings_vr.dmi' icon = 'icons/mob/species/werebeast/werebeast_markings.dmi' icon_state = "werewolf" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND) species_allowed = list(SPECIES_WEREBEAST) -/datum/sprite_accessory/marking/vr/shadekin_snoot +/datum/sprite_accessory/marking/vr_shadekin_snoot name = "Shadekin Snoot" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "shadekin-snoot" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) -/datum/sprite_accessory/marking/vr/taj_nose_alt +/datum/sprite_accessory/marking/vr_taj_nose_alt name = "Nose Color, alt. (Taj)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "taj_nosealt" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/talons +/datum/sprite_accessory/marking/vr_talons name = "Talons" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "talons" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG) -/datum/sprite_accessory/marking/vr/claws +/datum/sprite_accessory/marking/vr_claws name = "Claws" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "claws" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_HAND,BP_R_HAND) -/datum/sprite_accessory/marking/vr/equine_snout //Why the long face? Works best with sergal bodytype. +/datum/sprite_accessory/marking/vr_equine_snout //Why the long face? Works best with sergal bodytype. name = "Equine Snout" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "donkey" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/equine_nose +/datum/sprite_accessory/marking/vr_equine_nose name = "Equine Nose" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "dnose" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/bee_stripes +/datum/sprite_accessory/marking/vr_bee_stripes name = "bee stripes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "beestripes" body_parts = list(BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/vas_toes +/datum/sprite_accessory/marking/vr_vas_toes name = "Bug Paws (Vasilissan)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "vas_toes" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT) //CitRP stuff -/datum/sprite_accessory/marking/vr/vox_alt +/datum/sprite_accessory/marking/vr_vox_alt name = "Vox Alternate" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "bay_vox" body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) species_allowed = list(SPECIES_VOX) -/datum/sprite_accessory/marking/vr/vox_alt_eyes +/datum/sprite_accessory/marking/vr_vox_alt_eyes name = "Alternate Vox Eyes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "bay_vox_eyes" body_parts = list(BP_HEAD) species_allowed = list(SPECIES_VOX) -/datum/sprite_accessory/marking/vr/c_beast_body +/datum/sprite_accessory/marking/vr_c_beast_body name = "Cyber Body" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "c_beast_body" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_GROIN) -/datum/sprite_accessory/marking/vr/c_beast_plating +/datum/sprite_accessory/marking/vr_c_beast_plating name = "Cyber Plating (Use w/ Cyber Body)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "c_beast_plating" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM) -/datum/sprite_accessory/marking/vr/c_beast_band +/datum/sprite_accessory/marking/vr_c_beast_band name = "Cyber Band (Use w/ Cybertech head)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "c_beast_band" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/c_beast_cheek_a +/datum/sprite_accessory/marking/vr_c_beast_cheek_a name = "Cyber Beast Cheeks A (Use A, B and C)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "c_beast_a" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/c_beast_cheek_b +/datum/sprite_accessory/marking/vr_c_beast_cheek_b name = "Cyber Beast Cheeks B (Use A, B and C)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "c_beast_b" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/c_beast_cheek_c +/datum/sprite_accessory/marking/vr_c_beast_cheek_c name = "Cyber Beast Cheeks C (Use A, B and C)" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "c_beast_c" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/teshari_large_eyes +/datum/sprite_accessory/marking/vr_teshari_large_eyes name = "Teshari large eyes" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "teshlarge_eyes" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) species_allowed = list(SPECIES_TESHARI) -/datum/sprite_accessory/marking/vr/teshari_coat +/datum/sprite_accessory/marking/vr_teshari_coat name = "Teshari coat" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "tesh_coat" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_TORSO,BP_HEAD) species_allowed = list(SPECIES_TESHARI) -/datum/sprite_accessory/marking/vr/teshari_pattern_male +/datum/sprite_accessory/marking/vr_teshari_pattern_male name = "Teshari male pattern" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "tesh-pattern-male" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) species_allowed = list(SPECIES_TESHARI) -/datum/sprite_accessory/marking/vr/teshari_pattern_female +/datum/sprite_accessory/marking/vr_teshari_pattern_female name = "Teshari female pattern" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "tesh-pattern-fem" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG,BP_L_HAND,BP_R_HAND,BP_TORSO,BP_GROIN,BP_HEAD) species_allowed = list(SPECIES_TESHARI) -/datum/sprite_accessory/marking/vr/voxscales +/datum/sprite_accessory/marking/vr_voxscales name = "Vox Scales" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "Voxscales" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_LEG,BP_R_LEG,BP_L_ARM,BP_R_ARM,BP_L_HAND,BP_R_HAND,BP_HEAD) -/datum/sprite_accessory/marking/vr/voxclaws +/datum/sprite_accessory/marking/vr_voxclaws name = "Vox Claws" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "Voxclaws" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_FOOT,BP_R_FOOT,BP_L_HAND,BP_R_HAND) -/datum/sprite_accessory/marking/vr/voxbeak +/datum/sprite_accessory/marking/vr_voxbeak name = "Vox Beak" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "Voxscales" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathihood +/datum/sprite_accessory/marking/vr_unathihood name = "Cobra Hood" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathihood" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathidoublehorns +/datum/sprite_accessory/marking/vr_unathidoublehorns name = "Double Unathi Horns" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathidoublehorns" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathihorns +/datum/sprite_accessory/marking/vr_unathihorns name = "Unathi Horns" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathihorns" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathiramhorns +/datum/sprite_accessory/marking/vr_unathiramhorns name = "Unathi Ram Horns" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathiramhorns" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathishortspines +/datum/sprite_accessory/marking/vr_unathishortspines name = "Unathi Short Spines" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathishortspines" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathilongspines +/datum/sprite_accessory/marking/vr_unathilongspines name = "Unathi Long Spines" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathilongspines" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathishortfrills +/datum/sprite_accessory/marking/vr_unathishortfrills name = "Unathi Short Frills" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathishortfrills" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/unathilongfrills +/datum/sprite_accessory/marking/vr_unathilongfrills name = "Unathi Long Frills" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "unathilongfrills" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_HEAD) -/datum/sprite_accessory/marking/vr/thunderthighs +/datum/sprite_accessory/marking/vr_thunderthighs name = "Boosted Thighs" + icon = 'icons/mob/human_races/markings_vr.dmi' icon_state = "thunderthighs" color_blend_mode = ICON_MULTIPLY body_parts = list(BP_L_LEG,BP_R_LEG) \ No newline at end of file diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm index fc3994b528..1652fbfca9 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -57,7 +57,7 @@ suit_sprites = 'icons/mob/taursuits_wolf_vr.dmi' icon_sprite_tag = "wolf" -/datum/sprite_accessory/tail/taur/fatwolf +/datum/sprite_accessory/tail/taur/wolf/fatwolf name = "Fat Wolf (Taur)" icon_state = "fatwolf_s" icon_sprite_tag = "wolf" //This could be modified later. @@ -83,7 +83,7 @@ extra_overlay2 = "synthwolf_glow" //icon_sprite_tag = "synthwolf" -/datum/sprite_accessory/tail/taur/ch/wolf/fatsynthwolf +/datum/sprite_accessory/tail/taur/wolf/fatsynthwolf name = "Fat SynthWolf dual-color (Taur)" icon_state = "fatsynthwolf_s" extra_overlay = "fatsynthwolf_markings" @@ -219,11 +219,11 @@ extra_overlay = "lizard_markings" //icon_sprite_tag = "lizard2c" -/datum/sprite_accessory/tail/taur/ch/lizard/fat +/datum/sprite_accessory/tail/taur/lizard/fatlizard name = "Fat Lizard (Taur)" icon_state = "fatlizard_s" -/datum/sprite_accessory/tail/taur/ch/lizard/fat_2c +/datum/sprite_accessory/tail/taur/lizard/fatlizard_2c name = "Fat Lizard (Taur, dual-color)" icon_state = "fatlizard_s" extra_overlay= "fatlizard_markings" @@ -235,7 +235,7 @@ extra_overlay2 = "synthlizard_glow" //icon_sprite_tag = "synthlizard" -/datum/sprite_accessory/tail/taur/ch/lizard/fatsynthlizard +/datum/sprite_accessory/tail/taur/lizard/fatsynthlizard name = "Fat SynthLizard dual-color (Taur)" icon_state = "fatsynthlizard_s" extra_overlay = "fatsynthlizard_markings" @@ -326,7 +326,7 @@ extra_overlay2 = "synthfeline_glow" //icon_sprite_tag = "synthfeline" -/datum/sprite_accessory/tail/taur/ch/feline/fatsynthfeline +/datum/sprite_accessory/tail/taur/feline/fatsynthfeline name = "Fat SynthFeline dual-color (Taur)" icon_state = "fatsynthfeline_s" extra_overlay = "fatsynthfeline_markings" diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm index 7a3997e22a..2d772b44ae 100644 --- a/code/modules/mob/new_player/sprite_accessories_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_vr.dm @@ -243,64 +243,6 @@ icon_state = "hair_fingerwave" species_allowed = list(SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_TAJ, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_PROTEAN) -//Teshari things -/datum/sprite_accessory/hair/teshari - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_altdefault - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_tight - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_excited - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_spike - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_long - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_burst - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_shortburst - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_mohawk - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_pointy - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_upright - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_mane - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_droopy - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_mushroom - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_twies - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_backstrafe - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_longway - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_tree - icon_add = 'icons/mob/human_face_vr_add.dmi' - -/datum/sprite_accessory/hair/teshari_fluffymohawk - icon = 'icons/mob/human_face_vr.dmi' - icon_add = 'icons/mob/human_face_vr_add.dmi' //Skrell 'hairstyles' - these were requested for a chimera and screw it, if one wants to eat seafood, go nuts /datum/sprite_accessory/hair/skr_tentacle_veryshort diff --git a/code/modules/mob/typing_indicator.dm b/code/modules/mob/typing_indicator.dm index e9715834c8..35fe2d8bbb 100644 --- a/code/modules/mob/typing_indicator.dm +++ b/code/modules/mob/typing_indicator.dm @@ -40,7 +40,7 @@ set hidden = 1 set_typing_indicator(TRUE) - var/message = input(usr, "","say (text)") as text + var/message = tgui_input_text(usr, "Type your message:", "Say") set_typing_indicator(FALSE) if(message) @@ -51,8 +51,25 @@ set hidden = 1 set_typing_indicator(TRUE) - var/message = input(usr, "","me (text)") as message //VOREStation Edit + var/message = tgui_input_message(usr, "Type your message:", "Emote") set_typing_indicator(FALSE) if(message) me_verb(message) + +// No typing indicators here, but this is the file where the wrappers are, so... +/mob/verb/whisper_wrapper() + set name = ".Whisper" + set hidden = 1 + + var/message = tgui_input_text(usr, "Type your message:", "Whisper") + if(message) + whisper(message) + +/mob/verb/subtle_wrapper() + set name = ".Subtle" + set hidden = 1 + + var/message = tgui_input_message(usr, "Type your message:", "Subtle") + if(message) + me_verb_subtle(message) diff --git a/code/modules/modular_computers/file_system/programs/generic/game.dm b/code/modules/modular_computers/file_system/programs/generic/game.dm index cde240be73..31eaac08d2 100644 --- a/code/modules/modular_computers/file_system/programs/generic/game.dm +++ b/code/modules/modular_computers/file_system/programs/generic/game.dm @@ -166,7 +166,7 @@ to_chat(usr, "Hardware error: Printer is out of paper.") return else - computer.visible_message("\The [computer] prints out paper.") + computer.visible_message("\The [computer] prints out paper.") if(ticket_count >= 1) new /obj/item/stack/arcadeticket((get_turf(computer)), 1) to_chat(usr, "[src] dispenses a ticket!") diff --git a/code/modules/multiz/ladders.dm b/code/modules/multiz/ladders.dm index 8c726a8ed3..6b03f8f610 100644 --- a/code/modules/multiz/ladders.dm +++ b/code/modules/multiz/ladders.dm @@ -94,7 +94,7 @@ /obj/structure/ladder/proc/climbLadder(var/mob/M, var/obj/target_ladder) var/direction = (target_ladder == target_up ? "up" : "down") - M.visible_message("\The [M] begins climbing [direction] \the [src]!", + M.visible_message("\The [M] begins climbing [direction] \the [src]!", "You begin climbing [direction] \the [src]!", "You hear the grunting and clanging of a metal ladder being used.") diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index abaf66559d..f82d65275f 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -461,9 +461,9 @@ if(damage_desc) if(user == src.owner) var/datum/gender/T = gender_datums[user.get_visible_gender()] - user.visible_message("\The [user] patches [damage_desc] on [T.his] [src.name] with [tool].") + user.visible_message("\The [user] patches [damage_desc] on [T.his] [src.name] with [tool].") else - user.visible_message("\The [user] patches [damage_desc] on [owner]'s [src.name] with [tool].") + user.visible_message("\The [user] patches [damage_desc] on [owner]'s [src.name] with [tool].") return 1 diff --git a/code/modules/organs/organ_icon.dm b/code/modules/organs/organ_icon.dm index 7216540734..d35a5aa516 100644 --- a/code/modules/organs/organ_icon.dm +++ b/code/modules/organs/organ_icon.dm @@ -131,6 +131,15 @@ var/global/list/limb_icon_cache = list() I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit limb_icon_cache[cache_key] = I mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) + + // VOREStation edit start + if(nail_polish) + var/icon/I = new(nail_polish.icon, nail_polish.icon_state) + I.Blend(nail_polish.color, ICON_MULTIPLY) + add_overlay(I) + mob_icon.Blend(I, ICON_OVERLAY) + icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]" + // VOREStation edit end if(model) icon_cache_key += "_model_[model]" diff --git a/code/modules/organs/subtypes/slime.dm b/code/modules/organs/subtypes/slime.dm index eef360a515..fa60367e93 100644 --- a/code/modules/organs/subtypes/slime.dm +++ b/code/modules/organs/subtypes/slime.dm @@ -71,7 +71,7 @@ /obj/item/organ/internal/heart/grey/colormatch/slime/process() ..() if(!(QDELETED(src)) && src.loc != owner) - visible_message("\The [src] splatters!") + visible_message("\The [src] splatters!") var/turf/T = get_turf(src) var/obj/effect/decal/cleanable/blood/B = new (T) @@ -120,7 +120,7 @@ ..() if(!(QDELETED(src)) && src.loc != owner) - visible_message("\The [src] splatters!") + visible_message("\The [src] splatters!") var/turf/T = get_turf(src) var/obj/effect/decal/cleanable/blood/B = new (T) diff --git a/code/modules/overmap/disperser/disperser.dm b/code/modules/overmap/disperser/disperser.dm index b51c0fb709..c7a5efd130 100644 --- a/code/modules/overmap/disperser/disperser.dm +++ b/code/modules/overmap/disperser/disperser.dm @@ -24,7 +24,7 @@ /obj/machinery/disperser/attackby(obj/item/I, mob/user) if(I && I.is_wrench()) if(panel_open) - user.visible_message("\The [user] rotates \the [src] with \the [I].", + user.visible_message("\The [user] rotates \the [src] with \the [I].", "You rotate \the [src] with \the [I].") set_dir(turn(dir, 90)) playsound(src, 'sound/items/jaws_pry.ogg', 50, 1) diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm index d5af66f01e..1a6077c30a 100644 --- a/code/modules/paperwork/adminpaper.dm +++ b/code/modules/paperwork/adminpaper.dm @@ -87,8 +87,10 @@ to_chat(usr, "There isn't enough space left on \the [src] to write anything.") return - var/t = sanitize(input(usr, "Enter what you want to write:", "Write", null, null) as message, free_space, extra = 0) - + var/raw_t = tgui_input_message(usr, "Enter what you want to write:", "Write") + if(!raw_t) + return + var/t = sanitize(raw_t, free_space, extra = 0) if(!t) return diff --git a/code/modules/paperwork/paper_sticky.dm b/code/modules/paperwork/paper_sticky.dm index 4332be7762..04f4249cfb 100644 --- a/code/modules/paperwork/paper_sticky.dm +++ b/code/modules/paperwork/paper_sticky.dm @@ -37,7 +37,7 @@ var/text = sanitizeSafe(input(usr, "What would you like to write?") as text, writing_space) if(!text || thing.loc != user || (!Adjacent(user) && loc != user) || user.incapacitated()) return - user.visible_message(SPAN_NOTICE("\The [user] jots a note down on \the [src].")) + user.visible_message("\The [user] jots a note down on \the [src].") written_by = user.ckey if(written_text) written_text = "[written_text] [text]" diff --git a/code/modules/persistence/datum/persistence_datum.dm b/code/modules/persistence/datum/persistence_datum.dm index a52b57fb66..325ff15ced 100644 --- a/code/modules/persistence/datum/persistence_datum.dm +++ b/code/modules/persistence/datum/persistence_datum.dm @@ -20,6 +20,14 @@ if(!isnull(entries_decay_at) && !isnull(entries_expire_at)) entries_decay_at = round(entries_expire_at * entries_decay_at) +/datum/persistent/proc/Initialize() + if(fexists(filename)) + var/list/tokens = json_decode(file2text(filename)) + for(var/list/token in tokens) + if(!CheckTokenSanity(token)) + tokens -= token + ProcessAndApplyTokens(tokens) + /datum/persistent/proc/GetValidTurf(var/turf/T, var/list/token) if(T && CheckTurfContents(T, token)) return T @@ -93,14 +101,6 @@ "age" = GetEntryAge(entry) ) -/datum/persistent/proc/Initialize() - if(fexists(filename)) - var/list/tokens = json_decode(file2text(filename)) - for(var/list/token in tokens) - if(!CheckTokenSanity(token)) - tokens -= token - ProcessAndApplyTokens(tokens) - /datum/persistent/proc/Shutdown() if(fexists(filename)) fdel(filename) diff --git a/code/modules/persistence/graffiti.dm b/code/modules/persistence/graffiti.dm index 2259186c71..999a82ea90 100644 --- a/code/modules/persistence/graffiti.dm +++ b/code/modules/persistence/graffiti.dm @@ -47,7 +47,7 @@ var/obj/item/weapon/weldingtool/welder = thing if(welder.isOn() && welder.remove_fuel(0,user) && do_after(user, 5, src) && !QDELETED(src)) playsound(src.loc, welder.usesound, 50, 1) - user.visible_message("\The [user] clears away some graffiti.") + user.visible_message("\The [user] clears away some graffiti.") qdel(src) else if(thing.sharp) diff --git a/code/modules/persistence/paintings.dm b/code/modules/persistence/paintings.dm new file mode 100644 index 0000000000..a9bf169841 --- /dev/null +++ b/code/modules/persistence/paintings.dm @@ -0,0 +1,36 @@ +/datum/persistent/paintings + name = "paintings" + entries_expire_at = 1000 // Basically forever + +/datum/persistent/paintings/SetFilename() + filename = "data/persistent/paintings.json" + +/datum/persistent/paintings/Initialize() + . = ..() + if(fexists(filename)) + SSpersistence.paintings = json_decode(file2text(filename)) + var/list/tokens = SSpersistence.paintings + for(var/list/token in tokens) + token["age"]++ // Increment age! + if(!CheckTokenSanity(token)) + tokens -= token + + for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) + P.load_persistent() + return + +/datum/persistent/paintings/CheckTokenSanity(var/list/token) + var/png_filename = "data/paintings/[token["persistence_id"]]/[token["md5"]].png" + if(!fexists(png_filename)) + return FALSE + if(token["age"] > entries_expire_at) + fdel(png_filename) + return FALSE + +/datum/persistent/paintings/Shutdown() + for(var/obj/structure/sign/painting/P in SSpersistence.painting_frames) + P.save_persistent() + + if(fexists(filename)) + fdel(filename) + to_file(file(filename), json_encode(SSpersistence.paintings)) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 4d7a154581..aa37003520 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -5,8 +5,8 @@ /obj/item/weapon/cell name = "power cell" desc = "A rechargable electrochemical power cell." - icon = 'icons/obj/power.dmi' - icon_state = "cell" + icon = 'icons/obj/power_cells.dmi' + icon_state = "b_st" item_state = "cell" origin_tech = list(TECH_POWER = 1) force = 5.0 @@ -29,8 +29,7 @@ pickup_sound = 'sound/items/pickup/component.ogg' // Overlay stuff. - var/overlay_half_state = "cell-o1" // Overlay used when not fully charged but not empty. - var/overlay_full_state = "cell-o2" // Overlay used when fully charged. + var/standard_overlays = TRUE var/last_overlay_state = null // Used to optimize update_icon() calls. /obj/item/weapon/cell/New() @@ -73,29 +72,14 @@ #define OVERLAY_EMPTY 0 /obj/item/weapon/cell/update_icon() - var/new_overlay = null // The overlay that is needed. - // If it's different than the current overlay, then it'll get changed. - // Otherwise nothing happens, to save on CPU. - - if(charge < 0.01) // Empty. - new_overlay = OVERLAY_EMPTY - if(last_overlay_state != new_overlay) - cut_overlays() - - else if(charge/maxcharge >= 0.995) // Full - new_overlay = OVERLAY_FULL - if(last_overlay_state != new_overlay) - cut_overlay(overlay_half_state) - add_overlay(overlay_full_state) - - - else // Inbetween. - new_overlay = OVERLAY_PARTIAL - if(last_overlay_state != new_overlay) - cut_overlay(overlay_full_state) - add_overlay(overlay_half_state) - - last_overlay_state = new_overlay + if(!standard_overlays) + return + var/ratio = clamp(round(charge / maxcharge, 0.25) * 100, 0, 100) + var/new_state = "[icon_state]_[ratio]" + if(new_state != last_overlay_state) + cut_overlay(last_overlay_state) + add_overlay(new_state) + last_overlay_state = new_state #undef OVERLAY_FULL #undef OVERLAY_PARTIAL diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm index 908433ecec..3b6e71e2ed 100644 --- a/code/modules/power/cells/device_cells.dm +++ b/code/modules/power/cells/device_cells.dm @@ -2,7 +2,7 @@ /obj/item/weapon/cell/device name = "device power cell" desc = "A small power cell designed to power handheld devices." - icon_state = "dcell" + icon_state = "m_st" item_state = "egg6" w_class = ITEMSIZE_SMALL force = 0 @@ -16,7 +16,7 @@ /obj/item/weapon/cell/device/weapon name = "weapon power cell" desc = "A small power cell designed to power handheld weaponry." - icon_state = "wcell" + icon_state = "m_sup" maxcharge = 2400 charge_amount = 20 @@ -28,7 +28,7 @@ /obj/item/weapon/cell/device/weapon/recharge name = "self-charging weapon power cell" desc = "A small power cell designed to power handheld weaponry. This one recharges itself." -// icon_state = "wcell" //TODO: Different sprite + icon_state = "meb_m_nu" self_recharge = TRUE charge_amount = 120 charge_delay = 75 diff --git a/code/modules/power/cells/device_cells_vr.dm b/code/modules/power/cells/device_cells_vr.dm index 41291ab0c4..54fd8965aa 100644 --- a/code/modules/power/cells/device_cells_vr.dm +++ b/code/modules/power/cells/device_cells_vr.dm @@ -3,6 +3,7 @@ /obj/item/weapon/cell/device/weapon/recharge/alien name = "void cell (device)" var/swaps_to = /obj/item/weapon/cell/void + standard_overlays = FALSE /obj/item/weapon/cell/device/weapon/recharge/alien/attack_self(var/mob/user) user.remove_from_mob(src) @@ -13,10 +14,6 @@ newcell.charge = newcell.maxcharge * percentage qdel(src) -/obj/item/weapon/cell/device/weapon/recharge/alien/update_icon() - return - - //The machine cell /obj/item/weapon/cell/void name = "void cell (machinery)" @@ -29,6 +26,7 @@ self_recharge = TRUE charge_delay = 50 matter = null + standard_overlays = FALSE var/swaps_to = /obj/item/weapon/cell/device/weapon/recharge/alien /obj/item/weapon/cell/void/attack_self(var/mob/user) @@ -40,9 +38,6 @@ newcell.charge = newcell.maxcharge * percentage qdel(src) -/obj/item/weapon/cell/void/update_icon() - return - // Bloo friendlier hybrid tech /obj/item/weapon/cell/device/weapon/recharge/alien/hybrid icon = 'icons/obj/power_vr.dmi' diff --git a/code/modules/power/cells/esoteric_cells.dm b/code/modules/power/cells/esoteric_cells.dm index b9bb06bf68..a37fd22050 100644 --- a/code/modules/power/cells/esoteric_cells.dm +++ b/code/modules/power/cells/esoteric_cells.dm @@ -3,7 +3,7 @@ name = "modified power cell" desc = "A modified power cell sitting in a highly conductive chassis." origin_tech = list(TECH_POWER = 2) - icon_state = "spikecell" + icon_state = "exs_m" maxcharge = 10000 matter = list(MAT_STEEL = 1000, MAT_GLASS = 80, MAT_SILVER = 100) self_recharge = TRUE diff --git a/code/modules/power/cells/power_cells.dm b/code/modules/power/cells/power_cells.dm index a704b752cb..09831fd42e 100644 --- a/code/modules/power/cells/power_cells.dm +++ b/code/modules/power/cells/power_cells.dm @@ -2,6 +2,7 @@ name = "\improper rechargable AA battery" desc = "You can't top the plasma top." //TOTALLY TRADEMARK INFRINGEMENT origin_tech = list(TECH_POWER = 0) + icon_state = "s_st" maxcharge = 500 matter = list(MAT_STEEL = 700, MAT_GLASS = 40) @@ -12,6 +13,7 @@ /obj/item/weapon/cell/secborg name = "security borg rechargable D battery" origin_tech = list(TECH_POWER = 0) + icon_state = "meb_s_st" maxcharge = 600 //600 max charge / 100 charge per shot = six shots matter = list(MAT_STEEL = 700, MAT_GLASS = 40) @@ -23,13 +25,14 @@ /obj/item/weapon/cell/apc name = "heavy-duty power cell" origin_tech = list(TECH_POWER = 1) + icon_state = "meb_b_st" maxcharge = 5000 matter = list(MAT_STEEL = 700, MAT_GLASS = 50) /obj/item/weapon/cell/high name = "high-capacity power cell" origin_tech = list(TECH_POWER = 2) - icon_state = "hcell" + icon_state = "b_hi" maxcharge = 10000 matter = list(MAT_STEEL = 700, MAT_GLASS = 60) @@ -41,7 +44,7 @@ /obj/item/weapon/cell/super name = "super-capacity power cell" origin_tech = list(TECH_POWER = 5) - icon_state = "scell" + icon_state = "b_sup" maxcharge = 20000 matter = list(MAT_STEEL = 700, MAT_GLASS = 70) @@ -53,7 +56,7 @@ /obj/item/weapon/cell/hyper name = "hyper-capacity power cell" origin_tech = list(TECH_POWER = 6) - icon_state = "hpcell" + icon_state = "b_hy" maxcharge = 30000 matter = list(MAT_STEEL = 700, MAT_GLASS = 80) @@ -64,12 +67,13 @@ /obj/item/weapon/cell/mech name = "mecha power cell" + icon_state = "exs_l" charge = 15000 maxcharge = 15000 /obj/item/weapon/cell/infinite name = "infinite-capacity power cell!" - icon_state = "icell" + icon_state = "infinite_b" origin_tech = null maxcharge = 30000 //determines how badly mobs get shocked matter = list(MAT_STEEL = 700, MAT_GLASS = 80) @@ -89,6 +93,7 @@ charge = 100 maxcharge = 300 minor_fault = 1 + standard_overlays = FALSE /obj/item/weapon/cell/slime name = "charged slime core" @@ -100,13 +105,14 @@ maxcharge = 10000 matter = null self_recharge = TRUE + standard_overlays = FALSE //Not actually a cell, but if people look for it, they'll probably look near other cells /obj/item/device/fbp_backup_cell name = "backup battery" desc = "A small one-time-use chemical battery for synthetic crew when they are low on power in emergency situations." - icon = 'icons/obj/power.dmi' - icon_state = "fbp_cell" + icon = 'icons/obj/power_cells.dmi' + icon_state = "exs_s" w_class = ITEMSIZE_SMALL var/amount = 100 var/used = FALSE @@ -144,6 +150,7 @@ desc = "A tiny power cell with a very low power capacity. Used in light fixtures to power them in the event of an outage." maxcharge = 120 //Emergency lights use 0.2 W per tick, meaning ~10 minutes of emergency power from a cell matter = list(MAT_GLASS = 20) + icon_state = "meb_s_sup" w_class = ITEMSIZE_TINY /obj/item/weapon/cell/emergency_light/Initialize() diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index af1f24449e..aba9087b75 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -67,7 +67,7 @@ GLOBAL_LIST_EMPTY(fusion_cores) if(Output.get_pairing()) reagents.trans_to_holder(Output.reagents, Output.reagents.maximum_volume) if(prob(5)) - visible_message("\The [src] gurgles as it exports fluid.") + visible_message("\The [src] gurgles as it exports fluid.") if(owned_field) @@ -131,7 +131,7 @@ GLOBAL_LIST_EMPTY(fusion_cores) /obj/machinery/power/fusion_core/attack_hand(var/mob/user) if(!Adjacent(user)) // As funny as it was for the AI to hug-kill the tokamak field from a distance... return - visible_message("\The [user] hugs \the [src] to make it feel better!") + visible_message("\The [user] hugs \the [src] to make it feel better!") if(owned_field) Shutdown() diff --git a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm index 89b11da6c1..cccde09edc 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_compressor.dm @@ -26,14 +26,14 @@ to_chat(user, "You need at least three hundred units of material to form a fuel rod.") return 1 var/datum/reagent/R = thing.reagents.reagent_list[1] - visible_message("\The [src] compresses the contents of \the [thing] into a new fuel assembly.") + visible_message("\The [src] compresses the contents of \the [thing] into a new fuel assembly.") var/obj/item/weapon/fuel_assembly/F = new(get_turf(src), R.id, R.color) thing.reagents.remove_reagent(R.id, R.volume) user.put_in_hands(F) else if(istype(thing, /obj/machinery/power/supermatter)) var/obj/item/weapon/fuel_assembly/F = new(get_turf(src), "supermatter") - visible_message("\The [src] compresses \the [thing] into a new fuel assembly.") + visible_message("\The [src] compresses \the [thing] into a new fuel assembly.") qdel(thing) user.put_in_hands(F) return 1 @@ -58,7 +58,7 @@ to_chat(user, "You need at least 25 [mat.sheet_plural_name] to make a fuel rod.") return var/obj/item/weapon/fuel_assembly/F = new(get_turf(src), mat.name) - visible_message("\The [src] compresses the [mat.use_name] into a new fuel assembly.") + visible_message("\The [src] compresses the [mat.use_name] into a new fuel assembly.") M.use(FUSION_ROD_SHEET_AMT) user.put_in_hands(F) diff --git a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm index e45fe4ad9c..da989865e6 100644 --- a/code/modules/power/fusion/fuel_assembly/fuel_injector.dm +++ b/code/modules/power/fusion/fuel_assembly/fuel_injector.dm @@ -56,9 +56,9 @@ GLOBAL_LIST_EMPTY(fuel_injectors) if(cur_assembly) cur_assembly.forceMove(get_turf(src)) - visible_message("\The [user] swaps \the [src]'s [cur_assembly] for \a [W].") + visible_message("\The [user] swaps \the [src]'s [cur_assembly] for \a [W].") else - visible_message("\The [user] inserts \a [W] into \the [src].") + visible_message("\The [user] inserts \a [W] into \the [src].") user.drop_from_inventory(W) W.forceMove(src) @@ -92,7 +92,7 @@ GLOBAL_LIST_EMPTY(fuel_injectors) if(cur_assembly) cur_assembly.forceMove(get_turf(src)) user.put_in_hands(cur_assembly) - visible_message("\The [user] removes \the [cur_assembly] from \the [src].") + visible_message("\The [user] removes \the [cur_assembly] from \the [src].") cur_assembly = null return else diff --git a/code/modules/power/port_gen_vr.dm b/code/modules/power/port_gen_vr.dm index ceb0b24429..5964adc297 100644 --- a/code/modules/power/port_gen_vr.dm +++ b/code/modules/power/port_gen_vr.dm @@ -240,3 +240,44 @@ . = ..() cell = new /obj/item/weapon/cell/void/hybrid(src) RefreshParts() + + +// Kugelblitz generator, confined black hole like a singulo but smoller and higher tech +// Presumably whoever made these has better tech than most +/obj/machinery/power/rtg/kugelblitz + name = "kugelblitz generator" + desc = "A power source harnessing a small black hole." + icon = 'icons/obj/structures/decor64x64.dmi' + icon_state = "bigdice" + bound_width = 64 + bound_height = 64 + power_gen = 30000 + irradiate = FALSE // Green energy! + can_buckle = FALSE + +/obj/machinery/power/rtg/kugelblitz/proc/asplod() + visible_message("\The [src] lets out an shower of sparks as it starts to lose stability!",\ + "You hear a loud electrical crack!") + playsound(src, 'sound/effects/lightningshock.ogg', 100, 1, extrarange = 5) + var/turf/T = get_turf(src) + qdel(src) + new /obj/singularity(T) + +/obj/machinery/power/rtg/kugelblitz/blob_act(obj/structure/blob/B) + asplod() + +/obj/machinery/power/rtg/kugelblitz/ex_act() + asplod() + +/obj/machinery/power/rtg/kugelblitz/fire_act(exposed_temperature, exposed_volume) + asplod() + +/obj/machinery/power/rtg/kugelblitz/tesla_act() + ..() //extend the zap + asplod() + +/obj/machinery/power/rtg/kugelblitz/bullet_act(obj/item/projectile/Proj) + . = ..() + if(istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)) && Proj.damage >= 20) + log_and_message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered a kugelblitz core explosion at [x],[y],[z] via projectile.") + asplod() diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm index 213b37d01a..5c9031a831 100644 --- a/code/modules/power/singularity/generator.dm +++ b/code/modules/power/singularity/generator.dm @@ -32,7 +32,7 @@ if(W.is_screwdriver()) panel_open = !panel_open playsound(src, W.usesound, 50, 1) - visible_message("\The [user] adjusts \the [src]'s mechanisms.") + visible_message("\The [user] adjusts \the [src]'s mechanisms.") if(panel_open && do_after(user, 30)) to_chat(user, "\The [src] looks like it could be modified.") if(panel_open && do_after(user, 80 * W.toolspeed)) // We don't have skills, so a delayed hint for engineers will have to do for now. (Panel open check for sanity) @@ -41,10 +41,10 @@ else to_chat(user, "\The [src]'s mechanisms look secure.") if(istype(W, /obj/item/weapon/smes_coil/super_io) && panel_open) - visible_message("\The [user] begins to modify \the [src] with \the [W].") + visible_message("\The [user] begins to modify \the [src] with \the [W].") if(do_after(user, 300)) user.drop_from_inventory(W) - visible_message("\The [user] installs \the [W] onto \the [src].") + visible_message("\The [user] installs \the [W] onto \the [src].") qdel(W) var/turf/T = get_turf(src) var/new_machine = /obj/machinery/particle_smasher diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index adff836cee..44e5c5d4fc 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -174,7 +174,7 @@ recipes = typesof(/datum/particle_smasher_recipe) if(!target) // You are just blasting an empty machine. - visible_message("\The [src] shudders.") + visible_message("\The [src] shudders.") update_icon() return diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4686b41909..de0a1f46bd 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -246,7 +246,7 @@ to_chat(user, "You ready \the [src]! Click and drag the target around to shoot.") else//Otherwise just make a new one auto_target = new/obj/screen/auto_target(get_turf(A), src) - visible_message("\[user] readies the [src]!") + visible_message("\The [user] readies the [src]!") playsound(src, 'sound/weapons/TargetOn.ogg', 50, 1) to_chat(user, "You ready \the [src]! Click and drag the target around to shoot.") return diff --git a/code/modules/projectiles/guns/magnetic/bore.dm b/code/modules/projectiles/guns/magnetic/bore.dm index eea444fbf6..3d52f5737e 100644 --- a/code/modules/projectiles/guns/magnetic/bore.dm +++ b/code/modules/projectiles/guns/magnetic/bore.dm @@ -63,7 +63,7 @@ if(removing) user.put_in_hands(removing) - user.visible_message("\The [user] removes \the [removing] from \the [src].") + user.visible_message("\The [user] removes \the [removing] from \the [src].") playsound(src, 'sound/machines/click.ogg', 10, 1) update_icon() return @@ -91,7 +91,7 @@ to_chat(user, "\The [src] has no manipulator installed.") return user.put_in_hands(manipulator) - user.visible_message("\The [user] levers \the [manipulator] from \the [src].") + user.visible_message("\The [user] levers \the [manipulator] from \the [src].") playsound(src, thing.usesound, 50, 1) mat_cost = initial(mat_cost) manipulator = null @@ -107,7 +107,7 @@ user.drop_from_inventory(manipulator, src) playsound(src, 'sound/machines/click.ogg', 10,1) mat_cost = initial(mat_cost) / (2*manipulator.rating) - user.visible_message("\The [user] slots \the [manipulator] into \the [src].") + user.visible_message("\The [user] slots \the [manipulator] into \the [src].") update_icon() update_rating_mod() return @@ -143,7 +143,7 @@ mat_storage += (SHEET_MATERIAL_AMOUNT/2*0.8) //two plasma ores needed per sheet, some inefficiency for not using refined product success = TRUE if(success) - user.visible_message("\The [user] loads \the [src] with \the [M].") + user.visible_message("\The [user] loads \the [src] with \the [M].") playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() return diff --git a/code/modules/projectiles/guns/magnetic/magnetic.dm b/code/modules/projectiles/guns/magnetic/magnetic.dm index 12d00c63ac..f4933efbf3 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic.dm @@ -151,7 +151,7 @@ cell = thing user.drop_from_inventory(cell, src) playsound(src, 'sound/machines/click.ogg', 10, 1) - user.visible_message("\The [user] slots \the [cell] into \the [src].") + user.visible_message("\The [user] slots \the [cell] into \the [src].") update_icon() return @@ -160,7 +160,7 @@ to_chat(user, "\The [src] has no capacitor installed.") return user.put_in_hands(capacitor) - user.visible_message("\The [user] unscrews \the [capacitor] from \the [src].") + user.visible_message("\The [user] unscrews \the [capacitor] from \the [src].") playsound(src, thing.usesound, 50, 1) capacitor = null update_icon() @@ -174,7 +174,7 @@ user.drop_from_inventory(capacitor, src) playsound(src, 'sound/machines/click.ogg', 10, 1) power_per_tick = (power_cost*0.15) * capacitor.rating - user.visible_message("\The [user] slots \the [capacitor] into \the [src].") + user.visible_message("\The [user] slots \the [capacitor] into \the [src].") update_icon() return @@ -195,7 +195,7 @@ loaded = new load_type(src, 1) ammo.use(1) - user.visible_message("\The [user] loads \the [src] with \the [loaded].") + user.visible_message("\The [user] loads \the [src] with \the [loaded].") playsound(src, 'sound/weapons/flipblade.ogg', 50, 1) update_icon() return @@ -215,7 +215,7 @@ if(removing) removing.forceMove(get_turf(src)) user.put_in_hands(removing) - user.visible_message("\The [user] removes \the [removing] from \the [src].") + user.visible_message("\The [user] removes \the [removing] from \the [src].") playsound(src, 'sound/machines/click.ogg', 10, 1) update_icon() return diff --git a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm index 003d6c956c..9f81dbe4dc 100644 --- a/code/modules/projectiles/guns/magnetic/magnetic_construction.dm +++ b/code/modules/projectiles/guns/magnetic/magnetic_construction.dm @@ -17,19 +17,19 @@ to_chat(user, "You need at least 5 [reinforcing.singular_name]\s for this task.") return reinforcing.use(5) - user.visible_message("\The [user] shapes some steel sheets around \the [src] to form a body.") + user.visible_message("\The [user] shapes some steel sheets around \the [src] to form a body.") increment_construction_stage() return if(istype(thing, /obj/item/weapon/tape_roll) && construction_stage == 2) - user.visible_message("\The [user] secures \the [src] together with \the [thing].") + user.visible_message("\The [user] secures \the [src] together with \the [thing].") increment_construction_stage() return if(istype(thing, /obj/item/pipe) && construction_stage == 3) user.drop_from_inventory(thing) qdel(thing) - user.visible_message("\The [user] jams \the [thing] into \the [src].") + user.visible_message("\The [user] jams \the [thing] into \the [src].") increment_construction_stage() return @@ -44,7 +44,7 @@ to_chat(user, "You need more fuel!") return - user.visible_message("\The [user] welds the barrel of \the [src] into place.") + user.visible_message("\The [user] welds the barrel of \the [src] into place.") playsound(src, 'sound/items/Welder2.ogg', 100, 1) increment_construction_stage() return @@ -55,19 +55,19 @@ to_chat(user, "You need at least 5 lengths of cable for this task.") return cable.use(5) - user.visible_message("\The [user] wires \the [src].") + user.visible_message("\The [user] wires \the [src].") increment_construction_stage() return if(istype(thing, /obj/item/weapon/smes_coil) && construction_stage >= 6 && construction_stage <= 8) - user.visible_message("\The [user] installs \a [thing] into \the [src].") + user.visible_message("\The [user] installs \a [thing] into \the [src].") user.drop_from_inventory(thing) qdel(thing) increment_construction_stage() return if(thing.is_screwdriver() && construction_stage >= 9) - user.visible_message("\The [user] secures \the [src] and finishes it off.") + user.visible_message("\The [user] secures \the [src] and finishes it off.") playsound(src, 'sound/items/Screwdriver.ogg', 50, 1) var/obj/item/weapon/gun/magnetic/coilgun = new(loc) var/put_in_hands diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 17dae5c90e..c7fcc6d30e 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -667,7 +667,7 @@ if(result == PROJECTILE_FORCE_MISS) if(!silenced) - target_mob.visible_message("\The [src] misses \the [target_mob] narrowly!") + target_mob.visible_message("\The [src] misses \the [target_mob] narrowly!") playsound(target_mob, "bullet_miss", 75, 1) return FALSE diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index cea545ce25..67525bdc5b 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -217,7 +217,7 @@ if(istype(aiming_with, /obj/item/weapon/gun)) playsound(owner, 'sound/weapons/TargetOff.ogg', 50,1) if(!no_message) - owner.visible_message("\The [owner] lowers \the [aiming_with].") + owner.visible_message("\The [owner] lowers \the [aiming_with].") aiming_with = null aiming_at.aimed -= src diff --git a/code/modules/reagents/machinery/distillery.dm b/code/modules/reagents/machinery/distillery.dm index c9679ccec9..6e0ad4d7c0 100644 --- a/code/modules/reagents/machinery/distillery.dm +++ b/code/modules/reagents/machinery/distillery.dm @@ -146,7 +146,7 @@ to_chat(user, "You press \the [src]'s chamber agitator button.") if(on) - visible_message("\The [src] rattles to life.") + visible_message("\The [src] rattles to life.") reagents.handle_reactions() else spawn(1 SECOND) @@ -316,7 +316,7 @@ if(target_temp == round(current_temp, 1.0)) current_temp = target_temp // Hard set it so we don't need to worry about exact decimals any more, after we've been keeping track of it all this time playsound(src, 'sound/machines/ping.ogg', 50, 0) - src.visible_message("\The [src] pings as it reaches the target temperature.") + src.visible_message("\The [src] pings as it reaches the target temperature.") else if(connected_port && avg_pressure > 1000) current_temp = round((current_temp + avg_temp) / 2) diff --git a/code/modules/reagents/reagents/medicine.dm b/code/modules/reagents/reagents/medicine.dm index fce96ffff6..17454a7bd9 100644 --- a/code/modules/reagents/reagents/medicine.dm +++ b/code/modules/reagents/reagents/medicine.dm @@ -347,7 +347,7 @@ var/obj/item/stack/medical/M = C.upgrade_stack(to_produce) if(M && M.amount) - holder.my_atom.visible_message("\The [packname] bubbles.") + holder.my_atom.visible_message("\The [packname] bubbles.") remove_self(to_produce * 5) /datum/reagent/cryoxadone @@ -1256,7 +1256,7 @@ var/obj/item/stack/medical/M = C.upgrade_stack(to_produce) if(M && M.amount) - holder.my_atom.visible_message("\The [packname] bubbles.") + holder.my_atom.visible_message("\The [packname] bubbles.") remove_self(to_produce) /datum/reagent/sterilizine diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 610fb85e54..ae9a97c5d1 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -110,7 +110,7 @@ if(istype(I, /obj/item/weapon/material/ashtray)) var/obj/item/weapon/material/ashtray/A = I if(A.contents.len > 0) - user.visible_message("\The [user] empties \the [A.name] into [src].") + user.visible_message("\The [user] empties \the [A] into [src].") for(var/obj/item/O in A.contents) O.forceMove(src) A.update_icon() diff --git a/code/modules/research/designs/bag_of_holding.dm b/code/modules/research/designs/bag_of_holding.dm index bdaa9b374a..6f5a70adc6 100644 --- a/code/modules/research/designs/bag_of_holding.dm +++ b/code/modules/research/designs/bag_of_holding.dm @@ -29,4 +29,23 @@ req_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 6) materials = list(MAT_GOLD = 3000, MAT_DIAMOND = 1500, MAT_URANIUM = 250) build_path = /obj/item/weapon/storage/backpack/holding/duffle - sort_string = "QAAAB" \ No newline at end of file + sort_string = "QAAAB" + +/datum/design/item/boh/bag_holding + name = "Trashbag of Holding" + desc = "Considerably more utilitarian than the Bag of Holding, the Trashbag of Holding is a janitor's best friend." + id = "trashbag_holding" + req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 5) + materials = list("gold" = 2000, "diamond" = 1000, "uranium" = 250) + build_path = /obj/item/weapon/storage/bag/trash/holding + sort_string = "QAAAC" + +/datum/design/item/boh/pouch_holding + name = "Pouch of Holding" + desc = "Somehow compresses the storage of a backpack into a pouch-sized container!" + id = "pouch_holding" + req_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 5) + materials = list("gold" = 3000, "diamond" = 2000, "uranium" = 250) + build_path = /obj/item/weapon/storage/pouch/holding + sort_string = "QAAAD" + \ No newline at end of file diff --git a/code/modules/resleeving/machines.dm b/code/modules/resleeving/machines.dm index 928b4af380..2c97941309 100644 --- a/code/modules/resleeving/machines.dm +++ b/code/modules/resleeving/machines.dm @@ -383,7 +383,7 @@ var/obj/item/stack/material/S = W if(!(S.material.name in stored_material)) - to_chat(user, "\the [src] doesn't accept [S.material]!") + to_chat(user, "\The [src] doesn't accept [S.material]!") return var/amnt = S.perunit diff --git a/code/modules/shieldgen/emergency_shield.dm b/code/modules/shieldgen/emergency_shield.dm index a66c62750a..53790689a9 100644 --- a/code/modules/shieldgen/emergency_shield.dm +++ b/code/modules/shieldgen/emergency_shield.dm @@ -24,7 +24,7 @@ /obj/machinery/shield/proc/check_failure() if (src.health <= 0) - visible_message("\The [src] dissipates!") + visible_message("\The [src] dissipates!") qdel(src) return @@ -93,7 +93,7 @@ /obj/machinery/shield/hitby(AM as mob|obj) //Let everyone know we've been hit! - visible_message("\[src] was hit by [AM].") + visible_message("\The [src] was hit by [AM].") //Super realistic, resource-intensive, real-time damage calculations. var/tforce = 0 diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 7d850bc4f6..7111cd52d7 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -110,7 +110,7 @@ var/list/table_icon_cache = list() return 1 if(carpeted && W.is_crowbar()) - user.visible_message("\The [user] removes the carpet from \the [src].", + user.visible_message("\The [user] removes the carpet from \the [src].", "You remove the carpet from \the [src].") new carpeted_type(loc) carpeted = 0 @@ -120,7 +120,7 @@ var/list/table_icon_cache = list() if(!carpeted && material && istype(W, /obj/item/stack/tile/carpet)) var/obj/item/stack/tile/carpet/C = W if(C.use(1)) - user.visible_message("\The [user] adds \the [C] to \the [src].", + user.visible_message("\The [user] adds \the [C] to \the [src].", "You add \the [C] to \the [src].") carpeted = 1 carpeted_type = W.type @@ -151,7 +151,7 @@ var/list/table_icon_cache = list() playsound(src, F.usesound, 50, 1) if(!do_after(user, 20 * F.toolspeed) || !F.remove_fuel(1, user)) return - user.visible_message("\The [user] repairs some damage to \the [src].", + user.visible_message("\The [user] repairs some damage to \the [src].", "You repair some damage to \the [src].") health = max(health+(maxhealth/5), maxhealth) // 20% repair per application return 1 @@ -191,7 +191,7 @@ var/list/table_icon_cache = list() src.break_to_parts() user.do_attack_animation(src) return 1 - visible_message("\The [user] scratches at \the [src]!") + visible_message("\The [user] scratches at \the [src]!") return ..() /obj/structure/table/MouseDrop_T(obj/item/stack/material/what) @@ -260,14 +260,14 @@ var/list/table_icon_cache = list() if(manipulating) return M manipulating = 1 - user.visible_message("\The [user] begins removing the [type_holding] holding \the [src]'s [M.display_name] [what] in place.", + user.visible_message("\The [user] begins removing the [type_holding] holding \the [src]'s [M.display_name] [what] in place.", "You begin removing the [type_holding] holding \the [src]'s [M.display_name] [what] in place.") if(sound) playsound(src, sound, 50, 1) if(!do_after(user, delay)) manipulating = 0 return M - user.visible_message("\The [user] removes the [M.display_name] [what] from \the [src].", + user.visible_message("\The [user] removes the [M.display_name] [what] from \the [src].", "You remove the [M.display_name] [what] from \the [src].") new M.stack_type(src.loc) manipulating = 0 @@ -282,13 +282,13 @@ var/list/table_icon_cache = list() /obj/structure/table/proc/dismantle(obj/item/W, mob/user) if(manipulating) return manipulating = 1 - user.visible_message("\The [user] begins dismantling \the [src].", + user.visible_message("\The [user] begins dismantling \the [src].", "You begin dismantling \the [src].") playsound(src, W.usesound, 50, 1) if(!do_after(user, 20 * W.toolspeed)) manipulating = 0 return - user.visible_message("\The [user] dismantles \the [src].", + user.visible_message("\The [user] dismantles \the [src].", "You dismantle \the [src].") new /obj/item/stack/material/steel(src.loc) qdel(src) @@ -333,6 +333,8 @@ var/list/table_icon_cache = list() return FALSE if(istype(src,/obj/structure/table/bench) && !istype(S,/obj/structure/table/bench)) return FALSE + if(istype(src,/obj/structure/table/rack) && !istype(S,/obj/structure/table/rack)) + return FALSE if(istype(S,/obj/structure/table)) return TRUE ..() diff --git a/code/modules/tgui/modules/ntos-only/cardmod.dm b/code/modules/tgui/modules/ntos-only/cardmod.dm index f96772626e..fc77417996 100644 --- a/code/modules/tgui/modules/ntos-only/cardmod.dm +++ b/code/modules/tgui/modules/ntos-only/cardmod.dm @@ -152,7 +152,7 @@ to_chat(usr, "Hardware error: Printer was unable to print the file. It may be out of paper.") return else - computer.visible_message("\The [computer] prints out paper.") + computer.visible_message("\The [computer] prints out paper.") else var/contents = {"