From 2940d67c4d84d18effefa22836cb18a2ecfdf39e Mon Sep 17 00:00:00 2001 From: Rykka Stormheart Date: Tue, 28 Feb 2023 16:02:13 -0800 Subject: [PATCH] Update 1.0 Refactors lists into #defines, promptly cries. This part is agony and still worked on. Simplemobs can play injury sounds as well, selecting a sound based off a global list. Pain emotes occur based on updatehealth(), with respect to silicons and such. Pain emotes also occur at a 60% chance on traumatic shock. Simplemobs can also play death sounds based off the species sounds lists. Add Mouse, Robotic, Spider, None as options to the voice list. Fixes runtime/bug with Silicons (borgs) trying to get species var. --- code/game/sound.dm | 95 ++++++--- .../client/preference_setup/vore/02_size.dm | 193 +++++++++++++----- .../client/preference_setup/vore/07_traits.dm | 6 +- .../emotes/definitions/audible_scream_ch.dm | 51 +++-- code/modules/mob/living/bot/bot.dm | 4 +- code/modules/mob/living/carbon/brain/brain.dm | 1 + .../mob/living/carbon/carbon_defense.dm | 37 +++- code/modules/mob/living/carbon/human/emote.dm | 3 +- .../mob/living/carbon/human/human_damage.dm | 23 +++ code/modules/mob/living/carbon/human/life.dm | 18 ++ code/modules/mob/living/death.dm | 11 + code/modules/mob/living/living.dm | 20 ++ .../animal/giant_spider/_giant_spider.dm | 13 +- .../subtypes/animal/passive/mouse.dm | 9 +- .../subtypes/animal/passive/raccoon_ch.dm | 5 + .../simple_mob/subtypes/animal/pets/dog.dm | 13 +- .../simple_mob/subtypes/animal/sif/racoon.dm | 6 + .../subtypes/animal/space/mouse_army_ch.dm | 6 +- .../living/simple_mob/subtypes/animal/vox.dm | 6 + .../living/simple_mob/subtypes/blob/blob.dm | 6 +- .../living/simple_mob/subtypes/blob/spore.dm | 3 + .../simple_mob/subtypes/horror/horror .dm | 5 +- .../subtypes/humanoid/humanoid_ch.dm | 14 ++ .../subtypes/humanoid/posessed_ch.dm | 4 +- .../simple_mob/subtypes/illusion/illusion.dm | 5 +- .../subtypes/metroid/metBaseType.dm | 12 +- .../simple_mob/subtypes/metroid/metTypes.dm | 18 +- .../subtypes/occult/constructs/_construct.dm | 4 +- .../simple_mob/subtypes/occult/creature.dm | 6 +- .../simple_mob/subtypes/occult/faithless.dm | 6 +- .../simple_mob/subtypes/occult/unknown.dm | 9 +- .../simple_mob/subtypes/plant/tomato.dm | 6 +- .../living/simple_mob/subtypes/plant/tree.dm | 6 +- .../living/simple_mob/subtypes/slime/slime.dm | 10 +- .../subtypes/vore/demon/demonAI_ch.dm | 2 + .../living/simple_mob/subtypes/vore/fennec.dm | 15 +- .../simple_mob/subtypes/vore/goia_ch.dm | 8 +- .../simple_mob/subtypes/vore/greatwolf.dm | 12 +- .../simple_mob/subtypes/vore/leopardmander.dm | 7 +- .../subtypes/vore/leopardmander_ch.dm | 10 + .../living/simple_mob/subtypes/vore/otie.dm | 13 +- .../simple_mob/subtypes/vore/panther.dm | 13 +- .../living/simple_mob/subtypes/vore/wolf.dm | 17 +- .../simple_mob/subtypes/vore/wolfgirl.dm | 13 +- code/modules/mob/living/voice/voice_vr.dm | 3 +- code/modules/organs/pain.dm | 8 + .../emotes/definitions/audible_pain.dm | 57 ++++-- .../living/carbon/human/species/species.dm | 29 ++- .../living/carbon/human/species/species_vr.dm | 25 ++- .../code/modules/mob/living/living.dm | 23 ++- .../sound/voice/death/spider/spider_death.ogg | Bin 0 -> 17339 bytes sound/voice/raccoon.ogg | Bin 0 -> 43581 bytes vorestation.dme | 2 +- 53 files changed, 720 insertions(+), 171 deletions(-) create mode 100644 code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_ch.dm create mode 100644 modular_chomp/sound/voice/death/spider/spider_death.ogg create mode 100644 sound/voice/raccoon.ogg diff --git a/code/game/sound.dm b/code/game/sound.dm index 4b3998ffd2..1a88189962 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -310,37 +310,70 @@ var/list/goon_speak_roach_sound = list('sound/talksounds/goon/roach.ogg', 'sound var/list/goon_speak_skelly_sound = list('sound/talksounds/goon/skelly.ogg', 'sound/talksounds/goon/skelly_ask.ogg', 'sound/talksounds/goon/skelly_exclaim.ogg') // CHOMPEdit Start: Species Pain/Scream/Death sounds. This is probably inefficient, but I'm sure someone will yell at me or just do it better later:tm: -var/list/canine_scream_sounds = list('modular_chomp/sound/voice/scream/canine/wolf_scream.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream2.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream3.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream4.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream5.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream6.ogg') -var/list/canine_pain_sounds = list('modular_chomp/sound/voice/pain/canine/wolf_pain.ogg', 'modular_chomp/sound/voice/pain/canine/wolf_pain2.ogg', 'modular_chomp/sound/voice/pain/canine/wolf_pain3.ogg', 'modular_chomp/sound/voice/pain/canine/wolf_pain4.ogg') -var/list/canine_gasp_sounds = list('modular_chomp/sound/voice/gasp/canine/wolf_gasp.ogg') -var/list/canine_death_sounds = list('modular_chomp/sound/voice/death/canine/wolf_death1.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death2.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death3.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death4.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death5.ogg') -var/list/feline_scream_sounds = list('modular_chomp/sound/voice/scream/feline/feline_scream.ogg') -var/list/feline_pain_sounds = list('modular_chomp/sound/voice/pain/feline/feline_pain.ogg') -var/list/feline_gasp_sounds = list('modular_chomp/sound/voice/gasp/feline/feline_gasp.ogg') -var/list/feline_death_sounds = list('modular_chomp/sound/voice/death/feline/feline_death.ogg') -var/list/cervine_scream_sounds = list('modular_chomp/sound/voice/scream/cervine/cervine_scream.ogg') -// var/list/cervine_pain_sounds = list() // Doesn't exist -// var/list/cervine_gasp_sounds = list() // Doesn't exist -var/list/cervine_death_sounds = list('modular_chomp/sound/voice/death/cervine/cervine_death.ogg') -// var/list/avian_scream_sounds = list() // TBD -// var/list/avian_pain_sounds = list() // TBD -// var/list/avian_death_sounds = list() // TBD -var/list/male_generic_scream_sounds = list('modular_chomp/sound/voice/scream/generic/male/male_scream_1.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_2.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_3.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_4.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_5.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_6.ogg') -var/list/male_generic_pain_sounds = list('modular_chomp/sound/voice/pain/generic/male/male_pain_1.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_2.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_3.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_4.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_5.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_6.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_7.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_8.ogg') -var/list/male_generic_gasp_sounds = list('modular_chomp/sound/voice/gasp/generic/male/male_gasp1.ogg', 'modular_chomp/sound/voice/gasp/generic/male/male_gasp2.ogg', 'modular_chomp/sound/voice/gasp/generic/male/male_gasp3.ogg') -var/list/male_generic_death_sounds = list('modular_chomp/sound/voice/death/generic/male/male_death_1.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_2.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_3.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_4.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_5.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_6.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_7.ogg') -var/list/female_generic_scream_sounds = list('modular_chomp/sound/voice/scream/generic/female/female_scream_1.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_2.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_3.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_4.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_5.ogg') -var/list/female_generic_pain_sounds = list('modular_chomp/sound/voice/pain/generic/female/female_pain_1.ogg', 'modular_chomp/sound/voice/pain/generic/female/female_pain_2.ogg', 'modular_chomp/sound/voice/pain/generic/female/female_pain_3.ogg') -var/list/female_generic_gasp_sounds = list('modular_chomp/sound/voice/gasp/generic/female/female_gasp1.ogg', 'modular_chomp/sound/voice/gasp/generic/female/female_gasp2.ogg') -var/list/female_generic_death_sounds = list('modular_chomp/sound/voice/death/generic/female/female_death_1.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_2.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_3.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_4.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_5.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_6.ogg') +#define canine_sounds list("scream" = list('modular_chomp/sound/voice/scream/canine/wolf_scream.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream2.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream3.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream4.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream5.ogg', 'modular_chomp/sound/voice/scream/canine/wolf_scream6.ogg'), "pain" = list('modular_chomp/sound/voice/pain/canine/wolf_pain.ogg', 'modular_chomp/sound/voice/pain/canine/wolf_pain2.ogg', 'modular_chomp/sound/voice/pain/canine/wolf_pain3.ogg', 'modular_chomp/sound/voice/pain/canine/wolf_pain4.ogg'), "gasp" = list('modular_chomp/sound/voice/gasp/canine/wolf_gasp.ogg'), "death" = list('modular_chomp/sound/voice/death/canine/wolf_death1.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death2.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death3.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death4.ogg', 'modular_chomp/sound/voice/death/canine/wolf_death5.ogg')) +#define feline_sounds list("scream" = list('modular_chomp/sound/voice/scream/feline/feline_scream.ogg'), "pain" = list('modular_chomp/sound/voice/pain/feline/feline_pain.ogg'), "gasp" = list('modular_chomp/sound/voice/gasp/feline/feline_gasp.ogg'), "death" = list('modular_chomp/sound/voice/death/feline/feline_death.ogg')) +#define cervine_sounds list("scream" = list('modular_chomp/sound/voice/scream/cervine/cervine_scream.ogg'), "pain" = null, "gasp" = null, "death" = list('modular_chomp/sound/voice/death/cervine/cervine_death.ogg')) +#define robot_sounds list("scream" = list('modular_chomp/sound/voice/scream_silicon.ogg', 'modular_chomp/sound/voice/android_scream.ogg', 'modular_chomp/sound/voice/scream/robotic/robot_scream1.ogg', 'modular_chomp/sound/voice/scream/robotic/robot_scream2.ogg', 'modular_chomp/sound/voice/scream/robotic/robot_scream3.ogg'), "pain" = list('modular_chomp/sound/voice/pain/robotic/robot_pain1.ogg', 'modular_chomp/sound/voice/pain/robotic/robot_pain2.ogg', 'modular_chomp/sound/voice/pain/robotic/robot_pain3.ogg'), "gasp" = null, "death" = list('modular_chomp/sound/voice/borg_deathsound.ogg')) +#define male_generic_sounds list("scream" = list('modular_chomp/sound/voice/scream/generic/male/male_scream_1.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_2.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_3.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_4.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_5.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_6.ogg'), "pain" = list('modular_chomp/sound/voice/pain/generic/male/male_pain_1.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_2.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_3.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_4.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_5.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_6.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_7.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_8.ogg'), "gasp" = list('modular_chomp/sound/voice/gasp/generic/male/male_gasp1.ogg', 'modular_chomp/sound/voice/gasp/generic/male/male_gasp2.ogg', 'modular_chomp/sound/voice/gasp/generic/male/male_gasp3.ogg'), "death" = list('modular_chomp/sound/voice/death/generic/male/male_death_1.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_2.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_3.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_4.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_5.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_6.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_7.ogg')) +#define female_generic_sounds list("scream" = list('modular_chomp/sound/voice/scream/generic/female/female_scream_1.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_2.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_3.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_4.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_5.ogg'), "pain" = list('modular_chomp/sound/voice/pain/generic/female/female_pain_1.ogg', 'modular_chomp/sound/voice/pain/generic/female/female_pain_2.ogg', 'modular_chomp/sound/voice/pain/generic/female/female_pain_3.ogg'), "gasp" = list('modular_chomp/sound/voice/gasp/generic/female/female_gasp1.ogg', 'modular_chomp/sound/voice/gasp/generic/female/female_gasp2.ogg'), "death" = list('modular_chomp/sound/voice/death/generic/female/female_death_1.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_2.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_3.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_4.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_5.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_6.ogg')) +#define spider_sounds list("scream" = list('sound/voice/spiderchitter.ogg'), "pain" = null, "gasp" = null, "death" = list('modular_chomp/sound/voice/death/spider/spider_death.ogg')) +#define mouse_sounds list("scream" = list('sound/effects/mouse_squeak_loud.ogg'), "pain" = list('sound/effects/mouse_squeak.ogg'), "gasp" = list('sound/effects/mouse_squeak.ogg'), "death" = list('sound/effects/mouse_squeak_loud.ogg')) +#define no_sounds list("scream" = null, "pain" = null, "gasp" = null, "death" = null) +#define use_default list("scream" = null, "pain" = null, "gasp" = null, "death" = null) /* -var/list/vulpine_scream_sounds = list() -var/list/vulpine_pain_sounds = list() -var/list/vulpine_gasp_sounds = list() -var/list/vulpine_death_sounds = list() -var/list/lizard_scream_sounds = list('sound/effects/mob_effects/una_scream1.ogg','sound/effects/mob_effects/una_scream2.ogg') -var/list/lizard_pain_sounds = list() -var/list/lizard_gasp_sounds = list() -var/list/lizard_death_sounds = list() + * TBD Sound Defines below */ +/* +#define avian_sounds list( + "scream" = list(), + "pain" = list(), + "gasp" = list(), + "death" = list() +) +#define slime_sounds list( + "scream" = list(), + "pain" = list(), + "gasp" = list(), + "death" = list() +) +#define vulpine_sounds list( + "scream" = list(), + "pain" = list(), + "gasp" = list(), + "death" = list() +) +#define lizard_sounds list( + "scream" = list(), + "pain" = list(), + "gasp" = list(), + "death" = list() +) +*/ + +var/list/species_sounds = list() + +var/list/species_sound_map = list( + "Canine" = canine_sounds, + "Feline" = feline_sounds, + "Cervine" = cervine_sounds, + "Robotic" = robot_sounds, + "Human Male" = male_generic_sounds, + "Human Female" = female_generic_sounds, + "Spider" = spider_sounds, + "Mouse" = mouse_sounds, + "None" = no_sounds, + "Unset" = use_default +) + +/hook/startup/proc/Init_species_sounds() // The entries we're checking over MUST have unique keys. + for(var/i in species_sound_map) + species_sounds |= species_sound_map[i] + return 1 + +/proc/get_species_sound(var/sounds) + /* + if(user.pref.species_sounds == "Unset") + return species_sound_map[coalesce(user.pref.custom_base, user.pref.species)] + */ + return species_sound_map[sounds] // CHOMPEdit End diff --git a/code/modules/client/preference_setup/vore/02_size.dm b/code/modules/client/preference_setup/vore/02_size.dm index 99f1251238..7b3c1ae991 100644 --- a/code/modules/client/preference_setup/vore/02_size.dm +++ b/code/modules/client/preference_setup/vore/02_size.dm @@ -62,8 +62,9 @@ pref.size_multiplier = initial(pref.size_multiplier) if(!(pref.custom_speech_bubble in selectable_speech_bubbles)) pref.custom_speech_bubble = "default" - if(!(pref.species_sound)) // CHOMPEdit - pref.species_sound = "Unset" // CHOMPEdit + // var/datum/species/selected_species = GLOB.all_species[pref.species] // CHOMPEdit + if(!(pref.species_sound)) // CHOMPEdit // && selected_species.selects_bodytype + pref.species_sound = "Unset" // CHOMPEdit - otherwise, we leave this as null or w/e the default is /datum/category_item/player_setup_item/vore/size/copy_to_mob(var/mob/living/carbon/human/character) character.weight = pref.weight_vr @@ -120,10 +121,10 @@ . += "Test Selected Voice
" . += "Custom Speech Bubble: [pref.custom_speech_bubble]
" // CHOMPEdit Start: Pain/Scream/Death Custom Sounds - var/datum/species/selected_species = GLOB.all_species[pref.species] - if(selected_species.selects_bodytype) - . += "
" - . += "Species Sounds: [pref.species_sound]
" + // var/datum/species/selected_species = GLOB.all_species[pref.species] + // if(selected_species.selects_bodytype) + . += "
" + . += "Species Injury Sounds: [pref.species_sound]
" . += "Test Scream Sounds
" . += "Test Pain Sounds
" . += "Test Gasp Sounds
" @@ -273,26 +274,28 @@ return TOPIC_REFRESH // CHOMPEdit // CHOMPEdit Start: Pain/Scream/Death sounds else if(href_list["species_sound_options"]) // You shouldn't be able to see this option if you don't have the option to select a custom icon base, so we don't need to re-check for safety here. - var/list/possible_species_sound_types = list( - "Unset", - "Generic/Human", - "Canine", - "Feline", - "Cervine") - //"Vulpine") TBD! Need moar sounds. :3 + var/list/possible_species_sound_types = species_sound_map + testing("Loading species sound types for selection.") var/choice = tgui_input_list(usr, "Which set of sounds would you like to use for your character's pain, death, gasp, and scream sounds?", "Species Sounds", possible_species_sound_types) if(!choice) return TOPIC_REFRESH // No choice? Don't reset our selection else pref.species_sound = choice + testing("Setting species sound type to [choice].") return TOPIC_REFRESH else if(href_list["scream_test"]) var/datum/species/selected_species = GLOB.all_species[pref.species] - if(selected_species.selects_bodytype) - var/sound/S + // if(selected_species.selects_bodytype) + var/sound/S + testing("About to test our voice. User is [user]. Our chosen species sound is [pref.species_sound].") + testing("Species Sound map returns [get_species_sound(pref.species_sound)].") + testing("We are fetching a sound, and will get [pick(species_sound_map[pref.species_sound["scream"]])].") + S = sound(pick(species_sound_map[pref.species_sound["scream"]])) + //S = sound(pick(get_species_sound(pref.species_sound["scream"]))) + /* switch(pref.species_sound) if("Canine") - S = sound(pick(canine_scream_sounds)) + S = sound(pick(canine_sounds["scream"])) if("Feline") S = sound(pick(feline_scream_sounds)) if("Cervine") @@ -303,38 +306,60 @@ else S = sound(pick(male_generic_scream_sounds)) if("Unset") - var/datum/species/os = GLOB.all_species[pref.custom_base] + var/datum/species/os + if(!pref.custom_base) // Safety + os = selected_species + else + os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) S = sound(pick(os.female_scream_sound)) else S = sound(pick(os.male_scream_sound)) - S.frequency = pick(pref.voice_freq) - S.volume = 20 - SEND_SOUND(user, S) + if("Robotic") + S = sound(pick(robot_scream_sounds)) + if("None" || null) + to_chat(user, "This set does not have scream sounds!") + return TOPIC_REFRESH + */ + if(pref.species_sound == "Unset") + S = sound(pick(get_species_sound(coalesce(pref.species_sound, pref.custom_base, pref.species))["scream"])) + if(pref.species_sound == "None" || pref.species_sound["scream"] == null || S == null) + to_chat(user, "This set does not have scream sounds!") return TOPIC_REFRESH + S.frequency = pick(pref.voice_freq) + S.volume = 20 + SEND_SOUND(user, S) + return TOPIC_REFRESH + /* else var/sound/S - var/datum/species/os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) - S = sound(pick(os.female_scream_sound)) + S = sound(pick(selected_species.female_scream_sound)) else - S = sound(pick(os.male_scream_sound)) + S = sound(pick(selected_species.male_scream_sound)) + if(S == null) + to_chat(user, "This species does not have scream sounds!") + return TOPIC_REFRESH S.frequency = pick(pref.voice_freq) S.volume = 20 SEND_SOUND(user, S) return TOPIC_REFRESH + */ else if(href_list["pain_test"]) var/datum/species/selected_species = GLOB.all_species[pref.species] - if(selected_species.selects_bodytype) - var/sound/S + //if(selected_species.selects_bodytype) + var/sound/S + S = sound(pick(species_sound_map[pref.species_sound["pain"]])) + //S = sound(pick(get_species_sound(pref.species_sound["pain"]))) + /* switch(pref.species_sound) if("Canine") S = sound(pick(canine_pain_sounds)) if("Feline") S = sound(pick(feline_pain_sounds)) if("Cervine") - to_chat("This set does not have pain sounds!") + to_chat(user, "This set does not have pain sounds!") return TOPIC_REFRESH if("Generic/Human") if(pref.identifying_gender == FEMALE) @@ -342,37 +367,59 @@ else S = sound(pick(male_generic_pain_sounds)) if("Unset") - var/datum/species/os = GLOB.all_species[pref.custom_base] + var/datum/species/os + if(!pref.custom_base) // Safety + os = selected_species + else + os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) S = sound(pick(os.female_pain_sound)) else S = sound(pick(os.male_pain_sound)) - S.frequency = pick(pref.voice_freq) - S.volume = 20 - SEND_SOUND(user, S) + if("Robotic") + S = sound(pick(robot_pain_sounds)) + if("None" || null) + to_chat(user, "This set does not have pain sounds!") + return TOPIC_REFRESH + */ + if(pref.species_sound == "Unset") + S = sound(pick(get_species_sound(coalesce(pref.species_sound, pref.custom_base, pref.species))["pain"])) + if(pref.species_sound == "None" || pref.species_sound["pain"] == null || S == null) + to_chat(user, "This set does not have pain sounds!") return TOPIC_REFRESH + S.frequency = pick(pref.voice_freq) + S.volume = 20 + SEND_SOUND(user, S) + return TOPIC_REFRESH + /* else var/sound/S - var/datum/species/os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) - S = sound(pick(os.female_pain_sound)) + S = sound(pick(selected_species.female_pain_sound)) else - S = sound(pick(os.male_pain_sound)) + S = sound(pick(selected_species.male_pain_sound)) + if(S == null) + to_chat(user, "This species does not have pain sounds!") + return TOPIC_REFRESH S.frequency = pick(pref.voice_freq) S.volume = 20 SEND_SOUND(user, S) return TOPIC_REFRESH + */ else if(href_list["gasp_test"]) var/datum/species/selected_species = GLOB.all_species[pref.species] - if(selected_species.selects_bodytype) - var/sound/S + // if(selected_species.selects_bodytype) + var/sound/S + S = sound(pick(species_sound_map[pref.species_sound["gasp"]])) + //S = sound(pick(get_species_sound(pref.species_sound["gasp"]))) + /* switch(pref.species_sound) if("Canine") S = sound(pick(canine_gasp_sounds)) if("Feline") S = sound(pick(feline_gasp_sounds)) if("Cervine") - to_chat("This set does not have gasp sounds!") + to_chat(user, "This set does not have gasp sounds!") return TOPIC_REFRESH if("Generic/Human") if(pref.identifying_gender == FEMALE) @@ -380,30 +427,53 @@ else S = sound(pick(male_generic_gasp_sounds)) if("Unset") - var/datum/species/os = GLOB.all_species[pref.custom_base] + var/datum/species/os + if(!pref.custom_base) // Safety + os = selected_species + else + os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) S = sound(pick(os.female_gasp_sound)) else S = sound(pick(os.male_gasp_sound)) - S.frequency = pick(pref.voice_freq) - S.volume = 20 - SEND_SOUND(user, S) + if("Robotic") + to_chat(user, "This set does not have gasp sounds!") + return TOPIC_REFRESH + if("None" || null) + to_chat(user, "This set does not have gasp sounds!") + return TOPIC_REFRESH + */ + if(pref.species_sound == "Unset") + S = sound(pick(get_species_sound(coalesce(pref.species_sound, pref.custom_base, pref.species))["gasp"])) + if(pref.species_sound == "None" || pref.species_sound["gasp"] == null || S == null) + to_chat(user, "This set does not have gasp sounds!") return TOPIC_REFRESH + S.frequency = pick(pref.voice_freq) + S.volume = 20 + SEND_SOUND(user, S) + return TOPIC_REFRESH + /* else var/sound/S - var/datum/species/os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) - S = sound(pick(os.female_gasp_sound)) + S = sound(pick(selected_species.female_gasp_sound)) else - S = sound(pick(os.male_gasp_sound)) + S = sound(pick(selected_species.male_gasp_sound)) + if(S == null) + to_chat(user, "This species does not have gasp sounds!") + return TOPIC_REFRESH S.frequency = pick(pref.voice_freq) S.volume = 20 SEND_SOUND(user, S) return TOPIC_REFRESH + */ else if(href_list["death_test"]) var/datum/species/selected_species = GLOB.all_species[pref.species] - if(selected_species.selects_bodytype) - var/sound/S + // if(selected_species.selects_bodytype) + var/sound/S + S = sound(pick(species_sound_map[pref.species_sound["death"]])) + // S = sound(pick(get_species_sound(pref.species_sound["death"]))) + /* switch(pref.species_sound) if("Canine") S = sound(pick(canine_death_sounds)) @@ -417,25 +487,44 @@ else S = sound(pick(male_generic_death_sounds)) if("Unset") - var/datum/species/os = GLOB.all_species[pref.custom_base] + var/datum/species/os + if(!pref.custom_base) // Safety + os = selected_species + else + os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) S = sound(pick(os.female_death_sound)) else S = sound(pick(os.male_death_sound)) - S.frequency = pick(pref.voice_freq) - S.volume = 20 - SEND_SOUND(user, S) + if("Robotic") + S = sound(pick(robot_death_sounds)) + if("None" || null) + to_chat(user, "This set does not have death sounds!") + return TOPIC_REFRESH + */ + if(pref.species_sound == "Unset") + S = sound(pick(get_species_sound(coalesce(pref.species_sound, pref.custom_base, pref.species))["death"])) + if(pref.species_sound == "None" || pref.species_sound["gasp"] == null || S == null) + to_chat(user, "This set does not have gasp sounds!") return TOPIC_REFRESH + S.frequency = pick(pref.voice_freq) + S.volume = 20 + SEND_SOUND(user, S) + return TOPIC_REFRESH + /* else var/sound/S - var/datum/species/os = GLOB.all_species[pref.custom_base] if(pref.identifying_gender == FEMALE) - S = sound(pick(os.female_death_sound)) + S = sound(pick(selected_species.female_death_sound)) else - S = sound(pick(os.male_death_sound)) + S = sound(pick(selected_species.male_death_sound)) + if(S == null) + to_chat(user, "This species does not have death sounds!") + return TOPIC_REFRESH S.frequency = pick(pref.voice_freq) S.volume = 20 SEND_SOUND(user, S) return TOPIC_REFRESH + */ // CHOMPEdit End return ..(); diff --git a/code/modules/client/preference_setup/vore/07_traits.dm b/code/modules/client/preference_setup/vore/07_traits.dm index 56df5dd245..c6f1905f2c 100644 --- a/code/modules/client/preference_setup/vore/07_traits.dm +++ b/code/modules/client/preference_setup/vore/07_traits.dm @@ -257,8 +257,12 @@ //Any additional non-trait settings can be applied here new_S.blood_color = pref.blood_color - if(pref.species_sound && new_S.selects_bodytype && pref.custom_base) // CHOMPEdit: Custom Scream/Death/Gasp/Pain Sounds. Don't try to do this if it doesn't exist, we aren't a custom species, and we don't have a custom base. + /* + if(pref.species_sound) // CHOMPEdit: Custom Scream/Death/Gasp/Pain Sounds. Don't try to do this if it doesn't exist. // && new_S.selects_bodytype && pref.custom_base) // we aren't a custom species, and we don't have a custom base. new_S.copy_species_sounds(new_S, pref.species_sound, pref.custom_base) // CHOMPEdit: Custom Scream/Death/Gasp/Pain Sounds + */ + // CHOMPEdit: Custom Scream/Death/Gasp/Pain Sounds. + new_S.species_sounds = coalesce(pref.species_sound, pref.custom_base, pref.species) if(pref.species == SPECIES_CUSTOM) //Statistics for this would be nice diff --git a/code/modules/emotes/definitions/audible_scream_ch.dm b/code/modules/emotes/definitions/audible_scream_ch.dm index fd66ca5d58..591fb31d73 100644 --- a/code/modules/emotes/definitions/audible_scream_ch.dm +++ b/code/modules/emotes/definitions/audible_scream_ch.dm @@ -1,17 +1,40 @@ /decl/emote/audible/scream/get_emote_sound(var/atom/user) ..() - var/mob/living/carbon/human/H = user - if(H.get_gender() == FEMALE) - return list( - "sound" = H.species.female_scream_sound, - "vol" = 60, - "exr" = 20, - "volchannel" = VOLUME_CHANNEL_INJ_DEATH - ) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.get_gender() == FEMALE) + return list( + "sound" = H.species.female_scream_sound, + "vol" = 60, + "exr" = 20, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + else + return list( + "sound" = H.species.male_scream_sound, + "vol" = 60, + "exr" = 20, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + /* // Not sure if needed, screams are a carbon-only thing rn. else - return list( - "sound" = H.species.male_scream_sound, - "vol" = 60, - "exr" = 20, - "volchannel" = VOLUME_CHANNEL_INJ_DEATH - ) + var/mob/living/M = user + if((M.get_gender() == FEMALE) && female_scream_sound) // If our mob has custom sounds per-gender defined, most won't. + return list( + "sound" = female_scream_sound, + "vol" = 60, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + else if((M.get_gender() == MALE) && male_scream_sound) // If our mob has custom sounds per-gender defined, most won't. + return list( + "sound" = male_scream_sound, + "vol" = 60, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + else + return list( + "sound" = scream_sound, + "vol" = 60, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + */ diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 1aefd5e2a4..06eca155a1 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -42,6 +42,8 @@ var/frustration = 0 var/max_frustration = 0 + can_pain_emote = FALSE // CHOMPEdit: Sanity/safety, if bots ever get emotes later, undo this + /mob/living/bot/New() ..() update_icons() @@ -325,7 +327,7 @@ if(makeStep(patrol_path)) frustration = 0 else if(max_frustration) - frustration++ + frustration++ //CHOMPEdit End return diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm index d4c40c6179..ce7110203b 100644 --- a/code/modules/mob/living/carbon/brain/brain.dm +++ b/code/modules/mob/living/carbon/brain/brain.dm @@ -9,6 +9,7 @@ icon = 'icons/obj/surgery.dmi' icon_state = "brain1" no_vore = TRUE //VOREStation Edit - PLEASE. lol. + can_pain_emote = FALSE // CHOMPEdit: Sanity/safety /mob/living/carbon/brain/Initialize() . = ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index df195a495e..0e2e7598ff 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -152,4 +152,39 @@ damage = damage * damage_mod - return damage \ No newline at end of file + return damage + +/* + * CHOMPEdit Start: Pain/etc calculations, but more efficient:tm: - this should work for literally anything that applies to health. Far better than slapping emote("pain") everywhere like scream does. + * The reason we're doing this here is to enable carbons to handle pain differently if they need to - in this case, we're going to check if we're synthetic here, anyways. Essentially a dupe of human_damage.dm's updatehealth() + * Human updatehealth() doesn't call parent, so we can safely ignore human checks, but we're going to put sanity in anyways +*/ +/mob/living/carbon/updatehealth() + if(status_flags & GODMODE) + health = 100 + set_stat(CONSCIOUS) + else + var/initialhealth = health // CHOMPEdit: Getting our health before this check + health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss + if(!((ishuman(src)) || (issilicon(src))) && can_feel_pain() || ((src.isSynthetic() && synth_cosmetic_pain))) // Only run this if we're non-human/non-silicon + can feel pain, bc humans already do this. human_damage doesn't call parent, but sanity is better here. + if(health < initialhealth) // Did we lose health? + // Yes. How much by? + var/damage = initialhealth - health // Get our damage (say, 200 - 180 = 20, etc etc) + var/pain_noise + if(species) + pain_noise = (damage * species.pain_mod) // Multiply the incoming damage by our mod. 50 damage becomes 25 x 0.6 on highest strength, meaning prob 15. 50 x 1.4 means prob 35, etc. + else // Sanity, in case we don't have a species + pain_noise = (damage * rand(0.5, 1.5)) // Multiply damage by our rand mod. 50 damage becomes 50 x 0.5, means prob 25. 50 x 1.5 means prob 75, etc. + switch(damage) + if(-INFINITY to 0) + return + if(1 to 25) + if(prob(pain_noise) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + if(26 to 50) + if(prob(pain_noise * 1.5) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + if(51 to INFINITY) + if(prob(pain_noise * 3) && !isbelly(loc)) // More likely, most severe damage. No pain noises inside bellies. + emote("pain") + // CHOMPEdit End: Pain diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index a03f7a6749..cc4623e299 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -317,7 +317,8 @@ var/list/_simple_mob_default_emotes = list( /decl/emote/audible/purr, /decl/emote/audible/purrlong, //CHOMP Add start - /decl/emote/audible/prbt2 + /decl/emote/audible/prbt2, + /decl/emote/audible/pain //CHOMP Add end ) //VOREStation Add End diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 016e363548..c149f3cf86 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -15,7 +15,30 @@ total_brute += O.brute_dam total_burn += O.burn_dam + // CHOMPEdit Start: Pain/etc calculations, but more efficient:tm: - this should work for literally anything that applies to health. Far better than slapping emote("pain") everywhere like scream does. + var/initialhealth = health // CHOMPEdit: Getting our health before this check health = getMaxHealth() - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute + if(can_feel_pain() || ((isSynthetic() && synth_cosmetic_pain))) // Are we capable of feeling pain? + if(health < initialhealth) // Did we lose health? + // Yes. How much by? + var/damage = initialhealth - health // Get our damage (say, 200 - 180 = 20, etc etc) + var/pain_noise = (damage * species.pain_mod) // Multiply the incoming damage by our mod. 50 damage becomes 25 x 0.6 on highest strength, meaning prob 15. 50 x 1.4 means prob 35, etc. + switch(damage) + if(-INFINITY to 0) + //TODO: fix husking + if( ((getMaxHealth() - total_burn) < config.health_threshold_dead * huskmodifier) && stat == DEAD) + ChangeToHusk() + return + if(1 to 25) + if(prob(pain_noise) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + if(26 to 50) + if(prob(pain_noise * 1.5) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + if(51 to INFINITY) + if(prob(pain_noise * 3) && !isbelly(loc)) // More likely, most severe damage. No pain noises inside bellies. + emote("pain") + // CHOMPEdit End: Pain //TODO: fix husking if( ((getMaxHealth() - total_burn) < config.health_threshold_dead * huskmodifier) && stat == DEAD) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 333d99b5c0..2f96c378fd 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -1857,6 +1857,10 @@ if(shock_stage == 40) if(traumatic_shock >= 80) to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") + // CHOMPEdit: Pain + if(prob(60) && !isbelly(loc)) // Hopefully not spammy, only 60% of the time will we groan in pain + sanity for in-belly + emote("pain") + // CHOMPEdit End if (shock_stage >= 60) if(shock_stage == 60 && !isbelly(loc)) //VOREStation Edit @@ -1864,23 +1868,37 @@ if (prob(2)) if(traumatic_shock >= 80) to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") + // CHOMPEdit: Pain + if(prob(60) && !isbelly(loc)) // Hopefully not spammy, only 60% of the time will we groan in pain + sanity for in-belly + emote("pain") + // CHOMPEdit End Weaken(20) if(shock_stage >= 80) if (prob(5)) if(traumatic_shock >= 80) to_chat(src, "[pick("The pain is excruciating", "Please, just end the pain", "Your whole body is going numb")]!") + // CHOMPEdit: Pain + if(prob(60) && !isbelly(loc)) // Hopefully not spammy, only 80% of the time will we groan in pain + sanity for in-belly + emote("pain") + // CHOMPEdit End Weaken(20) if(shock_stage >= 120) if (prob(2)) if(traumatic_shock >= 80) to_chat(src, "[pick("You black out", "You feel like you could die any moment now", "You are about to lose consciousness")]!") + // CHOMPEdit: Pain + if(prob(60) && !isbelly(loc)) // Hopefully not spammy, only 60% of the time will we groan in pain + sanity for in-belly + emote("pain") + // CHOMPEdit End Paralyse(5) if(shock_stage == 150) if(!isbelly(loc)) //VOREStation Edit custom_emote(VISIBLE_MESSAGE, "can no longer stand, collapsing!") + if(prob(60)) // Hopefully not spammy, only 60% of the time will we groan in pain + emote("pain") Weaken(20) if(shock_stage >= 150) diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index a5e5fece26..c81c355617 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -26,4 +26,15 @@ for(var/datum/soul_link/S as anything in shared_soul_links) S.sharer_died(gibbed) + // CHOMPStation Add: All mobs can play a death_sound if set. On carbons, this is going to be handled by species. + if(!gibbed && (male_death_sound || female_death_sound) && !isbelly(loc)) + var/gender = src.gender + if(gender == FEMALE) + playsound(src, pick(female_death_sound), 40, 1, 20, volume_channel = VOLUME_CHANNEL_INJ_DEATH) + else // Until we get more, sorry. :c + playsound(src, pick(male_death_sound), 40, 1, 20, volume_channel = VOLUME_CHANNEL_INJ_DEATH) + else if(!gibbed && death_sound && !isbelly(loc)) + playsound(src, pick(death_sound), 40, 1, 20, volume_channel = VOLUME_CHANNEL_INJ_DEATH) + // CHOMPStation Add End + . = ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index f0bac492f7..09af0eab04 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -123,7 +123,27 @@ health = 100 set_stat(CONSCIOUS) else + // CHOMPEdit Start: Pain/etc calculations, but more efficient:tm: - this should work for literally anything that applies to health. Far better than slapping emote("pain") everywhere like scream does. + var/initialhealth = health // CHOMPEdit: Getting our health before this check health = getMaxHealth() - getOxyLoss() - getToxLoss() - getFireLoss() - getBruteLoss() - getCloneLoss() - halloss + if(!((ishuman(src)) || (issilicon(src))) && src.can_pain_emote) // Only run this if we're non-human/non-silicon (bots and mechanical simplemobs should be allowed to make pain sounds) & can emote pain, bc humans + carbons already do this. human_damage doesn't call parent, but sanity is better here. + if(health < initialhealth) // Did we lose health? + // Yes. How much by? + var/damage = initialhealth - health // Get our damage (say, 200 - 180 = 20, etc etc) + var/pain_noise = (damage * rand(0.5, 1.5)) // Multiply damage by our rand mod. 50 damage becomes 50 x 0.5, means prob 25. 50 x 1.5 means prob 75, etc. + switch(damage) + if(-INFINITY to 0) + return + if(1 to 25) + if(prob(pain_noise) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + if(26 to 50) + if(prob(pain_noise * 1.5) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + if(51 to INFINITY) + if(prob(pain_noise * 3) && !isbelly(loc)) // More likely, most severe damage. No pain noises inside bellies. + emote("pain") + // CHOMPEdit End: Pain //This proc is used for mobs which are affected by pressure to calculate the amount of pressure that actually //affects them once clothing is factored in. ~Errorage diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm index 33677238c0..7bd021aa2d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/giant_spider/_giant_spider.dm @@ -118,6 +118,17 @@ ) can_be_drop_prey = FALSE //CHOMP Add + pain_emote_1p = list("chitter", "click") //CHOMP Add + pain_emote_3p = list("chitters", "clicks") //CHOMP Add + +// CHOMPAdd: Has to be done on Init or New, bc we can't set a var to a non-constant +/mob/living/simple_mob/animal/giant_spider/Initialize() + pain_sound = get_species_sound(spider_sounds["pain"]) + death_sound = get_species_sound(spider_sounds["death"]) + + . = ..() + +// CHOMPAdd End /mob/living/simple_mob/animal/giant_spider/apply_melee_effects(var/atom/A) if(isliving(A)) @@ -148,4 +159,4 @@ poison_per_bite *= 1.3 /decl/mob_organ_names/spider - hit_zones = list("cephalothorax", "abdomen", "left forelegs", "right forelegs", "left hind legs", "right hind legs", "pedipalp", "mouthparts") \ No newline at end of file + hit_zones = list("cephalothorax", "abdomen", "left forelegs", "right forelegs", "left hind legs", "right hind legs", "pedipalp", "mouthparts") diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm index 88908ba29d..eea43d2f5c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/mouse.dm @@ -41,14 +41,19 @@ say_list_type = /datum/say_list/mouse var/body_color //brown, gray and white, leave blank for random - + //CHOMP Addition: Added these vore variables in and swapped the booleans from their defaults too. can_be_drop_prey = TRUE can_be_drop_pred = FALSE + pain_emote_1p = list("squeak", "squik") // CHOMP Addition: Pain/etc sounds + pain_emote_1p = list("squeaks", "squiks") // CHOMP Addition: Pain/etc sounds + /mob/living/simple_mob/animal/passive/mouse/New() ..() + pain_sound = get_species_sound(mouse_sounds["pain"]) // CHOMP Addition: Pain/etc sounds + verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide @@ -177,7 +182,7 @@ min_n2 = 0 max_n2 = 0 maxbodytemp = 700 - + ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive //The names Cheese... Agent Cheese diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm b/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm index 198dd4e96f..68b4cd7192 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/passive/raccoon_ch.dm @@ -33,6 +33,11 @@ vore_icons = SA_ICON_LIVING | SA_ICON_REST center_offset = 0 + pain_sound = list('sound/voice/raccoon.ogg') + pain_emote_1p = list("chitter") + pain_emote_3p = list("chitters") + death_sound = list('sound/voice/raccoon.ogg') + /mob/living/simple_mob/animal/passive/raccoon_ch/Initialize() . = ..() ghostjoin = 1 diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm index 33acad33df..5032c9bb9a 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/dog.dm @@ -27,6 +27,17 @@ var/obj/item/inventory_head var/obj/item/inventory_back + // CHOMPAdd: :c + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + +// CHOMPAdd: Has to be done on Init or New, bc we can't set a var to a non-constant +/mob/living/simple_mob/animal/passive/dog/Initialize() + pain_sound = get_species_sound(canine_sounds["pain"]) + death_sound = get_species_sound(canine_sounds["death"]) + + . = ..() +// CHOMPAdd End /mob/living/simple_mob/animal/passive/dog/attackby(var/obj/item/O as obj, var/mob/user as mob) if(istype(O, /obj/item/weapon/newspaper)) @@ -284,4 +295,4 @@ icon_dead = "brittany_dead" /decl/mob_organ_names/corgi - hit_zones = list("head", "body", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "tail", "heart") //You monster. \ No newline at end of file + hit_zones = list("head", "body", "left foreleg", "right foreleg", "left hind leg", "right hind leg", "tail", "heart") //You monster. diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm index 45e5f92f0a..07241a97be 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/sif/racoon.dm @@ -69,6 +69,12 @@ var/list/friend_loot_list = list(/obj/item/weapon/coin) // What will make this animal non-hostile if held? var/randomize_size = TRUE can_be_drop_prey = TRUE //CHOMP Add + // CHOMPAdd: Pain/Death Sounds + pain_sound = list('sound/voice/raccoon.ogg') + pain_emote_1p = list("chitter") + pain_emote_3p = list("chitters") + death_sound = list('sound/voice/raccoon.ogg') + /mob/living/simple_mob/animal/sif/sakimm/verb/remove_hat() set name = "Remove Hat" diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army_ch.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army_ch.dm index 420f3a498f..acebd2dac7 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/space/mouse_army_ch.dm @@ -62,12 +62,16 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive var/rank //pyro, operative, ammo, stealth. more to come. Do not leave blank. - + can_be_drop_prey = FALSE //CHOMP Add + pain_emote_1p = list("squeak", "squik") // CHOMP Addition: Pain/etc sounds + pain_emote_1p = list("squeaks", "squiks") // CHOMP Addition: Pain/etc sounds /mob/living/simple_mob/animal/space/mouse_army/New() ..() + pain_sound = get_species_sound(mouse_sounds["pain"]) // CHOMPAdd: Pain sounds + verbs += /mob/living/proc/ventcrawl verbs += /mob/living/proc/hide diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm b/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm index 78063ee90a..cb8baa8cd8 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/vox.dm @@ -8,6 +8,12 @@ min_n2 = 0 //breathe N2 max_n2 = 0 + // CHOMPAdd: Pain sounds + pain_sound = list('sound/voice/shriek1.ogg') + pain_emote_1p = list("shriek") + pain_emote_3p = list("shrieks") + // CHOMPAdd End + /mob/living/simple_mob/vox/armalis name = "serpentine alien" real_name = "serpentine alien" diff --git a/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm b/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm index 9cd2582bd1..7da6ffcbf5 100644 --- a/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm +++ b/code/modules/mob/living/simple_mob/subtypes/blob/blob.dm @@ -29,8 +29,10 @@ mob_class = MOB_CLASS_SLIME ai_holder_type = /datum/ai_holder/simple_mob/melee - + can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds /mob/living/simple_mob/blob/speech_bubble_appearance() return "slime" @@ -88,4 +90,4 @@ return ally /decl/mob_organ_names/blob - hit_zones = list("mass") \ No newline at end of file + hit_zones = list("mass") diff --git a/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm b/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm index 4d4fda0c29..3ddce6c5a0 100644 --- a/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm +++ b/code/modules/mob/living/simple_mob/subtypes/blob/spore.dm @@ -30,6 +30,9 @@ var/can_infest = FALSE var/is_infesting = FALSE + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds + /datum/say_list/spore emote_see = list("sways", "inflates briefly") diff --git a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm index 472af6dd6b..dcf781d20c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm +++ b/code/modules/mob/living/simple_mob/subtypes/horror/horror .dm @@ -4,6 +4,9 @@ icon = 'icons/mob/horror_show/GHPS.dmi' icon_gib = "generic_gib" + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds + /datum/ai_holder/simple_mob/horror hostile = TRUE // The majority of simplemobs are hostile, gaslamps are nice. cooperative = FALSE @@ -26,4 +29,4 @@ minbodytemp = 0 maxbodytemp = 700 - can_be_drop_prey = FALSE //CHOMP Add \ No newline at end of file + can_be_drop_prey = FALSE //CHOMP Add diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_ch.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_ch.dm new file mode 100644 index 0000000000..192cd4f21f --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/humanoid_ch.dm @@ -0,0 +1,14 @@ +// Basically, all we're doing here (for now) is defining pain/etc sounds for combat use +/mob/living/simple_mob/humanoid + pain_emote_1p = list("shout out in pain", "growl in pain", "grunt in pain", "gasp out in pain") + pain_emote_3p = list("shouts out in pain", "growls in pain", "grunts in pain", "gasps out in pain") + +/mob/living/simple_mob/humanoid/Initialize() + pain_sound = get_species_sound(male_generic_sounds["pain"]) + female_pain_sound = get_species_sound(female_generic_sounds["pain"]) + male_pain_sound = get_species_sound(male_generic_sounds["pain"]) + death_sound = get_species_sound(male_generic_sounds["death"]) + male_death_sound = get_species_sound(male_generic_sounds["death"]) + female_death_sound = get_species_sound(female_generic_sounds["death"]) + + . = ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/humanoid/posessed_ch.dm b/code/modules/mob/living/simple_mob/subtypes/humanoid/posessed_ch.dm index ee87745973..cb7ccffe66 100644 --- a/code/modules/mob/living/simple_mob/subtypes/humanoid/posessed_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/humanoid/posessed_ch.dm @@ -47,6 +47,8 @@ ai_holder_type = /datum/ai_holder/simple_mob/merc say_list_type = /datum/say_list/possessed //Set to Null on silenced. + can_pain_emote = FALSE + death_sound = null // corpse = /obj/effect/landmark/mobcorpse/possessed // Will eventually leave a full corpse with an activated RIG on it. But not yet. @@ -155,4 +157,4 @@ desc = "A blood-red hardsuit featuring some fairly illegal technology. Seems to be worn down and damaged but moving with surprising speed!" movement_cooldown = 3 //You can try running base_attack_cooldown = 3 //You will just die tired - melee_miss_chance = 25 //Not very coordinated though \ No newline at end of file + melee_miss_chance = 25 //Not very coordinated though diff --git a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm index b20bdbb4cd..e56a37fb41 100644 --- a/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm +++ b/code/modules/mob/living/simple_mob/subtypes/illusion/illusion.dm @@ -24,6 +24,9 @@ var/atom/movable/copying = null // The thing we're trying to look like. var/realistic = FALSE // If true, things like bullets and weapons will hit it, to be a bit more convincing from a distance. + can_pain_emote = FALSE // CHOMPEdit: Hallucinations can't feel pain and shouldn't take damage anyways, but, sanity + death_sound = null // CHOMPEdit: Hallucinations shouldn't trigger death sounds anyways, but, sanity + /mob/living/simple_mob/illusion/update_icon() // We don't want the appearance changing AT ALL unless by copy_appearance(). return @@ -113,4 +116,4 @@ /mob/living/simple_mob/illusion/get_catalogue_delay() if(copying) - return copying.get_catalogue_delay() \ No newline at end of file + return copying.get_catalogue_delay() diff --git a/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm b/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm index 57cc5f4b0b..bc5cc64282 100644 --- a/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm +++ b/code/modules/mob/living/simple_mob/subtypes/metroid/metBaseType.dm @@ -59,9 +59,15 @@ var/evo_limit = 0 var/next meat_type = /obj/item/toy/figure/bounty_hunter - + can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = TRUE + pain_sound = list('sound/metroid/metroidsee.ogg') + pain_emote_1p = list("skree") + pain_emote_3p = list("skrees") + death_sound = list('sound/metroid/metroiddeath.ogg') + /mob/living/simple_mob/metroid/Initialize() nutrition = 100 //Have them start off pretty hungry still. existing_metroids += src //Keep track of how many for the event. @@ -114,5 +120,5 @@ ) /mob/living/simple_mob/metroid/death() - playsound(src, 'sound/metroid/metroiddeath.ogg', 75, 1) - ..() \ No newline at end of file + // playsound(src, 'sound/metroid/metroiddeath.ogg', 75, 1) + ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm b/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm index 3e5e64ecf8..fe7a0be005 100644 --- a/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm +++ b/code/modules/mob/living/simple_mob/subtypes/metroid/metTypes.dm @@ -71,7 +71,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. /mob/living/simple_mob/metroid/mine/death() - playsound(src, 'sound/metroid/metroiddeath.ogg', 50, 1) + // playsound(src, 'sound/metroid/metroiddeath.ogg', 50, 1) ..() if(prob(20)) visible_message("\The [src] dropped some toy!") @@ -213,7 +213,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. ..() /mob/living/simple_mob/metroid/juvenile/super/death() - playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) + // playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) ..() /mob/living/simple_mob/metroid/juvenile/alpha @@ -266,7 +266,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. ..() /mob/living/simple_mob/metroid/juvenile/alpha/death() - playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) + // playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) ..() /mob/living/simple_mob/metroid/juvenile/alpha //active noms @@ -343,7 +343,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. ..() /mob/living/simple_mob/metroid/juvenile/gamma/death() - playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) + // playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) ..() /mob/living/simple_mob/metroid/juvenile/gamma //active noms @@ -441,7 +441,7 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. ..() /mob/living/simple_mob/metroid/juvenile/zeta/death() - playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) + // playsound(src, 'sound/metroid/metroiddeath.ogg', 100, 1) ..() /mob/living/simple_mob/metroid/juvenile/zeta //active noms @@ -533,12 +533,14 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. evo_limit = 2000 next = "/mob/living/simple_mob/metroid/juvenile/queen" + death_sound = list('sound/metroid/metroidomegadeath.ogg') + /mob/living/simple_mob/metroid/juvenile/omega/Initialize() playsound(src, 'sound/metroid/metroidomega.ogg', 100, 1) ..() /mob/living/simple_mob/metroid/juvenile/omega/death() - playsound(src, 'sound/metroid/metroidomegadeath.ogg', 100, 1) + // playsound(src, 'sound/metroid/metroidomegadeath.ogg', 100, 1) ..() /mob/living/simple_mob/metroid/juvenile/omega //active noms @@ -628,13 +630,15 @@ GLOBAL_VAR_INIT(queen_amount, 0) //We only gonna want 1 queen in the world. next = null is_queen = TRUE + death_sound = list('sound/metroid/metroidqueendeath.ogg') + /mob/living/simple_mob/metroid/juvenile/queen/Initialize() playsound(src, 'sound/metroid/metroidqueen.ogg', 100, 1) GLOB.queen_amount++ ..() /mob/living/simple_mob/metroid/juvenile/queen/death() - playsound(src, 'sound/metroid/metroidqueendeath.ogg', 100, 1) + // playsound(src, 'sound/metroid/metroidqueendeath.ogg', 100, 1) GLOB.queen_amount-- ..() diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm index f1c089f78b..037d31d35b 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/constructs/_construct.dm @@ -63,6 +63,8 @@ // var/do_glow = TRUE can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds /mob/living/simple_mob/construct/place_spell_in_hand(var/path) if(!path || !ispath(path)) @@ -157,4 +159,4 @@ /mob/living/simple_mob/construct/proc/remove_glow() cut_overlays() -*/ \ No newline at end of file +*/ diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm b/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm index 95e3ecebe8..cbaafa3e22 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/creature.dm @@ -29,8 +29,10 @@ speak_emote = list("gibbers") ai_holder_type = /datum/ai_holder/simple_mob/melee - + can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds // Strong Variant /mob/living/simple_mob/creature/strong @@ -72,4 +74,4 @@ melee_damage_upper = 25 /decl/mob_organ_names/abberation - hit_zones = list("fleshy mass", "maw", "eye(?)", "orifice(?)") \ No newline at end of file + hit_zones = list("fleshy mass", "maw", "eye(?)", "orifice(?)") diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm index 36b68d05ca..52a122ae6d 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/faithless.dm @@ -41,8 +41,10 @@ min_n2 = 0 max_n2 = 0 minbodytemp = 0 - + can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds /mob/living/simple_mob/faithless/Process_Spacemove(var/check_drift = 0) return 1 @@ -81,4 +83,4 @@ melee_damage_upper = 28 /decl/mob_organ_names/faithless - hit_zones = list("body", "left appendage", "right appendage", "shadowy tendrils", "head", "right stump", "left stump", "infernal eye") \ No newline at end of file + hit_zones = list("body", "left appendage", "right appendage", "shadowy tendrils", "head", "right stump", "left stump", "infernal eye") diff --git a/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm b/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm index 1671459c30..83d05d8fcd 100644 --- a/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm +++ b/code/modules/mob/living/simple_mob/subtypes/occult/unknown.dm @@ -40,8 +40,10 @@ var/all_special_attacks = list(GA_ADS, GA_CALLDOWN, GA_LINES, GA_BULLETHELL, GA_ILLUSION, GA_CONFUSION, GA_SPEEDUP) loot_list = list(/obj/item/device/nif/glitch = 100) - + can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds /obj/item/projectile/energy/slow_orb name = "TROJAN" @@ -317,6 +319,9 @@ ai_holder_type = /datum/ai_holder/simple_mob/ranged/aggressive/bossmob_glitch_fake + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds + /mob/living/simple_mob/glitch_boss_fake/strong maxHealth = 100 health = 100 @@ -346,4 +351,4 @@ pointblank = TRUE intelligence_level = AI_SMART vision_range = 9 - closest_distance = 4 \ No newline at end of file + closest_distance = 4 diff --git a/code/modules/mob/living/simple_mob/subtypes/plant/tomato.dm b/code/modules/mob/living/simple_mob/subtypes/plant/tomato.dm index 7b0f11ed6f..b5d833b973 100644 --- a/code/modules/mob/living/simple_mob/subtypes/plant/tomato.dm +++ b/code/modules/mob/living/simple_mob/subtypes/plant/tomato.dm @@ -28,8 +28,10 @@ meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat meat_amount = 4 - + can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain and shouldn't take damage anyways, but, sanity + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds anyways, but, sanity /decl/mob_organ_names/tomato - hit_zones = list("flesh", "leaf", "mouth") \ No newline at end of file + hit_zones = list("flesh", "leaf", "mouth") diff --git a/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm b/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm index a9b95c9d70..5f48e3171c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm +++ b/code/modules/mob/living/simple_mob/subtypes/plant/tree.dm @@ -31,8 +31,10 @@ meat_amount = 2 pixel_x = -16 - + can_be_drop_prey = FALSE //CHOMP Add + can_pain_emote = FALSE // CHOMPEdit: Can't feel pain and shouldn't take damage anyways, but, sanity + death_sound = null // CHOMPEdit: Shouldn't trigger death sounds anyways, but, sanity /mob/living/simple_mob/animal/space/tree/apply_melee_effects(var/atom/A) if(isliving(A)) @@ -48,4 +50,4 @@ qdel(src) /decl/mob_organ_names/tree - hit_zones = list("trunk", "branches", "twigs") \ No newline at end of file + hit_zones = list("trunk", "branches", "twigs") diff --git a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm index e2d4ecea57..1b886b920f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -81,9 +81,15 @@ var/list/_slime_default_emotes = list( var/mood = ":3" // Icon to use to display 'mood', as an overlay. can_enter_vent_with = list(/obj/item/clothing/head) - + can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: Pain Sounds + pain_sound = 'sound/effects/slime_squish.ogg' + pain_emote_1p = list("squish", "squelch") + pain_emote_3p = list("squishes", "squelches") + // CHOMPAdd End + /mob/living/simple_mob/slime/get_available_emotes() return global._slime_default_emotes.Copy() @@ -253,4 +259,4 @@ var/list/_slime_default_emotes = list( visible_message("\The [src] squishes!") /decl/mob_organ_names/slime - hit_zones = list("cytoplasmic membrane") \ No newline at end of file + hit_zones = list("cytoplasmic membrane") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm index 51e1f8ca99..e9e45ec776 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/demon/demonAI_ch.dm @@ -62,6 +62,8 @@ var/blood_spawn = 0 var/is_shifting = FALSE + can_pain_emote = FALSE + /mob/living/simple_mob/vore/demonAI/init_vore() if(!voremob_loaded) return diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm index 071aef71ca..77c44f2176 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/fennec.dm @@ -50,6 +50,17 @@ say_list_type = /datum/say_list/fennec ai_holder_type = /datum/ai_holder/simple_mob/passive + // CHOMPAdd: :c + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + +/mob/living/simple_mob/vore/fennec/Initialize() + pain_sound = get_species_sound(canine_sounds["pain"]) + death_sound = get_species_sound(canine_sounds["death"]) + + . = ..() +// CHOMPAdd End + // Activate Noms! /mob/living/simple_mob/vore/fennec vore_active = 1 @@ -58,12 +69,12 @@ vore_pounce_chance = 40 vore_default_mode = DM_HOLD vore_icons = SA_ICON_LIVING - + /mob/living/simple_mob/vore/fennec/init_vore() // CHOMPEdit - Allow for customizing bellies on vorecritters if(!voremob_loaded) return . = ..() - + var/obj/belly/B = vore_selected B.name = "stomach" B.desc = "Warm, slick, and wet. You're somewhere hot, tight, and very cramped, unless you happen to somehow be smaller than the fennec you're in! It's hard to see, as rippling pink walls clench and smother over your form. If you don't want to be here, a newspaper from a friend ought to get you out. ...right?" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/goia_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/goia_ch.dm index 94ec99eeee..b2467bfde4 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/goia_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/goia_ch.dm @@ -28,6 +28,10 @@ vore_pounce_chance = 35 //More likely to nom vore_icons = SA_ICON_LIVING | SA_ICON_REST + // CHOMPAdd: Don't think its checked, but just in case + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + /mob/living/simple_mob/otie/zorgoia/New() ..() switch(rand(9)) @@ -51,6 +55,8 @@ color = "#ff9f00" if(9) color = "#393939" + pain_sound = get_species_sound(canine_sounds["pain"]) // CHOMPAdd: Pain + death_sound = get_species_sound(canine_sounds["death"]) // CHOMPAdd: Pain /mob/living/simple_mob/otie/zorgoia/feral //gets the pet2tame feature. starts out hostile tho so get gamblin' name = "agressive zorgoia" @@ -77,4 +83,4 @@ emote_hear = list("chuffs", "murrs", "churls", "hisses", "lets out a cougar like scream", "yawns") emote_see = list("licks their maw", "stretches", "yawns", "noodles") say_maybe_target = list("weh?") - say_got_target = list("Rurrr!", "ROAR!", "RAH!") \ No newline at end of file + say_got_target = list("Rurrr!", "ROAR!", "RAH!") diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm index e9c0c867bd..29ab3c228f 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/greatwolf.dm @@ -39,8 +39,18 @@ can_buckle = TRUE buckle_movable = TRUE buckle_lying = FALSE - + can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: :c + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + +/mob/living/simple_mob/vore/greatwolf/Initialize() + pain_sound = get_species_sound(canine_sounds["pain"]) + death_sound = get_species_sound(canine_sounds["death"]) + + . = ..() +// CHOMPAdd End /mob/living/simple_mob/vore/greatwolf diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm index 061e1fc450..82a9665959 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander.dm @@ -48,8 +48,13 @@ vore_bump_emote = "tries to snap up" nom_mob = TRUE - + can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: :c + pain_sound = canine_pain_sounds + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + death_sound = canine_death_sounds /datum/category_item/catalogue/fauna/leopardmander name = "Sivian Fauna - Va'aen Drake" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm index 8c2a2d7027..b775036594 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/leopardmander_ch.dm @@ -49,6 +49,16 @@ vore_bump_emote = "tries to snap up" can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: :c + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + +/mob/living/simple_mob/vore/leopardmander/Initialize() + pain_sound = get_species_sound(canine_sounds["pain"]) + death_sound = get_species_sound(canine_sounds["death"]) + + . = ..() +// CHOMPAdd End /datum/category_item/catalogue/fauna/leopardmander name = "Sivian Fauna - Va'aen Drake" diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm index 3297640ce1..1d43792a60 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/otie.dm @@ -46,8 +46,19 @@ var/mob/living/carbon/human/friend var/tamed = 0 var/tame_chance = 50 //It's a fiddy-fiddy default you may get a buddy pal or you may get mauled and ate. Win-win! - + can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: :c + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + +/mob/living/simple_mob/otie/Initialize() + pain_sound = get_species_sound(canine_sounds["pain"]) + death_sound = get_species_sound(canine_sounds["death"]) + + . = ..() +// CHOMPAdd End + // Activate Noms! diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm index eff23b4b90..c1100c6ab2 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/panther.dm @@ -41,8 +41,19 @@ say_list_type = /datum/say_list/panther ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive - + can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: :c + pain_emote_1p = list("yowl", "growl") + pain_emote_3p = list("yowls", "growls") + +/mob/living/simple_mob/vore/aggressive/panther/Initialize() + pain_sound = get_species_sound(feline_sounds["pain"]) + death_sound = get_species_sound(feline_sounds["death"]) + + . = ..() +// CHOMPAdd End + // Activate Noms! /mob/living/simple_mob/vore/aggressive/panther diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm index aab12f953b..770e3ca479 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolf.dm @@ -32,19 +32,30 @@ ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive catalogue_data = list(/datum/category_item/catalogue/fauna/wolf) - + can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: :c + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + +/mob/living/simple_mob/animal/wolf/Initialize() + pain_sound = get_species_sound(canine_sounds["pain"]) + death_sound = get_species_sound(canine_sounds["death"]) + + . = ..() +// CHOMPAdd End + // Activate Noms! /mob/living/simple_mob/animal/wolf vore_active = 1 vore_icons = SA_ICON_LIVING - + /mob/living/simple_mob/animal/wolf/init_vore() // CHOMPEdit - Allow for customizing bellies on vorecritters if(!voremob_loaded) return . = ..() - + var/obj/belly/B = vore_selected B.vore_sound = "Tauric Swallow" // CHOMPedit - Fancy Vore Sounds B.release_sound = "Pred Escape" // CHOMPedit - Fancy Vore Sounds diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm b/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm index 94f2e35469..3fddd37946 100644 --- a/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm +++ b/code/modules/mob/living/simple_mob/subtypes/vore/wolfgirl.dm @@ -23,8 +23,19 @@ say_list_type = /datum/say_list/wolfgirl ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative/wolfgirl - + can_be_drop_prey = FALSE //CHOMP Add + // CHOMPAdd: :c + pain_emote_1p = list("yelp", "whine", "bark", "growl") + pain_emote_3p = list("yelps", "whines", "barks", "growls") + +/mob/living/simple_mob/vore/wolfgirl/Initialize() + pain_sound = get_species_sound(canine_sounds["pain"]) + death_sound = get_species_sound(canine_sounds["death"]) + + . = ..() +// CHOMPAdd End + // Activate Noms! /mob/living/simple_mob/vore/wolfgirl diff --git a/code/modules/mob/living/voice/voice_vr.dm b/code/modules/mob/living/voice/voice_vr.dm index 0eabd01a34..ac84856d9a 100644 --- a/code/modules/mob/living/voice/voice_vr.dm +++ b/code/modules/mob/living/voice/voice_vr.dm @@ -1,2 +1,3 @@ /mob/living/voice - no_vore = TRUE \ No newline at end of file + no_vore = TRUE + can_pain_emote = FALSE // CHOMPEdit: Sanity/safety diff --git a/code/modules/organs/pain.dm b/code/modules/organs/pain.dm index d26b7e3088..7eeb167b0a 100644 --- a/code/modules/organs/pain.dm +++ b/code/modules/organs/pain.dm @@ -38,12 +38,20 @@ multilimb_pain_time = world.time + (100 - power) last_pain_message = message to_chat(src,message) + // CHOMPAdd: Emote in pain for custom pain, too + if(prob(power) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + // CHOMPAdd End else if(force || (message != last_pain_message) || (world.time >= next_pain_time)) last_pain_message = message to_chat(src,message) next_pain_time = world.time + (100 - power) multilimb_pain_time = world.time + (100 - power) + // CHOMPAdd: Emote in pain for custom pain, too + if(prob(power) && !isbelly(loc)) // No pain noises inside bellies. + emote("pain") + // CHOMPAdd End /mob/living/carbon/human/proc/handle_pain() if(stat) diff --git a/modular_chomp/code/modules/emotes/definitions/audible_pain.dm b/modular_chomp/code/modules/emotes/definitions/audible_pain.dm index d6c747047c..76620c89b9 100644 --- a/modular_chomp/code/modules/emotes/definitions/audible_pain.dm +++ b/modular_chomp/code/modules/emotes/definitions/audible_pain.dm @@ -7,28 +7,57 @@ if(ishuman(user)) var/mob/living/carbon/human/H = user return "You [pick(H.species.pain_verb_1p)] in pain!" + else + var/mob/living/M = user + if(M.pain_emote_1p) // Sanity + return "You [pick(M.pain_emote_1p)]!" . = ..() /decl/emote/audible/pain/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) if(ishuman(user)) var/mob/living/carbon/human/H = user return "[pick(H.species.pain_verb_3p)] in pain!" + else + var/mob/living/M = user + if(M.pain_emote_3p) // Sanity + return "[pick(M.pain_emote_3p)]!" . = ..() /decl/emote/audible/pain/get_emote_sound(var/atom/user) ..() - var/mob/living/carbon/human/H = user - if(H.get_gender() == FEMALE) - return list( - "sound" = H.species.female_pain_sound, - "vol" = 60, - "exr" = 10, - "volchannel" = VOLUME_CHANNEL_INJ_DEATH - ) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.get_gender() == FEMALE) + return list( + "sound" = H.species.female_pain_sound, + "vol" = 60, + "exr" = 10, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + else + return list( + "sound" = H.species.male_pain_sound, + "vol" = 60, + "exr" = 10, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) else - return list( - "sound" = H.species.male_pain_sound, - "vol" = 60, - "exr" = 10, - "volchannel" = VOLUME_CHANNEL_INJ_DEATH - ) + var/mob/living/M = user + if((M.get_gender() == FEMALE) && M.female_pain_sound) // If our mob has custom sounds per-gender defined, most won't. + return list( + "sound" = M.female_pain_sound, + "vol" = 80, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + else if((M.get_gender() == MALE) && M.male_pain_sound) // If our mob has custom sounds per-gender defined, most won't. + return list( + "sound" = M.male_pain_sound, + "vol" = 80, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) + else + return list( + "sound" = M.pain_sound, + "vol" = 80, + "volchannel" = VOLUME_CHANNEL_INJ_DEATH + ) diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm index ab6996fbd5..eaff08ae00 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/species.dm @@ -19,14 +19,16 @@ var/digi_allowed = FALSE var/vanity_base_fit //when shapeshifting using vanity_copy_to, this allows you to have add something so they can go back to their original species fit - male_scream_sound = list('modular_chomp/sound/voice/scream/generic/male/male_scream_1.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_2.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_3.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_4.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_5.ogg', 'modular_chomp/sound/voice/scream/generic/male/male_scream_6.ogg') - female_scream_sound = list('modular_chomp/sound/voice/scream/generic/female/female_scream_1.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_2.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_3.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_4.ogg', 'modular_chomp/sound/voice/scream/generic/female/female_scream_5.ogg') - var/male_gasp_sound = list('modular_chomp/sound/voice/gasp/generic/male/male_gasp1.ogg', 'modular_chomp/sound/voice/gasp/generic/male/male_gasp2.ogg', 'modular_chomp/sound/voice/gasp/generic/male/male_gasp3.ogg') - var/female_gasp_sound = list('modular_chomp/sound/voice/gasp/generic/female/female_gasp1.ogg', 'modular_chomp/sound/voice/gasp/generic/female/female_gasp2.ogg') - var/male_pain_sound = list('modular_chomp/sound/voice/pain/generic/male/male_pain_1.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_2.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_3.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_4.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_5.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_6.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_7.ogg', 'modular_chomp/sound/voice/pain/generic/male/male_pain_8.ogg') - var/female_pain_sound = list('modular_chomp/sound/voice/pain/generic/female/female_pain_1.ogg', 'modular_chomp/sound/voice/pain/generic/female/female_pain_2.ogg', 'modular_chomp/sound/voice/pain/generic/female/female_pain_3.ogg') - var/male_death_sound = list('modular_chomp/sound/voice/death/generic/male/male_death_1.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_2.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_3.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_4.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_5.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_6.ogg', 'modular_chomp/sound/voice/death/generic/male/male_death_7.ogg') - var/female_death_sound = list('modular_chomp/sound/voice/death/generic/female/female_death_1.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_2.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_3.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_4.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_5.ogg', 'modular_chomp/sound/voice/death/generic/female/female_death_6.ogg') + var/species_sounds + + male_scream_sound = null + female_scream_sound = null + var/male_gasp_sound = null + var/female_gasp_sound = null + var/male_pain_sound = null + var/female_pain_sound = null + var/male_death_sound = null + var/female_death_sound = null // Handles non-standard eyes when using a species that utilizes a custom base icon set. // Eye data is stored in the head organ, and this needs to be handled specially. @@ -59,3 +61,14 @@ for(var/datum/trait/env_trait in env_traits) env_trait.handle_environment_special(H) return + +/datum/species/New() + male_scream_sound = get_species_sound(male_generic_sounds["scream"]) + female_scream_sound = get_species_sound(female_generic_sounds["scream"]) + male_gasp_sound = get_species_sound(male_generic_sounds["gasp"]) + female_gasp_sound = get_species_sound(female_generic_sounds["gasp"]) + male_pain_sound = get_species_sound(male_generic_sounds["pain"]) + female_pain_sound = get_species_sound(female_generic_sounds["pain"]) + male_death_sound = get_species_sound(male_generic_sounds["death"]) + female_death_sound = get_species_sound(female_generic_sounds["death"]) + ..() diff --git a/modular_chomp/code/modules/mob/living/carbon/human/species/species_vr.dm b/modular_chomp/code/modules/mob/living/carbon/human/species/species_vr.dm index 77bd3d1581..b452877e35 100644 --- a/modular_chomp/code/modules/mob/living/carbon/human/species/species_vr.dm +++ b/modular_chomp/code/modules/mob/living/carbon/human/species/species_vr.dm @@ -1,5 +1,6 @@ /datum/species/proc/copy_species_sounds(var/datum/species/S, var/species_sounds, var/custom_base) switch(species_sounds) + get_species_sound(species_sounds) if("Canine") S.male_scream_sound = canine_scream_sounds S.female_scream_sound = canine_scream_sounds @@ -36,8 +37,21 @@ S.female_pain_sound = female_generic_pain_sounds S.male_death_sound = male_generic_death_sounds S.female_death_sound = female_generic_death_sounds + if("Robotic") + S.male_scream_sound = robot_scream_sounds + S.female_scream_sound = robot_scream_sounds + S.male_gasp_sound = null + S.female_gasp_sound = null + S.male_pain_sound = robot_pain_sounds + S.female_pain_sound = robot_pain_sounds + S.male_death_sound = robot_death_sounds + S.female_death_sound = robot_death_sounds if("Unset") // If our users haven't set anything, pick the sounds based off our custom base - Vulp gets canine, etc etc. - var/datum/species/os = GLOB.all_species[custom_base] + var/datum/species/os + if(!custom_base) // Safety + os = base_species + else + os = GLOB.all_species[custom_base] S.male_scream_sound = os.male_scream_sound S.female_scream_sound = os.female_scream_sound S.male_gasp_sound = os.male_gasp_sound @@ -46,3 +60,12 @@ S.female_pain_sound = os.female_pain_sound S.male_death_sound = os.male_death_sound S.female_death_sound = os.female_death_sound + if("None") // If our users intentionally want no sounds + S.male_scream_sound = null + S.female_scream_sound = null + S.male_gasp_sound = null + S.female_gasp_sound = null + S.male_pain_sound = null + S.female_pain_sound = null + S.male_death_sound = null + S.female_death_sound = null diff --git a/modular_chomp/code/modules/mob/living/living.dm b/modular_chomp/code/modules/mob/living/living.dm index 2a5293fe94..40eafd3768 100644 --- a/modular_chomp/code/modules/mob/living/living.dm +++ b/modular_chomp/code/modules/mob/living/living.dm @@ -14,4 +14,25 @@ Maybe later, gotta figure out a way to click yourself when in a locker etc. /mob/living/New(var/newloc) ..() verbs |= /mob/living/proc/click_self -*/ \ No newline at end of file +*/ + +/mob/living + /* TL;DR - the following is a lot of copypasta, but allows us to give simplemobs pain and death sounds. + * Different from carbons, where we check species, here we just check on the mob itself. + * TBD: Maybe port over from species to mob? + */ + var/can_pain_emote = TRUE + var/pain_sound = null + var/female_pain_sound = null + var/male_pain_sound = null + var/pain_emote_1p = null + var/pain_emote_3p = null + /* // Not sure if needed, screams aren't a carbon thing rn. + var/scream_sound = null + var/female_scream_sound = null + var/male_scream_sound = null + var/scream_emote = null + */ + var/death_sound = null + var/male_death_sound = null + var/female_death_sound = null diff --git a/modular_chomp/sound/voice/death/spider/spider_death.ogg b/modular_chomp/sound/voice/death/spider/spider_death.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e03acecc92c8a4b66df0e22738c6b954f57ae7bf GIT binary patch literal 17339 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 literal 0 HcmV?d00001 diff --git a/sound/voice/raccoon.ogg b/sound/voice/raccoon.ogg new file mode 100644 index 0000000000000000000000000000000000000000..4e5937b73420689fe4ac3a27fe42378e5c45a479 GIT binary patch literal 43581 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 PBgVIpS8(7W_}}(F3%(*& literal 0 HcmV?d00001 diff --git a/vorestation.dme b/vorestation.dme index 3073e66a84..d8bad2d132 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -3297,6 +3297,7 @@ #include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\cultist_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm" +#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_ch.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates.dm" #include "code\modules\mob\living\simple_mob\subtypes\humanoid\pirates_ch.dm" @@ -4584,7 +4585,6 @@ #include "modular_chomp\code\modules\mob\living\carbon\human\update_icons.dm" #include "modular_chomp\code\modules\mob\living\carbon\human\species\species.dm" #include "modular_chomp\code\modules\mob\living\carbon\human\species\species_shapeshift_ch.dm" -#include "modular_chomp\code\modules\mob\living\carbon\human\species\species_vr.dm" #include "modular_chomp\code\modules\mob\living\carbon\human\species\outsider\vox.dm" #include "modular_chomp\code\modules\mob\living\carbon\human\species\station\prommie_blob.dm" #include "modular_chomp\code\modules\mob\living\carbon\human\species\station\station.dm"