Merge pull request #2892 from Raeschen/digitigrade

Ports Digitigrade legs
This commit is contained in:
Razgriz
2021-09-14 18:22:54 -07:00
committed by GitHub
17 changed files with 285 additions and 4 deletions

13
code/game/dna/dna2_ch.dm Normal file
View File

@@ -0,0 +1,13 @@
/datum/dna
var/digitigrade = 0 //0, Not FALSE, for future use as indicator for digitigrade types (0 = None, 1 = default, 2 = digitigrade birdfeet, ...ect)
/datum/dna/Clone()
. = ..()
var/datum/dna/D = .
//Data for inclusion of digitigrade leg settings in DNA
D.digitigrade = src.digitigrade
/datum/dna/ResetUIFrom(var/mob/living/carbon/human/character)
//inclusion of digitigrade
src.digitigrade = character.digitigrade
. = ..()

View File

@@ -579,7 +579,12 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(has_flag(mob_species, HAS_SKIN_COLOR))
. += "<br><b>Body Color</b><br>"
. += "<a href='?src=\ref[src];skin_color=1'>Change Color</a> [color_square(pref.r_skin, pref.g_skin, pref.b_skin)]<br>"
//CHOMPEdit START
if(mob_species.digi_allowed)
. += "<br><b>Digitigrade?:</b> <a href='?src=\ref[src];digitigrade=1'><b>[pref.digitigrade ? "Yes" : "No"]</b></a><br>"
//CHOMPEdit END
. += "<h2>Genetics Settings</h2>"
var/list/ear_styles = pref.get_available_styles(global.ear_styles_list)

View File

@@ -0,0 +1,37 @@
// Chomp additions to character load/save logic
// /datum/category_item/player_setup_item/general/body/content cannot be overridden here easily as the proc creates a list of html data
// perhaps one could get that list here, and sort through sections to rewrite it's content...? that seems inefficent having to loop through the list.
/datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character)
. = ..()
if(character.species.digi_allowed)
character.digitigrade = pref.digitigrade
else
character.digitigrade = 0
//sanity check
if(character.digitigrade == null)
character.digitigrade = 0
pref.digitigrade = 0
/datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["digitigrade"])
pref.digitigrade = !pref.digitigrade
return TOPIC_REFRESH_UPDATE_PREVIEW
. = ..()
// Savefile additions
// Be careful here
/datum/category_item/player_setup_item/general/body/load_character(var/savefile/S)
. = ..()
S["digitigrade"] >> pref.digitigrade //CHOMPEdit
/datum/category_item/player_setup_item/general/body/save_character(var/savefile/S)
. = ..()
S["digitigrade"] << pref.digitigrade //CHOMPEdit
/datum/category_item/player_setup_item/general/body/sanitize_character(var/savefile/S)
. = ..()
pref.digitigrade = sanitize_integer(pref.digitigrade, 0, 1, initial(pref.digitigrade))

View File

@@ -0,0 +1,2 @@
/datum/preferences
var/digitigrade = 0 // 0 = no digi, 1 = default, 2+ = digi styles... (Not used yet)

View File

@@ -0,0 +1,62 @@
//CHOMP Overrides for if holder is digitigrade
/obj/item/clothing
var/update_icon_define_orig = null // temp storage for original update_icon_define (if it exists)
var/fit_for_digi = FALSE // flag for if clothing has already been reskinned to digitigrade
/obj/item/clothing/proc/handle_digitigrade(var/mob/user)
if(ishuman(user))
var/mob/living/carbon/human/H = user
// if digitigrade-use flag is set
if(H.digitigrade)
// figure out what slot we care about
var/update_icon_define_digi = null
if(istype(src, /obj/item/clothing/shoes))
update_icon_define_digi = "icons/inventory/feet/mob_digi_ch.dmi"
else if(istype(src, /obj/item/clothing/suit)) //suit
update_icon_define_digi = "icons/inventory/suit/mob_digi_ch.dmi"
else if(istype(src, /obj/item/clothing/under)) //uniform
update_icon_define_digi = "icons/inventory/uniform/mob_digi_ch.dmi"
else
return
// Don't reset if already set
if(!fit_for_digi)
fit_for_digi = TRUE // set flag even if no icon_state exists, so we don't repeat checks
//if update_icon_define is already set to something, place it in a var to hold it temporarily
if(update_icon_define)
update_icon_define_orig = update_icon_define
// only override icon if a corresponding digitigrade replacement icon_state exists
// otherwise, keep the old non-digi icon_define (or nothing)
if(icon_state && icon_states(update_icon_define_digi).Find(icon_state))
update_icon_define = update_icon_define_digi
// if not-digitigrade, only act if the clothing was previously fit for a digitigrade char
else
if(fit_for_digi)
fit_for_digi = FALSE
//either reset update_icon_define to it's old value
// or reset update_icon_define to null
if(update_icon_define_orig)
update_icon_define = update_icon_define_orig
update_icon_define_orig = null
else
update_icon_define = null
/obj/item/clothing/shoes/equipped(var/mob/user, var/slot)
. = ..()
handle_digitigrade(user)
/obj/item/clothing/suit/equipped(var/mob/user, var/slot)
. = ..()
handle_digitigrade(user)
/obj/item/clothing/under/equipped(var/mob/user, var/slot)
. = ..()
handle_digitigrade(user)

