mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-26 01:52:29 +00:00
NB. In some cases we go from a more complex image() to a single icon_state string and I assume this works for every case but do not care to check because of the sheer scale of extra fiddly effort. Buyer beware, not my code.
229 lines
5.2 KiB
Plaintext
229 lines
5.2 KiB
Plaintext
#define AB_ITEM 1
|
|
#define AB_SPELL 2
|
|
#define AB_INNATE 3
|
|
#define AB_GENERIC 4
|
|
|
|
#define AB_CHECK_RESTRAINED 1
|
|
#define AB_CHECK_STUNNED 2
|
|
#define AB_CHECK_LYING 4
|
|
#define AB_CHECK_ALIVE 8
|
|
#define AB_CHECK_INSIDE 16
|
|
|
|
|
|
/datum/action
|
|
var/name = "Generic Action"
|
|
var/action_type = AB_ITEM
|
|
var/procname = null
|
|
var/atom/movable/target = null
|
|
var/check_flags = 0
|
|
var/processing = 0
|
|
var/active = 0
|
|
var/obj/screen/movable/action_button/button = null
|
|
var/button_icon = 'icons/mob/actions.dmi'
|
|
var/button_icon_state = "default"
|
|
var/background_icon_state = "bg_default"
|
|
var/mob/living/owner
|
|
|
|
/datum/action/New(var/Target)
|
|
target = Target
|
|
|
|
/datum/action/Destroy()
|
|
if(owner)
|
|
Remove(owner)
|
|
target = null
|
|
QDEL_NULL(button)
|
|
return ..()
|
|
|
|
/datum/action/proc/Grant(mob/living/T)
|
|
if(owner)
|
|
if(owner == T)
|
|
return
|
|
Remove(owner)
|
|
owner = T
|
|
owner.actions.Add(src)
|
|
owner.update_action_buttons()
|
|
return
|
|
|
|
/datum/action/proc/Remove(mob/living/T)
|
|
if(button)
|
|
if(T.client)
|
|
T.client.screen -= button
|
|
QDEL_NULL(button)
|
|
T.actions.Remove(src)
|
|
T.update_action_buttons()
|
|
owner = null
|
|
return
|
|
|
|
/datum/action/proc/Trigger()
|
|
if(!Checks())
|
|
return
|
|
switch(action_type)
|
|
if(AB_ITEM)
|
|
if(target)
|
|
var/obj/item/item = target
|
|
item.ui_action_click()
|
|
//if(AB_SPELL)
|
|
// if(target)
|
|
// var/obj/effect/proc_holder/spell = target
|
|
// spell.Click()
|
|
if(AB_INNATE)
|
|
if(!active)
|
|
Activate()
|
|
else
|
|
Deactivate()
|
|
if(AB_GENERIC)
|
|
if(target && procname)
|
|
call(target,procname)(usr)
|
|
return
|
|
|
|
/datum/action/proc/Activate()
|
|
return
|
|
|
|
/datum/action/proc/Deactivate()
|
|
return
|
|
|
|
/datum/action/process()
|
|
return
|
|
|
|
/datum/action/proc/CheckRemoval(mob/living/user) // 1 if action is no longer valid for this mob and should be removed
|
|
return 0
|
|
|
|
/datum/action/proc/IsAvailable()
|
|
return Checks()
|
|
|
|
/datum/action/proc/Checks()// returns 1 if all checks pass
|
|
if(!owner)
|
|
return 0
|
|
if(check_flags & AB_CHECK_RESTRAINED)
|
|
if(owner.restrained())
|
|
return 0
|
|
if(check_flags & AB_CHECK_STUNNED)
|
|
if(owner.stunned)
|
|
return 0
|
|
if(check_flags & AB_CHECK_LYING)
|
|
if(owner.lying)
|
|
return 0
|
|
if(check_flags & AB_CHECK_ALIVE)
|
|
if(owner.stat)
|
|
return 0
|
|
if(check_flags & AB_CHECK_INSIDE)
|
|
if(!(target in owner))
|
|
return 0
|
|
return 1
|
|
|
|
/datum/action/proc/UpdateName()
|
|
return name
|
|
|
|
/obj/screen/movable/action_button
|
|
var/datum/action/owner
|
|
screen_loc = "WEST,NORTH"
|
|
|
|
/obj/screen/movable/action_button/Click(location,control,params)
|
|
var/list/modifiers = params2list(params)
|
|
if(modifiers["shift"])
|
|
moved = 0
|
|
return 1
|
|
if(!usr.checkClickCooldown())
|
|
return
|
|
owner.Trigger()
|
|
return 1
|
|
|
|
/obj/screen/movable/action_button/proc/UpdateIcon()
|
|
if(!owner)
|
|
return
|
|
icon = owner.button_icon
|
|
icon_state = owner.background_icon_state
|
|
|
|
cut_overlays()
|
|
var/image/img
|
|
if(owner.action_type == AB_ITEM && owner.target)
|
|
var/obj/item/I = owner.target
|
|
img = image(I.icon, src , I.icon_state)
|
|
else if(owner.button_icon && owner.button_icon_state)
|
|
img = image(owner.button_icon,src,owner.button_icon_state)
|
|
img.pixel_x = 0
|
|
img.pixel_y = 0
|
|
add_overlay(img)
|
|
|
|
if(!owner.IsAvailable())
|
|
color = rgb(128,0,0,128)
|
|
else
|
|
color = rgb(255,255,255,255)
|
|
|
|
//Hide/Show Action Buttons ... Button
|
|
/obj/screen/movable/action_button/hide_toggle
|
|
name = "Hide Buttons"
|
|
icon = 'icons/mob/actions.dmi'
|
|
icon_state = "bg_default"
|
|
var/hidden = 0
|
|
|
|
/obj/screen/movable/action_button/hide_toggle/Click()
|
|
usr.hud_used.action_buttons_hidden = !usr.hud_used.action_buttons_hidden
|
|
|
|
hidden = usr.hud_used.action_buttons_hidden
|
|
if(hidden)
|
|
name = "Show Buttons"
|
|
else
|
|
name = "Hide Buttons"
|
|
UpdateIcon()
|
|
usr.update_action_buttons()
|
|
|
|
|
|
/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(var/mob/living/user)
|
|
if(isalien(user))
|
|
icon_state = "bg_alien"
|
|
else
|
|
icon_state = "bg_default"
|
|
UpdateIcon()
|
|
return
|
|
|
|
/obj/screen/movable/action_button/hide_toggle/UpdateIcon()
|
|
cut_overlays()
|
|
var/image/img = image(icon,src,hidden?"show":"hide")
|
|
add_overlay(img)
|
|
return
|
|
|
|
//This is the proc used to update all the action buttons. Properly defined in /mob/living/
|
|
/mob/proc/update_action_buttons()
|
|
return
|
|
|
|
#define AB_WEST_OFFSET 4
|
|
#define AB_NORTH_OFFSET 26
|
|
#define AB_MAX_COLUMNS 10
|
|
|
|
/datum/hud/proc/ButtonNumberToScreenCoords(var/number) // TODO : Make this zero-indexed for readabilty
|
|
var/row = round((number-1)/AB_MAX_COLUMNS)
|
|
var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1
|
|
var/coord_col = "+[col-1]"
|
|
var/coord_col_offset = AB_WEST_OFFSET+2*col
|
|
var/coord_row = "[-1 - row]"
|
|
var/coord_row_offset = AB_NORTH_OFFSET
|
|
return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:[coord_row_offset]"
|
|
|
|
/datum/hud/proc/SetButtonCoords(var/obj/screen/button,var/number)
|
|
var/row = round((number-1)/AB_MAX_COLUMNS)
|
|
var/col = ((number - 1)%(AB_MAX_COLUMNS)) + 1
|
|
var/x_offset = 32*(col-1) + AB_WEST_OFFSET + 2*col
|
|
var/y_offset = -32*(row+1) + AB_NORTH_OFFSET
|
|
|
|
var/matrix/M = matrix()
|
|
M.Translate(x_offset,y_offset)
|
|
button.transform = M
|
|
|
|
//Presets for item actions
|
|
/datum/action/item_action
|
|
check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUNNED|AB_CHECK_LYING|AB_CHECK_ALIVE|AB_CHECK_INSIDE
|
|
|
|
/datum/action/item_action/CheckRemoval(mob/living/user)
|
|
return !(target in user)
|
|
|
|
/datum/action/item_action/hands_free
|
|
check_flags = AB_CHECK_ALIVE|AB_CHECK_INSIDE
|
|
|
|
#undef AB_WEST_OFFSET
|
|
#undef AB_NORTH_OFFSET
|
|
#undef AB_MAX_COLUMNS
|
|
|
|
|
|
/datum/action/innate/
|
|
action_type = AB_INNATE |