Skip to content

Commit 9e923f0

Browse files
authored
Martial arts tweaks and fixes (#5114)
* Martial arts tweaks and fixes * tunnel arts and awakened dragon and now consistent with dodge/counter effects respectively * make snowflake_martial_arts_handler less shit. still snowflakey tho. * whoopsie daisy
1 parent 0e0c6d2 commit 9e923f0

File tree

7 files changed

+135
-100
lines changed

7 files changed

+135
-100
lines changed

code/datums/martial/cqc.dm

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,17 +32,16 @@
3232
return
3333
// monkestation edit: improved messaging
3434
cqc_user.visible_message(
35-
span_danger("[cqc_user] twists [attacker]'s arm, sending their [attack_weapon] back towards them!"),
36-
span_userdanger("Making sure to avoid [attacker]'s [attack_weapon], you twist their arm to send it right back at them!"),
35+
span_danger("[cqc_user] twists [attacker]'s arm, sending [attacker.p_their()] [attack_weapon] back towards [attacker.p_them()]!"),
36+
span_userdanger("Making sure to avoid [attacker]'s [attack_weapon], you twist [attacker.p_their()] arm to send it right back at [attacker.p_them()]!"),
3737
ignored_mobs = list(attacker),
3838
)
3939
to_chat(attacker, span_userdanger("[cqc_user] swiftly grabs and twists your arm, hitting you with your own [attack_weapon]!"), type = MESSAGE_TYPE_COMBAT)
4040
// monkestation end
4141
var/obj/item/melee/touch_attack/touch_weapon = attack_weapon
4242
var/datum/action/cooldown/spell/touch/touch_spell = touch_weapon.spell_which_made_us?.resolve()
43-
if(!touch_spell)
44-
return
45-
INVOKE_ASYNC(touch_spell, TYPE_PROC_REF(/datum/action/cooldown/spell/touch, do_hand_hit), touch_weapon, attacker, attacker)
43+
if(touch_spell)
44+
INVOKE_ASYNC(touch_spell, TYPE_PROC_REF(/datum/action/cooldown/spell/touch, do_hand_hit), touch_weapon, attacker, attacker)
4645
return COMPONENT_NO_AFTERATTACK
4746

4847
/datum/martial_art/cqc/reset_streak(mob/living/new_target)
@@ -242,7 +241,7 @@
242241
if(prob(65))
243242
if(!defender.stat || !defender.IsParalyzed() || !restraining_mob)
244243
held_item = defender.get_active_held_item()
245-
defender.visible_message(span_danger("[attacker] strikes [defender]'s jaw with their hand!"), \
244+
defender.visible_message(span_danger("[attacker] strikes [defender]'s jaw with [attacker.p_their()] hand!"), \
246245
span_userdanger("Your jaw is struck by [attacker], you feel disoriented!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker)
247246
to_chat(attacker, span_danger("You strike [defender]'s jaw, leaving [defender.p_them()] disoriented!"))
248247
playsound(get_turf(defender), 'sound/weapons/cqchit1.ogg', 50, TRUE, -1)

code/datums/martial/sleeping_carp.dm

Lines changed: 57 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
var/deflect_cooldown = 3 SECONDS //monke edit start
1414
var/deflect_stamcost = 15 //how much stamina it costs per bullet deflected
1515
var/log_name = "Sleeping Carp"
16-
var/damage = 0
16+
var/damage = 20
1717
var/kick_speed = 0 //how fast you get punted into the stratosphere on launchkick
1818
var/wounding = 0 //whether or not you get wounded by the attack
1919
var/zone_message = "" //string for where the attack is targetting
@@ -52,31 +52,41 @@
5252
return FALSE
5353

5454
///Gnashing Teeth: Harm Harm, consistent 20 force punch on every second harm punch
55-
/datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/attacker, mob/living/defender)
56-
damage = 20
57-
wounding = 0
55+
/datum/martial_art/the_sleeping_carp/proc/strongPunch(mob/living/attacker, mob/living/defender, set_damage = TRUE)
56+
if(set_damage)
57+
damage = 20
58+
wounding = 0
5859
///this var is so that the strong punch is always aiming for the body part the user is targeting and not trying to apply to the chest before deviating
5960
var/obj/item/bodypart/affecting = defender.get_bodypart(defender.get_random_valid_zone(attacker.zone_selected))
6061
attacker.do_attack_animation(defender, ATTACK_EFFECT_PUNCH)
6162
var/atk_verb = pick("precisely kick", "brutally chop", "cleanly hit", "viciously slam")
62-
defender.visible_message(span_danger("[attacker] [atk_verb]s [defender]!"), \
63-
span_userdanger("[attacker] [atk_verb]s you!"), null, null, attacker)
63+
defender.visible_message(
64+
span_danger("[attacker] [atk_verb]s [defender]!"),
65+
span_userdanger("[attacker] [atk_verb]s you!"),
66+
ignored_mobs = attacker
67+
)
6468
to_chat(attacker, span_danger("You [atk_verb] [defender]!"))
6569
playsound(defender, 'sound/weapons/punch1.ogg', vol = 25, vary = TRUE, extrarange = -1)
6670
log_combat(attacker, defender, "strong punched ([log_name])") //monke edit
6771
defender.apply_damage(damage, attacker.get_attack_type(), affecting, wound_bonus = wounding)
68-
return
6972

7073
///Crashing Wave Kick: Harm Disarm combo, throws people seven tiles backwards
71-
/datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/attacker, mob/living/defender)
72-
damage = 15 //monke edit start
73-
kick_speed = 4
74-
wounding = CANT_WOUND
75-
zone_message = "chest"
76-
zone = BODY_ZONE_CHEST
74+
/datum/martial_art/the_sleeping_carp/proc/launchKick(mob/living/attacker, mob/living/defender, set_damage = TRUE)
75+
//monke edit start
76+
if(set_damage)
77+
damage = 15
78+
kick_speed = 4
79+
wounding = CANT_WOUND
80+
zone_message = "chest"
81+
zone = BODY_ZONE_CHEST
7782
attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK)
78-
defender.visible_message(span_warning("[attacker] kicks [defender] square in the [zone_message], sending them flying!"), \
79-
span_userdanger("You are kicked square in the [zone_message] by [attacker], sending you flying!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker)
83+
defender.visible_message(
84+
span_warning("[attacker] kicks [defender] square in the [zone_message], sending [defender.p_them()] flying!"),
85+
span_userdanger("You are kicked square in the [zone_message] by [attacker], sending you flying!"),
86+
span_hear("You hear a sickening sound of flesh hitting flesh!"),
87+
vision_distance = COMBAT_MESSAGE_RANGE,
88+
ignored_mobs = attacker,
89+
)
8090
playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', vol = 50, vary = TRUE, extrarange = -1)
8191
var/atom/throw_target = get_edge_target_turf(defender, attacker.dir)
8292
defender.throw_at(throw_target, 7, kick_speed, attacker)
@@ -85,24 +95,30 @@
8595
return
8696

8797
///Keelhaul: Disarm Disarm combo, knocks people down and deals substantial stamina damage, and also discombobulates them. Knocks objects out of their hands if they're already on the ground.
88-
/datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/attacker, mob/living/defender)
89-
stamina_damage = 100 //monke edit start
98+
/datum/martial_art/the_sleeping_carp/proc/dropKick(mob/living/attacker, mob/living/defender, set_damage = TRUE)
99+
//monke edit start
100+
if(set_damage)
101+
stamina_damage = 100
90102
attacker.do_attack_animation(defender, ATTACK_EFFECT_KICK)
91103
playsound(get_turf(attacker), 'sound/effects/hit_kick.ogg', vol = 50, vary = TRUE, extrarange = -1)
92104
if(defender.body_position == STANDING_UP)
93105
defender.Knockdown(2 SECONDS)
94106
defender.visible_message(
95-
span_warning("[attacker] kicks [defender] in the head, sending them face first into the floor!"),
107+
span_warning("[attacker] kicks [defender] in the head, sending [defender.p_them()] face first into the floor!"),
96108
span_userdanger("You are kicked in the head by [attacker], sending you crashing to the floor!"),
97-
span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker
98-
)
109+
span_hear("You hear a sickening sound of flesh hitting flesh!"),
110+
vision_distance = COMBAT_MESSAGE_RANGE,
111+
ignored_mobs = attacker,
112+
)
99113
else
100114
defender.drop_all_held_items()
101115
defender.visible_message(
102116
span_warning("[attacker] kicks [defender] in the head!"),
103117
span_userdanger("You are kicked in the head by [attacker]!"),
104-
span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, attacker
105-
)
118+
span_hear("You hear a sickening sound of flesh hitting flesh!"),
119+
vision_distance = COMBAT_MESSAGE_RANGE,
120+
ignored_mobs = attacker,
121+
)
106122
defender.stamina.adjust(stamina_damage)
107123
defender.adjust_dizzy_up_to(10 SECONDS, 10 SECONDS)
108124
defender.adjust_temp_blindness_up_to(2 SECONDS, 10 SECONDS)
@@ -121,7 +137,7 @@
121137
playsound(defender, 'sound/weapons/punch1.ogg', vol = 25, vary = TRUE, extrarange = -1)
122138
if(defender.stat != DEAD && !defender.IsUnconscious() && defender.stamina.current <= 50) //We put our target to sleep.
123139
defender.visible_message(
124-
span_danger("[attacker] carefully pinch a nerve in [defender]'s neck, knocking them out cold"),
140+
span_danger("[attacker] carefully pinch a nerve in [defender]'s neck, knocking [defender.p_them()] out cold"),
125141
span_userdanger("[attacker] pinches something in your neck, and you fall unconscious!"),
126142
)
127143
grab_log_description = "grabbed and nerve pinched"
@@ -143,9 +159,9 @@
143159
span_danger("[attacker] snaps the neck of [defender]!"),
144160
span_userdanger("Your neck is snapped by [attacker]!"),
145161
span_hear("You hear a sickening snap!"),
146-
ignored_mobs = attacker
162+
ignored_mobs = attacker,
147163
)
148-
to_chat(attacker, span_danger("In a swift motion, you snap the neck of [defender]!"))
164+
to_chat(attacker, span_danger("In a swift motion, you snap the neck of [defender]!"), type = MESSAGE_TYPE_COMBAT)
149165
log_combat(attacker, defender, "snapped neck")
150166
defender.apply_damage(100, BRUTE, BODY_ZONE_HEAD, wound_bonus=CANT_WOUND)
151167
if(!HAS_TRAIT(defender, TRAIT_NODEATH))
@@ -164,7 +180,7 @@
164180
span_danger("[attacker] [atk_verb]s [defender]!"),
165181
span_userdanger("[attacker] [atk_verb]s you!"), null, null, attacker
166182
)
167-
to_chat(attacker, span_danger("You [atk_verb] [defender]!"))
183+
to_chat(attacker, span_danger("You [atk_verb] [defender]!"), type = MESSAGE_TYPE_COMBAT)
168184

