From 7eaef36e11dfdbbaccf303f7e307fdb2daec6131 Mon Sep 17 00:00:00 2001 From: SandPoot Date: Wed, 3 Jan 2024 22:42:03 -0300 Subject: [PATCH] d k daunkey kaung --- code/__DEFINES/_click.dm | 2 + code/__DEFINES/dcs/signals.dm | 12 - code/__DEFINES/dcs/signals/signals_action.dm | 6 + .../signals_atom/signals_atom_mouse.dm | 25 + code/__DEFINES/hud.dm | 231 +++++++- code/__DEFINES/maths.dm | 2 + code/__DEFINES/misc.dm | 4 - code/__HELPERS/screen_objs.dm | 91 ++++ code/__HELPERS/view.dm | 18 +- code/_onclick/drag_drop.dm | 36 +- code/_onclick/hud/_defines.dm | 195 ------- code/_onclick/hud/action_button.dm | 509 ++++++++++++------ code/_onclick/hud/hud.dm | 341 +++++++++++- code/_onclick/hud/movable_screen_objects.dm | 41 +- code/_onclick/hud/screentip.dm | 2 +- code/controllers/subsystem/augury.dm | 6 +- code/datums/action.dm | 307 +++++++---- code/datums/brain_damage/imaginary_friend.dm | 2 +- code/datums/mind.dm | 2 +- code/datums/view.dm | 54 +- code/game/objects/items.dm | 2 +- code/game/objects/items/defib.dm | 2 +- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/granters.dm | 8 +- .../objects/items/robot/robot_upgrades.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 2 +- code/game/objects/structures/manned_turret.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 2 +- .../bloodsucker/bloodsucker_life.dm | 4 +- .../bloodsucker/bloodsucker_powers.dm | 116 ++-- .../bloodsucker/bloodsucker_sunlight.dm | 8 +- .../antagonists/bloodsucker/bloodsucker_ui.dm | 2 +- .../bloodsucker/datum_bloodsucker.dm | 18 +- .../antagonists/bloodsucker/datum_hunter.dm | 10 +- .../antagonists/bloodsucker/datum_vassal.dm | 2 +- .../antagonists/bloodsucker/powers/brawn.dm | 18 +- .../antagonists/bloodsucker/powers/cloak.dm | 12 +- .../antagonists/bloodsucker/powers/feed.dm | 20 +- .../bloodsucker/powers/fortitude.dm | 10 +- .../antagonists/bloodsucker/powers/go_home.dm | 10 +- .../antagonists/bloodsucker/powers/haste.dm | 16 +- .../antagonists/bloodsucker/powers/lunge.dm | 16 +- .../bloodsucker/powers/masquerade.dm | 12 +- .../bloodsucker/powers/mesmerize.dm | 18 +- .../bloodsucker/powers/recuperate.dm | 10 +- .../bloodsucker/powers/trespass.dm | 14 +- .../antagonists/bloodsucker/powers/veil.dm | 16 +- .../changeling/cellular_emporium.dm | 1 - .../changeling/powers/fakedeath.dm | 4 +- .../clockcult/clock_items/clockwork_slab.dm | 2 +- code/modules/antagonists/cult/blood_magic.dm | 45 +- code/modules/antagonists/cult/cult_items.dm | 3 +- .../revenant/revenant_abilities.dm | 2 +- .../traitor/equipment/Malf_Modules.dm | 28 +- code/modules/client/client_defines.dm | 15 +- code/modules/client/client_procs.dm | 17 +- code/modules/client/preferences.dm | 5 - code/modules/client/preferences_savefile.dm | 3 - code/modules/clothing/chameleon.dm | 14 +- code/modules/clothing/clothing.dm | 2 +- .../clothing/glasses/engine_goggles.dm | 2 +- code/modules/clothing/head/helmet.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 6 +- code/modules/clothing/masks/miscellaneous.dm | 4 +- code/modules/clothing/shoes/magboots.dm | 2 +- .../modules/clothing/spacesuits/chronosuit.dm | 4 +- code/modules/clothing/spacesuits/hardsuit.dm | 4 +- code/modules/clothing/suits/toggles.dm | 2 +- code/modules/keybindings/keybind/mob.dm | 2 +- .../carbon/alien/humanoid/alien_powers.dm | 4 +- .../carbon/human/innate_abilities/blobform.dm | 6 +- .../carbon/human/species_types/golems.dm | 6 +- .../carbon/human/species_types/jellypeople.dm | 10 +- code/modules/mob/living/living.dm | 2 +- .../modules/mob/living/living_active_parry.dm | 2 +- .../mob/living/simple_animal/constructs.dm | 21 +- .../simple_animal/hostile/bosses/boss.dm | 2 +- .../simple_animal/hostile/giant_spider.dm | 6 +- .../hostile/mining_mobs/elites/elite.dm | 37 +- code/modules/power/singularity/emitter.dm | 4 +- code/modules/projectiles/gun.dm | 6 +- .../projectiles/guns/misc/beam_rifle.dm | 8 +- code/modules/projectiles/projectile.dm | 8 +- code/modules/spells/spell.dm | 12 +- code/modules/spells/spell_types/aimed.dm | 2 +- .../spells/spell_types/pointed/pointed.dm | 2 +- code/modules/spells/spell_types/taeclowndo.dm | 2 +- .../spells/spell_types/touch_attacks.dm | 2 +- code/modules/surgery/dental_implant.dm | 9 +- code/modules/tooltip/tooltip.dm | 4 +- code/modules/tooltip/tooltip.html | 30 +- code/modules/vehicles/mecha/combat/durand.dm | 2 +- code/modules/vehicles/mecha/mecha_actions.dm | 18 +- icons/effects/mouse_pointers/screen_drag.dmi | Bin 0 -> 326 bytes icons/hud/64x16_actions.dmi | Bin 0 -> 3404 bytes icons/mob/screen_ai.dmi | Bin 2543 -> 6401 bytes icons/mob/screen_alien.dmi | Bin 17751 -> 18617 bytes icons/mob/screen_clockwork.dmi | Bin 15985 -> 17293 bytes icons/mob/screen_cyborg.dmi | Bin 30735 -> 31567 bytes icons/mob/screen_gen.dmi | Bin 122121 -> 123214 bytes icons/mob/screen_midnight.dmi | Bin 25366 -> 26389 bytes icons/mob/screen_operative.dmi | Bin 28168 -> 29033 bytes icons/mob/screen_plasmafire.dmi | Bin 27392 -> 28383 bytes icons/mob/screen_retro.dmi | Bin 11978 -> 12699 bytes icons/mob/screen_slimecore.dmi | Bin 25917 -> 26982 bytes tgstation.dme | 5 +- 106 files changed, 1683 insertions(+), 936 deletions(-) create mode 100644 code/__DEFINES/_click.dm create mode 100644 code/__DEFINES/dcs/signals/signals_action.dm create mode 100644 code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm create mode 100644 code/__HELPERS/screen_objs.dm delete mode 100644 code/_onclick/hud/_defines.dm create mode 100644 icons/effects/mouse_pointers/screen_drag.dmi create mode 100644 icons/hud/64x16_actions.dmi diff --git a/code/__DEFINES/_click.dm b/code/__DEFINES/_click.dm new file mode 100644 index 0000000000..4118fb873d --- /dev/null +++ b/code/__DEFINES/_click.dm @@ -0,0 +1,2 @@ +//The button used for dragging (only sent for unrelated mouse up/down messages during a drag) +#define DRAG "drag" diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 4477c8aee8..6b9fc0d6ba 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -196,18 +196,6 @@ #define COMSIG_ENTER_AREA "enter_area" //from base of area/Entered(): (/area) #define COMSIG_EXIT_AREA "exit_area" //from base of area/Exited(): (/area) -#define COMSIG_CLICK "atom_click" //from base of atom/Click(): (location, control, params, mob/user) -#define COMSIG_CLICK_SHIFT "shift_click" //from base of atom/ShiftClick(): (/mob), return flags also used by other signals. - #define COMPONENT_ALLOW_EXAMINATE 1 - #define COMPONENT_DENY_EXAMINATE 2 //Higher priority compared to the above one - -#define COMSIG_CLICK_CTRL "ctrl_click" //from base of atom/CtrlClickOn(): (/mob) -#define COMSIG_CLICK_ALT "alt_click" //from base of atom/AltClick(): (/mob) -#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" //from base of atom/CtrlShiftClick(/mob) -#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" //from base of atom/MouseDrop(): (/atom/over, /mob/user) - #define COMPONENT_NO_MOUSEDROP 1 -#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) - // /area signals #define COMSIG_AREA_ENTERED "area_entered" //from base of area/Entered(): (atom/movable/M) #define COMSIG_AREA_EXITED "area_exited" //from base of area/Exited(): (atom/movable/M) diff --git a/code/__DEFINES/dcs/signals/signals_action.dm b/code/__DEFINES/dcs/signals/signals_action.dm new file mode 100644 index 0000000000..62eccf2823 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_action.dm @@ -0,0 +1,6 @@ +/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/activated) +#define COMSIG_MOB_ABILITY_STARTED "mob_ability_base_started" + /// Return to block the ability from starting / activating + #define COMPONENT_BLOCK_ABILITY_START (1<<0) +/// From base of /datum/action/cooldown/proc/PreActivate(), sent to the action owner: (datum/action/cooldown/finished) +#define COMSIG_MOB_ABILITY_FINISHED "mob_ability_base_finished" diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm new file mode 100644 index 0000000000..2b0c9c297e --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_mouse.dm @@ -0,0 +1,25 @@ +// mouse signals. Format: +// When the signal is called: (signal arguments) +// All signals send the source datum of the signal as the first argument + +///from base of client/Click(): (atom/target, atom/location, control, params, mob/user) +#define COMSIG_CLIENT_CLICK "atom_client_click" +///from base of atom/Click(): (atom/location, control, params, mob/user) +#define COMSIG_CLICK "atom_click" +///from base of atom/ShiftClick(): (/mob) +#define COMSIG_CLICK_SHIFT "shift_click" + /// Allows the user to examinate regardless of client.eye. + #define COMPONENT_ALLOW_EXAMINATE (1<<0) + /// Higher priority compared to the above one + #define COMPONENT_DENY_EXAMINATE (1<<1) +///from base of atom/CtrlClickOn(): (/mob) +#define COMSIG_CLICK_CTRL "ctrl_click" +///from base of atom/AltClick(): (/mob) +#define COMSIG_CLICK_ALT "alt_click" +///from base of atom/CtrlShiftClick(/mob) +#define COMSIG_CLICK_CTRL_SHIFT "ctrl_shift_click" +///from base of atom/MouseDrop(): (/atom/over, /mob/user) +#define COMSIG_MOUSEDROP_ONTO "mousedrop_onto" + #define COMPONENT_NO_MOUSEDROP (1<<0) +///from base of atom/MouseDrop_T: (/atom/from, /mob/user) +#define COMSIG_MOUSEDROPPED_ONTO "mousedropped_onto" //from base of atom/MouseDrop_T: (/atom/from, /mob/user) diff --git a/code/__DEFINES/hud.dm b/code/__DEFINES/hud.dm index 88cba1c449..94755e3bd2 100644 --- a/code/__DEFINES/hud.dm +++ b/code/__DEFINES/hud.dm @@ -1,9 +1,232 @@ //HUD styles. Index order defines how they are cycled in F12. -#define HUD_STYLE_STANDARD 1 //Standard hud -#define HUD_STYLE_REDUCED 2 //Reduced hud (just hands and intent switcher) -#define HUD_STYLE_NOHUD 3 //No hud (for screenshots) +/// Standard hud +#define HUD_STYLE_STANDARD 1 +/// Reduced hud (just hands and intent switcher) +#define HUD_STYLE_REDUCED 2 +/// No hud (for screenshots) +#define HUD_STYLE_NOHUD 3 -#define HUD_VERSIONS 3 //Used in show_hud(); Please ensure this is the same as the maximum index. +/// Used in show_hud(); Please ensure this is the same as the maximum index. +#define HUD_VERSIONS 3 +// Consider these images/atoms as part of the UI/HUD (apart of the appearance_flags) +/// Used for progress bars and chat messages +#define APPEARANCE_UI_IGNORE_ALPHA (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE) +/// Used for HUD objects +#define APPEARANCE_UI (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|PIXEL_SCALE) + +/* + These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. + + The short version: + + Everything is encoded as strings because apparently that's how Byond rolls. + + "1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid. + "1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid. + Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy. + + In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective + screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your + UI to scale with screen size. + + The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15". + Therefore, the top right corner (except during admin shenanigans) is at "15,15" +*/ + +/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) + var/x_off = -(!(i % 2)) + var/y_off = round((i-1) / 2) + return"CENTER+[x_off]:16,SOUTH+[y_off]:5" + +/proc/ui_equip_position(mob/M) + var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5) + return "CENTER:-16,SOUTH+[y_off+1]:5" + +/proc/ui_swaphand_position(mob/M, which = 1) //values based on old swaphand ui positions (CENTER: +/-16,SOUTH+1:5) + var/x_off = which == 1 ? -1 : 0 + var/y_off = round((M.held_items.len-1) / 2) + return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5" + +//Lower left, persistent menu +#define ui_inventory "WEST:6,SOUTH:5" + +//Middle left indicators +#define ui_lingchemdisplay "WEST,CENTER-1:15" +#define ui_lingstingdisplay "WEST:6,CENTER-3:11" + +#define ui_devilsouldisplay "WEST:6,CENTER-1:15" + +//Lower center, persistent menu +#define ui_sstore1 "CENTER-5:10,SOUTH:5" +#define ui_id "CENTER-4:12,SOUTH:5" +#define ui_belt "CENTER-3:14,SOUTH:5" +#define ui_back "CENTER-2:14,SOUTH:5" +#define ui_storage1 "CENTER+1:18,SOUTH:5" +#define ui_storage2 "CENTER+2:20,SOUTH:5" +#define ui_combo "CENTER+4:24,SOUTH+1:7" // combo meter for martial arts + +//Lower right, persistent menu +#define ui_drop_throw "EAST-1:28,SOUTH+1:7" +#define ui_pull_resist "EAST-2:26,SOUTH+1:7" +#define ui_movi "EAST-2:26,SOUTH:5" +#define ui_sprintbufferloc "EAST-2:26,SOUTH:18" +#define ui_acti "EAST-3:24,SOUTH:5" +#define ui_zonesel "EAST-1:28,SOUTH:5" +#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) +#define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle +#define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto +#define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto +#define ui_voremode "EAST-5:20,SOUTH:5" + +//Upper-middle right (alerts) +#define ui_alert1 "EAST-1:28,CENTER+5:27" +#define ui_alert2 "EAST-1:28,CENTER+4:25" +#define ui_alert3 "EAST-1:28,CENTER+3:23" +#define ui_alert4 "EAST-1:28,CENTER+2:21" +#define ui_alert5 "EAST-1:28,CENTER+1:19" + +//Upper left (action buttons) +#define ui_action_palette "WEST+0:23,NORTH-1:5" +#define ui_action_palette_offset(north_offset) ("WEST+0:23,NORTH-[1+north_offset]:5") + +#define ui_palette_scroll "WEST+1:8,NORTH-6:28" +#define ui_palette_scroll_offset(north_offset) ("WEST+1:8,NORTH-[6+north_offset]:28") + +//Middle right (status indicators) +#define ui_healthdoll "EAST-1:28,CENTER-2:13" +#define ui_health "EAST-1:28,CENTER-1:15" +#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter +#define ui_mood "EAST-1:28,CENTER-3:10" +// #define ui_spacesuit "EAST-1:28,CENTER-4:10" + +//Pop-up inventory +#define ui_shoes "WEST+1:8,SOUTH:5" +#define ui_iclothing "WEST:6,SOUTH+1:7" +#define ui_oclothing "WEST+1:8,SOUTH+1:7" +#define ui_gloves "WEST+2:10,SOUTH+1:7" +#define ui_glasses "WEST:6,SOUTH+3:11" +#define ui_mask "WEST+1:8,SOUTH+2:9" +#define ui_ears "WEST+2:10,SOUTH+2:9" +#define ui_neck "WEST:6,SOUTH+2:9" +#define ui_head "WEST+1:8,SOUTH+3:11" + +//Generic living +#define ui_living_pull "EAST-1:28,CENTER-2:15" +#define ui_living_health "EAST-1:28,CENTER:15" +#define ui_living_healthdoll "EAST-1:28,CENTER-1:15" + +//Monkeys +#define ui_monkey_head "CENTER-5:13,SOUTH:5" +#define ui_monkey_mask "CENTER-4:14,SOUTH:5" +#define ui_monkey_neck "CENTER-3:15,SOUTH:5" +#define ui_monkey_back "CENTER-2:16,SOUTH:5" + +//Drones +#define ui_drone_drop "CENTER+1:18,SOUTH:5" +#define ui_drone_pull "CENTER+2:2,SOUTH:5" +#define ui_drone_storage "CENTER-2:14,SOUTH:5" +#define ui_drone_head "CENTER-3:14,SOUTH:5" + +//Cyborgs +#define ui_borg_health "EAST-1:28,CENTER-1:15" +#define ui_borg_pull "EAST-2:26,SOUTH+1:7" +#define ui_borg_radio "EAST-1:28,SOUTH+1:7" +#define ui_borg_intents "EAST-2:26,SOUTH:5" +#define ui_borg_lamp "CENTER-3:16, SOUTH:5" +#define ui_borg_tablet "CENTER-4:16, SOUTH:5" +#define ui_inv1 "CENTER-2:16,SOUTH:5" +#define ui_inv2 "CENTER-1 :16,SOUTH:5" +#define ui_inv3 "CENTER :16,SOUTH:5" +#define ui_borg_module "CENTER+1:16,SOUTH:5" +#define ui_borg_store "CENTER+2:16,SOUTH:5" +#define ui_borg_camera "CENTER+3:21,SOUTH:5" +#define ui_borg_alerts "CENTER+4:21,SOUTH:5" +#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" #define ui_borg_pda_send "CENTER+5:21,SOUTH:5" // To the right of the alert panel #define ui_borg_pda_log "CENTER+6:21,SOUTH:5" +#define ui_borg_sensor "CENTER-6:16, SOUTH:5" //LEGACY +#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //LEGACY + +//Aliens +#define ui_alien_health "EAST,CENTER-1:15" +#define ui_alienplasmadisplay "EAST,CENTER-2:15" +#define ui_alien_queen_finder "EAST,CENTER-3:15" +#define ui_alien_storage_r "CENTER+1:18,SOUTH:5" +#define ui_alien_language_menu "EAST-3:26,SOUTH:5" + +//Constructs +#define ui_construct_pull "EAST,CENTER-2:15" +#define ui_construct_health "EAST,CENTER:15" + +//AI +#define ui_ai_core "BOTTOM:6,RIGHT-4" +#define ui_ai_shuttle "BOTTOM:6,RIGHT-3" +#define ui_ai_announcement "BOTTOM:6,RIGHT-2" +#define ui_ai_state_laws "BOTTOM:6,RIGHT-1" +#define ui_ai_pda_log "BOTTOM:6,RIGHT" +#define ui_ai_pda_send "BOTTOM+1:6,RIGHT" +#define ui_ai_language_menu "BOTTOM+1:8,RIGHT-2:30" + +#define ui_ai_crew_monitor "BOTTOM:6,CENTER-1" +#define ui_ai_crew_manifest "BOTTOM:6,CENTER" +#define ui_ai_alerts "BOTTOM:6,CENTER+1" + +#define ui_ai_view_images "BOTTOM:6,LEFT+4" +#define ui_ai_camera_list "BOTTOM:6,LEFT+3" +#define ui_ai_track_with_camera "BOTTOM:6,LEFT+2" +#define ui_ai_camera_light "BOTTOM:6,LEFT+1" +#define ui_ai_sensor "BOTTOM:6,LEFT" +#define ui_ai_multicam "BOTTOM+1:6,LEFT+1" +#define ui_ai_add_multicam "BOTTOM+1:6,LEFT" +#define ui_ai_take_picture "BOTTOM+2:6,LEFT" + + +// pAI +// #define ui_pai_software "SOUTH:6,WEST" +// #define ui_pai_shell "SOUTH:6,WEST+1" +// #define ui_pai_chassis "SOUTH:6,WEST+2" +// #define ui_pai_rest "SOUTH:6,WEST+3" +// #define ui_pai_light "SOUTH:6,WEST+4" +// #define ui_pai_newscaster "SOUTH:6,WEST+5" +// #define ui_pai_host_monitor "SOUTH:6,WEST+6" +// #define ui_pai_crew_manifest "SOUTH:6,WEST+7" +// #define ui_pai_state_laws "SOUTH:6,WEST+8" +// #define ui_pai_pda_send "SOUTH:6,WEST+9" +// #define ui_pai_pda_log "SOUTH:6,WEST+10" +// #define ui_pai_take_picture "SOUTH:6,WEST+12" +// #define ui_pai_view_images "SOUTH:6,WEST+13" + +//Ghosts +#define ui_ghost_jumptomob "SOUTH:6,CENTER-3:24" +#define ui_ghost_orbit "SOUTH:6,CENTER-2:24" +#define ui_ghost_reenter_corpse "SOUTH:6,CENTER-1:24" +#define ui_ghost_teleport "SOUTH:6,CENTER:24" +#define ui_ghost_pai "SOUTH: 6, CENTER+1:24" +#define ui_ghost_mafia "SOUTH: 6, CENTER+2:24" +#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI + +//UI position overrides for 1:1 screen layout. (default is 7:5) +#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button +#define ui_overridden_resist "EAST-3:24,SOUTH+1:7" +#define ui_clickdelay "CENTER,SOUTH+1:-31" +#define ui_resistdelay "EAST-3:24,SOUTH+1:4" +#define ui_combat_toggle "EAST-4:22,SOUTH:5" + +#define ui_boxcraft "EAST-4:22,SOUTH+1:6" +#define ui_boxarea "EAST-4:6,SOUTH+1:6" +#define ui_boxlang "EAST-5:22,SOUTH+1:6" +#define ui_boxvore "EAST-5:22,SOUTH+1:6" + +#define ui_wanted_lvl "NORTH,11" + +// Defines relating to action button positions + +/// Whatever the base action datum thinks is best +#define SCRN_OBJ_DEFAULT "default" +/// Floating somewhere on the hud, not in any predefined place +#define SCRN_OBJ_FLOATING "floating" +/// In the list of buttons stored at the top of the screen +#define SCRN_OBJ_IN_LIST "list" +/// In the collapseable palette +#define SCRN_OBJ_IN_PALETTE "palette" diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 60d02c1e49..01a295634f 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -30,6 +30,8 @@ #define CEILING(x, y) ( -round(-(x) / (y)) * (y) ) +#define ROUND_UP(x) ( -round(-(x))) + // round() acts like floor(x, 1) by default but can't handle other values #define FLOOR(x, y) ( round((x) / (y)) * (y) ) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 4165b1cec3..da01956e64 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -304,10 +304,6 @@ GLOBAL_LIST_INIT(pda_reskins, list( */ -// Consider these images/atoms as part of the UI/HUD -#define APPEARANCE_UI_IGNORE_ALPHA (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|RESET_ALPHA|PIXEL_SCALE) -#define APPEARANCE_UI (RESET_COLOR|RESET_TRANSFORM|NO_CLIENT_COLOR|PIXEL_SCALE) - //Just space #define SPACE_ICON_STATE "[((x + y) ^ ~(x * y) + z) % 25]" diff --git a/code/__HELPERS/screen_objs.dm b/code/__HELPERS/screen_objs.dm new file mode 100644 index 0000000000..aa86b6d579 --- /dev/null +++ b/code/__HELPERS/screen_objs.dm @@ -0,0 +1,91 @@ +/// Takes a screen loc string in the format +/// "+-left-offset:+-pixel,+-bottom-offset:+-pixel" +/// Where the :pixel is optional, and returns +/// A list in the format (x_offset, y_offset) +/// We require context to get info out of screen locs that contain relative info, so NORTH, SOUTH, etc +/proc/screen_loc_to_offset(screen_loc, view) + if(!screen_loc) + return list(64, 64) + var/list/view_size = view_to_pixels(view) + var/x = 0 + var/y = 0 + // Time to parse for directional relative offsets + if(findtext(screen_loc, "EAST")) // If you're starting from the east, we start from the east too + x += view_size[1] + if(findtext(screen_loc, "WEST")) // HHHHHHHHHHHHHHHHHHHHHH WEST is technically a 1 tile offset from the start. Shoot me please + x += world.icon_size + if(findtext(screen_loc, "NORTH")) + y += view_size[2] + if(findtext(screen_loc, "SOUTH")) + y += world.icon_size + // Cut out everything we just parsed + screen_loc = cut_relative_direction(screen_loc) + + var/list/x_and_y = splittext(screen_loc, ",") + var/list/x_pack = splittext(x_and_y[1], ":") + var/list/y_pack = splittext(x_and_y[2], ":") + x += text2num(x_pack[1]) * world.icon_size + y += text2num(y_pack[1]) * world.icon_size + + if(length(x_pack) > 1) + x += text2num(x_pack[2]) + if(length(y_pack) > 1) + y += text2num(y_pack[2]) + return list(x, y) + +/// Takes a list in the form (x_offset, y_offset) +/// And converts it to a screen loc string +/// Accepts an optional view string/size to force the screen_loc around, so it can't go out of scope +/proc/offset_to_screen_loc(x_offset, y_offset, view = null) + if(view) + var/list/view_bounds = view_to_pixels(view) + x_offset = clamp(x_offset, world.icon_size, view_bounds[1]) + y_offset = clamp(y_offset, world.icon_size, view_bounds[2]) + + // Round with no argument is floor, so we get the non pixel offset here + var/x = round(x_offset / world.icon_size) + var/pixel_x = x_offset % world.icon_size + var/y = round(y_offset / world.icon_size) + var/pixel_y = y_offset % world.icon_size + + var/list/generated_loc = list() + generated_loc += "[x]" + if(pixel_x) + generated_loc += ":[pixel_x]" + generated_loc += ",[y]" + if(pixel_y) + generated_loc += ":[pixel_y]" + return jointext(generated_loc, "") + +/** + * Returns a valid location to place a screen object without overflowing the viewport + * + * * target: The target location as a purely number based screen_loc string "+-left-offset:+-pixel,+-bottom-offset:+-pixel" + * * target_offset: The amount we want to offset the target location by. We explictly don't care about direction here, we will try all 4 + * * view: The view variable of the client we're doing this for. We use this to get the size of the screen + * + * Returns a screen loc representing the valid location +**/ +/proc/get_valid_screen_location(target_loc, target_offset, view) + var/list/offsets = screen_loc_to_offset(target_loc) + var/base_x = offsets[1] + var/base_y = offsets[2] + + var/list/view_size = view_to_pixels(view) + + // Bias to the right, down, left, and then finally up + if(base_x + target_offset < view_size[1]) + return offset_to_screen_loc(base_x + target_offset, base_y, view) + if(base_y - target_offset > world.icon_size) + return offset_to_screen_loc(base_x, base_y - target_offset, view) + if(base_x - target_offset > world.icon_size) + return offset_to_screen_loc(base_x - target_offset, base_y, view) + if(base_y + target_offset < view_size[2]) + return offset_to_screen_loc(base_x, base_y + target_offset, view) + stack_trace("You passed in a scren location {[target_loc]} and offset {[target_offset]} that can't be fit in the viewport Width {[view_size[1]]}, Height {[view_size[2]]}. what did you do lad") + return null // The fuck did you do lad + +/// Takes a screen_loc string and cut out any directions like NORTH or SOUTH +/proc/cut_relative_direction(fragment) + var/static/regex/regex = regex(@"([A-Z])\w+", "g") + return regex.Replace(fragment, "") diff --git a/code/__HELPERS/view.dm b/code/__HELPERS/view.dm index 1c92971802..6a4210bc53 100644 --- a/code/__HELPERS/view.dm +++ b/code/__HELPERS/view.dm @@ -1,15 +1,19 @@ /proc/getviewsize(view) - var/viewX - var/viewY if(isnum(view)) var/totalviewrange = (view < 0 ? -1 : 1) + 2 * view - viewX = totalviewrange - viewY = totalviewrange + return list(totalviewrange, totalviewrange) else var/list/viewrangelist = splittext(view,"x") - viewX = text2num(viewrangelist[1]) - viewY = text2num(viewrangelist[2]) - return list(viewX, viewY) + return list(text2num(viewrangelist[1]), text2num(viewrangelist[2])) + +/// Takes a string or num view, and converts it to pixel width/height in a list(pixel_width, pixel_height) +/proc/view_to_pixels(view) + if(!view) + return list(0, 0) + var/list/view_info = getviewsize(view) + view_info[1] *= world.icon_size + view_info[2] *= world.icon_size + return view_info /proc/in_view_range(mob/user, atom/A) var/list/view_range = getviewsize(user.client.view) diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index a698706f1a..fffbbc059f 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -91,31 +91,31 @@ /atom/movable/screen/click_catcher/IsAutoclickable() . = 1 -//Please don't roast me too hard -/client/MouseMove(object,location,control,params) - mouseParams = params - mouseLocation = location - mouseObject = object - mouseControlObject = control - if(mob) - SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOUSEMOVE, object, location, control, params) - // god forgive me for i have sinned - used for autoparry. currently at 5 objects. - moused_over_objects[object] = world.time - if(moused_over_objects.len > 7) - moused_over_objects.Cut(1, 2) - ..() - /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) + var/list/modifiers = params2list(params) + if (LAZYACCESS(modifiers, MIDDLE_CLICK)) + if (src_object && src_location != over_location) + middragtime = world.time + middle_drag_atom_ref = WEAKREF(src_object) + else + middragtime = 0 + middle_drag_atom_ref = null mouseParams = params - mouseLocation = over_location - mouseObject = over_object - mouseControlObject = over_control - if(selected_target[1] && over_object && over_object.IsAutoclickable()) + mouse_location_ref = WEAKREF(over_location) + mouse_object_ref = WEAKREF(over_object) + if(selected_target[1] && over_object?.IsAutoclickable()) selected_target[1] = over_object selected_target[2] = params if(active_mousedown_item) active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob) SEND_SIGNAL(src, COMSIG_CLIENT_MOUSEDRAG, src_object, over_object, src_location, over_location, src_control, over_control, params) + return ..() /obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) return + +/client/MouseDrop(atom/src_object, atom/over_object, atom/src_location, atom/over_location, src_control, over_control, params) + if (IS_WEAKREF_OF(src_object, middle_drag_atom_ref)) + middragtime = 0 + middle_drag_atom_ref = null + ..() diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm deleted file mode 100644 index 233ae17a4d..0000000000 --- a/code/_onclick/hud/_defines.dm +++ /dev/null @@ -1,195 +0,0 @@ -/* - These defines specificy screen locations. For more information, see the byond documentation on the screen_loc var. - - The short version: - - Everything is encoded as strings because apparently that's how Byond rolls. - - "1,1" is the bottom left square of the user's screen. This aligns perfectly with the turf grid. - "1:2,3:4" is the square (1,3) with pixel offsets (+2, +4); slightly right and slightly above the turf grid. - Pixel offsets are used so you don't perfectly hide the turf under them, that would be crappy. - - In addition, the keywords NORTH, SOUTH, EAST, WEST and CENTER can be used to represent their respective - screen borders. NORTH-1, for example, is the row just below the upper edge. Useful if you want your - UI to scale with screen size. - - The size of the user's screen is defined by client.view (indirectly by world.view), in our case "15x15". - Therefore, the top right corner (except during admin shenanigans) is at "15,15" -*/ - -/proc/ui_hand_position(i) //values based on old hand ui positions (CENTER:-/+16,SOUTH:5) - var/x_off = -(!(i % 2)) - var/y_off = round((i-1) / 2) - return"CENTER+[x_off]:16,SOUTH+[y_off]:5" - -/proc/ui_equip_position(mob/M) - var/y_off = round((M.held_items.len-1) / 2) //values based on old equip ui position (CENTER: +/-16,SOUTH+1:5) - return "CENTER:-16,SOUTH+[y_off+1]:5" - -/proc/ui_swaphand_position(mob/M, which = 1) //values based on old swaphand ui positions (CENTER: +/-16,SOUTH+1:5) - var/x_off = which == 1 ? -1 : 0 - var/y_off = round((M.held_items.len-1) / 2) - return "CENTER+[x_off]:16,SOUTH+[y_off+1]:5" - -//Lower left, persistent menu -#define ui_inventory "WEST:6,SOUTH:5" - -//Middle left indicators -#define ui_lingchemdisplay "WEST,CENTER-1:15" -#define ui_lingstingdisplay "WEST:6,CENTER-3:11" - -#define ui_devilsouldisplay "WEST:6,CENTER-1:15" - -//Lower center, persistent menu -#define ui_sstore1 "CENTER-5:10,SOUTH:5" -#define ui_id "CENTER-4:12,SOUTH:5" -#define ui_belt "CENTER-3:14,SOUTH:5" -#define ui_back "CENTER-2:14,SOUTH:5" -#define ui_storage1 "CENTER+1:18,SOUTH:5" -#define ui_storage2 "CENTER+2:20,SOUTH:5" -#define ui_combo "CENTER+4:24,SOUTH+1:7" // combo meter for martial arts - -//Lower right, persistent menu -#define ui_drop_throw "EAST-1:28,SOUTH+1:7" -#define ui_pull_resist "EAST-2:26,SOUTH+1:7" -#define ui_movi "EAST-2:26,SOUTH:5" -#define ui_sprintbufferloc "EAST-2:26,SOUTH:18" -#define ui_acti "EAST-3:24,SOUTH:5" -#define ui_zonesel "EAST-1:28,SOUTH:5" -#define ui_acti_alt "EAST-1:28,SOUTH:5" //alternative intent switcher for when the interface is hidden (F12) -#define ui_crafting "EAST-5:20,SOUTH:5"//CIT CHANGE - moves this over one tile to accommodate for combat mode toggle -#define ui_building "EAST-5:20,SOUTH:21"//CIT CHANGE - ditto -#define ui_language_menu "EAST-5:4,SOUTH:21"//CIT CHANGE - ditto -#define ui_voremode "EAST-5:20,SOUTH:5" - -//Upper-middle right (alerts) -#define ui_alert1 "EAST-1:28,CENTER+5:27" -#define ui_alert2 "EAST-1:28,CENTER+4:25" -#define ui_alert3 "EAST-1:28,CENTER+3:23" -#define ui_alert4 "EAST-1:28,CENTER+2:21" -#define ui_alert5 "EAST-1:28,CENTER+1:19" - -//Middle right (status indicators) -#define ui_healthdoll "EAST-1:28,CENTER-2:13" -#define ui_health "EAST-1:28,CENTER-1:15" -#define ui_internal "EAST-1:28,CENTER+1:19"//CIT CHANGE - moves internal icon up a little bit to accommodate for the stamina meter -#define ui_mood "EAST-1:28,CENTER-3:10" -// #define ui_spacesuit "EAST-1:28,CENTER-4:10" - -//Pop-up inventory -#define ui_shoes "WEST+1:8,SOUTH:5" -#define ui_iclothing "WEST:6,SOUTH+1:7" -#define ui_oclothing "WEST+1:8,SOUTH+1:7" -#define ui_gloves "WEST+2:10,SOUTH+1:7" -#define ui_glasses "WEST:6,SOUTH+3:11" -#define ui_mask "WEST+1:8,SOUTH+2:9" -#define ui_ears "WEST+2:10,SOUTH+2:9" -#define ui_neck "WEST:6,SOUTH+2:9" -#define ui_head "WEST+1:8,SOUTH+3:11" - -//Generic living -#define ui_living_pull "EAST-1:28,CENTER-2:15" -#define ui_living_health "EAST-1:28,CENTER:15" -#define ui_living_healthdoll "EAST-1:28,CENTER-1:15" - -//Monkeys -#define ui_monkey_head "CENTER-5:13,SOUTH:5" -#define ui_monkey_mask "CENTER-4:14,SOUTH:5" -#define ui_monkey_neck "CENTER-3:15,SOUTH:5" -#define ui_monkey_back "CENTER-2:16,SOUTH:5" - -//Drones -#define ui_drone_drop "CENTER+1:18,SOUTH:5" -#define ui_drone_pull "CENTER+2:2,SOUTH:5" -#define ui_drone_storage "CENTER-2:14,SOUTH:5" -#define ui_drone_head "CENTER-3:14,SOUTH:5" - -//Cyborgs -#define ui_borg_health "EAST-1:28,CENTER-1:15" -#define ui_borg_pull "EAST-2:26,SOUTH+1:7" -#define ui_borg_radio "EAST-1:28,SOUTH+1:7" -#define ui_borg_intents "EAST-2:26,SOUTH:5" -#define ui_borg_lamp "CENTER-3:16, SOUTH:5" -#define ui_borg_tablet "CENTER-4:16, SOUTH:5" -#define ui_inv1 "CENTER-2:16,SOUTH:5" -#define ui_inv2 "CENTER-1 :16,SOUTH:5" -#define ui_inv3 "CENTER :16,SOUTH:5" -#define ui_borg_module "CENTER+1:16,SOUTH:5" -#define ui_borg_store "CENTER+2:16,SOUTH:5" -#define ui_borg_camera "CENTER+3:21,SOUTH:5" -#define ui_borg_alerts "CENTER+4:21,SOUTH:5" -#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" -#define ui_borg_sensor "CENTER-6:16, SOUTH:5" //LEGACY -#define ui_borg_thrusters "CENTER-5:16, SOUTH:5" //LEGACY - -//Aliens -#define ui_alien_health "EAST,CENTER-1:15" -#define ui_alienplasmadisplay "EAST,CENTER-2:15" -#define ui_alien_queen_finder "EAST,CENTER-3:15" -#define ui_alien_storage_r "CENTER+1:18,SOUTH:5" -#define ui_alien_language_menu "EAST-3:26,SOUTH:5" - -//Constructs -#define ui_construct_pull "EAST,CENTER-2:15" -#define ui_construct_health "EAST,CENTER:15" - -//AI -#define ui_ai_core "BOTTOM:6,RIGHT-4" -#define ui_ai_shuttle "BOTTOM:6,RIGHT-3" -#define ui_ai_announcement "BOTTOM:6,RIGHT-2" -#define ui_ai_state_laws "BOTTOM:6,RIGHT-1" -#define ui_ai_pda_log "BOTTOM:6,RIGHT" -#define ui_ai_pda_send "BOTTOM+1:6,RIGHT" -#define ui_ai_language_menu "BOTTOM+1:8,RIGHT-2:30" - -#define ui_ai_crew_monitor "BOTTOM:6,CENTER-1" -#define ui_ai_crew_manifest "BOTTOM:6,CENTER" -#define ui_ai_alerts "BOTTOM:6,CENTER+1" - -#define ui_ai_view_images "BOTTOM:6,LEFT+4" -#define ui_ai_camera_list "BOTTOM:6,LEFT+3" -#define ui_ai_track_with_camera "BOTTOM:6,LEFT+2" -#define ui_ai_camera_light "BOTTOM:6,LEFT+1" -#define ui_ai_sensor "BOTTOM:6,LEFT" -#define ui_ai_multicam "BOTTOM+1:6,LEFT+1" -#define ui_ai_add_multicam "BOTTOM+1:6,LEFT" -#define ui_ai_take_picture "BOTTOM+2:6,LEFT" - - -// pAI -// #define ui_pai_software "SOUTH:6,WEST" -// #define ui_pai_shell "SOUTH:6,WEST+1" -// #define ui_pai_chassis "SOUTH:6,WEST+2" -// #define ui_pai_rest "SOUTH:6,WEST+3" -// #define ui_pai_light "SOUTH:6,WEST+4" -// #define ui_pai_newscaster "SOUTH:6,WEST+5" -// #define ui_pai_host_monitor "SOUTH:6,WEST+6" -// #define ui_pai_crew_manifest "SOUTH:6,WEST+7" -// #define ui_pai_state_laws "SOUTH:6,WEST+8" -// #define ui_pai_pda_send "SOUTH:6,WEST+9" -// #define ui_pai_pda_log "SOUTH:6,WEST+10" -// #define ui_pai_take_picture "SOUTH:6,WEST+12" -// #define ui_pai_view_images "SOUTH:6,WEST+13" - -//Ghosts -#define ui_ghost_jumptomob "SOUTH:6,CENTER-3:24" -#define ui_ghost_orbit "SOUTH:6,CENTER-2:24" -#define ui_ghost_reenter_corpse "SOUTH:6,CENTER-1:24" -#define ui_ghost_teleport "SOUTH:6,CENTER:24" -#define ui_ghost_pai "SOUTH: 6, CENTER+1:24" -#define ui_ghost_mafia "SOUTH: 6, CENTER+2:24" -#define ui_ghost_spawners "SOUTH: 6, CENTER+1:24" // LEGACY. SAME LOC AS PAI - -//UI position overrides for 1:1 screen layout. (default is 7:5) -#define ui_stamina "EAST-1:28,CENTER:17" // replacing internals button -#define ui_overridden_resist "EAST-3:24,SOUTH+1:7" -#define ui_clickdelay "CENTER,SOUTH+1:-31" -#define ui_resistdelay "EAST-3:24,SOUTH+1:4" -#define ui_combat_toggle "EAST-4:22,SOUTH:5" - -#define ui_boxcraft "EAST-4:22,SOUTH+1:6" -#define ui_boxarea "EAST-4:6,SOUTH+1:6" -#define ui_boxlang "EAST-5:22,SOUTH+1:6" -#define ui_boxvore "EAST-5:22,SOUTH+1:6" - -#define ui_wanted_lvl "NORTH,11" diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index d97e1f5d04..6b70d8cd45 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -2,186 +2,154 @@ /atom/movable/screen/movable/action_button var/datum/action/linked_action + var/datum/hud/our_hud var/actiontooltipstyle = "" screen_loc = null var/button_icon_state var/appearance_cache + /// Where we are currently placed on the hud. SCRN_OBJ_DEFAULT asks the linked action what it thinks + var/location = SCRN_OBJ_DEFAULT + /// A unique bitflag, combined with the name of our linked action this lets us persistently remember any user changes to our position var/id - var/ordered = TRUE //If the button gets placed into the default bar + /// A weakref of the last thing we hovered over + /// God I hate how dragging works + var/datum/weakref/last_hovored_ref + +/atom/movable/screen/movable/action_button/Destroy() + if(our_hud) + var/mob/viewer = our_hud.mymob + our_hud.hide_action(src) + viewer?.client?.screen -= src + linked_action.viewers -= our_hud + viewer.update_action_buttons() + our_hud = null + linked_action = null + return ..() /atom/movable/screen/movable/action_button/proc/can_use(mob/user) if (linked_action) - return linked_action.owner == user + if(linked_action.viewers[user.hud_used]) + return TRUE + return FALSE else if (isobserver(user)) var/mob/dead/observer/O = user return !O.observetarget else return TRUE -/atom/movable/screen/movable/action_button/MouseDrop(over_object) - if(!can_use(usr)) - return - if((istype(over_object, /atom/movable/screen/movable/action_button) && !istype(over_object, /atom/movable/screen/movable/action_button/hide_toggle))) - if(locked) - to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") - return - var/atom/movable/screen/movable/action_button/B = over_object - var/list/actions = usr.actions - actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action)) - moved = FALSE - ordered = TRUE - B.moved = FALSE - B.ordered = TRUE - usr.update_action_buttons() - else - return ..() - /atom/movable/screen/movable/action_button/Click(location,control,params) if (!can_use(usr)) return var/list/modifiers = params2list(params) if(modifiers["shift"]) - if(locked) - to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") - return TRUE - moved = 0 - usr.update_action_buttons() //redraw buttons that are no longer considered "moved" - return TRUE - if(modifiers["ctrl"]) - locked = !locked - to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") - if(id && usr.client) //try to (un)remember position - usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null + var/datum/hud/our_hud = usr.hud_used + our_hud.position_action(src, SCRN_OBJ_DEFAULT) return TRUE linked_action.Trigger() return TRUE -//Hide/Show Action Buttons ... Button -/atom/movable/screen/movable/action_button/hide_toggle - name = "Hide Buttons" - desc = "Shift-click any button to reset its position, and Control-click it to lock it in place. Alt-click this button to reset all buttons to their default positions." - icon = 'icons/mob/actions.dmi' - icon_state = "bg_default" - var/hidden = 0 - var/hide_icon = 'icons/mob/actions.dmi' - var/hide_state = "hide" - var/show_state = "show" - var/mutable_appearance/hide_appearance - var/mutable_appearance/show_appearance - -/atom/movable/screen/movable/action_button/hide_toggle/Initialize(mapload) +// Entered and Exited won't fire while you're dragging something, because you're still "holding" it +// Very much byond logic, but I want nice behavior, so we fake it with drag +/atom/movable/screen/movable/action_button/MouseDrag(atom/over_object, src_location, over_location, src_control, over_control, params) . = ..() - var/static/list/icon_cache = list() + if(!can_use(usr)) + return + if(IS_WEAKREF_OF(over_object, last_hovored_ref)) + return + var/atom/old_object + if(last_hovored_ref) + old_object = last_hovored_ref?.resolve() + else // If there's no current ref, we assume it was us. We also treat this as our "first go" location + old_object = src + var/datum/hud/our_hud = usr.hud_used + our_hud?.generate_landings(src) - var/cache_key = "[hide_icon][hide_state]" - hide_appearance = icon_cache[cache_key] - if(!hide_appearance) - hide_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, hide_state) + if(old_object) + old_object.MouseExited(over_location, over_control, params) - cache_key = "[hide_icon][show_state]" - show_appearance = icon_cache[cache_key] - if(!show_appearance) - show_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, show_state) + last_hovored_ref = WEAKREF(over_object) + over_object.MouseEntered(over_location, over_control, params) -/atom/movable/screen/movable/action_button/hide_toggle/Click(location,control,params) - if (!can_use(usr)) +/atom/movable/screen/movable/action_button/MouseEntered(location, control, params) + . = ..() + if(!QDELETED(src)) + openToolTip(usr, src, params, title = name, content = desc, theme = actiontooltipstyle) + +/atom/movable/screen/movable/action_button/MouseExited(location, control, params) + closeToolTip(usr) + return ..() + +/atom/movable/screen/movable/action_button/MouseDrop(over_object) + last_hovored_ref = null + if(!can_use(usr)) + return + var/datum/hud/our_hud = usr.hud_used + if(over_object == src) + our_hud.hide_landings() + return + if(istype(over_object, /atom/movable/screen/action_landing)) + var/atom/movable/screen/action_landing/reserve = over_object + reserve.hit_by(src) + our_hud.hide_landings() + save_position() return - var/list/modifiers = params2list(params) - if(modifiers["shift"]) - if(locked) - to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") - return TRUE - moved = FALSE - usr.update_action_buttons(TRUE) - return TRUE - if(modifiers["ctrl"]) - locked = !locked - to_chat(usr, "Action button \"[name]\" [locked ? "" : "un"]locked.") - if(id && usr.client) //try to (un)remember position - usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = locked ? moved : null - return TRUE - if(modifiers["alt"]) - for(var/V in usr.actions) - var/datum/action/A = V - var/atom/movable/screen/movable/action_button/B = A.button - B.moved = FALSE - if(B.id && usr.client) - usr.client.prefs.action_buttons_screen_locs["[B.name]_[B.id]"] = null - B.locked = usr.client.prefs.buttons_locked - locked = usr.client.prefs.buttons_locked - moved = FALSE - if(id && usr.client) - usr.client.prefs.action_buttons_screen_locs["[name]_[id]"] = null - usr.update_action_buttons(TRUE) - to_chat(usr, "Action button positions have been reset.") - return TRUE - 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" - update_icon() - usr.update_action_buttons() - -/atom/movable/screen/movable/action_button/hide_toggle/AltClick(mob/user) - for(var/V in user.actions) - var/datum/action/A = V - var/atom/movable/screen/movable/action_button/B = A.button - B.moved = FALSE - if(moved) - moved = FALSE - user.update_action_buttons(TRUE) - to_chat(user, "Action button positions have been reset.") - return TRUE - - -/atom/movable/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) - var/settings = owner_hud.get_action_buttons_icons() - icon = settings["bg_icon"] - icon_state = settings["bg_state"] - hide_icon = settings["toggle_icon"] - hide_state = settings["toggle_hide"] - show_state = settings["toggle_show"] - update_icon() - -/atom/movable/screen/movable/action_button/hide_toggle/update_overlays() + our_hud.hide_landings() + if(istype(over_object, /atom/movable/screen/button_palette) || istype(over_object, /atom/movable/screen/palette_scroll)) + our_hud.position_action(src, SCRN_OBJ_IN_PALETTE) + save_position() + return + if(istype(over_object, /atom/movable/screen/movable/action_button)) + var/atom/movable/screen/movable/action_button/button = over_object + our_hud.position_action_relative(src, button) + save_position() + return . = ..() - if(hidden) - . += show_appearance - else - . += hide_appearance + our_hud.position_action(src, screen_loc) + save_position() +/atom/movable/screen/movable/action_button/proc/save_position() + var/mob/user = our_hud.mymob + if(!user?.client) + return + var/position_info = "" + switch(location) + if(SCRN_OBJ_FLOATING) + position_info = screen_loc + if(SCRN_OBJ_IN_LIST) + position_info = SCRN_OBJ_IN_LIST + if(SCRN_OBJ_IN_PALETTE) + position_info = SCRN_OBJ_IN_PALETTE -/atom/movable/screen/movable/action_button/MouseEntered(location,control,params) - if(!QDELETED(src)) - openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle) + user.client.prefs.action_buttons_screen_locs["[name]_[id]"] = position_info +/atom/movable/screen/movable/action_button/proc/load_position() + var/mob/user = our_hud.mymob + if(!user) + return + var/position_info = user.client?.prefs?.action_buttons_screen_locs["[name]_[id]"] || SCRN_OBJ_DEFAULT + user.hud_used.position_action(src, position_info) -/atom/movable/screen/movable/action_button/MouseExited() - closeToolTip(usr) +/atom/movable/screen/movable/action_button/proc/dump_save() + var/mob/user = our_hud.mymob + if(!user?.client) + return + user.client.prefs.action_buttons_screen_locs -= "[name]_[id]" /datum/hud/proc/get_action_buttons_icons() . = list() .["bg_icon"] = ui_style .["bg_state"] = "template" - //TODO : Make these fit theme - .["toggle_icon"] = 'icons/mob/actions.dmi' - .["toggle_hide"] = "hide" - .["toggle_show"] = "show" - //see human and alien hud for specific implementations. /mob/proc/update_action_buttons_icon(status_only = FALSE) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon(status_only) + A.UpdateButtons(status_only) //This is the proc used to update all the action buttons. /mob/proc/update_action_buttons(reload_screen) @@ -191,56 +159,243 @@ if(hud_used.hud_shown != HUD_STYLE_STANDARD) return - var/button_number = 0 - var/list/cview = getviewsize(client.view) - var/supportedcolumns = cview[1]-2 + for(var/datum/action/action as anything in actions) + var/atom/movable/screen/movable/action_button/button = action.viewers[hud_used] + action.UpdateButtons() + if(reload_screen) + client.screen += button - 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) - A.UpdateButtonIcon() - var/atom/movable/screen/movable/action_button/B = A.button - if(B.ordered) - button_number++ - if(B.moved) - B.screen_loc = B.moved - else - B.screen_loc = hud_used.ButtonNumberToScreenCoords(button_number, supportedcolumns) - 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, supportedcolumns) - else - hud_used.hide_actions_toggle.screen_loc = hud_used.hide_actions_toggle.moved if(reload_screen) - client.screen += hud_used.hide_actions_toggle + hud_used.update_our_owner() + // This holds the logic for the palette buttons + hud_used.palette_actions.refresh_actions() -/datum/hud/proc/ButtonNumberToScreenCoords(number, supportedcolumns) // TODO : Make this zero-indexed for readabilty - var/row = round((number - 1)/supportedcolumns) - var/col = ((number - 1)%(supportedcolumns)) + 1 +/atom/movable/screen/button_palette + desc = "Drag buttons to move them
Shift-click any button to reset it
Alt-click this to reset all buttons" + icon = 'icons/hud/64x16_actions.dmi' + icon_state = "screen_gen_palette" + screen_loc = ui_action_palette + var/datum/hud/our_hud + var/expanded = FALSE + /// Id of any currently running timers that set our color matrix + var/color_timer_id - var/coord_col = "+[col-1]" - var/coord_col_offset = 2 + 2 * col +/atom/movable/screen/button_palette/Destroy() + if(our_hud) + our_hud.mymob?.client?.screen -= src + our_hud.toggle_palette = null + our_hud = null + return ..() - var/coord_row = "[row ? -row : "+0"]" +/atom/movable/screen/button_palette/Initialize(mapload) + . = ..() + update_appearance() - return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" +/atom/movable/screen/button_palette/proc/set_hud(datum/hud/our_hud) + src.our_hud = our_hud + refresh_owner() -/datum/hud/proc/SetButtonCoords(atom/movable/screen/button,number, supportedcolumns) - var/row = round((number-1)/supportedcolumns) - var/col = ((number - 1)%(supportedcolumns)) + 1 - var/x_offset = 32*(col-1) + 4 + 2*col - var/y_offset = -32*(row+1) + 26 +/atom/movable/screen/button_palette/update_name(updates) + . = ..() + if(expanded) + name = "Hide Buttons" + else + name = "Show Buttons" - var/matrix/M = matrix() - M.Translate(x_offset,y_offset) - button.transform = M +/atom/movable/screen/button_palette/proc/refresh_owner() + var/mob/viewer = our_hud.mymob + if(viewer.client) + viewer.client.screen |= src + + var/list/settings = our_hud.get_action_buttons_icons() + var/ui_icon = "[settings["bg_icon"]]" + var/list/ui_segments = splittext(ui_icon, ".") + var/list/ui_paths = splittext(ui_segments[1], "/") + var/ui_name = ui_paths[length(ui_paths)] + + icon_state = "[ui_name]_palette" + +/atom/movable/screen/button_palette/MouseEntered(location, control, params) + . = ..() + if(QDELETED(src)) + return + show_tooltip(params) + +/atom/movable/screen/button_palette/MouseExited() + closeToolTip(usr) + return ..() + +/atom/movable/screen/button_palette/proc/show_tooltip(params) + openToolTip(usr, src, params, title = name, content = desc) + +GLOBAL_LIST_INIT(palette_added_matrix, list(0.4,0.5,0.2,0, 0,1.4,0,0, 0,0.4,0.6,0, 0,0,0,1, 0,0,0,0)) +GLOBAL_LIST_INIT(palette_removed_matrix, list(1.4,0,0,0, 0.7,0.4,0,0, 0.4,0,0.6,0, 0,0,0,1, 0,0,0,0)) + +/atom/movable/screen/button_palette/proc/play_item_added() + color_for_now(GLOB.palette_added_matrix) + +/atom/movable/screen/button_palette/proc/play_item_removed() + color_for_now(GLOB.palette_removed_matrix) + +/atom/movable/screen/button_palette/proc/color_for_now(list/color) + if(color_timer_id) + return + add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) //We unfortunately cannot animate matrix colors. Curse you lummy it would be ~~non~~trivial to interpolate between the two valuessssssssss + color_timer_id = addtimer(CALLBACK(src, .proc/remove_color, color), 2 SECONDS) + +/atom/movable/screen/button_palette/proc/remove_color(list/to_remove) + color_timer_id = null + remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, to_remove) + +/atom/movable/screen/button_palette/proc/can_use(mob/user) + if (isobserver(user)) + var/mob/dead/observer/O = user + return !O.observetarget + return TRUE + +/atom/movable/screen/button_palette/Click(location, control, params) + if(!can_use(usr)) + return + + var/list/modifiers = params2list(params) + + if(LAZYACCESS(modifiers, ALT_CLICK)) + for(var/datum/action/action as anything in usr.actions) // Reset action positions to default + for(var/datum/hud/hud as anything in action.viewers) + var/atom/movable/screen/movable/action_button/button = action.viewers[hud] + hud.position_action(button, SCRN_OBJ_DEFAULT) + to_chat(usr, span_notice("Action button positions have been reset.")) + return TRUE + + set_expanded(!expanded) + +/atom/movable/screen/button_palette/proc/clicked_while_open(datum/source, atom/target, atom/location, control, params, mob/user) + if(istype(target, /atom/movable/screen/movable/action_button) || istype(target, /atom/movable/screen/palette_scroll) || target == src) // If you're clicking on an action button, or us, you can live + return + set_expanded(FALSE) + if(source) + UnregisterSignal(source, COMSIG_CLIENT_CLICK) + +/atom/movable/screen/button_palette/proc/set_expanded(new_expanded) + var/datum/action_group/our_group = our_hud.palette_actions + if(!length(our_group.actions)) //Looks dumb, trust me lad + new_expanded = FALSE + if(expanded == new_expanded) + return + + expanded = new_expanded + our_group.refresh_actions() + update_appearance() + + if(!usr.client) + return + + if(expanded) + RegisterSignal(usr.client, COMSIG_CLIENT_CLICK, .proc/clicked_while_open) + else + UnregisterSignal(usr.client, COMSIG_CLIENT_CLICK) + + closeToolTip(usr) //Our tooltips are now invalid, can't seem to update them in one frame, so here, just close them + +/atom/movable/screen/palette_scroll + icon = 'icons/mob/screen_gen.dmi' + screen_loc = ui_palette_scroll + /// How should we move the palette's actions? + /// Positive scrolls down the list, negative scrolls back + var/scroll_direction = 0 + var/datum/hud/our_hud + +/atom/movable/screen/palette_scroll/proc/can_use(mob/user) + if (isobserver(user)) + var/mob/dead/observer/O = user + return !O.observetarget + return TRUE + +/atom/movable/screen/palette_scroll/proc/set_hud(datum/hud/our_hud) + src.our_hud = our_hud + refresh_owner() + +/atom/movable/screen/palette_scroll/proc/refresh_owner() + var/mob/viewer = our_hud.mymob + if(viewer.client) + viewer.client.screen |= src + + var/list/settings = our_hud.get_action_buttons_icons() + icon = settings["bg_icon"] + +/atom/movable/screen/palette_scroll/Click(location, control, params) + if(!can_use(usr)) + return + our_hud.palette_actions.scroll(scroll_direction) + +/atom/movable/screen/palette_scroll/MouseEntered(location, control, params) + . = ..() + if(QDELETED(src)) + return + openToolTip(usr, src, params, title = name, content = desc) + +/atom/movable/screen/palette_scroll/MouseExited() + closeToolTip(usr) + return ..() + +/atom/movable/screen/palette_scroll/down + name = "Scroll Down" + desc = "Click on this to scroll the actions above down" + icon_state = "scroll_down" + scroll_direction = 1 + +/atom/movable/screen/palette_scroll/down/Destroy() + if(our_hud) + our_hud.mymob?.client?.screen -= src + our_hud.palette_down = null + our_hud = null + return ..() + +/atom/movable/screen/palette_scroll/up + name = "Scroll Up" + desc = "Click on this to scroll the actions above up" + icon_state = "scroll_up" + scroll_direction = -1 + +/atom/movable/screen/palette_scroll/up/Destroy() + if(our_hud) + our_hud.mymob?.client?.screen -= src + our_hud.palette_up = null + our_hud = null + return ..() + +/// Exists so you have a place to put your buttons when you move them around +/atom/movable/screen/action_landing + name = "Button Space" + desc = "Drag and drop a button into this spot
to add it to the group" + icon = 'icons/mob/screen_gen.dmi' + icon_state = "reserved" + // We want our whole 32x32 space to be clickable, so dropping's forgiving + mouse_opacity = MOUSE_OPACITY_OPAQUE + var/datum/action_group/owner + +/atom/movable/screen/action_landing/Destroy() + if(owner) + owner.landing = null + owner?.owner?.mymob?.client?.screen -= src + owner.refresh_actions() + owner = null + return ..() + +/atom/movable/screen/action_landing/proc/set_owner(datum/action_group/owner) + src.owner = owner + refresh_owner() + +/atom/movable/screen/action_landing/proc/refresh_owner() + var/datum/hud/our_hud = owner.owner + var/mob/viewer = our_hud.mymob + if(viewer.client) + viewer.client.screen |= src + + var/list/settings = our_hud.get_action_buttons_icons() + icon = settings["bg_icon"] + +/// Reacts to having a button dropped on it +/atom/movable/screen/action_landing/proc/hit_by(atom/movable/screen/movable/action_button/button) + var/datum/hud/our_hud = owner.owner + our_hud.position_action(button, owner.location) diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 9d762332c6..740174138d 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -73,8 +73,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( // We don't actually do proccalls really yet, so let's grab at prefs - var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle - var/action_buttons_hidden = FALSE + var/atom/movable/screen/button_palette/toggle_palette + var/atom/movable/screen/palette_scroll/down/palette_down + var/atom/movable/screen/palette_scroll/up/palette_up + + var/datum/action_group/palette/palette_actions + var/datum/action_group/listed/listed_actions + var/list/floating_actions var/atom/movable/screen/healths var/atom/movable/screen/healthdoll @@ -91,10 +96,12 @@ GLOBAL_LIST_INIT(available_ui_styles, list( // will fall back to the default if any of these are null ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style) - hide_actions_toggle = new - hide_actions_toggle.InitialiseIcon(src) - if(mymob.client) - hide_actions_toggle.locked = mymob.client.prefs.buttons_locked + toggle_palette = new() + toggle_palette.set_hud(src) + palette_down = new() + palette_down.set_hud(src) + palette_up = new() + palette_up.set_hud(src) hand_slots = list() @@ -110,7 +117,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(mymob.hud_used == src) mymob.hud_used = null - QDEL_NULL(hide_actions_toggle) + QDEL_NULL(toggle_palette) + QDEL_NULL(palette_down) + QDEL_NULL(palette_up) + QDEL_NULL(palette_actions) + QDEL_NULL(listed_actions) + QDEL_LIST(floating_actions) + QDEL_NULL(module_store_icon) QDEL_LIST(static_inventory) @@ -148,10 +161,14 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /mob/proc/create_mob_hud() if(!client || hud_used) return - hud_used = new hud_type(src) + set_hud_used(new hud_type(src)) update_sight() SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED) +/mob/proc/set_hud_used(datum/hud/new_hud) + hud_used = new_hud + new_hud.build_action_groups() + //Version denotes which style should be displayed. blank or 0 means "next version" /datum/hud/proc/show_hud(version = 0, mob/viewmob) if(!ismob(mymob)) @@ -160,6 +177,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(!screenmob.client) return FALSE + // This code is the absolute fucking worst, I want it to go die in a fire + // Seriously, why screenmob.client.screen = list() screenmob.client.update_clickcatcher() @@ -181,7 +200,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( if(infodisplay.len) screenmob.client.screen += infodisplay - screenmob.client.screen += hide_actions_toggle + screenmob.client.screen += toggle_palette if(action_intent) action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position @@ -272,7 +291,6 @@ GLOBAL_LIST_INIT(available_ui_styles, list( ui_style = new_ui_style build_hand_slots() - hide_actions_toggle.InitialiseIcon(src) //Triggered when F12 is pressed (Unless someone changed something in the DMF) /mob/verb/button_pressed_F12() @@ -320,3 +338,306 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud/proc/update_locked_slots() return + +/datum/hud/proc/position_action(atom/movable/screen/movable/action_button/button, position) + if(button.location != SCRN_OBJ_DEFAULT) + hide_action(button) + switch(position) + if(SCRN_OBJ_DEFAULT) // Reset to the default + button.dump_save() // Nuke any existing saves + position_action(button, button.linked_action.default_button_position) + return + if(SCRN_OBJ_IN_LIST) + listed_actions.insert_action(button) + if(SCRN_OBJ_IN_PALETTE) + palette_actions.insert_action(button) + else // If we don't have it as a define, this is a screen_loc, and we should be floating + floating_actions += button + button.screen_loc = position + position = SCRN_OBJ_FLOATING + + button.location = position + +/datum/hud/proc/position_action_relative(atom/movable/screen/movable/action_button/button, atom/movable/screen/movable/action_button/relative_to) + if(button.location != SCRN_OBJ_DEFAULT) + hide_action(button) + switch(relative_to.location) + if(SCRN_OBJ_IN_LIST) + listed_actions.insert_action(button, listed_actions.index_of(relative_to)) + if(SCRN_OBJ_IN_PALETTE) + palette_actions.insert_action(button, palette_actions.index_of(relative_to)) + if(SCRN_OBJ_FLOATING) // If we don't have it as a define, this is a screen_loc, and we should be floating + floating_actions += button + var/client/our_client = mymob.client + if(!our_client) + position_action(button, button.linked_action.default_button_position) + return + button.screen_loc = get_valid_screen_location(relative_to.screen_loc, world.icon_size, our_client.view_size.getView()) // Asks for a location adjacent to our button that won't overflow the map + + button.location = relative_to.location + +/// Removes the passed in action from its current position on the screen +/datum/hud/proc/hide_action(atom/movable/screen/movable/action_button/button) + switch(button.location) + if(SCRN_OBJ_DEFAULT) // Invalid + CRASH("We just tried to hide an action buttion that somehow has the default position as its location, you done fucked up") + if(SCRN_OBJ_FLOATING) + floating_actions -= button + if(SCRN_OBJ_IN_LIST) + listed_actions.remove_action(button) + if(SCRN_OBJ_IN_PALETTE) + palette_actions.remove_action(button) + button.screen_loc = null + +/// Generates visual landings for all groups that the button is not a memeber of +/datum/hud/proc/generate_landings(atom/movable/screen/movable/action_button/button) + listed_actions.generate_landing() + palette_actions.generate_landing() + +/// Clears all currently visible landings +/datum/hud/proc/hide_landings() + listed_actions.clear_landing() + palette_actions.clear_landing() + +// Updates any existing "owned" visuals, ensures they continue to be visible +/datum/hud/proc/update_our_owner() + toggle_palette.refresh_owner() + palette_down.refresh_owner() + palette_up.refresh_owner() + listed_actions.update_landing() + palette_actions.update_landing() + +/// Ensures all of our buttons are properly within the bounds of our client's view, moves them if they're not +/datum/hud/proc/view_audit_buttons() + var/our_view = mymob?.client?.view + if(!our_view) + return + listed_actions.check_against_view() + palette_actions.check_against_view() + for(var/atom/movable/screen/movable/action_button/floating_button as anything in floating_actions) + var/list/current_offsets = screen_loc_to_offset(floating_button.screen_loc) + // We set the view arg here, so the output will be properly hemm'd in by our new view + floating_button.screen_loc = offset_to_screen_loc(current_offsets[1], current_offsets[2], view = our_view) + +/// Generates and fills new action groups with our mob's current actions +/datum/hud/proc/build_action_groups() + listed_actions = new(src) + palette_actions = new(src) + floating_actions = list() + for(var/datum/action/action as anything in mymob.actions) + var/atom/movable/screen/movable/action_button/button = action.viewers[src] + if(!button) + action.ShowTo(mymob) + button = action.viewers[src] + position_action(button, button.location) + +/datum/action_group + /// The hud we're owned by + var/datum/hud/owner + /// The actions we're managing + var/list/atom/movable/screen/movable/action_button/actions + /// The initial vertical offset of our action buttons + var/north_offset = 0 + /// The pixel vertical offset of our action buttons + var/pixel_north_offset = 0 + /// Max amount of buttons we can have per row + /// Indexes at 1 + var/column_max = 0 + /// How far "ahead" of the first row we start. Lets us "scroll" our rows + /// Indexes at 1 + var/row_offset = 0 + /// How many rows of actions we can have at max before we just stop hiding + /// Indexes at 1 + var/max_rows = INFINITY + /// The screen location we go by + var/location + /// Our landing screen object + var/atom/movable/screen/action_landing/landing + +/datum/action_group/New(datum/hud/owner) + ..() + actions = list() + src.owner = owner + +/datum/action_group/Destroy() + owner = null + QDEL_NULL(landing) + QDEL_LIST(actions) + return ..() + +/datum/action_group/proc/insert_action(atom/movable/screen/action, index) + if(action in actions) + if(actions[index] == action) + return + actions -= action // Don't dupe, come on + if(!index) + index = length(actions) + 1 + index = min(length(actions) + 1, index) + actions.Insert(index, action) + refresh_actions() + +/datum/action_group/proc/remove_action(atom/movable/screen/action) + actions -= action + refresh_actions() + +/datum/action_group/proc/refresh_actions() + + // We don't use size() here because landings are not canon + var/total_rows = ROUND_UP(length(actions) / column_max) + total_rows -= max_rows // Lets get the amount of rows we're off from our max + row_offset = clamp(row_offset, 0, total_rows) // You're not allowed to offset so far that we have a row of blank space + + var/button_number = 0 + for(var/atom/movable/screen/button as anything in actions) + var/postion = ButtonNumberToScreenCoords(button_number ) + button.screen_loc = postion + button_number++ + + if(landing) + var/postion = ButtonNumberToScreenCoords(button_number, landing = TRUE) // Need a good way to count buttons off screen, but allow this to display in the right place if it's being placed with no concern for dropdown + landing.screen_loc = postion + button_number++ + +/// Accepts a number represeting our position in the group, indexes at 0 to make the math nicer +/datum/action_group/proc/ButtonNumberToScreenCoords(number, landing = FALSE) + var/row = round(number / column_max) + row -= row_offset // If you're less then 0, you don't get to render, this lets us "scroll" rows ya feel? + if(row < 0) + return null + + // Could use >= here, but I think it's worth noting that the two start at different places, since row is based on number here + if(row > max_rows - 1) + if(!landing) // If you're not a landing, go away please. thx + return null + // We always want to render landings, even if their action button can't be displayed. + // So we set a row equal to the max amount of rows + 1. Willing to overrun that max slightly to properly display the landing spot + row = max_rows // Remembering that max_rows indexes at 1, and row indexes at 0 + + // We're going to need to set our column to match the first item in the last row, so let's set number properly now + number = row * column_max + + var/visual_row = row + north_offset + var/coord_row = visual_row ? "-[visual_row]" : "+0" + + var/visual_column = number % column_max + var/coord_col = "+[visual_column]" + var/coord_col_offset = 4 + 2 * (visual_column + 1) + return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-[pixel_north_offset]" + +/datum/action_group/proc/check_against_view() + var/owner_view = owner?.mymob?.client?.view + if(!owner_view) + return + // Unlikey as it is, we may have been changed. Want to start from our target position and fail down + column_max = initial(column_max) + // Convert our viewer's view var into a workable offset + var/list/view_size = view_to_pixels(owner_view) + + // We're primarially concerned about width here, if someone makes us 1x2000 I wish them a swift and watery death + var/furthest_screen_loc = ButtonNumberToScreenCoords(column_max - 1) + var/list/offsets = screen_loc_to_offset(furthest_screen_loc, owner_view) + if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2]) // We're all good + return + + for(column_max in column_max - 1 to 1 step -1) // Yes I could do this by unwrapping ButtonNumberToScreenCoords, but I don't feel like it + var/tested_screen_loc = ButtonNumberToScreenCoords(column_max) + offsets = screen_loc_to_offset(tested_screen_loc, owner_view) + // We've found a valid max length, pack it in + if(offsets[1] > world.icon_size && offsets[1] < view_size[1] && offsets[2] > world.icon_size && offsets[2] < view_size[2]) + break + // Use our newly resized column max + refresh_actions() + +/// Returns the amount of objects we're storing at the moment +/datum/action_group/proc/size() + var/amount = length(actions) + if(landing) + amount += 1 + return amount + +/datum/action_group/proc/index_of(atom/movable/screen/get_location) + return actions.Find(get_location) + +/// Generates a landing object that can be dropped on to join this group +/datum/action_group/proc/generate_landing() + if(landing) + return + landing = new() + landing.set_owner(src) + refresh_actions() + +/// Clears any landing objects we may currently have +/datum/action_group/proc/clear_landing() + QDEL_NULL(landing) + +/datum/action_group/proc/update_landing() + if(!landing) + return + landing.refresh_owner() + +/datum/action_group/proc/scroll(amount) + row_offset += amount + refresh_actions() + +/datum/action_group/palette + north_offset = 2 + column_max = 3 + max_rows = 3 + location = SCRN_OBJ_IN_PALETTE + +/datum/action_group/palette/insert_action(atom/movable/screen/action, index) + . = ..() + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + palette.play_item_added() + +/datum/action_group/palette/remove_action(atom/movable/screen/action) + . = ..() + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + palette.play_item_removed() + if(!length(actions)) + palette.set_expanded(FALSE) + +/datum/action_group/palette/refresh_actions() + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + var/atom/movable/screen/palette_scroll/scroll_down = owner.palette_down + var/atom/movable/screen/palette_scroll/scroll_up = owner.palette_up + + var/actions_above = round((owner.listed_actions.size() - 1) / owner.listed_actions.column_max) + north_offset = initial(north_offset) + actions_above + + palette.screen_loc = ui_action_palette_offset(actions_above) + var/action_count = length(owner?.mymob?.actions) + var/our_row_count = round((length(actions) - 1) / column_max) + if(!action_count) + palette.screen_loc = null + + if(palette.expanded && action_count && our_row_count >= max_rows) + scroll_down.screen_loc = ui_palette_scroll_offset(actions_above) + scroll_up.screen_loc = ui_palette_scroll_offset(actions_above) + else + scroll_down.screen_loc = null + scroll_up.screen_loc = null + + return ..() + +/datum/action_group/palette/ButtonNumberToScreenCoords(number, landing) + var/atom/movable/screen/button_palette/palette = owner.toggle_palette + if(palette.expanded) + return ..() + + if(!landing) + return null + + // We only render the landing in this case, so we force it to be the second item displayed (Second rather then first since it looks nicer) + // Remember the number var indexes at 0 + return ..(1 + (row_offset * column_max), landing) + + +/datum/action_group/listed + pixel_north_offset = 6 + column_max = 10 + location = SCRN_OBJ_IN_LIST + +/datum/action_group/listed/refresh_actions() + . = ..() + owner.palette_actions.refresh_actions() // We effect them, so we gotta refresh em diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index a00687e263..6c9f852ef5 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -9,9 +9,8 @@ //Not tied to the grid, places it's center where the cursor is /atom/movable/screen/movable + mouse_drag_pointer = 'icons/effects/mouse_pointers/screen_drag.dmi' var/snap2grid = FALSE - var/moved = FALSE - var/locked = FALSE var/x_off = -16 var/y_off = -16 @@ -21,35 +20,29 @@ /atom/movable/screen/movable/snap snap2grid = TRUE - /atom/movable/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) - if(locked) //no! I am locked! begone! + var/position = mouse_params_to_position(params) + if(!position) return - var/list/PM = params2list(params) + + screen_loc = position + +/// Takes mouse parmas as input, returns a string representing the appropriate mouse position +/atom/movable/screen/movable/proc/mouse_params_to_position(params) + var/list/modifiers = params2list(params) //No screen-loc information? abort. - if(!PM || !PM["screen-loc"]) + if(!LAZYACCESS(modifiers, SCREEN_LOC)) return - - //Split screen-loc up into X+Pixel_X and Y+Pixel_Y - var/list/screen_loc_params = splittext(PM["screen-loc"], ",") - - //Split X+Pixel_X up into list(X, Pixel_X) - var/list/screen_loc_X = splittext(screen_loc_params[1],":") - - //Split Y+Pixel_Y up into list(Y, Pixel_Y) - var/list/screen_loc_Y = splittext(screen_loc_params[2],":") - + var/client/our_client = usr.client + var/list/offset = screen_loc_to_offset(LAZYACCESS(modifiers, SCREEN_LOC)) if(snap2grid) //Discard Pixel Values - screen_loc = "[screen_loc_X[1]],[screen_loc_Y[1]]" - + offset[1] = FLOOR(offset[1], world.icon_size) // drops any pixel offset + offset[2] = FLOOR(offset[2], world.icon_size) // drops any pixel offset 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]) + x_off - var/pix_Y = text2num(screen_loc_Y[2]) + y_off - screen_loc = "[screen_loc_X[1]]:[pix_X],[screen_loc_Y[1]]:[pix_Y]" - - moved = screen_loc - + offset[1] += x_off + offset[2] += y_off + return offset_to_screen_loc(offset[1], offset[2], our_client?.view) //Debug procs /client/proc/test_movable_UI() diff --git a/code/_onclick/hud/screentip.dm b/code/_onclick/hud/screentip.dm index 5128448561..b9b27072b3 100644 --- a/code/_onclick/hud/screentip.dm +++ b/code/_onclick/hud/screentip.dm @@ -17,4 +17,4 @@ SIGNAL_HANDLER if(!hud || !hud.mymob.client.view_size) //Might not have been initialized by now return - maptext_width = getviewsize(hud.mymob.client.view_size.getView())[1] * world.icon_size + maptext_width = view_to_pixels(hud.mymob.client.view_size.getView())[1] diff --git a/code/controllers/subsystem/augury.dm b/code/controllers/subsystem/augury.dm index 53c86004a6..f7a7c66718 100644 --- a/code/controllers/subsystem/augury.dm +++ b/code/controllers/subsystem/augury.dm @@ -69,15 +69,15 @@ SUBSYSTEM_DEF(augury) SSaugury.watchers += owner to_chat(owner, "You are now auto-following debris.") active = TRUE - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/augury/Deactivate() SSaugury.watchers -= owner to_chat(owner, "You are no longer auto-following debris.") active = FALSE - UpdateButtonIcon() + UpdateButtons() -/datum/action/innate/augury/UpdateButtonIcon(status_only = FALSE, force) +/datum/action/innate/augury/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) ..() if(active) button.icon_state = "template_active" diff --git a/code/datums/action.dm b/code/datums/action.dm index 2d6af6c2de..29c4fa90da 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,9 +11,11 @@ var/check_flags = 0 var/required_mobility_flags = MOBILITY_USE var/processing = FALSE - var/atom/movable/screen/movable/action_button/button = null var/buttontooltipstyle = "" var/transparent_when_unavailable = TRUE + /// Where any buttons we create should be by default. Accepts screen_loc and location defines + var/default_button_position = SCRN_OBJ_IN_LIST + var/use_target_appearance = FALSE var/list/target_appearance_matrix //if set, will be used to transform the target button appearance as an arglist. @@ -28,12 +30,6 @@ /datum/action/New(Target) link_to(Target) - button = new - button.linked_action = src - button.name = name - button.actiontooltipstyle = buttontooltipstyle - if(desc) - button.desc = desc /datum/action/proc/link_to(Target) target = Target @@ -43,51 +39,42 @@ if(owner) Remove(owner) target = null - QDEL_NULL(button) + QDEL_LIST_ASSOC_VAL(viewers) // Qdel the buttons in the viewers list **NOT THE HUDS** return ..() /datum/action/proc/Grant(mob/M) - if(M) - if(owner) - if(owner == M) - return - Remove(owner) - owner = M - - //button id generation - var/counter = 0 - var/bitfield = 0 - for(var/datum/action/A in M.actions) - if(A.name == name && A.button.id) - counter += 1 - bitfield |= A.button.id - bitfield = ~bitfield - var/bitflag = 1 - for(var/i in 1 to (counter + 1)) - if(bitfield & bitflag) - button.id = bitflag - break - bitflag *= 2 - - M.actions += src - if(M.client) - M.client.screen += button - button.locked = M.client.prefs.buttons_locked || button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE //even if it's not defaultly locked we should remember we locked it before - button.moved = button.id ? M.client.prefs.action_buttons_screen_locs["[name]_[button.id]"] : FALSE - M.update_action_buttons() - else + if(!M) Remove(owner) + return + if(owner) + if(owner == M) + return + Remove(owner) + owner = M + RegisterSignal(owner, COMSIG_PARENT_QDELETING, .proc/clear_ref, override = TRUE) + + GiveAction(M) + +/datum/action/proc/clear_ref(datum/ref) + SIGNAL_HANDLER + if(ref == owner) + Remove(owner) + if(ref == target) + qdel(src) /datum/action/proc/Remove(mob/M) - if(M) - if(M.client) - M.client.screen -= button - M.actions -= src - M.update_action_buttons() - owner = null - button.moved = FALSE //so the button appears in its normal position when given to another owner. - button.locked = FALSE - button.id = null + for(var/datum/hud/hud in viewers) + if(!hud.mymob) + continue + HideFrom(hud.mymob) + LAZYREMOVE(M.actions, src) // We aren't always properly inserted into the viewers list, gotta make sure that action's cleared + viewers = list() + + if(owner) + UnregisterSignal(owner, COMSIG_PARENT_QDELETING) + if(target == owner) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/clear_ref) + owner = null /datum/action/proc/Trigger() if(!IsAvailable()) @@ -125,15 +112,15 @@ /datum/action/proc/UpdateButtons(status_only, force) for(var/datum/hud/hud in viewers) var/atom/movable/screen/movable/button = viewers[hud] - UpdateButtonIcon(button, status_only, force) + UpdateButton(button, status_only, force) -/datum/action/proc/UpdateButtonIcon(status_only = FALSE, force = FALSE) +/datum/action/proc/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) if(!button) return if(!status_only) button.name = name button.desc = desc - if(owner && owner.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) + if(owner?.hud_used && background_icon_state == ACTION_BUTTON_DEFAULT_BACKGROUND) var/list/settings = owner.hud_used.get_action_buttons_icons() if(button.icon != settings["bg_icon"]) button.icon = settings["bg_icon"] @@ -145,25 +132,13 @@ if(button.icon_state != background_icon_state) button.icon_state = background_icon_state - if(!use_target_appearance) - ApplyIcon(button, force) + ApplyIcon(button, force) - else if(target && button.appearance_cache != target.appearance) //replace with /ref comparison if this is not valid. - var/mutable_appearance/M = new(target) - M.layer = FLOAT_LAYER - M.plane = FLOAT_PLANE - if(target_appearance_matrix) - var/list/L = target_appearance_matrix - M.transform = matrix(L[1], L[2], L[3], L[4], L[5], L[6]) - button.cut_overlays() - button.add_overlay(M) - button.appearance_cache = target.appearance - - if(!IsAvailable(TRUE)) + if(!IsAvailable()) button.color = transparent_when_unavailable ? rgb(128,0,0,128) : rgb(128,0,0) else button.color = rgb(255,255,255,255) - return 1 + return TRUE /datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) @@ -184,7 +159,67 @@ M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE) /datum/action/proc/OnUpdatedIcon() - addtimer(CALLBACK(src, .proc/UpdateButtonIcon), 1) //Hopefully runs after new icon overlays have been compiled. + SIGNAL_HANDLER + UpdateButtons() + +//Give our action button to the player +/datum/action/proc/GiveAction(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + if(viewers[our_hud]) // Already have a copy of us? go away + return + + LAZYOR(viewer.actions, src) // Move this in + ShowTo(viewer) + +//Adds our action button to the screen of a player +/datum/action/proc/ShowTo(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + if(!our_hud || viewers[our_hud]) // There's no point in this if you have no hud in the first place + return + + var/atom/movable/screen/movable/action_button/button = CreateButton() + SetId(button, viewer) + + button.our_hud = our_hud + viewers[our_hud] = button + if(viewer.client) + viewer.client.screen += button + + button.load_position(viewer) + viewer.update_action_buttons() + +//Removes our action button from the screen of a player +/datum/action/proc/HideFrom(mob/viewer) + var/datum/hud/our_hud = viewer.hud_used + var/atom/movable/screen/movable/action_button/button = viewers[our_hud] + LAZYREMOVE(viewer.actions, src) + if(button) + qdel(button) + +/datum/action/proc/CreateButton() + var/atom/movable/screen/movable/action_button/button = new() + button.linked_action = src + button.actiontooltipstyle = buttontooltipstyle + if(desc) + button.desc = desc + return button + +/datum/action/proc/SetId(atom/movable/screen/movable/action_button/our_button, mob/owner) + //button id generation + var/bitfield = 0 + for(var/datum/action/action in owner.actions) + if(action == src) // This could be us, which is dumb + continue + var/atom/movable/screen/movable/action_button/button = action.viewers[owner.hud_used] + if(action.name == name && button.id) + bitfield |= button.id + + bitfield = ~bitfield // Flip our possible ids, so we can check if we've found a unique one + for(var/i in 0 to 23) // We get 24 possible bitflags in dm + var/bitflag = 1 << i // Shift us over one + if(bitfield & bitflag) + our_button.id = bitflag + return //Presets for item actions /datum/action/item_action @@ -258,12 +293,14 @@ /datum/action/item_action/set_internals name = "Set Internals" -/datum/action/item_action/set_internals/UpdateButtonIcon(status_only = FALSE, force) - if(..()) //button available - if(iscarbon(owner)) - var/mob/living/carbon/C = owner - if(target == C.internal) - button.icon_state = "template_active" +/datum/action/item_action/set_internals/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) + if(!..()) // no button available + return + if(!iscarbon(owner)) + return + var/mob/living/carbon/C = owner + if(target == C.internal) + button.icon_state = "template_active" /datum/action/item_action/pick_color name = "Choose A Color" @@ -309,9 +346,9 @@ /datum/action/item_action/toggle_unfriendly_fire/Trigger() if(..()) - UpdateButtonIcon() + UpdateButtons() -/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon(status_only = FALSE, force) +/datum/action/item_action/toggle_unfriendly_fire/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force) if(istype(target, /obj/item/hierophant_club)) var/obj/item/hierophant_club/H = target if(H.friendly_fire_check) @@ -380,7 +417,6 @@ /datum/action/item_action/toggle/New(Target) ..() name = "Toggle [target.name]" - button.name = name /datum/action/item_action/halt name = "HALT!" @@ -409,7 +445,6 @@ /datum/action/item_action/adjust/New(Target) ..() name = "Adjust [target.name]" - button.name = name /datum/action/item_action/switch_hud name = "Switch HUD" @@ -495,12 +530,10 @@ /datum/action/item_action/organ_action/toggle/New(Target) ..() name = "Toggle [target.name]" - button.name = name /datum/action/item_action/organ_action/use/New(Target) ..() name = "Use [target.name]" - button.name = name /datum/action/item_action/cult_dagger name = "Draw Blood Rune" @@ -509,14 +542,13 @@ button_icon_state = "draw" buttontooltipstyle = "cult" background_icon_state = "bg_demon" + default_button_position = "6:157,4:-2" /datum/action/item_action/cult_dagger/Grant(mob/M) - if(iscultist(M)) - ..() - button.screen_loc = "6:157,4:-2" - button.moved = "6:157,4:-2" - else + if(!iscultist(M)) Remove(owner) + return + return ..() /datum/action/item_action/cult_dagger/Trigger() for(var/obj/item/H in owner.held_items) //In case we were already holding another dagger @@ -643,7 +675,6 @@ icon_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/S = target @@ -711,44 +742,114 @@ /datum/action/cooldown check_flags = 0 transparent_when_unavailable = FALSE + // The default cooldown applied when StartCooldown() is called var/cooldown_time = 0 + // The actual next time this ability can be used var/next_use_time = 0 + // Whether or not you want the cooldown for the ability to display in text form + var/text_cooldown = TRUE + // Setting for intercepting clicks before activating the ability + var/click_to_activate = FALSE + // Shares cooldowns with other cooldown abilities of the same value, not active if null + var/shared_cooldown -/datum/action/cooldown/New() - ..() +/datum/action/cooldown/CreateButton() + var/atom/movable/screen/movable/action_button/button = ..() button.maptext = "" button.maptext_x = 8 button.maptext_y = 0 button.maptext_width = 24 button.maptext_height = 12 + return button -/datum/action/cooldown/IsAvailable(silent = FALSE) - return next_use_time <= world.time +/datum/action/cooldown/IsAvailable() + return ..() && (next_use_time <= world.time) -/datum/action/cooldown/proc/StartCooldown() - next_use_time = world.time + cooldown_time - button.maptext = MAPTEXT_TINY_UNICODE("[round(cooldown_time/10, 0.1)]") - UpdateButtonIcon() +/// Starts a cooldown time to be shared with similar abilities, will use default cooldown time if an override is not specified +/datum/action/cooldown/proc/StartCooldown(override_cooldown_time) + if(shared_cooldown) + for(var/datum/action/cooldown/shared_ability in owner.actions - src) + if(shared_cooldown == shared_ability.shared_cooldown) + if(isnum(override_cooldown_time)) + shared_ability.StartCooldownSelf(override_cooldown_time) + else + shared_ability.StartCooldownSelf(cooldown_time) + StartCooldownSelf(override_cooldown_time) + +/// Starts a cooldown time for this ability only, will use default cooldown time if an override is not specified +/datum/action/cooldown/proc/StartCooldownSelf(override_cooldown_time) + if(isnum(override_cooldown_time)) + next_use_time = world.time + override_cooldown_time + else + next_use_time = world.time + cooldown_time + UpdateButtons() START_PROCESSING(SSfastprocess, src) -/datum/action/cooldown/process() +/datum/action/cooldown/Trigger(trigger_flags, atom/target) + . = ..() + if(!.) + return if(!owner) + return FALSE + if(click_to_activate) + if(target) + // For automatic / mob handling + return InterceptClickOn(owner, null, target) + if(owner.click_intercept == src) + owner.click_intercept = null + else + owner.click_intercept = src + for(var/datum/action/cooldown/ability in owner.actions) + ability.UpdateButtons() + return TRUE + return PreActivate(owner) + +/// Intercepts client owner clicks to activate the ability +/datum/action/cooldown/proc/InterceptClickOn(mob/living/caller, params, atom/target) + if(!IsAvailable()) + return FALSE + if(!target) + return FALSE + PreActivate(target) + caller.click_intercept = null + return TRUE + +/// For signal calling +/datum/action/cooldown/proc/PreActivate(atom/target) + if(SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_STARTED, src) & COMPONENT_BLOCK_ABILITY_START) + return + . = Activate(target) + SEND_SIGNAL(owner, COMSIG_MOB_ABILITY_FINISHED, src) + +/// To be implemented by subtypes +/datum/action/cooldown/proc/Activate(atom/target) + return + +/datum/action/cooldown/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + . = ..() + if(!button) + return + var/time_left = max(next_use_time - world.time, 0) + if(text_cooldown) + button.maptext = MAPTEXT("[round(time_left/10, 0.1)]") + if(!owner || time_left == 0) button.maptext = "" + if(IsAvailable() && owner.click_intercept == src) + button.color = COLOR_GREEN + +/datum/action/cooldown/process() + var/time_left = max(next_use_time - world.time, 0) + if(!owner || time_left == 0) STOP_PROCESSING(SSfastprocess, src) - var/timeleft = max(next_use_time - world.time, 0) - if(timeleft == 0) - button.maptext = "" - UpdateButtonIcon() - STOP_PROCESSING(SSfastprocess, src) - else - button.maptext = MAPTEXT_TINY_UNICODE("[round(cooldown_time/10, 0.1)]") + UpdateButtons() /datum/action/cooldown/Grant(mob/M) ..() - if(owner) - UpdateButtonIcon() - if(next_use_time > world.time) - START_PROCESSING(SSfastprocess, src) + if(!owner) + return + UpdateButtons() + if(next_use_time > world.time) + START_PROCESSING(SSfastprocess, src) //surf_ss13 /datum/action/item_action/bhop diff --git a/code/datums/brain_damage/imaginary_friend.dm b/code/datums/brain_damage/imaginary_friend.dm index f35389f171..c7e0522128 100644 --- a/code/datums/brain_damage/imaginary_friend.dm +++ b/code/datums/brain_damage/imaginary_friend.dm @@ -225,7 +225,7 @@ name = "Hide" desc = "Hide yourself from your owner's sight." button_icon_state = "hide" - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/imaginary_hide/Activate() var/mob/camera/imaginary_friend/I = owner diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 00fbfc4f24..9b144e74bf 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1661,7 +1661,7 @@ GLOBAL_LIST(objective_choices) if(istype(S, type)) continue S.charge_counter = delay - S.updateButtonIcon() + S.UpdateButton() INVOKE_ASYNC(S, /obj/effect/proc_holder/spell.proc/start_recharge) /datum/mind/proc/get_ghost(even_if_they_cant_reenter) diff --git a/code/datums/view.dm b/code/datums/view.dm index 5610fb040e..7313cc4c18 100644 --- a/code/datums/view.dm +++ b/code/datums/view.dm @@ -1,108 +1,110 @@ //This is intended to be a full wrapper. DO NOT directly modify its values ///Container for client viewsize -/datum/viewData +/datum/view_data var/width = 0 var/height = 0 var/default = "" var/is_suppressed = FALSE var/client/chief = null -/datum/viewData/New(client/owner, view_string) +/datum/view_data/New(client/owner, view_string) default = view_string chief = owner apply() -/datum/viewData/proc/setDefault(string) +/datum/view_data/proc/setDefault(string) default = string apply() -/datum/viewData/proc/safeApplyFormat() +/datum/view_data/proc/afterViewChange() if(isZooming()) assertFormat() - return - resetFormat() + else + resetFormat() + var/datum/hud/our_hud = chief?.mob?.hud_used + our_hud.view_audit_buttons() // Make sure our hud's buttons are in our new size -/datum/viewData/proc/assertFormat()//T-Pose +/datum/view_data/proc/assertFormat()//T-Pose // winset(chief, "mapwindow.map", "zoom=0") // Citadel Edit - We're using icon dropdown instead -/datum/viewData/proc/resetFormat()//Cuck +/datum/view_data/proc/resetFormat()//Cuck // winset(chief, "mapwindow.map", "zoom=[chief.prefs.pixel_size]") // Citadel Edit - We're using icon dropdown instead -/datum/viewData/proc/setZoomMode() +/datum/view_data/proc/setZoomMode() // winset(chief, "mapwindow.map", "zoom-mode=[chief.prefs.scaling_method]") // Citadel Edit - We're using icon dropdown instead -/datum/viewData/proc/isZooming() +/datum/view_data/proc/isZooming() return (width || height) -/datum/viewData/proc/resetToDefault() +/datum/view_data/proc/resetToDefault() width = 0 height = 0 apply() -/datum/viewData/proc/add(toAdd) +/datum/view_data/proc/add(toAdd) width += toAdd height += toAdd apply() -/datum/viewData/proc/addTo(toAdd) +/datum/view_data/proc/addTo(toAdd) var/list/shitcode = getviewsize(toAdd) width += shitcode[1] height += shitcode[2] apply() -/datum/viewData/proc/setTo(toAdd) +/datum/view_data/proc/setTo(toAdd) var/list/shitcode = getviewsize(toAdd) //Backward compatability to account width = shitcode[1] //for a change in how sizes get calculated. we used to include world.view in height = shitcode[2] //this, but it was jank, so I had to move it apply() -/datum/viewData/proc/setBoth(wid, hei) +/datum/view_data/proc/setBoth(wid, hei) width = wid height = hei apply() -/datum/viewData/proc/setWidth(wid) +/datum/view_data/proc/setWidth(wid) width = wid apply() -/datum/viewData/proc/setHeight(hei) +/datum/view_data/proc/setHeight(hei) width = hei apply() -/datum/viewData/proc/addToWidth(toAdd) +/datum/view_data/proc/addToWidth(toAdd) width += toAdd apply() -/datum/viewData/proc/addToHeight(screen, toAdd) +/datum/view_data/proc/addToHeight(screen, toAdd) height += toAdd apply() -/datum/viewData/proc/apply() +/datum/view_data/proc/apply() chief.change_view(getView()) - safeApplyFormat() + afterViewChange() -/datum/viewData/proc/supress() +/datum/view_data/proc/supress() is_suppressed = TRUE apply() -/datum/viewData/proc/unsupress() +/datum/view_data/proc/unsupress() is_suppressed = FALSE apply() -/datum/viewData/proc/getView() +/datum/view_data/proc/getView() var/list/temp = getviewsize(default) if(is_suppressed) return "[temp[1]]x[temp[2]]" return "[width + temp[1]]x[height + temp[2]]" -/datum/viewData/proc/zoomIn() +/datum/view_data/proc/zoomIn() resetToDefault() animate(chief, pixel_x = 0, pixel_y = 0, 0, FALSE, LINEAR_EASING, ANIMATION_END_NOW) -/datum/viewData/proc/zoomOut(radius = 0, offset = 0, direction = FALSE) +/datum/view_data/proc/zoomOut(radius = 0, offset = 0, direction = FALSE) if(direction) var/_x = 0 var/_y = 0 diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 4440b3f91a..ea3531dcd0 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1283,7 +1283,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb */ /obj/item/proc/update_action_buttons(status_only = FALSE, force = FALSE) for(var/datum/action/current_action as anything in actions) - current_action.UpdateButtonIcon(status_only, force) + current_action.UpdateButtons(status_only, force) /// Special stuff you want to do when an outfit equips this item. /obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 880358a2c1..6873b59146 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -173,7 +173,7 @@ update_power() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/defibrillator/proc/make_paddles() if(!combat) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 79489c3c51..3f64be4729 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -40,7 +40,7 @@ playsound(src, on ? 'sound/weapons/magin.ogg' : 'sound/weapons/magout.ogg', 40, TRUE) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() return TRUE /obj/item/flashlight/DoRevenantThrowEffects(atom/target) diff --git a/code/game/objects/items/granters.dm b/code/game/objects/items/granters.dm index f83d01f4ef..801befc9c6 100644 --- a/code/game/objects/items/granters.dm +++ b/code/game/objects/items/granters.dm @@ -129,12 +129,12 @@ /datum/action/innate/drink_fling/Activate() button_icon_state = "drinkfling_on" active = TRUE - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/drink_fling/Deactivate() button_icon_state = "drinkfling_off" active = FALSE - UpdateButtonIcon() + UpdateButtons() /obj/item/book/granter/action/origami granted_action = /datum/action/innate/origami @@ -155,13 +155,13 @@ to_chat(owner, "You will now fold origami planes.") button_icon_state = "origami_on" active = TRUE - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/origami/Deactivate() to_chat(owner, "You will no longer fold origami planes.") button_icon_state = "origami_off" active = FALSE - UpdateButtonIcon() + UpdateButtons() ///SPELLS/// diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 173b420710..d8730cc95b 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -719,6 +719,6 @@ user.vtec = initial(user.vtec) - maxReduction * 1 action.button_icon_state = "Chevron_State_[currentState]" - action.UpdateButtonIcon() + action.UpdateButtons() return TRUE diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 25e2f1a292..92e46836b0 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -50,7 +50,7 @@ to_chat(user, "You turn the jetpack off.") for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/tank/jetpack/proc/turn_on(mob/user) on = TRUE diff --git a/code/game/objects/structures/manned_turret.dm b/code/game/objects/structures/manned_turret.dm index 3f1cb5f4c1..639180356d 100644 --- a/code/game/objects/structures/manned_turret.dm +++ b/code/game/objects/structures/manned_turret.dm @@ -80,7 +80,7 @@ return FALSE var/client/C = controller.client if(C) - var/atom/A = C.mouseObject + var/atom/A = WEAKREF(C.mouse_object_ref) var/turf/T = get_turf(A) if(istype(T)) //They're hovering over something in the map. direction_track(controller, T) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 343faccad6..293b5bac4b 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -59,7 +59,7 @@ H.update_inv_wear_suit() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/suit/armor/abductor/vest/item_action_slot_check(slot, mob/user, datum/action/A) if(slot == ITEM_SLOT_OCLOTHING) //we only give the mob the ability to activate the vest if he's actually wearing it. diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index c5f1cfbb40..a3b7fd4c0f 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -216,7 +216,7 @@ return // Disable Powers: Masquerade * NOTE * This should happen as a FLAW! //if (stat >= UNCONSCIOUS) - // for (var/datum/action/bloodsucker/masquerade/P in powers) + // for (var/datum/action/cooldown/bloodsucker/masquerade/P in powers) // P.Deactivate() // TEMP DEATH var/total_brute = owner.current.getBruteLoss_nonProsthetic() @@ -252,7 +252,7 @@ owner.current.update_sight() owner.current.reload_fullscreen() // Disable ALL Powers - for(var/datum/action/bloodsucker/power in powers) + for(var/datum/action/cooldown/bloodsucker/power in powers) if(power.active && !power.can_use_in_torpor) power.DeactivatePower() if(owner.current.suiciding) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm index 0a799021e9..019bbe6fbd 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_powers.dm @@ -1,22 +1,26 @@ -/datum/action/bloodsucker +/datum/action/cooldown/bloodsucker name = "Vampiric Gift" desc = "A vampiric gift." button_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the BACKGROUND icon background_icon_state = "vamp_power_off" //And this is the state for the background icon - var/background_icon_state_on = "vamp_power_on" // FULP: Our "ON" icon alternative. - var/background_icon_state_off = "vamp_power_off" // FULP: Our "OFF" icon alternative. icon_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the ACTION icon button_icon_state = "power_feed" //And this is the state for the action icon buttontooltipstyle = "cult" + transparent_when_unavailable = TRUE + + /// Cooldown you'll have to wait between each use, decreases depending on level. + cooldown_time = 2 SECONDS + + ///Background icon when the Power is active. + var/background_icon_state_on = "vamp_power_on" + ///Background icon when the Power is NOT active. + var/background_icon_state_off = "vamp_power_off" // Action-Related - //var/amPassive = FALSE // REMOVED: Just made it its own kind. // Am I just "on" at all times? (aka NO ICON) var/amTargetted = FALSE // Am I asked to choose a target when enabled? (Shows as toggled ON when armed) var/amToggle = FALSE // Can I be actively turned on and off? var/amSingleUse = FALSE // Am I removed after a single use? var/active = FALSE - var/cooldown = 20 // 10 ticks, 1 second. - var/cooldownUntil = 0 // From action.dm: next_use_time = world.time + cooldown_time // Power-Related var/level_current = 0 // Can increase to yield new abilities. Each power goes up in strength each Rank. //var/level_max = 1 // @@ -32,7 +36,7 @@ //var/not_bloodsucker = FALSE // This goes to Vassals or Hunters, but NOT bloodsuckers. var/must_be_concious = TRUE //Can't use this ability while unconcious. -/datum/action/bloodsucker/New() +/datum/action/cooldown/bloodsucker/New() if(bloodcost > 0) desc += "

