diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm
index 0253ecf8a4a..c18f2c8de24 100644
--- a/code/datums/martial/_martial.dm
+++ b/code/datums/martial/_martial.dm
@@ -8,6 +8,7 @@
var/block_chance = 0 //Chance to block melee attacks using items while on throw mode.
var/help_verb
var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts
+ var/smashes_tables = FALSE //If the martial art smashes tables when performing table slams and head smashes
/datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
return FALSE
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index 6f78f0a6b1b..b85cd782696 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -9,6 +9,7 @@
id = MARTIALART_CQC
help_verb = /mob/living/carbon/human/proc/CQC_help
block_chance = 75
+ smashes_tables = TRUE
var/old_grab_state = null
var/restraining = FALSE
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 27d031b6542..dd1c7b6c0df 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -9,6 +9,7 @@
id = MARTIALART_SLEEPINGCARP
allow_temp_override = FALSE
help_verb = /mob/living/carbon/human/proc/sleeping_carp_help
+ smashes_tables = TRUE
var/old_grab_state = null
/datum/martial_art/the_sleeping_carp/proc/check_streak(mob/living/carbon/human/A, mob/living/carbon/human/D)
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index 8d88c2dc39c..ecda528cbd8 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -84,6 +84,11 @@
description = "They want to play on the table!\n"
mood_change = 2
+/datum/mood_event/table_headsmash
+ description = "My fucking head, that hurt..."
+ mood_change = -3
+ timeout = 3 MINUTES
+
/datum/mood_event/brain_damage
mood_change = -3
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index 90ad4e7b9f6..0de5a57caca 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -70,7 +70,10 @@
if(user.grab_state < GRAB_AGGRESSIVE)
to_chat(user, "You need a better grip to do that!")
return
- tablepush(user, pushed_mob)
+ if(user.grab_state >= GRAB_NECK)
+ tableheadsmash(user, pushed_mob)
+ else
+ tablepush(user, pushed_mob)
if(user.a_intent == INTENT_HELP)
pushed_mob.visible_message("[user] begins to place [pushed_mob] onto [src]...", \
"[user] begins to place [pushed_mob] onto [src]...")
@@ -126,14 +129,29 @@
pushed_mob.pass_flags &= ~PASSTABLE
if(pushed_mob.loc != loc) //Something prevented the tabling
return
- pushed_mob.Paralyze(40)
- pushed_mob.visible_message("[user] slams [pushed_mob] onto [src]!", \
- "[user] slams you onto [src]!")
+ pushed_mob.Knockdown(30)
+ pushed_mob.apply_damage(10, BRUTE)
+ pushed_mob.apply_damage(40, STAMINA)
+ if(user.mind?.martial_art?.smashes_tables)
+ deconstruct(FALSE)
+ playsound(pushed_mob, "sound/effects/tableslam.ogg", 90, TRUE)
+ pushed_mob.visible_message("[user] slams [pushed_mob] onto \the [src]!", \
+ "[user] slams you onto \the [src]!")
log_combat(user, pushed_mob, "tabled", null, "onto [src]")
- if(!ishuman(pushed_mob))
- return
- var/mob/living/carbon/human/H = pushed_mob
- SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
+ SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table)
+
+/obj/structure/table/proc/tableheadsmash(mob/living/user, mob/living/pushed_mob)
+ pushed_mob.Knockdown(30)
+ pushed_mob.apply_damage(40, BRUTE, BODY_ZONE_HEAD)
+ pushed_mob.apply_damage(60, STAMINA)
+ take_damage(50)
+ if(user.mind?.martial_art?.smashes_tables)
+ deconstruct(FALSE)
+ playsound(pushed_mob, "sound/effects/tableheadsmash.ogg", 90, TRUE)
+ pushed_mob.visible_message("[user] smashes [pushed_mob]'s head against \the [src]!",
+ "[user] smashes your head against \the [src]")
+ log_combat(user, pushed_mob, "head slammed", null, "against [src]")
+ SEND_SIGNAL(pushed_mob, COMSIG_ADD_MOOD_EVENT, "table", /datum/mood_event/table_headsmash)
/obj/structure/table/attackby(obj/item/I, mob/user, params)
if(!(flags_1 & NODECONSTRUCT_1) && user.a_intent != INTENT_HELP)
diff --git a/sound/effects/tableheadsmash.ogg b/sound/effects/tableheadsmash.ogg
new file mode 100644
index 00000000000..7f2a5f45a6a
Binary files /dev/null and b/sound/effects/tableheadsmash.ogg differ
diff --git a/sound/effects/tableslam.ogg b/sound/effects/tableslam.ogg
new file mode 100644
index 00000000000..6d1ba5ce215
Binary files /dev/null and b/sound/effects/tableslam.ogg differ