mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-11 10:43:20 +00:00
Merge pull request #2892 from Raeschen/digitigrade
Ports Digitigrade legs
This commit is contained in:
13
code/game/dna/dna2_ch.dm
Normal file
13
code/game/dna/dna2_ch.dm
Normal 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
|
||||
. = ..()
|
||||
@@ -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)
|
||||
|
||||
37
code/modules/client/preference_setup/general/03_body_ch.dm
Normal file
37
code/modules/client/preference_setup/general/03_body_ch.dm
Normal 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))
|
||||
2
code/modules/client/preferences_ch.dm
Normal file
2
code/modules/client/preferences_ch.dm
Normal file
@@ -0,0 +1,2 @@
|
||||
/datum/preferences
|
||||
var/digitigrade = 0 // 0 = no digi, 1 = default, 2+ = digi styles... (Not used yet)
|
||||
62
code/modules/clothing/clothing_ch.dm
Normal file
62
code/modules/clothing/clothing_ch.dm
Normal 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)
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
39
code/modules/mob/living/carbon/human/update_icons_ch.dm
Normal file
39
code/modules/mob/living/carbon/human/update_icons_ch.dm
Normal 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)
|
||||
65
code/modules/organs/organ_icon_ch.dm
Normal file
65
code/modules/organs/organ_icon_ch.dm
Normal 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
|
||||
. = ..()
|
||||
11
code/modules/resleeving/machines_ch.dm
Normal file
11
code/modules/resleeving/machines_ch.dm
Normal 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()
|
||||
BIN
icons/inventory/feet/mob_digi_ch.dmi
Normal file
BIN
icons/inventory/feet/mob_digi_ch.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
BIN
icons/inventory/suit/mob_digi_ch.dmi
Normal file
BIN
icons/inventory/suit/mob_digi_ch.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 335 KiB |
BIN
icons/inventory/uniform/mob_digi_ch.dmi
Normal file
BIN
icons/inventory/uniform/mob_digi_ch.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 294 KiB |
BIN
icons/mob/human_races/r_digi_ch.dmi
Normal file
BIN
icons/mob/human_races/r_digi_ch.dmi
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 702 B |
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user