mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-27 23:27:34 +01:00
Refactors body markings into bodypart overlays (#83744)
## About The Pull Request Refactors body markings (lizard and moths) into the bodypart overlays system I've also renamed the icon states for lizard bodymarkings (downstreams with lots of lizard body markings might have problems with this) ## Why It's Good For The Game Gives us better controle over /human appearances. I didn't add any means of actually changing them on the person (aside from genetics. how would that even work? with a waterproof marker?), but makes it easy for when/if I do. Also unloads mutant_bodyparts more, moving is yet closer to full species dedatumization ## Changelog 🆑 refactor: Lizard and moth markings now use the bodypart overlay system /🆑
This commit is contained in:
@@ -138,8 +138,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
|
||||
#define TRAIT_AGENDER "agender"
|
||||
/// Species with this trait have a blood clan mechanic
|
||||
#define TRAIT_BLOOD_CLANS "blood_clans"
|
||||
/// Species with this trait have markings (this SUCKS, remove this later in favor of bodypart overlays)
|
||||
#define TRAIT_HAS_MARKINGS "has_markings"
|
||||
/// Species with this trait use skin tones for coloration
|
||||
#define TRAIT_USES_SKINTONES "uses_skintones"
|
||||
/// Species with this trait use mutant colors for coloration
|
||||
|
||||
@@ -248,7 +248,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
|
||||
"TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED,
|
||||
"TRAIT_HAS_BEEN_KIDNAPPED" = TRAIT_HAS_BEEN_KIDNAPPED,
|
||||
"TRAIT_HAS_CRANIAL_FISSURE" = TRAIT_HAS_CRANIAL_FISSURE,
|
||||
"TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS,
|
||||
"TRAIT_HATED_BY_DOGS" = TRAIT_HATED_BY_DOGS,
|
||||
"TRAIT_HEAD_INJURY_BLOCKED" = TRAIT_HEAD_INJURY_BLOCKED,
|
||||
"TRAIT_HEALS_FROM_CARP_RIFTS" = TRAIT_HEALS_FROM_CARP_RIFTS,
|
||||
|
||||
@@ -94,7 +94,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
|
||||
"TRAIT_GUNFLIP" = TRAIT_GUNFLIP,
|
||||
"TRAIT_HANDS_BLOCKED" = TRAIT_HANDS_BLOCKED,
|
||||
"TRAIT_HARDLY_WOUNDED" = TRAIT_HARDLY_WOUNDED,
|
||||
"TRAIT_HAS_MARKINGS" = TRAIT_HAS_MARKINGS,
|
||||
"TRAIT_HEAVY_SLEEPER" = TRAIT_HEAVY_SLEEPER,
|
||||
"TRAIT_HIDE_EXTERNAL_ORGANS" = TRAIT_HIDE_EXTERNAL_ORGANS,
|
||||
"TRAIT_HOLY" = TRAIT_HOLY,
|
||||
|
||||
@@ -35,7 +35,7 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
|
||||
var/list/socks_list //! stores /datum/sprite_accessory/socks indexed by name
|
||||
|
||||
//Lizard Bits (all datum lists indexed by name)
|
||||
var/list/body_markings_list
|
||||
var/list/lizard_markings_list
|
||||
var/list/snouts_list
|
||||
var/list/horns_list
|
||||
var/list/frills_list
|
||||
@@ -87,7 +87,7 @@ SUBSYSTEM_DEF(accessories) // just 'accessories' for brevity
|
||||
|
||||
socks_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/socks)[DEFAULT_SPRITE_LIST]
|
||||
|
||||
body_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings)[DEFAULT_SPRITE_LIST]
|
||||
lizard_markings_list = init_sprite_accessory_subtypes(/datum/sprite_accessory/lizard_markings)[DEFAULT_SPRITE_LIST]
|
||||
tails_list_human = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
|
||||
tails_list_lizard = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
|
||||
tails_list_monkey = init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, add_blank = TRUE)[DEFAULT_SPRITE_LIST]
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/// For body markings applied on the species, which need some extra code
|
||||
/datum/bodypart_overlay/simple/body_marking
|
||||
layers = EXTERNAL_ADJACENT
|
||||
/// Listen to the gendercode, if the limb is bimorphic
|
||||
var/use_gender = FALSE
|
||||
/// Which dna feature key to draw from
|
||||
var/dna_feature_key
|
||||
/// Which bodyparts do we apply ourselves to?
|
||||
var/list/applies_to = list(/obj/item/bodypart/head, /obj/item/bodypart/chest, /obj/item/bodypart/arm/left, /obj/item/bodypart/arm/right, \
|
||||
/obj/item/bodypart/leg/left, /obj/item/bodypart/leg/right)
|
||||
|
||||
/// Get the accessory list from SSaccessories. Used in species.dm to get the right sprite
|
||||
/datum/bodypart_overlay/simple/body_marking/proc/get_accessory(name)
|
||||
CRASH("get_accessories() not overriden on [type] !")
|
||||
|
||||
/datum/bodypart_overlay/simple/body_marking/get_image(layer, obj/item/bodypart/limb)
|
||||
var/gender_string = (use_gender && limb.is_dimorphic) ? (limb.gender == MALE ? MALE : FEMALE + "_") : "" //we only got male and female sprites
|
||||
return image(icon, gender_string + icon_state + "_" + limb.body_zone, layer = layer)
|
||||
|
||||
/datum/bodypart_overlay/simple/body_marking/moth
|
||||
dna_feature_key = "moth_markings"
|
||||
|
||||
/datum/bodypart_overlay/simple/body_marking/moth/get_accessory(name)
|
||||
return SSaccessories.moth_markings_list[name]
|
||||
|
||||
/datum/bodypart_overlay/simple/body_marking/lizard
|
||||
dna_feature_key = "lizard_markings"
|
||||
applies_to = list(/obj/item/bodypart/chest)
|
||||
|
||||
/datum/bodypart_overlay/simple/body_marking/lizard/get_accessory(name)
|
||||
return SSaccessories.lizard_markings_list[name]
|
||||
+6
-10
@@ -207,8 +207,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
|
||||
L[DNA_MUTANT_COLOR_BLOCK] = sanitize_hexcolor(features["mcolor"], include_crunch = FALSE)
|
||||
if(features["ethcolor"])
|
||||
L[DNA_ETHEREAL_COLOR_BLOCK] = sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE)
|
||||
if(features["body_markings"])
|
||||
L[DNA_LIZARD_MARKINGS_BLOCK] = construct_block(SSaccessories.body_markings_list.Find(features["body_markings"]), length(SSaccessories.body_markings_list))
|
||||
if(features["lizard_markings"])
|
||||
L[DNA_LIZARD_MARKINGS_BLOCK] = construct_block(SSaccessories.lizard_markings_list.Find(features["lizard_markings"]), length(SSaccessories.lizard_markings_list))
|
||||
if(features["tail_cat"])
|
||||
L[DNA_TAIL_BLOCK] = construct_block(SSaccessories.tails_list_human.Find(features["tail_cat"]), length(SSaccessories.tails_list_human))
|
||||
if(features["tail_lizard"])
|
||||
@@ -354,7 +354,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
|
||||
if(DNA_ETHEREAL_COLOR_BLOCK)
|
||||
set_uni_feature_block(blocknumber, sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE))
|
||||
if(DNA_LIZARD_MARKINGS_BLOCK)
|
||||
set_uni_feature_block(blocknumber, construct_block(SSaccessories.body_markings_list.Find(features["body_markings"]), length(SSaccessories.body_markings_list)))
|
||||
set_uni_feature_block(blocknumber, construct_block(SSaccessories.lizard_markings_list.Find(features["lizard_markings"]), length(SSaccessories.lizard_markings_list)))
|
||||
if(DNA_TAIL_BLOCK)
|
||||
set_uni_feature_block(blocknumber, construct_block(SSaccessories.tails_list_human.Find(features["tail_cat"]), length(SSaccessories.tails_list_human)))
|
||||
if(DNA_LIZARD_TAIL_BLOCK)
|
||||
@@ -649,8 +649,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
|
||||
dna.features["mcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_MUTANT_COLOR_BLOCK))
|
||||
if(dna.features["ethcolor"])
|
||||
dna.features["ethcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_ETHEREAL_COLOR_BLOCK))
|
||||
if(dna.features["body_markings"])
|
||||
dna.features["body_markings"] = SSaccessories.body_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_MARKINGS_BLOCK), length(SSaccessories.body_markings_list))]
|
||||
if(dna.features["lizard_markings"])
|
||||
dna.features["lizard_markings"] = SSaccessories.lizard_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_MARKINGS_BLOCK), length(SSaccessories.lizard_markings_list))]
|
||||
if(dna.features["snout"])
|
||||
dna.features["snout"] = SSaccessories.snouts_list[deconstruct_block(get_uni_feature_block(features, DNA_SNOUT_BLOCK), length(SSaccessories.snouts_list))]
|
||||
if(dna.features["horns"])
|
||||
@@ -686,14 +686,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
|
||||
external_organ.mutate_feature(features, src)
|
||||
|
||||
if(icon_update)
|
||||
if(mutcolor_update)
|
||||
update_body(is_creating = TRUE)
|
||||
else
|
||||
update_body()
|
||||
update_body(is_creating = mutcolor_update)
|
||||
if(mutations_overlay_update)
|
||||
update_mutations_overlay()
|
||||
|
||||
|
||||
/mob/proc/domutcheck()
|
||||
return
|
||||
|
||||
|
||||
@@ -1700,24 +1700,24 @@
|
||||
// MutantParts Definitions //
|
||||
/////////////////////////////
|
||||
|
||||
/datum/sprite_accessory/body_markings
|
||||
icon = 'icons/mob/human/species/lizard/lizard_misc.dmi'
|
||||
/datum/sprite_accessory/lizard_markings
|
||||
icon = 'icons/mob/human/species/lizard/lizard_markings.dmi'
|
||||
|
||||
/datum/sprite_accessory/body_markings/none
|
||||
/datum/sprite_accessory/lizard_markings/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/datum/sprite_accessory/body_markings/dtiger
|
||||
/datum/sprite_accessory/lizard_markings/dtiger
|
||||
name = "Dark Tiger Body"
|
||||
icon_state = "dtiger"
|
||||
gender_specific = TRUE
|
||||
|
||||
/datum/sprite_accessory/body_markings/ltiger
|
||||
/datum/sprite_accessory/lizard_markings/ltiger
|
||||
name = "Light Tiger Body"
|
||||
icon_state = "ltiger"
|
||||
gender_specific = TRUE
|
||||
|
||||
/datum/sprite_accessory/body_markings/lbelly
|
||||
/datum/sprite_accessory/lizard_markings/lbelly
|
||||
name = "Light Belly"
|
||||
icon_state = "lbelly"
|
||||
gender_specific = TRUE
|
||||
|
||||
@@ -112,6 +112,10 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
|
||||
/// will show the feature as selectable.
|
||||
var/relevant_mutant_bodypart = null
|
||||
|
||||
/// If the selected species has this in its /datum/species/body_markings,
|
||||
/// will show the feature as selectable.
|
||||
var/relevant_body_markings = null
|
||||
|
||||
/// If the selected species has this in its /datum/species/inherent_traits,
|
||||
/// will show the feature as selectable.
|
||||
var/relevant_inherent_trait = null
|
||||
@@ -333,6 +337,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
|
||||
|| !isnull(relevant_inherent_trait) \
|
||||
|| !isnull(relevant_external_organ) \
|
||||
|| !isnull(relevant_head_flag) \
|
||||
|| !isnull(relevant_body_markings) \
|
||||
)
|
||||
var/species_type = preferences.read_preference(/datum/preference/choiced/species)
|
||||
|
||||
|
||||
@@ -29,20 +29,20 @@
|
||||
category = PREFERENCE_CATEGORY_FEATURES
|
||||
main_feature_name = "Body markings"
|
||||
should_generate_icons = TRUE
|
||||
relevant_mutant_bodypart = "body_markings"
|
||||
relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/lizard
|
||||
|
||||
/datum/preference/choiced/lizard_body_markings/init_possible_values()
|
||||
return assoc_to_keys_features(SSaccessories.body_markings_list)
|
||||
return assoc_to_keys_features(SSaccessories.lizard_markings_list)
|
||||
|
||||
/datum/preference/choiced/lizard_body_markings/icon_for(value)
|
||||
var/datum/sprite_accessory/sprite_accessory = SSaccessories.body_markings_list[value]
|
||||
var/datum/sprite_accessory/sprite_accessory = SSaccessories.lizard_markings_list[value]
|
||||
|
||||
var/icon/final_icon = icon('icons/mob/human/species/lizard/bodyparts.dmi', "lizard_chest_m")
|
||||
|
||||
if (sprite_accessory.icon_state != "none")
|
||||
var/icon/body_markings_icon = icon(
|
||||
'icons/mob/human/species/lizard/lizard_misc.dmi',
|
||||
"m_body_markings_[sprite_accessory.icon_state]_ADJ",
|
||||
"male_[sprite_accessory.icon_state]_chest",
|
||||
)
|
||||
|
||||
final_icon.Blend(body_markings_icon, ICON_OVERLAY)
|
||||
@@ -55,7 +55,7 @@
|
||||
return final_icon
|
||||
|
||||
/datum/preference/choiced/lizard_body_markings/apply_to_human(mob/living/carbon/human/target, value)
|
||||
target.dna.features["body_markings"] = value
|
||||
target.dna.features["lizard_markings"] = value
|
||||
|
||||
/datum/preference/choiced/lizard_frills
|
||||
savefile_key = "feature_lizard_frills"
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
category = PREFERENCE_CATEGORY_FEATURES
|
||||
main_feature_name = "Body markings"
|
||||
should_generate_icons = TRUE
|
||||
relevant_mutant_bodypart = "moth_markings"
|
||||
relevant_body_markings = /datum/bodypart_overlay/simple/body_marking/moth
|
||||
|
||||
/datum/preference/choiced/moth_markings/init_possible_values()
|
||||
return assoc_to_keys_features(SSaccessories.moth_markings_list)
|
||||
|
||||
@@ -755,7 +755,7 @@
|
||||
"wings" = "None",
|
||||
"frills" = "None",
|
||||
"spines" = "Long",
|
||||
"body_markings" = "Dark Tiger Body",
|
||||
"lizard_markings" = "Dark Tiger Body",
|
||||
"legs" = DIGITIGRADE_LEGS,
|
||||
)
|
||||
consumer.eye_color_left = "#FEE5A3"
|
||||
|
||||
@@ -102,6 +102,9 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
///Replaces default appendix with a different organ.
|
||||
var/obj/item/organ/internal/appendix/mutantappendix = /obj/item/organ/internal/appendix
|
||||
|
||||
/// Store body marking defines. See mobs.dm for bitflags
|
||||
var/list/body_markings = list()
|
||||
|
||||
/// Flat modifier on all damage taken via [apply_damage][/mob/living/proc/apply_damage] (so being punched, shot, etc.)
|
||||
/// IE: 10 = 10% less damage taken.
|
||||
var/damage_modifier = 0
|
||||
@@ -466,7 +469,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
var/obj/item/organ/external/new_organ = SSwardrobe.provide_type(organ_path)
|
||||
new_organ.Insert(human, special=TRUE, movement_flags = DELETE_IF_REPLACED)
|
||||
|
||||
|
||||
add_body_markings(human_who_gained_species)
|
||||
|
||||
if(length(inherent_traits))
|
||||
human_who_gained_species.add_traits(inherent_traits, SPECIES_TRAIT)
|
||||
@@ -526,6 +529,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
|
||||
clear_tail_moodlets(C)
|
||||
|
||||
remove_body_markings(C)
|
||||
|
||||
// Removes all languages previously associated with [LANGUAGE_SPECIES], gaining our new species will add new ones back
|
||||
var/datum/language_holder/losing_holder = GLOB.prototype_language_holders[species_language_holder]
|
||||
for(var/language in losing_holder.understood_languages)
|
||||
@@ -560,42 +565,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
eye_organ.refresh(call_update = FALSE)
|
||||
standing += eye_organ.generate_body_overlay(species_human)
|
||||
|
||||
// organic body markings (oh my god this is terrible please rework this to be done on the limbs themselves i beg you)
|
||||
if(HAS_TRAIT(species_human, TRAIT_HAS_MARKINGS))
|
||||
var/obj/item/bodypart/chest/chest = species_human.get_bodypart(BODY_ZONE_CHEST)
|
||||
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 = SSaccessories.moth_markings_list[species_human.dna.features["moth_markings"]]
|
||||
var/mutable_appearance/marking = mutable_appearance(layer = -BODY_LAYER, appearance_flags = KEEP_TOGETHER)
|
||||
|
||||
if(noggin && (IS_ORGANIC_LIMB(noggin)))
|
||||
var/mutable_appearance/markings_head_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_head")
|
||||
marking.overlays += markings_head_overlay
|
||||
|
||||
if(chest && (IS_ORGANIC_LIMB(chest)))
|
||||
var/mutable_appearance/markings_chest_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_chest")
|
||||
marking.overlays += markings_chest_overlay
|
||||
|
||||
if(right_arm && (IS_ORGANIC_LIMB(right_arm)))
|
||||
var/mutable_appearance/markings_r_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_arm")
|
||||
marking.overlays += markings_r_arm_overlay
|
||||
|
||||
if(left_arm && (IS_ORGANIC_LIMB(left_arm)))
|
||||
var/mutable_appearance/markings_l_arm_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_arm")
|
||||
marking.overlays += markings_l_arm_overlay
|
||||
|
||||
if(right_leg && (IS_ORGANIC_LIMB(right_leg)))
|
||||
var/mutable_appearance/markings_r_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_r_leg")
|
||||
marking.overlays += markings_r_leg_overlay
|
||||
|
||||
if(left_leg && (IS_ORGANIC_LIMB(left_leg)))
|
||||
var/mutable_appearance/markings_l_leg_overlay = mutable_appearance(markings.icon, "[markings.icon_state]_l_leg")
|
||||
marking.overlays += markings_l_leg_overlay
|
||||
|
||||
standing += marking
|
||||
|
||||
//Underwear, Undershirts & Socks
|
||||
if(!HAS_TRAIT(species_human, TRAIT_NO_UNDERWEAR))
|
||||
if(species_human.underwear)
|
||||
@@ -672,8 +641,6 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
switch(bodypart)
|
||||
if("ears")
|
||||
accessory = SSaccessories.ears_list[source.dna.features["ears"]]
|
||||
if("body_markings")
|
||||
accessory = SSaccessories.body_markings_list[source.dna.features["body_markings"]]
|
||||
if("legs")
|
||||
accessory = SSaccessories.legs_list[source.dna.features["legs"]]
|
||||
|
||||
@@ -727,6 +694,8 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
source.apply_overlay(BODY_ADJ_LAYER)
|
||||
source.apply_overlay(BODY_FRONT_LAYER)
|
||||
|
||||
update_body_markings(source)
|
||||
|
||||
//This exists so sprite accessories can still be per-layer without having to include that layer's
|
||||
//number in their sprite name, which causes issues when those numbers change.
|
||||
/datum/species/proc/mutant_bodyparts_layertext(layer)
|
||||
@@ -1519,6 +1488,7 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
|| (preference.relevant_inherent_trait in inherent_traits) \
|
||||
|| (preference.relevant_external_organ in external_organs) \
|
||||
|| (preference.relevant_head_flag && check_head_flags(preference.relevant_head_flag)) \
|
||||
|| (preference.relevant_body_markings in body_markings) \
|
||||
)
|
||||
features += preference.savefile_key
|
||||
|
||||
@@ -2110,3 +2080,48 @@ GLOBAL_LIST_EMPTY(features_by_species)
|
||||
return fixed_mut_color
|
||||
|
||||
return null
|
||||
|
||||
/// Add species appropriate body markings
|
||||
/datum/species/proc/add_body_markings(mob/living/carbon/human/hooman)
|
||||
for(var/markings_type in body_markings) //loop through possible species markings
|
||||
var/datum/bodypart_overlay/simple/body_marking/markings = new markings_type() // made to die... mostly because we cant use initial on lists but its convenient and organized
|
||||
var/accessory_name = hooman.dna.features[markings.dna_feature_key] //get the accessory name from dna
|
||||
var/datum/sprite_accessory/moth_markings/accessory = markings.get_accessory(accessory_name) //get the actual datum
|
||||
|
||||
if(isnull(accessory))
|
||||
CRASH("Value: [accessory_name] did not have a corresponding sprite accessory!")
|
||||
|
||||
for(var/obj/item/bodypart/part as anything in markings.applies_to) //check through our limbs
|
||||
var/obj/item/bodypart/people_part = hooman.get_bodypart(initial(part.body_zone)) // and see if we have a compatible marking for that limb
|
||||
|
||||
if(!people_part)
|
||||
continue
|
||||
|
||||
var/datum/bodypart_overlay/simple/body_marking/overlay = new markings_type ()
|
||||
|
||||
// Tell the overlay what it should look like
|
||||
overlay.icon = accessory.icon
|
||||
overlay.icon_state = accessory.icon_state
|
||||
overlay.use_gender = accessory.gender_specific
|
||||
overlay.draw_color = accessory.color_src ? hooman.dna.features["mcolor"] : null
|
||||
|
||||
people_part.add_bodypart_overlay(overlay)
|
||||
|
||||
/// Remove body markings
|
||||
/datum/species/proc/remove_body_markings(mob/living/carbon/human/hooman)
|
||||
for(var/obj/item/bodypart/part as anything in hooman.bodyparts)
|
||||
for(var/datum/bodypart_overlay/simple/body_marking/marking in part.bodypart_overlays)
|
||||
part.remove_bodypart_overlay(marking)
|
||||
|
||||
/// Update the overlays if necessary
|
||||
/datum/species/proc/update_body_markings(mob/living/carbon/human/hooman)
|
||||
var/needs_update = FALSE
|
||||
for(var/datum/bodypart_overlay/simple/body_marking/marking as anything in body_markings)
|
||||
if(initial(marking.dna_feature_key) == body_markings[marking]) // dna is same as our species (sort of mini-cache), so no update needed
|
||||
continue
|
||||
needs_update = TRUE
|
||||
break
|
||||
|
||||
if(needs_update)
|
||||
remove_body_markings(hooman)
|
||||
add_body_markings(hooman)
|
||||
|
||||
@@ -103,7 +103,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
|
||||
/proc/create_consistent_human_dna(mob/living/carbon/human/target)
|
||||
target.dna.features["mcolor"] = COLOR_VIBRANT_LIME
|
||||
target.dna.features["ethcolor"] = COLOR_WHITE
|
||||
target.dna.features["body_markings"] = get_consistent_feature_entry(SSaccessories.body_markings_list)
|
||||
target.dna.features["lizard_markings"] = get_consistent_feature_entry(SSaccessories.lizard_markings_list)
|
||||
target.dna.features["ears"] = get_consistent_feature_entry(SSaccessories.ears_list)
|
||||
target.dna.features["frills"] = get_consistent_feature_entry(SSaccessories.frills_list)
|
||||
target.dna.features["horns"] = get_consistent_feature_entry(SSaccessories.horns_list)
|
||||
|
||||
@@ -8,7 +8,8 @@
|
||||
TRAIT_TACKLING_TAILED_DEFENDER,
|
||||
)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_REPTILE
|
||||
mutant_bodyparts = list("body_markings" = "None", "legs" = "Normal Legs")
|
||||
mutant_bodyparts = list("legs" = "Normal Legs")
|
||||
body_markings = list(/datum/bodypart_overlay/simple/body_marking/lizard = "None")
|
||||
external_organs = list(
|
||||
/obj/item/organ/external/horns = "None",
|
||||
/obj/item/organ/external/frills = "None",
|
||||
@@ -49,7 +50,7 @@
|
||||
|
||||
/datum/species/lizard/randomize_features()
|
||||
var/list/features = ..()
|
||||
features["body_markings"] = pick(SSaccessories.body_markings_list)
|
||||
features["lizard_markings"] = pick(SSaccessories.lizard_markings_list)
|
||||
return features
|
||||
|
||||
/datum/species/lizard/get_scream_sound(mob/living/carbon/human/lizard)
|
||||
|
||||
@@ -3,12 +3,11 @@
|
||||
plural_form = "Mothmen"
|
||||
id = SPECIES_MOTH
|
||||
inherent_traits = list(
|
||||
TRAIT_HAS_MARKINGS,
|
||||
TRAIT_TACKLING_WINGED_ATTACKER,
|
||||
TRAIT_ANTENNAE,
|
||||
)
|
||||
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
|
||||
mutant_bodyparts = list("moth_markings" = "None")
|
||||
body_markings = list(/datum/bodypart_overlay/simple/body_marking/moth = "None")
|
||||
external_organs = list(/obj/item/organ/external/wings/moth = "Plain", /obj/item/organ/external/antennae = "Plain")
|
||||
meat = /obj/item/food/meat/slab/human/mutant/moth
|
||||
mutanttongue = /obj/item/organ/internal/tongue/moth
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
ling.dna.features["horns"] = "Curled"
|
||||
ling.dna.features["frills"] = "Short"
|
||||
ling.dna.features["spines"] = "Long + Membrane"
|
||||
ling.dna.features["body_markings"] = "Light Belly"
|
||||
ling.dna.features["lizard_markings"] = "Light Belly"
|
||||
ling.dna.features["legs"] = DIGITIGRADE_LEGS
|
||||
ling.eye_color_left = COLOR_WHITE
|
||||
ling.eye_color_right = COLOR_WHITE
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 977 B |
Binary file not shown.
|
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 2.7 KiB |
@@ -989,6 +989,7 @@
|
||||
#include "code\datums\atmosphere\planetary.dm"
|
||||
#include "code\datums\bodypart_overlays\bodypart_overlay.dm"
|
||||
#include "code\datums\bodypart_overlays\emote_bodypart_overlay.dm"
|
||||
#include "code\datums\bodypart_overlays\markings_bodypart_overlay.dm"
|
||||
#include "code\datums\bodypart_overlays\mutant_bodypart_overlay.dm"
|
||||
#include "code\datums\bodypart_overlays\simple_bodypart_overlay.dm"
|
||||
#include "code\datums\brain_damage\brain_trauma.dm"
|
||||
|
||||
Reference in New Issue
Block a user