Files
Bubberstation/code/datums/dash_weapon.dm
MrMelbert 329921639a Rewrites how action buttons icons are generated, makes them layer nicer. Allows observers to see a mob's action buttons. (#71339)
## About The Pull Request

- Rewrites how action button icons are generated.
- Prior, generated an action button icon was fairly simplistic and
didn't allow for many changes. Someone recently added the option for
overlays to be generated over action buttons, but the framework was very
weak.
- Now, action button icon generation is split across multiple procs,
like atom icon updates.
      - The background of action buttons are underlays
- The actual icon of the action button is the icon and icon state of the
action button movable
- The rim / border of the button is an overlay, layered overtop the
button.

- Allows observers to see what action buttons a mob has. They even
update in real time! And no, the observers cannot click on them.

## Why It's Good For The Game

- Runechat text of action buttons are no longer hidden behind the actual
icon. This was very ugly with cooldown actions, as the cooldown text was
hidden behind a lot of spell icons.
- Cuts down on a lot of icon duplication. 
- Gives much finer control over action button icons
- Saves a bit of processing from generating full action button icons
when not necessary. Not implemented in many places, but is in some.


![image](https://user-images.githubusercontent.com/51863163/202816617-342e87e6-2cc6-488e-9af2-4b2053dc3dc6.png)


![image](https://user-images.githubusercontent.com/51863163/202816604-da8d4821-0e2b-45af-b289-7442367f98ce.png)

## Changelog

🆑 Melbert
add: Observers can now see what action buttons an observed mob has. No,
you can't click them. And no it doesn't show EVERY action.
refactor: Refactored how action button icons are generated. Some actions
will now use a colored border when active instead of just turning green.
Cooldown text will also appear on the top layer of actions too. If you
see any funky lookin' icons (namely their borders), let me know.
refactor: Bluespace Golem's teleport action is now a cooldown action.
fix: Construct actions go to the middle of the screen like expected. 
/🆑
2022-12-03 19:01:08 -08:00

87 lines
2.8 KiB
Plaintext

/// Actions that you can use to dash (teleport) to places in view.
/datum/action/innate/dash
name = "Dash"
desc = "Teleport to the targeted location."
button_icon = 'icons/mob/actions/actions_items.dmi'
button_icon_state = "jetboot"
/// How many dash charges do we have?
var/current_charges = 1
/// How many dash charges can we hold?
var/max_charges = 1
/// How long does it take to get a dash charge back?
var/charge_rate = 25 SECONDS
/// What sound do we play on dash?
var/dash_sound = 'sound/magic/blink.ogg'
/// What sound do we play on recharge?
var/recharge_sound = 'sound/magic/charge.ogg'
/// What effect does our beam use?
var/beam_effect = "blur"
/// How long does our beam last?
var/beam_length = 2 SECONDS
/// What effect should we play when we phase in (at the teleport target turf)
var/phasein = /obj/effect/temp_visual/dir_setting/ninja/phase
/// What effect should we play when we phase out (at the source turf)
var/phaseout = /obj/effect/temp_visual/dir_setting/ninja/phase/out
/datum/action/innate/dash/IsAvailable(feedback = FALSE)
. = ..()
if (!.)
return FALSE
if (current_charges <= 0)
if (feedback)
owner.balloon_alert(owner, "no charges!")
return FALSE
return TRUE
/datum/action/innate/dash/Activate()
var/obj/item/dashing_item = target
if(!istype(dashing_item))
return
dashing_item.attack_self(owner) //Used to toggle dash behavior in the dashing item
/// Teleports user to target using do_teleport. Returns TRUE if teleport successful, FALSE otherwise.
/datum/action/innate/dash/proc/teleport(mob/user, atom/target)
if(!IsAvailable(feedback = TRUE))
return FALSE
var/turf/current_turf = get_turf(user)
var/turf/target_turf = get_turf(target)
if(!(target in view(user.client.view, user)))
user.balloon_alert(user, "out of view!")
return FALSE
if(!do_teleport(user, target_turf, no_effects = TRUE))
user.balloon_alert(user, "dash blocked!")
return FALSE
// Note: It's possible do_teleport, for whatever reason,
// caused our owner to be unassigned by this point.
// (Such as dropping our item after landing.)
var/obj/spot_one = new phaseout(current_turf, user.dir)
var/obj/spot_two = new phasein(target_turf, user.dir)
spot_one.Beam(spot_two, beam_effect, time = beam_length)
playsound(target_turf, dash_sound, 25, TRUE)
current_charges--
addtimer(CALLBACK(src, PROC_REF(charge)), charge_rate)
owner?.update_mob_action_buttons()
return TRUE
/// Callback for [/proc/teleport] to increment our charges after use.
/datum/action/innate/dash/proc/charge()
current_charges = clamp(current_charges + 1, 0, max_charges)
var/obj/item/dashing_item = target
if(!istype(dashing_item))
return
if(recharge_sound)
playsound(dashing_item, recharge_sound, 50, TRUE)
if(!owner)
return
owner.update_mob_action_buttons()
dashing_item.balloon_alert(owner, "[current_charges]/[max_charges] dash charges")