From 1f0ad3e68cd64594e141fe75d6d9e19d31b02735 Mon Sep 17 00:00:00 2001 From: Hatterhat <31829017+Hatterhat@users.noreply.github.com> Date: Sat, 17 Sep 2022 15:47:24 -0500 Subject: [PATCH] its a lil janky but we take those (#15834) Co-authored-by: Hatterhat --- code/_onclick/hud/_defines.dm | 1 + code/_onclick/hud/hud.dm | 3 ++ code/_onclick/hud/human.dm | 3 ++ code/_onclick/hud/screen_objects.dm | 25 +++++++++++++ code/datums/martial/_martial.dm | 53 ++++++++++++++++----------- code/datums/martial/cqc.dm | 1 + code/datums/martial/plasma_fist.dm | 1 + code/datums/martial/rising_bass.dm | 1 + code/datums/martial/sleeping_carp.dm | 1 + icons/mob/screen_gen.dmi | Bin 120225 -> 122121 bytes 10 files changed, 67 insertions(+), 22 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index f8dfc703f0..2831e25b10 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -47,6 +47,7 @@ #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" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index fbd62f0565..1eb13d20f6 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -33,6 +33,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/atom/movable/screen/alien_plasma_display var/atom/movable/screen/alien_queen_finder + var/atom/movable/screen/combo/combo_display + var/atom/movable/screen/devil/soul_counter/devilsouldisplay var/atom/movable/screen/synth/coolant_counter/coolant_display @@ -130,6 +132,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( blobpwrdisplay = null alien_plasma_display = null alien_queen_finder = null + combo_display = null QDEL_LIST_ASSOC_VAL(plane_masters) QDEL_LIST(screenoverlays) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 5ed20f69e6..9547ee6f86 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -461,6 +461,9 @@ zone_select.update_icon() static_inventory += zone_select + combo_display = new /atom/movable/screen/combo() + infodisplay += combo_display + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 6ca0416dfd..33c0bb0f04 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -720,3 +720,28 @@ /atom/movable/screen/component_button/Click(params) if(parent) parent.component_click(src, params) + +/atom/movable/screen/combo + icon_state = "" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + screen_loc = ui_combo + layer = ABOVE_HUD_LAYER + var/timerid + +/atom/movable/screen/combo/proc/clear_streak() + cut_overlays() + icon_state = "" + +/atom/movable/screen/combo/update_icon_state(streak = "") + clear_streak() + if (timerid) + deltimer(timerid) + if (!streak) + return + timerid = addtimer(CALLBACK(src, .proc/clear_streak), 20, TIMER_UNIQUE | TIMER_STOPPABLE) + icon_state = "combo" + for (var/i = 1; i <= length(streak); ++i) + var/intent_text = copytext(streak, i, i + 1) + var/image/intent_icon = image(icon,src,"combo_[intent_text]") + intent_icon.pixel_x = 16 * (i - 1) - 8 * length(streak) + add_overlay(intent_icon) diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index 19cfc7691d..ce94cb3008 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -15,6 +15,8 @@ /// Set this variable to something not null, this'll be the preferred unarmed parry in most cases if [can_martial_parry] is TRUE. YOU MUST RUN [get_block_parry_data(this)] INSTEAD OF DIRECTLY ACCESSING! var/datum/block_parry_data/block_parry_data var/pugilist = FALSE + var/datum/weakref/holder //owner of the martial art + var/display_combos = FALSE //shows combo meter if true /datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D) return FALSE @@ -25,7 +27,7 @@ /datum/martial_art/proc/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D) return FALSE -/datum/martial_art/proc/can_use(mob/living/carbon/human/H) +/datum/martial_art/proc/can_use(mob/living/carbon/human/owner_human) return TRUE /datum/martial_art/proc/add_to_streak(element,mob/living/carbon/human/D) @@ -34,11 +36,16 @@ streak = streak+element if(length(streak) > max_streak_length) streak = copytext(streak, 1 + length(streak[1])) + if(display_combos) + var/mob/living/holder_living = holder.resolve() + holder_living?.hud_used?.combo_display.update_icon_state(streak) return /datum/martial_art/proc/reset_streak(mob/living/carbon/human/new_target) current_target = new_target streak = "" + var/mob/living/holder_living = holder.resolve() + holder_living?.hud_used?.combo_display.update_icon_state(streak) /datum/martial_art/proc/damage_roll(mob/living/carbon/human/A, mob/living/carbon/human/D) //Here we roll for our damage to be added into the damage var in the various attack procs. This is changed depending on whether we are in combat mode, lying down, or if our target is in combat mode. @@ -47,46 +54,48 @@ damage *= 0.7 return damage -/datum/martial_art/proc/teach(mob/living/carbon/human/H, make_temporary = FALSE) - if(!istype(H) || !H.mind) +/datum/martial_art/proc/teach(mob/living/carbon/human/owner_human, make_temporary = FALSE) + if(!istype(owner_human) || !owner_human.mind) return FALSE - if(H.mind.martial_art) + if(owner_human.mind.martial_art) if(make_temporary) - if(!H.mind.martial_art.allow_temp_override) + if(!owner_human.mind.martial_art.allow_temp_override) return FALSE - store(H.mind.martial_art,H) + store(owner_human.mind.martial_art,owner_human) else - H.mind.martial_art.on_remove(H) + owner_human.mind.martial_art.on_remove(owner_human) else if(make_temporary) - base = H.mind.default_martial_art + base = owner_human.mind.default_martial_art if(help_verb) - add_verb(H, help_verb) - H.mind.martial_art = src + add_verb(owner_human, help_verb) + owner_human.mind.martial_art = src + holder = WEAKREF(owner_human) if(pugilist) - ADD_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT) + ADD_TRAIT(owner_human, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT) return TRUE -/datum/martial_art/proc/store(datum/martial_art/M,mob/living/carbon/human/H) - M.on_remove(H) +/datum/martial_art/proc/store(datum/martial_art/M,mob/living/carbon/human/owner_human) + M.on_remove(owner_human) if(M.base) //Checks if M is temporary, if so it will not be stored. base = M.base else //Otherwise, M is stored. base = M -/datum/martial_art/proc/remove(mob/living/carbon/human/H) - if(!istype(H) || !H.mind || H.mind.martial_art != src) +/datum/martial_art/proc/remove(mob/living/carbon/human/owner_human) + if(!istype(owner_human) || !owner_human.mind || owner_human.mind.martial_art != src) return - on_remove(H) + on_remove(owner_human) if(base) - base.teach(H) + base.teach(owner_human) else - var/datum/martial_art/X = H.mind.default_martial_art - X.teach(H) - REMOVE_TRAIT(H, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT) + var/datum/martial_art/X = owner_human.mind.default_martial_art + X.teach(owner_human) + REMOVE_TRAIT(owner_human, TRAIT_PUGILIST, MARTIAL_ARTIST_TRAIT) + holder = null -/datum/martial_art/proc/on_remove(mob/living/carbon/human/H) +/datum/martial_art/proc/on_remove(mob/living/carbon/human/owner_human) if(help_verb) - remove_verb(H, help_verb) + remove_verb(owner_human, help_verb) return ///Gets called when a projectile hits the owner. Returning anything other than BULLET_ACT_HIT will stop the projectile from hitting the mob. diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm index 1d6682e3a6..afc1a26659 100644 --- a/code/datums/martial/cqc.dm +++ b/code/datums/martial/cqc.dm @@ -11,6 +11,7 @@ block_chance = 75 pugilist = TRUE var/old_grab_state = null + display_combos = TRUE /datum/martial_art/cqc/reset_streak(mob/living/carbon/human/new_target) . = ..() diff --git a/code/datums/martial/plasma_fist.dm b/code/datums/martial/plasma_fist.dm index 16ffb381aa..59de1f6ec1 100644 --- a/code/datums/martial/plasma_fist.dm +++ b/code/datums/martial/plasma_fist.dm @@ -7,6 +7,7 @@ id = MARTIALART_PLASMAFIST help_verb = /mob/living/carbon/human/proc/plasma_fist_help pugilist = TRUE + display_combos = TRUE /datum/martial_art/plasma_fist/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm index 0d77644c86..87c0d42a29 100644 --- a/code/datums/martial/rising_bass.dm +++ b/code/datums/martial/rising_bass.dm @@ -13,6 +13,7 @@ var/datum/action/risingbassmove/sidekick = new/datum/action/risingbassmove/sidekick() var/datum/action/risingbassmove/deftswitch = new/datum/action/risingbassmove/deftswitch() var/repulsecool = 0 + display_combos = TRUE /datum/martial_art/the_rising_bass/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,SIDE_KICK_COMBO)) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index bac1614228..d0cdee4937 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -9,6 +9,7 @@ help_verb = /mob/living/carbon/human/proc/sleeping_carp_help block_parry_data = /datum/block_parry_data/sleeping_carp pugilist = TRUE + display_combos = TRUE /datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D) if(findtext(streak,STRONG_PUNCH_COMBO)) diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi index 4377a0d7c6100239e969ad350a9fd8dc1b6b8f09..39e8eb4b4568f45bf02c49fa0974c00af0e85c07 100644 GIT binary patch delta 10811 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 DTx1Oe