From 56a09db739aa82f78db5d8d8245880bd992b64e4 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Mon, 18 Jul 2016 13:15:26 -0700 Subject: [PATCH 1/3] Action Button Update - Refactors action button backend - Action buttons are no longer checked on Life(), items are responsible for adding/removing/updating them. - Item action buttons are no longer a static action_button_name define, items define actions_types, which is a list of paths. - Items can now have multiple action buttons. - This is handled by new arguments to ui_action_click, the first parameter is the user, the second is the path of the action datum that was invoked. - Refactored how internals function - You may now directly switch internals without breaking anything. - The internals icon has been updated to be more consistent. - Added action buttons for jetpacks - Added action buttons for oxygen tanks - Uses-based implants now qdel() themselves when they run out of uses. This is somewhat a buff to traitor implants, but it's such a minor change. The actual reasoning is so that the action buttons are properly removed. - Fixed a bug with the "Boo" spell which resulted in IsAvailable failing for certain ghosts. - You can now shift-click on movable HUD elements to reset them to the proper position (thank fucking christ) --- code/_onclick/hud/action.dm | 315 -------------- code/_onclick/hud/action_button.dm | 127 ++++++ code/_onclick/hud/hud.dm | 10 +- code/_onclick/hud/human.dm | 4 +- code/_onclick/hud/monkey.dm | 4 +- code/_onclick/hud/movable_screen_objects.dm | 2 +- code/_onclick/hud/screen_objects.dm | 179 ++++---- code/datums/action.dm | 406 ++++++++++++++++++ code/datums/mind.dm | 21 +- code/datums/spell.dm | 5 + code/game/gamemodes/cult/cult_items.dm | 3 +- .../miniantags/abduction/abduction_gear.dm | 24 +- .../miniantags/abduction/machinery/camera.dm | 46 +- code/game/gamemodes/miniantags/morph/morph.dm | 2 - .../miniantags/revenant/revenant_abilities.dm | 3 +- code/game/gamemodes/nuclear/nuclear.dm | 3 +- .../machinery/computer/camera_advanced.dm | 14 +- code/game/objects/effects/effect_system.dm | 2 +- code/game/objects/items.dm | 37 +- code/game/objects/items/devices/flashlight.dm | 5 +- .../objects/items/robot/robot_upgrades.dm | 6 +- .../objects/items/weapons/chrono_eraser.dm | 23 +- code/game/objects/items/weapons/defib.dm | 28 +- .../objects/items/weapons/implants/implant.dm | 14 +- .../items/weapons/implants/implant_freedom.dm | 5 +- .../items/weapons/implants/implant_misc.dm | 8 +- .../objects/items/weapons/melee/energy.dm | 1 + .../objects/items/weapons/storage/storage.dm | 3 - .../objects/items/weapons/tanks/jetpack.dm | 117 ++--- .../game/objects/items/weapons/tanks/tanks.dm | 113 ++--- .../objects/items/weapons/tanks/watertank.dm | 14 +- code/game/objects/items/weapons/twohanded.dm | 3 +- code/modules/admin/verbs/debug.dm | 4 +- code/modules/admin/verbs/honksquad.dm | 2 +- code/modules/admin/verbs/one_click_antag.dm | 2 +- code/modules/admin/verbs/randomverbs.dm | 2 +- code/modules/admin/verbs/striketeam.dm | 2 +- .../admin/verbs/striketeam_syndicate.dm | 2 +- code/modules/assembly/proximity.dm | 1 + code/modules/clothing/clothing.dm | 118 ++--- code/modules/clothing/glasses/glasses.dm | 25 +- code/modules/clothing/glasses/hud.dm | 1 + code/modules/clothing/head/hardhat.dm | 22 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/head/misc.dm | 2 +- code/modules/clothing/head/misc_special.dm | 4 +- code/modules/clothing/masks/boxing.dm | 3 +- code/modules/clothing/masks/breath.dm | 6 +- code/modules/clothing/masks/gasmask.dm | 31 +- code/modules/clothing/masks/miscellaneous.dm | 6 +- code/modules/clothing/shoes/magboots.dm | 12 +- code/modules/clothing/spacesuits/alien.dm | 4 +- .../modules/clothing/spacesuits/chronosuit.dm | 2 +- code/modules/clothing/spacesuits/plasmamen.dm | 10 +- code/modules/clothing/spacesuits/rig.dm | 31 +- .../spacesuits/rig/modules/utility.dm | 8 +- code/modules/clothing/suits/armor.dm | 15 +- code/modules/clothing/suits/hood.dm | 12 +- code/modules/clothing/suits/jobs.dm | 10 +- code/modules/clothing/suits/labcoat.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 16 +- .../clothing/under/accessories/accessory.dm | 16 +- .../clothing/under/accessories/holster.dm | 2 +- .../clothing/under/accessories/storage.dm | 2 +- code/modules/customitems/item_defines.dm | 8 +- code/modules/mob/dead/observer/spells.dm | 1 + code/modules/mob/living/carbon/brain/brain.dm | 8 +- code/modules/mob/living/carbon/carbon.dm | 21 +- .../mob/living/carbon/human/human_movement.dm | 2 +- .../mob/living/carbon/human/inventory.dm | 3 +- code/modules/mob/living/carbon/human/life.dm | 7 +- .../living/carbon/human/species/plasmaman.dm | 3 +- .../living/carbon/human/species/station.dm | 3 +- code/modules/mob/living/carbon/life.dm | 14 +- code/modules/mob/living/carbon/slime/life.dm | 1 + code/modules/mob/living/death.dm | 1 + code/modules/mob/living/life.dm | 81 ---- code/modules/mob/living/living_defines.dm | 1 - code/modules/mob/living/silicon/robot/life.dm | 1 + .../modules/mob/living/silicon/robot/robot.dm | 3 + .../mob/living/simple_animal/simple_animal.dm | 1 + code/modules/mob/mob.dm | 12 +- code/modules/mob/mob_defines.dm | 6 +- code/modules/projectiles/gun.dm | 13 +- .../projectiles/guns/projectile/automatic.dm | 10 +- .../projectiles/guns/projectile/launchers.dm | 4 +- .../projectiles/guns/projectile/pistol.dm | 4 +- .../projectiles/guns/projectile/sniper.dm | 2 +- .../projectiles/guns/projectile/toy.dm | 2 +- code/modules/reagents/newchem/drugs.dm | 8 +- code/modules/reagents/newchem/toxins.dm | 8 +- .../research/xenobiology/xenobio_camera.dm | 32 +- code/modules/surgery/dental_implant.dm | 2 +- .../surgery/organs/augments_internal.dm | 8 +- code/modules/surgery/organs/organ_internal.dm | 55 ++- icons/mob/actions.dmi | Bin 65769 -> 66241 bytes paradise.dme | 3 +- 97 files changed, 1230 insertions(+), 1022 deletions(-) delete mode 100644 code/_onclick/hud/action.dm create mode 100644 code/_onclick/hud/action_button.dm create mode 100644 code/datums/action.dm diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm deleted file mode 100644 index 4744b789712..00000000000 --- a/code/_onclick/hud/action.dm +++ /dev/null @@ -1,315 +0,0 @@ -#define AB_ITEM 1 -#define AB_SPELL 2 -#define AB_INNATE 3 -#define AB_GENERIC 4 - -#define AB_CHECK_RESTRAINED 1 -#define AB_CHECK_STUNNED 2 -#define AB_CHECK_LYING 4 -#define AB_CHECK_ALIVE 8 -#define AB_CHECK_INSIDE 16 - - -/datum/action - var/name = "Generic Action" - var/action_type = AB_ITEM - var/procname = null - var/atom/movable/target = null - var/check_flags = 0 - var/processing = 0 - var/active = 0 - var/obj/screen/movable/action_button/button = null - var/button_icon = 'icons/mob/actions.dmi' - var/button_icon_state = "default" - var/background_icon_state = "bg_default" - var/mob/living/owner - -/datum/action/New(var/Target) - target = Target - -/datum/action/Destroy() - if(owner) - Remove(owner) - if(target) - target = null - return ..() - -/datum/action/proc/Grant(mob/living/T) - if(owner) - if(owner == T) - return - Remove(owner) - owner = T - owner.actions.Add(src) - owner.update_action_buttons() - return - -/datum/action/proc/Remove(mob/living/T) - if(button) - if(T.client) - T.client.screen -= button - qdel(button) - button = null - if(T.actions) - T.actions.Remove(src) - T.update_action_buttons() - owner = null - return - -/datum/action/proc/Trigger() - if(!Checks()) - return - switch(action_type) - if(AB_ITEM) - if(target) - var/obj/item/item = target - item.ui_action_click() - if(AB_SPELL) - if(target) - var/obj/effect/proc_holder/spell = target - spell.Click() - if(AB_INNATE) - if(!active) - Activate() - else - Deactivate() - if(AB_GENERIC) - if(target && procname) - call(target,procname)(usr) - return - -/datum/action/proc/Activate() - return - -/datum/action/proc/Deactivate() - return - -/datum/action/proc/Process() - return - -/datum/action/proc/CheckRemoval(mob/living/user) // 1 if action is no longer valid for this mob and should be removed - return 0 - -/datum/action/proc/IsAvailable() - return Checks() - -/datum/action/proc/Checks()// returns 1 if all checks pass - if(!owner) - return 0 - if(check_flags & AB_CHECK_RESTRAINED) - if(owner.restrained()) - return 0 - if(check_flags & AB_CHECK_STUNNED) - if(owner.stunned) - return 0 - if(check_flags & AB_CHECK_LYING) - if(owner.lying) - return 0 - if(check_flags & AB_CHECK_ALIVE) - if(owner.stat) - return 0 - if(check_flags & AB_CHECK_INSIDE) - if(!(target in owner)) - return 0 - return 1 - -/datum/action/proc/UpdateName() - return name - -/obj/screen/movable/action_button - var/datum/action/owner - screen_loc = "WEST,NORTH" - -/obj/screen/movable/action_button/Click(location,control,params) - var/list/modifiers = params2list(params) - if(modifiers["shift"]) - moved = 0 - return 1 - if(usr.next_move >= world.time) // Is this needed ? - return - owner.Trigger() - return 1 - -/obj/screen/movable/action_button/proc/UpdateIcon() - if(!owner) - return - icon = owner.button_icon - icon_state = owner.background_icon_state - - overlays.Cut() - var/image/img - if(owner.action_type == AB_ITEM && owner.target) - var/obj/item/I = owner.target - img = image(I.icon, src , I.icon_state) - else if(owner.button_icon && owner.button_icon_state) - img = image(owner.button_icon,src,owner.button_icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - overlays += img - - if(!owner.IsAvailable()) - color = rgb(128,0,0,128) - else - color = rgb(255,255,255,255) - -//Hide/Show Action Buttons ... Button -/obj/screen/movable/action_button/hide_toggle - name = "Hide Buttons" - icon = 'icons/mob/actions.dmi' - icon_state = "bg_default" - var/hidden = 0 - -/obj/screen/movable/action_button/hide_toggle/Click() - usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden - - hidden = usr.hud_used.action_buttons_hidden - if(hidden) - name = "Show Buttons" - else - name = "Hide Buttons" - UpdateIcon() - usr.update_action_buttons() - - -/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user) - if(isalien(user)) - icon_state = "bg_alien" - else - icon_state = "bg_default" - UpdateIcon() - return - -/obj/screen/movable/action_button/hide_toggle/UpdateIcon() - overlays.Cut() - var/image/img = image(icon,src,hidden?"show":"hide") - overlays += img - return - -//This is the proc used to update all the action buttons. Properly defined in /mob/living/ -/mob/proc/update_action_buttons() - return - -#define AB_WEST_OFFSET 4 -#define AB_NORTH_OFFSET 26 -#define AB_MAX_COLUMNS 10 - -/datum/hud/proc/ButtonNumberToScreenCoords(var/number) // TODO : Make this zero-indexed for readabilty - var/row = round((number-1)/AB_MAX_COLUMNS) - var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 - var/coord_col = "+[col-1]" - var/coord_col_offset = 4+2*col - var/coord_row = "[-1 - row]" - var/coord_row_offset = 26 - return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:[coord_row_offset]" - -/datum/hud/proc/SetButtonCoords(var/obj/screen/button,var/number) - var/row = round((number-1)/AB_MAX_COLUMNS) - var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 - var/x_offset = 32*(col-1) + 4 + 2*col - var/y_offset = -32*(row+1) + 26 - - var/matrix/M = matrix() - M.Translate(x_offset,y_offset) - button.transform = M - -//Presets for item actions -/datum/action/item_action - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE - -/datum/action/item_action/CheckRemoval(mob/living/user) - return get(target, /mob/living) != user - -/datum/action/item_action/hands_free - check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE - -// for clothing accessories like holsters -/datum/action/item_action/accessory - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE - -/datum/action/item_action/accessory/Checks() - . = ..() - if(!.) - return 0 - if(target.loc == owner) - return 1 - if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner) - return 1 - return 0 - -///prset for organ actions -/datum/action/item_action/organ_action - check_flags = AB_CHECK_ALIVE - -/datum/action/item_action/organ_action/CheckRemoval(mob/living/carbon/user) - if(!iscarbon(user)) - return 1 - if(target in user.internal_organs) - return 0 - return 1 - -/datum/action/item_action/organ_action/IsAvailable() - var/obj/item/organ/internal/I = target - if(!I.owner) - return 0 - return ..() - -//Preset for spells -/datum/action/spell_action - action_type = AB_SPELL - check_flags = 0 - background_icon_state = "bg_spell" - -/datum/action/spell_action/UpdateName() - var/obj/effect/proc_holder/spell/spell = target - if(!spell) - return 0 - return spell.name - -/datum/action/spell_action/IsAvailable() - if(!target) - return 0 - var/obj/effect/proc_holder/spell/spell = target - - if(usr) - return spell.can_cast(usr) - else - if(owner) - return spell.can_cast(owner) - return 1 - -/datum/action/spell_action/CheckRemoval() - if(owner.mind) - if(target in owner.mind.spell_list) - return 0 - return !(target in owner.spell_list) - - //Action button controlling a mob's research examine ability. -/datum/action/scan_mode - name = "Toggle Research Scanner" - button_icon_state = "scan_mode" - check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_ALIVE - action_type = AB_INNATE - var/devices = 0 //How may enabled scanners the mob has - -/datum/action/scan_mode/Activate() - active = 1 - owner.research_scanner = 1 - to_chat(owner, " Research analyzer is now active.") - -/datum/action/scan_mode/Deactivate() - active = 0 - owner.research_scanner = 0 - to_chat(owner, " Research analyzer deactivated.") - -/datum/action/scan_mode/Grant(mob/living/T) - devices += 1 - ..(T) - -/datum/action/scan_mode/CheckRemoval(mob/living/user) - if(devices) - return 0 - return 1 - -/datum/action/scan_mode/Remove(mob/living/T) - owner.research_scanner = 0 - ..(T) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm new file mode 100644 index 00000000000..16cb8baa044 --- /dev/null +++ b/code/_onclick/hud/action_button.dm @@ -0,0 +1,127 @@ + +/obj/screen/movable/action_button + var/datum/action/linked_action + screen_loc = null + +/obj/screen/movable/action_button/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + usr.update_action_buttons() //redraw buttons that are no longer considered "moved" + return 1 + if(usr.next_move >= world.time) // Is this needed ? + return + linked_action.Trigger() + return 1 + +//Hide/Show Action Buttons ... Button +/obj/screen/movable/action_button/hide_toggle + name = "Hide Buttons" + icon = 'icons/mob/actions.dmi' + icon_state = "bg_default" + var/hidden = 0 + +/obj/screen/movable/action_button/hide_toggle/Click(location,control,params) + var/list/modifiers = params2list(params) + if(modifiers["shift"]) + moved = 0 + return 1 + usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden + + hidden = usr.hud_used.action_buttons_hidden + if(hidden) + name = "Show Buttons" + else + name = "Hide Buttons" + UpdateIcon() + usr.update_action_buttons() + + +/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(mob/living/user) + if(isalien(user)) + icon_state = "bg_alien" + else + icon_state = "bg_default" + UpdateIcon() + +/obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon() + overlays.Cut() + var/image/img = image(icon, src, hidden ? "show" : "hide") + overlays += img + + +/obj/screen/movable/action_button/MouseEntered(location,control,params) + openToolTip(usr,src,params,title = name,content = desc) + + +/obj/screen/movable/action_button/MouseExited() + closeToolTip(usr) + + +/mob/proc/update_action_buttons_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +//This is the proc used to update all the action buttons. +/mob/proc/update_action_buttons(reload_screen) + if(!hud_used || !client) + return + + if(hud_used.hud_shown != HUD_STYLE_STANDARD) + return + + var/button_number = 0 + + if(hud_used.action_buttons_hidden) + for(var/datum/action/A in actions) + A.button.screen_loc = null + if(reload_screen) + client.screen += A.button + else + for(var/datum/action/A in actions) + button_number++ + A.UpdateButtonIcon() + var/obj/screen/movable/action_button/B = A.button + if(!B.moved) + B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) + else + B.screen_loc = B.moved + if(reload_screen) + client.screen += B + + if(!button_number) + hud_used.hide_actions_toggle.screen_loc = null + return + + if(!hud_used.hide_actions_toggle.moved) + hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) + else + hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved + if(reload_screen) + client.screen += hud_used.hide_actions_toggle + + + +#define AB_MAX_COLUMNS 10 + +/datum/hud/proc/ButtonNumberToScreenCoords(number) // TODO : Make this zero-indexed for readabilty + var/row = round((number - 1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + + var/coord_col = "+[col-1]" + var/coord_col_offset = 4 + 2 * col + + var/coord_row = "[row ? -row : "+0"]" + + return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" + +/datum/hud/proc/SetButtonCoords(obj/screen/button,number) + var/row = round((number-1)/AB_MAX_COLUMNS) + var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1 + var/x_offset = 32*(col-1) + 4 + 2*col + var/y_offset = -32*(row+1) + 26 + + var/matrix/M = matrix() + M.Translate(x_offset,y_offset) + button.transform = M diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index e49e99ad6b7..29e7c676ac4 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -36,12 +36,16 @@ var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = 0 + var/obj/screen/internals + /mob/proc/create_mob_hud() if(client && !hud_used) hud_used = new /datum/hud(src) /datum/hud/New(mob/owner) mymob = owner + hide_actions_toggle = new + hide_actions_toggle.InitialiseIcon(mymob) /datum/hud/Destroy() if(mymob.hud_used == src) @@ -79,7 +83,6 @@ //clear mob refs to screen objects mymob.throw_icon = null - mymob.internals = null mymob.healths = null mymob.healthdoll = null mymob.pullin = null @@ -92,6 +95,7 @@ alien_plasma_display = null vampire_blood_display = null nightvisionicon = null + internals = null mymob = null return ..() @@ -122,6 +126,8 @@ if(infodisplay.len) mymob.client.screen += infodisplay + mymob.client.screen += hide_actions_toggle + if(action_intent) action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position @@ -158,7 +164,7 @@ hud_version = display_hud_version persistant_inventory_update() - mymob.update_action_buttons() + mymob.update_action_buttons(1) reorganize_alerts() reload_fullscreen() diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 3a6e9df5dae..8cc6e6ac9ad 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -309,8 +309,8 @@ mymob.throw_icon.alpha = ui_alpha hotkeybuttons += mymob.throw_icon - mymob.internals = new /obj/screen/internals() - infodisplay += mymob.internals + internals = new /obj/screen/internals() + infodisplay += internals mymob.healths = new /obj/screen/healths() infodisplay += mymob.healths diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index ef87435c79f..c6bbbd27ae2 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -96,8 +96,8 @@ mymob.throw_icon.alpha = ui_alpha hotkeybuttons += mymob.throw_icon - mymob.internals = new /obj/screen/internals() - infodisplay += mymob.internals + internals = new /obj/screen/internals() + infodisplay += internals mymob.healths = new /obj/screen/healths() infodisplay += mymob.healths diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index e8d4e4b3d73..315fce5bf65 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -43,7 +43,7 @@ var/pix_Y = text2num(screen_loc_Y[2]) - 16 screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" - moved = TRUE + moved = screen_loc //Debug procs diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 1b32a9201a3..d5e68abf9d2 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -96,114 +96,99 @@ screen_loc = ui_internal /obj/screen/internals/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - if(!C.stat && !C.stunned && !C.paralysis && !C.restrained()) - if(C.internal) - C.internal = null - to_chat(C, "No longer running on internals.") - if(C.internals) - C.internals.icon_state = "internal0" - else + if(!iscarbon(usr)) + return + var/mob/living/carbon/C = usr + if(C.incapacitated()) + return - var/no_mask - if(!(C.wear_mask && C.wear_mask.flags & AIRTIGHT)) - if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(!(H.head && H.head.flags & AIRTIGHT)) - no_mask = 1 + if(C.internal) + C.internal = null + to_chat(C, "No longer running on internals.") + icon_state = "internal0" + else + var/no_mask = FALSE + if(!C.wear_mask || !(C.wear_mask.flags & AIRTIGHT)) + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(!H.head || !(H.head.flags & AIRTIGHT)) + no_mask = TRUE - if(no_mask) - to_chat(C, "You are not wearing a suitable mask or helmet.") - return 1 - else - var/list/nicename = null - var/list/tankcheck = null - var/breathes = "oxygen" //default, we'll check later - var/list/contents = list() - var/from = "on" + if(no_mask) + to_chat(C, "You are not wearing a suitable mask or helmet.") + return - if(ishuman(C)) - var/mob/living/carbon/human/H = C - breathes = H.species.breath_type - nicename = list ("suit", "back", "belt", "right hand", "left hand", "left pocket", "right pocket") - tankcheck = list (H.s_store, C.back, H.belt, C.r_hand, C.l_hand, H.l_store, H.r_store) - else - nicename = list("right hand", "left hand", "back") - tankcheck = list(C.r_hand, C.l_hand, C.back) + var/list/nicename = null + var/list/tankcheck = null + var/breathes = "oxygen" + var/list/contents = list() + var/from = "on" - // Rigs are a fucking pain since they keep an air tank in nullspace. - if(istype(C.back,/obj/item/weapon/rig)) - var/obj/item/weapon/rig/rig = C.back - if(rig.air_supply) - from = "in" - nicename |= "hardsuit" - tankcheck |= rig.air_supply - - for(var/i=1, i bestcontents) + best = i + bestcontents = contents[i] + //We've determined the best container now we set it as our internals + if(best) + to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].") + C.internal = tankcheck[best] - var/best = 0 - var/bestcontents = 0 - for(var/i=1, i < contents.len + 1 , ++i) - if(!contents[i]) - continue - if(contents[i] > bestcontents) - best = i - bestcontents = contents[i] + if(C.internal) + icon_state = "internal1" + else + to_chat(C, "You don't have a[breathes == "oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.") - - //We've determined the best container now we set it as our internals - - if(best) - to_chat(C, "You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].") - C.internal = tankcheck[best] - - - if(C.internal) - if(C.internals) - C.internals.icon_state = "internal1" - else - to_chat(C, "You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.") + C.update_action_buttons_icon() /obj/screen/mov_intent name = "run/walk toggle" diff --git a/code/datums/action.dm b/code/datums/action.dm new file mode 100644 index 00000000000..a8cab9a196f --- /dev/null +++ b/code/datums/action.dm @@ -0,0 +1,406 @@ +#define AB_CHECK_RESTRAINED 1 +#define AB_CHECK_STUNNED 2 +#define AB_CHECK_LYING 4 +#define AB_CHECK_CONSCIOUS 8 + + +/datum/action + var/name = "Generic Action" + var/desc = null + var/obj/target = null + var/check_flags = 0 + var/processing = 0 + var/obj/screen/movable/action_button/button = null + var/button_icon = 'icons/mob/actions.dmi' + var/background_icon_state = "bg_default" + + var/icon_icon = 'icons/mob/actions.dmi' + var/button_icon_state = "default" + var/mob/owner + +/datum/action/New(var/Target) + target = Target + button = new + button.linked_action = src + button.name = name + +/datum/action/Destroy() + if(owner) + Remove(owner) + if(target) + target = null + qdel(button) + button = null + return ..() + +/datum/action/proc/Grant(mob/living/L) + if(owner) + if(owner == L) + return + Remove(owner) + owner = L + L.actions += src + if(L.client) + L.client.screen += button + L.update_action_buttons() + +/datum/action/proc/Remove(mob/living/L) + if(L.client) + L.client.screen -= button + button.moved = FALSE //so the button appears in its normal position when given to another owner. + L.actions -= src + L.update_action_buttons() + owner = null + +/datum/action/proc/Trigger() + if(!IsAvailable()) + return 0 + return 1 + +/datum/action/proc/Process() + return + +/datum/action/proc/IsAvailable()// returns 1 if all checks pass + if(!owner) + return 0 + if(check_flags & AB_CHECK_RESTRAINED) + if(owner.restrained()) + return 0 + if(check_flags & AB_CHECK_STUNNED) + if(owner.stunned) + return 0 + if(check_flags & AB_CHECK_LYING) + if(owner.lying) + return 0 + if(check_flags & AB_CHECK_CONSCIOUS) + if(owner.stat) + return 0 + return 1 + +/datum/action/proc/UpdateButtonIcon() + if(button) + button.icon = button_icon + button.icon_state = background_icon_state + + ApplyIcon(button) + + if(!IsAvailable()) + button.color = rgb(128,0,0,128) + else + button.color = rgb(255,255,255,255) + return 1 + +/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.overlays.Cut() + if(icon_icon && button_icon_state) + var/image/img + img = image(icon_icon, current_button, button_icon_state) + img.pixel_x = 0 + img.pixel_y = 0 + current_button.overlays += img + +//Presets for item actions +/datum/action/item_action + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + +/datum/action/item_action/New(Target) + ..() + var/obj/item/I = target + I.actions += src + +/datum/action/item_action/Destroy() + var/obj/item/I = target + I.actions -= src + return ..() + +/datum/action/item_action/Trigger() + if(!..()) + return 0 + if(target) + var/obj/item/I = target + I.ui_action_click(owner, type) + return 1 + +/datum/action/item_action/ApplyIcon(obj/screen/movable/action_button/current_button) + current_button.overlays.Cut() + if(target) + var/obj/item/I = target + var/old_layer = I.layer + var/old_plane = I.plane + I.layer = 21 + I.plane = HUD_PLANE + current_button.overlays += I + I.layer = old_layer + I.plane = old_plane + +/datum/action/item_action/toggle_light + name = "Toggle Light" + +/datum/action/item_action/toggle_hood + name = "Toggle Hood" + +/datum/action/item_action/toggle_firemode + name = "Toggle Firemode" + +/datum/action/item_action/startchainsaw + name = "Pull The Starting Cord" + +/datum/action/item_action/toggle_gunlight + name = "Toggle Gunlight" + +/datum/action/item_action/toggle_mode + name = "Toggle Mode" + +/datum/action/item_action/toggle_barrier_spread + name = "Toggle Barrier Spread" + +/datum/action/item_action/equip_unequip_TED_Gun + name = "Equip/Unequip TED Gun" + +/datum/action/item_action/toggle_paddles + name = "Toggle Paddles" + +/datum/action/item_action/set_internals + name = "Set Internals" + +/datum/action/item_action/set_internals/UpdateButtonIcon() + if(..()) //button available + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + if(target == C.internal) + button.icon_state = "bg_default_on" + +/datum/action/item_action/toggle_mister + name = "Toggle Mister" + +/datum/action/item_action/toggle_helmet_light + name = "Toggle Helmet Light" + +/datum/action/item_action/toggle_helmet_mode + name = "Toggle Helmet Mode" + +/datum/action/item_action/toggle_hardsuit_mode + name = "Toggle Hardsuit Mode" + +/datum/action/item_action/toggle +/datum/action/item_action/toggle/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + +/datum/action/item_action/openclose +/datum/action/item_action/openclose/New(Target) + ..() + name = "Open/Close [target.name]" + button.name = name + +/datum/action/item_action/button +/datum/action/item_action/button/New(Target) + ..() + name = "Button/Unbutton [target.name]" + button.name = name + +/datum/action/item_action/zipper +/datum/action/item_action/zipper/New(Target) + ..() + name = "Zip/Unzip [target.name]" + button.name = name + +/datum/action/item_action/halt + name = "HALT!" + +/datum/action/item_action/hoot + name = "Hoot" + +/datum/action/item_action/caw + name = "Caw" + +/datum/action/item_action/toggle_voice_box + name = "Toggle Voice Box" + +/datum/action/item_action/change + name = "Change" + +/datum/action/item_action/noir + name = "Noir" + +/datum/action/item_action/YEEEAAAAAHHHHHHHHHHHHH + name = "YEAH!" + +/datum/action/item_action/adjust +/datum/action/item_action/adjust/New(Target) + ..() + name = "Adjust [target.name]" + button.name = name + +/datum/action/item_action/switch_hud + name = "Switch HUD" + +/datum/action/item_action/toggle_wings + name = "Toggle Wings" + +/datum/action/item_action/toggle_helmet + name = "Toggle Helmet" + +/datum/action/item_action/toggle_jetpack + name = "Toggle Jetpack" + +/datum/action/item_action/jetpack_stabilization + name = "Toggle Jetpack Stabilization" + +/datum/action/item_action/jetpack_stabilization/IsAvailable() + var/obj/item/weapon/tank/jetpack/J = target + if(!istype(J) || !J.on) + return 0 + return ..() + +/datum/action/item_action/hands_free + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/hands_free/activate + name = "Activate" + +/datum/action/item_action/toggle_research_scanner + name = "Toggle Research Scanner" + button_icon_state = "scan_mode" + +/datum/action/item_action/toggle_research_scanner/Trigger() + if(IsAvailable()) + owner.research_scanner = !owner.research_scanner + to_chat(owner, "Research analyzer is now [owner.research_scanner ? "active" : "deactivated"].") + return 1 + +/datum/action/item_action/toggle_research_scanner/Remove(mob/living/L) + if(owner) + owner.research_scanner = 0 + ..() + +/datum/action/item_action/toggle_research_scanner/ApplyIcon(obj/screen/movable/action_button/current_button) + if(button_icon && button_icon_state) + var/image/img = image(button_icon, current_button, "scan_mode") + current_button.overlays += img + +/datum/action/item_action/remove_badge + name = "Remove Holobadge" + +///prset for organ actions +/datum/action/item_action/organ_action + check_flags = AB_CHECK_CONSCIOUS + +/datum/action/item_action/organ_action/IsAvailable() + var/obj/item/organ/internal/I = target + if(!I.owner) + return 0 + return ..() + +/datum/action/item_action/organ_action/toggle +/datum/action/item_action/organ_action/toggle/New(Target) + ..() + name = "Toggle [target.name]" + button.name = name + +// for clothing accessories like holsters +/datum/action/item_action/accessory + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_CONSCIOUS + +/datum/action/item_action/accessory/IsAvailable() + . = ..() + if(!.) + return 0 + if(target.loc == owner) + return 1 + if(istype(target.loc, /obj/item/clothing/under) && target.loc.loc == owner) + return 1 + return 0 + +/datum/action/item_action/accessory/holster + name = "Holster" + +/datum/action/item_action/accessory/storage + name = "View Storage" + + +//Preset for spells +/datum/action/spell_action + check_flags = 0 + background_icon_state = "bg_spell" + +/datum/action/spell_action/New(Target) + ..() + var/obj/effect/proc_holder/spell/S = target + S.action = src + name = S.name + button_icon = S.action_icon + button_icon_state = S.action_icon_state + background_icon_state = S.action_background_icon_state + button.name = name + +/datum/action/spell_action/Destroy() + var/obj/effect/proc_holder/spell/S = target + S.action = null + return ..() + +/datum/action/spell_action/Trigger() + if(!..()) + return 0 + if(target) + var/obj/effect/proc_holder/spell = target + spell.Click() + return 1 + +/datum/action/spell_action/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/spell/spell = target + + if(usr) + return spell.can_cast(usr) + else + if(owner) + return spell.can_cast(owner) + return 1 + +/*/datum/action/spell_action/alien +/datum/action/spell_action/alien/IsAvailable() + if(!target) + return 0 + var/obj/effect/proc_holder/alien/ab = target + + if(usr) + return ab.cost_check(ab.check_turf, usr, 1) + else + if(owner) + return ab.cost_check(ab.check_turf, owner, 1) + return 1*/ + +//Preset for general and toggled actions +/datum/action/innate + check_flags = 0 + var/active = 0 + +/datum/action/innate/Trigger() + if(!..()) + return 0 + if(!active) + Activate() + else + Deactivate() + return 1 + +/datum/action/innate/proc/Activate() + return + +/datum/action/innate/proc/Deactivate() + return + +//Preset for action that call specific procs (consider innate) +/datum/action/generic + check_flags = 0 + var/procname + +/datum/action/generic/Trigger() + if(!..()) + return 0 + if(target && procname) + call(target,procname)(usr) + return 1 diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 750c0f2f5df..3fa17f82ab0 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1492,15 +1492,7 @@ /datum/mind/proc/AddSpell(var/obj/effect/proc_holder/spell/spell) spell_list += spell - if(!spell.action) - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state spell.action.Grant(current) - return /datum/mind/proc/transfer_actions(var/mob/living/new_character) if(current && current.actions) @@ -1509,16 +1501,9 @@ transfer_mindbound_actions(new_character) /datum/mind/proc/transfer_mindbound_actions(var/mob/living/new_character) - for(var/obj/effect/proc_holder/spell/spell in spell_list) - if(!spell.action) // Unlikely but whatever - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - spell.action.Grant(new_character) - return + for(var/X in spell_list) + var/obj/effect/proc_holder/spell/S = X + S.action.Grant(new_character) /datum/mind/proc/get_ghost(even_if_they_cant_reenter) for(var/mob/dead/observer/G in dead_mob_list) diff --git a/code/datums/spell.dm b/code/datums/spell.dm index 978eb6e77a2..fa48fcd2ee7 100644 --- a/code/datums/spell.dm +++ b/code/datums/spell.dm @@ -134,6 +134,7 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin /obj/effect/proc_holder/spell/New() ..() + action = new(src) still_recharging_msg = "[name] is still recharging." charge_counter = charge_max @@ -152,9 +153,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin return /obj/effect/proc_holder/spell/proc/start_recharge() + if(action) + action.UpdateButtonIcon() while(charge_counter < charge_max) sleep(1) charge_counter++ + if(action) + action.UpdateButtonIcon() /obj/effect/proc_holder/spell/proc/perform(list/targets, recharge = 1, mob/user = usr) //if recharge is started is important for the trigger spells before_cast(targets) diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 0dc3910da1e..91147183ba1 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -23,6 +23,7 @@ return /obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob) + ..() if(!iscultist(user)) to_chat(user, "\red An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly.") user.Dizzy(120) @@ -58,7 +59,7 @@ allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade) armor = list(melee = 50, bullet = 30, laser = 50, energy = 20, bomb = 25, bio = 10, rad = 0) flags_inv = HIDEJUMPSUIT - + /obj/item/clothing/head/magus name = "magus helm" icon_state = "magus" diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm index 2982cc3543d..71d0264f1f5 100644 --- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm +++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm @@ -13,8 +13,7 @@ blood_overlay_type = "armor" origin_tech = "materials=5;biotech=4;powerstorage=5;abductor=3" armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15) - action_button_name = "Activate" - action_button_custom_type = /datum/action/item_action/hands_free + actions_types = list(/datum/action/item_action/hands_free/activate) var/mode = VEST_STEALTH var/stealth_active = 0 var/combat_cooldown = 10 @@ -31,18 +30,21 @@ DeactivateStealth() armor = combat_armor icon_state = "vest_combat" - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - return if(VEST_COMBAT)// TO STEALTH mode = VEST_STEALTH armor = stealth_armor icon_state = "vest_stealth" - if(istype(loc, /mob/living/carbon/human)) - var/mob/living/carbon/human/H = loc - H.update_inv_wear_suit() - return + + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc + H.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user) + if(slot == slot_wear_suit) //we only give the mob the ability to activate the vest if he's actually wearing it. + return 1 /obj/item/clothing/suit/armor/abductor/vest/proc/SetDisguise(datum/icon_snapshot/entry) disguise = entry @@ -355,7 +357,7 @@ Congratulations! You are now trained for xenobiology research!"} origin_tech = "materials=6;combat=5;biotech=7;abductor=4" force = 7 w_class = 3 - action_button_name = "Toggle Mode" + actions_types = list(/datum/action/item_action/toggle_mode) /obj/item/weapon/abductor_baton/proc/toggle(mob/living/user=usr) mode = (mode+1)%BATON_MODES diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm index 7d5028f4875..187f20e0b1d 100644 --- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm +++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm @@ -2,13 +2,13 @@ name = "Human Observation Console" var/team = 0 networks = list("SS13","Abductor") - off_action = new/datum/action/camera_off/abductor //specific datum - var/datum/action/teleport_in/tele_in_action = new - var/datum/action/teleport_out/tele_out_action = new - var/datum/action/teleport_self/tele_self_action = new - var/datum/action/vest_mode_swap/vest_mode_action = new - var/datum/action/vest_disguise_swap/vest_disguise_action = new - var/datum/action/set_droppoint/set_droppoint_action = new + off_action = new /datum/action/innate/camera_off/abductor //specific datum + var/datum/action/innate/teleport_in/tele_in_action = new + var/datum/action/innate/teleport_out/tele_out_action = new + var/datum/action/innate/teleport_self/tele_self_action = new + var/datum/action/innate/vest_mode_swap/vest_mode_action = new + var/datum/action/innate/vest_disguise_swap/vest_disguise_action = new + var/datum/action/innate/set_droppoint/set_droppoint_action = new var/obj/machinery/abductor/console/console icon = 'icons/obj/abductor.dmi' @@ -57,7 +57,7 @@ return return ..() -/datum/action/camera_off/abductor/Activate() +/datum/action/innate/camera_off/abductor/Activate() if(!target || !iscarbon(target)) return var/mob/living/carbon/C = target @@ -84,12 +84,11 @@ src.Remove(C) -/datum/action/teleport_in +/datum/action/innate/teleport_in name = "Send To" button_icon_state = "beam_down" - action_type = AB_INNATE -/datum/action/teleport_in/Activate() +/datum/action/innate/teleport_in/Activate() if(!target || !iscarbon(owner)) return var/mob/living/carbon/human/C = owner @@ -99,24 +98,22 @@ if(cameranet.checkTurfVis(remote_eye.loc)) P.PadToLoc(remote_eye.loc) -/datum/action/teleport_out +/datum/action/innate/teleport_out name = "Retrieve" button_icon_state = "beam_up" - action_type = AB_INNATE -/datum/action/teleport_out/Activate() +/datum/action/innate/teleport_out/Activate() if(!target || !iscarbon(owner)) return var/obj/machinery/abductor/console/console = target console.TeleporterRetrieve() -/datum/action/teleport_self +/datum/action/innate/teleport_self name = "Send Self" button_icon_state = "beam_down" - action_type = AB_INNATE -/datum/action/teleport_self/Activate() +/datum/action/innate/teleport_self/Activate() if(!target || !iscarbon(owner)) return var/mob/living/carbon/human/C = owner @@ -126,35 +123,32 @@ if(cameranet.checkTurfVis(remote_eye.loc)) P.MobToLoc(remote_eye.loc,C) -/datum/action/vest_mode_swap +/datum/action/innate/vest_mode_swap name = "Switch Vest Mode" button_icon_state = "vest_mode" - action_type = AB_INNATE -/datum/action/vest_mode_swap/Activate() +/datum/action/innate/vest_mode_swap/Activate() if(!target || !iscarbon(owner)) return var/obj/machinery/abductor/console/console = target console.FlipVest() -/datum/action/vest_disguise_swap +/datum/action/innate/vest_disguise_swap name = "Switch Vest Disguise" button_icon_state = "vest_disguise" - action_type = AB_INNATE -/datum/action/vest_disguise_swap/Activate() +/datum/action/innate/vest_disguise_swap/Activate() if(!target || !iscarbon(owner)) return var/obj/machinery/abductor/console/console = target console.SelectDisguise(remote=1) -/datum/action/set_droppoint +/datum/action/innate/set_droppoint name = "Set Experiment Release Point" button_icon_state = "set_drop" - action_type = AB_INNATE -/datum/action/set_droppoint/Activate() +/datum/action/innate/set_droppoint/Activate() if(!target || !iscarbon(owner)) return diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm index 780abb8854f..ac3bfdf7c1e 100644 --- a/code/game/gamemodes/miniantags/morph/morph.dm +++ b/code/game/gamemodes/miniantags/morph/morph.dm @@ -172,5 +172,3 @@ return target.attack_animal(src) -/mob/living/simple_animal/hostile/morph/update_action_buttons() //So all eaten objects are not counted every life - return diff --git a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm index f0e0dc1a883..26fb00b42a8 100644 --- a/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm +++ b/code/game/gamemodes/miniantags/revenant/revenant_abilities.dm @@ -183,7 +183,8 @@ name = "[initial(name)] ([cast_amount]E)" user.reveal(reveal) user.stun(stun) - user.update_action_buttons() + if(action) + action.UpdateButtonIcon() return 1 //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index 2b82afb3639..a26f941188b 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -268,8 +268,7 @@ proc/issyndicate(mob/living/M as mob) synd_mob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate(synd_mob), slot_wear_mask) synd_mob.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(synd_mob), slot_l_hand) synd_mob.internal = synd_mob.l_hand - if(synd_mob.internals) - synd_mob.internals.icon_state = "internal1" + synd_mob.update_internals_hud_icon(1) var/obj/item/weapon/implant/explosive/E = new/obj/item/weapon/implant/explosive(synd_mob) E.implant(synd_mob) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 07443a9041c..0a84ee81821 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -6,8 +6,8 @@ var/mob/camera/aiEye/remote/eyeobj var/mob/living/carbon/human/current_user = null var/list/networks = list("SS13") - var/datum/action/camera_off/off_action = new - var/datum/action/camera_jump/jump_action = new + var/datum/action/innate/camera_off/off_action = new + var/datum/action/innate/camera_jump/jump_action = new /obj/machinery/computer/camera_advanced/proc/CreateEye() eyeobj = new() @@ -115,12 +115,11 @@ else sprint = initial -/datum/action/camera_off +/datum/action/innate/camera_off name = "End Camera View" - action_type = AB_INNATE button_icon_state = "camera_off" -/datum/action/camera_off/Activate() +/datum/action/innate/camera_off/Activate() if(!target || !iscarbon(target)) return var/mob/living/carbon/C = target @@ -139,12 +138,11 @@ C.unset_machine() src.Remove(C) -/datum/action/camera_jump +/datum/action/innate/camera_jump name = "Jump To Camera" - action_type = AB_INNATE button_icon_state = "camera_jump" -/datum/action/camera_jump/Activate() +/datum/action/innate/camera_jump/Activate() if(!target || !iscarbon(target)) return var/mob/living/carbon/C = target diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 0e27b27909c..1ab2b6c4ec2 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -515,7 +515,7 @@ steam.start() -- spawns the effect chemholder.reagents.reaction(A) if(iscarbon(A)) var/mob/living/carbon/C = A - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + if(C.can_breathe_gas()) chemholder.reagents.copy_to(C, chemholder.reagents.total_volume) if(istype(A, /obj/machinery/portable_atmospherics/hydroponics)) var/obj/machinery/portable_atmospherics/hydroponics/tray = A diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index d74d831deb5..017583b7336 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -29,10 +29,8 @@ var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - //If this is set, The item will make an action button on the player's HUD when picked up. - var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. - var/action_button_custom_type = null - var/datum/action/item_action/action = null + var/list/actions = list() //list of /datum/action's that this item has. + var/list/actions_types = list() //list of paths of action datums to give to the item on New(). var/list/materials = list() //Since any item can now be a piece of clothing, this has to be put here so all items share it. @@ -72,10 +70,17 @@ var/sprite_sheets_obj = null //Used to override hardcoded clothing inventory object dmis in human clothing proc. var/list/species_fit = null //This object has a different appearance when worn by these species +/obj/item/New() + ..() + for(var/path in actions_types) + new path(src) + /obj/item/Destroy() if(ismob(loc)) var/mob/m = loc m.unEquip(src, 1) + for(var/X in actions) + qdel(X) return ..() /obj/item/proc/check_allowed_items(atom/target, not_inside, target_self) @@ -293,14 +298,16 @@ return 1 return 0 -/obj/item/proc/talk_into(mob/M as mob, var/text, var/channel=null) +/obj/item/proc/talk_into(mob/M, var/text, var/channel=null) return -/obj/item/proc/moved(mob/user as mob, old_loc as turf) +/obj/item/proc/moved(mob/user, old_loc) return -/obj/item/proc/dropped(mob/user as mob) - ..() +/obj/item/proc/dropped(mob/user) + for(var/X in actions) + var/datum/action/A = X + A.Remove(user) // called just as an item is picked up (loc is not yet changed) /obj/item/proc/pickup(mob/user) @@ -324,7 +331,13 @@ // for items that can be placed in multiple slots // note this isn't called during the initial dressing of a player /obj/item/proc/equipped(var/mob/user, var/slot) - return + for(var/X in actions) + var/datum/action/A = X + if(item_action_slot_check(slot, user)) //some items only give their actions buttons when in a specific slot. + A.Grant(user) + +/obj/item/proc/item_action_slot_check(slot, mob/user) + return 1 //returns 1 if the item is equipped by a mob, 0 otherwise. //This might need some error trapping, not sure if get_equipped_items() is safe for non-human mobs. @@ -379,11 +392,11 @@ return -//This proc is executed when someone clicks the on-screen UI button. To make the UI button show, set the 'icon_action_button' to the icon_state of the image of the button in screen1_action.dmi +//This proc is executed when someone clicks the on-screen UI button. //The default action is attack_self(). //Checks before we get to here are: mob is alive, mob is not restrained, paralyzed, asleep, resting, laying, item is on the mob. -/obj/item/proc/ui_action_click() - attack_self(usr) +/obj/item/proc/ui_action_click(mob/user, actiontype) + attack_self(user) /obj/item/proc/IsReflect(var/def_zone) //This proc determines if and at what% an object will reflect energy projectiles if it's in l_hand,r_hand or wear_suit return 0 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index db2519eca43..74da1ee9187 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -8,7 +8,7 @@ flags = CONDUCT slot_flags = SLOT_BELT materials = list(MAT_METAL=50, MAT_GLASS=20) - action_button_name = "Flashlight" + actions_types = list(/datum/action/item_action/toggle_light) var/on = 0 var/brightness_on = 4 //luminosity when on @@ -36,6 +36,9 @@ return 0 on = !on update_brightness(user) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() return 1 diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 3836b8eca80..ffb1d31faa8 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -254,7 +254,8 @@ cyborg = R icon_state = "selfrepair_off" - action_button_name = "Toggle Self-Repair" + var/datum/action/A = new /datum/action/item_action/toggle(src) + A.Grant(R) return 1 /obj/item/borg/upgrade/selfrepair/Destroy() @@ -276,6 +277,9 @@ /obj/item/borg/upgrade/selfrepair/update_icon() if(cyborg) icon_state = "selfrepair_[on ? "on" : "off"]" + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else icon_state = "cyborg_upgrade5" diff --git a/code/game/objects/items/weapons/chrono_eraser.dm b/code/game/objects/items/weapons/chrono_eraser.dm index d99e1a6cf07..71e09a3cf0d 100644 --- a/code/game/objects/items/weapons/chrono_eraser.dm +++ b/code/game/objects/items/weapons/chrono_eraser.dm @@ -9,7 +9,7 @@ w_class = 4 slot_flags = SLOT_BACK slowdown = 1 - action_button_name = "Equip/Unequip TED Gun" + actions_types = list(/datum/action/item_action/equip_unequip_TED_Gun) var/obj/item/weapon/gun/energy/chrono_gun/PA = null var/list/erased_minds = list() //a collection of minds from the dead @@ -17,6 +17,7 @@ erased_minds += M /obj/item/weapon/chrono_eraser/dropped() + ..() if(PA) qdel(PA) @@ -24,15 +25,19 @@ dropped() return ..() -/obj/item/weapon/chrono_eraser/ui_action_click() - var/mob/living/carbon/user = src.loc - if(iscarbon(user) && (user.back == src)) - if(PA) - qdel(PA) - else - PA = new(src) - user.put_in_hands(PA) +/obj/item/weapon/chrono_eraser/ui_action_click(mob/user) + if(iscarbon(user)) + var/mob/living/carbon/C = user + if(C.back == src) + if(PA) + qdel(PA) + else + PA = new(src) + user.put_in_hands(PA) +/obj/item/weapon/chrono_eraser/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 /obj/item/weapon/gun/energy/chrono_gun diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm index f0311a8ae24..e7aecea6dcc 100644 --- a/code/game/objects/items/weapons/defib.dm +++ b/code/game/objects/items/weapons/defib.dm @@ -11,7 +11,7 @@ throwforce = 6 w_class = 4 origin_tech = "biotech=4" - action_button_name = "Toggle Paddles" + actions_types = list(/datum/action/item_action/toggle_paddles) species_fit = list("Vox") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/back.dmi' @@ -74,11 +74,7 @@ update_icon() /obj/item/weapon/defibrillator/ui_action_click() - if(usr.get_item_by_slot(slot_back) == src) - toggle_paddles() - else - to_chat(usr, "Put the defibrillator on your back first!") - return + toggle_paddles() /obj/item/weapon/defibrillator/attackby(obj/item/weapon/W, mob/user, params) if(istype(W, /obj/item/weapon/stock_parts/cell)) @@ -147,16 +143,23 @@ remove_paddles(user) update_icon() - return + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/defibrillator/proc/make_paddles() return new /obj/item/weapon/twohanded/shockpaddles(src) /obj/item/weapon/defibrillator/equipped(mob/user, slot) + ..() if(slot != slot_back) remove_paddles(user) update_icon() +/obj/item/weapon/defibrillator/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 + /obj/item/weapon/defibrillator/proc/remove_paddles(mob/user) var/mob/living/carbon/human/M = user if(paddles in get_both_hands(M)) @@ -210,12 +213,9 @@ slot_flags = SLOT_BELT origin_tech = "biotech=4" -/obj/item/weapon/defibrillator/compact/ui_action_click() - if(usr.get_item_by_slot(slot_belt) == src) - toggle_paddles() - else - to_chat(usr, "Strap the defibrillator's belt on first!") - return +/obj/item/weapon/defibrillator/compact/item_action_slot_check(slot, mob/user) + if(slot == slot_belt) + return 1 /obj/item/weapon/defibrillator/compact/loaded/New() ..() @@ -284,7 +284,7 @@ /obj/item/weapon/twohanded/shockpaddles/dropped(mob/user as mob) if(user) - var/obj/item/weapon/twohanded/O = user.get_inactive_hand() + var/obj/item/weapon/twohanded/offhand/O = user.get_inactive_hand() if(istype(O)) O.unwield() to_chat(user, "The paddles snap back into the main unit.") diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 4bac1168518..42b74b0e45d 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -2,9 +2,9 @@ name = "implant" icon = 'icons/obj/implants.dmi' icon_state = "generic" //Shows up as the action button icon - action_button_custom_type = /datum/action/item_action/hands_free origin_tech = "materials=2;biotech=3;programming=2" + actions_types = list(/datum/action/item_action/hands_free/activate) var/activated = 1 //1 for implant types that can be activated, 0 for ones that are "always on" like mindshield implants var/implanted = null var/mob/living/imp_in = null @@ -41,11 +41,13 @@ return 0 - if(activated) - action_button_name = "Activate [src.name]" src.loc = source imp_in = source implanted = 1 + if(activated) + for(var/X in actions) + var/datum/action/A = X + A.Grant(source) if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() @@ -60,6 +62,10 @@ imp_in = null implanted = 0 + for(var/X in actions) + var/datum/action/A = X + A.Grant(source) + if(istype(source, /mob/living/carbon/human)) var/mob/living/carbon/human/H = source H.sec_hud_set_implants() @@ -76,6 +82,6 @@ return "No information available" /obj/item/weapon/implant/dropped(mob/user) + ..() . = 1 qdel(src) - return . diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm index f94772787e2..3e269622e61 100644 --- a/code/game/objects/items/weapons/implants/implant_freedom.dm +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -8,12 +8,13 @@ /obj/item/weapon/implant/freedom/activate() - if(uses == 0) return 0 - if(uses != -1) uses-- + uses-- to_chat(imp_in, "You feel a faint click.") if(iscarbon(imp_in)) var/mob/living/carbon/C_imp_in = imp_in C_imp_in.uncuff() + if(!uses) + qdel(src) /obj/item/weapon/implant/freedom/get_data() diff --git a/code/game/objects/items/weapons/implants/implant_misc.dm b/code/game/objects/items/weapons/implants/implant_misc.dm index af83960356b..c949d7e561e 100644 --- a/code/game/objects/items/weapons/implants/implant_misc.dm +++ b/code/game/objects/items/weapons/implants/implant_misc.dm @@ -33,7 +33,6 @@ return dat /obj/item/weapon/implant/adrenalin/activate() - if(uses < 1) return 0 uses-- to_chat(imp_in, "You feel a sudden surge of energy!") imp_in.SetStunned(0) @@ -46,6 +45,8 @@ imp_in.reagents.add_reagent("synaptizine", 10) imp_in.reagents.add_reagent("omnizine", 10) imp_in.reagents.add_reagent("stimulative_agent", 10) + if(!uses) + qdel(src) /obj/item/weapon/implant/emp @@ -56,9 +57,10 @@ uses = 2 /obj/item/weapon/implant/emp/activate() - if(src.uses < 1) return 0 - src.uses-- + uses-- empulse(imp_in, 3, 5) + if(!uses) + qdel(src) /obj/item/weapon/implant/cortical name = "cortical stack" diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm index 5687a9b90da..5e262ce4afa 100644 --- a/code/game/objects/items/weapons/melee/energy.dm +++ b/code/game/objects/items/weapons/melee/energy.dm @@ -217,6 +217,7 @@ spark_system.attach(src) /obj/item/weapon/melee/energy/blade/dropped() + ..() qdel(src) /obj/item/weapon/melee/energy/blade/attack_self(mob/user) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 2a3a602258e..e2324fcb434 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -373,9 +373,6 @@ handle_item_insertion(W) return 1 -/obj/item/weapon/storage/dropped(mob/user as mob) - return - /obj/item/weapon/storage/attack_hand(mob/user as mob) playsound(src.loc, "rustle", 50, 1, -5) diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index ccde1d215e2..af2c59c4759 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -8,72 +8,86 @@ item_state = "jetpack" distribute_pressure = ONE_ATMOSPHERE*O2STANDARD var/datum/effect/system/ion_trail_follow/ion_trail - var/on = 0.0 - var/stabilization_on = 0 + actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) + var/on = 0 + var/stabilizers = 0 var/volume_rate = 500 //Needed for borg jetpack transfer - action_button_name = "Toggle Jetpack" /obj/item/weapon/tank/jetpack/New() ..() - src.ion_trail = new /datum/effect/system/ion_trail_follow() - src.ion_trail.set_up(src) - return + ion_trail = new /datum/effect/system/ion_trail_follow() + ion_trail.set_up(src) /obj/item/weapon/tank/jetpack/Destroy() qdel(ion_trail) ion_trail = null return ..() +/obj/item/weapon/tank/jetpack/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/toggle_jetpack) + cycle(user) + else if(actiontype == /datum/action/item_action/jetpack_stabilization) + toggle_stabilization(user) + else + toggle_internals(user) + +/obj/item/weapon/tank/jetpack/proc/toggle_stabilization(mob/user) + if(on) + stabilizers = !stabilizers + to_chat(user, "You turn [src]'s stabilization [stabilizers ? "on" : "off"].") + + /obj/item/weapon/tank/jetpack/examine(mob/user) if(!..(user, 0)) return if(air_contents.oxygen < 10) - to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + to_chat(user, "The meter on [src] indicates you are almost out of air!") playsound(user, 'sound/effects/alert.ogg', 50, 1) -/obj/item/weapon/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"].") - return +/obj/item/weapon/tank/jetpack/proc/cycle(mob/user) + if(user.incapacitated()) + return - -/obj/item/weapon/tank/jetpack/verb/toggle() - set name = "Toggle Jetpack" - set category = "Object" - on = !on - if(on) - icon_state = "[icon_state]-on" -// item_state = "[item_state]-on" - ion_trail.start() + if(!on) + turn_on() + to_chat(user, "You turn the jetpack on.") else - icon_state = initial(icon_state) -// item_state = initial(item_state) - ion_trail.stop() - return + turn_off() + to_chat(user, "You turn the jetpack off.") + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + + +/obj/item/weapon/tank/jetpack/proc/turn_on() + on = TRUE + icon_state = "[initial(icon_state)]-on" + ion_trail.start() + +/obj/item/weapon/tank/jetpack/proc/turn_off() + on = FALSE + stabilizers = FALSE + icon_state = initial(icon_state) + ion_trail.stop() /obj/item/weapon/tank/jetpack/proc/allow_thrust(num, mob/living/user as mob) - if(!(src.on)) + if(!on) return 0 - if((num < 0.005 || src.air_contents.total_moles() < num)) - src.ion_trail.stop() + if((num < 0.005 || air_contents.total_moles() < num)) + turn_off() return 0 - var/datum/gas_mixture/G = src.air_contents.remove(num) - - var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins //fuck trace gases -Pete - if(allgases >= 0.005) - . = 1 - - qdel(G) - -/obj/item/weapon/tank/jetpack/ui_action_click() - toggle() + var/datum/gas_mixture/removed = air_contents.remove(num) + if(removed.total_moles() < 0.005) + turn_off() + return 0 + var/turf/T = get_turf(user) + T.assume_air(removed) + return 1 /obj/item/weapon/tank/jetpack/void name = "Void Jetpack (Oxygen)" @@ -124,8 +138,8 @@ /obj/item/weapon/tank/jetpack/carbondioxide/New() ..() - src.ion_trail = new /datum/effect/system/ion_trail_follow() - src.ion_trail.set_up(src) + ion_trail = new /datum/effect/system/ion_trail_follow() + ion_trail.set_up(src) air_contents.carbon_dioxide = (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) /obj/item/weapon/tank/jetpack/carbondioxide/examine(mob/user) @@ -133,35 +147,32 @@ return if(air_contents.carbon_dioxide < 10) - to_chat(user, text("\red The meter on the [src.name] indicates you are almost out of air!")) + to_chat(user, "The meter on [src] indicates you are almost out of air!") playsound(user, 'sound/effects/alert.ogg', 50, 1) /obj/item/weapon/tank/jetpack/rig name = "jetpack" var/obj/item/weapon/rig/holder + actions_types = list(/datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) /obj/item/weapon/tank/jetpack/rig/examine() to_chat(usr, "It's a jetpack. If you can see this, report it on the bug tracker.") return 0 /obj/item/weapon/tank/jetpack/rig/allow_thrust(num, mob/living/user as mob) - - if(!(src.on)) + if(!on) return 0 if(!istype(holder) || !holder.air_supply) return 0 - var/obj/item/weapon/tank/pressure_vessel = holder.air_supply - - if((num < 0.005 || pressure_vessel.air_contents.total_moles() < num)) - src.ion_trail.stop() + var/datum/gas_mixture/removed = holder.air_supply.air_contents.remove(num) + if(removed.total_moles() < 0.005) + turn_off() return 0 - var/datum/gas_mixture/G = pressure_vessel.air_contents.remove(num) + var/turf/T = get_turf(user) + T.assume_air(removed) - var/allgases = G.carbon_dioxide + G.nitrogen + G.oxygen + G.toxins - if(allgases >= 0.005) - . = 1 - qdel(G) + return 1 \ No newline at end of file diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index 98c6340d927..e0031286ecc 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -16,6 +16,7 @@ throw_speed = 1 throw_range = 4 + actions_types = list(/datum/action/item_action/set_internals) var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 @@ -24,9 +25,9 @@ /obj/item/weapon/tank/New() ..() - src.air_contents = new /datum/gas_mixture() - src.air_contents.volume = volume //liters - src.air_contents.temperature = T20C + air_contents = new /datum/gas_mixture() + air_contents.volume = volume //liters + air_contents.temperature = T20C processing_objects.Add(src) return @@ -39,16 +40,48 @@ return ..() +/obj/item/weapon/tank/proc/toggle_internals(mob/user) + var/mob/living/carbon/C = user + if(!istype(C)) + return 0 + + if(C.internal == src) + to_chat(C, "You close \the [src] valve.") + C.internal = null + C.update_internals_hud_icon(0) + else + var/can_open_valve = 0 + if(C.wear_mask && C.wear_mask.flags & AIRTIGHT) + can_open_valve = 1 + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(H.head && H.head.flags & AIRTIGHT) + can_open_valve = 1 + + if(can_open_valve) + if(C.internal) + to_chat(C, "You switch your internals to [src].") + else + to_chat(C, "You open \the [src] valve.") + C.internal = src + C.update_internals_hud_icon(1) + else + to_chat(C, "You are not wearing a suitable mask or helmet.") + return 0 + + C.update_action_buttons_icon() + + /obj/item/weapon/tank/examine(mob/user) var/obj/icon = src - if(istype(src.loc, /obj/item/assembly)) - icon = src.loc + if(istype(loc, /obj/item/assembly)) + icon = loc if(!in_range(src, user)) if(icon == src) to_chat(user, "\blue It's \a [bicon(icon)][src]! If you want any more information you'll need to get closer.") return - var/celsius_temperature = src.air_contents.temperature-T0C + var/celsius_temperature = air_contents.temperature-T0C var/descriptive if(celsius_temperature < 20) @@ -70,11 +103,11 @@ /obj/item/weapon/tank/blob_act() if(prob(50)) - var/turf/location = src.loc + var/turf/location = loc if(!( istype(location, /turf) )) qdel(src) - if(src.air_contents) + if(air_contents) location.assume_air(air_contents) qdel(src) @@ -82,9 +115,9 @@ /obj/item/weapon/tank/attackby(obj/item/weapon/W as obj, mob/user as mob, params) ..() - src.add_fingerprint(user) - if(istype(src.loc, /obj/item/assembly)) - icon = src.loc + add_fingerprint(user) + if(istype(loc, /obj/item/assembly)) + icon = loc if((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1) atmosanalyzer_scan(air_contents, user) @@ -93,7 +126,7 @@ bomb_assemble(W,user) /obj/item/weapon/tank/attack_self(mob/user as mob) - if(!(src.air_contents)) + if(!(air_contents)) return ui_interact(user) @@ -142,49 +175,23 @@ ui.set_auto_update(1) /obj/item/weapon/tank/Topic(href, href_list) - ..() - if(usr.stat|| usr.restrained()) - return 0 - if(src.loc != usr) - return 0 + if(..()) + return 1 if(href_list["dist_p"]) if(href_list["dist_p"] == "reset") - src.distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE + distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE else if(href_list["dist_p"] == "max") - src.distribute_pressure = TANK_MAX_RELEASE_PRESSURE + distribute_pressure = TANK_MAX_RELEASE_PRESSURE else var/cp = text2num(href_list["dist_p"]) - src.distribute_pressure += cp - src.distribute_pressure = min(max(round(src.distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) + distribute_pressure += cp + distribute_pressure = min(max(round(distribute_pressure), 0), TANK_MAX_RELEASE_PRESSURE) + if(href_list["stat"]) - if(istype(loc,/mob/living/carbon)) - var/mob/living/carbon/location = loc - if(location.internal == src) - location.internal = null - location.internals.icon_state = "internal0" - to_chat(usr, "\blue You close the tank release valve.") - if(location.internals) - location.internals.icon_state = "internal0" - else + toggle_internals(usr) - var/can_open_valve - if(location.wear_mask && (location.wear_mask.flags & AIRTIGHT)) - can_open_valve = 1 - else if(istype(location,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = location - if(H.head && (H.head.flags & AIRTIGHT)) - can_open_valve = 1 - - if(can_open_valve) - location.internal = src - to_chat(usr, "\blue You open \the [src] valve.") - if(location.internals) - location.internals.icon_state = "internal1" - else - to_chat(usr, "\blue You need something to connect to \the [src].") - - src.add_fingerprint(usr) + add_fingerprint(usr) return 1 @@ -226,9 +233,9 @@ var/pressure = air_contents.return_pressure() if(pressure > TANK_FRAGMENT_PRESSURE) - if(!istype(src.loc,/obj/item/device/transfer_valve)) - message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] (JMP)") - log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast] at [x], [y], [z]") + if(!istype(loc,/obj/item/device/transfer_valve)) + message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast] (JMP)") + log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast] at [x], [y], [z]") // to_chat(world, "\blue[x],[y] tank is exploding: [pressure] kPa") //Give the gas a chance to build up more pressure through reacting air_contents.react() @@ -241,8 +248,8 @@ // to_chat(world, "\blue Exploding Pressure: [pressure] kPa, intensity: [range]") explosion(epicenter, round(range*0.25), round(range*0.5), round(range), round(range*1.5)) - if(istype(src.loc,/obj/item/device/transfer_valve)) - qdel(src.loc) + if(istype(loc,/obj/item/device/transfer_valve)) + qdel(loc) else qdel(src) @@ -253,7 +260,7 @@ if(!T) return T.assume_air(air_contents) - playsound(src.loc, 'sound/effects/spray.ogg', 10, 1, -3) + playsound(loc, 'sound/effects/spray.ogg', 10, 1, -3) qdel(src) else integrity-- diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index 468ac6bf3bf..e6e88563d4b 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -8,7 +8,7 @@ w_class = 4 slot_flags = SLOT_BACK slowdown = 1 - action_button_name = "Toggle Mister" + actions_types = list(/datum/action/item_action/toggle_mister) var/obj/item/weapon/noz var/on = 0 @@ -22,6 +22,10 @@ /obj/item/weapon/watertank/ui_action_click() toggle_mister() +/obj/item/weapon/watertank/item_action_slot_check(slot, mob/user) + if(slot == slot_back) + return 1 + /obj/item/weapon/watertank/verb/toggle_mister() set name = "Toggle Mister" set category = "Object" @@ -52,6 +56,7 @@ return new /obj/item/weapon/reagent_containers/spray/mister(src) /obj/item/weapon/watertank/equipped(mob/user, slot) + ..() if(slot != slot_back) remove_noz() @@ -75,8 +80,8 @@ ..() /obj/item/weapon/watertank/MouseDrop(obj/over_object) - if(ishuman(src.loc)) - var/mob/living/carbon/human/H = src.loc + if(ishuman(loc)) + var/mob/living/carbon/human/H = loc switch(over_object.name) if("r_hand") if(H.r_hand) @@ -125,6 +130,7 @@ return /obj/item/weapon/reagent_containers/spray/mister/dropped(mob/user as mob) + ..() to_chat(user, "The mister snaps back onto the watertank.") tank.on = 0 loc = tank @@ -198,6 +204,7 @@ return new /obj/item/weapon/extinguisher/mini/nozzle(src) /obj/item/weapon/watertank/atmos/dropped(mob/user as mob) + ..() icon_state = "waterbackpackatmos" if(istype(noz, /obj/item/weapon/extinguisher/mini/nozzle)) var/obj/item/weapon/extinguisher/mini/nozzle/N = noz @@ -255,6 +262,7 @@ return /obj/item/weapon/extinguisher/mini/nozzle/dropped(mob/user as mob) + ..() to_chat(user, "The nozzle snaps back onto the tank!") tank.on = 0 loc = tank diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm index 586eaab9672..7ecbef740cd 100644 --- a/code/game/objects/items/weapons/twohanded.dm +++ b/code/game/objects/items/weapons/twohanded.dm @@ -90,12 +90,13 @@ return ..() /obj/item/weapon/twohanded/dropped(mob/user) + ..() //handles unwielding a twohanded weapon when dropped as well as clearing up the offhand if(user) var/obj/item/weapon/twohanded/O = user.get_inactive_hand() if(istype(O)) O.unwield(user) - return unwield(user) + return unwield(user) /obj/item/weapon/twohanded/update_icon() return diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 7f1674dd4ae..bc2917e4dce 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -655,7 +655,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/device/radio/headset(M), slot_l_ear) var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) M.equip_to_slot_or_del(J, slot_back) - J.toggle() + J.turn_on() M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) J.Topic(null, list("stat" = 1)) equip_special_id(M,get_all_accesses(), "Space Explorer", /obj/item/weapon/card/id) @@ -684,7 +684,7 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that M.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/atmos(M), slot_head) var /obj/item/weapon/tank/jetpack/J = new /obj/item/weapon/tank/jetpack/oxygen(M) M.equip_to_slot_or_del(J, slot_back) - J.toggle() + J.turn_on() M.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(M), slot_wear_mask) equip_special_id(M,get_all_accesses(), "RIG Tester", /obj/item/weapon/card/id) J.Topic(null, list("stat" = 1)) diff --git a/code/modules/admin/verbs/honksquad.dm b/code/modules/admin/verbs/honksquad.dm index 0a52bdbdce0..1b49cb4c294 100644 --- a/code/modules/admin/verbs/honksquad.dm +++ b/code/modules/admin/verbs/honksquad.dm @@ -59,7 +59,7 @@ var/global/sent_honksquad = 0 new_honksquad.key = pick(commandos) commandos -= new_honksquad.key new_honksquad.internal = new_honksquad.s_store - new_honksquad.internals.icon_state = "internal1" + new_honksquad.update_internals_hud_icon(1) //So they don't forget their code or mission. new_honksquad.mind.store_memory("Mission: \red [input].") diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index daedb7ae5e0..5506b3b9076 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -375,7 +375,7 @@ client/proc/one_click_antag() new_syndicate_commando.key = theghost.key new_syndicate_commando.internal = new_syndicate_commando.s_store - new_syndicate_commando.internals.icon_state = "internal1" + new_syndicate_commando.update_internals_hud_icon(1) //So they don't forget their code or mission. diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index f41a900aed7..c44ff5c1af6 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -407,7 +407,7 @@ Traitors and the like can also be revived with the previous role mostly intact. if("Death Commando")//Leaves them at late-join spawn. new_character.equip_death_commando() new_character.internal = new_character.s_store - new_character.internals.icon_state = "internal1" + new_character.update_internals_hud_icon(1) else//They may also be a cyborg or AI. switch(new_character.mind.assigned_role) if("Cyborg")//More rigging to make em' work and check if they're traitor. diff --git a/code/modules/admin/verbs/striketeam.dm b/code/modules/admin/verbs/striketeam.dm index 1aeb425b8be..e76545f4748 100644 --- a/code/modules/admin/verbs/striketeam.dm +++ b/code/modules/admin/verbs/striketeam.dm @@ -64,7 +64,7 @@ var/global/sent_strike_team = 0 new_commando.key = pick(commandos) commandos -= new_commando.key new_commando.internal = new_commando.s_store - new_commando.internals.icon_state = "internal1" + new_commando.update_internals_hud_icon(1) //So they don't forget their code or mission. if(nuke_code) diff --git a/code/modules/admin/verbs/striketeam_syndicate.dm b/code/modules/admin/verbs/striketeam_syndicate.dm index 2fdd388d0ca..3669ba2ba13 100644 --- a/code/modules/admin/verbs/striketeam_syndicate.dm +++ b/code/modules/admin/verbs/striketeam_syndicate.dm @@ -71,7 +71,7 @@ var/global/sent_syndicate_strike_team = 0 new_syndicate_commando.key = pick(commandos) commandos -= new_syndicate_commando.key new_syndicate_commando.internal = new_syndicate_commando.s_store - new_syndicate_commando.internals.icon_state = "internal1" + new_syndicate_commando.update_internals_hud_icon(1) //So they don't forget their code or mission. if(nuke_code) diff --git a/code/modules/assembly/proximity.dm b/code/modules/assembly/proximity.dm index 954d19cab18..267d1600523 100644 --- a/code/modules/assembly/proximity.dm +++ b/code/modules/assembly/proximity.dm @@ -68,6 +68,7 @@ dropped() + ..() spawn(0) sense() return diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b7eb89bfe60..88555586661 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -289,7 +289,6 @@ BLIND // can't see anything body_parts_covered = HEAD slot_flags = SLOT_MASK var/mask_adjusted = 0 - var/ignore_maskadjust = 1 var/adjusted_flags = null strip_delay = 40 put_on_delay = 40 @@ -297,60 +296,61 @@ BLIND // can't see anything //Proc that moves gas/breath masks out of the way /obj/item/clothing/mask/proc/adjustmask(var/mob/user) var/mob/living/carbon/human/H = usr //Used to check if the mask is on the head, to check if the hands are full, and to turn off internals if they were on when the mask was pushed out of the way. - if(!ignore_maskadjust) - if(user.incapacitated()) //This check allows you to adjust your masks while you're buckled into chairs or beds. - return - if(mask_adjusted) - icon_state = copytext(icon_state, 1, findtext(icon_state, "_up")) /*Trims the '_up' off the end of the icon state, thus reverting to the most recent previous state. - Had to use this instead of initial() because initial reverted to the wrong state.*/ - gas_transfer_coefficient = initial(gas_transfer_coefficient) - permeability_coefficient = initial(permeability_coefficient) - to_chat(user, "You push \the [src] back into place.") - mask_adjusted = 0 - slot_flags = initial(slot_flags) - if(flags_inv != initial(flags_inv)) - if(initial(flags_inv) & HIDEFACE) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again. - flags_inv |= HIDEFACE - if(flags != initial(flags)) - if(initial(flags) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again. - flags |= MASKCOVERSMOUTH - if(initial(flags) & AIRTIGHT) //If the mask is airtight and thus, one that you'd be able to run internals from yet can't because it was adjusted, make it airtight again. - flags |= AIRTIGHT - if(H.head == src && flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. - if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. - user.unEquip(src) - else //Otherwise, put it in an available hand, the active one preferentially. - src.loc = user - H.head = null - user.put_in_hands(src) - else - icon_state += "_up" - to_chat(user, "You push \the [src] out of the way.") - gas_transfer_coefficient = null - permeability_coefficient = null - mask_adjusted = 1 - if(adjusted_flags) - slot_flags = adjusted_flags - if(ishuman(user) && H.internal && user.wear_mask == src && H.internals) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. - Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/ - H.internals.icon_state = "internal0" - H.internal = null - if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. - flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE). - This reveals the user's face since the bandana will now be going on their head.*/ - if(flags & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks. - flags &= ~MASKCOVERSMOUTH - if(flags & AIRTIGHT) //If the mask was airtight, it won't be anymore since you just pushed it off your face. - flags &= ~AIRTIGHT - if(user.wear_mask == src && initial(flags_inv) == HIDEFACE) //Means that you won't have to take off and put back on simple things like breath masks which, realistically, can just be pulled down off your face. - if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. - user.unEquip(src) - else //Otherwise, put it in an available hand, the active one preferentially. - src.loc = user - user.wear_mask = null - user.put_in_hands(src) - usr.update_inv_wear_mask() - usr.update_inv_head() + if(user.incapacitated()) //This check allows you to adjust your masks while you're buckled into chairs or beds. + return + if(mask_adjusted) + icon_state = initial(icon_state) + gas_transfer_coefficient = initial(gas_transfer_coefficient) + permeability_coefficient = initial(permeability_coefficient) + to_chat(user, "You push \the [src] back into place.") + mask_adjusted = 0 + slot_flags = initial(slot_flags) + if(flags_inv != initial(flags_inv)) + if(initial(flags_inv) & HIDEFACE) //If the mask is one that hides the face and can be adjusted yet lost that trait when it was adjusted, make it hide the face again. + flags_inv |= HIDEFACE + if(flags != initial(flags)) + if(initial(flags) & MASKCOVERSMOUTH) //If the mask covers the mouth when it's down and can be adjusted yet lost that trait when it was adjusted, make it cover the mouth again. + flags |= MASKCOVERSMOUTH + if(initial(flags) & AIRTIGHT) //If the mask is airtight and thus, one that you'd be able to run internals from yet can't because it was adjusted, make it airtight again. + flags |= AIRTIGHT + if(H.head == src && flags_inv == HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. + if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. + user.unEquip(src) + else //Otherwise, put it in an available hand, the active one preferentially. + src.loc = user + H.head = null + user.put_in_hands(src) + else + icon_state += "_up" + to_chat(user, "You push \the [src] out of the way.") + gas_transfer_coefficient = null + permeability_coefficient = null + mask_adjusted = 1 + if(adjusted_flags) + slot_flags = adjusted_flags + if(ishuman(user) && H.internal && user.wear_mask == src) /*If the user was wearing the mask providing internals on their face at the time it was adjusted, turn off internals. + Otherwise, they adjusted it while it was in their hands or some such so we won't be needing to turn off internals.*/ + H.update_internals_hud_icon(0) + H.internal = null + if(flags_inv & HIDEFACE) //Means that only things like bandanas and balaclavas will be affected since they obscure the identity of the wearer. + flags_inv &= ~HIDEFACE /*Done after the above to avoid having to do a check for initial(src.flags_inv == HIDEFACE). + This reveals the user's face since the bandana will now be going on their head.*/ + if(flags & MASKCOVERSMOUTH) //Mask won't cover the mouth any more since it's been pushed out of the way. Allows for CPRing with adjusted masks. + flags &= ~MASKCOVERSMOUTH + if(flags & AIRTIGHT) //If the mask was airtight, it won't be anymore since you just pushed it off your face. + flags &= ~AIRTIGHT + if(user.wear_mask == src && initial(flags_inv) == HIDEFACE) //Means that you won't have to take off and put back on simple things like breath masks which, realistically, can just be pulled down off your face. + if(H.l_hand && H.r_hand) //If both hands are occupied, drop the object on the ground. + user.unEquip(src) + else //Otherwise, put it in an available hand, the active one preferentially. + src.loc = user + user.wear_mask = null + user.put_in_hands(src) + usr.update_inv_wear_mask() + usr.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() //Shoes /obj/item/clothing/shoes @@ -493,6 +493,7 @@ BLIND // can't see anything to_chat(user, "You attempt to button up the velcro on \the [src], before promptly realising how retarded you are.") /obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis. + ..() if(ishuman(user) && hide_tail_by_species && slot == slot_wear_suit) if(user.species.name in hide_tail_by_species) if(!(flags_inv & HIDETAIL)) //Hide the tail if the user's species is in the hide_tail_by_species list and the tail isn't already hidden. @@ -511,10 +512,11 @@ BLIND // can't see anything return adjustsuit(user) -/obj/item/clothing/suit/ui_action_click() //This is what happens when you click the HUD action button to adjust your suit. +/obj/item/clothing/suit/ui_action_click(mob/user) //This is what happens when you click the HUD action button to adjust your suit. if(!ignore_suitadjust) - adjustsuit(usr) - else ..() //This is required in order to ensure that the UI buttons for items that have alternate functions tied to UI buttons still work. + adjustsuit(user) + else + ..() //This is required in order to ensure that the UI buttons for items that have alternate functions tied to UI buttons still work. //Spacesuit //Note: Everything in modules/clothing/spacesuits should have the entire suit grouped together. diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 673685c4fc4..ea1d78dad7d 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -101,15 +101,11 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/eyes.dmi' ) + actions_types = list(/datum/action/item_action/toggle_research_scanner) -/obj/item/clothing/glasses/science/equipped(mob/user, slot) +/obj/item/clothing/glasses/science/item_action_slot_check(slot) if(slot == slot_glasses) - user.scanner.Grant(user) - ..(user, slot) - -/obj/item/clothing/glasses/science/dropped(mob/user) - user.scanner.devices -= 1 - ..(user) + return 1 /obj/item/clothing/glasses/science/night name = "Night Vision Science Goggle" @@ -242,13 +238,16 @@ /obj/item/clothing/glasses/sunglasses/noir name = "noir sunglasses" desc = "Somehow these seem even more out-of-date than normal sunglasses." - action_button_name = "Noir Mode" + actions_types = list(/datum/action/item_action/noir) var/noir_mode = 0 color_view = MATRIX_GREYSCALE /obj/item/clothing/glasses/sunglasses/noir/attack_self() - if(is_equipped()) - toggle_noir() + toggle_noir() + +/obj/item/clothing/glasses/sunglasses/noir/item_action_slot_check(slot) + if(slot == slot_glasses) + return 1 /obj/item/clothing/glasses/sunglasses/noir/proc/toggle_noir() if(!noir_mode) @@ -277,12 +276,11 @@ name = "agreeable glasses" desc = "H.C Limited edition." var/punused = null - action_button_name = "YEAH!" + actions_types = list(/datum/action/item_action/YEEEAAAAAHHHHHHHHHHHHH) /obj/item/clothing/glasses/sunglasses/yeah/attack_self() pun() - /obj/item/clothing/glasses/sunglasses/yeah/verb/pun() set category = "Object" set name = "YEAH!" @@ -330,7 +328,7 @@ desc = "Protects the eyes from welders, approved by the mad scientist association." icon_state = "welding-g" item_state = "welding-g" - action_button_name = "Flip welding goggles" + actions_types = list(/datum/action/item_action/toggle) flash_protect = 2 tint = 2 species_fit = list("Vox") @@ -375,7 +373,6 @@ item_state = "rwelding-g" flash_protect = 2 tint = 0 - action_button_name = "Flip welding goggles" /obj/item/clothing/glasses/sunglasses/blindfold name = "blindfold" diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 8e5d7c08397..269b2dd841e 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -14,6 +14,7 @@ H.add_hud_to(user) /obj/item/clothing/glasses/hud/dropped(mob/living/carbon/human/user) + ..() if(HUDType && istype(user) && user.glasses == src) var/datum/atom_hud/H = huds[HUDType] H.remove_hud_from(user) diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 48e2ccb7f95..5cc5af80abb 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -9,19 +9,21 @@ item_color = "yellow" //Determines used sprites: hardhat[on]_[color] and hardhat[on]_[color]2 (lying down sprite) armor = list(melee = 15, bullet = 5, laser = 20, energy = 10, bomb = 20, bio = 10, rad = 20) flags_inv = 0 - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) - attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc]")//To prevent some lighting anomalities. +/obj/item/clothing/head/hardhat/attack_self(mob/user) + on = !on + icon_state = "hardhat[on]_[item_color]" + item_state = "hardhat[on]_[item_color]" - return - on = !on - icon_state = "hardhat[on]_[item_color]" - item_state = "hardhat[on]_[item_color]" + if(on) + set_light(brightness_on) + else + set_light(0) - if(on) set_light(brightness_on) - else set_light(0) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/head/hardhat/orange diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 17058cc23b5..b7b0cc71b81 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -100,7 +100,7 @@ icon_state = "justice" toggle_message = "You turn off the lights on" alt_toggle_message = "You turn on the lights on" - action_button_name = "Toggle JUSTICE" + actions_types = list(/datum/action/item_action/toggle_helmet_light) can_toggle = 1 toggle_cooldown = 20 active_sound = 'sound/items/WEEOO1.ogg' diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 6d300c724bd..f34eb62f340 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -350,7 +350,7 @@ item_state = "griffinhat" flags = BLOCKHAIR|NODROP flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - action_button_name = "Caw" + actions_types = list(/datum/action/item_action/caw) /obj/item/clothing/head/griffin/attack_self() caw() diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 21c493bf66c..98466f94eeb 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -22,7 +22,7 @@ tint = 2 armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) - action_button_name = "flip welding helmet" + actions_types = list(/datum/action/item_action/toggle) species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/head.dmi', @@ -148,7 +148,6 @@ flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE - action_button_name = "Toggle Pumpkin Light" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 2 //luminosity when on @@ -160,7 +159,6 @@ item_state = "hardhat0_reindeer" item_color = "reindeer" flags_inv = 0 - action_button_name = "Toggle Nose Light" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) brightness_on = 1 //luminosity when on diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 66e97d714d8..25cdc259f92 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -6,8 +6,7 @@ flags = BLOCKHAIR flags_inv = HIDEFACE w_class = 2 - action_button_name = "Adjust Balaclava" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) adjusted_flags = SLOT_HEAD species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 40811397187..5b3ab335cbe 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -7,8 +7,7 @@ w_class = 2 gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 - action_button_name = "Adjust Breath Mask" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) species_fit = list("Vox", "Vox Armalis", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', @@ -38,5 +37,4 @@ item_state = "voxmask" permeability_coefficient = 0.01 species_restricted = list("Vox") - action_button_name = null - ignore_maskadjust = 1 + actions_types = list() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index c1124386acc..a21d78f99e0 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -29,7 +29,7 @@ tint = 2 armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) origin_tech = "materials=2;engineering=2" - action_button_name = "Toggle Welding Helmet" + actions_types = list(/datum/action/item_action/toggle) /obj/item/clothing/mask/gas/welding/attack_self() toggle() @@ -166,7 +166,7 @@ desc = "Twoooo!" icon_state = "owl" flags = MASKCOVERSMOUTH | MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | NODROP - action_button_name = "Hoot" + actions_types = list(/datum/action/item_action/hoot) /obj/item/clothing/mask/gas/owl_mask/attack_self() hoot() @@ -190,26 +190,24 @@ /obj/item/clothing/mask/gas/sechailer name = "security gas mask" desc = "A standard issue Security gas mask with integrated 'Compli-o-nator 3000' device, plays over a dozen pre-recorded compliance phrases designed to get scumbags to stand still whilst you taze them. Do not tamper with the device." - action_button_name = "HALT!" icon_state = "sechailer" var/aggressiveness = 2 var/safety = 1 - ignore_maskadjust = 0 - action_button_name = "HALT!" + actions_types = list(/datum/action/item_action/halt, /datum/action/item_action/adjust) /obj/item/clothing/mask/gas/sechailer/hos name = "\improper HOS SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a tan stripe." icon_state = "hosmask" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/warden name = "\improper Warden SWAT mask" desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000. It has a blue stripe." icon_state = "wardenmask" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/swat @@ -217,7 +215,7 @@ desc = "A close-fitting tactical mask with an especially aggressive Compli-o-nator 3000." icon_state = "officermask" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/blue name = "\improper blue SWAT mask" @@ -225,7 +223,7 @@ icon_state = "blue_sechailer" item_state = "blue_sechailer" aggressiveness = 3 - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) /obj/item/clothing/mask/gas/sechailer/cyborg name = "security hailer" @@ -233,16 +231,13 @@ icon = 'icons/obj/device.dmi' icon_state = "taperecorder_idle" aggressiveness = 1 //Borgs are nicecurity! - ignore_maskadjust = 1 + actions_types = list(/datum/action/item_action/halt) -/obj/item/clothing/mask/gas/sechailer/cyborg/New() - ..() - verbs -= /obj/item/clothing/mask/gas/sechailer/verb/adjust - -/obj/item/clothing/mask/gas/sechailer/verb/adjust() - set category = "Object" - set name = "Adjust Mask" - adjustmask(usr) +/obj/item/clothing/mask/gas/sechailer/ui_action_click(mob/user, actiontype) + if(actiontype == /datum/action/item_action/halt) + halt() + else + adjustmask(user) /obj/item/clothing/mask/gas/sechailer/attackby(obj/item/weapon/W as obj, mob/user as mob, params) if(istype(W, /obj/item/weapon/screwdriver)) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index ca5a267c6a4..184d4c14c40 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -64,8 +64,7 @@ gas_transfer_coefficient = 0.90 permeability_coefficient = 0.01 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 25, rad = 0) - action_button_name = "Adjust Sterile Mask" - ignore_maskadjust = 0 + actions_types = list(/datum/action/item_action/adjust) species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") sprite_sheets = list( "Vox" = 'icons/mob/species/vox/mask.dmi', @@ -209,7 +208,6 @@ flags_inv = HIDEFACE w_class = 1 slot_flags = SLOT_MASK - ignore_maskadjust = 0 adjusted_flags = SLOT_HEAD icon_state = "bandbotany" species_fit = list("Vox", "Unathi", "Tajaran", "Vulpkanin") @@ -219,7 +217,7 @@ "Tajaran" = 'icons/mob/species/tajaran/mask.dmi', "Vulpkanin" = 'icons/mob/species/vulpkanin/mask.dmi' ) - action_button_name = "Adjust Bandana" + actions_types = list(/datum/action/item_action/adjust) /obj/item/clothing/mask/bandana/attack_self(var/mob/user) adjustmask(user) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 48b9ffa7589..1c9a6260cc3 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -5,18 +5,18 @@ var/magboot_state = "magboots" var/magpulse = 0 var/slowdown_active = 2 - action_button_name = "Toggle Magboots" + actions_types = list(/datum/action/item_action/toggle) strip_delay = 70 put_on_delay = 70 species_restricted = null /obj/item/clothing/shoes/magboots/attack_self(mob/user) - if(src.magpulse) - src.flags &= ~NOSLIP - src.slowdown = SHOES_SLOWDOWN + if(magpulse) + flags &= ~NOSLIP + slowdown = SHOES_SLOWDOWN else - src.flags |= NOSLIP - src.slowdown = slowdown_active + flags |= NOSLIP + slowdown = slowdown_active magpulse = !magpulse icon_state = "[magboot_state][magpulse]" to_chat(user, "You [magpulse ? "enable" : "disable"] the mag-pulse traction system.") diff --git a/code/modules/clothing/spacesuits/alien.dm b/code/modules/clothing/spacesuits/alien.dm index e231922de92..f8a18749644 100644 --- a/code/modules/clothing/spacesuits/alien.dm +++ b/code/modules/clothing/spacesuits/alien.dm @@ -182,10 +182,8 @@ "Vox Armalis" = 'icons/mob/species/armalis/feet.dmi' ) - action_button_name = "Toggle the magclaws" - /obj/item/clothing/shoes/magboots/vox/attack_self(mob/user) - if(src.magpulse) + if(magpulse) flags &= ~NOSLIP magpulse = 0 flags |= NODROP diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 96ae6519d5d..6348f32aa11 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -22,7 +22,7 @@ desc = "An advanced spacesuit equipped with teleportation and anti-compression technology" icon_state = "chronosuit" item_state = "chronosuit" - action_button_name = "Toggle Chronosuit" + actions_types = list(/datum/action/item_action/toggle) armor = list(melee = 60, bullet = 60, laser = 60, energy = 60, bomb = 30, bio = 90, rad = 90) var/obj/item/clothing/head/helmet/space/chronos/helmet = null var/obj/effect/chronos_cam/camera = null diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index b5498726203..de2cfc0eda5 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -46,13 +46,9 @@ var/base_state = "plasmaman_helmet" var/brightness_on = 4 //luminosity when on var/on = 0 - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) /obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - - return toggle_light(user) /obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user) @@ -68,6 +64,10 @@ var/mob/living/carbon/human/H = user H.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + // ENGINEERING /obj/item/clothing/suit/space/eva/plasmaman/assistant name = "plasmaman assistant suit" diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/rig.dm index 415a5dcd12a..355b511c391 100644 --- a/code/modules/clothing/spacesuits/rig.dm +++ b/code/modules/clothing/spacesuits/rig.dm @@ -10,7 +10,7 @@ var/brightness_on = 4 //luminosity when on var/on = 0 item_color = "engineering" //Determines used sprites: rig[on]-[color] and rig[on]-[color]2 (lying down sprite) - action_button_name = "Toggle Helmet Light" + actions_types = list(/datum/action/item_action/toggle_helmet_light) //Species-specific stuff. species_restricted = list("exclude","Diona","Wryn") @@ -31,10 +31,6 @@ ) /obj/item/clothing/head/helmet/space/rig/attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot turn the light on while in this [user.loc].")//To prevent some lighting anomalities. - - return toggle_light(user) /obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user) @@ -50,6 +46,14 @@ var/mob/living/carbon/human/H = user H.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + +/obj/item/clothing/head/helmet/space/rig/item_action_slot_check(slot) + if(slot == slot_head) + return 1 + /obj/item/clothing/suit/space/rig name = "hardsuit" desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit." @@ -298,17 +302,12 @@ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) on = 1 flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL - action_button_name = "Toggle Helmet Mode" + actions_types = list(/datum/action/item_action/toggle_helmet_mode) /obj/item/clothing/head/helmet/space/rig/syndi/update_icon() icon_state = "rig[on]-[item_color]" /obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user) - if(!isturf(user.loc)) - to_chat(user, "You cannot toggle your helmet while in this [user.loc].")//To prevent some lighting anomalities. - - return - on = !on if(on) to_chat(user, "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.") @@ -331,6 +330,10 @@ playsound(src.loc, 'sound/mecha/mechmove03.ogg', 50, 1) user.update_inv_head() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + /obj/item/clothing/suit/space/rig/syndi name = "blood-red hardsuit" desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders." @@ -339,7 +342,7 @@ item_color = "syndi" w_class = 3 var/on = 1 - action_button_name = "Toggle Hardsuit Mode" + actions_types = list(/datum/action/item_action/toggle_hardsuit_mode) armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50) allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank) @@ -370,6 +373,10 @@ user.update_inv_wear_suit() user.update_inv_w_uniform() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + //Elite Syndie suit /obj/item/clothing/head/helmet/space/rig/syndi/elite name = "elite syndicate hardsuit helmet" diff --git a/code/modules/clothing/spacesuits/rig/modules/utility.dm b/code/modules/clothing/spacesuits/rig/modules/utility.dm index 087b34dd756..46471966aa7 100644 --- a/code/modules/clothing/spacesuits/rig/modules/utility.dm +++ b/code/modules/clothing/spacesuits/rig/modules/utility.dm @@ -337,7 +337,7 @@ /obj/item/rig_module/maneuvering_jets/engage() if(!..()) return 0 - jets.toggle_rockets() + jets.toggle_stabilization(usr) return 1 /obj/item/rig_module/maneuvering_jets/activate() @@ -354,15 +354,13 @@ suit_overlay = null holder.update_icon() - if(!jets.on) - jets.toggle() + jets.turn_on() return 1 /obj/item/rig_module/maneuvering_jets/deactivate() if(!..()) return 0 - if(jets.on) - jets.toggle() + jets.turn_off() return 1 /obj/item/rig_module/maneuvering_jets/New() diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index e2b8e01fd54..6e7acf5c03d 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -50,7 +50,8 @@ W.forceMove(src) attached_badge = W - action_button_name = "Remove Holobadge" + var/datum/action/A = new /datum/action/item_action/remove_badge(src) + A.Grant(user) icon_state = "armorsec" user.update_inv_wear_suit() desc = "An armored vest that protects against some damage. This one has [attached_badge] attached to it." @@ -63,8 +64,10 @@ add_fingerprint(user) user.put_in_hands(attached_badge) - action_button_name = null - action.Remove(user) + for(var/X in actions) + var/datum/action/A = X + A.Remove(user) + icon_state = "armor" user.update_inv_wear_suit() desc = "An armored vest that protects against some damage. This one has a clip for a holobadge." @@ -101,7 +104,7 @@ heat_protection = UPPER_TORSO|LOWER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Open/Close Jacket" + actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unzip" /obj/item/clothing/suit/armor/hos @@ -124,7 +127,7 @@ flags_inv = 0 ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Open/Close Trenchcoat" + actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unbutton" /obj/item/clothing/suit/armor/hos/jensen @@ -243,7 +246,7 @@ item_state = "reactiveoff" blood_overlay_type = "armor" armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) - action_button_name = "Toggle Reactive Armor" + actions_types = list(/datum/action/item_action/toggle) unacidable = 1 hit_reaction_chance = 50 diff --git a/code/modules/clothing/suits/hood.dm b/code/modules/clothing/suits/hood.dm index e6d6c91508f..67ab432b9b4 100644 --- a/code/modules/clothing/suits/hood.dm +++ b/code/modules/clothing/suits/hood.dm @@ -1,7 +1,7 @@ //Hoods for winter coats and chaplain hoodie etc /obj/item/clothing/suit/hooded - action_button_name = "Adjust hood" + actions_types = list(/datum/action/item_action/toggle) var/obj/item/clothing/head/hood var/hoodtype = /obj/item/clothing/head/winterhood //so the chaplain hoodie or other hoodies can override this @@ -22,6 +22,10 @@ /obj/item/clothing/suit/hooded/ui_action_click() ToggleHood() +/obj/item/clothing/suit/hooded/item_action_slot_check(slot, mob/user) + if(slot == slot_wear_suit) + return 1 + /obj/item/clothing/suit/hooded/equipped(mob/user, slot) if(slot != slot_wear_suit) RemoveHood() @@ -35,6 +39,9 @@ H.unEquip(hood, 1) H.update_inv_wear_suit() hood.loc = src + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/clothing/suit/hooded/dropped() ..() @@ -64,5 +71,8 @@ suit_adjusted = 1 icon_state = "[initial(icon_state)]_hood" H.update_inv_wear_suit() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() else RemoveHood() diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index b94be6647bb..a8fd6ea4c49 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -210,7 +210,7 @@ body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" /obj/item/clothing/suit/storage/lawyer/bluejacket @@ -222,7 +222,7 @@ body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" /obj/item/clothing/suit/storage/lawyer/purpjacket @@ -243,7 +243,7 @@ body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -258,7 +258,7 @@ blood_overlay_type = "coat" body_parts_covered = UPPER_TORSO|ARMS ignore_suitadjust = 0 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -276,7 +276,7 @@ /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/weapon/tank/emergency_oxygen,/obj/item/device/rad_laser) ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index 71bdd524b8f..8097162ba28 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -13,7 +13,7 @@ sprite_sheets = list( "Vox" = 'icons/mob/species/vox/suit.dmi' ) - action_button_name = "Button/Unbutton Labcoat" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" /obj/item/clothing/suit/storage/labcoat/cmo diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index b44227999cd..8d1fe3bcace 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -558,7 +558,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS ignore_suitadjust = 0 suit_adjusted = 1 - action_button_name = "Open/Close Jacket" + actions_types = list(/datum/action/item_action/openclose) adjust_flavour = "unzip" species_fit = list("Vox") sprite_sheets = list( @@ -623,7 +623,7 @@ icon_state = "militaryjacket" item_state = "militaryjacket" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/weapon/gun/projectile/automatic/pistol,/obj/item/weapon/gun/projectile/revolver,/obj/item/weapon/gun/projectile/revolver/detective) @@ -717,7 +717,7 @@ allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter) body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS cold_protection = UPPER_TORSO|LOWER_TORSO|ARMS - action_button_name = "Zip/Unzip Jacket" + actions_types = list(/datum/action/item_action/zipper) adjust_flavour = "unzip" species_fit = list("Vox") sprite_sheets = list( @@ -746,7 +746,7 @@ desc = "Pompadour not included." icon_state = "leatherjacket" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null /obj/item/clothing/suit/officercoat @@ -755,7 +755,7 @@ icon_state = "officersuit" item_state = "officersuit" ignore_suitadjust = 0 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -768,7 +768,7 @@ icon_state = "soldiersuit" item_state = "soldiersuit" ignore_suitadjust = 0 - action_button_name = "Button/Unbutton Jacket" + actions_types = list(/datum/action/item_action/button) adjust_flavour = "unbutton" species_fit = list("Vox") sprite_sheets = list( @@ -783,7 +783,7 @@ body_parts_covered = ARMS armor = list(melee = 5, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/device/flashlight/seclite) - action_button_name = "Toggle Owl Wings" + actions_types = list(/datum/action/item_action/toggle_wings) flags = NODROP /obj/item/clothing/suit/toggle/owlwings/griffinwings @@ -823,7 +823,7 @@ desc = "An incredibly advanced and complex suit; it has so many buttons and dials as to be incomprehensible." icon_state = "bomb" item_state = "bomb" - action_button_name = "Toggle Advanced Protective Suit" + actions_types = list(/datum/action/item_action/toggle) gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 flags = STOPSPRESSUREDMAGE | THICKMATERIAL | NODROP diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index b285624ffe0..e417c899f7f 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -10,7 +10,6 @@ var/slot = "decor" var/obj/item/clothing/under/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. - action_button_custom_type = /datum/action/item_action/accessory /obj/item/clothing/accessory/New() ..() @@ -23,6 +22,13 @@ has_suit = S loc = has_suit has_suit.overlays += inv_overlay + has_suit.actions += actions + + for(var/X in actions) + var/datum/action/A = X + if(has_suit.is_equipped()) + var/mob/M = has_suit.loc + A.Grant(M) if(user) to_chat(user, "You attach [src] to [has_suit].") @@ -32,6 +38,14 @@ if(!has_suit) return has_suit.overlays -= inv_overlay + has_suit.actions -= actions + + for(var/X in actions) + var/datum/action/A = X + if(ismob(has_suit.loc)) + var/mob/M = has_suit.loc + A.Remove(M) + has_suit = null usr.put_in_hands(src) src.add_fingerprint(user) diff --git a/code/modules/clothing/under/accessories/holster.dm b/code/modules/clothing/under/accessories/holster.dm index d792c5df7ac..a30522768ed 100644 --- a/code/modules/clothing/under/accessories/holster.dm +++ b/code/modules/clothing/under/accessories/holster.dm @@ -6,7 +6,7 @@ slot = "utility" var/holster_allow = /obj/item/weapon/gun var/obj/item/weapon/gun/holstered = null - action_button_name = "Holster" + actions_types = list(/datum/action/item_action/accessory/holster) w_class = 3 // so it doesn't fit in pockets //subtypes can override this to specify what can be holstered diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index 1848d8fdfb7..aea6cf139f3 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -6,7 +6,7 @@ slot = "utility" var/slots = 3 var/obj/item/weapon/storage/internal/hold - action_button_name = "View Storage" + actions_types = list(/datum/action/item_action/accessory/storage) w_class = 3 // so it doesn't fit in pockets /obj/item/clothing/accessory/storage/New() diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm index 9877872df73..9476bec2534 100644 --- a/code/modules/customitems/item_defines.dm +++ b/code/modules/customitems/item_defines.dm @@ -248,7 +248,7 @@ icon_state = "kidosvest" item_state = "kidosvest" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null species_fit = null sprite_sheets = null @@ -363,7 +363,7 @@ icon_state = "fox_jacket" item_state = "fox_jacket" ignore_suitadjust = 1 - action_button_name = null + actions_types = list() adjust_flavour = null species_fit = null sprite_sheets = null @@ -415,7 +415,7 @@ icon_state = "chronx_hood" item_state = "chronx_hood" flags = HEADCOVERSEYES | BLOCKHAIR - action_button_name = "Transform Hood" + actions_types = list(/datum/action/item_action/toggle) var/adjusted = 0 /obj/item/clothing/head/fluff/chronx/ui_action_click() @@ -445,7 +445,7 @@ icon_state = "chronx_robe" item_state = "chronx_robe" flags_size = ONESIZEFITSALL - action_button_name = "Transform Robes" + actions_types = list(/datum/action/item_action/toggle) adjust_flavour = "untransform" ignore_suitadjust = 0 diff --git a/code/modules/mob/dead/observer/spells.dm b/code/modules/mob/dead/observer/spells.dm index 993f2b6e344..39dae4c0746 100644 --- a/code/modules/mob/dead/observer/spells.dm +++ b/code/modules/mob/dead/observer/spells.dm @@ -20,6 +20,7 @@ var/global/list/boo_phrases=list( school = "transmutation" charge_max = 600 clothes_req = 0 + stat_allowed = 1 invocation = "" invocation_type = "none" range = 1 // Or maybe 3? diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index d558e50a1b4..597b755a620 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -54,8 +54,12 @@ if(in_contents_of(/obj/mecha)) canmove = 1 use_me = 1 //If it can move, let it emote - else if(istype(loc, /obj/item/device/mmi)) canmove = 1 //mmi won't move anyways so whatever - else canmove = 0 + else if(istype(loc, /obj/item/device/mmi)) + canmove = 1 //mmi won't move anyways so whatever + else + canmove = 0 + + update_action_buttons_icon() return canmove /mob/living/carbon/brain/ex_act() //you cant blow up brainmobs because it makes transfer_to() freak out when borgs blow up. diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 1fea808c660..f30ff8ed0f2 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -644,8 +644,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, if(do_mob(usr, src, POCKET_STRIP_DELAY)) if(internal) internal = null - if(internals) - internals.icon_state = "internal0" + update_internals_hud_icon(0) else var/no_mask2 if(!(wear_mask && wear_mask.flags & AIRTIGHT)) @@ -655,8 +654,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, to_chat(usr, "[src] is not wearing a suitable mask or helmet!") return internal = ITEM - if(internals) - internals.icon_state = "internal1" + update_internals_hud_icon(1) visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].", \ "[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM].") @@ -858,7 +856,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump, throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) else clear_alert("handcuffed") - update_action_buttons() //some of our action buttons might be unusable when we're handcuffed. + update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed. update_inv_handcuffed() update_hud_handcuffed() @@ -1031,3 +1029,16 @@ so that different stomachs can handle things in different ways VB*/ var/obj/item/LH = get_inactive_hand() if(LH) . |= LH.GetAccess() + +/mob/living/carbon/proc/can_breathe_gas() + if(!wear_mask) + return TRUE + + if(!(wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT) && internal == null) + return TRUE + + return FALSE + +/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0) + if(hud_used && hud_used.internals) + hud_used.internals.icon_state = "internal[internal_state]" \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index aa115ad8c4c..cf66c1d2c15 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -79,7 +79,7 @@ break if(thrust) - if((movement_dir || thrust.stabilization_on) && thrust.allow_thrust(0.01, src)) + if((movement_dir || thrust.stabilizers) && thrust.allow_thrust(0.01, src)) return 1 return 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 47448a73262..0919c3de016 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -166,9 +166,8 @@ update_fhair() update_head_accessory() if(internal) - if(internals) - internals.icon_state = "internal0" internal = null + update_internals_hud_icon(0) sec_hud_set_ID() update_inv_wear_mask() else if(I == wear_id) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a13f7d31150..4ee83d8eb5f 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -328,7 +328,6 @@ /mob/living/carbon/human/get_breath_from_internal(volume_needed) //making this call the parent would be far too complicated - if(internal) var/null_internals = 0 //internals are invalid, therefore turn them off var/skip_contents_check = 0 //rigsuit snowflake, oxygen tanks aren't stored inside the mob, so the 'contents.Find' check has to be skipped. @@ -353,12 +352,10 @@ if(internal) //check for hud updates every time this is called - if(internals) - internals.icon_state = "internal1" + update_internals_hud_icon(1) return internal.remove_air_volume(volume_needed) //returns the valid air else - if(internals) - internals.icon_state = "internal0" + update_internals_hud_icon(0) return null diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm index 40fcfb738b8..bae949dd9af 100644 --- a/code/modules/mob/living/carbon/human/species/plasmaman.dm +++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm @@ -125,8 +125,7 @@ H.equip_or_collect(new/obj/item/weapon/tank/plasma/plasmaman(H), tank_slot) // Bigger plasma tank from Raggy. to_chat(H, "You are now running on plasma internals from the [H.s_store] in your [tank_slot_name]. You must breathe plasma in order to survive, and are extremely flammable.") H.internal = H.get_item_by_slot(tank_slot) - if(H.internals) - H.internals.icon_state = "internal1" + H.update_internals_hud_icon(1) // Plasmamen are so fucking different that they need their own proc. /datum/species/plasmaman/handle_breath(var/datum/gas_mixture/breath, var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index aaa0c08bcbc..e187c3d321a 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -364,8 +364,7 @@ H.equip_or_collect(new /obj/item/weapon/tank/emergency_oxygen/vox(H), slot_l_hand) to_chat(H, "You are now running on nitrogen internals from the [H.l_hand] in your hand. Your species finds oxygen toxic, so you must breathe nitrogen only.") H.internal = H.l_hand - if(H.internals) - H.internals.icon_state = "internal1" + H.update_internals_hud_icon(1) /datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) updatespeciescolor(H) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 671e289ee21..985047a8284 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -181,19 +181,17 @@ /mob/living/carbon/proc/get_breath_from_internal(volume_needed) if(internal) - if(!contents.Find(internal)) + if(internal.loc != src) internal = null if(!wear_mask || !(wear_mask.flags & AIRTIGHT)) //not wearing mask or non-breath mask if(!head || !(head.flags & AIRTIGHT)) //not wearing helmet or non-breath helmet internal = null //turn off internals if(internal) - if(internals) - internals.icon_state = "internal1" + update_internals_hud_icon(1) return internal.remove_air_volume(volume_needed) else - if(internals) - internals.icon_state = "internal0" + update_internals_hud_icon(0) return @@ -437,12 +435,6 @@ see_invisible = see_override -/mob/living/carbon/handle_actions() - ..() - for(var/obj/item/I in internal_organs) - give_action_button(I, 1) - - /mob/living/carbon/handle_hud_icons() return diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm index d8a89b4d49f..1582ccb2bd8 100644 --- a/code/modules/mob/living/carbon/slime/life.dm +++ b/code/modules/mob/living/carbon/slime/life.dm @@ -243,6 +243,7 @@ else if(nutrition >= get_grow_nutrition() && amount_grown < 10) nutrition -= 20 amount_grown++ + update_action_buttons_icon() if(amount_grown >= 10 && !Victim && !Target && !ckey) if(is_adult) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 14585f6ae21..e17d9af6250 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -2,4 +2,5 @@ blinded = max(blinded, 1) clear_fullscreens() + update_action_buttons_icon() ..(gibbed) \ No newline at end of file diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 1bdc8e9eb57..93103fc2cae 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -49,8 +49,6 @@ handle_disabilities() // eye, ear, brain damages handle_status_effects() //all special effects, stunned, weakened, jitteryness, hallucination, sleeping, etc - handle_actions() - update_canmove() if(client) @@ -197,7 +195,6 @@ handle_vision() handle_hud_icons() - update_action_buttons() return 1 @@ -247,84 +244,6 @@ /mob/living/proc/handle_hud_icons_health() return -/mob/living/proc/handle_actions() - //Pretty bad, i'd use picked/dropped instead but the parent calls in these are nonexistent - for(var/datum/action/A in actions) - if(A.CheckRemoval(src)) - A.Remove(src) - for(var/obj/item/I in src) - give_action_button(I, 1) - return - -/mob/living/proc/give_action_button(var/obj/item/I, recursive = 0) - if(I.action_button_name) - if(!I.action) - if(I.action_button_custom_type) - I.action = new I.action_button_custom_type - else - I.action = new /datum/action/item_action - I.action.name = I.action_button_name - I.action.target = I - I.action.Grant(src) - - if(recursive) - for(var/obj/item/T in I) - give_action_button(T, recursive - 1) - -/mob/living/update_action_buttons() - if(!hud_used) return - if(!client) return - - if(!hud_used.hud_shown) - return - - client.screen -= hud_used.hide_actions_toggle - for(var/datum/action/A in actions) - if(A.button) - client.screen -= A.button - - if(hud_used.action_buttons_hidden) - if(!hud_used.hide_actions_toggle) - hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.UpdateIcon() - - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(1) - //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,1) - - client.screen += hud_used.hide_actions_toggle - return - - var/button_number = 0 - for(var/datum/action/A in actions) - button_number++ - if(A.button == null) - var/obj/screen/movable/action_button/N = new(hud_used) - N.owner = A - A.button = N - - var/obj/screen/movable/action_button/B = A.button - - B.UpdateIcon() - - B.name = A.UpdateName() - - client.screen += B - - if(!B.moved) - B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number) - //hud_used.SetButtonCoords(B,button_number) - - if(button_number > 0) - if(!hud_used.hide_actions_toggle) - hud_used.hide_actions_toggle = new(hud_used) - hud_used.hide_actions_toggle.InitialiseIcon(src) - if(!hud_used.hide_actions_toggle.moved) - hud_used.hide_actions_toggle.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number+1) - //hud_used.SetButtonCoords(hud_used.hide_actions_toggle,button_number+1) - client.screen += hud_used.hide_actions_toggle - - /mob/living/proc/process_nations() if(client) var/client/C = client diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6bd7c162308..0cb7b6c3457 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -49,7 +49,6 @@ var/list/icon/pipes_shown = list() var/last_played_vent - var/list/datum/action/actions = list() var/step_count = 0 var/list/butcher_results = null diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 90dc2a059ac..c6fc2919a16 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -234,6 +234,7 @@ else canmove = 1 update_transform() + update_action_buttons_icon() return canmove //Robots on fire diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 8a66bc1fb89..b7f3eec50bc 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -88,6 +88,8 @@ var/list/robot_verbs_default = list( var/obj/item/borg/sight/hud/sec/sechud = null var/obj/item/borg/sight/hud/med/healthhud = null + var/datum/action/item_action/toggle_research_scanner/scanner = null + /mob/living/silicon/robot/New(loc,var/syndie = 0,var/unfinished = 0, var/alien = 0) spark_system = new /datum/effect/system/spark_spread() spark_system.set_up(5, 0, src) @@ -144,6 +146,7 @@ var/list/robot_verbs_default = list( cell_component.installed = 1 diag_hud_set_borgcell() + scanner = new(src) scanner.Grant(src) /mob/living/silicon/robot/proc/init(var/alien=0) diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 362846dfd4a..280934c0e29 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -626,6 +626,7 @@ else canmove = 1 update_transform() + update_action_buttons_icon() return canmove /mob/living/simple_animal/update_transform() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index cc9788a15fe..6b4359e3b74 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1053,6 +1053,7 @@ var/list/slot_equipment_priority = list( \ layer = initial(layer) update_transform() + update_action_buttons_icon() return canmove /mob/proc/fall(var/forced) @@ -1368,16 +1369,7 @@ mob/proc/yank_out_object() /mob/proc/AddSpell(var/obj/effect/proc_holder/spell/spell) spell_list += spell - if(!spell.action) - spell.action = new/datum/action/spell_action - spell.action.target = spell - spell.action.name = spell.name - spell.action.button_icon = spell.action_icon - spell.action.button_icon_state = spell.action_icon_state - spell.action.background_icon_state = spell.action_background_icon_state - if(isliving(src)) - spell.action.Grant(src) - return + spell.action.Grant(src) //override to avoid rotating pixel_xy on mobs /mob/shuttleRotate(rotation) diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 0786320e9cb..fca9a35212c 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -13,7 +13,6 @@ var/obj/screen/hands = null var/obj/screen/pullin = null - var/obj/screen/internals = null var/obj/screen/i_select = null var/obj/screen/m_select = null var/obj/screen/healths = null @@ -123,7 +122,6 @@ hud_possible = list(SPECIALROLE_HUD) var/research_scanner = 0 //For research scanner equipped mobs. Enable to show research data when examining. - var/datum/action/scan_mode/scanner = new var/list/grabbed_by = list( ) var/list/requests = list( ) @@ -233,4 +231,6 @@ var/datum/vision_override/vision_type = null //Vision override datum. - var/list/permanent_huds = list() \ No newline at end of file + var/list/permanent_huds = list() + + var/list/actions = list() \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 29faec1ac97..5d0e190ee04 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -251,7 +251,9 @@ obj/item/weapon/gun/proc/newshot(params) I.loc = src update_icon() update_gunlight(user) - verbs += /obj/item/weapon/gun/proc/toggle_gunlight + var/datum/action/A = new /datum/action/item_action/toggle_gunlight(src) + if(loc == user) + A.Grant(user) if(istype(I, /obj/item/weapon/screwdriver)) if(F && can_flashlight) @@ -262,7 +264,8 @@ obj/item/weapon/gun/proc/newshot(params) update_gunlight(user) S.update_brightness(user) update_icon() - verbs -= /obj/item/weapon/gun/proc/toggle_gunlight + for(var/datum/action/item_action/toggle_gunlight/TGL in actions) + qdel(TGL) if(unique_rename) if(istype(I, /obj/item/weapon/pen)) @@ -296,6 +299,10 @@ obj/item/weapon/gun/proc/newshot(params) else set_light(0) + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() + /obj/item/weapon/gun/pickup(mob/user) ..() if(azoom) @@ -376,7 +383,7 @@ obj/item/weapon/gun/proc/newshot(params) /datum/action/toggle_scope_zoom name = "Toggle Scope" - check_flags = AB_CHECK_ALIVE|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING + check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING button_icon_state = "sniper_zoom" var/obj/item/weapon/gun/gun = null diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 757315019ab..d0e7efcd26b 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -5,7 +5,7 @@ can_suppress = 1 burst_size = 3 fire_delay = 2 - action_button_name = "Toggle Firemode" + actions_types = list(/datum/action/item_action/toggle_firemode) /obj/item/weapon/gun/projectile/automatic/isHandgun() return 0 @@ -58,6 +58,9 @@ playsound(user, 'sound/weapons/empty.ogg', 100, 1) update_icon() + for(var/X in actions) + var/datum/action/A = X + A.UpdateButtonIcon() /obj/item/weapon/gun/projectile/automatic/can_shoot() return get_ammo() @@ -107,7 +110,7 @@ fire_delay = 2 can_suppress = 0 burst_size = 1 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/wt550/update_icon() ..() @@ -129,7 +132,6 @@ origin_tech = "combat=5;materials=2;syndicate=8" mag_type = /obj/item/ammo_box/magazine/m556 fire_sound = 'sound/weapons/Gunshot_smg.ogg' - action_button_name = "Toggle Grenade Launcher" can_suppress = 0 var/obj/item/weapon/gun/projectile/revolver/grenadelauncher/underbarrel burst_size = 3 @@ -227,7 +229,7 @@ can_suppress = 0 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/shotgun/bulldog/New() ..() diff --git a/code/modules/projectiles/guns/projectile/launchers.dm b/code/modules/projectiles/guns/projectile/launchers.dm index 61032f819fd..462341fdc36 100644 --- a/code/modules/projectiles/guns/projectile/launchers.dm +++ b/code/modules/projectiles/guns/projectile/launchers.dm @@ -39,7 +39,7 @@ mag_type = /obj/item/ammo_box/magazine/m75 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/gyropistol/isHandgun() return 1 @@ -65,7 +65,7 @@ burst_size = 1 fire_delay = 0 select = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/speargun/update_icon() return diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 661a14a44b4..d1d65dcbfc0 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -8,7 +8,7 @@ can_suppress = 1 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/pistol/isHandgun() return 1 @@ -64,4 +64,4 @@ can_suppress = 0 burst_size = 3 fire_delay = 2 - action_button_name = "Toggle Firemode" + actions_types = list(/datum/action/item_action/toggle_firemode) diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index 1d9949173ad..cf7c2a4bb35 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -15,7 +15,7 @@ zoomable = TRUE zoom_amt = 7 //Long range, enough to see in front of you, but no tiles behind you. slot_flags = SLOT_BACK - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/sniper_rifle/update_icon() if(magazine) diff --git a/code/modules/projectiles/guns/projectile/toy.dm b/code/modules/projectiles/guns/projectile/toy.dm index c0465a83beb..4efeb570e0f 100644 --- a/code/modules/projectiles/guns/projectile/toy.dm +++ b/code/modules/projectiles/guns/projectile/toy.dm @@ -26,7 +26,7 @@ can_suppress = 0 burst_size = 1 fire_delay = 0 - action_button_name = null + actions_types = list() /obj/item/weapon/gun/projectile/automatic/toy/pistol/update_icon() ..() diff --git a/code/modules/reagents/newchem/drugs.dm b/code/modules/reagents/newchem/drugs.dm index 937ebff0397..af11ebf27c7 100644 --- a/code/modules/reagents/newchem/drugs.dm +++ b/code/modules/reagents/newchem/drugs.dm @@ -297,11 +297,11 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 1)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + if(C.can_breathe_gas()) C.emote("gasp") C.losebreath++ - C.reagents.add_reagent("toxin",10) - C.reagents.add_reagent("neurotoxin2",20) + C.reagents.add_reagent("toxin", 10) + C.reagents.add_reagent("neurotoxin2", 20) /datum/chemical_reaction/saltpetre name = "saltpetre" @@ -438,7 +438,7 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 1)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) + if(C.can_breathe_gas()) C.reagents.add_reagent("jenkem", 25) /datum/reagent/jenkem diff --git a/code/modules/reagents/newchem/toxins.dm b/code/modules/reagents/newchem/toxins.dm index ae8b80ac1cd..d34f48fe8db 100644 --- a/code/modules/reagents/newchem/toxins.dm +++ b/code/modules/reagents/newchem/toxins.dm @@ -240,8 +240,8 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 1)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) - C.reagents.add_reagent("cyanide",7) + if(C.can_breathe_gas()) + C.reagents.add_reagent("cyanide", 7) /datum/reagent/itching_powder name = "Itching Powder" @@ -672,8 +672,8 @@ var/turf/T = get_turf(holder.my_atom) T.visible_message("The solution generates a strong vapor!") for(var/mob/living/carbon/C in range(T, 2)) - if(!(C.wear_mask && (C.internals != null || C.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT))) - C.reagents.add_reagent("sarin",4) + if(C.can_breathe_gas()) + C.reagents.add_reagent("sarin", 4) /datum/reagent/sarin/on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm index 96746f780d8..4eb8d06ceb3 100644 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ b/code/modules/research/xenobiology/xenobio_camera.dm @@ -16,11 +16,11 @@ name = "Slime management console" desc = "A computer used for remotely handling slimes." networks = list("SS13") - off_action = new/datum/action/camera_off/xenobio - var/datum/action/slime_place/slime_place_action = new - var/datum/action/slime_pick_up/slime_up_action = new - var/datum/action/feed_slime/feed_slime_action = new - var/datum/action/monkey_recycle/monkey_recycle_action = new + off_action = new /datum/action/innate/camera_off/xenobio + var/datum/action/innate/slime_place/slime_place_action = new + var/datum/action/innate/slime_pick_up/slime_up_action = new + var/datum/action/innate/feed_slime/feed_slime_action = new + var/datum/action/innate/monkey_recycle/monkey_recycle_action = new var/list/stored_slimes = list() var/max_slimes = 5 @@ -62,7 +62,7 @@ return return ..() -/datum/action/camera_off/xenobio/Activate() +/datum/action/innate/camera_off/xenobio/Activate() if(!target || !ishuman(target)) return var/mob/living/carbon/C = target @@ -88,12 +88,11 @@ src.Remove(C) -/datum/action/slime_place +/datum/action/innate/slime_place name = "Place Slimes" - action_type = AB_INNATE button_icon_state = "slime_down" -/datum/action/slime_place/Activate() +/datum/action/innate/slime_place/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner @@ -106,12 +105,11 @@ S.visible_message("[S] warps in!") X.stored_slimes -= S -/datum/action/slime_pick_up +/datum/action/innate/slime_pick_up name = "Pick up Slime" - action_type = AB_INNATE button_icon_state = "slime_up" -/datum/action/slime_pick_up/Activate() +/datum/action/innate/slime_pick_up/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner @@ -131,12 +129,11 @@ X.stored_slimes += S -/datum/action/feed_slime +/datum/action/innate/feed_slime name = "Feed Slimes" - action_type = AB_INNATE button_icon_state = "monkey_down" -/datum/action/feed_slime/Activate() +/datum/action/innate/feed_slime/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner @@ -151,12 +148,11 @@ to_chat(owner, "[X] now has [X.monkeys] monkeys left.") -/datum/action/monkey_recycle +/datum/action/innate/monkey_recycle name = "Recycle Monkeys" - action_type = AB_INNATE button_icon_state = "monkey_up" -/datum/action/monkey_recycle/Activate() +/datum/action/innate/monkey_recycle/Activate() if(!target || !ishuman(owner)) return var/mob/living/carbon/human/C = owner diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 2810617bd12..2595d9bf95d 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -47,7 +47,7 @@ name = "Activate Pill" /datum/action/item_action/hands_free/activate_pill/Trigger() - if(!Checks()) + if(!..()) return to_chat(owner, "You grit your teeth and burst the implanted [target]!") add_logs(owner, null, "swallowed an implanted pill", target) diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm index b753bcf71a5..2fa12d1a0dc 100644 --- a/code/modules/surgery/organs/augments_internal.dm +++ b/code/modules/surgery/organs/augments_internal.dm @@ -49,7 +49,7 @@ implant_color = "#DE7E00" slot = "brain_antidrop" origin_tech = "materials=5;programming=4;biotech=4" - organ_action_name = "Toggle Anti-Drop" + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/brain/anti_drop/ui_action_click() active = !active @@ -263,7 +263,7 @@ implant_color = "#007ACC" slot = "shoulders" origin_tech = "materials=5;biotech=4;powerstorage=4" - organ_action_name = "Toggle Arm Mod" + actions_types = list(/datum/action/item_action/organ_action/toggle) var/obj/holder//is defined as the retractable item itself. ensure this is defined somewhere! var/out = 0//determines if the item is in the owner's hand or not var/overloaded = 0//is set to 1 when owner gets EMPed. if set to 1, implant doesn't work. @@ -319,7 +319,7 @@ desc = "A variant of the arm cannon implant that fires electrodes and disabler shots. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_tase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4" - organ_action_name = "Toggle Arm Cannon Taser" + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created... holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun) @@ -329,7 +329,7 @@ desc = "A variant of the arm cannon implant that fires lethal laser beams. The cannon emerges from the subject's arms and remains in the shoulders when not in use." icon_state = "armcannon_lase_implant" origin_tech = "materials=5;combat=5;biotech=4;powerstorage=4;syndicate=5"//this is kinda nutty and i might lower it - organ_action_name = "Toggle Arm Cannon Laser" + actions_types = list(/datum/action/item_action/organ_action/toggle) /obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New() holder = new /obj/item/weapon/gun/energy/laser/mounted(src) diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 27ab9ea3b99..b7eba792060 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -8,9 +8,7 @@ var/zone = "chest" var/slot vital = 0 - var/organ_action_name = null var/non_primary = 0 - action_button_custom_type = /datum/action/item_action/organ_action /obj/item/organ/internal/New(var/mob/living/carbon/holder) if(istype(holder)) @@ -41,8 +39,9 @@ parent.internal_organs |= src //M.internal_organs_by_name[src] |= src(H,1) loc = null - if(organ_action_name) - action_button_name = organ_action_name + for(var/X in actions) + var/datum/action/A = X + A.Grant(M) /obj/item/organ/internal/remove(mob/living/carbon/M, special = 0) @@ -61,14 +60,18 @@ else parent.internal_organs -= src - if(organ_action_name) - action_button_name = null + for(var/X in actions) + var/datum/action/A = X + A.Remove(M) /obj/item/organ/internal/replaced(var/mob/living/carbon/human/target,var/obj/item/organ/external/affected) insert(target) ..() +/obj/item/organ/internal/item_action_slot_check(slot, mob/user) + return + /obj/item/organ/internal/proc/on_find(mob/living/finder) return @@ -197,7 +200,7 @@ icon_state = "cursedheart-off" icon_base = "cursedheart" origin_tech = "biotech=5" - organ_action_name = "pump your blood" + actions_types = list(/datum/action/item_action/organ_action/cursed_heart) var/last_pump = 0 var/pump_delay = 30 //you can pump 1 second early, for lag, but no more (otherwise you could spam heal) var/blood_loss = 100 //600 blood is human default, so 5 failures (below 122 blood is where humans die because reasons?) @@ -235,25 +238,33 @@ if(owner) to_chat(owner, "Your heart has been replaced with a cursed one, you have to pump this one manually otherwise you'll die!") + +/datum/action/item_action/organ_action/cursed_heart + name = "pump your blood" + //You are now brea- pumping blood manually -/obj/item/organ/internal/heart/cursed/ui_action_click() - if(world.time < (last_pump + (pump_delay-10))) //no spam - to_chat(owner, "Too soon!") - return +/datum/action/item_action/organ_action/cursed_heart/Trigger() + . = ..() + if(. && istype(target,/obj/item/organ/internal/heart/cursed)) + var/obj/item/organ/internal/heart/cursed/cursed_heart = target - last_pump = world.time - playsound(owner, 'sound/effects/singlebeat.ogg', 40, 1) - to_chat(owner, "Your heart beats.") + if(world.time < (cursed_heart.last_pump + (cursed_heart.pump_delay-10))) //no spam + to_chat(owner, "Too soon!") + return - var/mob/living/carbon/human/H = owner - if(istype(H)) - H.vessel.add_reagent("blood", (blood_loss*0.5))//gain half the blood back from a failure - if(owner.client) - owner.client.color = "" + cursed_heart.last_pump = world.time + playsound(owner,'sound/effects/singlebeat.ogg',40,1) + to_chat(owner, "Your heart beats.") - H.adjustBruteLoss(-heal_brute) - H.adjustFireLoss(-heal_burn) - H.adjustOxyLoss(-heal_oxy) + var/mob/living/carbon/human/H = owner + if(istype(H)) + H.vessel.add_reagent("blood", (cursed_heart.blood_loss*0.5))//gain half the blood back from a failure + if(owner.client) + owner.client.color = "" + + H.adjustBruteLoss(-cursed_heart.heal_brute) + H.adjustFireLoss(-cursed_heart.heal_burn) + H.adjustOxyLoss(-cursed_heart.heal_oxy) /obj/item/organ/internal/lungs name = "lungs" diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi index 127b63a154a34e62bba073f77e14bdc7a56bbe7c..3269c8ae7b541cac5f5de748e32a876714fc43ed 100644 GIT binary patch literal 66241 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 Date: Tue, 19 Jul 2016 07:59:52 -0700 Subject: [PATCH 2/3] Fix latejoining mimes, spacing, Grant/Remove casting --- code/datums/action.dm | 55 +++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/code/datums/action.dm b/code/datums/action.dm index a8cab9a196f..745d03bc978 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -33,23 +33,23 @@ button = null return ..() -/datum/action/proc/Grant(mob/living/L) +/datum/action/proc/Grant(mob/M) if(owner) - if(owner == L) + if(owner == M) return Remove(owner) - owner = L - L.actions += src - if(L.client) - L.client.screen += button - L.update_action_buttons() + owner = M + M.actions += src + if(M.client) + M.client.screen += button + M.update_action_buttons() -/datum/action/proc/Remove(mob/living/L) - if(L.client) - L.client.screen -= button +/datum/action/proc/Remove(mob/M) + if(M.client) + M.client.screen -= button button.moved = FALSE //so the button appears in its normal position when given to another owner. - L.actions -= src - L.update_action_buttons() + M.actions -= src + M.update_action_buttons() owner = null /datum/action/proc/Trigger() @@ -67,7 +67,7 @@ if(owner.restrained()) return 0 if(check_flags & AB_CHECK_STUNNED) - if(owner.stunned) + if(owner.stunned || owner.weakened) return 0 if(check_flags & AB_CHECK_LYING) if(owner.lying) @@ -183,24 +183,28 @@ name = "Toggle Hardsuit Mode" /datum/action/item_action/toggle + /datum/action/item_action/toggle/New(Target) ..() name = "Toggle [target.name]" button.name = name /datum/action/item_action/openclose + /datum/action/item_action/openclose/New(Target) ..() name = "Open/Close [target.name]" button.name = name /datum/action/item_action/button + /datum/action/item_action/button/New(Target) ..() name = "Button/Unbutton [target.name]" button.name = name /datum/action/item_action/zipper + /datum/action/item_action/zipper/New(Target) ..() name = "Zip/Unzip [target.name]" @@ -228,6 +232,7 @@ name = "YEAH!" /datum/action/item_action/adjust + /datum/action/item_action/adjust/New(Target) ..() name = "Adjust [target.name]" @@ -294,6 +299,7 @@ return ..() /datum/action/item_action/organ_action/toggle + /datum/action/item_action/organ_action/toggle/New(Target) ..() name = "Toggle [target.name]" @@ -353,25 +359,22 @@ return 0 var/obj/effect/proc_holder/spell/spell = target - if(usr) - return spell.can_cast(usr) - else - if(owner) - return spell.can_cast(owner) - return 1 + if(owner) + return spell.can_cast(owner) + return 0 + +/* +/datum/action/spell_action/alien -/*/datum/action/spell_action/alien /datum/action/spell_action/alien/IsAvailable() if(!target) return 0 var/obj/effect/proc_holder/alien/ab = target - if(usr) - return ab.cost_check(ab.check_turf, usr, 1) - else - if(owner) - return ab.cost_check(ab.check_turf, owner, 1) - return 1*/ + if(owner) + return ab.cost_check(ab.check_turf, owner, 1) + return 0 +*/ //Preset for general and toggled actions /datum/action/innate From 6650991be126887a1329f71b5c399db82506b3d5 Mon Sep 17 00:00:00 2001 From: Tigercat2000 Date: Tue, 19 Jul 2016 20:34:50 -0700 Subject: [PATCH 3/3] Tank action buttons now toggle the tank --- code/game/objects/items/weapons/tanks/tanks.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index e0031286ecc..9415e49d3cd 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -40,6 +40,10 @@ return ..() + +/obj/item/weapon/tank/ui_action_click(mob/user) + toggle_internals(user) + /obj/item/weapon/tank/proc/toggle_internals(mob/user) var/mob/living/carbon/C = user if(!istype(C))