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