169185
defender.apply_damage(rand(10,15), attacker.get_attack_type(), affecting, wound_bonus = CANT_WOUND)
170186
playsound(defender, 'sound/weapons/punch1.ogg', 25, TRUE, -1)
@@ -186,12 +202,12 @@
186202

187203
return ..()
188204

189-
/datum/martial_art/the_sleeping_carp/proc/can_deflect(mob/living/carp_user)
205+
/datum/martial_art/the_sleeping_carp/proc/can_deflect(mob/living/carp_user, check_intent = TRUE)
190206
if(!COOLDOWN_FINISHED(src, block_cooldown)) //monke edit
191207
return FALSE
192208
if(!can_use(carp_user))
193209
return FALSE
194-
if(!(carp_user.istate & ISTATE_HARM)) // monke edit: istates/intents
210+
if(check_intent && !(carp_user.istate & ISTATE_HARM)) // monke edit: istates/intents
195211
return FALSE
196212
if(carp_user.incapacitated(IGNORE_GRAB)) //NO STUN
197213
return FALSE
@@ -222,10 +238,11 @@
222238
return COMPONENT_BULLET_PIERCED
223239

224240
///Signal from getting attacked with an item, for a special interaction with touch spells
225-
/datum/martial_art/the_sleeping_carp/proc/on_attackby(mob/living/carbon/human/carp_user, obj/item/attack_weapon, mob/attacker, params) //no signal handler or this proc will explode
226-
if(!istype(attack_weapon, /obj/item/melee/touch_attack) || !can_deflect(carp_user))
241+
/datum/martial_art/the_sleeping_carp/proc/on_attackby(mob/living/carbon/human/carp_user, obj/item/melee/touch_attack/touch_weapon, mob/attacker, params)
242+
SIGNAL_HANDLER
243+
244+
if(!istype(touch_weapon) || !can_deflect(carp_user, check_intent = !touch_weapon.dangerous))
227245
return
228-
var/obj/item/melee/touch_attack/touch_weapon = attack_weapon
229246
var/datum/action/cooldown/spell/touch/touch_spell = touch_weapon.spell_which_made_us?.resolve()
230247
// monkestation edit: flavor tweaks
231248
if(!counter)
@@ -239,15 +256,15 @@
239256
playsound(carp_user, 'monkestation/sound/effects/miss.ogg', vol = 50, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
240257
else
241258
carp_user.visible_message(
242-
span_danger("[carp_user] twists [attacker]'s arm, sending their [attack_weapon] back towards them!"),
243-
span_userdanger("Making sure to avoid [attacker]'s [attack_weapon], you twist their arm to send it right back at them!"),
244-
ignored_mobs = list(attacker),
245-
)
246-
to_chat(attacker, span_userdanger("[carp_user] swiftly grabs and twists your arm, hitting you with your own [attack_weapon]!"), type = MESSAGE_TYPE_COMBAT)
247-
carp_user.say(message = "PATHETIC!", language = /datum/language/common, ignore_spam = TRUE, forced = src)
248-
if(!touch_spell)
249-
return
250-
INVOKE_ASYNC(touch_spell, TYPE_PROC_REF(/datum/action/cooldown/spell/touch, do_hand_hit), touch_weapon, attacker, attacker)
259+
span_danger("[carp_user] twists [attacker]'s arm, sending [attacker.p_their()] [touch_weapon] back towards [attacker.p_them()]!"),
260+
span_userdanger("Making sure to avoid [attacker]'s [touch_weapon], you twist [attacker.p_their()] arm to send it right back at [attacker.p_them()]!"),
261+
ignored_mobs = list(attacker),
262+
)
263+
to_chat(attacker, span_userdanger("[carp_user] swiftly grabs and twists your arm, hitting you with your own [touch_weapon]!"), type = MESSAGE_TYPE_COMBAT)
264+
INVOKE_ASYNC(carp_user, TYPE_PROC_REF(/atom/movable, say), message = "PATHETIC!", language = /datum/language/common, ignore_spam = TRUE, forced = src)
265+
if(touch_spell)
266+
INVOKE_ASYNC(touch_spell, TYPE_PROC_REF(/datum/action/cooldown/spell/touch, do_hand_hit), touch_weapon, attacker, attacker)
267+
attacker.changeNext_move(CLICK_CD_MELEE)
251268
// monkestation end
252269
return COMPONENT_NO_AFTERATTACK
253270