View File

@@ -1,4 +1,5 @@
/mob/living/carbon/human
var/gender_change_cooldown = 0 // A cooldown for gender and gender indentify changing procs to make it easy to avoid spam of gender change
var/loneliness_stage = 0
var/next_loneliness_time = 0
var/next_loneliness_time = 0
var/digitigrade = 0 // 0 = no digi, 1 = default, 2+ = digi styles... (Not used yet)

View File

@@ -13,7 +13,9 @@
var/grab_power_self = 0
var/waking_speed = 1
var/mudking = FALSE
var/icodigi = 'icons/mob/human_races/r_digi_ch.dmi'
var/digi_allowed = FALSE
/datum/species/handle_environment_special(var/mob/living/carbon/human/H)
for(var/datum/trait/env_trait in env_traits)
env_trait.handle_environment_special(H)

View File

@@ -38,4 +38,35 @@
/datum/species/vox
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
*/
*/
//Can use digitigrade flags
/datum/species/custom
digi_allowed = TRUE
/datum/species/unathi
digi_allowed = TRUE
/datum/species/tajaran
digi_allowed = TRUE
/datum/species/hi_zoxxen
digi_allowed = TRUE
/datum/species/sergal
digi_allowed = TRUE
/datum/species/akula
digi_allowed = TRUE
/datum/species/nevrean
digi_allowed = TRUE
/datum/species/vulpkanin
digi_allowed = TRUE
/datum/species/xenohybrid
digi_allowed = TRUE
/datum/species/xenochimera
digi_allowed = TRUE

View File

@@ -293,6 +293,12 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(tail_style.clip_mask) //VOREStation Edit.
icon_key += tail_style.clip_mask_state
//ChompEDIT START
//icon_key addition for digitigrade switch
if(digitigrade && (part.organ_tag == BP_R_LEG || part.organ_tag == BP_L_LEG || part.organ_tag == BP_R_FOOT || part.organ_tag == BP_L_FOOT))
icon_key += "_digi"
//ChompEDIT END
icon_key = "[icon_key][husk ? 1 : 0][fat ? 1 : 0][hulk ? 1 : 0][skeleton ? 1 : 0]"
var/icon/base_icon
if(human_icon_cache[icon_key])

View File

@@ -0,0 +1,39 @@
// Expand shoe layer to allow changing the icon for digi legs
// For some reason, suit and uniform already has this funcitonality, but shoes do not.
#define SHOES_LAYER_ALT 7 //Shoe-slot item (when set to be under uniform via verb)
#define SHOES_LAYER 10 //Shoe-slot item
/mob/living/carbon/human/update_inv_shoes()
//. = ..()
remove_layer(SHOES_LAYER)
remove_layer(SHOES_LAYER_ALT) //Dumb alternate layer for shoes being under the uniform.
if(!shoes || (wear_suit && wear_suit.flags_inv & HIDESHOES) || (w_uniform && w_uniform.flags_inv & HIDESHOES))
return //Either nothing to draw, or it'd be hidden.
for(var/f in list(BP_L_FOOT, BP_R_FOOT))
var/obj/item/organ/external/foot/foot = get_organ(f)
if(istype(foot) && foot.is_hidden_by_tail()) //If either foot is hidden by the tail, don't render footwear.
return
var/obj/item/clothing/shoes/shoe = shoes
var/shoe_sprite
if(istype(shoe) && !isnull(shoe.update_icon_define))
shoe_sprite = shoe.update_icon_define
else
shoe_sprite = INV_FEET_DEF_ICON
//Allow for shoe layer toggle nonsense
var/shoe_layer = SHOES_LAYER
if(istype(shoes, /obj/item/clothing/shoes))
var/obj/item/clothing/shoes/ushoes = shoes
if(ushoes.shoes_under_pants == 1)
shoe_layer = SHOES_LAYER_ALT
//NB: the use of a var for the layer on this one
overlays_standing[shoe_layer] = shoes.make_worn_icon(body_type = species.get_bodytype(src), slot_name = slot_shoes_str, default_icon = shoe_sprite, default_layer = shoe_layer)
apply_layer(SHOES_LAYER)
apply_layer(SHOES_LAYER_ALT)

