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/__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/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 87bf13cca894..2740bc887541 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -97,7 +97,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 dbf3a02c5286..2e779c7483c6 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 7ef7a0f10c38..4cf7e40c8bc3 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -1187,10 +1187,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..015d216201f3 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/tails/satyr, GLOB.tails_list_satyr) //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 fa28f3c40cfb..8c880f3dc14b 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.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 //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" = "Short", //Monkestation Addition )) /proc/random_hairstyle(gender) diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index 15e107a01d2f..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) @@ -50,6 +51,9 @@ 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_fluff_list) //Monkestation Addition GLOBAL_LIST_INIT(color_list_ethereal, list( "Blue" = "#3399ff", 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/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/_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 68b2694deca6..144ccd221661 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 @@ -109,6 +110,9 @@ 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"] = "Tall" //Monkestation Addition + target.dna.features["satyr_ears"] = "Floppy" //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/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index fb310b3940bf..32b86cd5dbfd 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -154,3 +154,31 @@ /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/tail/satyr + +/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_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/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 ce6d491a57af..736f542db280 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..89d982fe7e1f --- /dev/null +++ b/monkestation/code/modules/client/preferences/species_features/satyr.dm @@ -0,0 +1,104 @@ +/// Satyr Horns /// + +/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() + 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 + +/// Satyr Ears /// + +/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 + +/// 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/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 + +/// Satyr Fluff /// + +/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() + 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 new file mode 100644 index 000000000000..2ab8414c4471 --- /dev/null +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/satyr_accessories.dm @@ -0,0 +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_state = "tall" + +/datum/sprite_accessory/satyr_horns/thick + name = "Thick" + icon_state = "thick" + +/datum/sprite_accessory/satyr_horns/back + name = "Back" + icon_state = "back" + +/// 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_state = "floppy" + +/datum/sprite_accessory/satyr_ears/flat + name = "Flat" + icon_state = "flat" + +/datum/sprite_accessory/satyr_ears/pointy + name = "Pointy" + icon_state = "pointy" +/// 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_state = "short" + +/// 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_state = "normal" + 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 new file mode 100644 index 000000000000..a38fc3d12721 --- /dev/null +++ b/monkestation/code/modules/mob/living/carbon/human/species_type/satyr.dm @@ -0,0 +1,141 @@ +/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 + use_skintones = TRUE + species_traits = list( + MUTCOLORS_SECONDARY, + EYECOLOR, + HAIR, + FACEHAIR + ) + inherent_traits = list( + TRAIT_NIGHT_VISION, + TRAIT_FREERUNNING, + TRAIT_ALCOHOL_TOLERANCE, + 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", + ) + meat = /obj/item/food/meat/steak + liked_food = GROSS | VEGETABLES | FRUIT + disliked_food = MEAT | DAIRY + species_language_holder = /datum/language_holder/satyr + maxhealthmod = 0.8 + stunmod = 1.2 + 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 = "u" + + 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" + 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 + 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" + 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." + +// /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")) 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..78ae7b28fd07 --- /dev/null +++ b/monkestation/code/modules/surgery/organs/external/satyr_accessories.dm @@ -0,0 +1,55 @@ +/// Satyr Horns /// + +/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_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 + +/// Satyr Ears /// + +/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_OUTER_EAR + + 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 diff --git a/monkestation/icons/misc/language.dmi b/monkestation/icons/misc/language.dmi index 8b28a744054b..b713ebff7cf3 100644 Binary files a/monkestation/icons/misc/language.dmi and b/monkestation/icons/misc/language.dmi differ diff --git a/monkestation/icons/mob/species/satyr/bodyparts.dmi b/monkestation/icons/mob/species/satyr/bodyparts.dmi new file mode 100644 index 000000000000..eff9ce0a3a2d Binary files /dev/null and b/monkestation/icons/mob/species/satyr/bodyparts.dmi differ diff --git a/monkestation/icons/mob/species/satyr/satyr_ears.dmi b/monkestation/icons/mob/species/satyr/satyr_ears.dmi new file mode 100644 index 000000000000..b1f64c84977d Binary files /dev/null and b/monkestation/icons/mob/species/satyr/satyr_ears.dmi differ 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..c97110ec5e5e Binary files /dev/null and b/monkestation/icons/mob/species/satyr/satyr_fluff.dmi differ 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 000000000000..fb1aaf704fcb Binary files /dev/null and b/monkestation/icons/mob/species/satyr/satyr_horns.dmi differ diff --git a/monkestation/icons/mob/species/satyr/satyr_tail.dmi b/monkestation/icons/mob/species/satyr/satyr_tail.dmi new file mode 100644 index 000000000000..5a0a9e59a7ef Binary files /dev/null and b/monkestation/icons/mob/species/satyr/satyr_tail.dmi differ diff --git a/monkestation/icons/obj/medical/organs/organs.dmi b/monkestation/icons/obj/medical/organs/organs.dmi index 1555c1b3fc25..9538d2d21d1f 100644 Binary files a/monkestation/icons/obj/medical/organs/organs.dmi and b/monkestation/icons/obj/medical/organs/organs.dmi differ diff --git a/tgstation.dme b/tgstation.dme index 098f2da614de..064f36c7b042 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -5806,6 +5806,7 @@ #include "monkestation\code\modules\client\preferences\species_features\arachnid.dm" #include "monkestation\code\modules\client\preferences\species_features\goblin.dm" #include "monkestation\code\modules\client\preferences\species_features\ipc.dm" +#include "monkestation\code\modules\client\preferences\species_features\satyr.dm" #include "monkestation\code\modules\client\preferences\species_features\secondary_mut_color.dm" #include "monkestation\code\modules\client\preferences\species_features\simians.dm" #include "monkestation\code\modules\clothing\accessories\accessories.dm" @@ -6014,6 +6015,7 @@ #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\ipc_chassis.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\ipc_screens.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\multi_part.dm" +#include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\satyr_accessories.dm" #include "monkestation\code\modules\mob\dead\new_player\sprite_accessories\tails.dm" #include "monkestation\code\modules\mob\living\emote.dm" #include "monkestation\code\modules\mob\living\living_defines.dm" @@ -6053,6 +6055,7 @@ #include "monkestation\code\modules\mob\living\carbon\human\species_type\oozeling.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\plasmamen.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\podpeople.dm" +#include "monkestation\code\modules\mob\living\carbon\human\species_type\satyr.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\shadowpeople.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\simian.dm" #include "monkestation\code\modules\mob\living\carbon\human\species_type\skeletons.dm" @@ -6293,6 +6296,7 @@ #include "monkestation\code\modules\surgery\organs\external\anime.dm" #include "monkestation\code\modules\surgery\organs\external\goblin_accessories.dm" #include "monkestation\code\modules\surgery\organs\external\ipc.dm" +#include "monkestation\code\modules\surgery\organs\external\satyr_accessories.dm" #include "monkestation\code\modules\surgery\organs\external\simian.dm" #include "monkestation\code\modules\surgery\organs\external\appendages\appendages.dm" #include "monkestation\code\modules\surgery\organs\external\chelicerae\chelicerae.dm"