diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 614f6ef6cca..26823aabf9d 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -39,22 +39,23 @@ avoid code duplication. This includes items that may sometimes act as a standard if(!ismob(user)) return FALSE + var/selected_zone = user.zone_sel ? user.zone_sel.selecting : BP_CHEST var/operating = can_operate(src) if(operating == SURGERY_SUCCESS) if(do_surgery(src, user, I)) return TRUE else - return I.attack(src, user, user.zone_sel.selecting) //This is necessary to make things like health analyzers work. -mattatlas + return I.attack(src, user, selected_zone) //This is necessary to make things like health analyzers work. -mattatlas if(operating == SURGERY_FAIL) if(do_surgery(src, user, I, TRUE)) return TRUE else - return I.attack(src, user, user.zone_sel.selecting) + return I.attack(src, user, selected_zone) else - return I.attack(src, user, user.zone_sel.selecting) + return I.attack(src, user, selected_zone) /mob/living/carbon/human/attackby(obj/item/I, mob/user) - if(user == src && zone_sel.selecting == BP_MOUTH && can_devour(I, silent = TRUE)) + if(user == src && zone_sel?.selecting == BP_MOUTH && can_devour(I, silent = TRUE)) var/obj/item/blocked = src.check_mouth_coverage() if(blocked) to_chat(user, SPAN_WARNING("\The [blocked] is in the way!")) @@ -90,7 +91,7 @@ avoid code duplication. This includes items that may sometimes act as a standard ///////////////////////// user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.do_attack_animation(M) + user.do_attack_animation(M, src) if(!user.aura_check(AURA_TYPE_WEAPON, src, user)) return FALSE diff --git a/code/_onclick/rig.dm b/code/_onclick/rig.dm index 29514eef2ca..2b8419f6195 100644 --- a/code/_onclick/rig.dm +++ b/code/_onclick/rig.dm @@ -63,21 +63,19 @@ return loc == card /mob/living/proc/HardsuitClickOn(var/atom/A, var/alert_ai = 0) - if(!can_use_rig() || !canClick()) - return 0 + if(!can_use_rig()) + return FALSE + if(!canClick()) // return true to stop the initial click from going through if we're just on cooldown + return TRUE var/obj/item/rig/rig = get_rig() if(istype(rig) && !rig.offline && rig.selected_module) - if(src != rig.wearer) - if(rig.ai_can_move_suit(src, check_user_module = 1) && (rig.last_remote_message + 3 SECONDS < world.time)) - message_admins("[key_name_admin(src, include_name = 1)] is trying to force \the [key_name_admin(rig.wearer, include_name = 1)] to use a hardsuit module.") - rig.last_remote_message = world.time - else - return 0 - rig.selected_module.engage(A, alert_ai) + if(src != rig.wearer && !rig.ai_can_move_suit(src, TRUE)) + return FALSE + rig.selected_module.engage(A, src, alert_ai) if(ismob(A)) // No instant mob attacking - though modules have their own cooldowns setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - return 1 - return 0 + return TRUE + return FALSE #undef MIDDLE_CLICK #undef ALT_CLICK diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index 35c6d784188..83a09a7a9f2 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -240,15 +240,15 @@ var/obj/item/card/id/all_access/ghost_all_access return internal_id /mob/living/carbon/human/GetIdCard() - if(wear_id) - var/id = wear_id.GetID() - if(id) - return id var/obj/item/I = get_active_hand() if(I) var/id = I.GetID() if(id) return id + if(wear_id) + var/id = wear_id.GetID() + if(id) + return id if(gloves) var/id = gloves.GetID() if(id) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index b84fb2fcf9f..abd84b1d21c 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -61,15 +61,24 @@ /obj/item/tank/jetpack/verb/toggle_rockets() set name = "Toggle Jetpack Stabilization" set category = "Object" - src.stabilization_on = !( src.stabilization_on ) - to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") + + toggle_rockets_stabilization(usr) + +/obj/item/tank/jetpack/proc/toggle_rockets_stabilization(mob/user, var/list/message_mobs) + stabilization_on = !stabilization_on + to_chat(user, SPAN_NOTICE("You toggle \the [src]'s stabilization [stabilization_on ? "on" : "off"].")) + for(var/M in message_mobs) + to_chat(M, SPAN_NOTICE("[user] toggles \the [src]'s stabilization [stabilization_on ? "on" : "off"].")) /obj/item/tank/jetpack/verb/toggle() set name = "Toggle Jetpack" set category = "Object" + toggle_jetpack(usr) + +/obj/item/tank/jetpack/proc/toggle_jetpack(mob/user, var/list/message_mobs) on = !on - stabilization_on = !stabilization_on + toggle_rockets_stabilization(user, message_mobs) if(on) icon_state = "[icon_state]-on" ion_trail.start() @@ -77,13 +86,12 @@ icon_state = initial(icon_state) ion_trail.stop() - if (ismob(usr)) - var/mob/M = usr - M.update_inv_back() - M.update_action_buttons() + user.update_inv_back() + user.update_action_buttons() - to_chat(usr, SPAN_NOTICE("You toggle the thrusters [on? "on":"off"].")) - to_chat(usr, SPAN_NOTICE("You toggle the stabilization [stabilization_on? "on":"off"].")) + to_chat(user, SPAN_NOTICE("You toggle \the [src]'s thrusters [on ? "on" : "off"].")) + for(var/M in message_mobs) + to_chat(M, SPAN_NOTICE("[user] toggles \the [src]'s thrusters [on ? "on" : "off"].")) /obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob) if(!(src.on)) @@ -177,7 +185,7 @@ to_chat(usr, "You toggle the stabilization [stabilization_on? "on":"off"].") /obj/item/tank/jetpack/rig - name = "jetpack" + name = "hardsuit jetpack" var/obj/item/rig/holder /obj/item/tank/jetpack/rig/examine() diff --git a/code/modules/clothing/spacesuits/rig/modules/combat.dm b/code/modules/clothing/spacesuits/rig/modules/combat.dm index 114a5525193..f2bec7cd931 100644 --- a/code/modules/clothing/spacesuits/rig/modules/combat.dm +++ b/code/modules/clothing/spacesuits/rig/modules/combat.dm @@ -18,10 +18,9 @@ category = MODULE_LIGHT_COMBAT /obj/item/rig_module/grenade_launcher - name = "mounted grenade launcher" desc = "A shoulder-mounted micro-explosive dispenser." - selectable = 1 + selectable = TRUE icon_state = "grenade" interface_name = "integrated grenade launcher" @@ -39,9 +38,8 @@ ) /obj/item/rig_module/grenade_launcher/accepts_item(var/obj/item/input_device, var/mob/living/user) - if(!istype(input_device) || !istype(user)) - return 0 + return FALSE var/datum/rig_charge/accepted_item for(var/charge in charges) @@ -51,58 +49,54 @@ break if(!accepted_item) - return 0 + return FALSE if(accepted_item.charges >= 5) - to_chat(user, "Another grenade of that type will not fit into the module.") - return 0 + to_chat(user, SPAN_WARNING("Another grenade of that type will not fit into the module.")) + return FALSE - to_chat(user, "You slot \the [input_device] into the suit module.") + to_chat(user, SPAN_NOTICE("You slot \the [input_device] into the suit module.")) qdel(input_device) accepted_item.charges++ - return 1 - -/obj/item/rig_module/grenade_launcher/engage(atom/target) + return TRUE +/obj/item/rig_module/grenade_launcher/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE if(!target) - return 0 - - var/mob/living/carbon/human/H = holder.wearer + return FALSE if(!charge_selected) - to_chat(H, "You have not selected a grenade type.") - return 0 + to_chat(user, SPAN_WARNING("You have not selected a grenade type.")) + return FALSE var/datum/rig_charge/charge = charges[charge_selected] if(!charge) - return 0 + return FALSE if(charge.charges <= 0) - to_chat(H, "Insufficient grenades!") - return 0 + to_chat(user, SPAN_WARNING("Insufficient grenades!")) + return FALSE charge.charges-- - var/obj/item/grenade/new_grenade = new charge.product_type(get_turf(H)) - H.visible_message("[H] launches \a [new_grenade]!") - new_grenade.activate(H) - new_grenade.throw_at(target,fire_force,fire_distance) + var/obj/item/grenade/new_grenade = new charge.product_type(get_turf(holder.wearer)) + holder.wearer.visible_message(SPAN_DANGER("[user] launches \a [new_grenade]!")) + new_grenade.activate(user) + new_grenade.throw_at(target, fire_force, fire_distance) /obj/item/rig_module/grenade_launcher/frag - name = "mounted frag grenade launcher" desc = "A shoulder-mounted fragmentation explosives dispenser." - selectable = 1 + selectable = TRUE icon_state = "grenade" interface_name = "integrated frag grenade launcher" interface_desc = "Discharges loaded frag grenades against the wearer's location." charges = list( - list("frag grenade", "frag grenade", /obj/item/grenade/frag, 3) + list("frag grenade", "frag grenade", /obj/item/grenade/frag, 3) ) /obj/item/rig_module/grenade_launcher/cleaner @@ -112,15 +106,14 @@ category = MODULE_GENERAL charges = list( - list("cleaning grenade", "cleaning grenade", /obj/item/grenade/chem_grenade/cleaner, 9) + list("cleaning grenade", "cleaning grenade", /obj/item/grenade/chem_grenade/cleaner, 9) ) /obj/item/rig_module/mounted - name = "mounted laser cannon" desc = "A shoulder-mounted battery-powered laser cannon mount." - selectable = 1 - usable = 1 + selectable = TRUE + usable = TRUE module_cooldown = 0 icon_state = "lcannon" @@ -140,24 +133,25 @@ if(istype(gun, /obj/item/gun)) gun.has_safety = FALSE -/obj/item/rig_module/mounted/engage(atom/target) - +/obj/item/rig_module/mounted/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE if(!target) - gun.attack_self(holder.wearer) - return 1 + var/list/extra_mobs = list() + if(holder.wearer != user) + extra_mobs += holder.wearer + gun.attack_self(user, extra_mobs) + return TRUE - gun.Fire(target,holder.wearer) - return 1 + gun.Fire(target, user) + return TRUE /obj/item/rig_module/mounted/egun - name = "mounted energy gun" desc = "A forearm-mounted energy projector." icon_state = "egun" - construction_cost= list(DEFAULT_WALL_MATERIAL=7000, MATERIAL_GLASS = 2250, MATERIAL_URANIUM = 3250, MATERIAL_GOLD = 2500) + construction_cost= list(DEFAULT_WALL_MATERIAL = 7000, MATERIAL_GLASS = 2250, MATERIAL_URANIUM = 3250, MATERIAL_GOLD = 2500) construction_time = 300 interface_name = "mounted energy gun" @@ -168,14 +162,13 @@ category = MODULE_LIGHT_COMBAT /obj/item/rig_module/mounted/taser - name = "mounted taser" desc = "A palm-mounted nonlethal energy projector." icon_state = "taser" construction_cost = list(DEFAULT_WALL_MATERIAL = 7000, MATERIAL_GLASS = 5250) construction_time = 300 - usable = 0 + usable = FALSE suit_overlay_active = "mounted-taser" suit_overlay_inactive = "mounted-taser" @@ -188,7 +181,6 @@ category = MODULE_LIGHT_COMBAT /obj/item/rig_module/mounted/pulse - name = "mounted pulse rifle" desc = "A shoulder-mounted battery-powered pulse rifle mount." icon_state = "pulse" @@ -210,7 +202,6 @@ gun_type = /obj/item/gun/energy/mountedplasma /obj/item/rig_module/mounted/smg - name = "mounted submachine gun" desc = "A forearm-mounted suit-powered ballistic submachine gun." icon_state = "smg" @@ -221,7 +212,6 @@ gun_type = /obj/item/gun/energy/mountedsmg /obj/item/rig_module/mounted/xray - name = "mounted xray laser gun" desc = "A forearm-mounted suit-powered xray laser gun." icon_state = "xray" @@ -232,7 +222,6 @@ gun_type = /obj/item/gun/energy/xray/mounted /obj/item/rig_module/mounted/ion - name = "mounted ion rifle" desc = "A shoulder-mounted battery-powered ion rifle mount." icon_state = "ion" @@ -243,7 +232,6 @@ gun_type = /obj/item/gun/energy/rifle/ionrifle/mounted /obj/item/rig_module/mounted/tesla - name = "mounted tesla carbine" desc = "A shoulder-mounted battery-powered tesla carbine mount." icon_state = "tesla" @@ -280,7 +268,6 @@ category = MODULE_UTILITY /obj/item/rig_module/mounted/energy_blade - name = "energy blade projector" desc = "A powerful cutting beam projector." icon_state = "eblade" @@ -291,9 +278,9 @@ interface_name = "spider fang blade" interface_desc = "A lethal energy projector that can shape a blade projected from the hand of the wearer or launch radioactive darts." - usable = 0 - selectable = 1 - toggleable = 1 + usable = FALSE + selectable = TRUE + toggleable = TRUE use_power_cost = 50 active_power_cost = 10 passive_power_cost = 0 @@ -303,22 +290,23 @@ category = MODULE_SPECIAL /obj/item/rig_module/mounted/energy_blade/process() - if(holder && holder.wearer) if(!(locate(/obj/item/melee/energy/blade) in holder.wearer)) - deactivate() - return 0 + deactivate(holder.wearer) + return FALSE return ..() -/obj/item/rig_module/mounted/energy_blade/activate() - +/obj/item/rig_module/mounted/energy_blade/activate(mob/user) ..() var/mob/living/M = holder.wearer if(M.l_hand && M.r_hand) - to_chat(M, "Your hands are full.") + if(M == user) + to_chat(M, SPAN_WARNING("Your hands are full.")) + else + to_chat(user, SPAN_WARNING("[M]'s hands are full.")) deactivate() return @@ -327,7 +315,6 @@ M.put_in_hands(blade) /obj/item/rig_module/mounted/energy_blade/deactivate() - ..() var/mob/living/M = holder.wearer @@ -339,11 +326,10 @@ qdel(blade) /obj/item/rig_module/fabricator - name = "matter fabricator" desc = "A self-contained microfactory system for hardsuit integration." - selectable = 1 - usable = 1 + selectable = TRUE + usable = TRUE use_power_cost = 10 icon_state = "enet" @@ -358,28 +344,28 @@ category = MODULE_SPECIAL -/obj/item/rig_module/fabricator/engage(atom/target) - +/obj/item/rig_module/fabricator/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE var/mob/living/H = holder.wearer if(target) - var/obj/item/firing = new fabrication_type() - firing.forceMove(get_turf(src)) - H.visible_message("[H] launches \a [firing]!") - firing.throw_at(target,fire_force,fire_distance) + var/obj/item/firing = new fabrication_type(get_turf(src)) + holder.wearer.visible_message(SPAN_DANGER("[user] launches \a [firing]!")) + firing.throw_at(target, fire_force, fire_distance) else if(H.l_hand && H.r_hand) - to_chat(H, "Your hands are full.") + if(H == user) + to_chat(H, SPAN_WARNING("Your hands are full.")) + else + to_chat(user, SPAN_WARNING("[H]'s hands are full.")) else - var/obj/item/new_weapon = new fabrication_type() - new_weapon.forceMove(H) - to_chat(H, "You quickly fabricate \a [new_weapon].") + var/obj/item/new_weapon = new fabrication_type(H) + message_user(user, SPAN_NOTICE("You quickly fabricate \a [new_weapon]."), SPAN_NOTICE("\The [user] fabricates \a [new_weapon].")) H.put_in_hands(new_weapon) - return 1 + return TRUE /obj/item/rig_module/fabricator/sign name = "wet floor sign fabricator" @@ -392,7 +378,6 @@ category = MODULE_GENERAL - /obj/item/rig_module/tesla_coil name = "mounted tesla coil" desc = "A mounted tesla coil that discharges a powerful lightning strike around the user." @@ -403,17 +388,17 @@ use_power_cost = 30 module_cooldown = 100 - usable = 1 + usable = TRUE category = MODULE_LIGHT_COMBAT -/obj/item/rig_module/tesla_coil/engage() +/obj/item/rig_module/tesla_coil/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE var/mob/living/carbon/human/H = holder.wearer - H.visible_message("\The [H] crackles with energy!") + H.visible_message(SPAN_DANGER("\The [H] crackles with energy!")) playsound(H, 'sound/magic/LightningShock.ogg', 75, 1) tesla_zap(H, 5, 5000) - return 1 \ No newline at end of file + return TRUE \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm index 1badf66d715..89b2084564d 100644 --- a/code/modules/clothing/spacesuits/rig/modules/computer.dm +++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm @@ -15,12 +15,12 @@ set src in usr if(!usr.loc || !usr.loc.loc || !istype(usr.loc.loc, /obj/item/rig_module)) - to_chat(usr, "You are not loaded into a hardsuit.") + to_chat(usr, SPAN_WARNING("You are not loaded into a hardsuit.")) return var/obj/item/rig_module/module = usr.loc.loc if(!module.holder) - to_chat(usr, "Your module is not installed in a hardsuit.") + to_chat(usr, SPAN_WARNING("Your module is not installed in a hardsuit.")) return module.holder.ui_interact(usr, nano_state = contained_state) @@ -32,11 +32,11 @@ name = "IIS module" desc = "An integrated intelligence system module suitable for most hardsuits." icon_state = "IIS" - toggleable = 1 - usable = 1 - disruptive = 0 - activates_on_touch = 1 - confined_use = 1 + toggleable = TRUE + usable = TRUE + disruptive = FALSE + activates_on_touch = TRUE + confined_use = TRUE construction_cost = list(DEFAULT_WALL_MATERIAL = 5000, MATERIAL_GLASS = 7500) construction_time = 300 @@ -83,7 +83,6 @@ verb_holder.forceMove(src) /obj/item/rig_module/ai_container/accepts_item(var/obj/item/input_device, var/mob/living/user) - // Check if there's actually an AI to deal with. var/mob/living/silicon/ai/target_ai if(istype(input_device, /mob/living/silicon/ai)) @@ -102,7 +101,7 @@ // Terminal interaction only works with an intellicarded AI. if(!istype(card)) - return 0 + return FALSE // Since we've explicitly checked for three types, this should be safe. input_device.attackby(card,user) @@ -114,7 +113,7 @@ else eject_ai() update_verb_holder() - return 1 + return TRUE if(istype(input_device,/obj/item/aicard)) // We are carding the AI in our suit. @@ -127,9 +126,9 @@ else // You're using an empty card on an empty suit, idiot. if(!target_ai) - return 0 + return FALSE integrate_ai(input_device,user) - return 1 + return TRUE // Okay, it wasn't a terminal being touched, check for all the simple insertions. if(input_device.type in list(/obj/item/device/paicard, /obj/item/device/mmi, /obj/item/device/mmi/digital/posibrain)) @@ -141,51 +140,47 @@ eject_ai() else integrate_ai(input_device,user) - return 1 + return TRUE - return 0 - -/obj/item/rig_module/ai_container/engage(atom/target) + return FALSE +/obj/item/rig_module/ai_container/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE var/mob/living/carbon/human/H = holder.wearer if(!target) if(ai_card) - if(istype(ai_card,/obj/item/aicard)) + if(istype(ai_card, /obj/item/aicard)) ai_card.ui_interact(H, state = deep_inventory_state) else eject_ai(H) update_verb_holder() - return 1 + return TRUE if(accepts_item(target,H)) - return 1 + return TRUE - return 0 + return FALSE /obj/item/rig_module/ai_container/removed() eject_ai() ..() /obj/item/rig_module/ai_container/proc/eject_ai(var/mob/user) - if(ai_card) if(istype(ai_card, /obj/item/aicard)) if(integrated_ai && !integrated_ai.stat) if(user) - to_chat(user, "You cannot eject your currently stored AI. Purge it manually.") - return 0 - to_chat(user, "You purge the remaining scraps of data from your previous AI, freeing it for use.") + to_chat(user, SPAN_WARNING("You cannot eject your currently stored AI. Purge it manually.")) + return FALSE + message_user(user, SPAN_NOTICE("You purge the remaining scraps of data from your previous AI, freeing it for use."), SPAN_NOTICE("\The [user] purges \the [integrated_ai].")) if(integrated_ai) integrated_ai.ghostize() - qdel(integrated_ai) - integrated_ai = null + QDEL_NULL(integrated_ai) if(ai_card) - qdel(ai_card) - ai_card = null + QDEL_NULL(ai_card) else if(user) user.put_in_hands(ai_card) else @@ -195,16 +190,16 @@ update_verb_holder() /obj/item/rig_module/ai_container/proc/integrate_ai(var/obj/item/ai,var/mob/user) - if(!ai) return + if(!ai) + return // The ONLY THING all the different AI systems have in common is that they all store the mob inside an item. var/mob/living/ai_mob = locate(/mob/living) in ai.contents if(ai_mob) - + ai_mob.resting = FALSE + ai_mob.canmove = TRUE if(ai_mob.key && ai_mob.client) - if(istype(ai, /obj/item/aicard)) - if(!ai_card) ai_card = new /obj/item/aicard(src) @@ -214,9 +209,9 @@ if(target_card.grab_ai(ai_mob, user)) source_card.clear() else - return 0 + return FALSE else - return 0 + return FALSE else user.drop_from_inventory(ai,src) ai_card = ai @@ -229,20 +224,19 @@ integrated_ai = null eject_ai() else - to_chat(user, "There is no active AI within \the [ai].") + to_chat(user, SPAN_WARNING("There is no active AI within \the [ai].")) else - to_chat(user, "There is no active AI within \the [ai].") + to_chat(user, SPAN_WARNING("There is no active AI within \the [ai].")) update_verb_holder() return /obj/item/rig_module/datajack - name = "datajack module" desc = "A simple induction datalink module." icon_state = "datajack" - toggleable = 1 - activates_on_touch = 1 - usable = 0 + toggleable = TRUE + activates_on_touch = TRUE + usable = FALSE activate_string = "Enable Datajack" deactivate_string = "Disable Datajack" @@ -257,31 +251,29 @@ ..() stored_research = list() -/obj/item/rig_module/datajack/engage(atom/target) - +/obj/item/rig_module/datajack/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE if(target) var/mob/living/carbon/human/H = holder.wearer if(!accepts_item(target,H)) - return 0 - return 1 + return FALSE + return TRUE /obj/item/rig_module/datajack/accepts_item(var/obj/item/input_device, var/mob/living/user) - - if(istype(input_device,/obj/item/disk/tech_disk)) - to_chat(user, "You slot the disk into [src].") + if(istype(input_device, /obj/item/disk/tech_disk)) + to_chat(user, SPAN_NOTICE("You slot the disk into [src].")) var/obj/item/disk/tech_disk/disk = input_device if(disk.stored) if(load_data(disk.stored)) - to_chat(user, "Download successful; disk erased.") + to_chat(user, SPAN_NOTICE("Download successful; disk erased.")) disk.stored = null else - to_chat(user, "The disk is corrupt. It is useless to you.") + to_chat(user, SPAN_WARNING("The disk is corrupt. It is useless to you.")) else - to_chat(user, "The disk is blank. It is useless to you.") - return 1 + to_chat(user, SPAN_WARNING("The disk is blank. It is useless to you.")) + return TRUE // I fucking hate R&D code. This typecheck spam would be totally unnecessary in a sane setup. else if(istype(input_device,/obj/machinery)) @@ -297,22 +289,22 @@ incoming_files = input_machine.files if(!incoming_files || !incoming_files.known_tech || !incoming_files.known_tech.len) - to_chat(user, "Memory failure. There is nothing accessible stored on this terminal.") + to_chat(user, SPAN_WARNING("Memory failure. There is nothing accessible stored on this terminal.")) else // Maybe consider a way to drop all your data into a target repo in the future. if(load_data(incoming_files.known_tech)) - to_chat(user, "Download successful; local and remote repositories synchronized.") + to_chat(user, SPAN_NOTICE("Download successful; local and remote repositories synchronized.")) else - to_chat(user, "Scan complete. There is nothing useful stored on this terminal.") - return 1 - return 0 + to_chat(user, SPAN_WARNING("Scan complete. There is nothing useful stored on this terminal.")) + return TRUE + return FALSE /obj/item/rig_module/datajack/proc/load_data(var/incoming_data) if(islist(incoming_data)) for(var/entry in incoming_data) load_data(entry) - return 1 + return TRUE if(istype(incoming_data, /datum/tech)) var/data_found @@ -325,17 +317,17 @@ break if(!data_found) stored_research += incoming_data - return 1 - return 0 + return TRUE + return FALSE /obj/item/rig_module/electrowarfare_suite name = "electrowarfare module" desc = "A bewilderingly complex bundle of fiber optics and chips." icon_state = "ewar" - toggleable = 1 - usable = 0 - confined_use = 1 + toggleable = TRUE + usable = FALSE + confined_use = TRUE activate_string = "Enable Countermeasures" deactivate_string = "Disable Countermeasures" @@ -367,9 +359,9 @@ name = "hardsuit power sink" desc = "An heavy-duty power sink." icon_state = "powersink" - toggleable = 1 - activates_on_touch = 1 - disruptive = 0 + toggleable = TRUE + activates_on_touch = TRUE + disruptive = FALSE construction_cost = list(DEFAULT_WALL_MATERIAL=10000, MATERIAL_GOLD =2000, MATERIAL_SILVER =3000, MATERIAL_GLASS =2000) construction_time = 500 @@ -389,8 +381,8 @@ /obj/item/rig_module/power_sink/deactivate() if(interfaced_with) - if(holder && holder.wearer) - to_chat(holder.wearer, "Your power sink retracts as the module deactivates.") + if(holder?.wearer) + to_chat(holder.wearer, SPAN_WARNING("Your power sink retracts as the module deactivates.")) drain_complete() interfaced_with = null total_power_drained = 0 @@ -401,45 +393,43 @@ total_power_drained = 0 return ..() -/obj/item/rig_module/power_sink/engage(atom/target) - +/obj/item/rig_module/power_sink/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE //Target wasn't supplied or we're already draining. if(interfaced_with) - return 0 + return FALSE if(!target) - return 1 + return TRUE // Are we close enough? var/mob/living/carbon/human/H = holder.wearer if(!target.Adjacent(H)) - return 0 + return FALSE // Is it a valid power source? if(target.drain_power(1) <= 0) - return 0 + return FALSE - to_chat(H, "You begin draining power from [target]!") + message_user(user, SPAN_NOTICE("You begin draining power from \the [target]!"), SPAN_NOTICE("[user] begins draining power from \the [target]!")) interfaced_with = target drain_loc = interfaced_with.loc holder.spark_system.queue() playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) - return 1 + return TRUE /obj/item/rig_module/power_sink/accepts_item(var/obj/item/input_device, var/mob/living/user) var/can_drain = input_device.drain_power(1) if(can_drain > 0) - engage(input_device) - return 1 - return 0 + engage(input_device, user) + return TRUE + return FALSE /obj/item/rig_module/power_sink/process() - if(!interfaced_with) return ..() @@ -448,23 +438,23 @@ H = holder.wearer if(!H || !istype(H)) - return 0 + return FALSE holder.spark_system.queue() playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) if(!holder.cell) - to_chat(H, "Your power sink flashes an error; there is no cell in your hardsuit.") + to_chat(H, SPAN_WARNING("Your power sink flashes an error; there is no cell in your hardsuit.")) drain_complete(H) return if(!interfaced_with || !interfaced_with.Adjacent(H) || !(interfaced_with.loc == drain_loc)) - to_chat(H, "Your power sink retracts into its casing.") + to_chat(H, SPAN_WARNING("Your power sink retracts into its casing.")) drain_complete(H) return if(holder.cell.fully_charged()) - to_chat(H, "Your power sink flashes an amber light; your hardsuit cell is full.") + to_chat(H, SPAN_WARNING("Your power sink flashes an amber light; your hardsuit cell is full.")) drain_complete(H) return @@ -472,23 +462,22 @@ var/to_drain = min(80000, ((holder.cell.maxcharge - holder.cell.charge) / CELLRATE)) var/target_drained = interfaced_with.drain_power(0,0,to_drain) if(target_drained <= 0) - to_chat(H, "Your power sink flashes a red light; there is no power left in [interfaced_with].") + to_chat(H, SPAN_WARNING("Your power sink flashes a red light; there is no power left in \the [interfaced_with].")) drain_complete(H) return holder.cell.give(target_drained * CELLRATE * 2) total_power_drained += target_drained - return 1 + return TRUE /obj/item/rig_module/power_sink/proc/drain_complete(var/mob/living/M) - if(!interfaced_with) - if(M) to_chat(M, "Total power drained: [round(total_power_drained/500)]kJ.") + if(M) to_chat(M, SPAN_NOTICE("Total power drained: [round(total_power_drained/500)]kJ.")) else - if(M) to_chat(M, "Total power drained from [interfaced_with]: [round(total_power_drained/500)]kJ.") - interfaced_with.drain_power(0,1,0) // Damage the victim. + if(M) to_chat(M, SPAN_NOTICE("Total power drained from [interfaced_with]: [round(total_power_drained/500)]kJ.")) + interfaced_with.drain_power(0, 1, 0) // Damage the victim. drain_loc = null interfaced_with = null - total_power_drained = 0 + total_power_drained = 0 \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm index 4ffa95bba46..6fa30a39191 100644 --- a/code/modules/clothing/spacesuits/rig/modules/modules.dm +++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm @@ -24,6 +24,7 @@ var/module_cooldown = 10 var/next_use = 0 + var/engage_on_activate = TRUE // Whether the rig should call engage() in its activate() proc var/toggleable // Set to 1 for the device to show up as an active effect. var/usable // Set to 1 for the device to have an on-use effect. var/selectable // Set to 1 to be able to assign the device as primary system. @@ -31,7 +32,7 @@ var/permanent // If set, the module can't be removed. var/disruptive = 1 // Can disrupt by other effects. var/activates_on_touch // If set, unarmed attacks will call engage() on the target. - var/confined_use = 0 // If set, can be used inside mechs and other vehicles. + var/confined_use = FALSE // If set, can be used inside mechs and other vehicles. var/active // Basic module status var/disruptable // Will deactivate if some other powers are used. @@ -60,56 +61,52 @@ var/list/stat_rig_module/stat_modules = new() var/category // Use for restricting modules for specific suits, to specialize -/obj/item/rig_module/examine() +/obj/item/rig_module/examine(mob/user) ..() switch(damage) if(0) - to_chat(usr, "It is undamaged.") + to_chat(user, SPAN_NOTICE("It is undamaged.")) if(1) - to_chat(usr, "It is badly damaged.") + to_chat(user, SPAN_WARNING("It is badly damaged.")) if(2) - to_chat(usr, "It is almost completely destroyed.") - -/obj/item/rig_module/attackby(obj/item/W as obj, mob/user as mob) - - if(istype(W,/obj/item/stack/nanopaste)) + to_chat(user, SPAN_DANGER("It is almost completely destroyed.")) +/obj/item/rig_module/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/stack/nanopaste)) if(damage == 0) - to_chat(user, "There is no damage to mend.") + to_chat(user, SPAN_WARNING("There is no damage to mend.")) return - to_chat(user, "You start mending the damaged portions of \the [src]...") - + to_chat(user, SPAN_NOTICE("You start mending the damaged portions of \the [src]...")) if(!do_after(user,30) || !W || !src) return var/obj/item/stack/nanopaste/paste = W damage = 0 - to_chat(user, "You mend the damage to [src] with [W].") + to_chat(user, SPAN_NOTICE("You mend the damage to \the [src] with \the [W].")) paste.use(1) return else if(W.iscoil()) - switch(damage) if(0) - to_chat(user, "There is no damage to mend.") + to_chat(user, SPAN_WARNING("There is no damage to mend.")) return if(2) - to_chat(user, "There is no damage that you are capable of mending with such crude tools.") + to_chat(user, SPAN_WARNING("\The [src] is too damaged to repair with cable coil, it needs nanopaste.")) return var/obj/item/stack/cable_coil/cable = W if(!cable.amount >= 5) - to_chat(user, "You need five units of cable to repair \the [src].") + to_chat(user, SPAN_WARNING("You need five units of cable to repair \the [src].")) return - to_chat(user, "You start mending the damaged portions of \the [src]...") - if(!do_after(user,30) || !W || !src) + to_chat(user, SPAN_NOTICE("You start mending the damaged portions of \the [src]...")) + if(!do_after(user, 30) || !W || !src) return damage = 1 - to_chat(user, "You mend some of damage to [src] with [W], but you will need more advanced tools to fix it completely.") + to_chat(user, SPAN_NOTICE("You mend some of damage to \the [src] with \the [W], but you will need more advanced tools to fix it completely.")) cable.use(5) return ..() @@ -134,11 +131,11 @@ charges = processed_charges - stat_modules += new/stat_rig_module/activate(src) - stat_modules += new/stat_rig_module/deactivate(src) - stat_modules += new/stat_rig_module/engage(src) - stat_modules += new/stat_rig_module/select(src) - stat_modules += new/stat_rig_module/charge(src) + stat_modules += new /stat_rig_module/activate(src) + stat_modules += new /stat_rig_module/deactivate(src) + stat_modules += new /stat_rig_module/engage(src) + stat_modules += new /stat_rig_module/select(src) + stat_modules += new /stat_rig_module/charge(src) /obj/item/rig_module/Destroy() @@ -154,50 +151,50 @@ return //Proc for one-use abilities like teleport. -/obj/item/rig_module/proc/engage() - +/obj/item/rig_module/proc/engage(atom/target, mob/user) if(damage >= 2) - to_chat(usr, "The [interface_name] is damaged beyond use!") - return 0 + to_chat(user, SPAN_WARNING("\The [interface_name] is damaged beyond use!")) + return FALSE if(world.time < next_use) - to_chat(usr, "You cannot use the [interface_name] again so soon.") - return 0 + to_chat(user, SPAN_WARNING("You cannot use \the [interface_name] again so soon.")) + return FALSE if(!holder || holder.canremove) - to_chat(usr, "The suit is not initialized.") - return 0 + to_chat(user, SPAN_WARNING("The suit is not initialized.")) + return FALSE - if(usr.lying || usr.stat || usr.stunned || usr.paralysis || usr.weakened) - to_chat(usr, "You cannot use the suit in this state.") - return 0 + if(user.lying || user.stat || user.stunned || user.paralysis || user.weakened) + to_chat(user, SPAN_WARNING("You cannot use the suit in this state.")) + return FALSE if(holder.wearer && holder.wearer.lying) - to_chat(usr, "The suit cannot function while the wearer is prone.") - return 0 + to_chat(user, SPAN_WARNING("The suit cannot function while the wearer is prone.")) + return FALSE - if(holder.security_check_enabled && !holder.check_suit_access(usr)) - to_chat(usr, "Access denied.") - return 0 + if(holder.security_check_enabled && !holder.check_suit_access(user)) + to_chat(user, SPAN_DANGER("Access denied.")) + return FALSE - if(!holder.check_power_cost(usr, use_power_cost, 0, src, (istype(usr,/mob/living/silicon ? 1 : 0) ) ) ) - return 0 + if(!holder.check_power_cost(user, use_power_cost, 0, src, (istype(user,/mob/living/silicon ? 1 : 0) ) ) ) + return FALSE - if(!confined_use && istype(usr.loc, /mob/living/heavy_vehicle)) - to_chat(usr, "You cannot use the suit in the confined space.") - return 0 + if(!confined_use && istype(user.loc, /mob/living/heavy_vehicle)) + to_chat(user, SPAN_DANGER("You cannot use the suit in the confined space.")) + return FALSE next_use = world.time + module_cooldown - return 1 + return TRUE // Proc for toggling on active abilities. -/obj/item/rig_module/proc/activate() +/obj/item/rig_module/proc/activate(mob/user) + if(active) + return FALSE + if(engage_on_activate && !engage(null, user)) + return FALSE - if(active || !engage()) - return 0 - - active = 1 + active = TRUE spawn(1) if(suit_overlay_active) @@ -206,15 +203,14 @@ suit_overlay = null holder.update_icon() - return 1 + return TRUE // Proc for toggling off active abilities. -/obj/item/rig_module/proc/deactivate() - +/obj/item/rig_module/proc/deactivate(mob/user) if(!active) - return 0 + return FALSE - active = 0 + active = FALSE spawn(1) if(suit_overlay_inactive) @@ -224,7 +220,7 @@ if(holder) holder.update_icon() - return 1 + return TRUE // Called when the module is uninstalled from a suit. /obj/item/rig_module/proc/removed() @@ -242,7 +238,14 @@ // Called by holder rigsuit attackby() // Checks if an item is usable with this module and handles it if it is /obj/item/rig_module/proc/accepts_item(var/obj/item/input_device) - return 0 + return FALSE + +/obj/item/rig_module/proc/message_user(mob/user, var/user_text, var/wearer_text) + to_chat(user, user_text) + + if(holder.wearer && user != holder.wearer) + to_chat(holder.wearer, wearer_text) + return /mob/living/carbon/human/Stat() . = ..() @@ -277,7 +280,7 @@ return /stat_rig_module/proc/CanUse() - return 0 + return FALSE /stat_rig_module/Click() if(CanUse()) @@ -331,8 +334,8 @@ /stat_rig_module/select/CanUse() if(module.selectable) name = module.holder.selected_module == module ? "Selected" : "Select" - return 1 - return 0 + return TRUE + return FALSE /stat_rig_module/charge/New() ..() @@ -352,8 +355,8 @@ if(module.charges && module.charges.len) var/datum/rig_charge/charge = module.charges[module.charge_selected] name = "[charge.display_name] ([charge.charges]C) - Change" - return 1 - return 0 + return TRUE + return FALSE /mob/living/carbon/human/ClickOn(atom/A, params) . = ..() diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index 64621884fa8..8b15ac7f27b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -10,16 +10,15 @@ */ /obj/item/rig_module/stealth_field - name = "active camouflage module" desc = "A robust hardsuit-integrated stealth module." icon_state = "cloak" - toggleable = 1 - disruptable = 1 - disruptive = 0 - attackdisrupts = 1 - confined_use = 1 + toggleable = TRUE + disruptable = TRUE + disruptive = FALSE + attackdisrupts = TRUE + confined_use = TRUE use_power_cost = 75 active_power_cost = 5 @@ -38,45 +37,40 @@ category = MODULE_SPECIAL /obj/item/rig_module/stealth_field/activate() - if(!..()) - return 0 + return FALSE var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "You are now invisible to normal detection.") + to_chat(H, SPAN_NOTICE("You are now invisible to normal detection.")) H.invisibility = INVISIBILITY_LEVEL_TWO - anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null) + anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity", null, 20, null) - H.visible_message("[H] vanishes into thin air!", "You vanish into thin air!") + H.visible_message(SPAN_NOTICE("[H] vanishes into thin air!"), SPAN_NOTICE("You vanish into thin air!")) /obj/item/rig_module/stealth_field/deactivate() - if(!..()) - return 0 + return FALSE var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "You are now visible.") - H.invisibility = 0 + to_chat(H, SPAN_NOTICE("You are now visible.")) + H.invisibility = FALSE - anim(get_turf(H), H,'icons/mob/mob.dmi',,"uncloak",,H.dir) - anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity",null,20,null) + anim(get_turf(H), H, 'icons/mob/mob.dmi', ,"uncloak", , H.dir) + anim(get_turf(H), H, 'icons/effects/effects.dmi', "electricity", null, 20, null) - for(var/mob/O in oviewers(H)) - O.show_message("[H.name] appears from thin air!",1) + H.visible_message(SPAN_NOTICE("[H] appears from thin air!"), SPAN_NOTICE("You appear from thin air!")) playsound(get_turf(H), 'sound/effects/stealthoff.ogg', 10, 1) - /obj/item/rig_module/teleporter - name = "bluespace teleportation module" desc = "A complex, sleek-looking, hardsuit-integrated teleportation module that exploits bluespace energy to phase from one location to another instantaneously." icon_state = "teleporter" use_power_cost = 40 redundant = 1 - usable = 1 + usable = TRUE selectable = 1 var/lastteleport @@ -87,36 +81,34 @@ category = MODULE_SPECIAL -/obj/item/rig_module/teleporter/proc/phase_in(var/mob/M,var/turf/T) - +/obj/item/rig_module/teleporter/proc/phase_in(var/mob/M, var/turf/T) if(!M || !T) return holder.spark_system.queue() playsound(T, 'sound/effects/phasein.ogg', 25, 1) playsound(T, 'sound/effects/sparks2.ogg', 50, 1) - anim(T,M,'icons/mob/mob.dmi',,"phasein",,M.dir) - -/obj/item/rig_module/teleporter/proc/phase_out(var/mob/M,var/turf/T) + anim(T, M, 'icons/mob/mob.dmi', ,"phasein", , M.dir) +/obj/item/rig_module/teleporter/proc/phase_out(var/mob/M, var/turf/T) if(!M || !T) return playsound(T, "sparks", 50, 1) - anim(T,M,'icons/mob/mob.dmi',,"phaseout",,M.dir) + anim(T, M, 'icons/mob/mob.dmi', ,"phaseout", ,M.dir) -/obj/item/rig_module/teleporter/engage(var/atom/target, var/notify_ai) - - if(!..()) return FALSE +/obj/item/rig_module/teleporter/engage(atom/target, mob/user, var/notify_ai) + if(!..()) + return FALSE var/mob/living/carbon/human/H = holder.wearer if(lastteleport + (5 SECONDS) > world.time) - to_chat(H, SPAN_WARNING("The teleporter needs time to cool down!")) + to_chat(user, SPAN_WARNING("The teleporter needs time to cool down!")) return FALSE if(!istype(H.loc, /turf)) - to_chat(H, "You cannot teleport out of your current location.") + to_chat(user, SPAN_WARNING("You cannot teleport out of your current location.")) return FALSE var/turf/T @@ -126,19 +118,19 @@ T = get_teleport_loc(get_turf(H), H, rand(5, 9)) if(!T || T.density) - to_chat(H, "You cannot teleport into solid walls.") + to_chat(user, SPAN_WARNING("You cannot teleport into solid walls.")) return FALSE if(isAdminLevel(T.z)) - to_chat(H, "You cannot use your teleporter on this Z-level.") + to_chat(user, SPAN_WARNING("You cannot use your teleporter on this Z-level.")) return FALSE if(T.contains_dense_objects()) - to_chat(H, "You cannot teleport to a location with solid objects.") + to_chat(user, SPAN_WARNING("You cannot teleport to a location with solid objects.")) return FALSE if((T.z != H.z || get_dist(T, get_turf(H)) > world.view) && target) - to_chat(H, "You cannot teleport to such a distant object.") + to_chat(user, SPAN_WARNING("You cannot teleport to such a distant object.")) return FALSE phase_out(H,get_turf(H)) @@ -146,7 +138,7 @@ phase_in(H,get_turf(H)) if(T != get_turf(H)) - to_chat(H, SPAN_WARNING("Something interferes with your [src]!")) + to_chat(user, SPAN_WARNING("Something interferes with your [src]!")) for(var/obj/item/grab/G in H.contents) if(G.affecting) @@ -158,7 +150,6 @@ return TRUE /obj/item/rig_module/fabricator/energy_net - name = "net projector" desc = "Some kind of complex energy projector with a hardsuit mount." icon_state = "enet" @@ -173,33 +164,31 @@ category = MODULE_SPECIAL -/obj/item/rig_module/fabricator/energy_net/engage(atom/target) - +/obj/item/rig_module/fabricator/energy_net/engage(atom/target, mob/user) if(holder && holder.wearer) if(..(target) && target) - holder.wearer.Beam(target,"n_beam",,10) - return 1 - return 0 + holder.wearer.Beam(target, "n_beam", , 10) + return TRUE + return FALSE /obj/item/rig_module/self_destruct - name = "self-destruct module" desc = "Oh my God, Captain. A bomb." icon_state = "deadman" - usable = 1 - active = 1 - permanent = 1 + usable = TRUE + active = TRUE + permanent = TRUE engage_string = "Detonate" interface_name = "dead man's switch" interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button." - var/list/explosion_values = list(3,4,5,6) + var/list/explosion_values = list(3, 4, 5, 6) category = MODULE_SPECIAL /obj/item/rig_module/self_destruct/small - explosion_values = list(1,2,3,4) + explosion_values = list(1, 2, 3, 4) /obj/item/rig_module/self_destruct/activate() return @@ -208,13 +197,12 @@ return /obj/item/rig_module/self_destruct/process() - // Not being worn, leave it alone. if(!holder || !holder.wearer || !holder.wearer.wear_suit == holder) - return 0 + return FALSE //OH SHIT. - if(holder.wearer.stat == 2) + if(holder.wearer.stat == DEAD) engage(1) /obj/item/rig_module/self_destruct/engage(var/skip_check) @@ -231,8 +219,8 @@ name = "EMP dissipation module" desc = "A bewilderingly complex bundle of fiber optics and chips. Seems like it uses a good deal of power." active_power_cost = 10 - toggleable = 1 - usable = 0 + toggleable = TRUE + usable = FALSE use_power_cost = 70 module_cooldown = 30 @@ -255,36 +243,36 @@ if(!..()) return - holder.emp_protection = max(0,(holder.emp_protection - protection_amount)) + holder.emp_protection = max(0, (holder.emp_protection - protection_amount)) /obj/item/rig_module/emergency_powergenerator name = "emergency power generator" desc = "A high yield power generating device that takes a long time to recharge." active_power_cost = 0 - toggleable = 0 - usable = 1 - confined_use = 1 + toggleable = FALSE + usable = TRUE + confined_use = TRUE var/cooldown = 0 engage_string = "Use Emergency Power" interface_name = "emergency power generator" interface_desc = "A high yield power generating device that takes a long time to recharge." - var/generation_ammount = 3500 + var/generation_amount = 3500 category = MODULE_SPECIAL -/obj/item/rig_module/emergency_powergenerator/engage() +/obj/item/rig_module/emergency_powergenerator/engage(atom/target, mob/user) if(!..()) return var/mob/living/carbon/human/H = holder.wearer if(cooldown) - to_chat(H, "There isn't enough power stored up yet!") - return 0 + to_chat(user, SPAN_DANGER("There isn't enough power stored up yet!")) + return FALSE else - to_chat(H, "Your suit emits a loud sound as power is rapidly injected into your suits battery!") + message_user(user, SPAN_NOTICE("You inject a burst of power into \the [holder]."), SPAN_NOTICE("Your suit emits a loud sound as power is rapidly injected into your suit's battery!")) playsound(H.loc, 'sound/effects/sparks2.ogg', 50, 1) - holder.cell.give(generation_ammount) + holder.cell.give(generation_amount) cooldown = 1 addtimer(CALLBACK(src, /obj/item/rig_module/emergency_powergenerator/proc/reset_cooldown), 2 MINUTES) @@ -320,9 +308,9 @@ use_power_cost = 10 module_cooldown = 5 - usable = 0 + usable = FALSE selectable = 0 - toggleable = 1 + toggleable = TRUE interface_name = "advanced door hacking tool" interface_desc = "An advanced door hacking tool that sports a low power cost and incredibly quick door hacking time. The device also supports hacking several signals at once remotely, and the last 10 doors hacked can be instantly accessed." @@ -330,22 +318,23 @@ category = MODULE_SPECIAL /obj/item/rig_module/device/door_hack/process() - if(holder && holder.wearer) if(!(locate(/obj/item/device/multitool/hacktool/rig) in holder.wearer)) deactivate() - return 0 + return FALSE return ..() -/obj/item/rig_module/device/door_hack/activate() - +/obj/item/rig_module/device/door_hack/activate(mob/user) ..() var/mob/living/M = holder.wearer if(M.l_hand && M.r_hand) - to_chat(M, "Your hands are full.") + if(M == user) + to_chat(M, SPAN_WARNING("Your hands are full.")) + else + to_chat(user, SPAN_WARNING("[M]'s hands are full.")) deactivate() return @@ -354,7 +343,6 @@ M.put_in_hands(hacktool) /obj/item/rig_module/device/door_hack/deactivate() - ..() var/mob/living/M = holder.wearer diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 06ad221be1c..e50036f7c85 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -22,10 +22,10 @@ /obj/item/rig_module/device name = "mounted device" desc = "Some kind of hardsuit mount." - usable = 0 + usable = FALSE selectable = 1 - toggleable = 0 - disruptive = 0 + toggleable = FALSE + disruptive = FALSE var/device_type var/obj/item/device @@ -49,7 +49,7 @@ interface_name = "vitals tracker" interface_desc = "Shows an informative health readout of the user." - usable = 1 + usable = TRUE selectable = 0 category = MODULE_GENERAL @@ -92,7 +92,7 @@ interface_name = "Alden-Saraspova counter" interface_desc = "An exotic particle detector commonly used by xenoarchaeologists." engage_string = "Begin Scan" - usable = 1 + usable = TRUE selectable = 0 device_type = /obj/item/device/ano_scanner @@ -105,7 +105,7 @@ interface_name = "ore detector" interface_desc = "A sonar system for detecting large masses of ore." engage_string = "Begin Scan" - usable = 1 + usable = TRUE selectable = 0 device_type = /obj/item/mining_scanner @@ -117,9 +117,9 @@ icon_state = "rcd" interface_name = "mounted RFD-C" interface_desc = "A device for building or removing walls. Cell-powered." - usable = 1 + usable = TRUE engage_string = "Configure RFD-C" - construction_cost = list(DEFAULT_WALL_MATERIAL=30000,"phoron"=12500, MATERIAL_SILVER =10000, MATERIAL_GOLD =10000) + construction_cost = list(DEFAULT_WALL_MATERIAL = 30000, MATERIAL_PHORON = 12500, MATERIAL_SILVER = 10000, MATERIAL_GOLD = 10000) construction_time = 1000 device_type = /obj/item/rfd/construction/mounted @@ -131,12 +131,12 @@ if(device_type) device = new device_type(src) -/obj/item/rig_module/device/engage(atom/target) +/obj/item/rig_module/device/engage(atom/target, mob/user) if(!..() || !device) return FALSE if(!target) - device.attack_self(holder.wearer) + device.attack_self(user) return TRUE var/turf/T = get_turf(target) @@ -147,20 +147,20 @@ if(istype(target, /obj/machinery/disposal)) return FALSE - var/resolved = target.attackby(device) + var/resolved = target.attackby(device, user) if(!resolved && device && target) - device.afterattack(target, holder.wearer, TRUE) + device.afterattack(target, user, TRUE) return TRUE /obj/item/rig_module/chem_dispenser name = "mounted chemical dispenser" desc = "A complex web of tubing and needles suitable for hardsuit use." icon_state = "injector" - usable = 1 - selectable = 0 - toggleable = 0 - disruptive = 0 - confined_use = 1 + usable = TRUE + selectable = FALSE + toggleable = FALSE + disruptive = FALSE + confined_use = TRUE construction_cost = list(DEFAULT_WALL_MATERIAL=10000, MATERIAL_GLASS =9250, MATERIAL_GOLD =2500, MATERIAL_SILVER =4250,"phoron"=5500) construction_time = 400 @@ -170,15 +170,15 @@ interface_desc = "Dispenses loaded chemicals directly into the wearer's bloodstream." charges = list( - list("tricordrazine", "tricordrazine",/datum/reagent/tricordrazine, 80), + list("tricordrazine", "tricordrazine", /datum/reagent/tricordrazine, 80), list("mortaphenyl", "mortaphenyl", /datum/reagent/mortaphenyl, 80), - list("dexalin plus", "dexalinp", /datum/reagent/dexalin/plus, 80), - list("antibiotics", "thetamycin", /datum/reagent/thetamycin, 80), - list("antitoxins", "dylovene", /datum/reagent/dylovene, 80), - list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), - list("saline", "saline", /datum/reagent/saline, 80), - list("hyronalin", "hyronalin", /datum/reagent/hyronalin, 80), - list("radium", "radium", /datum/reagent/radium, 80) + list("dexalin plus", "dexalinp", /datum/reagent/dexalin/plus, 80), + list("antibiotics", "thetamycin", /datum/reagent/thetamycin, 80), + list("antitoxins", "dylovene", /datum/reagent/dylovene, 80), + list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), + list("saline", "saline", /datum/reagent/saline, 80), + list("hyronalin", "hyronalin", /datum/reagent/hyronalin, 80), + list("radium", "radium", /datum/reagent/radium, 80) ) var/max_reagent_volume = 80 //Used when refilling. @@ -190,27 +190,26 @@ //just over a syringe worth of each. Want more? Go refill. Gives the ninja another reason to have to show their face. charges = list( - list("tricordrazine", "tricordrazine",/datum/reagent/tricordrazine, 20), + list("tricordrazine", "tricordrazine", /datum/reagent/tricordrazine, 20), list("mortaphenyl", "mortaphenyl", /datum/reagent/mortaphenyl, 20), - list("dexalin plus", "dexalinp", /datum/reagent/dexalin/plus, 20), - list("antibiotics", "thetamycin", /datum/reagent/thetamycin, 20), - list("antitoxins", "dylovene", /datum/reagent/dylovene, 20), - list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), - list("saline", "saline", /datum/reagent/saline, 80), - list("hyronalin", "hyronalin", /datum/reagent/hyronalin, 20), - list("radium", "radium", /datum/reagent/radium, 20) + list("dexalin plus", "dexalinp", /datum/reagent/dexalin/plus, 20), + list("antibiotics", "thetamycin", /datum/reagent/thetamycin, 20), + list("antitoxins", "dylovene", /datum/reagent/dylovene, 20), + list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), + list("saline", "saline", /datum/reagent/saline, 80), + list("hyronalin", "hyronalin", /datum/reagent/hyronalin, 20), + list("radium", "radium", /datum/reagent/radium, 20) ) category = MODULE_UTILITY /obj/item/rig_module/chem_dispenser/accepts_item(var/obj/item/input_item, var/mob/living/user) - if(!input_item.is_open_container()) - return 0 + return FALSE if(!input_item.reagents || !input_item.reagents.total_volume) - to_chat(user, "\The [input_item] is empty.") - return 0 + to_chat(user, SPAN_WARNING("\The [input_item] is empty.")) + return FALSE // Magical chemical filtration system, do not question it. var/total_transferred = 0 @@ -231,31 +230,30 @@ break if(total_transferred) - to_chat(user, "You transfer [total_transferred] units into the suit reservoir.") + to_chat(user, SPAN_NOTICE("You transfer [total_transferred] units into the suit reservoir.")) else - to_chat(user, "None of the reagents seem suitable.") - return 1 - -/obj/item/rig_module/chem_dispenser/engage(atom/target) + to_chat(user, SPAN_WARNING("None of the reagents seem suitable.")) + return TRUE +/obj/item/rig_module/chem_dispenser/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE var/mob/living/carbon/human/H = holder.wearer if(!charge_selected) - to_chat(H, "You have not selected a chemical type.") - return 0 + to_chat(user, SPAN_WARNING("You have not selected a chemical type.")) + return FALSE var/datum/rig_charge/charge = charges[charge_selected] if(!charge) - return 0 + return FALSE var/chems_to_use = 10 if(charge.charges <= 0) - to_chat(H, "Insufficient chems!") - return 0 + to_chat(user, SPAN_WARNING("Insufficient chems!")) + return FALSE else if(charge.charges < chems_to_use) chems_to_use = charge.charges @@ -264,37 +262,37 @@ if(istype(target,/mob/living/carbon)) target_mob = target else - return 0 + return FALSE else target_mob = H if(!H.Adjacent(target_mob)) - to_chat(H, "You are not close enough to inject them!") - return 0 + to_chat(user, SPAN_WARNING("You are not close enough to inject them!")) + return FALSE - if(target_mob != H) - to_chat(H, "You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name].") + if(target_mob != user) + to_chat(user, SPAN_NOTICE("You inject [target_mob] with [chems_to_use] unit\s of [charge.display_name].")) if(!target_mob.is_physically_disabled()) - to_chat(target_mob, "You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected.") + to_chat(target_mob, SPAN_NOTICE("You feel a rushing in your veins as [chems_to_use] unit\s of [charge.display_name] [chems_to_use == 1 ? "is" : "are"] injected.")) target_mob.reagents.add_reagent(charge.product_type, chems_to_use) charge.charges -= chems_to_use - if(charge.charges < 0) charge.charges = 0 + if(charge.charges < 0) + charge.charges = 0 - return 1 + return TRUE /obj/item/rig_module/chem_dispenser/combat - name = "combat chemical injector" desc = "A complex web of tubing and needles suitable for hardsuit use." charges = list( - list("synaptizine", "synaptizine", /datum/reagent/synaptizine, 30), - list("hyperzine", "hyperzine", /datum/reagent/hyperzine, 30), - list("oxycomorphine", "oxycomorphine", /datum/reagent/oxycomorphine, 30), - list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), - list("saline", "saline", /datum/reagent/saline, 80) + list("synaptizine", "synaptizine", /datum/reagent/synaptizine, 30), + list("hyperzine", "hyperzine", /datum/reagent/hyperzine, 30), + list("oxycomorphine", "oxycomorphine", /datum/reagent/oxycomorphine, 30), + list("nutrients", "glucose", /datum/reagent/nutriment/glucose, 80), + list("saline", "saline", /datum/reagent/saline, 80) ) interface_name = "combat chem dispenser" @@ -303,33 +301,30 @@ category = MODULE_LIGHT_COMBAT /obj/item/rig_module/chem_dispenser/vaurca - name = "vaurca combat chemical injector" desc = "A complex web of tubing and needles suitable for vaurcan hardsuit use." charges = list( - list("synaptizine", "synaptizine", /datum/reagent/synaptizine, 30), - list("hyperzine", "hyperzine", /datum/reagent/hyperzine, 30), + list("synaptizine", "synaptizine", /datum/reagent/synaptizine, 30), + list("hyperzine", "hyperzine", /datum/reagent/hyperzine, 30), list("oxycomorphine", "oxycomorphine", /datum/reagent/oxycomorphine, 30), - list("phoron", "phoron", /datum/reagent/toxin/phoron,60), - list("kois", "k'ois paste", /datum/reagent/kois, 80), - list("saline", "saline", /datum/reagent/saline, 80) + list("phoron", "phoron", /datum/reagent/toxin/phoron, 60), + list("kois", "k'ois paste", /datum/reagent/kois, 80), + list("saline", "saline", /datum/reagent/saline, 80) ) interface_name = "vaurca combat chem dispenser" interface_desc = "Dispenses loaded chemicals directly into the bloodstream." - category = MODULE_VAURCA /obj/item/rig_module/chem_dispenser/offworlder - name = "chemical injector" desc = "A complex web of tubing and needles suitable for hardsuit use." charges = list( - list("dexalin", "dexalin", /datum/reagent/dexalin, 5), - list("inaprovaline", "inaprovaline", /datum/reagent/inaprovaline, 5) + list("dexalin", "dexalin", /datum/reagent/dexalin, 5), + list("inaprovaline", "inaprovaline", /datum/reagent/inaprovaline, 5) ) interface_name = "chem dispenser" @@ -337,15 +332,13 @@ category = MODULE_GENERAL - /obj/item/rig_module/chem_dispenser/injector - name = "mounted chemical injector" desc = "A complex web of tubing and a large needle suitable for hardsuit use." - usable = 0 + usable = FALSE selectable = 1 disruptive = 1 - construction_cost = list(DEFAULT_WALL_MATERIAL=10000, MATERIAL_GLASS =9250, MATERIAL_GOLD =2500, MATERIAL_SILVER =4250,"phoron"=5500) + construction_cost = list(DEFAULT_WALL_MATERIAL = 10000, MATERIAL_GLASS = 9250, MATERIAL_GOLD = 2500, MATERIAL_SILVER = 4250, MATERIAL_PHORON = 5500) construction_time = 400 interface_name = "mounted chem injector" @@ -354,24 +347,22 @@ category = MODULE_MEDICAL /obj/item/rig_module/chem_dispenser/injector/paramedic //downgraded version - charges = list( list("tricordrazine", "tricordrazine", /datum/reagent/tricordrazine, 40), - list("mortaphenyl", "mortaphenyl", /datum/reagent/mortaphenyl, 40), + list("mortaphenyl", "mortaphenyl", /datum/reagent/mortaphenyl, 40), list("dexalin", "dexalin", /datum/reagent/dexalin, 40), - list("inaprovaline", "inaprovaline", /datum/reagent/inaprovaline, 40) + list("inaprovaline", "inaprovaline", /datum/reagent/inaprovaline, 40) ) /obj/item/rig_module/voice - name = "hardsuit voice synthesiser" desc = "A speaker box and sound processor." icon_state = "megaphone" - usable = 1 + usable = TRUE selectable = 0 - toggleable = 0 - disruptive = 0 - confined_use = 1 + toggleable = FALSE + disruptive = FALSE + confined_use = TRUE engage_string = "Configure Synthesiser" @@ -391,47 +382,46 @@ ..() holder.speech = src -/obj/item/rig_module/voice/engage() - +/obj/item/rig_module/voice/engage(atom/target, mob/user) if(!..()) - return 0 + return FALSE var/choice= input("Would you like to toggle the synthesiser, set the name or set an accent?") as null|anything in list("Enable","Disable","Set Name", "Set Accent") if(!choice) - return 0 + return FALSE switch(choice) if("Enable") - active = 1 - voice_holder.active = 1 - to_chat(usr, "You enable the speech synthesiser.") + active = TRUE + voice_holder.active = TRUE + message_user(user, SPAN_NOTICE("You enable the speech synthesiser."), SPAN_NOTICE("\The [user] enables the speech synthesiser.")) if("Disable") - active = 0 - voice_holder.active = 0 - to_chat(usr, "You disable the speech synthesiser.") + active = FALSE + voice_holder.active = FALSE + message_user(user, SPAN_NOTICE("You disable the speech synthesiser."), SPAN_NOTICE("\The [user] disables the speech synthesiser.")) if("Set Name") - var/raw_choice = sanitize(input(usr, "Please enter a new name.") as text|null, MAX_NAME_LEN) + var/raw_choice = sanitize(input(user, "Please enter a new name.") as text|null, MAX_NAME_LEN) if(!raw_choice) - return 0 + return FALSE voice_holder.voice = raw_choice - to_chat(usr, "You are now mimicking [voice_holder.voice].") + message_user(user, SPAN_NOTICE("You set the synthesizer to mimic [voice_holder.voice]."), SPAN_NOTICE("\The [user] set the speech synthesizer to mimic [voice_holder.voice].")) if("Set Accent") - var/raw_choice = input(usr, "Please choose an accent to mimick.") as null|anything in SSrecords.accents + var/raw_choice = input(user, "Please choose an accent to mimick.") as null|anything in SSrecords.accents if(!raw_choice) - return 0 + return FALSE voice_holder.current_accent = raw_choice - to_chat(usr, SPAN_NOTICE("You are now mimicking the [raw_choice] accent.")) - return 1 + message_user(user, SPAN_NOTICE("You set the synthesizer to mimic the [raw_choice] accent."), SPAN_NOTICE("\The [user] set the speech synthesizer the [raw_choice] accent.")) + return TRUE /obj/item/rig_module/maneuvering_jets name = "hardsuit maneuvering jets" desc = "A compact gas thruster system for a hardsuit." icon_state = "thrusters" - usable = 1 - toggleable = 1 + usable = TRUE + toggleable = TRUE selectable = 0 - disruptive = 0 + disruptive = FALSE construction_cost = list(DEFAULT_WALL_MATERIAL = 15000, MATERIAL_GLASS = 4250, MATERIAL_SILVER = 4250, MATERIAL_URANIUM = 5250) construction_time = 300 @@ -449,18 +439,20 @@ category = MODULE_GENERAL -/obj/item/rig_module/maneuvering_jets/engage() +/obj/item/rig_module/maneuvering_jets/engage(atom/target, mob/user) if(!..()) - return 0 - jets.toggle_rockets() - return 1 - -/obj/item/rig_module/maneuvering_jets/activate() + return FALSE + var/list/extra_mobs = list() + if(user != holder.wearer) + extra_mobs += holder.wearer + jets.toggle_rockets_stabilization(user, extra_mobs) + return TRUE +/obj/item/rig_module/maneuvering_jets/activate(mob/user) if(active) - return 0 + return FALSE - active = 1 + active = TRUE spawn(1) if(suit_overlay_active) @@ -470,15 +462,21 @@ holder.update_icon() if(!jets.on) - jets.toggle() - return 1 + var/list/extra_mobs = list() + if(user != holder.wearer) + extra_mobs += holder.wearer + jets.toggle_jetpack(user, extra_mobs) + return TRUE -/obj/item/rig_module/maneuvering_jets/deactivate() +/obj/item/rig_module/maneuvering_jets/deactivate(mob/user) if(!..()) - return 0 + return FALSE if(jets.on) - jets.toggle() - return 1 + var/list/extra_mobs = list() + if(user != holder.wearer) + extra_mobs += holder.wearer + jets.toggle_jetpack(user, extra_mobs) + return TRUE /obj/item/rig_module/maneuvering_jets/New() ..() @@ -503,20 +501,19 @@ interface_name = "paper dispenser" interface_desc = "Dispenses warm, clean, and crisp sheets of paper." engage_string = "Dispense" - usable = 1 + usable = TRUE selectable = 0 device_type = /obj/item/paper_bin category = MODULE_GENERAL -/obj/item/rig_module/device/paperdispenser/engage(atom/target) - +/obj/item/rig_module/device/paperdispenser/engage(atom/target, mob/user) if(!..() || !device) - return 0 + return FALSE if(!target) - device.attack_hand(holder.wearer) - return 1 + device.attack_hand(user) + return TRUE /obj/item/rig_module/device/pen name = "mounted pen" @@ -525,7 +522,7 @@ interface_name = "mounted pen" interface_desc = "Signatures with style(tm)." engage_string = "Change color" - usable = 1 + usable = TRUE device_type = /obj/item/pen/multi category = MODULE_GENERAL @@ -537,7 +534,7 @@ interface_name = "mounted stamp" interface_desc = "Leave your mark." engage_string = "Toggle stamp type" - usable = 1 + usable = TRUE var/iastamp var/deniedstamp @@ -549,18 +546,18 @@ deniedstamp = new /obj/item/stamp/denied(src) device = iastamp -/obj/item/rig_module/device/stamp/engage(atom/target) +/obj/item/rig_module/device/stamp/engage(atom/target, mob/user) if(!..() || !device) - return 0 + return FALSE if(!target) if(device == iastamp) device = deniedstamp - to_chat(holder.wearer, "Switched to denied stamp.") + message_user(user, SPAN_NOTICE("You set \the [src] to the denied stamp."), SPAN_NOTICE("\The [user] set \the [src] to the denied stamp.")) else if(device == deniedstamp) device = iastamp - to_chat(holder.wearer, "Switched to internal affairs stamp.") - return 1 + message_user(user, SPAN_NOTICE("You set \the [src] to the internal affairs stamp."), SPAN_NOTICE("\The [user] set \the [src] to the internal affairs stamp.")) + return TRUE /obj/item/rig_module/device/decompiler name = "mounted matter decompiler" @@ -583,7 +580,7 @@ construction_cost = list(DEFAULT_WALL_MATERIAL=15000, MATERIAL_GLASS = 1250, MATERIAL_SILVER =5250) construction_time = 300 - disruptive = 0 + disruptive = FALSE use_power_cost = 5 module_cooldown = 25 @@ -592,9 +589,9 @@ * TOGGLE - dampens fall, on or off. * SELECTABLE - Jump forward or up! */ - toggleable = 1 - selectable = 1 - usable = 0 + toggleable = TRUE + selectable = TRUE + usable = FALSE engage_string = "Toggle Leg Actuators" activate_string = "Enable Leg Actuators" @@ -618,26 +615,42 @@ category = MODULE_LIGHT_COMBAT -/obj/item/rig_module/actuators/engage(var/atom/target) +/obj/item/rig_module/actuators/proc/is_valid_turf(var/turf/T) + if(!T || istype(T, /turf/space) || T.density || T.contains_dense_objects()) + return null + if(isopenturf(T)) + var/obj/structure/lattice/L = locate() in T + if(L) + return L.name + var/turf/leapBelow = GetBelow(T) + if(leapBelow.density) + return leapBelow.name + else if(T.contains_dense_objects()) + return "structure" + else + return null + return T.name + +/obj/item/rig_module/actuators/engage(atom/target, mob/user) if (!..()) - return 0 + return FALSE // This is for when you toggle it on or off. Why do they both run the same // proc chain ...? :l if (!target) - return 1 + return TRUE var/mob/living/carbon/human/H = holder.wearer if (!isturf(H.loc)) - to_chat(H, "You cannot leap out of your current location!") - return 0 + to_chat(user, SPAN_WARNING("You cannot leap out of your current location!")) + return FALSE var/turf/T = get_turf(target) if (!T || T.density) - to_chat(H, "You cannot leap at solid walls!") - return 0 + to_chat(user, SPAN_WARNING("You cannot leap at solid walls!")) + return FALSE // Saved, we need it more than 1 place. var/dist = max(get_dist(T, get_turf(H)), 0) @@ -649,46 +662,45 @@ continue if (aa.density) - to_chat(H, "You cannot leap at a location with solid objects on it!") - return 0 + to_chat(user, SPAN_WARNING("You cannot leap at a location with solid objects on it!")) + return FALSE if (T.z != H.z || dist > leapDistance) - to_chat(H, "You cannot leap at such a distant object!") - return 0 + to_chat(user, SPAN_WARNING("You cannot leap at such a distant object!")) + return FALSE // Handle leaping at targets with a combat capable version here. if (combatType && dist && (ismob(target) || (locate(/mob/living) in T))) H.do_leap(target, leapDistance, FALSE) - return 1 + return TRUE // If dist -> horizontal leap. Otherwise, the user clicked the turf that they're // currently on. Which means they want to do a vertical leap upwards! if (dist) - H.visible_message("\The [H] leaps horizontally at \the [T]!", - "You leap horizontally at \the [T]!", - "You hear an electric whirr followed by a weighty thump!") + H.visible_message(SPAN_WARNING("\The [H] leaps horizontally at \the [T]!"), + SPAN_WARNING("You leap horizontally at \the [T]!"), + SPAN_WARNING("You hear an electric whirr followed by a weighty thump!")) H.face_atom(T) H.throw_at(T, leapDistance, 1, src, do_throw_animation = FALSE) - return 1 + return TRUE else var/turf/simulated/open/TA = GetAbove(src) if (!istype(TA)) - to_chat(H, "There is a ceiling above you that stop you from leaping upwards!") - return 0 + to_chat(user, SPAN_WARNING("There is a ceiling above you that stop you from leaping upwards!")) + return FALSE for (var/atom/A in TA) if (!A.CanPass(src, TA, 1.5, 0)) - to_chat(H, "\The [A] blocks you!") - return 0 + to_chat(user, SPAN_WARNING("\The [A] blocks you!")) + return FALSE var/turf/leapEnd = get_step(TA, H.dir) - if (!leapEnd || isopenturf(leapEnd) || istype(leapEnd, /turf/space)\ - || leapEnd.density || leapEnd.contains_dense_objects()) - to_chat(H, "There is no valid ledge to scale ahead of you!") - return 0 + var/valid_climbable = is_valid_turf(leapEnd) + if(!valid_climbable) + to_chat(user, SPAN_WARNING("There is no valid ledge to scale ahead of you!")) + return - H.visible_message("\The [H] leaps up, out of view!", - "You leap up!") + H.visible_message(SPAN_NOTICE("\The [H] leaps up, out of view!"), SPAN_NOTICE("You leap up!")) // This setting is necessary even for combat type, to stop you from moving onto // the turf, falling back down, and then getting forcemoved to the final destination. @@ -699,11 +711,9 @@ // Combat type actuators are better, they allow you to jump instantly onto // a ledge. Regular actuators make you have to climb the rest of the way. if (!combatType) - H.visible_message("\The [H] starts pulling \himself up onto \the [leapEnd].", - "You start pulling yourself up onto \the [leapEnd].") + H.visible_message(SPAN_NOTICE("\The [H] starts pulling \himself up onto the [valid_climbable]."), SPAN_NOTICE("You start pulling yourself up onto \the [valid_climbable].")) if (!do_after(H, 4 SECONDS, use_user_turf = TRUE)) - H.visible_message("\The [H] is interrupted and falls!", - "You are interrupted and fall back down!") + H.visible_message(SPAN_WARNING("\The [H] is interrupted and falls!"), SPAN_DANGER("You are interrupted and fall back down!")) // Climbers will auto-fall if they exit the turf. This is for in case // something else interrupts them. @@ -711,23 +721,20 @@ TA.remove_climber(H) ADD_FALLING_ATOM(H) - return 1 + return TRUE - H.visible_message("\The [H] finishes climbing onto \the [leapEnd].", - "You finish climbing onto \the [leapEnd].") + H.visible_message(SPAN_NOTICE("\The [H] finishes climbing onto \the [valid_climbable]."), SPAN_NOTICE("You finish climbing onto \the [valid_climbable].")) else - H.visible_message("\The [H] lands on \the [leapEnd] with a heavy slam!", - "You land on \the [leapEnd] with a heavy thud!") + H.visible_message(SPAN_WARNING("\The [H] lands on \the [valid_climbable] with a heavy slam!"), SPAN_WARNING("You land on \the [valid_climbable] with a heavy thud!")) // open/Exited() removes from climbers. H.forceMove(leapEnd) - - return 1 + return TRUE /obj/item/rig_module/cooling_unit name = "mounted cooling unit" - toggleable = 1 + toggleable = TRUE origin_tech = list(TECH_MAGNET = 2, TECH_MATERIAL = 2, TECH_ENGINEERING = 3) interface_name = "mounted cooling unit" interface_desc = "A heat sink with liquid cooled radiator." @@ -765,13 +772,13 @@ use_power_cost = 5 module_cooldown = 25 - usable = 1 + usable = TRUE category = MODULE_VAURCA -/obj/item/rig_module/boring/engage() +/obj/item/rig_module/boring/engage(atom/target, mob/user) if (!..()) - return 0 + return FALSE playsound(src,'sound/magic/lightningbolt.ogg',60,1) var/turf/T = get_turf(holder.wearer) @@ -781,8 +788,6 @@ else T.ChangeTurf(/turf/space) - - var/global/list/lattice_users = list() /obj/item/rig_module/lattice @@ -792,25 +797,25 @@ var/global/list/lattice_users = list() interface_name = "neural lattice" interface_desc = "Synchronize neural lattice to reduce pain." - disruptive = 0 + disruptive = FALSE - toggleable = 1 - confined_use = 1 + toggleable = TRUE + confined_use = TRUE category = MODULE_VAURCA /obj/item/rig_module/lattice/activate() if (!..()) - return 0 + return FALSE var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "Neural lattice engaged. Pain receptors altered.") + to_chat(H, SPAN_NOTICE("Neural lattice engaged. Pain receptors altered.")) lattice_users.Add(H) /obj/item/rig_module/lattice/deactivate() if (!..()) - return 0 + return FALSE var/mob/living/carbon/human/H = holder.wearer - to_chat(H, "Neural lattice disengaged. Pain receptors restored.") - lattice_users.Remove(H) + to_chat(H, SPAN_NOTICE("Neural lattice disengaged. Pain receptors restored.")) + lattice_users.Remove(H) \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/modules/vision.dm b/code/modules/clothing/spacesuits/rig/modules/vision.dm index 401fda6a30c..6175af4f2ba 100644 --- a/code/modules/clothing/spacesuits/rig/modules/vision.dm +++ b/code/modules/clothing/spacesuits/rig/modules/vision.dm @@ -50,7 +50,6 @@ glasses = new /obj/item/clothing/glasses/hud/health /obj/item/rig_module/vision - name = "hardsuit visor" desc = "A layered, translucent visor system for a hardsuit." icon_state = "optics" @@ -58,10 +57,11 @@ interface_name = "optical scanners" interface_desc = "An integrated multi-mode vision system." - usable = 1 - toggleable = 1 - disruptive = 0 - confined_use = 1 + engage_on_activate = FALSE + usable = TRUE + toggleable = TRUE + disruptive = FALSE + confined_use = TRUE engage_string = "Cycle Visor Mode" activate_string = "Enable Visor" @@ -79,30 +79,29 @@ category = MODULE_GENERAL /obj/item/rig_module/vision/multi - name = "hardsuit optical package" desc = "A complete visor system of optical scanners and vision modes." icon_state = "fulloptics" - interface_name = "multi optical visor" interface_desc = "An integrated multi-mode vision system." - vision_modes = list(/datum/rig_vision/meson, - /datum/rig_vision/nvg, - /datum/rig_vision/thermal, - /datum/rig_vision/sechud, - /datum/rig_vision/medhud) + vision_modes = list( + /datum/rig_vision/meson, + /datum/rig_vision/nvg, + /datum/rig_vision/thermal, + /datum/rig_vision/sechud, + /datum/rig_vision/medhud + ) category = MODULE_SPECIAL /obj/item/rig_module/vision/meson - name = "hardsuit meson/material scanner" desc = "A layered, translucent visor system for a hardsuit." icon_state = "meson" - usable = 0 + usable = FALSE construction_cost = list(DEFAULT_WALL_MATERIAL = 1500, MATERIAL_GLASS = 5000) construction_time = 300 @@ -110,16 +109,17 @@ interface_name = "meson/material scanner" interface_desc = "An integrated meson/material scanner." - vision_modes = list(/datum/rig_vision/meson, - /datum/rig_vision/material) + vision_modes = list( + /datum/rig_vision/meson, + /datum/rig_vision/material + ) /obj/item/rig_module/vision/thermal - name = "hardsuit thermal scanner" desc = "A layered, translucent visor system for a hardsuit." icon_state = "thermal" - usable = 0 + usable = FALSE interface_name = "thermal scanner" interface_desc = "An integrated thermal scanner." @@ -129,12 +129,11 @@ category = MODULE_LIGHT_COMBAT /obj/item/rig_module/vision/nvg - name = "hardsuit night vision interface" desc = "A multi input night vision system for a hardsuit." icon_state = "night" - usable = 0 + usable = FALSE construction_cost = list(DEFAULT_WALL_MATERIAL = 1500, MATERIAL_GLASS = 5000, MATERIAL_URANIUM = 5000) construction_time = 300 @@ -147,12 +146,11 @@ category = MODULE_LIGHT_COMBAT /obj/item/rig_module/vision/sechud - name = "hardsuit security hud" desc = "A simple tactical information system for a hardsuit." icon_state = "securityhud" - usable = 0 + usable = FALSE construction_cost = list(DEFAULT_WALL_MATERIAL = 1500, MATERIAL_GLASS = 5000) construction_time = 300 @@ -165,12 +163,11 @@ category = MODULE_LIGHT_COMBAT /obj/item/rig_module/vision/medhud - name = "hardsuit medical hud" desc = "A simple medical status indicator for a hardsuit." icon_state = "healthhud" - usable = 0 + usable = FALSE construction_cost = list(DEFAULT_WALL_MATERIAL = 1500, MATERIAL_GLASS = 5000) construction_time = 300 @@ -187,17 +184,12 @@ ..() holder.visor = src -/obj/item/rig_module/vision/engage() - - var/starting_up = !active - +/obj/item/rig_module/vision/engage(atom/target, mob/user) if(!..() || !vision_modes) - return 0 - - // Don't cycle if this engage() is being called by activate(). - if(starting_up) - to_chat(holder.wearer, "You activate your visual sensors.") - return 1 + return FALSE + if(!active) + to_chat(user, SPAN_WARNING("\The [src] isn't activated!")) + return FALSE if(vision_modes.len > 1) vision_index++ @@ -205,10 +197,10 @@ vision_index = 1 vision = vision_modes[vision_index] - to_chat(holder.wearer, "You cycle your sensors to [vision.mode] mode.") + message_user(user, SPAN_NOTICE("You cycle \the [src] to [vision.mode] mode."), SPAN_NOTICE("\The [user] cycles \the [src] to [vision.mode] mode.")) else - to_chat(holder.wearer, "Your sensors only have one mode.") - return 1 + to_chat(user, SPAN_WARNING("\The [src] only has one mode.")) + return TRUE /obj/item/rig_module/vision/New() ..() @@ -224,4 +216,4 @@ if(!vision) vision = vision_datum processed_vision += vision_datum - vision_modes = processed_vision + vision_modes = processed_vision \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index cc60ee5ef4f..b2680d359c5 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -319,7 +319,7 @@ if(canremove) for(var/obj/item/rig_module/module in installed_modules) - module.deactivate() + module.deactivate(initiator) if(airtight) update_component_sealed() update_icon(1) @@ -555,15 +555,21 @@ //TODO: Fix Topic vulnerabilities for malfunction and AI override. /obj/item/rig/Topic(href,href_list) - if(!check_suit_access(usr)) + if(ismob(href)) + do_rig_thing(href, href_list) + return + do_rig_thing(usr, href_list) + +/obj/item/rig/proc/do_rig_thing(mob/user, var/list/href_list) + if(!check_suit_access(user)) return 0 if(href_list["toggle_piece"]) - if(ishuman(usr) && (usr.stat || usr.stunned || usr.lying)) - return 0 - toggle_piece(href_list["toggle_piece"], usr) + if(ishuman(user) && (user.stat || user.stunned || user.lying)) + return FALSE + toggle_piece(href_list["toggle_piece"], user) else if(href_list["toggle_seals"]) - toggle_seals(usr) + toggle_seals(user) else if(href_list["interact_module"]) var/module_index = text2num(href_list["interact_module"]) @@ -572,11 +578,11 @@ var/obj/item/rig_module/module = installed_modules[module_index] switch(href_list["module_mode"]) if("activate") - module.activate() + module.activate(user) if("deactivate") - module.deactivate() + module.deactivate(user) if("engage") - module.engage() + module.engage(null, user) if("select") selected_module = module if("select_charge_type") @@ -587,9 +593,9 @@ else if(href_list["toggle_suit_lock"]) locked = !locked - usr.set_machine(src) - src.add_fingerprint(usr) - return 0 + user.set_machine(src) + src.add_fingerprint(user) + return FALSE /obj/item/rig/proc/notify_ai(var/message) for(var/obj/item/rig_module/ai_container/module in installed_modules) @@ -858,7 +864,6 @@ to_chat(user, "\The [wearer] is now [wearer.resting ? "resting" : "getting up"].") /obj/item/rig/proc/forced_move(var/direction, var/mob/user) - // Why is all this shit in client/Move()? Who knows? if(world.time < wearer_move_delay) return @@ -866,6 +871,9 @@ if(!wearer || !wearer.loc || !ai_can_move_suit(user, check_user_module = 1)) return + if(!wearer.stat) // don't force move if our wearer is awake + return + //This is sota the goto stop mobs from moving var if(wearer.transforming || !wearer.canmove) return @@ -936,7 +944,7 @@ wearer_move_delay += 2 return wearer.buckled.relaymove(wearer,direction) - cell.use(200) //Arbitrary, TODO + cell.use(10) wearer.Move(get_step(get_turf(wearer),direction),direction) // This returns the rig if you are contained inside one, but not if you are wearing it diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm index 3287911ce71..3fd7e015f16 100644 --- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm +++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm @@ -95,7 +95,7 @@ for(var/obj/item/rig_module/module in suit.installed_modules) if(module.active && module.activates_on_touch) - if(module.engage(A)) + if(module.engage(A, H)) return 1 return 0 diff --git a/code/modules/clothing/spacesuits/rig/rig_verbs.dm b/code/modules/clothing/spacesuits/rig/rig_verbs.dm index 37e78b5febd..6f6f7c563e9 100644 --- a/code/modules/clothing/spacesuits/rig/rig_verbs.dm +++ b/code/modules/clothing/spacesuits/rig/rig_verbs.dm @@ -35,9 +35,9 @@ return if(!visor.active) - visor.activate() + visor.activate(usr) else - visor.deactivate() + visor.deactivate(usr) /obj/item/rig/proc/toggle_helmet() @@ -156,13 +156,13 @@ return if(!visor.active) - visor.activate() + visor.activate(usr) if(!visor.active) to_chat(usr, "The visor is suffering a hardware fault and cannot be configured.") return - visor.engage() + visor.engage(null, usr) /obj/item/rig/verb/alter_voice() @@ -186,7 +186,7 @@ to_chat(usr, "The hardsuit does not have a speech synthesiser.") return - speech.engage() + speech.engage(null, usr) /obj/item/rig/verb/select_module() @@ -257,10 +257,10 @@ if(module.active) to_chat(usr, "You attempt to deactivate \the [module.interface_name].") - module.deactivate() + module.deactivate(usr) else to_chat(usr, "You attempt to activate \the [module.interface_name].") - module.activate() + module.activate(usr) /obj/item/rig/verb/engage_module() @@ -294,4 +294,4 @@ return to_chat(usr, "You attempt to engage the [module.interface_name].") - module.engage() \ No newline at end of file + module.engage(null, usr) \ No newline at end of file diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index 4218c268207..1aab6834d81 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -68,6 +68,7 @@ var/digspeed //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) attack_verb = list("hit", "pierced", "sliced", "attacked") + hitsound = 'sound/weapons/rapidslice.ogg' var/drill_sound = "pickaxe" var/drill_verb = "excavating" var/autodrill = 0 //pickaxes must be manually swung to mine, drills can mine rocks via bump diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index 135620a952d..94b6f83ed8b 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -176,18 +176,21 @@ note dizziness decrements automatically in the mob's Life() proc. animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2) animate(pixel_x = pixel_x - pixel_x_diff, pixel_y = pixel_y - pixel_y_diff, time = 2) -/mob/do_attack_animation(atom/A) +/mob/do_attack_animation(atom/A, var/atom/attack_item) ..() is_floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. // What icon do we use for the attack? var/image/I - if(hand && l_hand) // Attacked with item in left hand. - I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 1) - else if (!hand && r_hand) // Attacked with item in right hand. - I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 1) - else // Attacked with a fist? - return + if(attack_item) + I = image(attack_item.icon, A, attack_item.icon_state, A.layer + 1) + else + if(hand && l_hand) // Attacked with item in left hand. + I = image(l_hand.icon, A, l_hand.icon_state, A.layer + 1) + else if (!hand && r_hand) // Attacked with item in right hand. + I = image(r_hand.icon, A, r_hand.icon_state, A.layer + 1) + else // Attacked with a fist? + return // Who can see the attack? var/list/viewing = list() diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 5c51a41ce7c..797f344a1d2 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -107,7 +107,7 @@ if(M.a_intent != I_HELP) var/action - switch(a_intent) + switch(M.a_intent) if(I_GRAB) action = "grabbed" if(I_DISARM) @@ -133,7 +133,6 @@ visible_message(SPAN_NOTICE("[M] [action] [src] waking [t_him] up!")) sleeping = 0 willfully_sleeping = FALSE - return /mob/living/carbon/electrocute_act(var/shock_damage, var/obj/source, var/siemens_coeff = 1.0, var/def_zone = null, var/tesla_shock = 0, var/ground_zero) if(status_flags & GODMODE) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 273740c5719..a41a73f433f 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -320,7 +320,8 @@ if(pointblank) process_point_blank(projectile, user, target) - if(process_projectile(projectile, user, target, user.zone_sel.selecting, clickparams)) + var/selected_zone = user.zone_sel ? user.zone_sel.selecting : BP_CHEST + if(process_projectile(projectile, user, target, selected_zone, clickparams)) var/show_emote = TRUE if(i > 1 && burst_delay < 3 && burst < 5) show_emote = FALSE @@ -626,10 +627,12 @@ return new_mode -/obj/item/gun/attack_self(mob/user) +/obj/item/gun/attack_self(mob/user, var/list/message_mobs) var/datum/firemode/new_mode = switch_firemodes(user) if(new_mode) to_chat(user, SPAN_NOTICE("\The [src] is now set to [new_mode.name].")) + for(var/M in message_mobs) + to_chat(M, SPAN_NOTICE("[user] has set \the [src] to [new_mode.name].")) // Safety Procs diff --git a/html/changelogs/geeves-hardsuit_activation.yml b/html/changelogs/geeves-hardsuit_activation.yml new file mode 100644 index 00000000000..304d2d99135 --- /dev/null +++ b/html/changelogs/geeves-hardsuit_activation.yml @@ -0,0 +1,17 @@ +author: Geeves + +delete-after: True + +changes: + - bugfix: "Fixed an issue with hardsuit items sometimes not working properly." + - bugfix: "Fixed a bug that caused the wrong item to get displayed in an attack animation sometimes." + - bugfix: "Fixed pickaxes not having an attack sound." + - bugfix: "Fixed spamming your hardsuit items causing you to do hotkey stuff when on click cooldown." + - bugfix: "Fixed a bug with doing actions on SSD people and not having the correct action come up." + - bugfix: "Fixed hardsuit visor cycling bringing up the activation message, despite not activating." + - rscadd: "Added unique messages to pAI / AI interacting with the hardsuit, messaging both parties." + - tweak: "pAI no longer have a three second wait time between using modules. Standard cooldowns still apply." + - tweak: "Walking around as a pAI in a RIG now only drains 10 cell charge, instead of 200." + - bugfix: "pAI can now properly puppet their unconscious or dead RIG pilot." + - tweak: "IDs in your hand now take priority over the one in your ID slot again." + - bugfix: "Leg actuators can now leap onto more ledges that you can normally work on, such as catwalks, properly." \ No newline at end of file