diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index d119759efc..26a709590c 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -11,6 +11,7 @@
var/restraining = 0 //used in cqc's disarm_act to check if the disarmed is being restrained and so whether they should be put in a chokehold or not
var/help_verb
var/no_guns = FALSE
+ var/pacifism_check = TRUE //are the martial arts combos/attacks unable to be used by pacifist.
var/allow_temp_override = TRUE //if this martial art can be overridden by temporary martial arts
/datum/martial_art/proc/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 7399528e1c..c10a0b805b 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -1,6 +1,7 @@
/datum/martial_art/boxing
name = "Boxing"
id = MARTIALART_BOXING
+ pacifism_check = FALSE //Let's pretend pacifists can boxe the heck out of other people because ir deals stamina damage right now.
/datum/martial_art/boxing/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
to_chat(A, "Can't disarm while boxing!")
@@ -16,14 +17,15 @@
var/atk_verb = pick("left hook","right hook","straight punch")
- var/damage = rand(5, 8) + A.dna.species.punchdamagelow
- if(!damage)
+ var/damage = rand(8, 13)
+ var/extra_damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
+ if(extra_damage = A.dna.species.punchdamagelow)
playsound(D.loc, A.dna.species.miss_sound, 25, 1, -1)
D.visible_message("[A] has attempted to [atk_verb] [D]!", \
"[A] has attempted to [atk_verb] [D]!", null, COMBAT_MESSAGE_RANGE)
log_combat(A, D, "attempted to hit", atk_verb)
- return 0
-
+ return TRUE
+ damage += extra_damage
var/obj/item/bodypart/affecting = D.get_bodypart(ran_zone(A.zone_selected))
var/armor_block = D.run_armor_check(affecting, "melee")
diff --git a/code/datums/martial/cqc.dm b/code/datums/martial/cqc.dm
index c7644997ee..73173a4a9a 100644
--- a/code/datums/martial/cqc.dm
+++ b/code/datums/martial/cqc.dm
@@ -124,6 +124,8 @@
add_to_streak("G",D)
if(check_streak(A,D))
return TRUE
+ if(A == D) // no self grab.
+ return FALSE
if(A.grab_state >= GRAB_AGGRESSIVE)
D.grabbedby(A, 1)
else
diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm
index 6379d481ca..01b6167e8a 100644
--- a/code/datums/martial/krav_maga.dm
+++ b/code/datums/martial/krav_maga.dm
@@ -19,6 +19,9 @@
owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You don't want to harm other people!")
+ return
owner.visible_message("[owner] assumes the Neck Chop stance!", "Your next attack will be a Neck Chop.")
H.mind.martial_art.streak = "neck_chop"
@@ -36,6 +39,9 @@
owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You don't want to harm other people!")
+ return
owner.visible_message("[owner] assumes the Leg Sweep stance!", "Your next attack will be a Leg Sweep.")
H.mind.martial_art.streak = "leg_sweep"
@@ -53,6 +59,9 @@
owner.visible_message("[owner] assumes a neutral stance.", "Your next attack is cleared.")
H.mind.martial_art.streak = ""
else
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You don't want to harm other people!")
+ return
owner.visible_message("[owner] assumes the Lung Punch stance!", "Your next attack will be a Lung Punch.")
H.mind.martial_art.streak = "quick_choke"//internal name for lung punch
@@ -145,8 +154,6 @@
return 1
/datum/martial_art/krav_maga/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
- if(check_streak(A,D))
- return 1
var/obj/item/I = null
if(prob(60))
I = D.get_active_held_item()
diff --git a/code/datums/martial/psychotic_brawl.dm b/code/datums/martial/psychotic_brawl.dm
index 34301516dc..45d73353f9 100644
--- a/code/datums/martial/psychotic_brawl.dm
+++ b/code/datums/martial/psychotic_brawl.dm
@@ -1,6 +1,7 @@
/datum/martial_art/psychotic_brawling
name = "Psychotic Brawling"
id = MARTIALART_PSYCHOBRAWL
+ pacifism_check = FALSE //Quite uncontrollable and unpredictable, people will still end up harming others with it.
/datum/martial_art/psychotic_brawling/disarm_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
return psycho_attack(A,D)
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 801e8c8c7a..f89374dc2a 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -105,6 +105,8 @@
add_to_streak("G",D)
if(check_streak(A,D))
return 1
+ if(A == D) //no self grab stun
+ return FALSE
if(A.grab_state >= GRAB_AGGRESSIVE)
D.grabbedby(A, 1)
else
diff --git a/code/datums/martial/wrestling.dm b/code/datums/martial/wrestling.dm
index 81ec0bf977..d40af24acd 100644
--- a/code/datums/martial/wrestling.dm
+++ b/code/datums/martial/wrestling.dm
@@ -49,6 +49,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.")
return
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You are too HIPPIE to WRESTLE other living beings!")
+ return
owner.visible_message("[owner] prepares to BODY SLAM!", "Your next attack will be a BODY SLAM.")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "slam"
@@ -61,6 +64,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.")
return
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You are too HIPPIE to WRESTLE other living beings!")
+ return
owner.visible_message("[owner] prepares to THROW!", "Your next attack will be a THROW.")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "throw"
@@ -73,6 +79,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.")
return
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You are too HIPPIE to WRESTLE other living beings!")
+ return
owner.visible_message("[owner] prepares to KICK!", "Your next attack will be a KICK.")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "kick"
@@ -85,6 +94,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.")
return
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You are too HIPPIE to WRESTLE other living beings!")
+ return
owner.visible_message("[owner] prepares to STRIKE!", "Your next attack will be a STRIKE.")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "strike"
@@ -97,6 +109,9 @@
if(owner.incapacitated())
to_chat(owner, "You can't WRESTLE while you're OUT FOR THE COUNT.")
return
+ if(HAS_TRAIT(A, TRAIT_PACIFISM))
+ to_chat(A, "You are too HIPPIE to WRESTLE other living beings!")
+ return
owner.visible_message("[owner] prepares to LEG DROP!", "Your next attack will be a LEG DROP.")
var/mob/living/carbon/human/H = owner
H.mind.martial_art.streak = "drop"
@@ -433,8 +448,8 @@
/datum/martial_art/wrestling/grab_act(mob/living/carbon/human/A, mob/living/carbon/human/D)
if(check_streak(A,D))
return 1
- if(A.pulling == D)
- return 1
+ if(A == D) // don't stun grab yoursel
+ return FALSE
A.start_pulling(D)
D.visible_message("[A] gets [D] in a cinch!", \
"[A] gets [D] in a cinch!")
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f2b02b81fb..23ccc665b6 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -170,6 +170,7 @@
stop_pulling()
if(HAS_TRAIT(src, TRAIT_PACIFISM))
to_chat(src, "You gently let go of [throwable_mob].")
+ return
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
var/turf/end_T = get_turf(target)
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2ab7c6d404..327ad6760c 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -339,8 +339,10 @@
apply_damage(damage, BRUTE, affecting, armor_block)
/mob/living/carbon/human/mech_melee_attack(obj/mecha/M)
-
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings!")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 49ae178d8c..e83ab1edb7 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1476,7 +1476,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
- if(HAS_TRAIT(user, TRAIT_PACIFISM))
+ if((!attacker_style || attacker_style.pacifism_check) && HAS_TRAIT(user, TRAIT_PACIFISM))
to_chat(user, "You don't want to harm [target]!")
return FALSE
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
@@ -1678,6 +1678,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
return
if(M.mind)
attacker_style = M.mind.martial_art
+ if(attacker_style?.pacifism_check && HAS_TRAIT(M, TRAIT_PACIFISM)) // most martial arts are quite harmful, alas.
+ attacker_style = null
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK))
log_combat(M, H, "attempted to touch")
H.visible_message("[M] attempted to touch [H]!")
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 93e64fd4cc..722c984309 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -92,6 +92,9 @@
/mob/living/mech_melee_attack(obj/mecha/M)
if(M.occupant.a_intent == INTENT_HARM)
+ if(HAS_TRAIT(M.occupant, TRAIT_PACIFISM))
+ to_chat(M.occupant, "You don't want to harm other living beings!")
+ return
M.do_attack_animation(src)
if(M.damtype == "brute")
step_away(src,M,15)