diff --git a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
index 59d64d2019..3e7ab6f035 100644
--- a/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
+++ b/code/modules/mob/living/carbon/human/species/species_shapeshift.dm
@@ -16,7 +16,7 @@ var/list/wrapped_species_by_ref = list()
//var/default_form = SPECIES_HUMAN //VOREStation edit
/datum/species/shapeshifter/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
- return valid_transform_species
+ return list(vanity_base_fit)|valid_transform_species //CHOMPEdit
/datum/species/shapeshifter/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
if(!H) return ..(null, get_deform)
diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
index 2d8dfc0050..675265bb5d 100644
--- a/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/prometheans_vr.dm
@@ -34,6 +34,7 @@
/mob/living/carbon/human/proc/prommie_blobform,
/mob/living/proc/set_size,
/mob/living/carbon/human/proc/promethean_select_opaqueness,
+ /mob/living/carbon/human/proc/shapeshifter_reassemble //CHOMPEdit: reform verb
)
/mob/living/carbon/human/proc/prommie_blobform()
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index 5239589931..7f730d6b58 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -27,8 +27,9 @@
/mob/living/carbon/human/proc/reconstitute_form,
/mob/living/carbon/human/proc/sonar_ping,
/mob/living/carbon/human/proc/tie_hair,
- /mob/living/carbon/human/proc/lick_wounds) //Xenochimera get all the special verbs since they can't select traits.
- // CHOMPEdit: Lick Wounds Verb
+ /mob/living/carbon/human/proc/lick_wounds,
+ /mob/living/carbon/human/proc/shapeshifter_reassemble) //Xenochimera get all the special verbs since they can't select traits.
+ // CHOMPEdit: Lick Wounds Verb, reform verb
virus_immune = 1 // They practically ARE one.
min_age = 18
@@ -445,7 +446,7 @@
catalogue_data = list(/datum/category_item/catalogue/fauna/vulpkanin)
- spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. ChompEdit;renable
+ spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE//Whitelisted as restricted is broken. ChompEdit;renable
appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_COLOR | HAS_EYE_COLOR
flesh_color = "#AFA59E"
diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm
index c521e4dfe2..d43b309631 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -1139,7 +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
+ skip_robo_icon = R.no_icon //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 d882d3ba96..d4a5b35320 100644
--- a/code/modules/organs/robolimbs_ch.dm
+++ b/code/modules/organs/robolimbs_ch.dm
@@ -1,5 +1,10 @@
+GLOBAL_LIST_INIT(dsi_to_species, list(SPECIES_TAJARAN = "DSI - Tajaran", SPECIES_UNATHI = "DSI - Lizard", SPECIES_SERGAL = "DSI - Sergal", SPECIES_NEVREAN = "DSI - Nevrean", \
+ SPECIES_VULPKANIN = "DSI - Vulpkanin", SPECIES_AKULA = "DSI - Akula", SPECIES_VASILISSAN = "DSI - Vasilissan", SPECIES_ZORREN = "DSI - Zorren",\
+ SPECIES_TESHARI = "DSI - Teshari", SPECIES_FENNEC = "DSI - Fennec"))
+
/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
+ var/no_icon = FALSE //specifically for DSI things, makes it so it doesn't override the species icons
+ //var/has_digitigrade_icon = FALSE //make this a thing
/datum/robolimb/valehoundhead
company = "VALE Hound- Head"
@@ -9,32 +14,45 @@
parts = list(BP_HEAD)
/datum/robolimb/dsi_tajaran
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_lizard
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_sergal
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_nevrean
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_vulpkanin
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_akula
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_spider
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_zorren
- can_be_digitigrade = TRUE
+ no_icon = TRUE
/datum/robolimb/dsi_fennec
- can_be_digitigrade = TRUE
+ no_icon = TRUE
+
+/datum/robolimb/dsi_teshari
+ no_icon = TRUE
/datum/robolimb/dsi_teshari/New()
. = ..()
- species_cannot_use -= SPECIES_PROTEAN
\ No newline at end of file
+ species_cannot_use -= SPECIES_PROTEAN
+
+
+/datum/robolimb/dsi_other
+ company = "DSI - Synthetic"
+ desc = "This limb has a realistic design and squish. By Darkside Incorperated."
+ blood_color = "#ffe2ff"
+ lifelike = 1
+ unavailable_to_build = 1
+ skin_tone = 1
+ no_icon = TRUE
diff --git a/modular_chomp/code/modules/client/preferences.dm b/modular_chomp/code/modules/client/preferences.dm
index 76dea00a76..6c9af02123 100644
--- a/modular_chomp/code/modules/client/preferences.dm
+++ b/modular_chomp/code/modules/client/preferences.dm
@@ -34,3 +34,235 @@
SScharacter_setup.queue_preferences_save(prefs)
feedback_add_details("admin_verb","TAutoTranscore") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+
+/datum/preferences/proc/vanity_copy_to(var/mob/living/carbon/human/character, var/copy_name, var/copy_flavour = TRUE, var/copy_ooc_notes = FALSE, var/convert_to_prosthetics = FALSE)
+ //snowflake copy_to, does not copy anything but the vanity things
+ //does not check if the name is the same, do that in any proc that calls this proc
+ /*
+ name, nickname, flavour, OOC notes
+ gender, sex
+ custom species name, custom bodytype, weight, scale, scaling center, sound type, sound freq
+ custom say verbs
+ ears, wings, tail, hair, facial hair
+ ears colors, wings colors, tail colors
+ body color, prosthetics (if they're a protean) (convert to DSI if protean and not prosthetic), eye color, hair color etc
+ markings
+ custom synth markings toggle, custom synth color toggle
+ digitigrade
+ blood color
+ */
+ if (copy_name)
+ if(config.humans_need_surnames)
+ var/firstspace = findtext(real_name, " ")
+ var/name_length = length(real_name)
+ if(!firstspace) //we need a surname
+ real_name += " [pick(last_names)]"
+ else if(firstspace == name_length)
+ real_name += "[pick(last_names)]"
+ character.real_name = real_name
+ character.name = character.real_name
+ if(character.dna)
+ character.dna.real_name = character.real_name
+ character.nickname = nickname
+ character.gender = biological_gender
+ character.identifying_gender = identifying_gender
+
+ character.r_eyes = r_eyes
+ character.g_eyes = g_eyes
+ character.b_eyes = b_eyes
+ character.h_style = h_style
+ character.r_hair = r_hair
+ character.g_hair = g_hair
+ character.b_hair = b_hair
+ character.r_grad = r_grad
+ character.g_grad = g_grad
+ character.b_grad = b_grad
+ character.f_style = f_style
+ character.r_facial = r_facial
+ character.g_facial = g_facial
+ character.b_facial = b_facial
+ character.r_skin = r_skin
+ character.g_skin = g_skin
+ character.b_skin = b_skin
+ character.s_tone = s_tone
+ character.h_style = h_style
+ character.grad_style= grad_style
+ character.f_style = f_style
+ character.grad_style= grad_style
+ character.b_type = b_type
+ character.synth_color = synth_color
+ character.r_synth = r_synth
+ character.g_synth = g_synth
+ character.b_synth = b_synth
+ character.synth_markings = synth_markings
+
+ var/list/ear_styles = get_available_styles(global.ear_styles_list)
+ character.ear_style = ear_styles[ear_style]
+ character.r_ears = r_ears
+ character.b_ears = b_ears
+ character.g_ears = g_ears
+ character.r_ears2 = r_ears2
+ character.b_ears2 = b_ears2
+ character.g_ears2 = g_ears2
+ character.r_ears3 = r_ears3
+ character.b_ears3 = b_ears3
+ character.g_ears3 = g_ears3
+
+ var/list/tail_styles = get_available_styles(global.tail_styles_list)
+ character.tail_style = tail_styles[tail_style]
+ character.r_tail = r_tail
+ character.b_tail = b_tail
+ character.g_tail = g_tail
+ character.r_tail2 = r_tail2
+ character.b_tail2 = b_tail2
+ character.g_tail2 = g_tail2
+ character.r_tail3 = r_tail3
+ character.b_tail3 = b_tail3
+ character.g_tail3 = g_tail3
+
+ var/list/wing_styles = get_available_styles(global.wing_styles_list)
+ character.wing_style = wing_styles[wing_style]
+ character.r_wing = r_wing
+ character.b_wing = b_wing
+ character.g_wing = g_wing
+ character.r_wing2 = r_wing2
+ character.b_wing2 = b_wing2
+ character.g_wing2 = g_wing2
+ character.r_wing3 = r_wing3
+ character.b_wing3 = b_wing3
+ character.g_wing3 = g_wing3
+
+ character.set_gender(biological_gender)
+
+ // Destroy/cyborgize organs and limbs.
+ if (convert_to_prosthetics) //should only really be run for proteans
+ for(var/name in BP_ALL)
+ var/status = organ_data[name]
+ var/obj/item/organ/external/O = character.organs_by_name[name]
+ if(O)
+ if(status == "amputated")
+ continue
+ else if(status == "cyborg")
+ O.robotize(rlimb_data[name])
+ else
+ var/bodytype
+ var/datum/species/selected_species = GLOB.all_species[species]
+ if(selected_species.selects_bodytype)
+ bodytype = custom_base
+ else
+ bodytype = selected_species.get_bodytype()
+ var/dsi_company = GLOB.dsi_to_species[bodytype]
+ if (!dsi_company)
+ dsi_company = "DSI - Synthetic"
+ O.robotize(dsi_company)
+
+ for(var/N in character.organs_by_name)
+ var/obj/item/organ/external/O = character.organs_by_name[N]
+ O.markings.Cut()
+
+ var/priority = 0
+ for(var/M in body_markings)
+ priority += 1
+ var/datum/sprite_accessory/marking/mark_datum = body_marking_styles_list[M]
+ var/mark_color = "[body_markings[M]]"
+
+ for(var/BP in mark_datum.body_parts)
+ var/obj/item/organ/external/O = character.organs_by_name[BP]
+ if(O)
+ O.markings[M] = list("color" = mark_color, "datum" = mark_datum, "priority" = priority)
+ character.markings_len = priority
+
+ var/list/last_descriptors = list()
+ if(islist(body_descriptors))
+ last_descriptors = body_descriptors.Copy()
+ body_descriptors = list()
+
+ var/datum/species/mob_species = GLOB.all_species[species]
+ if(LAZYLEN(mob_species.descriptors))
+ for(var/entry in mob_species.descriptors)
+ var/datum/mob_descriptor/descriptor = mob_species.descriptors[entry]
+ if(istype(descriptor))
+ if(isnull(last_descriptors[entry]))
+ body_descriptors[entry] = descriptor.default_value // Species datums have initial default value.
+ else
+ body_descriptors[entry] = CLAMP(last_descriptors[entry], 1, LAZYLEN(descriptor.standalone_value_descriptors))
+
+ if (copy_flavour)
+ character.flavor_texts["general"] = flavor_texts["general"]
+ character.flavor_texts["head"] = flavor_texts["head"]
+ character.flavor_texts["face"] = flavor_texts["face"]
+ character.flavor_texts["eyes"] = flavor_texts["eyes"]
+ character.flavor_texts["torso"] = flavor_texts["torso"]
+ character.flavor_texts["arms"] = flavor_texts["arms"]
+ character.flavor_texts["hands"] = flavor_texts["hands"]
+ character.flavor_texts["legs"] = flavor_texts["legs"]
+ character.flavor_texts["feet"] = flavor_texts["feet"]
+ if (copy_ooc_notes)
+ character.ooc_notes = metadata
+
+ character.weight = weight_vr
+ character.weight_gain = weight_gain
+ character.weight_loss = weight_loss
+ character.fuzzy = fuzzy
+ character.offset_override = offset_override //CHOMPEdit
+ character.voice_freq = voice_freq
+ character.resize(size_multiplier, animate = FALSE, ignore_prefs = TRUE)
+ if(!voice_sound)
+ character.voice_sounds_list = talk_sound
+ else
+ switch(voice_sound)
+ if("beep-boop")
+ character.voice_sounds_list = talk_sound
+ if("goon speak 1")
+ character.voice_sounds_list = goon_speak_one_sound
+ if("goon speak 2")
+ character.voice_sounds_list = goon_speak_two_sound
+ if("goon speak 3")
+ character.voice_sounds_list = goon_speak_three_sound
+ if("goon speak 4")
+ character.voice_sounds_list = goon_speak_four_sound
+ if("goon speak blub")
+ character.voice_sounds_list = goon_speak_blub_sound
+ if("goon speak bottalk")
+ character.voice_sounds_list = goon_speak_bottalk_sound
+ if("goon speak buwoo")
+ character.voice_sounds_list = goon_speak_buwoo_sound
+ if("goon speak cow")
+ character.voice_sounds_list = goon_speak_cow_sound
+ if("goon speak lizard")
+ character.voice_sounds_list = goon_speak_lizard_sound
+ if("goon speak pug")
+ character.voice_sounds_list = goon_speak_pug_sound
+ if("goon speak pugg")
+ character.voice_sounds_list = goon_speak_pugg_sound
+ if("goon speak roach")
+ character.voice_sounds_list = goon_speak_roach_sound
+ if("goon speak skelly")
+ character.voice_sounds_list = goon_speak_skelly_sound
+
+ character.species?.blood_color = blood_color
+
+ var/datum/species/selected_species = GLOB.all_species[species]
+ var/bodytype_selected
+ if(selected_species.selects_bodytype)
+ bodytype_selected = custom_base
+ else
+ bodytype_selected = selected_species.get_bodytype(character)
+
+ character.dna.base_species = bodytype_selected
+ character.species.base_species = bodytype_selected
+ character.species.vanity_base_fit = bodytype_selected
+ if (istype(character.species, /datum/species/shapeshifter))
+ wrapped_species_by_ref["\ref[character]"] = bodytype_selected
+
+ character.custom_species = custom_species
+ character.custom_say = lowertext(trim(custom_say))
+ character.custom_ask = lowertext(trim(custom_ask))
+ character.custom_whisper = lowertext(trim(custom_whisper))
+ character.custom_exclaim = lowertext(trim(custom_exclaim))
+
+ character.digitigrade = selected_species.digi_allowed ? digitigrade : 0
+
+ character.dna.ResetUIFrom(character)
+ character.force_update_limbs()
+ character.regenerate_icons()
diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm
index 70eb1876a6..597f95bac5 100644
--- a/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm
+++ b/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm
@@ -17,6 +17,7 @@
var/mudking = FALSE
var/icodigi = 'modular_chomp/icons/mob/human_races/r_digi.dmi'
var/digi_allowed = FALSE
+ var/vanity_base_fit //when shapeshifting using vanity_copy_to, this allows you to have add something so they can go back to their original species fit
// Handles non-standard eyes when using a species that utilizes a custom base icon set.
// Eye data is stored in the head organ, and this needs to be handled specially.
diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/species_shapeshift_ch.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/species_shapeshift_ch.dm
new file mode 100644
index 0000000000..6141d17e22
--- /dev/null
+++ b/modular_chomp/code/modules/mob/living/carbon/human/species/species_shapeshift_ch.dm
@@ -0,0 +1,31 @@
+/mob/living/carbon/human/proc/shapeshifter_reassemble()
+
+ set name = "Complete Reform"
+ set category = "Abilities"
+
+ if(stat || world.time < last_special)
+ return
+
+ last_special = world.time + 50
+
+ if (tgui_alert(src, "Are you sure you want to reform yourself? This will reset you to what you look like in your current preferences slot.", "Reform", list("Yes","Cancel")) != "Yes")
+ return
+
+ var/input = tgui_alert(src,{"Include Flavourtext?"},"Reformation",list("Yes","No","Cancel"))
+ if(input == "Cancel" || !input)
+ return
+ var/flavour = 0
+ if(input == "Yes")
+ flavour = 1
+ input = tgui_alert(src,{"Include OOC notes?"},"Reformation",list("Yes","No","Cancel"))
+ if(input == "Cancel" || !input)
+ return
+ var/oocnotes = 0
+ if(input == "Yes")
+ oocnotes = 1
+ to_chat(src, "You begin to reform. You will need to remain still.")
+ visible_message("[src] rapidly contorts and shifts!", "You begin to reform.")
+ if (do_after(src, 40,exclusive = TASK_ALL_EXCLUSIVE))
+ if (client?.prefs)
+ client.prefs.vanity_copy_to(src, FALSE, flavour, oocnotes, FALSE)
+ visible_message("[src] adopts a new form!", "You have reformed.")
diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
index d7a904fa83..77a0cdbc2b 100644
--- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
+++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_powers.dm
@@ -132,7 +132,7 @@
if(do_after(caller, 40,exclusive = TASK_ALL_EXCLUSIVE))
if(client.prefs) //Make sure we didn't d/c
var/obj/item/weapon/rig/protean/Rig = species?:OurRig
- GetAppearanceFromPrefs(flavour, oocnotes)
+ caller.client.prefs.vanity_copy_to(caller, FALSE, flavour, oocnotes, TRUE)
species?:OurRig = Rig //Get a reference to our Rig and put it back after reassembling
caller.visible_message("[caller] adopts a new form!", "You have reassembled.")
@@ -237,7 +237,7 @@
to_chat(src,"You must be awake and standing to perform this action!")
return
- var/new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", GLOB.playable_species)
+ var/new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", list(species?.vanity_base_fit)|GLOB.playable_species)
if(new_species)
species?.base_species = new_species // Really though you better have a species
regenerate_icons() //Expensive, but we need to recrunch all the icons we're wearing
diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm
index b7bea74148..e94b767e84 100644
--- a/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm
+++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/protean/protean_species.dm
@@ -136,14 +136,53 @@
if(saved_nif)
saved_nif.quick_implant(H)
+/datum/species/protean/get_race_key()
+ var/datum/species/real = GLOB.all_species[base_species]
+ return real.race_key
+
/datum/species/protean/get_bodytype(var/mob/living/carbon/human/H)
if(!H || base_species == name) return ..()
var/datum/species/S = GLOB.all_species[base_species]
return S.get_bodytype(H)
+/datum/species/protean/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
+ if(!H || base_species == name) return ..(null, get_deform)
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_icobase(H, get_deform)
+
/datum/species/protean/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
return GLOB.playable_species
+/datum/species/protean/get_tail(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_tail(H)
+
+/datum/species/protean/get_tail_animation(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_tail_animation(H)
+
+/datum/species/protean/get_tail_hair(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_tail_hair(H)
+
+/datum/species/protean/get_blood_mask(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_blood_mask(H)
+
+/datum/species/protean/get_damage_mask(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_damage_mask(H)
+
+/datum/species/protean/get_damage_overlays(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_damage_overlays(H)
+
/datum/species/protean/handle_post_spawn(var/mob/living/carbon/human/H)
..()
H.synth_color = TRUE
diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/station/station_special_ch.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/station/station_special_ch.dm
new file mode 100644
index 0000000000..5a9a0e0810
--- /dev/null
+++ b/modular_chomp/code/modules/mob/living/carbon/human/species/station/station_special_ch.dm
@@ -0,0 +1,39 @@
+/datum/species/xenochimera/get_bodytype(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_bodytype(H)
+
+/datum/species/xenochimera/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_icobase(H, get_deform)
+
+/datum/species/xenochimera/get_tail(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_tail(H)
+
+/datum/species/xenochimera/get_tail_animation(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_tail_animation(H)
+
+/datum/species/xenochimera/get_tail_hair(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_tail_hair(H)
+
+/datum/species/xenochimera/get_blood_mask(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_blood_mask(H)
+
+/datum/species/xenochimera/get_damage_mask(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_damage_mask(H)
+
+/datum/species/xenochimera/get_damage_overlays(var/mob/living/carbon/human/H)
+ if(!H || base_species == name) return ..()
+ var/datum/species/S = GLOB.all_species[base_species]
+ return S.get_damage_overlays(H)
diff --git a/modular_chomp/code/modules/organs/organ_external.dm b/modular_chomp/code/modules/organs/organ_external.dm
index 73e00426c0..02c7d19170 100644
--- a/modular_chomp/code/modules/organs/organ_external.dm
+++ b/modular_chomp/code/modules/organs/organ_external.dm
@@ -1,5 +1,5 @@
/obj/item/organ/external
- var/prosthetic_digi = FALSE //CHOMPStation edit - when it's prosthetic, can it be a digitigrade
+ var/skip_robo_icon = FALSE //CHOMPStation edit - to force it to use the normal species icon
//new function to check for markings
/obj/item/organ/external/proc/is_hidden_by_markings()
diff --git a/modular_chomp/code/modules/organs/organ_icon.dm b/modular_chomp/code/modules/organs/organ_icon.dm
index 339a45a4f6..36b004674a 100644
--- a/modular_chomp/code/modules/organs/organ_icon.dm
+++ b/modular_chomp/code/modules/organs/organ_icon.dm
@@ -9,8 +9,6 @@
else if(dna)
digitigrade = dna.digitigrade && (istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot))
- 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"
@@ -20,7 +18,7 @@
else
icon_cache_key = "[icon_name]_[force_icon_key]"
- if(force_icon && !robotic_digi)
+ if(force_icon && !skip_robo_icon)
mob_icon = new /icon(force_icon, "[icon_name][gendered_icon ? "_[gender]" : ""]")
else
if(!dna)
@@ -37,7 +35,7 @@
if(skeletal)
mob_icon = new /icon('icons/mob/human_races/r_skeleton.dmi', "[icon_name][gender ? "_[gender]" : ""]")
- else if (robotic >= ORGAN_ROBOT && !robotic_digi)
+ else if (robotic >= ORGAN_ROBOT && !skip_robo_icon)
mob_icon = new /icon('icons/mob/human_races/robotic.dmi', "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
else
@@ -48,13 +46,13 @@
mob_icon = new /icon(digitigrade ? species.icodigi : species.get_icobase(owner, (status & ORGAN_MUTATED)), "[icon_name][gender ? "_[gender]" : ""]")
apply_colouration(mob_icon)
- if (model && !robotic_digi)
+ if (model && !skip_robo_icon)
icon_cache_key += "_model_[model]"
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) && !(force_icon && !robotic_digi)) || (model && owner && owner.synth_markings))
+ if((!istype(src,/obj/item/organ/external/head) && !(force_icon && !skip_robo_icon)) || (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)
@@ -73,7 +71,7 @@
mob_icon.Blend(limb_icon_cache[cache_key], ICON_OVERLAY)
// VOREStation edit start
- if(nail_polish && (force_icon && !robotic_digi))
+ if(nail_polish && !(force_icon && !skip_robo_icon))
var/icon/I = new(nail_polish.icon, nail_polish.icon_state)
I.Blend(nail_polish.color, ICON_MULTIPLY)
add_overlay(I)
diff --git a/vorestation.dme b/vorestation.dme
index 08ba683e78..bf3e245c88 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -4559,9 +4559,11 @@
#include "modular_chomp\code\modules\mob\living\carbon\human\human_defines.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\update_icons.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\species.dm"
+#include "modular_chomp\code\modules\mob\living\carbon\human\species\species_shapeshift_ch.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\outsider\vox.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\prommie_blob.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\station.dm"
+#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\station_special_ch.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\teshari.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\protean\_protean_defines.dm"
#include "modular_chomp\code\modules\mob\living\carbon\human\species\station\protean\protean_blob.dm"