diff --git a/code/game/atom/_atom.dm b/code/game/atom/_atom.dm index c40ccd7ae0c..51b823f9985 100644 --- a/code/game/atom/_atom.dm +++ b/code/game/atom/_atom.dm @@ -53,20 +53,45 @@ var/gfi_layer_rotation = GFI_ROTATION_DEFAULT - /// Extra Descriptions - /// Regular text about the atom's extended description, if any exists. + /* + * EXTRA DESCRIPTIONS + * Adds additional information of different types about a given object. + * get_examine_text() in "obj\game\code\atom\atom_examine.dm" handles structure, formatting, etc. + * + * Most of these vars only concern objs, but they are initialized here in case any functionality + * is migrated elsewhere. + * + * These vars should not be set in the object definition, but in defined funcs just beneath definition. + */ + + /// Text about the atom's damage/condition. + /// Gets built by children of /atom/proc/condition_hints() + var/desc_damagecondition = null + + /// Text about the atom's extended description, if any exists. + /// Should be a regular string. var/desc_extended = null - /// Blue text (SPAN_NOTICE()), informing the user about how to use the item or about game controls. - var/desc_info = null - /// Blue text (SPAN_NOTICE()), informing the user about how to assemble or disassemble the item. + + /// Informs the user about how to use the item or about game controls. + /// Gets built by children of /atom/proc/mechanics_hints() + var/desc_mechanics = null + + /// Informs the user about how to assemble or disassemble the item. + /// Gets built by children of /atom/proc/build_hints() var/desc_build = null + /// Blue text (SPAN_NOTICE()), informing the user about what upgrades the item has and what they do. - /// Format desc_upgrade = "This object/item/machine/structure/etc has the following upgrades available:" - /// Currently only supports machines, see "code\game\machinery\machinery.dm" for example. + /// Gets built by children of /atom/proc/upgrade_hints() var/desc_upgrade = null - /// Red text (SPAN_ALERT()), informing the user about how they can use an object to antagonize. + + /// Informs the user about how they can use an object to antagonize. + /// Gets built by children of /atom/proc/antag_hints() var/desc_antag = null + /// Feedback text. + /// Gets built by children of /atom/proc/feedback_hints() + var/desc_feedback = null + /* SSicon_update VARS */ ///When was the last time (in `world.time`) that the icon of this atom was updated via `SSicon_update` diff --git a/code/game/atom/atom_examine.dm b/code/game/atom/atom_examine.dm index a81f90b2c46..2a19ebe33bd 100644 --- a/code/game/atom/atom_examine.dm +++ b/code/game/atom/atom_examine.dm @@ -47,10 +47,27 @@ * * Returns a `/list` of strings */ + +/** + * The structure of an object's examine box is as follows: + * [ Name ] [ Size ] + * [ Damage/Condition ] + * [ Description ] + * [ Extended Description*** ] + * [ Mechanics*** ] + * [ Assembly/Disassembly*** ] + * [ Upgrades*** ] + * [ Antagonist Interactions*** ] + * [ Status Feedback ] + * +* Blocks marked with *** are collapsed by default. + */ /atom/proc/get_examine_text(mob/user, distance, is_adjacent, infix = "", suffix = "", show_extended) SHOULD_CALL_PARENT(TRUE) SHOULD_NOT_SLEEP(TRUE) + update_desc_blocks(user, distance, is_adjacent) + . = list() var/f_name = "\a [src]. [infix]" if(src.blood_DNA && !istype(src, /obj/effect/decal)) @@ -69,19 +86,25 @@ if(src.desc) . += src.desc // Object description. + // Returns a SPAN_* based on health, if configured. + var/list/condition_hints = src.condition_hints() + if(length(condition_hints)) + . += condition_hints + // Extra object descriptions examination code. if(show_extended) // If the item has a extended description, show it. if(desc_extended) . += desc_extended // If the item has a description regarding game mechanics, show it. - if(desc_info) + if(desc_mechanics) . += FONT_SMALL(SPAN_NOTICE("Mechanics")) - . += FONT_SMALL(SPAN_NOTICE("- [desc_info]")) + . += FONT_SMALL(SPAN_NOTICE("[desc_mechanics]")) // If the item has a description with assembly/disassembly instructions, show it. if(desc_build) . += FONT_SMALL(SPAN_NOTICE("Assembly/Disassembly")) - . += FONT_SMALL(SPAN_NOTICE("- [desc_build]")) + // Not a span because desc_build can use both NOTICE and ALERT. + . += FONT_SMALL("[desc_build]") // If the item has a description about its upgrade components and what they do, show it. // This one doesnt come prepended with a hyphen because theyre added when the desc is dynamically built. if(desc_upgrade) @@ -90,21 +113,31 @@ // If the item has an antagonist description and the user is an antagonist/ghost, show it. if(desc_antag && (player_is_antag(user.mind) || isghost(user) || isstoryteller(user))) . += FONT_SMALL(SPAN_ALERT("Antagonism")) - . += FONT_SMALL(SPAN_ALERT("- [desc_antag]")) + . += FONT_SMALL(SPAN_ALERT("[desc_antag]")) else - if(desc_extended || desc_info || desc_build || desc_upgrade || (desc_antag && (player_is_antag(user.mind) || isghost(user) || isstoryteller(user)))) // Checks if the object has a extended description, a mechanics description, and/or an antagonist description (and if the user is an antagonist). - . += FONT_SMALL(SPAN_NOTICE("\[?\] This object has additional examine information available.")) // If any of the above are true, show that the object has more information available. - if(desc_extended) // If the item has a extended description, show that it is available. + // Checks if the object has a extended description, a mechanics description, and/or an antagonist description (and if the user is an antagonist). + if(desc_extended || desc_mechanics || desc_build || desc_upgrade || (desc_antag && player_is_antag(user.mind))) + // If any of the above are true, show that the object has more information available. + . += FONT_SMALL(SPAN_NOTICE("\[?\] This object has additional examine information available:")) + // If the item has a extended description, show that it is available. + if(desc_extended) . += FONT_SMALL("- Extended Description") - if(desc_info) // If the item has a description regarding game mechanics, show that it is available. + // If the item has a description regarding game mechanics, show that it is available. + if(desc_mechanics) . += FONT_SMALL(SPAN_NOTICE("- Mechanics")) - if(desc_build) // If the item has a description regarding game mechanics, show that it is available. + // If the item has a description regarding game mechanics, show that it is available. + if(desc_build) . += FONT_SMALL(SPAN_NOTICE("- Assembly/Disassembly")) - if(desc_upgrade) // If the item has a description regarding game mechanics, show that it is available. + // If the item has a description regarding game mechanics, show that it is available. + if(desc_upgrade) . += FONT_SMALL(SPAN_NOTICE("- Upgrades")) - if(desc_antag && (player_is_antag(user.mind) || isghost(user) || isstoryteller(user))) // If the item has an antagonist description and the user is an antagonist, show that it is available. - . += FONT_SMALL(SPAN_ALERT("- Antagonist Info")) + // If the item has an antagonist description and the user is an antagonist/ghost, show that it is available. + if(desc_antag && (player_is_antag(user.mind) || isghost(user) || isstoryteller(user))) + . += FONT_SMALL(SPAN_ALERT("- Antagonist Interactions")) . += FONT_SMALL(SPAN_NOTICE("\[Show in Chat\]")) + // If the item has any feedback text, show it. + if(desc_feedback) + . += "
[desc_feedback]" if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -143,3 +176,111 @@ var/mouseparams = list2params(paramslist) usr_client.Click(src, loc, null, mouseparams) return TRUE + +/// Builds the text block variables for get_examine_text +/atom/proc/update_desc_blocks(mob/user, distance, is_adjacent) + var/list/mechanics_hints = mechanics_hints(user, distance, is_adjacent) + var/list/assembly_hints = assembly_hints(user, distance, is_adjacent) + var/list/disassembly_hints = disassembly_hints(user, distance, is_adjacent) + var/list/upgrade_hints = upgrade_hints(user, distance, is_adjacent) + var/list/antagonist_hints = antagonist_hints(user, distance, is_adjacent) + var/list/feedback_hints = feedback_hints(user, distance, is_adjacent) + + // A little ugly but it works. + var/first_line + + desc_mechanics = "" + if(length(mechanics_hints)) + first_line = TRUE + for(var/mechanics_hint in mechanics_hints) + if(!first_line) + desc_mechanics += "
" + first_line = FALSE + desc_mechanics += SPAN_NOTICE("- [mechanics_hint]") + + desc_build = "" + if(length(assembly_hints) || length(disassembly_hints)) + first_line = TRUE + for(var/assembly_hint in assembly_hints) + if(!first_line) + desc_build += "
" + first_line = FALSE + desc_build += SPAN_NOTICE("- [assembly_hint]") + // Make sure line breaks work reliably whether or not there's only assembly, only disassembly, or both types available. + if (length(assembly_hints) && length(disassembly_hints)) + desc_build += "
" + first_line = TRUE + for(var/disassembly_hint in disassembly_hints) + if(!first_line) + desc_build += "
" + first_line = FALSE + desc_build += SPAN_ALERT("- [disassembly_hint]") + + desc_upgrade = "" + if(length(upgrade_hints)) + first_line = TRUE + for(var/upgrade_hint in upgrade_hints) + if(!first_line) + desc_upgrade += "
" + desc_upgrade += "- [upgrade_hint]" + first_line = FALSE + + desc_antag = "" + if(length(antagonist_hints)) + first_line = TRUE + for(var/antagonist_hint in antagonist_hints) + if(!first_line) + desc_antag += "
" + first_line = FALSE + desc_antag += SPAN_WARNING("- [antagonist_hint]") + + desc_feedback = "" + if(length(feedback_hints)) + first_line = TRUE + for(var/feedback_hint in feedback_hints) + if(!first_line) + desc_feedback += "
" + first_line = FALSE + desc_feedback += "[feedback_hint]" + +/// Should return a list() of SPAN_* strings in whatever format you like. +/// Existing style is SPAN_NOTICE for minor damage and SPAN_ALERT for anything worse. If the object's destruction +/// could have major adverse consequences, you might use SPAN_DANGER for critical damage. +/atom/proc/condition_hints() + . = list() + +/// Should return a list() of regular strings. +/atom/proc/mechanics_hints() + . = list() + +/* + * Children of assembly_hints() and disassembly_hints() should check the current state of the object, whether it + * has any eligible steps in its assembly or disassembly respectively, and if so, return hints to that end. + * + * It should be used to suggest steps toward or away from a completed 'form' of the object. + * For example, a table whose surface can be carpeted would have carpeting instructions in assembly_hints(). + * However, an IV drip which can have a gas tank attached to it would not have that described in assembly_hints(), + * as the IV drip itself is already 'completed,' and a gas tank is effectively just a swappable slot item for it. + * + * Look at existing objects' implementations and use your best judgement, or ask in Discord if need be! + */ + +/// Should return a list() of regular strings. +/atom/proc/assembly_hints(mob/user, distance, is_adjacent) + . = list() + +/// Should return a list() of regular strings. +/atom/proc/disassembly_hints(mob/user, distance, is_adjacent) + . = list() + +/atom/proc/upgrade_hints(mob/user, distance, is_adjacent) + . = list() + +/// Should return a list() of regular strings. +/atom/proc/antagonist_hints(mob/user, distance, is_adjacent) + . = list() + +/// Should return a list() of regular strings. It will accept SPAN_* strings, though for consistency's sake please +/// use SPAN_ALERT or SPAN_DANGER for negative/bad feedback. +/atom/proc/feedback_hints(mob/user, distance, is_adjacent) + . = list() diff --git a/code/game/gamemodes/cult/items/clothes.dm b/code/game/gamemodes/cult/items/clothes.dm index 2ffd616b509..d9f3516e2f6 100644 --- a/code/game/gamemodes/cult/items/clothes.dm +++ b/code/game/gamemodes/cult/items/clothes.dm @@ -2,7 +2,6 @@ name = "ragged hood" icon_state = "culthood" desc = "A torn, dust-caked hood." - desc_antag = "As a Cultist, this can be reforged to become an eldritch voidsuit helmet." flags_inv = HIDEFACE|HIDEEARS|HIDEEYES body_parts_covered = HEAD|EYES armor = list( @@ -16,6 +15,10 @@ min_cold_protection_temperature = SPACE_HELMET_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0 +/obj/item/clothing/head/culthood/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a Cultist, this can be reforged to become an eldritch voidsuit helmet." + /obj/item/clothing/head/culthood/cultify() var/obj/item/clothing/head/helmet/space/cult/C = new /obj/item/clothing/head/helmet/space/cult(get_turf(src)) qdel(src) @@ -27,7 +30,6 @@ /obj/item/clothing/suit/cultrobes name = "ragged robe" desc = "A ragged, dusty robe." - desc_antag = "As a Cultist, this item can be reforged to become an eldritch voidsuit." icon_state = "cultrobes" item_state = "cultrobes" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS @@ -42,6 +44,10 @@ flags_inv = HIDEJUMPSUIT siemens_coefficient = 0 +/obj/item/clothing/suit/cultrobes/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a Cultist, this item can be reforged to become an eldritch voidsuit." + /obj/item/clothing/suit/cultrobes/cultify() var/obj/item/clothing/suit/space/cult/C = new /obj/item/clothing/suit/space/cult(get_turf(src)) qdel(src) diff --git a/code/game/gamemodes/cult/items/sword.dm b/code/game/gamemodes/cult/items/sword.dm index 2d231eaa744..75d49e36131 100644 --- a/code/game/gamemodes/cult/items/sword.dm +++ b/code/game/gamemodes/cult/items/sword.dm @@ -1,7 +1,6 @@ /obj/item/melee/cultblade name = "eldritch blade" desc = "A sword humming with unholy energy. It glows with a dim red light and looks deadly sharp." - desc_antag = "This sword is a powerful weapon, capable of severing limbs easily, if they are targeted. Non-believers are unable to use this weapon." icon = 'icons/obj/sword_64.dmi' icon_state = "cultblade" item_state = "cultblade" @@ -24,6 +23,11 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") can_embed = FALSE //can't get stuck anymore, because blood magic +/obj/item/melee/cultblade/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This sword is a powerful weapon, capable of severing limbs easily if they are targeted." + . += "Non-believers are unable to use this weapon." + /obj/item/melee/cultblade/cultify() return diff --git a/code/game/gamemodes/cult/items/talisman.dm b/code/game/gamemodes/cult/items/talisman.dm index e0e16b5ebe3..de1081ffcd2 100644 --- a/code/game/gamemodes/cult/items/talisman.dm +++ b/code/game/gamemodes/cult/items/talisman.dm @@ -6,6 +6,14 @@ var/datum/rune/rune info = "


" +/obj/item/paper/talisman/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(iscultist(user) && rune) + var/network_text = "" + if(network) + network_text = " This spell's network tag reads: [SPAN_CULT(network)]." + . += "The spell inscription reads: [SPAN_CULT(rune.name)].[network_text]" + /obj/item/paper/talisman/Initialize() . = ..() name = "bloodied paper" @@ -15,14 +23,6 @@ QDEL_NULL(rune) return ..() -/obj/item/paper/talisman/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(iscultist(user) && rune) - var/network_text = "" - if(network) - network_text = " This spell's network tag reads: [SPAN_CULT(network)]." - . += "The spell inscription reads: [SPAN_CULT(rune.name)].[network_text]" - /obj/item/paper/talisman/attack_self(mob/living/user) if(iscultist(user)) if(rune) diff --git a/code/game/gamemodes/cult/items/tome.dm b/code/game/gamemodes/cult/items/tome.dm index 62edde129c8..c9676e774f2 100644 --- a/code/game/gamemodes/cult/items/tome.dm +++ b/code/game/gamemodes/cult/items/tome.dm @@ -1,6 +1,5 @@ /obj/item/book/tome name = "arcane tome" - desc_antag = null // It's already been forged once. icon_state = "tome" item_state = "tome" throw_speed = 1 @@ -9,6 +8,12 @@ unique = TRUE slot_flags = SLOT_BELT +/obj/item/book/tome/antagonist_hints(mob/user, distance, is_adjacent) + . = list() + . = ..() + . += "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." + . += SPAN_WARNING("\[?\] This tome contains arcane knowledge of the Geometer's runes. [lang.scramble(message)]") - //Todo: Replace the messages here with better ones. Should display a proper message to cultists //And nonsensical arcane gibberish to non cultists /obj/structure/cult/pylon/proc/present_sacrifice(var/mob/living/user, var/mob/living/victim) @@ -265,7 +264,6 @@ update_icon() - //Called every process in turret mode, and also by chaining spawns /obj/structure/cult/pylon/proc/handle_firing() if((world.time < next_shot) || isbroken) @@ -323,7 +321,6 @@ notarget = 0 reconsider_interval() - /obj/structure/cult/pylon/proc/fire_at(var/atom/target) last_target_loc = get_turf(target.loc) @@ -509,7 +506,6 @@ damagetaken = 0 update_icon() - /obj/structure/cult/pylon/update_icon() ClearOverlays() if(pylonmode == PYLON_TURRET) diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 0b3eabd4180..a8107d8c3df 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -13,6 +13,12 @@ var/obj/item/disk/nuclear/the_disk = null var/active = 0 +/obj/item/pinpointer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + for(var/obj/machinery/nuclearbomb/bomb in SSmachinery.machinery) + if(bomb.timing) + . += "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]" + /obj/item/pinpointer/attack_self() if(!active) active = 1 @@ -49,12 +55,6 @@ AddOverlays("pinonfar") return TRUE -/obj/item/pinpointer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - for(var/obj/machinery/nuclearbomb/bomb in SSmachinery.machinery) - if(bomb.timing) - . += "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]" - /obj/item/pinpointer/Destroy() active = 0 STOP_PROCESSING(SSfast_process, src) diff --git a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm index 5f317c73205..ceac7973f4f 100644 --- a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm +++ b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm @@ -17,6 +17,10 @@ item_state = "paper" origin_tech = list(TECH_BLUESPACE = 4, TECH_POWER = 3) +/obj/item/disposable_teleporter/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "[uses] uses remaining." + //This one is what the wizard starts with. The above is a better version that can be purchased. /obj/item/disposable_teleporter/free name = "complimentary disposable teleporter" @@ -24,10 +28,6 @@ one has been provided to allow you to leave your hideout." uses = 1 -/obj/item/disposable_teleporter/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "[uses] uses remaining." - /obj/item/disposable_teleporter/attack_self(mob/user as mob) if(!uses) to_chat(user, SPAN_DANGER("\The [src] has ran out of uses, and is now useless to you!")) diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 13556363800..edf2a55fca7 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -8,6 +8,10 @@ var/max_cable = 100 var/on = FALSE +/obj/machinery/cablelayer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_NOTICE("\The [src]'s cable reel has [cable.amount] length\s left.") + /obj/machinery/cablelayer/Initialize() . = ..() cable = new(src) @@ -55,10 +59,6 @@ return TRUE return cable.attackby(attacking_item, user) -/obj/machinery/cablelayer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("\The [src]'s cable reel has [cable.amount] length\s left.") - /obj/machinery/cablelayer/proc/load_cable(var/obj/item/stack/cable_coil/CC) if(istype(CC) && CC.amount) var/cur_amount = cable? cable.amount : 0 diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index dd851263d5c..a798a947704 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -1,7 +1,6 @@ /obj/machinery/optable name = "operating table" desc = "Used for advanced medical procedures." - desc_info = "Click your target with Grab intent, then click on the table with an empty hand, to place them on it." icon = 'icons/obj/surgery.dmi' icon_state = "table2-idle" pass_flags_self = PASSTABLE @@ -27,6 +26,13 @@ ///The connected surgery computer var/obj/machinery/computer/operating/computer = null +/obj/machinery/optable/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click your target with Grab intent, then click on the table with an empty hand, to place them on it." + +/obj/machinery/optable/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The neural suppressors are switched [suppressing ? "on" : "off"]." /obj/machinery/optable/Initialize() ..() @@ -119,10 +125,6 @@ patient.reset_view(null) -/obj/machinery/optable/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("The neural suppressors are switched [suppressing ? "on" : "off"].") - /obj/machinery/optable/ex_act(severity) switch(severity) if(1.0) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index e0d67b351d3..56702dd6cee 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -1,16 +1,6 @@ /obj/machinery/sleeper name = "sleeper" desc = "A fancy bed with built-in injectors, a dialysis machine, and a limited health scanner." - desc_info = "The sleeper allows you to clean the blood by means of dialysis, and to administer medication in a controlled environment.
\ -
\ - Click your target with Grab intent, then click on the sleeper to place them in it. Click the green console, with an empty hand, to open the menu. \ - Click 'Start Dialysis' to begin filtering unwanted chemicals from the occupant's blood. The beaker contained will begin to fill with their \ - contaminated blood, and will need to be emptied when full.
\ -
\ - You can also inject common medicines directly into their bloodstream.\ -
\ - Right-click the cell and click 'Eject Occupant' to remove them. You can enter the cell yourself by right clicking and selecting 'Enter Sleeper'. \ - Note that you cannot control the sleeper while inside of it." icon = 'icons/obj/machinery/sleeper.dmi' icon_state = "sleeper" density = TRUE @@ -48,11 +38,23 @@ /obj/item/reagent_containers/glass/beaker/large ) - component_hint_cap = "Upgraded capacitors will reduce power usage." - component_hint_scan = "Upgraded scanning modules will reduce power usage." - parts_power_mgmt = FALSE +/obj/machinery/sleeper/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The sleeper allows you to clean the blood by means of dialysis, and to administer medication in a controlled environment." + . += "Click your target with Grab intent, then click on the sleeper to place them in it. Then click the green console with an empty hand to open the menu." + . += "Click 'Start Dialysis' to begin filtering unwanted chemicals from the occupant's blood. The beaker contained will begin to fill with their \ + contaminated blood, and will need to be emptied when full." + . += "You can also inject common medicines directly into their bloodstream." + . += "Right-click the cell and click 'Eject Occupant' to remove them. You can enter the cell yourself by right clicking and selecting 'Enter Sleeper'. \ + Note that you cannot control the sleeper while inside of it." + +/obj/machinery/sleeper/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will reduce power usage." + . += "Upgraded scanning modules will reduce power usage." + /obj/machinery/sleeper/Initialize() . = ..() update_icon() diff --git a/code/game/machinery/antibody.dm b/code/game/machinery/antibody.dm index 87969399edf..8db9fb8415e 100644 --- a/code/game/machinery/antibody.dm +++ b/code/game/machinery/antibody.dm @@ -19,6 +19,18 @@ /// The person from which the cure is being extracted. var/mob/living/carbon/human/occupant +/obj/machinery/antibody_extractor/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!working) + . += "It's inactive, and beeping ominously every now and then." + switch(stage) + if(1) + . += SPAN_WARNING("It's sucking dark, almost black blood, from the arm of [occupant] into a container.") + if(2) + . += SPAN_DANGER("More and more dark, black blood is being collected and centrifuged.") + if(3) + . += SPAN_CULT("The dark, black blood is slowly being treated and filtered into a shiny, white substance...") + /obj/machinery/antibody_extractor/Destroy() occupant = null return ..() @@ -55,18 +67,6 @@ to_chat(occupant, SPAN_CULT(FONT_HUGE("You are locked by bindings into \the [src] and your arm is stabbed by a needle!"))) playsound(src, 'sound/effects/lingextends.ogg', 30) -/obj/machinery/antibody_extractor/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!working) - . += "It's inactive, and beeping ominously every now and then." - switch(stage) - if(1) - . += SPAN_WARNING("It's sucking dark, almost black blood, from the arm of [occupant] into a container.") - if(2) - . += SPAN_DANGER("More and more dark, black blood is being collected and centrifuged.") - if(3) - . += SPAN_CULT("The dark, black blood is slowly being treated and filtered into a shiny, white substance...") - /obj/machinery/antibody_extractor/process() if(working) icon_state = "extractor-active" diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index ab7581dbddd..b64de9531ab 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -1,11 +1,6 @@ /obj/machinery/portable_atmospherics/canister name = "canister" desc = "Holds gas. Has a built-in valve to allow for filling portable tanks." - desc_info = "The canister can be connected to a connector port with a wrench. Tanks of gas (the kind you can hold in your hand) \ - can be filled by the canister, by using the tank on the canister, increasing the release pressure, then opening the valve until it is full, and then close it. \ - *DO NOT* remove the tank until the valve is closed. A gas analyzer can be used to check the contents of the canister." - - desc_antag = "Canisters can be damaged, spilling their contents into the air, or you can just leave the release valve open." icon = 'icons/obj/atmos.dmi' icon_state = "yellow" density = 1 @@ -27,6 +22,18 @@ var/release_log = "" var/update_flag = 0 +/obj/machinery/portable_atmospherics/canister/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The canister can be connected to a connector port with a wrench." + . += "Tanks of gas (the kind you can hold in your hand) can be filled by the canister by using the tank on the canister, increasing \ + the release pressure, then opening the valve until it is full, and then closing it again. DO NOT remove the tank until the valve is closed." + . += "A gas analyzer can be used to check the contents of the canister." + +/obj/machinery/portable_atmospherics/canister/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Canisters can be damaged, spilling their contents into the air, or you can just leave the release valve open." + . += "You can attach a signaler to \the [src] to remotely toggle its valve opened or closed!" + /obj/machinery/portable_atmospherics/canister/drain_power() return -1 @@ -241,9 +248,6 @@ icon_state = "whitebrs" canister_color = "whitebrs" - - - /obj/machinery/portable_atmospherics/canister/proc/check_change() var/old_flag = update_flag update_flag = 0 diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index 3bce6b5354a..59dfa61b5eb 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -1,7 +1,6 @@ /obj/machinery/meter name = "meter" - desc = "It measures something." - desc_info = "Measures the volume and temperature of the pipe under the meter." + desc = "Measures the volume and temperature of the pipe under the meter." icon = 'icons/obj/meter.dmi' icon_state = "meter_base" var/obj/machinery/atmospherics/pipe/target = null @@ -17,6 +16,22 @@ var/mutable_appearance/button_emissive var/mutable_appearance/atmos_emissive +/obj/machinery/meter/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 3 && !isAI(user)) + . += SPAN_WARNING("You are too far away to read it.") + + else if(stat & (NOPOWER|BROKEN)) + . += SPAN_WARNING("The display is off.") + + else if(src.target) + var/datum/gas_mixture/environment = target.return_air() + if(environment) + . += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]°C)" + else + . += SPAN_WARNING("The sensor error light is blinking.") + else + . += SPAN_WARNING("The connect error light is blinking.") /obj/machinery/meter/Initialize() . = ..() @@ -114,30 +129,7 @@ ) radio_connection.post_signal(src, signal) -/obj/machinery/meter/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - - var/t = "A gas flow meter. " - - if(distance > 3 && !isAI(user)) - t += SPAN_WARNING("You are too far away to read it.") - - else if(stat & (NOPOWER|BROKEN)) - t += SPAN_WARNING("The display is off.") - - else if(src.target) - var/datum/gas_mixture/environment = target.return_air() - if(environment) - t += "The pressure gauge reads [round(environment.return_pressure(), 0.01)] kPa; [round(environment.temperature,0.01)]K ([round(environment.temperature-T0C,0.01)]°C)" - else - t += SPAN_WARNING("The sensor error light is blinking.") - else - t += SPAN_WARNING("The connect error light is blinking.") - - . += t - /obj/machinery/meter/Click() - if(istype(usr, /mob/living/silicon/ai)) // ghosts can call ..() for examine examinate(usr, src) return 1 diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index 1aa70900fb0..9216da0b3ce 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -1,10 +1,6 @@ /obj/machinery/portable_atmospherics/powered/pump name = "portable air pump" - desc = "Used to fill or drain rooms without differentiating between gasses." - desc_info = "Invaluable for filling air in a room rapidly after a breach repair. The internal gas container can be filled by \ - connecting it to a connector port. The pump can pump the air in (sucking) or out (blowing), at a specific target pressure. The powercell inside can be \ - replaced by using a screwdriver, and then adding a new cell. A tank of gas can also be attached to the air pump." - + desc = "Used to fill or drain rooms without differentiating between gases. Invaluable for filling air in a room rapidly after a breach repair." icon = 'icons/obj/atmos.dmi' icon_state = "psiphon:0" density = TRUE @@ -22,6 +18,13 @@ power_rating = 7500 //7500 W ~ 10 HP power_losses = 150 +/obj/machinery/portable_atmospherics/powered/pump/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The internal gas container can be filled by connecting it to a connector port. The pump can pump the air in (sucking) \ + or out (blowing), at a specific target pressure." + . += "The power cell inside can be replaced by using a screwdriver, then adding a new cell. Screw it closed again afterwards." + . += "A tank of gas can also be attached to the air pump." + /obj/machinery/portable_atmospherics/powered/pump/filled start_pressure = PRESSURE_ONE_THOUSAND * 5 @@ -64,7 +67,6 @@ update_icon() SStgui.update_uis(src) - /obj/machinery/portable_atmospherics/powered/pump/process() ..() var/power_draw = -1 diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 4d7788c80a8..b8816d2c787 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -1,10 +1,6 @@ /obj/machinery/portable_atmospherics/powered/scrubber name = "portable air scrubber" desc = "Scrubs contaminants from the local atmosphere or the connected portable tank." - desc_info = "Filters the air, placing harmful gases into the internal gas container. The container can be emptied by \ - connecting it to a connector port. The pump can pump the air in (sucking) or out (blowing), at a specific target pressure. The powercell inside can be \ - replaced by using a screwdriver, and then adding a new cell. A tank of gas can also be attached to the scrubber. " - icon = 'icons/obj/atmos.dmi' icon_state = "pscrubber:0" density = TRUE @@ -23,6 +19,13 @@ var/list/scrubbing_gas = list(GAS_PHORON, GAS_CO2, GAS_N2O, GAS_HYDROGEN, GAS_HELIUM, GAS_DEUTERIUM, GAS_TRITIUM, GAS_BORON, GAS_SULFUR, GAS_NO2, GAS_CHLORINE, GAS_STEAM) +/obj/machinery/portable_atmospherics/powered/scrubber/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Filters the air, placing harmful gases into the internal gas container. The container can be emptied by connecting it to a connector port." + . += "The pump can pump the air in (sucking) or out (blowing), at a specific target pressure." + . += "The power cell inside can be replaced by using a screwdriver, then adding a new cell. Screw it closed again afterwards." + . += "A tank of gas can also be attached to the scrubber." + /obj/machinery/portable_atmospherics/powered/scrubber/Initialize() . = ..() cell = new/obj/item/cell/apc(src) @@ -37,7 +40,6 @@ on = !on update_icon() - /obj/machinery/portable_atmospherics/powered/scrubber/update_icon() ClearOverlays() @@ -237,6 +239,7 @@ return TRUE return ..() + /obj/machinery/portable_atmospherics/powered/scrubber/huge/stationary name = "Stationary Air Scrubber" diff --git a/code/game/machinery/autolathe/autolathe.dm b/code/game/machinery/autolathe/autolathe.dm index 879e79035c1..34703a7c10e 100644 --- a/code/game/machinery/autolathe/autolathe.dm +++ b/code/game/machinery/autolathe/autolathe.dm @@ -43,8 +43,10 @@ /obj/item/stock_parts/console_screen ) - component_hint_bin = "Upgraded matter bins will increase material storage capacity." - component_hint_servo = "Upgraded manipulators will improve material use efficiency and increase fabrication speed." +/obj/machinery/autolathe/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will increase material storage capacity." + . += "Upgraded manipulators will improve material use efficiency and increase fabrication speed." /obj/machinery/autolathe/Initialize() ..() diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index cd97428c1e8..9c710bce6bc 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -14,16 +14,17 @@ var/eat_eff = 1 var/capacity = 100 - component_hint_servo = "Upgraded manipulators will increase the nutrients provided by new inputs." - component_hint_bin = "Upgraded matter bins will decrease the conversion cost of bio-goods." - - component_types = list( /obj/item/circuitboard/biogenerator, /obj/item/stock_parts/matter_bin, /obj/item/stock_parts/manipulator ) +/obj/machinery/biogenerator/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded manipulators will increase the nutrients provided by new inputs." + . += "Upgraded matter bins will decrease the conversion cost of bio-goods." + #define BIOGEN_FOOD "Food" #define BIOGEN_ITEMS "Items" #define BIOGEN_FLAGS "Corporate Flags" diff --git a/code/game/machinery/body_scanner.dm b/code/game/machinery/body_scanner.dm index 8205e4155eb..a3e9b40ce19 100644 --- a/code/game/machinery/body_scanner.dm +++ b/code/game/machinery/body_scanner.dm @@ -1,12 +1,6 @@ /obj/machinery/bodyscanner name = "body scanner" desc = "A state-of-the-art medical diagnostics machine. Guaranteed detection of all your bodily ailments or your money back!" - desc_info = "The advanced scanner detects and reports internal injuries such as bone fractures, internal bleeding, and organ damage. \ - This is useful if you are about to perform surgery.
\ -
\ - Click your target with Grab intent, then click on the scanner to place them in it. Click the connected terminal to operate. \ - Right-click the scanner and click 'Eject Occupant' to remove them. You can enter the scanner yourself in a similar way, using the 'Enter Body Scanner' \ - verb." icon = 'icons/obj/machinery/bodyscanner.dmi' icon_state = "body_scanner" density = TRUE @@ -44,6 +38,14 @@ SPECIES_MONKEY ) +/obj/machinery/bodyscanner/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if (anchored) + . += "The advanced scanner detects and reports internal injuries such as bone fractures, internal bleeding, and organ damage. This is useful if you are about to perform surgery." + . += "Click your target with Grab intent, then click on the scanner to place them in it. Click the connected terminal to operate." + . += "Right-click the scanner and click 'Eject Occupant' to remove them." + . += "You can enter the scanner yourself in a similar way using the 'Enter Body Scanner' verb, or by clicking and dragging yourself onto the scanner with any intent." + /obj/machinery/bodyscanner/Initialize() . = ..() for(var/obj/machinery/body_scanconsole/C in orange(1,src)) diff --git a/code/game/machinery/bots/bots.dm b/code/game/machinery/bots/bots.dm index 3d76152e599..6eba6b53b97 100644 --- a/code/game/machinery/bots/bots.dm +++ b/code/game/machinery/bots/bots.dm @@ -15,6 +15,15 @@ var/locked = 1 //var/emagged = 0 //Urist: Moving that var to the general /bot tree as it's used by most bots +/obj/machinery/bot/condition_hints(mob/user, distance, is_adjacent) + . += list() + . = ..() + if (src.health < maxhealth) + if (src.health > maxhealth/3) + . += SPAN_WARNING("[src]'s parts look loose.") + else + . += SPAN_DANGER("[src]'s parts look very loose!") + /obj/machinery/bot/Initialize(mapload, d, populate_components, is_internal) . = ..() add_to_target_grid() @@ -53,14 +62,6 @@ log_and_message_admins("emagged [src]'s inner circuits") return 1 -/obj/machinery/bot/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (src.health < maxhealth) - if (src.health > maxhealth/3) - . += SPAN_WARNING("[src]'s parts look loose.") - else - . += SPAN_DANGER("[src]'s parts look very loose!") - /obj/machinery/bot/attackby(obj/item/attacking_item, mob/user) if(attacking_item.isscrewdriver()) if(!locked) diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 950232ed03a..d3e3e210b22 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -1,7 +1,6 @@ /obj/machinery/cell_charger name = "heavy-duty cell charger" desc = "A much more powerful version of the standard recharger that is specifically designed to charge power cells." - desc_info = "This can be moved by using a wrench. You will need to wrench it again when and where you want to use it. Requires electricity to function." icon = 'icons/obj/machinery/cell_charger.dmi' icon_state = "ccharger" anchored = TRUE @@ -14,6 +13,20 @@ var/charge_level = -1 var/const/CHARGE_EFFICIENCY = 1.38 +/obj/machinery/cell_charger/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It [anchored ? "is" : "could be"] anchored in place with a couple of bolts." + +/obj/machinery/cell_charger/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 5) + return + + if(charging) + . += "There's \a [charging.name] in the charger. Current charge: [charging.percent()]%." + else + . += SPAN_WARNING("The charger is empty.") + /obj/machinery/cell_charger/proc/update_charge_level() if(!charging) charge_level = -1 @@ -39,16 +52,6 @@ AddOverlays("cell-o2") AddOverlays("[icon_state]-o[charge_level]") -/obj/machinery/cell_charger/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 5) - return - - if(charging) - . += "There's \a [charging.name] in the charger. Current charge: [charging.percent()]%." - else - . += SPAN_WARNING("The charger is empty.") - /obj/machinery/cell_charger/attackby(obj/item/attacking_item, mob/user) if(stat & BROKEN) return TRUE diff --git a/code/game/machinery/chem_heater.dm b/code/game/machinery/chem_heater.dm index 35b54e19675..cdee1df0b26 100644 --- a/code/game/machinery/chem_heater.dm +++ b/code/game/machinery/chem_heater.dm @@ -18,7 +18,6 @@ var/min_temperature = 100 var/max_temperature = 600 var/slow_mode = FALSE - component_hint_servo = "Upgraded servos increase the speed at which vessel contents are heated." component_types = list( /obj/item/circuitboard/chem_heater, @@ -27,6 +26,10 @@ /obj/item/stock_parts/manipulator ) +/obj/machinery/chem_heater/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded manipulators increase the speed at which vessel contents are heated." + /obj/machinery/chem_heater/attack_hand(mob/user) user.set_machine(src) interact(user) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 6189a6c4d54..0bd4dd28b1c 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -391,6 +391,10 @@ var/datum/dna2/record/buf = null var/read_only = 0 //Well,it's still a floppy disk +/obj/item/disk/data/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." + /obj/item/disk/data/proc/initializeDisk() buf = new buf.dna=new @@ -434,10 +438,6 @@ read_only = !read_only to_chat(user, "You flip the write-protect tab to [read_only ? "protected" : "unprotected"].") -/obj/item/disk/data/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "The write-protect tab is set to [read_only ? "protected" : "unprotected"]." - /* * Diskette Box */ diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 58087644d45..31293ab1ddf 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -7,7 +7,6 @@ /obj/machinery/constructable_frame //Made into a seperate type to make future revisions easier. name = "machine blueprint" desc = "A holo-blueprint for a machine." - desc_info = "A blueprint that allows the user to rotate the direction the final result will be built in. Putting better components in now, will cause the machine made to have better components and functionality." var/machine_description var/components_description icon = 'icons/obj/stock_parts.dmi' @@ -23,25 +22,41 @@ var/state = 1 var/pitch_toggle = 1 -/obj/machinery/constructable_frame/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/constructable_frame/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "A blueprint that allows the user to rotate the direction the final result will be built in." + . += "Higher-quality components can improve the functionality of the machine in different ways." + +/obj/machinery/constructable_frame/assembly_hints(mob/user, distance, is_adjacent) + . += ..() switch(state) if(BLUEPRINT_STATE) - . += FONT_SMALL(SPAN_NOTICE("Click on \the [src] to finalize its direction.")) - . += FONT_SMALL(SPAN_WARNING("Use a wirecutter or a plasma cutter to disassemble \the [src].")) + . += "Click on \the [src] to finalize its direction." if(WIRING_STATE) - . += FONT_SMALL(SPAN_NOTICE("Add cable coil to wire \the [src].")) - . += FONT_SMALL(SPAN_WARNING("Use a wrench or a plasma cutter to disassemble \the [src].")) + . += "Add cable coil to wire \the [src]." if(CIRCUITBOARD_STATE) - . += FONT_SMALL(SPAN_NOTICE("Add the desired circuitboard.")) - . += FONT_SMALL(SPAN_WARNING("Use a wirecutter to remove the cables.")) + . += "Add the desired circuitboard." if(COMPONENT_STATE) - . += FONT_SMALL(SPAN_NOTICE("Add the required components. Use the screwdriver to complete the machine.")) - . += FONT_SMALL(SPAN_WARNING("Use a crowbar to pry out the circuitboard and the components out.")) + . += "Add the required components. Use the screwdriver to complete the machine." + +/obj/machinery/constructable_frame/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + switch(state) + if(BLUEPRINT_STATE) + . += "Use a wirecutter or a plasma cutter to disassemble \the [src]." + if(WIRING_STATE) + . += "Use a wrench or a plasma cutter to disassemble \the [src]." + if(CIRCUITBOARD_STATE) + . += "Use a wirecutter to remove the cables." + if(COMPONENT_STATE) + . += "Use a crowbar to pry out the circuitboard and the components out." + +/obj/machinery/constructable_frame/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(machine_description) - . += FONT_SMALL(SPAN_NOTICE(machine_description)) + . += "[machine_description]" if(components_description) - . += FONT_SMALL(SPAN_NOTICE(components_description)) + . += "[components_description]" /obj/machinery/constructable_frame/proc/update_component_desc() var/D diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index d13abd1d03d..345f365cb9f 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -3,21 +3,6 @@ /obj/machinery/atmospherics/unary/cryo_cell name = "cryo cell" desc = "A cryogenic chamber that can freeze occupants while keeping them alive, preventing them from taking any further damage. It can be loaded with a chemical cocktail for various medical benefits." - desc_info = "The cryogenic chamber, or 'cryo', treats most damage types, most notably genetic damage. It also stabilizes patients \ - in critical condition by placing them in stasis, so they can be treated at a later time.
\ -
\ - In order for it to work, it must be loaded with chemicals, and the temperature of the solution must reach a certain point. Additionally, it \ - requires a supply of pure oxygen, provided by canisters that are attached. The most commonly used chemicals in the chambers are Cryoxadone and \ - Clonexadone. Clonexadone is more effective in treating all damage, including Genetic damage, but is otherwise functionally identical.
\ -
\ - Activating the freezer nearby, and setting it to a temperature setting below 150, is recommended before operation! Further, any clothing the patient \ - is wearing that act as an insulator will reduce its effectiveness, and should be removed.
\ -
\ - Clicking the tube with a beaker full of chemicals in hand will place it in its storage to distribute when it is activated.
\ -
\ - Click your target with Grab intent, then click on the tube, with an empty hand, to place them in it. Click the tube again to open the menu. \ - Press the button on the menu to activate it. Once they have reached 100 health, right-click the cell and click 'Eject Occupant' to remove them. \ - Remember to turn it off, once you've finished, to save power and chemicals!" icon = 'icons/obj/cryogenics.dmi' // map only icon_state = "pod_preview" density = TRUE @@ -54,7 +39,34 @@ var/slow_stasis_mult = 1.7 var/current_stasis_mult = 1 - component_hint_servo = "Upgraded manipulators will increase effectiveness of both hyper-metabolism and cryostasis functions." +/obj/machinery/atmospherics/unary/cryo_cell/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The cryogenic chamber, or 'cryo', treats most damage types, most notably genetic damage. It also stabilizes patients \ + in critical condition by placing them in stasis, so they can be treated at a later time." + . += "In order for it to work, it must be loaded with chemicals, and the temperature of the solution must reach a certain point. Additionally, it \ + requires a supply of pure oxygen provided by attached canisters." + . += "The most commonly used chemicals in the chambers are Cryoxadone and Clonexadone." + . += "Activating the freezer nearby and setting it to a temperature setting below 150 is recommended before operation! Further, any insulating clothing the patient \ + is wearing will reduce its effectiveness, and should be removed." + . += "Clicking the tube with a beaker full of chemicals in hand will place it in its storage to distribute when it is activated." + . += "Click your target with Grab intent, then click on the tube, with an empty hand, to place them in it. Click the tube again to open the menu. \ + Press the button on the menu to activate it." + . += "Once they have reached 100 health, right-click the cell and click 'Eject Occupant' to remove them." + . += "Remember to turn the cryo off once you've finished to save power and chemicals!" + +/obj/machinery/atmospherics/unary/cryo_cell/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded manipulators will increase effectiveness of both hyper-metabolism and cryostasis functions." + +/obj/machinery/atmospherics/unary/cryo_cell/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + if(beaker) + . += "It is loaded with a beaker." + if(occupant) + occupant.examine(arglist(args)) + if(panel_open) + . += "The maintenance hatch is open." /obj/machinery/atmospherics/unary/cryo_cell/Initialize() . = ..() @@ -77,17 +89,6 @@ node = target break -/obj/machinery/atmospherics/unary/cryo_cell/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(beaker) - . += SPAN_NOTICE("It is loaded with a beaker.") - if(occupant) - occupant.examine(arglist(args)) - - if(panel_open) - . += "The maintenance hatch is open." - /obj/machinery/atmospherics/unary/cryo_cell/process() ..() if(!node) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index e30a94382c7..714edb30d24 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -219,6 +219,11 @@ /obj/item/card/id/captains_spare ) +/obj/machinery/cryopod/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(occupant) + . += SPAN_NOTICE("[occupant] [occupant.get_pronoun("is")] inside \the [initial(name)].") + /obj/machinery/cryopod/robot name = "robotic storage unit" desc = "A storage unit for robots." @@ -249,7 +254,6 @@ var/image/I = image(icon, "pod_top") AddOverlays(I) - if(occupant) I = image(icon, "pod_back") AddOverlays(I) @@ -280,11 +284,6 @@ . = ..() find_control_computer() -/obj/machinery/cryopod/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(occupant) - . += SPAN_NOTICE("[occupant] [occupant.get_pronoun("is")] inside \the [initial(name)].") - /obj/machinery/cryopod/can_hold_dropped_items() return FALSE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index aa3374109ac..d1bc97ef1fe 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -169,6 +169,30 @@ /// As above, but with req_one_access. Note that only one of these lists should ever be set. var/list/req_one_access_by_level +/obj/machinery/door/airlock/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Airlocks separate ship/station compartments safely by providing airtight seals between them." + . += "Airlocks use access control; you must be wearing your ID (or an object containing your ID) in your ID slot, wrist slot, or active in-hand, for it to be read." + . += "Airlocks require power to function. When power is lost, an airlock might fail closed or open, depending on how secure it is." + . += "An unpowered airlock can be opened or closed with a crowbar, but a powered airlock cannot." + +/obj/machinery/door/airlock/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Hacking standard airlocks to grant you access can be done automatically with a door hacking tool, or by identifying and cutting its ID scan wire. (Wear insulated gloves when working with wires!)" + . += "Certain types of reinforced or secured airlocks are resistant to your door hacking tool." + . += "You can also bypass standard airlocks by probing one of its power wires with a multitool to temporarily depower it, and then using a crowbar to pry it open." + . += "By manipulating their wiring, you can turn airlocks into traps for the crew by electrifying them, disabling their timers and safeties, and more." + +/obj/machinery/door/airlock/feedback_hints(mob/user, distance, is_adjacent) + . = ..() + if(p_open) + . += SPAN_NOTICE("\The [src]'s maintenance panel has been unscrewed and is hanging open.") + if(bracer) + . += SPAN_WARNING("\The [bracer] is installed on \the [src], preventing it from opening.") + . += bracer.health + if(islist(access_by_level) || islist(req_one_access_by_level)) + . += SPAN_NOTICE("This airlock changes access requirements depending on the level.") + /obj/machinery/door/airlock/Initialize(mapload, dir, populate_components, obj/structure/door_assembly/assembly = null) var/on_admin_z = FALSE //wires & hatch - this needs to be done up here so the hatch isn't generated by the parent Initialize(). @@ -2104,20 +2128,6 @@ About the new airlock wires panel: src.lock() return -/obj/machinery/door/airlock/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (bolt_cut_state == BOLTS_EXPOSED) - . += SPAN_WARNING("The bolt cover has been cut open.") - if (bolt_cut_state == BOLTS_CUT) - . += SPAN_WARNING("The door bolts have been cut.") - if(bracer) - . += SPAN_WARNING("\The [bracer] is installed on \the [src], preventing it from opening.") - . += bracer.health - if(p_open) - . += SPAN_NOTICE("\The [src]'s maintenance panel has been unscrewed and is hanging open.") - if(islist(access_by_level) || islist(req_one_access_by_level)) - . += SPAN_NOTICE("This airlock changes access requirements depending on the level.") - /obj/machinery/door/airlock/emag_act(var/remaining_charges) . = ..() lock(1) diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index fe131ef57b6..d75ebf4fe9c 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -16,6 +16,11 @@ var/is_installed = FALSE // no double-spending var/unres_dir = null +/obj/item/airlock_electronics/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Access control can be configured by using your ID on the circuitboard to unlock it, then using the circuitboard on yourself." + . += "You can copy the settings from one circuitboard to another by clicking the source board with the target board. Be mindful of directional access settings!" + /obj/item/airlock_electronics/attack_self(mob/user) if(!ishuman(user) && !istype(user,/mob/living/silicon/robot)) return ..(user) @@ -141,6 +146,9 @@ /obj/item/airlock_electronics/secure name = "secure airlock electronics" desc = "Designed to be somewhat more resistant to hacking than standard electronics." - desc_info = "With these electronics, wires will be randomized and bolts will drop if the airlock is broken." origin_tech = list(TECH_DATA = 2) secure = TRUE + +/obj/item/airlock_electronics/secure/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Airlocks built with this board will have their wires uniquely randomized, and bolts will automatically drop if the airlock is broken." diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index e218366b4c4..4a0925f3091 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -61,6 +61,15 @@ can_astar_pass = CANASTARPASS_ALWAYS_PROC +/obj/machinery/door/condition_hints(mob/user, distance, is_adjacent) + . = ..() + if(src.health < src.maxhealth / 4) + . += SPAN_WARNING("\The [src] looks like it's about to break!") + else if(src.health < src.maxhealth / 2) + . += SPAN_WARNING("\The [src] looks seriously damaged!") + else if(src.health < src.maxhealth * 3/4) + . += SPAN_WARNING("\The [src] shows signs of damage!") + /obj/machinery/door/attack_generic(var/mob/user, var/damage) if(damage >= 10) visible_message(SPAN_DANGER("\The [user] smashes into the [src]!")) @@ -415,15 +424,6 @@ update_icon() return -/obj/machinery/door/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(src.health < src.maxhealth / 4) - . += SPAN_WARNING("\The [src] looks like it's about to break!") - else if(src.health < src.maxhealth / 2) - . += SPAN_WARNING("\The [src] looks seriously damaged!") - else if(src.health < src.maxhealth * 3/4) - . += SPAN_WARNING("\The [src] shows signs of damage!") - /obj/machinery/door/proc/set_broken() stat |= BROKEN visible_message(SPAN_WARNING("[src] breaks!")) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index dd07c19b214..233290f6e2f 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -61,6 +61,54 @@ can_astar_pass = CANASTARPASS_DENSITY +/obj/machinery/door/firedoor/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Firedoors automatically close if the pressure differential on either side of them meets or exceeds 25 kPa, or temperature rises above 50° C or falls below 0° C on either side." + . += "Firedoors require electricity to operate." + . += "Firedoors on active lockdown can be examined, when adjacent, to view pressure and temperature data from each side of the door." + . += "Engineering, Atmospherics, or Paramedical access rights are required to freely open firedoors on active lockdown." + +/obj/machinery/door/firedoor/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!is_adjacent || !density) + return + + var/pdiff_rounded = round(pdiff,0.1) + if(pdiff >= FIREDOOR_MAX_PRESSURE_DIFF) + . += SPAN_DANGER("Current pressure differential is [pdiff_rounded] kPa. Opening door will likely result in injury.") + if(pdiff <= 15) + . += SPAN_NOTICE("Current pressure differential is less than 15 kPa.") + else if(pdiff <= 1) + . += SPAN_GOOD("Current pressure differential is less than 1 kPa.") + + . += "Sensor readings:" + for(var/index = 1; index <= tile_info.len; index++) + switch(index) + if(1) + . += "NORTH: " + if(2) + . += "SOUTH: " + if(3) + . += "EAST: " + if(4) + . += "WEST: " + if(tile_info[index] == null) + . += SPAN_WARNING("DATA UNAVAILABLE") + continue + var/celsius = convert_k2c(tile_info[index][1]) + var/pressure = tile_info[index][2] + . += "" + . += "[celsius]° C " + . += "" + . += "[pressure] kPa" + + if(islist(users_to_open) && users_to_open.len) + var/users_to_open_string = users_to_open[1] + if(users_to_open.len >= 2) + for(var/i = 2 to users_to_open.len) + users_to_open_string += ", [users_to_open[i]]" + . += "These people have opened \the [src] during an alert: [users_to_open_string]." + /obj/machinery/door/firedoor/Initialize(var/mapload) . = ..() for(var/obj/machinery/door/firedoor/F in loc) @@ -150,42 +198,6 @@ /obj/machinery/door/firedoor/get_material() return SSmaterials.get_material_by_name(DEFAULT_WALL_MATERIAL) -/obj/machinery/door/firedoor/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!is_adjacent || !density) - return - - if(pdiff >= FIREDOOR_MAX_PRESSURE_DIFF) - . += SPAN_DANGER("Current pressure differential is [pdiff] kPa. Opening door will likely result in injury.") - - . += "Sensor readings:" - for(var/index = 1; index <= tile_info.len; index++) - switch(index) - if(1) - . += "NORTH: " - if(2) - . += "SOUTH: " - if(3) - . += "EAST: " - if(4) - . += "WEST: " - if(tile_info[index] == null) - . += SPAN_WARNING("DATA UNAVAILABLE") - continue - var/celsius = convert_k2c(tile_info[index][1]) - var/pressure = tile_info[index][2] - . += "" - . += "[celsius]°C " - . += "" - . += "[pressure]kPa" - - if(islist(users_to_open) && users_to_open.len) - var/users_to_open_string = users_to_open[1] - if(users_to_open.len >= 2) - for(var/i = 2 to users_to_open.len) - users_to_open_string += ", [users_to_open[i]]" - . += "These people have opened \the [src] during an alert: [users_to_open_string]." - /obj/machinery/door/firedoor/CollidedWith(atom/bumped_atom) if(p_open || operating) return diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 12a7e39f5ff..c63f8442887 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -10,6 +10,10 @@ GLOBAL_LIST_INIT_TYPED(doppler_arrays, /obj/machinery/doppler_array, list()) density = TRUE var/active = TRUE +/obj/machinery/doppler_array/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_NOTICE("\The [src] is [active ? "listening for explosions" : "inactive"].") + /obj/machinery/doppler_array/Initialize() . = ..() GLOB.doppler_arrays += src @@ -19,10 +23,6 @@ GLOBAL_LIST_INIT_TYPED(doppler_arrays, /obj/machinery/doppler_array, list()) GLOB.doppler_arrays -= src return ..() -/obj/machinery/doppler_array/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("\The [src] is [active ? "listening for explosions" : "[SPAN_WARNING("inactive")]"].") - /obj/machinery/doppler_array/attack_hand(mob/user) active = !active to_chat(user, SPAN_NOTICE("\The [src] is now [active ? "listening for explosions" : "[SPAN_WARNING("inactive")]"].")) diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 940c042751b..74e0ad04513 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -18,6 +18,10 @@ var/_wifi_id var/datum/wifi/receiver/button/flasher/wifi_receiver +/obj/machinery/flasher/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use a wirecutter on this to disconnect the flashbulb, disabling it. Use wirecutters again to reconnect it." + /obj/machinery/flasher/portable //Portable version of the flasher. Only flashes when anchored name = "portable flasher" desc = "A portable flashing device. Wrench to activate and deactivate. Cannot detect slow movements." diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index 891f5b9b1e4..e4157be33e2 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -15,20 +15,19 @@ light_color = LIGHT_COLOR_TUNGSTEN light_wedge = LIGHT_WIDE +/obj/machinery/floodlight/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!cell.charge) + . += SPAN_WARNING("The installed [cell.name] is completely flat!") + return + else + . += SPAN_WARNING("\The [src] has no cell installed!") + . += SPAN_NOTICE("The installed [cell.name] has [Percent(cell.charge, cell.maxcharge)]% charge remaining.") + /obj/machinery/floodlight/Initialize() . = ..() cell = new /obj/item/cell(src) -/obj/machinery/floodlight/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(cell) - if(!cell.charge) - . += SPAN_WARNING("The installed [cell.name] is completely flat!") - return - . += SPAN_NOTICE("The installed [cell.name] has [Percent(cell.charge, cell.maxcharge)]% charge remaining.") - else - . += SPAN_WARNING("\The [src] has no cell installed!") - /obj/machinery/floodlight/update_icon() ClearOverlays() icon_state = "flood[open ? "o" : ""][open && cell ? "b" : ""]0[on]" @@ -83,7 +82,6 @@ if(!turn_on(TRUE)) to_chat(user, SPAN_WARNING("You try to turn on \the [src] but it does not work.")) - /obj/machinery/floodlight/attack_hand(mob/user) if(open && cell) user.put_in_hands(cell) @@ -105,7 +103,6 @@ update_icon() - /obj/machinery/floodlight/attackby(obj/item/attacking_item, mob/user) if(attacking_item.isscrewdriver()) if(!open) diff --git a/code/game/machinery/floor_frames.dm b/code/game/machinery/floor_frames.dm index a5c00f65f9b..32d39cdfb92 100644 --- a/code/game/machinery/floor_frames.dm +++ b/code/game/machinery/floor_frames.dm @@ -9,6 +9,11 @@ var/refund_type = /obj/item/stack/material/steel var/reverse = 0 //if resulting object faces opposite its dir (like light fixtures) +/obj/item/floor_frame/assembly_hints() + . = list() + . += ..() + . += "It could be installed by using it on an adjacent floor." + /obj/item/floor_frame/attackby(obj/item/attacking_item, mob/user) if (attacking_item.iswrench()) new refund_type(get_turf(src.loc), refund_amt) diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index 4215b5e822d..41d7b9a7109 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -1,7 +1,6 @@ /obj/machinery/floorlayer name = "automatic floor layer" desc = "A large piece of machinery used that can place, dismantle, and collect floor tiles." - desc_info = "Use a screwdriver to set which tile to lay, a wrench to configure the various modes, and a crowbar to take out tiles. Clicking on it with an empty hand will turn it on and off." icon = 'icons/obj/floor_layer.dmi' icon_state = "floor_layer" density = TRUE @@ -10,6 +9,21 @@ var/obj/item/stack/tile/T var/list/mode = list("dismantle"=0,"laying"=0,"collect"=0) +/obj/machinery/floorlayer/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use a screwdriver to set which tile to lay, a wrench to configure the various modes, and a crowbar to take out tiles." + . += "Clicking on it with an empty hand will turn it on and off." + +/obj/machinery/floorlayer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/dismantle = mode["dismantle"] + var/laying = mode["laying"] + var/collect = mode["collect"] + var/number = 0 + if (T) + number = T.get_amount() + . += "\The [src] has [number] tile\s, dismantle is [dismantle ? "on" : "off"], laying is [laying ? "on" : "off"], collect is [collect ? "on" : "off"]." + /obj/machinery/floorlayer/Initialize() . = ..() T = new /obj/item/stack/tile/floor/full_stack(src) @@ -62,16 +76,6 @@ T = tgui_input_list(user, "Choose which set of tiles you want \the [src] to lay.", "Tiles", contents) return TRUE -/obj/machinery/floorlayer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/dismantle = mode["dismantle"] - var/laying = mode["laying"] - var/collect = mode["collect"] - var/number = 0 - if (T) - number = T.get_amount() - . += SPAN_NOTICE("\The [src] has [number] tile\s, dismantle is [dismantle ? "on" : "off"], laying is [laying ? "on" : "off"], collect is [collect ? "on" : "off"].") - /obj/machinery/floorlayer/proc/reset() on = FALSE diff --git a/code/game/machinery/gumball.dm b/code/game/machinery/gumball.dm index 31fc1077408..4f3c1b2da50 100644 --- a/code/game/machinery/gumball.dm +++ b/code/game/machinery/gumball.dm @@ -14,6 +14,11 @@ var/on = 1 var/broken = 0 +/obj/machinery/gumballmachine/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "\The [src] costs [gumprice] credits to use." + + /obj/machinery/gumballmachine/Initialize() . = ..() @@ -27,11 +32,6 @@ update_icon() - -/obj/machinery/gumballmachine/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("\The [src] costs [gumprice] credits to use.") - /obj/machinery/gumballmachine/update_icon() switch(amountleft) if(20) diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 8aed4b5cdec..52fe8c0dd5b 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -64,6 +64,14 @@ Possible to do for anyone motivated enough: var/can_hear_flags = NONE +/obj/machinery/hologram/holopad/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(connected_pad) + if(established_connection) + . += "\The [src] is currently in a call with a holopad with ID: [connected_pad.holopad_id]" + else + . += SPAN_NOTICE("\The [src] is currently pending connection with a holopad with ID: [connected_pad.holopad_id]") + /obj/machinery/hologram/holopad/Initialize() . = ..() @@ -83,14 +91,6 @@ Possible to do for anyone motivated enough: var/area/A = get_area(src) holopad_id = "[A.name] ([src.x]-[src.y]-[src.z])" -/obj/machinery/hologram/holopad/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(connected_pad) - if(established_connection) - . += SPAN_NOTICE("\The [src] is currently in a call with a holopad with ID: [connected_pad.holopad_id]") - else - . += SPAN_NOTICE("\The [src] is currently pending connection with a holopad with ID: [connected_pad.holopad_id]") - /obj/machinery/hologram/holopad/update_icon(var/recurse = TRUE) if(LAZYLEN(active_holograms) || has_established_connection()) icon_state = "holopad2[icon_state_suffix]" diff --git a/code/game/machinery/howitzer.dm b/code/game/machinery/howitzer.dm index fdd48f0de83..6e72f462f22 100644 --- a/code/game/machinery/howitzer.dm +++ b/code/game/machinery/howitzer.dm @@ -93,7 +93,6 @@ ABSTRACT_TYPE(/obj/machinery/howitzer) loaded_shot = null return - /obj/machinery/howitzer/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -368,13 +367,12 @@ ABSTRACT_TYPE(/obj/item/ammo_casing/howitzer) projectile_type = /obj/projectile/howitzer -/obj/item/ammo_casing/howitzer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/ammo_casing/howitzer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() . += "\A [name], to be used in a howitzer." if(!BB && distance < 4) . += "This one is spent." - /** * # Howitzer Ammo * diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 26b25d64969..afd01ebd770 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -1,9 +1,6 @@ /obj/machinery/iv_drip name = "\improper IV drip" desc = "A professional standard intravenous stand with supplemental gas support for medical use." - desc_info = "IV drips can be supplied beakers/bloodpacks for reagent transfusions, as well as one breath mask and gas tank for supplemental gas therapy. \ -
- Click and Drag to attach/detach the IV or secure/remove the breath mask on your target.
- Click the stand with an empty hand to \ - toggle between various modes. Using a wrench when it has a tank installed will secure it.
- Alt Click the stand to remove items contained in the stand." icon = 'icons/obj/iv_drip.dmi' icon_state = "iv_stand" anchored = 0 @@ -60,8 +57,43 @@ /obj/item/stock_parts/manipulator, /obj/item/stock_parts/scanning_module) - component_hint_scan = "Upgraded scanning modules will provide the exact volume and composition of attached beakers." - component_hint_servo = "Upgraded manipulators will allow patients to be hooked to IV through armor and increase the maximum reagent transfer rate." +/obj/machinery/iv_drip/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "IV drips can be supplied beakers/bloodpacks for reagent transfusions, as well as one breath mask and gas tank for supplemental gas therapy." + . += "Use a wrench when it has a tank installed to secure it. Use it again to unsecure it before removal." + . += "Click-drag to attach/detach the IV or secure/remove the breath mask on your target." + . += "Click the stand with an empty hand to toggle between various modes." + . += "ALT-Click the stand to remove items contained in the stand." + +/obj/machinery/iv_drip/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded scanning modules will provide the exact volume and composition of attached beakers." + . += "Upgraded manipulators will allow patients to be hooked to IV through armor and increase the maximum reagent transfer rate." + +/obj/machinery/iv_drip/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "[src] is [mode ? "injecting" : "taking blood"] at a rate of [src.transfer_amount] u/sec, the automatic injection stop mode is [toggle_stop ? "on" : "off"]." + . += "The Emergency Positive Pressure system is [epp ? "on" : "off"]." + if(attached) + . += "\The [src] is attached to [attached]'s [vein.name]." + if(beaker) + if(LAZYLEN(beaker.reagents.reagent_volumes)) + . += "Attached is \a [beaker] with [adv_scan ? "[beaker.reagents.total_volume] units of primarily [beaker.reagents.get_primary_reagent_name()]" : "some liquid"]." + else + . += "Attached is \a [beaker]. It is empty." + else + . += "No chemicals attached." + if(tank) + . += "Installed is [is_loose ? "\a [tank] sitting loose" : "\a [tank] secured"] on the stand. The meter shows [round(tank.air_contents.return_pressure())] kPa, \ + with the pressure set to [round(tank.distribute_pressure)] kPa. The valve is [valve_open ? "open" : "closed"]." + else + . += "No gas tank installed." + if(breath_mask) + . += "\The [src] has \a [breath_mask] installed. [breather ? breather : "No one"] is wearing it." + else + . += "No breath mask installed." + + . += ..() /obj/machinery/iv_drip/Initialize(mapload) . = ..() @@ -695,31 +727,6 @@ transfer_amount = amount to_chat(usr, SPAN_NOTICE("Transfer rate set to [src.transfer_amount] u/sec.")) -/obj/machinery/iv_drip/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 2) - return - . += SPAN_NOTICE("
[src] is [mode ? "injecting" : "taking blood"] at a rate of [src.transfer_amount] u/sec, the automatic injection stop mode is [toggle_stop ? "on" : "off"]. The Emergency Positive Pressure \ - system is [epp ? "on" : "off"].") - if(attached) - . += SPAN_NOTICE("\The [src] is attached to [attached]'s [vein.name].") - if(beaker) - if(LAZYLEN(beaker.reagents.reagent_volumes)) - . += SPAN_NOTICE("Attached is [icon2html(beaker, user)] \a [beaker] with [adv_scan ? "[beaker.reagents.total_volume] units of primarily [beaker.reagents.get_primary_reagent_name()]" : "some liquid"].") - else - . += SPAN_NOTICE("Attached is [icon2html(beaker, user)] \a [beaker]. It is empty.") - else - . += SPAN_NOTICE("No chemicals are attached.") - if(tank) - . += SPAN_NOTICE("Installed is [icon2html(tank, user)] [is_loose ? "\a [tank] sitting loose" : "\a [tank] secured"] on the stand. The meter shows [round(tank.air_contents.return_pressure())]kPa, \ - with the pressure set to [round(tank.distribute_pressure)]kPa. The valve is [valve_open ? "open" : "closed"].") - else - . += SPAN_NOTICE("No gas tank installed.") - if(breath_mask) - . += SPAN_NOTICE("\The [src] has [icon2html(breath_mask, user)] \a [breath_mask] installed. [breather ? breather : "No one"] is wearing it.") - else - . += SPAN_NOTICE("No breath mask installed.") - /obj/machinery/iv_drip/RefreshParts() ..() var/manip = 0 diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 24e4e25aad9..d6774dd323a 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -15,6 +15,11 @@ z_flags = ZMM_MANGLE_PLANES // luminosity = 1 +/obj/machinery/light_switch/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + . += "It is [on ? "on" : "off"]." + /obj/machinery/light_switch/Initialize() . = ..() src.area = get_area(src) @@ -41,11 +46,6 @@ else if (light_range) set_light(FALSE) -/obj/machinery/light_switch/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += "It is [on ? "on" : "off"]." - /obj/machinery/light_switch/attack_hand(mob/user) playsound(src, /singleton/sound_category/switch_sound, 30) on = !on diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 1f322d5e2bb..21e6b92e397 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -125,13 +125,6 @@ Class Procs: var/parts_power_mgmt = TRUE /// The total power rating of all parts serves as a power usage multiplier. var/parts_power_usage = 0 - /// Blurbs for what each component type does. Appended to machine's /desc_info. - /// Kindly use the format in appended comments for consistency - var/component_hint_bin // "Upgraded matter bins will XYZ." - var/component_hint_cap // "Upgraded capacitors will XYZ." - var/component_hint_laser // "Upgraded micro-lasers will XYZ" - var/component_hint_scan // "Upgraded scanning modules will XYZ" - var/component_hint_servo // "Upgraded manipulators will XYZ" var/uid var/panel_open = 0 @@ -152,6 +145,17 @@ Class Procs: /// Pass the manufacturer in ui_data and then use it in the UI. var/manufacturer = null +/obj/machinery/feedback_hints(mob/user, distance, is_adjacent) + . = list() + if(signaler && is_adjacent) + . += SPAN_WARNING("\The [src] has a hidden signaler attached to it. You might or might not notice this.") + // Still needs some work- must be able to be distinguish between thinobjectsgs that are anchored that can be casually + // unanchored (i.e. vending machines) vs. objects that are anchored but require other steps to unanchor (i.e. airlocks). + /* + if(anchored) + . += SPAN_NOTICE("\The [src] is anchored to the floor by a couple of bolts.") + */ + /obj/machinery/Initialize(mapload, d = 0, populate_components = TRUE, is_internal = FALSE) //Stupid macro used in power usage CAN_BE_REDEFINED(TRUE) @@ -200,11 +204,6 @@ Class Procs: return ..() -/obj/machinery/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(signaler && is_adjacent) - . += SPAN_WARNING("\The [src] has a hidden signaler attached to it.") - // /obj/machinery/proc/process_all() // /* Uncomment this if/when you need component processing // if(processing_flags & MACHINERY_PROCESS_COMPONENTS) @@ -391,7 +390,6 @@ Class Procs: change_power_consumption(new_idle_power) change_power_consumption(new_active_power, POWER_USE_ACTIVE) */ - GetPartUpgradeDesc() /obj/machinery/proc/assign_uid() uid = gl_uid @@ -507,35 +505,6 @@ Class Procs: to_chat(user, counting_english_list(component_parts)) else return FALSE -/obj/machinery/proc/GetPartUpgradeDesc() - var/temp_desc_upgrade = initial(desc_upgrade) - // This is ugly code but it does get rid of even uglier double-line breaks in game. - var/first_line = TRUE - if(component_hint_cap) - temp_desc_upgrade += "- [component_hint_cap]" - first_line = FALSE - if(component_hint_scan) - if(!first_line) - temp_desc_upgrade += "
" - temp_desc_upgrade += "- [component_hint_scan]" - first_line = FALSE - if(component_hint_servo) - if(!first_line) - temp_desc_upgrade += "
" - temp_desc_upgrade += "- [component_hint_servo]" - first_line = FALSE - if(component_hint_laser) - if(!first_line) - temp_desc_upgrade += "
" - temp_desc_upgrade += "- [component_hint_laser]" - first_line = FALSE - if(component_hint_bin) - if(!first_line) - temp_desc_upgrade += "
" - temp_desc_upgrade += "- [component_hint_bin]" - first_line = FALSE - desc_upgrade = temp_desc_upgrade - /obj/machinery/proc/dismantle() playsound(loc, /singleton/sound_category/crowbar_sound, 50, 1) var/obj/machinery/constructable_frame/machine_frame/M = new /obj/machinery/constructable_frame/machine_frame(loc) @@ -609,10 +578,6 @@ Class Procs: H.emote("scream") H.apply_damage(45, DAMAGE_PAIN) -/obj/machinery/proc/do_signaler() // override this to customize effects - return - - // A late init operation called in SSshuttle for ship computers and holopads, used to attach the thing to the right ship. /obj/machinery/proc/attempt_hook_up(var/obj/effect/overmap/visitable/sector) SHOULD_CALL_PARENT(TRUE) diff --git a/code/game/machinery/mech_recharger.dm b/code/game/machinery/mech_recharger.dm index c7ec8a98d7c..e71a32a23f9 100644 --- a/code/game/machinery/mech_recharger.dm +++ b/code/game/machinery/mech_recharger.dm @@ -22,9 +22,11 @@ /obj/item/stock_parts/manipulator = 2 ) - component_hint_cap = "Upgraded capacitors will increase charging rate." - component_hint_scan = "Upgraded scanning modules will increase both charging rate and repair speed." - component_hint_servo = "Upgraded manipulators will increase repair speed." +/obj/machinery/mech_recharger/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will increase charging rate." + . += "Upgraded scanning modules will increase both charging rate and repair speed." + . += "Upgraded manipulators will increase repair speed." /obj/machinery/mech_recharger/Initialize(mapload) . = ..() diff --git a/code/game/machinery/mecha_fabricator.dm b/code/game/machinery/mecha_fabricator.dm index 119cc9913b6..d108eba187d 100644 --- a/code/game/machinery/mecha_fabricator.dm +++ b/code/game/machinery/mecha_fabricator.dm @@ -44,9 +44,11 @@ ///The timer id for the build callback, if we're building something var/build_callback_timer - component_hint_bin = "Upgraded matter bins will increase material storage capacity." - component_hint_laser = "Upgraded micro-lasers will increase fabrication speed." - component_hint_servo = "Upgraded manipulators will improve material use efficiency." +/obj/machinery/mecha_part_fabricator/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will increase material storage capacity." + . += "Upgraded micro-lasers will increase fabrication speed." + . += "Upgraded manipulators will improve material use efficiency." /obj/machinery/mecha_part_fabricator/Initialize() . = ..() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index b4f693515ca..dce87018ba8 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -950,7 +950,6 @@ GLOBAL_LIST_INIT_TYPED(allCasters, /obj/machinery/newscaster, list()) /obj/item/newspaper name = "newspaper" desc = "An issue of The Griffon, the newspaper circulating aboard most stations." - desc_info = "You can alt-click this to roll it up." icon = 'icons/obj/bureaucracy.dmi' icon_state = "newspaper" item_state = "newspaper" @@ -967,6 +966,10 @@ GLOBAL_LIST_INIT_TYPED(allCasters, /obj/machinery/newscaster, list()) var/scribble_page = null var/rolled = FALSE // Whether the newspaper is rolled or not, making it a deadly weapon. +/obj/item/newspaper/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can use this on yourself with the Grab intent to roll it up or to unroll it." + /obj/item/newspaper/attack_self(mob/user as mob) if(user.a_intent == I_GRAB) if(!rolled) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 0a6a5d142f5..ce426d10b38 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -14,8 +14,8 @@ level = 2 obj_flags = OBJ_FLAG_ROTATABLE -/obj/item/pipe/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/pipe/feedback_hints(mob/user, distance, is_adjacent) + . += ..() var/pipe_color_check = color || PIPE_COLOR_GREY var/found_color_name = "Unknown" for(var/color_name in GLOB.pipe_colors) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 2e6feb06623..2b5a4a42ce0 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -1,8 +1,6 @@ /obj/machinery/pipedispenser name = "pipe dispenser" desc = "A large piece of machinery used to dispense pipes that transport and manipulate gasses." - desc_info = "This can be moved by using a wrench. You will need to wrench it again when you want to use it. You can put \ - excess (atmospheric) pipes into the dispenser, as well. It needs electricity to function." icon = 'icons/obj/pipe_dispenser.dmi' icon_state = "pipe_dispenser" density = TRUE @@ -11,6 +9,12 @@ var/window_id = "pipedispenser" var/pipe_cooldown = 0 +/obj/machinery/pipedispenser/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It must be anchored to be used, or can be unanchored to be moved." + . += "You can put excess (atmospheric) pipes into the dispenser." + . += "It will not work in unpowered areas." + /obj/machinery/pipedispenser/attack_hand(mob/user) if(..()) return @@ -146,11 +150,15 @@ /obj/machinery/pipedispenser/disposal name = "disposal pipe dispenser" desc = "A large piece of machinery used to dispense pipes that transport and manipulate objects." - desc_info = "This can be moved by using a wrench. You will need to wrench it again when you want to use it. You can put \ - excess disposal pipes into the dispenser by dragging them onto it. It needs electricity to function." icon_state = "disposal_dispenser" window_id = "disposaldispenser" +/obj/machinery/pipedispenser/disposal/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It must be anchored to be used, or can be unanchored to be moved." + . += "You can put excess (disposal) pipes into the dispenser." + . += "It will not work in unpowered areas." + //Allow you to drag-drop disposal pipes into it /obj/machinery/pipedispenser/disposal/mouse_drop_receive(atom/dropped, mob/user, params) var/obj/structure/disposalconstruct/pipe = dropped diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 0db0ea759fe..b7c3718099d 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -79,20 +79,22 @@ var/old_angle = 0 -/obj/machinery/porta_turret/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/msg = "" +/obj/machinery/porta_turret/condition_hints(mob/user, distance, is_adjacent) + . += ..() if(!health) - msg += SPAN_DANGER("\The [src] is destroyed!") + . += SPAN_DANGER("\The [src] is destroyed!") else if(health / maxhealth < 0.35) - msg += SPAN_DANGER("\The [src] is critically damaged!") + . += SPAN_DANGER("\The [src] is critically damaged!") else if(health / maxhealth < 0.6) - msg += SPAN_WARNING("\The [src] is badly damaged!") + . += SPAN_ALERT("\The [src] is badly damaged!") else if(health / maxhealth < 1) - msg += SPAN_NOTICE("\The [src] is slightly damaged!") + . += SPAN_NOTICE("\The [src] is slightly damaged.") else - msg += SPAN_GOOD("\The [src] is not damaged!") - . += msg + . += "\The [src] is in perfect condition." + +/obj/machinery/porta_turret/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It [anchored ? "is" : "could be"] anchored to the floor with some bolts." /obj/machinery/porta_turret/crescent enabled = FALSE diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index 096bd39d577..42aae1adc69 100644 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -32,8 +32,18 @@ var/portable = 1 var/list/chargebars -/obj/machinery/recharger/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/recharger/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This device can recharge power cells, various handheld computers, energy weapons and stun batons, flashlights, ecigarettes, handheld inductive chargers, and more." + +/obj/machinery/recharger/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It [anchored ? "is" : "could be"] anchored to the floor with some bolts." + +/obj/machinery/recharger/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/charging_power_kw = round(active_power_usage / 1000, 0.1) + . += "Uses a dedicated power supply to deliver [charging_power_kw] kW when in use." . += "There is [charging ? "\a [charging]" : "nothing"] in [src]." if (charging && distance <= 3) var/obj/item/cell/C = charging.get_cell() @@ -187,3 +197,7 @@ icon_state_idle = "wrecharger_off" appearance_flags = TILE_BOUND // prevents people from viewing us through a wall portable = FALSE + +/obj/machinery/recharger/wallcharger/mechanics_hints(mob/user, distance, is_adjacent) + . = list() + . += "This device can recharge energy weapons, stun batons, and flashlights." diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 2587f1b4df4..584e138c548 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -45,8 +45,24 @@ /obj/item/stack/cable_coil{amount = 5} ) - component_hint_cap = "Upgraded capacitors will increase charging rate (for shipbounds only, not IPCs)." - component_hint_servo = "Upgraded manipulators will make the recharging station also start to repair brute damage, then also burn damage, at increasing speed (for shipbounds only, not IPCs)." +/obj/machinery/recharge_station/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will increase charging rate (for shipbounds only, not IPCs)." + . += "Upgraded manipulators will make the recharging station also start to repair brute damage, then also burn damage, at increasing speed (for shipbounds only, not IPCs)." + +/obj/machinery/recharge_station/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/charging_power_kw = round(charging_power / 1000, 0.1) + . += "Uses a dedicated power supply to deliver [charging_power_kw] kW when in use." + . += "The charge meter reads: [round(chargepercentage())]%." + if(weld_rate) + . += "It is capable of repairing shipbounds' structural damage." + else + . += SPAN_ALERT("It has not been upgraded to repair shipbounds' structural damage.") + if(wire_rate) + . += "It is capable of repairing shipbounds' burn damage." + else + . += SPAN_ALERT("It has not been upgraded to repair shipbounds' burn damage.") /obj/machinery/recharge_station/Initialize() . = ..() @@ -135,16 +151,6 @@ D.upgrade_cooldown = world.time + 1 MINUTE D.master_matrix.apply_upgrades(D) -/obj/machinery/recharge_station/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - desc = initial(desc) - desc += "
Uses a dedicated internal power cell to deliver [charging_power]W when in use." - desc += "
The charge meter reads: [round(chargepercentage())]%." - if(weld_rate) - desc += "
It is capable of repairing shipbounds' structural damage." - if(wire_rate) - desc += "
It is capable of repairing shipbounds' burn damage." - . = ..() - /obj/machinery/recharge_station/proc/chargepercentage() if(!cell) return 0 diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 8b42e9cb269..b2eea3bddeb 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -17,6 +17,14 @@ var/datum/gas_mixture/env var/obj/item/cell/apc/cell +/obj/machinery/space_heater/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The unit is [on ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"]." + if(panel_open) + . += "The power cell is [cell ? "installed" : "missing"]." + else + . += "The charge meter reads [cell ? round(cell.percent(),1) : 0]%." + /obj/machinery/space_heater/Initialize() . = ..() cell = new(src) @@ -39,15 +47,6 @@ if(panel_open) AddOverlays("sheater-open") -/obj/machinery/space_heater/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "The unit is [on ? "on" : "off"] and the hatch is [panel_open ? "open" : "closed"]." - if(panel_open) - . += "The power cell is [cell ? "installed" : "missing"]." - else - . += "The charge meter reads [cell ? round(cell.percent(),1) : 0]%" - return - /obj/machinery/space_heater/powered() if(cell && cell.charge) return TRUE diff --git a/code/game/machinery/stargazer.dm b/code/game/machinery/stargazer.dm index fdbedf43727..7324b168cda 100644 --- a/code/game/machinery/stargazer.dm +++ b/code/game/machinery/stargazer.dm @@ -8,6 +8,11 @@ pixel_y = -24 var/image/star_system_image +/obj/machinery/stargazer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!(stat & BROKEN) && !(stat & NOPOWER)) + . += SPAN_NOTICE("\The [src] shows the current sector to be
[SSatlas.current_sector.name].") + /obj/machinery/stargazer/Initialize(mapload, d, populate_components) . = ..() star_system_image = image(icon, null, "stargazer_[SSatlas.current_sector.name]") @@ -15,11 +20,6 @@ star_system_image.layer = SUPERMATTER_WALL_LAYER power_change() -/obj/machinery/stargazer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!(stat & BROKEN) && !(stat & NOPOWER)) - . += SPAN_NOTICE("\The [src] shows the current sector to be [SSatlas.current_sector.name].") - /obj/machinery/stargazer/power_change() ..() if(stat & BROKEN) diff --git a/code/game/machinery/stasis_bed.dm b/code/game/machinery/stasis_bed.dm index 9b663211c18..7501c107a94 100644 --- a/code/game/machinery/stasis_bed.dm +++ b/code/game/machinery/stasis_bed.dm @@ -1,7 +1,6 @@ /obj/machinery/stasis_bed name = "lifeform stasis unit" desc = "A not so comfortable looking bed with some nozzles at the top and bottom. It will keep someone in stasis." - desc_info = "You can alt-click this to toggle it on or off." icon = 'icons/obj/machinery/sleeper.dmi' icon_state = "stasis" anchored = TRUE @@ -27,6 +26,10 @@ /obj/item/stock_parts/console_screen ) +/obj/machinery/stasis_bed/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can alt-click this to toggle it on or off." + /obj/machinery/stasis_bed/Initialize(mapload, d, populate_components) . = ..() update_icon() diff --git a/code/game/machinery/stasis_cage.dm b/code/game/machinery/stasis_cage.dm index 681a8b90b25..03be25b4396 100644 --- a/code/game/machinery/stasis_cage.dm +++ b/code/game/machinery/stasis_cage.dm @@ -10,36 +10,38 @@ active_power_usage = 5000 use_power = POWER_USE_IDLE - /** - * The wires of the cage - */ + /// The wires of the cage var/datum/wires/stasis_cage/wires - /** - * The mob in the cage - */ + + /// The mob in the cage var/mob/living/contained - /** - * Internal atmosphere of the cage - */ + + /// Internal atmosphere of the cage var/datum/gas_mixture/airtank - /** - * If the cage works - */ + + /// If the cage works var/broken = FALSE - /** - * If the cage will prevent human mobs from being stored - */ + + /// If the cage will prevent human mobs from being stored var/safety = TRUE - /** - * The cell used to power this - */ + /// The cell used to power this var/obj/item/cell/cell = null - component_hint_cap = "Upgraded capacitors will reduce power usage." - parts_power_mgmt = FALSE +/obj/machinery/stasis_cage/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will reduce power usage." + +/obj/machinery/stasis_cage/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (contained) + . += SPAN_NOTICE("\The [contained] is kept inside.") + if (broken) + . += SPAN_WARNING("\The [src]'s lid is broken. It probably can not be used.") + if (cell) + . += SPAN_NOTICE("\The [src]'s power gauge shows [cell.percent()]% remaining.") /obj/machinery/stasis_cage/Initialize() . = ..() @@ -97,7 +99,6 @@ user.visible_message(SPAN_NOTICE("[user] releases \the [contained] from \the [src]!")) release() - /obj/machinery/stasis_cage/proc/release() if (contained) contained.dropInto(src) @@ -106,7 +107,6 @@ update_icon() update_use_power(POWER_USE_IDLE) - /obj/machinery/stasis_cage/proc/contain(mob/user, mob/thing) if(contained || broken) return @@ -117,7 +117,6 @@ set_contained(thing) update_use_power(POWER_USE_ACTIVE) - /obj/machinery/stasis_cage/proc/set_contained(mob/contained) src.contained = contained if(contained) @@ -131,7 +130,6 @@ else wires.interact(user) - /obj/machinery/stasis_cage/attack_robot(mob/user) if (Adjacent(user)) if(!panel_open) @@ -139,18 +137,6 @@ else wires.interact(user) - - -/obj/machinery/stasis_cage/examine(mob/user, distance, is_adjacent, infix, suffix, show_extended) - . = ..() - if (contained) - to_chat(user, SPAN_NOTICE("\The [contained] is kept inside.")) - if (broken) - to_chat(user, SPAN_WARNING("\The [src]'s lid is broken. It probably can not be used.")) - if (cell) - to_chat(user, SPAN_NOTICE("\The [src]'s power gauge shows [cell.percent()]% remaining.")) - - /obj/machinery/stasis_cage/attackby(obj/item/attacking_item, mob/user) . = ..() // Crowbar - Pry thing out of cage @@ -193,7 +179,6 @@ panel_open = !panel_open to_chat(user, SPAN_NOTICE("You [panel_open ? "unscrew" : "screw shut"] the maintainance panel of \the [src]")) - /obj/machinery/stasis_cage/return_air() //Used to make stasis cage protect from vacuum. if (!use_power) return @@ -201,7 +186,6 @@ return airtank ..() - /obj/machinery/stasis_cage/RefreshParts() ..() var/charge_multiplier diff --git a/code/game/machinery/telecomms/machines/allinone.dm b/code/game/machinery/telecomms/machines/allinone.dm index e443a7bc510..b7f7a9400b7 100644 --- a/code/game/machinery/telecomms/machines/allinone.dm +++ b/code/game/machinery/telecomms/machines/allinone.dm @@ -79,12 +79,15 @@ /obj/machinery/telecomms/allinone/ship/station_relay name = "external signal receiver" desc = "This device allows nearby third-party ships to maintain radio contact with their crew that are aboard the %STATIONNAME." - desc_info = "This device does not need to be linked to other telecommunications equipment; it will receive and broadcast on its own. It only needs to be powered." idle_power_usage = 25 active_power_usage = 200 freq_listening = list(HAIL_FREQ) away_aio = FALSE +/obj/machinery/telecomms/allinone/ship/station_relay/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This device does not need to be linked to other telecommunications equipment; it will receive and broadcast on its own. It only needs to be powered." + /obj/machinery/telecomms/allinone/ship/station_relay/LateInitialize() . = ..() desc = replacetext(desc, "%STATIONNAME", SSatlas.current_map.station_name) diff --git a/code/game/machinery/telecomms/machines/processor.dm b/code/game/machinery/telecomms/machines/processor.dm index 6e293296d05..c3d5630a84a 100644 --- a/code/game/machinery/telecomms/machines/processor.dm +++ b/code/game/machinery/telecomms/machines/processor.dm @@ -13,12 +13,15 @@ name = "processor unit" icon_state = "processor" desc = "This machine is used to process large quantities of information." - desc_antag = "Attacking this machine will cause communications over its linked frequency(s) to become increasingly garbled." telecomms_type = /obj/machinery/telecomms/processor delay = 5 circuitboard = "/obj/item/circuitboard/telecomms/processor" var/process_mode = UNCOMPRESS +/obj/machinery/telecomms/processor/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Attacking/damaging this machine will cause communications over its linked frequency(s) to become increasingly garbled." + /obj/machinery/telecomms/processor/receive_information(datum/signal/subspace/signal, obj/machinery/telecomms/machine_from) if(!is_freq_listening(signal)) return diff --git a/code/game/machinery/telecomms/telecommunications.dm b/code/game/machinery/telecomms/telecommunications.dm index cca8def0654..fc9cf340606 100644 --- a/code/game/machinery/telecomms/telecommunications.dm +++ b/code/game/machinery/telecomms/telecommunications.dm @@ -16,44 +16,73 @@ Inbound Signal -> Receiver -> Hub -> Bus -> Processor -> Bus -> Server -> Hub -> Broadcaster */ - /obj/machinery/telecomms icon = 'icons/obj/machinery/telecomms.dmi' - desc_info = "All telecomms machinery can repaired through the application of Nanopaste." density = TRUE anchored = TRUE idle_power_usage = 600 // WATTS active_power_usage = 2 KILO WATTS - var/list/links = list() // list of machines this machine is linked to + /// List of machines this machine is linked to + var/list/links = list() /* Associative lazylist of the telecomms_type of linked telecomms machines and a list of said machines eg list(telecomms_type1 = list(everything linked to us with that type), telecomms_type2 = list(everything linked to us with THAT type, etc.)) */ var/list/links_by_telecomms_type - var/traffic = 0 // value increases as traffic increases - var/netspeed = 5 // how much traffic to lose per tick (50 gigabytes/second * netspeed) - var/list/autolinkers = list() // list of text/number values to link with - var/id = "NULL" // identification string - var/telecomms_type = null // Relevant typepath of the machine (important to use machine's base path rather than server/preset or w.e) - var/network = "NULL" // the network of the machinery + /// Value increases as traffic increases + var/traffic = 0 + /// How much traffic to lose per tick (50 gigabytes/second * netspeed) + var/netspeed = 5 + /// List of text/number values to link with + var/list/autolinkers = list() + /// Identification string + var/id = "NULL" + /// Relevant typepath of the machine (important to use machine's base path rather than server/preset or w.e) + var/telecomms_type = null + /// The network ID of the machinery + var/network = "NULL" - var/list/freq_listening = list() // list of frequencies to tune into: if none, will listen to all - - var/integrity = 100 // basically HP, loses integrity by heat - var/produces_heat = TRUE //whether the machine will produce heat when on. - var/delay = 10 // how many process() ticks to delay per heat - var/circuitboard = null // string pointing to a circuitboard type - var/hide = FALSE // Is it a hidden machine? + /// List of frequencies to tune into: if none, will listen to all + var/list/freq_listening = list() + /// Basically HP, loses integrity by heat + var/integrity = 100 + /// Whether the machine will produce heat when on. + var/produces_heat = TRUE + /// How many process() ticks to delay per heat + var/delay = 10 + /// String pointing to a circuitboard type + var/circuitboard = null + /// Is it a hidden machine? + var/hide = FALSE var/hitsound = 'sound/weapons/smash.ogg' - // Overmap ranges in terms of map tile distance, used by receivers, relays, and broadcasters (and AIOs) + /// Overmap ranges in terms of map tile distance, used by receivers, relays, and broadcasters (and AIOs) var/overmap_range = 0 ///Looping sounds for any servers // var/datum/looping_sound/server/soundloop +/obj/machinery/telecomms/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if(integrity < initial(integrity)) + var/state + var/current_damage = integrity / initial(integrity) + switch(current_damage) + if(0 to 0.2) + state = SPAN_DANGER("The machine is on its last legs!") + if(0.2 to 0.4) + state = SPAN_WARNING("The machine looks seriously damaged.") + if(0.4 to 0.8) + state = SPAN_WARNING("The machine's condition appears somewhat degraded.") + if(0.8 to 1) + state = SPAN_NOTICE("The machine shows some indications of minor damage.") + . += state + +/obj/machinery/telecomms/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "All telecomms machinery can repaired through the application of Nanopaste." /obj/machinery/telecomms/Initialize(mapload) . = ..() @@ -84,7 +113,7 @@ links = list() return ..() -// This proc returns distance, so -1 is our error value +/// This proc returns distance, so -1 is our error value /obj/machinery/telecomms/proc/receive_range(datum/signal/subspace/sig) if(!use_power || !istype(sig) || !is_freq_listening(sig)) return -1 @@ -100,7 +129,7 @@ for(var/obj/effect/overmap/visitable/V in range(overmap_range, linked)) . |= V.map_z -// Used in auto linking +/// Used in auto linking /obj/machinery/telecomms/proc/add_automatic_link(var/obj/machinery/telecomms/T) if(src == T) return @@ -161,15 +190,20 @@ // Checks heat from the environment and applies any integrity damage if(!loc) return var/datum/gas_mixture/environment = loc.return_air() - var/damage_chance = 0 // Percent based chance of applying 1 integrity damage this tick + // Percent based chance of applying 1 integrity damage this tick + var/damage_chance = 0 switch(environment.temperature) - if((T0C + 40) to (T0C + 70)) // 40C-70C, minor overheat, 10% chance of taking damage + // 40C-70C, minor overheat, 10% chance of taking damage + if((T0C + 40) to (T0C + 70)) damage_chance = 10 - if((T0C + 70) to (T0C + 130)) // 70C-130C, major overheat, 25% chance of taking damage + // 70C-130C, major overheat, 25% chance of taking damage + if((T0C + 70) to (T0C + 130)) damage_chance = 25 - if((T0C + 130) to (T0C + 200)) // 130C-200C, dangerous overheat, 50% chance of taking damage + // 130C-200C, dangerous overheat, 50% chance of taking damage + if((T0C + 130) to (T0C + 200)) damage_chance = 50 - if((T0C + 200) to INFINITY) // More than 200C, INFERNO. Takes damage every tick. + // More than 200C, INFERNO. Takes damage every tick. + if((T0C + 200) to INFINITY) damage_chance = 100 if (damage_chance && prob(damage_chance)) integrity = between(0, integrity - 1, 100) @@ -195,14 +229,16 @@ if(!removed) return - var/heat_produced = get_power_usage() //obviously can't produce more heat than the machine draws from it's power source + // Obviously can't produce more heat than the machine draws from its power source + var/heat_produced = get_power_usage() if (use_power < POWER_USE_ACTIVE) - heat_produced *= 0.30 //if idle, produce less heat. + // If idle, produce less heat. + heat_produced *= 0.30 removed.add_thermal_energy(heat_produced) env.merge(removed) -// relay signal to all linked machinery that are of type [filter]. If signal has been sent [amount] times, stop sending +/// Relay signal to all linked machinery that are of type [filter]. If signal has been sent [amount] times, stop sending /obj/machinery/telecomms/proc/relay_information(datum/signal/subspace/signal, filter, copysig, amount = 20) if(!use_power) return @@ -238,12 +274,12 @@ return send_count -// send signal directly to a machine +/// Send signal directly to a machine /obj/machinery/telecomms/proc/relay_direct_information(datum/signal/signal, obj/machinery/telecomms/machine) if(use_power) machine.receive_information(signal, src) -// receive information from linked machinery +/// Receive information from linked machinery /obj/machinery/telecomms/proc/receive_information(datum/signal/signal, obj/machinery/telecomms/machine_from) return @@ -251,8 +287,10 @@ // return TRUE if found, FALSE if not found return signal && (!freq_listening.len || (signal.frequency in freq_listening)) -// Reception range of telecomms machines is limited via overmap_range -// Returns distance, not a boolean value, so don't do !get_reception or so help me god +/* + * Reception range of telecomms machines is limited via overmap_range + * Returns distance, not a boolean value, so don't do !get_reception or so help me god + */ /obj/machinery/telecomms/proc/get_signal_dist(datum/signal/subspace/signal) if(!SSatlas.current_map.use_overmap || !istype(linked) || !istype(signal.sector)) if(z == signal.origin_level || (signal.origin_level in GetConnectedZlevels(z))) @@ -268,18 +306,3 @@ return -1 return overmap_dist -/obj/machinery/telecomms/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(integrity < initial(integrity)) - var/state - var/current_damage = integrity / initial(integrity) - switch(current_damage) - if(0 to 0.2) - state = SPAN_DANGER("The machine is on its last legs!") - if(0.2 to 0.4) - state = SPAN_WARNING("The machine looks seriously damaged.") - if(0.4 to 0.8) - state = SPAN_WARNING("The machine's condition appears somewhat degraded.") - if(0.8 to 1) - state = SPAN_NOTICE("The machine shows some indications of minor damage.") - . += state diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index f2681d46089..88bf2273a6d 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -171,6 +171,11 @@ light_range = 2 light_power = 0.9 +/obj/machinery/vending/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "A vending machine infected with a launcher virus can be fixed by using a debugger on it. This takes longer than using a wiring panel." + . += "All vending machines can be hacked to obtain some contraband items from them, and some can be fed with coins to gain access to premium items." + /obj/machinery/vending/Initialize(mapload) . = ..() wires = new(src) diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm index b7ac4ca0fb3..74d0a4c41cd 100644 --- a/code/game/machinery/wall_frames.dm +++ b/code/game/machinery/wall_frames.dm @@ -8,6 +8,11 @@ var/refund_amt = 2 var/refund_type = /obj/item/stack/material/steel +/obj/item/frame/assembly_hints() + . = list() + . += ..() + . += "It could be installed by using it on an adjacent wall." + /obj/item/frame/attackby(obj/item/attacking_item, mob/user) if (attacking_item.iswrench()) new refund_type( get_turf(src.loc), refund_amt) diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index a053c6ae7fa..a82eb2547bc 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -26,6 +26,16 @@ var/gibs_ready = 0 var/obj/crayon +/obj/machinery/washing_machine/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click a washing machine to open and close the door." + . += "ALT-click a washing machine to start and stop it." + . += "Washing machines can be used as part of the leather tanning process by putting scraped bare hides in them." + +/obj/machinery/washing_machine/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "If you put Ian inside this machine and run it, terrible things will happen." + /obj/machinery/washing_machine/verb/start() set name = "Start Washing" set category = "Object" diff --git a/code/game/objects/effects/plastic_explosive.dm b/code/game/objects/effects/plastic_explosive.dm index ecc4dc74ba2..c798fefe869 100644 --- a/code/game/objects/effects/plastic_explosive.dm +++ b/code/game/objects/effects/plastic_explosive.dm @@ -8,6 +8,11 @@ density = FALSE var/obj/item/plastique/parent +/obj/effect/plastic_explosive/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + . += SPAN_WARNING("It is set to blow in [round((parent.detonate_time - world.time) / 10)] seconds.") + /obj/effect/plastic_explosive/Initialize(var/atom/owner_pos, var/atom/target, var/obj/item/plastique/c4) . = ..() parent = c4 @@ -37,11 +42,6 @@ pixel_x = pixel_shifts[1] pixel_y = pixel_shifts[2] -/obj/effect/plastic_explosive/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - . += SPAN_WARNING("It is set to blow in [round((parent.detonate_time - world.time) / 10)] seconds.") - /obj/effect/plastic_explosive/attack_hand(mob/living/user) to_chat(user, SPAN_WARNING("\The [src] is solidly attached, it doesn't budge!")) diff --git a/code/game/objects/effects/portals.dm b/code/game/objects/effects/portals.dm index 91d5ba8f0f8..7979f03f681 100644 --- a/code/game/objects/effects/portals.dm +++ b/code/game/objects/effects/portals.dm @@ -155,8 +155,7 @@ /obj/effect/portal/spawner name = "portal" - desc = "A bluespace tear in space, reaching directly to another point within this region. This one looks like a one-way portal to here, don't come too close." - desc_info = "This portal is a spawner portal. You cannot enter it to teleport, but it will periodically spawn things." + desc = "A bluespace tear in space, reaching directly to another point within this region. This one looks like a one-way portal to here; don't get too close." does_teleport = FALSE has_lifespan = FALSE layer = OBJ_LAYER - 0.01 @@ -164,6 +163,10 @@ var/num_of_spawns // How many times we want to spawn them before qdel var/next_spawn +/obj/effect/portal/spawner/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This portal is a spawner portal. You cannot enter it to teleport, but it will periodically spawn things." + /obj/effect/portal/spawner/Initialize() . = ..() START_PROCESSING(SSprocessing, src) @@ -273,7 +276,6 @@ /obj/effect/portal/revenant name = "bluespace rift" desc = "A bluespace tear in space, reaching directly to another point within this region. This one looks like a one-way portal to here, don't come too close." - desc_info = "This is a bluespace rift. It is a node wherein revenants can seep into this locale. To destroy it, you must bring a bluespace neutralizer near it." icon_state = "portal_g" does_teleport = FALSE @@ -287,6 +289,10 @@ var/last_color_level = 5 var/health_timer = 10 MINUTES // you need to reduce the health by standing near it with a neutralizer +/obj/effect/portal/revenant/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a bluespace rift. It is a node wherein revenants can seep into this locale. To destroy it, you must bring a bluespace neutralizer near it." + /obj/effect/portal/revenant/Initialize(mapload) . = ..() if(GLOB.revenants.revenant_rift) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index be4ff61f795..d8fb3fa2ad7 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -4,7 +4,7 @@ w_class = WEIGHT_CLASS_NORMAL blocks_emissive = EMISSIVE_BLOCK_GENERIC - ///This saves our blood splatter overlay, which will be processed not to go over the edges of the sprite + /// This saves our blood splatter overlay, which will be processed not to go over the edges of the sprite var/image/blood_overlay var/randpixel = 6 @@ -14,17 +14,17 @@ var/burn_point var/burning - //Generic hit sound + /// Generic hit sound var/hitsound = /singleton/sound_category/swing_hit_sound var/storage_cost var/storage_slot_sort_by_name = FALSE - ///Dimensions of the icon file used when this item is worn, eg: hats.dmi (32x32 sprite, 64x64 sprite, etc.). Allows inhands/worn sprites to be of any size, but still centered on a mob properly + /// Dimensions of the icon file used when this item is worn, eg: hats.dmi (32x32 sprite, 64x64 sprite, etc.). Allows inhands/worn sprites to be of any size, but still centered on a mob properly var/worn_x_dimension = 32 - ///Dimensions of the icon file used when this item is worn, eg: hats.dmi (32x32 sprite, 64x64 sprite, etc.). Allows inhands/worn sprites to be of any size, but still centered on a mob properly + /// Dimensions of the icon file used when this item is worn, eg: hats.dmi (32x32 sprite, 64x64 sprite, etc.). Allows inhands/worn sprites to be of any size, but still centered on a mob properly var/worn_y_dimension = 32 /** @@ -102,93 +102,78 @@ */ var/flags_inv = 0 - ///See `code\__DEFINES\items_clothing.dm` for appropriate bit flags + ///What body parts are covered by the clothing when you wear it. See `code\__DEFINES\items_clothing.dm` for appropriate bit flags var/body_parts_covered = 0 - ///Miscellaneous flags pertaining to equippable objects. + /// Miscellaneous flags pertaining to equippable objects. See `code\__DEFINES\flags.dm` for appropriate bit flags var/item_flags = 0 //var/heat_transfer_coefficient = 1 //0 prevents all transfers, 1 is invisible - ///For leaking gas from turf to mask and vice-versa + /// For leaking gas from turf to mask and vice-versa var/gas_transfer_coefficient = 1 - - ///For chemicals/diseases + /// For chemicals/diseases var/permeability_coefficient = 1 - - ///For electrical admittance/conductance (eg. electrocution checks) + /// For electrical admittance/conductance (eg. electrocution checks) var/siemens_coefficient = 1 - - ///How much clothing is slowing you down. Negative values speeds you up + /// How much clothing is slowing you down. Negative values speeds you up var/slowdown = 0 - - ///Updated on accessory add/remove. This is how much the current accessories slow you down. + /// Updated on accessory add/remove. This is how much the current accessories slow you down. var/slowdown_accessory = 0 - ///Boolean, mostly for Ninja code at this point but basically will not allow the item to be removed if set to `FALSE` - + /// Boolean, mostly for Ninja code at this point but basically will not allow the item to be removed if set to `FALSE` var/canremove = TRUE - ///If `FALSE`, this item/weapon cannot become embedded in people when you hit them with it + /// If `FALSE`, this item/weapon cannot become embedded in people when you hit them with it var/can_embed = TRUE - var/list/allowed = null //suit storage stuff. + /// Suit storage stuff. + var/list/allowed = null - ///All items can have an uplink hidden inside, just remember to add the triggers. + /// All items can have an uplink hidden inside, just remember to add the triggers. var/obj/item/device/uplink/hidden/hidden_uplink - ///Name used for message when binoculars/scope is used + /// Name used for message when binoculars/scope is used var/zoomdevicename - - ///Boolean, `TRUE` if item is actively being used to zoom. For scoped guns and binoculars. + /// Boolean, `TRUE` if item is actively being used to zoom. For scoped guns and binoculars. var/zoom = FALSE - ///Boolean, if item_state, lefthand, righthand, and worn sprite are all in one dmi + /// Boolean, if item_state, lefthand, righthand, and worn sprite are all in one dmi var/contained_sprite = FALSE - ///Used when thrown into a mob + /// Used when thrown into a mob var/mob_throw_hit_sound - - ///Sound used when equipping the item into a valid slot + /// Sound used when equipping the item into a valid slot var/equip_sound = null - - ///Sound uses when picking the item up (into your hands) + /// Sound uses when picking the item up (into your hands) var/pickup_sound = /singleton/sound_category/generic_pickup_sound - - ///Sound uses when dropping the item, or when its thrown. + /// Sound uses when dropping the item, or when its thrown. var/drop_sound = /singleton/sound_category/generic_drop_sound var/list/armor - var/armor_degradation_speed //How fast armor will degrade, multiplier to blocked damage to get armor damage value. + /// How fast armor will degrade, multiplier to blocked damage to get armor damage value. + var/armor_degradation_speed //Item_state definition moved to /obj //var/item_state = null // Used to specify the item state for the on-mob overlays. - ///Overrides the default item_state for particular slots. + /// Overrides the default item_state for particular slots. var/item_state_slots - - ///used in furniture for previews. used in material weapons too + /// Used in furniture for previews. Used in material weapons too var/base_icon - - ///Boolean, when it uses coloration and a part of it wants to remain uncolored. e.g., handle of the screwdriver is colored while the head is not. + /// Boolean, when it uses coloration and a part of it wants to remain uncolored. e.g., handle of the screwdriver is colored while the head is not. var/build_from_parts = FALSE - - ///Inhands overlay + /// Inhands overlay var/worn_overlay = null - - ///When you want your worn overlay to have colors. So you can have more than one modular coloring. + /// When you want your worn overlay to have colors. So you can have more than one modular coloring. var/worn_overlay_color = null - - ///When you want to slice out a chunk from a sprite + /// When you want to slice out a chunk from a sprite var/alpha_mask - /// Boolean, determines whether accent colour is applied or not var/has_accents = FALSE - /// appearance_flags Bitflag, when has_accents is set to true, this will determine which flags will be applied to the accent image var/accent_flags = RESET_COLOR - - /// used for accents which are coloured differently to the main body of the sprite + /// Used for accents which are coloured differently to the main body of the sprite var/accent_color = COLOR_GRAY /** @@ -222,7 +207,7 @@ */ var/list/sprite_sheets_obj - ///Used to override hardcoded clothing dmis in human clothing pr + /// Used to override hardcoded clothing dmis in human clothing pr var/icon_override var/charge_failure_message = " cannot be recharged." @@ -230,16 +215,16 @@ var/cleaving = FALSE - ///Length of tiles it can reach, 1 is adjacent. + /// Length of tiles it can reach, 1 is adjacent. var/reach = 1 - ///Used to determine whether something can pick a lock, and how well + /// Used to determine whether something can pick a lock, and how well var/lock_picking_level = 0 - ///Used to determine what this item can be changed into with a modkit + /// Used to determine what this item can be changed into with a modkit var/list/convert_options - //Tooltip vars + /// Tooltip vars var/in_inventory = FALSE //is this item equipped into an inventory slot or hand of a mob? var/tip_timer = 0 diff --git a/code/game/objects/items/airbubble.dm b/code/game/objects/items/airbubble.dm index bf1c7060c22..30faaabf0b3 100644 --- a/code/game/objects/items/airbubble.dm +++ b/code/game/objects/items/airbubble.dm @@ -63,7 +63,6 @@ var/zipped = FALSE density = 0 storage_capacity = 20 - var/contains_body = FALSE var/used = TRUE // If we have deployed it once var/ripped = FALSE // If it has a hole it in, vent all the air outside var/breakout_time = 1 // How many minutes it takes to break out of it. @@ -82,14 +81,14 @@ slowdown = 0 // Examine to see tank pressure -/obj/structure/closet/airbubble/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/closet/airbubble/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(!isnull(internal_tank)) - . += SPAN_NOTICE("\The [src] has [internal_tank] attached, that displays [round(internal_tank.air_contents.return_pressure() ? internal_tank.air_contents.return_pressure() : 0)] KPa.") + . += SPAN_NOTICE("\The [src] has [internal_tank] attached, that displays [round(internal_tank.air_contents.return_pressure() ? internal_tank.air_contents.return_pressure() : 0)] kPa.") else . += SPAN_NOTICE("\The [src] has no tank attached.") if (cell) - . += "\The [src] has [cell] attached, the charge meter reads [round(cell.percent())]%." + . += "\The [src] has [cell] attached, the charge meter reads [round(cell.percent())]%." else . += SPAN_WARNING("[src] has no power cell installed.") diff --git a/code/game/objects/items/blueprints.dm b/code/game/objects/items/blueprints.dm index 04c49ec7518..110308b4a6e 100644 --- a/code/game/objects/items/blueprints.dm +++ b/code/game/objects/items/blueprints.dm @@ -106,12 +106,16 @@ return TRUE /obj/item/blueprints/shuttle - desc_info = "These blueprints can be used to modify a shuttle. In order to be used, the shuttle must be located on its \"Open Space\" z-level. Newly-created areas will be automatically added to the shuttle. If all shuttle areas are removed, the shuttle will be destroyed!" ///Name of the blueprints' linked shuttle. Mapped-in versions should have this preset, or be mapped into the shuttle area itself. var/shuttle_name ///The actual overmap shuttle type, for setting on preset blueprints. var/obj/effect/overmap/visitable/ship/landable/shuttle_type +/obj/item/blueprints/shuttle/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "These blueprints can be used to modify a shuttle. In order to be used, the shuttle must be located on its \"Open Space\" z-level." + . += "Newly-created areas will be automatically added to the shuttle. If all shuttle areas are removed, the shuttle will be destroyed!" + /obj/item/blueprints/shuttle/set_valid_z_levels() if(SSatlas.current_map.use_overmap) var/area/A = get_area(src) diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm index 8adebede50e..5e4aa10f3bc 100644 --- a/code/game/objects/items/bodybag.dm +++ b/code/game/objects/items/bodybag.dm @@ -10,6 +10,23 @@ pickup_sound = 'sound/items/pickup/cloth.ogg' var/deploy_type = /obj/structure/closet/body_bag +/obj/structure/closet/body_bag/feedback_hints(mob/user, distance, is_adjacent) + . = list() + // Doesn't inherit standard closet hints. + . += "It [contains_body ? "contains" : "does not contain"] a body." + +/obj/structure/closet/body_bag/mechanics_hints(mob/user, distance, is_adjacent) + . = list() + // Doesn't inherit standard closet hints. + +/obj/structure/closet/body_bag/disassembly_hints(mob/user, distance, is_adjacent) + . = list() + // Doesn't inherit standard closet hints. + +/obj/structure/closet/body_bag/antagonist_hints(mob/user, distance, is_adjacent) + . = list() + // Doesn't inherit standard closet hints. + /obj/item/bodybag/attack_self(mob/user) deploy_bag(user, user.loc) @@ -57,22 +74,8 @@ density = FALSE storage_capacity = 30 var/item_path = /obj/item/bodybag - var/contains_body = FALSE can_be_buckled = TRUE -/obj/structure/closet/body_bag/content_info(mob/user, content_size) - if(!content_size && !contains_body) - to_chat(user, "\The [src] is empty.") - else if(storage_capacity > content_size*4) - to_chat(user, "\The [src] is barely filled.") - else if(storage_capacity > content_size*2) - to_chat(user, "\The [src] is less than half full.") - else if(storage_capacity > content_size) - to_chat(user, "\The [src] still has some free space.") - else - to_chat(user, "\The [src] is full.") - to_chat(user, "It [contains_body ? "contains" : "does not contain"] a body.") - /obj/structure/closet/body_bag/attackby(obj/item/attacking_item, mob/user) if (attacking_item.ispen()) var/t = tgui_input_text(user, "What would you like the label to be?", name) @@ -167,6 +170,14 @@ var/stasis_power = 20 var/degradation_time = 60 // 2 minutes: 60 ticks * 2 seconds per tick +/obj/structure/closet/body_bag/cryobag/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The stasis meter shows '[stasis_power]x'." + if(is_adjacent && length(contents)) //The bag's rather thick and opaque from a distance. + . += "You peer into \the [src]." + for(var/mob/living/L in contents) + L.examine(arglist(args)) + /obj/structure/closet/body_bag/cryobag/Initialize() . = ..() airtank = new() @@ -235,14 +246,6 @@ return airtank ..() -/obj/structure/closet/body_bag/cryobag/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "The stasis meter shows '[stasis_power]x'." - if(is_adjacent && length(contents)) //The bag's rather thick and opaque from a distance. - . += "You peer into \the [src]." - for(var/mob/living/L in contents) - L.examine(arglist(args)) - /obj/item/usedcryobag name = "used stasis bag" desc = "Pretty useless now." diff --git a/code/game/objects/items/camping.dm b/code/game/objects/items/camping.dm index bf91b88ea72..e41ccdc9f2f 100644 --- a/code/game/objects/items/camping.dm +++ b/code/game/objects/items/camping.dm @@ -128,7 +128,6 @@ /obj/item/tent name = "expedition tent" desc = "A rolled up tent, ready to be assembled to make a base camp, shelter, or just a cozy place to chat." - desc_info = "Drag this to yourself to begin assembly. This will take some time, in 4 stages. Others can start working on the other stages by dragging it to themselves as well." icon = 'icons/obj/item/camping.dmi' icon_state = "tent" item_state = "tent" @@ -141,6 +140,10 @@ var/datum/large_structure/tent/my_tent +/obj/item/tent/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Drag this to yourself to begin assembly. This will take some time, in 4 stages. Others can start working on the other stages by dragging it to themselves as well." + /obj/item/tent/Initialize() . = ..() w_class = min(ceil(width * length / 1.5), WEIGHT_CLASS_GIGANTIC) // 2x2 = WEIGHT_CLASS_NORMAL @@ -229,7 +232,6 @@ /obj/structure/component/tent_canvas name = "tent canvas" desc = "The fabric and poles which make up the wall of a tent. Not air-tight, but able to keep out the weather, and very cozy." - desc_info = "Drag this to yourself to begin disassembly. This will take some time, in 4 stages. Others can start working on the other stages by dragging it, or other sections, to themselves as well." icon = 'icons/obj/item/camping.dmi' icon_state = "canvas" item_state = "canvas" @@ -239,6 +241,10 @@ atmos_canpass = CANPASS_ALWAYS //Tents are not air tight layer = ABOVE_HUMAN_LAYER +/obj/structure/component/tent_canvas/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Drag this to yourself to begin disassembly. This will take some time, in 4 stages. Others can start working on the other stages by dragging it, or other sections, to themselves as well." + /obj/structure/component/tent_canvas/CanPass(atom/movable/mover, turf/target, height, air_group) . = ..() if(icon_state in list("canvas", "canvas_mid", "canvas_entrance_top", "canvas_entrace_bot")) @@ -303,13 +309,17 @@ /obj/item/sleeping_bag name = "sleeping bag" desc = "A rolled up sleeping bag, ready to be taken on a camping trip." - desc_extended = "This item can be attached to a backpack." icon = 'icons/obj/item/camping.dmi' icon_state = "sleepingbag" item_state = "sleepingbag" contained_sprite = TRUE w_class = WEIGHT_CLASS_BULKY +/obj/item/sleeping_bag/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click with this item in-hand on a turf or on yourself to unroll it." + . += "This item can be attached to a backpack." + /obj/item/sleeping_bag/Initialize(mapload, ...) . = ..() if(!color) @@ -329,14 +339,6 @@ if(istype(T)) unroll(T, user) -/obj/item/sleeping_bag/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) - . = ..() - if(use_check(usr) || !Adjacent(usr)) - return - var/turf/T = get_turf(src) - if(istype(T)) - unroll(T, usr) - /** * Creates sleeping bag structure on the target turf, deleting this item in the process */ @@ -362,6 +364,11 @@ can_dismantle = FALSE can_pad = FALSE +/obj/structure/bed/sleeping_bag/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This object can be buckled into like any standard bed." + . += "Clicking and dragging this object onto yourself will roll it back up (so long as no one is sleeping inside)." + /obj/structure/bed/sleeping_bag/update_icon() return @@ -401,6 +408,10 @@ contained_sprite = TRUE default_material = MATERIAL_ALUMINIUM +/obj/item/material/folding_table/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click on yourself with this item in-hand to deploy it." + /obj/item/material/folding_table/attack_self(mob/user) if(use_check(user) || !Adjacent(user)) return @@ -424,6 +435,10 @@ icon_state = "camping_table" table_mat = MATERIAL_ALUMINIUM +/obj/structure/table/rack/folding_table/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Clicking and dragging this object onto yourself will collapse it again." + /obj/structure/table/rack/folding_table/dismantle(obj/item/wrench/W, mob/user) return FALSE diff --git a/code/game/objects/items/contraband.dm b/code/game/objects/items/contraband.dm index 717cead5f09..79b79c35a7b 100644 --- a/code/game/objects/items/contraband.dm +++ b/code/game/objects/items/contraband.dm @@ -124,10 +124,10 @@ w_class = WEIGHT_CLASS_TINY volume = 50 -/obj/item/reagent_containers/powder/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/reagent_containers/powder/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(reagents) - . += SPAN_NOTICE("There's about [reagents.total_volume] unit\s here.") + . += SPAN_NOTICE("There's about [reagents.total_volume] unit\s here.") /obj/item/reagent_containers/powder/Initialize() . = ..() diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index f7cdfc8d0d8..ccdde2a0721 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -19,6 +19,13 @@ var/obj/item/shockpaddles/linked/paddles var/obj/item/cell/bcell +/obj/item/defibrillator/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(bcell) + . += "The charge meter is showing [bcell.percent()]% charge left." + else + . += "There is no cell inside." + /obj/item/defibrillator/Initialize() //starts without a cell for rnd . = ..() if(ispath(paddles)) @@ -62,13 +69,6 @@ overlays = new_overlays -/obj/item/defibrillator/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(bcell) - . += "The charge meter is showing [bcell.percent()]% charge left." - else - . += "There is no cell inside." - /obj/item/defibrillator/ui_action_click() toggle_paddles() diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 6f1726eeb33..922fa9f2566 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -9,8 +9,13 @@ var/flush = 0 var/mob/living/silicon/ai/carded_ai -/obj/item/aicard/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/aicard/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use an active intelliCard to open its management interface." + . += "An AI inside an intelliCard can be transferred to an inactive AI Core by clicking on it." + +/obj/item/aicard/feedback_hints(mob/user, distance, is_adjacent) + . += ..() var/message = "Status of [carded_ai] is: " if(!carded_ai) message = "There is no AI loaded to the card." diff --git a/code/game/objects/items/devices/augment_implanter.dm b/code/game/objects/items/devices/augment_implanter.dm index 79e28caddc6..fc0036f8891 100644 --- a/code/game/objects/items/devices/augment_implanter.dm +++ b/code/game/objects/items/devices/augment_implanter.dm @@ -9,18 +9,18 @@ var/obj/item/organ/augment_type var/new_augment +/obj/item/device/augment_implanter/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(augment_type) + . += SPAN_NOTICE("\The [augment_type] can be seen floating inside \the [src]'s biogel.") + else + . += SPAN_WARNING("It is spent.") + /obj/item/device/augment_implanter/Initialize() . = ..() if(!augment_type) augment_type = new new_augment(src) -/obj/item/device/augment_implanter/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(augment_type) - . += FONT_SMALL(SPAN_NOTICE("\The [augment_type] can be seen floating inside \the [src]'s biogel.")) - else - . += FONT_SMALL(SPAN_WARNING("It is spent.")) - /obj/item/device/augment_implanter/afterattack(mob/living/L, mob/user, proximity) if(!proximity) return diff --git a/code/game/objects/items/devices/auto_cpr.dm b/code/game/objects/items/devices/auto_cpr.dm index 7e1fa0c44c1..c3d85f8fe1e 100644 --- a/code/game/objects/items/devices/auto_cpr.dm +++ b/code/game/objects/items/devices/auto_cpr.dm @@ -4,11 +4,6 @@ name = "stabilizer harness" desc = "A specialized medical harness that gives regular compressions to the patient's ribcage for cases of urgent heart issues, and functions as an emergency \ artificial respirator for cases of urgent lung issues." - desc_info = "The Stabilizer Harness' CPR mode is capable of restarting the heart much like manual CPR with a chance for rib cracking ONLY IF the patient is flat lining,\ - while the EPP mode can keep the patient breathing during transport for as long as there's appropriate air in the installed tank. Both use power from the battery. \ -
Use this item in your hand to toggle the CPR or EPP modes on/off.
Use a Screwdriver on it to unscrew the panel to be able to remove/add other items. \ - The tank can be removed with a Wrench. The battery can be removed with a crowbar. Use the item in your hand the panel unscrewed to remove the breath mask." - icon = 'icons/obj/med_harness.dmi' icon_state = "med_harness" item_state = "med_harness" @@ -40,6 +35,47 @@ /obj/item/clothing/mask/breath/lyodsuit, /obj/item/clothing/mask/breath/infiltrator) +/obj/item/auto_cpr/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The Stabilizer Harness' CPR mode is capable of restarting the heart much like manual CPR with a chance for rib cracking ONLY IF the patient is flatlining. Uses battery power." + . += "The EPP mode can keep the patient breathing during transport for as long as there's appropriate air in the installed tank. Uses battery power." + . += "Use this item in your hand to toggle the CPR or EPP modes on/off." + +/obj/item/auto_cpr/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + if(panel_open) + . += "The panel for adding/removing items is open and could be closed with some screws." + +/obj/item/auto_cpr/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + if(!panel_open) + . += "The panel for adding/removing items is screwed shut." + else + if(battery) + . += "The battery could be pried out." + if(tank_type) + . += "The tank is secured with several bolts." + if(breath_mask) + . += "The breath mask could be removed by hand." + +/obj/item/auto_cpr/feedback_hints(mob/user, distance, is_adjacent) + if(distance > 2) + return + . += ..() + . += "\The [src]'s [EPP] is currently [epp_mode ? "on" : "off"], while the Auto CPR is [cpr_mode ? "on" : "off"]." + if(battery) + if(battery.percent() > 10) + . += "It currently has a battery with [battery.percent()]% charge." + else if(battery.percent() > 0) + . += SPAN_ALERT("It currently has a battery with [battery.percent()]% charge.") + else + . += SPAN_DANGER("It currently has a battery with no charge left!") + if(tank) + . += "It has \the [tank] installed. The meter shows [round(tank.air_contents.return_pressure())] kPa, \ + with the pressure set to [round(tank.distribute_pressure)] kPa.[epp_active ? " The [EPP] is active." : ""]" + if(breath_mask) + . += "It has \the [breath_mask] installed." + /obj/item/auto_cpr/Initialize() . = ..() battery = new /obj/item/cell(src) @@ -478,17 +514,4 @@ playsound(usr, 'sound/machines/click.ogg', 50) update_icon() -/obj/item/auto_cpr/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!is_adjacent) - return - . += SPAN_NOTICE("\The [src]'s [EPP] is currently [epp_mode ? "on" : "off"], while the Auto CPR is [cpr_mode ? "on" : "off"].") - if(battery) - . += SPAN_NOTICE("It currently has a battery with [battery.percent()]% charge.") - if(tank) - . += SPAN_NOTICE("It has [icon2html(tank, user)] \the [tank] installed. The meter shows [round(tank.air_contents.return_pressure())]kPa, \ - with the pressure set to [round(tank.distribute_pressure)]kPa.[epp_active ? " The [EPP] is active." : ""]") - if(breath_mask) - . += SPAN_NOTICE("It has [icon2html(breath_mask, user)] \the [breath_mask] installed.") - #undef EPP diff --git a/code/game/objects/items/devices/chameleonproj.dm b/code/game/objects/items/devices/chameleonproj.dm index a80eee81b61..baafe037c44 100644 --- a/code/game/objects/items/devices/chameleonproj.dm +++ b/code/game/objects/items/devices/chameleonproj.dm @@ -1,7 +1,6 @@ /obj/item/device/chameleon name = "chameleon projector" desc = "A strange device." - desc_antag = "This device can let you disguise as common objects. Click on an object with this in your active hand to scan it, then activate it to use it in your hand." icon = 'icons/obj/item/device/chameleon.dmi' icon_state = "shield0" item_state = "electronic" @@ -19,6 +18,12 @@ var/saved_icon_state = "cigbutt" var/saved_overlays +/obj/item/device/chameleon/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This device can let you disguise as common objects." + . += "Left-click on an object with this in your active hand to scan it." + . += "Left-click it in-hand to toggle the effect." + /obj/item/device/chameleon/dropped() disrupt() ..() diff --git a/code/game/objects/items/devices/clothes_dyer.dm b/code/game/objects/items/devices/clothes_dyer.dm index 81a8f5c9128..e03db03934c 100644 --- a/code/game/objects/items/devices/clothes_dyer.dm +++ b/code/game/objects/items/devices/clothes_dyer.dm @@ -5,7 +5,6 @@ /obj/item/device/clothes_dyer name = "clothes dyer" desc = "This is a device designed to rapidly dye clothes to new colors. Naysayers say it isn't great for the fabric, but what do they know?" - desc_info = "Select the desired color by using the item on yourself, and alternate between the primary and secondary colour of the item by alt-clicking the item. This only works on clothing items that are recolorable." icon = 'icons/obj/item/device/paint_sprayer.dmi' icon_state = "paint_sprayer" item_state = "paint_sprayer" @@ -14,6 +13,10 @@ /// Contains the colors the dyer is set to for each possible mode. var/list/colors_by_mode = list(BASE_COLOR = "#FFFFFF", ACCENT_COLOR = "#FFFFFF") +/obj/item/device/clothes_dyer/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Select the desired color by using the item on yourself, and alternate between the primary and secondary colour of the item by alt-clicking the item. This only works on clothing items that are recolorable." + // Changes the color of the selected mode. /obj/item/device/clothes_dyer/attack_self(mob/user) var/selected_color = input(user, "Please select dye color.", "Dye Color", colors_by_mode[selected_mode]) as color|null diff --git a/code/game/objects/items/devices/debugger.dm b/code/game/objects/items/devices/debugger.dm index 7dbbeb7d9a4..0927e464427 100644 --- a/code/game/objects/items/devices/debugger.dm +++ b/code/game/objects/items/devices/debugger.dm @@ -2,7 +2,6 @@ /obj/item/device/debugger name = "debugger" desc = "Used to debug electronic equipment, debuggers come with a retractable data cable that can be plugged into most machines." - desc_info = "The debugger can be used on vending machines to identify and resolve any viral infections, or on upgradeable machinery to identify the component parts it contains." icon = 'icons/obj/hacktool.dmi' icon_state = "hacktool-g" obj_flags = OBJ_FLAG_CONDUCTABLE @@ -15,3 +14,7 @@ matter = list(MATERIAL_PLASTIC = 50, DEFAULT_WALL_MATERIAL = 50, MATERIAL_GLASS = 20) origin_tech = list(TECH_MAGNET = 1, TECH_ENGINEERING = 1) + +/obj/item/device/debugger/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The debugger can be used on vending machines and APCs to identify and resolve any viral infections." diff --git a/code/game/objects/items/devices/dociler.dm b/code/game/objects/items/devices/dociler.dm index 829a5025585..67955c79d88 100644 --- a/code/game/objects/items/devices/dociler.dm +++ b/code/game/objects/items/devices/dociler.dm @@ -10,8 +10,8 @@ var/loaded = 1 var/mode = "completely" -/obj/item/device/dociler/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/device/dociler/feedback_hints(mob/user, distance, is_adjacent) + . += ..() . += SPAN_NOTICE("It is currently set to [mode] docile mode.") /obj/item/device/dociler/attack_self(var/mob/user) diff --git a/code/game/objects/items/devices/drop_targeter/orbital_drops.dm b/code/game/objects/items/devices/drop_targeter/orbital_drops.dm index 9ddf80c161e..75c3025f5da 100644 --- a/code/game/objects/items/devices/drop_targeter/orbital_drops.dm +++ b/code/game/objects/items/devices/drop_targeter/orbital_drops.dm @@ -56,10 +56,13 @@ map = new /datum/map_template/armory /obj/item/device/orbital_dropper/armory/syndicate - desc_antag = "This is a stealthy variant of the standard armory orbital drop. It will not report itself dropping on common, unless emagged." announcer_name = "Tactical Autodrone" announcer_frequency = SYND_FREQ +/obj/item/device/orbital_dropper/armory/syndicate/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a stealthy variant of the standard armory orbital drop. It will not report itself dropping on Common, unless emagged." + /obj/item/device/orbital_dropper/icarus_drones name = "icarus painter" desc = "A device used to paint a target, which will then promptly orbitally drop the requested items. This one has been modified to call in Icarus Drones." diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm index 1add2330f68..a0caf8bd0e0 100644 --- a/code/game/objects/items/devices/flash.dm +++ b/code/game/objects/items/devices/flash.dm @@ -1,7 +1,6 @@ /obj/item/device/flash name = "flash" desc = "A security device capable of producing a blinding, incapacitating flash at close ranges. Repeated use may result in a burnt-out bulb and/or excessive force investigations." - desc_info = "Click on someone adjacent to you to attempt to blind them. Use it in your hand with HARM intent, or on yourself, to blind everyone in a small radius (including yourself!)" icon = 'icons/obj/item/device/flash.dmi' icon_state = "flash" item_state = "flash" @@ -18,13 +17,18 @@ var/last_use = 0 -/obj/item/device/flash/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/device/flash/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click on someone adjacent to you to attempt to blind them." + . += "Use it in your hand with HARM intent, or on yourself, to blind everyone in a small radius (including yourself!)" + +/obj/item/device/flash/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(!broken) var/num_charges = max(0, max_charges - times_used) - . += SPAN_NOTICE("The charge indicator shows [num_charges] charge[num_charges == 1 ? "" : "s"] remain[num_charges == 1 ? "s" : ""].") + . += "The charge indicator shows [num_charges] charge[num_charges == 1 ? "" : "s"] remain[num_charges == 1 ? "s" : ""]." else - . += SPAN_WARNING("\The [src]'s bulb is burnt out!") + . += SPAN_ALERT("\The [src]'s bulb is burnt out!") /obj/item/device/flash/proc/clumsy_check(mob/user) if(user && (user.is_clumsy()) && prob(50)) diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm index 139e6b54de8..738e6c49afa 100644 --- a/code/game/objects/items/devices/geiger.dm +++ b/code/game/objects/items/devices/geiger.dm @@ -14,6 +14,14 @@ var/geiger_volume = 0 var/sound_id +/obj/item/device/geiger/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/msg = "[scanning ? "ambient" : "stored"] Radiation level: [radiation_count ? radiation_count : "0"] IU/s." + if(radiation_count > RAD_LEVEL_LOW) + . += SPAN_WARNING("[msg]") + else + . += SPAN_NOTICE("[msg]") + /obj/item/device/geiger/Initialize() . = ..() sound_id = "[type]_[sequential_id(type)]" @@ -35,14 +43,6 @@ radiation_count = SSradiation.get_rads_at_turf(get_turf(src)) update_icon() -/obj/item/device/geiger/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/msg = "[scanning ? "ambient" : "stored"] Radiation level: [radiation_count ? radiation_count : "0"] IU/s." - if(radiation_count > RAD_LEVEL_LOW) - . += SPAN_WARNING("[msg]") - else - . += SPAN_NOTICE("[msg]") - /obj/item/device/geiger/attack_self(mob/user) scanning = !scanning if(scanning) diff --git a/code/game/objects/items/devices/holowarrant.dm b/code/game/objects/items/devices/holowarrant.dm index 99b49d01bd0..5decc12ab24 100644 --- a/code/game/objects/items/devices/holowarrant.dm +++ b/code/game/objects/items/devices/holowarrant.dm @@ -1,7 +1,6 @@ /obj/item/device/holowarrant name = "warrant projector" desc = "The practical paperwork replacement for the officer on the go." - desc_info = "Use this item in-hand to select the active warrant. Click on the person you want to show it to to display the warrant." icon = 'icons/obj/holowarrant.dmi' icon_state = "holowarrant" item_state = "holowarrant" @@ -13,6 +12,16 @@ var/datum/record/warrant/selected_warrant +/obj/item/device/holowarrant/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use this item in-hand to select the active warrant." + . += "Click on the person you want to show it to to display the warrant to them." + +/obj/item/device/holowarrant/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(selected_warrant) + . += "It's a holographic warrant for '[selected_warrant.name]'." + /obj/item/device/holowarrant/Initialize(mapload, ...) . = ..() RegisterSignal(SSrecords, COMSIG_RECORD_CREATED, PROC_REF(handle_warrant_created)) @@ -21,11 +30,6 @@ unload_warrant() return ..() -/obj/item/device/holowarrant/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(selected_warrant) - . += "It's a holographic warrant for '[selected_warrant.name]'." - /obj/item/device/holowarrant/attack_self(mob/living/user as mob) if(!LAZYLEN(SSrecords.warrants)) to_chat(user, SPAN_NOTICE("There are no warrants available at this time.")) diff --git a/code/game/objects/items/devices/lighting/flare.dm b/code/game/objects/items/devices/lighting/flare.dm index 0ce5d55b421..3116061917a 100644 --- a/code/game/objects/items/devices/lighting/flare.dm +++ b/code/game/objects/items/devices/lighting/flare.dm @@ -1,7 +1,6 @@ /obj/item/device/flashlight/flare name = "flare" desc = "A red standard-issue flare. There are instructions on the side reading 'twist cap off, make light'." - desc_info = "Use this item in your hand, to turn on the light." w_class = WEIGHT_CLASS_TINY brightness_on = 5 // Pretty bright. light_power = 6 @@ -20,6 +19,10 @@ drop_sound = 'sound/items/drop/gloves.ogg' pickup_sound = 'sound/items/pickup/gloves.ogg' +/obj/item/device/flashlight/flare/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click \the [src] in-hand to activate it." + /obj/item/device/flashlight/flare/Initialize() . = ..() fuel = rand(12 MINUTES, 15 MINUTES) @@ -86,7 +89,6 @@ /obj/item/device/flashlight/flare/torch name = "torch" desc = "A rustic source of light." - desc_info = "Click on a source of flame, to light the torch." w_class = WEIGHT_CLASS_BULKY brightness_on = 2 light_power = 3 @@ -100,6 +102,10 @@ drop_sound = 'sound/items/drop/woodweapon.ogg' pickup_sound = 'sound/items/pickup/woodweapon.ogg' +/obj/item/device/flashlight/flare/torch/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click on a source of flame with the torch to light it." + /obj/item/device/flashlight/flare/torch/attack_self(mob/user) if (on) turn_off() diff --git a/code/game/objects/items/devices/lighting/flashlight.dm b/code/game/objects/items/devices/lighting/flashlight.dm index 8c9f14927aa..47a0f7dfea5 100644 --- a/code/game/objects/items/devices/lighting/flashlight.dm +++ b/code/game/objects/items/devices/lighting/flashlight.dm @@ -1,7 +1,6 @@ /obj/item/device/flashlight name = "flashlight" desc = "A hand-held emergency light." - desc_info = "Use this item in your hand, to turn on the light. Click this light with the opposite hand, to remove the cell contained inside." icon = 'icons/obj/lighting.dmi' icon_state = "flashlight" item_state = "flashlight" @@ -43,6 +42,22 @@ /// A way for mappers to force which way a flashlight faces upon spawning var/spawn_dir +/obj/item/device/flashlight/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(!always_on) + . += "Left-click \the [src] in-hand to toggle the light." + . += "While held, left-click \the [src] with your free hand to remove the power cell." + +/obj/item/device/flashlight/feedback_hints(mob/user, distance, is_adjacent) + . = list() + . = ..() + if(power_use && brightness_level) + . += "\The [src] is set to [brightness_level]." + if(cell) + . += "\The [src] has \a [cell] attached. It has [round(cell.percent())]% charge remaining." + if(light_wedge && isturf(loc)) + . += SPAN_NOTICE("\The [src] is facing [dir2text(dir)].") + /obj/item/device/flashlight/Initialize() if(power_use && cell_type) @@ -120,15 +135,6 @@ M.update_inv_r_ear() M.update_inv_head() -/obj/item/device/flashlight/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(power_use && brightness_level) - . += SPAN_NOTICE("\The [src] is set to [brightness_level].") - if(cell) - . += SPAN_NOTICE("\The [src] has \a [cell] attached. It has [round(cell.percent())]% charge remaining.") - if(light_wedge && isturf(loc)) - . += FONT_SMALL(SPAN_NOTICE("\The [src] is facing [dir2text(dir)].")) - /obj/item/device/flashlight/attack_self(mob/user) if(always_on) to_chat(user, SPAN_NOTICE("You cannot toggle \the [name].")) @@ -363,7 +369,6 @@ gender = PLURAL name = "glowing slime extract" desc = "A glowing ball of what appears to be amber." - desc_info = null icon = 'icons/mob/npc/slimes.dmi' icon_state = "yellow slime extract" item_state = "flashlight" diff --git a/code/game/objects/items/devices/lighting/lamp.dm b/code/game/objects/items/devices/lighting/lamp.dm index e868c5e5ce5..c07a0d31ddf 100644 --- a/code/game/objects/items/devices/lighting/lamp.dm +++ b/code/game/objects/items/devices/lighting/lamp.dm @@ -1,8 +1,6 @@ /obj/item/device/flashlight/lamp name = "desk lamp" desc = "A desk lamp with an adjustable mount." - desc_info = "Use this item in your hand to toggle the light, or right click this object and use the 'Toggle Light' verb." - desc_antag = "As a Cultist, this item can be reforged to become a pylon." icon_state = "lamp" item_state = "lamp" center_of_mass = list("x" = 13,"y" = 11) @@ -18,6 +16,14 @@ toggle_sound = /singleton/sound_category/switch_sound activation_sound = 'sound/effects/lighton.ogg' +/obj/item/device/flashlight/lamp/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click this item in-hand to toggle the light, or right-click it and use the 'Toggle Light' verb." + +/obj/item/device/flashlight/lamp/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a Cultist, this item can be reforged to become a pylon." + /obj/item/device/flashlight/lamp/off on = FALSE @@ -90,7 +96,6 @@ /obj/item/device/flashlight/lamp/holodeck name = "holographic lighting orb" desc = "A floating orb that comes in a variety of colors. Optional holodeck lighting." - desc_info = "This is a holodeck item used for optional lighting. You can click on this to toggle it on and off." anchored = 1 brightness_on = 12 light_color = "#ffcb9b" diff --git a/code/game/objects/items/devices/lightreplacer.dm b/code/game/objects/items/devices/lightreplacer.dm index 82c10780ed6..ed0c0063839 100644 --- a/code/game/objects/items/devices/lightreplacer.dm +++ b/code/game/objects/items/devices/lightreplacer.dm @@ -57,6 +57,13 @@ var/store_broken = 0//If set, this lightreplacer will suck up and store broken bulbs var/max_stored = 10 +/obj/item/device/lightreplacer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 2) + . += "It has [uses] lights remaining." + if (store_broken) + . += "It is storing [stored()]/[max_stored] broken lights." + /obj/item/device/lightreplacer/advanced name = "advanced light replacer" desc = "A specialised light replacer which stores more lights, refills faster from boxes, and sucks up broken bulbs. Empty into a disposal or trashbag when full!" @@ -72,13 +79,6 @@ failmsg = "The [name]'s refill light blinks red." ..() -/obj/item/device/lightreplacer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 2) - . += "It has [uses] lights remaining." - if (store_broken) - . += "It is storing [stored()]/[max_stored] broken lights." - /obj/item/device/lightreplacer/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/stack/material) && attacking_item.get_material_name() == "glass") var/obj/item/stack/G = attacking_item @@ -116,7 +116,6 @@ to_chat(user, SPAN_NOTICE("You transfer the lights from \the [src] to \the [LR].")) return TRUE - /obj/item/device/lightreplacer/afterattack(var/atom/target, var/mob/living/user, proximity, params) if (istype(target, /obj/item/storage/box)) if (box_contains_lights(target)) @@ -124,14 +123,12 @@ else to_chat(user, "This box has no bulbs in it!") - /obj/item/device/lightreplacer/proc/box_contains_lights(var/obj/item/storage/box/box) for (var/obj/item/light/L in box.contents) if (L.status == 0) return 1 return 0 - /obj/item/device/lightreplacer/proc/load_lights_from_box(var/obj/item/storage/box/box, var/mob/user) var/boxstartloc = box.loc var/ourstartloc = src.loc diff --git a/code/game/objects/items/devices/magnetic_lock.dm b/code/game/objects/items/devices/magnetic_lock.dm index 32de707085c..ca0df878625 100644 --- a/code/game/objects/items/devices/magnetic_lock.dm +++ b/code/game/objects/items/devices/magnetic_lock.dm @@ -28,6 +28,24 @@ var/obj/machinery/door/airlock/target = null var/obj/item/cell/powercell +/obj/item/device/magnetic_lock/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if (status == STATUS_BROKEN) + . += SPAN_DANGER("It looks broken!") + +/obj/item/device/magnetic_lock/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (powercell) + var/power = round(powercell.charge / powercell.maxcharge * 100) + . += SPAN_NOTICE("The powercell is at [power]% charge.") + else + . += SPAN_WARNING("It has no powercell to power it!") + +/obj/item/device/magnetic_lock/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(department) + . += "Once applied to an airlock, this device can be activated/deactivated by swiping an ID from the [department] department across it." + /obj/item/device/magnetic_lock/security department = "Security" icon_state = "inactive_Security" @@ -75,18 +93,6 @@ status = STATUS_ACTIVE attach(newtarget) -/obj/item/device/magnetic_lock/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - - if (status == STATUS_BROKEN) - . += SPAN_DANGER("It looks broken!") - else - if (powercell) - var/power = round(powercell.charge / powercell.maxcharge * 100) - . += SPAN_NOTICE("The powercell is at [power]% charge.") - else - . += SPAN_WARNING("It has no powercell to power it!") - /obj/item/device/magnetic_lock/attack_hand(var/mob/user) add_fingerprint(user) if (constructionstate == 1 && powercell) @@ -456,6 +462,10 @@ var/passcode = "open" var/configurable = TRUE +/obj/item/device/magnetic_lock/keypad/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Keypad-enabled magnetic locks require a custom passcode to unlock them, configured on initial use." + /obj/item/device/magnetic_lock/keypad/update_overlays() ..() switch (status) diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm index 0ff295acbd3..1b6a540e8a5 100644 --- a/code/game/objects/items/devices/megaphone.dm +++ b/code/game/objects/items/devices/megaphone.dm @@ -2,7 +2,6 @@ name = "megaphone" desc = "Pretend to be a director for a brief moment before someone tackles you to make you shut up." desc_extended = "Annoy your colleagues! Scare interns! Impress no one!" - desc_info = "A device used to project your voice. Loudly." icon = 'icons/obj/item/device/megaphone.dmi' icon_state = "megaphone" item_state = "megaphone" @@ -12,10 +11,18 @@ var/spamcheck = 0 var/emagged = 0 var/insults = 0 - var/list/insultmsg = list("FUCK EVERYONE!", "I'M A TATER!", "ALL SECURITY TO SHOOT ME ON SIGHT!", "I HAVE A BOMB!", "CAPTAIN IS A COMDOM!", "FOR THE SYNDICATE!") + var/list/insultmsg = list("FUCK YOURSELF TO DEATH!", "FUCK YOU!", "DOUBLE-FUCK YOU!", "I TRANSMITTED THE SCUTTLE CODES TO EE!", "I POISONED THE DRINK DISPENSERS!", "I HAVE A BOMB!", "I'M GOING TO TAKE SOME COMMAND SCALPS!", "FUCK THE SCC!", "UNATHI ARE WEAKLING SHITLIZARDS!", "FUCK YOU AND FUCK YOURSELF AGAIN!") var/activation_sound = 'sound/items/megaphone.ogg' var/needs_user_location = TRUE +/obj/item/device/megaphone/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use it on yourself to broadcast something. LOUDLY." + +/obj/item/device/multitool/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This can be emagged to make it broadcast random insults or self-incriminations when used." + /obj/item/device/megaphone/attack_self(mob/living/user as mob) if(user.client) if(user.client.prefs.muted & MUTE_IC) @@ -40,12 +47,12 @@ return if(emagged) if(insults) - user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"", "[user] speaks into \the [src].", 7) + user.audible_message("[user] broadcasts, \"[pick(insultmsg)]\"", "[user] speaks into \the [src].", 14) insults-- else to_chat(user, SPAN_WARNING("*BZZZZzzzzzt*")) else - user.audible_message("[user] broadcasts, \"[message]\"", "[user] speaks into \the [src].", 7) + user.audible_message("[user] broadcasts, \"[message]\"", "[user] speaks into \the [src].", 14) if(activation_sound) playsound(loc, activation_sound, 100, 0, 1) for (var/mob/living/carbon/human/C in range(user, 2) - user) @@ -60,7 +67,7 @@ if(!emagged) to_chat(user, SPAN_WARNING("You overload \the [src]'s voice synthesizer.")) emagged = 1 - insults = rand(1, 3)//to prevent dickflooding + insults = rand(3, 5)//to prevent dickflooding return 1 /obj/item/device/megaphone/red diff --git a/code/game/objects/items/devices/memorywiper.dm b/code/game/objects/items/devices/memorywiper.dm index 6a7896da13b..3721dd33f80 100644 --- a/code/game/objects/items/devices/memorywiper.dm +++ b/code/game/objects/items/devices/memorywiper.dm @@ -1,8 +1,6 @@ - /obj/item/device/memorywiper name = "portable memory wiper" desc = "Inset into a sturdy pelican case, this computer holds the software and wiring necessary to wipe and factory reset any IPC." - desc_info = "You can alt-click the laptop while it's set down on surface to open it up and work with it. Left clicking while it is open will allow you to operate it." icon = 'icons/obj/memorywiper.dmi' icon_state = "portable_memorywiper" item_state = "portable_memorywiper" @@ -14,13 +12,17 @@ var/datum/progressbar/wipe_bar var/wipe_start_time = 0 +/obj/item/device/memorywiper/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-click the device while it's set down on a surface to open or close it." + . += "Left-click on it while it is open to operate it." + /obj/item/device/memorywiper/Destroy() if(attached) attached = null wiping = FALSE return ..() - /obj/item/device/memorywiper/AltClick() if(use_check(usr)) return diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm index 092e5aa95b2..9e7b367540e 100644 --- a/code/game/objects/items/devices/modkit.dm +++ b/code/game/objects/items/devices/modkit.dm @@ -19,6 +19,10 @@ /obj/item/rig_assembly ) +/obj/item/device/modkit/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It looks as though it modifies voidsuits to fit [is_multi_species ? "users of multiple species" : "[target_species] users"]." + /obj/item/device/modkit/afterattack(obj/O, mob/user as mob, proximity) if(!proximity) return @@ -79,10 +83,6 @@ user.drop_from_inventory(src,O) qdel(src) -/obj/item/device/modkit/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It looks as though it modifies voidsuits to fit [is_multi_species ? "users of multiple species" : "[target_species] users"]." - /obj/item/device/modkit/tajaran name = "tajaran voidsuit modification kit" desc = "A kit containing all the needed tools and parts to modify a voidsuit for another user. This one looks like it's meant for tajara." @@ -112,9 +112,7 @@ item_state = "restock_unit" contained_sprite = TRUE desc = "A simple cardboard box containing the requisition forms, permits, and decal kits for a Himean voidsuit." - desc_info = "In order to convert a voidsuit simply click on voidsuit or helmet with this item\ - The same process can be used to convert the voidsuit back into a regular voidsuit. Make sure not to have a helmet or tank in the suit\ - or else it will be deleted." + w_class = WEIGHT_CLASS_SMALL var/list/suit_options = list( /obj/item/clothing/suit/space/void/mining = /obj/item/clothing/suit/space/void/mining/himeo, @@ -131,6 +129,12 @@ ) var/parts = MODKIT_FULL +/obj/item/voidsuit_modkit/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click on a voidsuit or helmet with this item to convert it." + . += "Clicked on a converted voidsuit or helmet to convert it back into its regular form." + . += "Make sure not to have any items attached to the suit, or else they will be deleted." + /obj/item/voidsuit_modkit/afterattack(obj/item/W as obj, mob/user as mob, proximity) if(!proximity) return @@ -185,9 +189,10 @@ desc_extended = "Despite the vast amounts of supplementary paperwork involved, the Stellar Corporate Conglomerate continues to import specialty industrialwear through an Orion Express subsidiary to \ boost morale among Himean staff. With success in the previous Type-76 'Fish Fur' program, the Chainlink has also authorized a number of Type-86 'Cicada' industrial hardsuits for use \ on a number of installations, such as the Horizon." - desc_info = "In order to convert a voidsuit, simply click on voidsuit or helmet with this item. The same process can be used to convert the voidsuit back into a regular voidsuit, or \ - to turn an industrial hardsuit assembly into a Himeo variant. Make sure not to have a helmet or tank in the suit, or else it will be deleted." +/obj/item/voidsuit_modkit/himeo/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This modkit can be used to convert an industrial hardsuit assembly into a Himean variant." /obj/item/voidsuit_modkit/himeo/tajara name = "tajaran himeo voidsuit kit" @@ -208,14 +213,14 @@ /obj/item/voidsuit_modkit/dominianvoid name = "dominian voidsman's voidsuit kit" desc = "A highly complicated device that allows you to convert a Dominian prejoroub combat suit into its voidsman counterpart. Practical!" - desc_info = "This is an OOC item, don't let anyone see it! In order to convert a voidsuit simply click on voidsuit or helmet with this item \ - The same process can be used to convert the voidsuit back into a regular voidsuit. Make sure not to have a helmet or tank in the suit \ - or else it will be deleted." w_class = WEIGHT_CLASS_SMALL suit_options = list( /obj/item/clothing/head/helmet/space/void/dominia = /obj/item/clothing/head/helmet/space/void/dominia/voidsman, /obj/item/clothing/suit/space/void/dominia = /obj/item/clothing/suit/space/void/dominia/voidsman ) +/obj/item/voidsuit_modkit/dominianvoid/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_DANGER("This is an OOC item, don't let anyone see it!") /obj/item/storage/box/dominianvoid name = "dominian voidsman's modkit box" @@ -244,15 +249,18 @@ item_state = "restock_unit" contained_sprite = TRUE desc = "A simple cardboard box designed to modify a voidsuit to a selection of alternate options." - desc_info = "In order to convert a voidsuit simply click on voidsuit or helmet with this item\ - The same process can be used to convert the voidsuit back into a regular voidsuit. Make sure not to have a helmet or tank in the suit\ - or else it will be deleted." w_class = WEIGHT_CLASS_SMALL var/list/suit_options = list() var/list/helmet_options = list() var/list/rig_options = list() var/parts = MODKIT_FULL +/obj/item/voidsuit_modkit_multi/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click on a voidsuit or helmet with this item to convert it." + . += "Clicked on a converted voidsuit or helmet to convert it back into its regular form." + . += "Make sure not to have any items attached to the suit, or else they will be deleted." + /obj/item/voidsuit_modkit_multi/afterattack(obj/item/W as obj, mob/user as mob, proximity) if(!proximity) return @@ -300,9 +308,6 @@ /obj/item/voidsuit_modkit_multi/sol_warlord name = "solarian warlord modkit" desc = "A highly complicated device that allows you to convert a Solarian voidsuit into a warlord variant. Wow!" - desc_info = "This is an OOC item, don't let anyone see it! In order to convert a voidsuit simply click on voidsuit or helmet with this item \ - The same process can be used to convert the voidsuit back into a regular voidsuit. Make sure not to have a helmet or tank in the suit \ - or else it will be deleted." suit_options = list( "Solarian Armed Forces" = /obj/item/clothing/suit/space/void/sol, "Free Solarian Fleets" = /obj/item/clothing/suit/space/void/sol/fsf, @@ -326,12 +331,13 @@ "Solarian People's Liberation Fleet" = /obj/item/clothing/head/helmet/space/void/sol/splf ) +/obj/item/voidsuit_modkit_multi/sol_warlord/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_DANGER("This is an OOC item, don't let anyone see it!") + /obj/item/voidsuit_modkit_multi/unathi_pirate name = "unathi pirate modkit" desc = "A highly complicated device that allows you to convert an Unathi pirate suit into another fleet's counterpart. Practical!" - desc_info = "This is an OOC item, don't let anyone see it! In order to convert a voidsuit simply click on voidsuit or helmet with this item \ - The same process can be used to convert the voidsuit back into a regular voidsuit. Make sure not to have a helmet or tank in the suit \ - or else it will be deleted." w_class = WEIGHT_CLASS_SMALL suit_options = list( "Izharshan's Raiders" = /obj/item/clothing/suit/space/void/unathi_pirate, @@ -346,6 +352,10 @@ "Tarwa Conglomerate" = /obj/item/clothing/head/helmet/space/void/unathi_pirate/tarwa ) +/obj/item/voidsuit_modkit_multi/unathi_pirate/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_DANGER("This is an OOC item, don't let anyone see it!") + /obj/item/voidsuit_modkit_multi/unathi_pirate/captain name = "unathi pirate captain modkit" suit_options = list( @@ -364,9 +374,6 @@ /obj/item/voidsuit_modkit_multi/nanotrasen name = "\improper NanoTrasen hardsuit modkit" desc = "A highly complicated device that allows you to convert a NanoTrasen hardsuit into its corporate auxiliary or Nexus Security variant. Wow!" - desc_info = "This is an OOC item, don't let anyone see it! In order to convert a voidsuit simply click on a hardsuit with this item \ - The same process can be used to convert the hardsuit back into a regular hardsuit. Make sure not to have any modules in the suit \ - or else it will be deleted." w_class = WEIGHT_CLASS_SMALL rig_options = list( "NanoTrasen Hardsuit" = /obj/item/rig/nanotrasen, @@ -374,6 +381,10 @@ "Nexus Security Hardsuit" = /obj/item/rig/nanotrasen/nexus ) +/obj/item/voidsuit_modkit_multi/nanotrasen/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_DANGER("This is an OOC item, don't let anyone see it!") + /obj/item/voidsuit_modkit_multi/coalition name = "coalition of colonies voidsuit modkit" suit_options = list( diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 3d2d62e5921..1376c956b7c 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -6,7 +6,6 @@ /obj/item/device/multitool name = "multitool" desc = "This small, handheld device is made of durable, insulated plastic. It has a electrode jack, perfect for interfacing with numerous machines, as well as an in-built NT-SmartTrack! system." - desc_info = "You can use this on airlocks or APCs to try to hack them without cutting wires. You can also use it to wire circuits, and track APCs by using it in-hand." icon = 'icons/obj/item/device/multitool.dmi' icon_state = "multitool" item_state = "multitool" @@ -35,6 +34,14 @@ var/datum/integrated_io/selected_io = null var/mode = 0 +/obj/item/device/multitool/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can use this on a variety of objects (including APCs, airlocks and more) to try to hack them without cutting wires." + . += "Using it in-hand will toggle tracking of nearby APCs." + . += "Using it on a length of laid cable will return how much current it is carrying." + . += "It is used for interacting with a variety of machines." + . += "It is a necessary tool for integrated electronics wiring." + /obj/item/device/multitool/Destroy() unregister_buffer(buffer_object) QDEL_NULL(apc_indicator) diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index ea4f6bc41ac..56f00727e2f 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -6,7 +6,6 @@ /obj/item/device/paint_sprayer name = "paint gun" desc = "A Hephaestus-made paint gun that uses microbes to replenish its paint storage. Very high-tech and fancy too!" - desc_info = "Use control-click on a coloured decal on a turf to copy its colour. You can also use shift-click on a turf with the paint gun in hand to clear all decals on it." icon = 'icons/obj/item/device/paint_sprayer.dmi' icon_state = "paint_sprayer" item_state = "mister" @@ -80,6 +79,15 @@ "bulkhead black" = COLOR_WALL_GUNMETAL ) +/obj/item/device/paint_sprayer/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "CTRL-click a turf with the paint sprayer to copy the color(s) used on it." + . += "SHIFT-click a turf with the paint sprayer to clear all decals from it." + +/obj/item/device/paint_sprayer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It is configured to produce the '[SPAN_NOTICE(decal)]' decal with a direction of '[SPAN_NOTICE(paint_dir)]' using [SPAN_NOTICE(paint_colour)] paint." + /obj/item/device/paint_sprayer/update_icon() ClearOverlays() AddOverlays(overlay_image(icon, "paint_sprayer_color", paint_colour)) @@ -301,10 +309,6 @@ playsound(get_turf(src), 'sound/effects/spray3.ogg', 30, 1, -6) return . -/obj/item/device/paint_sprayer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It is configured to produce the '[SPAN_NOTICE(decal)]' decal with a direction of '[SPAN_NOTICE(paint_dir)]' using [SPAN_NOTICE(paint_colour)] paint." - /obj/item/device/paint_sprayer/verb/choose_colour() set name = "Choose Colour" set desc = "Choose a paintgun colour." diff --git a/code/game/objects/items/devices/personal_shield.dm b/code/game/objects/items/devices/personal_shield.dm index 710ae60af58..9bf06bc0e10 100644 --- a/code/game/objects/items/devices/personal_shield.dm +++ b/code/game/objects/items/devices/personal_shield.dm @@ -12,11 +12,11 @@ var/upkeep_cost = 2 var/obj/aura/personal_shield/device/shield -/obj/item/device/personal_shield/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/device/personal_shield/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(is_adjacent) - . += SPAN_NOTICE("\The [src] has [cell.charge] charge remaining.") - . += SPAN_NOTICE("Shield upkeep costs [upkeep_cost] charge, and blocking a shot costs [SPAN_NOTICE("[charge_per_shot]")] charge.") + . += "\The [src] has [cell.charge] charge remaining." + . += "Shield upkeep costs [upkeep_cost] charge, and blocking a shot costs [charge_per_shot] charge." /obj/item/device/personal_shield/Initialize() . = ..() diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index f7163bf692a..6e06da19231 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -6,6 +6,10 @@ var/list/modes var/mode +/obj/item/device/pipe_painter/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It is in [mode] mode." + /obj/item/device/pipe_painter/New() ..() modes = new() @@ -29,7 +33,3 @@ /obj/item/device/pipe_painter/attack_self(var/mob/user) mode = tgui_input_list(user, "Which colour do you want to use?", "Pipe Painter", modes, mode) - -/obj/item/device/pipe_painter/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It is in [mode] mode." diff --git a/code/game/objects/items/devices/powersink.dm b/code/game/objects/items/devices/powersink.dm index 31ef85630c4..8a169586b16 100644 --- a/code/game/objects/items/devices/powersink.dm +++ b/code/game/objects/items/devices/powersink.dm @@ -37,6 +37,10 @@ var/datum/powernet/PN // Our powernet var/obj/structure/cable/attached // the attached cable +/obj/item/device/powersink/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Dead APCs means their emergency shutters won't automatically close pressure loss. You could rapidly vent an entire department this way." + /obj/item/device/powersink/Destroy() PN = null attached = null @@ -76,17 +80,28 @@ return /obj/item/device/powersink/attack_hand(var/mob/user) + if(!mode) + ..() + else + toggle_mode(user) + +/// Used to be handled in attack_hand(), but moved to its own proc to handle future signaler usage. +/obj/item/device/powersink/proc/toggle_mode(var/mob/user) switch(mode) - if(0) - ..() if(1) - visible_message(SPAN_NOTICE("\The [user] activates \the [src]!")) + if(user) + visible_message(SPAN_NOTICE("\The [user] activates \the [src]!")) + else + visible_message(SPAN_NOTICE("\The [src] suddenly starts to hum!")) mode = 2 icon_state = "powersink1" item_state = "powersink1" START_PROCESSING(SSprocessing, src) - if(2) //This switch option wasn't originally included. It exists now. --NeoFite - visible_message(SPAN_NOTICE("\The [user] deactivates \the [src]!")) + if(2) + if(user) + visible_message(SPAN_NOTICE("\The [user] deactivates \the [src]!")) + else + visible_message(SPAN_NOTICE("\The [src] suddenly goes quiet!")) mode = 1 set_light(0) icon_state = "powersink0" @@ -127,7 +142,6 @@ power_drained += drained return 1 - /obj/item/device/powersink/process(seconds_per_tick) drained_this_tick = 0 power_drained -= min(dissipation_rate, power_drained) diff --git a/code/game/objects/items/devices/radio/beacon.dm b/code/game/objects/items/devices/radio/beacon.dm index c1e67abdf39..469c23f45f2 100644 --- a/code/game/objects/items/devices/radio/beacon.dm +++ b/code/game/objects/items/devices/radio/beacon.dm @@ -17,8 +17,8 @@ GLOBAL_LIST_EMPTY(teleportbeacons) GLOB.teleportbeacons -= src return ..() -/obj/item/device/radio/beacon/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/device/radio/beacon/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(anchored) . += SPAN_NOTICE("It's been secured to the ground with anchoring screws.") diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm index 987b23a34e7..844c15434a1 100644 --- a/code/game/objects/items/devices/radio/encryptionkey.dm +++ b/code/game/objects/items/devices/radio/encryptionkey.dm @@ -67,12 +67,11 @@ icon_state = "cypherkey" additional_channels = list(CHANNEL_MERCENARY = TRUE, CHANNEL_HAILING = TRUE) origin_tech = list(TECH_ILLEGAL = 3) - desc_antag = "An encryption key that allows you to intercept comms and speak on private non-station channels. Use :t to access the private channel." syndie = TRUE -/obj/item/device/encryptionkey/syndicate/New() - ..() - desc_antag = "An encryption key that allows you to intercept comms and speak on private non-[station_name(TRUE)] channels. Use :t to access the private channel." +/obj/item/device/encryptionkey/syndicate/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "An encryption key that allows you to intercept comms and speak on private non-standard channels. Use :t to access the private channel." /obj/item/device/encryptionkey/raider icon_state = "cypherkey" @@ -232,11 +231,10 @@ desc = "An encryption key for a radio headset. Contains cypherkeys." additional_channels = list(CHANNEL_RAIDER = TRUE) origin_tech = list(TECH_ILLEGAL = 2) - desc_antag = "An encryption key that allows you to speak on private non-station channels. Use :x to access the private channel." -/obj/item/device/encryptionkey/rev/New() - ..() - desc_antag = "An encryption key that allows you to intercept comms and speak on private non-[station_name(TRUE)] channels. Use :t to access the private channel." +/obj/item/device/encryptionkey/rev/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "An encryption key that allows you to intercept private comms speak on private non-ship channels. Use :x to access the private channel." /obj/item/device/encryptionkey/eng_spare name = "spare engineering radio encryption key" diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 74cebf319a6..2044eb7f0db 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -23,6 +23,15 @@ drop_sound = 'sound/items/drop/component.ogg' pickup_sound = 'sound/items/pickup/component.ogg' +/obj/item/device/radio/headset/feedback_hints(mob/user, distance, is_adjacent) + . = list() + . = ..() + if(!(is_adjacent && radio_desc)) + return + + . += "The following channels are available:" + . += radio_desc + /obj/item/device/radio/headset/Initialize() . = ..() internal_channels.Cut() @@ -57,15 +66,6 @@ /obj/item/device/radio/headset/list_channels(var/mob/user) return list_secure_channels() -/obj/item/device/radio/headset/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - - if(!(is_adjacent && radio_desc)) - return - - . += "The following channels are available:" - . += radio_desc - /obj/item/device/radio/headset/setupRadioDescription() if(translate_binary || translate_hivenet) ..(", :+ - Special") @@ -201,17 +201,19 @@ /obj/item/device/radio/headset/alt/double name = "soundproof headset" desc = "A sound isolating version of the common radio headset." - desc_info = "This radio doubles as a pair of earmuffs by providing sound protection." icon = 'icons/obj/item/device/radio/headset_alt_double.dmi' icon_state = "earset" item_state = "earset" item_flags = ITEM_FLAG_SOUND_PROTECTION slot_flags = SLOT_EARS | SLOT_TWOEARS +/obj/item/device/radio/headset/alt/double/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This radio doubles as a pair of earmuffs by providing sound protection." + /obj/item/device/radio/headset/wrist name = "wristbound radio" desc = "A radio designed to fit on the wrist. Often known for broadcasting loudly enough that those closeby might overhear it." - desc_info = "This radio can be heard by people standing next to the one wearing it." icon = 'icons/obj/item/device/radio/headset_wrist.dmi' icon_state = "wristset" item_state = "wristset" @@ -220,6 +222,10 @@ var/mob_wear_layer = ABOVE_SUIT_LAYER_WR EarSound = FALSE +/obj/item/device/radio/headset/wrist/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This radio can be heard by people standing next to the one wearing it." + /obj/item/device/radio/headset/wrist/verb/change_layer() set category = "Object" set name = "Change Wrist Layer" @@ -243,7 +249,6 @@ /obj/item/device/radio/headset/wrist/clip name = "clip-on radio" desc = "A radio designed to clip onto your clothes. Often known for broadcasting loudly enough that those closeby might overhear it." - desc_info = "This radio can be heard by people standing next to the one wearing it." icon = 'icons/obj/item/device/radio/headset_clip.dmi' icon_state = "clip" item_state = "clip" @@ -864,13 +869,16 @@ /obj/item/device/radio/headset/earmuff name = "earmuffs" desc = "Protects your hearing from loud noises, and quiet ones as well." - desc_antag = "This set of earmuffs has a secret compartment housing radio gear, allowing it to function as a standard headset." icon = 'icons/obj/clothing/ears/earmuffs.dmi' icon_state = "earmuffs" item_state = "earmuffs" item_flags = ITEM_FLAG_SOUND_PROTECTION slot_flags = SLOT_EARS | SLOT_TWOEARS +/obj/item/device/radio/headset/earmuff/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This set of earmuffs has a secret compartment housing radio gear, allowing it to function as a standard headset." + /obj/item/device/radio/headset/syndicate name = "military headset" icon_state = "syn_headset" diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index fa358e3f056..5c9de85a56f 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -107,6 +107,21 @@ var/global/list/default_interrogation_channels = list( var/datum/radio_frequency/radio_connection var/list/datum/radio_frequency/secure_radio_connections = list() +/obj/item/device/radio/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(show_modify_on_examine && (distance <= 1)) + if (b_stat) + . += SPAN_NOTICE("\The [src] can be attached and modified!") + else + . += SPAN_NOTICE("\The [src] can not be modified or attached!") + + if(radio_desc) + . += radio_desc + +/obj/item/device/radio/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The radio key .i will allow you to speak into a nearby intercom, .r will speak into a radio in your right hand, and .l will speak into your left. The microphone does not need to be enabled for this to work." + /obj/item/device/radio/proc/set_frequency(new_frequency) SSradio.remove_object(src, frequency) if(new_frequency) @@ -529,15 +544,6 @@ var/global/list/default_interrogation_channels = list( return get_hearers_in_view(canhear_range, src) - -/obj/item/device/radio/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(show_modify_on_examine && (distance <= 1)) - if (b_stat) - . += SPAN_NOTICE("\The [src] can be attached and modified!") - else - . += SPAN_NOTICE("\The [src] can not be modified or attached!") - /obj/item/device/radio/attackby(obj/item/attacking_item, mob/user) ..() user.set_machine(src) diff --git a/code/game/objects/items/devices/radio_jammer.dm b/code/game/objects/items/devices/radio_jammer.dm index ec86ddd131b..72fceba8a78 100644 --- a/code/game/objects/items/devices/radio_jammer.dm +++ b/code/game/objects/items/devices/radio_jammer.dm @@ -19,7 +19,6 @@ GLOBAL_LIST_INIT_TYPED(active_radio_jammers, /obj/item/device/radiojammer, list( /obj/item/device/radiojammer name = "radio jammer" desc = "A small, inconspicious looking item with an 'ON/OFF' toggle." - desc_info = "Use in-hand to activate or deactivate, alt-click while adjacent or in-hand to toggle whether it blocks all wireless signals, or just stationbound wireless interfacing." icon = 'icons/obj/item/device/chameleon.dmi' icon_state = "shield0" item_state = "electronic" @@ -29,6 +28,11 @@ GLOBAL_LIST_INIT_TYPED(active_radio_jammers, /obj/item/device/radiojammer, list( var/icon_state_active = "shield1" var/icon_state_inactive = "shield0" +/obj/item/device/radiojammer/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use in-hand to activate or deactivate." + . += "Alt-click while adjacent or in-hand to toggle whether it blocks all signals or just stationbound wireless interfacing." + /obj/item/device/radiojammer/active active = JAMMER_ALL @@ -93,7 +97,6 @@ GLOBAL_LIST_INIT_TYPED(active_radio_jammers, /obj/item/device/radiojammer, list( /obj/item/device/radiojammer/improvised name = "improvised radio jammer" desc = "An awkward bundle of wires, batteries, and radio transmitters." - desc_info = "Use in-hand to activate or deactivate." var/obj/item/cell/cell var/obj/item/device/assembly_holder/assembly_holder // 10 seconds of operation on a standard cell. 200 (roughly 3 minutes) on a super cap. @@ -104,6 +107,9 @@ GLOBAL_LIST_INIT_TYPED(active_radio_jammers, /obj/item/device/radiojammer, list( icon_state = "improvised_jammer_inactive" icon_state_active = "improvised_jammer_active" +/obj/item/device/radiojammer/improvised/mechanics_hints(mob/user, distance, is_adjacent) + . = list() + . += "Use in-hand to activate or deactivate." /obj/item/device/radiojammer/improvised/New(var/obj/item/device/assembly_holder/incoming_holder, var/obj/item/cell/incoming_cell, var/mob/user) ..() diff --git a/code/game/objects/items/devices/slide_projector.dm b/code/game/objects/items/devices/slide_projector.dm index 71d5af37304..d499a996151 100644 --- a/code/game/objects/items/devices/slide_projector.dm +++ b/code/game/objects/items/devices/slide_projector.dm @@ -1,7 +1,6 @@ /obj/item/storage/slide_projector name = "slide projector" desc = "A handy device capable of showing an enlarged projection of whatever you can fit inside." - desc_info = "You can use this in hand to open the interface, click-dragging it to you also works. Click anywhere with it in your hand to project at that location. Click dragging it to that location also works." icon = 'icons/obj/projector.dmi' icon_state = "projector0" max_w_class = WEIGHT_CLASS_SMALL @@ -15,6 +14,11 @@ var/obj/item/current_slide var/obj/effect/projection/projection +/obj/item/storage/slide_projector/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can use this in-hand or click-drag it to yourself to to open its interface." + . += "Click anywhere with it in your hand, or click-drag it, to project at that location." + /obj/item/storage/slide_projector/Destroy() QDEL_NULL(current_slide) QDEL_NULL(projection) diff --git a/code/game/objects/items/devices/spy_bug.dm b/code/game/objects/items/devices/spy_bug.dm index c7c2a96aae9..ec353217649 100644 --- a/code/game/objects/items/devices/spy_bug.dm +++ b/code/game/objects/items/devices/spy_bug.dm @@ -19,18 +19,23 @@ var/obj/item/device/radio/spy/radio var/obj/machinery/camera/spy/camera +/obj/item/device/spy_bug/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 0) + . += "Needs to be both configured and brought in contact with monitor device to be fully functional." + . += "A pen can be used to label the device on a given network." + +/obj/item/device/spy_bug/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 0) + . += "It's a tiny camera, microphone, and transmission device in a happy union." + /obj/item/device/spy_bug/New() ..() radio = new(src) camera = new(src) become_hearing_sensitive(ROUNDSTART_TRAIT) -/obj/item/device/spy_bug/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 0) - . += "It's a tiny camera, microphone, and transmission device in a happy union." - . += "Needs to be both configured and brought in contact with monitor device to be fully functional. A pen can also be used to label the device on a given network." - /obj/item/device/spy_bug/attack_self(mob/user) radio.set_broadcasting(!radio.get_broadcasting()) to_chat(user, "\The [src]'s radio is [radio.get_broadcasting() ? "broadcasting" : "not broadcasting"] now. The current frequency is [radio.get_frequency()].") @@ -73,15 +78,15 @@ var/obj/machinery/camera/spy/selected_camera var/list/obj/machinery/camera/spy/cameras = new() +/obj/item/device/spy_monitor/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + . += "The time '12:00' is blinking in the corner of the screen and \the [src] looks very cheaply made." + /obj/item/device/spy_monitor/New() radio = new(src) become_hearing_sensitive(ROUNDSTART_TRAIT) -/obj/item/device/spy_monitor/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += "The time '12:00' is blinking in the corner of the screen and \the [src] looks very cheaply made." - /obj/item/device/spy_monitor/attack_self(mob/user) if(operating) return diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm index bdcd8ab016e..296cb0c06b6 100644 --- a/code/game/objects/items/devices/suit_cooling.dm +++ b/code/game/objects/items/devices/suit_cooling.dm @@ -29,6 +29,35 @@ //TODO: make it heat up the surroundings when not in space +/obj/item/device/suit_cooling_unit/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + + if(!distance <= 1) + return + + if(on) + if(attached_to_suit(src.loc)) + . += SPAN_NOTICE("It's switched on and running.") + else if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(H.species.flags & ACCEPTS_COOLER) + . += SPAN_NOTICE("It's switched on and running, connected to the cooling systems of [H].") + else + . += SPAN_NOTICE("It's switched on, but not attached to anything.") + else + . += SPAN_NOTICE("It is switched off.") + + if(cover_open) + if(cell) + . += SPAN_NOTICE("The panel is open, exposing \the [cell].") + else + . += SPAN_NOTICE("The panel is open.") + + if(cell) + . += SPAN_NOTICE("The charge meter reads [round(cell.percent())]%.") + else + . += SPAN_NOTICE("It doesn't have a power cell installed.") + /obj/item/device/suit_cooling_unit/Initialize() . = ..() if(celltype) @@ -212,34 +241,5 @@ M.update_inv_back() M.update_inv_s_store() -/obj/item/device/suit_cooling_unit/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - - if(!distance <= 1) - return - - if(on) - if(attached_to_suit(src.loc)) - . += SPAN_NOTICE("It's switched on and running.") - else if(ishuman(loc)) - var/mob/living/carbon/human/H = loc - if(H.species.flags & ACCEPTS_COOLER) - . += SPAN_NOTICE("It's switched on and running, connected to the cooling systems of [H].") - else - . += SPAN_NOTICE("It's switched on, but not attached to anything.") - else - . += SPAN_NOTICE("It is switched off.") - - if(cover_open) - if(cell) - . += SPAN_NOTICE("The panel is open, exposing \the [cell].") - else - . += SPAN_NOTICE("The panel is open.") - - if(cell) - . += SPAN_NOTICE("The charge meter reads [round(cell.percent())]%.") - else - . += SPAN_NOTICE("It doesn't have a power cell installed.") - /obj/item/device/suit_cooling_unit/no_cell celltype = null diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index 604a6e4dd79..86f04ac3365 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -10,6 +10,11 @@ var/obj/machinery/camera/network/news/camera var/obj/item/device/radio/radio +/obj/item/device/tvcamera/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Video feed is currently: [camera.status ? "Online" : "Offline"]" + . += "Audio feed is currently: [radio.get_broadcasting() ? "Online" : "Offline"]" + /obj/item/device/tvcamera/Destroy() GLOB.listening_objects -= src QDEL_NULL(camera) @@ -26,11 +31,6 @@ GLOB.listening_objects += src . = ..() -/obj/item/device/tvcamera/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "Video feed is currently: [camera.status ? "Online" : "Offline"]" - . += "Audio feed is currently: [radio.get_broadcasting() ? "Online" : "Offline"]" - /obj/item/device/tvcamera/attack_self(mob/user) add_fingerprint(user) user.set_machine(src) diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index dec71964bfb..2386e4c238b 100644 --- a/code/game/objects/items/devices/uplink.dm +++ b/code/game/objects/items/devices/uplink.dm @@ -399,9 +399,12 @@ Then check if it's true, if true return. This will stop the normal menu appearin icon = 'icons/obj/item/device/gps.dmi' icon_state = "gps" item_state = "radio" - desc_antag = "This device allows you to create a single central command report. It has only one use." w_class = WEIGHT_CLASS_SMALL +/obj/item/device/announcer/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This device allows you to create a single Central Command report. It has only one use." + /obj/item/device/announcer/attack_self(mob/user as mob) if(!player_is_antag(user.mind)) return @@ -421,7 +424,6 @@ Then check if it's true, if true return. This will stop the normal menu appearin /obj/item/device/special_uplink name = "special uplink" desc = "A small device with knobs and switches." - desc_antag = "This is hidden uplink! Use it in-hand to access the uplink interface and spend telecrystals to beam in items. Make sure to do it in private, it could look suspicious!" icon = 'icons/obj/radio.dmi' icon_state = "radio" obj_flags = OBJ_FLAG_CONDUCTABLE @@ -433,6 +435,11 @@ Then check if it's true, if true return. This will stop the normal menu appearin ///Amount of starting bluecrystals, used to buy support/medical/gimmick items. Defaults to default amount if not set. var/starting_bluecrystals +/obj/item/device/special_uplink/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is hidden uplink! Use it in-hand to access the uplink interface and spend telecrystals to beam in items." + . += "Take care to only use it in private; it could look suspicious." + /obj/item/device/special_uplink/New(var/loc, var/mind) ..() hidden_uplink = new(src, mind) diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 6035e09e342..8f584892da2 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -14,7 +14,6 @@ /obj/item/glass_jar name = "glass jar" desc = "A glass jar. Does not contain brain submerged in formaldehyde." - desc_info = "Can be used to hold money, small animals, and gumballs. You can remove the lid and use it as a reagent container." icon = 'icons/obj/item/reagent_containers/glass.dmi' icon_state = "jar_lid" w_class = WEIGHT_CLASS_SMALL @@ -26,6 +25,10 @@ drop_sound = 'sound/items/drop/glass.ogg' pickup_sound = 'sound/items/pickup/glass.ogg' +/obj/item/glass_jar/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Can be used to hold money, small animals, and gumballs. You can remove the lid and use it as a reagent container." + /obj/item/glass_jar/New() ..() update_icon() diff --git a/code/game/objects/items/holomenu.dm b/code/game/objects/items/holomenu.dm index 623e5756d8f..e02b4e5f428 100644 --- a/code/game/objects/items/holomenu.dm +++ b/code/game/objects/items/holomenu.dm @@ -1,7 +1,6 @@ /obj/item/holomenu name = "holo-menu" desc = "A hologram projector, this one has been set up to display text above itself." - desc_info = "If you have bar or kitchen access, you can swipe your ID on this to root it in place, then you can click on it with an empty hand to adjust its text. Alt-clicking it will toggle its border." icon = 'icons/obj/holomenu.dmi' icon_state = "holomenu" @@ -20,6 +19,11 @@ var/image/holo_text var/image/holo_border +/obj/item/holomenu/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "If you have bar or kitchen access, you can swipe your ID on this to root it in place, then you can click on it with an empty hand to adjust its text." + . += "Alt-clicking it will toggle its border." + /obj/item/holomenu/Initialize() . = ..() holo_lights = image(icon, null, "holomenu-lights") @@ -128,13 +132,17 @@ /obj/item/holomenu/holodeck name = "holodeck status projector" desc = "A hologram projector, this one has been set up to display text." - desc_info = "You can click on this with paper in hand to display text, or you can click on it with an empty hand to adjust its text. Alt-clicking it will toggle its border." icon = 'icons/obj/holomenu_holodeck.dmi' anchored = 1 layer = 4 req_one_access = list() +/obj/item/holomenu/holodeck/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "If you have bar or kitchen access, you can click on this with paper in hand to display text, or you can click on it with an empty hand to adjust its text." + . += "Alt-clicking it will toggle its border." + /obj/item/holomenu/holodeck/attack_hand(mob/user) var/new_text = sanitize(input(user, "Enter new text for the hologram to display.", "Hologram Display", html2pencode(menu_text, TRUE)) as null|message) if(!isnull(new_text)) diff --git a/code/game/objects/items/ipc_overloaders.dm b/code/game/objects/items/ipc_overloaders.dm index 1c66803d85f..6f8bdecbfab 100644 --- a/code/game/objects/items/ipc_overloaders.dm +++ b/code/game/objects/items/ipc_overloaders.dm @@ -22,6 +22,14 @@ TRAIT_OVERLOADER_OD_MEDIUM = TRAIT_OVERLOADER_OD_INITIAL ) +/obj/item/ipc_overloader/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + if(uses) + . += SPAN_NOTICE("It has [uses] uses left.") + else + . += SPAN_WARNING("It's totally spent.") + /obj/item/ipc_overloader/Initialize() . = ..() item_state = icon_state @@ -34,14 +42,6 @@ else icon_state = "[initial(icon_state)]-[initial(uses)-uses]" -/obj/item/ipc_overloader/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(uses) - . += SPAN_NOTICE("It has [uses] uses left.") - else - . += SPAN_WARNING("It's totally spent.") - // Jabbing yourself with an overloader. /obj/item/ipc_overloader/attack_self(mob/user) if(!uses) @@ -357,16 +357,16 @@ pickup_sound = 'sound/items/pickup/backpack.ogg' var/sealed = TRUE -/obj/item/storage/overloader/Initialize(mapload, defer_shrinkwrap) - icon_state = "box" - return ..() - -/obj/item/storage/overloader/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/storage/overloader/feedback_hints(mob/user, distance, is_adjacent) + . += ..() var/obj/item/ipc_overloader/overloader = locate() in contents if(overloader) . += SPAN_NOTICE("This one has a [overloader.name] inside.") +/obj/item/storage/overloader/Initialize(mapload, defer_shrinkwrap) + icon_state = "box" + return ..() + /obj/item/storage/overloader/open(mob/user) ..() sealed = FALSE diff --git a/code/game/objects/items/knitting.dm b/code/game/objects/items/knitting.dm index 94b62c18aff..37f7a5485e6 100644 --- a/code/game/objects/items/knitting.dm +++ b/code/game/objects/items/knitting.dm @@ -11,6 +11,12 @@ var/static/list/knitables = list(/obj/item/clothing/accessory/sweater, /obj/item/clothing/suit/storage/toggle/cardigan, /obj/item/clothing/suit/storage/toggle/cardigan/sweater, /obj/item/clothing/suit/storage/toggle/cardigan/argyle, /obj/item/clothing/accessory/sweater/vest, /obj/item/clothing/accessory/sweater/turtleneck, /obj/item/clothing/gloves/fingerless/colour/knitted, /obj/item/clothing/gloves/knitted, /obj/item/clothing/accessory/bandanna/colorable/knitted, /obj/item/clothing/accessory/scarf, /obj/item/clothing/accessory/shawl) var/static/list/name2knit +/obj/item/knittingneedles/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + if(ball) + . += "There is \the [ball] between the needles." + /obj/item/knittingneedles/verb/remove_yarn() set name = "Remove Yarn" set category = "Object" @@ -39,12 +45,6 @@ QDEL_NULL(ball) return ..() -/obj/item/knittingneedles/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(ball) - . += "There is \the [ball] between the needles." - /obj/item/knittingneedles/update_icon() if(working) icon_state = "knittingneedles_on" diff --git a/code/game/objects/items/paintkit.dm b/code/game/objects/items/paintkit.dm index f69551ec4e7..47f58cd5660 100644 --- a/code/game/objects/items/paintkit.dm +++ b/code/game/objects/items/paintkit.dm @@ -8,9 +8,9 @@ var/new_icon_file var/uses = 1 // Uses before the kit deletes itself. -/obj/item/device/kit/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It has [uses] use\s left." +/obj/item/device/kit/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It has [uses] use\s left." /obj/item/device/kit/use(var/amt, var/mob/user) uses -= amt diff --git a/code/game/objects/items/recharger_backpack.dm b/code/game/objects/items/recharger_backpack.dm index 07e0375c0aa..b1e707d3d8d 100644 --- a/code/game/objects/items/recharger_backpack.dm +++ b/code/game/objects/items/recharger_backpack.dm @@ -12,6 +12,11 @@ ///The gun we're currently recharging. Connection handled in connect() and /obj/item/gun/energy/connect() var/obj/item/gun/energy/connected +/obj/item/recharger_backpack/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(powersupply) + . += SPAN_NOTICE("The backpack display shows that the installed power cell is at [round(powersupply.percent())]%.") + /obj/item/recharger_backpack/Initialize() . = ..() //To update the icon based on the power cell charge we spawn with @@ -25,11 +30,6 @@ . = ..() -/obj/item/recharger_backpack/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(powersupply) - . += SPAN_NOTICE("The backpack display shows that the installed power cell is at [round(powersupply.percent())]%.") - /obj/item/recharger_backpack/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/cell) && !powersupply) to_chat(usr, SPAN_NOTICE("You slot \the [attacking_item] into \the [src]'s power socket.")) diff --git a/code/game/objects/items/science_sampler.dm b/code/game/objects/items/science_sampler.dm index c54c5178645..60a8529aeeb 100644 --- a/code/game/objects/items/science_sampler.dm +++ b/code/game/objects/items/science_sampler.dm @@ -8,7 +8,6 @@ researchers to take a variety of samples, ranging from plant and animal tissue to soil or water samples, compacted into \ a single handheld device. It became widely popular even among rival corporations and independant research groups, with \ its versatility and compact nature making it the tool-of-choice for almost every modern scientific expedition." - desc_info = "It has attachments allowing for sampling of biological tissue, surface soil and water sources. Must be loaded with a vial. Alt-click to cycle between attachments." icon = 'icons/obj/item/sampling.dmi' icon_state = "sampler" item_state = "sampler" @@ -23,6 +22,10 @@ */ var/obj/item/reagent_containers/glass/beaker/vial/vial +/obj/item/sampler/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It has attachments allowing for sampling of biological tissue, surface soil and water sources. Must be loaded with a vial. Alt-click to cycle between attachments." + /obj/item/sampler/Initialize(mapload, ...) . = ..() update_icon() diff --git a/code/game/objects/items/skrell.dm b/code/game/objects/items/skrell.dm index 434dbf2a518..f468ba7013d 100644 --- a/code/game/objects/items/skrell.dm +++ b/code/game/objects/items/skrell.dm @@ -11,14 +11,14 @@ var/selected_constellation var/projection_ready = TRUE +/obj/item/stellascope/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "\The [src] displays the \"[selected_constellation]\"." + /obj/item/stellascope/Initialize() . = ..() pick_constellation() -/obj/item/stellascope/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "\The [src] displays the \"[selected_constellation]\"." - /obj/item/stellascope/throw_impact(atom/hit_atom) ..() visible_message(SPAN_NOTICE("\The [src] lands on \the [pick_constellation()].")) @@ -89,15 +89,15 @@ var/working = FALSE var/message_frequency = 5 +/obj/item/skrell_projector/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(selected_world && working) + . += "\The [src] displays a hologram of [selected_world]." + /obj/item/skrell_projector/Destroy() STOP_PROCESSING(SSprocessing, src) return ..() -/obj/item/skrell_projector/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(selected_world && working) - . += "\The [src] displays a hologram of [selected_world]." - /obj/item/skrell_projector/attack_self(mob/user as mob) working = !working diff --git a/code/game/objects/items/spirit_board.dm b/code/game/objects/items/spirit_board.dm index 9fe32ac7ecf..081353224c7 100644 --- a/code/game/objects/items/spirit_board.dm +++ b/code/game/objects/items/spirit_board.dm @@ -7,8 +7,8 @@ var/planchette = "A" var/lastuser = null -/obj/item/spirit_board/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/spirit_board/feedback_hints(mob/user, distance, is_adjacent) + . += ..() . += "The planchette is sitting at \"[planchette]\"." /obj/item/spirit_board/attack_hand(mob/user) diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm index c24f28cdc36..f73df6c6fe4 100644 --- a/code/game/objects/items/stacks/rods.dm +++ b/code/game/objects/items/stacks/rods.dm @@ -18,8 +18,6 @@ GLOBAL_LIST_INIT_TYPED(rod_recipes, /datum/stack_recipe, list( /obj/item/stack/rods name = "metal rod" desc = "Some rods. Can be used for building, or something." - desc_info = "Made from metal sheets. You can build a grille by using it in your hand. \ - Clicking on a floor without any tiles will reinforce the floor. You can make reinforced glass by combining rods and normal glass sheets." singular_name = "metal rod" icon_state = "rods" obj_flags = OBJ_FLAG_CONDUCTABLE @@ -38,6 +36,17 @@ GLOBAL_LIST_INIT_TYPED(rod_recipes, /datum/stack_recipe, list( stacktype = /obj/item/stack/rods icon_has_variants = TRUE +/obj/item/stack/rods/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click this item in-hand to view its crafting menu." + . += "Left-clicking with this item on a floor without any tiles will reinforce the floor." + . += "Combining this item with glass sheets will create reinforced glass." + +/obj/item/stack/rods/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Combining this item with glass sheets will create reinforced glass." + . += "Using a welder on two metal rods will recombine them back into a steel sheet." + /obj/item/stack/rods/Destroy() . = ..() GC_TEMPORARY_HARDDEL @@ -106,6 +115,10 @@ GLOBAL_LIST_INIT_TYPED(rod_recipes, /datum/stack_recipe, list( matter = list(DEFAULT_WALL_MATERIAL = 937.5) attack_verb = list("hit", "whacked", "sliced") +/obj/item/stack/barbed_wire/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click with this on a barricade to apply barbed wire to it." + /obj/item/stack/barbed_wire/half_full amount = 25 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 83f22b4d744..8dab24a86da 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -14,7 +14,6 @@ /obj/item/stack/material/glass name = "glass" singular_name = "glass sheet" - desc_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets." icon_state = "sheet-glass" var/created_window = /obj/structure/window/basic var/is_reinforced = 0 @@ -24,6 +23,14 @@ drop_sound = 'sound/items/drop/glass.ogg' pickup_sound = 'sound/items/pickup/glass.ogg' +/obj/item/stack/material/glass/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click this item in-hand to view its crafting menu." + +/obj/item/stack/material/glass/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Combining this item with metal rods will create reinforced glass." + /obj/item/stack/material/glass/attack_self(mob/user as mob) construct_window(user) @@ -103,7 +110,6 @@ */ /obj/item/stack/material/glass/reinforced name = "reinforced glass" - desc_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage." singular_name = "reinforced glass sheet" icon_state = "sheet-rglass" default_type = "reinforced glass" diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index 36ea18f4833..e8d172b43b1 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -10,6 +10,11 @@ var/bare = FALSE //is this hair devoid of fur, hair, scales, carapace? Prevents re-stripping. Can also apply it to a hide type if we don't want to tan, like, xeno hide. var/hide_type = "hair" //type of skin this animal has; scales for lizard, carapace for xeno. +/obj/item/stack/material/animalhide/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(bare) + . += "You could use a bladed item on this to scrape it clean, the first step in creating leather sheets." + /obj/item/stack/material/animalhide/human name = "human skin" desc = "The by-product of human farming." @@ -52,16 +57,18 @@ /obj/item/stack/material/animalhide/barehide name = "bare hide" desc = "A hide without fur or scales. Can be tanned into leather." - desc_info = "You can put this into a washing machine to make wet leather, which is the first step in making it into leather sheets." singular_name = "bare hide piece" icon_state = "sheet-hairlesshide" default_type = "bare hide" bare = TRUE +/obj/item/stack/material/animalhide/barehide/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can put this into a washing machine to make wet leather, another key step in making it into leather sheets." + /obj/item/stack/material/animalhide/wetleather name = "wet leather" desc = "This leather has been cleaned but still needs to be dried." - desc_info = "This can be dried into high-quality fine leather by exposing it to a fire of a sufficient temperature, or manually with a welding tool. You don't need eye protection for the welding tool." singular_name = "wet leather piece" icon_state = "sheet-wetleather" default_type = "wet leather" @@ -71,12 +78,15 @@ var/drying_threshold_temperature = 500 //Kelvin to start drying from exposed fire. var/being_dried = FALSE //If we're manually drying this. +/obj/item/stack/material/animalhide/wetleather/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This can be dried into high-quality fine leather by exposing it to a fire of a sufficient temperature, or manually with a welding tool. You don't need eye protection for the welding tool." + //Wet leather can't be used to make things. Too soggy. /obj/item/stack/material/animalhide/wetleather/list_recipes(mob/user, recipes_sublist, var/datum/stack_recipe/sublist) to_chat(user, SPAN_WARNING("\The [src] isn't suitable for crafting!")) return - //Animal Hide to leather steps //Step one - dehairing. /obj/item/stack/material/animalhide/attackby(obj/item/attacking_item, mob/user) diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index 72d84a1e91e..a714008d934 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -32,6 +32,15 @@ slot_r_hand_str = 'icons/mob/items/stacks/righthand_materials.dmi', ) +/obj/item/stack/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + if(!iscoil()) + if(!uses_charge) + . += "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s in the stack." + else + . += "You have enough charge to produce [get_amount()]." + /obj/item/stack/Initialize(mapload, amount) . = ..() if (!stacktype) @@ -71,15 +80,6 @@ else icon_state = "[initial(icon_state)]_3" -/obj/item/stack/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(!iscoil()) - if(!uses_charge) - . += "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s in the stack." - else - . += "You have enough charge to produce [get_amount()]." - /obj/item/stack/attack_self(mob/user) list_recipes(user, recipes) diff --git a/code/game/objects/items/stacks/telecrystal.dm b/code/game/objects/items/stacks/telecrystal.dm index cd2d3fc5cf3..7eb77201608 100644 --- a/code/game/objects/items/stacks/telecrystal.dm +++ b/code/game/objects/items/stacks/telecrystal.dm @@ -4,7 +4,6 @@ /obj/item/stack/telecrystal name = "telecrystal" desc = "It seems to be pulsing with suspiciously enticing energies." - desc_antag = "Crystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks." singular_name = "telecrystal" icon_state = "telecrystal" w_class = WEIGHT_CLASS_TINY @@ -14,6 +13,10 @@ icon_has_variants = TRUE var/crystal_type = CRYSTAL_TYPE_TELECRYSTAL +/obj/item/stack/telecrystal/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Crystals can be activated by utilizing them on devices with an actively running uplink. They will not activate on unactivated uplinks." + /obj/item/stack/telecrystal/five/Initialize() . = ..() amount = 5 diff --git a/code/game/objects/items/stacks/wrap.dm b/code/game/objects/items/stacks/wrap.dm index 8ad2864f100..0d18ea1627c 100644 --- a/code/game/objects/items/stacks/wrap.dm +++ b/code/game/objects/items/stacks/wrap.dm @@ -1,7 +1,6 @@ /obj/item/stack/wrapping_paper name = "wrapping paper" desc = "You can use this to wrap items in." - desc_info = "To wrap something into a gift, click on the wrapping paper that's not in your hands with the object you wish to wrap." icon = 'icons/obj/item/stacks/wrap.dmi' item_icons = list( slot_l_hand_str = 'icons/mob/items/stacks/lefthand_wrap.dmi', @@ -13,6 +12,15 @@ drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' +/obj/item/stack/wrapping_paper/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To wrap something into a gift, click on the wrapping paper that's not in your hands with the object you wish to wrap." + +/obj/item/stack/wrapping_paper/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + . += "There [amount == 1 ? "is" : "are"] about [amount] [singular_name]\s of paper left!" + /obj/item/stack/wrapping_paper/attackby(obj/item/attacking_item, mob/user) ..() if (isrobot(user)) @@ -61,11 +69,6 @@ to_chat(user, SPAN_WARNING("This object is far too large to wrap!")) return -/obj/item/stack/wrapping_paper/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += "There [amount == 1 ? "is" : "are"] about [amount] [singular_name]\s of paper left!" - /obj/item/stack/wrapping_paper/attack(mob/living/target_mob, mob/living/user, target_zone) if(!ishuman(target_mob)) return @@ -100,7 +103,6 @@ ) icon_state = "deliveryPaper" desc = "A roll of paper used to enclose an object for delivery." - desc_info = "To package wrap the object for delivery, use the package wrapper on the object." singular_name = "length" w_class = WEIGHT_CLASS_NORMAL amount = 30 @@ -108,6 +110,10 @@ drop_sound = 'sound/items/drop/wrapper.ogg' pickup_sound = 'sound/items/pickup/wrapper.ogg' +/obj/item/stack/packageWrap/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To package wrap the object for delivery, use the package wrapper on the object." + /obj/item/stack/packageWrap/afterattack(var/obj/target, mob/user, proximity) // VTD: Need to make it ask if you want to wrap boxes if(!proximity) return diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index f93beca1e55..01961ce5e1c 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -107,7 +107,6 @@ /obj/item/toy/balloon name = "balloon" - desc_info = "You can fill it up with gas using a tank." desc_extended = "Thanks to the joint effort of the Research and Atmospherics teams, station enviroments have been set to allow balloons to float without helium. Look, it was the end of the month and we went under budget." drop_sound = 'sound/items/drop/rubber.ogg' pickup_sound = 'sound/items/pickup/rubber.ogg' @@ -115,6 +114,10 @@ var/datum/gas_mixture/air_contents = null var/status = 0 // 0 = normal, 1 = blow, 2 = burst +/obj/item/toy/balloon/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can fill it up with different gases using a tank." + /obj/item/toy/balloon/attack_self(mob/user as mob) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) if(user.a_intent == I_HELP) @@ -456,10 +459,10 @@ attack_verb = list("attacked", "struck", "hit") var/dart_count = 5 -/obj/item/toy/crossbow/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/toy/crossbow/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance <= 2 && dart_count) - . += SPAN_NOTICE("\The [src] is loaded with [dart_count] foam dart\s.") + . += "\The [src] is loaded with [dart_count] foam dart\s." /obj/item/toy/crossbow/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/toy/ammo/crossbow)) @@ -471,7 +474,6 @@ else to_chat(usr, SPAN_WARNING("\The [src] is already fully loaded.")) - /obj/item/toy/crossbow/afterattack(atom/target, mob/user, flag) if(!isturf(target.loc) || target == user) return @@ -670,8 +672,9 @@ playsound(get_turf(src), 'sound/effects/snap.ogg', 50, TRUE) qdel(src) -/obj/item/toy/snappop/syndi - desc_antag = "These snap pops have an extra compound added that will deploy a tiny smokescreen when snapped." +/obj/item/toy/snappop/syndi/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "These snap pops have an extra compound added that will deploy a tiny smokescreen when snapped." /obj/item/toy/snappop/syndi/do_pop() var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread @@ -1374,7 +1377,7 @@ /obj/item/toy/aurora name = "aurora miniature" desc = "A miniature of a space station, built into an asteroid. A tiny suspension field keeps it afloat. A small plaque on the front reads: NSS Aurora, Tau Ceti, Romanovich Cloud, 2464. Onward to new horizons." - desc_info = "This miniature was given out on the 9th of April 2464 to all former crew members of the Aurora as a memento, before setting off to their new mission on the SCCV Horizon." + desc_extended = "This miniature was given out on the 9th of April 2464 to all former crew members of the Aurora as a memento, before setting off to their new mission on the SCCV Horizon." icon_state = "aurora" /obj/item/toy/adhomian_map @@ -1385,10 +1388,15 @@ /obj/item/toy/ringbell name = "ringside bell" desc = "A bell used to signal the beginning and end of various ring sports." - desc_info = "Use help intent on the bell to signal the start of a contest\ndisarm intent to signal the end of a contest and\nharm intent to signal a disqualification." icon_state = "ringbell" anchored = TRUE +/obj/item/toy/ringbell/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use Help intent on the bell to signal the start of a contest." + . += "Use the Disarm intent to signal the end of a contest." + . += "Use the Harm intent to signal a disqualification." + /obj/item/toy/ringbell/attack_hand(mob/user) switch(user.a_intent) if (I_HELP) diff --git a/code/game/objects/items/weapons/RFD.dm b/code/game/objects/items/weapons/RFD.dm index 53a67b085dd..da72335089d 100644 --- a/code/game/objects/items/weapons/RFD.dm +++ b/code/game/objects/items/weapons/RFD.dm @@ -58,6 +58,11 @@ ABSTRACT_TYPE(/obj/item/rfd) var/build_delay var/last_fail = 0 +/obj/item/rfd/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(loc == user) + . += "It currently holds [stored_matter]/30 matter units." + /obj/item/rfd/Initialize() . = ..() return INITIALIZE_HINT_LATELOAD @@ -72,11 +77,6 @@ ABSTRACT_TYPE(/obj/item/rfd) /obj/item/rfd/proc/can_use(var/mob/user,var/turf/T) return (user.Adjacent(T) && user.get_active_hand() == src && !user.stat && !user.restrained()) -/obj/item/rfd/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(loc == user) - . += "It currently holds [stored_matter]/30 matter units." - /obj/item/rfd/attack_self(mob/user) //Change the mode if(++mode > number_of_modes) @@ -508,6 +508,10 @@ ABSTRACT_TYPE(/obj/item/rfd) icon_state = "rfd-m" item_state = "rfd-m" +/obj/item/rfd/mining/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_WARNING("The printed mining units have to either be placed down in order, or linked manually after deployment.") + /obj/item/rfd/mining/Initialize() . = ..() @@ -596,7 +600,6 @@ ABSTRACT_TYPE(/obj/item/rfd) to_chat(user, SPAN_NOTICE("You deploy \a [mode] on \the [target].")) update_icon() - //In case of success, consume the resources if(isrobot(user)) var/mob/living/silicon/robot/R = user @@ -608,10 +611,6 @@ ABSTRACT_TYPE(/obj/item/rfd) return TRUE -/obj/item/rfd/mining/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += FONT_SMALL(SPAN_WARNING("The printed mining units have to either be placed down in order, or linked manually after deployment.")) - #undef RFD_MINING_MODE_MINE_TRACK #undef RFD_MINING_MODE_MINE_CART #undef RFD_MINING_MODE_MINE_CART_ENGINE @@ -625,17 +624,17 @@ ABSTRACT_TYPE(/obj/item/rfd) stored_matter = 30 var/malftransformermade = 0 -/obj/item/rfd/transformer/attack_self(mob/user) - return - -/obj/item/rfd/transformer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/rfd/transformer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(loc == user) if(malftransformermade) . += "There is already a transformer machine made!" else . += "It is ready to deploy a transformer machine." +/obj/item/rfd/transformer/attack_self(mob/user) + return + /obj/item/rfd/transformer/afterattack(atom/A, mob/user as mob, proximity) if(!proximity) return @@ -761,11 +760,15 @@ ABSTRACT_TYPE(/obj/item/rfd) "Omni Gas Filter" = PIPE_OMNI_FILTER ) -/obj/item/rfd/piping/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += FONT_SMALL(SPAN_NOTICE("Change pipe category by ALT-clicking, change pipe selection by using in-hand.")) - . += SPAN_NOTICE("Selected pipe category: [selected_mode].") - . += SPAN_NOTICE("Selected pipe: [pipe_examine].") +/obj/item/rfd/piping/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use in-hand to change pipe selection." + . += "ALT-click to change pipe category." + +/obj/item/rfd/piping/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Selected pipe category: [selected_mode]." + . += "Selected pipe: [pipe_examine]." /obj/item/rfd/piping/afterattack(atom/A, mob/user, proximity) if(!proximity || !isturf(A)) diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm index 058a698756d..adc4e7084f7 100644 --- a/code/game/objects/items/weapons/cards_ids.dm +++ b/code/game/objects/items/weapons/cards_ids.dm @@ -686,10 +686,13 @@ /obj/item/card/id/bluespace name = "bluespace identification card" desc = "A bizarre imitation of an ID card; shifting and moving." - desc_antag = "Access can be copied from other ID cards by clicking on them." icon_state = "crystalid" iff_faction = IFF_BLUESPACE +/obj/item/card/id/bluespace/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Access can be copied from other ID cards by clicking on them." + /obj/item/card/id/bluespace/update_name() return diff --git a/code/game/objects/items/weapons/cards_ids_syndicate.dm b/code/game/objects/items/weapons/cards_ids_syndicate.dm index d07e5b44fc8..cc4dce08183 100644 --- a/code/game/objects/items/weapons/cards_ids_syndicate.dm +++ b/code/game/objects/items/weapons/cards_ids_syndicate.dm @@ -10,6 +10,12 @@ var/image/obfuscation_image var/mob/registered_user = null +/obj/item/card/id/syndicate/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + if(user == registered_user) + . += SPAN_NOTICE("It is at [charge]/[initial(charge)] charge.") + /obj/item/card/id/syndicate/New(mob/user as mob) ..() access = GLOB.syndicate_access.Copy() @@ -20,12 +26,6 @@ unset_registered_user(registered_user) return ..() -/obj/item/card/id/syndicate/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(user == registered_user) - . += FONT_SMALL(SPAN_NOTICE("It is at [charge]/[initial(charge)] charge.")) - /obj/item/card/id/syndicate/process() if(electronic_warfare) charge = max(0, charge - 50) diff --git a/code/game/objects/items/weapons/cards_tech_support.dm b/code/game/objects/items/weapons/cards_tech_support.dm index ef211c76faf..8cec077cdb4 100644 --- a/code/game/objects/items/weapons/cards_tech_support.dm +++ b/code/game/objects/items/weapons/cards_tech_support.dm @@ -1,7 +1,12 @@ /obj/item/card/tech_support name = "tech support card" desc = "A card with a soft metallic sheen. Embedded within is a registered RFID chip." - desc_info = "Use this on a modular computer to reset it to its original state. Use it on a hard drive to wipe it. Use it on a laptop vendor during the payment phase to vend the device." icon_state = "data" item_state = "card-id" overlay_state = "data" + +/obj/item/card/tech_support/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Using this on a modular computer will reset it to its original state." + . += "Using this on a hard drive will wipe it." + . += "Use this on a laptop vendor during the payment phase to vend the device." diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 1d68c9dfcca..7358b5c3881 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -1040,14 +1040,14 @@ ABSTRACT_TYPE(/obj/item/clothing/mask/smokable) icon_on = "cigrollon" icon_off = "cigrolloff" -/obj/item/trash/cigbutt/roll - icon_state = "rollbutt" - -/obj/item/clothing/mask/smokable/cigarette/rolled/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/clothing/mask/smokable/cigarette/rolled/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(filter) . += "It's capped off one end with a filter." +/obj/item/trash/cigbutt/roll + icon_state = "rollbutt" + /obj/item/clothing/mask/smokable/cigarette/rolled/update_icon() . = ..() icon_on = filter ? "cigon" : "cigrollon" @@ -1092,7 +1092,6 @@ ABSTRACT_TYPE(/obj/item/clothing/mask/smokable) return CR.attackby(src, user) . = ..() - //tobacco sold seperately if you're too snobby to grow it yourself. /obj/item/reagent_containers/food/snacks/grown/dried_tobacco plantname = "tobacco" diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm index 2f476bdb586..3d8038ce1e5 100644 --- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm +++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm @@ -28,9 +28,8 @@ var/list/req_components var/contain_parts = 1 -/obj/item/circuitboard/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - +/obj/item/circuitboard/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(build_path) var/obj/machine = new build_path // instantiate to get the name and desc . += FONT_SMALL(SPAN_NOTICE("This circuitboard will build a [capitalize_first_letters(machine.name)]: [machine.desc]")) diff --git a/code/game/objects/items/weapons/cloaking_device.dm b/code/game/objects/items/weapons/cloaking_device.dm index 907a23ec723..301cb67309a 100644 --- a/code/game/objects/items/weapons/cloaking_device.dm +++ b/code/game/objects/items/weapons/cloaking_device.dm @@ -1,10 +1,6 @@ /obj/item/cloaking_device name = "cloaking device" desc = "Use this to become invisible to the human eye. Contains a removable power cell behind a screwed compartment" - desc_info = "The default power cell will last for five minutes of continuous usage. It can be removed and recharged or replaced with a better one using a screwdriver.\ -
This will not make you inaudible, your footsteps can still be heard, and it will make a very distinctive sound when uncloaking.\ -
Any items you're holding in your hands can still be seen." - desc_antag = "Being cloaked makes you impossible to click on, which offers a major advantage in combat. People can only hit you by blind-firing in your direction." icon = 'icons/obj/item/device/chameleon.dmi' icon_state = "shield0" item_state = "electronic" @@ -25,6 +21,25 @@ var/mob/living/owner = null var/datum/modifier/cloaking_device/modifier = null +/obj/item/cloaking_device/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The default power cell will last for five minutes of continuous usage. It can be removed and recharged or replaced with a better one using a screwdriver." + . += "This will not make you inaudible; your footsteps can still be heard, and it will make a very distinctive sound when uncloaking." + . += "Any items you're holding in your hands can still be seen." + +/obj/item/cloaking_device/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Being cloaked makes you impossible to click on, which offers a major advantage in combat." + . += "People can only hit you by blind-firing in your direction." + +/obj/item/cloaking_device/feedback_hints(mob/user, distance, is_adjacent) + . = list() + . = ..() + if (!cell) + . += SPAN_WARNING("It needs a power cell to function.") + else + . += SPAN_NOTICE("It has [cell.percent()]% power remaining.") + /obj/item/cloaking_device/New() ..() GLOB.cloaking_devices += src @@ -139,13 +154,6 @@ return ..() -/obj/item/cloaking_device/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (!cell) - . += SPAN_WARNING("It needs a power cell to function.") - else - . += SPAN_NOTICE("It has [cell.percent()]% power remaining.") - /obj/item/cloaking_device/process() if (!cell || !cell.checked_use(power_usage*CELLRATE)) deactivate() diff --git a/code/game/objects/items/weapons/ecigs.dm b/code/game/objects/items/weapons/ecigs.dm index 8865dedce00..713c74d8094 100644 --- a/code/game/objects/items/weapons/ecigs.dm +++ b/code/game/objects/items/weapons/ecigs.dm @@ -1,7 +1,6 @@ /obj/item/clothing/mask/smokable/ecig name = "electronic cigarette" desc = "A battery powered cigarette." - desc_info = "Alt-Click to remove the cartridge. The cigarette must be in one of your hands to do this." icon = 'icons/obj/ecig.dmi' contained_sprite = TRUE item_icons = null // Needs to nuke this because Contained Sprites and all @@ -36,6 +35,17 @@ /// The threshold to equal before the cigarette shuts down automatically. var/idle_threshold = 30 +/obj/item/clothing/mask/smokable/ecig/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "While holding \the [src], ALT-click it to remove the cartridge." + +/obj/item/clothing/mask/smokable/ecig/simple/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(ec_cartridge) + . += "There are [round(ec_cartridge.reagents.total_volume, 1)] unit\s of liquid remaining." + else + . += "There's no cartridge connected." + /obj/item/clothing/mask/smokable/ecig/Initialize() . = ..() if(ispath(cell_type)) @@ -78,7 +88,7 @@ if (src == C.wear_mask && C.check_has_mouth()) //transfer, but only when not disabled idle = 0 - //here we'll reduce battery by usage, and check powerlevel - you only use batery while smoking + //here we'll reduce battery by usage, and check powerlevel - you only use battery while smoking if(!cig_cell.checked_use(power_usage * CELLRATE)) //if this passes, there's not enough power in the battery deactivate() to_chat(C,SPAN_NOTICE("\The [src]'s power meter flashes a low battery warning and shuts down.")) @@ -202,13 +212,6 @@ icon_empty = "ccigoff" icon_on = "ccigon" -/obj/item/clothing/mask/smokable/ecig/simple/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(ec_cartridge) - . += SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] unit\s of liquid remaining.") - else - . += SPAN_NOTICE("There's no cartridge connected.") - /obj/item/clothing/mask/smokable/ecig/util name = "electronic cigarette" desc = "A popular utilitarian model electronic cigarette, the ONI-55. Comes in a variety of colors." @@ -217,27 +220,27 @@ icon_empty = "ecigoff1" icon_on = "ecigon" +/obj/item/clothing/mask/smokable/ecig/util/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(ec_cartridge) + . += "There are [round(ec_cartridge.reagents.total_volume, 1)] unit\s of liquid remaining." + else + . += "There's no cartridge connected." + + if(cig_cell) + . += "The power meter shows that there's about [round(cig_cell.percent(), 5)]% power remaining." + else + . += "There's no power cell connected." + + if(active) + . += "It is currently turned on." + else + . += "It is currently turned off." + /obj/item/clothing/mask/smokable/ecig/util/Initialize() . = ..() color = pick(ecig_colors) -/obj/item/clothing/mask/smokable/ecig/util/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(ec_cartridge) - . += SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] unit\s of liquid remaining.") - else - . += SPAN_NOTICE("There's no cartridge connected.") - - if(cig_cell) - . += SPAN_NOTICE("The power meter shows that there's about [round(cig_cell.percent(), 5)]% power remaining.") - else - . += SPAN_NOTICE("There's no power cell connected.") - - if(active) - . += SPAN_NOTICE("It is currently turned on.") - else - . += SPAN_NOTICE("It is currently turned off.") - /obj/item/clothing/mask/smokable/ecig/deluxe name = "deluxe electronic cigarette" desc = "A premium model eGavana MK3 electronic cigarette, shaped like a cigar." @@ -247,17 +250,17 @@ icon_on = "pcigon" cell_type = /obj/item/cell/device/high -/obj/item/clothing/mask/smokable/ecig/deluxe/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/clothing/mask/smokable/ecig/deluxe/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(ec_cartridge) - . += SPAN_NOTICE("There are [round(ec_cartridge.reagents.total_volume, 1)] unit\s of liquid remaining.") + . += "There are [round(ec_cartridge.reagents.total_volume, 1)] unit\s of liquid remaining." else - . += SPAN_NOTICE("There's no cartridge connected.") + . += "There's no cartridge connected." if(cig_cell) - . += SPAN_NOTICE("The power meter shows that there's about [round(cig_cell.percent(), 1)]% power remaining.") + . += "The power meter shows that there's about [round(cig_cell.percent(), 1)]% power remaining." else - . += SPAN_NOTICE("There's no power cell connected.") + . += "There's no power cell connected." /obj/item/reagent_containers/ecig_cartridge name = "tobacco flavour cartridge" @@ -269,9 +272,9 @@ volume = 20 atom_flags = ATOM_FLAG_OPEN_CONTAINER -/obj/item/reagent_containers/ecig_cartridge/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("The cartridge has [reagents.total_volume] unit\s of liquid remaining.") +/obj/item/reagent_containers/ecig_cartridge/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The cartridge has [reagents.total_volume] unit\s of liquid remaining." //flavours /obj/item/reagent_containers/ecig_cartridge/blank diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm index dead7295c7e..d54667e430f 100644 --- a/code/game/objects/items/weapons/explosives.dm +++ b/code/game/objects/items/weapons/explosives.dm @@ -97,12 +97,15 @@ /obj/item/plastique/cyborg name = "plastic explosives dispenser" desc = "A stationbound-mounted C4 dispenser, how thrilling!" - desc_antag = "When used, this dispenser will deploy C4 on a target, upon which it will enter a charging state. After two minutes, it will restock a new C4 bundle." var/can_deploy = TRUE var/recharge_time = 5 MINUTES maptext_x = 3 maptext_y = 2 +/obj/item/plastique/cyborg/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "When used, this dispenser will deploy C4 on a target, upon which it will enter a charging state. After two minutes, it will restock a new C4 bundle." + /obj/item/plastique/cyborg/Initialize() . = ..() maptext = "Ready" diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 2dcd91e19e2..538f5227f0c 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -20,6 +20,22 @@ drop_sound = 'sound/items/drop/gascan.ogg' pickup_sound = 'sound/items/pickup/gascan.ogg' +/obj/item/reagent_containers/extinguisher_refill/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!distance <= 2) + return + + if(is_open_container()) + if(LAZYLEN(reagents?.reagent_volumes)) + . += SPAN_NOTICE("It contains [round(reagents.total_volume, accuracy)] units of non-aerosol mix.") + else + . += SPAN_NOTICE("It is empty.") + else + if(LAZYLEN(reagents?.reagent_volumes)) + . += SPAN_NOTICE("The reagents are secured in the aerosol mix.") + else + . += SPAN_NOTICE("The cartridge seems spent.") + /obj/item/reagent_containers/extinguisher_refill/attackby(obj/item/attacking_item, mob/user) if(attacking_item.isscrewdriver()) if(is_open_container()) @@ -58,22 +74,6 @@ to_chat(user,SPAN_NOTICE("\The reagents inside [src] are already secured!")) return -/obj/item/reagent_containers/extinguisher_refill/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!distance <= 2) - return - - if(is_open_container()) - if(LAZYLEN(reagents?.reagent_volumes)) - . += SPAN_NOTICE("It contains [round(reagents.total_volume, accuracy)] units of non-aerosol mix.") - else - . += SPAN_NOTICE("It is empty.") - else - if(LAZYLEN(reagents?.reagent_volumes)) - . += SPAN_NOTICE("The reagents are secured in the aerosol mix.") - else - . += SPAN_NOTICE("The cartridge seems spent.") - /obj/item/reagent_containers/extinguisher_refill/filled name = "extinguisher refiller (monoammonium phosphate)" desc = "A one time use extinguisher refiller that allows fire extinguishers to be refilled with an aerosol mix. This one contains monoammonium phosphate." @@ -125,18 +125,18 @@ spray_distance = 1 sprite_name = "miniFE" +/obj/item/extinguisher/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 0) + . += SPAN_NOTICE("\The [src] contains [src.reagents.total_volume] units of reagents.") + . += SPAN_NOTICE("The safety is [safety ? "on" : "off"].") + return + /obj/item/extinguisher/New() create_reagents(max_water) reagents.add_reagent(/singleton/reagent/toxin/fertilizer/monoammoniumphosphate, max_water) ..() -/obj/item/extinguisher/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 0) - . += SPAN_NOTICE("\The [src] contains [src.reagents.total_volume] units of reagents.") - . += SPAN_NOTICE("The safety is [safety ? "on" : "off"].") - return - /obj/item/extinguisher/attack(mob/living/target_mob, mob/living/user, target_zone) if(ismob(target_mob) && user.a_intent != I_HURT) return FALSE diff --git a/code/game/objects/items/weapons/flamethrower.dm b/code/game/objects/items/weapons/flamethrower.dm index 902b2ed6ff3..f8240b7ab86 100644 --- a/code/game/objects/items/weapons/flamethrower.dm +++ b/code/game/objects/items/weapons/flamethrower.dm @@ -26,6 +26,18 @@ var/obj/item/device/assembly/igniter/igniter = null var/obj/item/tank/gas_tank = null +/obj/item/flamethrower/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + if(gas_tank) + . += SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(gas_tank.air_contents.return_pressure(), 10)] kPa left in it.") + else + . += SPAN_WARNING("It has no gas tank installed.") + if(igniter) + . += SPAN_NOTICE("It has \an [igniter] installed.") + else + . += SPAN_WARNING("It has no igniter installed.") + /obj/item/flamethrower/Initialize(mapload, var/welder) . = ..() icon_state = "flamethrower" // update to use the non-map version @@ -34,18 +46,6 @@ welding_tool.forceMove(src) update_icon() -/obj/item/flamethrower/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(gas_tank) - . += SPAN_NOTICE("Release pressure is set to [throw_amount] kPa. The tank has about [round(gas_tank.air_contents.return_pressure(), 10)] kPa left in it.") - else - . += SPAN_WARNING("It has no gas tank installed.") - if(igniter) - . += SPAN_NOTICE("It has \an [igniter] installed.") - else - . += SPAN_WARNING("It has no igniter installed.") - /obj/item/flamethrower/Destroy() QDEL_NULL(welding_tool) QDEL_NULL(igniter) diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm index 50457493c44..40a46d4d8d7 100644 --- a/code/game/objects/items/weapons/grenades/chem_grenade.dm +++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm @@ -17,6 +17,11 @@ matter = list(DEFAULT_WALL_MATERIAL = 700, MATERIAL_GLASS = 300) +/obj/item/grenade/chem_grenade/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(detonator) + . += "With attached [detonator.name]" + /obj/item/grenade/chem_grenade/Initialize() . = ..() create_reagents(1000) @@ -111,11 +116,6 @@ else to_chat(user, SPAN_WARNING("\The [attacking_item] is empty.")) -/obj/item/grenade/chem_grenade/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(detonator) - . += "With attached [detonator.name]" - /obj/item/grenade/chem_grenade/activate(mob/user as mob) if(active) return diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 5985980cbbc..3e663020f76 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -19,6 +19,16 @@ var/fake = FALSE var/activation_sound = 'sound/weapons/armbomb.ogg' +/obj/item/grenade/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 0) + if(det_time > 1) + . += "The timer is set to [det_time/10] seconds." + return + if(det_time == null) + return + . += SPAN_ALERT("\The [src] is set for instant detonation.") + /obj/item/grenade/proc/clown_check(var/mob/living/user) if((user.is_clumsy()) && prob(50)) to_chat(user, SPAN_WARNING("Huh? How does this thing work?")) @@ -30,16 +40,6 @@ return 0 return 1 -/obj/item/grenade/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 0) - if(det_time > 1) - . += SPAN_NOTICE("The timer is set to [det_time/10] seconds.") - return - if(det_time == null) - return - . += SPAN_NOTICE("\The [src] is set for instant detonation.") - /obj/item/grenade/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/gun/launcher/grenade)) var/obj/item/gun/launcher/grenade/G = attacking_item diff --git a/code/game/objects/items/weapons/grenades/napalm_grenade.dm b/code/game/objects/items/weapons/grenades/napalm_grenade.dm index a5829d8e953..0b767c2d9f9 100644 --- a/code/game/objects/items/weapons/grenades/napalm_grenade.dm +++ b/code/game/objects/items/weapons/grenades/napalm_grenade.dm @@ -1,9 +1,12 @@ /obj/item/grenade/napalm name = "napalm grenade" - desc = "A grenade that delivers napalm, not as classy as an airstrike bomb, but still effective." + desc = "A grenade that delivers napalm. Not as classy as an airstrike, but still effective." desc_extended = "A Necropolis Industries (now known as Zavodskoi Interstellar) engineered device, this grenade is one of the most effective and destructive portable emergency sterilization \ device available, causing high-intensity sustained fires at over 2000K." - desc_antag = "This causes a 5-tiles large fire that burns for quite a while, don't be a dick with it." + +/obj/item/grenade/napalm/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This causes a 5-tiles large fire that burns for quite a while. Don't be a dick with it." /obj/item/grenade/napalm/prime() . = ..() diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm index 5beeb271bc0..457898c9c0d 100644 --- a/code/game/objects/items/weapons/grenades/smokebomb.dm +++ b/code/game/objects/items/weapons/grenades/smokebomb.dm @@ -41,12 +41,16 @@ /obj/item/grenade/smokebomb/cyborg name = "mounted smoke deployer" desc = "A stationbound-mounted smoke grenade deployer. Activate to deploy." - desc_antag = "When activated, it will deploy a smokebomb which will instantly prime, blowing out clouds of smoke. Upon deploying, it will enter a charging state which will restock a new smokebomb in two minutes." var/can_deploy = TRUE var/recharge_time = 5 MINUTES maptext_x = 3 maptext_y = 2 +/obj/item/grenade/smokebomb/cyborg/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "When activated, it will deploy a smokebomb which will instantly prime, blowing out clouds of smoke." + . += "Upon deploying, it will enter a charging state which will restock a new smokebomb in two minutes." + /obj/item/grenade/smokebomb/cyborg/Initialize() . = ..() maptext = "Ready" diff --git a/code/game/objects/items/weapons/implants/implants/freedom.dm b/code/game/objects/items/weapons/implants/implants/freedom.dm index 53785c87de5..b37ad6f2833 100644 --- a/code/game/objects/items/weapons/implants/implants/freedom.dm +++ b/code/game/objects/items/weapons/implants/implants/freedom.dm @@ -84,7 +84,6 @@ No Implant Specifics"} /obj/item/implant/telefreedom name = "telefreedom implant" desc = "Use this to teleport to a linked teleporter in desperate times. Melts after being used." - desc_info = "Click a telepad to link your telefreedom implant to it before implanting." //////Edit these when you can give it an unique sprite////// icon_state = "implant_freedom" @@ -100,6 +99,10 @@ No Implant Specifics"} */ var/datum/weakref/linked_telepad = null +/obj/item/implant/telefreedom/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click a telepad to link your telefreedom implant to it before implanting." + /obj/item/implant/telefreedom/activate() if(!imp_in) return diff --git a/code/game/objects/items/weapons/landmines.dm b/code/game/objects/items/weapons/landmines.dm index 4bd17a2ee47..030ccb24d86 100644 --- a/code/game/objects/items/weapons/landmines.dm +++ b/code/game/objects/items/weapons/landmines.dm @@ -442,12 +442,15 @@ desc = "A landmine that projects sharpnels in a cone of explosion, towards one direction." desc_extended = "A household name, this mine finds extensive use amongst military forces due to its ability to provide area penetration denial and aid ambushes. \ It is narrated that Gadpathur, its largest manufacturer in modern times, have built more of these mines than the census of the core planets of the Solarian Alliance." - desc_info = "This device can be fitted with a signaler device for remotely actuated detonations, or can be activated with the press of a button directly above it." icon = 'icons/obj/item/landmine/claymore.dmi' icon_state = "m20" var/datum/wires/landmine/claymore/trigger_wire var/obj/item/device/assembly/signaler/signaler +/obj/item/landmine/claymore/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This device can be fitted with a signaler device for remotely actuated detonations, or can be activated with the press of a button directly above it." + /obj/item/landmine/claymore/Initialize(mapload, ...) . = ..() trigger_wire = new(src) diff --git a/code/game/objects/items/weapons/material/swords.dm b/code/game/objects/items/weapons/material/swords.dm index fbd09e87a70..02bb53ec934 100644 --- a/code/game/objects/items/weapons/material/swords.dm +++ b/code/game/objects/items/weapons/material/swords.dm @@ -1,7 +1,6 @@ /obj/item/material/sword name = "claymore" desc = "What are you standing around staring at this for? Get to killing!" - desc_antag = "As a Cultist, this item can be reforged to become a cult blade." icon = 'icons/obj/sword.dmi' icon_state = "claymore" item_state = "claymore" @@ -21,6 +20,10 @@ equip_sound = /singleton/sound_category/sword_equip_sound worth_multiplier = 30 +/obj/item/material/sword/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a Cultist, this item can be reforged to become a cult blade." + /obj/item/material/sword/handle_shield(mob/user, var/on_back, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") var/parry_bonus = 1 diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm index 61fb4f9cd9b..a4fd59e2660 100644 --- a/code/game/objects/items/weapons/material/twohanded.dm +++ b/code/game/objects/items/weapons/material/twohanded.dm @@ -260,16 +260,22 @@ use_material_sound = FALSE worth_multiplier = 7 //blade + stuff +/obj/item/material/twohanded/spear/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(!explosive) + . += "You can strap a grenade of any type to head of this spear, which will explode on thrown impact." + . += "You can impale a severed head on a spear, if you're into that sort of thing. Most people don't like this." + +/obj/item/material/twohanded/spear/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(explosive) + . += SPAN_ALERT("It has \the [explosive] strapped to it.") + /obj/item/material/twohanded/spear/Destroy() if(explosive) QDEL_NULL(explosive) return ..() -/obj/item/material/twohanded/spear/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(explosive) - . += "It has \the [explosive] strapped to it." - /obj/item/material/twohanded/spear/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/organ/external/head)) to_chat(user, SPAN_NOTICE("You stick the head onto the spear and stand it upright on the ground.")) @@ -378,6 +384,17 @@ drop_sound = 'sound/items/drop/axe.ogg' pickup_sound = 'sound/items/pickup/axe.ogg' +/obj/item/material/twohanded/chainsaw/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-click on this in-hand to rev it and toggle it on or off." + +/obj/item/material/twohanded/chainsaw/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + . += "A heavy-duty chainsaw meant for cutting wood. Contains [round(REAGENT_VOLUME(reagents, fuel_type))] unit\s of fuel." + if(powered) + . += SPAN_NOTICE("It is currently powered on.") + /obj/item/material/twohanded/chainsaw/Initialize() . = ..() create_reagents(max_fuel) @@ -474,13 +491,6 @@ RemoveFuel(FuelToRemove) -/obj/item/material/twohanded/chainsaw/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += "A heavy-duty chainsaw meant for cutting wood. Contains [round(REAGENT_VOLUME(reagents, fuel_type))] unit\s of fuel." - if(powered) - . += SPAN_NOTICE("It is currently powered on.") - /obj/item/material/twohanded/chainsaw/attack(mob/living/target_mob, mob/living/user, target_zone) . = ..() if(powered) @@ -628,7 +638,6 @@ /obj/item/material/twohanded/pike/flag/hegemony name = "izweski hegemony flag" desc = "For the Hegemon!" - desc_info = "This is a flagpole with an energy axe attached to it. Sheer strength and stubborness overcomes the unwieldiness." desc_extended = "\"Honor, Fire, Burn thy Fear\" - the famous motto of the Izweski, the clan that leads the largest nation of Unathi." icon = 'icons/obj/unathi_items.dmi' icon_state = "flag_hegemony0" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index dd42cd6d67d..bde61b2be01 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -221,9 +221,6 @@ /obj/item/melee/energy/sword name = "energy sword" desc = "An energy sword. Quite rare, very dangerous." - desc_antag = "The energy sword is a very strong melee weapon, capable of severing limbs easily, if they are targeted. It can also has a chance \ - to block projectiles and melee attacks while it is on and being held. The sword can be toggled on or off by using it in your hand. While it is off, \ - it can be concealed in your pocket or bag." icon_state = "sword0" active_force = 33 armor_penetration = 25 @@ -244,6 +241,13 @@ base_block_chance = 30 var/blade_color +/obj/item/melee/energy/sword/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The energy sword is a very strong melee weapon, capable of severing limbs easily, if they are targeted." + . += "It also has a chance to block projectiles and melee attacks while it is on and being held." + . += "The sword can be toggled on or off by using it in your hand." + . += "While it is off, it can be concealed in your pocket or bag." + /obj/item/melee/energy/sword/Initialize(mapload, ...) . = ..() blade_color = pick("red","blue","green","purple") diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index f1916cd1799..cc2cd4aa8ab 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -90,6 +90,10 @@ var/refill_rate = 0.5 //Rate per process() tick mop refills itself var/refill_reagent = /singleton/reagent/water //Determins what reagent to use for refilling, just in case someone wanted to make a HOLY MOP OF PURGING +/obj/item/mop/advanced/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_NOTICE("\The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") + /obj/item/mop/advanced/Initialize() . = ..() @@ -112,7 +116,3 @@ /obj/item/mop/advanced/process() if(reagents.total_volume < 30) reagents.add_reagent(refill_reagent, refill_rate) - -/obj/item/mop/advanced/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("\The condenser switch is set to [refill_enabled ? "ON" : "OFF"].") diff --git a/code/game/objects/items/weapons/neutralizer.dm b/code/game/objects/items/weapons/neutralizer.dm index d3398bb484f..2dc4a8a7e40 100644 --- a/code/game/objects/items/weapons/neutralizer.dm +++ b/code/game/objects/items/weapons/neutralizer.dm @@ -1,7 +1,6 @@ /obj/item/bluespace_neutralizer name = "bluespace neutralizer" desc = "A strange device, supposedly capable of pre-emptively shutting down bluespace portals." - desc_info = "Click on it, or use it in-hand to activate it. Click on any portal-like structure to instantly close it. Stand near a bluespace rift while it's active to start the closing process." icon = 'icons/obj/item/neutralizer.dmi' icon_state = "neutralizer" contained_sprite = TRUE @@ -10,6 +9,11 @@ var/last_zap = 0 var/active = FALSE +/obj/item/bluespace_neutralizer/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click on it, or use it in-hand to activate it. Click on any portal-like structure to instantly close it." + . += "Stand near a bluespace rift while it's active to start the closing process." + /obj/item/bluespace_neutralizer/update_icon() icon_state = "neutralizer[active ? "-a" : ""]" diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index d078d983403..0f6a0b51570 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -13,6 +13,12 @@ GLOBAL_LIST_INIT(tape_roll_applications, list()) var/tape_type = /obj/item/tape var/icon_base +/obj/item/taperoll/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Apply a length of tape by left-clicking \the [src] in-hand to define the start point, moving in a cardinal direction to the desired stop point, and left-clicking it again." + . += "Apply a short length of tape directly to a closed airlock by left-clicking it with \the [src] in-hand." + . += "Apply a hazard tape marking to a turf by left-clicking on it with \the [src] in-hand; it will match your facing direction. Remove the marking by clicking it again." + /obj/item/taperoll/Initialize() . = ..() if(!hazard_overlays) @@ -32,8 +38,8 @@ GLOBAL_LIST_INIT(tape_roll_applications, list()) var/crumpled = 0 var/icon_base -/obj/item/tape/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/tape/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(LAZYLEN(crumplers) && is_adjacent) . += SPAN_WARNING("\The [initial(name)] has been crumpled by [english_list(crumplers)].") @@ -86,15 +92,18 @@ GLOBAL_LIST_INIT(tape_roll_applications, list()) /obj/item/tape/engineering name = "engineering tape" desc = "A length of engineering tape. Better not cross it." - desc_info = "You can use a multitool on this tape to allow emergency shield generators to deploy shields on this tile." req_one_access = list(ACCESS_ENGINE, ACCESS_ATMOSPHERICS) icon_base = "engineering" var/shield_marker = FALSE -/obj/item/tape/engineering/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/tape/engineering/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can use a multitool on this tape to allow emergency shield generators to deploy shields on this tile." + +/obj/item/tape/engineering/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(shield_marker) - . += SPAN_NOTICE("This strip of tape has been modified to serve as a marker for emergency shield generators to lock onto.") + . += "This strip of tape has been modified to serve as a marker for emergency shield generators to lock onto." /obj/item/tape/engineering/attackby(obj/item/attacking_item, mob/user) if(attacking_item.ismultitool()) diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 4b0748d9410..fc1932c07c1 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -142,7 +142,6 @@ /obj/item/cell/slime name = "charged slime core" desc = "A yellow slime core infused with phoron, it crackles with power." - desc_info = "This slime core is energized with powerful bluespace energies, allowing it to regenerate ten percent of its charge every minute." origin_tech = list(TECH_POWER = 2, TECH_BIO = 4) icon = 'icons/mob/npc/slimes.dmi' icon_state = "yellow slime extract" @@ -152,6 +151,14 @@ // slime cores recharges 10% every one minute self_charge_percentage = 10 +/obj/item/cell/slime/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This slime core is energized with powerful bluespace energies, allowing it to regenerate ten percent of its charge every minute." + +/obj/item/cell/slime/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Maybe be fucking careful if you try rigging this one." + /obj/item/cell/nuclear name = "miniaturized nuclear power cell" desc = "A small self-charging cell with a thorium core that can store an immense amount of charge." diff --git a/code/game/objects/items/weapons/research_slip.dm b/code/game/objects/items/weapons/research_slip.dm index 1586532aaf3..7d7e51c204f 100644 --- a/code/game/objects/items/weapons/research_slip.dm +++ b/code/game/objects/items/weapons/research_slip.dm @@ -1,11 +1,14 @@ /obj/item/research_slip name = "research slip" desc = "A small slip of plastic with an embedded chip. It is commonly used to store small amounts of research data." - desc_info = "This item is to be used in the destructive analyzer to gain research points." icon = 'icons/obj/item/research_slip.dmi' icon_state = "slip_nt" contained_sprite = TRUE +/obj/item/research_slip/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This item is to be used in the destructive analyzer to gain research points." + /obj/item/research_slip/Initialize(mapload, var/list/research_levels) . = ..() if(length(research_levels)) diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index a0d23b91a2b..3a1f711d0ce 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -6,7 +6,6 @@ /obj/item/storage/backpack name = "backpack" desc = "You wear this on your back and put items into it." - desc_antag = "As a Cultist, this item can be reforged to become a cult backpack. Any stored items will be transferred." icon = 'icons/obj/storage/backpack.dmi' icon_state = "backpack" item_state = "backpack" @@ -33,6 +32,10 @@ */ var/attached_icon = "backpack" +/obj/item/storage/backpack/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a Cultist, this item can be reforged to become a cult backpack. Any stored items will be transferred." + /obj/item/storage/backpack/Initialize() . = ..() if(straps == TRUE) @@ -160,7 +163,6 @@ /obj/item/storage/backpack/cultpack name = "trophy rack" desc = "It's useful for both carrying extra gear and proudly declaring your insanity." - desc_antag = null // It's already been forged once. icon_state = "cultpack" item_state = "cultpack" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 915fcaf7286..8258929493e 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -42,13 +42,24 @@ pickup_sound = 'sound/items/pickup/cardboardbox.ogg' var/chewable = TRUE +/obj/item/storage/box/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if (health < maxHealth) + if (health >= (maxHealth * 0.5)) + . += SPAN_WARNING("It is slightly torn.") + else + . += SPAN_DANGER("It is full of tears and holes.") + +/obj/item/storage/box/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(foldable) + . += "Left-click on this when empty to fold it into a sheet." + if(ispath(src.trash)) + . += "This can be crumpled up into a trash item when empty, or forcibly crumpled on harm intent. " + /obj/item/storage/box/Initialize() . = ..() health = maxHealth - if(foldable) - desc_info += "You can fold this into a sheet. " - if(ispath(src.trash)) - desc_info += "This can be crumpled up into a trash item when empty, or forcibly crumpled on harm intent. " if(illustration) AddOverlays(illustration) @@ -92,14 +103,6 @@ damage(damage) ..() -/obj/item/storage/box/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (health < maxHealth) - if (health >= (maxHealth * 0.5)) - . += SPAN_WARNING("It is slightly torn.") - else - . += SPAN_DANGER("It is full of tears and holes.") - // BubbleWrap - A box can be folded up to make card /obj/item/storage/box/attack_self(mob/user as mob) if(..()) @@ -590,7 +593,11 @@ item_state = "redbox" illustration = null starts_with = list(/obj/item/reagent_containers/food/snacks/donkpocket/sinpocket = 6) - desc_antag = "Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes." + +/obj/item/storage/box/sinpockets/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Crush bottom of each package to initiate chemical heating. Wait for 20 seconds before consumption." + . += "Product will cool if not eaten within seven minutes." /obj/item/storage/box/donkpockets/gwok name = "box of teriyaki Gwok-pockets" @@ -694,9 +701,12 @@ starts_with = list(/obj/item/toy/snappop = 8) /obj/item/storage/box/snappops/syndi - desc_antag = "These snap pops have an extra compound added that will deploy a tiny smokescreen when snapped." starts_with = list(/obj/item/toy/snappop/syndi = 8) +/obj/item/storage/box/snappops/syndi/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "These snap pops have an extra compound added that will deploy a tiny smokescreen when snapped." + /obj/item/storage/box/partypopper name = "party popper box" desc = "Six cones of confetti conflagarating fun!" @@ -1072,17 +1082,23 @@ starts_with = list(/obj/item/pen/fountain = 7) /obj/item/storage/box/aggression - desc_antag = "This box contains various implants that will make their owners increasingly aggressive." illustration = "implant" max_storage_space = DEFAULT_BOX_STORAGE starts_with = list(/obj/item/implantcase/aggression = 6, /obj/item/implanter = 1, /obj/item/implantpad = 1) +/obj/item/storage/box/aggression/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This box contains various implants that will make their owners increasingly aggressive." + /obj/item/storage/box/encryption_key name = "box" illustration = "circuit" - desc_antag = "This box contains encryption keys that gives the user a safe channel to chatter in. Access the safe comms with :x." starts_with = list(/obj/item/device/encryptionkey/rev = 8) +/obj/item/storage/box/encryption_key/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This box contains encryption keys that gives the user a safe channel to chatter in. Access the safe comms with :x." + /obj/item/storage/box/dynamite name = "wooden crate" desc = "An ordinary wooden crate." @@ -1308,7 +1324,7 @@ /obj/item/storage/box/tea name = "sencha cha-tin" desc = "A tin bearing the logo of the Konyang-cha tea company. This one contains a bag of sencha, a type of green tea." - desc_info = "A subsidiary of Gwok Group, the Konyang-cha tea company is the spur's foremost vendor of artisanal loose leaf tea, \ + desc_extended = "A subsidiary of Gwok Group, the Konyang-cha tea company is the spur's foremost vendor of artisanal loose leaf tea, \ selling blends sourced from independent Konyanger farmers. Popular both on Konyang and off-world, it is considered a symbol of Konyang's culture." icon = 'icons/obj/item/reagent_containers/teaware.dmi' icon_state = "can" diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 786c1706d61..a5833560959 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -25,6 +25,20 @@ foldable = null // most of this stuff isn't foldable by default, e.g. cig packets and vial boxes contained_sprite = TRUE +/obj/item/storage/box/fancy/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(closable) + . += "ALT-click to open and close the box." //aka force override icon state. for you know, style. + +/obj/item/storage/box/fancy/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!icon_type || !storage_type) + return + if(contents.len <= 0) + . += "There are no [src.icon_type]s left in the [src.storage_type]." + else + . += "There [src.contents.len == 1 ? "is" : "are"] [src.contents.len] [src.icon_type]\s left in \the [src.storage_type]." + /obj/item/storage/box/fancy/open(mob/user) . = ..() if(!opened) @@ -39,8 +53,6 @@ /obj/item/storage/box/fancy/Initialize() . = ..() update_icon() - if(closable) - desc_info += "Alt-click to open and close the box. " //aka force override icon state. for you know, style. /obj/item/storage/box/fancy/AltClick(mob/user) if(opened && !closable) // opened, non-closable items do nothing @@ -73,15 +85,6 @@ update_icon() . = ..() -/obj/item/storage/box/fancy/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!icon_type || !storage_type) - return - if(contents.len <= 0) - . += "There are no [src.icon_type]s left in the [src.storage_type]." - else - . += "There [src.contents.len == 1 ? "is" : "are"] [src.contents.len] [src.icon_type]\s left in \the [src.storage_type]." - /* * Donut Box */ @@ -285,7 +288,6 @@ /obj/item/storage/box/fancy/cigarettes name = "Trans-Stellar Duty Frees cigarette packet" desc = "A ubiquitous brand of cigarettes, found in the facilities of every major spacefaring corporation in the universe. As mild and flavorless as it gets." - desc_info = "You can put a cigarette directly in your mouth by selecting the mouth region and clicking on yourself with a cigarette packet in hand. " icon = 'icons/obj/cigs_lighters.dmi' icon_state = "cigpacket" item_state = "cigpacket" @@ -307,6 +309,10 @@ cant_hold = list(/obj/item/clothing/mask/smokable/cigarette/cigar) // prevents cigars from being put in regular cigarettes packs, because thats kind of silly var/cigarette_to_spawn = /obj/item/clothing/mask/smokable/cigarette +/obj/item/storage/box/fancy/cigarettes/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can put a cigarette directly in your mouth by selecting the mouth region and clicking on yourself with a cigarette packet in hand." + /obj/item/storage/box/fancy/cigarettes/Initialize() atom_flags |= ATOM_FLAG_NO_REACT create_reagents(15 * storage_slots) //so people can inject cigarettes without opening a packet, now with being able to inject the whole one diff --git a/code/game/objects/items/weapons/storage/med_pouch.dm b/code/game/objects/items/weapons/storage/med_pouch.dm index 559f704f1a5..8cd9c459d48 100644 --- a/code/game/objects/items/weapons/storage/med_pouch.dm +++ b/code/game/objects/items/weapons/storage/med_pouch.dm @@ -5,15 +5,6 @@ Single Use Emergency Pouches /obj/item/storage/box/fancy/med_pouch name = "emergency medical pouch" desc = "For use in emergency situations only." - desc_info = "\ - 1) Tear open the emergency medical pack using the easy open tab at the top.
\ - 2) Carefully remove all items from the pouch and discard the pouch.
\ - 3) Apply all autoinjectors to the injured party.
\ - 4) Use bandages to stop bleeding if required.
\ - 5) Force the injured party to swallow all pills.
\ - 6) Use ointment on any burns if required.
\ - 7) Contact the medical team with your location.
\ - 8) Stay in place once they respond." icon = 'icons/obj/storage/firstaid.dmi' storage_slots = 7 w_class = WEIGHT_CLASS_SMALL @@ -30,6 +21,18 @@ Single Use Emergency Pouches var/injury_type = "generic" make_exact_fit = TRUE +// All the med pouches have custom instructions. Don't inherit this. +/obj/item/storage/box/fancy/med_pouch/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "1) Tear open the emergency medical pack using the easy open tab at the top." + . += "2) Carefully remove all items from the pouch and discard the pouch." + . += "3) Apply all autoinjectors to the injured party." + . += "4) Use bandages to stop bleeding if required." + . += "5) Force the injured party to swallow all pills." + . += "6) Use ointment on any burns if required." + . += "7) Contact the medical team with your location." + . += "8) Stay in place once they respond." + /obj/item/storage/box/fancy/med_pouch/Initialize() . = ..() name = "emergency [injury_type] pouch" @@ -38,14 +41,6 @@ Single Use Emergency Pouches /obj/item/storage/box/fancy/med_pouch/trauma name = "trauma pouch" - desc_info = "\ - 1) Tear open the emergency medical pack using the easy open tab at the top.
\ - 2) Carefully remove all items from the pouch and discard the pouch.
\ - 3) Apply all autoinjectors to the injured party.
\ - 4) Use bandages to stop bleeding if required.
\ - 5) Force the injured party to swallow all pills.
\ - 6) Contact the medical team with your location.
\ - 7) Stay in place once they respond." injury_type = "trauma" color = COLOR_RED @@ -56,6 +51,17 @@ Single Use Emergency Pouches /obj/item/stack/medical/bruise_pack = 2 ) +/obj/item/storage/box/fancy/med_pouch/trauma/feedback_hints(mob/user, distance, is_adjacent) + . = list() + // All the med pouches have custom instructions. Does not inherit. + . += "1) Tear open the emergency medical pack using the easy open tab at the top." + . += "2) Carefully remove all items from the pouch and discard the pouch." + . += "3) Apply all autoinjectors to the injured party." + . += "4) Use bandages to stop bleeding if required." + . += "5) Force the injured party to swallow all pills." + . += "6) Contact the medical team with your location." + . += "7) Stay in place once they respond." + /obj/item/storage/box/fancy/med_pouch/burn name = "burn pouch" injury_type = "burn" @@ -68,15 +74,18 @@ Single Use Emergency Pouches /obj/item/reagent_containers/pill/pouch_pill/perconol = 1, /obj/item/stack/medical/ointment = 2 ) - desc_info = "\ - 1) Tear open the emergency medical pack using the easy open tab at the top.
\ - 2) Carefully remove all items from the pouch and discard the pouch.
\ - 3) Apply the emergency mortaphenyl autoinjector to the injured party.
\ - 4) Apply all remaining autoinjectors to the injured party.
\ - 5) Force the injured party to swallow all pills.
\ - 6) Use ointment on any burns if required
\ - 7) Contact the medical team with your location.
\ - 8) Stay in place once they respond." + +/obj/item/storage/box/fancy/med_pouch/burn/feedback_hints(mob/user, distance, is_adjacent) + . = list() + // All the med pouches have custom instructions. Does not inherit. + . += "1) Tear open the emergency medical pack using the easy open tab at the top." + . += "2) Carefully remove all items from the pouch and discard the pouch." + . += "3) Apply the emergency mortaphenyl autoinjector to the injured party." + . += "4) Apply all remaining autoinjectors to the injured party." + . += "5) Force the injured party to swallow all pills." + . += "6) Use ointment on any burns if required." + . += "7) Contact the medical team with your location." + . += "8) Stay in place once they respond." /obj/item/storage/box/fancy/med_pouch/oxyloss name = "low oxygen pouch" @@ -90,15 +99,18 @@ Single Use Emergency Pouches /obj/item/reagent_containers/pill/pouch_pill/inaprovaline = 1, /obj/item/reagent_containers/pill/pouch_pill/dexalin = 1 ) - desc_info = "\ - 1) Tear open the emergency medical pack using the easy open tab at the top.
\ - 2) Carefully remove all items from the pouch and discard the pouch.
\ - 3) Apply all autoinjectors to the injured party.
\ - 4) Force the injured party to swallow all pills.
\ - 5) Contact the medical team with your location.
\ - 6) Find a source of oxygen if possible.
\ - 7) Update the medical team with your new location.
\ - 8) Stay in place once they respond." + +/obj/item/storage/box/fancy/med_pouch/oxyloss/feedback_hints(mob/user, distance, is_adjacent) + . = list() + // All the med pouches have custom instructions. Does not inherit. + . += "1) Tear open the emergency medical pack using the easy open tab at the top." + . += "2) Carefully remove all items from the pouch and discard the pouch." + . += "3) Apply all autoinjectors to the injured party." + . += "4) Force the injured party to swallow all pills." + . += "5) Contact the medical team with your location." + . += "6) Find a source of oxygen if possible." + . += "7) Update the medical team with your new location." + . += "8) Stay in place once they respond." /obj/item/storage/box/fancy/med_pouch/toxin name = "toxin pouch" @@ -109,13 +121,16 @@ Single Use Emergency Pouches /obj/item/reagent_containers/hypospray/autoinjector/pouch_auto/dylovene = 1, /obj/item/reagent_containers/pill/pouch_pill/dylovene = 1 ) - desc_info = "\ - 1) Tear open the emergency medical pack using the easy open tab at the top.
\ - 2) Carefully remove all items from the pouch and discard the pouch.
\ - 3) Apply all autoinjectors to the injured party.
\ - 4) Force the injured party to swallow all pills.
\ - 5) Contact the medical team with your location.
\ - 6) Stay in place once they respond." + +/obj/item/storage/box/fancy/med_pouch/toxin/feedback_hints(mob/user, distance, is_adjacent) + . = list() + // All the med pouches have custom instructions. Does not inherit. + . += "1) Tear open the emergency medical pack using the easy open tab at the top." + . += "2) Carefully remove all items from the pouch and discard the pouch." + . += "3) Apply all autoinjectors to the injured party." + . += "4) Force the injured party to swallow all pills." + . += "5) Contact the medical team with your location." + . += "6) Stay in place once they respond." /obj/item/storage/box/fancy/med_pouch/radiation name = "radiation pouch" @@ -126,13 +141,16 @@ Single Use Emergency Pouches /obj/item/reagent_containers/hypospray/autoinjector/hyronalin = 1, /obj/item/reagent_containers/pill/pouch_pill/dylovene = 1 ) - desc_info = "\ - 1) Tear open the emergency medical pack using the easy open tab at the top.
\ - 2) Carefully remove all items from the pouch and discard the pouch.
\ - 3) Apply all autoinjectors to the injured party.
\ - 4) Force the injured party to swallow all pills.
\ - 5) Contact the medical team with your location.
\ - 6) Stay in place once they respond." + +/obj/item/storage/box/fancy/med_pouch/radiation/feedback_hints(mob/user, distance, is_adjacent) + . = list() + // All the med pouches have custom instructions. Does not inherit. + . += "1) Tear open the emergency medical pack using the easy open tab at the top." + . += "2) Carefully remove all items from the pouch and discard the pouch." + . += "3) Apply all autoinjectors to the injured party." + . += "4) Force the injured party to swallow all pills." + . += "5) Contact the medical team with your location." + . += "6) Stay in place once they respond." /obj/item/reagent_containers/pill/pouch_pill name = "emergency pill" @@ -208,5 +226,5 @@ Single Use Emergency Pouches /obj/item/reagent_containers/hypospray/autoinjector/pouch_auto/fluvectionem name = "emergency bloodstream purge autoinjector" - desc = "An emergency anti-toxin autoinjector that, when injected into a person, purges their bloodstream of chemicals, including toxins and medicine alike. Useful in the event of severe poisonings.PURGES MEDICINE. DO NOT APPLY IF ANY MEDICATION WAS ALREADY GIVEN." + desc = "An emergency anti-toxin autoinjector that, when injected into a person, purges their bloodstream of chemicals, including toxins and medicine alike. Useful in the event of severe poisonings. PURGES MEDICINE. DO NOT APPLY IF ANY MEDICATION WAS ALREADY GIVEN." reagents_to_add = list(/singleton/reagent/fluvectionem = 5) diff --git a/code/game/objects/items/weapons/storage/mre.dm b/code/game/objects/items/weapons/storage/mre.dm index b1a96990286..2a6db3e575c 100644 --- a/code/game/objects/items/weapons/storage/mre.dm +++ b/code/game/objects/items/weapons/storage/mre.dm @@ -28,6 +28,10 @@ MRE Stuff ) make_exact_fit = TRUE +/obj/item/storage/box/fancy/mre/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += meal_desc + /obj/item/storage/box/fancy/mre/fill() new main_meal(src) . = ..() @@ -35,10 +39,6 @@ MRE Stuff /obj/item/storage/mre/attack_self(mob/user) open(user) -/obj/item/storage/box/fancy/mre/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += meal_desc - /obj/item/storage/box/fancy/mre/menu2 name = "\improper MRE, menu 2" meal_desc = "This one is menu 2, margherita." diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm index 46e7d147215..fd5c40b7d42 100644 --- a/code/game/objects/items/weapons/storage/secure.dm +++ b/code/game/objects/items/weapons/storage/secure.dm @@ -28,8 +28,8 @@ ABSTRACT_TYPE(/obj/item/storage/secure) max_storage_space = DEFAULT_BOX_STORAGE use_sound = 'sound/items/storage/briefcase.ogg' -/obj/item/storage/secure/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/storage/secure/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance <= 1) . += "The service panel is [src.open ? "open" : "closed"]." diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index f12f6cc64ee..64d07dd42a6 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -86,6 +86,11 @@ var/make_exact_fit = FALSE +/obj/item/storage/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(isghost(user) || isstoryteller(user)) + . += "It contains: [counting_english_list(contents)]" + /obj/item/storage/Destroy() close_all() QDEL_NULL(boxes) @@ -198,12 +203,6 @@ return return_status - -/obj/item/storage/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(isghost(user)) - . += "It contains: [counting_english_list(contents)]" - /obj/item/storage/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) . = ..() if(!canremove) diff --git a/code/game/objects/items/weapons/stunbaton.dm b/code/game/objects/items/weapons/stunbaton.dm index 5a246f97797..b4fa8d2b801 100644 --- a/code/game/objects/items/weapons/stunbaton.dm +++ b/code/game/objects/items/weapons/stunbaton.dm @@ -2,9 +2,6 @@ /obj/item/melee/baton name = "stunbaton" desc = "A stun baton for incapacitating people with." - desc_info = "The baton needs to be turned on to apply the stunning effect. Use it in your hand to toggle it on or off. If your intent is \ - set to 'harm', you will inflict damage when using it, regardless if it is on or not. Each stun reduces the baton's charge, which can be replenished by \ - putting it inside a weapon recharger." icon_state = "stunbaton" item_state = "baton" slot_flags = SLOT_BELT @@ -25,6 +22,22 @@ var/baton_color = "#FF6A00" var/sheathed = 1 //electrocutes only on harm intent +/obj/item/melee/baton/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The baton needs to be turned on to apply the stunning effect; left-click it in-hand to toggle power." + . += "On Harm intent, you will inflict damage when using it, regardless if it is on or not." + . += "Each stun reduces the baton's charge, which can be replenished by putting it inside a weapon recharger." + +/obj/item/melee/baton/feedback_hints(mob/user, distance, is_adjacent) + . = list() + . = ..() + if(!distance <= 1) + return + if(bcell) + . += "The baton is [round(bcell.percent())]% charged." + else + . += "The baton does not have a power source installed." + /obj/item/melee/baton/Initialize() . = ..() update_icon() @@ -59,15 +72,6 @@ else set_light(0) -/obj/item/melee/baton/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!distance <= 1) - return - if(bcell) - . += SPAN_NOTICE("The baton is [round(bcell.percent())]% charged.") - else - . += SPAN_WARNING("The baton does not have a power source installed.") - /obj/item/melee/baton/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/cell)) if(attacking_item.w_class != WEIGHT_CLASS_NORMAL) diff --git a/code/game/objects/items/weapons/syndie.dm b/code/game/objects/items/weapons/syndie.dm index ceaee54e1f0..f1958fe8c5b 100644 --- a/code/game/objects/items/weapons/syndie.dm +++ b/code/game/objects/items/weapons/syndie.dm @@ -102,7 +102,6 @@ /obj/item/syndie/teleporter name = "pen" desc = "An instrument for writing or drawing with ink. This one is in black, in a classic, grey casing. Stylish, classic and professional." - desc_antag = "While this may look like a bog-standard pen, in reality, this is a handheld teleportation device. Simply click on any turf within view to attempt to teleport there! The teleporter will recharge after a minute." icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" @@ -120,10 +119,12 @@ var/recharge_time = 1 MINUTE var/when_recharge = 0 -/obj/item/syndie/teleporter/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/syndie/teleporter/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "While this may look like a bog-standard pen, in reality, this is a handheld teleportation device." + . += "Simply click on any turf within view to attempt to teleport there! The teleporter will recharge after a minute." if(!ready_to_use && GLOB.burglars.is_antagonist(user.mind)) - . += SPAN_NOTICE("Charging: [num2loadingbar(world.time / when_recharge)]") + . += "Charging: [num2loadingbar(world.time / when_recharge)]" /obj/item/syndie/teleporter/set_initial_maptext() held_maptext = SMALL_FONTS(7, "Ready") diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index a34602590e8..df7a3f08cf5 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -47,9 +47,9 @@ var/volume_rate = 500 //Needed for borg jetpack transfer action_button_name = "Toggle Jetpack" -/obj/item/tank/jetpack/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(air_contents.total_moles < 5) +/obj/item/tank/jetpack/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(air_contents.total_moles < 25) . += SPAN_NOTICE("The meter on \the [src] indicates you are almost out of gas!") /obj/item/tank/jetpack/verb/toggle_rockets() diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index 13c09124585..129f6893a8f 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -18,14 +18,14 @@ item_state = "oxygen" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD -/obj/item/tank/oxygen/adjust_initial_gas() - air_contents.adjust_gas(GAS_OXYGEN, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - -/obj/item/tank/oxygen/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/tank/oxygen/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if((is_adjacent) && air_contents.gas[GAS_OXYGEN] < 10) . += SPAN_WARNING("The meter on \the [src] indicates you are almost out of oxygen!") +/obj/item/tank/oxygen/adjust_initial_gas() + air_contents.adjust_gas(GAS_OXYGEN, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + /obj/item/tank/oxygen/yellow desc = "A tank of oxygen, this one is yellow." icon_state = "oxygen_f" @@ -73,14 +73,14 @@ icon_state = "oxygen" item_state = "oxygen" -/obj/item/tank/air/adjust_initial_gas() - air_contents.adjust_multi(GAS_OXYGEN, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD, GAS_NITROGEN, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) - -/obj/item/tank/air/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/tank/air/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if((is_adjacent) && air_contents.gas[GAS_OXYGEN] < 1 && loc==user) . += SPAN_WARNING("The meter on the [src.name] indicates you are almost out of air!") +/obj/item/tank/air/adjust_initial_gas() + air_contents.adjust_multi(GAS_OXYGEN, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD, GAS_NITROGEN, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + /* * Phoron */ @@ -133,7 +133,6 @@ /obj/item/tank/emergency_oxygen name = "emergency oxygen tank" desc = "Used for emergencies. Contains very little oxygen, so try to conserve it until you actually need it." - desc_antag = "As a Cultist, this item can be reforged to become a large brown oxygen tank." icon_state = "emergency" item_state = "emergency" gauge_icon = "indicator_emergency" @@ -145,14 +144,18 @@ distribute_pressure = ONE_ATMOSPHERE*O2STANDARD volume = 2 //Tiny. Real life equivalents only have 21 breaths of oxygen in them. They're EMERGENCY tanks anyway -errorage (dangercon 2011) -/obj/item/tank/emergency_oxygen/adjust_initial_gas() - air_contents.adjust_gas(GAS_OXYGEN, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) - -/obj/item/tank/emergency_oxygen/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/tank/emergency_oxygen/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if((is_adjacent) && air_contents.gas[GAS_OXYGEN] < 0.2 && loc==user) . += SPAN_WARNING("The meter on the [src.name] indicates you are almost out of air!") +/obj/item/tank/emergency_oxygen/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a Cultist, this item can be reforged to become a large brown oxygen tank." + +/obj/item/tank/emergency_oxygen/adjust_initial_gas() + air_contents.adjust_gas(GAS_OXYGEN, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + /obj/item/tank/emergency_oxygen/engi name = "extended-capacity emergency oxygen tank" icon_state = "emergency_engi" diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 0b749e8834c..422996ede47 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -25,6 +25,24 @@ var/manipulated_by = null //Used by _onclick/hud/screen_objects.dm internals to determine if someone has messed with our tank or not. //If they have and we haven't scanned it with a computer or handheld gas analyzer then we might just breath whatever they put in it. +/obj/item/tank/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 0) + var/celsius_temperature = air_contents.temperature - T0C + switch(celsius_temperature) + if(300 to INFINITY) + . += SPAN_DANGER("\The [src] feels furiously hot.") + if(100 to 300) + . += SPAN_ALERT("\The [src] feels hot.") + if(80 to 100) + . += SPAN_NOTICE("\The [src] feels warm.") + if(40 to 80) + . += SPAN_NOTICE("\The [src] feels lukewarm.") + if(20 to 40) + . += SPAN_NOTICE("\The [src] feels room temperature.") + else + . += SPAN_NOTICE("\The [src] feels cold.") + /obj/item/tank/Initialize() . = ..() @@ -47,26 +65,6 @@ return ..() -/obj/item/tank/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 0) - var/celsius_temperature = air_contents.temperature - T0C - var/descriptive - switch(celsius_temperature) - if(300 to INFINITY) - descriptive = "furiously hot" - if(100 to 300) - descriptive = "hot" - if(80 to 100) - descriptive = "warm" - if(40 to 80) - descriptive = "lukewarm" - if(20 to 40) - descriptive = "room temperature" - else - descriptive = "cold" - . += SPAN_NOTICE("\The [src] feels [descriptive].") - /obj/item/tank/attackby(obj/item/attacking_item, mob/user) ..() if ((istype(attacking_item, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) diff --git a/code/game/objects/items/weapons/teleportation.dm b/code/game/objects/items/weapons/teleportation.dm index ca5772e5321..0ca62c61d92 100644 --- a/code/game/objects/items/weapons/teleportation.dm +++ b/code/game/objects/items/weapons/teleportation.dm @@ -141,7 +141,6 @@ Frequency: /obj/item/hand_tele name = "hand tele" desc = "A hand-held bluespace teleporter that can rip open portals to a random nearby location, or lock onto a teleporter with a selected teleportation beacon." - desc_info = "Ctrl-click to choose which teleportation pad to link to. Use in-hand or alt-click to deploy a portal. When not linked to a pad, or the pad isn't pointing at a beacon, it will choose a completely random teleportation destination." icon = 'icons/obj/item/hand_tele.dmi' icon_state = "hand_tele" item_state = "electronic" @@ -158,8 +157,14 @@ Frequency: var/max_portals = 2 -/obj/item/hand_tele/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/hand_tele/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Ctrl-click to choose which teleportation pad to link to." + . += "Use in-hand or alt-click to deploy a portal. " + . += "When not linked to a pad, or the pad isn't pointing at a beacon, it will choose a completely random teleportation destination." + +/obj/item/hand_tele/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(linked_pad) var/area/A = get_area(linked_pad) . += SPAN_NOTICE("\The [src] is linked to a teleportation pad in [A.name]") @@ -266,7 +271,6 @@ Frequency: /obj/item/closet_teleporter name = "closet teleporter" desc = "A device that allows a user to connect two closets into a bluespace network." - desc_antag = "Click a closet with this to install. Step into the closet and close the door to teleport to the linked closet. It has a one minute cooldown after a batch teleport." icon = 'icons/obj/modular_components.dmi' icon_state = "cpu_normal_photonic" obj_flags = OBJ_FLAG_CONDUCTABLE @@ -277,6 +281,12 @@ Frequency: var/obj/item/closet_teleporter/linked_teleporter var/last_use = 0 +/obj/item/closet_teleporter/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click a closet with this to install." + . += "Once two closets have been 'upgraded', step into one closet and close the door to teleport to the linked closet." + . += "It has a one minute cooldown after a batch teleport." + /obj/item/closet_teleporter/proc/do_teleport(var/mob/user) if(!attached_closet) to_chat(user, SPAN_WARNING("\The [src] doesn't have an attached closet!")) diff --git a/code/game/objects/items/weapons/tether.dm b/code/game/objects/items/weapons/tether.dm index a8313b0e06f..8d05d375b77 100644 --- a/code/game/objects/items/weapons/tether.dm +++ b/code/game/objects/items/weapons/tether.dm @@ -3,7 +3,6 @@ GLOBAL_LIST_INIT_TYPED(all_tethers, /obj/item/tethering_device, list()) /obj/item/tethering_device name = "tethering device" desc = "A device used by explorers to keep track of partners by way of electro-tether." - desc_info = "Use in-hand to activate, must be on the same level and within fifteen tiles of another device to latch. Tethers are colour coded by distance." icon = 'icons/obj/item/device/gps.dmi' icon_state = "gps" item_state = "radio" @@ -16,6 +15,11 @@ GLOBAL_LIST_INIT_TYPED(all_tethers, /obj/item/tethering_device, list()) var/tether_range = 15 var/list/active_beams = list() +/obj/item/tethering_device/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use in-hand on yourself to activate: you must be on the same level and within fifteen tiles of another device to latch." + . += "Tethers are colour coded by distance." + /obj/item/tethering_device/Initialize(mapload, ...) . = ..() GLOB.all_tethers += src @@ -41,7 +45,6 @@ GLOBAL_LIST_INIT_TYPED(all_tethers, /obj/item/tethering_device, list()) else deactivate() - /obj/item/tethering_device/process() var/turf/our_turf = get_turf(src) for(var/tether in GLOB.all_tethers - src) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index 0bec8f13387..4df99874a5e 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -256,6 +256,11 @@ var/change_icons = TRUE var/produces_flash = TRUE +/obj/item/weldingtool/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 0) + . += "It contains [get_fuel()]/[max_fuel] units of fuel." + /obj/item/weldingtool/iswelder() return TRUE @@ -349,11 +354,6 @@ STOP_PROCESSING(SSprocessing, src) return ..() -/obj/item/weldingtool/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 0) - . += "It contains [get_fuel()]/[max_fuel] units of fuel." - /obj/item/weldingtool/attackby(obj/item/attacking_item, mob/user) if(attacking_item.isscrewdriver()) if(isrobot(loc)) @@ -664,21 +664,26 @@ /obj/item/eyeshield name = "experimental eyeshield" desc = "An advanced eyeshield capable of dampening the welding glare produced when working on modern super-materials, removing the need for user-worn welding gear." - desc_info = "This can be attached to an experimental welder to give it welding protection, removing the need for welding goggles or masks." icon = 'icons/obj/item/welding_tools.dmi' icon_state = "eyeshield" item_state = "eyeshield" contained_sprite = TRUE +/obj/item/eyeshield/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This can be attached to an experimental welder to give it welding protection, removing the need for welding goggles or masks." + /obj/item/overcapacitor name = "experimental overcapacitor" desc = "An advanced capacitor that injects a current into the welding stream, doubling the speed of welding tasks without sacrificing quality. Excess current burns up welding fuel, reducing fuel efficiency, however." - desc_info = "This can be attached to an experimental welder to double the speed it works at, at the cost of tripling the fuel cost of using it." icon = 'icons/obj/item/welding_tools.dmi' icon_state = "overcap" item_state = "overcap" contained_sprite = TRUE +/obj/item/overcapacitor/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This can be attached to an experimental welder to double the speed it works at, at the cost of tripling the fuel cost of using it." /* * Crowbar @@ -813,17 +818,18 @@ ) var/current_tool = 1 +/obj/item/combitool/feedback_hints(mob/user, distance, is_adjacent) + . = list() + . = ..() + if(tools.len) + . += "It has the following fittings: [english_list(tools)]." + /obj/item/combitool/Initialize() desc = "[initial(desc)] It has [tools.len] possibilit[tools.len == 1 ? "y" : "ies"]." for(var/tool in tools) tools[tool] = image('icons/obj/tools.dmi', icon_state = "[icon_state]-[tool]") . = ..() -/obj/item/combitool/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(tools.len) - . += "It has the following fittings: [english_list(tools)]." - /obj/item/combitool/iswrench() return current_tool == "wrench" @@ -883,10 +889,14 @@ usesound = 'sound/items/drill_use.ogg' var/current_tool = 1 var/list/tools = list( - "screwdriverbit", - "wrenchbit" + "screwdriver bit", + "wrench bit" ) +/obj/item/powerdrill/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click \the [src] in-hand to cycle through the active bits." + /obj/item/powerdrill/Initialize() . = ..() update_tool() @@ -894,13 +904,6 @@ /obj/item/powerdrill/set_initial_maptext() held_maptext = SMALL_FONTS(7, "S") -/obj/item/powerdrill/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(tools.len) - . += "It has the following fittings:" - for(var/tool in tools) - . += "- [tool][tools[current_tool] == tool ? " (selected)" : ""]" - /obj/item/powerdrill/MouseEntered(location, control, params) . = ..() var/list/modifiers = params2list(params) @@ -913,10 +916,10 @@ closeToolTip(usr) /obj/item/powerdrill/iswrench() - return tools[current_tool] == "wrenchbit" + return tools[current_tool] == "wrench bit" /obj/item/powerdrill/isscrewdriver() - return tools[current_tool] == "screwdriverbit" + return tools[current_tool] == "screwdriver bit" /obj/item/powerdrill/proc/update_tool() if(isscrewdriver()) diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 03d08d8986f..5188398fcb3 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -168,9 +168,12 @@ */ /obj/item/trap/sharpened name = "sharpened mechanical trap" - desc_antag = "This device has an even higher chance of penetrating armor and locking foes in place." activated_armor_penetration = 100 +/obj/item/trap/sharpened/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This device has an even higher chance of penetrating armor and locking foes in place." + /** * # Tripwire trap * @@ -238,6 +241,12 @@ icon_state = "punji" var/message = null +/obj/item/trap/punji/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(src.message && distance < 3) + . += SPAN_ALERT("You notice something written on a plate inside the trap:") + . += SPAN_BAD(message) + /obj/item/trap/punji/on_entered(datum/source, atom/movable/arrived, atom/old_loc, list/atom/old_locs) if(deployed && isliving(arrived)) var/mob/living/L = arrived @@ -306,12 +315,6 @@ victim.visible_message(SPAN_ALERT("You notice something written on a plate inside the trap:
")+SPAN_BAD(message)) -/obj/item/trap/punji/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(src.message && distance < 3) - . += SPAN_ALERT("You notice something written on a plate inside the trap:") - . += SPAN_BAD(message) - /obj/item/trap/punji/verb/hide_under() set src in oview(1) set name = "Hide" @@ -874,8 +877,8 @@ force = 11 w_class = WEIGHT_CLASS_HUGE -/obj/item/large_trap_foundation/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/large_trap_foundation/feedback_hints(mob/user, distance, is_adjacent) + . += ..() . += SPAN_NOTICE("\The [src] can be turned into a large trap by attaching twelve metal rods to it.") /obj/item/large_trap_foundation/attackby(obj/item/attacking_item, mob/user) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index f91bde4579b..37e23f928e0 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -320,3 +320,7 @@ clients_in_hearers += mob.client if(length(clients_in_hearers)) langchat_speech(message, hearers, GLOB.all_languages, skip_language_check = TRUE) + +/// Override this to customize the effects an activated signaler has. +/obj/proc/do_signaler() + return diff --git a/code/game/objects/structures/barricades/_barricade.dm b/code/game/objects/structures/barricades/_barricade.dm index 139393d168a..9fdde8ce5a0 100644 --- a/code/game/objects/structures/barricades/_barricade.dm +++ b/code/game/objects/structures/barricades/_barricade.dm @@ -29,11 +29,8 @@ update_icon() starting_maxhealth = maxhealth -/obj/structure/barricade/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_INFO("It is recommended to stand flush to a barricade or one tile away for maximum efficiency.") - if(is_wired) - . += SPAN_INFO("There is a length of wire strewn across the top of this barricade.") +/obj/structure/barricade/condition_hints(mob/user, distance, is_adjacent) + . += ..() switch(damage_state) if(BARRICADE_DMG_NONE) . += SPAN_INFO("It appears to be in good shape.") @@ -44,6 +41,17 @@ if(BARRICADE_DMG_HEAVY) . += SPAN_WARNING("It's crumbling apart, just a few more blows will tear it apart!") +/obj/structure/barricade/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(!is_wired) + . += "Use a length of barbed wire on this barricade to restrict enemies from climbing it and damage them on attacking it at close range." + +/obj/structure/barricade/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_INFO("It is recommended to stand flush to a barricade or one tile away for maximum efficiency.") + if(is_wired) + . += SPAN_INFO("There is a length of barbed wire strewn across the top of this barricade, preventing it from being climbed and making it hazardous to attack at close range.") + /obj/structure/barricade/update_icon() CutOverlays() diff --git a/code/game/objects/structures/barricades/metal.dm b/code/game/objects/structures/barricades/metal.dm index 33886d790ac..5b8beea297a 100644 --- a/code/game/objects/structures/barricades/metal.dm +++ b/code/game/objects/structures/barricades/metal.dm @@ -14,15 +14,15 @@ can_wire = TRUE var/build_state = BARRICADE_BSTATE_SECURED //Look at __game.dm for barricade defines -/obj/structure/barricade/metal/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/barricade/metal/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() switch(build_state) if(BARRICADE_BSTATE_SECURED) - . += SPAN_INFO("The protection panel is still tighly screwed in place.") + . += "The protection panel is still tighly screwed in place." if(BARRICADE_BSTATE_UNSECURED) - . += SPAN_INFO("The protection panel has been removed, you can see the anchor bolts.") + . += "The protection panel has been removed, you can see the anchor bolts." if(BARRICADE_BSTATE_MOVABLE) - . += SPAN_INFO("The protection panel has been removed and the anchor bolts loosened. It's ready to be taken apart.") + . += "The protection panel has been removed and the anchor bolts loosened. It's ready to be pried apart." /obj/structure/barricade/metal/attackby(obj/item/attacking_item, mob/user) if(attacking_item.iswelder()) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index b6e844621a5..9046a45ef24 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -7,7 +7,6 @@ LINEN BINS /obj/item/bedsheet name = "bedsheet" desc = "A surprisingly soft linen bedsheet." - desc_info = "Click to roll and unroll. Alt-click to fold and unfold. Drag and drop to pick up. You can equip it in your backpack slot." icon = 'icons/obj/bedsheets.dmi' icon_state = "sheetwhite" item_state = "sheetwhite" @@ -30,6 +29,15 @@ LINEN BINS var/inuse = FALSE var/inside_storage_item = FALSE +/obj/item/bedsheet/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click to roll and unroll." + . += "Alt-click to fold and unfold." + . += "Drag and drop to pick up." + . += "You can equip it in your backpack slot." + . += "It could be cut up into sheets of cloth." + . += "Holes could be poked in it to make a ghost costume... if you really wanted to." + /obj/item/bedsheet/Initialize() . = ..() var/static/list/loc_connections = list( @@ -388,9 +396,12 @@ LINEN BINS var/list/sheets = list() var/obj/item/hidden = null +/obj/structure/bedsheetbin/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You could hide things in here, so long as there are also some sheets to conceal it." -/obj/structure/bedsheetbin/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/bedsheetbin/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(amount < 1) . += "There are no bed sheets in the bin." return diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm index bcee006fac6..7cb636265d5 100644 --- a/code/game/objects/structures/bonfire.dm +++ b/code/game/objects/structures/bonfire.dm @@ -23,6 +23,23 @@ GLOBAL_LIST_EMPTY(total_active_bonfires) var/last_ambient_message var/burn_out = TRUE //Whether or not it deletes itself when fuel is depleted +/obj/structure/bonfire/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 2) + return + if(on_fire) + switch(fuel) + if(0 to 200) + . += "\The [src] is burning weakly." + if(200 to 600) + . += "\The [src] is gently burning." + if(600 to 900) + . += "\The [src] is burning steadily." + if(900 to 1300) + . += "The flames are dancing wildly!" + if(1300 to 2000) + . += "The fire is roaring!" + /obj/structure/bonfire/Initialize() . = ..() fuel = rand(1000, 2000) @@ -39,23 +56,6 @@ GLOBAL_LIST_EMPTY(total_active_bonfires) GLOB.total_active_bonfires -= src . = ..() -/obj/structure/bonfire/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 2) - return - if(on_fire) - switch(fuel) - if(0 to 200) - . += "\The [src] is burning weakly." - if(200 to 600) - . += "\The [src] is gently burning." - if(600 to 900) - . += "\The [src] is burning steadily." - if(900 to 1300) - . += "The flames are dancing wildly!" - if(1300 to 2000) - . += "The fire is roaring!" - /obj/structure/bonfire/update_icon() if(on_fire) if(fuel < 200) diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 4a20f327187..16394ee81d6 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -76,6 +76,45 @@ /// Set to 0 to make the door not animate at all var/door_anim_time = 2.5 + /// Used by body bags and air bubbles. + var/contains_body = FALSE + +/obj/structure/closet/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "When closed, a welder could be used to weld the closet shut." + +/obj/structure/closet/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "When opened, a welder could be used to cut the closet back into steel sheets." + +/obj/structure/closet/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Using a Closet Teleporter (Stealth & Camouflage uplink item) on this can turn it into a quick transportation method- just don't get caught!" + +/obj/structure/closet/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + + if(!src.opened && isghost(user)) + . += "It contains: [counting_english_list(contents)]" + + if(distance <= 1 && !src.opened) + var/content_size = 0 + for(var/obj/item/I in contents) + if(!I.anchored) + content_size += Ceiling(I.w_class/2) + if(!content_size) + . += "\The [src] is empty." + else if(storage_capacity > content_size*4) + . += "\The [src] is barely filled." + else if(storage_capacity > content_size*2) + . += "\The [src] is less than half full." + else if(storage_capacity > content_size) + . += "\The [src] still has some free space." + else + . += "\The [src] is full." + + if(src.opened && linked_teleporter && is_adjacent) + . += SPAN_WARNING("There appears to be a device screwed onto the interior backplate of \the [src]...") /obj/structure/closet/Initialize(mapload, var/no_fill) . = ..() @@ -115,33 +154,6 @@ /obj/structure/closet/proc/fill() return -/obj/structure/closet/proc/content_info(mob/user, content_size) - if(!content_size) - . = "\The [src] is empty." - else if(storage_capacity > content_size*4) - . = "\The [src] is barely filled." - else if(storage_capacity > content_size*2) - . = "\The [src] is less than half full." - else if(storage_capacity > content_size) - . = "\The [src] still has some free space." - else - . = "\The [src] is full." - -/obj/structure/closet/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1 && !src.opened) - var/content_size = 0 - for(var/obj/item/I in contents) - if(!I.anchored) - content_size += Ceiling(I.w_class/2) - . += content_info(user, content_size) - - if(!src.opened && isghost(user)) - . += "It contains: [counting_english_list(contents)]" - - if(src.opened && linked_teleporter && is_adjacent) - . += FONT_SMALL(SPAN_NOTICE("There appears to be a device attached to the interior backplate of \the [src]...")) - /obj/structure/closet/proc/stored_weight() var/content_size = 0 for(var/obj/item/I in contents) diff --git a/code/game/objects/structures/crates_lockers/closets/statue.dm b/code/game/objects/structures/crates_lockers/closets/statue.dm index 4d0c293ae12..a6299568953 100644 --- a/code/game/objects/structures/crates_lockers/closets/statue.dm +++ b/code/game/objects/structures/crates_lockers/closets/statue.dm @@ -73,9 +73,6 @@ STOP_PROCESSING(SSprocessing, src) qdel(src) -/obj/structure/closet/statue/content_info() - return - /obj/structure/closet/statue/proc/create_icon(var/mob/living/L) appearance = L appearance_flags |= KEEP_TOGETHER diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index ce8823aaeba..45cd7b79f29 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -15,6 +15,9 @@ anchored = TRUE wall_mounted = TRUE +/obj/structure/closet/walllocker/antagonist_hints(mob/user, distance, is_adjacent) + . = list() + /obj/structure/closet/walllocker/secure name = "secure wall locker" icon_door = "walllocker_secure" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index bd4dc115313..24c5b5e4666 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -28,6 +28,13 @@ var/radius_2 = 1.35 var/static/list/animation_math //assoc list with pre calculated values +/obj/structure/closet/crate/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Crates can be placed on top of tables by clicking and dragging the crate onto the target table." + +/obj/structure/closet/crate/antagonist_hints(mob/user, distance, is_adjacent) + . = list() + /obj/structure/closet/crate/can_open() if(tablestatus == UNDER_TABLE)//Can't be opened while under a table return 0 diff --git a/code/game/objects/structures/crystals.dm b/code/game/objects/structures/crystals.dm index 9af7b1c9a65..80c985de4bc 100644 --- a/code/game/objects/structures/crystals.dm +++ b/code/game/objects/structures/crystals.dm @@ -12,6 +12,19 @@ var/obj/machinery/power/crystal_agitator/creator // used to re-add dense turfs to agitation list when destroyed +/obj/structure/reagent_crystal/condition_hints(mob/user, distance, is_adjacent) + . += ..() + var/current_damage = health / initial(health) + switch(current_damage) + if(0 to 0.2) + . += SPAN_DANGER("The crystal is barely holding together!") + if(0.2 to 0.4) + . += SPAN_WARNING("The crystal has various cracks visible!") + if(0.4 to 0.8) + . += SPAN_WARNING("The crystal has scratches and deeper grooves on its surface.") + if(0.8 to 1) + . += SPAN_NOTICE("The crystal looks structurally sound.") + /obj/structure/reagent_crystal/Initialize(mapload, var/reagent_i = null, var/our_creator = null) . = ..() if(!reagent_i) @@ -26,21 +39,6 @@ if(our_creator) creator = our_creator -/obj/structure/reagent_crystal/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/state - var/current_damage = health / initial(health) - switch(current_damage) - if(0 to 0.2) - state = SPAN_DANGER("The crystal is barely holding together!") - if(0.2 to 0.4) - state = SPAN_WARNING("The crystal has various cracks visible!") - if(0.4 to 0.8) - state = SPAN_WARNING("The crystal has scratches and deeper grooves on its surface.") - if(0.8 to 1) - state = SPAN_NOTICE("The crystal looks structurally sound.") - . += state - /obj/structure/reagent_crystal/proc/take_damage(var/damage) health -= damage if(health <= 0) @@ -162,9 +160,12 @@ var/singleton/reagent/R = GET_SINGLETON(reagent_i) name = "[lowertext(R.name)] crystal" desc = "A [lowertext(R.name)] crystal. It looks rough, unprocessed." - desc_info = "This crystal can be ground to obtain the chemical material locked within." color = reagents.get_color() +/obj/item/reagent_crystal/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This crystal can be ground to obtain the chemical material locked within." + /obj/item/storage/bag/crystal name = "crystal satchel" desc = "This big boy can store a vast amount of crystals." diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index cc008114ff6..a55641a02f2 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -5,7 +5,6 @@ /obj/structure/door_assembly name = "airlock assembly" desc = "An airlock assembly." - desc_info = "To create a glass airlock, add two reinforced glass sheets." icon = 'icons/obj/doors/basic/single/generic/door.dmi' icon_state = "construction" anchored = FALSE @@ -27,14 +26,47 @@ var/created_name var/width = 1 +/obj/structure/door_assembly/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use a pen on \the [src] to name it." + if(anchored && !glass) + . += "Windows could be installed with some reinforced glass." + switch(state) + if(STATE_UNWIRED) + if(!anchored) + . += "\the [src] should first be anchored to the floor with some bolts." + else + . += "\the [src] will need to be fitted with some cables." + if(STATE_WIRED) + . += "Compatible electronics still need to be installed. Remember to configure them first!" + if(STATE_ELECTRONICS_INSTALLED) + . += "The remaining panels can be screwed closed to complete the assembly." + +/obj/structure/door_assembly/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + switch(state) + if(STATE_UNWIRED) + if(anchored && glass) + . += "The glass window could be removed with a welder." + else if(anchored) + . += "\the [src] is anchored to the floor with some bolts." + else + . += "\the [src] could be reduced to metal sheets with a welder." + if(STATE_WIRED) + . += "The cables in \the [src] could be cut." + if(STATE_ELECTRONICS_INSTALLED) + . += "The electronics could be pried out." + . += "A chainsaw or equivalent would probably get rid of this thing, but make a real mess." + +/obj/structure/door_assembly/feedback_hints(mob/user, distance, is_adjacent) + . = list() + . = ..() + . += "It is currently facing [dir2text(dir)]." + /obj/structure/door_assembly/Initialize(mapload) . = ..() update_state() -/obj/structure/door_assembly/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It is currently facing [dir2text(dir)]." - /obj/structure/door_assembly/door_assembly_generic base_name = "airlock" airlock_type = /obj/machinery/door/airlock diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index ea2626981e0..5b21d808150 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -1,7 +1,6 @@ /obj/structure/extinguisher_cabinet name = "extinguisher cabinet" desc = "A small wall mounted cabinet designed to hold a fire extinguisher." - desc_info = "Alt-click to close the door." icon = 'icons/obj/wallmounts.dmi' icon_state = "cabinet" anchored = 1 @@ -10,6 +9,10 @@ var/obj/item/extinguisher/has_extinguisher var/opened = 0 +/obj/structure/extinguisher_cabinet/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Alt-click to close the door." + /obj/structure/extinguisher_cabinet/north dir = NORTH pixel_y = 24 diff --git a/code/game/objects/structures/flags_banners.dm b/code/game/objects/structures/flags_banners.dm index 2f8ba65e917..697bce83fbf 100644 --- a/code/game/objects/structures/flags_banners.dm +++ b/code/game/objects/structures/flags_banners.dm @@ -137,7 +137,6 @@ F2.linked_flag = src F2.name = name F2.desc = desc - F2.desc_info = desc_info F2.desc_extended = desc_extended F2.flag_item = flag_item diff --git a/code/game/objects/structures/fluff/engineering/maintenance.dm b/code/game/objects/structures/fluff/engineering/maintenance.dm index fa30a184b81..6a6bee5e82f 100644 --- a/code/game/objects/structures/fluff/engineering/maintenance.dm +++ b/code/game/objects/structures/fluff/engineering/maintenance.dm @@ -31,9 +31,23 @@ ABSTRACT_TYPE(/obj/structure/engineer_maintenance) /// The key-value list of tools that can be used on the panel once it's been opened. The key is the typepath of the item, and the value is a singleton which holds some data to be used var/list/panel_tools - /// The list of tool names that can be used on the panel once it's open, but in name format, to be used in get_examine_text + /// The list of tool names that can be used on the panel once it's open, but in name format, to be used in mechanics_hints var/list/panel_tool_names = list() +/obj/structure/engineer_maintenance/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_NOTICE("Any wrench, or an impact drill with the wrenchbit selected, can be used to open/close the panel.") + if(panel_open) + . += SPAN_NOTICE("The following tools can be used to interact with the panel:") + for(var/tool_name in panel_tool_names) + . += SPAN_NOTICE("- [tool_name]") + +/obj/structure/engineer_maintenance/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(panel_open) + . += SPAN_NOTICE(detailed_desc) + . += SPAN_ITALIC("OOC NOTE: This object is purely a fluff item, and has no mechanical effect.") + /obj/structure/engineer_maintenance/Initialize(mapload) . = ..() name = panel_location == PANEL_LOCATION_FLOOR ? "maintenance panel" : "large maintenance panel" // floor panels are smaller than the wall mounted ones @@ -50,21 +64,6 @@ ABSTRACT_TYPE(/obj/structure/engineer_maintenance) SIGNAL_HANDLER qdel(src) -/obj/structure/engineer_maintenance/get_examine_text(mob/user, distance, is_adjacent, infix, suffix, get_extended) - . = ..() - if(panel_open) - . += SPAN_NOTICE("---") - . += SPAN_NOTICE(detailed_desc) - . += SPAN_NOTICE("---") - . += SPAN_NOTICE("Any wrench, or an impact drill with the wrenchbit selected, can be used to open/close the panel.") - if(panel_open) - . += SPAN_NOTICE("---") - . += SPAN_NOTICE("The following tools can be used to interact with the panel:") - for(var/tool_name in panel_tool_names) - . += SPAN_NOTICE("- [tool_name]") - . += SPAN_ITALIC("OOC NOTE: This object is purely a fluff item, and has no mechanical effect.") - - /obj/structure/engineer_maintenance/update_icon() if(!panel_open) icon_state = initial(icon_state) @@ -219,15 +218,12 @@ ABSTRACT_TYPE(/obj/structure/engineer_maintenance) if(finish_sound) playsound(get_turf(target), finish_sound, 30, TRUE) - /singleton/engineer_maintenance_tool/steam_pipe finish_sound = /singleton/sound_category/steam_pipe - /singleton/engineer_maintenance_tool/electrical_hum finish_sound = /singleton/sound_category/electrical_hum - /singleton/engineer_maintenance_tool/electrical_spark finish_sound = /singleton/sound_category/electrical_spark diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index a5ba268838b..e0b1d78fa4a 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -1,9 +1,5 @@ /obj/structure/girder desc = "The basic building block of all walls." - desc_info = "Use metal sheets on this to build a normal wall.
\ - A false wall can be made by using a crowbar on this girder, and then adding some material.
\ - You can dismantle the grider with a wrench, or add support struts with a screwdriver to enable further reinforcement.
\ - If reinforced, before you can dismantle it, you must first unscrew the support struts, then cut them with wirecutters." icon_state = "girder" anchored = 1 density = 1 @@ -19,8 +15,8 @@ var/reinforcing = 0 var/plating = FALSE -/obj/structure/girder/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/girder/condition_hints(mob/user, distance, is_adjacent) + . += ..() var/state var/current_damage = health / initial(health) switch(current_damage) @@ -34,6 +30,43 @@ state = SPAN_NOTICE("The support struts look completely intact.") . += state +/obj/structure/girder/mechanics_hints() + . = list() + . += ..() + if (state == 0 && anchored) + . += SPAN_NOTICE("It could be pried to subtly displace it to build a fake wall.") + return . + +/obj/structure/girder/assembly_hints() + . = list() + . += ..() + if (health < initial(health)) + . += "It could be repaired with a few choice welds." + + if (anchored) + if (!reinf_material && !reinforcing) + . += "It could be prepared for reinforcement with some screws." + if (reinforcing) + . += "It could be given reinforced plating with some plasteel sheets." + if (!plating) + . += "It could be given basic plating with some steel sheets." + + // Anchor state + . += "It [anchored ? "is" : "could be"] anchored to the floor with some bolts." + return . + +/obj/structure/girder/disassembly_hints() + . = list() + . += ..() + // Reinf wall deconstruction. + if (state == 2) + . += "Its support struts have been securely screwed into place." + else if (state == 1) + . += "Its unsecured support struts could be cut out." + if (!anchored) + . += "It is held together by a couple of bolts; a heavy cutting tool might also take it apart." + + /obj/structure/girder/displaced name = "displaced girder" icon_state = "displaced" @@ -200,19 +233,19 @@ return ..() -/obj/structure/girder/proc/construct_wall(obj/item/stack/material/S, mob/user) - if(S.get_amount() < 2) +/obj/structure/girder/proc/construct_wall(obj/item/stack/material/mat_stack, mob/user) + if(mat_stack.get_amount() < 2) to_chat(user, SPAN_NOTICE("There isn't enough material here to construct a wall.")) return 0 - var/material/M = SSmaterials.get_material_by_name(S.default_type) - if(!istype(M)) + var/material/material = SSmaterials.get_material_by_name(mat_stack.default_type) + if(!istype(material)) return 0 var/wall_fake add_hiddenprint(usr) - if(M.integrity < 50) + if(material.integrity < 50) to_chat(user, SPAN_NOTICE("This material is too soft for use in wall construction.")) return 0 @@ -222,7 +255,7 @@ else return TRUE - if(!do_after(user,40) || !S.use(2)) + if(!do_after(user,40) || !mat_stack.use(2)) plating = FALSE return 1 //once we've gotten this far don't call parent attackby() @@ -239,33 +272,33 @@ Tsrc.ChangeTurf(/turf/simulated/wall) var/turf/simulated/wall/T = Tsrc T.under_turf = original_type - T.set_material(M, reinf_material) + T.set_material(material, reinf_material) if(wall_fake) T.can_open = 1 T.add_hiddenprint(usr) qdel(src) return 1 -/obj/structure/girder/proc/reinforce_with_material(obj/item/stack/material/S, mob/user) //if the verb is removed this can be renamed. +/obj/structure/girder/proc/reinforce_with_material(obj/item/stack/material/mat_stack, mob/user) //if the verb is removed this can be renamed. if(reinf_material) to_chat(user, SPAN_NOTICE("\The [src] is already reinforced.")) return 0 - if(S.get_amount() < 2) + if(mat_stack.get_amount() < 2) to_chat(user, SPAN_NOTICE("There isn't enough material here to reinforce the girder.")) return 0 - var/material/M = SSmaterials.get_material_by_name(S.default_type) - if(!istype(M) || M.integrity < 50) + var/material/material = SSmaterials.get_material_by_name(mat_stack.default_type) + if(!istype(material) || material.integrity < 50) to_chat(user, "You cannot reinforce \the [src] with that; it is too soft.") return 0 to_chat(user, SPAN_NOTICE("Now reinforcing...")) - if (!do_after(user,40) || !S.use(2)) + if (!do_after(user,40) || !mat_stack.use(2)) return 1 //don't call parent attackby() past this point to_chat(user, SPAN_NOTICE("You added reinforcement!")) - reinf_material = M + reinf_material = material reinforce_girder() return 1 diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index d75d63acd8c..977b8a3be77 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -1,9 +1,6 @@ /obj/structure/grille name = "grille" - desc = "A flimsy lattice of metal rods, with screws to secure it to the floor." - desc_info = "A powered and knotted wire underneath this will cause the grille to shock anyone not wearing insulated gloves.
\ - Wirecutters will turn the grille into metal rods instantly. Grilles are made with metal rods.
\ - Can be fixed with a single metal rod if damaged." + desc = "A flimsy lattice of metal rods." icon = 'icons/obj/structures.dmi' icon_state = "grille" density = TRUE @@ -15,6 +12,35 @@ var/health = 10 var/destroyed = 0 +/obj/structure/grille/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if(health < initial(health)) + var/state + var/current_damage = health / initial(health) + switch(current_damage) + if(0 to 0.3) + state = SPAN_DANGER("The grille is barely in one piece!") + if(0.3 to 0.8) + state = SPAN_ALERT("The grille has taken some serious damage.") + if(0.8 to 1) + state = SPAN_NOTICE("The grille is in less than perfect condition.") + . += state + +/obj/structure/grille/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "A powered and knotted wire underneath this will cause the grille to shock anyone not wearing insulated gloves." + +/obj/structure/grille/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + +/obj/structure/grille/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "These could be easily cut through." + +/obj/structure/grille/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "\the [src] [anchored ? "is" : "could be"] anchored to the floor with some screws." + /obj/structure/grille/over name = "over-frame grille" icon = 'icons/obj/smooth/window/grille_over.dmi' diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm index 9697c9c5421..7dcdd90256f 100644 --- a/code/game/objects/structures/inflatable.dm +++ b/code/game/objects/structures/inflatable.dm @@ -3,11 +3,16 @@ /obj/item/inflatable name = "inflatable" - desc_info = "Inflate by using it in your hand. The inflatable barrier will inflate on the turf you are standing on. To deflate it, use the 'deflate' verb." w_class = WEIGHT_CLASS_SMALL icon = 'icons/obj/item/inflatables.dmi' var/deploy_path = null +/obj/item/inflatable/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Inflate by using it in your hand. The inflatable barrier will inflate on the turf you are standing on." + . += "To deflate it, use the 'deflate' verb or ctrl-click on it." + . += "When passing through an airlock made of inflatables, GO SLOWLY!" + /obj/item/inflatable/attack_self(mob/user) if(!deploy_path) return @@ -33,7 +38,6 @@ /obj/structure/inflatable name = "inflatable" desc = "An inflated membrane. Do not puncture." - desc_info = "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." icon = 'icons/obj/item/inflatables.dmi' icon_state = "wall" @@ -46,6 +50,11 @@ var/torn_path = null var/health = 15 +/obj/structure/inflatable/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To deflate it safely, use the 'deflate' verb or ctrl-click on it." + . += "Hitting these with any objects will probably puncture and break it forever." + /obj/structure/inflatable/wall name = "inflatable wall" undeploy_path = /obj/item/inflatable/wall @@ -185,8 +194,6 @@ /obj/structure/inflatable/door //Based on mineral door code name = "inflatable door" - desc_info = "Click the door to open or close it. It only stops air while closed.
\ - To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever." density = TRUE anchored = TRUE opacity = FALSE @@ -198,6 +205,14 @@ var/state = STATE_CLOSED var/isSwitchingStates = FALSE +/obj/structure/inflatable/door/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click the door to open or close it. It only stops air while closed." + . += "When passing through an airlock made of inflatables, GO SLOWLY!" + . += "To deflate it safely, use the 'deflate' verb or ctrl-click on it." + . += "Hitting these with any objects will probably puncture and break it forever." + . += "FOR THE SECOND TIME: GO SLOWLY TO MAKE SURE THE DOORS ARE FULLY CLOSED!" + /obj/structure/inflatable/door/attack_ai(mob/user) if(isAI(user)) //so the AI can't open it return diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm index 80b0812515a..4e597edb0fb 100644 --- a/code/game/objects/structures/janicart.dm +++ b/code/game/objects/structures/janicart.dm @@ -1,10 +1,6 @@ /obj/structure/janitorialcart name = "custodial cart" desc = "The ultimate in custodial carts. Has space for water, mops, signs, trash bags, and more." - desc_info = "Click and drag a mop bucket onto the cart to mount it\ -
Alt+Click with a mop to put it away, a normal click will wet it in the bucket.\ -
Alt+Click with a container, such as a bucket, to pour its contents into the mounted bucket. A normal click will toss it into the trash\ -
You can also use a lightreplacer, spraybottle (of spacecleaner) and four wet-floor signs on the cart to store them" icon = 'icons/obj/janitor.dmi' icon_state = "cart" anchored = FALSE @@ -25,6 +21,27 @@ var/driving var/mob/living/pulling +/obj/structure/janitorialcart/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click and drag a mop bucket onto the cart to mount it." + . += "ALT-Click with a mop to put it away; a normal click will wet it in the bucket." + . += "ALT-Click with a container, such as a bucket, to pour its contents into the mounted bucket. A normal click will toss it into the trash." + . += "You can use a light replacer, spraybottle (of space cleaner) and four wet-floor signs on the cart to store them." + +/obj/structure/janitorialcart/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "An empty custodial cart can be taken apart with a wrench or a welder. Or a plasma cutter, if you're that hardcore." + +/obj/structure/janitorialcart/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + if (mybucket) + var/contains = mybucket.reagents.total_volume + . += "[icon2html(src, user)] The bucket contains [contains] unit\s of liquid!" + else + . += "[icon2html(src, user)] There is no bucket mounted on it!" + //everything else is visible, so doesn't need to be mentioned + // Regular Variant // No trashbag and no light replacer, this is inside the custodian's locker. /obj/structure/janitorialcart/Initialize() @@ -90,17 +107,6 @@ /obj/structure/janitorialcart/proc/get_short_status() return "Contents: [english_list(contents)]" -/obj/structure/janitorialcart/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - if (mybucket) - var/contains = mybucket.reagents.total_volume - . += "[icon2html(src, user)] The bucket contains [contains] unit\s of liquid!" - else - . += "[icon2html(src, user)] There is no bucket mounted on it!" - //everything else is visible, so doesn't need to be mentioned - - /obj/structure/janitorialcart/mouse_drop_receive(atom/dropped, mob/user, params) var/atom/movable/O = dropped if (istype(O, /obj/structure/mopbucket) && !mybucket) @@ -135,7 +141,6 @@ if (LR.store_broken) return mybag.attackby(I, usr) - /obj/structure/janitorialcart/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/mop) || istype(attacking_item, /obj/item/reagent_containers/glass/rag) || istype(attacking_item, /obj/item/soap)) if (mybucket) @@ -262,8 +267,6 @@ update_icon() - - /obj/structure/janitorialcart/attack_hand(mob/user) ui_interact(user) return diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index b895beb5083..586a2213346 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -1,8 +1,6 @@ /obj/structure/lattice name = "lattice" desc = "A lightweight support lattice." - desc_info = "Add a metal floor tile to build a floor on top of the lattice.
\ - Lattices can be made by applying metal rods to a space tile." icon = 'icons/obj/smooth/lattice.dmi' icon_state = "lattice" density = FALSE @@ -23,6 +21,12 @@ ) footstep_sound = /singleton/sound_category/catwalk_footstep +/obj/structure/lattice/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + if(name == "lattice") + . += "Add a metal floor tile to build a floor on top of the lattice." + . += "Lattices can be made by applying metal rods to a space tile." + /obj/structure/lattice/Initialize() . = ..() for(var/obj/structure/lattice/LAT in loc) diff --git a/code/game/objects/structures/mop_bucket.dm b/code/game/objects/structures/mop_bucket.dm index 597dfeb347e..22c38ee95f0 100644 --- a/code/game/objects/structures/mop_bucket.dm +++ b/code/game/objects/structures/mop_bucket.dm @@ -9,6 +9,11 @@ var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite var/bucketsize = 600 //about 2x the size relative to a regular bucket. +/obj/structure/mopbucket/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + . += "It contains [reagents.total_volume] unit\s of water." + /obj/structure/mopbucket/Initialize() . = ..() create_reagents(bucketsize) @@ -21,11 +26,6 @@ GLOB.janitorial_supplies -= src return ..() -/obj/structure/mopbucket/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += "It contains [reagents.total_volume] unit\s of water." - /obj/structure/mopbucket/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/mop)) if(reagents.total_volume < 1) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 4ef6fd8a8aa..85cfcc46a9a 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -20,6 +20,30 @@ can_astar_pass = CANASTARPASS_ALWAYS_PROC +/obj/structure/railing/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if (health < maxhealth) + switch(health / maxhealth) + if (0.0 to 0.5) + . += SPAN_WARNING("It looks severely damaged!") + if (0.25 to 0.5) + . += SPAN_WARNING("It looks damaged!") + if (0.5 to 1.0) + . += SPAN_NOTICE("It has a few scrapes and dents.") + +/obj/structure/railing/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if (anchored) + . += "It could be [density ? "opened" : "closed"] to passage with a wrench." + +/obj/structure/railing/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + if (health < maxhealth) + . += "It could be repaired with a few choice welds." + . += "It [anchored ? "is" : "could be"] anchored to the floor with a row of screws." + if (!anchored) + . += "It is held together by a couple of bolts." + /obj/structure/railing/mapped color = COLOR_GUNMETAL anchored = TRUE @@ -73,19 +97,6 @@ R.update_icon() return ..() -/obj/structure/railing/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(health < maxhealth) - switch(health / maxhealth) - if(0.0 to 0.5) - . += SPAN_WARNING("It looks severely damaged!") - if(0.25 to 0.5) - . += SPAN_WARNING("It looks damaged!") - if(0.5 to 1.0) - . += SPAN_NOTICE("It has a few scrapes and dents.") - . += FONT_SMALL(SPAN_NOTICE("\The [src] is [density ? "closed" : "open"] to passage.")) - . += FONT_SMALL(SPAN_NOTICE("\The [src] is [anchored ? "" : "not"] screwed to the floor.")) - /obj/structure/railing/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if(mover?.movement_type & PHASING) return TRUE diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index 4ed6188ad65..4886d696b74 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -30,6 +30,14 @@ FLOOR SAFES var/drill_x_offset = -4 // The X pixel offset for the drill var/drill_y_offset = -8 // The Y pixel offset for the drill +/obj/structure/safe/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(broken) + . += SPAN_WARNING("\The [src]'s locking system has been drilled open!") + else if(time_to_drill < 300 SECONDS) + var/time_left = max(round(time_to_drill / 10), 0) + . += SPAN_WARNING("There are only [time_left] second\s of drilling left until \the [src] is broken!") + /obj/structure/safe/Initialize() . = ..() tumbler_1_pos = rand(0, 71) @@ -44,14 +52,6 @@ FLOOR SAFES space += I.w_class I.forceMove(src) -/obj/structure/safe/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(broken) - . += SPAN_WARNING("\The [src]'s locking system has been drilled open!") - else if(time_to_drill < 300 SECONDS) - var/time_left = max(round(time_to_drill / 10), 0) - . += SPAN_WARNING("There are only [time_left] second\s of drilling left until \the [src] is broken!") - /obj/structure/safe/Destroy() if(drill) drill.soundloop.stop() diff --git a/code/game/objects/structures/sarcophagus.dm b/code/game/objects/structures/sarcophagus.dm index b25dc9dd2e1..adbd423add1 100644 --- a/code/game/objects/structures/sarcophagus.dm +++ b/code/game/objects/structures/sarcophagus.dm @@ -7,8 +7,8 @@ anchored = 0 var/open = FALSE -/obj/structure/sarcophagus/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/sarcophagus/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(!open) . += "\The [src]'s lid is closed shut." else diff --git a/code/game/objects/structures/simple_doors.dm b/code/game/objects/structures/simple_doors.dm index d6632fe1cc3..c5cda519721 100644 --- a/code/game/objects/structures/simple_doors.dm +++ b/code/game/objects/structures/simple_doors.dm @@ -15,6 +15,11 @@ var/health = 100 var/maxhealth = 100 +/obj/structure/simple_door/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(lock) + . += SPAN_NOTICE("It appears to have a lock.") + /obj/structure/simple_door/fire_act(exposed_temperature, exposed_volume) . = ..() @@ -60,11 +65,6 @@ lock = null return ..() -/obj/structure/simple_door/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(lock) - . += SPAN_NOTICE("It appears to have a lock.") - /obj/structure/simple_door/CollidedWith(atom/bumped_atom) ..() if(!state) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 7326bfe7fc0..0bb179976de 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -18,9 +18,6 @@ /obj/structure/bed name = "bed" desc = "This is used to lie in, sleep in or strap on." - desc_info = "Click and drag yourself (or anyone) to this to buckle in. Click on this with an empty hand to undo the buckles.
\ - Anyone with restraints, such as handcuffs, will not be able to unbuckle themselves. They must use the Resist button, or verb, to break free of \ - the buckles, instead. \ To unbuckle people as a stationbound, click the bed with an empty gripper." icon = 'icons/obj/structure/beds.dmi' icon_state = "bed" anchored = TRUE @@ -47,18 +44,36 @@ var/mob/living/pulling = null var/propelled = 0 // Check for fire-extinguisher-driven chairs +/obj/structure/bed/mechanics_hints() + . = list() + . += ..() + . += "Click and drag yourself (or anyone) to this to buckle in." + . += "Click on this with an empty hand to undo the buckles." + . += "Anyone with restraints, such as handcuffs, will not be able to unbuckle themselves. They must use the Resist button, or verb, to break free of \ + the buckles instead." + . += "To unbuckle people as a stationbound, click the bed with an empty gripper." + if(held_item) + . += "Click and drag this onto yourself to pick it up." + +/obj/structure/bed/assembly_hints() + . = list() + . += ..() + if(!padding_material) + . += "It could be padded with cloth or leather." + +/obj/structure/bed/disassembly_hints() + . = list() + . += ..() + if(padding_material) + . += "Its padding has visible seams that could be cut." + . += "It is held together by a couple of bolts." + /obj/structure/bed/Initialize() . = ..() LAZYADD(can_buckle, /mob/living) /obj/structure/bed/New(newloc, new_material = MATERIAL_STEEL, new_padding_material, new_painted_colour) ..(newloc) - if(can_buckle) - desc_info = "Click and drag yourself (or anyone) to this to buckle in. Click on this with an empty hand to undo the buckles.
\ - Anyone with restraints, such as handcuffs, will not be able to unbuckle themselves. They must use the Resist button, or verb, to break free of \ - the buckles instead. " - if(held_item) - desc_info += "Click and drag this onto yourself to pick it up. " material = SSmaterials.get_material_by_name(new_material) if(!istype(material)) qdel(src) @@ -657,6 +672,14 @@ */ var/initial_beds = 4 +/obj/structure/roller_rack/feedback_hints(mob/user, distance, is_adjacent) + . = list() + . += "[initial(desc)] \nIt is holding [LAZYLEN(held)] beds." + +/obj/structure/roller_rack/assembly_hints(mob/user, distance, is_adjacent) + . = list() + . += "It [anchored ? "is" : "could be"] anchored to the floor with a couple of screws." + /obj/structure/roller_rack/Initialize() . = ..() for(var/_ in 1 to initial_beds) @@ -678,10 +701,6 @@ beds++ AddOverlays(I) -/obj/structure/roller_rack/examine(mob/user, distance, is_adjacent, infix, suffix, show_extended) - desc = "[initial(desc)] \nIt is holding [LAZYLEN(held)] beds." - . = ..() - /obj/structure/roller_rack/attack_hand(mob/user) if(!LAZYLEN(held)) to_chat(user, SPAN_NOTICE("The rack is empty.")) diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index d67b7cbbdb7..27bec60e748 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -343,7 +343,6 @@ /obj/item/material/stool/chair name = "chair" desc = "Bar brawl essential. Now all that's missing is a ragtime piano." - desc_info = "Click it while in-hand to right it." icon = 'icons/obj/structure/chairs.dmi' icon_state = "chair_item" item_state = "chair" diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index 8bbb4b111b2..5cb671b89f4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -174,7 +174,6 @@ icon_state = "stool_item_preview" item_state = "stool" base_icon = "stool" - desc_info = "Use in-hand or alt-click to right this." randpixel = 0 center_of_mass = null force = 15 // Doesn't really matter. Will get overriden by set_material. @@ -188,6 +187,10 @@ var/deploy_verb = "right" var/painted_colour +/obj/item/material/stool/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use in-hand or alt-click to right it." + /obj/item/material/stool/New(var/newloc, var/new_material, var/new_padding_material, var/new_painted_colour) ..(newloc, new_material) // new_material handled in material_weapons.dm if(new_padding_material) diff --git a/code/game/objects/structures/survey_probe.dm b/code/game/objects/structures/survey_probe.dm index 455fcc9dea6..953e3c5308b 100644 --- a/code/game/objects/structures/survey_probe.dm +++ b/code/game/objects/structures/survey_probe.dm @@ -11,9 +11,6 @@ It has different devices and samplers, as well as internal processing computers, \ to inspect the atmosphere and other properties and qualities of planetary bodies. \ Commonly used by surveyors, explorers, pioneers, all over the Spur, looking to determine the suitability of planets for settlement. " - desc_info = "\ - The probe has to be deployed first before it is used. Wrench it to deploy, then click with empty hand to activate.\ - " icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "surveying_probe" density = FALSE @@ -31,11 +28,22 @@ var/desc_extra = "This probe was manufactured by Orion Express, but it is based on on older model designed by Hephaestus Industries." var/survey_type = SURVEY_TYPE_ATMOSPHERIC +/obj/structure/survey_probe/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The probe has to be deployed first before it is used: wrench it to deploy, then click with empty hand to activate." + +/obj/structure/survey_probe/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This probe was manufactured by Orion Express, but it is based on on older model designed by Hephaestus Industries." + if(survey_type == SURVEY_TYPE_ATMOSPHERIC) + desc += "When deployed, this probe will read and relay weather data to compatible devices." + if(survey_type == SURVEY_TYPE_GROUND) + desc += "When deployed, this probe will read and relay seismic data to compatible devices." + if(survey_type == SURVEY_TYPE_GEOMAGNETIC) + desc += "When deployed, this probe will read and relay geomagnetic data to compatible devices." + /obj/structure/survey_probe/Initialize(mapload) . = ..() - desc_extended += desc_extra - if(survey_type == SURVEY_TYPE_ATMOSPHERIC) - desc += " When deployed, this probe will read and relay weather data to compatible devices." if(start_deployed) deploy() @@ -224,8 +232,6 @@ It has different devices and drill bits, as well as internal processing computers, \ to inspect the ground, soil and crust of planetary bodies. \ Commonly used by surveyors, explorers, pioneers, all over the Spur, looking to determine the mineral value of planets for settlement. " - desc_info = "\ - The probe has to be deployed first before it is used. Wrench it to deploy, then click with empty hand to activate." icon_state = "ground_probe" survey_type = SURVEY_TYPE_GROUND @@ -268,8 +274,6 @@ It has different devices and instruments bits, as well as internal processing computers, \ to inspect the magnetic field and magnetosphere of planetary bodies. \ Commonly used by surveyors, explorers, pioneers, all over the Spur, looking to determine the sefety and comfort of planets for settlement. " - desc_info = "\ - The probe has to be deployed first before it is used. Wrench it to deploy, then click with empty hand to activate." icon_state = "magnet_probe" survey_type = SURVEY_TYPE_GEOMAGNETIC diff --git a/code/game/objects/structures/undetonated_nuke.dm b/code/game/objects/structures/undetonated_nuke.dm index cdef37a9d75..ef2a7e8cf5d 100644 --- a/code/game/objects/structures/undetonated_nuke.dm +++ b/code/game/objects/structures/undetonated_nuke.dm @@ -8,8 +8,8 @@ ///Whether this nuke will explode if caught in an explosion. var/can_explode = TRUE -/obj/structure/undetonated_nuke/get_examine_text(mob/user, distance) - . = ..() +/obj/structure/undetonated_nuke/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(GLOB.all_languages[LANGUAGE_AZAZIBA] in user.languages) . += SPAN_NOTICE("The inscription reads \"WARNING: FISSILE MATERIAL. HANDLE WITH CARE.\" Underneath are a few words, scratched into the metal. They read \"IF FOUND, RETURN TO SKALAMAR AT HIGH VELOCITY\"") diff --git a/code/game/objects/structures/urban.dm b/code/game/objects/structures/urban.dm index 224e407f670..0dea75c10da 100644 --- a/code/game/objects/structures/urban.dm +++ b/code/game/objects/structures/urban.dm @@ -770,7 +770,6 @@ ABSTRACT_TYPE(/obj/structure/stairs/urban/road_ramp) /obj/structure/cash_register name = "cash register machine" desc = "A retail nightmare object." - desc_info = "Drag this onto yourself to open the cash compartment." icon = 'icons/obj/structure/urban/infrastructure.dmi' icon_state = "cashier" layer = 2.99 @@ -779,6 +778,10 @@ ABSTRACT_TYPE(/obj/structure/stairs/urban/road_ramp) var/storage_type = /obj/item/storage/toolbox/cash_register_storage var/obj/item/storage/storage_compartment +/obj/structure/cash_register/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Drag this onto yourself to open the cash compartment." + /obj/structure/cash_register/Initialize(mapload) . = ..() if(storage_type) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d11f61101b9..656a39d1e34 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -144,6 +144,11 @@ var/list/temperature_settings = list("normal" = 310, "boiling" = T0C+100, "freezing" = T0C) var/datum/looping_sound/showering/soundloop +/obj/structure/shower/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Left-click \the [src] to toggle it on and off." + . += "Use a wrench on \the [src] to adjust the temperature." + /obj/machinery/shower/Initialize() . = ..() create_reagents(2) @@ -311,13 +316,16 @@ icon = 'icons/obj/watercloset.dmi' icon_state = "sink" desc = "A sink used for washing one's hands and face." - desc_info = "Use HELP intent to fill a container in your hand from this. Use DISARM intent to rinse an empty container. Use any other intent to empty the container into this. \ - You can right-click this and change the amount transferred per use." anchored = 1 var/busy = 0 //Something's being washed at the moment var/amount_per_transfer_from_this = 300 var/possible_transfer_amounts = list(5,10,15,25,30,50,60,100,120,250,300) +/obj/structure/sink/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use Help intent to fill a container in your hand from this, and use any other intent to empty the container into this." + . += "Right-click \the [src] to change the amount transferred per use." + /obj/structure/sink/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" set category = "Object" diff --git a/code/game/objects/structures/weapons_rack.dm b/code/game/objects/structures/weapons_rack.dm index dd5900ed94e..02a4726e1e8 100644 --- a/code/game/objects/structures/weapons_rack.dm +++ b/code/game/objects/structures/weapons_rack.dm @@ -17,6 +17,17 @@ VAR_PRIVATE/obj/effect/visual_holder +/obj/structure/weapons_rack/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + + if(locate(/obj/item/gun) in src) + . += "
It contains:
" + for(var/obj/item/gun/G in src.contents) + . += "\A [G.name]" + + if(locked) + . += SPAN_WARNING("It is locked.") + /obj/structure/weapons_rack/Initialize(mapload) ..() visual_holder = new() @@ -159,17 +170,6 @@ #undef BASE_OFFSET_RIFLE_SLOT #undef INTER_OFFSET_RIFLE_SLOT -/obj/structure/weapons_rack/get_examine_text(mob/user, distance, is_adjacent, infix, suffix, get_extended) - . = ..() - - if(locate(/obj/item/gun) in src) - . += "
It contains:
" - for(var/obj/item/gun/G in src.contents) - . += "\A [G.name]" - - if(locked) - . += SPAN_WARNING("It is locked.") - /obj/structure/weapons_rack/emag_act(remaining_charges, mob/user, emag_source) . = ..() diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index b9fce38d9ac..1b6ced58adc 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -34,9 +34,8 @@ atmos_canpass = CANPASS_PROC -/obj/structure/window/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - +/obj/structure/window/condition_hints(mob/user, distance, is_adjacent) + . += ..() if(health == maxhealth) . += SPAN_NOTICE("It looks fully intact.") else diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 2a6533ebf78..ed83915e398 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -26,8 +26,8 @@ /// If the turf should generate details. Default: TRUE var/has_edge_icon = TRUE -/turf/simulated/floor/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/turf/simulated/floor/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() if(flooring) var/list/can_remove_with = list() if(flooring.flags & TURF_REMOVE_CROWBAR) @@ -42,8 +42,11 @@ can_remove_with += "wrenches" if(flooring.flags & TURF_REMOVE_WELDER) can_remove_with += "welding tools" - if(length(can_remove_with)) - . += SPAN_NOTICE("\The [src] can be removed with: [english_list(can_remove_with)].") + + if(!length(can_remove_with)) + can_remove_with = "nothing!" + + . += SPAN_NOTICE("\The [src] can be removed with: [english_list(can_remove_with)].") /turf/simulated/floor/is_plating() return !flooring diff --git a/code/game/turfs/simulated/wall_rot.dm b/code/game/turfs/simulated/wall_rot.dm index 2c9ba80a2d1..e546579cd41 100644 --- a/code/game/turfs/simulated/wall_rot.dm +++ b/code/game/turfs/simulated/wall_rot.dm @@ -21,10 +21,13 @@ /obj/item/rot_sample name = "rot sample" desc = "A gross, wet, squishy piece of what may be a plant." - desc_info = "This sample can be ground to retrieve reagents inside it." icon = 'icons/effects/wallrot.dmi' icon_state = "rot_sample" +/obj/item/rot_sample/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This sample can be ground to retrieve reagents inside it." + /obj/item/rot_sample/Initialize(mapload) . = ..() create_reagents(15) diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index 38fe7d6be92..230473db8e8 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -1,11 +1,14 @@ /turf/simulated/wall/r_wall - desc_info = "You can deconstruct this by with the following steps:
\ + icon = 'icons/turf/smooth/wall_preview.dmi' + icon_state = "r_wall" + +/turf/simulated/wall/r_wall/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can deconstruct this by with the following steps:
\ Cut the outer grill with wirecutters, then unscrew them.
\ Slice the cover with a welder, then pry it off with a crowbar.
\ Use a wrench to loosen the anchor bolts, then cut the supports with a welder.
\ - Pry off the sheath with a crowbar to expose the girder. Examine it to see how to deconstruct it." - icon = 'icons/turf/smooth/wall_preview.dmi' - icon_state = "r_wall" + Pry off the sheath with a crowbar to expose the girder." /turf/simulated/wall/r_wall/Initialize(mapload) . = ..(mapload, "plasteel","plasteel") //3strong diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index b4a74460932..17f99013544 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -1,8 +1,6 @@ /turf/simulated/wall name = "wall" desc = "A huge chunk of metal used to seperate rooms." - desc_info = "You can deconstruct this by welding it, and then wrenching the girder.
\ - You can build a wall by using metal sheets and making a girder, then adding more material." icon = 'icons/turf/smooth/wall_preview.dmi' icon_state = "wall" opacity = TRUE @@ -50,6 +48,39 @@ pathing_pass_method = TURF_PATHING_PASS_NO //Literally a wall, until we implement bots that can wallwarp, we might aswell save the processing + +/turf/simulated/wall/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if(!damage) + . += SPAN_NOTICE("It looks fully intact.") + else + var/dam = damage / material.integrity + if(dam <= 0.3) + . += SPAN_WARNING("It looks slightly damaged.") + else if(dam <= 0.6) + . += SPAN_WARNING("It looks moderately damaged.") + else + . += SPAN_DANGER("It looks heavily damaged.") + +/turf/simulated/wall/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(locate(/obj/effect/overlay/wallrot) in src) + . += "Wall rot fungus makes walls highly susceptible to damage- pushing on it now might make it break apart." + . += "It can be removed cleanly with a welding tool, or scraped off for processing with a bladed item like wirecutters." + +/turf/simulated/wall/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can build a wall by using metal sheets and making a girder, then adding more material." + +/turf/simulated/wall/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Plating can be removed from a wall by use of a welder." + +/turf/simulated/wall/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(locate(/obj/effect/overlay/wallrot) in src) + . += SPAN_WARNING("There is fungus growing on [src].") + // Walls always hide the stuff below them. /turf/simulated/wall/levelupdate(mapload) if (mapload) @@ -140,24 +171,6 @@ clear_bulletholes() return ..() -//Appearance -/turf/simulated/wall/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - - if(!damage) - . += SPAN_NOTICE("It looks fully intact.") - else - var/dam = damage / material.integrity - if(dam <= 0.3) - . += SPAN_WARNING("It looks slightly damaged.") - else if(dam <= 0.6) - . += SPAN_WARNING("It looks moderately damaged.") - else - . += SPAN_DANGER("It looks heavily damaged.") - - if(locate(/obj/effect/overlay/wallrot) in src) - . += SPAN_WARNING("There is fungus growing on [src].") - //Damage /turf/simulated/wall/melt(var/do_message = TRUE) diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index 9ed4f6898ec..e959148f88b 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -53,7 +53,7 @@ /turf/space/transit/bluespace //this is typically going to be used by shuttles/ships that aren't present in the sector, to imply they've had to bluespace jump some distance away. name = "bluespace" desc = "The blue beyond, a breach into an unknown dimension. Don't lick it." - desc_info = "Bluespace is a very strange form of pocket dimension, that is largely unpredictable and completely unexplored. While there is speculation about the possibility of celestial bodies existing in Bluespace, it is highly unlikely. Travelling in the Bluespace dimension without a proper gate or Bluespace drive has thus far been proven to be incredibly dangerous, with probes either appearing in unintended locations or never returning at all." + desc_extended = "Bluespace is a very strange form of pocket dimension, that is largely unpredictable and completely unexplored. While there is speculation about the possibility of celestial bodies existing in Bluespace, it is highly unlikely. Travelling in the Bluespace dimension without a proper gate or Bluespace drive has thus far been proven to be incredibly dangerous, with probes either appearing in unintended locations or never returning at all." icon_state = "bluespace-n" plane = 0 use_space_appearance = FALSE diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 862647a1acd..e1d104bba23 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -15,6 +15,14 @@ var/obj/item/device/assembly/a_right = null var/obj/special_assembly = null +/obj/item/device/assembly_holder/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1 || src.loc == user) + if (src.secured) + . += SPAN_NOTICE("\The [src] is ready!") + else + . += SPAN_NOTICE("\The [src] can be attached!") + /obj/item/device/assembly_holder/Initialize(mapload, ...) . = ..() become_hearing_sensitive() @@ -82,14 +90,6 @@ if(master) master.update_icon() -/obj/item/device/assembly_holder/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1 || src.loc == user) - if (src.secured) - . += SPAN_NOTICE("\The [src] is ready!") - else - . += SPAN_NOTICE("\The [src] can be attached!") - /obj/item/device/assembly_holder/HasProximity(atom/movable/AM as mob|obj) if(a_left) a_left.HasProximity(AM) diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 0395d758174..a9a94abd820 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -15,6 +15,11 @@ var/obj/effect/beam/i_beam/first = null var/turf/beam_origin //If we're not on this turf anymore, we've moved. Catches holder.master movements when we're attached to bombs and stuff. +/obj/item/device/assembly/infra/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/direction_text = dir2text(dir) + . += SPAN_NOTICE("It is facing [direction_text].") + /obj/item/device/assembly/infra/activate() if(!..()) return FALSE //Cooldown check @@ -58,11 +63,6 @@ to_chat(user, SPAN_NOTICE("You rotate \the [src] to face [direction_text].")) QDEL_NULL(first) -/obj/item/device/assembly/infra/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/direction_text = dir2text(dir) - . += SPAN_NOTICE("It is facing [direction_text].") - /obj/item/device/assembly/infra/process() if(!on || !secured) diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 4620f984726..18d71c8bb2d 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -20,6 +20,15 @@ var/datum/radio_frequency/radio_connection var/deadman = FALSE +/obj/item/device/assembly/signaler/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Signalers can be attached to a variety of machinery to remotely activate them." + . += "Signalers can be to individual wires within machinery; when a signal is received, it will pulse the wire much like a multitool." + +/obj/item/device/assembly/signaler/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Signalers can be attached to a variety of machinery to do unspeakable harm or serve as fantastic diversions." + /obj/item/device/assembly/signaler/Initialize() . = ..() set_frequency(frequency) diff --git a/code/modules/atmospherics/components/binary_devices/circulator.dm b/code/modules/atmospherics/components/binary_devices/circulator.dm index 8a3d6507905..29d07488918 100644 --- a/code/modules/atmospherics/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/components/binary_devices/circulator.dm @@ -4,8 +4,6 @@ /obj/machinery/atmospherics/binary/circulator name = "circulator" desc = "A gas circulator turbine and heat exchanger." - desc_info = "This generates electricity, depending on the difference in temperature between each side of the machine. The meter in \ - the center of the machine gives an indicator of how much elecrtricity is being generated." icon = 'icons/obj/power.dmi' icon_state = "circ-unassembled" anchored = FALSE @@ -26,6 +24,11 @@ density = TRUE +/obj/machinery/atmospherics/binary/circulator/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This generates electricity, depending on the difference in temperature between each side of the machine." + . += "The meter in the center of the machine gives an indicator of how much elecrtricity is being generated." + /obj/machinery/atmospherics/binary/circulator/Initialize() . = ..() desc = initial(desc) + " Its outlet port is to the [dir2text(dir)]." diff --git a/code/modules/atmospherics/components/binary_devices/passive_gate.dm b/code/modules/atmospherics/components/binary_devices/passive_gate.dm index af523916234..fbde575f30c 100644 --- a/code/modules/atmospherics/components/binary_devices/passive_gate.dm +++ b/code/modules/atmospherics/components/binary_devices/passive_gate.dm @@ -5,7 +5,6 @@ /obj/machinery/atmospherics/binary/passive_gate name = "pressure regulator" desc = "A one-way air valve that can be used to regulate input or output pressure, and flow rate. Does not require power." - desc_info = "This is a one-way regulator, allowing gas to flow only at a specific pressure and flow rate. If the light is green, it is flowing." icon = 'icons/atmos/passive_gate.dmi' icon_state = "map" level = 1 @@ -26,8 +25,14 @@ var/broadcast_status_next_process = FALSE +/obj/machinery/atmospherics/binary/passive_gate/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a one-way regulator, allowing gas to flow only at a specific pressure and flow rate." + . += "If the light is green, it is flowing." + /obj/machinery/atmospherics/binary/passive_gate/on unlocked = 1 + /obj/machinery/atmospherics/binary/passive_gate/on/input regulate_mode = REGULATE_INPUT diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index 2b5ee1bb349..57dbd63c4a5 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -15,7 +15,6 @@ Thus, the two variables affect pump operation are set in New(): /obj/machinery/atmospherics/binary/pump name = "gas pump" desc = "A pump." - desc_info = "This moves gas from one pipe to another. A higher target pressure demands more energy. The side with the colored end is the output." icon = 'icons/atmos/pump.dmi' icon_state = "map_off" level = 1 @@ -37,6 +36,11 @@ Thus, the two variables affect pump operation are set in New(): var/broadcast_status_next_process = FALSE +/obj/machinery/atmospherics/binary/pump/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This moves gas from one pipe to another. A higher target pressure demands more energy." + . += "The side with the colored end is the output." + /obj/machinery/atmospherics/binary/pump/Initialize() . = ..() air1.volume = ATMOS_DEFAULT_VOLUME_PUMP diff --git a/code/modules/atmospherics/components/omni_devices/filter.dm b/code/modules/atmospherics/components/omni_devices/filter.dm index daca66355e4..c60f1ec0fb9 100644 --- a/code/modules/atmospherics/components/omni_devices/filter.dm +++ b/code/modules/atmospherics/components/omni_devices/filter.dm @@ -5,8 +5,6 @@ name = "omni gas filter" icon_state = "map_filter" base_icon = "filter" - desc_info = "Filters gas from a custom input direction, with up to two filtered outputs and a 'everything else' \ - output. The filtered output's arrows glow orange." var/list/active_filters = new() var/datum/omni_port/input @@ -20,6 +18,11 @@ var/list/filtering_outputs = list() //maps gasids to gas_mixtures +/obj/machinery/atmospherics/omni/filter/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Filters gas from a custom input direction, with up to two filtered outputs and an 'everything else' output." + . += "The filtered output's arrows glow orange." + /obj/machinery/atmospherics/omni/filter/Initialize() . = ..() rebuild_filtering_list() diff --git a/code/modules/atmospherics/components/omni_devices/mixer.dm b/code/modules/atmospherics/components/omni_devices/mixer.dm index e7bb936f1c2..2640168dd6b 100644 --- a/code/modules/atmospherics/components/omni_devices/mixer.dm +++ b/code/modules/atmospherics/components/omni_devices/mixer.dm @@ -5,7 +5,6 @@ name = "omni gas mixer" icon_state = "map_mixer" base_icon = "mixer" - desc_info = "Combines gas from custom input and output directions. The percentage of combined gas can be defined." use_power = POWER_USE_IDLE idle_power_usage = 150 //internal circuitry, friction losses and stuff @@ -25,6 +24,10 @@ var/list/mixing_inputs = list() +/obj/machinery/atmospherics/omni/mixer/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Combines gas from custom input and output directions. The percentage of combined gas can be defined." + /obj/machinery/atmospherics/omni/mixer/Initialize() . = ..() if(mapper_set()) diff --git a/code/modules/atmospherics/components/tvalve.dm b/code/modules/atmospherics/components/tvalve.dm index 31198a2b6a6..fa770df2f37 100644 --- a/code/modules/atmospherics/components/tvalve.dm +++ b/code/modules/atmospherics/components/tvalve.dm @@ -1,7 +1,6 @@ /obj/machinery/atmospherics/tvalve name = "manual switching valve" desc = "A pipe valve." - desc_info = "Click this to toggle the mode. The direction with the green light is where the gas will flow." icon = 'icons/atmos/tvalve.dmi' icon_state = "map_tvalve0" @@ -18,6 +17,10 @@ var/datum/pipe_network/network_node2 var/datum/pipe_network/network_node3 +/obj/machinery/atmospherics/tvalve/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click this to toggle the mode. The direction with the green light is where the gas will flow." + /obj/machinery/atmospherics/tvalve/bypass icon_state = "map_tvalve1" state = 1 diff --git a/code/modules/atmospherics/components/unary/cold_sink.dm b/code/modules/atmospherics/components/unary/cold_sink.dm index af12ad3482f..d10868266c2 100644 --- a/code/modules/atmospherics/components/unary/cold_sink.dm +++ b/code/modules/atmospherics/components/unary/cold_sink.dm @@ -4,9 +4,6 @@ /obj/machinery/atmospherics/unary/freezer name = "gas cooling system" desc = "Cools gas when connected to pipe network." - desc_info = "Cools down the gas of the pipe it is connected to. It uses massive amounts of electricity while on. \ - It can be upgraded by replacing the capacitors, manipulators, and matter bins. It can be deconstructed by screwing the maintenance panel open with a \ - screwdriver, and then using a crowbar." icon = 'icons/obj/machinery/sleeper.dmi' icon_state = "freezer_0" density = 1 @@ -31,12 +28,18 @@ /obj/item/stack/cable_coil{amount = 2} ) - component_hint_bin = "Upgraded matter bins will improve cooling efficiency and increase the volume of air it can cool at once." - component_hint_cap = "Upgraded capacitors will increase maximum power setting." - component_hint_servo = "Upgraded manipulators will improve cooling efficiency." - parts_power_mgmt = FALSE +/obj/machinery/atmospherics/unary/freezer/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Cools down the gas of the pipe it is connected to. It uses massive amounts of electricity while on." + +/obj/machinery/atmospherics/unary/freezer/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will improve cooling efficiency and increase the volume of air it can cool at once." + . += "Upgraded capacitors will increase maximum power setting." + . += "Upgraded manipulators will improve cooling efficiency." + /obj/machinery/atmospherics/unary/freezer/Initialize() initialize_directions = dir . = ..() @@ -186,8 +189,3 @@ return TRUE return ..() - -/obj/machinery/atmospherics/unary/freezer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(panel_open) - . += "The maintenance hatch is open." diff --git a/code/modules/atmospherics/components/unary/heat_source.dm b/code/modules/atmospherics/components/unary/heat_source.dm index 6b324daa15d..be4816b7741 100644 --- a/code/modules/atmospherics/components/unary/heat_source.dm +++ b/code/modules/atmospherics/components/unary/heat_source.dm @@ -4,9 +4,6 @@ /obj/machinery/atmospherics/unary/heater name = "gas heating system" desc = "Heats gas when connected to a pipe network." - desc_info = "Heats up the gas of the pipe it is connected to. It uses massive amounts of electricity while on. \ - It can be upgraded by replacing the capacitors, manipulators, and matter bins. It can be deconstructed by screwing the maintenance panel open with a \ - screwdriver, and then using a crowbar." icon = 'icons/obj/machinery/sleeper.dmi' icon_state = "heater_0" density = 1 @@ -30,8 +27,14 @@ /obj/item/stack/cable_coil{amount = 5} ) - component_hint_bin = "Upgraded matter bins will increase maximum temperature setting and the volume of air it can heat at once." - component_hint_cap = "Upgraded capacitors will increase maximum power setting and maximum temperature setting." +/obj/machinery/atmospherics/unary/heater/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "heats up the gas of the pipe it is connected to. It uses massive amounts of electricity while on." + +/obj/machinery/atmospherics/unary/heater/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will increase maximum temperature setting and the volume of air it can heat at once." + . += "Upgraded capacitors will increase maximum power setting and maximum temperature setting." /obj/machinery/atmospherics/unary/heater/Initialize() initialize_directions = dir @@ -171,8 +174,3 @@ return TRUE return ..() - -/obj/machinery/atmospherics/unary/heater/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(panel_open) - . += "The maintenance hatch is open." diff --git a/code/modules/atmospherics/components/unary/outlet_injector.dm b/code/modules/atmospherics/components/unary/outlet_injector.dm index 46010337e04..d7dbf3c923c 100644 --- a/code/modules/atmospherics/components/unary/outlet_injector.dm +++ b/code/modules/atmospherics/components/unary/outlet_injector.dm @@ -5,8 +5,6 @@ /obj/machinery/atmospherics/unary/outlet_injector name = "air injector" desc = "Passively injects air into its surroundings. Has a valve attached to it that can control flow rate." - desc_info = "Outputs the pipe's gas into the atmosphere, similar to an airvent. It can be controlled by a nearby atmospherics computer. \ - A green light on it means it is on." icon = 'icons/atmos/injector.dmi' icon_state = "map_injector" @@ -26,6 +24,12 @@ level = 1 +/obj/machinery/atmospherics/unary/outlet_injector/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Outputs the pipe's gas into the atmosphere, similar to an airvent." + . += "It can be controlled by a nearby atmospherics computer." + . += "A green light on it means it is on." + /obj/machinery/atmospherics/unary/outlet_injector/Initialize() . = ..() air_contents.volume = ATMOS_DEFAULT_VOLUME_PUMP + 500 //Give it a small reservoir for injecting. Also allows it to have a higher flow rate limit than vent pumps, to differentiate injectors a bit more. diff --git a/code/modules/atmospherics/components/unary/vent_pump.dm b/code/modules/atmospherics/components/unary/vent_pump.dm index 748ee003b29..32964290b4e 100644 --- a/code/modules/atmospherics/components/unary/vent_pump.dm +++ b/code/modules/atmospherics/components/unary/vent_pump.dm @@ -10,7 +10,6 @@ /obj/machinery/atmospherics/unary/vent_pump name = "air vent" desc = "Has a valve and pump attached to it." - desc_info = "This pumps the contents of the attached pipe out into the atmosphere, if needed. It can be controlled from an Air Alarm." icon = 'icons/atmos/vent_pump.dmi' icon_state = "map_vent" @@ -51,6 +50,20 @@ var/broadcast_status_next_process = FALSE +/obj/machinery/atmospherics/unary/vent_pump/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This pumps the contents of the attached pipe out into the atmosphere, if needed." + . += "It can be controlled from an Air Alarm." + +/obj/machinery/atmospherics/unary/vent_pump/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + . += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s at [round(last_power_draw)] W." + else + . += "You are too far away to read the gauge." + if(welded) + . += "It seems welded shut." + /obj/machinery/atmospherics/unary/vent_pump/on use_power = POWER_USE_IDLE icon_state = "map_vent_out" @@ -455,15 +468,6 @@ return ..() -/obj/machinery/atmospherics/unary/vent_pump/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s at [round(last_power_draw)] W." - else - . += "You are too far away to read the gauge." - if(welded) - . += "It seems welded shut." - /obj/machinery/atmospherics/unary/vent_pump/power_change() var/old_stat = stat ..() diff --git a/code/modules/atmospherics/components/unary/vent_scrubber.dm b/code/modules/atmospherics/components/unary/vent_scrubber.dm index 81b0a863b18..72a93e413dc 100644 --- a/code/modules/atmospherics/components/unary/vent_scrubber.dm +++ b/code/modules/atmospherics/components/unary/vent_scrubber.dm @@ -1,8 +1,6 @@ /obj/machinery/atmospherics/unary/vent_scrubber name = "air scrubber" desc = "Has a valve and pump attached to it." - desc_info = "This filters the atmosphere of harmful gas. Filtered gas goes to the pipes connected to it, typically a scrubber pipe. \ - It can be controlled from an Air Alarm. It can be configured to drain all air rapidly with a 'panic syphon' from an air alarm." icon = 'icons/atmos/vent_scrubber.dmi' icon_state = "map_scrubber_off" @@ -33,6 +31,21 @@ var/broadcast_status_next_process = FALSE +/obj/machinery/atmospherics/unary/vent_scrubber/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This filters the atmosphere of harmful gas. Filtered gas goes to the pipes connected to it, typically a scrubber pipe." + . += "It can be controlled from an Air Alarm." + . += "It can be configured to drain all air rapidly with a 'panic siphon' from an air alarm." + +/obj/machinery/atmospherics/unary/vent_scrubber/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + . += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s at [round(last_power_draw)] W." + else + . += "You are too far away to read the gauge." + if(welded) + . += "It seems welded shut." + /obj/machinery/atmospherics/unary/vent_scrubber/on use_power = POWER_USE_IDLE icon_state = "map_scrubber_on" @@ -416,12 +429,3 @@ return TRUE return ..() - -/obj/machinery/atmospherics/unary/vent_scrubber/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s at [round(last_power_draw)] W." - else - . += "You are too far away to read the gauge." - if(welded) - . += "It seems welded shut." diff --git a/code/modules/atmospherics/components/valve.dm b/code/modules/atmospherics/components/valve.dm index 0245f02e3b3..0254ea47708 100644 --- a/code/modules/atmospherics/components/valve.dm +++ b/code/modules/atmospherics/components/valve.dm @@ -1,7 +1,6 @@ /obj/machinery/atmospherics/valve name = "manual valve" desc = "A pipe valve." - desc_info = "Click this to turn the valve. If red, the pipes on each end are seperated. Otherwise, they are connected." icon = 'icons/atmos/valve.dmi' icon_state = "map_valve0" @@ -15,6 +14,15 @@ var/datum/pipe_network/network_node1 var/datum/pipe_network/network_node2 +/obj/machinery/atmospherics/valve/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It is [open ? "open" : "closed"]." + +/obj/machinery/atmospherics/valve/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click this to turn the valve." + . += "If red, the pipes on each end are seperated. Otherwise, they are connected." + /obj/machinery/atmospherics/valve/open open = 1 icon_state = "map_valve1" @@ -323,7 +331,3 @@ new /obj/item/pipe(loc, make_from=src) qdel(src) return TRUE - -/obj/machinery/atmospherics/valve/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It is [open ? "open" : "closed"]." diff --git a/code/modules/atmospherics/he_pipes.dm b/code/modules/atmospherics/he_pipes.dm index 6e20f4935e4..eda065361f9 100644 --- a/code/modules/atmospherics/he_pipes.dm +++ b/code/modules/atmospherics/he_pipes.dm @@ -1,5 +1,4 @@ /obj/machinery/atmospherics/pipe/simple/heat_exchanging - desc_info = "This radiates heat from the pipe's gas to space, cooling it down." icon = 'icons/atmos/heat.dmi' icon_state = "intact" pipe_icon = "hepipe" @@ -19,6 +18,11 @@ volume = ATMOS_DEFAULT_VOLUME_HE_PIPE // BubbleWrap + +/obj/machinery/atmospherics/pipe/simple/heat_exchanging/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This radiates heat from the pipe's gas to space, cooling it down." + /obj/machinery/atmospherics/pipe/simple/heat_exchanging/Initialize() . = ..() initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe diff --git a/code/modules/atmospherics/pipes.dm b/code/modules/atmospherics/pipes.dm index 9c2e96a6b54..4900f80b847 100644 --- a/code/modules/atmospherics/pipes.dm +++ b/code/modules/atmospherics/pipes.dm @@ -1,6 +1,4 @@ /obj/machinery/atmospherics/pipe - desc_info = "This pipe, and all other pipes, can be connected or disconnected by a wrench. The internal pressure of the pipe must \ - be below 300 kPa to do this. More pipes can be obtained from the pipe dispenser." obj_flags = OBJ_FLAG_MOVES_UNSUPPORTED var/datum/gas_mixture/air_temporary // used when reconstructing a pipeline that broke var/datum/pipeline/parent @@ -16,18 +14,17 @@ buckle_require_restraints = 1 buckle_lying = -1 -/obj/machinery/atmospherics/pipe/drain_power() - return -1 +/obj/machinery/atmospherics/pipe/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This pipe, and all other pipes, can be safely connected or disconnected by a pipe wrench. The internal pressure of the pipe must \ + be below 300 kPa to do this." + . += "Using a regular wrench on a pressurized pipe is not a good idea." + . += "Special pipe types, like Supply, Scrubber, Fuel, and Aux, will not connect to normal pipes or to each other. If you want to connect them, use \ + a Universal Adapter pipe." + . += "Use an Analyzer on a pipe to get details on its contents." -/obj/machinery/atmospherics/pipe/Initialize() - if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/unsimulated/wall)) - level = 1 - . = ..() - desc_info += "
Most pipes and atmospheric devices can be connected or disconnected with a wrench. The pipe's pressure must not be too high, \ - or if it is a device, it must be turned off first." - -/obj/machinery/atmospherics/pipe/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/atmospherics/pipe/feedback_hints(mob/user, distance, is_adjacent) + . += ..() var/pipe_color_check = pipe_color || PIPE_COLOR_GREY var/found_color_name = "Unknown" for(var/color_name in GLOB.pipe_colors) @@ -37,6 +34,14 @@ break . += "This pipe is: [capitalize(found_color_name)]" +/obj/machinery/atmospherics/pipe/drain_power() + return -1 + +/obj/machinery/atmospherics/pipe/Initialize() + if(istype(get_turf(src), /turf/simulated/wall) || istype(get_turf(src), /turf/unsimulated/wall)) + level = 1 + . = ..() + /obj/machinery/atmospherics/pipe/hides_under_flooring() return level != 2 @@ -351,16 +356,12 @@ return null /obj/machinery/atmospherics/pipe/simple/visible - desc_info = "This is a special 'scrubber' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact" level = 2 /obj/machinery/atmospherics/pipe/simple/visible/scrubbers name = "Scrubbers pipe" desc = "A one meter section of scrubbers pipe." - desc_info = "This is a special 'scrubbers' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER icon_connect_type = "-scrubbers" @@ -369,8 +370,6 @@ /obj/machinery/atmospherics/pipe/simple/visible/supply name = "Air supply pipe" desc = "A one meter section of supply pipe" - desc_info = "This is a special 'supply' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-supply" connect_types = CONNECT_TYPE_SUPPLY icon_connect_type = "-supply" @@ -379,8 +378,6 @@ /obj/machinery/atmospherics/pipe/simple/visible/fuel name = "Fuel pipe" desc = "A one meter section of fuel pipe." - desc_info = "This is a special 'fuel' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-fuel" connect_types = CONNECT_TYPE_FUEL icon_connect_type = "-fuel" @@ -389,8 +386,6 @@ /obj/machinery/atmospherics/pipe/simple/visible/aux name = "Auxiliary pipe" desc = "A one meter section of auxiliary pipe." - desc_info = "This is a special 'aux' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-aux" connect_types = CONNECT_TYPE_AUX icon_connect_type = "-aux" @@ -425,8 +420,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers name = "Scrubbers pipe" desc = "A one meter section of scrubbers pipe." - desc_info = "This is a special 'scrubber' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER icon_connect_type = "-scrubbers" @@ -435,8 +428,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/supply name = "Air supply pipe" desc = "A one meter section of supply pipe." - desc_info = "This is a special 'supply' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-supply" connect_types = CONNECT_TYPE_SUPPLY icon_connect_type = "-supply" @@ -445,8 +436,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/fuel name = "Fuel pipe" desc = "A one meter section of fuel pipe." - desc_info = "This is a special 'fuel' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-fuel" connect_types = CONNECT_TYPE_FUEL icon_connect_type = "-fuel" @@ -455,8 +444,6 @@ /obj/machinery/atmospherics/pipe/simple/hidden/aux name = "Auxiliary pipe" desc = "A one meter section of auxiliary pipe." - desc_info = "This is a special 'aux' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "intact-aux" connect_types = CONNECT_TYPE_AUX icon_connect_type = "-aux" @@ -486,7 +473,6 @@ /obj/machinery/atmospherics/pipe/manifold name = "pipe manifold" desc = "A manifold composed of regular pipes." - desc_info = "A normal pipe with three ends to connect to." icon = 'icons/atmos/manifold.dmi' icon_state = "" @@ -680,8 +666,6 @@ /obj/machinery/atmospherics/pipe/manifold/visible/scrubbers name = "scrubbers pipe manifold" desc = "A manifold composed of scrubbers pipes" - desc_info = "This is a special 'scrubber' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER icon_connect_type = "-scrubbers" @@ -690,8 +674,6 @@ /obj/machinery/atmospherics/pipe/manifold/visible/supply name = "air supply pipe manifold" desc = "A manifold composed of supply pipes." - desc_info = "This is a special 'supply' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-supply" connect_types = CONNECT_TYPE_SUPPLY icon_connect_type = "-supply" @@ -700,8 +682,6 @@ /obj/machinery/atmospherics/pipe/manifold/visible/fuel name = "fuel pipe manifold" desc = "A manifold composed of fuel piping." - desc_info = "This is a special 'fuel' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-fuel" connect_types = CONNECT_TYPE_FUEL icon_connect_type = "-fuel" @@ -710,8 +690,6 @@ /obj/machinery/atmospherics/pipe/manifold/visible/aux name = "auxiliary pipe manifold" desc = "A manifold composed of auxiliary piping." - desc_info = "This is a special 'aux' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-aux" connect_types = CONNECT_TYPE_AUX icon_connect_type = "-aux" @@ -746,8 +724,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers name = "scrubbers pipe manifold" desc = "A manifold composed of scrubbers pipes." - desc_info = "This is a special 'scrubber' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER icon_connect_type = "-scrubbers" @@ -756,8 +732,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/supply name = "air supply pipe manifold" desc = "A manifold composed of supply pipes." - desc_info = "This is a special 'supply' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-supply" connect_types = CONNECT_TYPE_SUPPLY icon_connect_type = "-supply" @@ -766,8 +740,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/fuel name = "Fuel pipe manifold" desc = "A manifold composed of fuel pipes." - desc_info = "This is a special 'fuel' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-fuel" connect_types = CONNECT_TYPE_FUEL icon_connect_type = "-fuel" @@ -776,8 +748,6 @@ /obj/machinery/atmospherics/pipe/manifold/hidden/aux name = "Auxiliary pipe" desc = "A manifold composed of auxiliary pipes." - desc_info = "This is a special 'aux' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map-aux" connect_types = CONNECT_TYPE_AUX icon_connect_type = "-aux" @@ -807,7 +777,6 @@ /obj/machinery/atmospherics/pipe/manifold4w name = "4-way pipe manifold" desc = "A manifold composed of regular pipes." - desc_info = "This is a four-way pipe." icon = 'icons/atmos/manifold.dmi' icon_state = "" @@ -1003,8 +972,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers name = "4-way scrubbers pipe manifold" desc = "A manifold composed of scrubbers pipes." - desc_info = "This is a special 'scrubber' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER icon_connect_type = "-scrubbers" @@ -1013,8 +980,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/visible/supply name = "4-way air supply pipe manifold" desc = "A manifold composed of supply pipes" - desc_info = "This is a special 'supply' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-supply" connect_types = CONNECT_TYPE_SUPPLY icon_connect_type = "-supply" @@ -1023,8 +988,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/visible/fuel name = "4-way fuel pipe manifold" desc = "A manifold composed of fuel pipes." - desc_info = "This is a special 'fuel' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-fuel" connect_types = CONNECT_TYPE_FUEL icon_connect_type = "-fuel" @@ -1033,8 +996,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/visible/aux name = "4-way auxiliary pipe manifold" desc = "A manifold composed of auxiliary pipes" - desc_info = "This is a special 'aux' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-aux" connect_types = CONNECT_TYPE_AUX icon_connect_type = "-aux" @@ -1069,8 +1030,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers name = "4-way scrubbers pipe manifold" desc = "A manifold composed of scrubbers pipes." - desc_info = "This is a special 'scrubber' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-scrubbers" connect_types = CONNECT_TYPE_SCRUBBER icon_connect_type = "-scrubbers" @@ -1079,8 +1038,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden/supply name = "4-way air supply pipe manifold" desc = "A manifold composed of supply pipes." - desc_info = "This is a special 'supply' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-supply" connect_types = CONNECT_TYPE_SUPPLY icon_connect_type = "-supply" @@ -1089,8 +1046,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden/fuel name = "4-way fuel pipe manifold" desc = "A manifold composed of fuel pipes." - desc_info = "This is a special 'fuel' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-fuel" connect_types = CONNECT_TYPE_FUEL icon_connect_type = "-fuel" @@ -1099,8 +1054,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/hidden/aux name = "4-way auxiliary pipe manifold" desc = "A manifold composed of auxiliary pipes." - desc_info = "This is a special 'aux' pipe, which does not connect to 'normal' pipes. If you want to connect it, use \ - a Universal Adapter pipe." icon_state = "map_4way-aux" connect_types = CONNECT_TYPE_AUX icon_connect_type = "-aux" @@ -1130,7 +1083,6 @@ /obj/machinery/atmospherics/pipe/cap name = "pipe endcap" desc = "An endcap for pipes" - desc_info = "This is a cosmetic attachment, as pipes do not spill their contents into the air." icon = 'icons/atmos/pipes.dmi' icon_state = "" level = 2 @@ -1142,6 +1094,10 @@ var/obj/machinery/atmospherics/node +/obj/machinery/atmospherics/pipe/cap/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a cosmetic attachment, as pipes do not spill their contents into the air." + /obj/machinery/atmospherics/pipe/cap/Initialize() initialize_directions = dir . = ..() @@ -1465,11 +1421,15 @@ /obj/machinery/atmospherics/pipe/simple/visible/universal name = "universal pipe adapter" desc = "An adapter for regular, supply, scrubbers, fuel, and auxiliary pipes." - desc_info = "This allows you to connect 'normal' pipes, blue 'supply' pipes, red 'scrubber' pipes, yellow 'fuel' pipes, and cyan 'aux' pipes together." connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_SCRUBBER|CONNECT_TYPE_FUEL|CONNECT_TYPE_AUX icon_state = "map_universal" gfi_layer_rotation = GFI_ROTATION_OVERDIR +/obj/machinery/atmospherics/pipe/simple/visible/universal/mechanics_hints(mob/user, distance, is_adjacent) + . = list() + . += "This allows you to connect 'normal' pipes, blue 'supply' pipes, red 'scrubber' pipes, yellow 'fuel' pipes, and cyan 'aux' pipes together." + . += ..() + /obj/machinery/atmospherics/pipe/simple/visible/universal/update_icon(var/safety = 0) if(!check_icon_cache()) return @@ -1497,16 +1457,18 @@ ..() queue_icon_update() - - /obj/machinery/atmospherics/pipe/simple/hidden/universal name = "universal pipe adapter" desc = "An adapter for regular, supply, scrubbers, fuel, and auxiliary pipes." - desc_info = "This allows you to connect 'normal' pipes, blue 'supply' pipes, red 'scrubber' pipes, yellow 'fuel' pipes, and cyan 'aux' pipes together." connect_types = CONNECT_TYPE_REGULAR|CONNECT_TYPE_SUPPLY|CONNECT_TYPE_SCRUBBER|CONNECT_TYPE_FUEL|CONNECT_TYPE_AUX icon_state = "map_universal" gfi_layer_rotation = GFI_ROTATION_OVERDIR +/obj/machinery/atmospherics/pipe/simple/hidden/universal/mechanics_hints(mob/user, distance, is_adjacent) + . = list() + . += "This allows you to connect 'normal' pipes, blue 'supply' pipes, red 'scrubber' pipes, yellow 'fuel' pipes, and cyan 'aux' pipes together." + . += ..() + /obj/machinery/atmospherics/pipe/simple/hidden/universal/update_icon(var/safety = 0) if(!check_icon_cache()) return diff --git a/code/modules/battlemonsters/items/card.dm b/code/modules/battlemonsters/items/card.dm index 0dded57b2b6..85ac8f232df 100644 --- a/code/modules/battlemonsters/items/card.dm +++ b/code/modules/battlemonsters/items/card.dm @@ -15,6 +15,20 @@ //Card information here +/obj/item/battle_monsters/card/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + + if(facedown && src.loc != user) + . += SPAN_NOTICE("You can't examine \the [src] while it's face down!") + return + + if(trap_datum) + SSbattle_monsters.ExamineTrapCard(user,trap_datum) + else if(spell_datum) + SSbattle_monsters.ExamineSpellCard(user,spell_datum) + else + SSbattle_monsters.ExamineMonsterCard(user,prefix_datum,root_datum,suffix_datum) + /obj/item/battle_monsters/card/Initialize(var/mapload,var/prefix,var/root,var/title,var/trap,var/spell) . = ..() Generate_Card(prefix, root, title, trap, spell) @@ -164,20 +178,6 @@ transform = M -/obj/item/battle_monsters/card/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - - if(facedown && src.loc != user) - . += SPAN_NOTICE("You can't examine \the [src] while it's face down!") - return - - if(trap_datum) - SSbattle_monsters.ExamineTrapCard(user,trap_datum) - else if(spell_datum) - SSbattle_monsters.ExamineSpellCard(user,spell_datum) - else - SSbattle_monsters.ExamineMonsterCard(user,prefix_datum,root_datum,suffix_datum) - /obj/item/battle_monsters/card/MouseEntered(location, control, params) . = ..() if(!facedown || Adjacent(usr)) diff --git a/code/modules/cargo/delivery/backpack.dm b/code/modules/cargo/delivery/backpack.dm index 880f6188fe3..ac8f70f87ea 100644 --- a/code/modules/cargo/delivery/backpack.dm +++ b/code/modules/cargo/delivery/backpack.dm @@ -1,7 +1,6 @@ /obj/item/cargo_backpack name = "cargo pack" desc = "A robust set of rigs and buckles that allows the wearer to carry two additional Orion Express delivery packages on their back." - desc_info = "To load packages onto your back, equip this item on the back slot, then click on it with a package in-hand. To unload a package, click on this item with an empty hand." icon = 'icons/obj/orion_delivery.dmi' icon_state = "package_pack" item_state = "package_pack" @@ -13,15 +12,20 @@ var/list/contained_packages +/obj/item/cargo_backpack/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To load packages onto your back, equip this item on the back slot, then click on it with a package in-hand." + . += "To unload a package, click on this item with an empty hand." + +/obj/item/cargo_backpack/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(length(contained_packages)) + . += SPAN_NOTICE("\[?\] There are some packages loaded. \[Show Package Data\]")) - /obj/item/cargo_backpack/Topic(href, href_list) if(href_list["show_package_data"]) ui_interact(usr) diff --git a/code/modules/cargo/delivery/package.dm b/code/modules/cargo/delivery/package.dm index ae98ffb076a..90ac3c8a713 100644 --- a/code/modules/cargo/delivery/package.dm +++ b/code/modules/cargo/delivery/package.dm @@ -7,12 +7,7 @@ desc_extended = "\ This package makes use of the small-scale shipping network of Orion Express. \ It is a common sight all over the Spur, where Orion Express services depend on ordinary people and ships picking up and delivering packages for each other, \ - with Orion Express only delivering to automated stations and other distribution points.\ - " - desc_info = "\ - You can deliver this package to a cargo delivery point. \ - An additional 2% is added to your account on delivery, or paid to you directly. Can be loaded into a cargo pack.\ - " + with Orion Express only delivering to automated stations and other distribution points." icon = 'icons/obj/orion_delivery.dmi' icon_state = "express_package" item_state = "express_package" @@ -37,6 +32,23 @@ /// If true, pay_amount goes into Operations Account var/pays_horizon_account = TRUE +/obj/item/cargo_package/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can deliver this package to a cargo delivery point." + . += "An additional 2% is added to your account on delivery, or paid to you directly. Can be loaded into a cargo pack." + +/obj/item/cargo_package/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(delivery_point_id) + // if name not already set by cargo receptacle, acquire the sector name instead + if(delivery_site == "Unknown") + if(delivery_point_sector) + var/obj/effect/overmap/visitable/delivery_sector = delivery_point_sector.resolve() + if(delivery_sector) + delivery_site = delivery_sector.name + . += SPAN_NOTICE("The label on the package reads: SITE: [delivery_site] | COORD: [delivery_point_coordinates] | ID: [delivery_point_id]") + . += SPAN_NOTICE("The price tag on the package reads: [pay_amount]电.") + /obj/item/cargo_package/Initialize(mapload, obj/structure/cargo_receptacle/delivery_point) . = ..() pay_amount = rand(4, 7) * 1000 @@ -55,18 +67,6 @@ delivery_point_coordinates = "[delivery_point.x]-[delivery_point.y]" pay_amount = pay_amount * delivery_point.payment_modifier -/obj/item/cargo_package/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(delivery_point_id) - // if name not already set by cargo receptacle, acquire the sector name instead - if(delivery_site == "Unknown") - if(delivery_point_sector) - var/obj/effect/overmap/visitable/delivery_sector = delivery_point_sector.resolve() - if(delivery_sector) - delivery_site = delivery_sector.name - . += SPAN_NOTICE("The label on the package reads: SITE: [delivery_site] | COORD: [delivery_point_coordinates] | ID: [delivery_point_id]") - . += SPAN_NOTICE("The price tag on the package reads: [pay_amount]电.") - /obj/item/cargo_package/do_additional_pickup_checks(var/mob/living/carbon/human/user) if(!ishuman(user)) return FALSE @@ -126,6 +126,11 @@ /// Whether this package is guaranteed to deliver to the horizon or not var/horizon_delivery = FALSE +/obj/item/cargo_package/offship/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!delivery_point_id) + . += SPAN_NOTICE("Delivery site still being calculated, please check back later!") + /obj/item/cargo_package/offship/Initialize(mapload, obj/structure/cargo_receptacle/delivery_point) . = ..() @@ -140,10 +145,5 @@ return setup_delivery_point(selected_delivery_point) -/obj/item/cargo_package/offship/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!delivery_point_id) - . += SPAN_NOTICE("Delivery site still being calculated, please check back later!") - /obj/item/cargo_package/offship/to_horizon horizon_delivery = TRUE diff --git a/code/modules/cargo/delivery/receptacle.dm b/code/modules/cargo/delivery/receptacle.dm index 8467731c02d..615c910390f 100644 --- a/code/modules/cargo/delivery/receptacle.dm +++ b/code/modules/cargo/delivery/receptacle.dm @@ -9,12 +9,7 @@ GLOBAL_LIST_INIT_TYPED(all_cargo_receptacles, /obj/structure/cargo_receptacle, l desc_extended = "\ These are set up by Orion to expand its small-scale shipping network, especially in more remote areas, like outer edges of the Frontier or Coalition. \ It is a common sight all over the Spur, however, where Orion Express services depend on ordinary people and ships picking up and delivering packages for each other, \ - with Orion Express only delivering to automated stations and other distribution points.\ - " - desc_info = "\ - This is a delivery point for Orion Express cargo packages. \ - To finish the delivery, have a cargo package in your hand and click on the delivery point.\ - " + with Orion Express only delivering to automated stations and other distribution points." icon = 'icons/obj/orion_delivery.dmi' icon_state = "delivery_point" @@ -31,6 +26,11 @@ GLOBAL_LIST_INIT_TYPED(all_cargo_receptacles, /obj/structure/cargo_receptacle, l /// Maximum amount of packages that can spawn for this receptacle. INTEGER var/max_spawn = 4 +/obj/structure/cargo_receptacle/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a delivery point for Orion Express cargo packages." + . += "To finish the delivery, have a cargo package in your hand and click on the delivery point." + /obj/structure/cargo_receptacle/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD diff --git a/code/modules/cciaa/cciaa_items.dm b/code/modules/cciaa/cciaa_items.dm index a621a000ded..48ead6e710f 100644 --- a/code/modules/cciaa/cciaa_items.dm +++ b/code/modules/cciaa/cciaa_items.dm @@ -3,7 +3,6 @@ name = "Human Resources Recorder" desc = "A modified recorder used for interviews by human resources personnel around the galaxy." desc_extended = "This recorder is a modified version of a standard universal recorder. It features additional audit-proof records keeping, access controls and is tied to a central management system." - desc_info = "This recorder records the fingerprints of the interviewee, to do so, interact with this recorder when asked." w_class = WEIGHT_CLASS_TINY timestamp = list() //This actually turns timestamp into a string later on @@ -31,6 +30,10 @@ var/interviewee_name = null var/date_string = null +/obj/item/device/taperecorder/cciaa/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This recorder records the fingerprints of the interviewee, to do so, interact with this recorder when asked." + /obj/item/device/taperecorder/cciaa/hear_talk(mob/living/M as mob, msg, var/verb="says") if(recording && !paused) timestamp = "[get_time()]" diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 8726e208d20..e558d0e6d89 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -382,10 +382,6 @@ /obj/item/gun/energy/chameleon name = "desert eagle" desc = null - desc_info = null //The chameleon gun adopts the desc_info of the weapon it is impersonating as, to make meta-ing harder. - desc_antag = "This gun is actually a hologram projector that can alter its appearance to mimick other weapons. To change the appearance, use \ - the appropriate verb in the chameleon items tab. Any beams or projectiles fired from this gun are actually holograms and useless for actual combat. \ - Projecting these holograms over distance uses a little bit of charge." icon = 'icons/obj/guns/deagle.dmi' icon_state = "deagle" w_class = WEIGHT_CLASS_NORMAL @@ -401,6 +397,17 @@ var/obj/projectile/copy_projectile var/global/list/gun_choices +/obj/item/gun/energy/chameleon/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Exactly as it appears, officer." + +/obj/item/gun/energy/chameleon/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This gun is actually a hologram projector that can alter its appearance to mimick other weapons. " + . += "To change the appearance, use the appropriate verb in the chameleon items tab." + . += "Any beams or projectiles fired from this gun are actually holograms and useless for actual combat." + . += "Projecting these holograms over distance uses a little bit of charge." + /obj/item/gun/energy/chameleon/Initialize() . = ..() @@ -447,7 +454,6 @@ if(istype(E)) copy_projectile = E.projectile_type desc = E.desc - desc_info = E.desc_info else copy_projectile = null diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 8f2615f56bb..1f8aa8c8540 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1148,6 +1148,19 @@ valid_accessory_slots = list(ACCESSORY_SLOT_UTILITY, ACCESSORY_SLOT_UTILITY_MINOR, ACCESSORY_SLOT_ARMBAND, ACCESSORY_SLOT_GENERIC, ACCESSORY_SLOT_CAPE) restricted_accessory_slots = list(ACCESSORY_SLOT_UTILITY) +/obj/item/clothing/under/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(has_sensor) + switch(src.sensor_mode) + if(SUIT_SENSOR_OFF) + . += "Its sensors appear to be disabled." + if(SUIT_SENSOR_BINARY) + . += "Its binary life sensors appear to be enabled." + if(SUIT_SENSOR_VITAL) + . += "Its vitals tracker appears to be enabled." + if(SUIT_SENSOR_TRACKING) + . += "Its vitals tracker and tracking beacon appear to be enabled." + /obj/item/clothing/under/attack_hand(var/mob/user) if(LAZYLEN(accessories)) ..() @@ -1271,19 +1284,6 @@ M.update_inv_w_uniform() playsound(M, /singleton/sound_category/rustle_sound, 15, TRUE, SILENCED_SOUND_EXTRARANGE, ignore_walls = FALSE) -/obj/item/clothing/under/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(has_sensor) - switch(src.sensor_mode) - if(SUIT_SENSOR_OFF) - . += "Its sensors appear to be disabled." - if(SUIT_SENSOR_BINARY) - . += "Its binary life sensors appear to be enabled." - if(SUIT_SENSOR_VITAL) - . += "Its vitals tracker appears to be enabled." - if(SUIT_SENSOR_TRACKING) - . += "Its vitals tracker and tracking beacon appear to be enabled." - /obj/item/clothing/under/proc/set_sensors(mob/user as mob) var/mob/M = user if (isobserver(M) || user.incapacitated()) diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index ca591acbce9..1f10fd31c57 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -1109,7 +1109,6 @@ BLIND // can't see anything /obj/item/clothing/glasses/thermal/aviator name = "aviators" desc = "A pair of designer sunglasses. They should put HUDs in these." - desc_antag = "Modified aviator glasses with a toggled thermal-vision mode." icon_state = "aviator_thr" off_state = "aviator_off" item_state_slots = list(slot_r_hand_str = "sunglasses", slot_l_hand_str = "sunglasses") @@ -1117,6 +1116,10 @@ BLIND // can't see anything activation_sound = 'sound/effects/pop.ogg' prescription = 7 +/obj/item/clothing/glasses/thermal/aviator/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Modified aviator glasses with a toggled thermal-vision mode." + /obj/item/clothing/glasses/thermal/aviator/verb/toggle() set category = "Object" set name = "Toggle Aviators" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index ac54a3e4476..30ca330493f 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -56,7 +56,6 @@ /obj/item/clothing/gloves/latex name = "latex gloves" desc = "Sterile latex gloves." - desc_info = "You can make balloons with these using some cable coil." icon_state = "latex" item_state = "latex" siemens_coefficient = 1.0 //thin latex gloves, much more conductive than fabric gloves (basically a capacitor for AC) @@ -67,6 +66,10 @@ pickup_sound = 'sound/items/pickup/rubber.ogg' var/balloon = /obj/item/toy/balloon/latex +/obj/item/clothing/gloves/latex/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can make balloons with these using some cable coil." + /obj/item/clothing/gloves/latex/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/stack/cable_coil)) var/obj/item/stack/cable_coil/C = attacking_item diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index dce4dcc2b41..5bb5f2dde4d 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -234,7 +234,6 @@ /obj/item/clothing/head/cone name = "warning cone" desc = "This cone is trying to warn you of something!" - desc_info = "It looks like you can wear it in your head slot." icon_state = "cone" item_state = "cone" drop_sound = 'sound/items/drop/shoes.ogg' @@ -247,3 +246,8 @@ body_parts_covered = HEAD attack_verb = list("warned", "cautioned", "smashed") armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/head/cone/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It looks like you can wear it in your head slot." + diff --git a/code/modules/clothing/masks/voice.dm b/code/modules/clothing/masks/voice.dm index e3aabe35636..b761584f00e 100644 --- a/code/modules/clothing/masks/voice.dm +++ b/code/modules/clothing/masks/voice.dm @@ -8,7 +8,10 @@ /obj/item/clothing/mask/gas/voice var/obj/item/voice_changer/changer origin_tech = list(TECH_ILLEGAL = 4) - desc_antag = "This mask can be used to change the owner's voice." + +/obj/item/clothing/mask/gas/voice/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This mask can be used to change the owner's voice." /obj/item/clothing/mask/gas/voice/verb/Toggle_Voice_Changer() set category = "Object" @@ -42,7 +45,10 @@ /obj/item/clothing/mask/gas/vaurca/filter/voice var/obj/item/voice_changer/changer origin_tech = list(TECH_ILLEGAL = 4) - desc_antag = "A Lii'draic filter port that allows to change voices." + +/obj/item/clothing/mask/gas/vaurca/filter/voice/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "A Lii'draic filter port that allows to change voices." /obj/item/clothing/mask/gas/vaurca/filter/voice/verb/Toggle_Voice_Changer() set category = "Object" diff --git a/code/modules/clothing/rings/rings.dm b/code/modules/clothing/rings/rings.dm index 48b812a014d..9f48bbd7bce 100644 --- a/code/modules/clothing/rings/rings.dm +++ b/code/modules/clothing/rings/rings.dm @@ -38,11 +38,14 @@ /obj/item/clothing/ring/reagent/sleepy name = "silver ring" desc = "A ring made from what appears to be silver." - desc_antag = "This ring has a hidden injector that will activate when worn, administering a strong sedative. It is safe to hold in your hands." icon_state = "material" origin_tech = list(TECH_MATERIAL = 2, TECH_ILLEGAL = 5) reagents_to_add = list(/singleton/reagent/polysomnine = 10) +/obj/item/clothing/ring/reagent/sleepy/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This ring has a hidden injector that will activate when worn, administering a strong sedative. It is safe to hold in your hands." + //Seals and Signet Rings /obj/item/clothing/ring/seal/mason diff --git a/code/modules/clothing/sets/laser_tag.dm b/code/modules/clothing/sets/laser_tag.dm index 80f194661de..97511bcb9e1 100644 --- a/code/modules/clothing/sets/laser_tag.dm +++ b/code/modules/clothing/sets/laser_tag.dm @@ -4,7 +4,6 @@ /obj/item/clothing/suit/armor/riot/laser_tag name = "laser tag armor" desc = "A set of laser tag armor. Very swanky." - desc_info = "You can alt-click this while holding or wearing it to set how many laser tag shots you want to be able to take before going down." icon = 'icons/obj/item/clothing/suit/armor/laser_tag.dmi' icon_state = "vest" item_state = "vest" @@ -23,6 +22,10 @@ var/set_health = 3 var/current_health +/obj/item/clothing/suit/armor/riot/laser_tag/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can alt-click this while holding or wearing it to set how many laser tag shots you want to be able to take before going down." + /obj/item/clothing/suit/armor/riot/laser_tag/Initialize(mapload, material_key) . = ..() get_tag_color(laser_tag_color) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 3e5a0aed2ea..7c7cfb547b0 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -19,6 +19,13 @@ drop_sound = 'sound/items/drop/toolbox.ogg' pickup_sound = 'sound/items/pickup/toolbox.ogg' +/obj/item/clothing/shoes/magboots/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/state = "disabled" + if(item_flags & ITEM_FLAG_NO_SLIP) + state = "enabled" + . += "Its mag-pulse traction system appears to be [state]." + /obj/item/clothing/shoes/magboots/Destroy() . = ..() src.shoes = null @@ -106,13 +113,6 @@ if (.) INVOKE_ASYNC(src, PROC_REF(update_wearer)) -/obj/item/clothing/shoes/magboots/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/state = "disabled" - if(item_flags & ITEM_FLAG_NO_SLIP) - state = "enabled" - . += "Its mag-pulse traction system appears to be [state]." - /obj/item/clothing/shoes/magboots/hegemony name = "hegemony magboots" desc = "Magnetic boots, often used during extravehicular activity to ensure the user remains safely attached to the vehicle. They're large enough to be worn over other footwear. This variant is frequently seen in the Hegemony Navy." diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 5a80838b221..1e1c1cb7c00 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -42,30 +42,36 @@ /obj/item/clothing/head/helmet/space/syndicate/covert name = "softsuit helmet" desc = "A special helmet designed for work in a hazardous, low-pressure environment." - desc_antag = "This helmet is specially armored for additional protection, compared to a standard softsuit helmet." icon = 'icons/obj/item/clothing/softsuits/softsuit.dmi' icon_state = "softsuit_helmet" item_state = "softsuit_helmet" contained_sprite = TRUE -/obj/item/clothing/head/helmet/space/syndicate/covert/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/clothing/head/helmet/space/syndicate/covert/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This helmet has extra armor compared to a standard softsuit helmet." + +/obj/item/clothing/head/helmet/space/syndicate/covert/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance <= 1) - . += SPAN_NOTICE("This helmet has extra armor compared to a normal softsuit helmet.") + . += SPAN_ALERT("This helmet has extra armor compared to a normal softsuit helmet.") /obj/item/clothing/suit/space/syndicate/covert name = "softsuit" desc = "A suit that protects against low pressure environments." - desc_antag = "This suit is specially armored for additional protection, compared to a standard softsuit." icon = 'icons/obj/item/clothing/softsuits/softsuit.dmi' icon_state = "softsuit" item_state = "softsuit" contained_sprite = TRUE -/obj/item/clothing/suit/space/syndicate/covert/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/clothing/suit/space/syndicate/covert/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This suit is specially armored for additional protection, compared to a standard softsuit." + +/obj/item/clothing/suit/space/syndicate/covert/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance <= 1) - . += SPAN_NOTICE("This suit has extra armor compared to a normal softsuit.") + . += SPAN_ALERT("This suit has extra armor compared to a normal softsuit.") //Green syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/green diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 99d6ed672b8..a314ae264a3 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -687,7 +687,6 @@ name = "wet floor sign" desc = "Caution! Wet Floor!" desc_extended = "Used by the janitor to passive-aggressively point at when you eventually slip on one of their mopped floors." - desc_info = "Alt-click, or click in-hand to toggle the caution lights. It looks like you can wear it in your suit slot." icon = 'icons/obj/janitor.dmi' item_icons = list( slot_l_hand_str = 'icons/mob/items/lefthand_janitor.dmi', @@ -705,6 +704,11 @@ attack_verb = list("warned", "cautioned", "smashed") armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) +/obj/item/clothing/suit/caution/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-click, or click in-hand to toggle the caution lights." + . += "It looks like you could wear it in your suit slot if you really wanted to." + /obj/item/clothing/suit/caution/attack_self() toggle() diff --git a/code/modules/clothing/suits/modular_armor.dm b/code/modules/clothing/suits/modular_armor.dm index 75bae1f75f6..46cdc73d2f1 100644 --- a/code/modules/clothing/suits/modular_armor.dm +++ b/code/modules/clothing/suits/modular_armor.dm @@ -134,7 +134,6 @@ /obj/item/clothing/accessory/armor_plate name = "corporate armor plate" desc = "A particularly light-weight armor plate in stylish corporate black. Unfortunately, not very good if you hold it with your hands." - desc_info = "These items must be hooked onto plate carriers for them to work!" icon = 'icons/obj/item/clothing/suit/armor/modular_armor/modular_armor.dmi' icon_state = "plate_sec" item_state = "plate_sec" @@ -151,6 +150,10 @@ BOMB = ARMOR_BOMB_PADDED ) +/obj/item/clothing/accessory/armor_plate/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "These must be attached to plate carriers for them to work." + /obj/item/clothing/accessory/armor_plate/before_attached(var/obj/item/clothing/clothing, var/mob/user) if(!clothing.valid_accessory_slots || !(slot in clothing.valid_accessory_slots)) return diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 1ba14ebe2f9..cbcd6b2c5bd 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -272,8 +272,6 @@ /obj/item/clothing/accessory/stethoscope name = "stethoscope" desc = "An outdated medical apparatus for listening to the sounds of the human body. It also makes you look like you know what you're doing." - desc_info = "Click on the UI action button toggle between the examination modes. Automatic will use the stethoscope on the person you're \ - examining when adjacent to them, automatically using it on the selected body part. Manual will make it so you don't automatically use it via examine." icon = 'icons/obj/item/clothing/accessory/stethoscope.dmi' icon_state = "stethoscope" item_state = "stethoscope" @@ -281,6 +279,12 @@ flippable = 1 var/auto_examine = FALSE +/obj/item/clothing/accessory/stethoscope/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click on the UI action button toggle between the examination modes." + . += "Automatic will use the stethoscope on the person you're examining when adjacent to them, automatically using it on the selected body part." + . += "Manual will make it so you don't automatically use it via examine." + /obj/item/clothing/accessory/stethoscope/attack(mob/living/target_mob, mob/living/user, target_zone) var/mob/living/carbon/human/M = target_mob diff --git a/code/modules/clothing/under/accessories/armor.dm b/code/modules/clothing/under/accessories/armor.dm index 19ebb0caa5d..41487b79231 100644 --- a/code/modules/clothing/under/accessories/armor.dm +++ b/code/modules/clothing/under/accessories/armor.dm @@ -2,7 +2,6 @@ /obj/item/clothing/accessory/leg_guard name = "corporate leg guards" desc = "These will protect your legs." - desc_info = "These items must be hooked onto plate carriers for them to work!" icon = 'icons/obj/item/clothing/suit/armor/modular_armor/modular_armor.dmi' icon_state = "legguards_sec" item_state = "legguards_sec" @@ -21,6 +20,10 @@ drop_sound = 'sound/items/drop/boots.ogg' pickup_sound = 'sound/items/pickup/boots.ogg' +/obj/item/clothing/accessory/leg_guard/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "These must be attached to plate carriers for them to work." + /obj/item/clothing/accessory/leg_guard/before_attached(var/obj/item/clothing/clothing, var/mob/user) if(!clothing.valid_accessory_slots || !(slot in clothing.valid_accessory_slots)) return diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index fc25d7cab82..f21e6c9f112 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -1,14 +1,16 @@ /obj/item/clothing/under/color name = "grey jumpsuit" desc = "A basic jumpsuit." - desc_info = "Jumpsuits can have their sleeves rolled up/down via the Roll Up/Down Sleeves verb, and also have their upper body part be up/down via the \ - the Rolled Up/Down verb." icon = 'icons/obj/item/clothing/under/jumpsuits.dmi' icon_state = "grey" item_state = "grey" item_icons = null contained_sprite = TRUE +/obj/item/clothing/under/color/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Jumpsuits can have their sleeves rolled up/down via the Roll Up/Down Sleeves verb, and also have their upper body part be up/down via the Rolled Up/Down verb." + /obj/item/clothing/under/color/colorable name = "colorable jumpsuit" desc = "A colorable non-descript jumpsuit." diff --git a/code/modules/cooking/machinery/cooking_machines/_appliance.dm b/code/modules/cooking/machinery/cooking_machines/_appliance.dm index 64ecc3fa469..1a93f26719c 100644 --- a/code/modules/cooking/machinery/cooking_machines/_appliance.dm +++ b/code/modules/cooking/machinery/cooking_machines/_appliance.dm @@ -12,7 +12,6 @@ /obj/machinery/appliance name = "cooker" desc = DESC_PARENT - desc_info = "Control-click this to change its temperature." icon = 'icons/obj/machinery/cooking_machines.dmi' var/appliancetype = 0 density = 1 @@ -55,8 +54,19 @@ var/place_verb = "into" var/combine_first = FALSE//If 1, this appliance will do combination cooking before checking recipes - component_hint_cap = "Upgraded capacitors will increase heating power." - component_hint_scan = "Upgraded scanning modules will increase heating power and improve power efficiency." +/obj/machinery/appliance/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Control-click this to change its temperature." + +/obj/machinery/appliance/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will increase heating power." + . += "Upgraded scanning modules will increase heating power and improve power efficiency." + +/obj/machinery/appliance/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + . += list_contents(user) /obj/machinery/appliance/Initialize() . = ..() @@ -76,11 +86,6 @@ qdel(CI) return ..() -/obj/machinery/appliance/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - . += list_contents(user) - /obj/machinery/appliance/proc/list_contents(var/mob/user) . = list() if (isemptylist(cooking_objs)) diff --git a/code/modules/cooking/machinery/cooking_machines/_cooker.dm b/code/modules/cooking/machinery/cooking_machines/_cooker.dm index d9db4043b72..cd5420e1749 100644 --- a/code/modules/cooking/machinery/cooking_machines/_cooker.dm +++ b/code/modules/cooking/machinery/cooking_machines/_cooker.dm @@ -18,8 +18,8 @@ var/temperature = T20C var/starts_with = list() -/obj/machinery/appliance/cooker/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/appliance/cooker/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if (is_adjacent) if (!stat) if (temperature < min_temp) diff --git a/code/modules/cooking/machinery/cooking_machines/container.dm b/code/modules/cooking/machinery/cooking_machines/container.dm index 580147fed13..77672f38749 100644 --- a/code/modules/cooking/machinery/cooking_machines/container.dm +++ b/code/modules/cooking/machinery/cooking_machines/container.dm @@ -22,6 +22,15 @@ var/appliancetype // Bitfield, uses the same as appliances w_class = WEIGHT_CLASS_NORMAL +/obj/item/reagent_containers/cooking_container/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(length(contents)) + var/string = "It contains:
  • " + string += jointext(contents, "
  • ") + "
" + . += string + if(reagents.total_volume) + . += "It contains [reagents.total_volume] units of reagents total." + /obj/item/reagent_containers/cooking_container/on_reagent_change() . = ..() update_icon() @@ -38,39 +47,6 @@ . = ..() update_icon() -/obj/item/reagent_containers/cooking_container/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(length(contents)) - . += SPAN_NOTICE(get_content_info()) - if(reagents.total_volume) - . += SPAN_NOTICE(get_reagent_info()) - -/obj/item/reagent_containers/cooking_container/proc/get_content_info() - var/string = "It contains:
  • " - string += jointext(contents, "
  • ") + "
" - return string - -/obj/item/reagent_containers/cooking_container/proc/get_reagent_info() - return "It contains [reagents.total_volume] units of reagents." - -/obj/item/reagent_containers/cooking_container/MouseEntered(location, control, params) - . = ..() - var/list/modifiers = params2list(params) - if(modifiers["shift"] && get_dist(usr, src) <= 2) - params = replacetext(params, "shift=1;", "") // tooltip doesn't appear unless this is stripped - var/description - if(length(contents)) - description = get_content_info() - if(reagents.total_volume) - if(!description) - description = "" - description += get_reagent_info() - openToolTip(usr, src, params, name, description) - -/obj/item/reagent_containers/cooking_container/MouseExited(location, control, params) - . = ..() - closeToolTip(usr) - /obj/item/reagent_containers/cooking_container/attackby(obj/item/attacking_item, mob/user) if(is_type_in_list(attacking_item, insertable)) if (!can_fit(attacking_item)) @@ -153,7 +129,6 @@ if((max_space - total) >= I.w_class) return TRUE - //Takes a reagent holder as input and distributes its contents among the items in the container //Distribution is weighted based on the volume already present in each item /obj/item/reagent_containers/cooking_container/proc/soak_reagent(var/datum/reagents/holder) @@ -296,10 +271,9 @@ volume = 15 // for things like jelly sandwiches etc max_space = 25 -/obj/item/reagent_containers/cooking_container/board/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(length(contents) || reagents?.total_volume) - . += SPAN_NOTICE("To attempt cooking: click and hold, then drag this onto your character.") +/obj/item/reagent_containers/cooking_container/board/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "After adding food ingredients, click-drag this onto your character to attempt to cook/prepare them." /obj/item/reagent_containers/cooking_container/board/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) if(over != user || use_check(user)) diff --git a/code/modules/cooking/machinery/cooking_machines/oven.dm b/code/modules/cooking/machinery/cooking_machines/oven.dm index bec7563cb47..3b5675e2f70 100644 --- a/code/modules/cooking/machinery/cooking_machines/oven.dm +++ b/code/modules/cooking/machinery/cooking_machines/oven.dm @@ -1,7 +1,6 @@ /obj/machinery/appliance/cooker/oven name = "oven" desc = "Cookies are ready, dear." - desc_info = "Control-click this to change its temperature. Alt-click to open or close the oven door." icon_state = "ovenopen" cook_type = "baked" appliancetype = OVEN @@ -48,6 +47,10 @@ "Macaron" = /obj/item/reagent_containers/food/snacks/variable/macaron, ) +/obj/machinery/appliance/cooker/oven/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Alt-click to open or close the oven door." + /obj/machinery/appliance/cooker/oven/Initialize() . = ..() oven_loop = new(src) diff --git a/code/modules/cooking/machinery/foodcart.dm b/code/modules/cooking/machinery/foodcart.dm index 2280dcbc7d6..3d3eb581605 100644 --- a/code/modules/cooking/machinery/foodcart.dm +++ b/code/modules/cooking/machinery/foodcart.dm @@ -21,6 +21,17 @@ var/list/packed_things /// Contains cart_griddle, cart_smartfridge, cart_table, cart_cent +/obj/machinery/food_cart/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(stat & BROKEN) + return + if(cart_griddle.stat & BROKEN) + . += SPAN_WARNING("The stand's [SPAN_BOLD("grill")] is completely broken!") + else + . += SPAN_NOTICE("The stand's [SPAN_BOLD("grill")] is intact.") + . += SPAN_NOTICE("The stand's [SPAN_BOLD("fridge")] seems fine.") //weirdly enough, these fridges don't break + . += SPAN_NOTICE("The stand's [SPAN_BOLD("table")] seems fine.") + /obj/machinery/food_cart/Initialize(mapload) . = ..() cart_griddle = new(src) @@ -41,17 +52,6 @@ packed_things.Cut() return ..() -/obj/machinery/food_cart/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(stat & BROKEN) - return - if(cart_griddle.stat & BROKEN) - . += SPAN_WARNING("The stand's [SPAN_BOLD("grill")] is completely broken!") - else - . += SPAN_NOTICE("The stand's [SPAN_BOLD("grill")] is intact.") - . += SPAN_NOTICE("The stand's [SPAN_BOLD("fridge")] seems fine.") //weirdly enough, these fridges don't break - . += SPAN_NOTICE("The stand's [SPAN_BOLD("table")] seems fine.") - /** * Retract the structures into the food cart */ diff --git a/code/modules/cooking/plates.dm b/code/modules/cooking/plates.dm index c7017e12060..9d758ff492e 100644 --- a/code/modules/cooking/plates.dm +++ b/code/modules/cooking/plates.dm @@ -8,9 +8,6 @@ Plates that can hold your cooking stuff /obj/item/reagent_containers/bowl name = "bowl" desc = "A small bowl for serving liquid meals in." - desc_info = "Click with food to put food on.
\ - - Click with cutlery to eat some.
\ - - Click it with the active hand to remove food." icon = 'icons/obj/kitchen.dmi' icon_state = "bowl" fragile = 3 @@ -19,8 +16,14 @@ Plates that can hold your cooking stuff atom_flags = ATOM_FLAG_OPEN_CONTAINER var/grease = FALSE -/obj/item/reagent_containers/bowl/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/reagent_containers/bowl/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click with food to put food into it." + . += "If it has food on it, click with cutlery to scoop some food up." + . += "If it has food on it, click it with the active hand to remove the food." + +/obj/item/reagent_containers/bowl/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(grease) . += SPAN_WARNING("\The [name] looks a little unclean.") @@ -108,18 +111,18 @@ Plates that can hold your cooking stuff icon_state = "plate" var/obj/item/holding +/obj/item/reagent_containers/bowl/plate/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(holding) + . += "It looks like there is \a [SPAN_INFO(holding.name)] on \the [src]." + . += SPAN_INFO(" - [holding.desc]") + /obj/item/reagent_containers/bowl/plate/Destroy() if(holding) holding = null qdel(holding) return ..() -/obj/item/reagent_containers/bowl/plate/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(holding) - . += "It looks like there is \a [SPAN_INFO(holding.name)] on \the [src]." - . += SPAN_INFO(" - [holding.desc]") - /obj/item/reagent_containers/bowl/plate/attackby(obj/item/attacking_item, mob/user) if((istype(attacking_item, /obj/item/reagent_containers/food/snacks) || istype(attacking_item, /obj/item/trash)) && !holding) user.unEquip(attacking_item) diff --git a/code/modules/detectivework/microscope/microscope.dm b/code/modules/detectivework/microscope/microscope.dm index 8dd039f295d..30cdf24eb86 100644 --- a/code/modules/detectivework/microscope/microscope.dm +++ b/code/modules/detectivework/microscope/microscope.dm @@ -2,8 +2,6 @@ /obj/machinery/microscope name = "high powered electron microscope" desc = "A highly advanced microscope capable of zooming up to 3000x." - desc_info = "Use a microscope slide or a fingerprint card on this machine to insert it.\ - \nAlt click to remove any object within it." icon = 'icons/obj/forensics.dmi' icon_state = "microscope" anchored = 1 @@ -34,6 +32,11 @@ */ var/allowed_analysis = MICROSCOPE_ALL +/obj/machinery/microscope/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use a microscope slide or a fingerprint card on this machine to insert it." + . += "Alt-click to remove any object within it." + /obj/machinery/microscope/attackby(obj/item/attacking_item, mob/user) if(sample) diff --git a/code/modules/detectivework/microscope/slides.dm b/code/modules/detectivework/microscope/slides.dm index d94712ac969..d0b1fc00cb2 100644 --- a/code/modules/detectivework/microscope/slides.dm +++ b/code/modules/detectivework/microscope/slides.dm @@ -1,11 +1,15 @@ /obj/item/forensics/slide name = "microscope slide" desc = "A pair of thin glass panes used in the examination of samples beneath a microscope." - desc_info = "Used with fibers and GSR swab tests to examine the samples in the microscope. To empty them, use in hand." icon_state = "slide" var/obj/item/forensics/swab/has_swab var/obj/item/sample/fibers/has_sample +/obj/item/forensics/slide/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Used with fibers and GSR swab tests to examine the samples in the microscope." + . += "To empty them, use in hand." + /obj/item/forensics/slide/Initialize(mapload, ...) . = ..() create_reagents(5) diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 0337611ea2d..67c9e7242e7 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -3,7 +3,6 @@ /obj/item/evidencebag name = "evidence bag" desc = "An empty evidence bag." - desc_info = "Click drag this onto an object to put it inside. Click it in-hand to remove an object from it." icon = 'icons/obj/forensics.dmi' icon_state = "evidenceobj" item_state = "" @@ -11,6 +10,11 @@ var/obj/item/stored_item = null var/label_text = "" +/obj/item/evidencebag/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click drag this onto an object to put it inside." + . += "Click it in-hand to remove an object from it." + /obj/item/evidencebag/Initialize() . = ..() AddComponent(/datum/component/base_name, name) diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm index 2285b55f331..801ae236a7e 100644 --- a/code/modules/detectivework/tools/sample_kits.dm +++ b/code/modules/detectivework/tools/sample_kits.dm @@ -80,19 +80,26 @@ /obj/item/sample/fibers name = "fiber bag" desc = "Used to hold fiber evidence for the detective." - desc_info = "Holds various fibre evidence. Place it in a slide and the slide into a microscope to check them." icon_state = "fiberbag" +/obj/item/sample/fibers/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Holds various fibre evidence. Place it in a slide and the slide into a microscope to check them." + /obj/item/sample/print name = "fingerprint card" desc = "Records a set of fingerprints." - desc_info = "A sample card for fingerprints. Risks putting your own prints on it if touched without gloves.\ - \nPlace the card in a microscope to examine the contents. \ - \nUse in hand to put your prints on it.\nTarget hands and click another creature to take their prints." icon = 'icons/obj/card.dmi' icon_state = "fingerprint0" item_state = "paper" +/obj/item/sample/print/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "A sample card for fingerprints. Risks putting your own prints on it if touched without gloves." + . += "Place the card in a microscope to examine the contents." + . += "Use in hand to put your prints on it." + . += "Target hands and click another creature to take their prints." + /obj/item/sample/print/attack_self(var/mob/user) if(LAZYLEN(evidence)) return @@ -159,13 +166,16 @@ /obj/item/forensics/sample_kit name = "fiber collection kit" desc = "A magnifying glass and tweezers. Used to lift suit fibers." - desc_info = "Click drag it on to an object to collect evidence. Alternatively click on non-help intent." icon_state = "m_glass" w_class = WEIGHT_CLASS_SMALL item_flags = ITEM_FLAG_NO_BLUDGEON var/evidence_type = "fiber" var/evidence_path = /obj/item/sample/fibers +/obj/item/forensics/sample_kit/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click drag it onto an object to collect fiber evidence. Alternatively, click on an object with non-Help intent." + /obj/item/forensics/sample_kit/proc/can_take_sample(var/mob/user, var/atom/supplied) return (supplied.suit_fibers && supplied.suit_fibers.len) diff --git a/code/modules/detectivework/tools/swabs.dm b/code/modules/detectivework/tools/swabs.dm index 2e516624bc7..f89df64c1d0 100644 --- a/code/modules/detectivework/tools/swabs.dm +++ b/code/modules/detectivework/tools/swabs.dm @@ -1,13 +1,6 @@ /obj/item/forensics/swab name = "swab kit" desc = "A sterilized cotton swab and vial used to take forensic samples." - desc_info = "Swab kits can be used to gather blood with DNA attached to it by clicking the blood. \ - If it fails to collect a sample, it means that particular bit of blood has no associated DNA. \ - \nThey can also collect DNA samples directly from people by targetting their mouth to take a saliva sample. \ - \nGunshot Residue (GSR) can be collected from someones hands by targetting them. If they are wearing gloves, \ - the residue will be taken from the gloves instead. \ - \n\nGSR samples are put in a slide and examined in a microscope. \ - \nBlood and DNA samples are checked in the DNA analyzer" icon_state = "swab" var/list/gsr var/list/dna @@ -15,6 +8,16 @@ drop_sound = 'sound/items/drop/glass.ogg' pickup_sound = 'sound/items/pickup/glass.ogg' +/obj/item/forensics/swab/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Swab kits can be used to gather blood with DNA attached to it by clicking the blood." + . += "If it fails to collect a sample, it means that particular bit of blood has no associated DNA." + . += "They can also collect DNA samples directly from people by targetting their mouth to take a saliva sample." + . += "Gunshot Residue (GSR) can be collected from someones hands by targetting them. If they are wearing gloves, \ + the residue will be taken from the gloves instead." + . += "GSR samples are put in a slide and examined in a microscope." + . += "Blood and DNA samples are checked in the DNA analyzer." + /obj/item/forensics/swab/proc/is_used() return used diff --git a/code/modules/economy/OrderTerminal.dm b/code/modules/economy/OrderTerminal.dm index 68bbccc0013..8cf74c9dadb 100644 --- a/code/modules/economy/OrderTerminal.dm +++ b/code/modules/economy/OrderTerminal.dm @@ -1,7 +1,6 @@ /obj/machinery/orderterminal name = "Idris Ordering Terminal" desc = "An ordering terminal designed by Idris for quicker expedition." - desc_info = "To edit the menu, select 'Toggle Lock' while wearing an ID with kitchen access. \nAll credits from the machine will automatically go to the civilian account." icon = 'icons/obj/machinery/wall/terminals.dmi' icon_state = "kitchenterminal" anchored = 1 @@ -24,6 +23,11 @@ var/ticket_number = 1 req_one_access = list(ACCESS_BAR, ACCESS_KITCHEN) // Access to change the menu +/obj/machinery/orderterminal/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To edit the menu, select 'Toggle Lock' while wearing an ID with kitchen access." + . += "All credits from the machine will automatically go to the civilian account." + /obj/machinery/orderterminal/Initialize() . = ..() machine_id = "Idris Ordering Terminal #[SSeconomy.num_financial_terminals++]" diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 0882bb52de7..637f5ab12a1 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -31,11 +31,16 @@ /obj/item/deck/cards name = "deck of cards" desc = "A simple deck of playing cards." - desc_info = "Ctrl-click to draw/deal. Alt-click to shuffle." icon_state = "deck" drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' hand_type = /obj/item/hand/cards + +/obj/item/deck/cards/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "CTRL-click to draw/deal." + . += "ALT-click to shuffle." + /obj/item/deck/Initialize() . = ..() generate_deck() @@ -283,6 +288,14 @@ var/concealed = TRUE var/list/cards = list() +/obj/item/hand/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if((!concealed || src.loc == user) && length(cards)) + if(length(cards) > 1) + . += "It contains: " + for(var/datum/playingcard/P in cards) + . += "The [P.name]. [P.desc ? "[P.desc]" : ""]" + /obj/item/hand/cards deck_type = /obj/item/deck/cards @@ -356,14 +369,6 @@ playsound(src, 'sound/items/cards/cardflip.ogg', 50, TRUE) balloon_alert_to_viewers("[concealed ? "conceals" : "reveals"] their hand.") -/obj/item/hand/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if((!concealed || src.loc == user) && length(cards)) - if(length(cards) > 1) - . += "It contains: " - for(var/datum/playingcard/P in cards) - . += "The [P.name]. [P.desc ? "[P.desc]" : ""]" - /obj/item/hand/update_icon(var/direction = 0) if(randpixel) randpixel = 0 diff --git a/code/modules/games/gamehelm.dm b/code/modules/games/gamehelm.dm index 3f809818d74..ffe307a8d0d 100644 --- a/code/modules/games/gamehelm.dm +++ b/code/modules/games/gamehelm.dm @@ -5,7 +5,6 @@ being able to be purchased from an online marketplace hosted by InUs. Thousands of popular and obscure titles are available on the \ console. Besides being the perfect present, it's also capable of video streaming and sharing files over authorized \ connections. A quick and easy way to upload your latest montage to the extranet." - desc_info = "You can ALT-click the game-helm to open it up and turn it on. Click on the open device to play." icon = 'icons/obj/gamehelm.dmi' w_class = WEIGHT_CLASS_SMALL update_icon_on_init = TRUE @@ -47,6 +46,10 @@ var/muted = FALSE +/obj/item/gamehelm/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can ALT-click the game-helm to open it up and turn it on. Click on the open device to play." + /obj/item/gamehelm/update_icon() ClearOverlays() if(open) diff --git a/code/modules/heavy_vehicle/components/_components.dm b/code/modules/heavy_vehicle/components/_components.dm index cc50d259e32..e01b92de2e6 100644 --- a/code/modules/heavy_vehicle/components/_components.dm +++ b/code/modules/heavy_vehicle/components/_components.dm @@ -16,6 +16,13 @@ matter = list(DEFAULT_WALL_MATERIAL = 15000, MATERIAL_PLASTIC = 1000, MATERIAL_OSMIUM = 500) dir = SOUTH +/obj/item/mech_component/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(ready_to_install()) + . += SPAN_NOTICE("It is ready for installation.") + else + . += get_missing_parts_text(user) + /obj/item/mech_component/pickup(mob/user) pixel_x = initial(pixel_x) pixel_y = initial(pixel_y) @@ -33,13 +40,6 @@ for(var/obj/item/thing in contents) thing.emp_act(severity) -/obj/item/mech_component/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(ready_to_install()) - . += SPAN_NOTICE("It is ready for installation.") - else - . += get_missing_parts_text(user) - /obj/item/mech_component/set_dir() ..(SOUTH) diff --git a/code/modules/heavy_vehicle/equipment/utility.dm b/code/modules/heavy_vehicle/equipment/utility.dm index aa1fc9119ed..04700271283 100644 --- a/code/modules/heavy_vehicle/equipment/utility.dm +++ b/code/modules/heavy_vehicle/equipment/utility.dm @@ -370,6 +370,21 @@ desc = "A replaceable drill head usually used in exosuit drills." icon_state = "drill_head" +/obj/item/material/drill_head/condition_hints(mob/user, distance, is_adjacent) + . += ..() + var/percentage = get_durability_percentage() + var/descriptor = SPAN_DANGER("It looks close to breaking") + if(percentage > 10) + descriptor = SPAN_ALERT("It is very worn") + if(percentage > 50) + descriptor = SPAN_ALERT("It is fairly worn") + if(percentage > 75) + descriptor = SPAN_ALERT("It shows some signs of wear") + if(percentage > 95) + descriptor = SPAN_NOTICE("It shows no wear") + + . += descriptor + /obj/item/material/drill_head/Initialize(newloc, material_key) . = ..() durability = 2 * material.integrity @@ -377,21 +392,6 @@ /obj/item/material/drill_head/proc/get_durability_percentage() return (durability * 100) / (2 * material.integrity) -/obj/item/material/drill_head/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/percentage = get_durability_percentage() - var/descriptor = "looks close to breaking" - if(percentage > 10) - descriptor = "is very worn" - if(percentage > 50) - descriptor = "is fairly worn" - if(percentage > 75) - descriptor = "shows some signs of wear" - if(percentage > 95) - descriptor = "shows no wear" - - . += SPAN_NOTICE("It [descriptor].") - /obj/item/mecha_equipment/drill name = "drill" desc = "This is the drill that'll pierce the heavens!" @@ -726,7 +726,6 @@ /obj/item/mecha_equipment/phazon name = "phazon bluespace transmission system" desc = "A large back-mounted device that grants the exosuit it's mounted to the ability to semi-shift into bluespace, allowing it to pass through dense objects." - desc_info = "It needs an anomaly core to function. You can install some simply by using a core on it." icon_state = "mecha_phazon" restricted_hardpoints = list(HARDPOINT_BACK) w_class = WEIGHT_CLASS_HUGE @@ -736,6 +735,16 @@ var/obj/item/anomaly_core/AC var/image/anomaly_overlay +/obj/item/mecha_equipment/phazon/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + if(!AC) + . += "It needs an anomaly core to function. You can install one by using a core on it." + +/obj/item/mecha_equipment/phazon/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + if(AC) + . += "The anomaly core could be extracted if the securing bolts are undone." + /obj/item/mecha_equipment/phazon/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/anomaly_core)) if(AC) @@ -744,7 +753,6 @@ user.drop_from_inventory(attacking_item, src) AC = attacking_item to_chat(user, SPAN_NOTICE("You insert \the [AC] into \the [src].")) - desc_info = "\The [src] has an anomaly core installed! You can use a wrench to remove it." anomaly_overlay = image(AC.icon, null, AC.icon_state) anomaly_overlay.pixel_y = 3 AddOverlays(anomaly_overlay) diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 1fb8256e1a2..a123addbe9d 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -28,6 +28,24 @@ var/list/owned_bee_swarms = list() +/obj/machinery/beehive/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_NOTICE("\The [src] is holding [frames]/[maxFrames] frames.") + if(is_adjacent) + if(bee_count) + if(closed) + . += FONT_SMALL(SPAN_NOTICE("You can hear buzzing from within \the [src].")) + else + . += FONT_SMALL(SPAN_WARNING("The lid is open. The bees can't grow and produce honey until it's closed!")) + . += FONT_SMALL(SPAN_NOTICE("You can see bees buzzing around within \the [src].")) + else + if(closed) + . += FONT_SMALL(SPAN_NOTICE("\The [src] lies silent.")) + else + . += FONT_SMALL(SPAN_NOTICE("You can see bees buzzing around within \the [src].")) + if(honeycombs / 100 > 1) + . += SPAN_NOTICE("\The [src] has a frame full of honeycombs which you can harvest.") + /obj/machinery/beehive/update_icon() ClearOverlays() icon_state = "beehive" @@ -46,24 +64,6 @@ if(81 to 100) AddOverlays("bees3") -/obj/machinery/beehive/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("\The [src] is holding [frames]/[maxFrames] frames.") - if(is_adjacent) - if(bee_count) - if(closed) - . += FONT_SMALL(SPAN_NOTICE("You can hear buzzing from within \the [src].")) - else - . += FONT_SMALL(SPAN_WARNING("The lid is open. The bees can't grow and produce honey until it's closed!")) - . += FONT_SMALL(SPAN_NOTICE("You can see bees buzzing around within \the [src].")) - else - if(closed) - . += FONT_SMALL(SPAN_NOTICE("\The [src] lies silent.")) - else - . += FONT_SMALL(SPAN_NOTICE("You can see bees buzzing around within \the [src].")) - if(honeycombs / 100 > 1) - . += SPAN_NOTICE("\The [src] has a frame full of honeycombs which you can harvest.") - /obj/machinery/beehive/attackby(obj/item/attacking_item, mob/user) if(attacking_item.iscrowbar()) closed = !closed diff --git a/code/modules/hydroponics/beekeeping/smoker.dm b/code/modules/hydroponics/beekeeping/smoker.dm index 7bb4a510a95..8f888a5a72b 100644 --- a/code/modules/hydroponics/beekeeping/smoker.dm +++ b/code/modules/hydroponics/beekeeping/smoker.dm @@ -1,7 +1,6 @@ /obj/item/bee_smoker name = "bee smoker" desc = "An archaic contraption that slowly burns welding fuel to create thick clouds of smoke, and directs it with attached bellows, used to control angry bees and calm them before harvesting honey." - desc_antag = "This device can be used to blind people in short range." icon = 'icons/obj/beekeeping.dmi' icon_state = "bee_smoker" item_state = "bee_smoker" @@ -9,8 +8,12 @@ w_class = WEIGHT_CLASS_BULKY var/max_fuel = 60 -/obj/item/bee_smoker/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/bee_smoker/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This device can be used to blind people in short range." + +/obj/item/bee_smoker/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(is_adjacent) . += SPAN_NOTICE("It has [get_fuel()]/[max_fuel] welding fuel left.") diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 12a8ba58483..8e548d0f2b1 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -695,9 +695,9 @@ else if(dead) remove_dead(user) -/// TODO: Need to modernise this. -/obj/machinery/portable_atmospherics/hydroponics/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/portable_atmospherics/hydroponics/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!seed) . += "[src] is empty." return diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 347cbba68ff..933c7f11560 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -192,7 +192,6 @@ icon = 'icons/obj/library.dmi' contained_sprite = TRUE icon_state = "book" - desc_antag = "As a Cultist, this item can be reforged to become a cult tome." throw_speed = 1 throw_range = 5 w_class = WEIGHT_CLASS_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) @@ -207,6 +206,10 @@ drop_sound = 'sound/items/drop/book.ogg' pickup_sound = 'sound/items/pickup/book.ogg' +/obj/item/book/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a Cultist, this item can be reforged to become a cult tome." + /obj/item/book/attack_self(var/mob/user as mob) if(carved) if(store) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 7d410e5b796..b3b86e77ad7 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -1,6 +1,5 @@ // Stacked resources. They use a material datum for a lot of inherited values. /obj/item/stack/material - desc_info = "Use in your hand to bring up the recipe menu. If you have enough sheets, click on something on the list to build it." force = 11 throwforce = 5 w_class = WEIGHT_CLASS_NORMAL @@ -16,6 +15,11 @@ var/painted_colour var/use_material_sound = TRUE +/obj/item/stack/material/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use in your hand to bring up the crafting menu." + . += "If you have enough sheets, click on something on the list to build it." + /obj/item/stack/material/Initialize(mapload, amount) . = ..() randpixel_xy() diff --git a/code/modules/materials/material_synth.dm b/code/modules/materials/material_synth.dm index b67b39fd209..35f71162e14 100644 --- a/code/modules/materials/material_synth.dm +++ b/code/modules/materials/material_synth.dm @@ -36,14 +36,18 @@ default_type = MATERIAL_CLOTH /obj/item/stack/material/cyborg/glass - desc_info = "Use in your hand to build a window. Can be upgraded to reinforced glass by adding metal rods, which are made from metal sheets.
\ - As a synthetic, you can acquire more sheets of glass by recharging." icon_state = "sheet-glass" default_type = MATERIAL_GLASS +/obj/item/stack/material/cyborg/glass/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "As a synthetic, you can replenish your material supplies by recharging." + +/obj/item/stack/material/cyborg/glass/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use in your hand to build a window." + /obj/item/stack/material/cyborg/glass/reinforced - desc_info = "Use in your hand to build a window. Reinforced glass is much stronger against damage.
\ - As a synthetic, you can gain more reinforced glass by recharging." icon_state = "sheet-rglass" default_type = MATERIAL_GLASS_REINFORCED charge_costs = list(500, 1000) diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index 1c65678a42f..faabed0e40e 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -12,7 +12,6 @@ /obj/machinery/mining/drill name = "mining drill head" desc = "A large industrial drill. Its bore does not penetrate deep enough to access the sublevels." - desc_info = "You can upgrade this machine with better matter bins, capacitors, micro lasers, and power cells. You can also attach a mining satchel that has a warp pack and a linked ore box to it, to bluespace teleport any mined ore directly into the linked ore box." icon_state = "mining_drill" var/braces_needed = 2 var/list/supports = list() @@ -58,10 +57,6 @@ /obj/item/cell/high ) - component_hint_bin = "Upgraded matter bins will increase ore capacity." - component_hint_cap = "Upgraded capacitors will improve power efficiency." - component_hint_laser = "Upgraded micro-lasers will increase the amount of ore harvested." - parts_power_mgmt = FALSE /// The list of ores currently held within the mining drill @@ -70,26 +65,18 @@ /// The last time the stored ores were updated, used as a cooldown to not nuke the server var/last_stored_ore_update = 0 -/obj/machinery/mining/drill/Initialize() - . = ..() - spark_system = bind_spark(src, 3) +/obj/machinery/mining/drill/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Attaching a mining satchel with a warp extraction pack and a linked ore box to this drill will bluespace-teleport any mined ore directly into the linked ore box." -/obj/machinery/mining/drill/Destroy() - QDEL_NULL(attached_satchel) - QDEL_NULL(spark_system) - return ..() - -/obj/machinery/mining/drill/proc/update_ore_count() - stored_ores = list() - for(var/obj/item/ore/O in contents) - if(stored_ores[O.name]) - stored_ores[O.name]++ - else - stored_ores[O.name] = 1 - -/obj/machinery/mining/drill/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/mining/drill/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will increase ore capacity." + . += "Upgraded capacitors will improve power efficiency." + . += "Upgraded micro-lasers will increase the amount of ore harvested." +/obj/machinery/mining/drill/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(need_player_check) . += SPAN_WARNING("The drill error light is flashing. The cell panel is [panel_open ? "open" : "closed"].") else @@ -123,6 +110,23 @@ for(var/ore in stored_ores) . += SPAN_NOTICE("- [stored_ores[ore]] [ore]") +/obj/machinery/mining/drill/Initialize() + . = ..() + spark_system = bind_spark(src, 3) + +/obj/machinery/mining/drill/Destroy() + QDEL_NULL(attached_satchel) + QDEL_NULL(spark_system) + return ..() + +/obj/machinery/mining/drill/proc/update_ore_count() + stored_ores = list() + for(var/obj/item/ore/O in contents) + if(stored_ores[O.name]) + stored_ores[O.name]++ + else + stored_ores[O.name] = 1 + /obj/machinery/mining/drill/process() if(need_player_check) return diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm index 52c1c5b93e2..5359662f75b 100644 --- a/code/modules/mining/machine_processing.dm +++ b/code/modules/mining/machine_processing.dm @@ -12,7 +12,6 @@ /obj/machinery/mineral/processing_unit_console name = "ore redemption console" desc = "A handy console which can be use to retrieve mining points for use in the mining vendor, or to set processing values for various ore types." - desc_info = "Up to date settings for the refinery can be found in the Aurorastation Guide to Mining wikipage." icon = 'icons/obj/machinery/wall/terminals.dmi' icon_state = "production_console" density = FALSE @@ -36,9 +35,11 @@ /obj/item/stock_parts/console_screen ) - component_hint_cap = "Upgraded capacitors will increase the amount of ore smelted per second." - component_hint_laser = "Upgraded micro-lasers will increase the amount of ore smelted per second." - component_hint_scan = "Upgraded scanning modules will increase the amount of ore smelted per second." +/obj/machinery/mineral/processing_unit_console/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will increase the amount of ore smelted per second." + . += "Upgraded micro-lasers will increase the amount of ore smelted per second." + . += "Upgraded scanning modules will increase the amount of ore smelted per second." /obj/machinery/mineral/processing_unit_console/Initialize(mapload, d, populate_components) . = ..() diff --git a/code/modules/mining/machine_rigpress.dm b/code/modules/mining/machine_rigpress.dm index 3968cca6531..c9fc8780391 100644 --- a/code/modules/mining/machine_rigpress.dm +++ b/code/modules/mining/machine_rigpress.dm @@ -1,7 +1,6 @@ /obj/machinery/mineral/rigpress name = "hardsuit module press" desc = "This machine converts certain items permanently into hardsuit modules." - desc_info = "The following devices can be made:" icon = 'icons/obj/stationobjs.dmi' icon_state = "coinpress0" density = TRUE @@ -19,12 +18,13 @@ /obj/item/gun/energy/vaurca/thermaldrill = /obj/item/rig_module/mounted/thermalldrill ) -/obj/machinery/mineral/rigpress/Initialize() - . = ..() +/obj/machinery/mineral/rigpress/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The following devices can be made:" for(var/press_type in press_types) var/obj/item/base = press_type var/obj/item/product = press_types[press_type] - desc_info += "\n[initial(base.name)] -> [initial(product.name)]" + . += "[initial(base.name)] -> [initial(product.name)]" /obj/machinery/mineral/rigpress/update_icon() if(pressing) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 1b9d7abe883..79b87f21795 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -963,12 +963,16 @@ GLOBAL_LIST_INIT_TYPED(total_extraction_beacons, /obj/structure/extraction_point /obj/item/warp_core name = "warp extraction beacon signaller" - desc = "Emits a signal which Warp-Item recovery devices can lock onto. Activate in hand to create a beacon." - desc_info = "You can activate this item in-hand to create a static beacon, or you can click on an ore box with it to allow the ore box to be linked to warp packed mining satchels." + desc = "Emits a signal which Warp-Item recovery devices can lock onto." icon = 'icons/obj/stock_parts.dmi' icon_state = "subspace_amplifier" origin_tech = list(TECH_BLUESPACE = 1, TECH_PHORON = 1, TECH_ENGINEERING = 2) +/obj/item/warp_core/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can activate this item in-hand to create a static beacon." + . += "You can click on an ore box with it to allow the ore box to be linked to warp extraction pack-enabled mining satchels." + /obj/item/warp_core/attack_self(mob/user) to_chat(user, SPAN_NOTICE("You start placing down the beacon...")) if(do_after(user, 15)) diff --git a/code/modules/mining/ore_detector.dm b/code/modules/mining/ore_detector.dm index 3d64c35437c..7bca37a9c6c 100644 --- a/code/modules/mining/ore_detector.dm +++ b/code/modules/mining/ore_detector.dm @@ -26,15 +26,14 @@ /// The anchor used to render the ore pings on top of, this follows us around as the ore detector resets its blips var/obj/item/detector_anchor/anchor +/obj/item/ore_detector/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-click to set the type of ore you wish to search for." + /obj/item/ore_detector/Initialize(mapload, ...) . = ..() anchor = new /obj/item/detector_anchor(src) -/obj/item/ore_detector/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - . += FONT_SMALL(SPAN_NOTICE("Alt-click to set the ore you wish to search for.")) - /obj/item/ore_detector/Destroy() deactivate() QDEL_NULL(anchor) diff --git a/code/modules/mining/ore_satchel.dm b/code/modules/mining/ore_satchel.dm index 648ffcc456a..7253e74dfb7 100644 --- a/code/modules/mining/ore_satchel.dm +++ b/code/modules/mining/ore_satchel.dm @@ -1,7 +1,6 @@ /obj/item/storage/bag/ore name = "mining satchel" desc = "This little bugger can be used to store and transport ores." - desc_info = "You can attach a warp extraction pack to it, then click on an ore box that has a warp extraction beacon signaller attached to it to link them. Then ore put into this will be bluespace teleported into the ore box." icon = 'icons/obj/storage/bags.dmi' icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET @@ -16,6 +15,15 @@ var/linked_beacon = FALSE // can't hold an actual beacon beclause storage code a shit var/linked_beacon_uses = 3 // to hold the amount of uses the beacon had, storage code a shit. +/obj/item/storage/bag/ore/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can attach a warp extraction pack to it, then click on an ore box that has a warp extraction beacon signaller attached to it to link them. Then ore put into this will be bluespace teleported into the ore box." + +/obj/item/storage/bag/ore/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent && linked_beacon) + . += FONT_SMALL(SPAN_NOTICE("It has a warp extraction pack attached.")) + /obj/item/storage/bag/ore/Destroy() if(listeningTo) UnregisterSignal(listeningTo, COMSIG_MOVABLE_MOVED) @@ -48,11 +56,6 @@ if(location) pickup_items_from_loc_and_feedback(user, location, explicit_request = FALSE) -/obj/item/storage/bag/ore/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent && linked_beacon) - . += FONT_SMALL(SPAN_NOTICE("It has a warp extraction pack inside.")) - /obj/item/storage/bag/ore/drone // this used to be 400. The inventory system FUCKING DIED at this. max_storage_space = 200 diff --git a/code/modules/mining/satchel_ore_boxdm.dm b/code/modules/mining/satchel_ore_boxdm.dm index c1aca780f76..58ce8b0b69e 100644 --- a/code/modules/mining/satchel_ore_boxdm.dm +++ b/code/modules/mining/satchel_ore_boxdm.dm @@ -4,7 +4,6 @@ /obj/structure/ore_box name = "ore box" desc = "A heavy box used for storing ore." - desc_info = "You can attach a warp extraction beacon signaller to this, then click on it with an ore satchel that has a warp extraction pack attached, to link them." icon = 'icons/obj/mining.dmi' icon_state = "orebox0" density = TRUE @@ -13,6 +12,32 @@ var/obj/item/warp_core/warp_core // to set up the bluespace network var/list/stored_ore = list() +/obj/structure/ore_box/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can attach a warp extraction beacon signaller to this, then click on it with an ore satchel that has a warp extraction pack attached, to link them." + +/obj/structure/ore_box/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!is_adjacent) //Can only check the contents of ore boxes if you can physically reach them. + return + + add_fingerprint(user) + + if(warp_core) + . += FONT_SMALL(SPAN_NOTICE("It has a warp extraction beacon signaller attached to it.")) + + if(!length(contents)) + . += SPAN_NOTICE("It is empty.") + return + + if(world.time > last_update + 10) + update_ore_count() + last_update = world.time + + . += SPAN_NOTICE("It holds:") + for(var/ore in stored_ore) + . += SPAN_NOTICE("- [stored_ore[ore]] [ore]") + /obj/structure/ore_box/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/ore)) user.drop_from_inventory(attacking_item, src) @@ -71,28 +96,6 @@ else stored_ore[O.name] = 1 -/obj/structure/ore_box/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!is_adjacent) //Can only check the contents of ore boxes if you can physically reach them. - return - - add_fingerprint(user) - - if(warp_core) - . += FONT_SMALL(SPAN_NOTICE("It has a warp extraction beacon signaller attached to it.")) - - if(!length(contents)) - . += SPAN_NOTICE("It is empty.") - return - - if(world.time > last_update + 10) - update_ore_count() - last_update = world.time - - . += SPAN_NOTICE("It holds:") - for(var/ore in stored_ore) - . += SPAN_NOTICE("- [stored_ore[ore]] [ore]") - /obj/structure/ore_box/verb/empty_box() set name = "Empty Ore Box" set category = "Object" diff --git a/code/modules/mob/living/carbon/slime/slime_extractor.dm b/code/modules/mob/living/carbon/slime/slime_extractor.dm index 661779850ca..b236fac7b88 100644 --- a/code/modules/mob/living/carbon/slime/slime_extractor.dm +++ b/code/modules/mob/living/carbon/slime/slime_extractor.dm @@ -1,7 +1,6 @@ /obj/machinery/slime_extractor name = "slime core extractor" desc = "A bulky machine that, when fed a slime corpse, rapidly extracts the held cores." - desc_info = "This machine can be upgraded with a micro laser to increase its extraction speed, or a matter bin to increase its slime capacity. It will place slime extracts into a slime extract bag if it's adjacent to the machine." icon = 'icons/obj/stationobjs.dmi' icon_state = "slime_extractor" density = TRUE @@ -19,14 +18,20 @@ /obj/item/stack/cable_coil{amount = 5} ) - component_hint_bin = "Upgraded matter bins will increase slime capacity." - component_hint_laser = "Upgraded micro-lasers will increase extraction speed." +/obj/machinery/slime_extractor/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It will place slime extracts into a slime extract bag automatically if it's adjacent to the machine." -/obj/machinery/slime_extractor/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += FONT_SMALL(SPAN_NOTICE("It can hold [slime_limit] slime\s at a time.")) +/obj/machinery/slime_extractor/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will increase slime capacity." + . += "Upgraded micro-lasers will increase extraction speed." + +/obj/machinery/slime_extractor/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It can hold [slime_limit] slime\s at a time." if(length(extract_slimes)) - . += FONT_SMALL(SPAN_WARNING("It is currently processing [length(extract_slimes)] slime\s.")) + . += "It is currently processing [length(extract_slimes)] slime\s." /obj/machinery/slime_extractor/update_icon() ClearOverlays() @@ -101,7 +106,6 @@ qdel(extracted_slime) update_icon() - #ifndef T_BOARD #error T_BOARD macro is not defined but we need it! #endif diff --git a/code/modules/mob/living/silicon/robot/combat_robot.dm b/code/modules/mob/living/silicon/robot/combat_robot.dm index 536fdb9aab6..b13c228c097 100644 --- a/code/modules/mob/living/silicon/robot/combat_robot.dm +++ b/code/modules/mob/living/silicon/robot/combat_robot.dm @@ -103,10 +103,13 @@ /obj/item/robot_emag name = "cryptographic sequencer" desc = "It's a card with a magnetic strip attached to some circuitry. This one is modified to be used by a robot." - desc_antag = "This emag has an unlimited number of uses, however, each use will drain a little bit of your power cell." icon = 'icons/obj/card.dmi' icon_state = "emag" +/obj/item/robot_emag/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This emag has an unlimited number of uses, however, each use will drain a little bit of your power cell." + /obj/item/robot_emag/afterattack(var/atom/target, var/mob/living/user, proximity) //possible spaghetti code, but should work if(!target) return diff --git a/code/modules/mob/living/silicon/robot/items/inductive_charger.dm b/code/modules/mob/living/silicon/robot/items/inductive_charger.dm index 1abbd330cd6..36bae237dd2 100644 --- a/code/modules/mob/living/silicon/robot/items/inductive_charger.dm +++ b/code/modules/mob/living/silicon/robot/items/inductive_charger.dm @@ -2,7 +2,6 @@ name = "inductive charger" desc = "A phoron-enhanced induction charger hooked up to its attached stationbound's internal cell." desc_extended = "Harnessing the energy potential found in phoron structures, NanoTrasen engineers have created a portable device capable of highly efficient wireless charging. The expense and limit of energy output of using this method of charging prevents it from being used on a large scale, being far outclassed by Phoron-Supermatter charging systems." - desc_info = "Click on an adjacent object that contains or is a power cell to attempt to find and charge it. After a successful charge, the inductive charger recharge in a few minutes. The amount transferred can be adjusted by alt clicking it." icon = 'icons/obj/item/inductive_charger.dmi' icon_state = "inductive_charger" item_state = "inductive_charger" @@ -16,6 +15,17 @@ maptext_x = 3 maptext_y = 2 +/obj/item/inductive_charger/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click on an adjacent object that contains or is a power cell to attempt to find and charge it." + . += "ALT-click to adjust the transferred amount" + . += "After a successful charge, the inductive charger recharge in a few minutes." + +/obj/item/inductive_charger/handheld/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(cell) + . += SPAN_NOTICE("Cell Charge: [cell.percent()]%") + /obj/item/inductive_charger/set_initial_maptext() held_maptext = SMALL_FONTS(7, "Ready") @@ -103,11 +113,6 @@ if(ispath(cell)) cell = new cell(src) -/obj/item/inductive_charger/handheld/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(cell) - . += SPAN_NOTICE("Cell Charge: [cell.percent()]%") - /obj/item/inductive_charger/handheld/get_cell() return cell diff --git a/code/modules/mob/living/silicon/robot/items/modules/sight.dm b/code/modules/mob/living/silicon/robot/items/modules/sight.dm index 612fbc97a9a..a1e9df82b5e 100644 --- a/code/modules/mob/living/silicon/robot/items/modules/sight.dm +++ b/code/modules/mob/living/silicon/robot/items/modules/sight.dm @@ -15,11 +15,14 @@ /obj/item/borg/sight/thermal name = "\proper thermal vision" - desc_antag = "Having this device on your hotbar will allow you to see in enhanced thermal vision, which allows you to see heat signatures through solid walls." sight_mode = BORGTHERM icon_state = "thermal" icon = 'icons/obj/clothing/glasses.dmi' +/obj/item/borg/sight/thermal/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Having this device on your hotbar will allow you to see in enhanced thermal vision, which allows you to see heat signatures through solid walls." + /obj/item/borg/sight/meson name = "\proper meson vision" sight_mode = BORGMESON diff --git a/code/modules/mob/living/silicon/robot/items/robot_inflatables.dm b/code/modules/mob/living/silicon/robot/items/robot_inflatables.dm index 90924ff859d..95d1e3ce01b 100644 --- a/code/modules/mob/living/silicon/robot/items/robot_inflatables.dm +++ b/code/modules/mob/living/silicon/robot/items/robot_inflatables.dm @@ -16,16 +16,16 @@ var/stored_doors = 5 var/mode = MODE_WALL // 0 - Walls 1 - Doors +/obj/item/inflatable_dispenser/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_NOTICE("It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.") + . += SPAN_NOTICE("It is set to deploy [mode ? "doors" : "walls"].") + /obj/item/inflatable_dispenser/Initialize(mapload, ...) . = ..() stored_walls = max_walls stored_doors = max_doors -/obj/item/inflatable_dispenser/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("It has [stored_walls] wall segment\s and [stored_doors] door segment\s stored.") - . += SPAN_NOTICE("It is set to deploy [mode ? "doors" : "walls"]") - /obj/item/inflatable_dispenser/attack_self(mob/user) if(!deploying) mode = !mode diff --git a/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm b/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm index e16d2c5b11c..c028b97b3cb 100644 --- a/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm +++ b/code/modules/mob/living/simple_animal/friendly/cosmozoan.dm @@ -1,7 +1,7 @@ /mob/living/simple_animal/cosmozoan name = "cosmozoan" desc = "These jellyfish-like entities drift through asteroid fields, emitting a soft glow." - desc_info = "Schools of Cosmozoans often congregate in asteroid fields, though they have rarely been witnessed in greater number and size in the Frontier. Their origin remains a mystery but it is believed they predate early man. This belief landed them the name Cosmozoa." + desc_extended = "Schools of Cosmozoans often congregate in asteroid fields, though they have rarely been witnessed in greater number and size in the Frontier. Their origin remains a mystery but it is believed they predate early man. This belief landed them the name Cosmozoa." icon_state = "cosmozoan" icon_living = "cosmozoan" icon_dead = "cosmozoan_dead" diff --git a/code/modules/modular_computers/computers/subtypes/dev_handheld.dm b/code/modules/modular_computers/computers/subtypes/dev_handheld.dm index 274787f4e9b..165e392d316 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_handheld.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_handheld.dm @@ -2,7 +2,6 @@ name = "tablet computer" lexical_name = "tablet" desc = "A portable device for your needs on the go." - desc_info = "To deploy the charging cable on this device, either drag and drop it over a nearby APC, or click on the APC with the computer in hand." icon = 'icons/obj/modular_tablet.dmi' icon_state = "tablet" icon_state_unpowered = "tablet" @@ -15,6 +14,10 @@ w_class = WEIGHT_CLASS_SMALL looping_sound = FALSE +/obj/item/modular_computer/handheld/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To deploy the charging cable on this device, either drag and drop it over a nearby APC, or click on the APC with the computer in hand." + /obj/item/modular_computer/handheld/Initialize() . = ..() set_icon() diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm index 658226a0251..c4959ac527a 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm @@ -3,7 +3,6 @@ name = "laptop computer" lexical_name = "laptop" desc = "A portable computer." - desc_info = "You can alt-click the laptop while it's set down on surface to open it up and work with it. Left clicking while it is open will allow you to operate it." hardware_flag = PROGRAM_LAPTOP can_reset = TRUE icon_state_unpowered = "laptop-open" @@ -21,6 +20,11 @@ broken_damage = 25 var/icon_state_closed = "laptop-closed" +/obj/item/modular_computer/laptop/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-click the laptop while it's set down on a surface to open or close it." + . += "Left-click on it while it is open to operate it." + /obj/item/modular_computer/laptop/AltClick() if(use_check(usr)) return diff --git a/code/modules/modular_computers/items/paper_scanner.dm b/code/modules/modular_computers/items/paper_scanner.dm index ceb58bded48..4046d9dec31 100644 --- a/code/modules/modular_computers/items/paper_scanner.dm +++ b/code/modules/modular_computers/items/paper_scanner.dm @@ -1,13 +1,17 @@ /obj/item/paper_scanner name = "paper scanner" desc = "A simple device that can be used to scan paper or paper bundles in order to digitize them." - desc_info = "Alt-click it while it's in one of your hands to eject the portable drive. Click paper or a paper bundle with it to digitize it and store it in the inserted drive." icon = 'icons/obj/devices/paperscanner.dmi' icon_state = "paperscanner" item_state = "paperscanner" contained_sprite = TRUE var/obj/item/computer_hardware/hard_drive/portable/drive +/obj/item/paper_scanner/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click paper or a paper bundle with it to digitize it and store it in the inserted drive." + . += "ALT-click it while it's in one of your hands to eject the portable drive." + /obj/item/paper_scanner/Initialize(mapload, ...) . = ..() drive = new /obj/item/computer_hardware/hard_drive/portable(src) diff --git a/code/modules/multiz/hoist.dm b/code/modules/multiz/hoist.dm index ad69550c52a..f64c69dac75 100644 --- a/code/modules/multiz/hoist.dm +++ b/code/modules/multiz/hoist.dm @@ -18,13 +18,17 @@ /obj/effect/hoist_hook name = "hoist clamp" desc = "A clamp used to lift people or things." - desc_info = "To use the hook, click drag the object you want to it to attach it.\nTo remove an object from the hook, click drag the hook to a nearby turf." icon = 'icons/obj/hoists.dmi' icon_state = "hoist_hook" var/obj/structure/hoist/source_hoist can_buckle = TRUE anchored = TRUE +/obj/effect/hoist_hook/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To use the hook, click drag the object you want to it to attach it." + . += "To remove an object from the hook, click drag the hook to a nearby turf." + /obj/effect/hoist_hook/attack_hand(mob/living/user) if (use_check_and_message(user, USE_DISALLOW_SILICONS)) return @@ -96,7 +100,6 @@ /obj/structure/hoist icon = 'icons/obj/hoists.dmi' icon_state = "hoist_base" - desc_info = "To use the hook, click drag the object you want to it to attach it.\nTo remove an object from the hook, click drag the hook to a nearby turf." var/broken = 0 density = TRUE anchored = TRUE @@ -106,6 +109,11 @@ var/movedir = UP var/obj/effect/hoist_hook/source_hook +/obj/structure/hoist/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To use the hook, click drag the object you want to it to attach it." + . += "To remove an object from the hook, click drag the hook to a nearby turf." + /obj/structure/hoist/Initialize(mapload, ndir) . = ..() dir = ndir diff --git a/code/modules/overmap/overmap_shuttle.dm b/code/modules/overmap/overmap_shuttle.dm index 42ae3ea0c8e..2028244af95 100644 --- a/code/modules/overmap/overmap_shuttle.dm +++ b/code/modules/overmap/overmap_shuttle.dm @@ -118,7 +118,6 @@ /obj/structure/fuel_port //empty name = "fuel port" desc = "The fuel input port of the shuttle. Holds one fuel tank. Use a crowbar to open and close it." - desc_info = "The fuel port must be wrenched and welded in place before it can be loaded and used by the shuttle." icon = 'icons/turf/shuttle.dmi' icon_state = "fuel_port" density = 0 @@ -132,8 +131,12 @@ var/parent_shuttle var/port_item_path = /obj/item/fuel_port -/obj/structure/fuel_port/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/fuel_port/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The fuel port must be wrenched and welded in place before it can be loaded and used by the shuttle." + +/obj/structure/fuel_port/feedback_hints(mob/user, distance, is_adjacent) + . += ..() switch(state) if(FUEL_PORT_UNSECURED) . += SPAN_NOTICE("\The [src] is in place, but not attached to anything.") diff --git a/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm b/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm index 21e35f5b064..c9e523d3a9b 100644 --- a/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm +++ b/code/modules/overmap/ship_weaponry/_ship_ammo_loader.dm @@ -10,6 +10,13 @@ var/obj/machinery/ship_weapon/weapon var/weapon_id //Used to connect weapon systems to the relevant ammunition loader. +/obj/machinery/ammunition_loader/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use a multitool to check or update the weapon loader's internal network ID for linking purposes. You probably don't need to do this." + +/obj/machinery/ammunition_loader/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + /obj/machinery/ammunition_loader/Initialize(mapload) ..() return INITIALIZE_HINT_LATELOAD @@ -57,6 +64,8 @@ if(istype(CL.carrying[1], /obj/item/ship_ammunition)) var/obj/item/ship_ammunition/SA = CL.carrying[1] return load_ammo(SA, HV) + else + to_chat(user, SPAN_WARNING("\The [CL] does not appear to be holding any compatible ammunition.")) if(istype(attacking_item, /obj/item/device/multitool)) to_chat(user, SPAN_NOTICE("You hook up the tester's wires to \the [src]: its identification tag is [weapon_id].")) var/new_id = input(user, "Change the identification tag?", "Identification Tag", weapon_id) diff --git a/code/modules/overmap/ship_weaponry/_ship_ammunition.dm b/code/modules/overmap/ship_weaponry/_ship_ammunition.dm index 68c7b256e13..7a3a3e35675 100644 --- a/code/modules/overmap/ship_weaponry/_ship_ammunition.dm +++ b/code/modules/overmap/ship_weaponry/_ship_ammunition.dm @@ -31,6 +31,28 @@ var/cookoff_heavy = 2 var/cookoff_light = 3 +/obj/item/ship_ammunition/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Using a pen on \the [src] will let you write a lovely message on it for your intended target; this message is detectable on the overmap by ship sensors." + . += "Some types of ammunition are especially flammable, fragile, etc. They can cook off if not stored and handled very carefully." + +/obj/item/ship_ammunition/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(written_message) + if(distance > 3) + . += "It has something written on it, but you'd need to get closer to tell what the writing says." + else + . += "It has a message written on the casing: [written_message]." + +/obj/item/ship_ammunition/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + if(ammunition_flags & SHIP_AMMO_FLAG_INFLAMMABLE) + . += "This ammunition is flammable, and will cook off and explode when exposed to fire." + if(ammunition_flags & SHIP_AMMO_FLAG_VULNERABLE) + . += "This ammunition is vulnerable, and will cook off and explode on impact if shot at or attacked." + if(ammunition_flags & SHIP_AMMO_FLAG_VERY_FRAGILE) + . += "This ammunition is very fragile, and will cook off and explode on impact if thrown, or even just dropped with the Harm intent!" + /obj/item/ship_ammunition/Initialize() . = ..() update_status() @@ -57,14 +79,6 @@ return return ..() -/obj/item/ship_ammunition/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(written_message) - if(distance > 3) - . += "It has something written on it, but you'd need to get closer to tell what the writing says." - else - . += "It has a message written on the casing: [written_message]." - /obj/item/ship_ammunition/do_additional_pickup_checks(var/mob/user) if(ammunition_flags & SHIP_AMMO_FLAG_VERY_HEAVY) if(ishuman(user)) diff --git a/code/modules/overmap/ship_weaponry/_ship_gun.dm b/code/modules/overmap/ship_weaponry/_ship_gun.dm index 12bd1cefa12..d460a1af82f 100644 --- a/code/modules/overmap/ship_weaponry/_ship_gun.dm +++ b/code/modules/overmap/ship_weaponry/_ship_gun.dm @@ -30,6 +30,48 @@ var/list/obj/structure/ship_weapon_dummy/connected_dummies = list() var/obj/structure/ship_weapon_dummy/barrel +/obj/machinery/ship_weapon/condition_hints(mob/user, distance, is_adjacent) + . += ..() + var/ratio = (damage / max_damage) * 100 + switch(ratio) + if(1 to 10) + . += SPAN_NOTICE("It looks to be in tip top shape apart from a few minor scratches and dings.") + if(10 to 20) + . += SPAN_ALERT("It has some kinks and bends here and there.") + if(20 to 40) + . += SPAN_ALERT("It has a few holes through which you can see some machinery.") + if(40 to 60) + . += SPAN_WARNING("Some fairly important parts are missing... but it should work anyway.") + if(60 to 80) + . += SPAN_WARNING("It needs repairs direly. Both aiming and firing components are missing or broken. It has a lot of holes, too. It definitely wouldn't \ + pass inspection.") + if(90 to 100) + . += SPAN_DANGER("It's falling apart! Just touching it might make the whole thing collapse!") + else //At roundstart, weapons start with 0 damage, so it'd be 0 / 1000 * 100 -> 0 + . += SPAN_NOTICE("It looks to be in tip top shape and not damaged at all.") + +/obj/machinery/ship_weapon/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use a multitool to check or update the weapon's internal network ID for linking purposes. You probably don't need to do this." + . += "To load a ship weapon, you must use a nearby Ammunition Loader linked to it." + . += "This weapon is LOUD when it fires; you probably want to wear ear protection when nearby." + +/obj/machinery/ship_weapon/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + var/ratio = (damage / max_damage) * 100 + if(ratio > 0) + . += "The damage can be repaired with a welder, but given the size of \the [src] it will take a lot of time and welding fuel." + +/obj/machinery/ship_weapon/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/loaded_ammo_count_txt = num2text(length(ammunition)) + var/max_ammo_txt = num2text(max_ammo) + . += "\the [src] can load a maximum of [max_ammo_txt] [max_ammo == 1 ? "round" : "rounds"] at a time." + if(length(ammunition) >= max_ammo) + . += "\the [src] is fully loaded with ammunition!" + else + . += SPAN_NOTICE("\the [src] is currently loaded with [loaded_ammo_count_txt] [length(ammunition) == 1 ? "round" : "rounds"] of ammunition.") + /obj/machinery/ship_weapon/Initialize(mapload) ..() appearance_flags &= ~TILE_BOUND //NOT BOUND BY ANY LIMITS @@ -70,29 +112,6 @@ if(damage >= max_damage) qdel(src) -/obj/machinery/ship_weapon/proc/get_damage_description() - var/ratio = (damage / max_damage) * 100 - switch(ratio) - if(1 to 10) - . = "It looks to be in tip top shape." - if(10 to 20) - . = "It has some kinks and bends here and there." - if(20 to 40) - . = "It has a few holes through which you can see some machinery." - if(40 to 60) - . = SPAN_WARNING("Some fairly important parts are missing... but it should work anyway.") - if(60 to 80) - . = SPAN_DANGER("It needs repairs direly. Both aiming and firing components are missing or broken. It has a lot of holes, too. It definitely wouldn't \ - pass inspection.") - if(90 to 100) - . = SPAN_DANGER("It's falling apart! Just touching it might make the whole thing collapse!") - else //At roundstart, weapons start with 0 damage, so it'd be 0 / 1000 * 100 -> 0 - return "It looks to be in tip top shape and not damaged at all." - -/obj/machinery/ship_weapon/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += get_damage_description() - /obj/machinery/ship_weapon/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/device/multitool)) to_chat(user, SPAN_NOTICE("You hook up the tester to \the [src]'s wires: its identification tag is [weapon_id]>.")) diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm index f6345a8caf2..3b6a5aa114e 100644 --- a/code/modules/overmap/ships/computers/sensors.dm +++ b/code/modules/overmap/ships/computers/sensors.dm @@ -496,14 +496,14 @@ if(heat_percentage > 85) AddOverlays("sensors-effect-hot") -/obj/machinery/shipsensors/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/shipsensors/condition_hints(mob/user, distance, is_adjacent) + . += ..() if(health <= 0) . += "\The [src] is wrecked." else if(health < max_health * 0.25) . += SPAN_DANGER("\The [src] looks like it's about to break!") else if(health < max_health * 0.5) - . += SPAN_DANGER("\The [src] looks seriously damaged!") + . += SPAN_ALERT("\The [src] looks seriously damaged!") else if(health < max_health * 0.75) . += "\The [src] shows signs of damage!" @@ -579,14 +579,11 @@ if(use_power && health == 0) toggle() -/obj/machinery/shipsensors/RefreshParts() - GetPartUpgradeDesc() - // For small shuttles /obj/machinery/shipsensors/weak heat_reduction = 1.7 // Can sustain range 4 max_range = 7 - desc = "Miniturized gravity scanner with various other sensors, used to detect irregularities in surrounding space. Can only run in vacuum to protect delicate quantum BS elements." + desc = "Miniaturized gravity scanner with various other sensors, used to detect irregularities in surrounding space. Can only run in vacuum to protect delicate quantum BS elements." deep_scan_range = 0 component_types = list( /obj/item/circuitboard/shipsensors/weak, diff --git a/code/modules/overmap/ships/computers/ship.dm b/code/modules/overmap/ships/computers/ship.dm index 59e2d26c6f7..83d86fba0eb 100644 --- a/code/modules/overmap/ships/computers/ship.dm +++ b/code/modules/overmap/ships/computers/ship.dm @@ -4,8 +4,6 @@ with an /obj/effect/overmap/visitable/ship present elsewhere on that z level, or somewhere on that shuttle. Subtypes of these can be then used to perform ship overmap movement functions. */ /obj/machinery/computer/ship - desc_antag = "These consoles, especially the ones that handle piloting and weaponry, may be access-locked.\ - You can remove this lock with wirecutters, but it would take awhile! Alternatively, you can also use a cryptographic sequencer (emag) for instant removal." /// Weakrefs to mobs in direct-view mode. var/list/viewers /// How much the view is increased by when the mob is in overmap mode. @@ -19,6 +17,10 @@ somewhere on that shuttle. Subtypes of these can be then used to perform ship ov /// For hotwiring, how many cycles are needed. This decreases by 1 each cycle and triggers at 0 var/hotwire_progress = 8 +/obj/machinery/computer/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Consoles like these are typically access-locked." + . += "You can remove this lock with wirecutters, but it would take awhile! Alternatively, you can also use a cryptographic sequencer (emag) for instant removal." /obj/machinery/computer/ship/proc/display_reconnect_dialog(var/mob/user, var/flavor) var/datum/browser/popup = new (user, "[src]", "[src]") diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 8eade518aa0..1c5d19dd589 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -1,7 +1,6 @@ /obj/item/clipboard name = "clipboard" desc = "When other writing surfaces are unavailable." - desc_info = "You can store a pen in this." icon = 'icons/obj/bureaucracy.dmi' icon_state = "clipboard" item_state = "clipboard" @@ -15,6 +14,10 @@ var/ui_open = FALSE slot_flags = SLOT_BELT +/obj/item/clipboard/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can store a pen in this." + /obj/item/clipboard/Initialize() . = ..() update_icon() diff --git a/code/modules/paperwork/journal.dm b/code/modules/paperwork/journal.dm index d55d38d79b7..c6d7d7307ef 100644 --- a/code/modules/paperwork/journal.dm +++ b/code/modules/paperwork/journal.dm @@ -2,7 +2,6 @@ name = "journal" desc = "A journal, kind of like a folder, but bigger! And personal." var/closed_desc - desc_info = "Alt-click this while it's on your person or next to you to open this journal.\nWhile the journal is open, use it in hand or use a pen on it to access the contents." icon = 'icons/obj/library.dmi' icon_state = "journal" item_state = "journal" @@ -20,6 +19,11 @@ var/open = FALSE var/list/indices +/obj/item/journal/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-click this while it's on your person or next to you to open this journal." + . += "While the journal is open, use it in hand or use a pen on it to access the contents." + /obj/item/journal/Destroy() for(var/obj/item/folder/embedded/E as anything in indices) qdel(E) @@ -109,7 +113,7 @@ /obj/item/journal/notepad name = "notepad" desc = "A notepad for jotting down notes in meetings or interrogations." - desc_info = "Alt-click this while it's on your person or next to you to open this notepad.\nWhile the notepad is open, use it in hand or use a pen on it to access the contents." + icon = 'icons/obj/library.dmi' icon_state = "notepad" item_state = "notepad" @@ -140,7 +144,6 @@ /obj/item/journal/notepad/scc name = "scc notepad" desc = "A notepad for jotting down notes in corporate meetings. This one is navy blue with a gold SCC logo on the front." - desc_info = "Alt-click this while it's on your person or next to you to open this notepad.\nWhile the notepad is open, use it in hand or use a pen on it to access the contents." icon_state = "notepad_scc" item_state = "notepad_scc" color = COLOR_WHITE diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index fd11647c9a3..034ec2332d2 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -62,6 +62,18 @@ var/can_change_icon_state = TRUE var/set_unsafe_on_init = FALSE +/obj/item/paper/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (old_name && (icon_state == "paper_plane" || icon_state == "paper_swan")) + . += SPAN_NOTICE("You're going to have to unfold it before you can read it.") + return + if(name != initial(name)) + . += "It's titled '[name]'." + if(distance <= 1) + show_content(user) + else + . += SPAN_NOTICE("You have to go closer if you want to read it.") + /obj/item/paper/Initialize(mapload, text, title) . = ..() base_state = initial(icon_state) @@ -119,18 +131,6 @@ if(new_text) free_space -= length(strip_html_properly(new_text)) -/obj/item/paper/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (old_name && (icon_state == "paper_plane" || icon_state == "paper_swan")) - . += SPAN_NOTICE("You're going to have to unfold it before you can read it.") - return - if(name != initial(name)) - . += "It's titled '[name]'." - if(distance <= 1) - show_content(user) - else - . += SPAN_NOTICE("You have to go closer if you want to read it.") - /obj/item/paper/proc/show_content(mob/user, forceshow) simple_asset_ensure_is_sent(user, /datum/asset/simple/paper) var/datum/browser/paper_win = new(user, name, null, 450, 500, null, TRUE) diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index e7937cc7024..4f6ab557084 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -23,6 +23,17 @@ drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' +/obj/item/paper_bundle/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Both papers and photos can be added to a paper bundle." + +/obj/item/paper_bundle/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + src.show_content(user) + else + . += SPAN_NOTICE("It is too far away to read.") + /obj/item/paper_bundle/attackby(obj/item/attacking_item, mob/user) ..() @@ -98,13 +109,6 @@ else to_chat(user, SPAN_WARNING("You must hold \the [P] steady to burn \the [src].")) -/obj/item/paper_bundle/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - src.show_content(user) - else - . += SPAN_NOTICE("It is too far away.") - /obj/item/paper_bundle/proc/show_content(mob/user as mob) var/dat var/obj/item/W = pages[page] diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 1e72e8c505e..cc1f16c54e3 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -13,6 +13,13 @@ var/amount = 30 //How much paper is in the bin. var/list/papers = new/list() //List of papers put in the bin for reference. +/obj/item/paper_bin/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + if(amount) + . += SPAN_NOTICE("There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin.") + else + . += SPAN_NOTICE("There are no papers in the bin.") /obj/item/paper_bin/mouse_drop_dragged(atom/over, mob/user, src_location, over_location, params) if((over == user && (!( user.restrained() ) && (!( user.stat ) && (user.contents.Find(src) || in_range(src, user)))))) @@ -29,7 +36,6 @@ to_chat(H, SPAN_NOTICE("You pick up the [src].")) H.put_in_hands(src) - return /obj/item/paper_bin/attack_hand(mob/user as mob) @@ -76,7 +82,6 @@ add_fingerprint(user) return - /obj/item/paper_bin/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/paper)) var/obj/item/paper/i = attacking_item @@ -85,15 +90,6 @@ papers.Add(i) amount++ -/obj/item/paper_bin/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(amount) - . += SPAN_NOTICE("There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin.") - else - . += SPAN_NOTICE("There are no papers in the bin.") - - /obj/item/paper_bin/update_icon() if(amount < 1) icon_state = "paper_bin0" diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index d25990a2254..dbdb6c284a5 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -15,7 +15,7 @@ /obj/item/pen name = "pen" desc = "An instrument for writing or drawing. This one is in black." - desc_info = {"This is an item for writing down your thoughts, on paper or elsewhere. The following special commands are available: + desc_extended = {"This is an item for writing down your thoughts, on paper or elsewhere. The following special commands are available:
Pen and crayon commands \[br\] : Creates a linebreak. diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index a4760b328ef..ea4b5eb5517 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -45,6 +45,14 @@ GLOBAL_VAR_INIT(photo_count, 0) drop_sound = 'sound/items/drop/paper.ogg' pickup_sound = 'sound/items/pickup/paper.ogg' +/obj/item/photo/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + show(user) + . += SPAN_NOTICE("[picture_desc]") + else + . += SPAN_NOTICE("You are too far away to discern its contents.") + /obj/item/photo/New() . = ..() id = GLOB.photo_count++ @@ -59,14 +67,6 @@ GLOBAL_VAR_INIT(photo_count, 0) scribble = txt ..() -/obj/item/photo/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - show(user) - . += SPAN_NOTICE("[picture_desc]") - else - . += SPAN_NOTICE("You are too far away to discern its contents.") - /obj/item/photo/proc/show(mob/user as mob) send_rsc(user, img, "tmp_photo_[id].png") var/dat = "[name]" \ @@ -155,10 +155,10 @@ GLOBAL_VAR_INIT(photo_count, 0) var/icon_off = "camera_off" var/size = 3 -/obj/item/device/camera/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/device/camera/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(is_adjacent) - . += SPAN_NOTICE("It has [pictures_left] photos left.") + . += SPAN_NOTICE("It has [pictures_left] photos left.") /obj/item/device/camera/verb/change_size() set name = "Set Photo Focus" diff --git a/code/modules/paperwork/typewriter.dm b/code/modules/paperwork/typewriter.dm index 4df61842b8e..bb35995389b 100644 --- a/code/modules/paperwork/typewriter.dm +++ b/code/modules/paperwork/typewriter.dm @@ -5,7 +5,6 @@ /obj/item/portable_typewriter name = "portable typewriter" desc = "A reasonably lightweight typewriter designed to be moved around." - desc_info = "You can alt-click this to eject the paper. Click and drag onto yourself while adjacent to type on the typewriter." desc_extended = "The National Typist Company in the People's Republic of Adhomai was once the largest producer of \ typewriters on the planet. With the introduction of human technology, however, these items - \ which were once staples of Tajaran offices - have slowly become more uncommon. That \ @@ -21,6 +20,11 @@ var/obj/item/paper/stored_paper = null var/obj/item/pen/pen +/obj/item/portable_typewriter/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can ALT-click this to eject the paper." + . += "Click and drag \the [src] onto yourself while adjacent to type on it." + /obj/item/portable_typewriter/Initialize() . = ..() @@ -119,7 +123,6 @@ /obj/item/typewriter_case name = "typewriter case" desc = "A large briefcase-esque place to store one's typewriter." - desc_info = "You can alt-click on this case to open and close it. A typewriter can only be removed or added when it is open!" desc_extended = "The National Typist Company in the People's Republic of Adhomai was once the largest producer of \ typewriters on the planet. With the introduction of human technology, however, these items - \ which were once staples of Tajaran offices - have slowly become more uncommon. That \ @@ -139,6 +142,10 @@ var/obj/item/portable_typewriter/machine var/opened = FALSE +/obj/item/typewriter_case/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can ALT-click on this case to open and close it. A typewriter can only be removed or added when it is open!" + /obj/item/typewriter_case/Initialize() . = ..() if(!machine) diff --git a/code/modules/power/antimatter/containment_jar.dm b/code/modules/power/antimatter/containment_jar.dm index c10ae1ed116..33c8281fdcf 100644 --- a/code/modules/power/antimatter/containment_jar.dm +++ b/code/modules/power/antimatter/containment_jar.dm @@ -1,7 +1,6 @@ /obj/item/am_containment name = "antimatter containment jar" desc = "Holds antimatter. Warranty void if exposed to matter." - desc_antag = "Antimatter is extremely volatile, and containment jars are not particularly strong. Weak explosions will reduce the container's integrity, and larger ones will cause it to explode immediately." icon = 'icons/obj/machinery/antimatter.dmi' icon_state = "jar" force = 18 @@ -13,6 +12,9 @@ var/stability = 100 //TODO: add all the stability things to this so its not very safe if you keep hitting in on things var/exploded = FALSE +/obj/item/am_containment/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Antimatter is extremely volatile, and containment jars are not particularly strong. Weak explosions will reduce the container's integrity, and larger ones will cause it to explode immediately." /obj/item/am_containment/proc/boom() var/percent = 0 if(fuel) diff --git a/code/modules/power/antimatter/control.dm b/code/modules/power/antimatter/control.dm index a1a0974c582..21f337858c6 100644 --- a/code/modules/power/antimatter/control.dm +++ b/code/modules/power/antimatter/control.dm @@ -1,8 +1,6 @@ /obj/machinery/power/am_control_unit name = "antimatter control unit" desc = "The control unit for an antimatter reactor. Probably safe." - desc_info = "Use a wrench to attach the control unit to the ground, then arrange the reactor sections nearby. Reactor sections can only be activated if they are near the control unit, but otherwise are not restricted in how they must be placed." - desc_antag = "The antimatter engine will quickly destabilize if the fuel injection rate is set too high, causing a large explosion." icon = 'icons/obj/machinery/new_ame.dmi' icon_state = "control" var/icon_mod = "on" // on, critical, or fuck @@ -32,6 +30,18 @@ var/stored_power = 0 //Power to deploy per tick +/obj/machinery/power/am_control_unit/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + if(!anchored) + . += "First secure the control unit to the ground with some bolts." + else + . += "Arrange the reactor sections nearby and activate them." + . += "Reactor sections can only be activated if they are near the control unit, but otherwise are not restricted in how they must be placed." + +/obj/machinery/power/am_control_unit/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The antimatter engine will quickly destabilize if the fuel injection rate is set too high, causing a large explosion." + /obj/machinery/power/am_control_unit/Destroy()//Perhaps damage and run stability checks rather than just del on the others for(var/obj/machinery/am_shielding/AMS in linked_shielding) AMS.control_unit = null diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index c2d510085d5..7516817c64f 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -11,8 +11,6 @@ /obj/machinery/am_shielding name = "antimatter reactor section" desc = "A shielding component for an antimatter reactor. Looks delicate." - desc_info = "Antimatter shielding sections must be beside an anchored control unit or another shielding section. If either are destroyed, the section will disappear." - desc_antag = "Antimatter shielding sections are delicate. Attacking the shielding unit with a damaging object will reduce its stability, as will explosions. If the stability hits zero, the reactor may explode." icon = 'icons/obj/machinery/new_ame.dmi' icon_state = "shield" anchored = TRUE @@ -30,6 +28,14 @@ var/dirs = 0 var/mapped = FALSE //Set to 1 to ignore usual suicide if it doesn't immediately find a control_unit +/obj/machinery/am_shielding/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Antimatter shielding sections must be beside an anchored control unit or another shielding section. If either are destroyed, the section will disappear." + +/obj/machinery/am_shielding/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Antimatter shielding sections are delicate. Attacking the shielding unit with a damaging object will reduce its stability, as will explosions. If the stability hits zero, the reactor may explode." + // Stupidly easy way to use it in maps /obj/machinery/am_shielding/map mapped = TRUE @@ -215,7 +221,6 @@ /obj/item/device/am_shielding_container name = "packaged antimatter reactor section" desc = "A section of antimatter reactor shielding. Do not eat." - desc_info = "To deploy, drop near an antimatter control unit or an existing deployed section and use your multitool on it." icon = 'icons/obj/machinery/antimatter.dmi' icon_state = "box" item_state = "electronic" @@ -223,6 +228,10 @@ throw_speed = 1 throw_range = 2 +/obj/item/device/am_shielding_container/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To deploy, drop near an antimatter control unit or an existing deployed section and use your multitool on it." + /obj/item/device/am_shielding_container/attackby(obj/item/attacking_item, mob/user) if(attacking_item.ismultitool() && isturf(loc)) if(locate(/obj/machinery/am_shielding) in loc) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index b410ee13127..e43d99d2ac8 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -71,13 +71,6 @@ ABSTRACT_TYPE(/obj/machinery/power/apc) name = "area power controller" desc = "A control terminal for the area electrical systems." - desc_info = "An APC (Area Power Controller) regulates and supplies backup power for the area they are in. Their power channels are divided \ - out into 'environmental' (Items that manipulate airflow and temperature), 'lighting' (the lights), and 'equipment' (Everything else that consumes power). \ - Power consumption and backup power cell charge can be seen from the interface, further controls (turning a specific channel on, off or automatic, \ - toggling the APC's ability to charge the backup cell, or toggling power for the entire area via master breaker) first requires the interface to be unlocked \ - with an ID with Engineering access or by one of the station's robots or the artificial intelligence." - desc_antag = "This can be emagged to unlock it. It will cause the APC to have a blue error screen. \ - Wires can be pulsed remotely with a signaler attached to it. A powersink will also drain any APCs connected to the same wire the powersink is on." icon = 'icons/obj/machinery/power/apc.dmi' icon_state = "apc0" @@ -144,6 +137,20 @@ ABSTRACT_TYPE(/obj/machinery/power/apc) var/charge_mode = CHARGE_MODE_CHARGE // if we're actually able to charge var/last_time = 1 +/obj/machinery/power/apc/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "An APC (Area Power Controller) regulates and supplies backup power for the area they are in." + . += "Their power channels are divided into 'environmental' (items that manipulate airflow and temperature), 'lighting' (lights), and 'equipment' (everything else that consumes power)." + . += "Power consumption and backup power cell charge can be seen from the interface; further controls (turning a specific channel on, off or automatic, \ + toggling the APC's ability to charge the backup cell, or toggling power for the entire area via master breaker) first requires the interface to be unlocked \ + with an ID with Engineering access or by one of the ship's robots or AI." + +/obj/machinery/power/apc/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This can be emagged to unlock it; it will cause the APC to have a blue error screen." + . += "Wires can be pulsed remotely with a signaler attached to them." + . += "A powersink will drain any APCs connected to the same powernet (wires) the powersink is on" + /obj/machinery/power/apc/Initialize(mapload, var/ndir, var/building=0) . = ..(mapload) wires = new(src) diff --git a/code/modules/power/breaker_box.dm b/code/modules/power/breaker_box.dm index 34b983c177e..a93fec2f24b 100644 --- a/code/modules/power/breaker_box.dm +++ b/code/modules/power/breaker_box.dm @@ -18,6 +18,19 @@ var/RCon_tag = "NO_TAG" var/update_locked = 0 +/obj/machinery/power/breakerbox/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "A breaker brox functions as an electrical passthrough; if enabled, power will flow freely around it. In substations, this means that the PSU/SMES will be bypassed." + . += "Toggling the breaker box has a sixty-second cooldown time." + . += "A multitool can be used to update or clear the breaker's RCON tag." + +/obj/machinery/power/breakerbox/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(on) + . += "It seems to be online." + else + . += "It seems to be offline." + /obj/machinery/power/breakerbox/Initialize() LAZYADD(SSmachinery.breaker_boxes, src) return ..() @@ -40,13 +53,6 @@ /obj/machinery/power/breakerbox/activated/LateInitialize() set_state(1) -/obj/machinery/power/breakerbox/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(on) - . += SPAN_GOOD("It seems to be online.") - else - . += SPAN_BAD("It seems to be offline.") - /obj/machinery/power/breakerbox/attack_ai(mob/user) if(!ai_can_interact(user)) return diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 108294606f5..6004b167a6f 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -47,8 +47,8 @@ By design, d1 is the smallest direction and d2 is the highest color = COLOR_RED var/obj/machinery/power/breakerbox/breaker_box -/obj/structure/cable/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/cable/feedback_hints(mob/user, distance, is_adjacent) + . += ..() var/found_color_name = "Unknown" for(var/color_name in GLOB.cable_coil_colours) var/color_value = GLOB.cable_coil_colours[color_name] @@ -530,9 +530,8 @@ By design, d1 is the smallest direction and d2 is the highest update_icon() update_wclass() -/obj/item/stack/cable_coil/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - +/obj/item/stack/cable_coil/feedback_hints(mob/user, distance, is_adjacent) + . += ..() var/found_color_name = "Unknown" for(var/color_name in GLOB.cable_coil_colours) var/color_value = GLOB.cable_coil_colours[color_name] @@ -542,7 +541,7 @@ By design, d1 is the smallest direction and d2 is the highest . += "This cable is: [found_color_name]" if(!uses_charge) - . += "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s of cable in the coil." + . += "There [src.amount == 1 ? "is" : "are"] [src.amount] [src.singular_name]\s of cable in the coil." else . += "You have enough charge to produce [get_amount()]." diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index 2256efd156e..582199f1d8e 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -2,6 +2,20 @@ // charge from 0 to 100% // fits in APC to provide backup power +/obj/item/cell/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Injecting 5 units of phoron into a power cell with a syringe will rig it to explode!" + . += "The higher the charge in the cell, the bigger and more damaging the explosion will be." + . += "When rigged, the cell will explode immediately whenever it is next charged or discharged." + +/obj/item/cell/feedback_hints(mob/user, distance, is_adjacent) + if(distance > 1) + return + . = list() + . += ..() + . += "The manufacturer's label states this cell has a power rating of [maxcharge]J, and that you should not swallow it." + . += "The charge meter reads [round(src.percent() )]%." + /obj/item/cell/Initialize() . = ..() @@ -103,20 +117,6 @@ SEND_SIGNAL(src, COMSIG_CELL_CHARGE, charge) return amount_used - -/obj/item/cell/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 1) - return - - if(maxcharge <= 2500) - . += "[desc]" - . += "The manufacturer's label states this cell has a power rating of [maxcharge]J, and that you should not swallow it." - . += "The charge meter reads [round(src.percent() )]%." - else - . += "This power cell has an exciting chrome finish, as it is an uber-capacity cell type! It has a power rating of [maxcharge]J!" - . += "The charge meter reads [round(src.percent() )]%." - /obj/item/cell/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/reagent_containers/syringe)) var/obj/item/reagent_containers/syringe/S = attacking_item diff --git a/code/modules/power/collector.dm b/code/modules/power/collector.dm index 42df67112a4..4b4891adacd 100644 --- a/code/modules/power/collector.dm +++ b/code/modules/power/collector.dm @@ -43,6 +43,12 @@ GLOBAL_LIST_INIT_TYPED(rad_collectors, /obj/machinery/power/rad_collector, list( /// How long to wait between alert messages, if radiation input exceeds safe levels var/alert_delay = 10 SECONDS +/obj/machinery/power/rad_collector/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (..(user, 3)) + var/last_power_kw = round(last_power / 1000, 0.1) + . += "The meter indicates that \the [src] is collecting [last_power_kw] kW." + /obj/machinery/power/rad_collector/Initialize() . = ..() GLOB.rad_collectors += src @@ -178,11 +184,6 @@ GLOBAL_LIST_INIT_TYPED(rad_collectors, /obj/machinery/power/rad_collector, list( desc += " This one is destroyed beyond repair." update_icon() -/obj/machinery/power/rad_collector/get_examine_text(user, distance, is_adjacent, infix, suffix) - . = ..() - if (..(user, 3)) - . += "The meter indicates that \the [src] is collecting [last_power] W." - /obj/machinery/power/rad_collector/return_air() if(loaded_tank) return loaded_tank.return_air() diff --git a/code/modules/power/crystal_agitator.dm b/code/modules/power/crystal_agitator.dm index 0637f584256..d66bbf0d513 100644 --- a/code/modules/power/crystal_agitator.dm +++ b/code/modules/power/crystal_agitator.dm @@ -26,11 +26,13 @@ /obj/item/circuitboard/crystal_agitator ) - component_hint_cap = "Upgraded capacitors will reduce active power usage." - component_hint_servo = "Upgraded manipulators will increase agitation speed." - parts_power_mgmt = FALSE +/obj/machinery/power/crystal_agitator/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will reduce active power usage." + . += "Upgraded manipulators will increase agitation speed." + /obj/machinery/power/crystal_agitator/Initialize() . = ..() connect_to_network() diff --git a/code/modules/power/lights/bulbs.dm b/code/modules/power/lights/bulbs.dm index 0bf92173a25..a1ac46b51c5 100644 --- a/code/modules/power/lights/bulbs.dm +++ b/code/modules/power/lights/bulbs.dm @@ -22,6 +22,11 @@ var/randomize_color = TRUE var/list/randomized_colors = LIGHT_STANDARD_COLORS +/obj/item/light/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Injecting 5 units of phoron into a light bulb/tube with a syringe will rig it to explode!" + . += "When rigged, the light will explode immediately when it is next turned on." + /obj/item/light/Initialize() . = ..() if(randomize_range) diff --git a/code/modules/power/lights/construction.dm b/code/modules/power/lights/construction.dm index 69e2724923a..32eadc0526f 100644 --- a/code/modules/power/lights/construction.dm +++ b/code/modules/power/lights/construction.dm @@ -119,7 +119,7 @@ icon_state = "tube_empty" if("bulb") icon_state = "bulb_empty" - if("slight") + if("spotlight") icon_state = "slight_empty" if ("floorbulb") icon_state = "floor_empty" @@ -136,7 +136,7 @@ newlight = new /obj/machinery/light/built(get_turf(src)) if("bulb") newlight = new /obj/machinery/light/small/built(get_turf(src)) - if("slight") + if("spotlight") newlight = new /obj/machinery/light/spot/built(get_turf(src)) if("floorbulb") newlight = new /obj/machinery/light/small/floor/built(get_turf(src)) diff --git a/code/modules/power/lights/fixtures.dm b/code/modules/power/lights/fixtures.dm index bf555b58226..78d5e2f931a 100644 --- a/code/modules/power/lights/fixtures.dm +++ b/code/modules/power/lights/fixtures.dm @@ -10,7 +10,6 @@ var/base_state = "tube" // base description and icon_state icon_state = "tube_preview" desc = "A lighting fixture." - desc_info = "Use grab intent when interacting with a working light to take it out of its fixture." anchored = TRUE layer = ABOVE_HUMAN_LAYER use_power = POWER_USE_ACTIVE @@ -60,6 +59,24 @@ ) init_flags = 0 +/obj/machinery/light/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use Grab intent on a working light to remove it from its fixture." + +/obj/machinery/light/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + switch(status) + if(LIGHT_OK) + . += "It is turned [!(stat & POWEROFF) ? "on" : "off"]." + if(LIGHT_EMPTY) + . += "\The [fitting] has been removed." + if(LIGHT_BURNED) + . += "\The [fitting] is burnt out." + if(LIGHT_BROKEN) + . += "\The [fitting] has been smashed." + if(cell) + . += "The charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%." + /obj/machinery/light/skrell base_state = "skrell" icon_state = "skrell_empty" @@ -393,21 +410,6 @@ user.do_attack_animation(src) return TRUE -// examine verb -/obj/machinery/light/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - switch(status) - if(LIGHT_OK) - . += "It is turned [!(stat & POWEROFF) ? "on" : "off"]." - if(LIGHT_EMPTY) - . += "\The [fitting] has been removed." - if(LIGHT_BURNED) - . += "\The [fitting] is burnt out." - if(LIGHT_BROKEN) - . += "\The [fitting] has been smashed." - if(cell) - . += "The charge meter reads [round((cell.charge / cell.maxcharge) * 100, 0.1)]%." - // attack with item - insert light (if right type), otherwise try to break the light /obj/machinery/light/attackby(obj/item/attacking_item, mob/user) diff --git a/code/modules/power/outlet.dm b/code/modules/power/outlet.dm index a6efd406ea5..44a678da61c 100644 --- a/code/modules/power/outlet.dm +++ b/code/modules/power/outlet.dm @@ -17,10 +17,12 @@ /obj/item/circuitboard/outlet ) - component_hint_cap = "Upgraded capacitors will increase the rate at which connected devices charge." - parts_power_mgmt = FALSE +/obj/machinery/power/outlet/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will increase the rate at which connected devices charge." + /obj/machinery/power/outlet/Initialize() . = ..() connect_to_network() diff --git a/code/modules/power/portgen.dm b/code/modules/power/portgen.dm index 78327ae24f8..41b2c4f76dc 100644 --- a/code/modules/power/portgen.dm +++ b/code/modules/power/portgen.dm @@ -15,7 +15,16 @@ var/portgen_lightcolour = "#000000" var/datum/looping_sound/generator/soundloop - component_hint_cap = "Upgraded capacitors will increase maximum power output." +/obj/machinery/power/portgen/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will increase maximum power output." + +/obj/machinery/power/portgen/feedback_hints(mob/user, distance, is_adjacent) + . = ..() + if(active) + . += "The generator is on." + else + . += "The generator is off." /obj/machinery/power/portgen/Initialize() . = ..() @@ -68,14 +77,6 @@ icon_state = "[base_icon]_[active]" return ..() -/obj/machinery/power/portgen/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - if(active) - . += SPAN_NOTICE("The generator is on.") - else - . += SPAN_NOTICE("The generator is off.") - /obj/machinery/power/portgen/emp_act(severity) . = ..() @@ -141,6 +142,15 @@ parts_power_mgmt = FALSE +/obj/machinery/power/portgen/basic/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "\The [src] appears to be producing [power_gen*power_output] W." + . += "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper." + if(IsBroken()) + . += SPAN_WARNING("\The [src] seems to have broken down.") + if(overheating) + . += SPAN_DANGER("\The [src] is overheating!") + /obj/machinery/power/portgen/basic/Initialize() component_types += board_path . = ..() @@ -164,15 +174,6 @@ power_gen = round(initial(power_gen) * (max(2, temp_rating) / 2)) -/obj/machinery/power/portgen/basic/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "\The [src] appears to be producing [power_gen*power_output] W." - . += "There [sheets == 1 ? "is" : "are"] [sheets] sheet\s left in the hopper." - if(IsBroken()) - . += SPAN_WARNING("\The [src] seems to have broken down.") - if(overheating) - . += SPAN_DANGER("\The [src] is overheating!") - /obj/machinery/power/portgen/basic/HasFuel() var/needed_sheets = power_output / time_per_sheet if(sheets >= needed_sheets - sheet_left) @@ -497,9 +498,9 @@ create_reagents(coolant_volume) ..() -/obj/machinery/power/portgen/basic/fusion/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "The auxilary tank shows [reagents.total_volume]u of liquid in it." +/obj/machinery/power/portgen/basic/fusion/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The auxiliary tank shows [reagents.total_volume]u of liquid in it." /obj/machinery/power/portgen/basic/fusion/UseFuel() if(reagents.has_reagent(coolant_reagent)) diff --git a/code/modules/power/rtg.dm b/code/modules/power/rtg.dm index 1c5d5be41da..8ca18dcc68a 100644 --- a/code/modules/power/rtg.dm +++ b/code/modules/power/rtg.dm @@ -26,10 +26,12 @@ /obj/item/circuitboard/rtg ) - component_hint_cap = "Upgraded capacitors will increase maximum power output." - parts_power_mgmt = FALSE +/obj/machinery/power/rtg/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will increase maximum power output." + /obj/machinery/power/rtg/Initialize() . = ..() connect_to_network() @@ -66,7 +68,6 @@ return ..() - /obj/machinery/power/rtg/advanced desc = "An advanced RTG capable of moderating isotope decay, increasing power output but reducing lifetime. It uses phoron-fueled radiation collectors to increase output even further." power_gen = 1250 // 2500 on T1, 10000 on T4. @@ -80,7 +81,6 @@ /obj/item/circuitboard/rtg/advanced ) - /obj/item/circuitboard/rtg name = T_BOARD("radioisotope thermoelectric generator") build_path = /obj/machinery/power/rtg diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index ed1c054f60a..e6d55efe8b6 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -35,17 +35,39 @@ var/datum/effect_system/sparks/spark_system -/obj/machinery/power/emitter/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/power/emitter/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Standing next to \the [src] and examining it will let you see how many shots it has fired since last being turned on." + . += "Using an Engineering ID on \the [src] will toggle its control locks." + . += "You can attach a signaler to \the [src] to remotely toggle it on and off (so long as its controls are not locked)." + +/obj/machinery/power/emitter/assembly_hints(mob/user, distance, is_adjacent) + . += ..() switch(state) if(EMITTER_LOOSE) - . += SPAN_NOTICE("\The [src] isn't attached to anything and is not ready to fire.") + . += "\The [src] must first have its anchoring bolts secured." if(EMITTER_BOLTED) - . += SPAN_NOTICE("\The [src] is bolted to the floor, but not yet ready to fire.") + . += "\The [src] must be welded securely to the floor before it can be fired." + +/obj/machinery/power/emitter/disassembly_hints(mob/user, distance, is_adjacent) + . += ..() + switch(state) + if(EMITTER_BOLTED) + . += "\The [src] must have its anchoring bolts unsecured from the floor before it can be moved again." if(EMITTER_WELDED) - . += SPAN_WARNING("\The [src] is bolted and welded to the floor, and ready to fire.") + . += "\The [src] must first be unwelded before its anchoring bolts can be unsecured." + +/obj/machinery/power/emitter/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(state == EMITTER_WELDED) + . += SPAN_WARNING("\The [src] is bolted and welded to the floor, and ready to fire.") if(is_adjacent) . += SPAN_NOTICE("The shot counter display reads: [shot_counter] shots.") + . += "Its controls are currently [locked ? "locked" : "unlocked"]." + +/obj/machinery/power/emitter/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Emagging this will both disable the locking mechanism and put its capacitor and firing mechanisms into overdrive!" /obj/machinery/power/emitter/Destroy() if(special_emitter) @@ -110,7 +132,6 @@ to_chat(user, SPAN_WARNING("\The [src] needs to be firmly secured to the floor first.")) return TRUE - /obj/machinery/power/emitter/emp_act(severity) . = ..() diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm index 2e33dd21613..fe36f72f0fd 100644 --- a/code/modules/power/smes.dm +++ b/code/modules/power/smes.dm @@ -21,7 +21,6 @@ /obj/machinery/power/smes name = "power storage unit" desc = "A high-capacity superconducting magnetic energy storage (SMES) unit." - desc_info = "It can be repaired with a welding tool." icon_state = "smes" density = 1 anchored = 1 @@ -76,6 +75,23 @@ var/charge_mode = 0 var/last_time = 1 +/obj/machinery/power/smes/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + if(health < initial(health)) + . += "It can be repaired with a welding tool." + +/obj/machinery/power/smes/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_badly_damaged()) + . += SPAN_DANGER("\The [src] is damaged to the point of non-function!") + if(open_hatch) + . += "The maintenance hatch is open." + if (max_coils > 1 && Adjacent(user)) + var/list/coils = list() + for(var/obj/item/smes_coil/C in component_parts) + coils += C + . += "The [max_coils] coil slots contain: [counting_english_list(coils)]." + /obj/machinery/power/smes/drain_power(var/drain_check, var/surge, var/amount = 0) if(drain_check) @@ -123,18 +139,6 @@ if(!should_be_mapped) warning("Non-buildable or Non-magical SMES at [src.x]X [src.y]Y [src.z]Z") -/obj/machinery/power/smes/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_badly_damaged()) - . += SPAN_DANGER("\The [src] is damaged to the point of non-function!") - if(open_hatch) - . += SPAN_SUBTLE("The maintenance hatch is open.") - if (max_coils > 1 && Adjacent(user)) - var/list/coils = list() - for(var/obj/item/smes_coil/C in component_parts) - coils += C - . += "The [max_coils] coil slots contain: [counting_english_list(coils)]." - /obj/machinery/power/smes/proc/can_function() if(is_badly_damaged()) return FALSE diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 9e1415b1630..8f3c79ff64d 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -26,6 +26,11 @@ var/energy_to_lower = -20 var/list/immune_things = list(/obj/effect/projectile/muzzle/emitter, /obj/effect/ebeam, /obj/effect/decal/cleanable/ash, /obj/singularity) +/obj/singularity/energy_ball/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(orbiting_balls.len) + . += "There are [orbiting_balls.len] energy balls orbiting \the [src]." + /obj/singularity/energy_ball/ex_act(severity, target) return @@ -66,12 +71,6 @@ else ..() -/obj/singularity/energy_ball/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(orbiting_balls.len) - . += "There are [orbiting_balls.len] energy balls orbiting \the [src]." - - /obj/singularity/energy_ball/proc/move_the_basket_ball(var/move_amount) var/list/valid_directions = GLOB.alldirs.Copy() diff --git a/code/modules/projectiles/ammo_display.dm b/code/modules/projectiles/ammo_display.dm index 4b8a3c30050..9c9bb5d2402 100644 --- a/code/modules/projectiles/ammo_display.dm +++ b/code/modules/projectiles/ammo_display.dm @@ -1,8 +1,12 @@ /obj/item/ammo_display name = "holographic ammo display" desc = "A device that can be attached to most firearms, providing a holographic display of the remaining ammunition to the user." - desc_info = "Holographic ammo displays can be attached to firearms to give an ammo readout on the HUD. Click on a weapon adjacent to you or in your hand to attach it. Use a screwdriver on the weapon to remove it." icon = 'icons/obj/weapons.dmi' icon_state = "ammo_display" origin_tech = list(TECH_BLUESPACE = 3, TECH_MATERIAL = 4, TECH_DATA = 4) w_class = WEIGHT_CLASS_TINY + +/obj/item/ammo_display/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Holographic ammo displays can be attached to firearms to give an ammo readout on the HUD." + . += "Click on a weapon adjacent to you or in your hand to attach it, and use a screwdriver on the weapon to remove it." diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index da1a6706149..c45c759b5ef 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -21,6 +21,11 @@ pickup_sound = 'sound/items/pickup/ring.ogg' var/reload_sound = 'sound/weapons/reload_bullet.ogg' //sound that plays when inserted into gun. +/obj/item/ammo_casing/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (!BB) + . += "This one is spent." + /obj/item/ammo_casing/Initialize() . = ..() if(ispath(projectile_type)) @@ -79,11 +84,6 @@ if(spent_icon && !BB) icon_state = spent_icon -/obj/item/ammo_casing/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (!BB) - . += "This one is spent." - //Gun loading types #define SINGLE_CASING 1 //The gun only accepts ammo_casings. ammo_magazines should never have this as their mag_type. #define SPEEDLOADER 2 //Transfers casings from the mag to the gun when used. @@ -123,6 +123,10 @@ /// sound item plays when it is ejected from a gun. var/eject_sound = 'sound/weapons/magazine_eject.ogg' +/obj/item/ammo_magazine/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "There [(stored_ammo.len == 1)? "is" : "are"] [stored_ammo.len] round\s left!" + /obj/item/ammo_magazine/Initialize() . = ..() if(multiple_sprites) @@ -185,10 +189,6 @@ else recyclable = FALSE -/obj/item/ammo_magazine/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "There [(stored_ammo.len == 1)? "is" : "are"] [stored_ammo.len] round\s left!" - //magazine icon state caching (caching lists are in SSicon_cache) /proc/initialize_magazine_icondata(var/obj/item/ammo_magazine/M) diff --git a/code/modules/projectiles/ammunition/ammo_pile.dm b/code/modules/projectiles/ammunition/ammo_pile.dm index 974d141cb5a..71025dd1b90 100644 --- a/code/modules/projectiles/ammunition/ammo_pile.dm +++ b/code/modules/projectiles/ammunition/ammo_pile.dm @@ -8,6 +8,11 @@ var/ammo_type // the type of ammo this ammo pile accepts var/max_ammo = 5 +/obj/item/ammo_pile/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + . += SPAN_NOTICE("It contains [length(ammo)] rounds.") + /obj/item/ammo_pile/Initialize(mapload, var/list/provided_ammo) . = ..() if(islist(provided_ammo)) @@ -26,11 +31,6 @@ add_ammo(C) addtimer(CALLBACK(src, PROC_REF(check_ammo)), 5) // if we don't have any ammo in 5 deciseconds, we're an empty pile, which is worthless, so self-delete -/obj/item/ammo_pile/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - . += SPAN_NOTICE("It contains [length(ammo)] rounds.") - /obj/item/ammo_pile/attack(mob/living/target_mob, mob/living/user, target_zone) return diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 6809333f45a..060b1d3740a 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -43,8 +43,6 @@ /obj/item/gun name = "gun" desc = "It's a gun. It's pretty terrible, though." - desc_info = "This is a gun. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire." icon = 'icons/obj/guns/pistol.dmi' var/gun_gui_icons = 'icons/obj/guns/gun_gui.dmi' icon_state = "pistol" @@ -158,6 +156,31 @@ var/iff_capable = FALSE // if true, applies the user's ID iff_faction to the projectile +/obj/item/gun/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + if(has_safety) + . += "To fire, toggle the safety with CTRL-click (or enable HARM intent), then click where you want to shoot." + else + . += "To fire, because this weapon has no safety, just click where you want to shoot." + +/obj/item/gun/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 1) + return + if(markings) + . += SPAN_NOTICE("It has [markings] [markings == 1 ? "notch" : "notches"] carved into the stock.") + if(needspin) + if(pin) + . += "\The [pin] is installed in the trigger mechanism." + pin.examine_info(user) // Allows people to check the current firemode of their wireless-control firing pin. Returns nothing if there's no wireless-control firing pin. + else + . += "It doesn't have a firing pin installed, and won't fire." + if(firemodes.len > 1) + var/datum/firemode/current_mode = firemodes[sel_mode] + . += "The fire selector is set to [current_mode.name]." + if(has_safety) + . += "The safety is [safety() ? "on" : "off"]." + /obj/item/gun/Initialize(mapload) . = ..() for(var/i in 1 to firemodes.len) @@ -659,24 +682,6 @@ suppressor = null update_icon() -/obj/item/gun/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 1) - return - if(markings) - . += SPAN_NOTICE("It has [markings] [markings == 1 ? "notch" : "notches"] carved into the stock.") - if(needspin) - if(pin) - . += "\The [pin] is installed in the trigger mechanism." - pin.examine_info(user) // Allows people to check the current firemode of their wireless-control firing pin. Returns nothing if there's no wireless-control firing pin. - else - . += "It doesn't have a firing pin installed, and won't fire." - if(firemodes.len > 1) - var/datum/firemode/current_mode = firemodes[sel_mode] - . += "The fire selector is set to [current_mode.name]." - if(has_safety) - . += "The safety is [safety() ? "on" : "off"]." - /obj/item/gun/proc/switch_firemodes() if(!firemodes.len) return null diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm index b2b1394ed44..c097d6da7fe 100644 --- a/code/modules/projectiles/guns/alien.dm +++ b/code/modules/projectiles/guns/alien.dm @@ -15,6 +15,12 @@ fire_sound = 'sound/weapons/bladeslice.ogg' needspin = FALSE +/obj/item/gun/launcher/spikethrower/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 1) + return + . += "It has [spikes] spike\s remaining." + /obj/item/gun/launcher/spikethrower/Initialize() . = ..() last_regen = world.time @@ -34,12 +40,6 @@ if (spikes < max_spikes) addtimer(CALLBACK(src, PROC_REF(regen_spike)), spike_gen_time, TIMER_UNIQUE) -/obj/item/gun/launcher/spikethrower/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 1) - return - . += "It has [spikes] spike\s remaining." - /obj/item/gun/launcher/spikethrower/update_icon() icon_state = "spikethrower[spikes]" diff --git a/code/modules/projectiles/guns/bang.dm b/code/modules/projectiles/guns/bang.dm index ce3f3a419fd..3f86204de9b 100644 --- a/code/modules/projectiles/guns/bang.dm +++ b/code/modules/projectiles/guns/bang.dm @@ -12,11 +12,12 @@ var/pixel_offset_x = -2 var/pixel_offset_y = 13 +/obj/item/gun/bang/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a ballistic weapon. It fires [fakecaliber] ammunition. To reload most guns, click the gun with an empty hand to remove any spent casings or magazines, and then insert new ones." /obj/item/gun/bang/Initialize() . = ..() - desc_info = "This is a ballistic weapon. It fires [fakecaliber] ammunition. To fire the weapon, toggle the safety with ctrl-click (or enable HARM intent), \ - then click where you want to fire. To reload, click the gun with an empty hand to remove any spent casings or magazines, and then insert new ones." bang_flag = image('icons/obj/bang_flag.dmi', "bang_flag") bang_flag.pixel_x = pixel_offset_x bang_flag.pixel_y = pixel_offset_y diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index c417a866561..f9407450ad8 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -1,8 +1,6 @@ /obj/item/gun/energy name = "energy gun" desc = "A basic energy-based gun." - desc_info = "This is an energy weapon. To fire this weapon, toggle the safety with ctrl-click (or enable HARM intent), \ - then click where you want to fire. Most energy weapons can fire through windows harmlessly. To recharge this weapon, use a weapon recharger." icon = 'icons/obj/guns/ecarbine.dmi' icon_state = "energykill100" item_state = "energykill100" @@ -44,6 +42,17 @@ var/turret_sprite_set = "carbine" //set of sprites to use for the turret gun var/turret_is_lethal = 1 //is the gun in lethal (secondary) mode by default +/obj/item/gun/energy/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is an energy weapon. Most energy weapons can fire through windows harmlessly. Energy weapons must be recharged once depleted." + +/obj/item/gun/energy/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 1) + return + var/shots_remaining = round(power_supply.charge / charge_cost) + . += "It has [shots_remaining] shot\s remaining." + /obj/item/gun/energy/switch_firemodes() . = ..() if(.) @@ -238,13 +247,6 @@ if(recharger) disconnect() -/obj/item/gun/energy/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 1) - return - var/shots_remaining = round(power_supply.charge / charge_cost) - . += "It has [shots_remaining] shot\s remaining." - /obj/item/gun/energy/update_icon() if(charge_meter && power_supply && power_supply.maxcharge) var/ratio = power_supply.charge / power_supply.maxcharge diff --git a/code/modules/projectiles/guns/energy/cult.dm b/code/modules/projectiles/guns/energy/cult.dm index ae5dbd7e427..dba592d05fd 100644 --- a/code/modules/projectiles/guns/energy/cult.dm +++ b/code/modules/projectiles/guns/energy/cult.dm @@ -1,9 +1,7 @@ /obj/item/gun/energy/rifle/cult name = "bloodpike" desc = "A ranged weapon of demonic origin, surely. It menaces with crimson spikes." - desc_info = null desc_extended = null - desc_antag = "This weapon can be recharged by clicking on blood or remains with it, remains recharge more than simple blood." icon = 'icons/obj/guns/bloodpike.dmi' icon_state = "bloodpike" item_state = "bloodpike" @@ -38,6 +36,10 @@ is_wieldable = TRUE // see if i can get a sprite for this +/obj/item/gun/energy/rifle/cult/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This weapon can be recharged by clicking on blood or remains with it. Remains recharge more than simple blood." + /obj/item/gun/energy/rifle/cult/Initialize() . = ..() if(does_process) diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 7494858b1bf..e9ff387d7d1 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -60,8 +60,6 @@ name = "antique laser gun" icon = 'icons/obj/guns/caplaser.dmi' desc = "This is an antique laser gun. All craftsmanship is of the highest quality. The object menaces with spikes of energy." - desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire. Most energy weapons can fire through windows harmlessly. Unlike most weapons, this weapon recharges itself." icon_state = "caplaser" item_state = "caplaser" has_item_ratio = FALSE @@ -78,6 +76,10 @@ turret_is_lethal = 1 turret_sprite_set = "captain" +/obj/item/gun/energy/captain/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Unlike most energy weapons, this weapon recharges itself." + /obj/item/gun/energy/lasercannon name = "laser cannon" desc = "A NanoTrasen designed laser cannon capable of acting as a powerful support weapon." @@ -139,9 +141,6 @@ /obj/item/gun/energy/sniperrifle name = "marksman energy rifle" desc = "The HI L.W.A.P. is an older NanoTrasen design. A designated marksman rifle capable of shooting powerful ionized beams, this is a weapon to kill from a distance." - desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire. Most energy weapons can fire through windows harmlessly. To recharge this weapon, use a weapon recharger. \ - To use the scope, use the appropriate verb in the object tab." icon = 'icons/obj/guns/sniper.dmi' icon_state = "sniper" item_state = "sniper" @@ -166,6 +165,10 @@ fire_delay_wielded = 35 accuracy_wielded = 0 +/obj/item/gun/energy/sniperrifle/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To use the scope, use the appropriate verb in the object tab." + /obj/item/gun/energy/sniperrifle/verb/scope() set category = "Object" set name = "Use Scope" diff --git a/code/modules/projectiles/guns/energy/magic.dm b/code/modules/projectiles/guns/energy/magic.dm index 7f96d590765..cb4d92c0814 100644 --- a/code/modules/projectiles/guns/energy/magic.dm +++ b/code/modules/projectiles/guns/energy/magic.dm @@ -3,7 +3,6 @@ /obj/item/gun/energy/wand name = "wand of nothing" desc = "A magic stick, this one don't do much however." - desc_info = null icon = 'icons/obj/wands.dmi' icon_state = "nothingwand" item_state = "wand" @@ -19,6 +18,10 @@ has_safety = FALSE needspin = FALSE +/obj/item/gun/energy/wand/mechanics_hints(mob/user, distance, is_adjacent) + . = list() + . += "" + /obj/item/gun/energy/wand/handle_click_empty(mob/user = null) if (user) user.visible_message("*fizzle*", SPAN_DANGER("*fizzle*")) diff --git a/code/modules/projectiles/guns/energy/mining.dm b/code/modules/projectiles/guns/energy/mining.dm index c1831ca2e9f..804469472a0 100644 --- a/code/modules/projectiles/guns/energy/mining.dm +++ b/code/modules/projectiles/guns/energy/mining.dm @@ -21,8 +21,8 @@ charge_cost = 666.66 // 15 shots on a high cap cell needspin = FALSE -/obj/item/gun/energy/plasmacutter/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/gun/energy/plasmacutter/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(is_adjacent) if(power_supply) . += FONT_SMALL(SPAN_NOTICE("It has a [capitalize_first_letters(power_supply.name)] installed as its power supply.")) diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 84abcfe3937..fd798b5e514 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -1,9 +1,6 @@ /obj/item/gun/energy/gun name = "energy carbine" desc = "A NanoTrasen designed energy-based carbine with two settings: Stun and kill." - desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \ - in your hand. To recharge this weapon, use a weapon recharger." desc_extended = "The NT EC-4 is an energy carbine developed and produced by NanoTrasen. Compact, light and durable, used by security forces and law enforcement for its ability to fire stun or lethal beams, depending on selection. It is widely sold and distributed across the galaxy." icon = 'icons/obj/guns/ecarbine.dmi' icon_state = "energystun" @@ -40,9 +37,6 @@ /obj/item/gun/energy/gun/nuclear name = "advanced energy gun" desc = "An energy gun with an experimental miniaturized reactor." - desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire. Most energy weapons can fire through windows harmlessly. To switch between stun and lethal, click the weapon \ - in your hand. Unlike most weapons, this weapon recharges itself." icon = 'icons/obj/guns/nucgun.dmi' icon_state = "nucgun" item_state = "nucgun" @@ -62,6 +56,10 @@ var/lightfail = 0 +/obj/item/gun/energy/gun/nuclear/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Unlike most weapons, this weapon recharges itself." + /obj/item/gun/energy/gun/nuclear/get_cell() return DEVICE_NO_CELL diff --git a/code/modules/projectiles/guns/energy/rifle.dm b/code/modules/projectiles/guns/energy/rifle.dm index e4e996d897b..ea8bc4e9f6b 100644 --- a/code/modules/projectiles/guns/energy/rifle.dm +++ b/code/modules/projectiles/guns/energy/rifle.dm @@ -68,10 +68,6 @@ name = "combat laser rifle" desc = "The Noctiluca XM/24 is a brand new model of laser rifle, developed entirely by Kumar Arms, a Zavodskoi Interstellar subsidiary. Easy to handle for users with minimal training, reliable and with a reasonable form factor, it is poised to become the new standard for laser weaponry." desc_extended = "The Noctiluca XM/24 was unveiled at the tail end of 2463 in the SCC Future Firearms contest and was released by Zavodskoi in June 2464 after achieving a stunning victory over the other competitors. Zavodskoi installations are prioritized for acquisition of this new rifle, with along the SCCV Horizon. The Noctiluca's specialty lies in its revolutionary dual-function laser diffuser, which is able to modulate the laser into either a standard beam or an armor-piercing super-concentrated beam." - desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire. Most energy weapons can fire through windows harmlessly. To recharge this weapon, use a weapon recharger. \ - The Noctiluca comes with a standard firing mode that is slightly worse in damage than the normal laser rifle, but has more armor penetration. Additionally, \ - it has a secondary armor-piercing mode, which does less damage but has extremely high armor piercing." icon = 'icons/obj/guns/crew_laser.dmi' icon_state = "trilaser" item_state = "trilaser" @@ -88,6 +84,11 @@ list(mode_name = "fire specialized armor piercing lasers", projectile_type = /obj/projectile/beam/noctiluca/armor_piercing, fire_sound = 'sound/weapons/laserstrong.ogg') ) +/obj/item/gun/energy/rifle/laser/noctiluca/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "The Noctiluca comes with a standard firing mode that is slightly worse in damage than the normal laser rifle, but has more armor penetration. Additionally, \ + it has a secondary armor-piercing mode, which does less damage but has extremely high armor piercing." + /obj/item/gun/energy/rifle/laser/heavy name = "laser cannon" desc = "A nanotrasen designed laser cannon capable of acting as a powerful support weapon." diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 658550cfaf4..2e09a17e941 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -119,7 +119,6 @@ /obj/item/gun/energy/mousegun name = "pest gun" desc = "The NT \"Arodentia\" Pesti-Shock is a highly sophisticated and probably safe beamgun designed for rapid pest-control." - desc_antag = "This gun can be emagged to make it fire damaging beams and get more max shots. It doesn't do a lot of damage, but it is concealable." icon = 'icons/obj/guns/pestishock.dmi' icon_state = "pestishock" item_state = "pestishock" @@ -134,6 +133,10 @@ var/emagged = FALSE needspin = FALSE +/obj/item/gun/energy/mousegun/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This gun can be emagged to make it fire damaging beams and get more max shots. It doesn't do a lot of damage, but it is concealable." + /obj/item/gun/energy/mousegun/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0, var/playemote = 1) var/T = get_turf(user) spark(T, 3, GLOB.alldirs) diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 76fa25145f4..505890194c8 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -35,10 +35,6 @@ /obj/item/gun/energy/crossbow name = "mini energy-crossbow" desc = "A weapon favored by many mercenary stealth specialists." - desc_info = "This is an energy weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire." - desc_antag = "This is a stealthy weapon which fires paralyzing bolts at your target. When it hits someone, they will suffer a stun effect. \ - The energy crossbow recharges itself slowly, and can be concealed in your pocket or bag." icon = 'icons/obj/guns/crossbow.dmi' icon_state = "crossbow" item_state = "crossbow" @@ -58,6 +54,11 @@ turret_sprite_set = "crossbow" charge_failure_message = "'s charging socket was removed to make room for a minaturized reactor." +/obj/item/gun/energy/crossbow/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a stealthy weapon which fires paralyzing bolts at your target. When it hits someone, they will suffer a stun effect." + . += "The energy crossbow recharges itself slowly, and can be concealed in your pocket or bag." + /obj/item/gun/energy/crossbow/get_cell() return DEVICE_NO_CELL diff --git a/code/modules/projectiles/guns/launcher.dm b/code/modules/projectiles/guns/launcher.dm index 9baaf715d37..65a875fedcc 100644 --- a/code/modules/projectiles/guns/launcher.dm +++ b/code/modules/projectiles/guns/launcher.dm @@ -1,9 +1,6 @@ /obj/item/gun/launcher name = "launcher" desc = "A device that launches things." - desc_info = "This is a projectile launcher, which launches objects such as arrows, rockets, or syringes. To fire it, toggle the safety(if one is present) with CTRL-click or by \ - switching to HARM intent, then click where you wish to fire. To reload it, insert the appropriate items. Some weapons may require additional drawing of the string or charging, \ - which can typically be done with the Unique-Action macro or button located in the bottom right of the screen." w_class = WEIGHT_CLASS_HUGE obj_flags = OBJ_FLAG_CONDUCTABLE slot_flags = SLOT_BACK @@ -13,6 +10,13 @@ muzzle_flash = 0 fire_sound_text = "a launcher firing" +/obj/item/gun/launcher/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a projectile launcher, which launches objects such as arrows, rockets, or syringes." + . += "To fire it, toggle the safety (if one is present) with CTRL-click or by switching to HARM intent, then click where you wish to shoot." + . += "To reload it, insert the appropriate items." + . += "Some weapons may require additional drawing of the string or charging, which can typically be done with the Unique-Action macro or button located in the bottom right of the screen." + //This normally uses a proc on projectiles and our ammo is not strictly speaking a projectile. /obj/item/gun/launcher/can_hit(var/mob/living/target as mob, var/mob/living/user as mob) return 1 diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 3566148067b..e78b0db9784 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -25,6 +25,14 @@ var/max_grenades = 5 //holds this + one in the chamber matter = list(DEFAULT_WALL_MATERIAL = 2000) + +/obj/item/gun/launcher/grenade/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + . += SPAN_NOTICE("It has [get_ammo()] grenade\s remaining.") + if(chambered) + . += SPAN_NOTICE("\A [chambered] is chambered.") + //revolves the magazine, allowing players to choose between multiple grenade types /obj/item/gun/launcher/grenade/proc/pump(mob/M as mob) playsound(M, 'sound/weapons/reloads/shotgun_pump.ogg', 60, 1) @@ -43,13 +51,6 @@ to_chat(M, SPAN_WARNING("You pump [src], but the magazine is empty.")) update_icon() -/obj/item/gun/launcher/grenade/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - . += SPAN_NOTICE("It has [get_ammo()] grenade\s remaining.") - if(chambered) - . += SPAN_NOTICE("\A [chambered] is chambered.") - /obj/item/gun/launcher/grenade/proc/load(obj/item/grenade/G, mob/user) if(!can_load_grenade_type(G, user)) return diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 455a4a032b6..90d3f3a33b6 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -23,6 +23,17 @@ var/force_divisor = 400 // Force equates to speed. Speed/5 equates to a damage multiplier for whoever you hit. // For reference, a fully pressurized oxy tank at 50% gas release firing a health // analyzer with a force_divisor of 10 hit with a damage multiplier of 3000+. + +/obj/item/gun/launcher/pneumatic/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 2) + return + . += "The valve is dialed to [pressure_setting]%." + if(tank) + . += "The tank dial reads [tank.air_contents.return_pressure()] kPa." + else + . += "Nothing is attached to the tank valve!" + /obj/item/gun/launcher/pneumatic/Initialize() . = ..() item_storage = new(src) @@ -101,16 +112,6 @@ item_storage.remove_from_storage(launched, src) return launched -/obj/item/gun/launcher/pneumatic/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 2) - return - . += "The valve is dialed to [pressure_setting]%." - if(tank) - . += "The tank dial reads [tank.air_contents.return_pressure()] kPa." - else - . += "Nothing is attached to the tank valve!" - /obj/item/gun/launcher/pneumatic/update_release_force(obj/item/projectile) if(tank) release_force = ((fire_pressure*tank.volume)/projectile.w_class)/force_divisor //projectile speed. @@ -150,23 +151,25 @@ icon = 'icons/obj/weapons.dmi' var/buildstate = 0 +/obj/item/cannonframe/assembly_hints(mob/user, distance, is_adjacent) + . += ..() + switch(buildstate) + if(0) + . += "It must be fitted with a segment of straight atmospherics pipe." + if(1) + . += "It must have the pipe segment welded in place." + if(2) + . += "Its chassis requires five steel sheets." + if(3) + . += "It must have its chassis welded in place." + if(4) + . += "It must have a tank transfer valve installed." + if(5) + . += "It must have the transfer valve welded into place." + /obj/item/cannonframe/update_icon() icon_state = "pneumatic[buildstate]" -/obj/item/cannonframe/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - switch(buildstate) - if(1) - . += "It has a pipe segment installed." - if(2) - . += "It has a pipe segment welded in place." - if(3) - . += "It has an outer chassis installed." - if(4) - . += "It has an outer chassis welded in place." - if(5) - . += "It has a transfer valve installed." - /obj/item/cannonframe/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/pipe)) if(buildstate == 0) diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index 7d8954681e9..1743699d964 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -19,8 +19,8 @@ var/max_rockets = 1 var/list/rockets = new/list() -/obj/item/gun/launcher/rocket/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/gun/launcher/rocket/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(is_adjacent) . += SPAN_NOTICE("[rockets.len] / [max_rockets] rockets.") diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 10e2b62b80e..f68d84ae55b 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -37,10 +37,24 @@ //var/list/icon_keys = list() //keys //var/list/ammo_states = list() //values +/obj/item/gun/projectile/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a ballistic weapon. It fires [caliber] ammunition. To reload most guns, click the gun with an empty hand to remove any spent casings or magazines, and then insert new ones." + +/obj/item/gun/projectile/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 1) + return + if(jam_num) + . += SPAN_WARNING("It looks jammed.") + if(ammo_magazine) + . += "It has \a [ammo_magazine] loaded." + if(suppressed) + . += "It has a suppressor attached." + . += "Has [get_ammo()] round\s remaining." + /obj/item/gun/projectile/Initialize() . = ..() - desc_info = "This is a ballistic weapon. It fires [caliber] ammunition. To fire the weapon, toggle the safety with ctrl-click (or enable HARM intent), \ - then click where you want to fire. To reload, click the gun with an empty hand to remove any spent casings or magazines, and then insert new ones." if(ispath(ammo_type) && (load_method & (SINGLE_CASING|SPEEDLOADER))) for(var/i in 1 to max_shells) loaded += new ammo_type(src) @@ -288,19 +302,6 @@ ammo_magazine = null update_icon() //make sure to do this after unsetting ammo_magazine -/obj/item/gun/projectile/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 1) - return - if(jam_num) - . += SPAN_WARNING("It looks jammed.") - if(ammo_magazine) - . += "It has \a [ammo_magazine] loaded." - if(suppressed) - . += "It has a suppressor attached." - . += "Has [get_ammo()] round\s remaining." - return - /obj/item/gun/projectile/get_ammo() var/bullets = 0 if(loaded) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 9baf48a87a1..eba434a6a30 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -371,6 +371,13 @@ var/use_launcher = 0 var/obj/item/gun/launcher/grenade/underslung/launcher +/obj/item/gun/projectile/automatic/rifle/z8/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(launcher.chambered) + . += "\The [launcher] has \a [launcher.chambered] loaded." + else + . += "\The [launcher] is empty." + /obj/item/gun/projectile/automatic/rifle/z8/Initialize() . = ..() launcher = new(src) @@ -407,13 +414,6 @@ else icon_state = "carbine-empty" -/obj/item/gun/projectile/automatic/rifle/z8/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(launcher.chambered) - . += "\The [launcher] has \a [launcher.chambered] loaded." - else - . += "\The [launcher] is empty." - /obj/item/gun/projectile/automatic/rifle/jingya name = "burst rifle" desc = "The Jingya A-1 is the first of a new line of NanoTrasen rifles, developed in cooperation with Zavodskoi Interstellar's Kumar Arms subsidiary. Primarily made of high strength polymers, the rifle is designed to be cheap to mass produce while remaining reliable." diff --git a/code/modules/projectiles/guns/projectile/dartgun.dm b/code/modules/projectiles/guns/projectile/dartgun.dm index fdb7923dec7..1f789ce73a5 100644 --- a/code/modules/projectiles/guns/projectile/dartgun.dm +++ b/code/modules/projectiles/guns/projectile/dartgun.dm @@ -97,8 +97,8 @@ if(istype(dart)) fill_dart(dart) -/obj/item/gun/projectile/dartgun/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/gun/projectile/dartgun/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if (beakers.len) . += SPAN_NOTICE("[src] contains:") for(var/obj/item/reagent_containers/glass/beaker/B in beakers) diff --git a/code/modules/projectiles/guns/projectile/improvised.dm b/code/modules/projectiles/guns/projectile/improvised.dm index 5184d7b21d7..7889ae59f68 100644 --- a/code/modules/projectiles/guns/projectile/improvised.dm +++ b/code/modules/projectiles/guns/projectile/improvised.dm @@ -20,6 +20,20 @@ fire_sound = 'sound/weapons/gunshot/gunshot_shotgun2.ogg' var/fail_chance = 35 +/obj/item/gun/projectile/shotgun/improvised/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + switch(fail_chance) + if(1) + . += "All craftsmanship is of the highest quality." + if(2 to 25) + . += "All craftsmanship is of high quality." + if(26 to 50) + . += "All craftsmanship is of average quality." + if(51 to 75) + . += "All craftsmanship is of low quality." + if(100) + . += "All craftsmanship is of the lowest quality." + /obj/item/gun/projectile/shotgun/improvised/special_check(var/mob/living/carbon/human/M) if(prob(fail_chance)) M.visible_message(SPAN_DANGER("[M]'s weapon blows up, shattering into pieces!"), @@ -57,20 +71,6 @@ else ..() -/obj/item/gun/projectile/shotgun/improvised/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - switch(fail_chance) - if(1) - . += "All craftsmanship is of the highest quality." - if(2 to 25) - . += "All craftsmanship is of high quality." - if(26 to 50) - . += "All craftsmanship is of average quality." - if(51 to 75) - . += "All craftsmanship is of low quality." - if(100) - . += "All craftsmanship is of the lowest quality." - /obj/item/gun/projectile/shotgun/improvised/sawn name = "sawn-off improvised shotgun" desc = "An improvised pipe assembly that can fire shotgun shells." @@ -89,6 +89,16 @@ icon_state = "riflestock" var/buildstate = 0 +/obj/item/stock/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + switch(buildstate) + if(1) + . += "It is carved in the shape of a pistol handle." + if(2) + . += "It has a receiver installed." + if(3) + . += "It has a pipe installed." + /obj/item/receivergun name = "receiver" desc = "A receiver and trigger assembly for a firearm." @@ -99,8 +109,8 @@ /obj/item/receivergun/update_icon() icon_state = "ishotgun[buildstate]" -/obj/item/receivergun/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/receivergun/feedback_hints(mob/user, distance, is_adjacent) + . += ..() switch(buildstate) if(1) . += "It has a pipe segment installed." @@ -165,11 +175,8 @@ jam_chance = 20 needspin = FALSE -/obj/item/gun/projectile/improvised_handgun/loaded - magazine_type = /obj/item/ammo_magazine/c45m - -/obj/item/gun/projectile/improvised_handgun/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/gun/projectile/improvised_handgun/feedback_hints(mob/user, distance, is_adjacent) + . += ..() switch(jam_chance) if(1) . += "All craftsmanship is of the highest quality." @@ -182,19 +189,12 @@ if(100) . += "All craftsmanship is of the lowest quality." +/obj/item/gun/projectile/improvised_handgun/loaded + magazine_type = /obj/item/ammo_magazine/c45m + /obj/item/stock/update_icon() icon_state = "ipistol[buildstate]" -/obj/item/stock/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - switch(buildstate) - if(1) - . += "It is carved in the shape of a pistol handle." - if(2) - . += "It has a receiver installed." - if(3) - . += "It has a pipe installed." - /obj/item/stock/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/material/hatchet)) if(buildstate == 0) diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 8ef3ee34965..218bf68710a 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -483,10 +483,10 @@ accuracy = -3 accuracy_wielded = 1 -/obj/item/gun/projectile/pistol/super_heavy/Initialize() - . = ..() - desc_info = "This is an extremely powerful ballistic weapon, using .599 Kumar Super ammunition. If you aren't an Unathi or a G2 IPC, firing without wielding (clicking in-hand) could lead to serious injury or death; Unathi and G2s may fire it unwielded \ - with an aim penalty. To fire the weapon, toggle the safety with ctrl-click (or enable HARM intent), then click where you want to fire. To reload, click the gun with an empty hand to remove the magazine, and then insert a new one." +/obj/item/gun/projectile/pistol/super_heavy/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is an extremely powerful ballistic weapon, using .599 Kumar Super ammunition." + . += "If you aren't an Unathi or a G2 IPC, firing without wielding (clicking in-hand) could lead to serious injury or death. Unathi and G2s may fire it unwielded with an aim penalty." /obj/item/gun/projectile/pistol/super_heavy/update_icon() ..() diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 2f07dd8224c..3b21064fd29 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -60,7 +60,6 @@ /obj/item/gun/projectile/revolver/mateba/captain name = "\improper SCC command autorevolver" desc = "A ludicrously powerful .454 autorevolver with equally ludicrous recoil which is issued by the SCC to the administrators of critical facilities and vessels. While revolvers may be a thing of the past, the stopping power displayed by this weapon is second to none." - desc_info = "In order to accurately fire this revolver, it must be wielded. Additionally, if you fire this revolver unwielded and you are not a G2 or Unathi, you will drop it." desc_extended = "A Zavodskoi Interstellar design from the mid 2450s intended for export to the Eridani Corporate Federation and the Republic of Biesel, the Protektor \ revolver was never designed with practicality in mind. The .454 rounds fired from this weapon are liable to snap the wrist of an unprepared shooter and \ any following shots will be difficult to place onto a human-sized target due to the recoil, let alone a skrell. But nobody buys a Protektor for the purpose of \ @@ -78,6 +77,10 @@ recoil = 10 recoil_wielded = 5 +/obj/item/gun/projectile/revolver/mateba/captain/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "In order to accurately fire this revolver, it must be wielded with both hands. Additionally, if you fire this revolver unwielded and you are not a G2 or Unathi, you will drop it." + /obj/item/gun/projectile/revolver/mateba/captain/handle_post_fire(mob/user) ..() if(wielded) @@ -185,12 +188,13 @@ var/list/tertiary_loaded = list() fire_delay = ROF_INTERMEDIATE +/obj/item/gun/projectile/revolver/lemat/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This is a unique ballistic weapon. It fires .38 ammunition, but may also load shotgun shells into a secondary barrel." + . += "By using the Unique-Action macro, you can switch from one barrel to the other." /obj/item/gun/projectile/revolver/lemat/Initialize() . = ..() - desc_info = "This is a unique ballistic weapon. It fires .38 ammunition, but may also load shotgun shells into a secondary barrel. To fire the weapon, toggle the safety \ - with ctrl-click (or enable HARM intent), then click where you want to fire. By using the Unique-Action macro, you can switch from one barrel to the other. To reload, click the gun \ - with an empty hand to remove any spent casings or shells, then insert new ones." for(var/i in 1 to secondary_max_shells) secondary_loaded += new secondary_ammo_type(src) @@ -251,8 +255,9 @@ if(rand(1,max_shells) > loaded.len) chamber_offset = rand(0,max_shells - loaded.len) -/obj/item/gun/projectile/revolver/lemat/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/gun/projectile/revolver/lemat/feedback_hints(mob/user, distance, is_adjacent, infix, suffix) + . = list() + . += ..() if(secondary_loaded) var/to_print for(var/round in secondary_loaded) diff --git a/code/modules/projectiles/guns/projectile/rifle.dm b/code/modules/projectiles/guns/projectile/rifle.dm index e0b75f0dfdb..4e6ce55b8be 100644 --- a/code/modules/projectiles/guns/projectile/rifle.dm +++ b/code/modules/projectiles/guns/projectile/rifle.dm @@ -105,8 +105,9 @@ jam_chance = -10 -/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/pipegun/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/gun/projectile/shotgun/pump/rifle/magazine_fed/pipegun/condition_hints(mob/user, distance, is_adjacent, infix, suffix) + . = list() + . += ..() switch(jam_chance) if(10 to 20) . += SPAN_NOTICE("\The [src] is starting to accumulate fouling. Might want to grab a rag.") diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index f2d50aa4e66..ce26cc35939 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -1,15 +1,17 @@ /obj/item/gun/projectile/shotgun name = "strange shotgun" desc = DESC_PARENT - desc_info = "This is a shotgun, chambered for various shells and slugs. To fire the weapon, toggle the safety with CTRL-Click or enable 'HARM' intent, then click where \ - you want to fire. To pump a pump-action shotgun, use the Unique-Action hotkey or the button in the bottom right of your screen. To reload, insert shells or a magazine \ - into the shotgun, then pump the shotgun to chamber a fresh round." accuracy = -1 accuracy_wielded = 1 var/can_sawoff = FALSE var/sawnoff_workmsg var/sawing_in_progress = FALSE +/obj/item/gun/projectile/shotgun/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To pump a pump-action shotgun, use the Unique-Action hotkey or the button in the bottom right of your screen." + . += "To reload, insert shells or a magazine into the shotgun, then pump the shotgun to chamber a fresh round." + /obj/item/gun/projectile/shotgun/attackby(obj/item/attacking_item, mob/user) if (!can_sawoff || sawing_in_progress) return ..() @@ -46,9 +48,6 @@ /obj/item/gun/projectile/shotgun/pump name = "pump shotgun" desc = "An ubiquitous unbranded shotgun. Useful for sweeping alleys." - desc_info = "This is a ballistic weapon. To fire the weapon, ensure your intent is *not* set to 'help', have your gun mode set to 'fire', \ - then click where you want to fire. After firing, you will need to pump the gun, by using the unique-action verb. To reload, load more shotgun \ - shells into the gun." icon = 'icons/obj/guns/shotgun.dmi' icon_state = "shotgun" item_state = "shotgun" @@ -308,8 +307,8 @@ fire_sound = 'sound/weapons/gunshot/gunshot_pistol.ogg' origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 2, TECH_ILLEGAL = 2) -/obj/item/gun/projectile/shotgun/foldable/cameragun/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/gun/projectile/shotgun/foldable/cameragun/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance <= 1) . += SPAN_NOTICE("Upon closer inspection, this is not a camera at all, but a 9mm firearm concealed inside the shell of one, which can be deployed by pressing a button.") diff --git a/code/modules/projectiles/modular/laser_base.dm b/code/modules/projectiles/modular/laser_base.dm index a153955dd0e..b45dae36a7e 100644 --- a/code/modules/projectiles/modular/laser_base.dm +++ b/code/modules/projectiles/modular/laser_base.dm @@ -44,8 +44,8 @@ var/criticality repair_item = /obj/item/weldingtool -/obj/item/laser_components/modifier/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/laser_components/modifier/condition_hints(mob/user, distance, is_adjacent) + . += ..() if(distance <= 1) if(malus > base_malus) . += SPAN_WARNING("\The [src] appears damaged.") @@ -75,6 +75,11 @@ reliability = 50 repair_item = /obj/item/stack/cable_coil +/obj/item/laser_components/capacitor/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1 && condition > 0) + . += SPAN_WARNING("\The [src] appears damaged.") + /obj/item/laser_components/capacitor/repair_module(var/obj/item/stack/cable_coil/C) if(!istype(C)) return @@ -85,11 +90,6 @@ return 1 return 0 -/obj/item/laser_components/capacitor/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1 && condition > 0) - . += SPAN_WARNING("\The [src] appears damaged.") - /obj/item/laser_components/capacitor/proc/small_fail(var/mob/user, var/obj/item/gun/energy/laser/prototype/prototype) return @@ -108,6 +108,11 @@ reliability = 25 repair_item = /obj/item/stack/nanopaste +/obj/item/laser_components/focusing_lens/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1 && condition > 0) + . += SPAN_WARNING("\The [src] appears damaged.") + /obj/item/laser_components/focusing_lens/repair_module(var/obj/item/stack/nanopaste/N) if(!istype(N)) return @@ -118,11 +123,6 @@ return 1 return 0 -/obj/item/laser_components/focusing_lens/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1 && condition > 0) - . += SPAN_WARNING("\The [src] appears damaged.") - /obj/item/laser_components/modulator name = "laser modulator" desc = "A modification that modulates the beam into a standard laser beam." diff --git a/code/modules/projectiles/suppressor.dm b/code/modules/projectiles/suppressor.dm index 20f2ccf8585..46c07c56c61 100644 --- a/code/modules/projectiles/suppressor.dm +++ b/code/modules/projectiles/suppressor.dm @@ -1,8 +1,12 @@ /obj/item/suppressor name = "suppressor" desc = "A suppressor" - desc_info = "Suppressors can be attached to weapons to reduce their sound. Click on a weapon adjacent to you or in your hand to attach it. Alt-Click the weapon to remove it." icon = 'icons/obj/guns/suppressor.dmi' icon_state = "suppressor_item" origin_tech = list(TECH_MATERIAL = 2, TECH_COMBAT = 3) w_class = WEIGHT_CLASS_SMALL + +/obj/item/suppressor/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Suppressors can be attached to weapons to reduce their sound." + . += "Click on a weapon adjacent to you or in your hand to attach it and ALT-click the weapon to remove it." diff --git a/code/modules/psionics/equipment/cerebro_enhancers.dm b/code/modules/psionics/equipment/cerebro_enhancers.dm index c16405d209d..8b23a5a19cb 100644 --- a/code/modules/psionics/equipment/cerebro_enhancers.dm +++ b/code/modules/psionics/equipment/cerebro_enhancers.dm @@ -2,7 +2,6 @@ /obj/item/clothing/head/helmet/space/psi_amp name = "cerebro-energetic enhancer" desc = "A matte-black, eyeless cerebro-energetic enhancement helmet. It uses highly sophisticated, and illegal, techniques to drill into your brain and install psi-infected AIs into the fluid cavities between your lobes." - desc_info = "Due to the nature of this headgear, it will also protect you from the pressure of space. When installing the boosters, your chosen faculties will be boosted to the headgear's maximum potential, but the unchosen faculties will also be boosted somewhat." action_button_name = "Install Boosters" icon = 'icons/obj/clothing/hats.dmi' contained_sprite = FALSE @@ -17,6 +16,11 @@ var/boosted_rank = PSI_RANK_HARMONIOUS var/boosted_psipower = 120 +/obj/item/clothing/head/helmet/space/psi_amp/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Due to the nature of this headgear, it will also protect you from the pressure of space." + . += "When installing the boosters, your chosen faculties will be boosted to the headgear's maximum potential, but the unchosen faculties will also be boosted somewhat." + /obj/item/clothing/head/helmet/space/psi_amp/lesser name = "psionic amplifier" desc = "A crown-of-thorns cerebro-energetic enhancer that interfaces directly with the brain, isolating and strengthening psionic signals. It kind of looks like a tiara." diff --git a/code/modules/random_map/automata/diona.dm b/code/modules/random_map/automata/diona.dm index 8bac31cb5ee..229390b9f3a 100644 --- a/code/modules/random_map/automata/diona.dm +++ b/code/modules/random_map/automata/diona.dm @@ -99,10 +99,13 @@ /obj/structure/diona/bulb/unpowered name = "unpowered glow bulb" desc = "A bulb of some sort. Seems like it needs some power." - desc_info = "This bulb requires a power cell to glow. Click on it with a power cell in hand to plug it in." light_power = 0 light_range = 0 +/obj/structure/diona/bulb/unpowered/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This bulb requires a power cell to glow. Click on it with a power cell in hand to plug it in." + /obj/structure/diona/bulb/unpowered/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/cell)) to_chat(user, SPAN_NOTICE("You jack the power cell into the glow bulb.")) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index a1dec9dc21b..e7279176bf1 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -18,6 +18,15 @@ var/temperature_override = 0 //A non-zero value with set the temperature of the reagents inside to this value, in kelvin. +/obj/item/reagent_containers/chem_disp_cartridge/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It has a capacity of [volume] units." + if(reagents.total_volume <= 0) + . += "It is empty." + else + . += "It contains [reagents.total_volume] units of liquid." + if(!is_open_container()) + . += "The cap is sealed." /obj/item/reagent_containers/chem_disp_cartridge/Initialize(mapload,temperature_override) . = ..() @@ -44,16 +53,6 @@ var/mutable_appearance/lid = mutable_appearance(icon, lid_icon) AddOverlays(lid) -/obj/item/reagent_containers/chem_disp_cartridge/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It has a capacity of [volume] units." - if(reagents.total_volume <= 0) - . += "It is empty." - else - . += "It contains [reagents.total_volume] units of liquid." - if(!is_open_container()) - . += "The cap is sealed." - /obj/item/reagent_containers/chem_disp_cartridge/verb/verb_set_label(L as text) set name = "Set Cartridge Label" set category = "Object" diff --git a/code/modules/reagents/dispenser/dispenser2.dm b/code/modules/reagents/dispenser/dispenser2.dm index 8be87e14fee..1cdc185e15a 100644 --- a/code/modules/reagents/dispenser/dispenser2.dm +++ b/code/modules/reagents/dispenser/dispenser2.dm @@ -8,8 +8,6 @@ anchored = TRUE manufacturer = "zenghu" - obj_flags = OBJ_FLAG_ROTATABLE - /// Icon state when used. var/icon_state_active = "dispenser_active" /// Set to a list of types to spawn one of each on New(). @@ -33,16 +31,16 @@ /// Allow these cans/glasses/condiment bottles but forbid ACTUAL food. var/list/drink_accepted = list(/obj/item/reagent_containers/food/drinks, /obj/item/reagent_containers/food/condiment) +/obj/machinery/chemical_dispenser/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more." + /obj/machinery/chemical_dispenser/Initialize() . = ..() if(spawn_cartridges) for(var/type in spawn_cartridges) add_cartridge(new type(src)) -/obj/machinery/chemical_dispenser/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It has [cartridges.len] cartridges installed, and has space for [DISPENSER_MAX_CARTRIDGES - cartridges.len] more." - /obj/machinery/chemical_dispenser/proc/add_cartridge(obj/item/reagent_containers/chem_disp_cartridge/C, mob/user) if(!istype(C)) if(user) diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index 80d44089df7..c01e2576c17 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -34,6 +34,11 @@ drop_sound = 'sound/items/drop/food.ogg' pickup_sound = 'sound/items/pickup/food.ogg' +/obj/item/reagent_containers/blood/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (distance <= 2 && vampire_marks) + . += SPAN_WARNING("There are sharp, canine-like teeth marks on it.") + /obj/item/reagent_containers/blood/Initialize() . = ..() if(blood_type != null) @@ -155,11 +160,6 @@ attached_mob = null STOP_PROCESSING(SSprocessing, src) -/obj/item/reagent_containers/blood/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (distance <= 2 && vampire_marks) - . += SPAN_WARNING("There are sharp, canine-like teeth marks on it.") - /obj/item/reagent_containers/blood/attackby(obj/item/attacking_item, mob/user) ..() if (attacking_item.ispen()) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index b95b9a4b443..c5418f15f7d 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -1,8 +1,6 @@ /obj/item/reagent_containers/hypospray/borghypo name = "cyborg hypospray" desc = "An advanced chemical synthesizer and injection system, designed for heavy-duty medical equipment." - desc_info = "Stationbound synthesizers produce specific reagents dependent on the selected module, which you can select by using it. \ - The reagents recharge automatically at the cost of energy.
Alt Click the synthesizer to change the transfer amount." desc_extended = null icon = 'icons/obj/item/reagent_containers/syringe.dmi' icon_state = "medical_synth" @@ -23,6 +21,20 @@ center_of_mass = null +/obj/item/reagent_containers/hypospray/borghypo/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Stationbound synthesizers produce specific reagents dependent on the selected module, which you can select by using it." + . += "The reagents recharge automatically at the cost of energy." + . += "ALT-Click the synthesizer to change the transfer amount." + +/obj/item/reagent_containers/hypospray/borghypo/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (distance > 2) + return + + var/singleton/reagent/R = GET_SINGLETON(reagent_ids[mode]) + . += "It is currently producing [R.name] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left." + /obj/item/reagent_containers/hypospray/borghypo/medical reagent_ids = list(/singleton/reagent/bicaridine, /singleton/reagent/kelotane, /singleton/reagent/dexalin, /singleton/reagent/inaprovaline, /singleton/reagent/dylovene, /singleton/reagent/perconol, /singleton/reagent/mortaphenyl, /singleton/reagent/thetamycin) @@ -126,14 +138,6 @@ to_chat(usr, SPAN_NOTICE("Synthesizer is now producing '[R.name]'.")) update_icon() -/obj/item/reagent_containers/hypospray/borghypo/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if (distance > 2) - return - - var/singleton/reagent/R = GET_SINGLETON(reagent_ids[mode]) - . += SPAN_NOTICE("It is currently producing [R.name] and has [reagent_volumes[reagent_ids[mode]]] out of [volume] units left.") - /obj/item/reagent_containers/hypospray/borghypo/service name = "cyborg drink synthesizer" desc = "A portable drink synthesizer and dispenser." diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index f80757f5a06..b59a3f2b70f 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -1,7 +1,6 @@ /obj/item/reagent_containers/dropper name = "dropper" desc = "A dropper. It has a volume of 5 units." - desc_info = "Alt Click or Activate this item to change transfer rate." icon = 'icons/obj/item/reagent_containers/dropper.dmi' contained_sprite = TRUE icon_state = "dropper" @@ -16,6 +15,17 @@ drop_sound = 'sound/items/drop/glass_small.ogg' pickup_sound = 'sound/items/pickup/glass_small.ogg' +/obj/item/reagent_containers/dropper/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-Click or use this item to change transfer rate." + +/obj/item/reagent_containers/dropper/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(LAZYLEN(reagents.reagent_volumes)) + . += "\The [src] is holding [reagents.total_volume] units out of [volume]. Current transfer is [amount_per_transfer_from_this] units." + else + . += "It is empty." + /obj/item/reagent_containers/dropper/afterattack(var/obj/target, var/mob/user, var/flag) if(!target.reagents || !flag) return @@ -102,13 +112,6 @@ worn_overlay = null update_held_icon() -/obj/item/reagent_containers/dropper/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(LAZYLEN(reagents.reagent_volumes)) - . += SPAN_NOTICE("\The [src] is holding [reagents.total_volume] units out of [volume]. Current transfer is [amount_per_transfer_from_this] units.") - else - . += SPAN_NOTICE("It is empty.") - /obj/item/reagent_containers/dropper/electronic_pipette name = "electronic pipette" desc = "A laboratory standard electronic pipette, designed for a finer and more precise transfer rate of substances with a volume of 5 units." diff --git a/code/modules/reagents/reagent_containers/food/cans.dm b/code/modules/reagents/reagent_containers/food/cans.dm index 3eb34bb3d48..6d7b16369ac 100644 --- a/code/modules/reagents/reagent_containers/food/cans.dm +++ b/code/modules/reagents/reagent_containers/food/cans.dm @@ -19,10 +19,13 @@ icon = 'icons/obj/item/reagent_containers/food/drinks/soda.dmi' drop_sound = 'sound/items/drop/soda.ogg' pickup_sound = 'sound/items/pickup/soda.ogg' - desc_info = "Click it in your hand to open it.\ - If it's carbonated and closed, you can shake it by clicking on it with harm intent. \ - If it's empty, you can crush it on your forehead by selecting your head and clicking on yourself with harm intent. \ - You can also crush cans on other people's foreheads as well." + +/obj/item/reagent_containers/food/drinks/cans/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click it in your hand to open it." + . += "If it's carbonated and closed, you can shake it by clicking on it with harm intent." + . += "If it's empty, you can crush it on your forehead by selecting your head and clicking on yourself with harm intent." + . += "You can also crush cans on other people's foreheads as well." /obj/item/reagent_containers/food/drinks/cans/attack(mob/living/target_mob, mob/living/user, target_zone) if(iscarbon(target_mob) && !reagents.total_volume && user.a_intent == I_HURT && target_zone == BP_HEAD) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 3e16c1df4f5..be172f630af 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -24,6 +24,21 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e var/drink_flags possible_transfer_amounts = list(1, 2, 3, 4, 5, 10, 15, 25, 30) +/obj/item/reagent_containers/food/drinks/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if (distance > 1) + return + if(!reagents || reagents.total_volume == 0) + . += SPAN_NOTICE("\The [src] is empty!") + else if (reagents.total_volume <= volume * 0.25) + . += SPAN_NOTICE("\The [src] is almost empty!") + else if (reagents.total_volume <= volume * 0.66) + . += SPAN_NOTICE("\The [src] is half full!") + else if (reagents.total_volume <= volume * 0.90) + . += SPAN_NOTICE("\The [src] is almost full!") + else + . += SPAN_NOTICE("\The [src] is full!") + /obj/item/reagent_containers/food/drinks/Initialize() . = ..() if(drink_flags & IS_GLASS) @@ -99,21 +114,6 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e return 1 return ..() -/obj/item/reagent_containers/food/drinks/get_examine_text(mob/user, distance, is_adjacent, infix, suffix, get_extended = FALSE) - . = ..() - if (distance > 1) - return - if(!reagents || reagents.total_volume == 0) - . += SPAN_NOTICE("\The [src] is empty!") - else if (reagents.total_volume <= volume * 0.25) - . += SPAN_NOTICE("\The [src] is almost empty!") - else if (reagents.total_volume <= volume * 0.66) - . += SPAN_NOTICE("\The [src] is half full!") - else if (reagents.total_volume <= volume * 0.90) - . += SPAN_NOTICE("\The [src] is almost full!") - else - . += SPAN_NOTICE("\The [src] is full!") - //////////////////////////////////////////////////////////////////////////////// /// Drinks. END @@ -330,6 +330,11 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e */ var/list/details = list("Customer" = null, "Order" = null) +/obj/item/reagent_containers/food/drinks/takeaway_cup_idris/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Order: [details["Order"]]" + . += "For: [details["Customer"]]" + /obj/item/reagent_containers/food/drinks/takeaway_cup_idris/attackby(obj/item/attacking_item, mob/user) if(attacking_item.ispen() && !use_check_and_message(user)) var/choice = tgui_input_list(user, "Which detail do you want to edit?", "Detail Editor", list("Customer", "Order")) @@ -341,11 +346,6 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e return return ..() -/obj/item/reagent_containers/food/drinks/takeaway_cup_idris/get_examine_text(mob/user, distance, is_adjacent, infix, suffix, get_extended) - . = ..() - . += "Order: [details["Order"]]" - . += "For: [details["Customer"]]" - //////////////////////////drinkingglass and shaker// //Note by Darem: This code handles the mixing of drinks. New drinks go in three places: In Chemistry-Reagents.dm (for the drink // itself), in Chemistry-Recipes.dm (for the reaction that changes the components into the drink), and here (for the drinking glass @@ -354,8 +354,6 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e /obj/item/reagent_containers/food/drinks/shaker name = "shaker" desc = "A metal shaker to mix drinks in." - desc_info = "Alt Click the shaker to twist the cap closed/loose. If the cap is loose, use the shaker to remove it. Without a cap, use the shaker again to remove the top. \ - If the shaker has a top fitted, you can Alt Click the shaker to change the transfer amount. Without a top, the transfer amount changes to max automatically." icon = 'icons/obj/shaker.dmi' icon_state = "shaker" item_state = "shaker" @@ -371,6 +369,13 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e var/obj/item/shaker_top/top var/obj/item/reagent_containers/food/drinks/shaker_cup/cap +/obj/item/reagent_containers/food/drinks/shaker/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-Click the shaker to twist the cap closed/loose. If the cap is loose, use the shaker to remove it." + . += "Without a cap, use the shaker again to remove the top." + . += "If the shaker has a top fitted, you can ALT-Click the shaker to change the transfer amount." + . += "Without a top, the transfer amount changes to max automatically." + /obj/item/reagent_containers/food/drinks/shaker/Initialize() . = ..() top = new(src) @@ -498,7 +503,6 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e /obj/item/shaker_top name = "shaker top" desc = "A metal shaker top with an in-built filter on the bottom." - desc_info = "When fitted on a shaker, you can Alt Click the shaker to change transfer amount of the shaker." icon = 'icons/obj/shaker.dmi' icon_state = "shaker_top" item_state = "shaker_top" @@ -507,10 +511,13 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e pickup_sound = null center_of_mass = list("x" = 16, "y" = 16) +/obj/item/shaker_top/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "When fitted on a shaker, you can ALT-Click the shaker to change its transfer amount." + /obj/item/reagent_containers/food/drinks/shaker_cup name = "shaker cap" desc = "A metal shaker cap that also doubles as a metal cup to measure liquids, or to drink from." - desc_info = "Alt Click the cap to change the transfer amount." icon = 'icons/obj/shaker.dmi' icon_state = "shaker_cup" item_state = "shaker_cup" @@ -521,6 +528,10 @@ If you add a drink with an empty icon sprite, ensure it is in the same folder, e possible_transfer_amounts = list(1,2,3,4,5,10) center_of_mass = list("x" = 16, "y" = 16) +/obj/item/reagent_containers/food/drinks/shaker_cup/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "ALT-Click the cap to change the transfer amount." + /obj/item/reagent_containers/food/drinks/shaker_cup/update_icon() ClearOverlays() diff --git a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm index 730defebd6c..ce676981bca 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/drinkingglass.dm @@ -3,7 +3,6 @@ /obj/item/reagent_containers/food/drinks/drinkingglass name = "glass" desc = "Your standard drinking glass." - desc_info = "To toast with someone, aim for the right or left hand and click them on help intent with the glass in hand. They must be holding a glass in the targeted hand." icon_state = "glass_empty" item_state = "glass_empty" amount_per_transfer_from_this = 5 @@ -15,6 +14,10 @@ matter = list(MATERIAL_GLASS = 300) fragile = 2 +/obj/item/reagent_containers/food/drinks/drinkingglass/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "To toast with someone, aim for the right or left hand and click them on help intent with the glass in hand. They must be holding a glass in the targeted hand." + /obj/item/reagent_containers/food/drinks/drinkingglass/on_reagent_change() var/singleton/reagent/R = reagents.get_primary_reagent_decl() if (LAZYLEN(reagents.reagent_volumes) && R) diff --git a/code/modules/reagents/reagent_containers/food/drinks/yoke.dm b/code/modules/reagents/reagent_containers/food/drinks/yoke.dm index 3d4f4f6e37a..7aa96d8bcdb 100644 --- a/code/modules/reagents/reagent_containers/food/drinks/yoke.dm +++ b/code/modules/reagents/reagent_containers/food/drinks/yoke.dm @@ -1,7 +1,6 @@ /obj/item/storage/box/fancy/yoke name = "yoke" desc = "A sturdy device made out of bio-friendly materials. This will hold your canned drinks together easy peasy." - desc_info = "Click drag it to pick it up, click on it to take out a can." icon = 'icons/obj/item/reagent_containers/food/drinks/soda.dmi' icon_state = "yoke" center_of_mass = list("x" = 16,"y" = 9) @@ -20,6 +19,10 @@ list(-10, 2) ) +/obj/item/storage/box/fancy/yoke/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click drag it to pick it up, click on it to take out a can." + /obj/item/storage/box/fancy/yoke/fill() . = ..() for(var/obj/item/reagent_containers/food/drinks/cans/C in contents) diff --git a/code/modules/reagents/reagent_containers/food/sandwich.dm b/code/modules/reagents/reagent_containers/food/sandwich.dm index 6bffeb2a31d..262d9821652 100644 --- a/code/modules/reagents/reagent_containers/food/sandwich.dm +++ b/code/modules/reagents/reagent_containers/food/sandwich.dm @@ -18,6 +18,11 @@ var/base_name = "sandwich" var/topper = "sandwich_top" +/obj/item/reagent_containers/food/snacks/csandwich/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + var/obj/item/O = pick(contents) + . += SPAN_NOTICE("You think you can see [O.name] in there.") + /obj/item/reagent_containers/food/snacks/csandwich/attackby(obj/item/attacking_item, mob/user) var/sandwich_limit = 4 @@ -69,11 +74,6 @@ QDEL_LIST(ingredients) return ..() -/obj/item/reagent_containers/food/snacks/csandwich/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - var/obj/item/O = pick(contents) - . += SPAN_NOTICE("You think you can see [O.name] in there.") - /obj/item/reagent_containers/food/snacks/csandwich/roll name = "roll" desc = "Like a sandwich, but rounder." diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index d55c12f44fc..d2ff0251174 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -23,6 +23,22 @@ //Placeholder for effect that trigger on eating that aren't tied to reagents. var/flavor = null // set_flavor() +/obj/item/reagent_containers/food/snacks/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 1) + return + if (coating) + var/singleton/reagent/coating_reagent = GET_SINGLETON(coating) + . += SPAN_NOTICE("It's coated in [coating_reagent.name]!") + if (!bitecount) + return + else if (bitecount==1) + . += SPAN_NOTICE("\The [src] was bitten by someone!") + else if (bitecount<=3) + . += SPAN_NOTICE("\The [src] was bitten [bitecount] time\s!") + else + . += SPAN_NOTICE("\The [src] was bitten multiple times!") + /obj/item/reagent_containers/food/snacks/proc/on_dry(var/newloc) if(dried_type == type) name = "dried [name]" @@ -143,22 +159,6 @@ return 1 -/obj/item/reagent_containers/food/snacks/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 1) - return - if (coating) - var/singleton/reagent/coating_reagent = GET_SINGLETON(coating) - . += SPAN_NOTICE("It's coated in [coating_reagent.name]!") - if (!bitecount) - return - else if (bitecount==1) - . += SPAN_NOTICE("\The [src] was bitten by someone!") - else if (bitecount<=3) - . += SPAN_NOTICE("\The [src] was bitten [bitecount] time\s!") - else - . += SPAN_NOTICE("\The [src] was bitten multiple times!") - /obj/item/reagent_containers/food/snacks/attackby(obj/item/attacking_item, mob/user) if(istype(attacking_item, /obj/item/pen)) diff --git a/code/modules/reagents/reagent_containers/food/snacks/baked.dm b/code/modules/reagents/reagent_containers/food/snacks/baked.dm index 3b18035b9a1..74d3968dfd5 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/baked.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/baked.dm @@ -79,11 +79,14 @@ /obj/item/reagent_containers/food/snacks/donkpocket/sinpocket reagent_data = list(/singleton/reagent/nutriment = list("delicious cruelty" = 1, "dough" = 2)) filling_color = "#6D6D00" - desc_antag = "Use it in hand to heat and release chemicals." var/has_been_heated = FALSE reagents_to_add = list(/singleton/reagent/nutriment/protein = 1, /singleton/reagent/nutriment = 3) +/obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use it in hand to heat and release chemicals." + /obj/item/reagent_containers/food/snacks/donkpocket/sinpocket/attack_self(mob/user) if(has_been_heated) to_chat(user, SPAN_NOTICE("The heating chemicals have already been spent.")) diff --git a/code/modules/reagents/reagent_containers/food/snacks/fish.dm b/code/modules/reagents/reagent_containers/food/snacks/fish.dm index cb6f16fc722..78bd32a8fbb 100644 --- a/code/modules/reagents/reagent_containers/food/snacks/fish.dm +++ b/code/modules/reagents/reagent_containers/food/snacks/fish.dm @@ -69,12 +69,15 @@ name = "mollusc" w_class = WEIGHT_CLASS_TINY desc = "A small slimy mollusc. Fresh!" - desc_info = "You will need a sharp or edged implement to pry it open. You can also try opening it in your hand if you're strong enough." icon = 'icons/obj/item/reagent_containers/food/meat.dmi' icon_state = "mollusc" var/meat_type = /obj/item/reagent_containers/food/snacks/fish/mollusc var/shell_type = /obj/item/trash/mollusc_shell +/obj/item/mollusc/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You will need a sharp or edged implement to pry it open. You can also try opening it in your hand if you're strong enough." + /obj/item/mollusc/barnacle name = "barnacle" desc = "A hull barnacle, probably freshly scraped off a spaceship." diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 63d8f8dda86..351e4b1d2a7 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -20,12 +20,8 @@ pickup_sound = 'sound/items/pickup/bottle.ogg' var/label_text = "" -/obj/item/reagent_containers/glass/Initialize() - . = ..() - AddComponent(/datum/component/base_name, name) - -/obj/item/reagent_containers/glass/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/reagent_containers/glass/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance > 2) return if(LAZYLEN(reagents.reagent_volumes)) @@ -46,6 +42,10 @@ if(!is_open_container()) . += SPAN_NOTICE("An airtight lid seals it completely.") +/obj/item/reagent_containers/glass/Initialize() + . = ..() + AddComponent(/datum/component/base_name, name) + /obj/item/reagent_containers/glass/get_additional_forensics_swab_info() var/list/additional_evidence = ..() var/list/Bdata = REAGENT_DATA(reagents, /singleton/reagent/blood/) diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index a9a7c064fa6..f859100638f 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -6,7 +6,6 @@ name = "hypospray" desc = "A sterile, air-needle autoinjector for administration of drugs to patients." desc_extended = "The Zeng-Hu Pharmaceuticals' Hypospray - 9 out of 10 doctors recommend it!" - desc_info = "Unlike a syringe, reagents have to be poured into the hypospray before it can be used." icon = 'icons/obj/item/reagent_containers/syringe.dmi' contained_sprite = TRUE item_state = "hypo" @@ -24,6 +23,10 @@ var/image/filling //holds a reference to the current filling overlay matter = list(MATERIAL_GLASS = 400, DEFAULT_WALL_MATERIAL = 200) +/obj/item/reagent_containers/hypospray/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Unlike a syringe, reagents have to be poured into the hypospray before it can be used." + /obj/item/reagent_containers/hypospray/Initialize() . = ..() update_icon() @@ -39,13 +42,16 @@ name = "premium hypospray" desc = "A high-end version of the regular hypospray, it allows for a substantially higher rate of drug administration to patients." desc_extended = "The Zeng-Hu Pharmaceuticals' Hypospray Mk-II is a cutting-edge version of the regular hypospray, with a much more expensive and streamlined injection process." - desc_info = "This version of the hypospray has no delay before injecting a patient with reagent." icon_state = "cmo_hypo" item_state = "cmo_hypo" volume = 30 possible_transfer_amounts = list(5, 10, 15, 30) time = 0 +/obj/item/reagent_containers/hypospray/cmo/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This version of the hypospray has no delay before injecting a patient with reagent." + /obj/item/reagent_containers/hypospray/attack(mob/living/target_mob, mob/living/user, target_zone) . = ..() if(isliving(target_mob)) @@ -111,7 +117,6 @@ name = "autoinjector" desc = "A rapid and safe way to administer small amounts of drugs by untrained or trained personnel." desc_extended = "Funded by the Stellar Corporate Conglomerate, produced by Zeng-Hu Pharmaceuticals, this autoinjector system was rebuilt from the ground up from the old variant to provide maximum user feedback." - desc_info = "Autoinjectors are spent after using them. To re-use, use a screwdriver to open the back panel, then simply pour any desired reagent inside. Alt-click while it's on your person to prepare it for reuse." icon_state = "autoinjector" item_state = "autoinjector" slot_flags = SLOT_EARS @@ -122,6 +127,17 @@ volume = 5 time = 0 +/obj/item/reagent_containers/hypospray/autoinjector/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Autoinjectors are spent after using them. To re-use, use a screwdriver to open the back panel, then simply pour any desired reagent inside. ALT-click while it's on your person to prepare it for reuse." + +/obj/item/reagent_containers/hypospray/autoinjector/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(LAZYLEN(reagents.reagent_volumes)) + . += "It is currently loaded." + else + . += "It is empty." + /obj/item/reagent_containers/hypospray/autoinjector/Initialize() . = ..() if(name_label) @@ -187,14 +203,6 @@ AddOverlays(reagent_overlay) update_held_icon() -/obj/item/reagent_containers/hypospray/autoinjector/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(LAZYLEN(reagents.reagent_volumes)) - . += SPAN_NOTICE("It is currently loaded.") - else - . += SPAN_NOTICE("It is empty.") - - /obj/item/reagent_containers/hypospray/autoinjector/inaprovaline name_label = "inaprovaline" reagents_to_add = list(/singleton/reagent/inaprovaline = 5) diff --git a/code/modules/reagents/reagent_containers/inhaler.dm b/code/modules/reagents/reagent_containers/inhaler.dm index 738effe211c..16423a253a8 100644 --- a/code/modules/reagents/reagent_containers/inhaler.dm +++ b/code/modules/reagents/reagent_containers/inhaler.dm @@ -21,6 +21,13 @@ var/has_overlays = TRUE matter = list(MATERIAL_GLASS = 400, DEFAULT_WALL_MATERIAL = 200) +/obj/item/reagent_containers/inhaler/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(LAZYLEN(reagents.reagent_volumes)) + . += SPAN_NOTICE("It is currently loaded.") + else + . += SPAN_NOTICE("It is spent.") + /obj/item/reagent_containers/inhaler/Initialize() . =..() if(name_label) @@ -155,13 +162,6 @@ update_held_icon() -/obj/item/reagent_containers/inhaler/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(LAZYLEN(reagents.reagent_volumes)) - . += SPAN_NOTICE("It is currently loaded.") - else - . += SPAN_NOTICE("It is spent.") - /obj/item/reagent_containers/inhaler/dexalin name_label = "dexalin" desc = "A rapid and safe way to administer small amounts of drugs into the lungs by untrained or trained personnel. This one contains dexalin." diff --git a/code/modules/reagents/reagent_containers/inhaler_advanced.dm b/code/modules/reagents/reagent_containers/inhaler_advanced.dm index 6721f93d099..c25a25bd4cc 100644 --- a/code/modules/reagents/reagent_containers/inhaler_advanced.dm +++ b/code/modules/reagents/reagent_containers/inhaler_advanced.dm @@ -20,21 +20,8 @@ center_of_mass = null storage_slot_sort_by_name = TRUE -/obj/item/reagent_containers/personal_inhaler_cartridge/on_reagent_change() - update_icon() - return - -/obj/item/reagent_containers/personal_inhaler_cartridge/update_icon() - ClearOverlays() - var/rounded_vol = round(reagents.total_volume, round(reagents.maximum_volume / (volume / 5))) - - if(reagents.total_volume) - var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)][rounded_vol]") - filling.color = reagents.get_color() - AddOverlays(filling) - -/obj/item/reagent_containers/personal_inhaler_cartridge/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/reagent_containers/personal_inhaler_cartridge/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if (distance > 2) return @@ -50,6 +37,19 @@ else . += SPAN_NOTICE("The cartridge seems spent.") +/obj/item/reagent_containers/personal_inhaler_cartridge/on_reagent_change() + update_icon() + return + +/obj/item/reagent_containers/personal_inhaler_cartridge/update_icon() + ClearOverlays() + var/rounded_vol = round(reagents.total_volume, round(reagents.maximum_volume / (volume / 5))) + + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)][rounded_vol]") + filling.color = reagents.get_color() + AddOverlays(filling) + /obj/item/reagent_containers/personal_inhaler_cartridge/attack_self(mob/user as mob) if(is_open_container()) if(LAZYLEN(reagents.reagent_volumes)) @@ -102,8 +102,8 @@ origin_tech = list(TECH_BIO = 2, TECH_MATERIAL = 2) var/eject_when_empty = FALSE -/obj/item/personal_inhaler/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/personal_inhaler/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance > 2) return if(stored_cartridge) diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index ce2eadb168e..c61214c40cd 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -118,7 +118,10 @@ /obj/item/reagent_containers/pill/cyanide icon_state = "pill5" reagents_to_add = list(/singleton/reagent/toxin/cyanide = 50) - desc_antag = "A cyanide pill. Deadly if swallowed." + +/obj/item/reagent_containers/pill/cyanide/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "A cyanide pill. Deadly if swallowed." /obj/item/reagent_containers/pill/adminordrazine name = "Adminordrazine Pill" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 18cb9ce6dfb..d8826e2ae85 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -25,6 +25,11 @@ var/safety = 0 var/spray_sound = 'sound/effects/spray2.ogg' +/obj/item/reagent_containers/spray/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(is_adjacent) + . += "[round(reagents.total_volume)] units left." + /obj/item/reagent_containers/spray/Initialize() . = ..() src.verbs -= /obj/item/reagent_containers/verb/set_APTFT @@ -113,11 +118,6 @@ spray_size = next_in_list(spray_size, spray_sizes) to_chat(user, SPAN_NOTICE("You adjusted the pressure nozzle. You'll now use [amount_per_transfer_from_this] units per spray, with a [spray_size] lane spray.")) -/obj/item/reagent_containers/spray/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(is_adjacent) - . += "[round(reagents.total_volume)] units left." - /obj/item/reagent_containers/spray/verb/empty() set name = "Empty Spray Bottle" @@ -178,8 +178,8 @@ safety = 1 reagents_to_add = list(/singleton/reagent/capsaicin/condensed = 40) -/obj/item/reagent_containers/spray/pepper/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/reagent_containers/spray/pepper/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(is_adjacent) . += "The safety is [safety ? "on" : "off"]." diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 03b6a0009e2..1a07d253ea1 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -9,7 +9,6 @@ /obj/item/reagent_containers/syringe name = "syringe" desc = "A syringe." - desc_info = "This tool can be used to reinflate a collapsed lung. To do this, activate grab intent, select the patient's chest, then click on them. It will hurt a lot, but it will buy time until surgery can be performed." icon = 'icons/obj/item/reagent_containers/syringe.dmi' contained_sprite = TRUE icon_state = "0" @@ -32,7 +31,6 @@ var/list/datum/disease2/disease/viruses var/time = 30 - var/last_jab = 0 //Spam prevention center_of_mass = null @@ -42,6 +40,14 @@ ///Boolean, if this syringe gets dirty (and consequently infects people when reused) var/gets_dirty = TRUE +/obj/item/reagent_containers/syringe/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "This tool can be used to reinflate a collapsed lung. To do this, activate grab intent, select the patient's chest, then click on them. It will hurt a lot, but it will buy time until surgery can be performed." + +/obj/item/reagent_containers/syringe/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can use a syringe to inject phoron into both power cells and light bulbs to rig them to explode when used." + /obj/item/reagent_containers/syringe/Initialize() . = ..() update_icon() diff --git a/code/modules/reagents/reagent_containers/welding_backpack.dm b/code/modules/reagents/reagent_containers/welding_backpack.dm index 81663198dbd..adcdcaebd85 100644 --- a/code/modules/reagents/reagent_containers/welding_backpack.dm +++ b/code/modules/reagents/reagent_containers/welding_backpack.dm @@ -15,8 +15,8 @@ drop_sound = 'sound/items/drop/backpack.ogg' pickup_sound = 'sound/items/pickup/backpack.ogg' -/obj/item/reagent_containers/weldpack/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/reagent_containers/weldpack/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(ishuman(loc) && user != loc) // what if we want to sneak some reagents out of somewhere? return if(reagents.total_volume) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 6a75f969de1..edfb82f4fd8 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -1,8 +1,6 @@ /obj/structure/reagent_dispensers name = "strange dispenser" desc = "What the fuck is this?" - desc_info = "Use HELP intent to fill a container in your hand from this, and use any other intent to empty the container into this. \ - You can right-click this and change the amount transferred per use." icon = 'icons/obj/reagent_dispensers.dmi' icon_state = "watertank" density = 1 @@ -15,18 +13,22 @@ var/can_tamper = TRUE var/is_leaking = FALSE +/obj/structure/reagent_dispensers/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Use Help intent to fill a container in your hand from this, and use any other intent to empty the container into this." + . += "Right-click this to change the amount transferred per use." + +/obj/structure/reagent_dispensers/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 2) + return + . += SPAN_NOTICE("It contains [reagents.total_volume] units of reagents.") + /obj/structure/reagent_dispensers/Initialize() . = ..() create_reagents(capacity) if (!possible_transfer_amounts) src.verbs -= /obj/structure/reagent_dispensers/verb/set_APTFT - desc_info = "" - -/obj/structure/reagent_dispensers/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 2) - return - . += SPAN_NOTICE("It contains [reagents.total_volume] units of reagents.") /obj/structure/reagent_dispensers/verb/set_APTFT() //set amount_per_transfer_from_this set name = "Set transfer amount" @@ -128,8 +130,8 @@ var/obj/item/device/assembly_holder/rig = null reagents_to_add = list(/singleton/reagent/fuel = 1000) -/obj/structure/reagent_dispensers/fueltank/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/structure/reagent_dispensers/fueltank/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance > 2) return if (is_leaking) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index e18c6c9f26f..5183dff6d77 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -13,6 +13,14 @@ var/label_x var/tag_x +/obj/structure/bigDelivery/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 4) + if(sortTag) + . += SPAN_NOTICE("It is labeled \"[sortTag]\".") + if(examtext) + . += SPAN_NOTICE("It has a note attached which reads, \"[examtext]\".") + /obj/structure/bigDelivery/attack_hand(mob/user as mob) unwrap() @@ -108,14 +116,6 @@ I.pixel_y = -3 AddOverlays(I) -/obj/structure/bigDelivery/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 4) - if(sortTag) - . += SPAN_NOTICE("It is labeled \"[sortTag]\".") - if(examtext) - . += SPAN_NOTICE("It has a note attached which reads, \"[examtext]\".") - /obj/item/smallDelivery desc = "A small wrapped package." name = "small parcel" @@ -203,6 +203,14 @@ playsound(src, pick('sound/bureaucracy/pen1.ogg','sound/bureaucracy/pen2.ogg'), 20) return +/obj/item/smallDelivery/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 4) + if(sortTag) + . += SPAN_NOTICE("It is labeled \"[sortTag]\".") + if(examtext) + . += SPAN_NOTICE("It has a note attached which reads, \"[examtext]\".") + /obj/item/smallDelivery/update_icon() ClearOverlays() if((nameset || examtext) && icon_state != "deliverycrate1") @@ -228,14 +236,6 @@ I.pixel_y = -3 AddOverlays(I) -/obj/item/smallDelivery/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 4) - if(sortTag) - . += SPAN_NOTICE("It is labeled \"[sortTag]\".") - if(examtext) - . += SPAN_NOTICE("It has a note attached which reads, \"[examtext]\".") - /obj/structure/bigDelivery/Destroy() if(wrapped) //sometimes items can disappear. For example, bombs. --rastaf0 wrapped.forceMove((get_turf(loc))) diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index cbce02fb55e..b8320ab0596 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -44,8 +44,11 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). ///The timer id for the build callback, if we're building something var/build_callback_timer - component_hint_bin = "Upgraded matter bins will increase material storage capacity." - component_hint_servo = "Upgraded manipulators will improve material use efficiency and increase fabrication speed." + +/obj/machinery/r_n_d/circuit_imprinter/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will increase material storage capacity." + . += "Upgraded manipulators will improve material use efficiency and increase fabrication speed." /obj/machinery/r_n_d/circuit_imprinter/RefreshParts() ..() diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index ccdc978a086..ac96f9b70cc 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -23,9 +23,11 @@ Note: Must be placed within 3 tiles of the R&D Console /obj/item/stock_parts/micro_laser ) - component_hint_laser = "Upgraded micro-lasers will increase data gathered from destructive analysis." - component_hint_scan = "Upgraded scanning modules will increase data gathered from destructive analysis." - component_hint_servo = "Upgraded manipulators will increase data gathered from destructive analysis." +/obj/machinery/r_n_d/destructive_analyzer/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded micro-lasers will increase data gathered from destructive analysis." + . += "Upgraded scanning modules will increase data gathered from destructive analysis." + . += "Upgraded manipulators will increase data gathered from destructive analysis." /obj/machinery/r_n_d/destructive_analyzer/RefreshParts() ..() diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 3b5c4603548..868260b1503 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -35,8 +35,10 @@ /obj/item/reagent_containers/glass/beaker = 2 ) - component_hint_bin = "Upgraded matter bins will increase material storage capacity." - component_hint_servo = "Upgraded manipulators will improve material use efficiency and increase fabrication speed." +/obj/machinery/r_n_d/protolathe/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded matter bins will increase material storage capacity." + . += "Upgraded manipulators will improve material use efficiency and increase fabrication speed." ///Returns the total of all the stored materials /obj/machinery/r_n_d/protolathe/proc/TotalMaterials() diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index a3651588cb4..2b2dc65baeb 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -250,20 +250,20 @@ GLOBAL_LIST_EMPTY(designs_imprinter_categories) matter = list(DEFAULT_WALL_MATERIAL = 30, MATERIAL_GLASS = 10) var/datum/tech/stored +/obj/item/disk/tech_disk/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + if(stored) + . += "It is storing the following tech:" + . += " - [stored.name]: Level - [stored.level] | Progress - [stored.next_level_progress]/[stored.next_level_threshold]" + else + . += "It doesn't have any tech stored." + /obj/item/disk/tech_disk/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) -/obj/item/disk/tech_disk/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - if(stored) - . += FONT_SMALL("It is storing the following tech:") - . += FONT_SMALL(" - [stored.name]: Level - [stored.level] | Progress - [stored.next_level_progress]/[stored.next_level_threshold]") - else - . += FONT_SMALL("It doesn't have any tech stored.") - /obj/item/disk/design_disk name = "component design disk" desc = "A disk for storing device design data for construction in lathes." @@ -274,16 +274,16 @@ GLOBAL_LIST_EMPTY(designs_imprinter_categories) matter = list(DEFAULT_WALL_MATERIAL = 30, MATERIAL_GLASS = 10) var/datum/design/blueprint +/obj/item/disk/design_disk/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 1) + if(blueprint) + . += "It is storing the following design:" + . += " - [blueprint.name]" + else + . += "It doesn't have any blueprint stored." + /obj/item/disk/design_disk/Initialize(mapload) . = ..() pixel_x = rand(-5, 5) pixel_y = rand(-5, 5) - -/obj/item/disk/design_disk/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 1) - if(blueprint) - . += FONT_SMALL("It is storing the following design:") - . += FONT_SMALL(" - [blueprint.name]") - else - . += FONT_SMALL("It doesn't have any blueprint stored.") diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 0822202f515..50bbe1d7a9b 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -22,10 +22,12 @@ /obj/item/stack/cable_coil = 2 ) - component_hint_scan = "Upgraded scanning modules will reduce active power usage." - parts_power_mgmt = FALSE +/obj/machinery/r_n_d/server/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded scanning modules will reduce active power usage." + /obj/machinery/r_n_d/server/Destroy() for(var/obj/machinery/r_n_d/tech_processor/TP as anything in linked_processors) TP.set_server(null) diff --git a/code/modules/research/tech_processor.dm b/code/modules/research/tech_processor.dm index cc90aef36a2..ef1b15f2171 100644 --- a/code/modules/research/tech_processor.dm +++ b/code/modules/research/tech_processor.dm @@ -18,10 +18,12 @@ var/heat_delay = 10 - component_hint_scan = "Upgraded scanning modules will increase speed at which research calculations are made and reduce active power usage." - parts_power_mgmt = FALSE +/obj/machinery/r_n_d/tech_processor/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded scanning modules will increase speed at which research calculations are made and reduce active power usage." + /obj/machinery/r_n_d/tech_processor/Destroy() set_server(null) return ..() diff --git a/code/modules/research/weaponsanalyzer.dm b/code/modules/research/weaponsanalyzer.dm index 8dc1c5147b9..249c5762dcf 100644 --- a/code/modules/research/weaponsanalyzer.dm +++ b/code/modules/research/weaponsanalyzer.dm @@ -13,8 +13,8 @@ /obj/item/stock_parts/console_screen = 1 ) -/obj/machinery/r_n_d/weapons_analyzer/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/machinery/r_n_d/weapons_analyzer/feedback_hints(mob/user, distance, is_adjacent) + . += ..() . += SPAN_NOTICE("It has [item ? "[item.name]" : "nothing"] attached.") /obj/machinery/r_n_d/weapons_analyzer/attackby(obj/item/attacking_item, mob/user) diff --git a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm index 703fdf3f88a..142c0351650 100644 --- a/code/modules/research/xenoarchaeology/tools/suspension_generator.dm +++ b/code/modules/research/xenoarchaeology/tools/suspension_generator.dm @@ -14,6 +14,10 @@ var/obj/item/cell/cell var/obj/effect/suspension_field/suspension_field +/obj/effect/suspension_field/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += SPAN_NOTICE("You can see something floating inside it:") + . += SPAN_NOTICE(english_list(contents)) /obj/machinery/suspension_gen/Initialize() . = ..() @@ -175,11 +179,6 @@ var/field_type = "chlorine" var/victim_number //number of mobs it affected, needed for generator powerdraw calc -/obj/effect/suspension_field/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += SPAN_NOTICE("You can see something floating inside it:") - . += SPAN_NOTICE(english_list(contents)) - /obj/effect/suspension_field/Initialize() . = ..() suspend_things() diff --git a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm index fa9f3f1ad0d..82eac0d361b 100644 --- a/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm +++ b/code/modules/research/xenoarchaeology/tools/tools_coresampler.dm @@ -23,8 +23,8 @@ w_class = WEIGHT_CLASS_TINY var/obj/item/sample -/obj/item/device/core_sampler/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/device/core_sampler/feedback_hints(mob/user, distance, is_adjacent) + . += ..() if(distance <= 2) . += SPAN_NOTICE("This one is [sample ? "full" : "empty"].") diff --git a/code/modules/shieldgen/shield_diffuser.dm b/code/modules/shieldgen/shield_diffuser.dm index 2c67eb83bb2..2f2564e4c4a 100644 --- a/code/modules/shieldgen/shield_diffuser.dm +++ b/code/modules/shieldgen/shield_diffuser.dm @@ -17,6 +17,10 @@ var/diffuser_enabled = TRUE var/diffuser_range = 0 // 1x1 tiles, including the tile its on. +/obj/machinery/shield_diffuser/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "It is [diffuser_enabled ? "diffuser_enabled" : "disabled"]." + /obj/machinery/shield_diffuser/process() if(stat & BROKEN) return PROCESS_KILL @@ -49,10 +53,6 @@ update_icon() to_chat(user, "You turn \the [src] [diffuser_enabled ? "on" : "off"].") -/obj/machinery/shield_diffuser/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "It is [diffuser_enabled ? "diffuser_enabled" : "disabled"]." - /obj/machinery/shield_diffuser/power_change() ..() update_icon() diff --git a/code/modules/shuttles/shuttle_console.dm b/code/modules/shuttles/shuttle_console.dm index 082c53a7f9e..002a7e10926 100644 --- a/code/modules/shuttles/shuttle_console.dm +++ b/code/modules/shuttles/shuttle_console.dm @@ -1,7 +1,5 @@ /obj/machinery/computer/shuttle_control name = "shuttle control console" - desc_antag = "Consoles like these are typically access-locked.\ - You can remove this lock with wirecutters, but it would take awhile! Alternatively, you can also use a cryptographic sequencer (emag) for instant removal." icon_screen = "shuttle" icon_keyboard = "cyan_key" icon_keyboard_emis = "cyan_key_mask" @@ -17,6 +15,14 @@ /// For hotwiring, how many cycles are needed. This decreases by 1 each cycle and triggers at 0 var/hotwire_progress = 8 +/obj/machinery/computer/shuttle_control/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(initial(hotwire_progress) != hotwire_progress) + if(hotwire_progress != 0) + . += SPAN_NOTICE("The bottom panel appears open with wires hanging out. It can be repaired with additional cabling. Current progress: [(hotwire_progress / initial(hotwire_progress)) * 100]%") + else + . += SPAN_NOTICE("The bottom panel appears open with wires hanging out. It can be repaired with additional cabling.") + /obj/machinery/computer/shuttle_control/Initialize() . = ..() if(SSshuttle.shuttles[shuttle_tag]) @@ -204,14 +210,6 @@ for(var/obj/item/clothing/head/helmet/pilot/PH as anything in linked_helmets) PH.set_hud_maptext("Shuttle Status: [shuttle_status]") -/obj/machinery/computer/shuttle_control/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(initial(hotwire_progress) != hotwire_progress) - if(hotwire_progress != 0) - . += SPAN_ITALIC("The bottom panel appears open with wires hanging out. It can be repaired with additional cabling. Current progress: [(hotwire_progress / initial(hotwire_progress)) * 100]%") - else - . += SPAN_ITALIC("The bottom panel appears open with wires hanging out. It can be repaired with additional cabling.") - /obj/machinery/computer/shuttle_control/emag_act(var/remaining_charges, var/mob/user, var/emag_source, var/hotwired = FALSE) if(emagged) to_chat(user, SPAN_WARNING("\The [src] has already been subverted.")) diff --git a/code/modules/spell_system/artifacts/items/lich_phylactery.dm b/code/modules/spell_system/artifacts/items/lich_phylactery.dm index 22043933151..e96579f15b4 100644 --- a/code/modules/spell_system/artifacts/items/lich_phylactery.dm +++ b/code/modules/spell_system/artifacts/items/lich_phylactery.dm @@ -12,6 +12,13 @@ var/lich = null +/obj/item/phylactery/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(!lich) + . += "The heart is inert." + else + . += "The heart is pulsing slowly." + /obj/item/phylactery/Initialize() . = ..() GLOB.world_phylactery += src @@ -22,13 +29,6 @@ lich = null return ..() -/obj/item/phylactery/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(!lich) - . += "The heart is inert." - else - . += "The heart is pulsing slowly." - /obj/item/phylactery/attackby(obj/item/attacking_item, mob/user) ..() if(istype(attacking_item, /obj/item/nullrod)) diff --git a/code/modules/spell_system/artifacts/items/poppet.dm b/code/modules/spell_system/artifacts/items/poppet.dm index 3bba3855fcc..67616a5c4fe 100644 --- a/code/modules/spell_system/artifacts/items/poppet.dm +++ b/code/modules/spell_system/artifacts/items/poppet.dm @@ -10,16 +10,16 @@ var/cooldown_time = 120 var/cooldown = 0 +/obj/item/poppet/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(countenance) + . += SPAN_NOTICE("It is modeled after a [countenance].") + /obj/item/poppet/Destroy() if(target) to_chat(target, SPAN_NOTICE("The strange presence vanishes away...")) return ..() -/obj/item/poppet/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(countenance) - . += SPAN_NOTICE("It is modeled after a [countenance].") - /obj/item/poppet/afterattack(var/atom/A, var/mob/user, var/proximity) if(!proximity) diff --git a/code/modules/supermatter/supermatter.dm b/code/modules/supermatter/supermatter.dm index e111fcaf7b8..11aa7ac9992 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/code/modules/supermatter/supermatter.dm @@ -39,18 +39,6 @@ /obj/machinery/power/supermatter name = "supermatter crystal" desc = "A strangely translucent and iridescent crystal. You get headaches just from looking at it." - desc_info = "When energized by a laser (or something hitting it), it emits radiation and heat. If the heat reaches above 7000 kelvin, it will send an alert and start taking damage. \ - After integrity falls to zero percent, it will delaminate, causing a massive explosion, station-wide radiation spikes, and hallucinations. \ - Supermatter reacts badly to oxygen in the atmosphere. It'll also heat up really quick if it is in vacuum.
\ -
\ - Supermatter cores are extremely dangerous to be close to, and requires protection to handle properly. The protection you will need is:
\ - Optical meson scanners on your eyes, to prevent hallucinations when looking at the supermatter.
\ - Radiation helmet and suit, as the supermatter is radioactive.
\ -
\ - Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you." - desc_antag = "Always ahelp before sabotaging the supermatter, as it can potentially ruin the round. Exposing the supermatter to oxygen or vaccuum will cause it to start rapidly heating up. \ - Sabotaging the supermatter and making it explode will cause a period of lag as the explosion is processed by the server, as well as irradiating the entire station and causing hallucinations to happen. \ - Wearing radiation equipment will protect you from most of the delamination effects sans explosion." icon = 'icons/obj/supermatter.dmi' icon_state = "supermatter" density = TRUE @@ -118,6 +106,18 @@ /// cooldown tracker for accent sounds, var/last_accent_sound = 0 +/obj/machinery/power/supermatter/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "When energized by a laser (or something hitting it), it emits radiation and heat. If the heat reaches above 7000 kelvin, it will send an alert and start taking damage." + . += "After integrity falls to zero percent, it will delaminate, causing a massive explosion, station-wide radiation spikes, and hallucinations." + . += "Supermatter reacts badly to oxygen in the atmosphere. It'll also heat up really quick if it is in vacuum." + . += "Supermatter cores are extremely dangerous to be close to, and requires protection to handle properly. Safety goggles and full rad suits are needed to protect against both hallucinations and radiation." + . += "Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you." + +/obj/machinery/power/supermatter/antagonist_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Always ahelp before sabotaging the supermatter, as it can potentially ruin the round." + /obj/machinery/power/supermatter/Initialize() . = ..() radio = new /obj/item/device/radio{channels=list("Engineering")}(src) diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index d8b1e6680a9..14e92fdf45c 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -20,7 +20,7 @@ var/maxhealth = 10 var/health = 10 - // For racks. + // For racks (which cannot be either of these things) var/can_reinforce = 1 var/can_plate = 1 @@ -33,6 +33,62 @@ var/list/connections = list("nw0", "ne0", "sw0", "se0") +/obj/structure/table/condition_hints(mob/user, distance, is_adjacent) + . += ..() + if(health < maxhealth) + switch(health / maxhealth) + if(0.0 to 0.5) + . += SPAN_WARNING("It looks severely damaged!") + if(0.25 to 0.5) + . += SPAN_WARNING("It looks damaged!") + if(0.5 to 1.0) + . += SPAN_NOTICE("It has a few scrapes and dents.") + +/obj/structure/table/mechanics_hints() + . = list() + . += ..() + . += "Straight tables, so long as they're not too heavy or reinforced, can be flipped over with a verb when adjacent to them!" + +/obj/structure/table/assembly_hints() + . = list() + . += ..() + // Rule racks out entirely first. + if(!can_reinforce || !can_plate) + return FALSE + + if(health < maxhealth) + . += "It could be repaired with a few choice welds... no matter what its made of!" + + // Needs to be plated before it can be carpeted + if(material && !carpeted) + . += "It could be surfaced with some carpet." + // Needs to be plated before it can be reinforced + if(material) + . += "It could be reinforced with a stack of an appropriate material." + // Needs to be plated before we can do much of anything + else + . += "It could be plated with a stack of an appropriate material." + +/obj/structure/table/disassembly_hints() + . = list() + . += ..() + // Rule racks out entirely first. If we ever let them be customized/have health, update this. + if(!can_reinforce || !can_plate) + . += "It is held together by a couple of bolts." + + // Has a carpet + if(carpeted) + . += "Its carpeted surface could be pried loose." + // Has reinforcements + if(reinforced) + . += "Its reinforcements have been securely screwed into place." + // Is not reinforced or carpeted, but is plated + else if(material && !carpeted) + . += "Its plating is secured by a couple of bolts." + // Table naked!!! + else if(!material) + . += "It is held together by a couple of bolts." + /obj/structure/table/proc/update_material() var/old_maxhealth = maxhealth if(!material) @@ -77,7 +133,6 @@ if(3.0) take_damage(rand(50,150), FALSE) - /obj/structure/table/Initialize() if(table_mat) material = SSmaterials.get_material_by_name(table_mat) @@ -119,17 +174,6 @@ T.queue_icon_update() return ..() -/obj/structure/table/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(health < maxhealth) - switch(health / maxhealth) - if(0.0 to 0.5) - . += SPAN_WARNING("It looks severely damaged!") - if(0.25 to 0.5) - . += SPAN_WARNING("It looks damaged!") - if(0.5 to 1.0) - . += SPAN_NOTICE("It has a few scrapes and dents.") - /obj/structure/table/proc/reinforce_table(obj/item/stack/material/S, mob/user) if(reinforced) to_chat(user, SPAN_WARNING("\The [src] is already reinforced!")) @@ -305,15 +349,15 @@ var/tabledirs = 0 for(var/direction in list(turn(dir,90), turn(dir,-90)) ) var/obj/structure/table/T = locate(/obj/structure/table ,get_step(src,direction)) - if (T && T.flipped == 1 && T.dir == src.dir && material && T.material && T.material.name == material.name) + if(T && T.flipped == 1 && T.dir == src.dir && material && T.material && T.material.name == material.name) type++ tabledirs |= direction type = "[type]" - if (type=="1") - if (tabledirs & turn(dir,90)) + if(type=="1") + if(tabledirs & turn(dir,90)) type += "-" - if (tabledirs & turn(dir,-90)) + if(tabledirs & turn(dir,-90)) type += "+" if(material) diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm index bea680aad16..c43f893cc7f 100644 --- a/code/modules/telesci/telepad.dm +++ b/code/modules/telesci/telepad.dm @@ -18,9 +18,12 @@ /obj/item/stack/cable_coil{amount = 1} ) - component_hint_cap = "Upgraded capacitors will improve the power efficiency of the telepad." parts_power_mgmt = FALSE +/obj/machinery/telepad/upgrade_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Upgraded capacitors will improve the power efficiency of the telepad." + /obj/machinery/telepad/RefreshParts() ..() var/E @@ -126,8 +129,8 @@ var/emagged = 0 var/teleporting = 0 -/obj/item/rcs/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/rcs/feedback_hints(mob/user, distance, is_adjacent) + . += ..() . += "There are [rcharges] charge\s left." /obj/item/rcs/process() diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm index d6537e30c10..0caf8293d42 100644 --- a/code/modules/telesci/telesci_computer.dm +++ b/code/modules/telesci/telesci_computer.dm @@ -100,6 +100,10 @@ */ var/obj/effect/portal/destination_portal +/obj/machinery/computer/telescience/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + . += "There are [length(crystals) ? length(crystals) : "no"] bluespace crystal\s in the crystal slots." + /obj/machinery/computer/telescience/Initialize() . = ..() @@ -143,11 +147,6 @@ return ..() -/obj/machinery/computer/telescience/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - . += "There are [length(crystals) ? length(crystals) : "no"] bluespace crystal\s in the crystal slots." - - /obj/machinery/computer/telescience/attackby(obj/item/attacking_item, mob/user, params) if(istype(attacking_item, /obj/item/bluespace_crystal)) diff --git a/code/modules/vehicles/animal.dm b/code/modules/vehicles/animal.dm index 6145f0c84a0..5b881a833e7 100644 --- a/code/modules/vehicles/animal.dm +++ b/code/modules/vehicles/animal.dm @@ -1,8 +1,6 @@ /obj/vehicle/animal name = "animal" desc = "Base type of rideable animals - you shouldn't be seeing this!" - desc_info = "Click-drag yourself onto the animal to climb onto it.
\ - - Click-drag it onto yourself to access its mounted storage.
" load_item_visible = 1 mob_offset_y = 5 health = 100 @@ -37,6 +35,11 @@ BOMB = ARMOR_BOMB_MINOR ) +/obj/vehicle/animal/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click-drag yourself onto the animal to climb onto it." + . += "Click-drag it onto yourself to access its mounted storage." + /obj/vehicle/animal/setup_vehicle() ..() on = TRUE @@ -180,8 +183,6 @@ desc = "A rideable beast of burden, large enough for one adult rider only but perfectly adapted for the rough terrain on Adhomai. This one has a saddle mounted on it." icon = 'icons/mob/npc/adhomai_48.dmi' icon_state = "climber_s" - desc_info = "Click-drag yourself onto the animal to climb onto it.
\ - - Click-drag it onto yourself to access its mounted storage.
" pixel_x = -8 mob_offset_y = 8 land_speed = 2 @@ -208,8 +209,6 @@ desc = "Large herbivorous reptiles native to Moghes, the azkrazal or 'threshbeast' is commonly used as a mount, beast of burden, or convenient food source by Unathi. They are highly valued for their speed and strength, capable of running at 30-42 miles per hour at top speed. This one has been fitted with a saddle." icon = 'icons/mob/npc/moghes_64.dmi' icon_state = "threshbeast_s" - desc_info = "Click-drag yourself onto the animal to climb onto it.
\ - - Click-drag it onto yourself to access its mounted storage.
" pixel_x = -15 mob_offset_y = 10 land_speed = 2 @@ -227,8 +226,6 @@ desc = "A large species of herbivorous horned reptiles native to Moghes, the hegeranzi or 'warmount' is commonly used as mount or beast of war by the Unathi. They are highly valued for their speed, aggression, and fearsome horns. This one seems to have been fitted with a saddle." icon = 'icons/mob/npc/moghes_64.dmi' icon_state = "warmount_s" - desc_info = "Click-drag yourself onto the animal to climb onto it.
\ - - Click-drag it onto yourself to access its mounted storage.
" pixel_x = -14 mob_offset_y = 12 diff --git a/code/modules/vehicles/bike.dm b/code/modules/vehicles/bike.dm index 26b79f83b3d..ce5d65505d6 100644 --- a/code/modules/vehicles/bike.dm +++ b/code/modules/vehicles/bike.dm @@ -1,15 +1,6 @@ /obj/vehicle/bike name = "space-bike" desc = "Space wheelies! Woo!" - desc_info = "\ - - Click-drag yourself onto the bike to climb onto it.
\ - - Click-drag it onto yourself to access its mounted storage.
\ - - CTRL-click the bike to toggle the engine.
\ - - Click the bike with a key to put it in, and click the bike with empty hand to take it out. The bike won't run without a key.
\ - - ALT-click to toggle the kickstand which prevents movement by driving and dragging.
\ - - Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the bike.
\ - - Use walk intent to move around carefully, or run intent to go fast, and risk crashing into other people or bikes.
\ - " icon = 'icons/obj/vehicle/bike.dmi' icon_state = "bike_off" dir = SOUTH @@ -58,6 +49,25 @@ /// otherwise it will be an unusable prop. var/spawns_with_key = TRUE +/obj/vehicle/bike/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click-drag yourself onto the bike to climb onto it." + . += "Click-drag it onto yourself to access its mounted storage." + . += "Click the bike with a key to put it in, and click the bike with empty hand to take it out. The bike won't run without a key." + . += "CTRL-click the bike to toggle the engine." + . += "ALT-click to toggle the kickstand which prevents movement by driving and dragging." + . += "Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the bike." + . += "Use walk intent to move around carefully, or run intent to go fast, and risk crashing into other people or bikes." + +/obj/vehicle/bike/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance <= 4) + . += "\The [src] has a small registration plate on the back, '[registration_plate]'." + if(key) + . += "\The [src] has \a [key] in." + else + . += "\The [src] does not have a key in." + /obj/vehicle/bike/Destroy() QDEL_NULL(key) QDEL_NULL(ion) @@ -77,15 +87,6 @@ key = new key_type(src) key.key_data = registration_plate -/obj/vehicle/bike/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance <= 4) - . += "\The [src] has a small registration plate on the back, '[registration_plate]'." - if(key) - . += "\The [src] has \a [key] in." - else - . += "\The [src] does not have a key in." - /obj/vehicle/bike/proc/generate_registration_plate() registration_plate = "[rand(100,999)]-[rand(1000,9999)]" @@ -349,7 +350,6 @@ /obj/vehicle/bike/monowheel name = "adhomian monowheel" desc = "A one-wheeled vehicle, fairly popular with Little Adhomai's greasers." - desc_info = "Drag yourself onto the monowheel to mount it, toggle the engine to be able to drive around. Deploy the kickstand to prevent movement by driving and dragging. Drag it onto yourself to access its mounted storage. Resist to get off." icon_state = "monowheel_off" health = 250 diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index d4852b87f0c..6b305fd7972 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -1,13 +1,6 @@ /obj/vehicle/train/cargo/engine name = "cargo train tug" desc = "A ridable electric car designed for pulling cargo trolleys." - desc_info = "Click-drag yourself onto the truck to climb onto it.
\ - - CTRL-click the truck to open the ignition and controls menu.
\ - - ALT-click the truck to remove the key from the ignition.
\ - - Click the truck to open a UI menu.
\ - - Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the truck.
\ - - If latched, you can use a wrench to unlatch.
\ - - Click-drag on a trolley to latch and tow it." icon = 'icons/obj/vehicles.dmi' icon_state = "cargo_engine" on = 0 @@ -25,6 +18,26 @@ var/obj/item/key/key var/key_type = /obj/item/key/cargo_train +/obj/vehicle/train/cargo/engine/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "Click-drag yourself onto the truck to climb onto it." + . += "CTRL-click the truck to open the ignition and controls menu." + . += "ALT-click the truck to remove the key from the ignition." + . += "Click the truck to open a UI menu." + . += "Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the truck." + . += "If latched, you can use a wrench to unlatch." + . += "Click-drag on a trolley to latch and tow it." + +/obj/vehicle/train/cargo/engine/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(distance > 1) + return + if(!ishuman(user)) + return + + . += "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." + . += "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%." + /obj/item/key/cargo_train name = "key" desc = "A keyring with a small steel key, and a yellow fob reading \"Choo Choo!\"." @@ -34,7 +47,6 @@ /obj/vehicle/train/cargo/trolley name = "cargo train trolley" - desc_info = "You can use a wrench to unlatch this, click-drag to link it to another trolley to tow." icon = 'icons/obj/vehicles.dmi' icon_state = "cargo_trailer" anchored = 0 @@ -46,6 +58,10 @@ load_offset_y = 5 mob_offset_y = 8 +/obj/vehicle/train/cargo/trolley/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + . += "You can use a wrench to unlatch this, click-drag to link it to another trolley to tow." + //------------------------------------------- // Standard procs //------------------------------------------- @@ -254,17 +270,6 @@ else return ..() -/obj/vehicle/train/cargo/engine/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(distance > 1) - return - - if(!ishuman(user)) - return - - . += "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition." - . += "The charge meter reads [cell? round(cell.percent(), 0.01) : 0]%." - /obj/vehicle/train/cargo/engine/CtrlClick(mob/user) if(load && load != user) to_chat(user, SPAN_WARNING("You can't interact with \the [src] while it's in use.")) diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index 2a441808334..b80b2ba432c 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -19,6 +19,12 @@ can_hold_mob = TRUE +/obj/vehicle/train/feedback_hints(mob/user, distance, is_adjacent) + . += ..() + if(lead) + . += SPAN_NOTICE("It is being towed by \the [lead] in the [dir2text(get_dir(src, lead))].") + if(tow) + . += SPAN_NOTICE("It towing \the [tow] in the [dir2text(get_dir(src, tow))].") //------------------------------------------- // Standard procs @@ -28,13 +34,6 @@ for(var/obj/vehicle/train/T in orange(1, src)) latch(T) -/obj/vehicle/train/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() - if(lead) - . += SPAN_NOTICE("It is being towed by \the [lead] in the [dir2text(get_dir(src, lead))].") - if(tow) - . += SPAN_NOTICE("It towing \the [tow] in the [dir2text(get_dir(src, tow))].") - /obj/vehicle/train/Move() var/old_loc = get_turf(src) . = ..() diff --git a/code/modules/vehicles/wasp_torpedo.dm b/code/modules/vehicles/wasp_torpedo.dm index c3f7139efc3..cc46cc92611 100644 --- a/code/modules/vehicles/wasp_torpedo.dm +++ b/code/modules/vehicles/wasp_torpedo.dm @@ -4,12 +4,6 @@ icon = 'icons/obj/wasp_torpedo.dmi' icon_state = "torpedo_off" - desc_info = "Click-drag yourself onto the torpedo to climb onto it.
\ - - CTRL-click the torpedo to toggle the engine.
\ - - ALT-click to toggle the kickstand which prevents movement by driving and dragging.
\ - - Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the torpedo.
\ - - CTRL-SHIFT-click to cause it to charge and detonate on impact." - health = 300 maxhealth = 300 @@ -33,6 +27,15 @@ var/primmed = FALSE +/obj/vehicle/bike/wasp_torpedo/mechanics_hints(mob/user, distance, is_adjacent) + . += ..() + // Not the fun kind of bike. Don't inherit. + . += "Click-drag yourself onto the torpedo to climb onto it." + . += "CTRL-click the torpedo to toggle the engine." + . += "ALT-click to toggle the kickstand which prevents movement by driving and dragging." + . += "Click the resist button or type \"resist\" in the command bar at the bottom of your screen to get off the torpedo." + . += "CTRL-SHIFT-click to cause it to charge and detonate on impact." + /obj/vehicle/bike/wasp_torpedo/collide_act(var/atom/movable/AM) if(!AM.density) return diff --git a/html/changelogs/Bat-ExamineBlocks.yml b/html/changelogs/Bat-ExamineBlocks.yml new file mode 100644 index 00000000000..5e9e6ee8e30 --- /dev/null +++ b/html/changelogs/Bat-ExamineBlocks.yml @@ -0,0 +1,60 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# - (fixes bugs) +# wip +# - (work in progress) +# qol +# - (quality of life) +# soundadd +# - (adds a sound) +# sounddel +# - (removes a sound) +# rscadd +# - (adds a feature) +# rscdel +# - (removes a feature) +# imageadd +# - (adds an image or sprite) +# imagedel +# - (removes an image or sprite) +# spellcheck +# - (fixes spelling or grammar) +# experiment +# - (experimental change) +# balance +# - (balance changes) +# code_imp +# - (misc internal code change) +# refactor +# - (refactors code) +# config +# - (makes a change to the config files) +# admin +# - (makes changes to administrator tools) +# server +# - (miscellaneous changes to server) +################################# + +# Your name. +author: Batrachophrenoboocosmomachia + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - qol: "Examine text rewritten/broken into sections to make mechanics clearer and easier to access in-game." + - refactor: "Examine info now exists at atom-level, is handled by categorical functions after object definitions." + - bugfix: "Spotlights construction can now be completed rather than getting stuck at final construction stage." diff --git a/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm b/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm index 028a38e1ef8..2f0bdf21ae5 100644 --- a/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm +++ b/maps/away/ships/biesel/tcaf_corvette/tcaf_corvette.dmm @@ -8631,25 +8631,21 @@ /obj/item/book{ name = "\improper Tanakh"; icon_state = "torah"; - desc_antag = null; desc = "This is a copy of the Tanakh, the canonical collection of Hebrew scriptures revered in Judaism. It is composed of the Torah, the Nevi'im, and the Ketuvim. The left of each page is written in Hebrew, and the right reads the Tau Ceti Basic translation." }, /obj/item/book{ name = "\improper Nygaard Translation Bible"; icon_state = "bible"; - desc_antag = null; desc = "This is a copy of the Bible, the holy text of Christianity, with plain white-on-black text at the front declaring that it is the 2443 Ecumenical Tau Ceti Basic translation. On closer inspection, this one contains sixty-six books inside it, indicating that it is a Protestant variation of the book, written exclusively in Tau Ceti Basic." }, /obj/item/book{ name = "\improper Quran"; icon_state = "quran"; - desc_antag = null; desc = "This is the Quran. This is the holy text of Islam, believed by Muslims to be a revelation from God. The proper text of this copy is written in Quranic Arabic, with a Tau Ceti Basic translation in slightly smaller print to the side." }, /obj/item/book{ name = "\improper Reim-Dich Translation Bible"; icon_state = "bible"; - desc_antag = null; desc = "This is a copy of the Bible, the holy text of Christianity, embossed at the front with a fancy golden image of a crucifix. On closer inspection, this one contains seventy-three books inside it, indicating that it is a Catholic variation of the book. There are several notes dispersed throughout clarifying the original words in Latin Vulgate where they may not translate perfectly to Tau Ceti Basic." }, /obj/item/device/versebook/tribunal, diff --git a/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm b/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm index 3308f922cc8..928cdc25e0b 100644 --- a/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm +++ b/maps/away/ships/dominia/dominian_corvette/dominian_corvette.dmm @@ -6260,7 +6260,6 @@ }, /obj/item/storage/box/tea/tieguanyin{ desc = "A tin bearing the logo of a Dominian tea company located on Sun Reach. This one contains a bag of tieguanyin, a type of oolong tea."; - desc_info = null; pixel_x = 14; pixel_y = 3 }, diff --git a/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dmm b/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dmm index a785e0afb78..0f5bcc68b3f 100644 --- a/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dmm +++ b/maps/away/ships/elyra/elyra_corvette/elyra_corvette.dmm @@ -3597,7 +3597,6 @@ /obj/item/book{ name = "Quran"; icon_state = "holybook"; - desc_antag = null; desc = "This is the Quran. This is the holy text of Islam, believed by Muslims to be a revelation from God."; pixel_y = 3 }, diff --git a/maps/away/ships/tajara/circus/adhomian_circus_items.dm b/maps/away/ships/tajara/circus/adhomian_circus_items.dm index 8ac0941a5aa..ba22efdbf30 100644 --- a/maps/away/ships/tajara/circus/adhomian_circus_items.dm +++ b/maps/away/ships/tajara/circus/adhomian_circus_items.dm @@ -161,8 +161,8 @@ contained_sprite = TRUE var/weight = "10" -/obj/item/dumbbell/get_examine_text(mob/user, distance, is_adjacent, infix, suffix) - . = ..() +/obj/item/dumbbell/feedback_hints(mob/user, distance, is_adjacent) + . += ..() . += "It weighs [weight] kilograms." /obj/item/dumbbell/twenty