From a7ff966a3bb01a62d9600194afe23c88bf51db84 Mon Sep 17 00:00:00 2001 From: Beagle <56142455+BeagleGaming1@users.noreply.github.com> Date: Sun, 24 Dec 2023 19:52:23 -0500 Subject: [PATCH 1/3] initial --- code/__DEFINES/keybinding.dm | 4 +- code/datums/keybinding/yautja.dm | 203 +---------- code/modules/cm_preds/falcon.dm | 42 ++- code/modules/cm_preds/yaut_actions.dm | 327 ++++++++++++++++++ code/modules/cm_preds/yaut_bracers.dm | 105 +++--- code/modules/cm_preds/yaut_hudprocs.dm | 15 + code/modules/cm_preds/yaut_mask.dm | 26 ++ code/modules/cm_preds/yaut_procs.dm | 1 + code/modules/cm_preds/yaut_weapons.dm | 17 + code/modules/cm_tech/hologram.dm | 3 +- .../carbon/human/species/yautja/_species.dm | 100 +----- colonialmarines.dme | 1 + icons/mob/hud/actions.dmi | Bin 23204 -> 22493 bytes icons/mob/hud/actions_yautja.dmi | Bin 0 -> 8580 bytes 14 files changed, 496 insertions(+), 348 deletions(-) create mode 100644 code/modules/cm_preds/yaut_actions.dm create mode 100644 icons/mob/hud/actions_yautja.dmi diff --git a/code/__DEFINES/keybinding.dm b/code/__DEFINES/keybinding.dm index 764282d59765..f4503aeea5d5 100644 --- a/code/__DEFINES/keybinding.dm +++ b/code/__DEFINES/keybinding.dm @@ -170,8 +170,7 @@ #define COMSIG_KB_YAUTJA_BUTCHER "keybinding_yautja_butcher" #define COMSIG_KB_YAUTJA_PRED_BUY "keybinding_yautja_pred_buy" #define COMSIG_KB_YAUTJA_MARK_PANEL "keybinding_yautja_mark_panel" -#define COMSIG_KB_YAUTJA_MARK_FOR_HUNT "keybinding_yautja_mark_for_hunt" -#define COMSIG_KB_YAUTJA_REMOVE_FROM_HUNT "keybinding_yautja_remove_from_hunt" +#define COMSIG_KB_YAUTJA_TOGGLE_MARK_FOR_HUNT "keybinding_yautja_toggle_mark_for_hunt" // Yautja Bracer #define COMSIG_KB_YAUTJA_TOGGLE_NOTIFICATION_SOUND "keybinding_yautja_toggle_notification_sound" @@ -192,6 +191,7 @@ #define COMSIG_KB_YAUTJA_BRACERNAME "keybinding_yautja_bracername" #define COMSIG_KB_YAUTJA_IDCHIP "keybinding_yautja_idchip" #define COMSIG_KB_YAUTJA_LINK_BRACER "keybinding_yautja_link_bracer" +#define COMSIG_KB_YAUTJA_CONTROL_FALCON "keybinding_yautja_control_falcon" //mask #define COMSIG_KB_YAUTJA_MASK_TOGGLE_ZOOM "keybinding_yautja_mask_toggle_zoom" diff --git a/code/datums/keybinding/yautja.dm b/code/datums/keybinding/yautja.dm index 4729db004582..54f776f421ed 100644 --- a/code/datums/keybinding/yautja.dm +++ b/code/datums/keybinding/yautja.dm @@ -30,16 +30,7 @@ classic_keys = list("Unbound") name = "pred_buy" full_name = "Claim equipment" - keybind_signal = COMSIG_KB_YAUTJA_BUTCHER - -/datum/keybinding/yautja/pred_buy/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.pred_buy() + keybind_signal = COMSIG_KB_YAUTJA_PRED_BUY /datum/keybinding/yautja/mark_panel hotkey_keys = list("Unbound") @@ -48,46 +39,12 @@ full_name = "Mark panel" keybind_signal = COMSIG_KB_YAUTJA_MARK_PANEL -/datum/keybinding/yautja/mark_panel/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.mark_panel() - /datum/keybinding/yautja/mark_for_hunt hotkey_keys = list("Unbound") classic_keys = list("Unbound") name = "mark_for_hunt" - full_name = "Mark for hunt" - keybind_signal = COMSIG_KB_YAUTJA_MARK_FOR_HUNT - -/datum/keybinding/yautja/mark_for_hunt/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.mark_for_hunt() - -/datum/keybinding/yautja/remove_from_hunt - hotkey_keys = list("Unbound") - classic_keys = list("Unbound") - name = "remove_from_hunt" - full_name = "Remove from hunt" - keybind_signal = COMSIG_KB_YAUTJA_REMOVE_FROM_HUNT - -/datum/keybinding/yautja/remove_from_hunt/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - if(!isyautja(H)) - return - H.remove_from_hunt() + full_name = "Toggle mark for hunt" + keybind_signal = COMSIG_KB_YAUTJA_TOGGLE_MARK_FOR_HUNT // BRACER SPECIFIC \\ @@ -168,22 +125,6 @@ full_name = "Toggle wristblades" keybind_signal = COMSIG_KB_YAUTJA_WRISTBLADES -/datum/keybinding/yautja/bracer_hunter/wristblades/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.wristblades() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.wristblades() - return TRUE - /datum/keybinding/yautja/bracer_hunter/track_gear hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -214,22 +155,6 @@ full_name = "Toggle cloak" keybind_signal = COMSIG_KB_YAUTJA_CLOAKER -/datum/keybinding/yautja/bracer_hunter/cloaker/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.cloaker() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.cloaker() - return TRUE - /datum/keybinding/yautja/bracer_hunter/caster hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -237,22 +162,6 @@ full_name = "Toggle plasma caster" keybind_signal = COMSIG_KB_YAUTJA_CASTER -/datum/keybinding/yautja/bracer_hunter/caster/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.caster() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.caster() - return TRUE - /datum/keybinding/yautja/bracer_hunter/change_explosion_type hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -283,22 +192,6 @@ full_name = "Self-destruct" keybind_signal = COMSIG_KB_YAUTJA_ACTIVATE_SUICIDE -/datum/keybinding/yautja/bracer_hunter/activate_suicide/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.activate_suicide() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.activate_suicide() - return TRUE - /datum/keybinding/yautja/bracer_hunter/injectors hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -306,21 +199,6 @@ full_name = "Create Stabilising Crystal" keybind_signal = COMSIG_KB_YAUTJA_INJECTORS -/datum/keybinding/yautja/bracer_hunter/injectors/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.injectors() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.injectors() - return TRUE /datum/keybinding/yautja/bracer_hunter/healing_capsule hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -328,22 +206,6 @@ full_name = "Create Healing Capsule" keybind_signal = COMSIG_KB_YAUTJA_CAPSULE -/datum/keybinding/yautja/bracer_hunter/healing_capsule/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.healing_capsule() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.healing_capsule() - return TRUE - /datum/keybinding/yautja/bracer_hunter/call_disc hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -351,22 +213,6 @@ full_name = "Call smart-disc" keybind_signal = COMSIG_KB_YAUTJA_CALL_DISC -/datum/keybinding/yautja/bracer_hunter/call_disc/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.call_disc() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.call_disc() - return TRUE - /datum/keybinding/yautja/bracer_hunter/remove_tracked_item hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -420,22 +266,6 @@ full_name = "Yank combi-stick" keybind_signal = COMSIG_KB_YAUTJA_CALL_COMBI -/datum/keybinding/yautja/bracer_hunter/call_combi/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.call_combi() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.call_combi() - return TRUE - /datum/keybinding/yautja/bracer_hunter/translate hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -443,22 +273,6 @@ full_name = "Translator" keybind_signal = COMSIG_KB_YAUTJA_TRANSLATE -/datum/keybinding/yautja/bracer_hunter/translate/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - - var/obj/item/clothing/gloves/yautja/hunter/gloves = H.gloves - if(istype(gloves)) - gloves.translate() - return TRUE - - var/obj/item/clothing/gloves/yautja/hunter/held = H.get_held_item() - if(istype(held)) - held.translate() - return TRUE - /datum/keybinding/yautja/bracer_hunter/bracername hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -528,6 +342,13 @@ held.link_bracer() return TRUE +/datum/keybinding/yautja/bracer_hunter/control_falcon_drone + hotkey_keys = list("Unbound") + classic_keys = list("Unbound") + name = "control_falcon" + full_name = "Control falcon drone" + keybind_signal = COMSIG_KB_YAUTJA_CONTROL_FALCON + // Misc stuff - mask, teleporter \\ // mask @@ -545,7 +366,7 @@ classic_keys = list("Unbound") name = "toggle_zoom" full_name = "Toggle mask zoom" - keybind_signal = COMSIG_KB_YAUTJA_LINK_BRACER + keybind_signal = COMSIG_KB_YAUTJA_MASK_TOGGLE_ZOOM /datum/keybinding/yautja/mask/toggle_zoom/down(client/user) . = ..() @@ -561,7 +382,7 @@ classic_keys = list("Unbound") name = "togglesight" full_name = "Toggle mask visors" - keybind_signal = COMSIG_KB_YAUTJA_LINK_BRACER + keybind_signal = COMSIG_KB_YAUTJA_MASK_TOGGLESIGHT /datum/keybinding/yautja/mask/togglesight/down(client/user) . = ..() diff --git a/code/modules/cm_preds/falcon.dm b/code/modules/cm_preds/falcon.dm index dc898a2b76ba..8f0ca573f404 100644 --- a/code/modules/cm_preds/falcon.dm +++ b/code/modules/cm_preds/falcon.dm @@ -35,40 +35,57 @@ return "on [t_his] shoulder" return ..() +/obj/item/falcon_drone/equipped(mob/user, slot, silent) + . = ..() + if(!(slot == WEAR_L_EAR || slot == WEAR_R_EAR)) + return + add_verb(user, /obj/item/falcon_drone/proc/can_control_falcon_drone) + var/datum/action/predator_action/bracer/control_falcon_drone/falcon_action = give_action(user, /datum/action/predator_action/bracer/control_falcon_drone) + falcon_action.linked_falcon_drone = src + +/obj/item/falcon_drone/dropped(mob/user) + . = ..() + remove_verb(user, /obj/item/falcon_drone/proc/can_control_falcon_drone) + remove_action(user, /datum/action/predator_action/bracer/control_falcon_drone) + /obj/item/falcon_drone/attack_self(mob/user) ..() - control_falcon_drone() + can_control_falcon_drone() -/obj/item/falcon_drone/verb/control_falcon_drone() +/obj/item/falcon_drone/proc/can_control_falcon_drone() set name = "Control Falcon Drone" set desc = "Activates your falcon drone." set category = "Yautja.Misc" - set src in usr if(usr.is_mob_incapacitated()) return - var/mob/living/carbon/human/H = usr - if(!istype(H) || !HAS_TRAIT(usr, TRAIT_YAUTJA_TECH)) + var/mob/living/carbon/human/human = usr + if(!istype(human) || !HAS_TRAIT(usr, TRAIT_YAUTJA_TECH)) to_chat(usr, SPAN_WARNING("You do not know how to use this.")) return - if(!istype(H.gloves, /obj/item/clothing/gloves/yautja)) + if(!istype(human.gloves, /obj/item/clothing/gloves/yautja)) to_chat(usr, SPAN_WARNING("You need your bracers to control \the [src]!")) return + control_falcon_drone(human, human.gloves) - var/mob/hologram/falcon/hologram = new /mob/hologram/falcon(usr.loc, usr, src, H.gloves) - usr.drop_inv_item_to_loc(src, hologram) +/obj/item/falcon_drone/proc/control_falcon_drone(mob/living/user, obj/item/clothing/gloves/yautja/bracers) + var/mob/hologram/falcon/hologram = new /mob/hologram/falcon(get_turf(user), user, src, bracers) + user.drop_inv_item_to_loc(src, hologram) /mob/hologram/falcon name = "falcon drone" + desc = "An agile drone used by Yautja to survey the hunting grounds." icon = 'icons/obj/items/hunter/pred_gear.dmi' + action_icon_state = "falcon_drone" icon_state = "falcon_drone_active" hud_possible = list(HUNTER_HUD) + motion_sensed = TRUE + initial_leave_button = /datum/action/leave_hologram/falcon + var/obj/item/falcon_drone/parent_drone var/obj/item/clothing/gloves/yautja/owned_bracers - desc = "An agile drone used by Yautja to survey the hunting grounds." - motion_sensed = TRUE /mob/hologram/falcon/Initialize(mapload, mob/M, obj/item/falcon_drone/drone, obj/item/clothing/gloves/yautja/bracers) . = ..() @@ -129,6 +146,11 @@ qdel(src) +/datum/action/leave_hologram/falcon + icon_file = 'icons/mob/hud/actions_yautja.dmi' + button_icon_state = "pred_template" + action_icon_state = "falcon_drone" + /obj/item/trash/falcon_drone name = "destroyed falcon drone" desc = "The wreckage of a Yautja drone." diff --git a/code/modules/cm_preds/yaut_actions.dm b/code/modules/cm_preds/yaut_actions.dm new file mode 100644 index 000000000000..0fa7d0a91698 --- /dev/null +++ b/code/modules/cm_preds/yaut_actions.dm @@ -0,0 +1,327 @@ +#define PREDATOR_ACTION_ON_CLICK 2 //If the action is on click, and not toggled on or off +/datum/action/predator_action + icon_file = 'icons/mob/hud/actions_yautja.dmi' + button_icon_state = "pred_template" + ///If the action requires bracers worn or in-hand + var/require_bracers = FALSE + ///If the action requires a yautja mask to be worn + var/require_mask = FALSE + ///The mob calling the action + var/mob/living/carbon/human/yautja + ///The bracers on the mob (if applicable) + var/obj/item/clothing/gloves/yautja/hunter/bracers + ///The mask on the mob (if applicable) + var/obj/item/clothing/mask/gas/yautja/mask + ///If the action is currently on or in use + var/active = FALSE + +/datum/action/predator_action/can_use_action() + . = ..() + if(!.) + return FALSE + + yautja = null + bracers = null + mask = null + + var/mob/living/carbon/human/mob = owner + if(!isyautja(mob)) + return FALSE + if(mob.is_mob_incapacitated()) + return FALSE + yautja = mob + + if(require_bracers) + if(istype(yautja.get_held_item(), /obj/item/clothing/gloves/yautja/hunter)) + bracers = yautja.get_held_item() + if(istype(yautja.gloves, /obj/item/clothing/gloves/yautja/hunter)) + bracers = yautja.gloves + if(!bracers) + to_chat(yautja, SPAN_WARNING("You don't have bracers.")) + remove_action(yautja, src) + return FALSE + + if(require_mask) + if(!istype(yautja.wear_mask, /obj/item/clothing/mask/gas/yautja)) + to_chat(yautja, SPAN_WARNING("You don't have a clan mask.")) + remove_action(yautja, src) + return FALSE + mask = yautja.wear_mask + + return TRUE + +/datum/action/predator_action/action_activate() + if(!can_use_action()) + return FALSE + +/datum/action/predator_action/update_button_icon(enabled) + . = ..() + if(active == PREDATOR_ACTION_ON_CLICK) + return + + if(isnull(enabled)) + active = !active + else + active = enabled + + button.icon_state = initial(button_icon_state) + if(active) + button.icon_state = "[initial(button_icon_state)]_on" + +/datum/action/predator_action/mark_for_hunt + name = "Mark for Hunt" + action_icon_state = "mark_for_hunt" + listen_signal = COMSIG_KB_YAUTJA_TOGGLE_MARK_FOR_HUNT + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/mark_for_hunt/action_activate() + . = ..() + if(yautja.hunter_data.prey) //You can only hunt one person at a time + yautja.remove_from_hunt() + return + yautja.mark_for_hunt() + +/datum/action/predator_action/mark_panel + name = "Open Mark Panel" + action_icon_state = "mark_panel" + listen_signal = COMSIG_KB_YAUTJA_MARK_PANEL + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/mark_panel/action_activate() + . = ..() + yautja.mark_panel() + +/datum/action/predator_action/claim_equipment + name = "Claim Equipment" + action_icon_state = "claim_equipment" + listen_signal = COMSIG_KB_YAUTJA_PRED_BUY + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/claim_equipment/action_activate() + . = ..() + yautja.pred_buy() + +//Actions that require wearing a mask +/datum/action/predator_action/mask + require_mask = TRUE + +/datum/action/predator_action/mask/zoom + name = "Toggle Mask Zoom" + action_icon_state = "zoom" + listen_signal = COMSIG_KB_YAUTJA_MASK_TOGGLE_ZOOM + +/datum/action/predator_action/mask/zoom/action_activate() + . = ..() + mask.toggle_zoom() + +/datum/action/predator_action/mask/visor + name = "Toggle Mask Visor" + action_icon_state = "visor" + require_bracers = TRUE //Needs bracer power to operate + listen_signal = COMSIG_KB_YAUTJA_MASK_TOGGLESIGHT + +/datum/action/predator_action/mask/visor/action_activate() + . = ..() + mask.togglesight() + +/datum/action/predator_action/mask/visor/update_button_icon(enabled) //Open or close the eye + . = ..() //Overlays + + var/new_icon_state = action_icon_state + if(enabled) + new_icon_state += "_on" + + var/image/new_overlays + new_overlays = image(icon_file, button, new_icon_state) + + button.overlays += new_overlays + +//Actions that require wearing bracers +/datum/action/predator_action/bracer + require_bracers = TRUE + +/datum/action/predator_action/bracer/control_falcon_drone + name = "Control Falcon Drone" + action_icon_state = "falcon_drone" + listen_signal = COMSIG_KB_YAUTJA_CONTROL_FALCON + active = PREDATOR_ACTION_ON_CLICK + ///The falcon drone that will be sent when the action is pressed + var/obj/item/falcon_drone/linked_falcon_drone + +/datum/action/predator_action/bracer/control_falcon_drone/action_activate() + . = ..() + linked_falcon_drone.control_falcon_drone(yautja, bracers) + +/datum/action/predator_action/bracer/wristblade + name = "Toggle Wristblades" + action_icon_state = "wristblade" + listen_signal = COMSIG_KB_YAUTJA_WRISTBLADES + +/datum/action/predator_action/bracer/wristblade/action_activate() + . = ..() + bracers.wristblades() + +/datum/action/predator_action/bracer/combistick + name = "Yank Combi-stick" + action_icon_state = "combi" + listen_signal = COMSIG_KB_YAUTJA_CALL_COMBI + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/combistick/action_activate() + . = ..() + yautja.call_combi_internal(yautja, FALSE) + +/datum/action/predator_action/bracer/smartdisc + name = "Recall nearby smart-discs" + action_icon_state = "smartdisc" + listen_signal = COMSIG_KB_YAUTJA_CALL_DISC + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/smartdisc/action_activate() + . = ..() + bracers.call_disc() + +/datum/action/predator_action/bracer/caster + name = "Toggle Plasma Caster" + action_icon_state = "plasma_caster" + listen_signal = COMSIG_KB_YAUTJA_CASTER + +/datum/action/predator_action/bracer/caster/action_activate() + . = ..() + bracers.caster() + +/datum/action/predator_action/bracer/cloak + name = "Toggle Cloak" + action_icon_state = "cloak" + listen_signal = COMSIG_KB_YAUTJA_CLOAKER + +/datum/action/predator_action/bracer/cloak/action_activate() + . = ..() + bracers.cloaker() + +/datum/action/predator_action/bracer/thwei + name = "Create Stabilizing Crystal" + action_icon_state = "thwei" + listen_signal = COMSIG_KB_YAUTJA_INJECTORS + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/thwei/action_activate() + . = ..() + bracers.injectors() + +/datum/action/predator_action/bracer/capsule + name = "Create Healing Capsule" + action_icon_state = "thwei" + listen_signal = COMSIG_KB_YAUTJA_CAPSULE + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/capsule/action_activate() + . = ..() + bracers.healing_capsule() + +/datum/action/predator_action/bracer/translator + name = "Use Translator" + action_icon_state = "translator" + listen_signal = COMSIG_KB_YAUTJA_TRANSLATE + active = PREDATOR_ACTION_ON_CLICK + +/datum/action/predator_action/bracer/translator/action_activate() + . = ..() + bracers.translate() + +/datum/action/predator_action/bracer/self_destruct + name = "Self Destruct" + action_icon_state = "self_destruct" + listen_signal = COMSIG_KB_YAUTJA_ACTIVATE_SUICIDE + +/datum/action/predator_action/bracer/self_destruct/action_activate() + . = ..() + bracers.activate_suicide() + +#undef PREDATOR_ACTION_ON_CLICK + +//Misc actions +/datum/action/yautja_emote_panel + name = "Open Emote Panel" + button_icon_state = "pred_template" + action_icon_state = "looc_toggle" + +/datum/action/yautja_emote_panel/action_activate() + var/mob/living/carbon/human/human_owner = owner + var/datum/species/yautja/yautja_species = human_owner.species + yautja_species.open_emote_panel() + +/datum/yautja_emote_panel + /// Static dict ("category" : (emotes)) of every yautja emote typepath + var/static/list/yautja_emotes + /// Static list of categories + var/static/list/yautja_categories = list() + /// Panel allows you to spam, so a manual CD is added here + COOLDOWN_DECLARE(panel_emote_cooldown) + +/datum/yautja_emote_panel/New() + if(!length(yautja_emotes)) + var/list/emotes_to_add = list() + for(var/datum/emote/living/carbon/human/yautja/emote as anything in subtypesof(/datum/emote/living/carbon/human/yautja)) + if(!initial(emote.key) || initial(emote.no_panel)) + continue + + if(!(initial(emote.category) in yautja_categories)) + yautja_categories += initial(emote.category) + emotes_to_add += emote + yautja_emotes = emotes_to_add + +/datum/yautja_emote_panel/proc/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "YautjaEmotes") + ui.open() + +/datum/yautja_emote_panel/ui_data(mob/user) + var/list/data = list() + + data["on_cooldown"] = !COOLDOWN_FINISHED(src, panel_emote_cooldown) + + return data + +/datum/yautja_emote_panel/ui_state(mob/user) + return GLOB.conscious_state + +/datum/yautja_emote_panel/ui_static_data(mob/user) + var/list/data = list() + + data["categories"] = yautja_categories + data["emotes"] = list() + + for(var/datum/emote/living/carbon/human/yautja/emote as anything in yautja_emotes) + data["emotes"] += list(list( + "id" = initial(emote.key), + "text" = (initial(emote.override_say) || initial(emote.say_message) || initial(emote.key)), + "category" = initial(emote.category), + "path" = "[emote]", + )) + + return data + +/datum/yautja_emote_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("emote") + var/datum/emote/living/carbon/human/yautja/path + if(!params["emotePath"]) + return FALSE + + path = text2path(params["emotePath"]) + + if(!path || !COOLDOWN_FINISHED(src, panel_emote_cooldown)) + return + + if(!(path in subtypesof(/datum/emote/living/carbon/human/yautja))) + return FALSE + + COOLDOWN_START(src, panel_emote_cooldown, 2.5 SECONDS) + usr.emote(initial(path.key)) + return TRUE diff --git a/code/modules/cm_preds/yaut_bracers.dm b/code/modules/cm_preds/yaut_bracers.dm index df8ab136ea18..0a528e220914 100644 --- a/code/modules/cm_preds/yaut_bracers.dm +++ b/code/modules/cm_preds/yaut_bracers.dm @@ -260,8 +260,6 @@ cloak_alpha = 10 var/exploding = 0 - var/inject_timer = 0 - var/healing_capsule_timer = 0 var/disc_timer = 0 var/explosion_type = 1 //0 is BIG explosion, 1 ONLY gibs the user. var/name_active = TRUE @@ -278,6 +276,9 @@ var/obj/item/weapon/wristblades/left_wristblades var/obj/item/weapon/wristblades/right_wristblades + ///A list of all intrinsic bracer actions + var/list/bracer_actions = list(/datum/action/predator_action/bracer/wristblade, /datum/action/predator_action/bracer/caster, /datum/action/predator_action/bracer/cloak, /datum/action/predator_action/bracer/thwei, /datum/action/predator_action/bracer/capsule, /datum/action/predator_action/bracer/translator, /datum/action/predator_action/bracer/self_destruct, /datum/action/predator_action/bracer/smartdisc) + /obj/item/clothing/gloves/yautja/hunter/Initialize(mapload, new_translator_type, new_caster_material, new_owner_rank) . = ..() if(new_owner_rank) @@ -312,6 +313,10 @@ if(embedded_id.registered_name) embedded_id.set_user_data(user) + for(var/datum/action/action as anything in bracer_actions) + give_action(user, action) + + //Any projectile can decloak a predator. It does defeat one free bullet though. /obj/item/clothing/gloves/yautja/hunter/proc/bullet_hit(mob/living/carbon/human/H, obj/projectile/P) SIGNAL_HANDLER @@ -351,6 +356,10 @@ move_chip_to_bracer() if(HAS_TRAIT(user, TRAIT_CLOAKED)) decloak(user, TRUE) + + for(var/datum/action/action as anything in bracer_actions) + remove_action(user, action) + ..() /obj/item/clothing/gloves/yautja/hunter/on_enter_storage(obj/item/storage/S) @@ -362,8 +371,8 @@ //We use this to activate random verbs for non-Yautja /obj/item/clothing/gloves/yautja/hunter/proc/activate_random_verb(mob/caller) - var/option = rand(1, 11) - //we have options from 1 to 8, but we're giving the user a higher probability of being punished if they already rolled this bad + var/option = rand(1, 10) + //we have options from 1 to 7, but we're giving the user a higher probability of being punished if they already rolled this bad switch(option) if(1) . = wristblades_internal(caller, TRUE) @@ -379,8 +388,6 @@ . = call_disc_internal(caller, TRUE) if(7) . = translate_internal(caller, TRUE) - if(8) - . = call_combi_internal(caller, TRUE) else . = delimb_user(caller) @@ -451,6 +458,12 @@ to_chat(caller, SPAN_NOTICE("You activate your [left_wristblades.plural_name].")) playsound(caller, 'sound/weapons/wristblades_on.ogg', 15, TRUE) + var/datum/action/predator_action/bracer/wristblade/wb_action + for(wb_action as anything in caller.actions) + if(istypestrict(wb_action, /datum/action/predator_action/bracer/wristblade)) + wb_action.update_button_icon(wristblades_deployed) + break + return TRUE /obj/item/clothing/gloves/yautja/hunter/verb/track_gear() @@ -597,6 +610,12 @@ XI.remove_from_hud(M) anim(M.loc,M,'icons/mob/mob.dmi',,"cloak",,M.dir) + var/datum/action/predator_action/bracer/cloak/cloak_action + for(cloak_action as anything in M.actions) + if(istypestrict(cloak_action, /datum/action/predator_action/bracer/cloak)) + cloak_action.update_button_icon(HAS_TRAIT(caller, TRAIT_CLOAKED)) + break + return TRUE /obj/item/clothing/gloves/yautja/hunter/proc/wrapper_fizzle_camouflage() @@ -675,6 +694,12 @@ to_chat(caller, SPAN_NOTICE("You activate your plasma caster. It is in [caster.mode] mode.")) playsound(src, 'sound/weapons/pred_plasmacaster_on.ogg', 15, TRUE) + var/datum/action/predator_action/bracer/caster/caster_action + for(caster_action as anything in caller.actions) + if(istypestrict(caster_action, /datum/action/predator_action/bracer/caster)) + caster_action.update_button_icon(caster_deployed) + break + return TRUE @@ -793,10 +818,19 @@ to_chat(M, SPAN_NOTICE("Your bracers stop beeping.")) message_all_yautja("[M.real_name] has cancelled their bracer's self-destruction sequence.") message_admins("[key_name(M)] has deactivated their Self-Destruct.") + + var/datum/action/predator_action/bracer/self_destruct/sd_action + for(sd_action as anything in M.actions) + if(istypestrict(sd_action, /datum/action/predator_action/bracer/self_destruct)) + sd_action.update_button_icon(exploding) + break + return + if(istype(M.wear_mask,/obj/item/clothing/mask/facehugger) || (M.status_flags & XENO_HOST)) to_chat(M, SPAN_WARNING("Strange...something seems to be interfering with your bracer functions...")) return + if(forced || alert("Detonate the bracers? Are you sure?\n\nNote: If you activate SD for any non-accidental reason during or after a fight, you commit to the SD. By initially activating the SD, you have accepted your impending death to preserve any lost honor.","Explosive Bracers", "Yes", "No") == "Yes") if(M.gloves != src) return @@ -815,10 +849,16 @@ log_attack("[key_name(M)] triggered their predator self-destruct sequence in [A ? "in [A.name]":""]") message_all_yautja("[M.real_name] has triggered their bracer's self-destruction sequence.") explode(M) - return 1 + var/datum/action/predator_action/bracer/self_destruct/sd_action + for(sd_action as anything in M.actions) + if(istypestrict(sd_action, /datum/action/predator_action/bracer/self_destruct)) + sd_action.update_button_icon(exploding) + break + return TRUE +#define YAUTJA_CREATE_CRYSTAL_COOLDOWN "yautja_create_crystal_cooldown" /obj/item/clothing/gloves/yautja/hunter/verb/injectors() set name = "Create Stabilising Crystal" set category = "Yautja.Utility" @@ -826,7 +866,6 @@ set src in usr . = injectors_internal(usr, FALSE) - /obj/item/clothing/gloves/yautja/hunter/proc/injectors_internal(mob/caller, forced = FALSE) if(caller.is_mob_incapacitated()) return FALSE @@ -839,26 +878,22 @@ to_chat(caller, SPAN_WARNING("Your active hand must be empty!")) return FALSE - if(inject_timer) - to_chat(caller, SPAN_WARNING("You recently activated the stabilising crystal. Be patient.")) + if(TIMER_COOLDOWN_CHECK(src, YAUTJA_CREATE_CRYSTAL_COOLDOWN)) + var/remaining_time = DisplayTimeText(S_TIMER_COOLDOWN_TIMELEFT(src, YAUTJA_CREATE_CRYSTAL_COOLDOWN)) + to_chat(caller, SPAN_WARNING("You recently synthesized a stabilising crystal. A new crystal will be available in [remaining_time].")) return FALSE if(!drain_power(caller, 400)) return FALSE - inject_timer = TRUE - addtimer(CALLBACK(src, PROC_REF(injectors_ready)), 2 MINUTES) + S_TIMER_COOLDOWN_START(src, YAUTJA_CREATE_CRYSTAL_COOLDOWN, 2 MINUTES) to_chat(caller, SPAN_NOTICE("You feel a faint hiss and a crystalline injector drops into your hand.")) var/obj/item/reagent_container/hypospray/autoinjector/yautja/O = new(caller) caller.put_in_active_hand(O) playsound(src, 'sound/machines/click.ogg', 15, 1) return TRUE - -/obj/item/clothing/gloves/yautja/hunter/proc/injectors_ready() - if(ismob(loc)) - to_chat(loc, SPAN_NOTICE("Your bracers beep faintly and inform you that a new stabilising crystal is ready to be created.")) - inject_timer = FALSE +#undef YAUTJA_CREATE_CRYSTAL_COOLDOWN /obj/item/clothing/gloves/yautja/hunter/verb/healing_capsule() set name = "Create Healing Capsule" @@ -867,7 +902,7 @@ set src in usr . = healing_capsule_internal(usr, FALSE) - +#define YAUTJA_CREATE_CAPSULE_COOLDOWN "yautja_create_capsule_cooldown" /obj/item/clothing/gloves/yautja/hunter/proc/healing_capsule_internal(mob/caller, forced = FALSE) if(caller.is_mob_incapacitated()) return FALSE @@ -880,26 +915,22 @@ to_chat(caller, SPAN_WARNING("Your active hand must be empty!")) return FALSE - if(healing_capsule_timer) - to_chat(usr, SPAN_WARNING("Your bracer is still generating a new healing capsule!")) + if(TIMER_COOLDOWN_CHECK(src, YAUTJA_CREATE_CAPSULE_COOLDOWN)) + var/remaining_time = DisplayTimeText(S_TIMER_COOLDOWN_TIMELEFT(src, YAUTJA_CREATE_CAPSULE_COOLDOWN)) + to_chat(caller, SPAN_WARNING("You recently synthesized a healing capsule. A new capsule will be available in [remaining_time].")) return FALSE if(!drain_power(caller, 600)) return FALSE - healing_capsule_timer = TRUE - addtimer(CALLBACK(src, PROC_REF(healing_capsule_ready)), 4 MINUTES) + S_TIMER_COOLDOWN_START(src, YAUTJA_CREATE_CAPSULE_COOLDOWN, 4 MINUTES) to_chat(caller, SPAN_NOTICE("You feel your bracer churn as it pops out a healing capsule.")) var/obj/item/tool/surgery/healing_gel/O = new(caller) caller.put_in_active_hand(O) playsound(src, 'sound/machines/click.ogg', 15, 1) return TRUE - -/obj/item/clothing/gloves/yautja/hunter/proc/healing_capsule_ready() - if(ismob(loc)) - to_chat(loc, SPAN_NOTICE("Your bracers beep faintly and inform you that a new healing capsule is ready to be created.")) - healing_capsule_timer = FALSE +#undef YAUTJA_CREATE_CAPSULE_COOLDOWN /obj/item/clothing/gloves/yautja/hunter/verb/call_disc() set name = "Call Smart-Disc" @@ -991,26 +1022,6 @@ to_chat(caller, SPAN_NOTICE("You add \the [untracked_item] to the tracking system.")) return TRUE -/obj/item/clothing/gloves/yautja/hunter/verb/call_combi() - set name = "Yank combi-stick" - set category = "Yautja.Weapons" - set desc = "Yank on your combi-stick's chain, if it's in range. Otherwise... recover it yourself." - set src in usr - . = call_combi_internal(usr, FALSE) - -/obj/item/clothing/gloves/yautja/hunter/proc/call_combi_internal(mob/caller, forced = FALSE) - if(caller.is_mob_incapacitated()) - return FALSE - - . = check_random_function(caller, forced) - if(.) - return - - for(var/datum/effects/tethering/tether in caller.effects_list) - if(istype(tether.tethered.affected_atom, /obj/item/weapon/yautja/combistick)) - var/obj/item/weapon/yautja/combistick/stick = tether.tethered.affected_atom - stick.recall() - /obj/item/clothing/gloves/yautja/hunter/verb/translate() set name = "Translator" set desc = "Emit a message from your bracer to those nearby." diff --git a/code/modules/cm_preds/yaut_hudprocs.dm b/code/modules/cm_preds/yaut_hudprocs.dm index 6131ac135cb7..460cad894c6d 100644 --- a/code/modules/cm_preds/yaut_hudprocs.dm +++ b/code/modules/cm_preds/yaut_hudprocs.dm @@ -442,3 +442,18 @@ T.hud_set_hunter() else to_chat(src, SPAN_YAUTJABOLD("You cannot undo the actions of a living brother or sister!")) + +/mob/living/carbon/human/proc/call_combi() + set name = "Yank combi-stick" + set category = "Yautja.Weapons" + set desc = "Yank on your combi-stick's chain, if it's in range. Otherwise... recover it yourself." + + if(usr.is_mob_incapacitated()) + return FALSE + call_combi_internal(usr) + +/mob/living/carbon/human/proc/call_combi_internal(mob/caller, forced = FALSE) + for(var/datum/effects/tethering/tether in caller.effects_list) + if(istype(tether.tethered.affected_atom, /obj/item/weapon/yautja/combistick)) + var/obj/item/weapon/yautja/combistick/stick = tether.tethered.affected_atom + stick.recall() diff --git a/code/modules/cm_preds/yaut_mask.dm b/code/modules/cm_preds/yaut_mask.dm index 7e8e661e8a5e..d9a28ad5eb6c 100644 --- a/code/modules/cm_preds/yaut_mask.dm +++ b/code/modules/cm_preds/yaut_mask.dm @@ -43,6 +43,8 @@ var/list/mask_huds = list(MOB_HUD_XENO_STATUS, MOB_HUD_HUNTER, MOB_HUD_HUNTER_CLAN, MOB_HUD_MEDICAL_OBSERVER) var/thrall = FALSE //Used to affect icon generation. + ///A list of all intrinsic mask actions + var/list/mask_actions = list(/datum/action/predator_action/mask/zoom, /datum/action/predator_action/mask/visor) /obj/item/clothing/mask/gas/yautja/New(location, mask_number = rand(1,12), armor_material = "ebony", legacy = "None") ..() @@ -115,6 +117,18 @@ return zoom(usr, 11, 12) + update_zoom_action(src, usr) + if(zoom) + RegisterSignal(src, COMSIG_ITEM_UNZOOM, PROC_REF(update_zoom_action)) + return + +/obj/item/clothing/mask/gas/yautja/proc/update_zoom_action(source, mob/living/user) + UnregisterSignal(src, COMSIG_ITEM_UNZOOM) + var/datum/action/predator_action/mask/zoom/zoom_action + for(zoom_action as anything in user.actions) + if(istypestrict(zoom_action, /datum/action/predator_action/mask/zoom)) + zoom_action.update_button_icon(zoom) + break /obj/item/clothing/mask/gas/yautja/verb/togglesight() set name = "Toggle Mask Visors" @@ -165,12 +179,21 @@ playsound(src, 'sound/effects/pred_vision.ogg', 15, 1) user.update_inv_glasses() + var/datum/action/predator_action/mask/visor/visor_action + for(visor_action as anything in user.actions) + if(istypestrict(visor_action, /datum/action/predator_action/mask/visor)) + visor_action.update_button_icon(current_goggles) + break + #undef VISION_MODE_OFF #undef VISION_MODE_NVG /obj/item/clothing/mask/gas/yautja/dropped(mob/living/carbon/human/user) //Clear the gogglors if the helmet is removed. STOP_PROCESSING(SSobj, src) if(istype(user) && user.wear_mask == src) //inventory reference is only cleared after dropped(). + for(var/datum/action/action as anything in mask_actions) + remove_action(user, action) + for(var/listed_hud in mask_huds) var/datum/mob_hud/H = GLOB.huds[listed_hud] H.remove_hud_from(user, src) @@ -185,6 +208,9 @@ /obj/item/clothing/mask/gas/yautja/equipped(mob/living/carbon/human/user, slot) if(slot == WEAR_FACE) + for(var/datum/action/action as anything in mask_actions) + give_action(user, action) + START_PROCESSING(SSobj, src) for(var/listed_hud in mask_huds) var/datum/mob_hud/H = GLOB.huds[listed_hud] diff --git a/code/modules/cm_preds/yaut_procs.dm b/code/modules/cm_preds/yaut_procs.dm index 728e548dfd2f..d8ad1c297a37 100644 --- a/code/modules/cm_preds/yaut_procs.dm +++ b/code/modules/cm_preds/yaut_procs.dm @@ -337,3 +337,4 @@ equip_to_slot_if_possible(new /obj/item/falcon_drone(src.loc), WEAR_R_EAR, disable_warning = TRUE) remove_verb(src, /mob/living/carbon/human/proc/pred_buy) + remove_action(src, /datum/action/predator_action/claim_equipment) diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index 0ea527847d72..f41c54ca5859 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -256,6 +256,8 @@ var/force_storage = MELEE_FORCE_TIER_1 /// Ref to the tether effect when thrown var/datum/effects/tethering/chain + ///The mob the chain is linked to + var/mob/living/linked_to /obj/item/weapon/yautja/combistick/Destroy() cleanup_chain() @@ -278,6 +280,10 @@ return TRUE /obj/item/weapon/yautja/combistick/proc/setup_chain(mob/living/user) + give_action(user, /datum/action/predator_action/bracer/combistick) + add_verb(user, /mob/living/carbon/human/proc/call_combi) + linked_to = user + var/list/tether_effects = apply_tether(user, src, range = 6, resistable = FALSE) chain = tether_effects["tetherer_tether"] RegisterSignal(chain, COMSIG_PARENT_QDELETING, PROC_REF(cleanup_chain)) @@ -293,6 +299,10 @@ /// Clean up the chain, deleting/nulling/unregistering as needed /obj/item/weapon/yautja/combistick/proc/cleanup_chain() SIGNAL_HANDLER + if(linked_to) + remove_action(linked_to, /datum/action/predator_action/bracer/combistick) + remove_verb(linked_to, /mob/living/carbon/human/proc/call_combi) + if(!QDELETED(chain)) QDEL_NULL(chain) @@ -1238,6 +1248,13 @@ /obj/item/weapon/gun/energy/yautja/plasma_caster/dropped(mob/living/carbon/human/M) playsound(M, 'sound/weapons/pred_plasmacaster_off.ogg', 15, 1) to_chat(M, SPAN_NOTICE("You deactivate your plasma caster.")) + + var/datum/action/predator_action/bracer/caster/caster_action + for(caster_action as anything in M.actions) + if(istypestrict(caster_action, /datum/action/predator_action/bracer/caster)) + caster_action.update_button_icon(FALSE) + break + if(source) forceMove(source) source.caster_deployed = FALSE diff --git a/code/modules/cm_tech/hologram.dm b/code/modules/cm_tech/hologram.dm index 3509c0a73a7d..1fcba71a4560 100644 --- a/code/modules/cm_tech/hologram.dm +++ b/code/modules/cm_tech/hologram.dm @@ -14,6 +14,7 @@ GLOBAL_LIST_EMPTY_TYPED(hologram_list, /mob/hologram) var/action_icon_state = "hologram_exit" var/mob/linked_mob + var/initial_leave_button = /datum/action/leave_hologram var/datum/action/leave_hologram/leave_button ///If can be detected on motion detectors. var/motion_sensed = FALSE @@ -45,7 +46,7 @@ GLOBAL_LIST_EMPTY_TYPED(hologram_list, /mob/hologram) name = "[initial(name)] ([M.name])" - leave_button = new(null, action_icon_state) + leave_button = new initial_leave_button(null, action_icon_state) leave_button.linked_hologram = src leave_button.give_to(M) diff --git a/code/modules/mob/living/carbon/human/species/yautja/_species.dm b/code/modules/mob/living/carbon/human/species/yautja/_species.dm index f8937279d8b9..65444ded0732 100644 --- a/code/modules/mob/living/carbon/human/species/yautja/_species.dm +++ b/code/modules/mob/living/carbon/human/species/yautja/_species.dm @@ -211,7 +211,10 @@ limb.time_to_knit = 600 // 1 minute to self heal bone break, time is in tenths of a second hunter.set_languages(list(LANGUAGE_YAUTJA)) + give_action(hunter, /datum/action/predator_action/claim_equipment) give_action(hunter, /datum/action/yautja_emote_panel) + give_action(hunter, /datum/action/predator_action/mark_for_hunt) + give_action(hunter, /datum/action/predator_action/mark_panel) return ..() /datum/species/yautja/get_hairstyle(style) @@ -228,100 +231,3 @@ /datum/species/yautja/open_emote_panel() var/datum/yautja_emote_panel/ui = new(usr) ui.ui_interact(usr) - -/datum/action/yautja_emote_panel - name = "Open Emote Panel" - action_icon_state = "looc_toggle" - -/datum/action/yautja_emote_panel/can_use_action() - . = ..() - if(!.) - return FALSE - - if(!isyautja(owner)) - return FALSE - - return TRUE - -/datum/action/yautja_emote_panel/action_activate() - if(!can_use_action()) - return - - var/mob/living/carbon/human/human_owner = owner - var/datum/species/yautja/yautja_species = human_owner.species - yautja_species.open_emote_panel() - -/datum/yautja_emote_panel - /// Static dict ("category" : (emotes)) of every yautja emote typepath - var/static/list/yautja_emotes - /// Static list of categories - var/static/list/yautja_categories = list() - /// Panel allows you to spam, so a manual CD is added here - COOLDOWN_DECLARE(panel_emote_cooldown) - -/datum/yautja_emote_panel/New() - if(!length(yautja_emotes)) - var/list/emotes_to_add = list() - for(var/datum/emote/living/carbon/human/yautja/emote as anything in subtypesof(/datum/emote/living/carbon/human/yautja)) - if(!initial(emote.key) || initial(emote.no_panel)) - continue - - if(!(initial(emote.category) in yautja_categories)) - yautja_categories += initial(emote.category) - emotes_to_add += emote - yautja_emotes = emotes_to_add - -/datum/yautja_emote_panel/proc/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "YautjaEmotes") - ui.open() - -/datum/yautja_emote_panel/ui_data(mob/user) - var/list/data = list() - - data["on_cooldown"] = !COOLDOWN_FINISHED(src, panel_emote_cooldown) - - return data - -/datum/yautja_emote_panel/ui_state(mob/user) - return GLOB.conscious_state - -/datum/yautja_emote_panel/ui_static_data(mob/user) - var/list/data = list() - - data["categories"] = yautja_categories - data["emotes"] = list() - - for(var/datum/emote/living/carbon/human/yautja/emote as anything in yautja_emotes) - data["emotes"] += list(list( - "id" = initial(emote.key), - "text" = (initial(emote.override_say) || initial(emote.say_message) || initial(emote.key)), - "category" = initial(emote.category), - "path" = "[emote]", - )) - - return data - -/datum/yautja_emote_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) - . = ..() - if(.) - return - - switch(action) - if("emote") - var/datum/emote/living/carbon/human/yautja/path - if(!params["emotePath"]) - return FALSE - - path = text2path(params["emotePath"]) - - if(!path || !COOLDOWN_FINISHED(src, panel_emote_cooldown)) - return - - if(!(path in subtypesof(/datum/emote/living/carbon/human/yautja))) - return FALSE - - COOLDOWN_START(src, panel_emote_cooldown, 2.5 SECONDS) - usr.emote(initial(path.key)) - return TRUE diff --git a/colonialmarines.dme b/colonialmarines.dme index 64f1338244b4..6e0fc02b45bf 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -1613,6 +1613,7 @@ #include "code\modules\cm_preds\smartdisc.dm" #include "code\modules\cm_preds\thrall_items.dm" #include "code\modules\cm_preds\thrall_procs.dm" +#include "code\modules\cm_preds\yaut_actions.dm" #include "code\modules\cm_preds\yaut_bracers.dm" #include "code\modules\cm_preds\yaut_hudprocs.dm" #include "code\modules\cm_preds\yaut_items.dm" diff --git a/icons/mob/hud/actions.dmi b/icons/mob/hud/actions.dmi index 843d38a67b866625484c7b656263dce26be8043c..820da22ea5b1e2349e70aeb683ed3e9c8a778ad7 100644 GIT binary patch literal 22493 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 literal 23204 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 q5>lVQd(+AM>>Y?8X6Q7K|%=yi9xyqX@>40 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 Date: Thu, 28 Dec 2023 12:27:18 -0500 Subject: [PATCH 2/3] fix 1 --- code/datums/keybinding/yautja.dm | 18 ------------------ code/modules/cm_preds/yaut_actions.dm | 4 ++-- 2 files changed, 2 insertions(+), 20 deletions(-) diff --git a/code/datums/keybinding/yautja.dm b/code/datums/keybinding/yautja.dm index 54f776f421ed..c79788df49a3 100644 --- a/code/datums/keybinding/yautja.dm +++ b/code/datums/keybinding/yautja.dm @@ -368,15 +368,6 @@ full_name = "Toggle mask zoom" keybind_signal = COMSIG_KB_YAUTJA_MASK_TOGGLE_ZOOM -/datum/keybinding/yautja/mask/toggle_zoom/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - var/obj/item/clothing/mask/gas/yautja/mask = H.wear_mask - mask.toggle_zoom() - return TRUE - /datum/keybinding/yautja/mask/togglesight hotkey_keys = list("Unbound") classic_keys = list("Unbound") @@ -384,15 +375,6 @@ full_name = "Toggle mask visors" keybind_signal = COMSIG_KB_YAUTJA_MASK_TOGGLESIGHT -/datum/keybinding/yautja/mask/togglesight/down(client/user) - . = ..() - if(.) - return - var/mob/living/carbon/human/H = user.mob - var/obj/item/clothing/mask/gas/yautja/mask = H.wear_mask - mask.togglesight() - return TRUE - // teleporter /datum/keybinding/yautja/tele_loc/can_use(client/user) diff --git a/code/modules/cm_preds/yaut_actions.dm b/code/modules/cm_preds/yaut_actions.dm index 0fa7d0a91698..2c53e32d2dcf 100644 --- a/code/modules/cm_preds/yaut_actions.dm +++ b/code/modules/cm_preds/yaut_actions.dm @@ -32,10 +32,10 @@ yautja = mob if(require_bracers) - if(istype(yautja.get_held_item(), /obj/item/clothing/gloves/yautja/hunter)) - bracers = yautja.get_held_item() if(istype(yautja.gloves, /obj/item/clothing/gloves/yautja/hunter)) bracers = yautja.gloves + else if(istype(yautja.get_held_item(), /obj/item/clothing/gloves/yautja/hunter)) + bracers = yautja.get_held_item() if(!bracers) to_chat(yautja, SPAN_WARNING("You don't have bracers.")) remove_action(yautja, src) From 856c7b42d1283d9c170f26ffcad04d9d00b69f79 Mon Sep 17 00:00:00 2001 From: Beagle <56142455+BeagleGaming1@users.noreply.github.com> Date: Tue, 2 Jan 2024 12:59:38 -0500 Subject: [PATCH 3/3] requested changes --- code/modules/cm_preds/falcon.dm | 4 +-- code/modules/cm_preds/yaut_actions.dm | 42 ++++++++++++++------------- code/modules/cm_preds/yaut_mask.dm | 2 +- code/modules/cm_preds/yaut_weapons.dm | 6 ++-- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/code/modules/cm_preds/falcon.dm b/code/modules/cm_preds/falcon.dm index 8f0ca573f404..eb97a19c2233 100644 --- a/code/modules/cm_preds/falcon.dm +++ b/code/modules/cm_preds/falcon.dm @@ -40,13 +40,13 @@ if(!(slot == WEAR_L_EAR || slot == WEAR_R_EAR)) return add_verb(user, /obj/item/falcon_drone/proc/can_control_falcon_drone) - var/datum/action/predator_action/bracer/control_falcon_drone/falcon_action = give_action(user, /datum/action/predator_action/bracer/control_falcon_drone) + var/datum/action/predator_action/mask/control_falcon_drone/falcon_action = give_action(user, /datum/action/predator_action/mask/control_falcon_drone) falcon_action.linked_falcon_drone = src /obj/item/falcon_drone/dropped(mob/user) . = ..() remove_verb(user, /obj/item/falcon_drone/proc/can_control_falcon_drone) - remove_action(user, /datum/action/predator_action/bracer/control_falcon_drone) + remove_action(user, /datum/action/predator_action/mask/control_falcon_drone) /obj/item/falcon_drone/attack_self(mob/user) ..() diff --git a/code/modules/cm_preds/yaut_actions.dm b/code/modules/cm_preds/yaut_actions.dm index 2c53e32d2dcf..f55f58e0a557 100644 --- a/code/modules/cm_preds/yaut_actions.dm +++ b/code/modules/cm_preds/yaut_actions.dm @@ -38,13 +38,11 @@ bracers = yautja.get_held_item() if(!bracers) to_chat(yautja, SPAN_WARNING("You don't have bracers.")) - remove_action(yautja, src) return FALSE if(require_mask) if(!istype(yautja.wear_mask, /obj/item/clothing/mask/gas/yautja)) to_chat(yautja, SPAN_WARNING("You don't have a clan mask.")) - remove_action(yautja, src) return FALSE mask = yautja.wear_mask @@ -66,7 +64,7 @@ button.icon_state = initial(button_icon_state) if(active) - button.icon_state = "[initial(button_icon_state)]_on" + button.icon_state += "_on" /datum/action/predator_action/mark_for_hunt name = "Mark for Hunt" @@ -131,27 +129,30 @@ if(enabled) new_icon_state += "_on" + button.overlays.Cut() var/image/new_overlays new_overlays = image(icon_file, button, new_icon_state) button.overlays += new_overlays -//Actions that require wearing bracers -/datum/action/predator_action/bracer - require_bracers = TRUE - -/datum/action/predator_action/bracer/control_falcon_drone +/datum/action/predator_action/mask/control_falcon_drone name = "Control Falcon Drone" action_icon_state = "falcon_drone" listen_signal = COMSIG_KB_YAUTJA_CONTROL_FALCON active = PREDATOR_ACTION_ON_CLICK + require_bracers = TRUE ///The falcon drone that will be sent when the action is pressed var/obj/item/falcon_drone/linked_falcon_drone -/datum/action/predator_action/bracer/control_falcon_drone/action_activate() +/datum/action/predator_action/mask/control_falcon_drone/action_activate() . = ..() linked_falcon_drone.control_falcon_drone(yautja, bracers) + +//Actions that require wearing bracers +/datum/action/predator_action/bracer + require_bracers = TRUE + /datum/action/predator_action/bracer/wristblade name = "Toggle Wristblades" action_icon_state = "wristblade" @@ -169,7 +170,7 @@ /datum/action/predator_action/bracer/combistick/action_activate() . = ..() - yautja.call_combi_internal(yautja, FALSE) + yautja.call_combi_internal(yautja, forced = FALSE) /datum/action/predator_action/bracer/smartdisc name = "Recall nearby smart-discs" @@ -260,16 +261,17 @@ COOLDOWN_DECLARE(panel_emote_cooldown) /datum/yautja_emote_panel/New() - if(!length(yautja_emotes)) - var/list/emotes_to_add = list() - for(var/datum/emote/living/carbon/human/yautja/emote as anything in subtypesof(/datum/emote/living/carbon/human/yautja)) - if(!initial(emote.key) || initial(emote.no_panel)) - continue + if(length(yautja_emotes)) + return + var/list/emotes_to_add = list() + for(var/datum/emote/living/carbon/human/yautja/emote as anything in subtypesof(/datum/emote/living/carbon/human/yautja)) + if(!initial(emote.key) || initial(emote.no_panel)) + continue - if(!(initial(emote.category) in yautja_categories)) - yautja_categories += initial(emote.category) - emotes_to_add += emote - yautja_emotes = emotes_to_add + if(!(initial(emote.category) in yautja_categories)) + yautja_categories += initial(emote.category) + emotes_to_add += emote + yautja_emotes = emotes_to_add /datum/yautja_emote_panel/proc/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -323,5 +325,5 @@ return FALSE COOLDOWN_START(src, panel_emote_cooldown, 2.5 SECONDS) - usr.emote(initial(path.key)) + ui.user.emote(initial(path.key)) return TRUE diff --git a/code/modules/cm_preds/yaut_mask.dm b/code/modules/cm_preds/yaut_mask.dm index d9a28ad5eb6c..f87c7a48c2e0 100644 --- a/code/modules/cm_preds/yaut_mask.dm +++ b/code/modules/cm_preds/yaut_mask.dm @@ -98,8 +98,8 @@ if(istype(visor, /obj/item/clothing/glasses/night/yautja))//To change if any new vision modes are made human_holder.temp_drop_inv_item(visor) qdel(visor) - human_holder.update_inv_glasses() human_holder.update_sight() + add_vision(human_holder) /obj/item/clothing/mask/gas/yautja/proc/drain_power(mob/living/carbon/human/human_holder, drain_amount) var/obj/item/clothing/gloves/yautja/bracer = human_holder.gloves diff --git a/code/modules/cm_preds/yaut_weapons.dm b/code/modules/cm_preds/yaut_weapons.dm index f41c54ca5859..c9bb0fddeaa5 100644 --- a/code/modules/cm_preds/yaut_weapons.dm +++ b/code/modules/cm_preds/yaut_weapons.dm @@ -248,8 +248,8 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("speared", "stabbed", "impaled") - var/on = 1 - var/charged + var/on = TRUE + var/charged = FALSE var/force_wielded = MELEE_FORCE_TIER_6 var/force_unwielded = MELEE_FORCE_TIER_2 @@ -275,8 +275,6 @@ charged = FALSE remove_filter("combistick_charge") unwield(user) //Otherwise stays wielded even when thrown - if(on) - setup_chain(user) return TRUE /obj/item/weapon/yautja/combistick/proc/setup_chain(mob/living/user)