From f0010d7f9d0256449187855cd3d72944e420cf51 Mon Sep 17 00:00:00 2001 From: Glyphee <77804365+Glyphee@users.noreply.github.com> Date: Tue, 3 Oct 2023 22:06:18 -0400 Subject: [PATCH 01/11] adds the bulk of the code --- code/__DEFINES/is_helpers.dm | 3 +- code/__DEFINES/mobs.dm | 3 +- code/__DEFINES/traits.dm | 7 +- code/__HELPERS/global_lists.dm | 4 + code/__HELPERS/mobs.dm | 13 ++- code/_globalvars/lists/flavor_misc.dm | 4 + code/datums/components/caltrop.dm | 4 + code/modules/mob/living/carbon/human/dummy.dm | 4 + code/modules/surgery/organs/tongue.dm | 1 + config/game_options.txt | 1 + .../preferences/species_features/satyr.dm | 67 +++++++++++ .../sprite_accessories/satyr_accessories.dm | 31 +++++ .../living/carbon/human/species_type/satyr.dm | 109 ++++++++++++++++++ .../organs/external/satyr_accessories.dm | 103 +++++++++++++++++ monkestation/icons/misc/language.dmi | Bin 4007 -> 3710 bytes .../icons/mob/species/satyr/bodyparts.dmi | Bin 0 -> 1432 bytes .../icons/mob/species/satyr/satyr_ears.dmi | Bin 0 -> 549 bytes .../icons/mob/species/satyr/satyr_fluff.dmi | 0 .../icons/mob/species/satyr/satyr_horns.dmi | Bin 0 -> 318 bytes .../icons/mob/species/satyr/satyr_tail.dmi | Bin 0 -> 296 bytes .../icons/obj/medical/organs/organs.dmi | Bin 36090 -> 34434 bytes tgstation.dme | 4 + 22 files changed, 353 insertions(+), 5 deletions(-) create mode 100644 monkestation/code/modules/client/preferences/species_features/satyr.dm create mode 100644 monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm create mode 100644 monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm create mode 100644 monkestation/code/modules/surgery/organs/external/satyr_accessories.dm create mode 100644 monkestation/icons/mob/species/satyr/bodyparts.dmi create mode 100644 monkestation/icons/mob/species/satyr/satyr_ears.dmi create mode 100644 monkestation/icons/mob/species/satyr/satyr_fluff.dmi create mode 100644 monkestation/icons/mob/species/satyr/satyr_horns.dmi create mode 100644 monkestation/icons/mob/species/satyr/satyr_tail.dmi diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 75b6e38c71c4..54583c34583b 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -95,7 +95,8 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list( #define isandroid(A) (is_species(A, /datum/species/android)) #define isnightmare(A) (is_species(A, /datum/species/shadow/nightmare)) #define isipc(A) (is_species(A, /datum/species/ipc)) -#define isgoblin(A) (is_species(A, /datum/species/goblin))//monkestation addition +#define isgoblin(A) (is_species(A, /datum/species/goblin))//Monkestation Addition +#define issatyr(A) (is_species(A, /datum/species/satyr))//Monkestation Addition //More carbon mobs diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index cf9cd2a5b467..2668d52d8da1 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -129,7 +129,8 @@ #define SPECIES_OOZELING "oozeling" #define SPECIES_IPC "ipc" #define SPECIES_SIMIAN "simian" -#define SPECIES_GOBLIN "goblin"//monkestation addition +#define SPECIES_GOBLIN "goblin"//Monkestation Addition +#define SPECIES_SATYR "satyr" //Monkestation Addition // Like species IDs, but not specifically attached a species. #define BODYPART_ID_ALIEN "alien" #define BODYPART_ID_ROBOTIC "robotic" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 91b5b6c2e323..990638aa251c 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -1175,10 +1175,13 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define GLUED_ITEM_TRAIT "glued-item" #define TRAIT_BELT_SATCHEL "belt_satchel" -//monkestation edit start +//Monkestation Addition Start /// One can breath under water, you get me? #define TRAIT_WATER_BREATHING "water_breathing" /// Do IPC's dream of doomsday? The answer is yes #define TRAIT_ROBOT_CAN_BLEED "robots_can_bleed" -//monkestation edit end + +/// No step on glass, stolen from Skyrat +#define TRAIT_HARD_SOLES "hard_soles" +//Monkestation Addition End diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 6eb8fe60fb93..432b8fead5d6 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -44,6 +44,10 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_appendages, GLOB.arachnid_appendages_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_chelicerae, GLOB.arachnid_chelicerae_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/goblin_ears, GLOB.goblin_ears_list) //Monkestation Addition + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_horns, GLOB.satyr_horns_list) //Monkestation Addition + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_ears, GLOB.satyr_ears_list) //Monkestation Addition + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_tail, GLOB.satyr_tail_list) //Monkestation Addition + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_fluff, GLOB.satyr_fluff_list) //Monkestation Addition //Species for(var/spath in subtypesof(/datum/species)) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index 63b2ea2e80b2..b01eb16b5dbb 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -110,6 +110,14 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/arachnid_chelicerae, GLOB.arachnid_chelicerae_list) if(!GLOB.goblin_ears_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/goblin_ears, GLOB.goblin_ears_list) + if(!GLOB.satyr_horns_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_horns, GLOB.satyr_horns_list) + if(!GLOB.satyr_ears_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_ears, GLOB.satyr_ears_list) + if(!GLOB.satyr_tail_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_tail, GLOB.satyr_tail_list) + if(!GLOB.satyr_tail_list.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_fluff, GLOB.satyr_fluff_list) //Monkestation Addition End //For now we will always return none for tail_human and ears. | "For now" he says. @@ -142,7 +150,10 @@ "arachnid_appendages" = pick(GLOB.arachnid_appendages_list), //Monkestation Addition "arachnid_chelicerae" = pick(GLOB.arachnid_chelicerae_list), //Monkestation Addition "animecolor" = "#[pick("7F","FF")][pick("7F","FF")][pick("7F","FF")]", //Monkestation Addition - "goblin_ears" = pick(GLOB.goblin_ears_list) //Monkestation Addition + "goblin_ears" = pick(GLOB.goblin_ears_list), //Monkestation Addition + "satyr_horns" = pick(GLOB.satyr_horns_list), //Monkestation Addition + "satyr_ears" = pick(GLOB.satyr_ears_list), //Monkestation Addition + "satyr_tail" = pick(GLOB.satyr_tail_list), //Monkestation Addition )) /proc/random_hairstyle(gender) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 15e107a01d2f..6c663c60f0b1 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -50,6 +50,10 @@ GLOBAL_LIST_EMPTY(anime_bottom_list) //Monkestation Addition GLOBAL_LIST_EMPTY(arachnid_appendages_list) //Monkestation Addition GLOBAL_LIST_EMPTY(arachnid_chelicerae_list) //Monkestation Addition GLOBAL_LIST_EMPTY(goblin_ears_list) //Monkestation Addition +GLOBAL_LIST_EMPTY(satyr_horns_list) //Monkestation Addition +GLOBAL_LIST_EMPTY(satyr_ears_list) //Monkestation Addition +GLOBAL_LIST_EMPTY(satyr_tail_list) //Monkestation Addition +GLOBAL_LIST_EMPTY(satyr_fluff_list) //Monkestation Addition GLOBAL_LIST_INIT(color_list_ethereal, list( "Blue" = "#3399ff", diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index dab062723a49..a8e5c430c709 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -97,6 +97,10 @@ return if (!(flags & CALTROP_BYPASS_SHOES)) + // Monkestation Addition Begin - Hardened Soles Quirk - Stolen from Skyrat + if(HAS_TRAIT(H, TRAIT_HARD_SOLES)) + return + // Monkestation Addition End if ((H.wear_suit?.body_parts_covered | H.w_uniform?.body_parts_covered | H.shoes?.body_parts_covered) & FEET) return diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 68b2694deca6..378eb8296494 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -109,6 +109,10 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features["arachnid_appendages"] = "Long" //Monkestation Addition target.dna.features["arachnid_chelicerae"] = "Basic" //Monkestation Addition target.dna.features["goblin_ears"] = "Normal" //Monkestation Addition + target.dna.features["satyr_horns"] = "Short" //Monkestation Addition + target.dna.features["satyr_ears"] = "Floppy" //Monkestation Addition + target.dna.features["satyr_tail"] = "Short" //Monkestation Addition + target.dna.features["satyr_fluff"] = "Normal" //Monkestation Addition /// Provides a dummy that is consistently bald, white, naked, etc. /mob/living/carbon/human/dummy/consistent diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm index 46e1dee98eb7..4fc46e5480a6 100644 --- a/code/modules/surgery/organs/tongue.dm +++ b/code/modules/surgery/organs/tongue.dm @@ -74,6 +74,7 @@ /datum/language/nekomimetic, /datum/language/ratvar, //Monkestation Edit /datum/language/goblin, //Monkestation Addition + /datum/language/satyr, //Monkestation Addition ) /obj/item/organ/internal/tongue/proc/handle_speech(datum/source, list/speech_args) diff --git a/config/game_options.txt b/config/game_options.txt index 95b7b3fd1f35..d6a2c78ccebf 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -355,6 +355,7 @@ ROUNDSTART_RACES arachnid ## Races that are better than humans in some ways, but worse in others ROUNDSTART_RACES ethereal ROUNDSTART_RACES goblin +ROUNDSTART_RACES satyr #ROUNDSTART_RACES jelly #ROUNDSTART_RACES abductor #ROUNDSTART_RACES synth diff --git a/monkestation/code/modules/client/preferences/species_features/satyr.dm b/monkestation/code/modules/client/preferences/species_features/satyr.dm new file mode 100644 index 000000000000..dcd0de740b28 --- /dev/null +++ b/monkestation/code/modules/client/preferences/species_features/satyr.dm @@ -0,0 +1,67 @@ +/datum/preference/choiced/satyr_horns + savefile_key = "feature_satyr_horns" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + main_feature_name = "Satyr Horns" + should_generate_icons = TRUE + +/datum/preference/choiced/satyr_horns/init_possible_values() + return possible_values_for_sprite_accessory_list_for_body_part( + GLOB.satyr_horns_list, + "satyr_horns", + list("ADJ", "FRONT"), + ) + +/datum/preference/choiced/satyr_horns/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["satyr_horns"] = value + +/datum/preference/choiced/satyr_ears + savefile_key = "feature_satyr_ears" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + main_feature_name = "Satyr Ears" + should_generate_icons = TRUE + +/datum/preference/choiced/satyr_ears/init_possible_values() + return possible_values_for_sprite_accessory_list_for_body_part( + GLOB.satyr_ears_list, + "satyr_ears", + list("ADJ", "FRONT"), + ) + +/datum/preference/choiced/satyr_ears/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["satyr_ears"] = value + +/datum/preference/choiced/satyr_tail + savefile_key = "feature_satyr_tail" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + main_feature_name = "Satyr Tail" + should_generate_icons = TRUE + +/datum/preference/choiced/satyr_tail/init_possible_values() + return possible_values_for_sprite_accessory_list_for_body_part( + GLOB.satyr_tail_list, + "satyr_tail", + list("ADJ", "FRONT"), + ) + +/datum/preference/choiced/satyr_tail/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["satyr_tail"] = value + +/datum/preference/choiced/satyr_fluff + savefile_key = "feature_satyr_fluff" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + main_feature_name = "Satyr Fluff" + should_generate_icons = TRUE + +/datum/preference/choiced/satyr_fluff/init_possible_values() + return possible_values_for_sprite_accessory_list_for_body_part( + GLOB.satyr_fluff_list, + "satyr_fluff", + "FRONT", + ) + +/datum/preference/choiced/satyr_fluff/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["satyr_fluff"] = value diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm new file mode 100644 index 000000000000..acb71aaaf456 --- /dev/null +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -0,0 +1,31 @@ +/datum/sprite_accessory/satyr_horns + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' + color_src = MUTCOLORS + +/datum/sprite_accessory/satyr_horns/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/satyr_ears + icon = 'monkestation/icons/mob/species/satyr/satyr_ears.dmi' + color_src = MUTCOLORS + +/datum/sprite_accessory/satyr_ears/short + name = "Floppy" + icon_state = "floppy" + +/datum/sprite_accessory/satyr_tail + icon = 'monkestation/icons/mob/species/satyr/satyr_tail.dmi' + color_src = MUTCOLORS + +/datum/sprite_accessory/satyr_tail/short + name = "Short" + icon_state = "short" + +/datum/sprite_accessory/satyr_fluff + icon = 'monkestation/icons/mob/species/satyr/satyr_fluff.dmi' + color_src = MUTCOLORS + +/datum/sprite_accessory/satyr_fluff/normal + name = "Normal" + icon_state = "normal" diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm new file mode 100644 index 000000000000..0396a75c0cd1 --- /dev/null +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -0,0 +1,109 @@ +/datum/species/satyr + name = "\improper Satyr" + plural_form = "Satyrs" + id = SPECIES_SATYR + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN + sexes = TRUE + species_traits = list( + MUTCOLORS, + EYECOLOR, + HAIR, + FACEHAIR, + SKINTONES + ) + inherent_traits = list( + TRAIT_NIGHT_VISION, + TRAIT_FREERUNNING, + TRAIT_ALCOHOL_TOLERANCE, + TRAIT_HARD_SOLES + ) + inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID + external_organs = list( + /obj/item/organ/external/satyr_horns = "short", + /obj/item/organ/external/satyr_ears = "floppy", + /obj/item/organ/external/satyr_tail = "short", + /obj/item/organ/external/satyr_fluff = "normal" + ) + meat = /obj/item/food/meat/steak + liked_food = MEAT | GROSS | VEGETABLES | FRUIT + species_language_holder = /datum/language_holder/satyr + maxhealthmod = 1 + stunmod = 1 + speedmod = 1 + payday_modifier = 1 + bodypart_overrides = list( + BODY_ZONE_HEAD = /obj/item/bodypart/head/satyr, + BODY_ZONE_CHEST = /obj/item/bodypart/chest/satyr, + BODY_ZONE_L_ARM = /obj/item/bodypart/arm/left/satyr, + BODY_ZONE_R_ARM = /obj/item/bodypart/arm/right/satyr, + BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/satyr, + BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/satyr, + ) + +/mob/living/carbon/human/species/satyr + race = /datum/species/satyr + +/datum/language_holder/satyr + understood_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/satyr = list(LANGUAGE_ATOM)) + spoken_languages = list(/datum/language/common = list(LANGUAGE_ATOM), + /datum/language/satyr = list(LANGUAGE_ATOM)) + +/datum/language/satyr + name = "Gotin" + desc = "The language of the satyrs, very similar to an old Terran language called latin." + space_chance = 50 + key = "S" + + syllables = list("beh, bah, buh, be, ba, bu, baa") + + default_priority = 90 + icon_state = "satyr" + icon = 'monkestation/icons/misc/language.dmi' + +/datum/species/satyr/get_species_description() + return "Goat-like humanoids, seemingly identical to the once in ancient Greek mythology." + +/datum/species/satyr/create_pref_unique_perks() + var/list/to_add = list() + + to_add += list( + list( + SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, + SPECIES_PERK_ICON = "", + SPECIES_PERK_NAME = "", + SPECIES_PERK_DESC = "", + ) + ) + + return to_add + +/obj/item/bodypart/head/satyr + icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' + limb_id = SPECIES_SATYR + is_dimorphic = TRUE + +/obj/item/bodypart/chest/satyr + icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' + limb_id = SPECIES_SATYR + is_dimorphic = TRUE + +/obj/item/bodypart/arm/left/satyr + icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' + limb_id = SPECIES_SATYR + +/obj/item/bodypart/arm/right/satyr + icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' + limb_id = SPECIES_SATYR + +/obj/item/bodypart/leg/left/satyr + icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' + limb_id = SPECIES_SATYR + +/obj/item/bodypart/leg/right/satyr + icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' + limb_id = SPECIES_SATYR + +/datum/quirk/hard_soles //Stolen from Skyrat + name = "Hardened Soles" + mob_trait = TRAIT_HARD_SOLES diff --git a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm new file mode 100644 index 000000000000..1a703469881f --- /dev/null +++ b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm @@ -0,0 +1,103 @@ +/obj/item/organ/external/satyr_horns + name = "satyr horns" + desc = "Some pointy goat-like horns." + icon_state = "satyr_horns" + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + + preference = "feature_satyr_horns" + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_HORNS + + use_mob_sprite_as_obj_sprite = TRUE + bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_horns + +/datum/bodypart_overlay/mutant/satyr_horns + layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT + feature_key = "satyr_horns" + +/datum/bodypart_overlay/mutant/satyr_horns/get_global_feature_list() + return GLOB.satyr_horns_list + +/datum/bodypart_overlay/mutant/satyr_horns/get_base_icon_state() + return sprite_datum.icon_state + +/datum/bodypart_overlay/mutant/satyr_horns/can_draw_on_bodypart(mob/living/carbon/human/human) + return TRUE + +/obj/item/organ/external/satyr_ears + name = "satyr ears" + desc = "Some floppy goat-like ears." + icon_state = "satyr_ears" + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + + preference = "feature_satyr_ears" + zone = BODY_ZONE_HEAD + slot = ORGAN_SLOT_EXTERNAL_FRILLS + + use_mob_sprite_as_obj_sprite = TRUE + bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_ears + +/datum/bodypart_overlay/mutant/satyr_ears + layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT + feature_key = "satyr_ears" + +/datum/bodypart_overlay/mutant/satyr_ears/get_global_feature_list() + return GLOB.satyr_ears_list + +/datum/bodypart_overlay/mutant/satyr_ears/get_base_icon_state() + return sprite_datum.icon_state + +/datum/bodypart_overlay/mutant/satyr_ears/can_draw_on_bodypart(mob/living/carbon/human/human) + return TRUE + +/obj/item/organ/external/satyr_tail + name = "satyr tail" + desc = "A short and stubby goat tail." + icon_state = "satyr_tail" + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + + preference = "feature_satyr_tail" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_EXTERNAL_TAIL + + use_mob_sprite_as_obj_sprite = TRUE + bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_tail + +/datum/bodypart_overlay/mutant/satyr_tail + layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT + feature_key = "satyr_tail" + +/datum/bodypart_overlay/mutant/satyr_tail/get_global_feature_list() + return GLOB.satyr_tail_list + +/datum/bodypart_overlay/mutant/satyr_tail/get_base_icon_state() + return sprite_datum.icon_state + +/datum/bodypart_overlay/mutant/satyr_tail/can_draw_on_bodypart(mob/living/carbon/human/human) + return TRUE + +/obj/item/organ/external/satyr_fluff + name = "satyr fluff" + desc = "You shouldn't see this" + icon_state = "satyr_fluff" + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + + preference = "feature_satyr_fluff" + zone = BODY_ZONE_CHEST + slot = ORGAN_SLOT_EXTERNAL_TAIL + + use_mob_sprite_as_obj_sprite = TRUE + bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_fluff + +/datum/bodypart_overlay/mutant/satyr_fluff + layers = EXTERNAL_FRONT + feature_key = "satyr_fluff" + +/datum/bodypart_overlay/mutant/satyr_fluff/get_global_feature_list() + return GLOB.satyr_fluff_list + +/datum/bodypart_overlay/mutant/satyr_fluff/get_base_icon_state() + return sprite_datum.icon_state + +/datum/bodypart_overlay/mutant/satyr_fluff/can_draw_on_bodypart(mob/living/carbon/human/human) + return TRUE diff --git a/monkestation/icons/misc/language.dmi b/monkestation/icons/misc/language.dmi index 8b28a744054bbb116915cd996bb4b5b63c5022ba..b713ebff7cf3c1b1257d3db2beb19f3dfd491682 100644 GIT binary patch literal 3710 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 literal 4007 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 N002ovPDHLkV1hdEydeMp diff --git a/monkestation/icons/mob/species/satyr/bodyparts.dmi b/monkestation/icons/mob/species/satyr/bodyparts.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a35343adb11db8af2d3616c9bcba276b18909d47 GIT binary patch literal 1432 zcmV;J1!ww+P)e<}9jEdpM%gg`(z`(!@JUU?j0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5sW`EuvM4?yH8CYVSBZ-=C9|j)q?d~`ttc@!6~s2gsyK~E#mO0| z#U(@=4N*<3*+ub*MZ}t%LxNhM7ZdYRh&Gr6#X#k$=|mfhN3F7gtDg%v!U2zlmf1iV z=f?m51c6CJK~#90?VQ1Pn>Y~0QC@*-j48e*GIg&T=xWfI7RCoK(RdW2c zMZV+AMaiPNpC77QC!b*$ zhG7_nVSWy%f9o3R_d19Az0M(iuXCv1>mKU&I*0nb&LMtJgxR`>;_(>WHx+)dGM^G8 zI)(R1pb~uF1WASkGqi3}nNN9C1&e(=EE3cO=rJyK9IrS48m!8%6qLh6Ns!BNr7dOkYFGvuVI}Z{qwpHcZf?CG# z$>UD-6g`PnI>myq9yQ6g1k+22613JRA=D{)_TI;63M%t$L5UO6SmL!c(!eLJzo7aR z`4mx{5_FNskwkwli!R?Ci7WGM!7#*E<)wsiabLuE?JR|NMUlT=AI-Oz-p?l}j-p9< z%>((14CkLW%V!vdVHoE3AWUCZFG@0eAREFx+)^LX)G{N-s+63-!Z#B7J@H3b15MXi z;4;Z~KS}Ku@OMF}pxpP!yQm=uEpU}!>DdEEy*fL*0TR5TZm7Q(6y+-%;8od^H3Z?S zwU@;B*BYXi4qpVlxU_*cd%q;=j1bf>9IC_?{7g#SrJ%EpQ*_Y_>Y)jY2wRgFrEfUO6 z`@xE^SB*YzVB{NfQbFHXQ)bYilMBwMpl_bwp^e?6R&2F305iiQJh9-j)!yJ1jqrJJ zQo%uPwTI`>4=v@TypUH_XmT#nc(M=Ioy8%;>o`zqQUeeG0000 zYESRwI%FWicER$yrroXBKQCuFdQRo&Rd}a(;R?$d-S2Em^WQ&M^H|ca*SUHV-?GhL zx^yb5oEAr}_1s$=FJw{{9i;iJS}WdzQ`Kp))ZUg&8~PiM^7m)X6R+PBcW15A)pW58 zlO=3?$s!p!|IY8V{9k1nm7ZYbEr0!|@yWO)OAawGFot@%IEGZrd3(pu@34b_!$paU zjt6@mE&lCh@+Cm=qJmI%SiI7E*@SDa<-Ikp-Rpb2<3i;s{RbC01%wsU4$O`F{<0%ynJl2?PTTo$%o~Rrm*-s_%zI5Fl0<(I>OQc)zopr0Ofntk^lez literal 0 HcmV?d00001 diff --git a/monkestation/icons/mob/species/satyr/satyr_fluff.dmi b/monkestation/icons/mob/species/satyr/satyr_fluff.dmi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/monkestation/icons/mob/species/satyr/satyr_horns.dmi b/monkestation/icons/mob/species/satyr/satyr_horns.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a309939214ff260d5d008d3f09e61802bcfe8c33 GIT binary patch literal 318 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 literal 36090 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 I>zopr0KZa) Date: Tue, 3 Oct 2023 22:11:08 -0400 Subject: [PATCH 02/11] HU; --- .../code/modules/surgery/organs/external/satyr_accessories.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm index 1a703469881f..9f3a3a1c2dfb 100644 --- a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm +++ b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm @@ -85,6 +85,7 @@ preference = "feature_satyr_fluff" zone = BODY_ZONE_CHEST slot = ORGAN_SLOT_EXTERNAL_TAIL + organ_flags = ORGAN_UNREMOVABLE use_mob_sprite_as_obj_sprite = TRUE bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_fluff From 11e2ec38359b2cd4d4088981de9e53dfb4517fe0 Mon Sep 17 00:00:00 2001 From: Glyphee Date: Tue, 3 Oct 2023 22:59:33 -0400 Subject: [PATCH 03/11] sprites in! --- .../preferences/species_features/satyr.dm | 2 +- .../sprite_accessories/satyr_accessories.dm | 24 +++++++++++++++--- .../living/carbon/human/species_type/satyr.dm | 4 +-- .../icons/mob/species/satyr/bodyparts.dmi | Bin 1432 -> 1405 bytes .../icons/mob/species/satyr/satyr_ears.dmi | Bin 549 -> 1181 bytes .../icons/mob/species/satyr/satyr_fluff.dmi | Bin 0 -> 434 bytes .../icons/mob/species/satyr/satyr_horns.dmi | Bin 318 -> 512 bytes .../icons/mob/species/satyr/satyr_tail.dmi | Bin 296 -> 318 bytes 8 files changed, 23 insertions(+), 7 deletions(-) diff --git a/monkestation/code/modules/client/preferences/species_features/satyr.dm b/monkestation/code/modules/client/preferences/species_features/satyr.dm index dcd0de740b28..7f3c4e4616d2 100644 --- a/monkestation/code/modules/client/preferences/species_features/satyr.dm +++ b/monkestation/code/modules/client/preferences/species_features/satyr.dm @@ -9,7 +9,7 @@ return possible_values_for_sprite_accessory_list_for_body_part( GLOB.satyr_horns_list, "satyr_horns", - list("ADJ", "FRONT"), + "FRONT", ) /datum/preference/choiced/satyr_horns/apply_to_human(mob/living/carbon/human/target, value) diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm index acb71aaaf456..06f8e97ff2b6 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -2,18 +2,34 @@ icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' color_src = MUTCOLORS -/datum/sprite_accessory/satyr_horns/short - name = "Short" - icon_state = "short" +/datum/sprite_accessory/satyr_horns/tall + name = "Tall" + icon_state = "tall" + +/datum/sprite_accessory/satyr_horns/thick + name = "Thick" + icon_state = "thick" + +/datum/sprite_accessory/satyr_horns/back + name = "Back" + icon_state = "back" /datum/sprite_accessory/satyr_ears icon = 'monkestation/icons/mob/species/satyr/satyr_ears.dmi' color_src = MUTCOLORS -/datum/sprite_accessory/satyr_ears/short +/datum/sprite_accessory/satyr_ears/floppy name = "Floppy" icon_state = "floppy" +/datum/sprite_accessory/satyr_ears/flat + name = "Flat" + icon_state = "flat" + +/datum/sprite_accessory/satyr_ears/pointy + name = "Pointy" + icon_state = "pointy" + /datum/sprite_accessory/satyr_tail icon = 'monkestation/icons/mob/species/satyr/satyr_tail.dmi' color_src = MUTCOLORS diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm index 0396a75c0cd1..c640190f8cef 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -19,8 +19,8 @@ ) inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID external_organs = list( - /obj/item/organ/external/satyr_horns = "short", - /obj/item/organ/external/satyr_ears = "floppy", + /obj/item/organ/external/satyr_horns = "tall", + /obj/item/organ/external/satyr_ears = "flat", /obj/item/organ/external/satyr_tail = "short", /obj/item/organ/external/satyr_fluff = "normal" ) diff --git a/monkestation/icons/mob/species/satyr/bodyparts.dmi b/monkestation/icons/mob/species/satyr/bodyparts.dmi index a35343adb11db8af2d3616c9bcba276b18909d47..76cb52a4c803992d4380f9559ebcd5d03106d020 100644 GIT binary patch delta 1202 zcmV;j1Wo&x3;ha^Br_^dOjJd{z`)wHvia`v|NsB$+1$L0is8r0)YR1S^76K}w%pv@ z9v&ViCnvzbz$QHozmZ6~e^*IFK~#90?VG)F+eQ>d7a9{9St&#iMlCJZtRpPrT7uTB zEyu%}lxWoH?C1sTs7jZND|J!e6s|27uI-l!GMR|?+g$?05a1-4d%C;Wiw{2}t+RlI zU^=3IP*eA7>W2Nn@Ca*tY;D&ExIM+XVZVr_f`M3%p^mhEOzY=be?vmk{+;OZB7%A- zX)Oj?&S{-UIEBXj!G%ueP)nR}ekS#^W!ckm{Ah!IA*Q1d))MO%@fqBd!T9v)CjFu( zA7ibs4vfKjXbjw=rv0@9aRx`+Q>O>3=6Z>o7DE( zTLSPkh6%F2F+q@4eR9C0F*9FaQA z+(1PF>iQkRL8=p48>J?+E`KL*Rb!wf2@H?ZV|qY#ze8Zof6OV=^99tIG2hXK?~Q@A zulzEf(d}jbNmXD^N?3U5<$3-R0&%-|E@82)uHOwbQqf`jGxLQe+fUfp;QnkGWxA3`xlGKeuv5V^aSc8Iq}b2(Lc+v|Dahv!!QiPF#iwY zY`b|$n&Ut|q|b1@9@12q!C1AHCv@WjNqsN)*0+PE>nwDcUyiiOJHLl>#6Qjs?$Fs|=)x-=Cm3S;eS>jJPFy16*^`G zs`frve_Ic1O6Y%_n-Jl=z{iul%>sjo*LNQg;fqm)g3SVZx&I8wSxs9#LvijM4d{PY z;1}f?hG7_nVHk$l7WaM^`rQ*9Z94MJX~gs&zYCtO@!USCez|cS?)`3s|5;~P`3mk@ zEd9>!f2(HyE7^Vf=I1u|w|DF8?$_U8!u2n0f991ZaAObMzM<8_x39Jx_(Q9Kd$(>N zT+)Zvt=>YhS2!nd1%bOo+krRsP=ROIa^T0}vpw{s_&};}iuY~i?SK8v8QXpTm6lhZ zJ~&f03H0pk4g&XE4P+RGVHk#C{u}JQZfYyw{S)Fx*AT0DeQgbZZn-*! zbT%f$D_7XM4fGgdHSe52yrfQ`bxA#jSQBXL2>6}re^+*(Ylt<0g*8xM;7!$L?~H2p zi$AOp@H^N4Q2)G!Sjnf4_7$Oi=kY&F|9pm69eC#q-O)f-?kxTD8KRdz0mQ5T@}$t0 QyZ`_I07*qoM6N<$f*G1}wEzGB delta 1230 zcmV;<1Tp*l3YZI!BqSS9OjJd{z`)wHvia`v|NsB$+1$L0is8r0%m4tuz`zSUI$@Dl zx_^O5L_t(|ob8;!cbhm6#!+5@Ym6zrCNg!e8|3X?9irIRB<;Fa+i}UYW@GE$FMWL* z&y28vhsn0x`P~L-^hpQ^pJd`VOh@$2E8<>7+%R7ZFLA7{NVz)4i0T_`n}E}eoutix`*QN7~MA&ez7v25`QE* zh4)FI5`5nTNrnY8v~E(FPkB@Yi+wyS64V9gF)nr-uQ&i2tjezxl*2?xkl+oK`alwr z1qzSmTSP_u51_}9jO7T#UTO=*K%gq$!s{n0g0YU{DU6Hf1YXtXD+vU>tKBNr7dOkYFGvuVI}Z{qwpHcZf?CG# z$>UD-6g`PnI>myq9yQ6g1k+22613JRA=D{)_TI;63M%t$L5UO6SmL!c(!eLJzo7aR z`4mx{5_FNskwkwli!R?Ci7WGM!7#*E<)wsiabLuE?JR|NMUlT=AI-Oz-ha<0D2}2@ zdCdd)iwx(VH_K-jhG7`y_aIDPS1(F3d>|XbJ={_s($q2|$EuW^z`{2Y`aSVSSp!Yi zS>Q6scRxw(7w~sMsi55V$h)W^2rY1xVCmTdN4+{bya5utqHd_a7Zl|y9N<;ilQjh4 ztF@QJ_}3bumkwV9y|}c2H-CG-BcaiOmK^YZL=f$SwBvvsBZBeiuB=xVY>HRDof`qexx(9%Zht#LF)j7GZ-L

PjG9o_jl#~?@;Yh{I6}h(-5NPy^m{bOV`J>ce$f2 z63kEg!HTd~jXrN+4=v z@T~(AVlhXyUv&>qE<(UCz6^?PHBKRthZ?JYvf-YgR+9*QbSF-pQ8eZFwvy7w6X*TpK90 zDe%wRAilx|hpjh@zH#bSa>#s}Qz<@gUY+t}Rrbb3<~J`*>DjC~`<>|VLZj!ueeJo< z-I`#;qIGUpO7(Qb4YQ}aSH`~5S^GLNDo#3CBID}*{c|*@t=QUQ9Nx^ zRxNUFS2z*E8!0=dn5_#1q&-LUkWE)$IHo;&bUy`+wG~2_R@U%?bj-s66byG4?muK0Ax=II@MmD ze|kmcHo1pMR+0a{eAefmxBc6WQf7IV>(TXz<%;`CYu~N?`?&i5lb6lUYrp+`Tx2&p z^u1$)OC`6OSAz@Z1Pw+ZRfx|zg%kprREQT`Rork}?)=fj*CGk>k9S(+TxI-bIBw2ymF)I?!I-a+ykLit`eLn5~ zzejz(hqBxc_0CHBy7#;Pyt>bFx3kype7FAl2Z?L%qraA{x%}~>)}j6P?!0+&bnW|( z*X{q`xb^SW=WBB|pWe9j7Dsm6XT9U^m_RPHCoK?gy0D;s%jNZDk=Jdx3eLYNYMK4U zx1svkn@2_J$}v9br#E+>KDS@}fNgPgZK&DKi?!Cfcj#=t9zK_S`Ye8rDe4rs;fldt z#!ctWpI`jCnh6rKA)yVi%MEj@tAeX)e+B<#S+jR#?cG0LetlVNbzs)clG*1vRvTu` zTJ_c4_ws3=pwv>k#6xek)7`o(Tw;jg{qXpJkdykYQk^>bP0l+XkK!PEU4 literal 549 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGo-BlqGB`&GO$wiq3C7Jno3=9=> zYESRwI%FWicER$yrroXBKQCuFdQRo&Rd}a(;R?$d-S2Em^WQ&M^H|ca*SUHV-?GhL zx^yb5oEAr}_1s$=FJw{{9i;iJS}WdzQ`Kp))ZUg&8~PiM^7m)X6R+PBcW15A)pW58 zlO=3?$s!p!|IY8V{9k1nm7ZYbEr0!|@yWO)OAawGFot@%IEGZrd3(pu@34b_!$paU zjt6@mE&lCh@+Cm=qJmI%SiI7E*@SDa<-Ikp-Rpb2<3i;s{RbC01%wsU4$O`F{<0%ynJl2?PTTo$%o~Rrm*-s_%zI5Fl0<(I>OQc)zopr0Ofntk^lez diff --git a/monkestation/icons/mob/species/satyr/satyr_fluff.dmi b/monkestation/icons/mob/species/satyr/satyr_fluff.dmi index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2666c85375104e69aa3d2faae1d8a98fda135824 100644 GIT binary patch literal 434 zcmV;j0ZsmiP)1T<@THFYG5le@n8#C zSbJA`k+a9hcllt$Ec;|SR~=>He0!dv2cwS))E4d_a|od)008)tUVxb13#x6!A}05O z4D&_AZr`=4nA-TDX7&d#*cmwZ<2M@R%-5O@iV z0{wvl(rz<|>lt6)f0upFJ!J;dUD4cHcJ0|AXFH)Z!px`7H+j0aKxfyGMv&g-L6_Af zUAzXx4@`!ba`Us_@nsS;g})Jw<2a7<9%Q-q9O-P^WDt!$`#wNtwTMn(d-|4M9*1T0 z^#$7e`$qxY>{7|`o;r@>IF3^gAbRYT6qXUEfil9N!T4y(UnOLu3KFMy4CGOx@vtqx zZ-_%KsjJ_CfxWhboVEPdwVh*Ab0V+gn_ju6cG!2`k4I;uPJJ|W=do*5794+QN^K7+ fMIFa+oDcI0s!bSkNA0o@00000NkvXXu0mjf^vt+E delta 242 zcmZo**~b*n8Q|y6%O%Cdz`(%k>ERLtq!U1xg&9Z+Y|G*XQbGYfA+84w95})WdvIT;jq zTmqH(7D!t(?f731)zLajDR#ntg+}dlzD^&U*R&?-rerfRJm~!yd7|*o>$vwdwcU2= kX14K{q;#1jfky3@Wb9;|yZ@*i50Jy)>FVdQ&MBb@0LSQE)&Kwi diff --git a/monkestation/icons/mob/species/satyr/satyr_tail.dmi b/monkestation/icons/mob/species/satyr/satyr_tail.dmi index 9390fdc5603ed7870b69f5751811606630965fbb..5a0a9e59a7ef69cf29e11bdcbefdaf84bef9d566 100644 GIT binary patch delta 145 zcmZ3%w2x_mgbE8Y0|SG=wk&QS#UJ1k;(Fk~foH51JiB>8%} zIEF;DzP+}WlR<%}<>HP;d*Ke@7yk}N-f;Wib@KbEW^WI1V+KK$tpS@OGO`@+DclE| x$lww(@36A2zU=q Date: Tue, 3 Oct 2023 23:25:50 -0400 Subject: [PATCH 04/11] still have issues :C --- .../preferences/species_features/satyr.dm | 2 +- .../sprite_accessories/satyr_accessories.dm | 8 ++++---- .../living/carbon/human/species_type/satyr.dm | 17 +++++++++-------- .../icons/mob/species/satyr/satyr_fluff.dmi | Bin 434 -> 437 bytes 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/monkestation/code/modules/client/preferences/species_features/satyr.dm b/monkestation/code/modules/client/preferences/species_features/satyr.dm index 7f3c4e4616d2..8b99cdf0e191 100644 --- a/monkestation/code/modules/client/preferences/species_features/satyr.dm +++ b/monkestation/code/modules/client/preferences/species_features/satyr.dm @@ -60,7 +60,7 @@ return possible_values_for_sprite_accessory_list_for_body_part( GLOB.satyr_fluff_list, "satyr_fluff", - "FRONT", + list("ADJ", "FRONT"), ) /datum/preference/choiced/satyr_fluff/apply_to_human(mob/living/carbon/human/target, value) diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm index 06f8e97ff2b6..24faa680d681 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -1,6 +1,6 @@ /datum/sprite_accessory/satyr_horns icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' - color_src = MUTCOLORS + color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_horns/tall name = "Tall" @@ -16,7 +16,7 @@ /datum/sprite_accessory/satyr_ears icon = 'monkestation/icons/mob/species/satyr/satyr_ears.dmi' - color_src = MUTCOLORS + color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_ears/floppy name = "Floppy" @@ -32,7 +32,7 @@ /datum/sprite_accessory/satyr_tail icon = 'monkestation/icons/mob/species/satyr/satyr_tail.dmi' - color_src = MUTCOLORS + color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_tail/short name = "Short" @@ -40,7 +40,7 @@ /datum/sprite_accessory/satyr_fluff icon = 'monkestation/icons/mob/species/satyr/satyr_fluff.dmi' - color_src = MUTCOLORS + color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_fluff/normal name = "Normal" diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm index c640190f8cef..efcdf3b03991 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -4,12 +4,12 @@ id = SPECIES_SATYR changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN sexes = TRUE + use_skintones = TRUE species_traits = list( - MUTCOLORS, + MUTCOLORS_SECONDARY, EYECOLOR, HAIR, - FACEHAIR, - SKINTONES + FACEHAIR ) inherent_traits = list( TRAIT_NIGHT_VISION, @@ -25,10 +25,11 @@ /obj/item/organ/external/satyr_fluff = "normal" ) meat = /obj/item/food/meat/steak - liked_food = MEAT | GROSS | VEGETABLES | FRUIT + liked_food = GROSS | VEGETABLES | FRUIT + disliked_food = MEAT | DAIRY species_language_holder = /datum/language_holder/satyr - maxhealthmod = 1 - stunmod = 1 + maxhealthmod = 0.8 + stunmod = 1.2 speedmod = 1 payday_modifier = 1 bodypart_overrides = list( @@ -53,9 +54,9 @@ name = "Gotin" desc = "The language of the satyrs, very similar to an old Terran language called latin." space_chance = 50 - key = "S" + key = "u" - syllables = list("beh, bah, buh, be, ba, bu, baa") + syllables = list("beh, bah, buh, be, ba, bu, baa, ac, do, addo, hae, haec, hau, hos, deu, lea, leu, leo, immo, imno, viso, visa, itio, io, tio") default_priority = 90 icon_state = "satyr" diff --git a/monkestation/icons/mob/species/satyr/satyr_fluff.dmi b/monkestation/icons/mob/species/satyr/satyr_fluff.dmi index 2666c85375104e69aa3d2faae1d8a98fda135824..8a00a946737f7d787eb3ee0f1fe4ff9dd984e101 100644 GIT binary patch delta 326 zcmdnQyp=h)Gr-TCmrII^fq{Y7)59eQNH>5m3p0>36sY+Dq(lRJLR=3VIB@6Aoo(B; zJ$(4^%9SghK7IQ3?c1SQysv=@7)yfuf*Bm1-ADs+`X+`|*6#~jv(0K(#l&=Vx!zM; z>+19#G%zw`R!0`=^17A)6>af!aSX|5e0yypUz33d>xHPo{DpV9+wMl(^vs&$`l;@K z#{d7EePPiTw?DGIt-9X4C!B+!VQIAH*d}CURj&Fi#Zmiivn%ZxfB16`Rg|Rsy9F%HCS5B1T<@THFYG5le@n8#CSbJA`k+a9h zcllt$Ec;|SR~=>He0!dv2cwS))MOU!Aae+zCjbEWlU{(B-V3U2#Udv6f(-LT#N=L( z@tyoYaxW&@T Date: Wed, 4 Oct 2023 12:35:53 -0400 Subject: [PATCH 05/11] fixed the leg sprites --- .../preferences/species_features/satyr.dm | 10 +++++++++- .../organs/external/satyr_accessories.dm | 12 ++++++++++-- .../icons/mob/species/satyr/bodyparts.dmi | Bin 1405 -> 1444 bytes .../icons/mob/species/satyr/satyr_fluff.dmi | Bin 437 -> 996 bytes 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/monkestation/code/modules/client/preferences/species_features/satyr.dm b/monkestation/code/modules/client/preferences/species_features/satyr.dm index 8b99cdf0e191..f70f777af573 100644 --- a/monkestation/code/modules/client/preferences/species_features/satyr.dm +++ b/monkestation/code/modules/client/preferences/species_features/satyr.dm @@ -1,3 +1,5 @@ +/// Satyr Horns /// + /datum/preference/choiced/satyr_horns savefile_key = "feature_satyr_horns" savefile_identifier = PREFERENCE_CHARACTER @@ -15,6 +17,8 @@ /datum/preference/choiced/satyr_horns/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["satyr_horns"] = value +/// Satyr Ears /// + /datum/preference/choiced/satyr_ears savefile_key = "feature_satyr_ears" savefile_identifier = PREFERENCE_CHARACTER @@ -32,6 +36,8 @@ /datum/preference/choiced/satyr_ears/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["satyr_ears"] = value +/// Satyr Tail /// + /datum/preference/choiced/satyr_tail savefile_key = "feature_satyr_tail" savefile_identifier = PREFERENCE_CHARACTER @@ -49,6 +55,8 @@ /datum/preference/choiced/satyr_tail/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["satyr_tail"] = value +/// Satyr Fluff /// + /datum/preference/choiced/satyr_fluff savefile_key = "feature_satyr_fluff" savefile_identifier = PREFERENCE_CHARACTER @@ -60,7 +68,7 @@ return possible_values_for_sprite_accessory_list_for_body_part( GLOB.satyr_fluff_list, "satyr_fluff", - list("ADJ", "FRONT"), + "FRONT", ) /datum/preference/choiced/satyr_fluff/apply_to_human(mob/living/carbon/human/target, value) diff --git a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm index 9f3a3a1c2dfb..4839b06fdc44 100644 --- a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm +++ b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm @@ -1,3 +1,5 @@ +/// Satyr Horns /// + /obj/item/organ/external/satyr_horns name = "satyr horns" desc = "Some pointy goat-like horns." @@ -12,7 +14,7 @@ bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_horns /datum/bodypart_overlay/mutant/satyr_horns - layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT + layers = EXTERNAL_FRONT feature_key = "satyr_horns" /datum/bodypart_overlay/mutant/satyr_horns/get_global_feature_list() @@ -24,6 +26,8 @@ /datum/bodypart_overlay/mutant/satyr_horns/can_draw_on_bodypart(mob/living/carbon/human/human) return TRUE +/// Satyr Ears /// + /obj/item/organ/external/satyr_ears name = "satyr ears" desc = "Some floppy goat-like ears." @@ -50,6 +54,8 @@ /datum/bodypart_overlay/mutant/satyr_ears/can_draw_on_bodypart(mob/living/carbon/human/human) return TRUE +/// Satyr Tail /// + /obj/item/organ/external/satyr_tail name = "satyr tail" desc = "A short and stubby goat tail." @@ -57,7 +63,7 @@ icon = 'monkestation/icons/obj/medical/organs/organs.dmi' preference = "feature_satyr_tail" - zone = BODY_ZONE_CHEST + zone = BODY_ZONE_PRECISE_GROIN slot = ORGAN_SLOT_EXTERNAL_TAIL use_mob_sprite_as_obj_sprite = TRUE @@ -76,6 +82,8 @@ /datum/bodypart_overlay/mutant/satyr_tail/can_draw_on_bodypart(mob/living/carbon/human/human) return TRUE +/// Satyr Fluff /// + /obj/item/organ/external/satyr_fluff name = "satyr fluff" desc = "You shouldn't see this" diff --git a/monkestation/icons/mob/species/satyr/bodyparts.dmi b/monkestation/icons/mob/species/satyr/bodyparts.dmi index 76cb52a4c803992d4380f9559ebcd5d03106d020..eff9ce0a3a2d8260969c1dbddec9b42424664951 100644 GIT binary patch delta 1242 zcmV<01SR|Z3Zx5=Bq||LOjJd{z`)wHvia`v|NsB$+1$L0is8r0CnqNZ1PC4;9>BoB z1Kl1jkypBZhe$tB%@lU8P-?b zq;!!;DohlW%yAx^Y@P2=}kgFZmcOd&X5RJwS8SmA*C zTczLa!dR>2t0VHGXtP*gtT6tV-olqMTi(1qCO?YRYm9S@g)#UY8Ux=^XnrpuE#Zvg z{N`fcSTAWAHlAS^hG7_nVNQbW-^RxFd!u9fz0tA!-ssqVZ+vXOH#)Z88y%6~K$tf5 z6yoK7a*6{w{bFyvO;VVW{!S8I;O{0W8We1xZql1?^Qc?4yLjFv=u2|O*d0Z(Z6F8i z%kLFb^Fk|`Yu@Z_cgq`^gSv&p>Ipa*_YC&RIx`H_o=*xGIvqEPyHhI3LaeJM> zs>Vz!A}FtmYkERivbwf8=Uub?;I6;zl| z<_c?T)&V{m^9jcH`3%D_48!~$q~&S#vZBF;W=@~sdVNT!Wd_HpwOY~6 zb4C50_|tcQ&^ik(ll=6Pw*4ahF7XPg-5JTt0|coB?i2KWdZbmN>Fs|PlwKOGa1BS9SoMt_0Ei7~W-ow7J!w6b_ueGq_3Nj4CFbu=|2Aq1cskl6` zU~-7y*>*s|13uE2J|8@iJ^s%UgeM`#vB!>Cg86VO>*Ru=NdM#9j2O-eA5X@A#|etH z*YCa}hA%}cB#sk|8~+T+tTuzrFuM1)3i`SNZkhG7_nVHoCAy!bom_nzp{HVfaF zAU6N`JMs2_=k{6m=Eg&K@ppUtpEX130F%f?Zu82N zSI05S5>H|BV-+U&#TJ|;d?QDEb_}e%vjjgs*+cyN3z!Se#fnn^Z2$lO07*qoM6N<$ Ef~Es_0ssI2 delta 1202 zcmV;j1Wo&-3;ha^Br_^dOjJd{z`)wHvia`v|NsB$+1$L0is8r0)YR1S^76K}w%pv@ z9v&ViCnvzbz$QHozmZP5e^*IFK~#90?VG)F+eQ>d7a9{9St&#iMlCJZtRpPrT7uTB zEyu%}lxWoH?C1sTs7jZND|J!e6s|27uI-l!GMR|?+g$?05a1-4d%C;Wiw{2}t+RlI zU^=3IP*eA7>W2Nn@Ca*tY;D&ExIM+XVZVr_f`M3%p^mhEOzY=be?vmk{+;OZB7%A- zX)Oj?&S{-UIEBXj!G%ueP)nR}ekS#^W!ckm{Ah!IA*Q1d))MO%@fqBd!T9v)CjFu( zA7ibs4vfKjXbjw=rv0@9aRx`+Q>O>3=6Z>o7DE( zTLSPkh6%F2F+q@4eR9C0F*9FaQA z+(1PF>iQkRL8=p48>J?+E`KL*Rb!wf2@H?ZV|qY#ze8Zof6OV=^99tIG2hXK?~Q@A zulzEf(d}jbNmXD^N?3U5<$3-R0&%-|E@82)uHOwbQqf`jGxLQe+fUfp;QnkGWxA3`xlGKeuv5V^aSc8Iq}b2(Lc+v|Dahv!!QiPF#iwY zY`b|$n&Ut|q|b1@9@12q!C1AHCv@WjNqsN)*0+PE>nwDcUyiiOJHLl>#6Qjs?$Fs|=)x-=Cm3S;eS>jJPFy16*^`G zs`frve_Ic1O6Y%_n-Jl=z{iul%>sjo*LNQg;fqm)g3SVZx&I8wSxs9#LvijM4d{PY z;1}f?hG7_nVHk$l7WaM^`rQ*9Z94MJX~gs&zYCtO@!USCez|cS?)`3s|5;~P`3mk@ zEd9>!f2(HyE7^Vf=I1u|w|DF8?$_U8!u2n0f991ZaAObMzM<8_x39Jx_(Q9Kd$(>N zT+)Zvt=>YhS2!nd1%bOo+krRsP=ROIa^T0}vpw{s_&};}iuY~i?SK8v8QXpTm6lhZ zJ~&f03H0pk4g&XE4P+RGVHk#C{u}JQZfYyw{S)Fx*AT0DeQgbZZn-*! zbT%f$D_7XM4fGgdHSe52yrfQ`bxA#jSQBXL2>6}re^+*(Ylt<0g*8xM;7!$L?~H2p zi$AOp@H^N4Q2)G!Sjnf4_7$Oi=kY&F|9pm69eC#q-O)f-?kxTD8KRdz0mQ5T@}$t0 QyZ`_I07*qoM6N<$f^58U#{d8T diff --git a/monkestation/icons/mob/species/satyr/satyr_fluff.dmi b/monkestation/icons/mob/species/satyr/satyr_fluff.dmi index 8a00a946737f7d787eb3ee0f1fe4ff9dd984e101..bc6bbbd8fa5d47698f4b96080ab92d6c007cdf62 100644 GIT binary patch delta 880 zcmV-$1CRW*1LOx^iBL{Q4GJ0x0000DNk~Le0001>0001>1Oos70D0kh9smFUAy7GS;o;%-_Vxn=2p%3DCnqPsz`#9BHl_do00DGTPE!Ct=GbNc z005eiQ-gmo8X?+>;&W2diBy||Ppz_otDg%vzyU|4bLBAmwKD(!0?SE6K~!jg?V7=E z+CUJ7r)x{O#)00KwR;Ebs8?g7K1f^j9Ho(f_viz6$%UDJjfX8cRr3X;?C#8OCm``< zH$;YE7>2?5^jL}ERL$c|fBjg}!e7Q=v1y;!xFCP3Ja2IEdh6@`G(ImsxBX?@{CIAE z@&aEBGO+E7nSL7E<$_PFzJ33-;|U>*5IAgS`f1z@I}uoYS&5&~H7y46;kfB{GH~ge zg$VQzSa-95&|i)Nxp9A)XhOUvo)AV65G(ivl74FTK0dCGDahA^;Ce}YT#h%z#+`5Y zFP(qjHF>X?=}!W1T&96_Gj{{7qjEblre4;^w{qRj)l(V2c)|Ak;DK(GfotM{*q`Fx zAN&%1T4Wf8VHgvD53Z(ao-*>#2kR*xgb&hL&1?vv67)$?ZEC#4Un=gqoLN*~nDn{}TAA5_nq z-(C}+d=Y`@gW7p>d2GJ&@$cgsW#NBefAQhe9QgQf5<|l<48!5m3p0>36sY+Dq(lRJLR=3VIB@6Aoo(B; zJ$(4^%9SghK7IQ3?c1SQysv=@7)yfuf*Bm1-ADs+`Xr2edLS*A_e!=}^1N&imZ Date: Wed, 4 Oct 2023 16:45:49 -0400 Subject: [PATCH 06/11] fixed some issues with the quirk menu crashing, and made even more issues --- .../sprite_accessories/satyr_accessories.dm | 29 ++++++++++++++++--- .../living/carbon/human/species_type/satyr.dm | 5 ++++ .../organs/external/satyr_accessories.dm | 2 +- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm index 24faa680d681..77365db1752d 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -1,47 +1,68 @@ /datum/sprite_accessory/satyr_horns - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_horns/tall name = "Tall" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "tall" + body_slots = list(BODY_ZONE_HEAD) + external_slots = list(ORGAN_SLOT_EXTERNAL_HORNS) /datum/sprite_accessory/satyr_horns/thick name = "Thick" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "thick" + body_slots = list(BODY_ZONE_HEAD) + external_slots = list(ORGAN_SLOT_EXTERNAL_HORNS) /datum/sprite_accessory/satyr_horns/back name = "Back" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "back" + body_slots = list(BODY_ZONE_HEAD) + external_slots = list(ORGAN_SLOT_EXTERNAL_HORNS) /datum/sprite_accessory/satyr_ears - icon = 'monkestation/icons/mob/species/satyr/satyr_ears.dmi' color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_ears/floppy name = "Floppy" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "floppy" + body_slots = list(BODY_ZONE_HEAD) + external_slots = list(ORGAN_SLOT_EXTERNAL_FRILLS) /datum/sprite_accessory/satyr_ears/flat name = "Flat" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "flat" + body_slots = list(BODY_ZONE_HEAD) + external_slots = list(ORGAN_SLOT_EXTERNAL_FRILLS) /datum/sprite_accessory/satyr_ears/pointy name = "Pointy" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "pointy" + body_slots = list(BODY_ZONE_HEAD) + external_slots = list(ORGAN_SLOT_EXTERNAL_FRILLS) /datum/sprite_accessory/satyr_tail - icon = 'monkestation/icons/mob/species/satyr/satyr_tail.dmi' color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_tail/short name = "Short" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "short" + body_slots = list(BODY_ZONE_PRECISE_GROIN) + external_slots = list(ORGAN_SLOT_EXTERNAL_TAIL) /datum/sprite_accessory/satyr_fluff - icon = 'monkestation/icons/mob/species/satyr/satyr_fluff.dmi' color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_fluff/normal name = "Normal" + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "normal" + body_slots = list(BODY_ZONE_CHEST) + external_slots = list(ORGAN_SLOT_EXTERNAL_SPINES) + gender_specific = TRUE diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm index efcdf3b03991..519821c4eb16 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -107,4 +107,9 @@ /datum/quirk/hard_soles //Stolen from Skyrat name = "Hardened Soles" + desc = "You're used to walking barefoot, and won't receive the negative effects of doing so." + value = 3 mob_trait = TRAIT_HARD_SOLES + gain_text = span_notice("The ground doesn't feel so rough on your feet anymore.") + lose_text = span_danger("You start feeling the ridges and imperfections on the ground.") + medical_record_text = "Patient's feet are more resilient against traction." diff --git a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm index 4839b06fdc44..faa6d9e9aee4 100644 --- a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm +++ b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm @@ -92,7 +92,7 @@ preference = "feature_satyr_fluff" zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_EXTERNAL_TAIL + slot = ORGAN_SLOT_EXTERNAL_SPINES organ_flags = ORGAN_UNREMOVABLE use_mob_sprite_as_obj_sprite = TRUE From f28f1f519779565661c4558378c054f3c36dcdde Mon Sep 17 00:00:00 2001 From: Glyphee <77804365+Glyphee@users.noreply.github.com> Date: Wed, 4 Oct 2023 16:58:26 -0400 Subject: [PATCH 07/11] adds laughing and fixes whitespace error --- .../sprite_accessories/satyr_accessories.dm | 2 +- .../living/carbon/human/species_type/satyr.dm | 33 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm index 77365db1752d..c2395f60cffd 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -65,4 +65,4 @@ icon_state = "normal" body_slots = list(BODY_ZONE_CHEST) external_slots = list(ORGAN_SLOT_EXTERNAL_SPINES) - gender_specific = TRUE + gender_specific = TRUE diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm index 519821c4eb16..ceff9fe9006f 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -113,3 +113,36 @@ gain_text = span_notice("The ground doesn't feel so rough on your feet anymore.") lose_text = span_danger("You start feeling the ridges and imperfections on the ground.") medical_record_text = "Patient's feet are more resilient against traction." + +/datum/species/satyr/get_scream_sound(mob/living/carbon/human/human) + if(human.gender == MALE) + return pick('sound/voice/human/malescream_1.ogg', + 'sound/voice/human/malescream_2.ogg', + 'sound/voice/human/malescream_3.ogg', + 'sound/voice/human/malescream_4.ogg', + 'sound/voice/human/malescream_5.ogg', + 'sound/voice/human/malescream_6.ogg') + else + return pick('sound/voice/human/femalescream_1.ogg', + 'sound/voice/human/femalescream_2.ogg', + 'sound/voice/human/femalescream_3.ogg', + 'sound/voice/human/femalescream_4.ogg', + 'sound/voice/human/femalescream_5.ogg') + +/datum/species/satyr/get_laugh_sound(mob/living/carbon/human/human) + if(human.gender == MALE) + return pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg') + else + return 'sound/voice/human/womanlaugh.ogg' + +/datum/action/innate/headbutt + name = "Headbutt" + check_flags = AB_CHECK_CONSCIOUS + button_icon_state = "slimeheal" + button_icon = 'icons/mob/actions/actions_slime.dmi' + background_icon_state = "bg_alien" + overlay_icon_state = "bg_alien_border" + +/datum/action/innate/regenerate_limbs/Activate() + var/mob/living/carbon/human/H = owner + to_chat(H, span_notice("test")) From 4c4ef103a8a6a6bce26810e26844d033d96d0ce8 Mon Sep 17 00:00:00 2001 From: Glyphee <77804365+Glyphee@users.noreply.github.com> Date: Thu, 12 Oct 2023 17:46:55 -0400 Subject: [PATCH 08/11] adfasdfa --- code/__DEFINES/DNA.dm | 2 ++ code/__HELPERS/global_lists.dm | 2 +- code/__HELPERS/mobs.dm | 8 ++--- code/_globalvars/lists/flavor_misc.dm | 2 +- code/modules/mob/living/carbon/human/dummy.dm | 2 +- code/modules/surgery/organs/external/tails.dm | 27 ++++++++++++++++ .../preferences/species_features/satyr.dm | 28 ++++++++-------- .../sprite_accessories/satyr_accessories.dm | 11 +++++-- .../living/carbon/human/species_type/satyr.dm | 23 ++++--------- .../organs/external/satyr_accessories.dm | 32 ++----------------- 10 files changed, 68 insertions(+), 69 deletions(-) diff --git a/code/__DEFINES/DNA.dm b/code/__DEFINES/DNA.dm index 34a165ccf6db..33cc28562179 100644 --- a/code/__DEFINES/DNA.dm +++ b/code/__DEFINES/DNA.dm @@ -139,6 +139,8 @@ #define ORGAN_SLOT_EXTERNAL_ANIME_HEAD "anime_head" #define ORGAN_SLOT_EXTERNAL_ANIME_CHEST "anime_chest" #define ORGAN_SLOT_EXTERNAL_ANIME_BOTTOM "anime_bottom" +#define ORGAN_SLOT_EXTERNAL_OUTER_EAR "outer_ear" +#define ORGAN_SLOT_EXTERNAL_FUR "fur" /// Xenomorph organ slots #define ORGAN_SLOT_XENO_ACIDGLAND "acid_gland" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index 432b8fead5d6..015d216201f3 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -46,7 +46,7 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/goblin_ears, GLOB.goblin_ears_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_horns, GLOB.satyr_horns_list) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_ears, GLOB.satyr_ears_list) //Monkestation Addition - init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_tail, GLOB.satyr_tail_list) //Monkestation Addition + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/satyr, GLOB.tails_list_satyr) //Monkestation Addition init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_fluff, GLOB.satyr_fluff_list) //Monkestation Addition //Species diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ed5689f0d111..a8504fe0f07e 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -114,9 +114,9 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_horns, GLOB.satyr_horns_list) if(!GLOB.satyr_ears_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_ears, GLOB.satyr_ears_list) - if(!GLOB.satyr_tail_list.len) - init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_tail, GLOB.satyr_tail_list) - if(!GLOB.satyr_tail_list.len) + // if(!GLOB.tails_list_satyr.len) + // init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/satyr, GLOB.tails_list_satyr) + if(!GLOB.satyr_fluff_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_fluff, GLOB.satyr_fluff_list) //Monkestation Addition End @@ -153,7 +153,7 @@ "goblin_ears" = pick(GLOB.goblin_ears_list), //Monkestation Addition "satyr_horns" = pick(GLOB.satyr_horns_list), //Monkestation Addition "satyr_ears" = pick(GLOB.satyr_ears_list), //Monkestation Addition - "satyr_tail" = pick(GLOB.satyr_tail_list), //Monkestation Addition + "satyr_tail" = "Short", //Monkestation Addition )) /proc/random_hairstyle(gender) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 6c663c60f0b1..a8ed1cd11999 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -32,6 +32,7 @@ GLOBAL_LIST_EMPTY(animated_spines_list) GLOBAL_LIST_EMPTY(tails_list) GLOBAL_LIST_EMPTY(tails_list_human) //Only exists for preference choices. Use "tails_list" otherwise. GLOBAL_LIST_EMPTY(tails_list_lizard) //See above! +GLOBAL_LIST_EMPTY(tails_list_satyr) //Monkestation Addition GLOBAL_LIST_EMPTY(ears_list) GLOBAL_LIST_EMPTY(wings_list) GLOBAL_LIST_EMPTY(wings_open_list) @@ -52,7 +53,6 @@ GLOBAL_LIST_EMPTY(arachnid_chelicerae_list) //Monkestation Addition GLOBAL_LIST_EMPTY(goblin_ears_list) //Monkestation Addition GLOBAL_LIST_EMPTY(satyr_horns_list) //Monkestation Addition GLOBAL_LIST_EMPTY(satyr_ears_list) //Monkestation Addition -GLOBAL_LIST_EMPTY(satyr_tail_list) //Monkestation Addition GLOBAL_LIST_EMPTY(satyr_fluff_list) //Monkestation Addition GLOBAL_LIST_INIT(color_list_ethereal, list( diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 378eb8296494..31b4506cebb6 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -99,6 +99,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features["tail_cat"] = "None" target.dna.features["tail_lizard"] = "Smooth" target.dna.features["tail_monkey"] = "Chimp" //Monkestation Addition + target.dna.features["tail_satyr"] = "Short" //Monkestation Addition target.dna.features["pod_hair"] = "Ivy" target.dna.features["ipc_screen"] = "BSOD" //Monkestation Addition target.dna.features["ipc_chassis"] = "Bishop Cyberkinetics" //Monkestation Addition @@ -111,7 +112,6 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features["goblin_ears"] = "Normal" //Monkestation Addition target.dna.features["satyr_horns"] = "Short" //Monkestation Addition target.dna.features["satyr_ears"] = "Floppy" //Monkestation Addition - target.dna.features["satyr_tail"] = "Short" //Monkestation Addition target.dna.features["satyr_fluff"] = "Normal" //Monkestation Addition /// Provides a dummy that is consistently bald, white, naked, etc. diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index fb310b3940bf..2d53c9e828df 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -154,3 +154,30 @@ /obj/item/organ/external/tail/lizard/fake name = "fabricated lizard tail" desc = "A fabricated severed lizard tail. This one's made of synthflesh. Probably not usable for lizard wine." + +///Satyr Tail +/obj/item/organ/external/tail/satyr + name = "satyr tail" + desc = "A short and stubby goat tail." + icon_state = "satyr_tail" + icon = 'monkestation/icons/obj/medical/organs/organs.dmi' + + preference = "feature_satyr_tail" + zone = BODY_ZONE_PRECISE_GROIN + slot = ORGAN_SLOT_EXTERNAL_TAIL + + use_mob_sprite_as_obj_sprite = TRUE + // bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_tail + +// /datum/bodypart_overlay/mutant/tail/satyr +// layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT +// feature_key = "satyr_tail" + +// /datum/bodypart_overlay/mutant/tail/satyr/get_global_feature_list() +// return GLOB.tails_list_satyr + +// /datum/bodypart_overlay/mutant/tail/satyr/get_base_icon_state() +// return sprite_datum.icon_state + +// /datum/bodypart_overlay/mutant/tail/satyr/can_draw_on_bodypart(mob/living/carbon/human/human) +// return TRUE diff --git a/monkestation/code/modules/client/preferences/species_features/satyr.dm b/monkestation/code/modules/client/preferences/species_features/satyr.dm index f70f777af573..829fc78e97fa 100644 --- a/monkestation/code/modules/client/preferences/species_features/satyr.dm +++ b/monkestation/code/modules/client/preferences/species_features/satyr.dm @@ -38,22 +38,22 @@ /// Satyr Tail /// -/datum/preference/choiced/satyr_tail - savefile_key = "feature_satyr_tail" - savefile_identifier = PREFERENCE_CHARACTER - category = PREFERENCE_CATEGORY_FEATURES - main_feature_name = "Satyr Tail" - should_generate_icons = TRUE +// /datum/preference/choiced/satyr_tail +// savefile_key = "feature_satyr_tail" +// savefile_identifier = PREFERENCE_CHARACTER +// category = PREFERENCE_CATEGORY_FEATURES +// main_feature_name = "Satyr Tail" +// should_generate_icons = TRUE -/datum/preference/choiced/satyr_tail/init_possible_values() - return possible_values_for_sprite_accessory_list_for_body_part( - GLOB.satyr_tail_list, - "satyr_tail", - list("ADJ", "FRONT"), - ) +// /datum/preference/choiced/satyr_tail/init_possible_values() +// return possible_values_for_sprite_accessory_list_for_body_part( +// GLOB.satyr_tail_list, +// "satyr_tail", +// list("ADJ", "FRONT"), +// ) -/datum/preference/choiced/satyr_tail/apply_to_human(mob/living/carbon/human/target, value) - target.dna.features["satyr_tail"] = value +// /datum/preference/choiced/satyr_tail/apply_to_human(mob/living/carbon/human/target, value) +// target.dna.features["satyr_tail"] = value /// Satyr Fluff /// diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm index c2395f60cffd..9ff151881c71 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -1,3 +1,4 @@ +/// HORNS /// /datum/sprite_accessory/satyr_horns color_src = MUTCOLORS_SECONDARY @@ -22,6 +23,8 @@ body_slots = list(BODY_ZONE_HEAD) external_slots = list(ORGAN_SLOT_EXTERNAL_HORNS) +/// EARS /// + /datum/sprite_accessory/satyr_ears color_src = MUTCOLORS_SECONDARY @@ -46,16 +49,20 @@ body_slots = list(BODY_ZONE_HEAD) external_slots = list(ORGAN_SLOT_EXTERNAL_FRILLS) -/datum/sprite_accessory/satyr_tail +/// TAIL /// + +/datum/sprite_accessory/tails/satyr color_src = MUTCOLORS_SECONDARY -/datum/sprite_accessory/satyr_tail/short +/datum/sprite_accessory/tails/satyr/short name = "Short" icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "short" body_slots = list(BODY_ZONE_PRECISE_GROIN) external_slots = list(ORGAN_SLOT_EXTERNAL_TAIL) +/// FLUFF /// + /datum/sprite_accessory/satyr_fluff color_src = MUTCOLORS_SECONDARY diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm index ceff9fe9006f..54fac875e3f9 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -21,7 +21,7 @@ external_organs = list( /obj/item/organ/external/satyr_horns = "tall", /obj/item/organ/external/satyr_ears = "flat", - /obj/item/organ/external/satyr_tail = "short", + /obj/item/organ/external/tail/satyr = "short", /obj/item/organ/external/satyr_fluff = "normal" ) meat = /obj/item/food/meat/steak @@ -114,23 +114,14 @@ lose_text = span_danger("You start feeling the ridges and imperfections on the ground.") medical_record_text = "Patient's feet are more resilient against traction." -/datum/species/satyr/get_scream_sound(mob/living/carbon/human/human) - if(human.gender == MALE) - return pick('sound/voice/human/malescream_1.ogg', - 'sound/voice/human/malescream_2.ogg', - 'sound/voice/human/malescream_3.ogg', - 'sound/voice/human/malescream_4.ogg', - 'sound/voice/human/malescream_5.ogg', - 'sound/voice/human/malescream_6.ogg') - else - return pick('sound/voice/human/femalescream_1.ogg', - 'sound/voice/human/femalescream_2.ogg', - 'sound/voice/human/femalescream_3.ogg', - 'sound/voice/human/femalescream_4.ogg', - 'sound/voice/human/femalescream_5.ogg') +// /datum/species/satyr/get_scream_sound(mob/living/carbon/human/human) +// if(human.gender == MALE) +// return pick('sound/voice/human/malescream_1.ogg', 'sound/voice/human/malescream_2.ogg', 'sound/voice/human/malescream_3.ogg', 'sound/voice/human/malescream_4.ogg', 'sound/voice/human/malescream_5.ogg', 'sound/voice/human/malescream_6.ogg') +// else +// return pick('sound/voice/human/femalescream_1.ogg', 'sound/voice/human/femalescream_2.ogg', 'sound/voice/human/femalescream_3.ogg', 'sound/voice/human/femalescream_4.ogg', 'sound/voice/human/femalescream_5.ogg') /datum/species/satyr/get_laugh_sound(mob/living/carbon/human/human) - if(human.gender == MALE) + if(human.gender == MALE) return pick('sound/voice/human/manlaugh1.ogg', 'sound/voice/human/manlaugh2.ogg') else return 'sound/voice/human/womanlaugh.ogg' diff --git a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm index faa6d9e9aee4..4a77c2349a64 100644 --- a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm +++ b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm @@ -36,7 +36,7 @@ preference = "feature_satyr_ears" zone = BODY_ZONE_HEAD - slot = ORGAN_SLOT_EXTERNAL_FRILLS + slot = ORGAN_SLOT_EXTERNAL_OUTER_EAR use_mob_sprite_as_obj_sprite = TRUE bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_ears @@ -54,34 +54,6 @@ /datum/bodypart_overlay/mutant/satyr_ears/can_draw_on_bodypart(mob/living/carbon/human/human) return TRUE -/// Satyr Tail /// - -/obj/item/organ/external/satyr_tail - name = "satyr tail" - desc = "A short and stubby goat tail." - icon_state = "satyr_tail" - icon = 'monkestation/icons/obj/medical/organs/organs.dmi' - - preference = "feature_satyr_tail" - zone = BODY_ZONE_PRECISE_GROIN - slot = ORGAN_SLOT_EXTERNAL_TAIL - - use_mob_sprite_as_obj_sprite = TRUE - bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_tail - -/datum/bodypart_overlay/mutant/satyr_tail - layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT - feature_key = "satyr_tail" - -/datum/bodypart_overlay/mutant/satyr_tail/get_global_feature_list() - return GLOB.satyr_tail_list - -/datum/bodypart_overlay/mutant/satyr_tail/get_base_icon_state() - return sprite_datum.icon_state - -/datum/bodypart_overlay/mutant/satyr_tail/can_draw_on_bodypart(mob/living/carbon/human/human) - return TRUE - /// Satyr Fluff /// /obj/item/organ/external/satyr_fluff @@ -92,7 +64,7 @@ preference = "feature_satyr_fluff" zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_EXTERNAL_SPINES + slot = ORGAN_SLOT_EXTERNAL_FUR organ_flags = ORGAN_UNREMOVABLE use_mob_sprite_as_obj_sprite = TRUE From f85e27225b1ede06c3f4dac42bf2873c984d297f Mon Sep 17 00:00:00 2001 From: dwasint <82520990+dwasint@users.noreply.github.com> Date: Tue, 24 Oct 2023 02:51:03 -0400 Subject: [PATCH 09/11] fixes redoes pathing for satyr sprites, correctly ties the fluff into the multi-part system, converts fluff to a mutant_bodypart to utilize multi-part bodyparts tied in the fact it would cause visual issues doing it as an external organ --- code/__DEFINES/external_organs.dm | 3 + code/__HELPERS/mobs.dm | 4 +- .../mutant_bodypart_overlay.dm | 5 ++ .../mob/living/carbon/human/_species.dm | 2 + code/modules/mob/living/carbon/human/dummy.dm | 2 +- code/modules/surgery/organs/external/tails.dm | 21 ++--- .../preferences/species_features/satyr.dm | 77 ++++++++++++------ .../sprite_accessories/satyr_accessories.dm | 30 ++----- .../living/carbon/human/species_type/satyr.dm | 2 +- .../organs/external/satyr_accessories.dm | 29 ------- .../icons/mob/species/satyr/satyr_fluff.dmi | Bin 996 -> 1386 bytes .../icons/mob/species/satyr/satyr_horns.dmi | Bin 512 -> 679 bytes 12 files changed, 83 insertions(+), 92 deletions(-) diff --git a/code/__DEFINES/external_organs.dm b/code/__DEFINES/external_organs.dm index 766feb141491..ce71b0913d8a 100644 --- a/code/__DEFINES/external_organs.dm +++ b/code/__DEFINES/external_organs.dm @@ -6,6 +6,9 @@ #define ORGAN_COLOR_HAIR (1<<2) ///uses the parents anime color #define ORGAN_COLOR_ANIME (1<<3) +///uses the parents mutcolor secondary +#define ORGAN_COLOR_MUTSECONDARY (1<<4) + ///Tail wagging #define WAG_ABLE (1<<0) #define WAG_WAGGING (1<<1) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index a8504fe0f07e..8c880f3dc14b 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -114,8 +114,8 @@ init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_horns, GLOB.satyr_horns_list) if(!GLOB.satyr_ears_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_ears, GLOB.satyr_ears_list) - // if(!GLOB.tails_list_satyr.len) - // init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/satyr, GLOB.tails_list_satyr) + if(!GLOB.tails_list_satyr.len) + init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/satyr, GLOB.tails_list_satyr) if(!GLOB.satyr_fluff_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/satyr_fluff, GLOB.satyr_fluff_list) //Monkestation Addition End diff --git a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm index 345356f85b36..16cc42756c1f 100644 --- a/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm +++ b/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm @@ -140,6 +140,11 @@ return var/mob/living/carbon/human/human_owner = ownerlimb.owner draw_color = human_owner.dna.features["animecolor"] + if(ORGAN_COLOR_MUTSECONDARY) + if(!ishuman(ownerlimb.owner)) + return + var/mob/living/carbon/human/human_owner = ownerlimb.owner + draw_color = human_owner.dna.features["mcolor_secondary"] return TRUE diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 6506195f1acb..81d5d65ef2e6 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -836,6 +836,8 @@ GLOBAL_LIST_EMPTY(features_by_species) accessory = GLOB.caps_list[source.dna.features["caps"]] if("ipc_screen") accessory = GLOB.ipc_screens_list[source.dna.features["ipc_screen"]] + if("satyr_fluff") + accessory = GLOB.satyr_fluff_list[source.dna.features["satyr_fluff"]] if(!accessory || accessory.icon_state == "none") continue diff --git a/code/modules/mob/living/carbon/human/dummy.dm b/code/modules/mob/living/carbon/human/dummy.dm index 31b4506cebb6..144ccd221661 100644 --- a/code/modules/mob/living/carbon/human/dummy.dm +++ b/code/modules/mob/living/carbon/human/dummy.dm @@ -110,7 +110,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy) target.dna.features["arachnid_appendages"] = "Long" //Monkestation Addition target.dna.features["arachnid_chelicerae"] = "Basic" //Monkestation Addition target.dna.features["goblin_ears"] = "Normal" //Monkestation Addition - target.dna.features["satyr_horns"] = "Short" //Monkestation Addition + target.dna.features["satyr_horns"] = "Tall" //Monkestation Addition target.dna.features["satyr_ears"] = "Floppy" //Monkestation Addition target.dna.features["satyr_fluff"] = "Normal" //Monkestation Addition diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index 2d53c9e828df..32b86cd5dbfd 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -167,17 +167,18 @@ slot = ORGAN_SLOT_EXTERNAL_TAIL use_mob_sprite_as_obj_sprite = TRUE - // bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_tail + bodypart_overlay = /datum/bodypart_overlay/mutant/tail/satyr -// /datum/bodypart_overlay/mutant/tail/satyr -// layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT -// feature_key = "satyr_tail" +/datum/bodypart_overlay/mutant/tail/satyr + layers = EXTERNAL_ADJACENT | EXTERNAL_FRONT + feature_key = "satyr_tail" + color_source = ORGAN_COLOR_MUTSECONDARY -// /datum/bodypart_overlay/mutant/tail/satyr/get_global_feature_list() -// return GLOB.tails_list_satyr +/datum/bodypart_overlay/mutant/tail/satyr/get_global_feature_list() + return GLOB.tails_list_satyr -// /datum/bodypart_overlay/mutant/tail/satyr/get_base_icon_state() -// return sprite_datum.icon_state +/datum/bodypart_overlay/mutant/tail/satyr/get_base_icon_state() + return sprite_datum.icon_state -// /datum/bodypart_overlay/mutant/tail/satyr/can_draw_on_bodypart(mob/living/carbon/human/human) -// return TRUE +/datum/bodypart_overlay/mutant/tail/satyr/can_draw_on_bodypart(mob/living/carbon/human/human) + return TRUE diff --git a/monkestation/code/modules/client/preferences/species_features/satyr.dm b/monkestation/code/modules/client/preferences/species_features/satyr.dm index 829fc78e97fa..89d982fe7e1f 100644 --- a/monkestation/code/modules/client/preferences/species_features/satyr.dm +++ b/monkestation/code/modules/client/preferences/species_features/satyr.dm @@ -8,11 +8,23 @@ should_generate_icons = TRUE /datum/preference/choiced/satyr_horns/init_possible_values() - return possible_values_for_sprite_accessory_list_for_body_part( - GLOB.satyr_horns_list, - "satyr_horns", - "FRONT", - ) + var/list/values = list() + + var/icon/satyr_head = icon('monkestation/icons/mob/species/satyr/bodyparts.dmi', "satyr_head_m") + + for (var/horn_name in GLOB.satyr_horns_list) + var/datum/sprite_accessory/horns = GLOB.satyr_horns_list[horn_name] + if(horns.locked) + continue + + var/icon/icon_with_horns = new(satyr_head) + icon_with_horns.Blend(icon(horns.icon, "m_satyr_horns_[horns.icon_state]_FRONT"), ICON_OVERLAY) + icon_with_horns.Scale(64, 64) + icon_with_horns.Crop(15, 64, 15 + 31, 64 - 31) + + values[horns.name] = icon_with_horns + + return values /datum/preference/choiced/satyr_horns/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["satyr_horns"] = value @@ -38,22 +50,22 @@ /// Satyr Tail /// -// /datum/preference/choiced/satyr_tail -// savefile_key = "feature_satyr_tail" -// savefile_identifier = PREFERENCE_CHARACTER -// category = PREFERENCE_CATEGORY_FEATURES -// main_feature_name = "Satyr Tail" -// should_generate_icons = TRUE +/datum/preference/choiced/satyr_tail + savefile_key = "feature_satyr_tail" + savefile_identifier = PREFERENCE_CHARACTER + category = PREFERENCE_CATEGORY_FEATURES + main_feature_name = "Satyr Tail" + should_generate_icons = TRUE -// /datum/preference/choiced/satyr_tail/init_possible_values() -// return possible_values_for_sprite_accessory_list_for_body_part( -// GLOB.satyr_tail_list, -// "satyr_tail", -// list("ADJ", "FRONT"), -// ) +/datum/preference/choiced/satyr_tail/init_possible_values() + return possible_values_for_sprite_accessory_list_for_body_part( + GLOB.tails_list_satyr, + "satyr_tail", + list("ADJ", "FRONT"), + ) -// /datum/preference/choiced/satyr_tail/apply_to_human(mob/living/carbon/human/target, value) -// target.dna.features["satyr_tail"] = value +/datum/preference/choiced/satyr_tail/apply_to_human(mob/living/carbon/human/target, value) + target.dna.features["satyr_tail"] = value /// Satyr Fluff /// @@ -65,11 +77,28 @@ should_generate_icons = TRUE /datum/preference/choiced/satyr_fluff/init_possible_values() - return possible_values_for_sprite_accessory_list_for_body_part( - GLOB.satyr_fluff_list, - "satyr_fluff", - "FRONT", - ) + var/icon/lower_half = icon('icons/blanks/32x32.dmi', "nothing") + + for (var/icon in list("human_r_leg", "human_l_leg")) + lower_half.Blend(icon('icons/mob/species/human/bodyparts_greyscale.dmi', icon), ICON_OVERLAY) + + var/list/values = list() + + for (var/accessory_name in GLOB.satyr_fluff_list) + var/icon/icon_with_socks = new(lower_half) + + if (accessory_name != "Nude") + var/datum/sprite_accessory/accessory = GLOB.satyr_fluff_list[accessory_name] + + var/icon/accessory_icon = icon('monkestation/icons/mob/species/satyr/satyr_fluff.dmi', "[accessory.icon_state]_preview") + icon_with_socks.Blend(accessory_icon, ICON_OVERLAY) + + icon_with_socks.Crop(10, 1, 22, 13) + icon_with_socks.Scale(32, 32) + + values[accessory_name] = icon_with_socks + + return values /datum/preference/choiced/satyr_fluff/apply_to_human(mob/living/carbon/human/target, value) target.dna.features["satyr_fluff"] = value diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm index 9ff151881c71..2ab8414c4471 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -1,75 +1,55 @@ /// HORNS /// /datum/sprite_accessory/satyr_horns + icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/satyr_horns/tall name = "Tall" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "tall" - body_slots = list(BODY_ZONE_HEAD) - external_slots = list(ORGAN_SLOT_EXTERNAL_HORNS) /datum/sprite_accessory/satyr_horns/thick name = "Thick" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "thick" - body_slots = list(BODY_ZONE_HEAD) - external_slots = list(ORGAN_SLOT_EXTERNAL_HORNS) /datum/sprite_accessory/satyr_horns/back name = "Back" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "back" - body_slots = list(BODY_ZONE_HEAD) - external_slots = list(ORGAN_SLOT_EXTERNAL_HORNS) /// EARS /// /datum/sprite_accessory/satyr_ears color_src = MUTCOLORS_SECONDARY + icon = 'monkestation/icons/mob/species/satyr/satyr_ears.dmi' /datum/sprite_accessory/satyr_ears/floppy name = "Floppy" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "floppy" - body_slots = list(BODY_ZONE_HEAD) - external_slots = list(ORGAN_SLOT_EXTERNAL_FRILLS) /datum/sprite_accessory/satyr_ears/flat name = "Flat" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "flat" - body_slots = list(BODY_ZONE_HEAD) - external_slots = list(ORGAN_SLOT_EXTERNAL_FRILLS) /datum/sprite_accessory/satyr_ears/pointy name = "Pointy" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "pointy" - body_slots = list(BODY_ZONE_HEAD) - external_slots = list(ORGAN_SLOT_EXTERNAL_FRILLS) - /// TAIL /// /datum/sprite_accessory/tails/satyr + icon = 'monkestation/icons/mob/species/satyr/satyr_tail.dmi' color_src = MUTCOLORS_SECONDARY /datum/sprite_accessory/tails/satyr/short name = "Short" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "short" - body_slots = list(BODY_ZONE_PRECISE_GROIN) - external_slots = list(ORGAN_SLOT_EXTERNAL_TAIL) /// FLUFF /// /datum/sprite_accessory/satyr_fluff + icon = 'monkestation/icons/mob/species/satyr/satyr_fluff.dmi' color_src = MUTCOLORS_SECONDARY + body_slots = list(BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) /datum/sprite_accessory/satyr_fluff/normal name = "Normal" - icon = 'monkestation/icons/mob/species/satyr/satyr_horns.dmi' icon_state = "normal" - body_slots = list(BODY_ZONE_CHEST) - external_slots = list(ORGAN_SLOT_EXTERNAL_SPINES) gender_specific = TRUE diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm index 54fac875e3f9..e2c8649f1886 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -18,11 +18,11 @@ TRAIT_HARD_SOLES ) inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID + mutant_bodyparts = list("satyr_fluff" = "Normal") external_organs = list( /obj/item/organ/external/satyr_horns = "tall", /obj/item/organ/external/satyr_ears = "flat", /obj/item/organ/external/tail/satyr = "short", - /obj/item/organ/external/satyr_fluff = "normal" ) meat = /obj/item/food/meat/steak liked_food = GROSS | VEGETABLES | FRUIT diff --git a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm index 4a77c2349a64..78ae7b28fd07 100644 --- a/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm +++ b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm @@ -53,32 +53,3 @@ /datum/bodypart_overlay/mutant/satyr_ears/can_draw_on_bodypart(mob/living/carbon/human/human) return TRUE - -/// Satyr Fluff /// - -/obj/item/organ/external/satyr_fluff - name = "satyr fluff" - desc = "You shouldn't see this" - icon_state = "satyr_fluff" - icon = 'monkestation/icons/obj/medical/organs/organs.dmi' - - preference = "feature_satyr_fluff" - zone = BODY_ZONE_CHEST - slot = ORGAN_SLOT_EXTERNAL_FUR - organ_flags = ORGAN_UNREMOVABLE - - use_mob_sprite_as_obj_sprite = TRUE - bodypart_overlay = /datum/bodypart_overlay/mutant/satyr_fluff - -/datum/bodypart_overlay/mutant/satyr_fluff - layers = EXTERNAL_FRONT - feature_key = "satyr_fluff" - -/datum/bodypart_overlay/mutant/satyr_fluff/get_global_feature_list() - return GLOB.satyr_fluff_list - -/datum/bodypart_overlay/mutant/satyr_fluff/get_base_icon_state() - return sprite_datum.icon_state - -/datum/bodypart_overlay/mutant/satyr_fluff/can_draw_on_bodypart(mob/living/carbon/human/human) - return TRUE diff --git a/monkestation/icons/mob/species/satyr/satyr_fluff.dmi b/monkestation/icons/mob/species/satyr/satyr_fluff.dmi index bc6bbbd8fa5d47698f4b96080ab92d6c007cdf62..284c12f4e89cc4f61b1d1c6a976c90cd37898bed 100644 GIT binary patch literal 1386 zcmV-w1(o`VP)%0000aP)t-sz`(%F zGt3?y9^BmAwzjtN^77Qw)ZyXb_V)HCCnp002*AL=BgSgq00001bW%=J06^y0W&i*H z-Fj45bVOxyV{&P5bZKvH004NLos(S)f-n?@uidX0dLMmw+eM*;K?c$N70Wkgf+RD{WrG4d`sTrcr$ zv?3cqcfn~C9PG3K6_JpRDrKb2O_O1Bpifh$GwB6>+H4SM=`QEE&wzSOcGi=T93F<` z&7N>j@K4{vVH~ud?*+eX5hH(M@*n^J1Pe(-K~#90?VPc0+b|G@37B?*ZheJ5fdR+P zO2Cxn0JfY}K%}6Lks&EEcIsSYD3Cs7?WVDHB#+cts%0Smhb&Tg$IptA=9g)z&km|1 zUmTJJ5P$##AOHafKmY;|XeTh5&d6bC%v2!I=ob{orV}+cje_~Am^Kc_N)e&Ihc^*{ zZNFxHvtLl4zFk}wWuxHfws>eZFyrRG?kLA9B5<*|CZiku!UDx&P6RF=pGgC2o%vO@ zjtQs*xd7_&Vc#z-u&VBefVyxeI_38CQ0ssI2007`TScXns2^!31=`%61P~I2) zT|Sx--{ow|jSON#dH=|0bQC(2_st0f007{e8T^3*1Rwwb2tWV=5P-l35zwK0Z$tv= z^#yU*d><6ptuJuuiz{!^TNFBMo-?zknn<~lE;0;{s4z`|?q2xOb6fL|{X*sU*c(Rs6{4U9Mtsuu~Uz~TaW z%0}fP3UvY`1*%Hy-Yy)zsNM5QP8T0gLW00bZa z0SG_<0uX>eCj#pUWCA0)x<9gC0VBZYdq#lnS77HWQZ)7^*zZ@s2v|1Xa{^?)g8b<= z(tS5UQF>AY%jSDdfb3VW{Q8&@s1nJC&G(FeCi@jEQxAA_GQG3;p1TRjeg)kH_PwxxgpLcMd zK*aOChnDV7;IN#{3r9en@4M_zkZmgG&;BFwz3C*7x#fN5`;>q;LC^VKF3@wnPoVwv z2|efg6xJ8$H{Ykoe1U%Ry+i4quxs~J&-vc%?i}m2_X&gE^L_e1>{+Mxxq6AP5? siG995kpQ3X2NF2s`=RcEJzWL<0H<8aJ0J78g#Z8m07*qoM6N<$f^3J86951J literal 996 zcmV005u_0{{R3dEt5<0000XP)t-sz`(%V z+}yUdw(|1w)YR1B;o5Qe8~OS#5@-j}s|2kfXS5fCf*1(JSh_C7wY zk15F4gy4EfeO!(=#m1d)_%EH{HF>X?=}!W1T&96_Gj{{7qjEblre4;^w{qRj)l(V2 zc)|Ak;DK(GfotM{*q`FxAN&%1T4Wf8VHgvD53Z(ao-*>#2kR*xgb&hL&4md zRFyt6gG;L0O(lGCRV~__K

C?}Yx<-LR(HaRK_{jQnJ;yV_?2QV3`UVT8b}yre%) zNCC_b1c7wme-8an0sG?wD0#>Y3^;+dl^Y2CL-HbR`<%d}zjW|t#J0=HOZus#M!b;= zZ9fnLp+Aykyc68pZy1JQ{6AE3fA3z-KF9*=_$=7?tOYLXg3$;0cHS626UBLRe3m?L z!Y47X<^>qIir??V9VR|0R+9-lFHW`tRiDH_?Yvp_N$G?7d9&`5(g)S^X5A;H531+Q zx=%_U)XtlAp9CLN&zs*~6Q6t$f#`$Ud2@MezVh+!;~Qn+VSn-A)ExNua1ukqFbu=^ zP|yeO27M4H#YGDAK_zh2<0`mEq3_1g8a1iBL{Q4GJ0x0000DNk~Le0001>0001>1Oos70D0kh9smFU5>QN3 zMZmzo9v&VvG&C?UFefJ`z`(#$+Km(d0004WQchC((?<-KwnM>gNKE2mrxme45A%@0$Ps0i#JoK~!jg?U{XYgCG#a7n=is;Q-oPAjt{B zjQ2lN#iqJ^$YyQ(Py2pGCM&QK8E0PJ68!|`d9HMpsBgsc@F7hRM>NLYFZA|)-H(?m z)QHFIj^mxW+rVSn^O($kC0%eF(MZ_YemPkj51w#LR}e=u65c*1UANf8ga2krXG&%y zdoXtsyTR83?swwnBH0qsEdc-k0KosE(07Tlpt4t@)PuA9NyvIda($P}m%P`Jv8`B} z&`op-Y=8^ag=E68d|pjx{M_jsi@o(MuF~2gAL4+?Zt;UCOvg2Up0iuKeDia2a>o;z zM{L7xtjDfRJyw&y2$dHD00000zl7djtSBdbN$oGXQaPE4Wz_nM#+S;;Fa@dh7k#Mx zWWUNOwZG`9;&Z*K_ZLm5NU=rt9;G(dd`Cc<+B1YL3IG5A9N`5UMe-Nh_2L8mqEs)= zV#!~W>c#qmLcLgA=`WI0FRszvBh-rl0002+r;zH!g1=aH3iV>iUo1L>da>j$7D)AC z$zLq{gnF^yFP2F4V!gj8)r-~sqVz`x{vrSX08rrryC5f*HDS4K00000NkvXXu0mjf Dk&Xl& delta 397 zcmV;80doGQ1%L!iiBL{Q4GJ0x0000DNk~Le0001h0001B1Oos704G#udH?_b4^T{0 zMZmzoG&D3G9v(0-FefJ`*R-0;00001bW%=J06^y0W&i*HiIGr#e+gNstl;YB0`?pL z14c#;7~$rR0003BNklZr`=4nA-TDX7&d#*c zmwZ<2M@R%-5O@iV0{wvl(rz<|>lt6)mwnGYWd_q-(cD^g?b#t`JE1hf%%{&cdAhhj zXV;KMklyA&m(?X*f4m084@`!ba`Us_@nsS;g})Jw<2a7<9%Q-q9O-P^WDt!$`#wNt zwTMn(d-|4M9*1T0^#$7e`$qxY>{7|`o;r@>IF3^gAbRYT6qXUEfil9N!T4y(C1j)u z5~p|! Date: Tue, 24 Oct 2023 13:03:19 -0400 Subject: [PATCH 10/11] this is temporary until someone fixes the bigger issue --- .../icons/mob/species/satyr/satyr_fluff.dmi | Bin 1386 -> 1077 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/monkestation/icons/mob/species/satyr/satyr_fluff.dmi b/monkestation/icons/mob/species/satyr/satyr_fluff.dmi index 284c12f4e89cc4f61b1d1c6a976c90cd37898bed..c97110ec5e5e89388ffe30b170b19ae41a03064c 100644 GIT binary patch delta 1029 zcmV+g1p52x3bhC!iBL{Q4GJ0x0000DNk~Le0002M0002M1Oos70HE@5G?5`df4+KD zSad{Xb7OL8aCB*JZU6vyoSjlj3c@fDT{ou)?OyzJ>q2Rf3ib*i&`A?WQkkT!-rmp( zf+#ia-W%R;F&RCUr>dsKr6L2MQ=O%Iny=O*8CBzDAiFI|B&b&UnK;iq1en?m4c942 z8ig(#HY5?q4b1pW#;yp1g7GEKe?Q9`5WLrZF;+0g{T-Rmy%6kKawyJ=1?FEPG7atG zF2g2WOt6Tz=pVP}_$|>E3pdYfxHAa|-$rG$tc&T-9(kR*se)P0VE_OE^+`lQRCt{2 zo6k<%Fc8KqtrJjheT6>3O5KF3rA=~13SqC2NDz;~0T4${Jy#qm(Wh)ee@pO8oY*F@ zs%^hd9I!LvU;YT`8|)FEnZ!bUVG;lU000000PsHnHruacXo}f-0P<}t5~U?4Wwq6Y zkq`vzF0CB<> zoRT9TRYk&I!is>nZG>#Ef5QPpajm+afB;#jV)PkT1zf7)A}rwPTTsCB4-r3q4+wbq zDL%cd1b`q2f*@#tSUs>e#q8YkyW$}hy8q|(KyIoBbYEl1@62<0M#iij$V~NsZv8Cz zol*)sy(RU4G}QyjJs*OgzpUT|1poj50000091&o~|GNU__ZMdTf4>pX?=Mhos-1ct z_4^A-zdYmrjez!$vhb7YL0?ft4FSyfe>0%s0Qq>Oub5@65^gdB%7(}7$vcrnwG5Ds z(itGXTmtC#7r11hub3GkJOIM5xj?6~W)$EBptt)QK>l0r{*5O9<2SrEU=$bA{Ra2_ z4I@DCKje-{SCs8Ce}F-X0%}))ubgiP000000002~O@Mtr!3SXT|2g;nz5tv5&$$2h z23Y*Roc8~YfU@ROuKwQ<@Nxg|1X$w#-JW29|91l{@c)hgi~o<814dKS|JRfL-wj~( z|MjH*cLW%uD6d`}06`E0LC{zmdKPA;-@qwf^fp58H^`Ebe_V}txE%Toobvks(r-}Q zA7*Z^2UInMTJvMlZ?M0)vjH0FysY_>^c(D_3M37{W~}+7-{1oPYd+~WupiwoxIMP! z6aQ~-J{TE%Yd(P*>^leW2x~s^<2=A%w)4Ux|8)%-z^>LjJkQzGd_KQP$;*oo;G9p* z=Z~ap0qf-(TN@zO6aWAK0000096Mka5+H~3MWF!I+xenkfVcBS;Q)VrJ66EE{|^Ni z{C_aOx=%3U|5ti~nokV=KNMi_|DnFYprwFc4MC@W*U|gI00000NkvXXu0mjfs1DxC delta 1341 zcmV-D1;YBZ2$nh5YizRYukr>_#n>BJch?JXd(1sdlj&5G4 zj7k?diBP&(tdPSL&7eE?V&tx%e-coCQcO1%BFW5NYWy=eW;+dQEoLlaU-AhUCqj za8U41-@{=Xw4d(ReI_38CQ0ssI2007`TScXnse+e4QX6Z9AvQXX^ z{arqq5#Qx(%8d+SLwWzmXmk`hl=saE1polxoEiLq0|X!d0SG_<0uX?}2NBSrd~ZYo z>GcJ1*nA%p*sU*c>WeFLINGf*Fp9^o=Lrhbw+m<3Me(gUqZwB*0l!`5GOG@Vh` z(XQ=(5w`!&$WVc@{S*KI0002sOd$C_xSl}NO|*Jo2hI0ce2_AUGFz1I)7ZMBKs?{K5GVu*{B24>zHie_`~pPzzJ-8z35+OS zw-697&L$oEMBmETBf4D~5H32eWm9qUAY%jSDdfb3VW{Q8&@s1nJC&G(FeCi@jEQxAA_GQG3;p1TRjeg)kH z_7KA__f*gM-tF!j>$Ud@gWmIfRA8L?gn^NC zAC}+-ix7YS1Rwwb2tWV=5I6&@3T*TJdSHR Date: Tue, 24 Oct 2023 13:25:01 -0400 Subject: [PATCH 11/11] digis satyrs --- .../code/modules/mob/living/carbon/human/species_type/satyr.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm index e2c8649f1886..a38fc3d12721 100644 --- a/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -100,10 +100,12 @@ /obj/item/bodypart/leg/left/satyr icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' limb_id = SPECIES_SATYR + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE /obj/item/bodypart/leg/right/satyr icon_greyscale = 'monkestation/icons/mob/species/satyr/bodyparts.dmi' limb_id = SPECIES_SATYR + bodytype = BODYTYPE_HUMANOID | BODYTYPE_ORGANIC | BODYTYPE_DIGITIGRADE /datum/quirk/hard_soles //Stolen from Skyrat name = "Hardened Soles"