COST: [bloodcost] Blood" // Modify description to add cost. if(warn_constant_cost) @@ -46,7 +50,7 @@ // click.dm <--- Where we can take over mouse clicks // spells.dm /add_ranged_ability() <--- How we take over the mouse click to use a power on a target. -/datum/action/bloodsucker/Trigger() +/datum/action/cooldown/bloodsucker/Trigger() // Active? DEACTIVATE AND END! if(active && CheckCanDeactivate(TRUE)) DeactivatePower() @@ -56,7 +60,7 @@ PayCost() if(amToggle) active = !active - UpdateButtonIcon() + UpdateButtons() if(!amToggle || !active) StartCooldown() // Must come AFTER UpdateButton(), otherwise icon will revert. ActivatePower() // NOTE: ActivatePower() freezes this power in place until it ends. @@ -65,13 +69,13 @@ if(amSingleUse) RemoveAfterUse() -/datum/action/bloodsucker/proc/CheckCanPayCost(display_error) +/datum/action/cooldown/bloodsucker/proc/CheckCanPayCost(display_error) if(!owner || !owner.mind) return FALSE // Cooldown? - if(cooldownUntil > world.time) + if(next_use_time > world.time) if(display_error) - to_chat(owner, "[src] is unavailable. Wait [(cooldownUntil - world.time) / 10] seconds.") + to_chat(owner, "[src] is unavailable. Wait [(next_use_time - world.time) / 10] seconds.") return FALSE // Have enough blood? var/mob/living/L = owner @@ -81,7 +85,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/proc/CheckCanUse(display_error) // These checks can be scanned every frame while a ranged power is on. +/datum/action/cooldown/bloodsucker/proc/CheckCanUse(display_error) // These checks can be scanned every frame while a ranged power is on. if(!owner || !owner.mind) return FALSE // Torpor? @@ -123,79 +127,43 @@ return FALSE return TRUE -/datum/action/bloodsucker/proc/StartCooldown() - set waitfor = FALSE - // Alpha Out - button.color = rgb(128,0,0,128) - button.alpha = 100 - // Calculate Cooldown (by power's level) - var/this_cooldown = (cooldown_static || amSingleUse) ? cooldown : max(cooldown / 2, cooldown - (cooldown / 16 * (level_current-1))) - // NOTE: With this formula, you'll hit half cooldown at level 8 for that power. - - // Wait for cooldown - cooldownUntil = world.time + this_cooldown - spawn(this_cooldown) - // Alpha In - button.color = rgb(255,255,255,255) - button.alpha = 255 - -/datum/action/bloodsucker/proc/CheckCanDeactivate(display_error) +/datum/action/cooldown/bloodsucker/proc/CheckCanDeactivate(display_error) return TRUE -/datum/action/bloodsucker/UpdateButtonIcon(force = FALSE) +/datum/action/cooldown/bloodsucker/UpdateButton(atom/movable/screen/movable/action_button/button, force = FALSE) background_icon_state = active? background_icon_state_on : background_icon_state_off - ..()//UpdateButtonIcon() + ..()//UpdateButton() - -/datum/action/bloodsucker/proc/PayCost() +/datum/action/cooldown/bloodsucker/proc/PayCost() // owner for actions is the mob, not mind. var/mob/living/L = owner L.blood_volume -= bloodcost -/datum/action/bloodsucker/proc/ActivatePower() +/datum/action/cooldown/bloodsucker/proc/ActivatePower() -/datum/action/bloodsucker/proc/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/proc/DeactivatePower(mob/living/user = owner, mob/living/target) active = FALSE - UpdateButtonIcon() + UpdateButtons() StartCooldown() -/datum/action/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. +/datum/action/cooldown/bloodsucker/proc/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. return active && user && (!warn_constant_cost || user.blood_volume > 0) -/datum/action/bloodsucker/proc/RemoveAfterUse() +/datum/action/cooldown/bloodsucker/proc/RemoveAfterUse() // Un-Learn Me! (GO HOME var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) if (istype(bloodsuckerdatum)) bloodsuckerdatum.powers -= src Remove(owner) -/datum/action/bloodsucker/proc/Upgrade() +/datum/action/cooldown/bloodsucker/proc/Upgrade() level_current ++ -/////////////////////////////////// PASSIVE POWERS /////////////////////////////////// - -// New Type: Passive (Always on, no button) -/datum/action/bloodsucker/passive - -/datum/action/bloodsucker/passive/New() - // REMOVED: DO NOTHBING! - ..() - // Don't Display Button! (it doesn't do anything anyhow) - button.screen_loc = DEFAULT_BLOODSPELLS - button.moved = DEFAULT_BLOODSPELLS - button.ordered = FALSE - -/datum/action/bloodsucker/passive/Destroy() - if(owner) - Remove(owner) - target = null - return ..() - /////////////////////////////////// TARGETTED POWERS /////////////////////////////////// -/datum/action/bloodsucker/targeted +/datum/action/cooldown/bloodsucker/targeted // NOTE: All Targeted spells are Toggles! We just don't bother checking here. var/target_range = 99 var/message_Trigger = "Select a target." @@ -204,7 +172,7 @@ var/power_in_use = FALSE // Is this power LOCKED due to being used? -/datum/action/bloodsucker/targeted/New(Target) +/datum/action/cooldown/bloodsucker/targeted/New(Target) desc += "
\[Targeted Power\]" // Modify description to add notice that this is aimed. ..() // Create Proc Holder for intercepting clicks @@ -212,7 +180,7 @@ bs_proc_holder.linked_power = src // Click power: Begin Aim -/datum/action/bloodsucker/targeted/Trigger() +/datum/action/cooldown/bloodsucker/targeted/Trigger() if(active && CheckCanDeactivate(TRUE)) DeactivateRangedAbility() DeactivatePower() @@ -220,7 +188,7 @@ if(!CheckCanPayCost(TRUE) || !CheckCanUse(TRUE)) return active = !active - UpdateButtonIcon() + UpdateButtons() // Create & Link Targeting Proc var/mob/living/L = owner if(L.ranged_ability) @@ -230,7 +198,7 @@ if(message_Trigger != "") to_chat(owner, "[message_Trigger]") -/datum/action/bloodsucker/targeted/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/CheckCanUse(display_error) . = ..() if(!.) return @@ -238,21 +206,21 @@ return FALSE // doesn't let you remove powers if you're not there. So, let's just cancel the power entirely. return TRUE -/datum/action/bloodsucker/targeted/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/targeted/DeactivatePower(mob/living/user = owner, mob/living/target) // Don't run ..(), we don't want to engage the cooldown until we USE this power! active = FALSE - UpdateButtonIcon() + UpdateButtons() -/datum/action/bloodsucker/targeted/proc/DeactivateRangedAbility() +/datum/action/cooldown/bloodsucker/targeted/proc/DeactivateRangedAbility() // Only Turned off when CLICK is disabled...aka, when you successfully clicked (or bs_proc_holder.remove_ranged_ability() // Check if target is VALID (wall, turf, or character?) -/datum/action/bloodsucker/targeted/proc/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/proc/CheckValidTarget(atom/A) return FALSE // FALSE targets nothing. // Check if valid target meets conditions -/datum/action/bloodsucker/targeted/proc/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/proc/CheckCanTarget(atom/A, display_error) // Out of Range if(!(A in view(target_range, owner))) if(display_error && target_range > 1) // Only warn for range if it's greater than 1. Brawn doesn't need to announce itself. @@ -261,7 +229,7 @@ return istype(A) // Click Target -/datum/action/bloodsucker/targeted/proc/ClickWithPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/proc/ClickWithPower(atom/A) // CANCEL RANGED TARGET check if(power_in_use || !CheckValidTarget(A)) return FALSE @@ -276,21 +244,21 @@ power_in_use = FALSE return TRUE -/datum/action/bloodsucker/targeted/proc/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/proc/FireTargetedPower(atom/A) // Like ActivatePower, but specific to Targeted (and takes an atom input). We don't use ActivatePower for targeted. -/datum/action/bloodsucker/targeted/proc/PowerActivatedSuccessfully() +/datum/action/cooldown/bloodsucker/targeted/proc/PowerActivatedSuccessfully() // The power went off! We now pay the cost of the power. PayCost() DeactivateRangedAbility() DeactivatePower() StartCooldown() // Do AFTER UpdateIcon() inside of DeactivatePower. Otherwise icon just gets wiped. -/datum/action/bloodsucker/targeted/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. +/datum/action/cooldown/bloodsucker/targeted/ContinueActive(mob/living/user, mob/living/target) // Used by loops to make sure this power can stay active. return ..() // Target Proc Holder /obj/effect/proc_holder/bloodsucker - var/datum/action/bloodsucker/targeted/linked_power + var/datum/action/cooldown/bloodsucker/targeted/linked_power /obj/effect/proc_holder/bloodsucker/remove_ranged_ability(msg) ..() diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm index a86cb374d2..88a4b6bb32 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_sunlight.dm @@ -55,8 +55,8 @@ bloodsuckerdatum.warn_sun_locker = FALSE bloodsuckerdatum.warn_sun_burn = FALSE // Remove Dawn Powers - for(var/datum/action/bloodsucker/P in bloodsuckerdatum.powers) - if(istype(P, /datum/action/bloodsucker/gohome)) + for(var/datum/action/cooldown/bloodsucker/P in bloodsuckerdatum.powers) + if(istype(P, /datum/action/cooldown/bloodsucker/gohome)) bloodsuckerdatum.powers -= P P.Remove(M.current) nighttime_duration += 100 //Each day makes the night a minute longer. @@ -149,5 +149,5 @@ if(!istype(M) || !istype(M.current)) continue var/datum/antagonist/bloodsucker/bloodsuckerdatum = M.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) - if(istype(bloodsuckerdatum) && bloodsuckerdatum.lair && !(locate(/datum/action/bloodsucker/gohome) in bloodsuckerdatum.powers)) - bloodsuckerdatum.BuyPower(new /datum/action/bloodsucker/gohome) + if(istype(bloodsuckerdatum) && bloodsuckerdatum.lair && !(locate(/datum/action/cooldown/bloodsucker/gohome) in bloodsuckerdatum.powers)) + bloodsuckerdatum.BuyPower(new /datum/action/cooldown/bloodsucker/gohome) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm index 486ae51117..3edffe9c31 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_ui.dm @@ -14,7 +14,7 @@ dat += "
" // Step One: Decide powers you CAN buy. - for(var/pickedpower in typesof(/datum/action/bloodsucker)) + for(var/pickedpower in typesof(/datum/action/cooldown/bloodsucker)) var/obj/effect/proc_holder/spell/bloodsucker/power = pickedpower // NAME dat += "[power.name]" diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 73625c894d..4044ac9616 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -168,7 +168,7 @@ return fullname -/datum/antagonist/bloodsucker/proc/BuyPower(datum/action/bloodsucker/power)//(obj/effect/proc_holder/spell/power) +/datum/antagonist/bloodsucker/proc/BuyPower(datum/action/cooldown/bloodsucker/power)//(obj/effect/proc_holder/spell/power) powers += power power.Grant(owner.current)// owner.AddSpell(power) @@ -177,9 +177,9 @@ add_hud() update_hud(TRUE) // Set blood value, current rank // Powers - BuyPower(new /datum/action/bloodsucker/feed) - BuyPower(new /datum/action/bloodsucker/masquerade) - BuyPower(new /datum/action/bloodsucker/veil) + BuyPower(new /datum/action/cooldown/bloodsucker/feed) + BuyPower(new /datum/action/cooldown/bloodsucker/masquerade) + BuyPower(new /datum/action/cooldown/bloodsucker/veil) // Traits for(var/T in defaultTraits) ADD_TRAIT(owner.current, T, BLOODSUCKER_TRAIT) @@ -221,7 +221,7 @@ remove_hud() // Powers while(powers.len) - var/datum/action/bloodsucker/power = pick(powers) + var/datum/action/cooldown/bloodsucker/power = pick(powers) powers -= power power.Remove(owner.current) // owner.RemoveSpell(power) @@ -267,7 +267,7 @@ to_chat(owner, "Bloodsucker Tip: If you cannot find or steal a coffin to use, you can build one from wooden planks.
") /datum/antagonist/bloodsucker/proc/LevelUpPowers() - for(var/datum/action/bloodsucker/power in powers) + for(var/datum/action/cooldown/bloodsucker/power in powers) power.level_current ++ /datum/antagonist/bloodsucker/proc/SpendRank() @@ -281,8 +281,8 @@ //TODO: Make this into a radial, or perhaps a tgui next UI // Purchase Power Prompt var/list/options = list() - for(var/pickedpower in typesof(/datum/action/bloodsucker)) - var/datum/action/bloodsucker/power = pickedpower + for(var/pickedpower in typesof(/datum/action/cooldown/bloodsucker)) + var/datum/action/cooldown/bloodsucker/power = pickedpower // If I don't own it, and I'm allowed to buy it. if(!(locate(power) in powers) && initial(power.bloodsucker_can_buy)) options[initial(power.name)] = power // TESTING: After working with TGUI, it seems you can use initial() to view the variables inside a path? @@ -303,7 +303,7 @@ to_chat(owner.current, "You dont have enough blood to thicken your blood, you need [level_bloodcost - L.blood_volume] units more!") return // Buy New Powers - var/datum/action/bloodsucker/P = options[choice] + var/datum/action/cooldown/bloodsucker/P = options[choice] AddBloodVolume(-level_bloodcost) BuyPower(new P) to_chat(owner.current, "You have used [level_bloodcost] units of blood and learned [initial(P.name)]!") diff --git a/code/modules/antagonists/bloodsucker/datum_hunter.dm b/code/modules/antagonists/bloodsucker/datum_hunter.dm index b221a83a60..9c862fe42a 100644 --- a/code/modules/antagonists/bloodsucker/datum_hunter.dm +++ b/code/modules/antagonists/bloodsucker/datum_hunter.dm @@ -26,7 +26,7 @@ //owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer/hunter_edition) // Give Hunter Power - var/datum/action/P = new /datum/action/bloodsucker/trackvamp + var/datum/action/P = new /datum/action/cooldown/bloodsucker/trackvamp P.Grant(owner.current) // Give Hunter Martial Arts @@ -69,7 +69,7 @@ // Take Hunter Power if (owner.current) - for (var/datum/action/bloodsucker/P in owner.current.actions) + for (var/datum/action/cooldown/bloodsucker/P in owner.current.actions) P.Remove(owner.current) // Take Hunter Martial Arts @@ -166,7 +166,7 @@ /* -/datum/action/bloodsucker/trackvamp/ +/datum/action/cooldown/bloodsucker/trackvamp/ name = "Track Monster"//"Cellular Emporium" desc = "Take a moment to look for clues of any nearby monsters.
These creatures are slippery, and often look like the crew." button_icon = 'icons/mob/actions/bloodsucker.dmi' //This is the file for the BACKGROUND icon @@ -177,7 +177,7 @@ cooldown = 300 // 10 ticks, 1 second. bloodcost = 0 -/datum/action/bloodsucker/trackvamp/ActivatePower() +/datum/action/cooldown/bloodsucker/trackvamp/ActivatePower() var/mob/living/user = owner to_chat(user, "You look around, scanning your environment and discerning signs of any filthy, wretched affronts to the natural order.") @@ -192,7 +192,7 @@ // NOTE: DON'T DEACTIVATE! //DeactivatePower() -/datum/action/bloodsucker/trackvamp/proc/display_proximity() +/datum/action/cooldown/bloodsucker/trackvamp/proc/display_proximity() // Pick target var/turf/my_loc = get_turf(owner) //var/list/mob/living/carbon/vamps = list() diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm index 5162897d60..9a2e3a1ae6 100644 --- a/code/modules/antagonists/bloodsucker/datum_vassal.dm +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -38,7 +38,7 @@ // Master Pinpointer owner.current.apply_status_effect(/datum/status_effect/agent_pinpointer/vassal_edition) // Powers - var/datum/action/bloodsucker/vassal/recuperate/new_Recuperate = new () + var/datum/action/cooldown/bloodsucker/vassal/recuperate/new_Recuperate = new () new_Recuperate.Grant(owner.current) powers += new_Recuperate // Give Vassal Objective diff --git a/code/modules/antagonists/bloodsucker/powers/brawn.dm b/code/modules/antagonists/bloodsucker/powers/brawn.dm index db3ce92ec1..25a04d16cc 100644 --- a/code/modules/antagonists/bloodsucker/powers/brawn.dm +++ b/code/modules/antagonists/bloodsucker/powers/brawn.dm @@ -1,11 +1,11 @@ -/datum/action/bloodsucker/targeted/brawn +/datum/action/cooldown/bloodsucker/targeted/brawn name = "Brawn" desc = "Snap restraints with ease, or deal terrible damage with your bare hands." button_icon_state = "power_strength" bloodcost = 10 - cooldown = 90 + cooldown_time = 90 target_range = 1 power_activates_immediately = TRUE message_Trigger = ""//"Whom will you subvert to your will?" @@ -16,7 +16,7 @@ var/upgrade_canLocker = FALSE var/upgrade_canDoor = FALSE -/datum/action/bloodsucker/targeted/brawn/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/brawn/CheckCanUse(display_error) . = ..() if(!.) return @@ -38,10 +38,10 @@ // NOTE: We use . = FALSE so that we can break cuffs AND throw off our attacker in one use! //return TRUE -/datum/action/bloodsucker/targeted/brawn/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/brawn/CheckValidTarget(atom/A) return isliving(A) || istype(A, /obj/machinery/door) -/datum/action/bloodsucker/targeted/brawn/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/brawn/CheckCanTarget(atom/A, display_error) // DEFAULT CHECKS (Distance) if(!..()) // Disable range notice for Brawn. return FALSE @@ -59,7 +59,7 @@ return TRUE return ..() // yes, FALSE! You failed if you got here! BAD TARGET -/datum/action/bloodsucker/targeted/brawn/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/brawn/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. var/mob/living/carbon/target = A var/mob/living/user = owner @@ -97,7 +97,7 @@ D.open(2) // open(2) is like a crowbar or jaws of life. // Target Type: Closet -/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakRestraints() +/datum/action/cooldown/bloodsucker/targeted/brawn/proc/CheckBreakRestraints() if(!iscarbon(owner)) // || !owner.restrained() return FALSE // (NOTE: Just like biodegrade.dm, we only remove one thing per use // @@ -131,7 +131,7 @@ return TRUE return FALSE -/datum/action/bloodsucker/targeted/brawn/proc/CheckEscapePuller() +/datum/action/cooldown/bloodsucker/targeted/brawn/proc/CheckEscapePuller() if(!owner.pulledby)// || owner.pulledby.grab_state <= GRAB_PASSIVE) return FALSE var/mob/M = owner.pulledby @@ -153,7 +153,7 @@ owner.pulledby = null // It's already done, but JUST IN CASE. return TRUE /* Doesnt work -/datum/action/bloodsucker/targeted/brawn/proc/CheckBreakLocker() +/datum/action/cooldown/bloodsucker/targeted/brawn/proc/CheckBreakLocker() if(!istype(owner.loc, /obj/structure/closet)) return FALSE playsound(get_turf(owner), 'sound/machines/airlock_alien_prying.ogg', 40, 1, -1) diff --git a/code/modules/antagonists/bloodsucker/powers/cloak.dm b/code/modules/antagonists/bloodsucker/powers/cloak.dm index 5383e8c1ac..cb3a1e9fcf 100644 --- a/code/modules/antagonists/bloodsucker/powers/cloak.dm +++ b/code/modules/antagonists/bloodsucker/powers/cloak.dm @@ -1,11 +1,11 @@ -/datum/action/bloodsucker/cloak +/datum/action/cooldown/bloodsucker/cloak name = "Cloak of Darkness" desc = "Blend into the shadows and become invisible to the untrained eye. Movement is slowed in brightly lit areas, and you cannot dissapear while mortals watch you." button_icon_state = "power_cloak" bloodcost = 5 - cooldown = 50 + cooldown_time = 50 bloodsucker_can_buy = TRUE amToggle = TRUE warn_constant_cost = TRUE @@ -14,7 +14,7 @@ var/walk_threshold = 0.4 // arbitrary number, to be changed. edit in last commit: this is fine after testing on box station for a bit var/lum -/datum/action/bloodsucker/cloak/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/cloak/CheckCanUse(display_error) . = ..() if(!.) return @@ -24,7 +24,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/cloak/ActivatePower() +/datum/action/cooldown/bloodsucker/cloak/ActivatePower() var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/mob/living/user = owner @@ -52,7 +52,7 @@ sleep(5) // Check every few ticks -/datum/action/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/cloak/ContinueActive(mob/living/user, mob/living/target) if (!..()) return FALSE if(user.stat == !CONSCIOUS) // Must be CONSCIOUS @@ -60,7 +60,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/cloak/DeactivatePower(mob/living/user = owner, mob/living/target) ..() REMOVE_TRAIT(user, TRAIT_NORUNNING, "cloak of darkness") user.alpha = 255 diff --git a/code/modules/antagonists/bloodsucker/powers/feed.dm b/code/modules/antagonists/bloodsucker/powers/feed.dm index a4bdcfee54..b6b3c6be3e 100644 --- a/code/modules/antagonists/bloodsucker/powers/feed.dm +++ b/code/modules/antagonists/bloodsucker/powers/feed.dm @@ -1,12 +1,12 @@ -/datum/action/bloodsucker/feed +/datum/action/cooldown/bloodsucker/feed name = "Feed" desc = "Draw the heartsblood of living victims in your grasp.
None/Passive: Feed silently and unnoticed by your victim.
Aggressive: Subdue your target quickly." button_icon_state = "power_feed" bloodcost = 0 - cooldown = 30 + cooldown_time = 30 amToggle = TRUE bloodsucker_can_buy = TRUE can_be_staked = TRUE @@ -16,7 +16,7 @@ var/mob/living/feed_target // So we can validate more than just the guy we're grappling. var/target_grappled = FALSE // If you started grappled, then ending it will end your Feed. -/datum/action/bloodsucker/feed/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/feed/CheckCanUse(display_error) . = ..() if(!.) return @@ -33,7 +33,7 @@ // DONE! return TRUE -/datum/action/bloodsucker/feed/proc/ValidateTarget(mob/living/target, display_error) // Called twice: validating a subtle victim, or validating your grapple victim. +/datum/action/cooldown/bloodsucker/feed/proc/ValidateTarget(mob/living/target, display_error) // Called twice: validating a subtle victim, or validating your grapple victim. // Bloodsuckers + Animals MUST be grabbed aggressively! if(!owner.pulling || target == owner.pulling && owner.grab_state < GRAB_AGGRESSIVE) // NOTE: It's OKAY that we are checking if(!target) below, AFTER animals here. We want passive check vs animal to warn you first, THEN the standard warning. @@ -76,7 +76,7 @@ return TRUE // If I'm not grabbing someone, find me someone nearby. -/datum/action/bloodsucker/feed/proc/FindMyTarget(display_error) +/datum/action/cooldown/bloodsucker/feed/proc/FindMyTarget(display_error) // Default feed_target = null target_grappled = FALSE @@ -132,7 +132,7 @@ feed_target = pick(targets_valid)//targets[1] return TRUE -/datum/action/bloodsucker/feed/ActivatePower() +/datum/action/cooldown/bloodsucker/feed/ActivatePower() // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up Activate(), so Deactivate() can happen after. var/mob/living/target = feed_target // Stored during CheckCanUse(). Can be a grabbed OR adjecent character. var/mob/living/user = owner @@ -302,16 +302,16 @@ CheckKilledTarget(user,target) -/datum/action/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/feed/proc/CheckKilledTarget(mob/living/user, mob/living/target) // Bad Bloodsucker. You shouldn't do that. if(target && target.stat >= DEAD && ishuman(target)) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "drankkilled", /datum/mood_event/drankkilled) // BAD // in bloodsucker_life.dm -/datum/action/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/feed/ContinueActive(mob/living/user, mob/living/target) return ..() && target && (!target_grappled || user.pulling == target) && blood_sucking_checks(target, TRUE, TRUE) // Active, and still antag, // NOTE: We only care about pulling if target started off that way. Mostly only important for Aggressive feed. -/datum/action/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) +/datum/action/cooldown/bloodsucker/feed/proc/ApplyVictimEffects(mob/living/target) // Bloodsuckers not affected by "the Kiss" of another vampire if(!target.mind || !target.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER)) target.Unconscious(50,0) @@ -320,7 +320,7 @@ if(ishuman(target)) target.adjustStaminaLoss(5, forced = TRUE)// Base Stamina Damage -/datum/action/bloodsucker/feed/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/feed/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // activate = FALSE var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // No longer Feeding diff --git a/code/modules/antagonists/bloodsucker/powers/fortitude.dm b/code/modules/antagonists/bloodsucker/powers/fortitude.dm index 740ec81782..c343270910 100644 --- a/code/modules/antagonists/bloodsucker/powers/fortitude.dm +++ b/code/modules/antagonists/bloodsucker/powers/fortitude.dm @@ -2,12 +2,12 @@ -/datum/action/bloodsucker/fortitude +/datum/action/cooldown/bloodsucker/fortitude name = "Fortitude" desc = "Withstand egregious physical wounds and walk away from attacks that would stun, pierce, and dismember lesser beings. You cannot run while active." button_icon_state = "power_fortitude" bloodcost = 30 - cooldown = 80 + cooldown_time = 80 bloodsucker_can_buy = TRUE amToggle = TRUE warn_constant_cost = TRUE @@ -15,7 +15,7 @@ var/fortitude_resist // So we can raise and lower your brute resist based on what your level_current WAS. -/datum/action/bloodsucker/fortitude/ActivatePower() +/datum/action/cooldown/bloodsucker/fortitude/ActivatePower() var/datum/antagonist/bloodsucker/B = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/mob/living/user = owner to_chat(user, "Your flesh, skin, and muscles become as steel.") @@ -47,8 +47,8 @@ B.AddBloodVolume(-0.5) sleep(20) // Check every few ticks that we haven't disabled this power // Return to Running (if you were before) - -/datum/action/bloodsucker/fortitude/DeactivatePower(mob/living/user = owner, mob/living/target) + +/datum/action/cooldown/bloodsucker/fortitude/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // Restore Traits & Effects REMOVE_TRAIT(user, TRAIT_PIERCEIMMUNE, "fortitude") diff --git a/code/modules/antagonists/bloodsucker/powers/go_home.dm b/code/modules/antagonists/bloodsucker/powers/go_home.dm index a8060ad07e..e78b9089fb 100644 --- a/code/modules/antagonists/bloodsucker/powers/go_home.dm +++ b/code/modules/antagonists/bloodsucker/powers/go_home.dm @@ -1,6 +1,6 @@ -/datum/action/bloodsucker/gohome +/datum/action/cooldown/bloodsucker/gohome name = "Vanishing Act" desc = "As dawn aproaches, disperse into mist and return directly to your Lair.
WARNING: You will drop ALL of your possessions if observed by mortals." button_icon_state = "power_gohome" @@ -8,7 +8,7 @@ background_icon_state_off = "vamp_power_off_oneshot" bloodcost = 100 - cooldown = 99999 // It'll never come back. + cooldown_time = 99999 // It'll never come back. amToggle = FALSE amSingleUse = TRUE @@ -18,7 +18,7 @@ can_be_immobilized = TRUE must_be_concious = FALSE -/datum/action/bloodsucker/gohome/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/gohome/CheckCanUse(display_error) . = ..() if(!.) return @@ -30,12 +30,12 @@ return FALSE return TRUE -/datum/action/bloodsucker/gohome/proc/flicker_lights(var/flicker_range, var/beat_volume) +/datum/action/cooldown/bloodsucker/gohome/proc/flicker_lights(var/flicker_range, var/beat_volume) for(var/obj/machinery/light/L in view(flicker_range, get_turf(owner))) playsound(get_turf(owner), 'sound/effects/singlebeat.ogg', beat_volume, 1) -/datum/action/bloodsucker/gohome/ActivatePower() +/datum/action/cooldown/bloodsucker/gohome/ActivatePower() var/mob/living/carbon/user = owner var/datum/antagonist/bloodsucker/bloodsuckerdatum = owner.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) // IMPORTANT: Check for lair at every step! It might get destroyed. diff --git a/code/modules/antagonists/bloodsucker/powers/haste.dm b/code/modules/antagonists/bloodsucker/powers/haste.dm index 05e2cd0330..6f7ff54749 100644 --- a/code/modules/antagonists/bloodsucker/powers/haste.dm +++ b/code/modules/antagonists/bloodsucker/powers/haste.dm @@ -3,12 +3,12 @@ // Level 2: Dodge Bullets // Level 3: Stun People Passed -/datum/action/bloodsucker/targeted/haste +/datum/action/cooldown/bloodsucker/targeted/haste name = "Immortal Haste" desc = "Dash somewhere with supernatural speed. Those nearby may be knocked away, stunned, or left empty-handed." button_icon_state = "power_speed" bloodcost = 6 - cooldown = 120 + cooldown_time = 120 target_range = 15 power_activates_immediately = TRUE message_Trigger = ""//"Whom will you subvert to your will?" @@ -18,7 +18,7 @@ /// If set, uses this speed in deciseconds instead of world.tick_lag var/speed_override -/datum/action/bloodsucker/targeted/haste/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/haste/CheckCanUse(display_error) . = ..() if(!.) return @@ -33,10 +33,10 @@ return FALSE return TRUE -/datum/action/bloodsucker/targeted/haste/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/haste/CheckValidTarget(atom/A) return isturf(A) || A.loc != owner.loc // Anything will do, if it's not me or my square -/datum/action/bloodsucker/targeted/haste/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/haste/CheckCanTarget(atom/A, display_error) // DEFAULT CHECKS (Distance) if (!..()) return FALSE @@ -45,7 +45,7 @@ // return FALSE return TRUE -/datum/action/bloodsucker/targeted/haste/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/haste/FireTargetedPower(atom/A) // This is a non-async proc to make sure the power is "locked" until this finishes. hit = list() RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_move) @@ -78,11 +78,11 @@ hit = null user.update_mobility() -/datum/action/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/targeted/haste/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // activate = FALSE user.update_mobility() -/datum/action/bloodsucker/targeted/haste/proc/on_move() +/datum/action/cooldown/bloodsucker/targeted/haste/proc/on_move() for(var/mob/living/L in dview(1, get_turf(owner))) if(!hit[L] && (L != owner)) hit[L] = TRUE diff --git a/code/modules/antagonists/bloodsucker/powers/lunge.dm b/code/modules/antagonists/bloodsucker/powers/lunge.dm index db7868fa8a..5cd1a52e39 100644 --- a/code/modules/antagonists/bloodsucker/powers/lunge.dm +++ b/code/modules/antagonists/bloodsucker/powers/lunge.dm @@ -1,25 +1,25 @@ -/datum/action/bloodsucker/lunge +/datum/action/cooldown/bloodsucker/lunge name = "Predatory Lunge" desc = "Prepare the strenght to grapple your prey." button_icon_state = "power_lunge" bloodcost = 10 - cooldown = 30 + cooldown_time = 30 bloodsucker_can_buy = TRUE warn_constant_cost = TRUE amToggle = TRUE var/leap_skill_mod = 5 -/datum/action/bloodsucker/lunge/New() +/datum/action/cooldown/bloodsucker/lunge/New() . = ..() - -/datum/action/bloodsucker/lunge/Destroy() + +/datum/action/cooldown/bloodsucker/lunge/Destroy() . = ..() UnregisterSignal(owner, COMSIG_CARBON_TACKLED) -/datum/action/bloodsucker/lunge/ActivatePower() +/datum/action/cooldown/bloodsucker/lunge/ActivatePower() var/mob/living/carbon/user = owner var/datum/antagonist/bloodsucker/B = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) var/datum/component/tackler/T = user.LoadComponent(/datum/component/tackler) @@ -37,10 +37,10 @@ sleep(5) //Without this, the leap component would get removed too early, causing the normal crash into effects. -/datum/action/bloodsucker/lunge/proc/DelayedDeactivatePower() +/datum/action/cooldown/bloodsucker/lunge/proc/DelayedDeactivatePower() addtimer(CALLBACK(src, .proc/DeactivatePower), 1 SECONDS, TIMER_UNIQUE) -/datum/action/bloodsucker/lunge/DeactivatePower(mob/living/user = owner) +/datum/action/cooldown/bloodsucker/lunge/DeactivatePower(mob/living/user = owner) . = ..() qdel(user.GetComponent(/datum/component/tackler)) UnregisterSignal(user, COMSIG_CARBON_TACKLED) diff --git a/code/modules/antagonists/bloodsucker/powers/masquerade.dm b/code/modules/antagonists/bloodsucker/powers/masquerade.dm index f4ce531ef0..78748a3c80 100644 --- a/code/modules/antagonists/bloodsucker/powers/masquerade.dm +++ b/code/modules/antagonists/bloodsucker/powers/masquerade.dm @@ -16,12 +16,12 @@ // - -/datum/action/bloodsucker/masquerade +/datum/action/cooldown/bloodsucker/masquerade name = "Masquerade" desc = "Feign the vital signs of a mortal, and escape both casual and medical notice as the monster you truly are." button_icon_state = "power_human" bloodcost = 10 - cooldown = 50 + cooldown_time = 50 amToggle = TRUE bloodsucker_can_buy = TRUE warn_constant_cost = TRUE @@ -31,7 +31,7 @@ // NOTE: Firing off vulgar powers disables your Masquerade! -/*/datum/action/bloodsucker/masquerade/CheckCanUse(display_error) +/*/datum/action/cooldown/bloodsucker/masquerade/CheckCanUse(display_error) if(!..(display_error))// DEFAULT CHECKS return FALSE // DONE! @@ -39,7 +39,7 @@ */ -/datum/action/bloodsucker/masquerade/ActivatePower() +/datum/action/cooldown/bloodsucker/masquerade/ActivatePower() var/mob/living/user = owner var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) @@ -78,14 +78,14 @@ sleep(20) // Check every few ticks that we haven't disabled this power -/datum/action/bloodsucker/masquerade/ContinueActive(mob/living/user) +/datum/action/cooldown/bloodsucker/masquerade/ContinueActive(mob/living/user) // Disable if unable to use power anymore. //if (user.stat == DEAD || user.blood_volume <= 0) // not conscious or soft critor uncon, just dead // return FALSE return ..() // Active, and still Antag -/datum/action/bloodsucker/masquerade/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/masquerade/DeactivatePower(mob/living/user = owner, mob/living/target) ..() // activate = FALSE var/datum/antagonist/bloodsucker/bloodsuckerdatum = user.mind.has_antag_datum(ANTAG_DATUM_BLOODSUCKER) diff --git a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm index 25f50d7af4..ba6c4634f5 100644 --- a/code/modules/antagonists/bloodsucker/powers/mesmerize.dm +++ b/code/modules/antagonists/bloodsucker/powers/mesmerize.dm @@ -5,12 +5,12 @@ // FOLLOW: Target follows you, spouting random phrases from their history (or maybe Polly's or NPC's vocab?) // ATTACK: Target finds a nearby non-Bloodsucker victim to attack. -/datum/action/bloodsucker/targeted/mesmerize +/datum/action/cooldown/bloodsucker/targeted/mesmerize name = "Mesmerize" desc = "Dominate the mind of a mortal who can see your eyes." button_icon_state = "power_mez" bloodcost = 30 - cooldown = 300 + cooldown_time = 300 target_range = 2 power_activates_immediately = TRUE message_Trigger = "Whom will you subvert to your will?" @@ -18,7 +18,7 @@ bloodsucker_can_buy = TRUE var/success -/datum/action/bloodsucker/targeted/mesmerize/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/CheckCanUse(display_error) . = ..() if(!.) return @@ -34,10 +34,10 @@ return FALSE return TRUE -/datum/action/bloodsucker/targeted/mesmerize/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/CheckValidTarget(atom/A) return iscarbon(A) -/datum/action/bloodsucker/targeted/mesmerize/CheckCanTarget(atom/A,display_error) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/CheckCanTarget(atom/A,display_error) // Check: Self if(A == owner) return FALSE @@ -88,7 +88,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/targeted/mesmerize/proc/ContinueTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/proc/ContinueTarget(atom/A) var/mob/living/carbon/target = A var/mob/living/L = owner @@ -103,7 +103,7 @@ to_chat(L, "[target] has escaped your gaze!") UnregisterSignal(target, COMSIG_MOVABLE_MOVED) -/datum/action/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. var/mob/living/carbon/target = A var/mob/living/L = owner @@ -118,7 +118,7 @@ // 5 second windup addtimer(CALLBACK(src, .proc/apply_effects, L, target, power_time), 6 SECONDS) -/datum/action/bloodsucker/targeted/mesmerize/proc/apply_effects(aggressor, victim, power_time) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/proc/apply_effects(aggressor, victim, power_time) var/mob/living/carbon/target = victim var/mob/living/L = aggressor if(!success) @@ -135,5 +135,5 @@ to_chat(L, "[target] has snapped out of their trance.") -/datum/action/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/targeted/mesmerize/ContinueActive(mob/living/user, mob/living/target) return ..() && CheckCanUse() && CheckCanTarget(target) diff --git a/code/modules/antagonists/bloodsucker/powers/recuperate.dm b/code/modules/antagonists/bloodsucker/powers/recuperate.dm index 90a2e3ff38..6f6b204299 100644 --- a/code/modules/antagonists/bloodsucker/powers/recuperate.dm +++ b/code/modules/antagonists/bloodsucker/powers/recuperate.dm @@ -1,12 +1,12 @@ -/datum/action/bloodsucker/vassal/recuperate +/datum/action/cooldown/bloodsucker/vassal/recuperate name = "Sanguine Recuperation" desc = "Slowly heal brute damage while active. This process is exhausting, and requires some of your tainted blood." button_icon_state = "power_recup" amToggle = TRUE bloodcost = 5 - cooldown = 100 + cooldown_time = 100 -/datum/action/bloodsucker/vassal/recuperate/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/vassal/recuperate/CheckCanUse(display_error) . = ..() if(!.) return @@ -14,7 +14,7 @@ return FALSE return TRUE -/datum/action/bloodsucker/vassal/recuperate/ActivatePower() +/datum/action/cooldown/bloodsucker/vassal/recuperate/ActivatePower() to_chat(owner, "Your muscles clench and your skin crawls as your master's immortal blood knits your wounds and gives you stamina.") var/mob/living/carbon/C = owner var/mob/living/carbon/human/H @@ -35,5 +35,5 @@ // DONE! //DeactivatePower(owner) -/datum/action/bloodsucker/vassal/recuperate/ContinueActive(mob/living/user, mob/living/target) +/datum/action/cooldown/bloodsucker/vassal/recuperate/ContinueActive(mob/living/user, mob/living/target) return ..() && user.stat <= DEAD && user.blood_volume > 500 diff --git a/code/modules/antagonists/bloodsucker/powers/trespass.dm b/code/modules/antagonists/bloodsucker/powers/trespass.dm index 56b72a562e..9a64fe8cb3 100644 --- a/code/modules/antagonists/bloodsucker/powers/trespass.dm +++ b/code/modules/antagonists/bloodsucker/powers/trespass.dm @@ -1,12 +1,12 @@ -/datum/action/bloodsucker/targeted/trespass +/datum/action/cooldown/bloodsucker/targeted/trespass name = "Trespass" desc = "Become mist and advance two tiles in one direction, ignoring all obstacles except for walls. Useful for skipping past doors and barricades." button_icon_state = "power_tres" bloodcost = 10 - cooldown = 80 + cooldown_time = 80 amToggle = FALSE //target_range = 2 @@ -16,7 +16,7 @@ var/turf/target_turf // We need to decide where we're going based on where we clicked. It's not actually the tile we clicked. -/datum/action/bloodsucker/targeted/trespass/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/targeted/trespass/CheckCanUse(display_error) . = ..() if(!.) return @@ -26,7 +26,7 @@ return TRUE -/datum/action/bloodsucker/targeted/trespass/CheckValidTarget(atom/A) +/datum/action/cooldown/bloodsucker/targeted/trespass/CheckValidTarget(atom/A) // Can't target my tile if(A == get_turf(owner) || get_turf(A) == get_turf(owner)) return FALSE @@ -34,7 +34,7 @@ return TRUE // All we care about is destination. Anything you click is fine. -/datum/action/bloodsucker/targeted/trespass/CheckCanTarget(atom/A, display_error) +/datum/action/cooldown/bloodsucker/targeted/trespass/CheckCanTarget(atom/A, display_error) // NOTE: Do NOT use ..()! We don't want to check distance or anything. // Get clicked tile @@ -60,7 +60,7 @@ return TRUE -/datum/action/bloodsucker/targeted/trespass/FireTargetedPower(atom/A) +/datum/action/cooldown/bloodsucker/targeted/trespass/FireTargetedPower(atom/A) // set waitfor = FALSE <---- DONT DO THIS!We WANT this power to hold up ClickWithPower(), so that we can unlock the power when it's done. // Find target turf, at or below Atom @@ -87,7 +87,7 @@ user.invisibility = INVISIBILITY_MAXIMUM // LOSE CUFFS - + // Wait... sleep(mist_delay / 2) diff --git a/code/modules/antagonists/bloodsucker/powers/veil.dm b/code/modules/antagonists/bloodsucker/powers/veil.dm index b170b9d442..9b04a6f774 100644 --- a/code/modules/antagonists/bloodsucker/powers/veil.dm +++ b/code/modules/antagonists/bloodsucker/powers/veil.dm @@ -1,10 +1,10 @@ -/datum/action/bloodsucker/veil +/datum/action/cooldown/bloodsucker/veil name = "Veil of Many Faces" desc = "Disguise yourself in the illusion of another identity." button_icon_state = "power_veil" bloodcost = 15 - cooldown = 100 + cooldown_time = 100 amToggle = TRUE bloodsucker_can_buy = TRUE warn_constant_cost = TRUE @@ -29,7 +29,7 @@ var/list/prev_features // For lizards and such -/datum/action/bloodsucker/veil/CheckCanUse(display_error) +/datum/action/cooldown/bloodsucker/veil/CheckCanUse(display_error) . = ..() if(!.) return @@ -37,7 +37,7 @@ return TRUE -/datum/action/bloodsucker/veil/ActivatePower() +/datum/action/cooldown/bloodsucker/veil/ActivatePower() cast_effect() // POOF @@ -47,14 +47,14 @@ Disguise_FaceName() -/datum/action/bloodsucker/veil/proc/Disguise_Outfit() +/datum/action/cooldown/bloodsucker/veil/proc/Disguise_Outfit() // Step One: Back up original items -/datum/action/bloodsucker/veil/proc/Disguise_FaceName() +/datum/action/cooldown/bloodsucker/veil/proc/Disguise_FaceName() // Change Name/Voice var/mob/living/carbon/human/H = owner @@ -112,7 +112,7 @@ sleep(50) -/datum/action/bloodsucker/veil/DeactivatePower(mob/living/user = owner, mob/living/target) +/datum/action/cooldown/bloodsucker/veil/DeactivatePower(mob/living/user = owner, mob/living/target) ..() if (ishuman(user)) var/mob/living/carbon/human/H = user @@ -149,7 +149,7 @@ cast_effect() // POOF // CAST EFFECT // // General effect (poof, splat, etc) when you cast. Doesn't happen automatically! -/datum/action/bloodsucker/veil/proc/cast_effect() +/datum/action/cooldown/bloodsucker/veil/proc/cast_effect() // Effect playsound(get_turf(owner), 'sound/magic/smoke.ogg', 20, 1) var/datum/effect_system/steam_spread/puff = new /datum/effect_system/steam_spread/() diff --git a/code/modules/antagonists/changeling/cellular_emporium.dm b/code/modules/antagonists/changeling/cellular_emporium.dm index d825fa048e..3e48fca317 100644 --- a/code/modules/antagonists/changeling/cellular_emporium.dm +++ b/code/modules/antagonists/changeling/cellular_emporium.dm @@ -80,7 +80,6 @@ /datum/action/innate/cellular_emporium/New(our_target) . = ..() - button.name = name if(istype(our_target, /datum/cellular_emporium)) cellular_emporium = our_target else diff --git a/code/modules/antagonists/changeling/powers/fakedeath.dm b/code/modules/antagonists/changeling/powers/fakedeath.dm index 7ce9da633e..714150fc93 100644 --- a/code/modules/antagonists/changeling/powers/fakedeath.dm +++ b/code/modules/antagonists/changeling/powers/fakedeath.dm @@ -44,7 +44,7 @@ name = "Reviving Stasis" desc = "We fall into a stasis, allowing us to regenerate and trick our enemies. Costs 15 chemicals." button_icon_state = "fake_death" - UpdateButtonIcon() + UpdateButtons() chemical_cost = 15 to_chat(user, "We have revived ourselves.") @@ -56,7 +56,7 @@ name = "Revive" desc = "We arise once more." button_icon_state = "revive" - UpdateButtonIcon() + UpdateButtons() chemical_cost = 0 revive_ready = TRUE diff --git a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm index 3298196de7..c4528b6ebc 100644 --- a/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm +++ b/code/modules/antagonists/clockcult/clock_items/clockwork_slab.dm @@ -411,6 +411,6 @@ Q.name = "[quickbind_slot.name] ([Q.scripture_index])" Q.desc = quickbind_slot.quickbind_desc Q.button_icon_state = quickbind_slot.name - Q.UpdateButtonIcon() + Q.UpdateButtons() if(isliving(loc)) Q.Grant(loc) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 0efde2d3db..93280c4222 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -2,16 +2,11 @@ name = "Prepare Blood Magic" button_icon_state = "carve" desc = "Prepare blood magic by carving runes into your flesh. This rite is most effective with an empowering rune" + default_button_position = DEFAULT_BLOODSPELLS var/list/spells = list() var/channeling = FALSE var/holy_dispel = FALSE -/datum/action/innate/cult/blood_magic/Grant() - ..() - button.screen_loc = DEFAULT_BLOODSPELLS - button.moved = DEFAULT_BLOODSPELLS - button.ordered = FALSE - /datum/action/innate/cult/blood_magic/Remove() for(var/X in spells) qdel(X) @@ -23,15 +18,21 @@ return ..() /datum/action/innate/cult/blood_magic/proc/Positioning() - var/list/screen_loc_split = splittext(button.screen_loc,",") - var/list/screen_loc_X = splittext(screen_loc_split[1],":") - var/list/screen_loc_Y = splittext(screen_loc_split[2],":") - var/pix_X = text2num(screen_loc_X[2]) - for(var/datum/action/innate/cult/blood_spell/B in spells) - if(B.button.locked) - var/order = pix_X+spells.Find(B)*31 - B.button.screen_loc = "[screen_loc_X[1]]:[order],[screen_loc_Y[1]]:[screen_loc_Y[2]]" - B.button.moved = B.button.screen_loc + for(var/datum/hud/hud as anything in viewers) + var/our_view = hud.mymob?.client?.view || "15x15" + var/atom/movable/screen/movable/action_button/button = viewers[hud] + var/position = screen_loc_to_offset(button.screen_loc) + var/spells_iterated = 0 + for(var/datum/action/innate/cult/blood_spell/blood_spell in spells) + spells_iterated += 1 + if(blood_spell.positioned) + continue + var/atom/movable/screen/movable/action_button/moving_button = blood_spell.viewers[hud] + if(!moving_button) + continue + var/our_x = position[1] + spells_iterated * world.icon_size // Offset any new buttons into our list + hud.position_action(moving_button, offset_to_screen_loc(our_x, position[2], our_view)) + blood_spell.positioned = TRUE /datum/action/innate/cult/blood_magic/Activate() if(holy_dispel) @@ -99,6 +100,8 @@ var/base_desc //To allow for updating tooltips var/invocation var/health_cost = 0 + /// Have we already been positioned into our starting location? + var/positioned = FALSE /datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM) if(health_cost) @@ -106,9 +109,7 @@ base_desc = desc desc += "
Has [charges] use\s remaining." all_magic = BM - ..() - button.locked = TRUE - button.ordered = FALSE + return ..() /datum/action/innate/cult/blood_spell/Remove() if(all_magic) @@ -273,7 +274,7 @@ attached_action.charges-- attached_action.desc = attached_action.base_desc attached_action.desc += "
Has [attached_action.charges] use\s remaining." - attached_action.UpdateButtonIcon() + attached_action.UpdateButtons() if(attached_action.charges <= 0) remove_ranged_ability("You have exhausted the spell's power!") qdel(src) @@ -325,7 +326,7 @@ qdel(src) desc = base_desc desc += "
Has [charges] use\s remaining." - UpdateButtonIcon() + UpdateButtons() /datum/action/innate/cult/blood_spell/manipulation name = "Blood Rites" @@ -373,7 +374,7 @@ source.charges = uses source.desc = source.base_desc source.desc += "
Has [uses] use\s remaining." - source.UpdateButtonIcon() + source.UpdateButtons() ..() /obj/item/melee/blood_magic/attack_self(mob/living/user) @@ -400,7 +401,7 @@ else if(source) source.desc = source.base_desc source.desc += "
Has [uses] use\s remaining." - source.UpdateButtonIcon() + source.UpdateButtons() //Stun /obj/item/melee/blood_magic/stun diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index a522285210..4d15654411 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -795,14 +795,13 @@ desc = "Call the blood spear back to your hand!" background_icon_state = "bg_demon" button_icon_state = "bloodspear" + default_button_position = "6:157,4:-2" var/obj/item/cult_spear/spear var/cooldown = 0 /datum/action/innate/cult/spear/Grant(mob/user, obj/blood_spear) . = ..() spear = blood_spear - button.screen_loc = "6:157,4:-2" - button.moved = "6:157,4:-2" /datum/action/innate/cult/spear/Activate() if(owner == spear.loc || cooldown > world.time) diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm index 885921a944..4eee03303d 100644 --- a/code/modules/antagonists/revenant/revenant_abilities.dm +++ b/code/modules/antagonists/revenant/revenant_abilities.dm @@ -176,7 +176,7 @@ user.reveal(reveal) user.stun(stun) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() return TRUE //Overload Light: Breaks a light that's online and sends out lightning bolts to all nearby people. diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index e5fa38a415..a7ed574c87 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -33,9 +33,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( /datum/action/innate/ai/New() ..() - if(uses > 1) - desc = "[desc] It has [uses] use\s remaining." - button.desc = desc + desc = "[desc] It has [uses] use\s remaining." /datum/action/innate/ai/Grant(mob/living/L) . = ..() @@ -63,7 +61,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!silent) to_chat(owner, "[name] now has [uses] use[uses > 1 ? "s" : ""] remaining.") desc = "[initial(desc)] It has [uses] use\s remaining." - UpdateButtonIcon() + UpdateButtons() return if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway! to_chat(owner, "[name] has run out of uses!") @@ -92,7 +90,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( if(!silent) to_chat(owner, "[name] now has [uses] use[uses > 1 ? "s" : ""] remaining.") desc = "[initial(desc)] It has [uses] use\s remaining." - UpdateButtonIcon() + UpdateButtons() return if(initial(uses) > 1) //no need to tell 'em if it was one-use anyway! to_chat(owner, "[name] has run out of uses!") @@ -203,7 +201,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( else //Adding uses to an existing module action.uses += initial(action.uses) action.desc = "[initial(action.desc)] It has [action.uses] use\s remaining." - action.UpdateButtonIcon() + action.UpdateButtons() temp = "Additional use[action.uses > 1 ? "s" : ""] added to [action.name]!" processing_time -= AM.cost @@ -759,6 +757,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( uses = 3 auto_use_uses = FALSE +/datum/action/innate/ai/blackout/New() + ..() + desc = "[desc] It has [uses] use\s remaining." + /datum/action/innate/ai/blackout/Activate() for(var/obj/machinery/power/apc/apc in GLOB.apcs_list) if(prob(30 * apc.overload)) @@ -768,7 +770,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(owner, "Overcurrent applied to the powernet.") owner.playsound_local(owner, "sparks", 50, 0) adjust_uses(-1) - + if(QDELETED(src) || uses) //Not sure if not having src here would cause a runtime, so it's here to be safe + return + desc = "[initial(desc)] It has [uses] use\s remaining." + UpdateButtons() //Disable Emergency Lights /datum/AI_Module/small/emergency_lights @@ -816,6 +821,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( auto_use_uses = FALSE cooldown_period = 30 +/datum/action/innate/ai/reactivate_cameras/New() + ..() + desc = "[desc] It has [uses] use\s remaining." + /datum/action/innate/ai/reactivate_cameras/Activate() var/fixed_cameras = 0 for(var/V in GLOB.cameranet.cameras) @@ -830,7 +839,10 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( to_chat(owner, "Diagnostic complete! Cameras reactivated: [fixed_cameras]. Reactivations remaining: [uses].") owner.playsound_local(owner, 'sound/items/wirecutter.ogg', 50, 0) adjust_uses(0, TRUE) //Checks the uses remaining - + if(QDELETED(src) || !uses) //Not sure if not having src here would cause a runtime, so it's here to be safe + return + desc = "[initial(desc)] It has [uses] use\s remaining." + UpdateButtons() //Upgrade Camera Network: EMP-proofs all cameras, in addition to giving them X-ray vision. /datum/AI_Module/large/upgrade_cameras diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index c1399ce646..940e8bf622 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -134,16 +134,19 @@ var/obj/item/active_mousedown_item = null ///Used in MouseDrag to preserve the original mouse click parameters var/mouseParams = "" - ///Used in MouseDrag to preserve the last mouse-entered location. - var/mouseLocation = null - ///Used in MouseDrag to preserve the last mouse-entered object. - var/mouseObject = null - var/mouseControlObject = null + ///Used in MouseDrag to preserve the last mouse-entered location. Weakref + var/datum/weakref/mouse_location_ref = null + ///Used in MouseDrag to preserve the last mouse-entered object. Weakref + var/datum/weakref/mouse_object_ref + //Middle-mouse-button click dragtime control for aimbot exploit detection. + var/middragtime = 0 + //Middle-mouse-button clicked object control for aimbot exploit detection. Weakref + var/datum/weakref/middle_drag_atom_ref /// Messages currently seen by this client var/list/seen_messages /// viewsize datum for holding our view size - var/datum/viewData/view_size + var/datum/view_data/view_size /// our current tab var/stat_tab diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 6ca963df73..6036ab6ff1 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -881,11 +881,16 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( click_intercept_time = 0 //Reset and return. Next click should work, but not this one. return click_intercept_time = 0 //Just reset. Let's not keep re-checking forever. - var/list/L = params2list(params) + var/ab = FALSE + var/list/modifiers = params2list(params) - if(L["drag"]) + var/dragged = LAZYACCESS(modifiers, DRAG) + if(dragged && !LAZYACCESS(modifiers, dragged)) //I don't know what's going on here, but I don't trust it return + if (object && IS_WEAKREF_OF(object, middle_drag_atom_ref) && LAZYACCESS(modifiers, LEFT_CLICK)) + ab = max(0, 5 SECONDS-(world.time-middragtime)*0.1) + var/mcl = CONFIG_GET(number/minute_click_limit) if (!holder && !ignore_spam && mcl) var/minute = round(world.time, 600) @@ -901,6 +906,9 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( clicklimiter[ADMINSWARNED_AT] = minute msg += " Administrators have been informed." + if (ab) + log_game("[key_name(src)] is using the middle click aimbot exploit") + message_admins("[ADMIN_LOOKUPFLW(usr)] [ADMIN_KICK(usr)] is using the middle click aimbot exploit") log_click(object, location, control, params, src, "lockout (spam - minute)", TRUE) log_game("[key_name(src)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") message_admins("[ADMIN_LOOKUPFLW(src)] [ADMIN_KICK(usr)] Has hit the per-minute click limit of [mcl] clicks in a given game minute") @@ -929,6 +937,11 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( // so that the visual focus indicator matches reality. winset(src, null, "input.background-color=[COLOR_INPUT_DISABLED]") + else + winset(src, null, "input.focus=true input.background-color=[COLOR_INPUT_ENABLED]") + + SEND_SIGNAL(src, COMSIG_CLIENT_CLICK, object, location, control, params, usr) + ..() /client/proc/add_verbs_from_config() diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index e50539f91d..d6d50c9dbc 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -65,7 +65,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/screentip_pref = SCREENTIP_PREFERENCE_ENABLED var/screentip_color = "#ffd391" var/screentip_images = TRUE - var/buttons_locked = FALSE var/hotkeys = FALSE ///Runechat preference. If true, certain messages will be displayed on the map, not ust on the chat area. Boolean. @@ -1070,8 +1069,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Runechat message char limit: [max_chat_length]
" dat += "See Runechat for non-mobs: [see_chat_non_mob ? "Enabled" : "Disabled"]
" dat += "
" - dat += "Action Buttons: [(buttons_locked) ? "Locked In Place" : "Unlocked"]
" - dat += "
" dat += "PDA Color: [pda_color] Change
" dat += "PDA Style: [pda_style]
" dat += "PDA Reskin: [pda_skin]
" @@ -3001,8 +2998,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) chat_on_map = !chat_on_map if("see_chat_non_mob") see_chat_non_mob = !see_chat_non_mob - if("action_buttons") - buttons_locked = !buttons_locked if("tgui_fancy") tgui_fancy = !tgui_fancy if("outline_enabled") diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 6bb704f8a5..afbaba72cd 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -435,7 +435,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["see_chat_non_mob"] >> see_chat_non_mob S["tgui_fancy"] >> tgui_fancy S["tgui_lock"] >> tgui_lock - S["buttons_locked"] >> buttons_locked S["windowflash"] >> windowflashing S["be_special"] >> be_special @@ -513,7 +512,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car see_chat_non_mob = sanitize_integer(see_chat_non_mob, 0, 1, initial(see_chat_non_mob)) tgui_fancy = sanitize_integer(tgui_fancy, 0, 1, initial(tgui_fancy)) tgui_lock = sanitize_integer(tgui_lock, 0, 1, initial(tgui_lock)) - buttons_locked = sanitize_integer(buttons_locked, 0, 1, initial(buttons_locked)) windowflashing = sanitize_integer(windowflashing, 0, 1, initial(windowflashing)) default_slot = sanitize_integer(default_slot, 1, max_save_slots, initial(default_slot)) toggles = sanitize_integer(toggles, 0, 16777215, initial(toggles)) @@ -626,7 +624,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["see_chat_non_mob"], see_chat_non_mob) WRITE_FILE(S["tgui_fancy"], tgui_fancy) WRITE_FILE(S["tgui_lock"], tgui_lock) - WRITE_FILE(S["buttons_locked"], buttons_locked) WRITE_FILE(S["windowflash"], windowflashing) WRITE_FILE(S["be_special"], be_special) WRITE_FILE(S["default_slot"], default_slot) diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 05ef6f18e0..6d569fb4e0 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -162,8 +162,8 @@ ..() /datum/action/item_action/chameleon/change/proc/initialize_disguises() - if(button) - button.name = "Change [chameleon_name] Appearance" + name = "Change [chameleon_name] Appearance" + UpdateButtons() chameleon_blacklist |= typecacheof(target.type) for(var/V in typesof(chameleon_type)) @@ -209,7 +209,7 @@ update_item(picked_item) var/obj/item/thing = target thing.update_slot_icon() - UpdateButtonIcon() + UpdateButtons() /datum/action/item_action/chameleon/change/proc/update_item(obj/item/picked_item) target.name = initial(picked_item.name) @@ -435,9 +435,9 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/head/chameleon) ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) - togglehatmask_action.UpdateButtonIcon() + togglehatmask_action.UpdateButtons() var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src) - randomise_action.UpdateButtonIcon() + randomise_action.UpdateButtons() CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) name = "gas mask" @@ -489,9 +489,9 @@ CHAMELEON_CLOTHING_DEFINE(/obj/item/clothing/mask/chameleon) ADD_TRAIT(src, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) chameleon_action.random_look() var/datum/action/item_action/chameleon/drone/togglehatmask/togglehatmask_action = new(src) - togglehatmask_action.UpdateButtonIcon() + togglehatmask_action.UpdateButtons() var/datum/action/item_action/chameleon/drone/randomise/randomise_action = new(src) - randomise_action.UpdateButtonIcon() + randomise_action.UpdateButtons() /obj/item/clothing/mask/chameleon/drone/attack_self(mob/user) to_chat(user, "[src] does not have a voice changer.") diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 878b54de38..52bf7c4ccb 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -402,7 +402,7 @@ BLIND // can't see anything C.head_update(src, forced = 1) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() return TRUE /obj/item/clothing/proc/visor_toggling() //handles all the actual toggling of flags diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 013084e38f..395eeaeaa6 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -62,7 +62,7 @@ update_icon() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/glasses/meson/engine/attack_self(mob/user) toggle_mode(user, TRUE) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index ff78b51909..4f370866b3 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -389,7 +389,7 @@ set_light(0) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/head/helmet/durathread name = "makeshift helmet" diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index a2d13822f8..1c9b15b398 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -115,7 +115,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your Clown Mask has now morphed into [choice], all praise the Honkmother!") return TRUE @@ -181,7 +181,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your Mime Mask has now morphed into [choice]!") return TRUE @@ -274,7 +274,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(M, "The Tiki Mask has now changed into the [choice] Mask!") return TRUE diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index f96fe2ac2a..8aead31d2f 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -109,7 +109,7 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your Joy mask now has a [choice] Emotion!") return 1 @@ -475,6 +475,6 @@ user.update_inv_wear_mask() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() to_chat(user, "Your paper mask now has a [choice] symbol!") return 1 diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 726b284632..00da8bf9d8 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -36,7 +36,7 @@ user.update_gravity(user.has_gravity()) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/shoes/magboots/negates_gravity() return clothing_flags & NOSLIP diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 5ec0fad2e6..d3b51cd444 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -91,7 +91,7 @@ if(camera) camera.remove_target_ui() camera.forceMove(user) - teleport_now.UpdateButtonIcon() + teleport_now.UpdateButtons() /obj/item/clothing/suit/space/chronos/proc/chronowalk(atom/location) var/mob/living/carbon/human/user = src.loc @@ -105,7 +105,7 @@ if(camera) camera.remove_target_ui() - teleport_now.UpdateButtonIcon() + teleport_now.UpdateButtons() var/list/nonsafe_slots = list(ITEM_SLOT_BELT, ITEM_SLOT_BACK) var/list/exposed = list() diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index c946002fa2..a1fa2bf42b 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -345,7 +345,7 @@ C.head_update(src, forced = 1) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/head/helmet/space/hardsuit/syndi/proc/toggle_hardsuit_mode(mob/user) //Helmet Toggles Suit Mode if(linkedsuit) @@ -937,7 +937,7 @@ set_light(0) for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/head/helmet/space/hardsuit/lavaknight/update_overlays() . = ..() diff --git a/code/modules/clothing/suits/toggles.dm b/code/modules/clothing/suits/toggles.dm index 25cbf27cf6..bb2b1bde5a 100644 --- a/code/modules/clothing/suits/toggles.dm +++ b/code/modules/clothing/suits/toggles.dm @@ -139,7 +139,7 @@ usr.update_inv_wear_suit() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/clothing/suit/toggle/examine(mob/user) . = ..() diff --git a/code/modules/keybindings/keybind/mob.dm b/code/modules/keybindings/keybind/mob.dm index 15911d831e..d5b8eb1a38 100644 --- a/code/modules/keybindings/keybind/mob.dm +++ b/code/modules/keybindings/keybind/mob.dm @@ -85,6 +85,6 @@ description = "Immediately examine anything you're hovering your mouse over." /datum/keybinding/mob/examine_immediate/down(client/user) - var/atom/A = user.mouseObject + var/atom/A = WEAKREF(user.mouse_object_ref) if(A) A.attempt_examinate(user.mob) diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index a5ea6e1c89..181850d541 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -200,7 +200,7 @@ Doesn't work on other aliens/AI.*/ /obj/effect/proc_holder/alien/neurotoxin/update_icon() action.button_icon_state = "alien_neurotoxin_[active]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/alien/neurotoxin/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) @@ -333,7 +333,7 @@ Doesn't work on other aliens/AI.*/ for(var/X in abilities) var/obj/effect/proc_holder/alien/APH = X if(APH.has_action) - APH.action.UpdateButtonIcon() + APH.action.UpdateButtons() return 1 /mob/living/carbon/alien/adjustPlasma(amount) diff --git a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm index 482268f8f5..177444503b 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm @@ -37,7 +37,7 @@ to_chat(owner, "There's something stuck to your hand, stopping you from transforming!") return if(IsAvailable()) - UpdateButtonIcon() + UpdateButtons() var/mutcolor = owner.get_ability_property(INNATE_ABILITY_SLIME_BLOBFORM, PROPERTY_BLOBFORM_COLOR) || ("#" + H.dna.features["mcolor"]) if(!is_puddle) if(CHECK_MOBILITY(H, MOBILITY_USE)) //if we can use items, we can turn into a puddle @@ -78,7 +78,7 @@ owner.update_antag_overlays() transforming = FALSE - UpdateButtonIcon() + UpdateButtons() else detransform() else @@ -109,4 +109,4 @@ squeak.RemoveComponent() H.regenerate_icons() transforming = FALSE - UpdateButtonIcon() + UpdateButtons() diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index c4be0d3948..60a7e945a3 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -480,9 +480,9 @@ spark_system.start() do_teleport(H, get_turf(H), 12, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) last_teleport = world.time - UpdateButtonIcon() //action icon looks unavailable - sleep(cooldown + 5) - UpdateButtonIcon() //action icon looks available again + UpdateButtons() //action icon looks unavailable + //action icon looks available again + addtimer(CALLBACK(src, .proc/UpdateButtons), cooldown + 5) //honk diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index e8042dfac9..f88de43a3b 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -82,7 +82,7 @@ var/datum/action/innate/ability/regrowth = H.ability_actions[INNATE_ABILITY_LIMB_REGROWTH] if(regrowth) - regrowth.UpdateButtonIcon() + regrowth.UpdateButtons() return FALSE // to let living/handle_blood know that the species is handling blood instead @@ -472,9 +472,9 @@ /datum/species/jelly/luminescent/proc/update_slime_actions() integrate_extract.update_name() - integrate_extract.UpdateButtonIcon() - extract_minor.UpdateButtonIcon() - extract_major.UpdateButtonIcon() + integrate_extract.UpdateButtons() + extract_minor.UpdateButtons() + extract_major.UpdateButtons() /datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity) if(intensity) @@ -514,7 +514,7 @@ name = "Eject Extract" desc = "Eject your current slime extract." -/datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force) +/datum/action/innate/integrate_extract/UpdateButton(atom/movable/screen/movable/action_button/button, status_only, force) if(!species || !species.current_extract) button_icon_state = "slimeconsume" else diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f6a2f1cb38..d8a8d5c471 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -636,7 +636,7 @@ if(mind) for(var/S in mind.spell_list) var/obj/effect/proc_holder/spell/spell = S - spell.updateButtonIcon() + spell.UpdateButton() //proc used to remove all immobilisation effects + reset stamina /mob/living/proc/remove_CC(should_update_mobility = TRUE) diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index 13240b2734..dacfe3a863 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -241,7 +241,7 @@ // before doing anything, check if the user moused over them properly if(!client) return BLOCK_NONE - var/found = attacker == client.mouseObject + var/found = attacker == WEAKREF(client.mouse_object_ref) if(!found) for(var/i in client.moused_over_objects) if(i == object) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index 7d37039fa1..a65e7a71da 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -44,6 +44,9 @@ var/can_repair_constructs = FALSE var/can_repair_self = FALSE var/runetype + var/datum/action/innate/cult/create_rune/our_rune + /// Theme controls color. THEME_CULT is red THEME_WIZARD is purple and THEME_HOLY is blue + var/theme = "cult" var/datum/mind/original_mind /mob/living/simple_animal/hostile/construct/Initialize(mapload) @@ -51,24 +54,24 @@ update_health_hud() var/spellnum = 1 for(var/spell in construct_spells) - var/the_spell = new spell(null) - AddSpell(the_spell) - var/obj/effect/proc_holder/spell/S = mob_spell_list[spellnum] var/pos = 2+spellnum*31 if(construct_spells.len >= 4) pos -= 31*(construct_spells.len - 4) - S.action.button.screen_loc = "6:[pos],4:-2" - S.action.button.moved = "6:[pos],4:-2" + var/obj/effect/proc_holder/spell/the_spell = new spell(null) + the_spell?.action.default_button_position ="6:[pos],4:-2" + AddSpell(the_spell) spellnum++ if(runetype) - var/datum/action/innate/cult/create_rune/CR = new runetype(src) - CR.Grant(src) var/pos = 2+spellnum*31 - CR.button.screen_loc = "6:[pos],4:-2" - CR.button.moved = "6:[pos],4:-2" + our_rune = new runetype(src) + our_rune.default_button_position = "6:[pos],4:-2" // Set the default position to this random position + our_rune.Grant(src) + if(icon_state) + add_overlay("glow_[icon_state]_[theme]") /mob/living/simple_animal/hostile/construct/Destroy() original_mind = null + QDEL_NULL(our_rune) . = ..() /mob/living/simple_animal/hostile/construct/death() diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index 1dedf8cd29..88f25eb5ce 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -143,7 +143,7 @@ var/datum/action/boss/AB = ab if(!boss.client && (!AB.req_statuses || (boss.AIStatus in AB.req_statuses)) && prob(AB.usage_probability) && AB.Trigger()) break - AB.UpdateButtonIcon(TRUE) + AB.UpdateButtons(TRUE) /datum/boss_active_timed_battle/Destroy() diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 23a0d44d56..385d37f5a4 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -336,7 +336,7 @@ if(L.blood_volume && (L.stat != DEAD || !consumed_mobs[L.tag])) //if they're not dead, you can consume them anyway consumed_mobs[L.tag] = TRUE fed++ - lay_eggs.UpdateButtonIcon(TRUE) + lay_eggs.UpdateButtons(TRUE) visible_message("[src] sticks a proboscis into [L] and sucks a viscous substance out.","You suck the nutriment out of [L], feeding you enough to lay a cluster of eggs.") L.death() //you just ate them, they're dead. else @@ -402,7 +402,7 @@ /obj/effect/proc_holder/wrap/update_icon() action.button_icon_state = "wrap_[active]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/wrap/Trigger(mob/living/simple_animal/hostile/poison/giant_spider/nurse/user) if(!istype(user)) @@ -482,7 +482,7 @@ C.poison_per_bite = S.poison_per_bite C.faction = S.faction.Copy() S.fed-- - UpdateButtonIcon(TRUE) + UpdateButtons(TRUE) S.busy = SPIDER_IDLE S.stop_automated_movement = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 1f5cace824..3db1d1892b 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -72,19 +72,48 @@ While using this makes the system rely on OnFire, it still gives options for tim icon_icon = 'icons/mob/actions/actions_elites.dmi' button_icon_state = "" background_icon_state = "bg_default" - var/mob/living/simple_animal/hostile/asteroid/elite/M var/chosen_message var/chosen_attack_num = 0 +/datum/action/innate/elite_attack/CreateButton() + var/atom/movable/screen/movable/action_button/button = ..() + button.maptext = "" + button.maptext_x = 8 + button.maptext_y = 0 + button.maptext_width = 24 + button.maptext_height = 12 + return button + +/datum/action/innate/elite_attack/process() + if(owner == null) + STOP_PROCESSING(SSfastprocess, src) + qdel(src) + return + UpdateButtons() + +/datum/action/innate/elite_attack/UpdateButton(atom/movable/screen/movable/action_button/button, status_only = FALSE, force = FALSE) + . = ..() + if(!.) + return + if(status_only) + return + var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner + var/timeleft = max(elite_owner.ranged_cooldown - world.time, 0) + if(timeleft == 0) + button.maptext = "" + else + button.maptext = "[round(timeleft/10, 0.1)]" + /datum/action/innate/elite_attack/Grant(mob/living/L) if(istype(L, /mob/living/simple_animal/hostile/asteroid/elite)) - M = L + START_PROCESSING(SSfastprocess, src) return ..() return FALSE /datum/action/innate/elite_attack/Activate() - M.chosen_attack = chosen_attack_num - to_chat(M, chosen_message) + var/mob/living/simple_animal/hostile/asteroid/elite/elite_owner = owner + elite_owner.chosen_attack = chosen_attack_num + to_chat(elite_owner, chosen_message) /mob/living/simple_animal/hostile/asteroid/elite/updatehealth() . = ..() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index be03e8a9c9..0f6bd1aee7 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -426,7 +426,7 @@ for(var/obj/item/I in U.held_items) if(istype(I, /obj/item/turret_control)) qdel(I) - UpdateButtonIcon() + UpdateButtons() return else playsound(PE,'sound/mecha/mechmove01.ogg', 50, TRUE) @@ -443,7 +443,7 @@ else //Entries in the list should only ever be items or null, so if it's not an item, we can assume it's an empty hand var/obj/item/turret_control/TC = new /obj/item/turret_control() U.put_in_hands(TC) - UpdateButtonIcon() + UpdateButtons() /obj/item/turret_control diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index a0f98f4046..9efbe1cffb 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -142,7 +142,7 @@ if(fire_select_modes.len > 1) firemode_action = new(src) firemode_action.button_icon_state = "fireselect_[fire_select]" - firemode_action.UpdateButtonIcon() + firemode_action.UpdateButtons() /obj/item/gun/ComponentInitialize() . = ..() @@ -219,7 +219,7 @@ playsound(user, 'sound/weapons/empty.ogg', 100, TRUE) update_appearance() firemode_action.button_icon_state = "fireselect_[fire_select]" - firemode_action.UpdateButtonIcon() + firemode_action.UpdateButtons() return TRUE /obj/item/gun/equipped(mob/living/user, slot) @@ -670,7 +670,7 @@ update_icon() for(var/X in actions) var/datum/action/A = X - A.UpdateButtonIcon() + A.UpdateButtons() /obj/item/gun/update_overlays() . = ..() diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 6f70998834..98de59b00e 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -200,7 +200,9 @@ else P.color = rgb(0, 255, 0) var/turf/curloc = get_turf(src) - var/turf/targloc = get_turf(current_user.client.mouseObject) + + var/atom/target_atom = current_user.client.mouse_object_ref?.resolve() + var/turf/targloc = get_turf(target_atom) if(!istype(targloc)) if(!istype(curloc)) return @@ -293,7 +295,9 @@ process_aim() if(fire_check() && can_trigger_gun(M)) sync_ammo() - do_fire(M.client.mouseObject, M, FALSE, M.client.mouseParams, M.zone_selected) + var/atom/target = M.client.mouse_object_ref?.resolve() + if(target) + afterattack(target, M, FALSE, M.client.mouseParams) stop_aiming() QDEL_LIST(current_tracers) return ..() diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 0aee51bb84..aa90ea470a 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -939,12 +939,10 @@ var/y = text2num(screen_loc_Y[1]) * 32 + text2num(screen_loc_Y[2]) - 32 //Calculate the "resolution" of screen based on client's view and world's icon size. This will work if the user can view more tiles than average. - var/list/screenview = getviewsize(user.client.view) - var/screenviewX = screenview[1] * world.icon_size - var/screenviewY = screenview[2] * world.icon_size + var/list/screenview = view_to_pixels(user.client.view) - var/ox = round(screenviewX/2) - user.client.pixel_x //"origin" x - var/oy = round(screenviewY/2) - user.client.pixel_y //"origin" y + var/ox = round(screenview[1] / 2) - user.client.pixel_x //"origin" x + var/oy = round(screenview[2] / 2) - user.client.pixel_y //"origin" y angle = arctan(y - oy, x - ox) return list(angle, p_x, p_y) diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 4be592b919..68207491a5 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -165,7 +165,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if("holdervar") adjust_var(user, holder_var_type, holder_var_amount) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() return TRUE /obj/effect/proc_holder/spell/proc/charge_check(mob/user, silent = FALSE) @@ -243,7 +243,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if(recharging && charge_type == "recharge" && (charge_counter < charge_max)) charge_counter += 2 //processes 5 times per second instead of 10. if(charge_counter >= charge_max) - action.UpdateButtonIcon() + action.UpdateButtons() charge_counter = charge_max recharging = FALSE @@ -259,7 +259,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th cast(targets,user=user) after_cast(targets) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/proc/before_cast(list/targets) if(overlay) @@ -321,7 +321,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th if("holdervar") adjust_var(user, holder_var_type, -holder_var_amount) if(action) - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types if (!istype(target)) @@ -438,8 +438,8 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th perform(targets,user=user) -/obj/effect/proc_holder/spell/proc/updateButtonIcon(status_only, force) - action.UpdateButtonIcon(status_only, force) +/obj/effect/proc_holder/spell/proc/UpdateButton(atom/movable/screen/movable/action_button/button, status_only, force) + action.UpdateButtons(status_only, force) /obj/effect/proc_holder/spell/targeted/proc/los_check(mob/A,mob/B) //Checks for obstacles from A to B diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index aa2a2e4083..62f65688d9 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -43,7 +43,7 @@ if(!action) return action.button_icon_state = "[base_icon_state][active]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/aimed/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) diff --git a/code/modules/spells/spell_types/pointed/pointed.dm b/code/modules/spells/spell_types/pointed/pointed.dm index 7b942dee27..1c32f04710 100644 --- a/code/modules/spells/spell_types/pointed/pointed.dm +++ b/code/modules/spells/spell_types/pointed/pointed.dm @@ -63,7 +63,7 @@ action.button_icon_state = "[action_icon_state]1" else action.button_icon_state = "[action_icon_state]" - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/pointed/InterceptClickOn(mob/living/caller, params, atom/target) if(..()) diff --git a/code/modules/spells/spell_types/taeclowndo.dm b/code/modules/spells/spell_types/taeclowndo.dm index 9d6d71a89f..3566a36a25 100644 --- a/code/modules/spells/spell_types/taeclowndo.dm +++ b/code/modules/spells/spell_types/taeclowndo.dm @@ -54,7 +54,7 @@ else action.button_icon_state = action_icon_state - action.UpdateButtonIcon() + action.UpdateButtons() return ////////////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index a23e16cf88..4f0ac2964f 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -18,7 +18,7 @@ //Start recharging. attached_hand = null recharging = TRUE - action.UpdateButtonIcon() + action.UpdateButtons() /obj/effect/proc_holder/spell/targeted/touch/cast(list/targets,mob/user = usr) if(!QDELETED(attached_hand)) diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index f41f299439..6f55cb0c46 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -18,10 +18,11 @@ user.transferItemToLoc(tool, target, TRUE) - var/datum/action/item_action/hands_free/activate_pill/P = new(tool) - P.button.name = "Activate [tool.name]" - P.target = tool - P.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it + var/datum/action/item_action/hands_free/activate_pill/pill_action = new(tool) + pill_action.name = "Activate [tool.name]" + pill_action.UpdateButtons() + pill_action.target = tool + pill_action.Grant(target) //The pill never actually goes in an inventory slot, so the owner doesn't inherit actions from it user.visible_message("[user] wedges \the [tool] into [target]'s [parse_zone(target_zone)]!", "You wedge [tool] into [target]'s [parse_zone(target_zone)].") return 1 diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index 01c74122bd..3ca7fd590d 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -87,13 +87,13 @@ Notes: /datum/tooltip/proc/hide() + queueHide = showing ? TRUE : FALSE + if (queueHide) addtimer(CALLBACK(src, .proc/do_hide), 1) else do_hide() - queueHide = showing ? TRUE : FALSE - return TRUE /datum/tooltip/proc/do_hide() diff --git a/code/modules/tooltip/tooltip.html b/code/modules/tooltip/tooltip.html index 2743bc03d5..b66d48d6c6 100644 --- a/code/modules/tooltip/tooltip.html +++ b/code/modules/tooltip/tooltip.html @@ -136,21 +136,29 @@ //alert(realIconSize + ' | ' +tooltip.tileSize + ' | ' + resizeRatio); //DEBUG - //Parse out the tile and cursor locations from params (e.g. "icon-x=32;icon-y=29;screen-loc=3:10,15:29") + const parameters = new Object(); + + //Parse out the contents of params (e.g. "icon-x=32;icon-y=29;screen-loc=3:10,15:29") + //It is worth noting that params is not always ordered in the same way. We therefore need to write the code + //To load their values in independantly of their order var paramsA = tooltip.params.cursor.split(';'); - if (paramsA.length < 3) {return false;} //Sometimes screen-loc is never sent ahaha fuck you byond + for (var i = 0; i < paramsA.length; i++) { + var entry = paramsA[i]; + var nameAndValue = entry.split("="); + parameters[nameAndValue[0]] = nameAndValue[1]; + } + + //Sometimes screen-loc is never sent ahaha fuck you byond + if (!parameters["icon-x"] || !parameters["icon-y"] || !parameters["screen-loc"]) { + return false; + } //icon-x - var iconX = paramsA[0]; - iconX = iconX.split('='); - iconX = parseInt(iconX[1]); + var iconX = parseInt(parameters["icon-x"]); //icon-y - var iconY = paramsA[1]; - iconY = iconY.split('='); - iconY = parseInt(iconY[1]); + var iconY = parseInt(parameters["icon-y"]); //screen-loc - var screenLoc = paramsA[2]; - screenLoc = screenLoc.split('='); - screenLoc = screenLoc[1].split(','); + var screenLoc = parameters["screen-loc"]; + screenLoc = screenLoc.split(','); if (screenLoc.length < 2) {return false;} var left = screenLoc[0]; var top = screenLoc[1]; diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index 36c5f75984..8567e31b07 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -194,7 +194,7 @@ own integrity back to max. Shield is automatically dropped if we run out of powe for(var/occupant in chassis.occupants) var/datum/action/button = chassis.occupant_actions[occupant][/datum/action/vehicle/sealed/mecha/mech_defense_mode] button.button_icon_state = "mech_defense_mode_[chassis.defense_mode ? "on" : "off"]" - button.UpdateButtonIcon() + button.UpdateButtons() set_light(light_range, light_power, light_color) diff --git a/code/modules/vehicles/mecha/mecha_actions.dm b/code/modules/vehicles/mecha/mecha_actions.dm index 09ccaad2c2..976ffea40a 100644 --- a/code/modules/vehicles/mecha/mecha_actions.dm +++ b/code/modules/vehicles/mecha/mecha_actions.dm @@ -37,7 +37,7 @@ button_icon_state = "mech_internals_[chassis.use_internal_tank ? "on" : "off"]" to_chat(chassis.occupants, "[icon2html(chassis, owner)]Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].") chassis.log_message("Now taking air from [chassis.use_internal_tank?"internal airtank":"environment"].", LOG_MECHA) - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_cycle_equip name = "Cycle Equipment" @@ -61,7 +61,7 @@ to_chat(owner, "[icon2html(chassis, owner)]You select [chassis.selected].") send_byjax(chassis.occupants,"exosuit.browser","eq_list",chassis.get_equipment_list()) button_icon_state = "mech_cycle_equip_on" - UpdateButtonIcon() + UpdateButtons() return var/number = 0 for(var/equipment in available_equipment) @@ -77,7 +77,7 @@ to_chat(owner, "[icon2html(chassis, owner)]You switch to [chassis.selected].") button_icon_state = "mech_cycle_equip_on" send_byjax(chassis.occupants,"exosuit.browser","eq_list",chassis.get_equipment_list()) - UpdateButtonIcon() + UpdateButtons() return @@ -100,7 +100,7 @@ chassis.set_light(0) to_chat(owner, "[icon2html(chassis, owner)]Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].") chassis.log_message("Toggled lights [(chassis.mecha_flags & LIGHTS_ON)?"on":"off"].", LOG_MECHA) - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_view_stats name = "View Stats" @@ -140,7 +140,7 @@ for(var/occupant in occupants) var/datum/action/action = LAZYACCESSASSOC(occupant_actions, occupant, /datum/action/vehicle/sealed/mecha/strafe) - action?.UpdateButtonIcon() + action?.UpdateButtons() //////////////////////////////////////// Specific Ability Actions /////////////////////////////////////////////// //Need to be granted by the mech type, Not default abilities. @@ -176,7 +176,7 @@ chassis.movedelay = initial(chassis.movedelay) chassis.step_energy_drain = chassis.normal_step_energy_drain to_chat(owner, "[icon2html(chassis, owner)]You disable leg actuators overload.") - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_smoke name = "Smoke" @@ -208,7 +208,7 @@ SEND_SOUND(owner, sound('sound/mecha/imag_enh.ogg',volume=50)) else owner.client.view_size.resetToDefault() //Let's not let this stack shall we? - UpdateButtonIcon() + UpdateButtons() /datum/action/vehicle/sealed/mecha/mech_switch_damtype name = "Reconfigure arm microtool arrays" @@ -231,7 +231,7 @@ chassis.damtype = new_damtype button_icon_state = "mech_damtype_[new_damtype]" playsound(chassis, 'sound/mecha/mechmove01.ogg', 50, TRUE) - UpdateButtonIcon() + UpdateButtons() ///swap seats, for two person mecha /datum/action/vehicle/sealed/mecha/swap_seat @@ -272,4 +272,4 @@ chassis.phasing = !chassis.phasing button_icon_state = "mech_phasing_[chassis.phasing ? "on" : "off"]" to_chat(owner, "[icon2html(chassis, owner)]En":"#f00\">Dis"]abled phasing.") - UpdateButtonIcon() + UpdateButtons() diff --git a/icons/effects/mouse_pointers/screen_drag.dmi b/icons/effects/mouse_pointers/screen_drag.dmi new file mode 100644 index 0000000000000000000000000000000000000000..48e4fce85f7a47f6dbf35267945d64b0cf05a50c GIT binary patch literal 326 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=nN=YXB`&GO$wiq3C7Jno3=9=> zRF4~SH7H21UAXyQM1Gfh6ZaN# Y>3t^de`FVdQ&MBb@0DpvZ?EnA( literal 0 HcmV?d00001 diff --git a/icons/hud/64x16_actions.dmi b/icons/hud/64x16_actions.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ae81ace4d55a2c26a5c12fcfd6dcac28ee029db8 GIT binary patch literal 3404 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 UWbCdm^m_!%jn5jD5}j}V9|Ff!mjD0& literal 0 HcmV?d00001 diff --git a/icons/mob/screen_ai.dmi b/icons/mob/screen_ai.dmi index 8388ea3f806c07006c698401c977fe138e692670..e9360926a4d2d8d53e22641e6e3dfa11f3494e82 100644 GIT binary patch literal 6401 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 literal 2543 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 FV1mRYv{wKC diff --git a/icons/mob/screen_alien.dmi b/icons/mob/screen_alien.dmi index fe23a59dfda82d9dc01562872d2d58131768dc96..b20bfaa405cef58efc95814fefaa39161e564ac5 100644 GIT binary patch literal 18617 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%0Dwa>dy+I}_77}7nUDOE!QUV$ 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 diff --git a/icons/mob/screen_clockwork.dmi b/icons/mob/screen_clockwork.dmi index 268fed40949b429f03e80184d78c14f17ee591a2..0cd15937ed9f37ab37a56aa11305e0f556221cca 100644 GIT binary patch literal 17293 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 literal 15985 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 diff --git a/icons/mob/screen_cyborg.dmi b/icons/mob/screen_cyborg.dmi index 13aa792944dfc5df0dc1bb7b78cd36351eaf8bef..2f976f9d3a8f7ff215c77f7562f7f70444f7314f 100644 GIT binary patch delta 9781 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 WEt@!Xu&4)6KDt_lH_A2ap8g-~%b8pN delta 8943 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 diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 39e8eb4b4568f45bf02c49fa0974c00af0e85c07..0b286f96250ede659cbea343f2c77a3c8a79d82d 100644 GIT binary patch delta 11897 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 d0Iy>(G2aae*m>c1d9Lw delta 10806 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 Dqh0R2 diff --git a/icons/mob/screen_midnight.dmi b/icons/mob/screen_midnight.dmi index 3d895042721041396b8068cea20e064b7cd06ef7..ec583eb485c131af20d63f83c3247990e3f63148 100644 GIT binary patch delta 8702 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 W1`Vq)Xi9DX0000gkG diff --git a/icons/mob/screen_operative.dmi b/icons/mob/screen_operative.dmi index d51022b98a1e46d4a92841146b0ea2a310c60b79..fd3879e42897685b9fdd8c8e70525b28408c6ea2 100644 GIT binary patch literal 29033 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 UUcZ+AJ4sPSLP5Mn)FANx08Z(m-v9sr literal 28168 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 diff --git a/icons/mob/screen_plasmafire.dmi b/icons/mob/screen_plasmafire.dmi index f251b8b167e5d4d514bb18bce09fb7329e83c923..7e1fb8308fbcc71bf7df073334371e5b6cfb57af 100644 GIT binary patch literal 28383 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 literal 27392 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 G81z33OA1c_ diff --git a/icons/mob/screen_retro.dmi b/icons/mob/screen_retro.dmi index e57cefa83e38b879576b0f8d6f76251b867c161a..e7c40db5d302b5a1669e761283eb7516f66543ca 100644 GIT binary patch literal 12699 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 diff --git a/icons/mob/screen_slimecore.dmi b/icons/mob/screen_slimecore.dmi index 01831250b80bcda597cce30b288fb98fee555843..3d335a846f93878930e10a308a4ecd31bb0f98d5 100644 GIT binary patch delta 9928 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 delta 8840 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 KMNUMnLSTaS4Qa0c diff --git a/tgstation.dme b/tgstation.dme index 50ff9eba35..2b8e694dd3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -20,6 +20,7 @@ #include "code\_compile_options.dm" #include "code\world.dm" #include "code\__DEFINES\_auxtools.dm" +#include "code\__DEFINES\_click.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" @@ -160,6 +161,7 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\dcs\signals\signals_action.dm" #include "code\__DEFINES\dcs\signals\signals_global.dm" #include "code\__DEFINES\dcs\signals\signals_hud.dm" #include "code\__DEFINES\dcs\signals\signals_medical.dm" @@ -169,6 +171,7 @@ #include "code\__DEFINES\dcs\signals\signals_screentips.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_main.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_mouse.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_main.dm" @@ -223,6 +226,7 @@ #include "code\__HELPERS\reagents.dm" #include "code\__HELPERS\roundend.dm" #include "code\__HELPERS\sanitize_values.dm" +#include "code\__HELPERS\screen_objs.dm" #include "code\__HELPERS\shell.dm" #include "code\__HELPERS\stat_tracking.dm" #include "code\__HELPERS\text.dm" @@ -281,7 +285,6 @@ #include "code\_onclick\right_item_attack.dm" #include "code\_onclick\right_other_mobs.dm" #include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" #include "code\_onclick\hud\action_button.dm" #include "code\_onclick\hud\ai.dm" #include "code\_onclick\hud\alert.dm"