diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index b0410b9db4..89d134ab46 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -1139,6 +1139,7 @@ Note that amputating the affected organ does in fact remove the infection from t force_icon = R.icon brute_mod *= R.robo_brute_mod burn_mod *= R.robo_burn_mod + prosthetic_digi = R.can_be_digitigrade //CHOMPStation edit if(R.lifelike) robotic = ORGAN_LIFELIKE name = "[initial(name)]" diff --git a/code/modules/organs/robolimbs_ch.dm b/code/modules/organs/robolimbs_ch.dm index 91038cdc1b..d882d3ba96 100644 --- a/code/modules/organs/robolimbs_ch.dm +++ b/code/modules/organs/robolimbs_ch.dm @@ -1,6 +1,40 @@ +/datum/robolimb + var/can_be_digitigrade = FALSE //maybe move this over into more of a "does this have a custom digitigrade sprite, and if so, what is its icon file/icon name in the limb's file" when someone can be bothered making them + /datum/robolimb/valehoundhead company = "VALE Hound- Head" desc = "A VALE hound head meant for synthetics." icon = 'icons/mob/human_races/cyberlimbs/vale/vale_head.dmi' //Sprited by: Skits skin_tone = 1 - parts = list(BP_HEAD) \ No newline at end of file + parts = list(BP_HEAD) + +/datum/robolimb/dsi_tajaran + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_lizard + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_sergal + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_nevrean + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_vulpkanin + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_akula + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_spider + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_zorren + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_fennec + can_be_digitigrade = TRUE + +/datum/robolimb/dsi_teshari/New() + . = ..() + species_cannot_use -= SPECIES_PROTEAN \ No newline at end of file diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/station.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/station.dm index 585b603639..b671169a2f 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/station.dm @@ -44,6 +44,9 @@ /datum/species/custom digi_allowed = TRUE +/datum/species/shapeshifter/promethean + digi_allowed = TRUE + /datum/species/unathi digi_allowed = TRUE vore_belly_default_variant = "L" @@ -72,3 +75,6 @@ /datum/species/xenochimera digi_allowed = TRUE +/datum/species/protean + digi_allowed = TRUE + diff --git a/modular_chomp/code/modules/organs/organ_external.dm b/modular_chomp/code/modules/organs/organ_external.dm index b4e6d22676..73e00426c0 100644 --- a/modular_chomp/code/modules/organs/organ_external.dm +++ b/modular_chomp/code/modules/organs/organ_external.dm @@ -1,3 +1,6 @@ +/obj/item/organ/external + var/prosthetic_digi = FALSE //CHOMPStation edit - when it's prosthetic, can it be a digitigrade + //new function to check for markings /obj/item/organ/external/proc/is_hidden_by_markings() //code that checked all limbs. diff --git a/modular_chomp/code/modules/organs/organ_icon.dm b/modular_chomp/code/modules/organs/organ_icon.dm index 230868db08..339a45a4f6 100644 --- a/modular_chomp/code/modules/organs/organ_icon.dm +++ b/modular_chomp/code/modules/organs/organ_icon.dm @@ -5,169 +5,82 @@ // this allows limbs to be set properly when being printed in the bioprinter without an owner // this also allows the preview mannequin to update properly because customisation topic calls don't call a DNA check if(owner) - digitigrade = owner.digitigrade + digitigrade = owner.digitigrade && (istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot)) else if(dna) - digitigrade = dna.digitigrade + digitigrade = dna.digitigrade && (istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot)) - if( !model && ( istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot) ) ) //All leg icons go through here now. + var/robotic_digi = prosthetic_digi && digitigrade //could make it so the prosthetic digi var is more of a "does this limb have a custom digitigrade sprite for its robospriting" but this is fine for now - var/gender = "m" - if(owner && owner.gender == FEMALE) - gender = "f" - - if(!force_icon_key) - icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit - else - icon_cache_key = "[icon_name]_[force_icon_key]" - - if(force_icon) - mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]") - else - if(!dna) - mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]") - else - - if(!gendered_icon) - gender = null - else - if(dna.GetUIState(DNA_UI_GENDER)) - gender = "f" - else - gender = "m" - - if(skeletal) - mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else if (robotic >= ORGAN_ROBOT) - mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") - apply_colouration(mob_icon) - else - if(is_hidden_by_markings()) - mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else - //Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based. - mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]") - apply_colouration(mob_icon) - - //Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits. - //Body markings, actually does not include head this time. Done separately above. - if(!istype(src,/obj/item/organ/external/head)) - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/isdigitype = istype(mark_style,/datum/sprite_accessory/marking/digi) - if(!(digitigrade ^ isdigitype)) //Equivalent to XNOR; this code will only run if either both digitigrade and isdigitype are true, or if both are false. - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit - add_overlay(mark_s) //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" - if(body_hair && islist(h_col) && h_col.len >= 3) - var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" - if(!limb_icon_cache[cache_key]) - var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]") - I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit - limb_icon_cache[cache_key] = I - mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) - - // VOREStation edit start - if(nail_polish) - var/icon/I = new(nail_polish.icon, nail_polish.icon_state) - I.Blend(nail_polish.color, ICON_MULTIPLY) - add_overlay(I) - mob_icon.Blend(I, ICON_OVERLAY) - icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]" - // VOREStation edit end - dir = EAST - icon = mob_icon - return mob_icon + var/gender = "m" + if(owner && owner.gender == FEMALE) + gender = "f" + if(!force_icon_key) + icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit else - //. = ..() - //due to the wierd fact that this calls the old code, and defining it here makes a duplicate procedure error, i'm gonna have to bring the whole code here and modify it. if there is a more condensed way, it is appreciated. + icon_cache_key = "[icon_name]_[force_icon_key]" - var/gender = "m" - if(owner && owner.gender == FEMALE) - gender = "f" - - if(!force_icon_key) - icon_cache_key = "[icon_name]_[species ? species.get_bodytype() : SPECIES_HUMAN]" //VOREStation Edit + if(force_icon && !robotic_digi) + mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]") + else + if(!dna) + mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]") else - icon_cache_key = "[icon_name]_[force_icon_key]" - if(force_icon) - mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]") - else - if(!dna) - mob_icon = new /icon('icons/mob/human_races/r_human.dmi', "[icon_name][gendered_icon ? "_[gender]" : ""]") + if(!gendered_icon) + gender = null else - if(!gendered_icon) - gender = null + if(dna.GetUIState(DNA_UI_GENDER)) + gender = "f" else - if(dna.GetUIState(DNA_UI_GENDER)) - gender = "f" - else - gender = "m" + gender = "m" - if(skeletal) - mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else if (robotic >= ORGAN_ROBOT) - mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") + if(skeletal) + mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]") + else if (robotic >= ORGAN_ROBOT && !robotic_digi) + mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]") + apply_colouration(mob_icon) + else + if(is_hidden_by_markings()) + mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]") + else + //Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based. + mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]") apply_colouration(mob_icon) - else - if(is_hidden_by_markings()) - mob_icon = new /icon('icons/mob/human_races/r_blank.dmi', "[icon_name][gender ? "_[gender]" : ""]") - else - //Use digi icon if digitigrade, otherwise use regular icon. Ternary operator is based. - mob_icon = new /icon(species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]") - apply_colouration(mob_icon) - //Body markings, actually does not include head this time. Done separately above. - if(!istype(src,/obj/item/organ/external/head)) - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit - add_overlay(mark_s) //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" + if (model && !robotic_digi) + icon_cache_key += "_model_[model]" + apply_colouration(mob_icon) - if(body_hair && islist(h_col) && h_col.len >= 3) - var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" - if(!limb_icon_cache[cache_key]) - var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]") - I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit - limb_icon_cache[cache_key] = I - mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) + //Code here is copied from organ_icon.dm line 118 at time of writing (9/20/21), VOREStation edits are left in intentionally, because I think it's worth keeping track of the fact that the code is from Virgo's edits. + //Body markings, actually does not include head this time. Done separately above. + if((!istype(src,/obj/item/organ/external/head) && !(force_icon && !robotic_digi)) || (model && owner && owner.synth_markings)) + for(var/M in markings) + var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] + var/isdigitype = istype(mark_style,/datum/sprite_accessory/marking/digi) + if(!(digitigrade ^ isdigitype)) //Equivalent to XNOR; this code will only run if either both digitigrade and isdigitype are true, or if both are false. + var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") + mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit + add_overlay(mark_s) //So when it's not on your body, it has icons + mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons + icon_cache_key += "[M][markings[M]["color"]]" + if(body_hair && islist(h_col) && h_col.len >= 3) + var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" + if(!limb_icon_cache[cache_key]) + var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]") + I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit + limb_icon_cache[cache_key] = I + mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) - // VOREStation edit start - if(nail_polish) - var/icon/I = new(nail_polish.icon, nail_polish.icon_state) - I.Blend(nail_polish.color, ICON_MULTIPLY) - add_overlay(I) - mob_icon.Blend(I, ICON_OVERLAY) - icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]" - // VOREStation edit end + // VOREStation edit start + if(nail_polish && (force_icon && !robotic_digi)) + var/icon/I = new(nail_polish.icon, nail_polish.icon_state) + I.Blend(nail_polish.color, ICON_MULTIPLY) + add_overlay(I) + mob_icon.Blend(I, ICON_OVERLAY) + icon_cache_key += "_[nail_polish.icon]_[nail_polish.icon_state]_[nail_polish.color]" + // VOREStation edit end - if(model) - icon_cache_key += "_model_[model]" - apply_colouration(mob_icon) - if(owner && owner.synth_markings) - for(var/M in markings) - var/datum/sprite_accessory/marking/mark_style = markings[M]["datum"] - var/icon/mark_s = new/icon("icon" = mark_style.icon, "icon_state" = "[mark_style.icon_state]-[organ_tag]") - mark_s.Blend(markings[M]["color"], mark_style.color_blend_mode) // VOREStation edit - add_overlay(mark_s) //So when it's not on your body, it has icons - mob_icon.Blend(mark_s, ICON_OVERLAY) //So when it's on your body, it has icons - icon_cache_key += "[M][markings[M]["color"]]" - - if(body_hair && islist(h_col) && h_col.len >= 3) - var/cache_key = "[body_hair]-[icon_name]-[h_col[1]][h_col[2]][h_col[3]]" - if(!limb_icon_cache[cache_key]) - var/icon/I = icon(species.get_icobase(owner), "[icon_name]_[body_hair]") - I.Blend(rgb(h_col[1],h_col[2],h_col[3]), ICON_MULTIPLY) //VOREStation edit - limb_icon_cache[cache_key] = I - mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY) - // VOREStation edit ends here - - dir = EAST - icon = mob_icon - return mob_icon \ No newline at end of file + dir = EAST + icon = mob_icon + return mob_icon