diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
index 6fc5d847a04..99b4b0623d5 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm
@@ -456,13 +456,13 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/blood,
/obj/item/bodypart/head,
-/obj/item/bodypart/l_arm{
+/obj/item/bodypart/arm/left{
pixel_x = -9;
pixel_y = -9
},
-/obj/item/bodypart/l_leg,
-/obj/item/bodypart/r_arm,
-/obj/item/bodypart/r_leg{
+/obj/item/bodypart/leg/left,
+/obj/item/bodypart/arm/right,
+/obj/item/bodypart/leg/right{
pixel_x = 8;
pixel_y = 4
},
diff --git a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
index 7382b13e1a7..94736f4dd58 100644
--- a/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
+++ b/_maps/RandomRuins/SpaceRuins/TheDerelict.dmm
@@ -4613,7 +4613,7 @@
/area/space/nearstation)
"HN" = (
/obj/item/bodypart/head/monkey,
-/obj/item/bodypart/l_leg/monkey{
+/obj/item/bodypart/leg/left/monkey{
pixel_x = 8;
pixel_y = -5
},
@@ -5026,7 +5026,7 @@
pixel_y = 17;
pixel_x = 10
},
-/obj/item/bodypart/r_leg/monkey{
+/obj/item/bodypart/leg/right/monkey{
pixel_x = -5
},
/obj/item/bodypart/head/monkey{
diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm
index 42b21b79495..7e0576d5c2c 100644
--- a/_maps/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/RandomZLevels/moonoutpost19.dmm
@@ -6053,7 +6053,7 @@
pixel_x = -5;
pixel_y = -2
},
-/obj/item/bodypart/l_arm/robot,
+/obj/item/bodypart/arm/left/robot,
/turf/open/floor/iron/white{
heat_capacity = 1e+006
},
diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm
index 4f080ece2b1..486905e09db 100644
--- a/_maps/map_files/Deltastation/DeltaStation2.dmm
+++ b/_maps/map_files/Deltastation/DeltaStation2.dmm
@@ -19117,10 +19117,10 @@
/area/station/engineering/storage/tech)
"eCO" = (
/obj/item/stack/cable_coil,
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/right/robot{
pixel_x = 3
},
-/obj/item/bodypart/l_arm/robot{
+/obj/item/bodypart/arm/left/robot{
pixel_x = -3
},
/obj/structure/table,
@@ -45860,10 +45860,10 @@
"lbz" = (
/obj/structure/table/reinforced,
/obj/item/bodypart/chest/robot,
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/right/robot{
pixel_x = 6
},
-/obj/item/bodypart/l_arm/robot{
+/obj/item/bodypart/arm/left/robot{
pixel_x = -6
},
/obj/effect/turf_decal/tile/neutral/fourcorners,
@@ -81528,8 +81528,8 @@
"tTe" = (
/obj/structure/table/reinforced,
/obj/item/folder/blue,
-/obj/item/bodypart/l_leg/robot,
-/obj/item/bodypart/r_leg/robot,
+/obj/item/bodypart/leg/left/robot,
+/obj/item/bodypart/leg/right/robot,
/obj/effect/turf_decal/tile/neutral/fourcorners,
/turf/open/floor/iron/dark,
/area/station/ai_monitored/turret_protected/ai)
diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
index 3ad29e7ea4f..896dedbd395 100644
--- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm
+++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm
@@ -53199,13 +53199,13 @@
"qrg" = (
/obj/item/bodypart/head,
/obj/effect/decal/cleanable/blood,
-/obj/item/bodypart/l_arm{
+/obj/item/bodypart/arm/left{
pixel_x = -9;
pixel_y = -9
},
-/obj/item/bodypart/l_leg,
-/obj/item/bodypart/r_arm,
-/obj/item/bodypart/r_leg{
+/obj/item/bodypart/leg/left,
+/obj/item/bodypart/arm/right,
+/obj/item/bodypart/leg/right{
pixel_x = 8;
pixel_y = 4
},
diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm
index b1bf739424c..4eca0ce985a 100644
--- a/_maps/map_files/KiloStation/KiloStation.dmm
+++ b/_maps/map_files/KiloStation/KiloStation.dmm
@@ -28737,17 +28737,17 @@
/obj/item/bodypart/chest/robot{
pixel_y = 4
},
-/obj/item/bodypart/r_leg/robot{
+/obj/item/bodypart/leg/right/robot{
pixel_x = 6
},
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/right/robot{
pixel_x = 6;
pixel_y = 6
},
-/obj/item/bodypart/l_leg/robot{
+/obj/item/bodypart/leg/left/robot{
pixel_x = -6
},
-/obj/item/bodypart/l_arm/robot{
+/obj/item/bodypart/arm/left/robot{
pixel_x = -6;
pixel_y = 6
},
diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index b6fe7585cb9..d8883f89e6c 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -5118,7 +5118,7 @@
/turf/open/floor/plating,
/area/station/maintenance/department/engine)
"bQk" = (
-/obj/item/bodypart/l_arm,
+/obj/item/bodypart/arm/left,
/turf/open/floor/plating/airless,
/area/station/science/ordnance/bomb)
"bQs" = (
@@ -6036,7 +6036,7 @@
/turf/open/floor/iron,
/area/station/hallway/primary/central)
"cmH" = (
-/obj/item/bodypart/l_leg,
+/obj/item/bodypart/leg/left,
/turf/open/floor/plating/airless,
/area/station/science/ordnance/bomb)
"cnc" = (
@@ -65776,10 +65776,10 @@
"xgi" = (
/obj/structure/table/reinforced,
/obj/effect/turf_decal/bot,
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/right/robot{
pixel_x = 3
},
-/obj/item/bodypart/l_arm/robot{
+/obj/item/bodypart/arm/left/robot{
pixel_x = -3
},
/obj/structure/extinguisher_cabinet/directional/north,
diff --git a/_maps/shuttles/infiltrator_advanced.dmm b/_maps/shuttles/infiltrator_advanced.dmm
index b093c695da8..ed6813149f6 100644
--- a/_maps/shuttles/infiltrator_advanced.dmm
+++ b/_maps/shuttles/infiltrator_advanced.dmm
@@ -1877,10 +1877,10 @@
pixel_y = 16
},
/obj/structure/table/reinforced,
-/obj/item/bodypart/l_arm/robot{
+/obj/item/bodypart/arm/left/robot{
pixel_x = -6
},
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/right/robot{
pixel_x = 6
},
/obj/item/hemostat,
diff --git a/_maps/shuttles/infiltrator_basic.dmm b/_maps/shuttles/infiltrator_basic.dmm
index 8b3f521dc1d..7b450223591 100644
--- a/_maps/shuttles/infiltrator_basic.dmm
+++ b/_maps/shuttles/infiltrator_basic.dmm
@@ -876,11 +876,11 @@
"zj" = (
/obj/structure/table/reinforced,
/obj/machinery/light/directional/west,
-/obj/item/bodypart/l_arm/robot{
+/obj/item/bodypart/arm/left/robot{
pixel_x = -4;
pixel_y = 8
},
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/right/robot{
pixel_x = -10;
pixel_y = 9
},
diff --git a/_maps/shuttles/whiteship_kilo.dmm b/_maps/shuttles/whiteship_kilo.dmm
index 754ce7c830b..dbed0e12bd3 100644
--- a/_maps/shuttles/whiteship_kilo.dmm
+++ b/_maps/shuttles/whiteship_kilo.dmm
@@ -21,7 +21,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/general/visible,
/obj/item/bikehorn/rubberducky,
/obj/structure/closet/crate/trashcart/filled,
-/obj/item/bodypart/r_arm/robot/surplus{
+/obj/item/bodypart/arm/right/robot/surplus{
name = "rusty robotic arm";
desc = "A rusted and decayed robotic arm. Probably still works... Probably."
},
diff --git a/_maps/templates/battlecruiser_starfury.dmm b/_maps/templates/battlecruiser_starfury.dmm
index b0e721586fa..b6a025b1da9 100644
--- a/_maps/templates/battlecruiser_starfury.dmm
+++ b/_maps/templates/battlecruiser_starfury.dmm
@@ -1083,12 +1083,12 @@
/area/shuttle/sbc_starfury)
"dW" = (
/obj/structure/table,
-/obj/item/bodypart/l_arm/robot,
-/obj/item/bodypart/l_arm/robot,
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/left/robot,
+/obj/item/bodypart/arm/left/robot,
+/obj/item/bodypart/arm/right/robot{
pixel_x = 3
},
-/obj/item/bodypart/r_arm/robot{
+/obj/item/bodypart/arm/right/robot{
pixel_x = 3
},
/obj/item/book/manual/wiki/surgery,
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 157d5f61d76..8038bc4ea92 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -208,10 +208,10 @@
//Health doll screws for human mobs
#define SCREWYDOLL_HEAD /obj/item/bodypart/head
#define SCREWYDOLL_CHEST /obj/item/bodypart/chest
-#define SCREWYDOLL_L_ARM /obj/item/bodypart/l_arm
-#define SCREWYDOLL_R_ARM /obj/item/bodypart/r_arm
-#define SCREWYDOLL_L_LEG /obj/item/bodypart/l_leg
-#define SCREWYDOLL_R_LEG /obj/item/bodypart/r_leg
+#define SCREWYDOLL_L_ARM /obj/item/bodypart/arm/left
+#define SCREWYDOLL_R_ARM /obj/item/bodypart/arm/right
+#define SCREWYDOLL_L_LEG /obj/item/bodypart/leg/left
+#define SCREWYDOLL_R_LEG /obj/item/bodypart/leg/right
//Threshold levels for beauty for humans
#define BEAUTY_LEVEL_HORRID -66
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index 17d1156122a..909bfbc2ba1 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -955,3 +955,12 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/// Makes a species be better/worse at defending against tackling depending on their tail's status
#define TRAIT_TACKLING_TAILED_DEFENDER "tackling_tailed_defender"
+
+/// some trait sorces dirived from bodyparts BODYPART_TRAIT is generic.
+#define BODYPART_TRAIT "bodypart"
+#define HEAD_TRAIT "head"
+#define CHEST_TRAIT "chest"
+#define RIGHT_ARM_TRAIT "right_arm"
+#define LEFT_ARM_TRAIT "left_arm"
+#define RIGHT_LEG_TRAIT "right_leg"
+#define LEFT_LEG_TRAIT "left_leg"
diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm
index 7d66f8b4d4b..069521982fc 100644
--- a/code/datums/components/crafting/recipes.dm
+++ b/code/datums/components/crafting/recipes.dm
@@ -338,8 +338,8 @@
reqs = list(/obj/item/robot_suit = 1,
/obj/item/clothing/head/helmet = 1,
/obj/item/clothing/suit/armor/vest = 1,
- /obj/item/bodypart/l_leg/robot = 1,
- /obj/item/bodypart/r_leg/robot = 1,
+ /obj/item/bodypart/leg/left/robot = 1,
+ /obj/item/bodypart/leg/right/robot = 1,
/obj/item/stack/sheet/iron = 1,
/obj/item/stack/cable_coil = 1,
/obj/item/gun/energy/disabler = 1,
@@ -355,7 +355,7 @@
/obj/item/clothing/head/helmet/sec = 1,
/obj/item/melee/baton/security/ = 1,
/obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
+ /obj/item/bodypart/arm/right/robot = 1)
tool_behaviors = list(TOOL_WELDER)
time = 6 SECONDS
category = CAT_ROBOT
@@ -365,7 +365,7 @@
result = /mob/living/simple_animal/bot/cleanbot
reqs = list(/obj/item/reagent_containers/cup/bucket = 1,
/obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
+ /obj/item/bodypart/arm/right/robot = 1)
parts = list(/obj/item/reagent_containers/cup/bucket = 1)
time = 4 SECONDS
category = CAT_ROBOT
@@ -376,7 +376,7 @@
reqs = list(/obj/item/storage/toolbox = 1,
/obj/item/stack/tile/iron = 10,
/obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
+ /obj/item/bodypart/arm/right/robot = 1)
time = 4 SECONDS
category = CAT_ROBOT
@@ -386,7 +386,7 @@
reqs = list(/obj/item/healthanalyzer = 1,
/obj/item/storage/medkit = 1,
/obj/item/assembly/prox_sensor = 1,
- /obj/item/bodypart/r_arm/robot = 1)
+ /obj/item/bodypart/arm/right/robot = 1)
parts = list(
/obj/item/storage/medkit = 1,
/obj/item/healthanalyzer = 1,
@@ -418,7 +418,7 @@
name = "Honkbot"
result = /mob/living/simple_animal/bot/secbot/honkbot
reqs = list(/obj/item/storage/box/clown = 1,
- /obj/item/bodypart/r_arm/robot = 1,
+ /obj/item/bodypart/arm/right/robot = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/bikehorn/ = 1)
time = 4 SECONDS
@@ -428,7 +428,7 @@
name = "Firebot"
result = /mob/living/simple_animal/bot/firebot
reqs = list(/obj/item/extinguisher = 1,
- /obj/item/bodypart/r_arm/robot = 1,
+ /obj/item/bodypart/arm/right/robot = 1,
/obj/item/assembly/prox_sensor = 1,
/obj/item/clothing/head/utility/hardhat/red = 1)
time = 4 SECONDS
@@ -458,8 +458,8 @@
name = "Vim"
result = /obj/vehicle/sealed/car/vim
reqs = list(/obj/item/clothing/head/helmet/space/eva = 1,
- /obj/item/bodypart/l_leg/robot = 1,
- /obj/item/bodypart/r_leg/robot = 1,
+ /obj/item/bodypart/leg/left/robot = 1,
+ /obj/item/bodypart/leg/right/robot = 1,
/obj/item/flashlight = 1,
/obj/item/assembly/voice = 1)
tool_behaviors = list(TOOL_SCREWDRIVER)
@@ -857,13 +857,13 @@
/datum/crafting_recipe/extendohand_r
name = "Extendo-Hand (Right Arm)"
- reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
+ reqs = list(/obj/item/bodypart/arm/right/robot = 1, /obj/item/clothing/gloves/boxing = 1)
result = /obj/item/extendohand
category = CAT_MISC
/datum/crafting_recipe/extendohand_l
name = "Extendo-Hand (Left Arm)"
- reqs = list(/obj/item/bodypart/l_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1)
+ reqs = list(/obj/item/bodypart/arm/left/robot = 1, /obj/item/clothing/gloves/boxing = 1)
result = /obj/item/extendohand
category = CAT_MISC
diff --git a/code/datums/elements/kneejerk.dm b/code/datums/elements/kneejerk.dm
index e0b443f28a9..e70a8ed840a 100644
--- a/code/datums/elements/kneejerk.dm
+++ b/code/datums/elements/kneejerk.dm
@@ -27,16 +27,16 @@
/datum/element/kneejerk/proc/tap_knee(obj/item/item, mob/living/target, mob/living/user)
var/selected_zone = user.zone_selected
- var/obj/item/bodypart/r_leg = target.get_bodypart(BODY_ZONE_R_LEG)
- var/obj/item/bodypart/l_leg = target.get_bodypart(BODY_ZONE_L_LEG)
+ var/obj/item/bodypart/leg/right = target.get_bodypart(BODY_ZONE_R_LEG)
+ var/obj/item/bodypart/leg/left = target.get_bodypart(BODY_ZONE_L_LEG)
var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN)
if(!ishuman(target))
return
- if((selected_zone == BODY_ZONE_R_LEG) && !r_leg)
+ if((selected_zone == BODY_ZONE_R_LEG) && !right)
return
- if((selected_zone == BODY_ZONE_L_LEG) && !l_leg)
+ if((selected_zone == BODY_ZONE_L_LEG) && !left)
return
user.do_attack_animation(target)
diff --git a/code/datums/martial/boxing.dm b/code/datums/martial/boxing.dm
index 9f79115630c..9677805f12d 100644
--- a/code/datums/martial/boxing.dm
+++ b/code/datums/martial/boxing.dm
@@ -13,15 +13,15 @@
/datum/martial_art/boxing/harm_act(mob/living/A, mob/living/D)
var/mob/living/carbon/human/attacker_human = A
- var/datum/species/species = attacker_human.dna.species
+ var/obj/item/bodypart/arm/active_arm = attacker_human.get_active_hand()
A.do_attack_animation(D, ATTACK_EFFECT_PUNCH)
var/atk_verb = pick("left hook","right hook","straight punch")
- var/damage = rand(5, 8) + species.punchdamagelow
+ var/damage = rand(5, 8) + active_arm.unarmed_damage_low
if(!damage)
- playsound(D.loc, species.miss_sound, 25, TRUE, -1)
+ playsound(D.loc, active_arm.unarmed_miss_sound, 25, TRUE, -1)
D.visible_message(span_warning("[A]'s [atk_verb] misses [D]!"), \
span_danger("You avoid [A]'s [atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, A)
to_chat(A, span_warning("Your [atk_verb] misses [D]!"))
@@ -32,7 +32,7 @@
var/obj/item/bodypart/affecting = D.get_bodypart(D.get_random_valid_zone(A.zone_selected))
var/armor_block = D.run_armor_check(affecting, MELEE)
- playsound(D.loc, species.attack_sound, 25, TRUE, -1)
+ playsound(D.loc, active_arm.unarmed_attack_sound, 25, TRUE, -1)
D.visible_message(span_danger("[A] [atk_verb]ed [D]!"), \
span_userdanger("You're [atk_verb]ed by [A]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, A)
diff --git a/code/datums/quirks/negative.dm b/code/datums/quirks/negative.dm
index 48e50e4f6ed..79ab5a0485e 100644
--- a/code/datums/quirks/negative.dm
+++ b/code/datums/quirks/negative.dm
@@ -467,16 +467,16 @@
var/obj/item/bodypart/prosthetic
switch(limb_slot)
if(BODY_ZONE_L_ARM)
- prosthetic = new /obj/item/bodypart/l_arm/robot/surplus
+ prosthetic = new /obj/item/bodypart/arm/left/robot/surplus
slot_string = "left arm"
if(BODY_ZONE_R_ARM)
- prosthetic = new /obj/item/bodypart/r_arm/robot/surplus
+ prosthetic = new /obj/item/bodypart/arm/right/robot/surplus
slot_string = "right arm"
if(BODY_ZONE_L_LEG)
- prosthetic = new /obj/item/bodypart/l_leg/robot/surplus
+ prosthetic = new /obj/item/bodypart/leg/left/robot/surplus
slot_string = "left leg"
if(BODY_ZONE_R_LEG)
- prosthetic = new /obj/item/bodypart/r_leg/robot/surplus
+ prosthetic = new /obj/item/bodypart/leg/right/robot/surplus
slot_string = "right leg"
human_holder.del_and_replace_bodypart(prosthetic)
@@ -494,10 +494,10 @@
/datum/quirk/quadruple_amputee/add_unique()
var/mob/living/carbon/human/human_holder = quirk_holder
- human_holder.del_and_replace_bodypart(new /obj/item/bodypart/l_arm/robot/surplus)
- human_holder.del_and_replace_bodypart(new /obj/item/bodypart/r_arm/robot/surplus)
- human_holder.del_and_replace_bodypart(new /obj/item/bodypart/l_leg/robot/surplus)
- human_holder.del_and_replace_bodypart(new /obj/item/bodypart/r_leg/robot/surplus)
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/left/robot/surplus)
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/arm/right/robot/surplus)
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/left/robot/surplus)
+ human_holder.del_and_replace_bodypart(new /obj/item/bodypart/leg/right/robot/surplus)
/datum/quirk/quadruple_amputee/post_add()
to_chat(quirk_holder, span_boldannounce("All your limbs have been replaced with surplus prosthetics. They are fragile and will easily come apart under duress. Additionally, \
diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm
index 9ce7af7fc4b..fada8508ae9 100644
--- a/code/datums/status_effects/wound_effects.dm
+++ b/code/datums/status_effects/wound_effects.dm
@@ -31,9 +31,9 @@
alert_type = /atom/movable/screen/alert/status_effect/limp
var/msg_stage = 0//so you dont get the most intense messages immediately
/// The left leg of the limping person
- var/obj/item/bodypart/l_leg/left
+ var/obj/item/bodypart/leg/left/left
/// The right leg of the limping person
- var/obj/item/bodypart/r_leg/right
+ var/obj/item/bodypart/leg/right/right
/// Which leg we're limping with next
var/obj/item/bodypart/next_leg
/// How many deciseconds we limp for on the left leg
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index aeb98270b6a..8902a39436e 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -471,13 +471,13 @@
if(!heads)
heads = typesof(/obj/item/bodypart/head)
if(!l_arms)
- l_arms = typesof(/obj/item/bodypart/l_arm)
+ l_arms = typesof(/obj/item/bodypart/arm/left)
if(!r_arms)
- r_arms = typesof(/obj/item/bodypart/r_arm)
+ r_arms = typesof(/obj/item/bodypart/arm/right)
if(!l_legs)
- l_legs = typesof(/obj/item/bodypart/l_leg)
+ l_legs = typesof(/obj/item/bodypart/leg/left)
if(!r_legs)
- r_legs = typesof(/obj/item/bodypart/r_leg)
+ r_legs = typesof(/obj/item/bodypart/leg/right)
/obj/effect/anomaly/bioscrambler/anomalyEffect(delta_time)
. = ..()
diff --git a/code/game/objects/items/extinguisher.dm b/code/game/objects/items/extinguisher.dm
index 834c60e1e9c..47cf2295f4b 100644
--- a/code/game/objects/items/extinguisher.dm
+++ b/code/game/objects/items/extinguisher.dm
@@ -254,7 +254,7 @@
//firebot assembly
/obj/item/extinguisher/attackby(obj/O, mob/user, params)
- if(istype(O, /obj/item/bodypart/l_arm/robot) || istype(O, /obj/item/bodypart/r_arm/robot))
+ if(istype(O, /obj/item/bodypart/arm/left/robot) || istype(O, /obj/item/bodypart/arm/right/robot))
to_chat(user, span_notice("You add [O] to [src]."))
qdel(O)
qdel(src)
diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm
index 0098632313c..fbea7a5cd10 100644
--- a/code/game/objects/items/food/pizza.dm
+++ b/code/game/objects/items/food/pizza.dm
@@ -314,9 +314,9 @@
/obj/item/food/proc/try_break_off(mob/living/attacker, mob/living/user) //maybe i give you a pizza maybe i break off your arm
if(prob(50) || (attacker != user) || !iscarbon(user) || HAS_TRAIT(user, TRAIT_NODISMEMBER))
return
- var/obj/item/bodypart/l_arm = user.get_bodypart(BODY_ZONE_L_ARM)
- var/obj/item/bodypart/r_arm = user.get_bodypart(BODY_ZONE_R_ARM)
- var/did_the_thing = (l_arm?.dismember() || r_arm?.dismember()) //not all limbs can be removed, so important to check that we did. the. thing.
+ var/obj/item/bodypart/arm/left = user.get_bodypart(BODY_ZONE_L_ARM)
+ var/obj/item/bodypart/arm/right = user.get_bodypart(BODY_ZONE_R_ARM)
+ var/did_the_thing = (left?.dismember() || right?.dismember()) //not all limbs can be removed, so important to check that we did. the. thing.
if(!did_the_thing)
return
to_chat(user, span_userdanger("Maybe I'll give you a pizza, maybe I'll break off your arm.")) //makes the reference more obvious
diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm
index dd60391ac01..491a62e966b 100644
--- a/code/game/objects/items/robot/robot_parts.dm
+++ b/code/game/objects/items/robot/robot_parts.dm
@@ -8,13 +8,13 @@
icon = 'icons/mob/augmentation/augments.dmi'
icon_state = "robo_suit"
/// Left arm part of the endoskeleton
- var/obj/item/bodypart/l_arm/robot/l_arm = null
+ var/obj/item/bodypart/arm/left/robot/l_arm = null
/// Right arm part of the endoskeleton
- var/obj/item/bodypart/r_arm/robot/r_arm = null
+ var/obj/item/bodypart/arm/right/robot/r_arm = null
/// Left leg part of this endoskeleton
- var/obj/item/bodypart/l_leg/robot/l_leg = null
+ var/obj/item/bodypart/leg/left/robot/l_leg = null
/// Right leg part of this endoskeleton
- var/obj/item/bodypart/r_leg/robot/r_leg = null
+ var/obj/item/bodypart/leg/right/robot/r_leg = null
/// Chest part of this endoskeleton
var/obj/item/bodypart/chest/robot/chest = null
/// Head part of this endoskeleton
@@ -162,7 +162,7 @@
else
to_chat(user, span_warning("You need one sheet of iron to start building ED-209!"))
return
- else if(istype(W, /obj/item/bodypart/l_leg/robot))
+ else if(istype(W, /obj/item/bodypart/leg/left/robot))
if(l_leg)
return
if(!user.transferItemToLoc(W, src))
@@ -172,7 +172,7 @@
l_leg = W
update_appearance()
- else if(istype(W, /obj/item/bodypart/r_leg/robot))
+ else if(istype(W, /obj/item/bodypart/leg/right/robot))
if(src.r_leg)
return
if(!user.transferItemToLoc(W, src))
@@ -182,7 +182,7 @@
r_leg = W
update_appearance()
- else if(istype(W, /obj/item/bodypart/l_arm/robot))
+ else if(istype(W, /obj/item/bodypart/arm/left/robot))
if(l_arm)
return
if(!user.transferItemToLoc(W, src))
@@ -192,7 +192,7 @@
l_arm = W
update_appearance()
- else if(istype(W, /obj/item/bodypart/r_arm/robot))
+ else if(istype(W, /obj/item/bodypart/arm/right/robot))
if(r_arm)
return
if(!user.transferItemToLoc(W, src))
diff --git a/code/game/objects/items/storage/boxes/job_boxes.dm b/code/game/objects/items/storage/boxes/job_boxes.dm
index 47e9cd16e50..5c4dd535a39 100644
--- a/code/game/objects/items/storage/boxes/job_boxes.dm
+++ b/code/game/objects/items/storage/boxes/job_boxes.dm
@@ -147,7 +147,7 @@
illustration = "clown"
/obj/item/storage/box/clown/attackby(obj/item/I, mob/user, params)
- if((istype(I, /obj/item/bodypart/l_arm/robot)) || (istype(I, /obj/item/bodypart/r_arm/robot)))
+ if((istype(I, /obj/item/bodypart/arm/left/robot)) || (istype(I, /obj/item/bodypart/arm/right/robot)))
if(contents.len) //prevent accidently deleting contents
balloon_alert(user, "items inside!")
return
diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm
index cb7ccd4edf5..81c2827fe3c 100644
--- a/code/game/objects/items/storage/medkit.dm
+++ b/code/game/objects/items/storage/medkit.dm
@@ -278,7 +278,7 @@
//medibot assembly
/obj/item/storage/medkit/attackby(obj/item/bodypart/bodypart, mob/user, params)
- if((!istype(bodypart, /obj/item/bodypart/l_arm/robot)) && (!istype(bodypart, /obj/item/bodypart/r_arm/robot)))
+ if((!istype(bodypart, /obj/item/bodypart/arm/left/robot)) && (!istype(bodypart, /obj/item/bodypart/arm/right/robot)))
return ..()
//Making a medibot!
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 22445deaf37..8dd2715302a 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -222,14 +222,14 @@
/obj/structure/closet/crate/freezer/surplus_limbs/PopulateContents()
. = ..()
- new /obj/item/bodypart/l_arm/robot/surplus(src)
- new /obj/item/bodypart/l_arm/robot/surplus(src)
- new /obj/item/bodypart/r_arm/robot/surplus(src)
- new /obj/item/bodypart/r_arm/robot/surplus(src)
- new /obj/item/bodypart/l_leg/robot/surplus(src)
- new /obj/item/bodypart/l_leg/robot/surplus(src)
- new /obj/item/bodypart/r_leg/robot/surplus(src)
- new /obj/item/bodypart/r_leg/robot/surplus(src)
+ new /obj/item/bodypart/arm/left/robot/surplus(src)
+ new /obj/item/bodypart/arm/left/robot/surplus(src)
+ new /obj/item/bodypart/arm/right/robot/surplus(src)
+ new /obj/item/bodypart/arm/right/robot/surplus(src)
+ new /obj/item/bodypart/leg/left/robot/surplus(src)
+ new /obj/item/bodypart/leg/left/robot/surplus(src)
+ new /obj/item/bodypart/leg/right/robot/surplus(src)
+ new /obj/item/bodypart/leg/right/robot/surplus(src)
/obj/structure/closet/crate/radiation
desc = "A crate with a radiation sign on it."
diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
index e98fdc606e6..366a0ea39ee 100644
--- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm
@@ -238,7 +238,7 @@
required_atoms = list(
/obj/item/organ/internal/eyes = 1,
/obj/effect/decal/cleanable/blood = 1,
- /obj/item/bodypart/l_arm = 1,
+ /obj/item/bodypart/arm/left = 1,
)
mob_to_summon = /mob/living/simple_animal/hostile/heretic_summon/raw_prophet
cost = 1
diff --git a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm
index bdfff87e15e..bd4c3e75112 100644
--- a/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm
+++ b/code/modules/antagonists/heretic/knowledge/side_ash_flesh.dm
@@ -28,8 +28,8 @@
/datum/heretic_knowledge/summon/raw_prophet,
)
required_atoms = list(
- /obj/item/bodypart/l_leg = 1,
- /obj/item/bodypart/r_leg = 1,
+ /obj/item/bodypart/leg/left = 1,
+ /obj/item/bodypart/leg/right = 1,
/obj/item/hatchet = 1,
)
duration = 3 MINUTES
diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm
index 87f0d3ff435..0470a39fc16 100644
--- a/code/modules/antagonists/nightmare/nightmare_species.dm
+++ b/code/modules/antagonists/nightmare/nightmare_species.dm
@@ -16,7 +16,6 @@
TRAIT_NOBREATH,
TRAIT_RESISTHIGHPRESSURE,
TRAIT_RESISTLOWPRESSURE,
- TRAIT_CHUNKYFINGERS,
TRAIT_RADIMMUNE,
TRAIT_VIRUSIMMUNE,
TRAIT_PIERCEIMMUNE,
@@ -26,6 +25,14 @@
mutantheart = /obj/item/organ/internal/heart/nightmare
mutantbrain = /obj/item/organ/internal/brain/shadow/nightmare
+ bodypart_overrides = list(
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/shadow/nightmare,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/shadow/nightmare,
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/shadow,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/shadow,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/shadow,
+ BODY_ZONE_CHEST = /obj/item/bodypart/chest/shadow,
+ )
/datum/species/shadow/nightmare/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
diff --git a/code/modules/client/preferences/species_features/moth.dm b/code/modules/client/preferences/species_features/moth.dm
index 687112a2bfe..a0f54f145a9 100644
--- a/code/modules/client/preferences/species_features/moth.dm
+++ b/code/modules/client/preferences/species_features/moth.dm
@@ -44,8 +44,8 @@
var/list/body_parts = list(
/obj/item/bodypart/head/moth,
/obj/item/bodypart/chest/moth,
- /obj/item/bodypart/l_arm/moth,
- /obj/item/bodypart/r_arm/moth,
+ /obj/item/bodypart/arm/left/moth,
+ /obj/item/bodypart/arm/right/moth,
)
for (var/obj/item/bodypart/body_part in body_parts)
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index dcff1d294c0..a2ba930d9c1 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -26,12 +26,12 @@
/obj/item/clothing/shoes/suicide_act(mob/living/carbon/user)
if(rand(2)>1)
user.visible_message(span_suicide("[user] begins tying \the [src] up waaay too tightly! It looks like [user.p_theyre()] trying to commit suicide!"))
- var/obj/item/bodypart/l_leg = user.get_bodypart(BODY_ZONE_L_LEG)
- var/obj/item/bodypart/r_leg = user.get_bodypart(BODY_ZONE_R_LEG)
- if(l_leg)
- l_leg.dismember()
- if(r_leg)
- r_leg.dismember()
+ var/obj/item/bodypart/leg/left = user.get_bodypart(BODY_ZONE_L_LEG)
+ var/obj/item/bodypart/leg/right = user.get_bodypart(BODY_ZONE_R_LEG)
+ if(left)
+ left.dismember()
+ if(right)
+ right.dismember()
playsound(user, SFX_DESECRATION, 50, TRUE, -1)
return BRUTELOSS
else//didnt realize this suicide act existed (was in miscellaneous.dm) and didnt want to remove it, so made it a 50/50 chance. Why not!
diff --git a/code/modules/clothing/spacesuits/softsuit.dm b/code/modules/clothing/spacesuits/softsuit.dm
index 7958bfc9cc2..e1eeb583c22 100644
--- a/code/modules/clothing/spacesuits/softsuit.dm
+++ b/code/modules/clothing/spacesuits/softsuit.dm
@@ -49,7 +49,7 @@
. = ..()
if(.)
return
- if(!istype(attacked_with, /obj/item/bodypart/l_leg/robot) && !istype(attacked_with, /obj/item/bodypart/r_leg/robot))
+ if(!istype(attacked_with, /obj/item/bodypart/leg/left/robot) && !istype(attacked_with, /obj/item/bodypart/leg/right/robot))
return
if(ismob(loc))
user.balloon_alert(user, "drop the helmet first!")
diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm
index 4abe44ed1c5..ccd651da412 100644
--- a/code/modules/clothing/suits/reactive_armour.dm
+++ b/code/modules/clothing/suits/reactive_armour.dm
@@ -371,13 +371,13 @@
if(!heads)
heads = typesof(/obj/item/bodypart/head)
if(!l_arms)
- l_arms = typesof(/obj/item/bodypart/l_arm)
+ l_arms = typesof(/obj/item/bodypart/arm/left)
if(!r_arms)
- r_arms = typesof(/obj/item/bodypart/r_arm)
+ r_arms = typesof(/obj/item/bodypart/arm/right)
if(!l_legs)
- l_legs = typesof(/obj/item/bodypart/l_leg)
+ l_legs = typesof(/obj/item/bodypart/leg/left)
if(!r_legs)
- r_legs = typesof(/obj/item/bodypart/r_leg)
+ r_legs = typesof(/obj/item/bodypart/leg/right)
/obj/item/clothing/suit/armor/reactive/bioscrambling/cooldown_activation(mob/living/carbon/human/owner)
var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread
diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm
index 82bd0b58a5f..d1c68b2557f 100644
--- a/code/modules/mob/inventory.dm
+++ b/code/modules/mob/inventory.dm
@@ -479,9 +479,9 @@
else if(amt > old_limbs)
hand_bodyparts.len = amt
for(var/i in old_limbs+1 to amt)
- var/path = /obj/item/bodypart/l_arm
+ var/path = /obj/item/bodypart/arm/left
if(!(i % 2))
- path = /obj/item/bodypart/r_arm
+ path = /obj/item/bodypart/arm/right
var/obj/item/bodypart/BP = new path ()
BP.held_index = i
diff --git a/code/modules/mob/living/basic/basic_defense.dm b/code/modules/mob/living/basic/basic_defense.dm
index 2a310170c32..d6dc450f08b 100644
--- a/code/modules/mob/living/basic/basic_defense.dm
+++ b/code/modules/mob/living/basic/basic_defense.dm
@@ -37,8 +37,8 @@
span_userdanger("[user] [response_harm_continuous] you!"), null, COMBAT_MESSAGE_RANGE, user)
to_chat(user, span_danger("You [response_harm_simple] [src]!"))
playsound(loc, attacked_sound, 25, TRUE, -1)
-
- var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
+ var/obj/item/bodypart/arm/active_arm = user.get_active_hand()
+ var/damage = rand(active_arm.unarmed_damage_low, active_arm.unarmed_damage_high)
attack_threshold_check(damage)
log_combat(user, src, "attacked")
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index 7ce9dd90299..f3e0314f72a 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -474,3 +474,11 @@
qdel(X)
amount_cured++
return amount_cured
+
+/// This proc lets the mob's brain decide what bodypart to attack with in an unarmed strike.
+/obj/item/organ/internal/brain/proc/get_attacking_limb(mob/living/carbon/human/target)
+ var/obj/item/bodypart/arm/active_hand = owner.get_active_hand()
+ if(target.body_position == LYING_DOWN && owner.usable_legs)
+ var/obj/item/bodypart/found_bodypart = owner.get_bodypart((active_hand.held_index % 2) ? BODY_ZONE_L_LEG : BODY_ZONE_R_LEG)
+ return found_bodypart || active_hand
+ return active_hand
diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm
index c469404fae8..6492e0e6279 100644
--- a/code/modules/mob/living/carbon/alien/adult/adult.dm
+++ b/code/modules/mob/living/carbon/alien/adult/adult.dm
@@ -17,10 +17,10 @@
bodyparts = list(
/obj/item/bodypart/chest/alien,
/obj/item/bodypart/head/alien,
- /obj/item/bodypart/l_arm/alien,
- /obj/item/bodypart/r_arm/alien,
- /obj/item/bodypart/r_leg/alien,
- /obj/item/bodypart/l_leg/alien,
+ /obj/item/bodypart/arm/left/alien,
+ /obj/item/bodypart/arm/right/alien,
+ /obj/item/bodypart/leg/right/alien,
+ /obj/item/bodypart/leg/left/alien,
)
GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 40a8d12e828..38cdba27dd5 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -989,7 +989,7 @@
///Proc to hook behavior on bodypart removals. Do not directly call. You're looking for [/obj/item/bodypart/proc/drop_limb()].
/mob/living/carbon/proc/remove_bodypart(obj/item/bodypart/old_bodypart)
SHOULD_NOT_OVERRIDE(TRUE)
-
+ old_bodypart.on_removal()
bodyparts -= old_bodypart
switch(old_bodypart.body_part)
if(LEG_LEFT, LEG_RIGHT)
@@ -1042,15 +1042,15 @@
if(BODY_ZONE_CHEST)
limbtypes = typesof(/obj/item/bodypart/chest)
if(BODY_ZONE_R_ARM)
- limbtypes = typesof(/obj/item/bodypart/r_arm)
+ limbtypes = typesof(/obj/item/bodypart/arm/right)
if(BODY_ZONE_L_ARM)
- limbtypes = typesof(/obj/item/bodypart/l_arm)
+ limbtypes = typesof(/obj/item/bodypart/arm/left)
if(BODY_ZONE_HEAD)
limbtypes = typesof(/obj/item/bodypart/head)
if(BODY_ZONE_L_LEG)
- limbtypes = typesof(/obj/item/bodypart/l_leg)
+ limbtypes = typesof(/obj/item/bodypart/leg/left)
if(BODY_ZONE_R_LEG)
- limbtypes = typesof(/obj/item/bodypart/r_leg)
+ limbtypes = typesof(/obj/item/bodypart/leg/right)
switch(edit_action)
if("remove")
if(BP)
@@ -1311,9 +1311,9 @@
/mob/living/carbon/get_attack_type()
- var/datum/species/species = dna?.species
- if (species)
- return species.attack_type
+ if(has_active_hand())
+ var/obj/item/bodypart/arm/active_arm = get_active_hand()
+ return active_arm.attack_type
return ..()
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index 2b83e74e643..0e57e685644 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -73,10 +73,10 @@
var/list/bodyparts = list(
/obj/item/bodypart/chest,
/obj/item/bodypart/head,
- /obj/item/bodypart/l_arm,
- /obj/item/bodypart/r_arm,
- /obj/item/bodypart/r_leg,
- /obj/item/bodypart/l_leg,
+ /obj/item/bodypart/arm/left,
+ /obj/item/bodypart/arm/right,
+ /obj/item/bodypart/leg/right,
+ /obj/item/bodypart/leg/left,
)
/// A collection of arms (or actually whatever the fug /bodyparts you monsters use to wreck my systems)
diff --git a/code/modules/mob/living/carbon/carbon_update_icons.dm b/code/modules/mob/living/carbon/carbon_update_icons.dm
index 860375f5cbb..b150a8b3676 100644
--- a/code/modules/mob/living/carbon/carbon_update_icons.dm
+++ b/code/modules/mob/living/carbon/carbon_update_icons.dm
@@ -466,8 +466,8 @@
update_wound_overlays()
var/list/needs_update = list()
var/limb_count_update = FALSE
- var/obj/item/bodypart/l_leg/left_leg
- var/obj/item/bodypart/r_leg/right_leg
+ var/obj/item/bodypart/leg/left/left_leg
+ var/obj/item/bodypart/leg/right/right_leg
var/old_left_leg_key
for(var/obj/item/bodypart/limb as anything in bodyparts)
limb.update_limb(is_creating = update_limb_data) //Update limb actually doesn't do much, get_limb_icon is the cpu eater.
@@ -530,7 +530,7 @@
* Returns a boolean, TRUE if the legs need to be redrawn, FALSE if they do not need to be redrawn.
* Necessary so that we can ensure that modifications of legs cause overlay updates.
*/
-/mob/living/carbon/proc/update_legs(obj/item/bodypart/r_leg/right_leg, obj/item/bodypart/l_leg/left_leg, old_left_leg_key)
+/mob/living/carbon/proc/update_legs(obj/item/bodypart/leg/right/right_leg, obj/item/bodypart/leg/left/left_leg, old_left_leg_key)
var/list/left_leg_icons // yes it's actually a list, bet you didn't expect that, now did you?
var/legs_need_redrawn = FALSE
if(left_leg)
@@ -647,7 +647,7 @@
return .
-/obj/item/bodypart/r_leg/generate_icon_key()
+/obj/item/bodypart/leg/right/generate_icon_key()
RETURN_TYPE(/list)
. = ..()
if(left_leg_mask_key) // We do this so we can cache the versions with and without a mask, for when there's no left leg.
@@ -669,7 +669,7 @@
*
* Returns the `/image` of the right leg that was masked, or `null` if the mask didn't exist.
*/
-/obj/item/bodypart/r_leg/proc/generate_masked_right_leg(right_leg_icon_file, right_leg_icon_state, image_dir)
+/obj/item/bodypart/leg/right/proc/generate_masked_right_leg(right_leg_icon_file, right_leg_icon_state, image_dir)
RETURN_TYPE(/image)
if(!left_leg_mask_cache[left_leg_mask_key] || !right_leg_icon_file || !right_leg_icon_state)
return
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index d747a9caaaa..0631d033ced 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -204,7 +204,8 @@
return
if(check_block()) //everybody is kung fu fighting
return
- playsound(loc, user.dna.species.attack_sound, 25, TRUE, -1)
+ var/obj/item/bodypart/arm/active_arm = user.get_active_hand()
+ playsound(loc, active_arm.unarmed_attack_sound, 25, TRUE, -1)
visible_message(span_danger("[user] [hulk_verb]ed [src]!"), \
span_userdanger("[user] [hulk_verb]ed [src]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), null, user)
to_chat(user, span_danger("You [hulk_verb] [src]!"))
@@ -257,7 +258,8 @@
if(try_inject(user, affecting, injection_flags = INJECT_TRY_SHOW_ERROR_MESSAGE))//Thick suits can stop monkey bites.
if(..()) //successful monkey bite, this handles disease contraction.
- var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
+ var/obj/item/bodypart/arm/active_arm = user.get_active_hand()
+ var/damage = rand(active_arm.unarmed_damage_low, active_arm.unarmed_damage_high)
if(!damage)
return
if(check_shields(user, damage, "the [user.name]"))
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index d8dfb39782a..364ef57942a 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -98,13 +98,17 @@
/mob/living/carbon/human/can_use_guns(obj/item/G)
. = ..()
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
- if(HAS_TRAIT(src, TRAIT_CHUNKYFINGERS))
+ if(check_chunky_fingers())
balloon_alert(src, "fingers are too big!")
return FALSE
if(HAS_TRAIT(src, TRAIT_NOGUNS))
to_chat(src, span_warning("You can't bring yourself to use a ranged weapon!"))
return FALSE
+/mob/living/carbon/human/proc/check_chunky_fingers()
+ if(HAS_TRAIT_NOT_FROM(src, TRAIT_CHUNKYFINGERS, RIGHT_ARM_TRAIT) && HAS_TRAIT_NOT_FROM(src, TRAIT_CHUNKYFINGERS, LEFT_ARM_TRAIT))
+ return TRUE
+ return (active_hand_index % 2) ? HAS_TRAIT_FROM(src, TRAIT_CHUNKYFINGERS, LEFT_ARM_TRAIT) : HAS_TRAIT_FROM(src, TRAIT_CHUNKYFINGERS, RIGHT_ARM_TRAIT)
/mob/living/carbon/human/get_policy_keywords()
. = ..()
. += "[dna.species.type]"
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 783683e3510..0b501ee6fe3 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -98,11 +98,11 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/list/mutant_organs = list()
///The bodyparts this species uses. assoc of bodypart string - bodypart type. Make sure all the fucking entries are in or I'll skin you alive.
var/list/bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right,
BODY_ZONE_HEAD = /obj/item/bodypart/head,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right,
BODY_ZONE_CHEST = /obj/item/bodypart/chest,
)
@@ -125,14 +125,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/stunmod = 1
///multiplier for money paid at payday
var/payday_modifier = 1
- ///Type of damage attack does. Ethereals attack with burn damage for example.
- var/attack_type = BRUTE
- ///Lowest possible punch damage this species can give. If this is set to 0, punches will always miss.
- var/punchdamagelow = 1
- ///Highest possible punch damage this species can give.
- var/punchdamagehigh = 10
- ///Damage at which punches from this race will stun
- var/punchstunthreshold = 10 //yes it should be to the attacked race but it's not useful that way even if it's logical
///Base electrocution coefficient. Basically a multiplier for damage from electrocutions.
var/siemens_coeff = 1
///To use MUTCOLOR with a fixed color that's independent of the mcolor feature in DNA.
@@ -178,13 +170,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
///List of factions the mob gain upon gaining this species.
var/list/inherent_factions
- ///Punch-specific attack verb.
- var/attack_verb = SFX_PUNCH
- /// The visual effect of the attack.
- var/attack_effect = ATTACK_EFFECT_PUNCH
- var/sound/attack_sound = 'sound/weapons/punch1.ogg'
- var/sound/miss_sound = 'sound/weapons/punchmiss.ogg'
-
///What gas does this species breathe? Used by suffocation screen alerts, most of actual gas breathing is handled by mutantlungs. See [life.dm][code/modules/mob/living/carbon/human/life.dm]
var/breathid = "o2"
@@ -623,10 +608,10 @@ GLOBAL_LIST_EMPTY(features_by_species)
// organic body markings
if(HAS_MARKINGS in species_traits)
var/obj/item/bodypart/chest/chest = species_human.get_bodypart(BODY_ZONE_CHEST)
- var/obj/item/bodypart/r_arm/right_arm = species_human.get_bodypart(BODY_ZONE_R_ARM)
- var/obj/item/bodypart/l_arm/left_arm = species_human.get_bodypart(BODY_ZONE_L_ARM)
- var/obj/item/bodypart/r_leg/right_leg = species_human.get_bodypart(BODY_ZONE_R_LEG)
- var/obj/item/bodypart/l_leg/left_leg = species_human.get_bodypart(BODY_ZONE_L_LEG)
+ var/obj/item/bodypart/arm/right/right_arm = species_human.get_bodypart(BODY_ZONE_R_ARM)
+ var/obj/item/bodypart/arm/left/left_arm = species_human.get_bodypart(BODY_ZONE_L_ARM)
+ var/obj/item/bodypart/leg/right/right_leg = species_human.get_bodypart(BODY_ZONE_R_LEG)
+ var/obj/item/bodypart/leg/left/left_leg = species_human.get_bodypart(BODY_ZONE_L_LEG)
var/datum/sprite_accessory/markings = GLOB.moth_markings_list[species_human.dna.features["moth_markings"]]
if(!HAS_TRAIT(species_human, TRAIT_HUSK))
@@ -1123,11 +1108,14 @@ GLOBAL_LIST_EMPTY(features_by_species)
return TRUE
else
- var/atk_verb = user.dna.species.attack_verb
- var/atk_effect = user.dna.species.attack_effect
- if(target.body_position == LYING_DOWN)
- atk_verb = "kick"
- atk_effect = ATTACK_EFFECT_KICK
+ var/obj/item/organ/internal/brain/brain = user.getorganslot(ORGAN_SLOT_BRAIN)
+ var/obj/item/bodypart/attacking_bodypart
+ if(brain)
+ attacking_bodypart = brain.get_attacking_limb(target)
+ if(!attacking_bodypart)
+ attacking_bodypart = user.get_active_hand()
+ var/atk_verb = attacking_bodypart.unarmed_attack_verb
+ var/atk_effect = attacking_bodypart.unarmed_attack_effect
if(atk_effect == ATTACK_EFFECT_BITE)
if(user.is_mouth_covered(mask_only = TRUE))
@@ -1135,19 +1123,19 @@ GLOBAL_LIST_EMPTY(features_by_species)
return FALSE
user.do_attack_animation(target, atk_effect)
- var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
+ var/damage = rand(attacking_bodypart.unarmed_damage_low, attacking_bodypart.unarmed_damage_high)
var/obj/item/bodypart/affecting = target.get_bodypart(target.get_random_valid_zone(user.zone_selected))
var/miss_chance = 100//calculate the odds that a punch misses entirely. considers stamina and brute damage of the puncher. punches miss by default to prevent weird cases
- if(user.dna.species.punchdamagelow)
- if(atk_effect == ATTACK_EFFECT_KICK || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) //kicks never miss (provided your species deals more than 0 damage)
+ if(attacking_bodypart.unarmed_damage_low)
+ if((target.body_position == LYING_DOWN) || HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) //kicks never miss (provided your species deals more than 0 damage)
miss_chance = 0
else
- miss_chance = min((user.dna.species.punchdamagehigh/user.dna.species.punchdamagelow) + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 100) //old base chance for a miss + various damage. capped at 100 to prevent weirdness in prob()
+ miss_chance = min((attacking_bodypart.unarmed_damage_high/attacking_bodypart.unarmed_damage_low) + user.getStaminaLoss() + (user.getBruteLoss()*0.5), 100) //old base chance for a miss + various damage. capped at 100 to prevent weirdness in prob()
if(!damage || !affecting || prob(miss_chance))//future-proofing for species that have 0 damage/weird cases where no zone is targeted
- playsound(target.loc, user.dna.species.miss_sound, 25, TRUE, -1)
+ playsound(target.loc, attacking_bodypart.unarmed_miss_sound, 25, TRUE, -1)
target.visible_message(span_danger("[user]'s [atk_verb] misses [target]!"), \
span_danger("You avoid [user]'s [atk_verb]!"), span_hear("You hear a swoosh!"), COMBAT_MESSAGE_RANGE, user)
to_chat(user, span_warning("Your [atk_verb] misses [target]!"))
@@ -1156,7 +1144,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
var/armor_block = target.run_armor_check(affecting, MELEE)
- playsound(target.loc, user.dna.species.attack_sound, 25, TRUE, -1)
+ playsound(target.loc, attacking_bodypart.unarmed_attack_sound, 25, TRUE, -1)
target.visible_message(span_danger("[user] [atk_verb]ed [target]!"), \
span_userdanger("You're [atk_verb]ed by [user]!"), span_hear("You hear a sickening sound of flesh hitting flesh!"), COMBAT_MESSAGE_RANGE, user)
@@ -1170,19 +1158,20 @@ GLOBAL_LIST_EMPTY(features_by_species)
target.dismembering_strike(user, affecting.body_zone)
var/attack_direction = get_dir(user, target)
+ var/attack_type = attacking_bodypart.attack_type
if(atk_effect == ATTACK_EFFECT_KICK)//kicks deal 1.5x raw damage
- target.apply_damage(damage*1.5, user.dna.species.attack_type, affecting, armor_block, attack_direction = attack_direction)
- if((damage * 1.5) >= 9)
+ if(damage >= 9)
target.force_say()
log_combat(user, target, "kicked")
+ target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction)
else//other attacks deal full raw damage + 1.5x in stamina damage
- target.apply_damage(damage, user.dna.species.attack_type, affecting, armor_block, attack_direction = attack_direction)
+ target.apply_damage(damage, attack_type, affecting, armor_block, attack_direction = attack_direction)
target.apply_damage(damage*1.5, STAMINA, affecting, armor_block)
if(damage >= 9)
target.force_say()
log_combat(user, target, "punched")
- if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
+ if((target.stat != DEAD) && damage >= attacking_bodypart.unarmed_stun_threshold)
target.visible_message(span_danger("[user] knocks [target] down!"), \
span_userdanger("You're knocked down by [user]!"), span_hear("You hear aggressive shuffling followed by a loud thud!"), COMBAT_MESSAGE_RANGE, user)
to_chat(user, span_danger("You knock [target] down!"))
@@ -1942,7 +1931,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
// and language perk last, as it comes at the end of the perks list
species_perks += create_pref_unique_perks()
species_perks += create_pref_blood_perks()
- species_perks += create_pref_combat_perks()
species_perks += create_pref_damage_perks()
species_perks += create_pref_temperature_perks()
species_perks += create_pref_traits_perks()
@@ -1980,25 +1968,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
/datum/species/proc/create_pref_unique_perks()
return null
-/**
- * Adds adds any perks related to combat.
- * For example, the damage type of their punches.
- *
- * Returns a list containing perks, or an empty list.
- */
-/datum/species/proc/create_pref_combat_perks()
- var/list/to_add = list()
-
- if(attack_type != BRUTE)
- to_add += list(list(
- SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK,
- SPECIES_PERK_ICON = "fist-raised",
- SPECIES_PERK_NAME = "Elemental Attacker",
- SPECIES_PERK_DESC = "[plural_form] deal [attack_type] damage with their punches instead of brute.",
- ))
-
- return to_add
-
/**
* Adds adds any perks related to sustaining damage.
* For example, brute damage vulnerability, or fire damage resistance.
@@ -2244,8 +2213,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
//Note for future: Potentionally add a new C.dna.species() to build a template species for more accurate limb replacement
if((new_species.digitigrade_customization == DIGITIGRADE_OPTIONAL && target.dna.features["legs"] == DIGITIGRADE_LEGS) || new_species.digitigrade_customization == DIGITIGRADE_FORCED)
- new_species.bodypart_overrides[BODY_ZONE_R_LEG] = /obj/item/bodypart/r_leg/digitigrade
- new_species.bodypart_overrides[BODY_ZONE_L_LEG] = /obj/item/bodypart/l_leg/digitigrade
+ new_species.bodypart_overrides[BODY_ZONE_R_LEG] = /obj/item/bodypart/leg/right/digitigrade
+ new_species.bodypart_overrides[BODY_ZONE_L_LEG] = /obj/item/bodypart/leg/left/digitigrade
for(var/obj/item/bodypart/old_part as anything in target.bodyparts)
if(old_part.change_exempt_flags & BP_BLOCK_CHANGE_SPECIES)
diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm
index 648ccbb54b9..c95d73ac905 100644
--- a/code/modules/mob/living/carbon/human/species_types/abductors.dm
+++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm
@@ -5,7 +5,6 @@
sexes = FALSE
species_traits = list(NOBLOOD, NOEYESPRITES, NOSTOMACH)
inherent_traits = list(
- TRAIT_CHUNKYFINGERS,
TRAIT_NOBREATH,
TRAIT_NOHUNGER,
TRAIT_VIRUSIMMUNE,
@@ -17,10 +16,10 @@
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/abductor,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/abductor,
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/abductor,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/abductor,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/abductor,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/abductor,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/abductor,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/abductor,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/abductor,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/abductor,
)
/datum/species/abductor/on_species_gain(mob/living/carbon/C, datum/species/old_species)
diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm
index 8e92ff91513..a1fd3a1d6c3 100644
--- a/code/modules/mob/living/carbon/human/species_types/android.dm
+++ b/code/modules/mob/living/carbon/human/species_types/android.dm
@@ -33,10 +33,10 @@
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/robot,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/robot,
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/robot,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/robot,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/robot,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/robot,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/robot,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/robot,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/robot,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/robot,
)
examine_limb_id = SPECIES_HUMAN
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index 81c42599586..00bc32f9e55 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -1,9 +1,6 @@
/datum/species/ethereal
name = "\improper Ethereal"
id = SPECIES_ETHEREAL
- attack_verb = "burn"
- attack_sound = 'sound/weapons/etherealhit.ogg'
- miss_sound = 'sound/weapons/etherealmiss.ogg'
meat = /obj/item/food/meat/slab/human/mutant/ethereal
mutantlungs = /obj/item/organ/internal/lungs/ethereal
mutantstomach = /obj/item/organ/internal/stomach/ethereal
@@ -13,7 +10,6 @@
siemens_coeff = 0.5 //They thrive on energy
brutemod = 1.25 //They're weak to punches
payday_modifier = 0.75
- attack_type = BURN //burn bish
species_traits = list(DYNCOLORS, AGENDER, NO_UNDERWEAR, HAIR, FACEHAIR, HAS_FLESH, HAS_BONE) // i mean i guess they have blood so they can have wounds too
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_cookie = /obj/item/food/energybar
@@ -29,11 +25,11 @@
hair_alpha = 140
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/ethereal,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/ethereal,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/ethereal,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/ethereal,
BODY_ZONE_HEAD = /obj/item/bodypart/head/ethereal,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/ethereal,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/ethereal,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/ethereal,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/ethereal,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/ethereal,
)
@@ -217,6 +213,12 @@
SPECIES_PERK_DESC = "The Ethereal's heart will encase them in crystal should they die, returning them to life after a time - \
at the cost of a permanent brain trauma.",
),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK,
+ SPECIES_PERK_ICON = "fist-raised",
+ SPECIES_PERK_NAME = "Elemental Attacker",
+ SPECIES_PERK_DESC = "Ethereals deal burn damage with their punches instead of brute.",
+ ),
list(
SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
SPECIES_PERK_ICON = "biohazard",
diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
index c172e603b48..c0861c000b5 100644
--- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm
@@ -27,11 +27,11 @@
mutant_organs = list(/obj/item/organ/internal/fly, /obj/item/organ/internal/fly/groin)
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/fly,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/fly,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/fly,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/fly,
BODY_ZONE_HEAD = /obj/item/bodypart/head/fly,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/fly,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/fly,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/fly,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/fly,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/fly,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm
index 625e8344b80..ce27d5e11af 100644
--- a/code/modules/mob/living/carbon/human/species_types/golems.dm
+++ b/code/modules/mob/living/carbon/human/species_types/golems.dm
@@ -4,7 +4,6 @@
id = SPECIES_GOLEM
species_traits = list(NOBLOOD,NOTRANSSTING, MUTCOLORS,NO_UNDERWEAR, NO_DNA_COPY)
inherent_traits = list(
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_NOBREATH,
TRAIT_NODISMEMBER,
@@ -22,9 +21,6 @@
payday_modifier = 0.75
armor = 55
siemens_coeff = 0
- punchdamagelow = 5
- punchdamagehigh = 14
- punchstunthreshold = 11 //about 40% chance to stun
no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING, ITEM_SLOT_SUITSTORE)
nojumpsuit = 1
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC
@@ -36,11 +32,11 @@
fixed_mut_color = "#aaaaaa"
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/golem,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem,
BODY_ZONE_HEAD = /obj/item/bodypart/head/golem,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/golem,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem,
)
@@ -108,7 +104,6 @@
//Can burn and takes damage from heat
//no RESISTHEAT, NOFIRE
inherent_traits = list(
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_NOBREATH,
TRAIT_NODISMEMBER,
@@ -200,7 +195,6 @@
name = "Silver Golem"
id = SPECIES_GOLEM_SILVER
fixed_mut_color = "#dddddd"
- punchstunthreshold = 9 //60% chance, from 40%
meat = /obj/item/stack/ore/silver
info_text = "As a Silver Golem, your attacks have a higher chance of stunning. Being made of silver, your body is immune to spirits of the damned and runic golems."
prefix = "Silver"
@@ -221,18 +215,20 @@
id = SPECIES_GOLEM_PLASTEEL
fixed_mut_color = "#bbbbbb"
stunmod = 0.4
- punchdamagelow = 12
- punchdamagehigh = 21
- punchstunthreshold = 18 //still 40% stun chance
speedmod = 4 //pretty fucking slow
meat = /obj/item/stack/ore/iron
info_text = "As a Plasteel Golem, you are slower, but harder to stun, and hit very hard when punching. You also magnetically attach to surfaces and so don't float without gravity and cannot have positions swapped with other beings."
- attack_verb = "smash"
- attack_effect = ATTACK_EFFECT_SMASH
- attack_sound = 'sound/effects/meteorimpact.ogg' //hits pretty hard
prefix = "Plasteel"
special_names = null
examine_limb_id = SPECIES_GOLEM
+ bodypart_overrides = list(
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/plasteel,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/plasteel,
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/golem,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/plasteel,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/plasteel,
+ BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem,
+ )
/datum/species/golem/plasteel/negates_gravity(mob/living/carbon/human/H)
return TRUE
@@ -316,7 +312,6 @@
meat = /obj/item/stack/sheet/mineral/wood
//Can burn and take damage from heat
inherent_traits = list(
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_NOBREATH,
TRAIT_NODISMEMBER,
@@ -369,20 +364,22 @@
fixed_mut_color = "#77ff00"
meat = /obj/item/stack/ore/uranium
info_text = "As an Uranium Golem, your very touch burns and irradiates organic lifeforms. You don't hit as hard as most golems, but you are far more durable against blunt force trauma."
- attack_verb = "burn"
- attack_sound = 'sound/weapons/sear.ogg'
- attack_type = BURN
var/last_event = 0
var/active = null
armor = 40
brutemod = 0.5
- punchdamagelow = 1
- punchdamagehigh = 10
- punchstunthreshold = 9
prefix = "Uranium"
special_names = list("Oxide", "Rod", "Meltdown", "235")
COOLDOWN_DECLARE(radiation_emission_cooldown)
examine_limb_id = SPECIES_GOLEM
+ bodypart_overrides = list(
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/uranium,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/uranium,
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/golem,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem,
+ BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem,
+ )
/datum/species/golem/uranium/proc/radiation_emission(mob/living/carbon/human/H)
if(!COOLDOWN_FINISHED(src, radiation_emission_cooldown))
@@ -416,7 +413,6 @@
burnmod = 3 //melts easily
brutemod = 0.25
info_text = "As a Sand Golem, you are immune to physical bullets and take very little brute damage, but are extremely vulnerable to burn damage and energy weapons. You will also turn to sand when dying, preventing any form of recovery."
- attack_sound = 'sound/effects/shovel_dig.ogg'
prefix = "Sand"
special_names = list("Castle", "Bag", "Dune", "Worm", "Storm")
examine_limb_id = SPECIES_GOLEM
@@ -448,7 +444,6 @@
brutemod = 3 //very fragile
burnmod = 0.25
info_text = "As a Glass Golem, you reflect lasers and energy weapons, and are very resistant to burn damage. However, you are extremely vulnerable to brute damage. On death, you'll shatter beyond any hope of recovery."
- attack_sound = 'sound/effects/glassbr2.ogg'
prefix = "Glass"
special_names = list("Lens", "Prism", "Fiber", "Bead")
examine_limb_id = SPECIES_GOLEM
@@ -483,8 +478,6 @@
fixed_mut_color = "#3333ff"
meat = /obj/item/stack/ore/bluespace_crystal
info_text = "As a Bluespace Golem, you are spatially unstable: You will teleport when hit, and you can teleport manually at a long distance."
- attack_verb = "bluespace punch"
- attack_sound = 'sound/effects/phasein.ogg'
prefix = "Bluespace"
special_names = list("Crystal", "Polycrystal")
examine_limb_id = SPECIES_GOLEM
@@ -582,7 +575,6 @@
fixed_mut_color = "#ffff00"
say_mod = "honks"
inherent_traits = list(
- TRAIT_CHUNKYFINGERS,
TRAIT_CLUMSY,
TRAIT_GENELESS,
TRAIT_NOBREATH,
@@ -595,16 +587,19 @@
TRAIT_RESISTHIGHPRESSURE,
TRAIT_RESISTLOWPRESSURE,
)
- punchdamagelow = 0
- punchdamagehigh = 1
- punchstunthreshold = 2 //Harmless and can't stun
meat = /obj/item/stack/ore/bananium
info_text = "As a Bananium Golem, you are made for pranking. Your body emits natural honks, and you can barely even hurt people when punching them. Your skin also bleeds banana peels when damaged."
- attack_verb = "honk"
- attack_sound = 'sound/items/airhorn2.ogg'
prefix = "Bananium"
special_names = null
examine_limb_id = SPECIES_GOLEM
+ bodypart_overrides = list(
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/bananium,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/bananium,
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/golem,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/bananium,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/bananium,
+ BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem,
+ )
/// Cooldown for producing honks
COOLDOWN_DECLARE(honkooldown)
@@ -688,7 +683,6 @@
info_text = "As a Runic Golem, you possess eldritch powers granted by the Elder Goddess Nar'Sie."
species_traits = list(NOBLOOD,NO_UNDERWEAR,NOEYESPRITES) //no mutcolors
inherent_traits = list(
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_NOBREATH,
TRAIT_NODISMEMBER,
@@ -707,11 +701,11 @@
inherent_factions = list("cult")
species_language_holder = /datum/language_holder/golem/runic
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem/cult,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/golem/cult,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/cult,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/cult,
BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/cult,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/golem/cult,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem/cult,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/cult,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/cult,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/cult,
)
@@ -773,7 +767,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_LITERATE,
TRAIT_NOBREATH,
@@ -788,17 +781,14 @@
armor = 15 //feels no pain, but not too resistant
burnmod = 2 // don't get burned
speedmod = 1 // not as heavy as stone
- punchdamagelow = 4
- punchstunthreshold = 7
- punchdamagehigh = 8 // not as heavy as stone
prefix = "Cloth"
special_names = null
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem/cloth,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/golem/cloth,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/cloth,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/cloth,
BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/cloth,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/golem/cloth,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem/cloth,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/cloth,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/cloth,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/cloth,
)
@@ -946,7 +936,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_LITERATE,
TRAIT_NOBREATH,
@@ -1046,7 +1035,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_LITERATE,
TRAIT_NOBREATH,
@@ -1058,23 +1046,17 @@
TRAIT_RESISTHIGHPRESSURE,
TRAIT_RESISTLOWPRESSURE,
)
- attack_verb = "whips"
- attack_sound = 'sound/weapons/whip.ogg'
- miss_sound = 'sound/weapons/etherealmiss.ogg'
fixed_mut_color = null
armor = 25
burnmod = 1.25
heatmod = 2
speedmod = 1.5
- punchdamagelow = 4
- punchstunthreshold = 7
- punchdamagehigh = 8
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem/cardboard,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/golem/cardboard,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/cardboard,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/cardboard,
BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/cardboard,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/golem/cardboard,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem/cardboard,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/cardboard,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/cardboard,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/cardboard,
)
var/last_creation = 0
@@ -1112,7 +1094,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_LITERATE,
TRAIT_NOBREATH,
@@ -1128,8 +1109,8 @@
fixed_mut_color = "#624a2e"
info_text = "As a Leather Golem, you are flammable, but you can grab things with incredible ease, allowing all your grabs to start at a strong level."
grab_sound = 'sound/weapons/whipgrab.ogg'
- attack_sound = 'sound/weapons/whip.ogg'
examine_limb_id = SPECIES_GOLEM
+
/datum/species/golem/durathread
name = "Durathread Golem"
id = SPECIES_GOLEM_DURATHREAD
@@ -1140,7 +1121,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_LITERATE,
TRAIT_NOBREATH,
@@ -1154,11 +1134,11 @@
)
info_text = "As a Durathread Golem, your strikes will cause those your targets to start choking, but your woven body won't withstand fire as well."
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem/durathread,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/golem/durathread,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/durathread,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/durathread,
BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/durathread,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/golem/durathread,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem/durathread,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/durathread,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/durathread,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/durathread,
)
@@ -1183,7 +1163,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_FAKEDEATH,
TRAIT_GENELESS,
TRAIT_LITERATE,
@@ -1201,11 +1180,11 @@
species_language_holder = /datum/language_holder/golem/bone
info_text = "As a Bone Golem, You have a powerful spell that lets you chill your enemies with fear, and milk heals you! Just make sure to watch our for bone-hurting juice."
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem/bone,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/golem/bone,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/bone,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/bone,
BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/bone,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/golem/bone,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem/bone,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/bone,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/bone,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/bone,
)
var/datum/action/innate/bonechill/bonechill
@@ -1297,7 +1276,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_LITERATE,
TRAIT_NOBREATH,
@@ -1309,11 +1287,11 @@
TRAIT_RESISTLOWPRESSURE,
)
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/golem/snow,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/golem/snow,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/golem/snow,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/golem/snow,
BODY_ZONE_HEAD = /obj/item/bodypart/head/golem/snow,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/golem/snow,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/golem/snow,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/golem/snow,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/golem/snow,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/golem/snow,
)
@@ -1359,7 +1337,6 @@
inherent_traits = list(
TRAIT_ADVANCEDTOOLUSER,
TRAIT_CAN_STRIP,
- TRAIT_CHUNKYFINGERS,
TRAIT_GENELESS,
TRAIT_LITERATE,
TRAIT_NOBREATH,
diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
index 6a3687d2549..0d027704091 100644
--- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm
@@ -24,11 +24,11 @@
ass_image = 'icons/ass/assslime.png'
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/jelly,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/jelly,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/jelly,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/jelly,
BODY_ZONE_HEAD = /obj/item/bodypart/head/jelly,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/jelly,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/jelly,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/jelly,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/jelly,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/jelly,
)
@@ -155,11 +155,11 @@
var/datum/action/innate/swap_body/swap_body
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/slime,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/slime,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/slime,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/slime,
BODY_ZONE_HEAD = /obj/item/bodypart/head/slime,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/slime,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/slime,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/slime,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/slime,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/slime,
)
@@ -442,11 +442,11 @@
id = SPECIES_LUMINESCENT
examine_limb_id = SPECIES_LUMINESCENT
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/luminescent,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/luminescent,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/luminescent,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/luminescent,
BODY_ZONE_HEAD = /obj/item/bodypart/head/luminescent,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/luminescent,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/luminescent,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/luminescent,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/luminescent,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/luminescent,
)
var/glow_intensity = LUMINESCENT_DEFAULT_GLOW
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index e5ec28fc6a8..450d5462fa8 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -24,10 +24,6 @@
payday_modifier = 0.75
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
species_cookie = /obj/item/food/meat/slab
- attack_verb = "slash"
- attack_effect = ATTACK_EFFECT_CLAW
- attack_sound = 'sound/weapons/slash.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/food/meat/slab/human/mutant/lizard
skinned_type = /obj/item/stack/sheet/animalhide/lizard
exotic_bloodtype = "L"
@@ -48,10 +44,10 @@
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/lizard,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/lizard,
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/lizard,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/lizard,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/lizard,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/lizard,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/lizard,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/lizard,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/lizard,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/lizard,
)
/// Lizards are cold blooded and do not stabilize body temperature naturally
@@ -131,13 +127,21 @@ Lizard subspecies: ASHWALKERS
mutantlungs = /obj/item/organ/internal/lungs/ashwalker
mutantbrain = /obj/item/organ/internal/brain/primitive
inherent_traits = list(
- TRAIT_CHUNKYFINGERS,
//TRAIT_LITERATE,
TRAIT_VIRUSIMMUNE,
)
species_language_holder = /datum/language_holder/lizard/ash
digitigrade_customization = DIGITIGRADE_FORCED
examine_limb_id = SPECIES_LIZARD
+ bodypart_overrides = list(
+ BODY_ZONE_HEAD = /obj/item/bodypart/head/lizard,
+ BODY_ZONE_CHEST = /obj/item/bodypart/chest/lizard,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/lizard/ashwalker,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/lizard/ashwalker,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/lizard,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/lizard,
+ )
+
/*
Lizard subspecies: SILVER SCALED
*/
diff --git a/code/modules/mob/living/carbon/human/species_types/monkeys.dm b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
index 4e8583b9b50..18331ab9abb 100644
--- a/code/modules/mob/living/carbon/human/species_types/monkeys.dm
+++ b/code/modules/mob/living/carbon/human/species_types/monkeys.dm
@@ -3,10 +3,6 @@
id = SPECIES_MONKEY
say_mod = "chimpers"
bodytype = BODYTYPE_ORGANIC | BODYTYPE_MONKEY
- attack_verb = "bite"
- attack_effect = ATTACK_EFFECT_BITE
- attack_sound = 'sound/weapons/bite.ogg'
- miss_sound = 'sound/weapons/bite.ogg'
external_organs = list(
/obj/item/organ/external/tail/monkey = "Monkey"
)
@@ -40,17 +36,14 @@
liked_food = MEAT | FRUIT | BUGS
disliked_food = CLOTH
sexes = FALSE
- punchdamagelow = 1
- punchdamagehigh = 3
- punchstunthreshold = 4 // no stun punches
species_language_holder = /datum/language_holder/monkey
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/monkey,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/monkey,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/monkey,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/monkey,
BODY_ZONE_HEAD = /obj/item/bodypart/head/monkey,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/monkey,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/monkey,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/monkey,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/monkey,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/monkey,
)
fire_overlay = "monkey"
@@ -98,7 +91,8 @@
span_danger("You avoid [user]'s bite!"), span_hear("You hear jaws snapping shut!"), COMBAT_MESSAGE_RANGE, user)
to_chat(user, span_danger("Your bite misses [victim]!"))
return TRUE
- victim.apply_damage(rand(punchdamagelow, punchdamagehigh), BRUTE, affecting, armor)
+ var/obj/item/bodypart/arm/mouth = user.get_bodypart(BODY_ZONE_HEAD)
+ victim.apply_damage(rand(mouth.unarmed_damage_low, mouth.unarmed_damage_high), BRUTE, affecting, armor)
victim.visible_message(span_danger("[name] bites [victim]!"),
span_userdanger("[name] bites you!"), span_hear("You hear a chomp!"), COMBAT_MESSAGE_RANGE, name)
to_chat(user, span_danger("You bite [victim]!"))
@@ -234,3 +228,6 @@
if(in_the_way_mob.pass_flags & PASSTABLE)
return
in_the_way_mob.knockOver(owner)
+
+/obj/item/organ/internal/brain/primate/get_attacking_limb(mob/living/carbon/human/target)
+ return owner.get_bodypart(BODY_ZONE_HEAD)
diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
index f6cbba9fc17..5d85e119b0e 100644
--- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm
@@ -11,10 +11,6 @@
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
mutant_bodyparts = list("moth_markings" = "None")
external_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain")
- attack_verb = "slash"
- attack_effect = ATTACK_EFFECT_CLAW
- attack_sound = 'sound/weapons/slash.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
meat = /obj/item/food/meat/slab/human/mutant/moth
liked_food = VEGETABLES | DAIRY | CLOTH
disliked_food = FRUIT | GROSS | BUGS | GORE
@@ -30,10 +26,10 @@
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/moth,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/moth,
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/moth,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/moth,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/moth,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/moth,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/moth,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/moth,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/moth,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/moth,
)
/datum/species/moth/regenerate_organs(mob/living/carbon/C, datum/species/old_species, replace_current= TRUE, list/excluded_zones, visual_only)
diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
index ccd55ec9289..a26381187a5 100644
--- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm
@@ -18,10 +18,6 @@
inherent_factions = list("mushroom")
speedmod = 1.5 //faster than golems but not by much
- punchdamagelow = 6
- punchdamagehigh = 14
- punchstunthreshold = 14 //about 44% chance to stun
-
no_equip = list(ITEM_SLOT_MASK, ITEM_SLOT_OCLOTHING, ITEM_SLOT_GLOVES, ITEM_SLOT_FEET, ITEM_SLOT_ICLOTHING)
burnmod = 1.25
@@ -33,11 +29,11 @@
species_language_holder = /datum/language_holder/mushroom
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/mushroom,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/mushroom,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/mushroom,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/mushroom,
BODY_ZONE_HEAD = /obj/item/bodypart/head/mushroom,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/mushroom,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/mushroom,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/mushroom,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/mushroom,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/mushroom,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
index 74632cf42ff..5ca04abce62 100644
--- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
+++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm
@@ -32,11 +32,11 @@
species_language_holder = /datum/language_holder/skeleton
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/plasmaman,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/plasmaman,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/plasmaman,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/plasmaman,
BODY_ZONE_HEAD = /obj/item/bodypart/head/plasmaman,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/plasmaman,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/plasmaman,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/plasmaman,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/plasmaman,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/plasmaman,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index c2101fb167a..bbaf53d3f6d 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -12,10 +12,7 @@
)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
inherent_factions = list("plants", "vines")
- attack_verb = "slash"
- attack_effect = ATTACK_EFFECT_CLAW
- attack_sound = 'sound/weapons/slice.ogg'
- miss_sound = 'sound/weapons/slashmiss.ogg'
+
burnmod = 1.25
heatmod = 1.5
payday_modifier = 0.75
@@ -27,11 +24,11 @@
species_language_holder = /datum/language_holder/plant
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/pod,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/pod,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/pod,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/pod,
BODY_ZONE_HEAD = /obj/item/bodypart/head/pod,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/pod,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/pod,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/pod,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/pod,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/pod,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
index 4b5ef78cbf4..4c054d42866 100644
--- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm
@@ -20,11 +20,11 @@
species_language_holder = /datum/language_holder/shadowpeople
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/shadow,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/shadow,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/shadow,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/shadow,
BODY_ZONE_HEAD = /obj/item/bodypart/head/shadow,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/shadow,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/shadow,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/shadow,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/shadow,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/shadow,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/skeletons.dm b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
index 6fa56030c15..047963c65e9 100644
--- a/code/modules/mob/living/carbon/human/species_types/skeletons.dm
+++ b/code/modules/mob/living/carbon/human/species_types/skeletons.dm
@@ -36,11 +36,11 @@
species_language_holder = /datum/language_holder/skeleton
bodypart_overrides = list(
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/skeleton,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/skeleton,
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/skeleton,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/skeleton,
BODY_ZONE_HEAD = /obj/item/bodypart/head/skeleton,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/skeleton,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/skeleton,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/skeleton,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/skeleton,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/skeleton,
)
diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm
index 247e557a24d..14813ed3c01 100644
--- a/code/modules/mob/living/carbon/human/species_types/snail.dm
+++ b/code/modules/mob/living/carbon/human/species_types/snail.dm
@@ -5,13 +5,11 @@
inherent_traits = list(
TRAIT_NOSLIPALL,
)
- attack_verb = "slap"
- attack_effect = ATTACK_EFFECT_DISARM
+
say_mod = "slurs"
coldmod = 0.5 //snails only come out when its cold and wet
burnmod = 2
speedmod = 6
- punchdamagehigh = 0.5 //snails are soft and squishy
siemens_coeff = 2 //snails are mostly water
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP
sexes = FALSE //snails are hermaphrodites
@@ -23,10 +21,10 @@
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/snail,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/snail,
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/snail,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/snail,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/snail,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/snail
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/snail,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/snail,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/snail,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/snail
)
/datum/species/snail/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm
index 54095f9a6e9..28ed9e259cb 100644
--- a/code/modules/mob/living/carbon/human/species_types/zombies.dm
+++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm
@@ -37,10 +37,10 @@
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/zombie,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/zombie,
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/zombie,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/zombie,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/zombie,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/zombie
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/zombie,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/zombie,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/zombie,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie
)
/// Zombies do not stabilize body temperature they are the walking dead and are cold blooded
@@ -151,10 +151,10 @@
bodypart_overrides = list(
BODY_ZONE_HEAD = /obj/item/bodypart/head/zombie,
BODY_ZONE_CHEST = /obj/item/bodypart/chest/zombie,
- BODY_ZONE_L_ARM = /obj/item/bodypart/l_arm/zombie,
- BODY_ZONE_R_ARM = /obj/item/bodypart/r_arm/zombie,
- BODY_ZONE_L_LEG = /obj/item/bodypart/l_leg/zombie,
- BODY_ZONE_R_LEG = /obj/item/bodypart/r_leg/zombie
+ BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/zombie,
+ BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/zombie,
+ BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/zombie,
+ BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/zombie
)
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index e5c168b070c..3a60c8b2073 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -546,12 +546,12 @@
robot_suit.update_appearance()
else
new /obj/item/robot_suit(T)
- new /obj/item/bodypart/l_leg/robot(T)
- new /obj/item/bodypart/r_leg/robot(T)
+ new /obj/item/bodypart/leg/left/robot(T)
+ new /obj/item/bodypart/leg/right/robot(T)
new /obj/item/stack/cable_coil(T, 1)
new /obj/item/bodypart/chest/robot(T)
- new /obj/item/bodypart/l_arm/robot(T)
- new /obj/item/bodypart/r_arm/robot(T)
+ new /obj/item/bodypart/arm/left/robot(T)
+ new /obj/item/bodypart/arm/right/robot(T)
new /obj/item/bodypart/head/robot(T)
var/b
for(b=0, b!=2, b++)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index a054af8510d..5bc024bcf85 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -36,7 +36,7 @@
///Access required to access this Bot's maintenance protocols
var/maints_access_required = list(ACCESS_ROBOTICS)
///The Robot arm attached to this robot - has a 50% chance to drop on death.
- var/robot_arm = /obj/item/bodypart/r_arm/robot
+ var/robot_arm = /obj/item/bodypart/arm/right/robot
///The inserted (if any) pAI in this bot.
var/obj/item/pai_card/paicard
///The type of bot it is, for radio control.
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index a4b038b2715..d01e36c334b 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -8,7 +8,7 @@
throw_range = 5
var/created_name
var/build_step = ASSEMBLY_FIRST_STEP
- var/robot_arm = /obj/item/bodypart/r_arm/robot
+ var/robot_arm = /obj/item/bodypart/arm/right/robot
/obj/item/bot_assembly/attackby(obj/item/I, mob/user, params)
..()
@@ -77,7 +77,7 @@
/obj/item/bot_assembly/cleanbot/attackby(obj/item/W, mob/user, params)
..()
- if(istype(W, /obj/item/bodypart/l_arm/robot) || istype(W, /obj/item/bodypart/r_arm/robot))
+ if(istype(W, /obj/item/bodypart/arm/left/robot) || istype(W, /obj/item/bodypart/arm/right/robot))
if(!can_finish_build(W, user))
return
var/mob/living/simple_animal/bot/cleanbot/A = new(drop_location(), bucket_obj)
@@ -102,7 +102,7 @@
..()
switch(build_step)
if(ASSEMBLY_FIRST_STEP, ASSEMBLY_SECOND_STEP)
- if(istype(W, /obj/item/bodypart/l_leg/robot) || istype(W, /obj/item/bodypart/r_leg/robot))
+ if(istype(W, /obj/item/bodypart/leg/left/robot) || istype(W, /obj/item/bodypart/leg/right/robot))
if(!user.temporarilyRemoveItemFromInventory(W))
return
to_chat(user, span_notice("You add [W] to [src]."))
@@ -241,7 +241,7 @@
update_appearance()
if(ASSEMBLY_SECOND_STEP)
- if(istype(W, /obj/item/bodypart/l_arm/robot) || istype(W, /obj/item/bodypart/r_arm/robot))
+ if(istype(W, /obj/item/bodypart/arm/left/robot) || istype(W, /obj/item/bodypart/arm/right/robot))
if(!can_finish_build(W, user))
return
var/mob/living/simple_animal/bot/floorbot/A = new(drop_location(), toolbox_color)
@@ -378,7 +378,7 @@
build_step--
if(ASSEMBLY_THIRD_STEP)
- if((istype(I, /obj/item/bodypart/l_arm/robot)) || (istype(I, /obj/item/bodypart/r_arm/robot)))
+ if((istype(I, /obj/item/bodypart/arm/left/robot)) || (istype(I, /obj/item/bodypart/arm/right/robot)))
if(!user.temporarilyRemoveItemFromInventory(I))
return
to_chat(user, span_notice("You add [I] to [src]!"))
@@ -569,7 +569,7 @@
return
switch(build_step)
if(ASSEMBLY_FIRST_STEP)
- if(istype(part, /obj/item/bodypart/l_leg/robot) || istype(part, /obj/item/bodypart/r_leg/robot))
+ if(istype(part, /obj/item/bodypart/leg/left/robot) || istype(part, /obj/item/bodypart/leg/right/robot))
if(!user.temporarilyRemoveItemFromInventory(part))
return
balloon_alert(user, "leg attached")
diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm
index a4968def1d9..672ab0704c3 100644
--- a/code/modules/mob/living/simple_animal/bot/secbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/secbot.dm
@@ -486,9 +486,9 @@
disabler_gun.cell.charge = 0
disabler_gun.update_appearance()
if(prob(50))
- new /obj/item/bodypart/l_leg/robot(Tsec)
+ new /obj/item/bodypart/leg/left/robot(Tsec)
if(prob(25))
- new /obj/item/bodypart/r_leg/robot(Tsec)
+ new /obj/item/bodypart/leg/right/robot(Tsec)
if(prob(25))//50% chance for a helmet OR vest
if(prob(50))
new /obj/item/clothing/head/helmet(Tsec)
diff --git a/code/modules/mob/living/simple_animal/heretic_monsters.dm b/code/modules/mob/living/simple_animal/heretic_monsters.dm
index 0250186a81d..60f0ffdb39e 100644
--- a/code/modules/mob/living/simple_animal/heretic_monsters.dm
+++ b/code/modules/mob/living/simple_animal/heretic_monsters.dm
@@ -54,7 +54,7 @@
maxHealth = 65
health = 65
sight = SEE_MOBS|SEE_OBJS|SEE_TURFS|SEE_BLACKNESS
- loot = list(/obj/effect/gibspawner/human, /obj/item/bodypart/l_arm, /obj/item/organ/internal/eyes)
+ loot = list(/obj/effect/gibspawner/human, /obj/item/bodypart/arm/left, /obj/item/organ/internal/eyes)
actions_to_add = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/long,
/datum/action/cooldown/spell/list_target/telepathy/eldritch,
@@ -301,7 +301,7 @@
AttackingTarget()
/mob/living/simple_animal/hostile/heretic_summon/armsy/AttackingTarget()
- if(istype(target, /obj/item/bodypart/r_arm) || istype(target, /obj/item/bodypart/l_arm))
+ if(istype(target, /obj/item/bodypart/arm))
playsound(src, 'sound/magic/demon_consume.ogg', 50, TRUE)
qdel(target)
heal()
diff --git a/code/modules/modular_computers/computers/item/computer_ui.dm b/code/modules/modular_computers/computers/item/computer_ui.dm
index 5ea800b7bc8..07479385680 100644
--- a/code/modules/modular_computers/computers/item/computer_ui.dm
+++ b/code/modules/modular_computers/computers/item/computer_ui.dm
@@ -16,9 +16,11 @@
if(!user.can_read(src, READING_CHECK_LITERACY))
return
- if(HAS_TRAIT(user, TRAIT_CHUNKYFINGERS) && !allow_chunky)
- to_chat(user, span_warning("Your fingers are too big to use this right now!"))
- return
+ if(ishuman(user))
+ var/mob/living/carbon/human/human_user = user
+ if(human_user.check_chunky_fingers())
+ balloon_alert(human_user, "fingers are too big!")
+ return
// Robots don't really need to see the screen, their wireless connection works as long as computer is on.
if(!screen_on && !issilicon(user))
diff --git a/code/modules/research/designs/limbgrower_designs.dm b/code/modules/research/designs/limbgrower_designs.dm
index 4c8f793d028..44aa62ab9b1 100644
--- a/code/modules/research/designs/limbgrower_designs.dm
+++ b/code/modules/research/designs/limbgrower_designs.dm
@@ -7,7 +7,7 @@
id = "l_arm"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25)
- build_path = /obj/item/bodypart/l_arm
+ build_path = /obj/item/bodypart/arm/left
category = list(RND_CATEGORY_INITIAL, SPECIES_HUMAN, SPECIES_LIZARD, SPECIES_MOTH, SPECIES_PLASMAMAN, SPECIES_ETHEREAL)
/datum/design/rightarm
@@ -15,7 +15,7 @@
id = "r_arm"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25)
- build_path = /obj/item/bodypart/r_arm
+ build_path = /obj/item/bodypart/arm/right
category = list(RND_CATEGORY_INITIAL, SPECIES_HUMAN, SPECIES_LIZARD, SPECIES_MOTH, SPECIES_PLASMAMAN, SPECIES_ETHEREAL)
/datum/design/leftleg
@@ -23,7 +23,7 @@
id = "l_leg"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25)
- build_path = /obj/item/bodypart/l_leg
+ build_path = /obj/item/bodypart/leg/left
category = list(RND_CATEGORY_INITIAL, SPECIES_HUMAN, SPECIES_LIZARD, SPECIES_MOTH, SPECIES_PLASMAMAN, SPECIES_ETHEREAL, RND_CATEGORY_LIMBS_DIGITIGRADE)
/datum/design/rightleg
@@ -31,7 +31,7 @@
id = "r_leg"
build_type = LIMBGROWER
reagents_list = list(/datum/reagent/medicine/c2/synthflesh = 25)
- build_path = /obj/item/bodypart/r_leg
+ build_path = /obj/item/bodypart/leg/right
category = list(RND_CATEGORY_INITIAL, SPECIES_HUMAN, SPECIES_LIZARD, SPECIES_MOTH, SPECIES_PLASMAMAN, SPECIES_ETHEREAL, RND_CATEGORY_LIMBS_DIGITIGRADE)
//Non-limb limb designs
diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm
index a424d2d87c5..b856c5ba68d 100644
--- a/code/modules/research/designs/mechfabricator_designs.dm
+++ b/code/modules/research/designs/mechfabricator_designs.dm
@@ -36,7 +36,7 @@
name = "Cyborg Left Arm"
id = "borg_l_arm"
build_type = MECHFAB
- build_path = /obj/item/bodypart/l_arm/robot
+ build_path = /obj/item/bodypart/arm/left/robot
materials = list(/datum/material/iron=10000)
construction_time = 200
category = list(
@@ -47,7 +47,7 @@
name = "Cyborg Right Arm"
id = "borg_r_arm"
build_type = MECHFAB
- build_path = /obj/item/bodypart/r_arm/robot
+ build_path = /obj/item/bodypart/arm/right/robot
materials = list(/datum/material/iron=10000)
construction_time = 200
category = list(
@@ -58,7 +58,7 @@
name = "Cyborg Left Leg"
id = "borg_l_leg"
build_type = MECHFAB
- build_path = /obj/item/bodypart/l_leg/robot
+ build_path = /obj/item/bodypart/leg/left/robot
materials = list(/datum/material/iron=10000)
construction_time = 200
category = list(
@@ -69,7 +69,7 @@
name = "Cyborg Right Leg"
id = "borg_r_leg"
build_type = MECHFAB
- build_path = /obj/item/bodypart/r_leg/robot
+ build_path = /obj/item/bodypart/leg/right/robot
materials = list(/datum/material/iron=10000)
construction_time = 200
category = list(
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index ad9df41d8c9..62b94e1b158 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -142,6 +142,27 @@
///A list of all the external organs we've got stored to draw horns, wings and stuff with (special because we are actually in the limbs unlike normal organs :/ )
var/list/obj/item/organ/external/external_organs = list()
+ /// Type of an attack from this limb does. Arms will do punches, Legs for kicks, and head for bites. (TO ADD: tactical chestbumps)
+ var/attack_type = BRUTE
+ /// the verb used for an unarmed attack when using this limb, such as arm.unarmed_attack_verb = punch
+ var/unarmed_attack_verb = "bump"
+ /// what visual effect is used when this limb is used to strike someone.
+ var/unarmed_attack_effect = ATTACK_EFFECT_PUNCH
+ /// Sounds when this bodypart is used in an umarmed attack
+ var/sound/unarmed_attack_sound = 'sound/weapons/punch1.ogg'
+ var/sound/unarmed_miss_sound = 'sound/weapons/punchmiss.ogg'
+ ///Lowest possible punch damage this bodypart can give. If this is set to 0, unarmed attacks will always miss.
+ var/unarmed_damage_low = 1
+ ///Highest possible punch damage this bodypart can ive.
+ var/unarmed_damage_high = 1
+ ///Damage at which attacks from this bodypart will stun
+ var/unarmed_stun_threshold = 2
+
+ /// Traits that are given to the holder of the part. If you want an effect that changes this, don't add directly to this. Use the add_bodypart_trait() proc
+ var/list/bodypart_traits = list()
+ /// The name of the trait source that the organ gives. Should not be altered during the events of gameplay, and will cause problems if it is.
+ var/bodypart_trait_source = BODYPART_TRAIT
+
/obj/item/bodypart/Initialize(mapload)
. = ..()
if(can_be_disabled)
@@ -588,7 +609,6 @@
///Proc to change the value of the `owner` variable and react to the event of its change.
/obj/item/bodypart/proc/set_owner(new_owner)
SHOULD_CALL_PARENT(TRUE)
-
if(owner == new_owner)
return FALSE //`null` is a valid option, so we need to use a num var to make it clear no change was made.
var/mob/living/carbon/old_owner = owner
@@ -620,9 +640,12 @@
if(needs_update_disabled)
update_disabled()
+
refresh_bleed_rate()
return old_owner
-
+/obj/item/bodypart/proc/on_removal()
+ for(var/trait in bodypart_traits)
+ REMOVE_TRAIT(owner, trait, bodypart_trait_source)
///Proc to change the value of the `can_be_disabled` variable and react to the event of its change.
/obj/item/bodypart/proc/set_can_be_disabled(new_can_be_disabled)
@@ -817,7 +840,7 @@
icon_exists(limb.icon, limb.icon_state, TRUE) //Prints a stack trace on the first failure of a given iconstate.
if(body_zone == BODY_ZONE_R_LEG)
- var/obj/item/bodypart/r_leg/leg = src
+ var/obj/item/bodypart/leg/right/leg = src
var/limb_overlays = limb.overlays
var/image/new_limb = leg.generate_masked_right_leg(limb.icon, limb.icon_state, image_dir)
if(new_limb)
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 4793a9aaee9..73f08afb637 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -137,6 +137,9 @@
continue
organ.transfer_to_limb(src, phantom_owner)
+ for(var/trait in bodypart_traits)
+ REMOVE_TRAIT(phantom_owner, trait, bodypart_trait_source)
+
update_icon_dropped()
synchronize_bodytypes(phantom_owner)
phantom_owner.update_health_hud() //update the healthdoll
@@ -237,7 +240,7 @@
if(special)
return ..()
-/obj/item/bodypart/r_arm/drop_limb(special)
+/obj/item/bodypart/arm/right/drop_limb(special)
. = ..()
var/mob/living/carbon/arm_owner = owner
@@ -256,7 +259,7 @@
arm_owner.update_worn_gloves() //to remove the bloody hands overlay
-/obj/item/bodypart/l_arm/drop_limb(special)
+/obj/item/bodypart/arm/left/drop_limb(special)
var/mob/living/carbon/arm_owner = owner
. = ..()
if(arm_owner && !special)
@@ -274,7 +277,7 @@
arm_owner.update_worn_gloves() //to remove the bloody hands overlay
-/obj/item/bodypart/r_leg/drop_limb(special)
+/obj/item/bodypart/leg/right/drop_limb(special)
if(owner && !special)
if(owner.legcuffed)
owner.legcuffed.forceMove(owner.drop_location()) //At this point bodypart is still in nullspace
@@ -285,7 +288,7 @@
owner.dropItemToGround(owner.shoes, TRUE)
return ..()
-/obj/item/bodypart/l_leg/drop_limb(special) //copypasta
+/obj/item/bodypart/leg/left/drop_limb(special) //copypasta
if(owner && !special)
if(owner.legcuffed)
owner.legcuffed.forceMove(owner.drop_location())
@@ -384,6 +387,9 @@
if(can_be_disabled)
update_disabled()
+ for(var/trait in bodypart_traits)
+ ADD_TRAIT(owner, trait, bodypart_trait_source)
+
// Bodyparts need to be sorted for leg masking to be done properly. It also will allow for some predictable
// behavior within said bodyparts list. We sort it here, as it's the only place we make changes to bodyparts.
new_limb_owner.bodyparts = sort_list(new_limb_owner.bodyparts, /proc/cmp_bodypart_by_body_part_asc)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index c23a12dcf9c..172dc7a6731 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -19,6 +19,14 @@
scars_covered_by_clothes = FALSE
grind_results = null
is_dimorphic = TRUE
+ unarmed_attack_verb = "bite"
+ unarmed_attack_effect = ATTACK_EFFECT_BITE
+ unarmed_attack_sound = 'sound/weapons/bite.ogg'
+ unarmed_miss_sound = 'sound/weapons/bite.ogg'
+ unarmed_damage_low = 1 // Yeah, biteing is pretty weak, blame the monkey super-nerf
+ unarmed_damage_high = 3
+ unarmed_stun_threshold = 4
+ bodypart_trait_source = HEAD_TRAIT
var/mob/living/brain/brainmob //The current occupant.
var/obj/item/organ/internal/brain/brain //The brain organ
@@ -216,7 +224,7 @@
facial_overlay.color = facial_hair_color
facial_overlay.alpha = hair_alpha
. += facial_overlay
-
+
if(!eyes)
. += image('icons/mob/species/human/human_face.dmi', "eyes_missing", -BODY_LAYER, SOUTH)
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index b6fd1a3fd74..39c368cac95 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -147,15 +147,15 @@
var/obj/item/bodypart/new_bodypart
switch(zone)
if(BODY_ZONE_L_ARM)
- new_bodypart = new /obj/item/bodypart/l_arm/alien()
+ new_bodypart = new /obj/item/bodypart/arm/left/alien()
if(BODY_ZONE_R_ARM)
- new_bodypart = new /obj/item/bodypart/r_arm/alien()
+ new_bodypart = new /obj/item/bodypart/arm/right/alien()
if(BODY_ZONE_HEAD)
new_bodypart = new /obj/item/bodypart/head/alien()
if(BODY_ZONE_L_LEG)
- new_bodypart = new /obj/item/bodypart/l_leg/alien()
+ new_bodypart = new /obj/item/bodypart/leg/left/alien()
if(BODY_ZONE_R_LEG)
- new_bodypart = new /obj/item/bodypart/r_leg/alien()
+ new_bodypart = new /obj/item/bodypart/leg/right/alien()
if(BODY_ZONE_CHEST)
new_bodypart = new /obj/item/bodypart/chest/alien()
if(new_bodypart)
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
index ecf3ce92b09..a974d863529 100644
--- a/code/modules/surgery/bodyparts/parts.dm
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -14,6 +14,7 @@
max_stamina_damage = 120
grind_results = null
wound_resistance = 10
+ bodypart_trait_source = CHEST_TRAIT
///The bodytype(s) allowed to attach to this chest.
var/acceptable_bodytype = BODYTYPE_HUMANOID
@@ -70,30 +71,41 @@
bodytype = BODYTYPE_LARVA_PLACEHOLDER | BODYTYPE_ORGANIC
acceptable_bodytype = BODYTYPE_LARVA_PLACEHOLDER
-/obj/item/bodypart/l_arm
+/// Parent Type for arms, should not appear in game.
+/obj/item/bodypart/arm
+ name = "arm"
+ desc = "Hey buddy give me a HAND and report this to the github because you shouldn't be seeing this."
+ attack_verb_continuous = list("slaps", "punches")
+ attack_verb_simple = list("slap", "punch")
+ max_damage = 50
+ max_stamina_damage = 50
+ aux_layer = HANDS_PART_LAYER
+ body_damage_coeff = 0.75
+ can_be_disabled = TRUE
+ unarmed_attack_verb = "punch" /// The classic punch, wonderfully classic and completely random
+ unarmed_damage_low = 1
+ unarmed_damage_high = 10
+ unarmed_stun_threshold = 10
+ body_zone = BODY_ZONE_L_ARM
+
+/obj/item/bodypart/arm/left
name = "left arm"
desc = "Did you know that the word 'sinister' stems originally from the \
Latin 'sinestra' (left hand), because the left hand was supposed to \
be possessed by the devil? This arm appears to be possessed by no \
one though."
icon_state = "default_human_l_arm"
- attack_verb_continuous = list("slaps", "punches")
- attack_verb_simple = list("slap", "punch")
- max_damage = 50
- max_stamina_damage = 50
body_zone = BODY_ZONE_L_ARM
body_part = ARM_LEFT
plaintext_zone = "left arm"
aux_zone = BODY_ZONE_PRECISE_L_HAND
- aux_layer = HANDS_PART_LAYER
- body_damage_coeff = 0.75
held_index = 1
px_x = -6
px_y = 0
- can_be_disabled = TRUE
+ bodypart_trait_source = LEFT_ARM_TRAIT
-/obj/item/bodypart/l_arm/set_owner(new_owner)
+/obj/item/bodypart/arm/left/set_owner(new_owner)
. = ..()
if(. == FALSE)
return
@@ -115,7 +127,7 @@
///Proc to react to the owner gaining the TRAIT_PARALYSIS_L_ARM trait.
-/obj/item/bodypart/l_arm/proc/on_owner_paralysis_gain(mob/living/carbon/source)
+/obj/item/bodypart/arm/left/proc/on_owner_paralysis_gain(mob/living/carbon/source)
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_ARM)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM))
@@ -123,14 +135,14 @@
///Proc to react to the owner losing the TRAIT_PARALYSIS_L_ARM trait.
-/obj/item/bodypart/l_arm/proc/on_owner_paralysis_loss(mob/living/carbon/source)
+/obj/item/bodypart/arm/left/proc/on_owner_paralysis_loss(mob/living/carbon/source)
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_ARM)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_ARM))
RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_ARM), .proc/on_owner_paralysis_gain)
-/obj/item/bodypart/l_arm/set_disabled(new_disabled)
+/obj/item/bodypart/arm/left/set_disabled(new_disabled)
. = ..()
if(isnull(.) || !owner)
return
@@ -150,7 +162,7 @@
hand_screen_object?.update_appearance()
-/obj/item/bodypart/l_arm/monkey
+/obj/item/bodypart/arm/left/monkey
icon = 'icons/mob/species/monkey/bodyparts.dmi'
icon_static = 'icons/mob/species/monkey/bodyparts.dmi'
icon_state = "default_monkey_l_arm"
@@ -161,8 +173,11 @@
px_x = -5
px_y = -3
dmg_overlay_type = SPECIES_MONKEY
+ unarmed_damage_low = 1 /// monkey punches must be really weak, considering they bite people instead and their bites are weak as hell.
+ unarmed_damage_high = 2
+ unarmed_stun_threshold = 3
-/obj/item/bodypart/l_arm/alien
+/obj/item/bodypart/arm/left/alien
icon = 'icons/mob/species/alien/bodyparts.dmi'
icon_static = 'icons/mob/species/alien/bodyparts.dmi'
icon_state = "alien_l_arm"
@@ -176,28 +191,22 @@
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm
+/obj/item/bodypart/arm/right
name = "right arm"
desc = "Over 87% of humans are right handed. That figure is much lower \
among humans missing their right arm."
- icon_state = "default_human_r_arm"
- attack_verb_continuous = list("slaps", "punches")
- attack_verb_simple = list("slap", "punch")
- max_damage = 50
body_zone = BODY_ZONE_R_ARM
body_part = ARM_RIGHT
+ icon_state = "default_human_r_arm"
plaintext_zone = "right arm"
aux_zone = BODY_ZONE_PRECISE_R_HAND
aux_layer = HANDS_PART_LAYER
- body_damage_coeff = 0.75
held_index = 2
px_x = 6
px_y = 0
- max_stamina_damage = 50
- can_be_disabled = TRUE
+ bodypart_trait_source = RIGHT_ARM_TRAIT
-
-/obj/item/bodypart/r_arm/set_owner(new_owner)
+/obj/item/bodypart/arm/right/set_owner(new_owner)
. = ..()
if(. == FALSE)
return
@@ -219,7 +228,7 @@
///Proc to react to the owner gaining the TRAIT_PARALYSIS_R_ARM trait.
-/obj/item/bodypart/r_arm/proc/on_owner_paralysis_gain(mob/living/carbon/source)
+/obj/item/bodypart/arm/right/proc/on_owner_paralysis_gain(mob/living/carbon/source)
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_ARM)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM))
@@ -227,14 +236,14 @@
///Proc to react to the owner losing the TRAIT_PARALYSIS_R_ARM trait.
-/obj/item/bodypart/r_arm/proc/on_owner_paralysis_loss(mob/living/carbon/source)
+/obj/item/bodypart/arm/right/proc/on_owner_paralysis_loss(mob/living/carbon/source)
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_ARM)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_ARM))
RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_ARM), .proc/on_owner_paralysis_gain)
-/obj/item/bodypart/r_arm/set_disabled(new_disabled)
+/obj/item/bodypart/arm/right/set_disabled(new_disabled)
. = ..()
if(isnull(.) || !owner)
return
@@ -254,7 +263,7 @@
hand_screen_object?.update_appearance()
-/obj/item/bodypart/r_arm/monkey
+/obj/item/bodypart/arm/right/monkey
icon = 'icons/mob/species/monkey/bodyparts.dmi'
icon_static = 'icons/mob/species/monkey/bodyparts.dmi'
icon_state = "default_monkey_r_arm"
@@ -265,8 +274,11 @@
px_x = 5
px_y = -3
dmg_overlay_type = SPECIES_MONKEY
+ unarmed_damage_low = 1
+ unarmed_damage_high = 2
+ unarmed_stun_threshold = 3
-/obj/item/bodypart/r_arm/alien
+/obj/item/bodypart/arm/right/alien
icon = 'icons/mob/species/alien/bodyparts.dmi'
icon_static = 'icons/mob/species/alien/bodyparts.dmi'
icon_state = "alien_r_arm"
@@ -279,25 +291,37 @@
max_damage = 100
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg
+/// Parent Type for arms, should not appear in game.
+/obj/item/bodypart/leg
+ name = "leg"
+ desc = "This item shouldn't exist. Talk about breaking a leg. Badum-Tss!"
+ attack_verb_continuous = list("kicks", "stomps")
+ attack_verb_simple = list("kick", "stomp")
+ max_damage = 50
+ body_damage_coeff = 0.75
+ max_stamina_damage = 50
+ can_be_disabled = TRUE
+ unarmed_attack_effect = ATTACK_EFFECT_KICK
+ body_zone = BODY_ZONE_L_LEG
+ unarmed_attack_verb = "kick" // The lovely kick, typically only accessable by attacking a grouded foe. 1.5 times better than the punch.
+ unarmed_damage_low = 2
+ unarmed_damage_high = 15
+ unarmed_stun_threshold = 10
+
+/obj/item/bodypart/leg/left
name = "left leg"
desc = "Some athletes prefer to tie their left shoelaces first for good \
luck. In this instance, it probably would not have helped."
icon_state = "default_human_l_leg"
- attack_verb_continuous = list("kicks", "stomps")
- attack_verb_simple = list("kick", "stomp")
- max_damage = 50
body_zone = BODY_ZONE_L_LEG
body_part = LEG_LEFT
plaintext_zone = "left leg"
- body_damage_coeff = 0.75
px_x = -2
px_y = 12
- max_stamina_damage = 50
can_be_disabled = TRUE
+ bodypart_trait_source = LEFT_LEG_TRAIT
-
-/obj/item/bodypart/l_leg/set_owner(new_owner)
+/obj/item/bodypart/leg/left/set_owner(new_owner)
. = ..()
if(. == FALSE)
return
@@ -319,7 +343,7 @@
///Proc to react to the owner gaining the TRAIT_PARALYSIS_L_LEG trait.
-/obj/item/bodypart/l_leg/proc/on_owner_paralysis_gain(mob/living/carbon/source)
+/obj/item/bodypart/leg/left/proc/on_owner_paralysis_gain(mob/living/carbon/source)
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_LEG)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG))
@@ -327,14 +351,14 @@
///Proc to react to the owner losing the TRAIT_PARALYSIS_L_LEG trait.
-/obj/item/bodypart/l_leg/proc/on_owner_paralysis_loss(mob/living/carbon/source)
+/obj/item/bodypart/leg/left/proc/on_owner_paralysis_loss(mob/living/carbon/source)
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_L_LEG)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_L_LEG))
RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_L_LEG), .proc/on_owner_paralysis_gain)
-/obj/item/bodypart/l_leg/set_disabled(new_disabled)
+/obj/item/bodypart/leg/left/set_disabled(new_disabled)
. = ..()
if(isnull(.) || !owner)
return
@@ -347,7 +371,7 @@
else if(!bodypart_disabled)
owner.set_usable_legs(owner.usable_legs + 1)
-/obj/item/bodypart/l_leg/monkey
+/obj/item/bodypart/leg/left/monkey
icon = 'icons/mob/species/monkey/bodyparts.dmi'
icon_static = 'icons/mob/species/monkey/bodyparts.dmi'
icon_state = "default_monkey_l_leg"
@@ -357,8 +381,11 @@
wound_resistance = -10
px_y = 4
dmg_overlay_type = SPECIES_MONKEY
+ unarmed_damage_low = 2
+ unarmed_damage_high = 3
+ unarmed_stun_threshold = 4
-/obj/item/bodypart/l_leg/alien
+/obj/item/bodypart/leg/left/alien
icon = 'icons/mob/species/alien/bodyparts.dmi'
icon_static = 'icons/mob/species/alien/bodyparts.dmi'
icon_state = "alien_l_leg"
@@ -371,24 +398,19 @@
max_damage = 100
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg
+/obj/item/bodypart/leg/right
name = "right leg"
desc = "You put your right leg in, your right leg out. In, out, in, out, \
shake it all about. And apparently then it detaches.\n\
The hokey pokey has certainly changed a lot since space colonisation."
// alternative spellings of 'pokey' are available
icon_state = "default_human_r_leg"
- attack_verb_continuous = list("kicks", "stomps")
- attack_verb_simple = list("kick", "stomp")
- max_damage = 50
body_zone = BODY_ZONE_R_LEG
body_part = LEG_RIGHT
plaintext_zone = "right leg"
- body_damage_coeff = 0.75
px_x = 2
px_y = 12
- max_stamina_damage = 50
- can_be_disabled = TRUE
+ bodypart_trait_source = RIGHT_LEG_TRAIT
/// We store this here to generate our icon key more easily.
var/left_leg_mask_key
/// The associated list of all the left leg mask keys associated to their cached left leg masks.
@@ -397,8 +419,7 @@
/// each dir changes, we're doing it with a mask instead, which we cache for efficiency reasons.
var/static/list/left_leg_mask_cache = list()
-
-/obj/item/bodypart/r_leg/set_owner(new_owner)
+/obj/item/bodypart/leg/right/set_owner(new_owner)
. = ..()
if(. == FALSE)
return
@@ -420,7 +441,7 @@
///Proc to react to the owner gaining the TRAIT_PARALYSIS_R_LEG trait.
-/obj/item/bodypart/r_leg/proc/on_owner_paralysis_gain(mob/living/carbon/source)
+/obj/item/bodypart/leg/right/proc/on_owner_paralysis_gain(mob/living/carbon/source)
SIGNAL_HANDLER
ADD_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_LEG)
UnregisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG))
@@ -428,14 +449,14 @@
///Proc to react to the owner losing the TRAIT_PARALYSIS_R_LEG trait.
-/obj/item/bodypart/r_leg/proc/on_owner_paralysis_loss(mob/living/carbon/source)
+/obj/item/bodypart/leg/right/proc/on_owner_paralysis_loss(mob/living/carbon/source)
SIGNAL_HANDLER
REMOVE_TRAIT(src, TRAIT_PARALYSIS, TRAIT_PARALYSIS_R_LEG)
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_PARALYSIS_R_LEG))
RegisterSignal(owner, SIGNAL_ADDTRAIT(TRAIT_PARALYSIS_R_LEG), .proc/on_owner_paralysis_gain)
-/obj/item/bodypart/r_leg/set_disabled(new_disabled)
+/obj/item/bodypart/leg/right/set_disabled(new_disabled)
. = ..()
if(isnull(.) || !owner)
return
@@ -448,7 +469,7 @@
else if(!bodypart_disabled)
owner.set_usable_legs(owner.usable_legs + 1)
-/obj/item/bodypart/r_leg/monkey
+/obj/item/bodypart/leg/right/monkey
icon = 'icons/mob/species/monkey/bodyparts.dmi'
icon_static = 'icons/mob/species/monkey/bodyparts.dmi'
icon_state = "default_monkey_r_leg"
@@ -458,8 +479,11 @@
wound_resistance = -10
px_y = 4
dmg_overlay_type = SPECIES_MONKEY
+ unarmed_damage_low = 2
+ unarmed_damage_high = 3
+ unarmed_stun_threshold = 4
-/obj/item/bodypart/r_leg/alien
+/obj/item/bodypart/leg/right/alien
icon = 'icons/mob/species/alien/bodyparts.dmi'
icon_static = 'icons/mob/species/alien/bodyparts.dmi'
icon_state = "alien_r_leg"
diff --git a/code/modules/surgery/bodyparts/robot_bodyparts.dm b/code/modules/surgery/bodyparts/robot_bodyparts.dm
index 0415b0c1150..d149c1f21c8 100644
--- a/code/modules/surgery/bodyparts/robot_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/robot_bodyparts.dm
@@ -10,7 +10,7 @@
//The complete sprite (displayed when the limb is on the ground) should be named "borg_l_arm".
//Failure to follow this pattern will cause the hand's icons to be missing due to the way get_limb_icon() works to generate the mob's icons using the aux_zone var.
-/obj/item/bodypart/l_arm/robot
+/obj/item/bodypart/arm/left/robot
name = "cyborg left arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
limb_id = BODYPART_ID_ROBOTIC
@@ -37,7 +37,7 @@
medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG
heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG
-/obj/item/bodypart/r_arm/robot
+/obj/item/bodypart/arm/right/robot
name = "cyborg right arm"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
attack_verb_simple = list("slapped", "punched")
@@ -64,7 +64,7 @@
medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG
heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG
-/obj/item/bodypart/l_leg/robot
+/obj/item/bodypart/leg/left/robot
name = "cyborg left leg"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
attack_verb_simple = list("kicked", "stomped")
@@ -91,7 +91,7 @@
medium_burn_msg = ROBOTIC_MEDIUM_BURN_MSG
heavy_burn_msg = ROBOTIC_HEAVY_BURN_MSG
-/obj/item/bodypart/r_leg/robot
+/obj/item/bodypart/leg/right/robot
name = "cyborg right leg"
desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case."
attack_verb_simple = list("kicked", "stomped")
@@ -332,7 +332,7 @@
-/obj/item/bodypart/l_arm/robot/surplus
+/obj/item/bodypart/arm/left/robot/surplus
name = "surplus prosthetic left arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon_static = 'icons/mob/augmentation/surplus_augments.dmi'
@@ -341,7 +341,7 @@
burn_reduction = 0
max_damage = 20
-/obj/item/bodypart/r_arm/robot/surplus
+/obj/item/bodypart/arm/right/robot/surplus
name = "surplus prosthetic right arm"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon_static = 'icons/mob/augmentation/surplus_augments.dmi'
@@ -350,7 +350,7 @@
burn_reduction = 0
max_damage = 20
-/obj/item/bodypart/l_leg/robot/surplus
+/obj/item/bodypart/leg/left/robot/surplus
name = "surplus prosthetic left leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon_static = 'icons/mob/augmentation/surplus_augments.dmi'
@@ -359,7 +359,7 @@
burn_reduction = 0
max_damage = 20
-/obj/item/bodypart/r_leg/robot/surplus
+/obj/item/bodypart/leg/right/robot/surplus
name = "surplus prosthetic right leg"
desc = "A skeletal, robotic limb. Outdated and fragile, but it's still better than nothing."
icon_static = 'icons/mob/augmentation/surplus_augments.dmi'
diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
index 428e52a397d..767ee35cb7d 100644
--- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm
@@ -3,6 +3,9 @@
limb_id = SPECIES_ETHEREAL
is_dimorphic = FALSE
dmg_overlay_type = null
+ attack_type = BURN // bish buzz
+ unarmed_attack_sound = 'sound/weapons/etherealhit.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
/obj/item/bodypart/head/ethereal/update_limb(dropping_limb, is_creating)
. = ..()
@@ -24,24 +27,32 @@
var/datum/species/ethereal/eth_holder = potato_oc.dna.species
species_color = eth_holder.current_color
-/obj/item/bodypart/l_arm/ethereal
+/obj/item/bodypart/arm/left/ethereal
icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi'
limb_id = SPECIES_ETHEREAL
dmg_overlay_type = null
+ attack_type = BURN //burn bish
+ unarmed_attack_verb = "burn"
+ unarmed_attack_sound = 'sound/weapons/etherealhit.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
-/obj/item/bodypart/l_arm/ethereal/update_limb(dropping_limb, is_creating)
+/obj/item/bodypart/arm/left/ethereal/update_limb(dropping_limb, is_creating)
. = ..()
if(isethereal(owner))
var/mob/living/carbon/human/potato_oc = owner
var/datum/species/ethereal/eth_holder = potato_oc.dna.species
species_color = eth_holder.current_color
-/obj/item/bodypart/r_arm/ethereal
+/obj/item/bodypart/arm/right/ethereal
icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi'
limb_id = SPECIES_ETHEREAL
dmg_overlay_type = null
+ attack_type = BURN // bish buzz
+ unarmed_attack_verb = "burn"
+ unarmed_attack_sound = 'sound/weapons/etherealhit.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
-/obj/item/bodypart/r_arm/ethereal/update_limb(dropping_limb, is_creating)
+/obj/item/bodypart/arm/right/ethereal/update_limb(dropping_limb, is_creating)
. = ..()
if(isethereal(owner))
var/mob/living/carbon/human/potato_oc = owner
@@ -49,24 +60,30 @@
species_color = eth_holder.current_color
-/obj/item/bodypart/l_leg/ethereal
+/obj/item/bodypart/leg/left/ethereal
icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi'
limb_id = SPECIES_ETHEREAL
dmg_overlay_type = null
+ attack_type = BURN // bish buzz
+ unarmed_attack_sound = 'sound/weapons/etherealhit.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
-/obj/item/bodypart/l_leg/ethereal/update_limb(dropping_limb, is_creating)
+/obj/item/bodypart/leg/left/ethereal/update_limb(dropping_limb, is_creating)
. = ..()
if(isethereal(owner))
var/mob/living/carbon/human/potato_oc = owner
var/datum/species/ethereal/eth_holder = potato_oc.dna.species
species_color = eth_holder.current_color
-/obj/item/bodypart/r_leg/ethereal
+/obj/item/bodypart/leg/right/ethereal
icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi'
limb_id = SPECIES_ETHEREAL
dmg_overlay_type = null
+ attack_type = BURN // bish buzz
+ unarmed_attack_sound = 'sound/weapons/etherealhit.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
-/obj/item/bodypart/r_leg/ethereal/update_limb(dropping_limb, is_creating)
+/obj/item/bodypart/leg/right/ethereal/update_limb(dropping_limb, is_creating)
. = ..()
if(isethereal(owner))
var/mob/living/carbon/human/potato_oc = owner
diff --git a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
index 87203b92c77..1c24a849e39 100644
--- a/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/lizard_bodyparts.dm
@@ -8,28 +8,42 @@
limb_id = SPECIES_LIZARD
is_dimorphic = TRUE
-/obj/item/bodypart/l_arm/lizard
+/obj/item/bodypart/arm/left/lizard
+ icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
+ limb_id = SPECIES_LIZARD
+ unarmed_attack_verb = "slash"
+ unarmed_attack_effect = ATTACK_EFFECT_CLAW
+ unarmed_attack_sound = 'sound/weapons/slash.ogg'
+ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg'
+
+/obj/item/bodypart/arm/right/lizard
+ icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
+ limb_id = SPECIES_LIZARD
+ unarmed_attack_verb = "slash"
+ unarmed_attack_effect = ATTACK_EFFECT_CLAW
+ unarmed_attack_sound = 'sound/weapons/slash.ogg'
+ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg'
+
+/obj/item/bodypart/arm/left/lizard/ashwalker
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+
+/obj/item/bodypart/arm/right/lizard/ashwalker
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+
+/obj/item/bodypart/leg/left/lizard
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
limb_id = SPECIES_LIZARD
-/obj/item/bodypart/r_arm/lizard
+/obj/item/bodypart/leg/right/lizard
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
limb_id = SPECIES_LIZARD
-/obj/item/bodypart/l_leg/lizard
- icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
- limb_id = SPECIES_LIZARD
-
-/obj/item/bodypart/r_leg/lizard
- icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
- limb_id = SPECIES_LIZARD
-
-/obj/item/bodypart/l_leg/digitigrade
+/obj/item/bodypart/leg/left/digitigrade
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
limb_id = BODYPART_ID_DIGITIGRADE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE
-/obj/item/bodypart/l_leg/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE)
+/obj/item/bodypart/leg/left/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE)
. = ..()
if(ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
@@ -50,12 +64,12 @@
else
limb_id = SPECIES_LIZARD
-/obj/item/bodypart/r_leg/digitigrade
+/obj/item/bodypart/leg/right/digitigrade
icon_greyscale = 'icons/mob/species/lizard/bodyparts.dmi'
limb_id = BODYPART_ID_DIGITIGRADE
bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE
-/obj/item/bodypart/r_leg/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE)
+/obj/item/bodypart/leg/right/digitigrade/update_limb(dropping_limb = FALSE, is_creating = FALSE)
. = ..()
if(ishuman(owner))
var/mob/living/carbon/human/human_owner = owner
diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
index 52057f2ac10..c3c00c69d74 100644
--- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm
@@ -7,17 +7,25 @@
limb_id = SPECIES_SNAIL
is_dimorphic = FALSE
-/obj/item/bodypart/l_arm/snail
+/obj/item/bodypart/arm/left/snail
limb_id = SPECIES_SNAIL
+ unarmed_attack_verb = "slap"
+ unarmed_attack_effect = ATTACK_EFFECT_DISARM
+ unarmed_damage_high = 0.5 //snails are soft and squishy
-/obj/item/bodypart/r_arm/snail
- limb_id = SPECIES_SNAIL
-/obj/item/bodypart/l_leg/snail
+/obj/item/bodypart/arm/right/snail
limb_id = SPECIES_SNAIL
+ unarmed_attack_verb = "slap"
+ unarmed_attack_effect = ATTACK_EFFECT_DISARM
+ unarmed_damage_high = 0.5
-/obj/item/bodypart/r_leg/snail
+/obj/item/bodypart/leg/left/snail
limb_id = SPECIES_SNAIL
+ unarmed_damage_high = 0.5
+/obj/item/bodypart/leg/right/snail
+ limb_id = SPECIES_SNAIL
+ unarmed_damage_high = 0.5
///ABDUCTOR
/obj/item/bodypart/head/abductor
@@ -30,19 +38,21 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/abductor
+/obj/item/bodypart/arm/left/abductor
+ limb_id = SPECIES_ABDUCTOR
+ should_draw_greyscale = FALSE
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+
+/obj/item/bodypart/arm/right/abductor
+ limb_id = SPECIES_ABDUCTOR
+ should_draw_greyscale = FALSE
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+
+/obj/item/bodypart/leg/left/abductor
limb_id = SPECIES_ABDUCTOR
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/abductor
- limb_id = SPECIES_ABDUCTOR
- should_draw_greyscale = FALSE
-
-/obj/item/bodypart/l_leg/abductor
- limb_id = SPECIES_ABDUCTOR
- should_draw_greyscale = FALSE
-
-/obj/item/bodypart/r_leg/abductor
+/obj/item/bodypart/leg/right/abductor
limb_id = SPECIES_ABDUCTOR
should_draw_greyscale = FALSE
@@ -57,19 +67,19 @@
is_dimorphic = TRUE
dmg_overlay_type = null
-/obj/item/bodypart/l_arm/jelly
+/obj/item/bodypart/arm/left/jelly
limb_id = SPECIES_JELLYPERSON
dmg_overlay_type = null
-/obj/item/bodypart/r_arm/jelly
+/obj/item/bodypart/arm/right/jelly
limb_id = SPECIES_JELLYPERSON
dmg_overlay_type = null
-/obj/item/bodypart/l_leg/jelly
+/obj/item/bodypart/leg/left/jelly
limb_id = SPECIES_JELLYPERSON
dmg_overlay_type = null
-/obj/item/bodypart/r_leg/jelly
+/obj/item/bodypart/leg/right/jelly
limb_id = SPECIES_JELLYPERSON
dmg_overlay_type = null
@@ -82,16 +92,16 @@
limb_id = SPECIES_SLIMEPERSON
is_dimorphic = TRUE
-/obj/item/bodypart/l_arm/slime
+/obj/item/bodypart/arm/left/slime
limb_id = SPECIES_SLIMEPERSON
-/obj/item/bodypart/r_arm/slime
+/obj/item/bodypart/arm/right/slime
limb_id = SPECIES_SLIMEPERSON
-/obj/item/bodypart/l_leg/slime
+/obj/item/bodypart/leg/left/slime
limb_id = SPECIES_SLIMEPERSON
-/obj/item/bodypart/r_leg/slime
+/obj/item/bodypart/leg/right/slime
limb_id = SPECIES_SLIMEPERSON
///LUMINESCENT
@@ -103,16 +113,16 @@
limb_id = SPECIES_LUMINESCENT
is_dimorphic = TRUE
-/obj/item/bodypart/l_arm/luminescent
+/obj/item/bodypart/arm/left/luminescent
limb_id = SPECIES_LUMINESCENT
-/obj/item/bodypart/r_arm/luminescent
+/obj/item/bodypart/arm/right/luminescent
limb_id = SPECIES_LUMINESCENT
-/obj/item/bodypart/l_leg/luminescent
+/obj/item/bodypart/leg/left/luminescent
limb_id = SPECIES_LUMINESCENT
-/obj/item/bodypart/r_leg/luminescent
+/obj/item/bodypart/leg/right/luminescent
limb_id = SPECIES_LUMINESCENT
///ZOMBIE
@@ -126,19 +136,19 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/zombie
+/obj/item/bodypart/arm/left/zombie
limb_id = SPECIES_ZOMBIE
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/zombie
+/obj/item/bodypart/arm/right/zombie
limb_id = SPECIES_ZOMBIE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg/zombie
+/obj/item/bodypart/leg/left/zombie
limb_id = SPECIES_ZOMBIE
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/zombie
+/obj/item/bodypart/leg/right/zombie
limb_id = SPECIES_ZOMBIE
should_draw_greyscale = FALSE
@@ -151,16 +161,24 @@
limb_id = SPECIES_PODPERSON
is_dimorphic = TRUE
-/obj/item/bodypart/l_arm/pod
+/obj/item/bodypart/arm/left/pod
+ limb_id = SPECIES_PODPERSON
+ unarmed_attack_verb = "slash"
+ unarmed_attack_effect = ATTACK_EFFECT_CLAW
+ unarmed_attack_sound = 'sound/weapons/slice.ogg'
+ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg'
+
+/obj/item/bodypart/arm/right/pod
+ limb_id = SPECIES_PODPERSON
+ unarmed_attack_verb = "slash"
+ unarmed_attack_effect = ATTACK_EFFECT_CLAW
+ unarmed_attack_sound = 'sound/weapons/slice.ogg'
+ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg'
+
+/obj/item/bodypart/leg/left/pod
limb_id = SPECIES_PODPERSON
-/obj/item/bodypart/r_arm/pod
- limb_id = SPECIES_PODPERSON
-
-/obj/item/bodypart/l_leg/pod
- limb_id = SPECIES_PODPERSON
-
-/obj/item/bodypart/r_leg/pod
+/obj/item/bodypart/leg/right/pod
limb_id = SPECIES_PODPERSON
///FLY
@@ -174,19 +192,19 @@
is_dimorphic = TRUE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/fly
+/obj/item/bodypart/arm/left/fly
limb_id = SPECIES_FLYPERSON
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/fly
+/obj/item/bodypart/arm/right/fly
limb_id = SPECIES_FLYPERSON
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg/fly
+/obj/item/bodypart/leg/left/fly
limb_id = SPECIES_FLYPERSON
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/fly
+/obj/item/bodypart/leg/right/fly
limb_id = SPECIES_FLYPERSON
should_draw_greyscale = FALSE
@@ -201,22 +219,28 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/shadow
+/obj/item/bodypart/arm/left/shadow
limb_id = SPECIES_SHADOW
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/shadow
+/obj/item/bodypart/arm/right/shadow
limb_id = SPECIES_SHADOW
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg/shadow
+/obj/item/bodypart/leg/left/shadow
limb_id = SPECIES_SHADOW
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/shadow
+/obj/item/bodypart/leg/right/shadow
limb_id = SPECIES_SHADOW
should_draw_greyscale = FALSE
+/obj/item/bodypart/arm/left/shadow/nightmare
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+
+/obj/item/bodypart/arm/right/shadow/nightmare
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+
///SKELETON
/obj/item/bodypart/head/skeleton
limb_id = SPECIES_SKELETON
@@ -230,22 +254,22 @@
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/l_arm/skeleton
+/obj/item/bodypart/arm/left/skeleton
limb_id = SPECIES_SKELETON
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/r_arm/skeleton
+/obj/item/bodypart/arm/right/skeleton
limb_id = SPECIES_SKELETON
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/l_leg/skeleton
+/obj/item/bodypart/leg/left/skeleton
limb_id = SPECIES_SKELETON
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/r_leg/skeleton
+/obj/item/bodypart/leg/right/skeleton
limb_id = SPECIES_SKELETON
should_draw_greyscale = FALSE
dmg_overlay_type = null
@@ -259,19 +283,31 @@
limb_id = SPECIES_MUSHROOM
is_dimorphic = TRUE
-/obj/item/bodypart/l_arm/mushroom
+/obj/item/bodypart/arm/left/mushroom
limb_id = SPECIES_MUSHROOM
+ unarmed_damage_low = 6
+ unarmed_damage_high = 14
+ unarmed_stun_threshold = 14
-/obj/item/bodypart/r_arm/mushroom
+/obj/item/bodypart/arm/right/mushroom
limb_id = SPECIES_MUSHROOM
+ unarmed_damage_low = 6
+ unarmed_damage_high = 14
+ unarmed_stun_threshold = 14
-/obj/item/bodypart/l_leg/mushroom
+/obj/item/bodypart/leg/left/mushroom
limb_id = SPECIES_MUSHROOM
+ unarmed_damage_low = 9
+ unarmed_damage_high = 21
+ unarmed_stun_threshold = 14
-/obj/item/bodypart/r_leg/mushroom
+/obj/item/bodypart/leg/right/mushroom
limb_id = SPECIES_MUSHROOM
+ unarmed_damage_low = 9
+ unarmed_damage_high = 21
+ unarmed_stun_threshold = 14
-///GOLEMS (i hate xenobio SO FUCKING MUCH)
+///GOLEMS (i hate xenobio SO FUCKING MUCH) (from 2022: Yeah I fucking feel your pain brother)
/obj/item/bodypart/head/golem
limb_id = SPECIES_GOLEM
is_dimorphic = FALSE
@@ -282,21 +318,35 @@
is_dimorphic = TRUE
dmg_overlay_type = null
-/obj/item/bodypart/l_arm/golem
+/obj/item/bodypart/arm/left/golem
limb_id = SPECIES_GOLEM
dmg_overlay_type = null
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+ unarmed_damage_low = 5 // I'd like to take the moment that maintaining all of these random ass golem speciese is hell and oranges was right
+ unarmed_damage_high = 14
+ unarmed_stun_threshold = 11
-/obj/item/bodypart/r_arm/golem
+/obj/item/bodypart/arm/right/golem
limb_id = SPECIES_GOLEM
dmg_overlay_type = null
+ bodypart_traits = list(TRAIT_CHUNKYFINGERS)
+ unarmed_damage_low = 5
+ unarmed_damage_high = 14
+ unarmed_stun_threshold = 11
-/obj/item/bodypart/l_leg/golem
+/obj/item/bodypart/leg/left/golem
limb_id = SPECIES_GOLEM
dmg_overlay_type = null
+ unarmed_damage_low = 7
+ unarmed_damage_high = 21
+ unarmed_stun_threshold = 11
-/obj/item/bodypart/r_leg/golem
+/obj/item/bodypart/leg/right/golem
limb_id = SPECIES_GOLEM
dmg_overlay_type = null
+ unarmed_damage_low = 7
+ unarmed_damage_high = 21
+ unarmed_stun_threshold = 11
///
/obj/item/bodypart/head/golem/cult
@@ -309,19 +359,19 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/golem/cult
+/obj/item/bodypart/arm/left/golem/cult
limb_id = SPECIES_GOLEM_CULT
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/golem/cult
+/obj/item/bodypart/arm/right/golem/cult
limb_id = SPECIES_GOLEM_CULT
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg/golem/cult
+/obj/item/bodypart/leg/left/golem/cult
limb_id = SPECIES_GOLEM_CULT
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/golem/cult
+/obj/item/bodypart/leg/right/golem/cult
limb_id = SPECIES_GOLEM_CULT
should_draw_greyscale = FALSE
@@ -336,21 +386,33 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/golem/cloth
+/obj/item/bodypart/arm/left/golem/cloth
limb_id = SPECIES_GOLEM_CLOTH
should_draw_greyscale = FALSE
+ unarmed_damage_low = 4
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 8
-/obj/item/bodypart/r_arm/golem/cloth
+/obj/item/bodypart/arm/right/golem/cloth
limb_id = SPECIES_GOLEM_CLOTH
should_draw_greyscale = FALSE
+ unarmed_damage_low = 4
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 8
-/obj/item/bodypart/l_leg/golem/cloth
+/obj/item/bodypart/leg/left/golem/cloth
limb_id = SPECIES_GOLEM_CLOTH
should_draw_greyscale = FALSE
+ unarmed_damage_low = 6
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 12
-/obj/item/bodypart/r_leg/golem/cloth
+/obj/item/bodypart/leg/right/golem/cloth
limb_id = SPECIES_GOLEM_CLOTH
should_draw_greyscale = FALSE
+ unarmed_damage_low = 6
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 12
///
/obj/item/bodypart/head/golem/cardboard
@@ -363,21 +425,43 @@
is_dimorphic = TRUE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/golem/cardboard
+/obj/item/bodypart/arm/left/golem/cardboard
limb_id = SPECIES_GOLEM_CARDBOARD
should_draw_greyscale = FALSE
+ unarmed_attack_verb = "whip"
+ unarmed_attack_sound = 'sound/weapons/whip.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
+ unarmed_damage_low = 4
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 8
-/obj/item/bodypart/r_arm/golem/cardboard
+/obj/item/bodypart/arm/right/golem/cardboard
limb_id = SPECIES_GOLEM_CARDBOARD
should_draw_greyscale = FALSE
+ unarmed_attack_verb = "whip"
+ unarmed_attack_sound = 'sound/weapons/whip.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
+ unarmed_damage_low = 4
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 8
-/obj/item/bodypart/l_leg/golem/cardboard
+/obj/item/bodypart/leg/left/golem/cardboard
limb_id = SPECIES_GOLEM_CARDBOARD
should_draw_greyscale = FALSE
+ unarmed_attack_sound = 'sound/weapons/whip.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
+ unarmed_damage_low = 6
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 12
-/obj/item/bodypart/r_leg/golem/cardboard
+/obj/item/bodypart/leg/right/golem/cardboard
limb_id = SPECIES_GOLEM_CARDBOARD
should_draw_greyscale = FALSE
+ unarmed_attack_sound = 'sound/weapons/whip.ogg'
+ unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg'
+ unarmed_damage_low = 6
+ unarmed_stun_threshold = 7
+ unarmed_damage_high = 12
///
/obj/item/bodypart/head/golem/durathread
@@ -390,19 +474,19 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/golem/durathread
+/obj/item/bodypart/arm/left/golem/durathread
limb_id = SPECIES_GOLEM_DURATHREAD
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/golem/durathread
+/obj/item/bodypart/arm/right/golem/durathread
limb_id = SPECIES_GOLEM_DURATHREAD
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg/golem/durathread
+/obj/item/bodypart/leg/left/golem/durathread
limb_id = SPECIES_GOLEM_DURATHREAD
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/golem/durathread
+/obj/item/bodypart/leg/right/golem/durathread
limb_id = SPECIES_GOLEM_DURATHREAD
should_draw_greyscale = FALSE
@@ -417,19 +501,19 @@
is_dimorphic = FALSE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/golem/bone
+/obj/item/bodypart/arm/left/golem/bone
limb_id = SPECIES_GOLEM_BONE
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/golem/bone
+/obj/item/bodypart/arm/right/golem/bone
limb_id = SPECIES_GOLEM_BONE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg/golem/bone
+/obj/item/bodypart/leg/left/golem/bone
limb_id = SPECIES_GOLEM_BONE
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/golem/bone
+/obj/item/bodypart/leg/right/golem/bone
limb_id = SPECIES_GOLEM_BONE
should_draw_greyscale = FALSE
@@ -444,18 +528,108 @@
is_dimorphic = TRUE //WHO MADE SNOW BREASTS?
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/golem/snow
+/obj/item/bodypart/arm/left/golem/snow
limb_id = SPECIES_GOLEM_SNOW
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_arm/golem/snow
+/obj/item/bodypart/arm/right/golem/snow
limb_id = SPECIES_GOLEM_SNOW
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_leg/golem/snow
+/obj/item/bodypart/leg/left/golem/snow
limb_id = SPECIES_GOLEM_SNOW
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/golem/snow
+/obj/item/bodypart/leg/right/golem/snow
limb_id = SPECIES_GOLEM_SNOW
should_draw_greyscale = FALSE
+
+
+/obj/item/bodypart/arm/left/golem/uranium
+ attack_type = BURN
+ unarmed_attack_verb = "burn"
+ unarmed_attack_sound = 'sound/weapons/sear.ogg'
+ unarmed_damage_low = 1
+ unarmed_damage_high = 10
+ unarmed_stun_threshold = 9
+
+/obj/item/bodypart/arm/right/golem/uranium
+ attack_type = BURN
+ unarmed_attack_verb = "burn"
+ unarmed_attack_sound = 'sound/weapons/sear.ogg'
+ unarmed_damage_low = 1
+ unarmed_damage_high = 10
+ unarmed_stun_threshold = 9
+
+/obj/item/bodypart/leg/left/golem/uranium
+ attack_type = BURN
+ unarmed_attack_sound = 'sound/weapons/sear.ogg'
+ unarmed_damage_low = 2
+ unarmed_damage_high = 15
+ unarmed_stun_threshold = 9
+
+/obj/item/bodypart/leg/right/golem/uranium
+ attack_type = BURN
+ unarmed_attack_sound = 'sound/weapons/sear.ogg'
+ unarmed_damage_low = 2
+ unarmed_damage_high = 15
+ unarmed_stun_threshold = 9
+
+/obj/item/bodypart/arm/left/golem/plasteel
+ unarmed_attack_verb = "smash"
+ unarmed_attack_effect = ATTACK_EFFECT_SMASH
+ unarmed_attack_sound = 'sound/effects/meteorimpact.ogg' //hits pretty hard
+ unarmed_damage_low = 12
+ unarmed_damage_high = 21
+ unarmed_stun_threshold = 18
+
+/obj/item/bodypart/arm/right/golem/plasteel
+ unarmed_attack_verb = "smash"
+ unarmed_attack_effect = ATTACK_EFFECT_SMASH
+ unarmed_attack_sound = 'sound/effects/meteorimpact.ogg'
+ unarmed_damage_low = 12
+ unarmed_damage_high = 21
+ unarmed_stun_threshold = 18
+
+
+/obj/item/bodypart/leg/left/golem/plasteel
+ unarmed_attack_effect = ATTACK_EFFECT_SMASH
+ unarmed_attack_sound = 'sound/effects/meteorimpact.ogg'
+ unarmed_damage_low = 18
+ unarmed_damage_high = 32
+ unarmed_stun_threshold = 18
+
+/obj/item/bodypart/leg/right/golem/plasteel
+ unarmed_attack_effect = ATTACK_EFFECT_SMASH
+ unarmed_attack_sound = 'sound/effects/meteorimpact.ogg'
+ unarmed_damage_low = 18
+ unarmed_damage_high = 32
+ unarmed_stun_threshold = 18
+
+/obj/item/bodypart/arm/left/golem/bananium
+ unarmed_attack_verb = "honk"
+ unarmed_attack_sound = 'sound/items/airhorn2.ogg'
+ unarmed_damage_low = 0
+ unarmed_damage_high = 1
+ unarmed_stun_threshold = 2 //Harmless and can't stun
+
+/obj/item/bodypart/arm/right/golem/bananium
+ unarmed_attack_verb = "honk"
+ unarmed_attack_sound = 'sound/items/airhorn2.ogg'
+ unarmed_damage_low = 0
+ unarmed_damage_high = 1
+ unarmed_stun_threshold = 2
+
+/obj/item/bodypart/leg/right/golem/bananium
+ unarmed_attack_verb = "honk"
+ unarmed_attack_sound = 'sound/items/airhorn2.ogg'
+ unarmed_damage_low = 0
+ unarmed_damage_high = 1
+ unarmed_stun_threshold = 2
+
+/obj/item/bodypart/leg/left/golem/bananium
+ unarmed_attack_verb = "honk"
+ unarmed_attack_sound = 'sound/items/airhorn2.ogg'
+ unarmed_damage_low = 0
+ unarmed_damage_high = 1
+ unarmed_stun_threshold = 2
diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
index 1d93d505208..c23b935176b 100644
--- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
@@ -14,28 +14,36 @@
is_dimorphic = TRUE
should_draw_greyscale = FALSE
-/obj/item/bodypart/l_arm/moth
+/obj/item/bodypart/arm/left/moth
icon = 'icons/mob/species/moth/bodyparts.dmi'
icon_state = "moth_l_arm"
icon_static = 'icons/mob/species/moth/bodyparts.dmi'
limb_id = SPECIES_MOTH
should_draw_greyscale = FALSE
+ unarmed_attack_verb = "slash"
+ unarmed_attack_effect = ATTACK_EFFECT_CLAW
+ unarmed_attack_sound = 'sound/weapons/slash.ogg'
+ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg'
-/obj/item/bodypart/r_arm/moth
+/obj/item/bodypart/arm/right/moth
icon = 'icons/mob/species/moth/bodyparts.dmi'
icon_state = "moth_r_arm"
icon_static = 'icons/mob/species/moth/bodyparts.dmi'
limb_id = SPECIES_MOTH
should_draw_greyscale = FALSE
+ unarmed_attack_verb = "slash"
+ unarmed_attack_effect = ATTACK_EFFECT_CLAW
+ unarmed_attack_sound = 'sound/weapons/slash.ogg'
+ unarmed_miss_sound = 'sound/weapons/slashmiss.ogg'
-/obj/item/bodypart/l_leg/moth
+/obj/item/bodypart/leg/left/moth
icon = 'icons/mob/species/moth/bodyparts.dmi'
icon_state = "moth_l_leg"
icon_static = 'icons/mob/species/moth/bodyparts.dmi'
limb_id = SPECIES_MOTH
should_draw_greyscale = FALSE
-/obj/item/bodypart/r_leg/moth
+/obj/item/bodypart/leg/right/moth
icon = 'icons/mob/species/moth/bodyparts.dmi'
icon_state = "moth_r_leg"
icon_static = 'icons/mob/species/moth/bodyparts.dmi'
diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm
index 32c61a34bf9..bfaf4e1ff7d 100644
--- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm
@@ -16,7 +16,7 @@
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/l_arm/plasmaman
+/obj/item/bodypart/arm/left/plasmaman
icon = 'icons/mob/species/plasmaman/bodyparts.dmi'
icon_state = "plasmaman_l_arm"
icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi'
@@ -24,7 +24,7 @@
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/r_arm/plasmaman
+/obj/item/bodypart/arm/right/plasmaman
icon = 'icons/mob/species/plasmaman/bodyparts.dmi'
icon_state = "plasmaman_r_arm"
icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi'
@@ -32,7 +32,7 @@
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/l_leg/plasmaman
+/obj/item/bodypart/leg/left/plasmaman
icon = 'icons/mob/species/plasmaman/bodyparts.dmi'
icon_state = "plasmaman_l_leg"
icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi'
@@ -40,7 +40,7 @@
should_draw_greyscale = FALSE
dmg_overlay_type = null
-/obj/item/bodypart/r_leg/plasmaman
+/obj/item/bodypart/leg/right/plasmaman
icon = 'icons/mob/species/plasmaman/bodyparts.dmi'
icon_state = "plasmaman_r_leg"
icon_static = 'icons/mob/species/plasmaman/bodyparts.dmi'
diff --git a/code/modules/surgery/organs/_organ.dm b/code/modules/surgery/organs/_organ.dm
index a23c594698a..28a9fc6b0cd 100644
--- a/code/modules/surgery/organs/_organ.dm
+++ b/code/modules/surgery/organs/_organ.dm
@@ -41,7 +41,7 @@
var/failure_time = 0
///Do we effect the appearance of our mob. Used to save time in preference code
var/visual = TRUE
- /// Traits that are given to the holder of the organ.
+ /// Traits that are given to the holder of the organ. If you want an effect that changes this, don't add directly to this. Use the add_organ_trait() proc
var/list/organ_traits = list()
// Players can look at prefs before atoms SS init, and without this
diff --git a/code/modules/unit_tests/limbsanity.dm b/code/modules/unit_tests/limbsanity.dm
index 32feeb2fe62..b1ff8c83989 100644
--- a/code/modules/unit_tests/limbsanity.dm
+++ b/code/modules/unit_tests/limbsanity.dm
@@ -1,7 +1,7 @@
/datum/unit_test/limbsanity
/datum/unit_test/limbsanity/Run()
- for(var/path in subtypesof(/obj/item/bodypart))
+ for(var/path in subtypesof(/obj/item/bodypart) - list(/obj/item/bodypart/arm, /obj/item/bodypart/leg)) /// removes the abstract items.
var/obj/item/bodypart/part = new path(null)
if(part.is_dimorphic)
if(!icon_exists(UNLINT(part.should_draw_greyscale ? part.icon_greyscale : part.icon_static), "[part.limb_id]_[part.body_zone]_m"))
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index da4488329c4..f635f2d2c12 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -682,10 +682,10 @@ GLOBAL_LIST_EMPTY(vending_products)
if(1) // shatter their legs and bleed 'em
crit_rebate = 60
C.bleed(150)
- var/obj/item/bodypart/l_leg/l = C.get_bodypart(BODY_ZONE_L_LEG)
+ var/obj/item/bodypart/leg/left/l = C.get_bodypart(BODY_ZONE_L_LEG)
if(l)
l.receive_damage(brute=200)
- var/obj/item/bodypart/r_leg/r = C.get_bodypart(BODY_ZONE_R_LEG)
+ var/obj/item/bodypart/leg/right/r = C.get_bodypart(BODY_ZONE_R_LEG)
if(r)
r.receive_damage(brute=200)
if(l || r)
diff --git a/tools/UpdatePaths/Scripts/70422_limb_refractor.txt b/tools/UpdatePaths/Scripts/70422_limb_refractor.txt
new file mode 100644
index 00000000000..8a8f9ae5749
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/70422_limb_refractor.txt
@@ -0,0 +1,4 @@
+/obj/item/bodypart/l_arm/@SUBTYPES : /obj/item/bodypart/arm/left/@SUBTYPES{@OLD}
+/obj/item/bodypart/l_leg/@SUBTYPES : /obj/item/bodypart/leg/left/@SUBTYPES{@OLD}
+/obj/item/bodypart/r_arm/@SUBTYPES : /obj/item/bodypart/arm/right/@SUBTYPES{@OLD}
+/obj/item/bodypart/r_leg/@SUBTYPES : /obj/item/bodypart/leg/right/@SUBTYPES{@OLD}