From dadc434f4e6fa66168b98badb1b90a3c1f8a6783 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 31 May 2015 19:03:28 +0930 Subject: [PATCH 1/3] Ported action button system from Paradise/tg --- baystation12.dme | 2 + code/_onclick/hud/_defines.dm | 7 - code/_onclick/hud/action.dm | 218 ++++++++++++++++++ code/_onclick/hud/hud.dm | 7 +- code/_onclick/hud/human.dm | 46 ---- code/_onclick/hud/movable_screen_objects.dm | 84 +++++++ code/_onclick/hud/screen_objects.dm | 5 - code/game/objects/items.dm | 9 +- code/game/objects/items/devices/flashlight.dm | 4 +- .../objects/items/weapons/tanks/jetpack.dm | 2 +- code/modules/clothing/clothing.dm | 17 +- code/modules/clothing/glasses/glasses.dm | 13 +- code/modules/clothing/head/misc_special.dm | 4 +- code/modules/clothing/shoes/magboots.dm | 7 +- .../modules/clothing/spacesuits/spacesuits.dm | 4 +- code/modules/mob/living/carbon/alien/life.dm | 1 + code/modules/mob/living/carbon/brain/life.dm | 1 + .../mob/living/carbon/human/inventory.dm | 2 +- code/modules/mob/living/carbon/human/life.dm | 11 +- .../modules/mob/living/carbon/metroid/life.dm | 1 + code/modules/mob/living/living_defense.dm | 75 ++++++ code/modules/mob/living/living_defines.dm | 1 + code/modules/mob/living/silicon/robot/life.dm | 1 + icons/mob/actions.dmi | Bin 0 -> 30912 bytes 24 files changed, 416 insertions(+), 106 deletions(-) create mode 100644 code/_onclick/hud/action.dm create mode 100644 code/_onclick/hud/movable_screen_objects.dm create mode 100644 icons/mob/actions.dmi diff --git a/baystation12.dme b/baystation12.dme index fca5b332b0..ceff964733 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -46,10 +46,12 @@ #include "code\_onclick\rig.dm" #include "code\_onclick\telekinesis.dm" #include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action.dm" #include "code\_onclick\hud\alien_larva.dm" #include "code\_onclick\hud\hud.dm" #include "code\_onclick\hud\human.dm" #include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" #include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 900e89e7e7..1486e54648 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -13,13 +13,6 @@ Therefore, the top right corner (except during admin shenanigans) is at "15,15" */ -//Upper left action buttons, displayed when you pick up an item that has this enabled. -#define ui_action_slot1 "1:6,14:26" -#define ui_action_slot2 "2:8,14:26" -#define ui_action_slot3 "3:10,14:26" -#define ui_action_slot4 "4:12,14:26" -#define ui_action_slot5 "5:14,14:26" - //Lower left, persistant menu #define ui_inventory "1:6,1:5" diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm new file mode 100644 index 0000000000..1a2206d82a --- /dev/null +++ b/code/_onclick/hud/action.dm @@ -0,0 +1,218 @@ +#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) + +/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 + del(button) + 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 !(target in user) + +/datum/action/item_action/hands_free + check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index f39499f3dc..665e3e64f3 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -133,7 +133,8 @@ var/list/global_huds = list( var/list/other var/list/obj/screen/hotkeybuttons - var/list/obj/screen/item_action/item_action_list = list() //Used for the item action ui buttons. + var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle + var/action_buttons_hidden = 0 datum/hud/New(mob/owner) mymob = owner @@ -279,8 +280,6 @@ datum/hud/New(mob/owner) src.client.screen -= src.hud_used.other if(src.hud_used.hotkeybuttons) src.client.screen -= src.hud_used.hotkeybuttons - if(src.hud_used.item_action_list) - src.client.screen -= src.hud_used.item_action_list //Due to some poor coding some things need special treatment: //These ones are a part of 'adding', 'other' or 'hotkeybuttons' but we want them to stay @@ -338,8 +337,6 @@ datum/hud/New(mob/owner) src.client.screen -= src.hud_used.other if(src.hud_used.hotkeybuttons) src.client.screen -= src.hud_used.hotkeybuttons - if(src.hud_used.item_action_list) - src.client.screen -= src.hud_used.item_action_list src.client.screen -= src.internals src.client.screen += src.hud_used.action_intent //we want the intent swticher visible else diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 97b07e6154..2e894acdd6 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -385,52 +385,6 @@ client.screen -= hud_used.hotkeybuttons hud_used.hotkey_ui_hidden = 1 - -/mob/living/carbon/human/update_action_buttons() - var/num = 1 - if(!hud_used) return - if(!client) return - - if(!hud_used.hud_shown) //Hud toggled to minimal - return - - client.screen -= hud_used.item_action_list - - hud_used.item_action_list = list() - for(var/obj/item/I in src) - if(I.icon_action_button) - var/obj/screen/item_action/A = new(hud_used) - - //A.icon = 'icons/mob/screen1_action.dmi' - //A.icon_state = I.icon_action_button - A.icon = ui_style2icon(client.prefs.UI_style) - A.icon_state = "template" - var/image/img = image(I.icon, A, I.icon_state) - img.pixel_x = 0 - img.pixel_y = 0 - A.overlays += img - - if(I.action_button_name) - A.name = I.action_button_name - else - A.name = "Use [I.name]" - A.owner = I - hud_used.item_action_list += A - switch(num) - if(1) - A.screen_loc = ui_action_slot1 - if(2) - A.screen_loc = ui_action_slot2 - if(3) - A.screen_loc = ui_action_slot3 - if(4) - A.screen_loc = ui_action_slot4 - if(5) - A.screen_loc = ui_action_slot5 - break //5 slots available, so no more can be added. - num++ - src.client.screen += src.hud_used.item_action_list - //Used for new human mobs created by cloning/goleming/etc. /mob/living/carbon/human/proc/set_cloned_appearance() f_style = "Shaved" diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm new file mode 100644 index 0000000000..5034606256 --- /dev/null +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -0,0 +1,84 @@ +////////////////////////// +//Movable Screen Objects// +// By RemieRichards // +////////////////////////// + + +//Movable Screen Object +//Not tied to the grid, places it's center where the cursor is + +/obj/screen/movable + var/snap2grid = FALSE + var/moved = FALSE + +//Snap Screen Object +//Tied to the grid, snaps to the nearest turf + +/obj/screen/movable/snap + snap2grid = TRUE + + +/obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) + var/list/PM = params2list(params) + + //No screen-loc information? abort. + if(!PM || !PM["screen-loc"]) + return + + //Split screen-loc up into X+Pixel_X and Y+Pixel_Y + var/list/screen_loc_params = text2list(PM["screen-loc"], ",") + + //Split X+Pixel_X up into list(X, Pixel_X) + var/list/screen_loc_X = text2list(screen_loc_params[1],":") + + //Split Y+Pixel_Y up into list(Y, Pixel_Y) + var/list/screen_loc_Y = text2list(screen_loc_params[2],":") + + if(snap2grid) //Discard Pixel Values + screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" + + else //Normalise Pixel Values (So the object drops at the center of the mouse, not 16 pixels off) + var/pix_X = text2num(screen_loc_X[2]) - 16 + 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 + + +//Debug procs +/client/proc/test_movable_UI() + set category = "Debug" + set name = "Spawn Movable UI Object" + + var/obj/screen/movable/M = new() + M.name = "Movable UI Object" + M.icon_state = "block" + M.maptext = "Movable" + M.maptext_width = 64 + + var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Movable UI Object") as text + if(!screen_l) + return + + M.screen_loc = screen_l + + screen += M + + +/client/proc/test_snap_UI() + set category = "Debug" + set name = "Spawn Snap UI Object" + + var/obj/screen/movable/snap/S = new() + S.name = "Snap UI Object" + S.icon_state = "block" + S.maptext = "Snap" + S.maptext_width = 64 + + var/screen_l = input(usr,"Where on the screen? (Formatted as 'X,Y' e.g: '1,1' for bottom left)","Spawn Snap UI Object") as text + if(!screen_l) + return + + S.screen_loc = screen_l + + screen += S \ No newline at end of file diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 4a7d6f2acb..f0cc69fcda 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -61,11 +61,6 @@ owner.ui_action_click() return 1 -//This is the proc used to update all the action buttons. It just returns for all mob types except humans. -/mob/proc/update_action_buttons() - return - - /obj/screen/grab name = "grab" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 90edc04c0c..45d6dd0624 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -21,8 +21,9 @@ var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - var/icon_action_button //If this is set, The item will make an action button on the player's HUD when picked up. The button will have the icon_action_button sprite from the screen1_action.dmi file. - var/action_button_name //This is the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. Note that icon_action_button needs to be set in order for the action button to appear. + var/datum/action/item_action/action = null + 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_is_hands_free = 0 //If 1, bypass the restrained, lying, and stunned checks action buttons normally test for //Since any item can now be a piece of clothing, this has to be put here so all items share it. var/flags_inv //This flag is used to determine when items in someone's inventory cover others. IE helmets making it so you can't see glasses, etc. @@ -398,9 +399,7 @@ var/list/global/slot_flags_enumeration = list( //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() - if( src in usr ) - attack_self(usr) - + attack_self(usr) /obj/item/proc/IsShield() return 0 diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index b8884608d7..f68451f329 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -10,7 +10,7 @@ matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 20) - icon_action_button = "action_flashlight" + action_button_name = "Toggle Flashlight" var/on = 0 var/brightness_on = 4 //luminosity when on @@ -141,7 +141,7 @@ light_color = "#e58775" icon_state = "flare" item_state = "flare" - icon_action_button = null //just pull it manually, neckbeard. + action_button_name = null //just pull it manually, neckbeard. var/fuel = 0 var/on_damage = 7 var/produce_heat = 1500 diff --git a/code/game/objects/items/weapons/tanks/jetpack.dm b/code/game/objects/items/weapons/tanks/jetpack.dm index b3b9e229a7..745f828d84 100644 --- a/code/game/objects/items/weapons/tanks/jetpack.dm +++ b/code/game/objects/items/weapons/tanks/jetpack.dm @@ -11,7 +11,7 @@ var/on = 0.0 var/stabilization_on = 0 var/volume_rate = 500 //Needed for borg jetpack transfer - icon_action_button = "action_jetpack" + action_button_name = "Toggle Jetpack" /obj/item/weapon/tank/jetpack/New() ..() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index a11f0b8d7d..7fa6bd788b 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -250,11 +250,6 @@ BLIND // can't see anything var/brightness_on var/on = 0 -/obj/item/clothing/head/New() - ..() - if(!icon_action_button && brightness_on) - icon_action_button = "[icon_state]" - /obj/item/clothing/head/attack_self(mob/user) if(brightness_on) if(!isturf(user.loc)) @@ -382,19 +377,19 @@ BLIND // can't see anything var/displays_id = 1 var/rolled_down = -1 //0 = unrolled, 1 = rolled, -1 = cannot be toggled sprite_sheets = list("Vox" = 'icons/mob/species/vox/uniform.dmi') - + //convenience var for defining the icon state for the overlay used when the clothing is worn. //Also used by rolling/unrolling. var/worn_state = null /obj/item/clothing/under/New() if(worn_state) - if(!item_state_slots) + if(!item_state_slots) item_state_slots = list() item_state_slots[slot_w_uniform_str] = worn_state else worn_state = icon_state - + //autodetect rollability if(rolled_down < 0) if((worn_state + "_d_s") in icon_states('icons/mob/uniform.dmi')) @@ -458,10 +453,10 @@ BLIND // can't see anything if (( usr.restrained() ) || ( usr.stat )) return - + if (!usr.unEquip(src)) return - + switch(over_object.name) if("r_hand") usr.put_in_r_hand(src) @@ -544,7 +539,7 @@ BLIND // can't see anything if(rolled_down < 0) usr << "You cannot roll down [src]!" return - + rolled_down = !rolled_down if(rolled_down) body_parts_covered &= LOWER_TORSO|LEGS|FEET diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 49f6e75f87..9d3d033359 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -37,7 +37,7 @@ desc = "Used for seeing walls, floors, and stuff through anything." icon_state = "meson" item_state = "glasses" - icon_action_button = "action_meson" //This doesn't actually matter, the action button is generated from the current icon_state. But, this is the only way to get it to show up. + action_button_name = "Toggle Goggles" origin_tech = list(TECH_MAGNET = 2, TECH_ENGINERING = 2) toggleable = 1 vision_flags = SEE_TURFS @@ -57,7 +57,6 @@ icon_state = "purple" item_state = "glasses" toggleable = 1 - icon_action_button = "action_science" /obj/item/clothing/glasses/science/New() ..() @@ -76,7 +75,6 @@ origin_tech = list(TECH_MAGNET = 2) darkness_view = 7 toggleable = 1 - icon_action_button = "action_nvg" off_state = "denight" /obj/item/clothing/glasses/night/New() @@ -102,7 +100,6 @@ desc = "Very confusing glasses." icon_state = "material" item_state = "glasses" - icon_action_button = "action_material" origin_tech = list(TECH_MAGNET = 3, TECH_ENGINERING = 3) toggleable = 1 vision_flags = SEE_OBJS @@ -147,7 +144,7 @@ desc = "Protects the eyes from welders, approved by the mad scientist association." icon_state = "welding-g" item_state = "welding-g" - icon_action_button = "action_welding_g" + action_button_name = "Flip Welding Goggles" var/up = 0 /obj/item/clothing/glasses/welding/attack_self() @@ -182,7 +179,6 @@ desc = "Welding goggles made from more expensive materials, strangely smells like potatoes." icon_state = "rwelding-g" item_state = "rwelding-g" - icon_action_button = "action_welding_g" /obj/item/clothing/glasses/sunglasses/blindfold name = "blindfold" @@ -223,7 +219,6 @@ item_state = "glasses" origin_tech = list(TECH_MAGNET = 3) toggleable = 1 - icon_action_button = "action_thermal" vision_flags = SEE_MOBS invisa_view = 2 @@ -249,12 +244,12 @@ name = "Optical Meson Scanner" desc = "Used for seeing walls, floors, and stuff through anything." icon_state = "meson" - origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4) + origin_tech = list(TECH_MAGNET = 3, TECH_ILLEGAL = 4) /obj/item/clothing/glasses/thermal/plain toggleable = 0 activation_sound = null - icon_action_button = "" + action_button_name = null /obj/item/clothing/glasses/thermal/plain/monocle name = "Thermoncle" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 743351f5ca..1b58abddae 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -22,7 +22,7 @@ armor = list(melee = 10, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) flags_inv = (HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) body_parts_covered = HEAD|FACE|EYES - icon_action_button = "action_welding" + action_button_name = "Flip Welding Mask" siemens_coefficient = 0.9 w_class = 3 @@ -48,7 +48,7 @@ flags_inv &= ~(HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE) icon_state = "[initial(icon_state)]up" usr << "You push the [src] up out of your face." - update_clothing_icon() //so our mob-overlays + update_clothing_icon() //so our mob-overlays usr.update_action_buttons() diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 5c214ed070..d1c896f1f4 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -7,11 +7,10 @@ overshoes = 1 var/magpulse = 0 var/icon_base = "magboots" - icon_action_button = "action_blank" - action_button_name = "Toggle the magboots" + action_button_name = "Toggle Magboots" var/obj/item/clothing/shoes/shoes = null //Undershoes var/mob/living/carbon/human/wearer = null //For shoe procs - + /obj/item/clothing/shoes/magboots/proc/set_slowdown() slowdown = shoes? max(SHOES_SLOWDOWN, shoes.slowdown): SHOES_SLOWDOWN //So you can't put on magboots to make you walk faster. if (magpulse) @@ -37,7 +36,7 @@ /obj/item/clothing/shoes/magboots/mob_can_equip(mob/user) var/mob/living/carbon/human/H = user - + if(H.shoes) shoes = H.shoes if(shoes.overshoes) diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index 61013e2276..78ecc731de 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -20,6 +20,7 @@ var/obj/machinery/camera/camera var/list/camera_networks + action_button_name = "Toggle Helmet Light" light_overlay = "helmet_light" brightness_on = 4 on = 0 @@ -28,9 +29,6 @@ if(!camera && camera_networks) - if(!icon_action_button) - icon_action_button = "[icon_state]" - camera = new /obj/machinery/camera(src) camera.replace_networks(camera_networks) camera.c_tag = user.name diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 13bc1a4686..de6541128e 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -27,6 +27,7 @@ //Status updates, death etc. handle_regular_status_updates() + handle_actions() update_canmove() update_icons() diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 189dfd81e7..7f25d287bd 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -27,6 +27,7 @@ //Status updates, death etc. handle_regular_status_updates() update_canmove() + handle_actions() if(client) handle_regular_hud_updates() diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 574b5c1457..7f469f08d7 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -315,7 +315,7 @@ This saves us from having to call add_fingerprint() any time something is put in W.layer = 20 - if(W.icon_action_button) + if(W.action_button_name) update_action_buttons() return 1 diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 7f9cca2293..a93867ebd1 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -117,6 +117,7 @@ //Status updates, death etc. handle_regular_status_updates() //Optimized a bit + handle_actions() update_canmove() //Update our name based on whether our face is obscured/disfigured @@ -242,7 +243,7 @@ src << "Your hand won't respond properly, you drop what you're holding!" drop_item() if(getBrainLoss() >= 45) - if(10 <= rn && rn <= 12) + if(10 <= rn && rn <= 12) if(prob(50)) src << "You suddenly black out!" Paralyse(10) @@ -1035,12 +1036,12 @@ blinded = 1 // Check everything else. - + //Vision var/obj/item/organ/vision if(species.vision_organ) vision = internal_organs_by_name[species.vision_organ] - + if(!vision) // Presumably if a species has no vision organs, they see via some other means. eye_blind = 0 blinded = 0 @@ -1049,7 +1050,7 @@ eye_blind = 1 blinded = 1 eye_blurry = 1 - else + else //blindness if(sdisabilities & BLIND) // Disabled-blind, doesn't get better on its own blinded = 1 @@ -1059,7 +1060,7 @@ else if(istype(glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) //resting your eyes with a blindfold heals blurry eyes faster eye_blurry = max(eye_blurry-3, 0) blinded = 1 - + //blurry sight if(vision.is_bruised()) // Vision organs impaired? Permablurry. eye_blurry = 1 diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index b41fdb758a..029b49faab 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -28,6 +28,7 @@ handle_environment(environment) // Handle temperature/pressure differences between body and environment handle_regular_status_updates() // Status updates, death etc. + handle_actions() /mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment) if(!environment) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index e5f4f12e7f..e0385e7d2b 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -247,6 +247,81 @@ //Scale quadratically so that single digit numbers of fire stacks don't burn ridiculously hot. return round(FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE*(fire_stacks/FIRE_MAX_FIRESUIT_STACKS)**2) +/mob/living/regular_hud_updates() + ..() + update_action_buttons() + +/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) + if(I.action_button_name) + if(!I.action) + if(I.action_button_is_hands_free) + I.action = new/datum/action/item_action/hands_free + else + I.action = new/datum/action/item_action + I.action.name = I.action_button_name + I.action.target = I + I.action.Grant(src) + return + +/mob/living/update_action_buttons() + if(!hud_used) return + if(!client) return + + if(hud_used.hud_shown != 1) //Hud toggled to minimal + 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 + + //If simple_animals are ever moved under carbon, then this can probably be moved to carbon as well /mob/living/proc/attack_throat(obj/item/W, obj/item/weapon/grab/G, mob/user) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 8a01f86774..284afa69a4 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -34,6 +34,7 @@ var/mob_always_swap = 0 var/mob/living/cameraFollow = null + var/list/datum/action/actions = list() var/tod = null // Time of death var/update_slimes = 1 diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 615f1d3a41..5ed6df43cf 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -10,6 +10,7 @@ //Status updates, death etc. clamp_values() handle_regular_status_updates() + handle_actions() if(client) handle_regular_hud_updates() diff --git a/icons/mob/actions.dmi b/icons/mob/actions.dmi new file mode 100644 index 0000000000000000000000000000000000000000..400db51debe52607c862d9316828fb1ad5a15ca2 GIT binary patch literal 30912 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 G4*q|yo$~7d literal 0 HcmV?d00001 From 4a7b728fa25d6600fdc404c2e20a1d0e5d005a3c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 2 Jun 2015 17:20:10 +0930 Subject: [PATCH 2/3] Used some defines. No idea if this is what they are for but they have the same values #yolo --- code/_onclick/hud/action.dm | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/code/_onclick/hud/action.dm b/code/_onclick/hud/action.dm index 1a2206d82a..9781e9c236 100644 --- a/code/_onclick/hud/action.dm +++ b/code/_onclick/hud/action.dm @@ -192,16 +192,16 @@ 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_col_offset = AB_WEST_OFFSET+2*col var/coord_row = "[-1 - row]" - var/coord_row_offset = 26 + var/coord_row_offset = AB_NORTH_OFFSET 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/x_offset = 32*(col-1) + AB_WEST_OFFSET + 2*col + var/y_offset = -32*(row+1) + AB_NORTH_OFFSET var/matrix/M = matrix() M.Translate(x_offset,y_offset) @@ -216,3 +216,7 @@ /datum/action/item_action/hands_free check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE + +#undef AB_WEST_OFFSET +#undef AB_NORTH_OFFSET +#undef AB_MAX_COLUMNS \ No newline at end of file From 717b191fe2fe5c6d0c5cf8aa307f8a148e318db6 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 2 Jun 2015 18:30:13 +0930 Subject: [PATCH 3/3] Minor refactor to reduce calls to handle_actions(). --- code/modules/mob/living/carbon/alien/life.dm | 1 - code/modules/mob/living/carbon/brain/life.dm | 1 - code/modules/mob/living/carbon/human/life.dm | 1 - code/modules/mob/living/carbon/metroid/life.dm | 1 - code/modules/mob/living/living.dm | 9 +++++++-- 5 files changed, 7 insertions(+), 6 deletions(-) diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index de6541128e..13bc1a4686 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -27,7 +27,6 @@ //Status updates, death etc. handle_regular_status_updates() - handle_actions() update_canmove() update_icons() diff --git a/code/modules/mob/living/carbon/brain/life.dm b/code/modules/mob/living/carbon/brain/life.dm index 7f25d287bd..189dfd81e7 100644 --- a/code/modules/mob/living/carbon/brain/life.dm +++ b/code/modules/mob/living/carbon/brain/life.dm @@ -27,7 +27,6 @@ //Status updates, death etc. handle_regular_status_updates() update_canmove() - handle_actions() if(client) handle_regular_hud_updates() diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index a93867ebd1..e1abecc16b 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -117,7 +117,6 @@ //Status updates, death etc. handle_regular_status_updates() //Optimized a bit - handle_actions() update_canmove() //Update our name based on whether our face is obscured/disfigured diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index 029b49faab..b41fdb758a 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -28,7 +28,6 @@ handle_environment(environment) // Handle temperature/pressure differences between body and environment handle_regular_status_updates() // Status updates, death etc. - handle_actions() /mob/living/carbon/slime/proc/handle_environment(datum/gas_mixture/environment) if(!environment) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3097d90659..b2ff53ba90 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1,3 +1,8 @@ +/mob/living/Life() + ..() + if(stat != DEAD) + handle_actions() + //mob verbs are faster than object verbs. See mob/verb/examine. /mob/living/verb/pulled(atom/movable/AM as mob|obj in oview(1)) set name = "Pull" @@ -609,7 +614,7 @@ default behaviour is: /mob/living/proc/escape_inventory(obj/item/weapon/holder/H) if(H != src.loc) return - + var/mob/M = H.loc //Get our mob holder (if any). if(istype(M)) @@ -794,5 +799,5 @@ default behaviour is: inertia_dir = 2 src << "