View File

@@ -0,0 +1,65 @@
// override the organ icon getting proc if digitigrade and not a synth
/obj/item/organ/external/get_icon(var/skeletal)
var/digitigrade = 0
// preferentially take digitigrade value from owner if available, THEN DNA.
// 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
else
digitigrade = dna.digitigrade
if( !model && digitigrade && ( istype(src,/obj/item/organ/external/leg) || istype(src,/obj/item/organ/external/foot) ) )
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
mob_icon = new /icon(species.icodigi, "[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"]]"
*/
dir = EAST
icon = mob_icon
return mob_icon
else
. = ..()

View File

@@ -0,0 +1,11 @@
/obj/machinery/clonepod/transhuman/growclone(var/datum/transhuman/body_record/current_project)
. = ..()
//Extra clonepod behavior
var/mob/living/carbon/human/H = occupant
var/datum/dna2/record/R = current_project.mydna
H.digitigrade = R.dna.digitigrade // ensure clone mob has digitigrade var set appropriately
if(H.dna.digitigrade <> R.dna.digitigrade)
H.dna.digitigrade = R.dna.digitigrade // ensure cloned DNA is set appropriately from record??? for some reason it doesn't get set right despite the override to datum/dna/Clone()
H.update_icons_body()

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 335 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 294 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 702 B

View File

@@ -607,6 +607,7 @@
#include "code\game\area\Space Station 13 areas_vr.dm"
#include "code\game\area\ss13_deprecated_areas.dm"
#include "code\game\dna\dna2.dm"
#include "code\game\dna\dna2_ch.dm"
#include "code\game\dna\dna2_domutcheck.dm"
#include "code\game\dna\dna2_helpers.dm"
#include "code\game\dna\dna_modifier.dm"
@@ -1945,6 +1946,7 @@
#include "code\modules\client\client procs_vr.dm"
#include "code\modules\client\movement.dm"
#include "code\modules\client\preferences.dm"
#include "code\modules\client\preferences_ch.dm"
#include "code\modules\client\preferences_factions.dm"
#include "code\modules\client\preferences_savefile.dm"
#include "code\modules\client\preferences_spawnpoints.dm"
@@ -1962,6 +1964,7 @@
#include "code\modules\client\preference_setup\general\01_basic.dm"
#include "code\modules\client\preference_setup\general\02_language.dm"
#include "code\modules\client\preference_setup\general\03_body.dm"
#include "code\modules\client\preference_setup\general\03_body_ch.dm"
#include "code\modules\client\preference_setup\general\04_equipment.dm"
#include "code\modules\client\preference_setup\general\05_background.dm"
#include "code\modules\client\preference_setup\general\06_flavor.dm"
@@ -2034,6 +2037,7 @@
#include "code\modules\clothing\chameleon.dm"
#include "code\modules\clothing\clothing.dm"
#include "code\modules\clothing\clothing_accessories.dm"
#include "code\modules\clothing\clothing_ch.dm"
#include "code\modules\clothing\clothing_icons.dm"
#include "code\modules\clothing\clothing_vr.dm"
#include "code\modules\clothing\ears\earrings.dm"
@@ -2947,6 +2951,7 @@
#include "code\modules\mob\living\carbon\human\stripping.dm"
#include "code\modules\mob\living\carbon\human\unarmed_attack.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\update_icons_ch.dm"
#include "code\modules\mob\living\carbon\human\ai_controlled\ai_controlled.dm"
#include "code\modules\mob\living\carbon\human\descriptors\_descriptors.dm"
#include "code\modules\mob\living\carbon\human\descriptors\descriptors_generic.dm"
@@ -3492,6 +3497,7 @@
#include "code\modules\organs\organ_external.dm"
#include "code\modules\organs\organ_external_vr.dm"
#include "code\modules\organs\organ_icon.dm"
#include "code\modules\organs\organ_icon_ch.dm"
#include "code\modules\organs\organ_stump.dm"
#include "code\modules\organs\pain.dm"
#include "code\modules\organs\robolimbs.dm"
@@ -3982,6 +3988,7 @@
#include "code\modules\resleeving\infomorph.dm"
#include "code\modules\resleeving\infomorph_software.dm"
#include "code\modules\resleeving\machines.dm"
#include "code\modules\resleeving\machines_ch.dm"
#include "code\modules\resleeving\machines_vr.dm"
#include "code\modules\resleeving\sleevecard.dm"
#include "code\modules\rogueminer_vr\asteroid.dm"