monkestation/code/modules/antagonists/cult/blood_magic.dm

Lines changed: 25 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,23 @@
7777
// If this is gonna be a snowflake touch spell despite not being an actual touch spell, then we get to have snowflake code to ensure it behaves like it should.
7878
/obj/item/melee/blood_magic/stun/proc/snowflake_martial_arts_handler(mob/living/target, mob/living/carbon/user)
7979
var/datum/martial_art/martial_art = target?.mind?.martial_art
80-
var/list/static/martial_counters_typecache = typecacheof(list(
81-
/datum/martial_art/cqc,
82-
/datum/martial_art/the_sleeping_carp/awakened_dragon,
83-
))
8480
if(!martial_art?.can_use())
8581
return FALSE
86-
if(is_type_in_typecache(martial_art, martial_counters_typecache))
82+
var/counter = FALSE
83+
var/dodge = FALSE
84+
if(istype(martial_art, /datum/martial_art/cqc))
85+
counter = TRUE
86+
else if(istype(martial_art, /datum/martial_art/the_sleeping_carp))
87+
var/datum/martial_art/the_sleeping_carp/eepy_carp = martial_art
88+
if(eepy_carp.can_deflect(target, check_intent = FALSE))
89+
if(eepy_carp.counter)
90+
counter = TRUE
91+
INVOKE_ASYNC(target, TYPE_PROC_REF(/atom/movable, say), message = "PATHETIC!", language = /datum/language/common, ignore_spam = TRUE, forced = martial_art)
92+
else
93+
dodge = TRUE
94+
else if(istype(martial_art, /datum/martial_art/the_tunnel_arts))
95+
dodge = TRUE
96+
if(counter)
8797
target.visible_message(
8898
span_danger("[target] twists [user]'s arm, sending [user.p_their()] [src] back towards [user.p_them()]!"),
8999
span_userdanger("Making sure to avoid [user]'s [src], you twist [user.p_their()] arm to send it right back at [user.p_them()]!"),
@@ -92,16 +102,14 @@
92102
to_chat(user, span_userdanger("As you attempt to stun [target] with the spell, [target.p_they()] twist[target.p_s()] your arm and send[target.p_s()] the spell back at you!"), type = MESSAGE_TYPE_COMBAT)
93103
effect_weakened(user, silent = TRUE)
94104
return TRUE
95-
else if(istype(martial_art, /datum/martial_art/the_sleeping_carp))
96-
var/datum/martial_art/the_sleeping_carp/eepy_carp = martial_art
97-
if(eepy_carp.can_deflect(target))
98-
target.visible_message(
99-
span_danger("[target] carefully dodges [user]'s [src]!"),
100-
span_userdanger("You take great care to remain untouched by [user]'s [src]!"),
101-
ignored_mobs = list(user),
102-
)
103-
to_chat(user, span_userdanger("[target] carefully dodges your [src], remaining completely untouched!"), type = MESSAGE_TYPE_COMBAT)
104-
target.balloon_alert(user, "miss!")
105-
playsound(target, 'monkestation/sound/effects/miss.ogg', vol = 50, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
106-
return TRUE
105+
else if(dodge)
106+
target.visible_message(
107+
span_danger("[target] carefully dodges [user]'s [src]!"),
108+
span_userdanger("You take great care to remain untouched by [user]'s [src]!"),
109+
ignored_mobs = list(user),
110+
)
111+
to_chat(user, span_userdanger("[target] carefully dodges your [src], remaining completely untouched!"), type = MESSAGE_TYPE_COMBAT)
112+
target.balloon_alert(user, "miss!")
113+
playsound(target, 'monkestation/sound/effects/miss.ogg', vol = 50, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
114+
return TRUE
107115
return FALSE

monkestation/code/datums/martial_arts/awakened_dragon.dm renamed to monkestation/code/modules/martial_arts/awakened_dragon.dm

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
deflect_cooldown = 0
66
deflect_stamcost = 10
77
log_name = "Awakened Dragon"
8+
scarp_traits = list(TRAIT_NOGUNS, TRAIT_NEVER_WOUNDED, TRAIT_NODISMEMBER, TRAIT_LIGHT_SLEEPER, TRAIT_THROW_GUNS, TRAIT_BATON_RESISTANCE)
9+
counter = TRUE
810
var/title = null //YOUR TITLE BELOW THE HEAVENS! This is the prefix you use :]
911
var/static/list/character_prefixes = list(
1012
"Heavenly Demon",
@@ -20,8 +22,6 @@
2022
var/original_name
2123
var/titled_name
2224
var/list/datum/weakref/all_bodies = list()
23-
scarp_traits = list(TRAIT_NOGUNS, TRAIT_NEVER_WOUNDED, TRAIT_NODISMEMBER, TRAIT_LIGHT_SLEEPER, TRAIT_THROW_GUNS, TRAIT_BATON_RESISTANCE)
24-
counter = TRUE
2525

2626
/datum/martial_art/the_sleeping_carp/awakened_dragon/teach(mob/living/carbon/human/target, make_temporary)
2727
. = ..()
@@ -31,33 +31,31 @@
3131
if(title == null)
3232
title = pick(character_prefixes)
3333
all_bodies += target
34-
titled_name = "[title] [target.get_face_name(original_name)]"
34+
titled_name = "[title] [original_name]"
3535
target.fully_replace_character_name(original_name, titled_name)
3636

3737
/datum/martial_art/the_sleeping_carp/awakened_dragon/remove(mob/living/carbon/human/target)
3838
. = ..()
3939
target.fully_replace_character_name(titled_name, original_name)
4040

41-
42-
/datum/martial_art/the_sleeping_carp/awakened_dragon/strongPunch(mob/living/attacker, mob/living/defender)
43-
. = ..()
41+
/datum/martial_art/the_sleeping_carp/awakened_dragon/strongPunch(mob/living/attacker, mob/living/defender, set_damage)
4442
damage = 40
4543
wounding = 15
44+
. = ..(attacker, defender, set_damage = FALSE)
4645
attacker.say("Crushing Maw!!", forced = /datum/martial_art/the_sleeping_carp/awakened_dragon, ignore_spam = TRUE)
4746

48-
49-
/datum/martial_art/the_sleeping_carp/awakened_dragon/launchKick(mob/living/attacker, mob/living/defender)
50-
. = ..()
47+
/datum/martial_art/the_sleeping_carp/awakened_dragon/launchKick(mob/living/attacker, mob/living/defender, set_damage)
5148
damage = 30
5249
kick_speed = 5
5350
wounding = 5
5451
zone = BODY_ZONE_HEAD
5552
zone_message = "head"
53+
. = ..(attacker, defender, set_damage = FALSE)
5654
attacker.say("Tsunami Kick of the Heavenly Serpent!!", forced = /datum/martial_art/the_sleeping_carp/awakened_dragon, ignore_spam = TRUE)
5755

58-
/datum/martial_art/the_sleeping_carp/awakened_dragon/dropKick(mob/living/attacker, mob/living/defender)
59-
. = ..()
56+
/datum/martial_art/the_sleeping_carp/awakened_dragon/dropKick(mob/living/attacker, mob/living/defender, set_damage)
6057
stamina_damage = 50
58+
. = ..(attacker, defender, set_damage = FALSE)
6159
defender.apply_damage(30, attacker.get_attack_type(), defender.zone_selected, wound_bonus = 10, bare_wound_bonus = 5)
6260
attacker.say("Heavenly Dragon Kick!!", forced = /datum/martial_art/the_sleeping_carp/awakened_dragon, ignore_spam = TRUE)
6361

0 commit comments

Comments
 (0)