From bbbfccd0c0fac000fe6a89c4de914efa1462d983 Mon Sep 17 00:00:00 2001 From: ta3754859-max Date: Thu, 20 Aug 2026 13:29:06 +0200 Subject: [PATCH 1/5] Sets it up for kicking --- code/__DEFINES/species/_species.dm | 18 ++++++++++++++++++ code/modules/mob/living/living.dm | 6 ++++++ 2 files changed, 24 insertions(+) diff --git a/code/__DEFINES/species/_species.dm b/code/__DEFINES/species/_species.dm index ef38a5ec434..646a0a348b3 100644 --- a/code/__DEFINES/species/_species.dm +++ b/code/__DEFINES/species/_species.dm @@ -23,6 +23,10 @@ #define SPEC_ID_ORC "orc" #define SPEC_ID_GOBLIN "goblin" +#define SPEC_ID_GOBLIN_HELL "goblin_hell" +#define SPEC_ID_GOBLIN_CAVE "goblin_cave" +#define SPEC_ID_GOBLIN_SEA "goblin_sea" +#define SPEC_ID_GOBLIN_MOON "goblin_moon" #define SPEC_ID_ROUSMAN "rousman" #define SPEC_ID_ZIZOMBIE "zizombie" @@ -370,3 +374,17 @@ #define SPECIES_CANNIBALISM_KOBOLD list(\ SPEC_ID_KOBOLD,\ ) +//Used in aiming, yes it's awful how I used each and every species but I made it use normal id instead id_override +#define SPECIES_SHORTIES list(\ + SPEC_ID_DWARF,\ + SPEC_ID_HALFLING,\ + SPEC_ID_KOBOLD,\ + SPEC_ID_ROUSMAN,\ + SPEC_ID_GOBLIN,\ + SPEC_ID_GOBLIN_HELL,\ + SPEC_ID_GOBLIN_CAVE,\ + SPEC_ID_GOBLIN_SEA,\ + SPEC_ID_GOBLIN_MOON,\ + SPEC_ID_KOBOLD_FORMIKRAG,\ + SPEC_ID_DWARF_SUBTERRAN,\ +) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 0057a129a91..02742d59d91 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -409,10 +409,16 @@ /mob/living/carbon/proc/kick_attack_check(mob/living/L) if(L == src) return FALSE + if(ishuman(src)) + var/mob/living/carbon/human/kicked = src + var/mob/living/carbon/human/kicker = L + if(((kicked.dna?.species.id in SPECIES_SHORTIES) || kicked.age == AGE_CHILD) && !((kicker.dna?.species.id in SPECIES_SHORTIES) || kicker.age == AGE_CHILD)) + return TRUE if(body_position == LYING_DOWN) return TRUE if(HAS_TRAIT(L, TRAIT_CLOSECOMBAT)) return TRUE + var/list/acceptable = list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_L_ARM) if( !(check_zone(L.zone_selected) in acceptable) ) to_chat(L, "I can't reach that.") From 278710eceef58c3e6db98214828b85d4ac69f15c Mon Sep 17 00:00:00 2001 From: ta3754859-max Date: Thu, 20 Aug 2026 14:37:37 +0200 Subject: [PATCH 2/5] Changes attack and makes NPCs respect it --- code/datums/ai/subtrees/human_basic_attack.dm | 3 +++ code/modules/mob/living/living.dm | 23 +++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/code/datums/ai/subtrees/human_basic_attack.dm b/code/datums/ai/subtrees/human_basic_attack.dm index 045a7a3a271..15803739649 100644 --- a/code/datums/ai/subtrees/human_basic_attack.dm +++ b/code/datums/ai/subtrees/human_basic_attack.dm @@ -180,6 +180,9 @@ if(HAS_TRAIT(target, TRAIT_BLOODLOSS_IMMUNE) || !CAN_HAVE_BLOOD(target)) pawn.aimheight_change(rand(12, 19)) return + if(pawn.dna?.species.id in SPECIES_SHORTIES) + pawn.aimheight_change(pick(rand(1, 4), rand(5, 8), rand(9, 11))) + return pawn.aimheight_change(pick(rand(5, 8), rand(9, 11), rand(12, 19))) /datum/ai_behavior/basic_melee_attack/human_npc/proc/_try_weapon_special(datum/ai_controller/controller) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 02742d59d91..a3dbe3d483a 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -409,7 +409,7 @@ /mob/living/carbon/proc/kick_attack_check(mob/living/L) if(L == src) return FALSE - if(ishuman(src)) + if(ishuman(src) && ishuman(L)) var/mob/living/carbon/human/kicked = src var/mob/living/carbon/human/kicker = L if(((kicked.dna?.species.id in SPECIES_SHORTIES) || kicked.age == AGE_CHILD) && !((kicker.dna?.species.id in SPECIES_SHORTIES) || kicker.age == AGE_CHILD)) @@ -428,6 +428,15 @@ /mob/living/carbon/proc/lying_attack_check(mob/living/L, obj/item/I) if(L == src) return TRUE + var/short_attacker = FALSE + var/short_victim = FALSE + if(ishuman(src) && ishuman(L)) + var/mob/living/carbon/human/attacked = src + var/mob/living/carbon/human/attacker = L + if((attacked.dna?.species.id in SPECIES_SHORTIES) || attacked.age == AGE_CHILD) + short_victim = TRUE + if((attacker.dna?.species.id in SPECIES_SHORTIES) || attacker.age == AGE_CHILD) + short_attacker = TRUE var/CZ = FALSE var/list/acceptable = list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG, BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_L_ARM) @@ -435,14 +444,14 @@ if(I) if(I.wlength > WLENGTH_NORMAL) CZ = TRUE - else if(HAS_TRAIT(L, TRAIT_TINY) && !HAS_TRAIT(src, TRAIT_TINY)) //midget variant, allows neck no head + else if((HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && !(HAS_TRAIT(src, TRAIT_TINY) || short_victim)) //midget variant, allows neck no head acceptable = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_PRECISE_R_HAND,BODY_ZONE_PRECISE_L_HAND,BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_NECK, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) - else if(!HAS_TRAIT(L, TRAIT_TINY)) //we have a short/medium weapon, so allow hitting legs + else if(!(HAS_TRAIT(L, TRAIT_TINY) || short_attacker)) //we have a short/medium weapon, so allow hitting legs acceptable = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_NECK, BODY_ZONE_PRECISE_R_EYE,BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_EARS, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_SKULL, BODY_ZONE_PRECISE_NOSE, BODY_ZONE_PRECISE_MOUTH) else - if(HAS_TRAIT(L, TRAIT_TINY) && !HAS_TRAIT(src, TRAIT_TINY) && (!CZ)) //tiny punches + if((HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && !(HAS_TRAIT(src, TRAIT_TINY) || short_victim) && (!CZ)) //tiny punches acceptable = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_PRECISE_R_HAND,BODY_ZONE_PRECISE_L_HAND,BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_CHEST, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) - else if(!HAS_TRAIT(L, TRAIT_TINY) && (!CZ)) //we are punching, no legs + else if(!(HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && (!CZ)) //we are punching, no legs acceptable = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_NECK, BODY_ZONE_PRECISE_R_EYE,BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_EARS, BODY_ZONE_PRECISE_SKULL, BODY_ZONE_PRECISE_NOSE, BODY_ZONE_PRECISE_MOUTH) else if(L.body_position == LYING_DOWN && (body_position != LYING_DOWN)) //we are prone, victim is standing if(I) @@ -457,11 +466,11 @@ CZ = TRUE if(CZ) if( !(check_zone(L.zone_selected) in acceptable) ) - to_chat(L, "I can't reach that.") + to_chat(L, span_danger("I can't reach that.")) return FALSE else if( !(L.zone_selected in acceptable) ) - to_chat(L, "I can't reach that.") + to_chat(L, span_danger("I can't reach that.")) return FALSE return TRUE From 18092cfbceb8a671b180e38e73ac7706d5dbd435 Mon Sep 17 00:00:00 2001 From: ta3754859-max Date: Thu, 20 Aug 2026 14:52:42 +0200 Subject: [PATCH 3/5] removes neck aiming --- code/modules/mob/living/living.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index a3dbe3d483a..c8747dbd8e2 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -444,8 +444,8 @@ if(I) if(I.wlength > WLENGTH_NORMAL) CZ = TRUE - else if((HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && !(HAS_TRAIT(src, TRAIT_TINY) || short_victim)) //midget variant, allows neck no head - acceptable = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_PRECISE_R_HAND,BODY_ZONE_PRECISE_L_HAND,BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_NECK, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) + else if((HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && !(HAS_TRAIT(src, TRAIT_TINY) || short_victim)) //midget variant, no neck as you any misses will hit head either way + acceptable = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_PRECISE_R_HAND,BODY_ZONE_PRECISE_L_HAND,BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_CHEST, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) else if(!(HAS_TRAIT(L, TRAIT_TINY) || short_attacker)) //we have a short/medium weapon, so allow hitting legs acceptable = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_NECK, BODY_ZONE_PRECISE_R_EYE,BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_EARS, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_SKULL, BODY_ZONE_PRECISE_NOSE, BODY_ZONE_PRECISE_MOUTH) else From 3438430be2a2f14e623148eafe06c62d2706aec6 Mon Sep 17 00:00:00 2001 From: ta3754859-max Date: Thu, 20 Aug 2026 14:57:01 +0200 Subject: [PATCH 4/5] goblins aim head against dwarfs --- code/datums/ai/subtrees/human_basic_attack.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/datums/ai/subtrees/human_basic_attack.dm b/code/datums/ai/subtrees/human_basic_attack.dm index 15803739649..23a32afa421 100644 --- a/code/datums/ai/subtrees/human_basic_attack.dm +++ b/code/datums/ai/subtrees/human_basic_attack.dm @@ -180,7 +180,8 @@ if(HAS_TRAIT(target, TRAIT_BLOODLOSS_IMMUNE) || !CAN_HAVE_BLOOD(target)) pawn.aimheight_change(rand(12, 19)) return - if(pawn.dna?.species.id in SPECIES_SHORTIES) + var/mob/living/carbon/human/attacked = target + if((pawn.dna?.species.id in SPECIES_SHORTIES) && !((attacked.dna?.species.id in SPECIES_SHORTIES) || attacked.age == AGE_CHILD)) // should still aim head against dwarfs or younglings pawn.aimheight_change(pick(rand(1, 4), rand(5, 8), rand(9, 11))) return pawn.aimheight_change(pick(rand(5, 8), rand(9, 11), rand(12, 19))) From b1b14fbc7e9a99bec1834fe6b1e0e6985bf5d4a8 Mon Sep 17 00:00:00 2001 From: ta3754859-max Date: Thu, 20 Aug 2026 21:28:07 +0200 Subject: [PATCH 5/5] checks for tiny trait properly --- code/datums/ai/subtrees/human_basic_attack.dm | 2 +- code/modules/mob/living/living.dm | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/datums/ai/subtrees/human_basic_attack.dm b/code/datums/ai/subtrees/human_basic_attack.dm index 23a32afa421..b0f732a3542 100644 --- a/code/datums/ai/subtrees/human_basic_attack.dm +++ b/code/datums/ai/subtrees/human_basic_attack.dm @@ -181,7 +181,7 @@ pawn.aimheight_change(rand(12, 19)) return var/mob/living/carbon/human/attacked = target - if((pawn.dna?.species.id in SPECIES_SHORTIES) && !((attacked.dna?.species.id in SPECIES_SHORTIES) || attacked.age == AGE_CHILD)) // should still aim head against dwarfs or younglings + if((pawn.dna?.species.id in SPECIES_SHORTIES) && !((attacked.dna?.species.id in SPECIES_SHORTIES) || attacked.age == AGE_CHILD || HAS_TRAIT(attacked, TRAIT_TINY))) // should still aim head against dwarfs or younglings pawn.aimheight_change(pick(rand(1, 4), rand(5, 8), rand(9, 11))) return pawn.aimheight_change(pick(rand(5, 8), rand(9, 11), rand(12, 19))) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index c8747dbd8e2..6114d2569f5 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -412,7 +412,7 @@ if(ishuman(src) && ishuman(L)) var/mob/living/carbon/human/kicked = src var/mob/living/carbon/human/kicker = L - if(((kicked.dna?.species.id in SPECIES_SHORTIES) || kicked.age == AGE_CHILD) && !((kicker.dna?.species.id in SPECIES_SHORTIES) || kicker.age == AGE_CHILD)) + if(((kicked.dna?.species.id in SPECIES_SHORTIES) || kicked.age == AGE_CHILD || HAS_TRAIT(kicked, TRAIT_TINY)) && !((kicker.dna?.species.id in SPECIES_SHORTIES) || kicker.age == AGE_CHILD || HAS_TRAIT(kicker, TRAIT_TINY))) return TRUE if(body_position == LYING_DOWN) return TRUE @@ -433,9 +433,9 @@ if(ishuman(src) && ishuman(L)) var/mob/living/carbon/human/attacked = src var/mob/living/carbon/human/attacker = L - if((attacked.dna?.species.id in SPECIES_SHORTIES) || attacked.age == AGE_CHILD) + if((attacked.dna?.species.id in SPECIES_SHORTIES) || attacked.age == AGE_CHILD || HAS_TRAIT(attacked, TRAIT_TINY)) short_victim = TRUE - if((attacker.dna?.species.id in SPECIES_SHORTIES) || attacker.age == AGE_CHILD) + if((attacker.dna?.species.id in SPECIES_SHORTIES) || attacker.age == AGE_CHILD || HAS_TRAIT(attacker, TRAIT_TINY)) short_attacker = TRUE var/CZ = FALSE @@ -444,14 +444,14 @@ if(I) if(I.wlength > WLENGTH_NORMAL) CZ = TRUE - else if((HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && !(HAS_TRAIT(src, TRAIT_TINY) || short_victim)) //midget variant, no neck as you any misses will hit head either way + else if(short_attacker && !short_victim) //midget variant, no neck as you any misses will hit head either way acceptable = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_PRECISE_R_HAND,BODY_ZONE_PRECISE_L_HAND,BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_CHEST, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) - else if(!(HAS_TRAIT(L, TRAIT_TINY) || short_attacker)) //we have a short/medium weapon, so allow hitting legs + else if(!short_attacker) //we have a short/medium weapon, so allow hitting legs acceptable = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_NECK, BODY_ZONE_PRECISE_R_EYE,BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_EARS, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_SKULL, BODY_ZONE_PRECISE_NOSE, BODY_ZONE_PRECISE_MOUTH) else - if((HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && !(HAS_TRAIT(src, TRAIT_TINY) || short_victim) && (!CZ)) //tiny punches + if(short_attacker && !short_victim && (!CZ)) //tiny punches acceptable = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_PRECISE_R_HAND,BODY_ZONE_PRECISE_L_HAND,BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_CHEST, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG, BODY_ZONE_PRECISE_R_FOOT, BODY_ZONE_PRECISE_L_FOOT) - else if(!(HAS_TRAIT(L, TRAIT_TINY) || short_attacker) && (!CZ)) //we are punching, no legs + else if(!(short_attacker) && (!CZ)) //we are punching, no legs acceptable = list(BODY_ZONE_HEAD, BODY_ZONE_PRECISE_MOUTH, BODY_ZONE_R_ARM, BODY_ZONE_CHEST, BODY_ZONE_PRECISE_GROIN, BODY_ZONE_PRECISE_STOMACH, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_L_ARM, BODY_ZONE_PRECISE_NECK, BODY_ZONE_PRECISE_R_EYE,BODY_ZONE_PRECISE_L_EYE, BODY_ZONE_PRECISE_EARS, BODY_ZONE_PRECISE_SKULL, BODY_ZONE_PRECISE_NOSE, BODY_ZONE_PRECISE_MOUTH) else if(L.body_position == LYING_DOWN && (body_position != LYING_DOWN)) //we are prone, victim is standing if(I)