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.
This commit is contained in:
Rykka Stormheart
2023-02-28 16:02:13 -08:00
parent 6a837244da
commit 2940d67c4d
53 changed files with 720 additions and 171 deletions

View File

@@ -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

View File

@@ -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 @@
. += "<a href='?src=\ref[src];voice_test=1'><b>Test Selected Voice</b></a><br>"
. += "<b>Custom Speech Bubble:</b> <a href='?src=\ref[src];customize_speech_bubble=1'>[pref.custom_speech_bubble]</a><br>"
// CHOMPEdit Start: Pain/Scream/Death Custom Sounds
var/datum/species/selected_species = GLOB.all_species[pref.species]
if(selected_species.selects_bodytype)
// var/datum/species/selected_species = GLOB.all_species[pref.species]
// if(selected_species.selects_bodytype)
. += "<br>"
. += "<b>Species Sounds:</b> <a href='?src=\ref[src];species_sound_options=1'>[pref.species_sound]</a><br>"
. += "<b>Species Injury Sounds:</b> <a href='?src=\ref[src];species_sound_options=1'>[pref.species_sound]</a><br>"
. += "<a href='?src=\ref[src];scream_test=1'><b>Test Scream Sounds</b></a><br>"
. += "<a href='?src=\ref[src];pain_test=1'><b>Test Pain Sounds</b></a><br>"
. += "<a href='?src=\ref[src];gasp_test=1'><b>Test Gasp Sounds</b></a><br>"
@@ -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)
// 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))
if("Robotic")
S = sound(pick(robot_scream_sounds))
if("None" || null)
to_chat(user, "<span class='warning'>This set does not have scream sounds!</span>")
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, "<span class='warning'>This set does not have scream sounds!</span>")
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, "<span class='warning'>This species does not have scream sounds!</span>")
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)
//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("<span class='warning'>This set does not have pain sounds!</span>")
to_chat(user, "<span class='warning'>This set does not have pain sounds!</span>")
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))
if("Robotic")
S = sound(pick(robot_pain_sounds))
if("None" || null)
to_chat(user, "<span class='warning'>This set does not have pain sounds!</span>")
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, "<span class='warning'>This set does not have pain sounds!</span>")
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, "<span class='warning'>This species does not have pain sounds!</span>")
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)
// 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("<span class='warning'>This set does not have gasp sounds!</span>")
to_chat(user, "<span class='warning'>This set does not have gasp sounds!</span>")
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))
if("Robotic")
to_chat(user, "<span class='warning'>This set does not have gasp sounds!</span>")
return TOPIC_REFRESH
if("None" || null)
to_chat(user, "<span class='warning'>This set does not have gasp sounds!</span>")
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, "<span class='warning'>This set does not have gasp sounds!</span>")
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, "<span class='warning'>This species does not have gasp sounds!</span>")
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)
// 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))
if("Robotic")
S = sound(pick(robot_death_sounds))
if("None" || null)
to_chat(user, "<span class='warning'>This set does not have death sounds!</span>")
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, "<span class='warning'>This set does not have gasp sounds!</span>")
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, "<span class='warning'>This species does not have death sounds!</span>")
return TOPIC_REFRESH
S.frequency = pick(pref.voice_freq)
S.volume = 20
SEND_SOUND(user, S)
return TOPIC_REFRESH
*/
// CHOMPEdit End
return ..();

View File

@@ -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

View File

@@ -1,5 +1,6 @@
/decl/emote/audible/scream/get_emote_sound(var/atom/user)
..()
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.get_gender() == FEMALE)
return list(
@@ -15,3 +16,25 @@
"exr" = 20,
"volchannel" = VOLUME_CHANNEL_INJ_DEATH
)
/* // Not sure if needed, screams are a carbon-only thing rn.
else
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
)
*/

View File

@@ -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()

View File

@@ -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()
. = ..()

View File

@@ -153,3 +153,38 @@
damage = damage * damage_mod
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

View File

@@ -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

View File

@@ -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)

View File

@@ -1857,6 +1857,10 @@
if(shock_stage == 40)
if(traumatic_shock >= 80)
to_chat(src, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
// 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, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
// 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, "<span class='danger'>[pick("The pain is excruciating", "Please&#44; just end the pain", "Your whole body is going numb")]!</span>")
// 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, "<span class='danger'>[pick("You black out", "You feel like you could die any moment now", "You are about to lose consciousness")]!</span>")
// 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)

View File

@@ -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
. = ..()

View File

@@ -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

View File

@@ -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))

View File

@@ -46,9 +46,14 @@
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

View File

@@ -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

View File

@@ -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))

View File

@@ -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"

View File

@@ -64,10 +64,14 @@
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

View File

@@ -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"

View File

@@ -31,6 +31,8 @@
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"

View File

@@ -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")

View File

@@ -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

View File

@@ -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"])
. = ..()

View File

@@ -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.

View File

@@ -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

View File

@@ -62,6 +62,12 @@
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)
// playsound(src, 'sound/metroid/metroiddeath.ogg', 75, 1)
..()

View File

@@ -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("<span class='notice'>\The [src] dropped some toy!</span>")
@@ -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--
..()

View File

@@ -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))

View File

@@ -31,6 +31,8 @@
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

View File

@@ -43,6 +43,8 @@
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

View File

@@ -42,6 +42,8 @@
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

View File

@@ -30,6 +30,8 @@
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")

View File

@@ -33,6 +33,8 @@
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))

View File

@@ -84,6 +84,12 @@ var/list/_slime_default_emotes = list(
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()

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -41,6 +41,16 @@
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

View File

@@ -50,6 +50,11 @@
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"

View File

@@ -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"

View File

@@ -48,6 +48,17 @@
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!

View File

@@ -43,6 +43,17 @@
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

View File

@@ -34,6 +34,17 @@
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

View File

@@ -25,6 +25,17 @@
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

View File

@@ -1,2 +1,3 @@
/mob/living/voice
no_vore = TRUE
can_pain_emote = FALSE // CHOMPEdit: Sanity/safety

View File

@@ -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)

View File

@@ -7,16 +7,25 @@
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)
..()
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.get_gender() == FEMALE)
return list(
@@ -32,3 +41,23 @@
"exr" = 10,
"volchannel" = VOLUME_CHANNEL_INJ_DEATH
)
else
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
)

View File

@@ -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"])
..()

View File

@@ -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

View File

@@ -15,3 +15,24 @@ Maybe later, gotta figure out a way to click yourself when in a locker etc.
..()
verbs |= /mob/living/proc/click_self
*/
/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

BIN
sound/voice/raccoon.ogg Normal file

Binary file not shown.

View File

@@ -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"