diff --git a/code/__DEFINES/clothing.dm b/code/__DEFINES/clothing.dm
index 0cea0b3a5e9..3de5a63b40e 100644
--- a/code/__DEFINES/clothing.dm
+++ b/code/__DEFINES/clothing.dm
@@ -122,10 +122,20 @@
#define FEMALE_UNIFORM_FULL 1
#define FEMALE_UNIFORM_TOP 2
-//flags for digitigrade outfits: Helps determinesif the outfit needs to be altered for weird legs (usually doesn't)
+//flags for alternate styles: These are hard sprited so don't set this if you didn't put the effort it
-#define NO_DIGITIGRADE_UNIFORM 0
-#define DIGITIGRADE_UNIFORM 1
+#define NORMAL_STYLE 0
+#define ALT_STYLE 1
+#define DIGITIGRADE_STYLE 2
+
+//flags for outfits that have mutantrace variants (try not to use this): Currently only needed if you're trying to add tight fitting bootyshorts
+
+#define NO_MUTANTRACE_VARIATION 0
+#define MUTANTRACE_VARIATION 1
+
+#define NOT_DIGITIGRADE 0
+#define FULL_DIGITIGRADE 1
+#define SQUISHED_DIGITIGRADE 2
//flags for covering body parts
#define GLASSESCOVERSEYES 1
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 65cef4fbc43..c0587d74481 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -27,6 +27,7 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines_animated, animated_spines_list)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, legs_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, r_wings_list,roundstart = TRUE)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 0fcbb30ef6e..92f83b8ac0e 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -62,13 +62,15 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/frills, frills_list)
if(!spines_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, spines_list)
+ if(!legs_list.len)
+ init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, legs_list)
if(!body_markings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, body_markings_list)
if(!wings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, wings_list)
//For now we will always return none for tail_human and ears.
- return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(snouts_list), "horns" = pick(horns_list), "ears" = "None", "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list)))
+ return(list("mcolor" = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F"), "tail_lizard" = pick(tails_list_lizard), "tail_human" = "None", "wings" = "None", "snout" = pick(snouts_list), "horns" = pick(horns_list), "ears" = "None", "frills" = pick(frills_list), "spines" = pick(spines_list), "body_markings" = pick(body_markings_list), "legs" = "Normal Legs"))
/proc/random_hair_style(gender)
switch(gender)
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index dc4075cd2e3..b2448a401f7 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -24,6 +24,7 @@ var/global/list/snouts_list = list()
var/global/list/horns_list = list()
var/global/list/frills_list = list()
var/global/list/spines_list = list()
+var/global/list/legs_list = list()
var/global/list/animated_spines_list = list()
//Mutant Human bits
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index d594f9bae4c..4fe0aeb1fc9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -58,7 +58,7 @@ var/list/preferences_datums = list()
var/skin_tone = "caucasian1" //Skin color
var/eye_color = "000" //Eye color
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+ var/list/features = list("mcolor" = "FFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs")
var/list/custom_names = list("clown", "mime", "ai", "cyborg", "religion", "deity")
//Mob preview
@@ -238,9 +238,9 @@ var/list/preferences_datums = list()
if((MUTCOLORS in pref_species.specflags) || (MUTCOLORS_PARTSONLY in pref_species.specflags))
- dat += "
"
+ dat += " | "
- dat += "Alien/Mutant Color"
+ dat += "Mutant Color"
dat += " Change "
@@ -299,7 +299,14 @@ var/list/preferences_datums = list()
dat += "[features["body_markings"]] "
dat += " | "
+ if("legs" in pref_species.mutant_bodyparts)
+ dat += ""
+ dat += "Legs"
+
+ dat += "[features["legs"]] "
+
+ dat += " | "
if(config.mutant_humans)
if("tail_human" in pref_species.mutant_bodyparts)
@@ -986,6 +993,12 @@ var/list/preferences_datums = list()
if(new_body_markings)
features["body_markings"] = new_body_markings
+ if("legs")
+ var/new_legs
+ new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in legs_list
+ if(new_legs)
+ features["legs"] = new_legs
+
if("s_tone")
var/new_s_tone = input(user, "Choose your character's skin-tone:", "Character Preference") as null|anything in skin_tones
if(new_s_tone)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 5042ae817ba..f9f526e6f28 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -283,6 +283,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_lizard_frills"] >> features["frills"]
S["feature_lizard_spines"] >> features["spines"]
S["feature_lizard_body_markings"] >> features["body_markings"]
+ S["feature_lizard_legs"] >> features["legs"]
if(!config.mutant_humans)
features["tail_human"] = "none"
features["ears"] = "none"
@@ -348,6 +349,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["frills"] = sanitize_inlist(features["frills"], frills_list)
features["spines"] = sanitize_inlist(features["spines"], spines_list)
features["body_markings"] = sanitize_inlist(features["body_markings"], body_markings_list)
+ features["feature_lizard_legs"] = sanitize_inlist(features["legs"], legs_list, "Normal Legs")
joblessrole = sanitize_integer(joblessrole, 1, 3, initial(joblessrole))
job_civilian_high = sanitize_integer(job_civilian_high, 0, 65535, initial(job_civilian_high))
@@ -399,6 +401,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_lizard_frills"] << features["frills"]
S["feature_lizard_spines"] << features["spines"]
S["feature_lizard_body_markings"] << features["body_markings"]
+ S["feature_lizard_legs"] << features["legs"]
S["clown_name"] << custom_names["clown"]
S["mime_name"] << custom_names["mime"]
S["ai_name"] << custom_names["ai"]
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 5971d4d13db..7584148bfca 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -364,14 +364,14 @@ BLIND // can't see anything
slot_flags = SLOT_ICLOTHING
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women
- var/digitigrade = NO_DIGITIGRADE_UNIFORM // For use in alternate clothing styles for lizards with weird legs. Shorts only really.
var/has_sensor = 1//For the crew computer 2 = unable to change mode
var/random_sensor = 1
var/sensor_mode = 0 /* 1 = Report living/dead, 2 = Report detailed damages, 3 = Report location */
var/can_adjust = 1
- var/adjusted = 0
+ var/adjusted = NORMAL_STYLE
var/alt_covers_chest = 0 // for adjusted/rolled-down jumpsuits, 0 = exposes chest and arms, 1 = exposes arms only
var/obj/item/clothing/tie/hastie = null
+ var/mutantrace_variation = NO_MUTANTRACE_VARIATION //Are there special sprites for specific situations? Don't use this unless you need to.
/obj/item/clothing/under/worn_overlays(var/isinhands = FALSE)
. = list()
@@ -394,9 +394,20 @@ BLIND // can't see anything
if(random_sensor)
//make the sensor mode favor higher levels, except coords.
sensor_mode = pick(0, 1, 1, 2, 2, 2, 3, 3)
- adjusted = 0
+ adjusted = NORMAL_STYLE
..()
+/obj/item/clothing/under/equipped(mob/user, slot)
+ ..()
+
+ if(mutantrace_variation && ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(DIGITIGRADE in H.dna.species.specflags)
+ adjusted = DIGITIGRADE_STYLE
+ else if(adjusted = DIGITIGRADE_STYLE)
+ adjusted = NORMAL_STYLE
+
+
/obj/item/clothing/under/attackby(obj/item/I, mob/user, params)
if(!attachTie(I, user))
..()
@@ -536,6 +547,8 @@ BLIND // can't see anything
usr.update_inv_w_uniform()
/obj/item/clothing/under/proc/toggle_jumpsuit_adjust()
+ if(adjusted == DIGITIGRADE_STYLE)
+ return
adjusted = !adjusted
if(adjusted)
if(fitted != FEMALE_UNIFORM_TOP)
@@ -551,7 +564,7 @@ BLIND // can't see anything
/obj/item/clothing/under/examine(mob/user)
..()
- if(src.adjusted)
+ if(src.adjusted == ALT_STYLE)
user << "Alt-click on [src] to wear it normally."
else
user << "Alt-click on [src] to wear it casually."
diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm
index 3b157d94916..18651a021e9 100644
--- a/code/modules/clothing/under/jobs/civilian.dm
+++ b/code/modules/clothing/under/jobs/civilian.dm
@@ -31,7 +31,7 @@
icon_state = "cargotech"
item_state = "lb_suit"
item_color = "cargo"
- digitigrade = DIGITIGRADE_UNIFORM
+ mutantrace_variation = MUTANTRACE_VARIATION
/obj/item/clothing/under/rank/chaplain
diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm
index 29b648d7ed7..0da22fc678e 100644
--- a/code/modules/clothing/under/shorts.dm
+++ b/code/modules/clothing/under/shorts.dm
@@ -4,7 +4,7 @@
gender = PLURAL
body_parts_covered = GROIN
fitted = NO_FEMALE_UNIFORM
- digitigrade = DIGITIGRADE_UNIFORM
+ mutantrace_variation = MUTANTRACE_VARIATION
can_adjust = 0
/obj/item/clothing/under/shorts/red
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 066ae8d47a7..b18314e6e78 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -579,7 +579,7 @@
switch(random)
if(1)
user << "Your appearence morphs to that of a very small humanoid ash dragon! You get to look like a freak without the cool abilities."
- H.dna.features = list("mcolor" = "A02720", "tail_lizard" = "Dark Tiger", "tail_human" = "None", "snout" = "Sharp", "horns" = "Curled", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "Long", "body_markings" = "Dark Tiger Body")
+ H.dna.features = list("mcolor" = "A02720", "tail_lizard" = "Dark Tiger", "tail_human" = "None", "snout" = "Sharp", "horns" = "Curled", "ears" = "None", "wings" = "None", "frills" = "None", "spines" = "Long", "body_markings" = "Dark Tiger Body", "legs" = "Digitigrade Legs")
H.eye_color = "fee5a3"
H.set_species(/datum/species/lizard)
if(2)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 8bd2d8e8251..1c7a02138df 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -28,13 +28,6 @@
if(dna.species)
set_species(dna.species.type)
- //initialise limbs
- if(DIGITIGRADE in dna.species.specflags)
- for(var/X in bodyparts)
- var/obj/item/bodypart/O = X
- if(O.body_zone == "r_leg" || O.body_zone == "l_leg")
- O.use_digitigrade = TRUE
-
//initialise organs
create_internal_organs()
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index daf43c85c25..8c38f1e7d4b 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -164,11 +164,40 @@
if(exotic_bloodtype && C.dna.blood_type != exotic_bloodtype)
C.dna.blood_type = exotic_bloodtype
-
+ if(("legs" in C.dna.features) && C.dna.features["legs"] == "Digitigrade Legs")
+ specflags += DIGITIGRADE
+ if(DIGITIGRADE in specflags)
+ for(var/X in C.bodyparts)
+ var/obj/item/bodypart/O = X
+ var/obj/item/bodypart/N
+ if(!O.use_digitigrade)
+ if(O.body_zone == "l_leg")
+ N = new /obj/item/bodypart/l_leg/digitigrade
+ else if(O.body_zone == "r_leg")
+ N = new /obj/item/bodypart/r_leg/digitigrade
+ if(!N)
+ continue
+ O.drop_limb(1)
+ qdel(O)
+ N.attach_limb(C)
/datum/species/proc/on_species_loss(mob/living/carbon/C)
if(C.dna.species.exotic_bloodtype)
C.dna.blood_type = random_blood_type()
+ if(DIGITIGRADE in specflags)
+ for(var/X in C.bodyparts)
+ var/obj/item/bodypart/O = X
+ var/obj/item/bodypart/N
+ if(O.use_digitigrade)
+ if(O.body_zone == "l_leg")
+ N = new /obj/item/bodypart/l_leg/
+ else if(O.body_zone == "r_leg")
+ N = new /obj/item/bodypart/r_leg/
+ if(!N)
+ continue
+ O.drop_limb(1)
+ qdel(O)
+ N.attach_limb(C)
/datum/species/proc/handle_hair(mob/living/carbon/human/H, forced_colour)
H.remove_overlay(HAIR_LAYER)
@@ -258,8 +287,6 @@
var/list/standing = list()
- handle_mutant_bodyparts(H)
-
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
if(!(H.disabilities & HUSK))
@@ -289,7 +316,7 @@
else
standing += image("icon"=U2.icon, "icon_state"="[U2.icon_state]_s", "layer"=-BODY_LAYER)
- if(H.socks && H.get_num_legs() >= 2)
+ if(H.socks && H.get_num_legs() >= 2 && !(DIGITIGRADE in specflags))
var/datum/sprite_accessory/socks/U3 = socks_list[H.socks]
if(U3)
standing += image("icon"=U3.icon, "icon_state"="[U3.icon_state]_s", "layer"=-BODY_LAYER)
@@ -298,7 +325,7 @@
H.overlays_standing[BODY_LAYER] = standing
H.apply_overlay(BODY_LAYER)
-
+ handle_mutant_bodyparts(H)
/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
var/list/bodyparts_to_add = mutant_bodyparts.Copy()
@@ -371,15 +398,26 @@
else if ("wings" in mutant_bodyparts)
bodyparts_to_add -= "wings_open"
-/* if("digitigrade" in mutant_bodyparts)
- if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || (H.w_uniform && (H.w_uniform.body_parts_covered & LEGS)))
- bodyparts_to_add -= "digitigrade_full"
- bodyparts_to_add += "digitigrade_hidden"
- else
- bodyparts_to_add += "digitigrade_full"
- bodyparts_to_add -= "digitigrade_hidden"
- for(var/L in LEGS) //Hide the legs since we're rending special ones
- L.alpha = 0*/
+ //Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
+ var/update_needed = FALSE
+ var/not_digitigrade = TRUE
+ for(var/X in H.bodyparts)
+ var/obj/item/bodypart/O = X
+ if(!O.use_digitigrade)
+ continue
+ not_digitigrade = FALSE
+ if(!(DIGITIGRADE in specflags)) //Someone cut off a digitigrade leg and tacked it on
+ specflags += DIGITIGRADE
+ if(O.use_digitigrade == FULL_DIGITIGRADE && (H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) || (H.wear_suit.body_parts_covered & LEGS)) || (H.w_uniform && (H.w_uniform.body_parts_covered & LEGS))))
+ O.use_digitigrade = SQUISHED_DIGITIGRADE
+ update_needed = TRUE
+ else if(O.use_digitigrade == SQUISHED_DIGITIGRADE)
+ O.use_digitigrade = FULL_DIGITIGRADE
+ update_needed = TRUE
+ if(update_needed)
+ H.update_body_parts()
+ if(not_digitigrade && (DIGITIGRADE in specflags)) //Curse is lifted
+ specflags -= DIGITIGRADE
if(!bodyparts_to_add)
return
@@ -420,6 +458,8 @@
S = wings_list[H.dna.features["wings"]]
if("wingsopen")
S = wings_open_list[H.dna.features["wings"]]
+ if("legs")
+ S = legs_list[H.dna.features["legs"]]
if(!S || S.icon_state == "none")
continue
@@ -561,6 +601,10 @@
return 0
if(num_legs < 2)
return 0
+ if(DIGITIGRADE in specflags)
+ if(!disable_warning)
+ H << "The footwear around here isn't compatible with your feet!"
+ return 0
return 1
if(slot_belt)
if(H.belt)
@@ -687,6 +731,7 @@
return
/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H)
+ H.update_mutant_bodyparts()
return
/datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
diff --git a/code/modules/mob/living/carbon/human/species_types.dm b/code/modules/mob/living/carbon/human/species_types.dm
index 744ef42db65..3369741b53c 100644
--- a/code/modules/mob/living/carbon/human/species_types.dm
+++ b/code/modules/mob/living/carbon/human/species_types.dm
@@ -54,9 +54,9 @@
say_mod = "hisses"
default_color = "00FF00"
specflags = list(MUTCOLORS,EYECOLOR,LIPS)
- mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings")
+ mutant_bodyparts = list("tail_lizard", "snout", "spines", "horns", "frills", "body_markings", "legs")
mutant_organs = list(/obj/item/organ/tongue/lizard)
- default_features = list("mcolor" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None")
+ default_features = list("mcolor" = "0F0", "tail" = "Smooth", "snout" = "Round", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
@@ -86,7 +86,7 @@
/datum/species/lizard/ashwalker
name = "Ash Walker"
id = "lizard"
- specflags = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,PIERCEIMMUNE,DIGITIGRADE)
+ specflags = list(MUTCOLORS,EYECOLOR,LIPS,NOBREATH,NOGUNS,DIGITIGRADE)
/*
PODPEOPLE
*/
@@ -893,6 +893,33 @@ var/global/image/plasmaman_on_fire = image("icon"='icons/mob/OnFire.dmi', "icon_
return ..()
+/datum/species/android
+ name = "Android"
+ id = "android"
+ say_mod = "states"
+ specflags = list(NOBREATH,RESISTTEMP,NOBLOOD,VIRUSIMMUNE,PIERCEIMMUNE,NOHUNGER,EASYLIMBATTACHMENT)
+ safe_oxygen_min = 0
+ safe_toxins_min = 0
+ safe_toxins_max = 0
+ safe_co2_max = 0
+ SA_para_min = 0
+ SA_sleep_min = 0
+ meat = null
+ damage_overlay_type = "synth"
+ limbs_id = "synth"
+
+/datum/species/android/on_species_gain(mob/living/carbon/C)
+ . = ..()
+ for(var/X in C.bodyparts)
+ var/obj/item/bodypart/O = X
+ O.change_bodypart_status(BODYPART_ROBOTIC)
+
+/datum/species/android/on_species_loss(mob/living/carbon/C)
+ . = ..()
+ for(var/X in C.bodyparts)
+ var/obj/item/bodypart/O = X
+ O.change_bodypart_status(BODYPART_ORGANIC)
+
/*
SYNDICATE BLACK OPS
*/
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 4bbde09513d..1413c6cd2cd 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -117,8 +117,10 @@ There are several things that need to be remembered:
var/t_color = U.item_color
if(!t_color)
t_color = U.icon_state
- if(U.adjusted)
+ if(U.adjusted == ALT_STYLE)
t_color = "[t_color]_d"
+ else if(U.adjusted == DIGITIGRADE_STYLE)
+ t_color = "[t_color]_l"
var/image/standing
@@ -138,6 +140,7 @@ There are several things that need to be remembered:
unEquip(thing)
apply_overlay(UNIFORM_LAYER)
+ update_mutant_bodyparts()
/mob/living/carbon/human/update_inv_wear_id()
@@ -537,13 +540,14 @@ generate/load female uniform sprites matching all previously decided variables
. += "-organic"
else
. += "-robotic"
+ if(BP.use_digitigrade)
+ . += "-digitigrade[BP.use_digitigrade]"
if(disabilities & HUSK)
. += "-husk"
/mob/living/carbon/human/load_limb_from_cache()
..()
- update_mutant_bodyparts()
update_hair()
diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm
index dcd5b1a59b2..85df21c0974 100644
--- a/code/modules/mob/living/carbon/update_icons.dm
+++ b/code/modules/mob/living/carbon/update_icons.dm
@@ -263,6 +263,8 @@ var/global/list/limb_icon_cache = list()
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
. += "-[BP.body_zone]"
+ if(BP.use_digitigrade)
+ . += "-digitigrade[BP.use_digitigrade]"
if(BP.animal_origin)
. += "-[BP.animal_origin]"
if(BP.status == BODYPART_ORGANIC)
diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm
index 7026af0c42b..9c5a1242b4a 100644
--- a/code/modules/mob/new_player/sprite_accessories.dm
+++ b/code/modules/mob/new_player/sprite_accessories.dm
@@ -1365,13 +1365,11 @@
name = "Aquatic"
icon_state = "aqua"
-/datum/sprite_accessory/legs
- icon = 'icons/mob/mutant_bodyparts.dmi'
+/datum/sprite_accessory/legs //legs are a special case, they aren't actually sprite_accessories but are updated with them.
+ icon = null //These datums exist for selecting legs on preference, and little else
/datum/sprite_accessory/legs/none
name = "Normal Legs"
- icon_state = "none"
/datum/sprite_accessory/legs/digitigrade_lizard
name = "Digitigrade Legs"
- icon_state = "digitigrade_lizard"
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 9d698f0fd7b..de84abb38c9 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -8,10 +8,11 @@
icon_state = ""
layer = BELOW_MOB_LAYER //so it isn't hidden behind objects when on the floor
var/mob/living/carbon/owner = null
+ var/mob/living/carbon/original_owner = null
var/status = BODYPART_ORGANIC
var/body_zone //"chest", "l_arm", etc , used for def_zone
var/body_part = null //bitflag used to check which clothes cover this bodypart
- var/use_digitigrade = FALSE //Used for alternate legs, useless elsewhere
+ var/use_digitigrade = NOT_DIGITIGRADE //Used for alternate legs, useless elsewhere
var/brutestate = 0
var/burnstate = 0
var/brute_dam = 0
@@ -195,6 +196,11 @@
var/mob/living/carbon/C
if(source)
C = source
+ if(!original_owner)
+ original_owner = source
+ else if(original_owner && owner != original_owner) //Foreign limb
+ no_update = 1
+ return
else
C = owner
@@ -296,7 +302,7 @@
if(should_draw_gender)
I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="[species_id]_[body_zone]_[icon_gender]_s", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
else if(use_digitigrade)
- I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="[species_id]_[body_zone]_df_s", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
+ I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="digitigrade_[use_digitigrade]_[body_zone]_s", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
else
I = image("icon"='icons/mob/human_parts_greyscale.dmi', "icon_state"="[species_id]_[body_zone]_s", "layer"=-BODYPARTS_LAYER, "dir"=image_dir)
else
@@ -461,6 +467,10 @@
px_x = -2
px_y = 12
+/obj/item/bodypart/l_leg/digitigrade
+ name = "left digitigrade leg"
+ use_digitigrade = FULL_DIGITIGRADE
+
/obj/item/bodypart/l_leg/monkey
icon = 'icons/mob/animal_parts.dmi'
icon_state = "default_monkey_l_leg"
@@ -495,6 +505,10 @@
px_x = 2
px_y = 12
+/obj/item/bodypart/r_leg/digitigrade
+ name = "right digitigrade leg"
+ use_digitigrade = FULL_DIGITIGRADE
+
/obj/item/bodypart/r_leg/monkey
icon = 'icons/mob/animal_parts.dmi'
icon_state = "default_monkey_r_leg"
diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi
index 21554709cfa..a1fe448aaa5 100644
Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ
diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi
index f17008d5c52..00235ef891f 100644
Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