diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 1e2b2e63f30..1b77745067e 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -272,6 +272,10 @@ #define TASTE_DULL 0.5 //anything below 30% #define TASTE_NUMB 0.1 //anything below 150% +//Used by emotes +#define VISIBLE_MESSAGE 1 +#define AUDIBLE_MESSAGE 2 + // If they're in an FBP, what braintype. #define FBP_NONE "" #define FBP_CYBORG "Cyborg" @@ -436,3 +440,5 @@ #define MAX_NUTRITION 5000 //VOREStation Edit #define FAKE_INVIS_ALPHA_THRESHOLD 127 // If something's alpha var is at or below this number, certain things will pretend it is invisible. + +#define DEATHGASP_NO_MESSAGE "no message" diff --git a/code/datums/looping_sounds/weather_sounds.dm b/code/datums/looping_sounds/weather_sounds.dm index 106c25643af..4a029930587 100644 --- a/code/datums/looping_sounds/weather_sounds.dm +++ b/code/datums/looping_sounds/weather_sounds.dm @@ -11,7 +11,7 @@ start_sound = 'sound/effects/weather/snowstorm/outside/active_start.ogg' start_length = 13 SECONDS end_sound = 'sound/effects/weather/snowstorm/outside/active_end.ogg' - volume = 80 + volume = 40 /datum/looping_sound/weather/inside_blizzard mid_sounds = list( @@ -23,7 +23,7 @@ start_sound = 'sound/effects/weather/snowstorm/inside/active_start.ogg' start_length = 13 SECONDS end_sound = 'sound/effects/weather/snowstorm/inside/active_end.ogg' - volume = 60 + volume = 20 /datum/looping_sound/weather/outside_snow mid_sounds = list( @@ -35,7 +35,7 @@ start_sound = 'sound/effects/weather/snowstorm/outside/weak_start.ogg' start_length = 13 SECONDS end_sound = 'sound/effects/weather/snowstorm/outside/weak_end.ogg' - volume = 50 + volume = 20 /datum/looping_sound/weather/inside_snow mid_sounds = list( @@ -47,7 +47,7 @@ start_sound = 'sound/effects/weather/snowstorm/inside/weak_start.ogg' start_length = 13 SECONDS end_sound = 'sound/effects/weather/snowstorm/inside/weak_end.ogg' - volume = 30 + volume = 10 /datum/looping_sound/weather/wind mid_sounds = list( @@ -59,11 +59,17 @@ 'sound/effects/weather/wind/wind_5_1.ogg' = 1 ) mid_length = 10 SECONDS // The lengths for the files vary, but the longest is ten seconds, so this will make it sound like intermittent wind. - volume = 50 + volume = 45 // Don't have special sounds so we just make it quieter indoors. /datum/looping_sound/weather/wind/indoors - volume = 30 + volume = 25 + +/datum/looping_sound/weather/wind/gentle + volume = 15 + +/datum/looping_sound/weather/wind/gentle/indoors + volume = 5 /datum/looping_sound/weather/rain mid_sounds = list( @@ -73,7 +79,13 @@ start_sound = 'sound/effects/weather/acidrain_start.ogg' start_length = 13 SECONDS end_sound = 'sound/effects/weather/acidrain_end.ogg' - volume = 50 + volume = 20 /datum/looping_sound/weather/rain/indoors - volume = 30 \ No newline at end of file + volume = 10 + +/datum/looping_sound/weather/rain/heavy + volume = 40 + +/datum/looping_sound/weather/rain/heavy/indoors + volume = 20 \ No newline at end of file diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e4ad20f5d48..46f001c8e1b 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -490,7 +490,7 @@ // Use for objects performing visible actions // message is output to anyone who can see, e.g. "The [src] does something!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" -/atom/proc/visible_message(var/message, var/blind_message, var/list/exclude_mobs = null) +/atom/proc/visible_message(var/message, var/blind_message, var/list/exclude_mobs, var/range = world.view) //VOREStation Edit var/list/see @@ -498,7 +498,7 @@ var/obj/belly/B = loc see = B.get_mobs_and_objs_in_belly() else - see = get_mobs_and_objs_in_view_fast(get_turf(src),world.view,remote_ghosts = FALSE) + see = get_mobs_and_objs_in_view_fast(get_turf(src), range, remote_ghosts = FALSE) //VOREStation Edit End var/list/seeing_mobs = see["mobs"] @@ -508,20 +508,20 @@ for(var/obj in seeing_objs) var/obj/O = obj - O.show_message(message, 1, blind_message, 2) + O.show_message(message, VISIBLE_MESSAGE, blind_message, AUDIBLE_MESSAGE) for(var/mob in seeing_mobs) var/mob/M = mob if(M.see_invisible >= invisibility && MOB_CAN_SEE_PLANE(M, plane)) - M.show_message(message, 1, blind_message, 2) + M.show_message(message, VISIBLE_MESSAGE, blind_message, AUDIBLE_MESSAGE) else if(blind_message) - M.show_message(blind_message, 2) + M.show_message(blind_message, AUDIBLE_MESSAGE) // Show a message to all mobs and objects in earshot of this atom // Use for objects performing audible actions // message is the message output to anyone who can hear. // deaf_message (optional) is what deaf people will see. // hearing_distance (optional) is the range, how many tiles away the message can be heard. -/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance) +/atom/proc/audible_message(var/message, var/deaf_message, var/hearing_distance, var/radio_message) var/range = hearing_distance || world.view var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE) @@ -529,14 +529,19 @@ var/list/hearing_mobs = hear["mobs"] var/list/hearing_objs = hear["objs"] - for(var/obj in hearing_objs) - var/obj/O = obj - O.show_message(message, 2, deaf_message, 1) + if(radio_message) + for(var/obj in hearing_objs) + var/obj/O = obj + O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) + else + for(var/obj in hearing_objs) + var/obj/O = obj + O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) for(var/mob in hearing_mobs) var/mob/M = mob var/msg = message - M.show_message(msg, 2, deaf_message, 1) + M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) /atom/movable/proc/dropInto(var/atom/destination) while(istype(destination)) @@ -647,4 +652,7 @@ /atom/Exited(atom/movable/AM, atom/new_loc) . = ..() - SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc) \ No newline at end of file + SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, new_loc) + +/atom/proc/get_visible_gender() + return gender diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 5b4305844ef..f17c97a627b 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -507,7 +507,6 @@ log_and_message_admins("[key_name(to_despawn)] ([to_despawn.mind.role_alt_title]) entered cryostorage.") announce.autosay("[to_despawn.real_name], [to_despawn.mind.role_alt_title], [on_store_message]", "[on_store_name]", announce_channel, using_map.get_map_levels(z, TRUE, om_range = DEFAULT_OVERMAP_RANGE)) - //visible_message("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3) visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2]", 3) //VOREStation Edit begin: Dont delete mobs-in-mobs diff --git a/code/game/machinery/vending_machines_vr.dm b/code/game/machinery/vending_machines_vr.dm index 94a55bba1b4..e6c5058881d 100644 --- a/code/game/machinery/vending_machines_vr.dm +++ b/code/game/machinery/vending_machines_vr.dm @@ -4614,3 +4614,36 @@ /obj/machinery/vending/cola/soft icon = 'icons/obj/vending_vr.dmi' icon_state = "Cola_Machine" + +//////////////////////Bepis Drinks (04/29/2021)////////////////////// + +/obj/machinery/vending/bepis + name = "Bepis Softdrinks" + desc = "A strange softdrink vendor that isn't owned by NanoTrasen... Why (and how) is it here?" + icon = 'icons/obj/vending_vr.dmi' + icon_state = "bepis" + product_slogans = "Refreshing!;Have a sip, you won't believe the taste!;Puts the 'B' in Best Soda!" + product_ads = "Refreshing!;Hope you're thirsty!;Please, have a drink!;Drink up!" + products = list(/obj/item/weapon/reagent_containers/food/drinks/cans/bepis = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/astrodew = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/buzz = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/shambler = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/cranberry = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/icecoffee = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 10, + /obj/item/weapon/reagent_containers/food/drinks/cans/root_beer = 10) + + prices = list(/obj/item/weapon/reagent_containers/food/drinks/cans/bepis = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/astrodew = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/buzz = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/shambler = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/cranberry = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/icecoffee = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/gingerale = 1, + /obj/item/weapon/reagent_containers/food/drinks/cans/root_beer = 1) + idle_power_usage = 211 //refrigerator - believe it or not, this is actually the average power consumption of a refrigerated vending machine according to NRCan. + vending_sound = "machines/vending/vending_cans.ogg" diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 21775d0403c..6e10f0e783d 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -552,9 +552,7 @@ var/list/global/slot_flags_enumeration = list( if(!hit_zone) U.do_attack_animation(M) playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - //visible_message("[U] attempts to stab [M] in the eyes, but misses!") - for(var/mob/V in viewers(M)) - V.show_message("[U] attempts to stab [M] in the eyes, but misses!") + visible_message(SPAN_DANGER("\The [U] attempts to stab \the [M] in the eyes, but misses!")) return add_attack_logs(user,M,"Attack eyes with [name]") diff --git a/code/game/objects/items/weapons/material/misc.dm b/code/game/objects/items/weapons/material/misc.dm index bfa8b616805..7dbb927f853 100644 --- a/code/game/objects/items/weapons/material/misc.dm +++ b/code/game/objects/items/weapons/material/misc.dm @@ -74,14 +74,12 @@ /obj/item/weapon/material/snow/snowball/attack_self(mob/user as mob) if(user.a_intent == I_HURT) - //visible_message("[user] has smashed the snowball in their hand!", "You smash the snowball in your hand.") - to_chat(user, "You smash the snowball in your hand.") + to_chat(user, SPAN_NOTICE("You smash the snowball in your hand.")) var/atom/S = new /obj/item/stack/material/snow(user.loc) qdel(src) user.put_in_hands(S) else - //visible_message("[user] starts compacting the snowball.", "You start compacting the snowball.") - to_chat(user, "You start compacting the snowball.") + to_chat(user, SPAN_NOTICE("You start compacting the snowball.")) if(do_after(user, 2 SECONDS)) var/atom/S = new /obj/item/weapon/material/snow/snowball/reinforced(user.loc) qdel(src) diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm index 88085aa97cc..15f079d31cb 100644 --- a/code/modules/client/preference_setup/general/03_body.dm +++ b/code/modules/client/preference_setup/general/03_body.dm @@ -37,6 +37,43 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O var/g_wing3 = 30 // Wing tertiary color var/b_wing3 = 30 // Wing tertiary color +// Sanitize ear/wing/tail styles +/datum/preferences/proc/sanitize_body_styles() + + // Grandfather in anyone loading paths from a save. + if(ispath(ear_style, /datum/sprite_accessory)) + var/datum/sprite_accessory/instance = global.ear_styles_list[ear_style] + if(istype(instance)) + ear_style = instance.name + if(ispath(wing_style, /datum/sprite_accessory)) + var/datum/sprite_accessory/instance = global.wing_styles_list[wing_style] + if(istype(instance)) + wing_style = instance.name + if(ispath(tail_style, /datum/sprite_accessory)) + var/datum/sprite_accessory/instance = global.tail_styles_list[tail_style] + if(istype(instance)) + tail_style = instance.name + + // Sanitize for non-existent keys. + if(ear_style && !(ear_style in get_available_styles(global.ear_styles_list))) + ear_style = null + if(wing_style && !(wing_style in get_available_styles(global.wing_styles_list))) + wing_style = null + if(tail_style && !(tail_style in get_available_styles(global.tail_styles_list))) + tail_style = null + +/datum/preferences/proc/get_available_styles(var/style_list) + . = list("Normal" = null) + for(var/path in style_list) + var/datum/sprite_accessory/instance = style_list[path] + if(!istype(instance)) + continue + if(instance.ckeys_allowed && (!client || !(client.ckey in instance.ckeys_allowed))) + continue + if(instance.species_allowed && (!species || !(species in instance.species_allowed)) && (!client || !check_rights(R_ADMIN | R_EVENT | R_FUN, 0, client))) + continue + .[instance.name] = instance + /datum/category_item/player_setup_item/general/body name = "Body" sort_order = 3 @@ -228,12 +265,8 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O pref.r_wing3 = sanitize_integer(pref.r_wing3, 0, 255, initial(pref.r_wing3)) pref.g_wing3 = sanitize_integer(pref.g_wing3, 0, 255, initial(pref.g_wing3)) pref.b_wing3 = sanitize_integer(pref.b_wing3, 0, 255, initial(pref.b_wing3)) - if(!(pref.ear_style in get_ear_styles())) - pref.ear_style = initial(pref.ear_style) - if(!(pref.wing_style in get_wing_styles())) - pref.wing_style = initial(pref.wing_style) - if(!(pref.tail_style in get_tail_styles())) - pref.tail_style = initial(pref.tail_style) + + pref.sanitize_body_styles() // Moved from /datum/preferences/proc/copy_to() /datum/category_item/player_setup_item/general/body/copy_to_mob(var/mob/living/carbon/human/character) @@ -265,37 +298,44 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O character.g_synth = pref.g_synth character.b_synth = pref.b_synth character.synth_markings = pref.synth_markings - character.ear_style = ear_styles_list[pref.ear_style] - character.r_ears = pref.r_ears - character.b_ears = pref.b_ears - character.g_ears = pref.g_ears - character.r_ears2 = pref.r_ears2 - character.b_ears2 = pref.b_ears2 - character.g_ears2 = pref.g_ears2 - character.r_ears3 = pref.r_ears3 - character.b_ears3 = pref.b_ears3 - character.g_ears3 = pref.g_ears3 - character.tail_style = tail_styles_list[pref.tail_style] - character.r_tail = pref.r_tail - character.b_tail = pref.b_tail - character.g_tail = pref.g_tail - character.r_tail2 = pref.r_tail2 - character.b_tail2 = pref.b_tail2 - character.g_tail2 = pref.g_tail2 - character.r_tail3 = pref.r_tail3 - character.b_tail3 = pref.b_tail3 - character.g_tail3 = pref.g_tail3 - character.wing_style = wing_styles_list[pref.wing_style] - character.r_wing = pref.r_wing - character.b_wing = pref.b_wing - character.g_wing = pref.g_wing - character.r_wing2 = pref.r_wing2 - character.b_wing2 = pref.b_wing2 - character.g_wing2 = pref.g_wing2 - character.r_wing3 = pref.r_wing3 - character.b_wing3 = pref.b_wing3 - character.g_wing3 = pref.g_wing3 - character.set_gender( pref.biological_gender) + + var/list/ear_styles = pref.get_available_styles(global.ear_styles_list) + character.ear_style = ear_styles[pref.ear_style] + character.r_ears = pref.r_ears + character.b_ears = pref.b_ears + character.g_ears = pref.g_ears + character.r_ears2 = pref.r_ears2 + character.b_ears2 = pref.b_ears2 + character.g_ears2 = pref.g_ears2 + character.r_ears3 = pref.r_ears3 + character.b_ears3 = pref.b_ears3 + character.g_ears3 = pref.g_ears3 + + var/list/tail_styles = pref.get_available_styles(global.tail_styles_list) + character.tail_style = tail_styles[pref.tail_style] + character.r_tail = pref.r_tail + character.b_tail = pref.b_tail + character.g_tail = pref.g_tail + character.r_tail2 = pref.r_tail2 + character.b_tail2 = pref.b_tail2 + character.g_tail2 = pref.g_tail2 + character.r_tail3 = pref.r_tail3 + character.b_tail3 = pref.b_tail3 + character.g_tail3 = pref.g_tail3 + + var/list/wing_styles = pref.get_available_styles(global.wing_styles_list) + character.wing_style = wing_styles[pref.wing_style] + character.r_wing = pref.r_wing + character.b_wing = pref.b_wing + character.g_wing = pref.g_wing + character.r_wing2 = pref.r_wing2 + character.b_wing2 = pref.b_wing2 + character.g_wing2 = pref.g_wing2 + character.r_wing3 = pref.r_wing3 + character.b_wing3 = pref.b_wing3 + character.g_wing3 = pref.g_wing3 + + character.set_gender(pref.biological_gender) // Destroy/cyborgize organs and limbs. for(var/name in list(BP_HEAD, BP_L_HAND, BP_R_HAND, BP_L_ARM, BP_R_ARM, BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG, BP_GROIN, BP_TORSO)) @@ -510,59 +550,47 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O . += "

Genetics Settings

" - var/ear_display = "Normal" - if(pref.ear_style && (pref.ear_style in ear_styles_list)) - var/datum/sprite_accessory/ears/instance = ear_styles_list[pref.ear_style] - ear_display = instance.name - - else if(pref.ear_style) - ear_display = "REQUIRES UPDATE" + var/list/ear_styles = pref.get_available_styles(global.ear_styles_list) + var/datum/sprite_accessory/ears/ear = ear_styles[pref.ear_style] . += "Ears
" - . += " Style: [ear_display]
" - if(ear_styles_list[pref.ear_style]) - var/datum/sprite_accessory/ears/ear = ear_styles_list[pref.ear_style] + if(istype(ear)) + . += " Style: [ear.name]
" if(ear.do_colouration) . += "Change Color [color_square(pref.r_ears, pref.g_ears, pref.b_ears)]
" if(ear.extra_overlay) . += "Change Secondary Color [color_square(pref.r_ears2, pref.g_ears2, pref.b_ears2)]
" if(ear.extra_overlay2) . += "Change Tertiary Color [color_square(pref.r_ears3, pref.g_ears3, pref.b_ears3)]
" + else + . += " Style: Select
" - var/tail_display = "Normal" - if(pref.tail_style && (pref.tail_style in tail_styles_list)) - var/datum/sprite_accessory/tail/instance = tail_styles_list[pref.tail_style] - tail_display = instance.name - else if(pref.tail_style) - tail_display = "REQUIRES UPDATE" + var/list/tail_styles = pref.get_available_styles(global.tail_styles_list) + var/datum/sprite_accessory/tail/tail = tail_styles[pref.tail_style] . += "Tail
" - . += " Style: [tail_display]
" - - if(tail_styles_list[pref.tail_style]) - var/datum/sprite_accessory/tail/T = tail_styles_list[pref.tail_style] - if(T.do_colouration) + if(istype(tail)) + . += " Style: [tail.name]
" + if(tail.do_colouration) . += "Change Color [color_square(pref.r_tail, pref.g_tail, pref.b_tail)]
" - if(T.extra_overlay) + if(tail.extra_overlay) . += "Change Secondary Color [color_square(pref.r_tail2, pref.g_tail2, pref.b_tail2)]
" - if(T.extra_overlay2) + if(tail.extra_overlay2) . += "Change Tertiary Color [color_square(pref.r_tail3, pref.g_tail3, pref.b_tail3)]
" + else + . += " Style: Select
" - var/wing_display = "Normal" - if(pref.wing_style && (pref.wing_style in wing_styles_list)) - var/datum/sprite_accessory/wing/instance = wing_styles_list[pref.wing_style] - wing_display = instance.name - else if(pref.wing_style) - wing_display = "REQUIRES UPDATE" + var/list/wing_styles = pref.get_available_styles(global.wing_styles_list) + var/datum/sprite_accessory/wing/wings = wing_styles[pref.wing_style] . += "Wing
" - . += " Style: [wing_display]
" - - if(wing_styles_list[pref.wing_style]) - var/datum/sprite_accessory/wing/W = wing_styles_list[pref.wing_style] - if(W.do_colouration) + if(istype(wings)) + . += " Style: [wings.name]
" + if(wings.do_colouration) . += "Change Color [color_square(pref.r_wing, pref.g_wing, pref.b_wing)]
" - if(W.extra_overlay) + if(wings.extra_overlay) . += "Change Secondary Color [color_square(pref.r_wing2, pref.g_wing2, pref.b_wing2)]
" - if(W.extra_overlay2) + if(wings.extra_overlay2) . += "Change Secondary Color [color_square(pref.r_wing3, pref.g_wing3, pref.b_wing3)]
" + else + . += " Style: Select
" . += "
Body Markings +
" . += "" @@ -661,13 +689,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O reset_limbs() // Safety for species with incompatible manufacturers; easier than trying to do it case by case. pref.body_markings.Cut() // Basically same as above. - // Sanitize ear/wing/tail styles - if(!(pref.ear_style in get_ear_styles())) - pref.ear_style = initial(pref.ear_style) - if(!(pref.wing_style in get_wing_styles())) - pref.wing_style = initial(pref.wing_style) - if(!(pref.tail_style in get_tail_styles())) - pref.tail_style = initial(pref.tail_style) + pref.sanitize_body_styles() var/min_age = get_min_age() var/max_age = get_max_age() @@ -1084,13 +1106,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["ear_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_ear_styles = get_ear_styles() - - // Present choice to user - var/new_ear_style = input(user, "Pick ears", "Character Preference", pref.ear_style) as null|anything in pretty_ear_styles + var/new_ear_style = input(user, "Select an ear style for this character:", "Character Preference", pref.ear_style) as null|anything in pref.get_available_styles(global.ear_styles_list) if(new_ear_style) - pref.ear_style = pretty_ear_styles[new_ear_style] + pref.ear_style = new_ear_style return TOPIC_REFRESH_UPDATE_PREVIEW @@ -1122,14 +1140,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["tail_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_tail_styles = get_tail_styles() - - // Present choice to user - var/new_tail_style = input(user, "Pick tails", "Character Preference", pref.tail_style) as null|anything in pretty_tail_styles + var/new_tail_style = input(user, "Select a tail style for this character:", "Character Preference", pref.tail_style) as null|anything in pref.get_available_styles(global.tail_styles_list) if(new_tail_style) - pref.tail_style = pretty_tail_styles[new_tail_style] - + pref.tail_style = new_tail_style return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["tail_color"]) @@ -1160,13 +1173,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O return TOPIC_REFRESH_UPDATE_PREVIEW else if(href_list["wing_style"]) - // Construct the list of names allowed for this user. - var/list/pretty_wing_styles = get_wing_styles() - - // Present choice to user - var/new_wing_style = input(user, "Pick wings", "Character Preference", pref.wing_style) as null|anything in pretty_wing_styles + var/new_wing_style = input(user, "Select a wing style for this character:", "Character Preference", pref.wing_style) as null|anything in pref.get_available_styles(global.wing_styles_list) if(new_wing_style) - pref.wing_style = pretty_wing_styles[new_wing_style] + pref.wing_style = new_wing_style return TOPIC_REFRESH_UPDATE_PREVIEW @@ -1291,27 +1300,3 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O dat += "" user << browse(dat, "window=species;size=700x400") - -/datum/category_item/player_setup_item/general/body/proc/get_tail_styles() - var/list/pretty_tail_styles = list("Normal" = null) - for(var/path in tail_styles_list) - var/datum/sprite_accessory/tail/instance = tail_styles_list[path] - if(((!instance.ckeys_allowed) || (pref.client.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, pref.client)) //VOREStation Edit - pretty_tail_styles[instance.name] = path - return pretty_tail_styles - -/datum/category_item/player_setup_item/general/body/proc/get_ear_styles() - var/list/pretty_ear_styles = list("Normal" = null) - for(var/path in ear_styles_list) - var/datum/sprite_accessory/ears/instance = ear_styles_list[path] - if(((!instance.ckeys_allowed) || (pref.client.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, pref.client)) //VOREStation Edit - pretty_ear_styles[instance.name] = path - return pretty_ear_styles - -/datum/category_item/player_setup_item/general/body/proc/get_wing_styles() - var/list/pretty_wing_styles = list("Normal" = null) - for(var/path in wing_styles_list) - var/datum/sprite_accessory/wing/instance = wing_styles_list[path] - if(((!instance.ckeys_allowed) || (pref.client.ckey in instance.ckeys_allowed)) && ((!instance.apply_restrictions) || (pref.species in instance.species_allowed)) || check_rights(R_ADMIN | R_EVENT | R_FUN, 0, pref.client)) //VOREStation Edit - pretty_wing_styles[instance.name] = path - return pretty_wing_styles diff --git a/code/modules/emotes/definitions/_mob.dm b/code/modules/emotes/definitions/_mob.dm new file mode 100644 index 00000000000..8c10b4cde2f --- /dev/null +++ b/code/modules/emotes/definitions/_mob.dm @@ -0,0 +1,41 @@ +var/list/_default_mob_emotes = list( + /decl/emote/visible, + /decl/emote/visible/scratch, + /decl/emote/visible/drool, + /decl/emote/visible/nod, + /decl/emote/visible/sway, + /decl/emote/visible/sulk, + /decl/emote/visible/twitch, + /decl/emote/visible/twitch_v, + /decl/emote/visible/dance, + /decl/emote/visible/roll, + /decl/emote/visible/shake, + /decl/emote/visible/jump, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/visible/spin, + /decl/emote/visible/sidestep, + /decl/emote/audible, + /decl/emote/audible/hiss, + /decl/emote/audible/whimper, + /decl/emote/audible/gasp, + /decl/emote/audible/scretch, + /decl/emote/audible/choke, + /decl/emote/audible/moan, + /decl/emote/audible/gnarl, +) + +/mob + var/list/usable_emotes + +/mob/proc/update_emotes(var/skip_sort) + usable_emotes = list() + for(var/emote in get_default_emotes()) + var/decl/emote/emote_datum = decls_repository.get_decl(emote) + if(emote_datum.check_user(src)) + usable_emotes[emote_datum.key] = emote_datum + if(!skip_sort) + usable_emotes = sortAssoc(usable_emotes) + +/mob/proc/get_default_emotes() + return global._default_mob_emotes diff --git a/code/modules/emotes/definitions/_species.dm b/code/modules/emotes/definitions/_species.dm new file mode 100644 index 00000000000..ff15df2fae5 --- /dev/null +++ b/code/modules/emotes/definitions/_species.dm @@ -0,0 +1,11 @@ +/datum/species + var/list/default_emotes = list() + +/mob/living/carbon/update_emotes(var/skip_sort) + . = ..(skip_sort = TRUE) + if(species) + for(var/emote in species.default_emotes) + var/decl/emote/emote_datum = decls_repository.get_decl(emote) + if(emote_datum.check_user(src)) + usable_emotes[emote_datum.key] = emote_datum + usable_emotes = sortAssoc(usable_emotes) diff --git a/code/modules/emotes/definitions/audible.dm b/code/modules/emotes/definitions/audible.dm new file mode 100644 index 00000000000..6365f1171dd --- /dev/null +++ b/code/modules/emotes/definitions/audible.dm @@ -0,0 +1,229 @@ +/decl/emote/audible + key = "burp" + emote_message_3p = "burps." + message_type = AUDIBLE_MESSAGE + +/decl/emote/audible/New() + . = ..() + // Snips the 'USER' from 3p emote messages for radio. + if(!emote_message_radio && emote_message_3p) + emote_message_radio = emote_message_3p + if(!emote_message_radio_synthetic && emote_message_synthetic_3p) + emote_message_radio_synthetic = emote_message_synthetic_3p + +/decl/emote/audible/deathgasp_alien + key = "deathgasp" + emote_message_3p = "lets out a waning guttural screech, green blood bubbling from its maw." + +/decl/emote/audible/whimper + key = "whimper" + emote_message_3p = "whimpers." + +/decl/emote/audible/gasp + key = "gasp" + emote_message_3p = "gasps." + conscious = FALSE + +/decl/emote/audible/scretch + key = "scretch" + emote_message_3p = "scretches." + +/decl/emote/audible/choke + key ="choke" + emote_message_3p = "chokes." + conscious = FALSE + +/decl/emote/audible/gnarl + key = "gnarl" + emote_message_3p = "gnarls and shows USER_HIS teeth." + +/decl/emote/audible/multichirp + key = "mchirp" + emote_message_3p = "chirps a chorus of notes!" + emote_sound = 'sound/voice/multichirp.ogg' + +/decl/emote/audible/alarm + key = "alarm" + emote_message_1p = "You sound an alarm." + emote_message_3p = "sounds an alarm." + +/decl/emote/audible/alert + key = "alert" + emote_message_1p = "You let out a distressed noise." + emote_message_3p = "lets out a distressed noise." + +/decl/emote/audible/notice + key = "notice" + emote_message_1p = "You play a loud tone." + emote_message_3p = "plays a loud tone." + +/decl/emote/audible/boop + key = "boop" + emote_message_1p = "You boop." + emote_message_3p = "boops." + +/decl/emote/audible/beep + key = "beep" + emote_message_3p = "You beep." + emote_message_3p = "beeps." + emote_sound = 'sound/machines/twobeep.ogg' + +/decl/emote/audible/sniff + key = "sniff" + emote_message_3p = "sniffs." + +/decl/emote/audible/snore + key = "snore" + emote_message_3p = "snores." + conscious = FALSE + +/decl/emote/audible/whimper + key = "whimper" + emote_message_3p = "whimpers." + +/decl/emote/audible/yawn + key = "yawn" + emote_message_3p = "yawns." + +/decl/emote/audible/clap + key = "clap" + emote_message_3p = "claps." + +/decl/emote/audible/chuckle + key = "chuckle" + emote_message_3p = "chuckles." + +/decl/emote/audible/cry + key = "cry" + emote_message_3p = "cries." + +/decl/emote/audible/sigh + key = "sigh" + emote_message_3p = "sighs." + +/decl/emote/audible/laugh + key = "laugh" + emote_message_3p_target = "laughs at TARGET." + emote_message_3p = "laughs." + +/decl/emote/audible/mumble + key = "mumble" + emote_message_3p = "mumbles!" + +/decl/emote/audible/grumble + key = "grumble" + emote_message_3p = "grumbles!" + +/decl/emote/audible/groan + key = "groan" + emote_message_3p = "groans!" + conscious = FALSE + +/decl/emote/audible/moan + key = "moan" + emote_message_3p = "moans!" + conscious = FALSE + +/decl/emote/audible/giggle + key = "giggle" + emote_message_3p = "giggles." + +/decl/emote/audible/grunt + key = "grunt" + emote_message_3p = "grunts." + +/decl/emote/audible/bug_hiss + key ="hiss" + emote_message_3p_target = "hisses at TARGET." + emote_message_3p = "hisses." + emote_sound = 'sound/voice/BugHiss.ogg' + +/decl/emote/audible/bug_buzz + key ="buzz" + emote_message_3p = "buzzes its wings." + emote_sound = 'sound/voice/BugBuzz.ogg' + +/decl/emote/audible/bug_chitter + key ="chitter" + emote_message_3p = "chitters." + emote_sound = 'sound/voice/Bug.ogg' + +/decl/emote/audible/roar + key = "roar" + emote_message_3p = "roars!" + +/decl/emote/audible/bellow + key = "bellow" + emote_message_3p = "bellows!" + +/decl/emote/audible/howl + key = "howl" + emote_message_3p = "howls!" + +/decl/emote/audible/wheeze + key = "wheeze" + emote_message_3p = "wheezes." + +/decl/emote/audible/hiss + key = "hiss" + emote_message_3p_target = "hisses softly at TARGET." + emote_message_3p = "hisses softly." + +/decl/emote/audible/chirp + key = "chirp" + emote_message_3p = "chirps!" + emote_sound = 'sound/misc/nymphchirp.ogg' + +/decl/emote/audible/crack + key = "crack" + emote_message_3p = "cracks USER_HIS knuckles." + emote_sound = 'sound/voice/knuckles.ogg' + +/decl/emote/audible/squish + key = "squish" + emote_sound = 'sound/effects/slime_squish.ogg' //Credit to DrMinky (freesound.org) for the sound. + emote_message_3p = "squishes." + +/decl/emote/audible/warble + key = "warble" + emote_sound = 'sound/effects/warble.ogg' // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound. + emote_message_3p = "warbles." + +/decl/emote/audible/vox_shriek + key = "shriek" + emote_message_3p = "SHRIEKS!" + emote_sound = 'sound/voice/shriek1.ogg' + +/decl/emote/audible/purr + key = "purr" + emote_message_3p = "purrs." + emote_sound = 'sound/voice/cat_purr.ogg' + +/decl/emote/audible/purrlong + key = "purrl" + emote_message_3p = "purrs." + emote_sound = 'sound/voice/cat_purr_long.ogg' + +/decl/emote/audible/teshsqueak + key = "surprised" + emote_message_1p = "You chirp in surprise!" + emote_message_3p = "chirps in surprise!" + emote_message_1p_target = "You chirp in surprise at TARGET!" + emote_message_3p_target = "chirps in surprise at TARGET!" + emote_sound = 'sound/voice/teshsqueak.ogg' // Copyright CC BY 3.0 InspectorJ (freesound.org) for the source audio. + +/decl/emote/audible/teshchirp + key = "chirp" + emote_message_1p = "You chirp!" + emote_message_3p = "chirps!" + emote_message_1p_target = "You chirp at TARGET!" + emote_message_3p_target = "chirps at TARGET!" + emote_sound = 'sound/voice/teshchirp.ogg' // Copyright Sampling+ 1.0 Incarnidine (freesound.org) for the source audio. + +/decl/emote/audible/teshtrill + key = "trill" + emote_message_1p = "You trill." + emote_message_3p = "trills." + emote_message_1p_target = "You trill at TARGET." + emote_message_3p_target = "trills at TARGET." + emote_sound = 'sound/voice/teshtrill.ogg' // Copyright CC BY-NC 3.0 Arnaud Coutancier (freesound.org) for the source audio. diff --git a/code/modules/emotes/definitions/audible_cough.dm b/code/modules/emotes/definitions/audible_cough.dm new file mode 100644 index 00000000000..4e28d1db918 --- /dev/null +++ b/code/modules/emotes/definitions/audible_cough.dm @@ -0,0 +1,52 @@ +/decl/emote/audible/cough + key = "cough" + emote_message_1p = "You cough!" + emote_message_1p_target = "You cough on TARGET!" + emote_message_3p = "coughs!" + emote_message_3p_target = "coughs on TARGET!" + emote_message_synthetic_1p_target = "You emit a robotic cough towards TARGET." + emote_message_synthetic_1p = "You emit a robotic cough." + emote_message_synthetic_3p_target = "emits a robotic cough towards TARGET." + emote_message_synthetic_3p = "emits a robotic cough." + emote_volume = 120 + emote_volume_synthetic = 50 + + conscious = FALSE + emote_sound_synthetic = list( + FEMALE = list( + 'sound/effects/mob_effects/f_machine_cougha.ogg', + 'sound/effects/mob_effects/f_machine_coughb.ogg' + ), + MALE = list( + 'sound/effects/mob_effects/m_machine_cougha.ogg', + 'sound/effects/mob_effects/m_machine_coughb.ogg', + 'sound/effects/mob_effects/m_machine_coughc.ogg' + ), + NEUTER = list( + 'sound/effects/mob_effects/m_machine_cougha.ogg', + 'sound/effects/mob_effects/m_machine_coughb.ogg', + 'sound/effects/mob_effects/m_machine_coughc.ogg' + ), + PLURAL = list( + 'sound/effects/mob_effects/m_machine_cougha.ogg', + 'sound/effects/mob_effects/m_machine_coughb.ogg', + 'sound/effects/mob_effects/m_machine_coughc.ogg' + ) + ) + +/decl/emote/audible/cough/get_emote_sound(var/atom/user) + if(ishuman(user) && !check_synthetic(user)) + var/mob/living/carbon/human/H = user + if(H.get_gender() == FEMALE) + if(length(H.species.female_cough_sounds)) + return list( + "sound" = H.species.female_cough_sounds, + "vol" = emote_volume + ) + else + if(length(H.species.male_cough_sounds)) + return list( + "sound" = H.species.male_cough_sounds, + "vol" = emote_volume + ) + return ..() diff --git a/code/modules/emotes/definitions/audible_furry_vr.dm b/code/modules/emotes/definitions/audible_furry_vr.dm new file mode 100644 index 00000000000..681e9101a29 --- /dev/null +++ b/code/modules/emotes/definitions/audible_furry_vr.dm @@ -0,0 +1,129 @@ +/decl/emote/audible/awoo + key = "awoo" + emote_message_3p = "lets out an awoo." + emote_sound = 'sound/voice/awoo.ogg' +/decl/emote/audible/awoo2 + key = "awoo2" + emote_message_3p = "lets out an awoo." + emote_sound = 'sound/voice/long_awoo.ogg' +/decl/emote/audible/growl + key = "growl" + emote_message_3p = "lets out a growl." + emote_sound = 'sound/voice/growl.ogg' +/decl/emote/audible/woof + key = "woof" + emote_message_3p = "lets out a woof." + emote_sound = 'sound/voice/woof.ogg' +/decl/emote/audible/woof2 + key = "woof2" + emote_message_3p = "lets out a woof." + emote_sound = 'sound/voice/woof2.ogg' +/decl/emote/audible/nya + key = "nya" + emote_message_3p = "lets out a nya." + emote_sound = 'sound/voice/nya.ogg' +/decl/emote/audible/mrowl + key = "mrowl" + emote_message_3p = "mrowls." + emote_sound = 'sound/voice/mrow.ogg' +/decl/emote/audible/peep + key = "peep" + emote_message_3p = "peeps like a bird." + emote_sound = 'sound/voice/peep.ogg' +/decl/emote/audible/chirp + key = "chirp" + emote_message_3p = "chirps!" + emote_sound = 'sound/misc/nymphchirp.ogg' +/decl/emote/audible/hoot + key = "hoot" + emote_message_3p = "hoots!" + emote_sound = 'sound/voice/hoot.ogg' +/decl/emote/audible/weh + key = "weh" + emote_message_3p = "lets out a weh." + emote_sound = 'sound/voice/weh.ogg' +/decl/emote/audible/merp + key = "merp" + emote_message_3p = "lets out a merp." + emote_sound = 'sound/voice/merp.ogg' +/decl/emote/audible/myarp + key = "myarp" + emote_message_3p = "lets out a myarp." + emote_sound = 'sound/voice/myarp.ogg' +/decl/emote/audible/bark + key = "bark" + emote_message_3p = "lets out a bark." + emote_sound = 'sound/voice/bark2.ogg' +/decl/emote/audible/bork + key = "bork" + emote_message_3p = "lets out a bork." + emote_sound = 'sound/voice/bork.ogg' +/decl/emote/audible/mrow + emote_message_3p = "lets out a mrow." + emote_sound = 'sound/voice/mrow.ogg' +/decl/emote/audible/hypno + emote_message_3p = "lets out a mystifying tone." + emote_sound = 'sound/voice/hypno.ogg' +/decl/emote/audible/hiss + key = "hiss" + emote_message_3p = "lets out a hiss." + emote_sound = 'sound/voice/hiss.ogg' +/decl/emote/audible/rattle + key = "rattle" + emote_message_3p = "rattles!" + emote_sound = 'sound/voice/rattle.ogg' +/decl/emote/audible/squeak + key = "squeak" + emote_message_3p = "lets out a squeak." + emote_sound = 'sound/effects/mouse_squeak.ogg' +/decl/emote/audible/geck + key = "geck" + emote_message_3p = "geckers!" + emote_sound = 'sound/voice/geck.ogg' +/decl/emote/audible/baa + key = "baa" + emote_message_3p = "lets out a baa." + emote_sound = 'sound/voice/baa.ogg' +/decl/emote/audible/baa2 + key = "baa2" + emote_message_3p = "bleats." + emote_sound = 'sound/voice/baa2.ogg' +/* +/decl/emote/audible/deathgasp2 + key = "deathgasp2" + emote_message_3p = "[species.get_death_message()]" + m_type = 1 + emote_sound = 'sound/voice/deathgasp2.ogg' +*/ +/decl/emote/audible/mar + key = "mar" + emote_message_3p = "lets out a mar." + emote_sound = 'sound/voice/mar.ogg' +/decl/emote/audible/wurble + key = "wurble" + emote_message_3p = "lets out a wurble." + emote_sound = 'sound/voice/wurble.ogg' +/decl/emote/audible/snort + key = "snort" + emote_message_3p = "snorts!" + emote_sound = 'sound/voice/Snort.ogg' +/decl/emote/audible/meow + key = "meow" + emote_message_3p = "gently meows!" + emote_sound = 'sound/voice/Meow.ogg' +/decl/emote/audible/moo + key = "moo" + emote_message_3p = "takes a breath and lets out a moo." + emote_sound = 'sound/voice/Moo.ogg' +/decl/emote/audible/croak + key = "croak" + emote_message_3p = "rumbles their throat, puffs their cheeks and croaks." + emote_sound = 'sound/voice/Croak.ogg' +/decl/emote/audible/gao + key = "gao" + emote_message_3p = "lets out a gao." + emote_sound = 'sound/voice/gao.ogg' +/decl/emote/audible/cackle + key = "cackle" + emote_message_3p = "cackles hysterically!" + emote_sound = 'sound/voice/YeenCackle.ogg' diff --git a/code/modules/emotes/definitions/audible_scream.dm b/code/modules/emotes/definitions/audible_scream.dm new file mode 100644 index 00000000000..00ed9c29fc3 --- /dev/null +++ b/code/modules/emotes/definitions/audible_scream.dm @@ -0,0 +1,16 @@ +/decl/emote/audible/scream + key = "scream" + emote_message_1p = "You scream!" + emote_message_3p = "screams!" + +/decl/emote/audible/scream/get_emote_message_1p(var/atom/user, var/atom/target, var/extra_params) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + return "You [H.species.scream_verb_1p]!" + . = ..() + +/decl/emote/audible/cough/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + return "[H.species.scream_verb_3p]!" + . = ..() diff --git a/code/modules/emotes/definitions/audible_slap.dm b/code/modules/emotes/definitions/audible_slap.dm new file mode 100644 index 00000000000..d0b5466c30c --- /dev/null +++ b/code/modules/emotes/definitions/audible_slap.dm @@ -0,0 +1,24 @@ +/decl/emote/audible/slap + key = "slap" + emote_message_1p_target = "You slap TARGET across the face. Ouch!" + emote_message_1p = "You slap yourself across the face!" + emote_message_3p_target = "slaps TARGET across the face. Ouch!" + emote_message_3p = "slaps USER_SELF across the face!" + emote_sound = 'sound/effects/snap.ogg' + check_restraints = TRUE + check_range = 1 + +/decl/emote/audible/slap/New() + ..() + emote_message_1p_target = SPAN_DANGER(emote_message_1p_target) + emote_message_1p = SPAN_DANGER(emote_message_1p) + emote_message_3p_target = SPAN_DANGER(emote_message_3p_target) + emote_message_3p = SPAN_DANGER(emote_message_3p) + +/decl/emote/audible/slap/do_extra(var/atom/user, var/atom/target) + . = ..() + if(ishuman(target)) + var/mob/living/carbon/human/H = target + var/obj/item/clothing/mask/smokable/mask = H.wear_mask + if(istype(mask) && H.unEquip(mask)) + mask.forceMove(get_turf(H)) diff --git a/code/modules/emotes/definitions/audible_snap.dm b/code/modules/emotes/definitions/audible_snap.dm new file mode 100644 index 00000000000..938273fe76c --- /dev/null +++ b/code/modules/emotes/definitions/audible_snap.dm @@ -0,0 +1,22 @@ +/decl/emote/audible/snap + key = "snap" + emote_message_1p = "You snap your fingers." + emote_message_3p = "snaps USER_HIS fingers." + emote_message_1p_target = "You snap your fingers at TARGET." + emote_message_3p_target = "snaps USER_HIS fingers at TARGET." + emote_sound = 'sound/effects/fingersnap.ogg' + +/decl/emote/audible/snap/proc/can_snap(var/atom/user) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + for(var/limb in list(BP_L_HAND, BP_R_HAND)) + var/obj/item/organ/external/L = H.get_organ(limb) + if(istype(L) && L.is_usable() && !L.splinted) + return TRUE + return FALSE + +/decl/emote/audible/snap/do_emote(var/atom/user, var/extra_params) + if(!can_snap(user)) + to_chat(user, SPAN_WARNING("You need at least one working hand to snap your fingers.")) + return FALSE + . = ..() diff --git a/code/modules/emotes/definitions/audible_sneeze.dm b/code/modules/emotes/definitions/audible_sneeze.dm new file mode 100644 index 00000000000..a15cbaf46db --- /dev/null +++ b/code/modules/emotes/definitions/audible_sneeze.dm @@ -0,0 +1,29 @@ +/decl/emote/audible/sneeze + key = "sneeze" + emote_message_1p = "You sneeze." + emote_message_3p = "sneezes." + emote_sound_synthetic = list( + FEMALE = 'sound/effects/mob_effects/machine_sneeze.ogg', + MALE = 'sound/effects/mob_effects/f_machine_sneeze.ogg', + NEUTER = 'sound/effects/mob_effects/f_machine_sneeze.ogg', + PLURAL = 'sound/effects/mob_effects/f_machine_sneeze.ogg' + ) + emote_message_synthetic_1p = "You emit a robotic sneeze." + emote_message_synthetic_1p_target = "You emit a robotic sneeze towards TARGET." + emote_message_synthetic_3p = "emits a robotic sneeze." + emote_message_synthetic_3p_target = "emits a robotic sneeze towards TARGET." + +/decl/emote/audible/sneeze/get_emote_sound(var/atom/user) + if(ishuman(user) && !check_synthetic(user)) + var/mob/living/carbon/human/H = user + if(H.get_gender() == FEMALE) + return list( + "sound" = H.species.female_sneeze_sound, + "vol" = emote_volume + ) + else + return list( + "sound" = H.species.male_sneeze_sound, + "vol" = emote_volume + ) + return ..() diff --git a/code/modules/emotes/definitions/audible_whistle.dm b/code/modules/emotes/definitions/audible_whistle.dm new file mode 100644 index 00000000000..dabd64af59d --- /dev/null +++ b/code/modules/emotes/definitions/audible_whistle.dm @@ -0,0 +1,36 @@ +/decl/emote/audible/whistle + key = "whistle" + emote_message_1p = "You whistle a tune." + emote_message_3p = "whistles a tune." + emote_sound = 'sound/voice/longwhistle.ogg' + emote_message_muffled = "makes a light spitting noise, a poor attempt at a whistle." + emote_sound_synthetic = 'sound/voice/longwhistle_robot.ogg' + emote_message_synthetic_1p = "You whistle a robotic tune." + emote_message_synthetic_3p = "whistles a robotic tune." + +/decl/emote/audible/whistle/quiet + key = "qwhistle" + emote_message_1p = "You whistle quietly." + emote_message_3p = "whistles quietly." + emote_sound = 'sound/voice/shortwhistle.ogg' + emote_message_synthetic_1p = "You whistle robotically." + emote_message_synthetic_3p = "whistles robotically." + emote_sound_synthetic = 'sound/voice/shortwhistle_robot.ogg' + +/decl/emote/audible/whistle/wolf + key = "wwhistle" + emote_message_1p = "You whistle inappropriately." + emote_message_3p = "whistles inappropriately." + emote_sound = 'sound/voice/wolfwhistle.ogg' + emote_message_synthetic_1p = "You beep inappropriately." + emote_message_synthetic_3p = "beeps inappropriately." + emote_sound_synthetic = 'sound/voice/wolfwhistle_robot.ogg' + +/decl/emote/audible/whistle/summon + key = "swhistle" + emote_message_1p = "You whistle a tune." + emote_message_3p = "whistles a tune." + emote_sound = 'sound/voice/summon_whistle.ogg' + emote_message_synthetic_1p = "You whistle a robotic tune." + emote_message_synthetic_3p = "whistles a robotic tune." + emote_sound_synthetic = 'sound/voice/summon_whistle_robot.ogg' diff --git a/code/modules/emotes/definitions/exertion.dm b/code/modules/emotes/definitions/exertion.dm new file mode 100644 index 00000000000..ac0061cca32 --- /dev/null +++ b/code/modules/emotes/definitions/exertion.dm @@ -0,0 +1,40 @@ +/decl/emote/exertion/biological + key = "esweat" + emote_range = 4 + emote_message_1p = "You are sweating heavily." + emote_message_3p = "is sweating heavily." + +/decl/emote/exertion/biological/check_user(mob/living/user) + if(istype(user) && !user.isSynthetic()) + return ..() + return FALSE + +/decl/emote/exertion/biological/breath + key = "ebreath" + emote_message_1p = "You feel out of breath." + emote_message_3p = "looks out of breath." + +/decl/emote/exertion/biological/pant + key = "epant" + emote_range = 3 + message_type = AUDIBLE_MESSAGE + emote_message_1p = "You pant to catch your breath." + emote_message_3p = "pants for air." + emote_message_impaired = "You can see USER breathing heavily." + +/decl/emote/exertion/synthetic + key = "ewhine" + emote_range = 3 + message_type = AUDIBLE_MESSAGE + emote_message_1p = "You overstress your actuators." + emote_message_3p = "USER's actuators whine with strain." + +/decl/emote/exertion/synthetic/check_user(mob/living/user) + if(istype(user) && user.isSynthetic()) + return ..() + return FALSE + +/decl/emote/exertion/synthetic/creak + key = "ecreak" + emote_message_1p = "Your chassis stress indicators spike." + emote_message_3p = "USER's joints creak with stress." diff --git a/code/modules/emotes/definitions/helpers_vr.dm b/code/modules/emotes/definitions/helpers_vr.dm new file mode 100644 index 00000000000..6dc3a79bddc --- /dev/null +++ b/code/modules/emotes/definitions/helpers_vr.dm @@ -0,0 +1,33 @@ +// Not specifically /human type because those won't allow FBPs to use them +/decl/emote/helper/vwag + key = "vwag" + emote_message_3p = "" + +/decl/emote/helper/vwag/check_user(mob/living/carbon/human/user) + if(!istype(user) || (!user.tail_style || !user.tail_style.ani_state)) + return FALSE + return ..() + +/decl/emote/helper/vwag/do_emote(var/mob/living/carbon/human/user, var/extra_params) + if(user.toggle_tail(message = 1)) + return ..() + +/decl/emote/helper/vwag/get_emote_message_3p(var/mob/living/carbon/human/user, var/atom/target, var/extra_params) + return "[user.wagging ? "starts" : "stops"] wagging USER_THEIR tail." + + +/decl/emote/helper/vflap + key = "vflap" + emote_message_3p = "" + +/decl/emote/helper/vflap/check_user(mob/living/carbon/human/user) + if(!istype(user) || (!user.wing_style || !user.wing_style.ani_state)) + return FALSE + return ..() + +/decl/emote/helper/vflap/do_emote(var/mob/living/carbon/human/user, var/extra_params) + if(user.toggle_wing(message = 1)) + return ..() + +/decl/emote/helper/vflap/get_emote_message_3p(var/mob/living/carbon/human/user, var/atom/target, var/extra_params) + return "[user.flapping ? "starts" : "stops"] flapping USER_THEIR wings." diff --git a/code/modules/emotes/definitions/human.dm b/code/modules/emotes/definitions/human.dm new file mode 100644 index 00000000000..982e472c5f2 --- /dev/null +++ b/code/modules/emotes/definitions/human.dm @@ -0,0 +1,62 @@ +/decl/emote/human + key = "vomit" + +/decl/emote/human/check_user(var/mob/living/carbon/human/user) + return (istype(user))//VOREStation Edit - What does a mouth have to do with wagging?? && user.check_has_mouth() && !user.isSynthetic()) + +/decl/emote/human/do_emote(var/mob/living/carbon/human/user) + user.vomit() + +/decl/emote/human/deathgasp + key = "deathgasp" + +/decl/emote/human/deathgasp/do_emote(mob/living/carbon/human/user) + if(istype(user) && user.species.get_death_message(user) == DEATHGASP_NO_MESSAGE) + to_chat(user, SPAN_WARNING("Your species has no deathgasp.")) + return + . = ..() + +/decl/emote/human/deathgasp/get_emote_message_3p(var/mob/living/carbon/human/user) + return "USER [user.species.get_death_message(user)]" + +/decl/emote/human/swish + key = "swish" + +/decl/emote/human/swish/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_once() + +/decl/emote/human/wag + key = "wag" + +/decl/emote/human/wag/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_start() + +/decl/emote/human/sway + key = "sway" + +/decl/emote/human/sway/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_start() + +/decl/emote/human/qwag + key = "qwag" + +/decl/emote/human/qwag/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_fast() + +/decl/emote/human/fastsway + key = "fastsway" + +/decl/emote/human/fastsway/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_fast() + +/decl/emote/human/swag + key = "swag" + +/decl/emote/human/swag/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_stop() + +/decl/emote/human/stopsway + key = "stopsway" + +/decl/emote/human/stopsway/do_emote(var/mob/living/carbon/human/user) + user.animate_tail_stop() diff --git a/code/modules/emotes/definitions/slimes.dm b/code/modules/emotes/definitions/slimes.dm new file mode 100644 index 00000000000..877422825ba --- /dev/null +++ b/code/modules/emotes/definitions/slimes.dm @@ -0,0 +1,32 @@ +/decl/emote/slime + key = "nomood" + var/mood + +/decl/emote/slime/do_extra(var/mob/living/simple_mob/slime/user) + . = ..() + if(istype(user)) + user.mood = mood + user.update_icon() + +/decl/emote/slime/check_user(var/atom/user) + return isslime(user) + +/decl/emote/slime/pout + key = "pout" + mood = "pout" + +/decl/emote/slime/sad + key = "sad" + mood = "sad" + +/decl/emote/slime/angry + key = "angry" + mood = "angry" + +/decl/emote/slime/frown + key = "frown" + mood = "mischevous" + +/decl/emote/slime/smile + key = "smile" + mood = ":3" diff --git a/code/modules/emotes/definitions/synthetics.dm b/code/modules/emotes/definitions/synthetics.dm new file mode 100644 index 00000000000..007fe4bc32a --- /dev/null +++ b/code/modules/emotes/definitions/synthetics.dm @@ -0,0 +1,51 @@ +/decl/emote/audible/synth + key = "beep" + emote_message_3p = "beeps." + emote_sound = 'sound/machines/twobeep.ogg' + +/decl/emote/audible/synth/check_user(var/mob/living/user) + if(istype(user) && user.isSynthetic()) + return ..() + return FALSE + +/decl/emote/audible/synth/ping + key = "ping" + emote_message_3p = "pings." + emote_sound = 'sound/machines/ping.ogg' + +/decl/emote/audible/synth/buzz + key = "buzz" + emote_message_3p = "buzzes." + emote_sound = 'sound/machines/buzz-sigh.ogg' + +/decl/emote/audible/synth/confirm + key = "confirm" + emote_message_3p = "emits an affirmative blip." + emote_sound = 'sound/machines/synth_yes.ogg' + +/decl/emote/audible/synth/deny + key = "deny" + emote_message_3p = "emits a negative blip." + emote_sound = 'sound/machines/synth_no.ogg' + +/decl/emote/audible/synth/security + key = "law" + emote_message_3p = "shows USER_HIS legal authorization barcode." + emote_message_3p_target = "shows TARGET USER_THEIR legal authorization barcode." + emote_sound = 'sound/voice/biamthelaw.ogg' + +/decl/emote/audible/synth/security/check_user(var/mob/living/silicon/robot/user) + return (istype(user) && (istype(user.module, /obj/item/weapon/robot_module/robot/security) || istype(user.module, /obj/item/weapon/robot_module/robot/knine))) //VOREStation Add - knine module + +/decl/emote/audible/synth/security/halt + key = "halt" + emote_message_3p = "USER's speakers skreech, \"Halt! Security!\"." + emote_sound = 'sound/voice/halt.ogg' + +/decl/emote/audible/synth/dwoop + key = "dwoop" + emote_message_1p_target = "You chirp happily at TARGET!" + emote_message_1p = "You chirp happily." + emote_message_3p_target = "chirps happily at TARGET!" + emote_message_3p = "chirps happily." + emote_sound = 'sound/machines/dwoop.ogg' diff --git a/code/modules/emotes/definitions/visible.dm b/code/modules/emotes/definitions/visible.dm new file mode 100644 index 00000000000..b346dd3692f --- /dev/null +++ b/code/modules/emotes/definitions/visible.dm @@ -0,0 +1,336 @@ +/decl/emote/visible + key ="tail" + emote_message_3p = "waves USER_THEIR tail." + message_type = VISIBLE_MESSAGE + +/decl/emote/visible/scratch + key = "scratch" + check_restraints = TRUE + emote_message_3p = "scratches." + +/decl/emote/visible/drool + key ="drool" + emote_message_3p = "drools." + conscious = FALSE + +/decl/emote/visible/nod + key ="nod" + emote_message_3p_target = "nods USER_THEIR head at TARGET." + emote_message_3p = "nods USER_THEIR head." + +/decl/emote/visible/sway + key ="sway" + emote_message_3p = "sways around dizzily." + +/decl/emote/visible/sulk + key ="sulk" + emote_message_3p = "sulks down sadly." + +/decl/emote/visible/dance + key ="dance" + check_restraints = TRUE + emote_message_3p = "dances around happily." + +/decl/emote/visible/roll + key ="roll" + check_restraints = TRUE + emote_message_3p = "rolls." + +/decl/emote/visible/shake + key ="shake" + emote_message_3p = "shakes USER_THEIR head." + +/decl/emote/visible/jump + key ="jump" + emote_message_3p = "jumps!" + +/decl/emote/visible/shiver + key ="shiver" + emote_message_3p = "shivers." + conscious = FALSE + +/decl/emote/visible/collapse + key ="collapse" + emote_message_3p = "collapses!" + +/decl/emote/visible/collapse/do_extra(var/mob/user) + ..() + if(istype(user)) + user.Paralyse(2) + +/decl/emote/visible/flash + key = "flash" + emote_message_3p = "flash USER_HIS lights quickly." + +/decl/emote/visible/blink + key = "blink" + emote_message_3p = "blinks." + +/decl/emote/visible/airguitar + key = "airguitar" + check_restraints = TRUE + emote_message_3p = "is strumming the air and headbanging like a safari chimp." + +/decl/emote/visible/blink_r + key = "blink_r" + emote_message_3p = "blinks rapidly." + +/decl/emote/visible/bow + key = "bow" + emote_message_3p_target = "bows to TARGET." + emote_message_3p = "bows." + +/decl/emote/visible/salute + key = "salute" + emote_message_3p_target = "salutes TARGET." + emote_message_3p = "salutes." + check_restraints = TRUE + +/decl/emote/visible/flap + key = "flap" + check_restraints = TRUE + emote_message_3p = "flaps USER_THEIR wings." + +/decl/emote/visible/aflap + key = "aflap" + check_restraints = TRUE + emote_message_3p = "flaps USER_THEIR wings ANGRILY!" + +/decl/emote/visible/eyebrow + key = "eyebrow" + emote_message_3p = "raises an eyebrow." + +/decl/emote/visible/twitch + key = "twitch" + emote_message_3p = "twitches." + conscious = FALSE + +/decl/emote/visible/twitch_v + key = "twitch_v" + emote_message_3p = "twitches violently." + conscious = FALSE + +/decl/emote/visible/faint + key = "faint" + emote_message_3p = "faints." + +/decl/emote/visible/faint/do_extra(var/mob/user) + . = ..() + if(istype(user) && !user.sleeping) + user.Sleeping(10) + +/decl/emote/visible/frown + key = "frown" + emote_message_3p = "frowns." + +/decl/emote/visible/blush + key = "blush" + emote_message_3p = "blushes." + +/decl/emote/visible/wave + key = "wave" + emote_message_3p_target = "waves at TARGET." + emote_message_3p = "waves." + check_restraints = TRUE + +/decl/emote/visible/glare + key = "glare" + emote_message_3p_target = "glares at TARGET." + emote_message_3p = "glares." + +/decl/emote/visible/stare + key = "stare" + emote_message_3p_target = "stares at TARGET." + emote_message_3p = "stares." + +/decl/emote/visible/look + key = "look" + emote_message_3p_target = "looks at TARGET." + emote_message_3p = "looks." + +/decl/emote/visible/point + key = "point" + check_restraints = TRUE + emote_message_3p_target = "points to TARGET." + emote_message_3p = "points." + +/decl/emote/visible/raise + key = "raise" + check_restraints = TRUE + emote_message_3p = "raises a hand." + +/decl/emote/visible/grin + key = "grin" + emote_message_3p_target = "grins at TARGET." + emote_message_3p = "grins." + +/decl/emote/visible/shrug + key = "shrug" + emote_message_3p = "shrugs." + +/decl/emote/visible/smile + key = "smile" + emote_message_3p_target = "smiles at TARGET." + emote_message_3p = "smiles." + +/decl/emote/visible/pale + key = "pale" + emote_message_3p = "goes pale for a second." + +/decl/emote/visible/tremble + key = "tremble" + emote_message_3p = "trembles in fear!" + +/decl/emote/visible/wink + key = "wink" + emote_message_3p_target = "winks at TARGET." + emote_message_3p = "winks." + +/decl/emote/visible/hug + key = "hug" + check_restraints = TRUE + emote_message_3p_target = "hugs TARGET." + emote_message_3p = "hugs USER_SELF." + check_range = 1 + +/decl/emote/visible/dap + key = "dap" + check_restraints = TRUE + emote_message_3p_target = "gives daps to TARGET." + emote_message_3p = "sadly can't find anybody to give daps to, and daps USER_SELF." + +/decl/emote/visible/bounce + key = "bounce" + emote_message_3p = "bounces in place." + +/decl/emote/visible/jiggle + key = "jiggle" + emote_message_3p = "jiggles!" + +/decl/emote/visible/lightup + key = "light" + emote_message_3p = "lights up for a bit, then stops." + +/decl/emote/visible/vibrate + key = "vibrate" + emote_message_3p = "vibrates!" + +/decl/emote/visible/deathgasp_robot + key = "deathgasp" + emote_message_3p = "shudders violently for a moment, then becomes motionless, USER_THEIR eyes slowly darkening." + +/decl/emote/visible/handshake + key = "handshake" + check_restraints = TRUE + emote_message_3p_target = "shakes hands with TARGET." + emote_message_3p = "shakes hands with USER_SELF." + check_range = 1 + +/decl/emote/visible/handshake/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) + if(target && !user.Adjacent(target)) + return "holds out USER_THEIR hand out to TARGET." + return ..() + +/decl/emote/visible/signal + key = "signal" + emote_message_3p_target = "signals at TARGET." + emote_message_3p = "signals." + check_restraints = TRUE + +/decl/emote/visible/signal/check_user(atom/user) + return ismob(user) + +/decl/emote/visible/signal/get_emote_message_3p(var/mob/living/user, var/atom/target, var/extra_params) + if(istype(user) && (!user.get_active_hand() || !user.get_inactive_hand())) + var/t1 = round(text2num(extra_params)) + if(isnum(t1) && t1 <= 5) + return "raises [t1] finger\s." + return .. () + +/decl/emote/visible/afold + key = "afold" + check_restraints = TRUE + emote_message_3p = "folds USER_THEIR arms." + +/decl/emote/visible/alook + key = "alook" + emote_message_3p = "looks away." + +/decl/emote/visible/hbow + key = "hbow" + emote_message_3p = "bows USER_THEIR head." + +/decl/emote/visible/hip + key = "hip" + check_restraints = TRUE + emote_message_3p = "puts USER_THEIR hands on USER_THEIR hips." + +/decl/emote/visible/holdup + key = "holdup" + check_restraints = TRUE + emote_message_3p = "holds up USER_THEIR palms." + +/decl/emote/visible/hshrug + key = "hshrug" + emote_message_3p = "gives a half shrug." + +/decl/emote/visible/crub + key = "crub" + check_restraints = TRUE + emote_message_3p = "rubs USER_THEIR chin." + +/decl/emote/visible/eroll + key = "eroll" + emote_message_3p = "rolls USER_THEIR eyes." + emote_message_3p_target = "rolls USER_THEIR eyes at TARGET." + +/decl/emote/visible/erub + key = "erub" + check_restraints = TRUE + emote_message_3p = "rubs USER_THEIR eyes." + +/decl/emote/visible/fslap + key = "fslap" + check_restraints = TRUE + emote_message_3p = "slaps USER_THEIR forehead." + +/decl/emote/visible/ftap + key = "ftap" + emote_message_3p = "taps USER_THEIR foot." + +/decl/emote/visible/hrub + key = "hrub" + check_restraints = TRUE + emote_message_3p = "rubs USER_THEIR hands together." + +/decl/emote/visible/hspread + key = "hspread" + check_restraints = TRUE + emote_message_3p = "spreads USER_THEIR hands." + +/decl/emote/visible/pocket + key = "pocket" + check_restraints = TRUE + emote_message_3p = "shoves USER_THEIR hands in USER_THEIR pockets." + +/decl/emote/visible/rsalute + key = "rsalute" + check_restraints = TRUE + emote_message_3p = "returns the salute." + +/decl/emote/visible/rshoulder + key = "rshoulder" + emote_message_3p = "rolls USER_THEIR shoulders." + +/decl/emote/visible/squint + key = "squint" + emote_message_3p = "squints." + emote_message_3p_target = "squints at TARGET." + +/decl/emote/visible/tfist + key = "tfist" + emote_message_3p = "tightens USER_THEIR hands into fists." + +/decl/emote/visible/tilt + key = "tilt" + emote_message_3p = "tilts USER_THEIR head." diff --git a/code/modules/emotes/definitions/visible_animated.dm b/code/modules/emotes/definitions/visible_animated.dm new file mode 100644 index 00000000000..2e035d289c7 --- /dev/null +++ b/code/modules/emotes/definitions/visible_animated.dm @@ -0,0 +1,76 @@ +/decl/emote/visible/spin + key = "spin" + check_restraints = TRUE + emote_message_3p = "spins!" + +/decl/emote/visible/spin/do_extra(mob/user) + if(istype(user)) + user.spin(20, 1) + +/decl/emote/visible/sidestep + key = "sidestep" + check_restraints = TRUE + emote_message_3p = "steps rhythmically and moves side to side." + +/decl/emote/visible/sidestep/do_extra(mob/user) + if(istype(user)) + animate(user, pixel_x = 5, time = 5) + sleep(3) + animate(user, pixel_x = -5, time = 5) + animate(pixel_x = user.default_pixel_x, pixel_y = user.default_pixel_x, time = 2) + +/decl/emote/visible/flip + key = "flip" + emote_message_1p = "You do a flip!" + emote_message_3p = "does a flip!" + emote_sound = 'sound/effects/bodyfall4.ogg' + +/decl/emote/visible/flip/do_extra(mob/user) + . = ..() + if(istype(user)) + user.SpinAnimation(7,1) + +/decl/emote/visible/floorspin + key = "floorspin" + emote_message_1p = "You spin around on the floor!" + emote_message_3p = "spins around on the floor!" + var/static/list/spin_dirs = list( + NORTH, + SOUTH, + EAST, + WEST, + EAST, + SOUTH, + NORTH, + SOUTH, + EAST, + WEST, + EAST, + SOUTH, + NORTH, + SOUTH, + EAST, + WEST, + EAST, + SOUTH + ) + +/decl/emote/visible/floorspin/proc/spin_dir(var/mob/user) + set waitfor = FALSE + for(var/i in spin_dirs) + user.set_dir(i) + sleep(1) + if(QDELETED(user)) + return + +/decl/emote/visible/floorspin/proc/spin_anim(var/mob/user) + set waitfor = FALSE + sleep(1) + if(!QDELETED(user)) + user.SpinAnimation(10,1) + +/decl/emote/visible/floorspin/do_extra(mob/user) + . = ..() + if(istype(user)) + spin_dir(user) + spin_anim(user) diff --git a/code/modules/emotes/definitions/visible_vomit.dm b/code/modules/emotes/definitions/visible_vomit.dm new file mode 100644 index 00000000000..1ec79dea6a9 --- /dev/null +++ b/code/modules/emotes/definitions/visible_vomit.dm @@ -0,0 +1,10 @@ +/decl/emote/visible/vomit + key = "vomit" + +/decl/emote/visible/vomit/do_emote(var/atom/user, var/extra_params) + if(isliving(user)) + var/mob/living/M = user + if(!M.isSynthetic()) + M.vomit() + return + to_chat(src, SPAN_WARNING("You are unable to vomit.")) diff --git a/code/modules/emotes/definitions/visible_vr.dm b/code/modules/emotes/definitions/visible_vr.dm new file mode 100644 index 00000000000..69252cf43be --- /dev/null +++ b/code/modules/emotes/definitions/visible_vr.dm @@ -0,0 +1,7 @@ +/decl/emote/visible/mlem + key = "mlem" + emote_message_3p = "mlems USER_THEIR tongue up over USER_THEIR nose. Mlem." + +/decl/emote/visible/blep + key = "blep" + emote_message_3p = "bleps USER_THEIR tongue out. Blep." diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm new file mode 100644 index 00000000000..845a5202d31 --- /dev/null +++ b/code/modules/emotes/emote_define.dm @@ -0,0 +1,181 @@ +// Note about emote messages: +// - USER / TARGET will be replaced with the relevant name, in bold. +// - USER_THEM / TARGET_THEM / USER_THEIR / TARGET_THEIR will be replaced with a +// gender-appropriate version of the same. +// - Impaired messages do not do any substitutions. + +/decl/emote + var/key // Command to use emote ie. '*[key]' + var/emote_message_1p // First person message ('You do a flip!') + var/emote_message_3p // Third person message ('Urist McBackflip does a flip!') + var/emote_message_synthetic_1p // First person message for robits. + var/emote_message_synthetic_3p // Third person message for robits. + + var/emote_message_impaired // Deaf/blind message ('You hear someone flipping out.', 'You see someone opening and closing their mouth') + + var/emote_message_1p_target // 'You do a flip at Urist McTarget!' + var/emote_message_3p_target // 'Urist McShitter does a flip at Urist McTarget!' + var/emote_message_synthetic_1p_target // First person targeted message for robits. + var/emote_message_synthetic_3p_target // Third person targeted message for robits. + + var/emote_message_radio // A message to send over the radio if one picks up this emote. + var/emote_message_radio_synthetic // As above, but for synthetics. + var/emote_message_muffled // A message to show if the emote is audible and the user is muzzled. + + var/list/emote_sound // A sound for the emote to play. + // Can either be a single sound, a list of sounds to pick from, or an + // associative array of gender to single sounds/a list of sounds. + var/list/emote_sound_synthetic // As above, but used when check_synthetic() is true. + var/emote_volume = 50 // Volume of sound to play. + var/emote_volume_synthetic = 50 // As above, but used when check_synthetic() is true. + + var/message_type = VISIBLE_MESSAGE // Audible/visual flag + var/check_restraints // Can this emote be used while restrained? + var/check_range // falsy, or a range outside which the emote will not work + var/conscious = TRUE // Do we need to be awake to emote this? + var/emote_range = 0 // If >0, restricts emote visibility to viewers within range. + +/decl/emote/proc/get_emote_message_1p(var/atom/user, var/atom/target, var/extra_params) + if(target) + if(emote_message_synthetic_1p_target && check_synthetic(user)) + return emote_message_synthetic_1p_target + return emote_message_1p_target + if(emote_message_synthetic_1p && check_synthetic(user)) + return emote_message_synthetic_1p + return emote_message_1p + +/decl/emote/proc/get_emote_message_3p(var/atom/user, var/atom/target, var/extra_params) + if(target) + if(emote_message_synthetic_3p_target && check_synthetic(user)) + return emote_message_synthetic_3p_target + return emote_message_3p_target + if(emote_message_synthetic_3p && check_synthetic(user)) + return emote_message_synthetic_3p + return emote_message_3p + +/decl/emote/proc/get_emote_sound(var/atom/user) + if(check_synthetic(user) && emote_sound_synthetic) + return list( + "sound" = emote_sound_synthetic, + "vol" = emote_volume_synthetic + ) + if(emote_sound) + return list( + "sound" = emote_sound, + "vol" = emote_volume + ) + +/decl/emote/proc/do_emote(var/atom/user, var/extra_params) + if(ismob(user) && check_restraints) + var/mob/M = user + if(M.restrained()) + to_chat(user, SPAN_WARNING("You are restrained and cannot do that.")) + return + + var/atom/target + if(can_target() && extra_params) + extra_params = lowertext(extra_params) + for(var/atom/thing in view(user)) + if(extra_params == lowertext(thing.name)) + target = thing + break + + if(target && target != user && check_range) + if (get_dist(user, target) > check_range) + to_chat(user, SPAN_WARNING("\The [target] is too far away.")) + return + + var/use_1p = get_emote_message_1p(user, target, extra_params) + if(use_1p) + if(target) + use_1p = replace_target_tokens(use_1p, target) + use_1p = "[capitalize(replace_user_tokens(use_1p, user))]" + var/use_3p = get_emote_message_3p(user, target, extra_params) + if(use_3p) + if(target) + use_3p = replace_target_tokens(use_3p, target) + use_3p = "\The [user] [replace_user_tokens(use_3p, user)]" + var/use_radio = get_radio_message(user) + if(use_radio) + if(target) + use_radio = replace_target_tokens(use_radio, target) + use_radio = replace_user_tokens(use_radio, user) + + var/use_range = emote_range + if (!use_range) + use_range = world.view + + if(ismob(user)) + var/mob/M = user + if(message_type == AUDIBLE_MESSAGE) + if(isliving(user)) + var/mob/living/L = user + if(L.silent) + M.visible_message(message = "[user] opens their mouth silently!", self_message = "You cannot say anything!", blind_message = emote_message_impaired) + return + else + M.audible_message(message = use_3p, self_message = use_1p, deaf_message = emote_message_impaired, hearing_distance = use_range, radio_message = use_radio) + else + M.visible_message(message = use_3p, self_message = use_1p, blind_message = emote_message_impaired, range = use_range) + + do_extra(user, target) + do_sound(user) + +/decl/emote/proc/replace_target_tokens(var/msg, var/atom/target) + . = msg + if(istype(target)) + var/datum/gender/target_gender = gender_datums[target.get_visible_gender()] + . = replacetext(., "TARGET_THEM", target_gender.him) + . = replacetext(., "TARGET_THEIR", target_gender.his) + . = replacetext(., "TARGET_SELF", target_gender.himself) + . = replacetext(., "TARGET", "\the [target]") + +/decl/emote/proc/replace_user_tokens(var/msg, var/atom/user) + . = msg + if(istype(user)) + var/datum/gender/user_gender = gender_datums[user.get_visible_gender()] + . = replacetext(., "USER_THEM", user_gender.him) + . = replacetext(., "USER_THEIR", user_gender.his) + . = replacetext(., "USER_SELF", user_gender.himself) + . = replacetext(., "USER", "\the [user]") + +/decl/emote/proc/get_radio_message(var/atom/user) + if(emote_message_radio_synthetic && check_synthetic(user)) + return emote_message_radio_synthetic + return emote_message_radio + +/decl/emote/proc/do_extra(var/atom/user, var/atom/target) + return + +/decl/emote/proc/do_sound(var/atom/user) + var/list/use_sound = get_emote_sound(user) + if(!islist(use_sound) || length(use_sound) < 2) + return + var/sound_to_play = use_sound["sound"] + if(!sound_to_play) + return + if(islist(sound_to_play)) + if(sound_to_play[user.gender]) + sound_to_play = sound_to_play[user.gender] + if(islist(sound_to_play) && length(sound_to_play)) + sound_to_play = pick(sound_to_play) + if(sound_to_play) + playsound(user.loc, sound_to_play, use_sound["vol"], 0, preference = /datum/client_preference/emote_noises) //VOREStation Add - Preference + +/decl/emote/proc/check_user(var/atom/user) + return TRUE + +/decl/emote/proc/can_target() + return (emote_message_1p_target || emote_message_3p_target) + +/decl/emote/dd_SortValue() + return key + +/decl/emote/proc/check_synthetic(var/mob/living/user) + . = istype(user) && user.isSynthetic() + if(!. && ishuman(user) && message_type == AUDIBLE_MESSAGE) + var/mob/living/carbon/human/H = user + if(H.should_have_organ(O_LUNGS)) + var/obj/item/organ/internal/lungs/L = H.internal_organs_by_name[O_LUNGS] + if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs + . = TRUE diff --git a/code/modules/emotes/emote_mob.dm b/code/modules/emotes/emote_mob.dm new file mode 100644 index 00000000000..3e45f05091e --- /dev/null +++ b/code/modules/emotes/emote_mob.dm @@ -0,0 +1,183 @@ +/mob/proc/can_emote(var/emote_type) + return (stat == CONSCIOUS) + +/mob/living/can_emote(var/emote_type) + return (..() && !(silent && emote_type == AUDIBLE_MESSAGE)) + +/mob/proc/emote(var/act, var/m_type, var/message) + set waitfor = FALSE + // s-s-snowflake + if(src.stat == DEAD && act != "deathgasp") + return + + if(usr == src) //client-called emote + if (client && (client.prefs.muted & MUTE_IC)) + to_chat(src, "You cannot send IC messages (muted).") + return + + if(act == "help") + to_chat(src,"Usable emotes: [english_list(usable_emotes)].") + return + + if(!can_emote(m_type)) + to_chat(src, SPAN_WARNING("You cannot currently [m_type == AUDIBLE_MESSAGE ? "audibly" : "visually"] emote!")) + return + + if(act == "me") + return custom_emote(m_type, message) + + if(act == "custom") + if(!message) + message = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason + if(!message) + return + if (!m_type) + if(alert(src, "Is this an audible emote?", "Emote", "Yes", "No") == "No") + m_type = VISIBLE_MESSAGE + else + m_type = AUDIBLE_MESSAGE + return custom_emote(m_type, message) + + var/splitpoint = findtext(act, " ") + if(splitpoint > 0) + var/tempstr = act + act = copytext(tempstr,1,splitpoint) + message = copytext(tempstr,splitpoint+1,0) + + //VOREStation Add - NIF soulcatcher shortcuts + if(act == "nsay") + return nsay(message) + + if(act == "nme") + return nme(message) + //VOREStation Add End + + var/decl/emote/use_emote = usable_emotes[act] + if(!use_emote) + to_chat(src, SPAN_WARNING("Unknown emote '[act]'. Type say *help for a list of usable emotes.")) + return + + if(m_type != use_emote.message_type && use_emote.conscious && stat != CONSCIOUS) + return + + if(use_emote.message_type == AUDIBLE_MESSAGE && is_muzzled()) + audible_message("\The [src] [use_emote.emote_message_muffled || "makes a muffled sound."]") + return + else + use_emote.do_emote(src, message) + + for (var/obj/item/weapon/implant/I in src) + if (I.implanted) + I.trigger(act, src) + +/mob/proc/format_emote(var/emoter = null, var/message = null) + var/pretext + var/subtext + var/nametext + var/end_char + var/start_char + var/name_anchor + + if(!message || !emoter) + return + + message = html_decode(message) + + name_anchor = findtext(message, "*") + if(name_anchor > 0) // User supplied emote with visible_emote token (default ^) + pretext = copytext(message, 1, name_anchor) + subtext = copytext(message, name_anchor + 1, length(message) + 1) + else + // No token. Just the emote as usual. + subtext = message + + // Oh shit, we got this far! Let's see... did the user attempt to use more than one token? + if(findtext(subtext, "*")) + // abort abort! + to_chat(emoter, SPAN_WARNING("You may use only one \"["*"]\" symbol in your emote.")) + return + + if(pretext) + // Add a space at the end if we didn't already supply one. + end_char = copytext(pretext, length(pretext), length(pretext) + 1) + if(end_char != " ") + pretext += " " + + // Grab the last character of the emote message. + end_char = copytext(subtext, length(subtext), length(subtext) + 1) + if(!(end_char in list(".", "?", "!", "\"", "-", "~"))) // gotta include ~ for all you fucking weebs + // No punctuation supplied. Tack a period on the end. + subtext += "." + + // Add a space to the subtext, unless it begins with an apostrophe or comma. + if(subtext != ".") + // First, let's get rid of any existing space, to account for sloppy emoters ("X, ^ , Y") + subtext = trim_left(subtext) + start_char = copytext(subtext, 1, 2) + if(start_char != "," && start_char != "'") + subtext = " " + subtext + + pretext = capitalize(html_encode(pretext)) + nametext = html_encode(nametext) + subtext = html_encode(subtext) + // Store the player's name in a nice bold, naturalement + nametext = "[emoter]" + return pretext + nametext + subtext + +/mob/proc/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message, var/range = world.view) + + if((usr && stat) || (!use_me && usr == src)) + to_chat(src, "You are unable to emote.") + return + + var/input + if(!message) + input = sanitize(input(src,"Choose an emote to display.") as text|null) + else + input = message + + if(input) + message = format_emote(src, message) + else + return + + if(input) + log_emote(message,src) //Log before we add junk + message = "[src] [input]" + else + return + + if(message) + message = encode_html_emphasis(message) + + // Hearing gasp and such every five seconds is not good emotes were not global for a reason. + // Maybe some people are okay with that. + var/turf/T = get_turf(src) + if(!T) return + var/list/in_range = get_mobs_and_objs_in_view_fast(T,range,2,remote_ghosts = client ? TRUE : FALSE) + var/list/m_viewers = in_range["mobs"] + var/list/o_viewers = in_range["objs"] + + for(var/mob in m_viewers) + var/mob/M = mob + spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes. + if(M) + if(isobserver(M)) + message = "[src] ([ghost_follow_link(src, M)]) [input]" + M.show_message(message, m_type) + + for(var/obj in o_viewers) + var/obj/O = obj + spawn(0) + if(O) + O.see_emote(src, message, m_type) + + + +// Specific mob type exceptions below. +/mob/living/silicon/ai/emote(var/act, var/type, var/message) + var/obj/machinery/hologram/holopad/T = src.holo + if(T && T.masters[src]) //Is the AI using a holopad? + src.holopad_emote(message) + else //Emote normally, then. + ..() diff --git a/code/modules/food/food/cans_vr.dm b/code/modules/food/food/cans_vr.dm new file mode 100644 index 00000000000..4807d021ef5 --- /dev/null +++ b/code/modules/food/food/cans_vr.dm @@ -0,0 +1,75 @@ +//////////////////////Bepis Drinks (04/29/2021)////////////////////// + +/obj/item/weapon/reagent_containers/food/drinks/cans/bepis + name = "\improper Bepis" + desc = "It has a smell of 'off-brand' whenever you open it..." + description_fluff = "Puts the 'B' in Best Soda! Bepis is the number one competitor to \ + Space Cola and has vendors scattered across the frontier. While the drink is not as \ + popular as Space Cola, many people across known space enjoy the sweet beverage." + icon = 'icons/obj/drinks_vr.dmi' + icon_state = "bepis" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/drinks/cans/bepis/Initialize() + . = ..() + reagents.add_reagent("bepis", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/astrodew + name = "\improper Astro Dew Spring Water" + desc = "A can of refreshing 'spring' water! Or so the can claims." + icon = 'icons/obj/drinks_vr.dmi' + icon_state = "watercan" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/drinks/cans/astrodew/Initialize() + . = ..() + reagents.add_reagent("water", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/icecoffee + name = "\improper Café Del Consumir" + desc = "A can of deliciously sweet iced coffee that originates from Earth." + description_fluff = "Café Del Consumir originates from a small coffee brewery in México \ + that still opperates to this day. Café Del Consumir prides itself on being true to form \ + and retaining its original recipe. They've been producing and selling thier product across \ + the galaxy for decades without fail. NanoTrasen has attempted to by out the small company for \ + years now, howerver all attempts they've made have failed." + icon = 'icons/obj/drinks_vr.dmi' + icon_state = "coffeecan" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/drinks/cans/icecoffee/Initialize() + . = ..() + reagents.add_reagent("icecoffee", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/buzz + name = "\improper Buzz Fuzz" + desc = "Uses real honey, making it a sweet tooth's dream drink." + icon = 'icons/obj/drinks_vr.dmi' + icon_state = "buzzfuzz" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/drinks/cans/buzz/Initialize() + . = ..() + reagents.add_reagent("buzz_fuzz", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/shambler + name = "\improper Shambler's Juice" + desc = "~Shake me up some of that Shambler's Juice!~" + icon = 'icons/obj/drinks_vr.dmi' + icon_state = "shambler" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/drinks/cans/shambler/Initialize() + . = ..() + reagents.add_reagent("shamblers", 30) + +/obj/item/weapon/reagent_containers/food/drinks/cans/cranberry + name = "\improper Sprited Cranberry" + desc = "A delicious blend of fresh cranberry juice and various spices, the perfect drink." + icon = 'icons/obj/drinks_vr.dmi' + icon_state = "cranberry" + center_of_mass = list("x"=16, "y"=10) + +/obj/item/weapon/reagent_containers/food/drinks/cans/cranberry/Initialize() + . = ..() + reagents.add_reagent("sprited_cranberry", 30) \ No newline at end of file diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 9d6735ee8b6..1badc92926a 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -73,7 +73,7 @@ if(src.loc && istype(loc,/obj/belly) || istype(loc,/obj/item/device/dogborg/sleeper)) deathmessage = "no message" //VOREStation Add - Prevents death messages from inside mobs facing_dir = null - if(!gibbed && deathmessage != "no message") // This is gross, but reliable. Only brains use it. + if(!gibbed && deathmessage != DEATHGASP_NO_MESSAGE) src.visible_message("\The [src.name] [deathmessage]") set_stat(DEAD) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 2a8af560804..f59ebf612cd 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -1,64 +1,9 @@ -// All mobs should have custom emote, really.. -//m_type == 1 --> visual. -//m_type == 2 --> audible -/mob/proc/custom_emote(var/m_type=1,var/message = null,var/range=world.view) - if(stat || !use_me && usr == src) - to_chat(src, "You are unable to emote.") - return - - var/muzzled = is_muzzled() - if(m_type == 2 && muzzled) return - - var/input - if(!message) - input = sanitize_or_reflect(input(src,"Choose an emote to display.") as text|null, src) //VOREStation Edit - Reflect too long messages, within reason - else - input = message - if(input) - log_emote(message,src) //Log before we add junk - message = "[src] [input]" - else - return - - - if (message) - message = encode_html_emphasis(message) - - // Hearing gasp and such every five seconds is not good emotes were not global for a reason. - // Maybe some people are okay with that. - - var/turf/T = get_turf(src) - if(!T) return - var/list/in_range = get_mobs_and_objs_in_view_fast(T,range,2,remote_ghosts = client ? TRUE : FALSE) - var/list/m_viewers = in_range["mobs"] - var/list/o_viewers = in_range["objs"] - - for(var/mob in m_viewers) - var/mob/M = mob - spawn(0) // It's possible that it could be deleted in the meantime, or that it runtimes. - if(M) - if(isobserver(M)) - //VOREStation Edit Start - var/mob/observer/dead/D = M - if(ckey || (src in view(D))) - M.show_message(message, m_type) - message = "[src] ([ghost_follow_link(src, M)]) [input]" - else - M.show_message(message, m_type) - //VOREStation Edit End - - for(var/obj in o_viewers) - var/obj/O = obj - spawn(0) - if(O) - O.see_emote(src, message, m_type) - // Shortcuts for above proc /mob/proc/visible_emote(var/act_desc) - custom_emote(1, act_desc) + custom_emote(VISIBLE_MESSAGE, act_desc) /mob/proc/audible_emote(var/act_desc) - custom_emote(2, act_desc) + custom_emote(AUDIBLE_MESSAGE, act_desc) /mob/proc/emote_dead(var/message) diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm index 01f1d2f57d2..739c3b09c6b 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -1,3 +1,29 @@ +var/list/_nymph_default_emotes = list( + /decl/emote/visible, + /decl/emote/visible/scratch, + /decl/emote/visible/drool, + /decl/emote/visible/nod, + /decl/emote/visible/sway, + /decl/emote/visible/sulk, + /decl/emote/visible/twitch, + /decl/emote/visible/dance, + /decl/emote/visible/roll, + /decl/emote/visible/shake, + /decl/emote/visible/jump, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/visible/spin, + /decl/emote/visible/sidestep, + /decl/emote/audible/hiss, + /decl/emote/audible, + /decl/emote/audible/scretch, + /decl/emote/audible/choke, + /decl/emote/audible/gnarl, + /decl/emote/audible/bug_hiss, + /decl/emote/audible/bug_chitter, + /decl/emote/audible/chirp +) + /mob/living/carbon/alien/diona name = "diona nymph" voice_name = "diona nymph" @@ -20,6 +46,9 @@ holder_type = /obj/item/weapon/holder/diona var/obj/item/hat +/mob/living/carbon/alien/diona/get_default_emotes() + return global._nymph_default_emotes + /mob/living/carbon/alien/diona/Initialize() . = ..() species = GLOB.all_species[SPECIES_DIONA] diff --git a/code/modules/mob/living/carbon/alien/emote.dm b/code/modules/mob/living/carbon/alien/emote.dm index 5cff048e10b..b0517e7a952 100644 --- a/code/modules/mob/living/carbon/alien/emote.dm +++ b/code/modules/mob/living/carbon/alien/emote.dm @@ -1,108 +1,31 @@ -/mob/living/carbon/alien/emote(var/act, var/m_type=1, var/message = null) - var/param = null - if(findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) +var/list/_alien_default_emotes = list( + /decl/emote/visible, + /decl/emote/visible/scratch, + /decl/emote/visible/drool, + /decl/emote/visible/nod, + /decl/emote/visible/sway, + /decl/emote/visible/sulk, + /decl/emote/visible/twitch, + /decl/emote/visible/twitch_v, + /decl/emote/visible/dance, + /decl/emote/visible/roll, + /decl/emote/visible/shake, + /decl/emote/visible/jump, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/visible/spin, + /decl/emote/visible/sidestep, + /decl/emote/audible/hiss, + /decl/emote/audible, + /decl/emote/audible/deathgasp_alien, + /decl/emote/audible/whimper, + /decl/emote/audible/gasp, + /decl/emote/audible/scretch, + /decl/emote/audible/choke, + /decl/emote/audible/moan, + /decl/emote/audible/gnarl, + /decl/emote/audible/chirp +) - var/muzzled = is_muzzled() - act = lowertext(act) - - switch(act) - if("sign") - if(!restrained()) - var/num = null - if(text2num(param)) - num = "the number [text2num(param)]" - if(num) - message = "[src] signs [num]." - m_type = 1 - if("burp") - if(!muzzled) - message = "[src] burps." - m_type = 2 - if("deathgasp") - message = "[src] lets out a waning guttural screech, green blood bubbling from its maw." - m_type = 2 - if("scratch") - if(!restrained()) - message = "[src] scratches." - m_type = 1 - if("whimper") - if(!muzzled) - message = "[src] whimpers." - m_type = 2 - if("tail") - message = "[src] waves its tail." - m_type = 1 - if("gasp") - message = "[src] gasps." - m_type = 2 - if("shiver") - message = "[src] shivers." - m_type = 2 - if("drool") - message = "[src] drools." - m_type = 1 - if("scretch") - if(!muzzled) - message = "[src] scretches." - m_type = 2 - if("choke") - message = "[src] chokes." - m_type = 2 - if("moan") - message = "[src] moans!" - m_type = 2 - if("nod") - message = "[src] nods its head." - m_type = 1 -// if("sit") -// message = "[src] sits down." //Larvan can't sit down, /N -// m_type = 1 - if("sway") - message = "[src] sways around dizzily." - m_type = 1 - if("sulk") - message = "[src] sulks down sadly." - m_type = 1 - if("twitch") - message = "[src] twitches." - m_type = 1 - if("twitch_v") - message = "[src] twitches violently." - m_type = 1 - if("dance") - if(!restrained()) - message = "[src] dances around happily." - m_type = 1 - if("roll") - if(!restrained()) - message = "[src] rolls." - m_type = 1 - if("shake") - message = "[src] shakes its head." - m_type = 1 - if("gnarl") - if(!muzzled) - message = "[src] gnarls and shows its teeth.." - m_type = 2 - if("jump") - message = "[src] jumps!" - m_type = 1 - if("hiss_") - message = "[src] hisses softly." - m_type = 1 - if("collapse") - Paralyse(2) - message = "[src] collapses!" - m_type = 2 - if("chirp") - message = "[src] chirps!" - playsound(src, 'sound/misc/nymphchirp.ogg', 50, 0) - m_type = 2 - if("help") - to_chat(src, "burp, chirp, choke, collapse, dance, drool, gasp, shiver, gnarl, jump, moan, nod, roll, scratch,\nscretch, shake, sign-#, sulk, sway, tail, twitch, whimper") - - if(!stat) - ..(act, m_type, message) +/mob/living/carbon/alien/get_default_emotes() + . = global._alien_default_emotes diff --git a/code/modules/mob/living/carbon/brain/death.dm b/code/modules/mob/living/carbon/brain/death.dm index 8b6e7f71756..687372c6ee1 100644 --- a/code/modules/mob/living/carbon/brain/death.dm +++ b/code/modules/mob/living/carbon/brain/death.dm @@ -3,7 +3,7 @@ container.icon_state = "mmi_dead" return ..(gibbed,"beeps shrilly as the MMI flatlines!") else - return ..(gibbed,"no message") + return ..(gibbed, DEATHGASP_NO_MESSAGE) /mob/living/carbon/brain/gib() if(istype(container, /obj/item/device/mmi)) diff --git a/code/modules/mob/living/carbon/brain/emote.dm b/code/modules/mob/living/carbon/brain/emote.dm index 05706fe299e..cb6ed6a1b7b 100644 --- a/code/modules/mob/living/carbon/brain/emote.dm +++ b/code/modules/mob/living/carbon/brain/emote.dm @@ -1,47 +1,17 @@ -/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null) - if(!(container && istype(container, /obj/item/device/mmi)))//No MMI, no emotes - return +var/list/_brain_default_emotes = list( + /decl/emote/audible/alarm, + /decl/emote/audible/alert, + /decl/emote/audible/notice, + /decl/emote/audible/whistle, + /decl/emote/audible/synth, + /decl/emote/audible/beep, + /decl/emote/audible/boop, + /decl/emote/visible/blink, + /decl/emote/visible/flash +) - if(findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - act = copytext(act, 1, t1) +/mob/living/carbon/brain/can_emote() + return (istype(container, /obj/item/device/mmi) && ..()) - if(stat == DEAD) - return - switch(act) - if("alarm") - to_chat(src, "You sound an alarm.") - message = "[src] sounds an alarm." - m_type = 2 - if("alert") - to_chat(src, "You let out a distressed noise.") - message = "[src] lets out a distressed noise." - m_type = 2 - if("notice") - to_chat(src, "You play a loud tone.") - message = "[src] plays a loud tone." - m_type = 2 - if("flash") - message = "The lights on [src] flash quickly." - m_type = 1 - if("blink") - message = "[src] blinks." - m_type = 1 - if("whistle") - to_chat(src, "You whistle.") - message = "[src] whistles." - m_type = 2 - if("beep") - to_chat(src, "You beep.") - message = "[src] beeps." - m_type = 2 - if("boop") - to_chat(src, "You boop.") - message = "[src] boops." - m_type = 2 - if("help") - to_chat(src, "alarm, alert, notice, flash, blink, whistle, beep, boop") - - if(!stat) - ..(act, m_type, message) - \ No newline at end of file +/mob/living/carbon/brain/get_default_emotes() + return global._brain_default_emotes diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 6afe10cdec7..a705f034506 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -1,843 +1,140 @@ -/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null) - var/param = null - - var/datum/gender/T = gender_datums[get_visible_gender()] - - if(findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) - - var/muzzled = is_muzzled() - //var/m_type = 1 - - for(var/obj/item/organ/O in organs) - for(var/obj/item/weapon/implant/I in O) - if(I.implanted) - I.trigger(act, src) - - if(stat == DEAD && (act != "deathgasp")) - return - - if(attempt_vr(src, "handle_emote_vr", list(act, m_type, message))) return //VOREStation Add - Custom Emote Handler - - switch(act) - if("airguitar") - if(!restrained()) - message = "is strumming the air and headbanging like a safari chimp." - m_type = 1 - - //Machine-only emotes - if("ping", "beep", "buzz", "yes", "ye", "dwoop", "no", "rcough", "rsneeze") - - if(!isSynthetic()) - to_chat(src, "You are not a synthetic.") - return - - var/M = null - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - var/display_msg = "beeps" - var/use_sound = 'sound/machines/twobeep.ogg' - if(act == "buzz") - display_msg = "buzzes" - use_sound = 'sound/machines/buzz-sigh.ogg' - else if(act == "ping") - display_msg = "pings" - use_sound = 'sound/machines/ping.ogg' - else if(act == "yes" || act == "ye") - display_msg = "emits an affirmative blip" - use_sound = 'sound/machines/synth_yes.ogg' - else if(act == "dwoop") - display_msg = "chirps happily" - use_sound = 'sound/machines/dwoop.ogg' - else if(act == "no") - display_msg = "emits a negative blip" - use_sound = 'sound/machines/synth_no.ogg' - else if(act == "rcough") - display_msg = "emits a robotic cough" - if(get_gender() == FEMALE) - use_sound = pick('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg') - else - use_sound = pick('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg') - else if(act == "rsneeze") - display_msg = "emits a robotic sneeze" - if(get_gender() == FEMALE) - use_sound = 'sound/effects/mob_effects/machine_sneeze.ogg' - else - use_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg' - - if(param) - message = "[display_msg] at [param]." - else - message = "[display_msg]." - playsound(src, use_sound, 50, 0, preference = /datum/client_preference/emote_noises) //VOREStation Add - m_type = 1 - - //Promethean-only emotes - if("squish") - /* VOREStation Removal Start - Eh. People can squish maybe. - if(species.bump_flag != SLIME) //This should definitely do it. - to_chat(src, "You are not a slime thing!") - return - */ //VOREStation Removal End - playsound(src, 'sound/effects/slime_squish.ogg', 50, 0, preference = /datum/client_preference/emote_noises) //VOREStation Add //Credit to DrMinky (freesound.org) for the sound. - message = "squishes." - m_type = 1 - - if("chirp") - /* VOREStation Removal Start - Eh. People can chirp maybe. - if ((species.bump_flag != SLIME) && (species.name != SPECIES_DIONA)) - to_chat(src, "You are not a diona or slime!") - return - */ //VOREStation Removal End - playsound(src, 'sound/misc/nymphchirp.ogg', 50, 0) - message = "chirps." - m_type = 2 - - //Skrell-only emotes - if("warble") - if(species.name != SPECIES_SKRELL) - to_chat(src, "You are not a Skrell!") - return - - playsound(src, 'sound/effects/warble.ogg', 50, 0, preference = /datum/client_preference/emote_noises) //VOREStation Add // Copyright CC BY 3.0 alienistcog (freesound.org) for the sound. - message = "warbles." - m_type = 2 - - if("blink") - message = "blinks." - m_type = 1 - - if("blink_r") - message = "blinks rapidly." - m_type = 1 - - if("bow") - if(!buckled) - var/M = null - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "bows to [param]." - else - message = "bows." - m_type = 1 - - if("custom") - var/input = sanitize(input("Choose an emote to display.") as text|null) - if(!input) - return - var/input2 = input("Is this a visible or hearable emote?") in list("Visible","Hearable") - if(input2 == "Visible") - m_type = 1 - else if(input2 == "Hearable") - if(miming) - return - m_type = 2 - else - alert("Unable to use this emote, must be either hearable or visible.") - return - return custom_emote(m_type, input) - - if("me") - - //if(silent && silent > 0 && findtext(message,"\"",1, null) > 0) - // return //This check does not work and I have no idea why, I'm leaving it in for reference. - - if(client) - if(client.prefs.muted & MUTE_IC) - to_chat(src, "You cannot send IC messages (muted).") - return - if(stat) - return - if(!(message)) - return - return custom_emote(m_type, message) - - if("salute") - if(!buckled) - var/M = null - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "salutes to [param]." - else - message = "salutes." - m_type = 1 - - if("choke") - if(miming) - message = "clutches [T.his] throat desperately!" - m_type = 1 - else - if(!muzzled) - message = "chokes!" - m_type = 2 - else - message = "makes a strong noise." - m_type = 2 - - if("clap") - if(!restrained()) - message = "claps." - playsound(src, 'sound/misc/clapping.ogg') - m_type = 2 - if(miming) - m_type = 1 - - if("flap") - if(!restrained()) - message = "flaps [T.his] wings." - m_type = 2 - if(miming) - m_type = 1 - - if("aflap") - if(!restrained()) - message = "flaps [T.his] wings ANGRILY!" - m_type = 2 - if(miming) - m_type = 1 - - if("drool") - message = "drools." - m_type = 1 - - if("eyebrow") - message = "raises an eyebrow." - m_type = 1 - - if("chuckle") - if(miming) - message = "appears to chuckle." - m_type = 1 - else - if(!muzzled) - message = "chuckles." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if("twitch") - message = "twitches." - m_type = 1 - - if("twitch_v") - message = "twitches violently." - m_type = 1 - - if("faint") - message = "faints." - if(sleeping) - return //Can't faint while asleep - Sleeping(10) - m_type = 1 - - if("cough", "coughs") - if(miming) - message = "appears to cough!" - m_type = 1 - else - if(!muzzled) - var/robotic = 0 - m_type = 2 - if(should_have_organ(O_LUNGS)) - var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] - if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs - robotic = 1 - if(!robotic && !isSynthetic()) - message = "coughs!" - if(get_gender() == FEMALE) - if(species.female_cough_sounds) - playsound(src, pick(species.female_cough_sounds), 120, preference = /datum/client_preference/emote_noises) //VOREStation Add - else - if(species.male_cough_sounds) - playsound(src, pick(species.male_cough_sounds), 120, preference = /datum/client_preference/emote_noises) //VOREStation Add - else - message = "emits a robotic cough" - var/use_sound - if(get_gender() == FEMALE) - use_sound = pick('sound/effects/mob_effects/f_machine_cougha.ogg','sound/effects/mob_effects/f_machine_coughb.ogg') - else - use_sound = pick('sound/effects/mob_effects/m_machine_cougha.ogg','sound/effects/mob_effects/m_machine_coughb.ogg', 'sound/effects/mob_effects/m_machine_coughc.ogg') - playsound(src, use_sound, 50, 0, preference = /datum/client_preference/emote_noises) //VOREStation Add - else - message = "makes a strong noise." - m_type = 2 - - if("frown") - message = "frowns." - m_type = 1 - - if("nod") - message = "nods." - m_type = 1 - - if("blush") - message = "blushes." - m_type = 1 - - if("wave") - message = "waves." - m_type = 1 - - if("gasp") - if(miming) - message = "appears to be gasping!" - m_type = 1 - else - if(!muzzled) - message = "gasps!" - m_type = 2 - else - message = "makes a weak noise." - m_type = 2 - - if("deathgasp") - message = "[species.get_death_message()]" - m_type = 1 - - if("giggle") - if(miming) - message = "giggles silently!" - m_type = 1 - else - if(!muzzled) - message = "giggles." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if("glare") - var/M = null - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "glares at [param]." - else - message = "glares." - - if("stare") - var/M = null - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "stares at [param]." - else - message = "stares." - - if("look") - var/M = null - if(param) - for(var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - - if(!M) - param = null - - if(param) - message = "looks at [param]." - else - message = "looks." - m_type = 1 - - if("grin") - message = "grins." - m_type = 1 - - if("cry") - if(miming) - message = "cries." - m_type = 1 - else - if(!muzzled) - message = "cries." - m_type = 2 - else - message = "makes a weak noise. [T.he] [get_visible_gender() == NEUTER ? "frown" : "frowns"]." // no good, non-unwieldy alternative to this ternary at the moment - m_type = 2 - - if("sigh") - if(miming) - message = "sighs." - m_type = 1 - else - if(!muzzled) - message = "sighs." - m_type = 2 - else - message = "makes a weak noise." - m_type = 2 - - if("laugh") - if(miming) - message = "acts out a laugh." - m_type = 1 - else - if(!muzzled) - message = "laughs." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if("mumble") - message = "mumbles!" - m_type = 2 - if(miming) - m_type = 1 - - if("grumble") - if(miming) - message = "grumbles!" - m_type = 1 - if(!muzzled) - message = "grumbles!" - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if("groan") - if(miming) - message = "appears to groan!" - m_type = 1 - else - if(!muzzled) - message = "groans!" - m_type = 2 - else - message = "makes a loud noise." - m_type = 2 - - if("moan") - if(miming) - message = "appears to moan!" - m_type = 1 - else - message = "moans!" - m_type = 2 - - if("johnny") - var/M - if(param) - M = param - if(!M) - param = null - else - if(miming) - message = "takes a drag from a cigarette and blows \"[M]\" out in smoke." - m_type = 1 - else - message = "says, \"[M], please. He had a family.\" [name] takes a drag from a cigarette and blows his name out in smoke." - m_type = 2 - - if("point") - if(!restrained()) - var/mob/M = null - if(param) - for(var/atom/A as mob|obj|turf|area in view(null, null)) - if(param == A.name) - M = A - break - - if(!M) - message = "points." - else - pointed(M) - - if(M) - message = "points to [M]." - else - m_type = 1 - - if("crack") - if(!restrained()) - message = "cracks [T.his] knuckles." - playsound(src, 'sound/voice/knuckles.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - m_type = 1 - - if("raise") - if(!restrained()) - message = "raises a hand." - m_type = 1 - - if("shake") - message = "shakes [T.his] head." - m_type = 1 - - if("shrug") - message = "shrugs." - m_type = 1 - - if("signal") - if(!restrained()) - var/t1 = round(text2num(param)) - if(isnum(t1)) - if(t1 <= 5 && (!r_hand || !l_hand)) - message = "raises [t1] finger\s." - else if(t1 <= 10 && (!r_hand && !l_hand)) - message = "raises [t1] finger\s." - m_type = 1 - - if("smile") - message = "smiles." - m_type = 1 - - if("shiver") - message = "shivers." - m_type = 2 - if(miming) - m_type = 1 - - if("pale") - message = "goes pale for a second." - m_type = 1 - - if("tremble") - message = "trembles in fear!" - m_type = 1 - - if("sneeze", "sneezes") - if(miming) - message = "sneezes." - m_type = 1 - else - if(!muzzled) - var/robotic = 0 - m_type = 2 - if(should_have_organ(O_LUNGS)) - var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] - if(L && L.robotic == 2) //Hard-coded to 2, incase we add lifelike robotic lungs - robotic = 1 - if(!robotic && !isSynthetic()) - message = "sneezes." - if(get_gender() == FEMALE) - playsound(src, species.female_sneeze_sound, 70, preference = /datum/client_preference/emote_noises) //VOREStation Add - else - playsound(src, species.male_sneeze_sound, 70, preference = /datum/client_preference/emote_noises) //VOREStation Add - m_type = 2 - else - message = "emits a robotic sneeze" - var/use_sound - if(get_gender() == FEMALE) - use_sound = 'sound/effects/mob_effects/machine_sneeze.ogg' - else - use_sound = 'sound/effects/mob_effects/f_machine_sneeze.ogg' - playsound(src, use_sound, 50, 0, preference = /datum/client_preference/emote_noises) //VOREStation Add - else - message = "makes a strange noise." - m_type = 2 - - if("sniff") - message = "sniffs." - m_type = 2 - if(miming) - m_type = 1 - - if("snore") - if(miming) - message = "sleeps soundly." - m_type = 1 - else - if(!muzzled) - message = "snores." - m_type = 2 - else - message = "makes a noise." - m_type = 2 - - if("whimper") - if(miming) - message = "appears hurt." - m_type = 1 - else - if(!muzzled) - message = "whimpers." - m_type = 2 - else - message = "makes a weak noise." - m_type = 2 - - if("wink") - message = "winks." - m_type = 1 - - if("yawn") - if(!muzzled) - message = "yawns." - m_type = 2 - if(miming) - m_type = 1 - - if("collapse") - Paralyse(2) - message = "collapses!" - m_type = 2 - if(miming) - m_type = 1 - - if("hug") - m_type = 1 - if(!restrained()) - var/M = null - if(param) - for(var/mob/A in view(1, null)) - if(param == A.name) - M = A - break - if(M == src) - M = null - - if(M) - message = "hugs [M]." - else - message = "hugs [T.himself]." - - if("handshake") - m_type = 1 - if(!restrained() && !r_hand) - var/mob/living/M = null - if(param) - for(var/mob/living/A in view(1, null)) - if(param == A.name) - M = A - break - if(M == src) - M = null - - if(M) - if(M.canmove && !M.r_hand && !M.restrained()) - message = "shakes hands with [M]." - else - message = "holds out [T.his] hand to [M]." - - if("dap") - m_type = 1 - if(!restrained()) - var/M = null - if(param) - for(var/mob/A in view(1, null)) - if(param == A.name) - M = A - break - if(M) - message = "gives daps to [M]." - else - message = "sadly can't find anybody to give daps to, and daps [T.himself]. Shameful." - - if("slap", "slaps") - m_type = 1 - if(!restrained()) - var/M = null - if(param) - for(var/mob/A in view(1, null)) - if(param == A.name) - M = A - break - if(M) - message = "slaps [M] across the face. Ouch!" - playsound(src, 'sound/effects/snap.ogg', 50, 1, preference = /datum/client_preference/emote_noises) //VOREStation Add - if(ishuman(M)) //Snowflakey! - var/mob/living/carbon/human/H = M - if(istype(H.wear_mask,/obj/item/clothing/mask/smokable)) - H.drop_from_inventory(H.wear_mask) - else - message = "slaps [T.himself]!" - playsound(src, 'sound/effects/snap.ogg', 50, 1, preference = /datum/client_preference/emote_noises) //VOREStation Add - - if("scream", "screams") - if(miming) - message = "acts out a scream!" - m_type = 1 - else - if(!muzzled) - message = "[species.scream_verb]!" - m_type = 2 - /* Removed, pending the location of some actually good, properly licensed sounds. - if(get_gender() == FEMALE) - playsound(src, "[species.female_scream_sound]", 80, 1) - else - playsound(src, "[species.male_scream_sound]", 80, 1) //default to male screams if no gender is present. - */ - else - message = "makes a very loud noise." - m_type = 2 - - if("snap", "snaps") - m_type = 2 - var/mob/living/carbon/human/H = src - var/obj/item/organ/external/L = H.get_organ("l_hand") - var/obj/item/organ/external/R = H.get_organ("r_hand") - var/left_hand_good = 0 - var/right_hand_good = 0 - if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.splinted)) && (!(L.status & ORGAN_BROKEN))) - left_hand_good = 1 - if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.splinted)) && (!(R.status & ORGAN_BROKEN))) - right_hand_good = 1 - - if(!left_hand_good && !right_hand_good) - to_chat(usr, "You need at least one hand in good working order to snap your fingers.") - return - - message = "snaps [T.his] fingers." - playsound(src, 'sound/effects/fingersnap.ogg', 50, 1, -3, preference = /datum/client_preference/emote_noises) //VOREStation Add - - if("swish") - animate_tail_once() - - if("wag", "sway") - animate_tail_start() - - if("qwag", "fastsway") - animate_tail_fast() - - if("swag", "stopsway") - animate_tail_stop() - - if("vomit") - if(isSynthetic()) - to_chat(src, "You are unable to vomit.") - return - vomit() - return - - if("whistle" || "whistles") - if(!muzzled) - if(!isSynthetic()) - message = "whistles a tune." - playsound(src, 'sound/voice/longwhistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) //praying this doesn't get abused - else - message = "whistles a robotic tune." - playsound(src, 'sound/voice/longwhistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - else - message = "makes a light spitting noise, a poor attempt at a whistle." - - if("qwhistle") - if(!muzzled) - if(!isSynthetic()) - message = "whistles quietly." - playsound(src, 'sound/voice/shortwhistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - else - message = "whistles robotically." - playsound(src, 'sound/voice/shortwhistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - else - message = "makes a light spitting noise, a poor attempt at a whistle." - - if("wwhistle") - if(!muzzled) - if(!isSynthetic()) - message = "whistles inappropriately." - playsound(src, 'sound/voice/wolfwhistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - else - message = "beeps inappropriately." - playsound(src, 'sound/voice/wolfwhistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - else - message = "makes a light spitting noise, a poor attempt at a whistle." - - if("swhistle") - if(!muzzled) - if(!isSynthetic()) - message = "summon whistles." - playsound(src, 'sound/voice/summon_whistle.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - else - message = "summon whistles robotically." - playsound(src, 'sound/voice/summon_whistle_robot.ogg', 50, 1, preference = /datum/client_preference/emote_noises) - else - message = "makes a light spitting noise, a poor attempt at a whistle." - - if("flip") - m_type = 1 - if (!src.restrained()) - //message = "performs an amazing, gravity-defying backflip before landing skillfully back to the ground." - playsound(src.loc, 'sound/effects/bodyfall4.ogg', 50, 1) - src.SpinAnimation(7,1) - else - to_chat(usr, "You can't quite do something as difficult as a backflip while so... restricted.") - - if("spin") - m_type = 1 - if (!src.restrained()) - //message = "spins in a dance smoothly on their feet. Wow!" - src.spin(20, 1) - else - to_chat(usr, "You can't quite do something as difficult as a spin while so... restricted.") - - if("floorspin") - m_type = 1 - if (!src.restrained()) - //message = "gets down on the floor and spins their entire body around!" - spawn(0) - for(var/i in list(1,2,4,8,4,2,1,2,4,8,4,2,1,2,4,8,4,2)) - set_dir(i) - sleep(1) - src.SpinAnimation(20,1) - else - to_chat(usr, "You can't quite do something as difficult as a spin while so... restricted.") - - if("sidestep") - m_type = 1 - if (!src.restrained()) - //message = "steps rhymatically and conservatively as they move side to side." - playsound(src.loc, 'sound/effects/bodyfall4.ogg', 50, 1) - var/default_pixel_x = initial(pixel_x) - var/default_pixel_y = initial(pixel_y) - default_pixel_x = src.default_pixel_x - default_pixel_y = src.default_pixel_y - - animate(src, pixel_x = 5, time = 20) - sleep(3) - animate(src, pixel_x = -5, time = 20) - animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, time = 2) - else - to_chat(usr, "Sidestepping sure seems unachieveable when you're this restricted.") - - if("help") - to_chat(src, "blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, \ - frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, \ - qwhistle, raise, salute, scream, sneeze, shake, shiver, shrug, sigh, signal-#1-10, slap-(none)/mob, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, swhistle, \ - tremble, twitch, twitch_v, vomit, whimper, wink, whistle, wwhistle, yawn. Prometheans: squish Synthetics: beep, buzz, dwoop, yes, no, rcough, rsneeze, ping. Skrell: warble") - - else - to_chat(src, "Unusable emote '[act]'. Say *help or *vhelp for a list.") //VOREStation Edit, mention *vhelp for Virgo-specific emotes located in emote_vr.dm. - - if(message) - custom_emote(m_type,message) +var/list/_human_default_emotes = list( + /decl/emote/visible/blink, + /decl/emote/audible/synth, + /decl/emote/audible/synth/ping, + /decl/emote/audible/synth/buzz, + /decl/emote/audible/synth/confirm, + /decl/emote/audible/synth/deny, + /decl/emote/visible/nod, + /decl/emote/visible/shake, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/audible/gasp, + /decl/emote/audible/choke, + /decl/emote/audible/sneeze, + /decl/emote/audible/sniff, + /decl/emote/audible/snore, + /decl/emote/audible/whimper, + /decl/emote/audible/whistle, + /decl/emote/audible/whistle/quiet, + /decl/emote/audible/whistle/wolf, + /decl/emote/audible/whistle/summon, + /decl/emote/audible/yawn, + /decl/emote/audible/clap, + /decl/emote/audible/chuckle, + /decl/emote/audible/cough, + /decl/emote/audible/cry, + /decl/emote/audible/sigh, + /decl/emote/audible/laugh, + /decl/emote/audible/mumble, + /decl/emote/audible/grumble, + /decl/emote/audible/groan, + /decl/emote/audible/moan, + /decl/emote/audible/grunt, + /decl/emote/audible/slap, + /decl/emote/audible/crack, + /decl/emote/human, + /decl/emote/human/deathgasp, + /decl/emote/audible/giggle, + /decl/emote/audible/scream, + /decl/emote/visible/airguitar, + /decl/emote/visible/blink_r, + /decl/emote/visible/bow, + /decl/emote/visible/salute, + /decl/emote/visible/flap, + /decl/emote/visible/aflap, + /decl/emote/visible/drool, + /decl/emote/visible/eyebrow, + /decl/emote/visible/twitch, + /decl/emote/visible/dance, + /decl/emote/visible/twitch_v, + /decl/emote/visible/faint, + /decl/emote/visible/frown, + /decl/emote/visible/blush, + /decl/emote/visible/wave, + /decl/emote/visible/glare, + /decl/emote/visible/stare, + /decl/emote/visible/look, + /decl/emote/visible/point, + /decl/emote/visible/raise, + /decl/emote/visible/grin, + /decl/emote/visible/shrug, + /decl/emote/visible/smile, + /decl/emote/visible/pale, + /decl/emote/visible/tremble, + /decl/emote/visible/wink, + /decl/emote/visible/hug, + /decl/emote/visible/dap, + /decl/emote/visible/signal, + /decl/emote/visible/handshake, + /decl/emote/visible/afold, + /decl/emote/visible/alook, + /decl/emote/visible/eroll, + /decl/emote/visible/hbow, + /decl/emote/visible/hip, + /decl/emote/visible/holdup, + /decl/emote/visible/hshrug, + /decl/emote/visible/crub, + /decl/emote/visible/erub, + /decl/emote/visible/fslap, + /decl/emote/visible/ftap, + /decl/emote/visible/hrub, + /decl/emote/visible/hspread, + /decl/emote/visible/pocket, + /decl/emote/visible/rsalute, + /decl/emote/visible/rshoulder, + /decl/emote/visible/squint, + /decl/emote/visible/tfist, + /decl/emote/visible/tilt, + /decl/emote/visible/spin, + /decl/emote/visible/sidestep, + /decl/emote/audible/snap, + /decl/emote/visible/vomit, + /decl/emote/visible/floorspin, + /decl/emote/visible/flip, + //VOREStation Add + /decl/emote/audible/awoo, + /decl/emote/audible/awoo2, + /decl/emote/audible/growl, + /decl/emote/audible/woof, + /decl/emote/audible/woof2, + /decl/emote/audible/nya, + /decl/emote/audible/mrowl, + /decl/emote/audible/peep, + /decl/emote/audible/chirp, + /decl/emote/audible/hoot, + /decl/emote/audible/weh, + /decl/emote/audible/merp, + /decl/emote/audible/myarp, + /decl/emote/audible/bark, + /decl/emote/audible/bork, + /decl/emote/audible/mrow, + /decl/emote/audible/hypno, + /decl/emote/audible/hiss, + /decl/emote/audible/rattle, + /decl/emote/audible/squeak, + /decl/emote/audible/geck, + /decl/emote/audible/baa, + /decl/emote/audible/baa2, + /decl/emote/audible/mar, + /decl/emote/audible/wurble, + /decl/emote/audible/snort, + /decl/emote/audible/meow, + /decl/emote/audible/moo, + /decl/emote/audible/croak, + /decl/emote/audible/gao, + /decl/emote/audible/cackle, + + /decl/emote/visible/mlem, + /decl/emote/visible/blep, + + /decl/emote/helper/vwag, + /decl/emote/helper/vflap + //VOREStation Add End +) + +/mob/living/carbon/human/get_default_emotes() + return global._human_default_emotes /mob/living/carbon/human/verb/pose() set name = "Set Pose" diff --git a/code/modules/mob/living/carbon/human/emote_vr.dm b/code/modules/mob/living/carbon/human/emote_vr.dm index d8deee8e7bf..f4bc98bcbe6 100644 --- a/code/modules/mob/living/carbon/human/emote_vr.dm +++ b/code/modules/mob/living/carbon/human/emote_vr.dm @@ -1,185 +1,11 @@ -/mob - var/nextemote = 1 +/mob/living/carbon/human/verb/toggle_resizing_immunity() + set name = "Toggle Resizing Immunity" + set desc = "Toggles your ability to resist resizing attempts" + set category = "IC" -/mob/living/carbon/human/proc/handle_emote_vr(var/act,var/m_type=1,var/message = null) - //Reduces emote spamming - if(nextemote >= world.time)// || user.stat != CONSCIOUS - return 1 - nextemote = world.time + 12 + resizable = !resizable + to_chat(src, "You are now [resizable ? "susceptible" : "immune"] to being resized.") - switch(act) - if("vwag") - if(toggle_tail(message = 1)) - m_type = 1 - message = "[wagging ? "starts" : "stops"] wagging their tail." - else - return 1 - if("vflap") - if(toggle_wing(message = 1)) - m_type = 1 - message = "[flapping ? "starts" : "stops"] flapping their wings." - else - return 1 - if("mlem") - message = "mlems [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] tongue up over [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] nose. Mlem." - m_type = 1 - if("blep") - message = "bleps [get_visible_gender() == MALE ? "his" : get_visible_gender() == FEMALE ? "her" : "their"] tongue out. Blep." - m_type = 1 - if("awoo") - m_type = 2 - message = "lets out an awoo." - playsound(src, 'sound/voice/awoo.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("awoo2") - m_type = 2 - message = "lets out an awoo." - playsound(src, 'sound/voice/long_awoo.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("growl") - m_type = 2 - message = "lets out a growl." - playsound(src, 'sound/voice/growl.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("woof") - m_type = 2 - message = "lets out a woof." - playsound(src, 'sound/voice/woof.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("woof2") - m_type = 2 - message = "lets out a woof." - playsound(src, 'sound/voice/woof2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("nya") - message = "lets out a nya." - m_type = 2 - playsound(src, 'sound/voice/nya.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("mrowl") - message = "mrowls." - m_type = 2 - playsound(src, 'sound/voice/mrow.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("peep") - message = "peeps like a bird." - m_type = 2 - playsound(src, 'sound/voice/peep.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("chirp") - message = "chirps!" - playsound(src, 'sound/misc/nymphchirp.ogg', 50, 0, preference = /datum/client_preference/emote_noises) - m_type = 2 - if("hoot") - message = "hoots!" - playsound(src, 'sound/voice/hoot.ogg', 50, 1, ,-1, preference = /datum/client_preference/emote_noises) - m_type = 2 - if("weh") - message = "lets out a weh." - m_type = 2 - playsound(src, 'sound/voice/weh.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("merp") - message = "lets out a merp." - m_type = 2 - playsound(src, 'sound/voice/merp.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("myarp") - message = "lets out a myarp." - m_type = 2 - playsound(src, 'sound/voice/myarp.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("bark") - message = "lets out a bark." - m_type = 2 - playsound(src, 'sound/voice/bark2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("bork") - m_type = 2 - message = "lets out a bork." - playsound(src, 'sound/voice/bork.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if ("mrow") - m_type = 2 - message = "lets out a mrow." - playsound(src, 'sound/voice/mrow.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if ("hypno") - m_type = 2 - message = "lets out a mystifying tone." - playsound(src, 'sound/voice/hypno.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("hiss") - message = "lets out a hiss." - m_type = 2 - playsound(src, 'sound/voice/hiss.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("rattle") - message = "rattles!" - m_type = 2 - playsound(src, 'sound/voice/rattle.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("squeak") - message = "lets out a squeak." - m_type = 2 - playsound(src, 'sound/effects/mouse_squeak.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("geck") - message = "geckers!" - m_type = 2 - playsound(src, 'sound/voice/geck.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("baa") - message = "lets out a baa." - m_type = 2 - playsound(src, 'sound/voice/baa.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("baa2") - message = "bleats." - m_type = 2 - playsound(src, 'sound/voice/baa2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("deathgasp2") - message = "[species.get_death_message()]" - m_type = 1 - playsound(src, 'sound/voice/deathgasp2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("mar") - message = "lets out a mar." - m_type = 2 - playsound(src, 'sound/voice/mar.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("wurble") - message = "lets out a wurble." - m_type = 2 - playsound(src, 'sound/voice/wurble.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - if("snort") - message = "snorts!" - m_type = 2 - playsound(src, 'sound/voice/Snort.ogg', 50, 0, preference = /datum/client_preference/emote_noises) - if("meow") - message = "gently meows!" - m_type = 2 - playsound(src, 'sound/voice/Meow.ogg', 50, 0, preference = /datum/client_preference/emote_noises) - if("moo") - message = "takes a breath and lets out a moo." - m_type = 2 - playsound(src, 'sound/voice/Moo.ogg', 50, 0, preference = /datum/client_preference/emote_noises) - if("croak") - message = "rumbles their throat, puffs their cheeks and croaks." - m_type = 2 - playsound(src, 'sound/voice/Croak.ogg', 50, 0, preference = /datum/client_preference/emote_noises) - if("gao") - message = "lets out a gao." - m_type = 2 - playsound(src, 'sound/voice/gao.ogg', 50, 0, preference = /datum/client_preference/emote_noises) - if("cackle") - message = "cackles hysterically!" - m_type = 2 - playsound(src, 'sound/voice/YeenCackle.ogg', 50, 0, preference = /datum/client_preference/emote_noises) - if("nsay") - nsay() - return TRUE - if("nme") - nme() - return TRUE - if("flip") - var/list/involved_parts = list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT) - //Check if they are physically capable - if(sleeping || resting || buckled || weakened || restrained() || involved_parts.len < 2) - to_chat(src, "You can't *flip in your current state!") - return 1 - else - nextemote += 12 //Double delay - handle_flip_vr() - message = "does a flip!" - m_type = 1 - if("vhelp") //Help for Virgo-specific emotes. - to_chat(src, "vwag, vflap, mlem, blep, awoo, awoo2, growl, nya, peep, chirp, hoot, weh, merp, myarp, bark, bork, mrow, mrowl, hypno, hiss, rattle, squeak, geck, baa, baa2, mar, wurble, snort, meow, moo, croak, gao, cackle, nsay, nme, flip") - return TRUE - - if(message) - custom_emote(m_type,message) - return TRUE - - return FALSE /mob/living/carbon/human/proc/handle_flip_vr() var/original_density = density diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index b351c3d79be..823125109e4 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1162,6 +1162,9 @@ //A slew of bits that may be affected by our species change regenerate_icons() + // Update our available emote list. + update_emotes() + if(species) //if(mind) //VOREStation Removal //apply_traits() //VOREStation Removal diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 34b93b25738..15ea6a45542 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -81,7 +81,6 @@ var/voice = "" //Instead of new say code calling GetVoice() over and over and over, we're just going to ask this variable, which gets updated in Life() - var/miming = null //Toggle for the mime's abilities. var/special_voice = "" // For changing our voice. Used by a symptom. var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none. @@ -156,4 +155,3 @@ // Custom Species Name var/custom_species - diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 6795d670647..c0360d3297a 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -98,7 +98,8 @@ // This is the 'mechanical' check for synthetic-ness, not appearance // Returns the company that made the synthetic /mob/living/carbon/human/isSynthetic() - if(synthetic) return synthetic //Your synthetic-ness is not going away + if(synthetic) + return synthetic //Your synthetic-ness is not going away var/obj/item/organ/external/T = organs_by_name[BP_TORSO] if(T && T.robotic >= ORGAN_ROBOT) src.verbs += /mob/living/carbon/human/proc/self_diagnostics @@ -106,9 +107,9 @@ src.verbs += /mob/living/carbon/human/proc/setmonitor_state var/datum/robolimb/R = all_robolimbs[T.model] synthetic = R + update_emotes() return synthetic - - return 0 + return FALSE // Would an onlooker know this person is synthetic? // Based on sort of logical reasoning, 'Look at head, look at torso' diff --git a/code/modules/mob/living/carbon/human/species/outsider/vox.dm b/code/modules/mob/living/carbon/human/species/outsider/vox.dm index b29bead4f9c..e8ff96175a7 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/vox.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/vox.dm @@ -25,7 +25,8 @@ speech_sounds = list('sound/voice/shriek1.ogg') speech_chance = 20 - scream_verb = "shrieks" + scream_verb_1p = "shriek" + scream_verb_3p = "shrieks" male_scream_sound = 'sound/voice/shriek1.ogg' female_scream_sound = 'sound/voice/shriek1.ogg' male_cough_sounds = list('sound/voice/shriekcough.ogg') @@ -86,7 +87,11 @@ /datum/mob_descriptor/height = -1, /datum/mob_descriptor/build = 1, /datum/mob_descriptor/vox_markings = 0 - ) + ) + + default_emotes = list( + /decl/emote/audible/vox_shriek + ) /datum/species/vox/get_random_name(var/gender) var/datum/language/species_language = GLOB.all_languages[default_language] diff --git a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_trait.dm b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_trait.dm index 73c182dfadd..7f16315e851 100644 --- a/code/modules/mob/living/carbon/human/species/shadekin/shadekin_trait.dm +++ b/code/modules/mob/living/carbon/human/species/shadekin/shadekin_trait.dm @@ -2,7 +2,7 @@ allowed_species = list(SPECIES_SHADEKIN) var/color = BLUE_EYES name = "Shadekin Blue Adaptation" - desc = "Makes your shadekin adapted as a Blue eyed kin! This gives you decreased energy regeneration in darkness, decreased regeneration in the light amd unchanged health!" + desc = "Makes your shadekin adapted as a Blue eyed kin! This gives you decreased energy regeneration in darkness, decreased regeneration in the light and unchanged health!" cost = 0 var_changes = list( "total_health" = 100, "energy_light" = 0.5, @@ -13,7 +13,7 @@ /datum/trait/kintype/red name = "Shadekin Red Adaptation" color = RED_EYES - desc = "Makes your shadekin adapted as a Red eyed kin! This gives you minimal energy regeneration in darkness, moderate regeneration in the light amd increased health!" + desc = "Makes your shadekin adapted as a Red eyed kin! This gives you minimal energy regeneration in darkness, moderate degeneration in the light and increased health!" var_changes = list( "total_health" = 200, "energy_light" = -1, "energy_dark" = 0.1, @@ -22,37 +22,37 @@ /datum/trait/kintype/purple name = "Shadekin Purple Adaptation" color = PURPLE_EYES - desc = "Makes your shadekin adapted as a Purple eyed kin! This gives you moderate energy regeneration in darkness, minor degeneration in the light amd increased health!" + desc = "Makes your shadekin adapted as a Purple eyed kin! This gives you moderate energy regeneration in darkness, minor degeneration in the light and increased health!" var_changes = list( "total_health" = 150, - "energy_light" = 1, - "energy_dark" = -0.5, + "energy_light" = -0.5, + "energy_dark" = 1, "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) /datum/trait/kintype/yellow name = "Shadekin Yellow Adaptation" color = YELLOW_EYES - desc = "Makes your shadekin adapted as a Yellow eyed kin! This gives you the highest energy regeneration in darkness, high degeneration in the light amd unchanged health!" + desc = "Makes your shadekin adapted as a Yellow eyed kin! This gives you the highest energy regeneration in darkness, high degeneration in the light and unchanged health!" var_changes = list( "total_health" = 100, - "energy_light" = 3, - "energy_dark" = -2, + "energy_light" = -2, + "energy_dark" = 3, "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) /datum/trait/kintype/green name = "Shadekin Green Adaptation" color = GREEN_EYES - desc = "Makes your shadekin adapted as a Green eyed kin! This gives you high energy regeneration in darkness, minor regeneration in the light amd unchanged health!" + desc = "Makes your shadekin adapted as a Green eyed kin! This gives you high energy regeneration in darkness, minor regeneration in the light and unchanged health!" var_changes = list( "total_health" = 100, - "energy_light" = 2, - "energy_dark" = 0.125, + "energy_light" = 0.125, + "energy_dark" = 2, "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) /datum/trait/kintype/orange name = "Shadekin Orange Adaptation" color = ORANGE_EYES - desc = "Makes your shadekin adapted as a Orange eyed kin! This gives you minor energy regeneration in darkness, modeate degeneration in the light amd increased health!" + desc = "Makes your shadekin adapted as a Orange eyed kin! This gives you minor energy regeneration in darkness, moderate degeneration in the light and increased health!" var_changes = list( "total_health" = 175, - "energy_light" = 0.25, - "energy_dark" = -0.5, + "energy_light" = -0.5, + "energy_dark" = 0.25, "unarmed_types" = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/claws/shadekin, /datum/unarmed_attack/bite/sharp/shadekin,/datum/unarmed_attack/shadekinharmbap)) /datum/trait/kintype/apply(var/datum/species/shadekin/S,var/mob/living/carbon/human/H) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 80ad0763e27..3ae68b2c7d8 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -75,7 +75,8 @@ var/list/assisted_langs = list(LANGUAGE_EAL, LANGUAGE_SKRELLIAN, LANGUAGE_SKRELLIANFAR, LANGUAGE_ROOTLOCAL, LANGUAGE_ROOTGLOBAL, LANGUAGE_VOX) //VOREStation Edit //Soundy emotey things. - var/scream_verb = "screams" + var/scream_verb_1p = "scream" + var/scream_verb_3p = "screams" var/male_scream_sound //= 'sound/goonstation/voice/male_scream.ogg' Removed due to licensing, replace! var/female_scream_sound //= 'sound/goonstation/voice/female_scream.ogg' Removed due to licensing, replace! var/male_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg') diff --git a/code/modules/mob/living/carbon/human/species/species_getters.dm b/code/modules/mob/living/carbon/human/species/species_getters.dm index 0eeea4f9d4c..7b635613ea1 100644 --- a/code/modules/mob/living/carbon/human/species/species_getters.dm +++ b/code/modules/mob/living/carbon/human/species/species_getters.dm @@ -44,7 +44,7 @@ if(config.show_human_death_message) return ((H && H.isSynthetic()) ? "gives one shrill beep before falling lifeless." : death_message) else - return "no message" + return DEATHGASP_NO_MESSAGE /datum/species/proc/get_ssd(var/mob/living/carbon/human/H) if(H) diff --git a/code/modules/mob/living/carbon/human/species/station/prometheans.dm b/code/modules/mob/living/carbon/human/species/station/prometheans.dm index bfb1b7d5e3d..8ec116221ed 100644 --- a/code/modules/mob/living/carbon/human/species/station/prometheans.dm +++ b/code/modules/mob/living/carbon/human/species/station/prometheans.dm @@ -119,6 +119,15 @@ var/datum/species/shapeshifter/promethean/prometheans var/heal_rate = 0.5 // Temp. Regen per tick. + default_emotes = list( + /decl/emote/audible/squish, + /decl/emote/audible/chirp, + /decl/emote/visible/bounce, + /decl/emote/visible/jiggle, + /decl/emote/visible/lightup, + /decl/emote/visible/vibrate + ) + /datum/species/shapeshifter/promethean/New() ..() prometheans = src diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index f74505e770b..21e19f68d43 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -160,6 +160,16 @@ /datum/mob_descriptor/build = 2 ) + default_emotes = list( + /decl/emote/human/swish, + /decl/emote/human/wag, + /decl/emote/human/sway, + /decl/emote/human/qwag, + /decl/emote/human/fastsway, + /decl/emote/human/swag, + /decl/emote/human/stopsway + ) + /datum/species/unathi/equip_survival_gear(var/mob/living/carbon/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) @@ -250,6 +260,16 @@ O_INTESTINE = /obj/item/organ/internal/intestine ) + default_emotes = list( + /decl/emote/human/swish, + /decl/emote/human/wag, + /decl/emote/human/sway, + /decl/emote/human/qwag, + /decl/emote/human/fastsway, + /decl/emote/human/swag, + /decl/emote/human/stopsway + ) + /datum/species/tajaran/equip_survival_gear(var/mob/living/carbon/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) @@ -533,6 +553,11 @@ genders = list(PLURAL) + default_emotes = list( + /decl/emote/audible/chirp, + /decl/emote/audible/multichirp + ) + /datum/species/diona/can_understand(var/mob/other) if(istype(other, /mob/living/carbon/alien/diona)) return TRUE diff --git a/code/modules/mob/living/carbon/human/species/station/teshari.dm b/code/modules/mob/living/carbon/human/species/station/teshari.dm index 3a282707c35..42afbbdbfcb 100644 --- a/code/modules/mob/living/carbon/human/species/station/teshari.dm +++ b/code/modules/mob/living/carbon/human/species/station/teshari.dm @@ -139,7 +139,7 @@ descriptors = list( /datum/mob_descriptor/height = -3, /datum/mob_descriptor/build = -3 - ) + ) var/static/list/flight_bodyparts = list( BP_L_ARM, @@ -152,6 +152,12 @@ /obj/item/clothing/suit/straight_jacket ) + default_emotes = list( + /decl/emote/audible/teshsqueak, + /decl/emote/audible/teshchirp, + /decl/emote/audible/teshtrill + ) + /datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H) ..() H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) @@ -159,7 +165,7 @@ /datum/species/teshari/handle_falling(mob/living/carbon/human/H, atom/hit_atom, damage_min, damage_max, silent, planetary) // Tesh can glide to save themselves from some falls. Basejumping bird - // without parachute, or falling bird without free wings goes splat. + // without parachute, or falling bird without free wings, goes splat. // Are we landing from orbit, or handcuffed/unconscious/tied to something? if(planetary || !istype(H) || H.incapacitated(INCAPACITATION_DEFAULT|INCAPACITATION_DISABLED)) diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 877e8542767..ae1b09ae714 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -433,38 +433,5 @@ proc/get_radio_key_from_channel(var/channel) /mob/proc/GetVoice() return name -/mob/living/emote(var/act, var/type, var/message) //emote code is terrible, this is so that anything that isn't - if(stat) //already snowflaked to shit can call the parent and handle emoting sanely - return FALSE - - if(..(act, type, message)) - return TRUE - - if(act && type && message) - log_emote(message, src) - - for(var/mob/M in dead_mob_list) - if(!M.client) - continue - - if(isnewplayer(M)) - continue - - if(isobserver(M) && M.is_preference_enabled(/datum/client_preference/ghost_sight)) - M.show_message(message) - - switch(type) - if(1) // Visible - visible_message(message) - return TRUE - if(2) // Audible - audible_message(message) - return TRUE - else - if(act == "help") - return // Mobs handle this individually - to_chat(src, "Unusable emote '[act]'. Say *help for a list.") - - /mob/proc/speech_bubble_appearance() return "normal" diff --git a/code/modules/mob/living/silicon/emote.dm b/code/modules/mob/living/silicon/emote.dm index 00a5e429932..6aa6ae2150f 100644 --- a/code/modules/mob/living/silicon/emote.dm +++ b/code/modules/mob/living/silicon/emote.dm @@ -1,113 +1,13 @@ -/mob/living/silicon/emote(var/act, var/m_type = 1,var/message = null) - var/param = null - if(findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) +var/list/_silicon_default_emotes = list( + /decl/emote/audible/synth, + /decl/emote/audible/synth/ping, + /decl/emote/audible/synth/buzz, + /decl/emote/audible/synth/confirm, + /decl/emote/audible/synth/deny, + /decl/emote/audible/synth/dwoop, + /decl/emote/audible/synth/security, + /decl/emote/audible/synth/security/halt +) - if(findtext(act, "s", -1) && !findtext(act, "_", -2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act, 1, length(act)) - - switch(act) - if("beep") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "[src] beeps at [param]." - else - message = "[src] beeps." - playsound(src, 'sound/machines/twobeep.ogg', 50, 0) - m_type = 1 - - if("ping") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "[src] pings at [param]." - else - message = "[src] pings." - playsound(src, 'sound/machines/ping.ogg', 50, 0) - m_type = 1 - - if("buzz") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "[src] buzzes at [param]." - else - message = "[src] buzzes." - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0) - m_type = 1 - - if("yes", "ye") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "[src] emits an affirmative blip at [param]." - else - message = "[src] emits an affirmative blip." - playsound(src, 'sound/machines/synth_yes.ogg', 50, 0) - m_type = 1 - - if("dwoop") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - M = A - break - if(!M) - param = null - - if (param) - message = "[src] chirps happily at [param]" - else - message = "[src] chirps happily." - playsound(src, 'sound/machines/dwoop.ogg', 50, 0) - m_type = 1 - - if("no") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if (param == A.name) - M = A - break - if(!M) - param = null - - if (param) - message = "[src] emits a negative blip at [param]." - else - message = "[src] emits a negative blip." - playsound(src, 'sound/machines/synth_no.ogg', 50, 0) - m_type = 1 - - ..(act, m_type, message) \ No newline at end of file +/mob/living/silicon/get_default_emotes() + return global._silicon_default_emotes diff --git a/code/modules/mob/living/silicon/robot/emote.dm b/code/modules/mob/living/silicon/robot/emote.dm index 9560c6b528e..2b83568e7bf 100644 --- a/code/modules/mob/living/silicon/robot/emote.dm +++ b/code/modules/mob/living/silicon/robot/emote.dm @@ -1,155 +1,33 @@ -/mob/living/silicon/robot/emote(var/act,var/m_type=1,var/message = null) - var/param = null - if(findtext(act, "-", 1, null)) - var/t1 = findtext(act, "-", 1, null) - param = copytext(act, t1 + 1, length(act) + 1) - act = copytext(act, 1, t1) +var/list/_robot_default_emotes = list( + /decl/emote/audible/clap, + /decl/emote/visible/bow, + /decl/emote/visible/salute, + /decl/emote/visible/flap, + /decl/emote/visible/aflap, + /decl/emote/visible/twitch, + /decl/emote/visible/twitch_v, + /decl/emote/visible/dance, + /decl/emote/visible/nod, + /decl/emote/visible/shake, + /decl/emote/visible/glare, + /decl/emote/visible/look, + /decl/emote/visible/stare, + /decl/emote/visible/deathgasp_robot, + /decl/emote/visible/spin, + /decl/emote/visible/sidestep, + /decl/emote/audible/synth, + /decl/emote/audible/synth/ping, + /decl/emote/audible/synth/buzz, + /decl/emote/audible/synth/confirm, + /decl/emote/audible/synth/deny, + /decl/emote/audible/synth/dwoop, + /decl/emote/audible/synth/security, + /decl/emote/audible/synth/security/halt, + //VOREStation Add + /decl/emote/visible/mlem, + /decl/emote/visible/blep + //VOREStation Add End +) - if(findtext(act,"s",-1) && !findtext(act,"_",-2))//Removes ending s's unless they are prefixed with a '_' - act = copytext(act,1,length(act)) - - switch(act) - if("salute") - if(!src.buckled) - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "[src] salutes to [param]." - else - message = "[src] salutes." - m_type = 1 - if("bow") - if(!src.buckled) - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "[src] bows to [param]." - else - message = "[src] bows." - m_type = 1 - - if("clap") - if(!src.restrained()) - message = "[src] claps." - m_type = 2 - if("flap") - if(!src.restrained()) - message = "[src] flaps its wings." - m_type = 2 - - if("aflap") - if(!src.restrained()) - message = "[src] flaps its wings ANGRILY!" - m_type = 2 - - if("twitch") - message = "[src] twitches." - m_type = 1 - - if("twitch_v") - message = "[src] twitches violently." - m_type = 1 - - if("nod") - message = "[src] nods." - m_type = 1 - - if("deathgasp") - message = "[src] shudders violently for a moment, then becomes motionless, its eyes slowly darkening." - m_type = 1 - - if("glare") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "[src] glares at [param]." - else - message = "[src] glares." - - if("stare") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - if(!M) - param = null - - if(param) - message = "[src] stares at [param]." - else - message = "[src] stares." - - if("look") - var/M = null - if(param) - for (var/mob/A in view(null, null)) - if(param == A.name) - M = A - break - - if(!M) - param = null - - if(param) - message = "[src] looks at [param]." - else - message = "[src] looks." - m_type = 1 - - if("law") - if(istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9 - message = "[src] shows its legal authorization barcode." - - playsound(src, 'sound/voice/biamthelaw.ogg', 50, 0) - m_type = 2 - else - to_chat(src, "You are not THE LAW, pal.") - - if("halt") - if(istype(module,/obj/item/weapon/robot_module/robot/security) || istype(module,/obj/item/weapon/robot_module/robot/knine)) //VOREStation Add - K9 - message = "[src]'s speakers skreech, \"Halt! Security!\"." - - playsound(src, 'sound/voice/halt.ogg', 50, 0) - m_type = 2 - else - to_chat(src, "You are not security.") - //Vorestation addition start - if("bark") - if (istype(module,/obj/item/weapon/robot_module/robot/knine) || istype(module,/obj/item/weapon/robot_module/robot/medihound) || istype(module,/obj/item/weapon/robot_module/robot/scrubpup) || istype(module,/obj/item/weapon/robot_module/robot/ert) || istype(module,/obj/item/weapon/robot_module/robot/science) || istype(module,/obj/item/weapon/robot_module/robot/engiedog) || istype(module,/obj/item/weapon/robot_module/robot/clerical/brodog) || istype(module,/obj/item/weapon/robot_module/robot/kmine) ) - message = "[src] lets out a bark." - - playsound(src, 'sound/voice/bark2.ogg', 50, 1, -1, preference = /datum/client_preference/emote_noises) - m_type = 2 - else - to_chat(src, "You're not a dog!") - //Vorestation addition end - - - - if("help") - to_chat(src, "salute, bow-(none)/mob, clap, flap, aflap, twitch, twitch_s, nod, deathgasp, glare-(none)/mob, stare-(none)/mob, look, beep, ping, \nbuzz, law, halt, yes, dwoop, no") - - ..(act, m_type, message) +/mob/living/silicon/robot/get_default_emotes() + return global._robot_default_emotes diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index ef870cb1f35..34f6096ede0 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -114,7 +114,7 @@ return 0 return 1 -/mob/living/silicon/ai/emote(var/act, var/type, var/message) +/mob/living/silicon/ai/emote(var/act, var/m_type, var/message) var/obj/machinery/hologram/holopad/T = holo if(T && T.masters[src]) //Is the AI using a holopad? . = holopad_emote(message) diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm index 9db6a6bffa0..c48f94bf277 100644 --- a/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm +++ b/code/modules/mob/living/simple_mob/subtypes/animal/pets/cat.dm @@ -1,3 +1,32 @@ +var/list/_cat_default_emotes = list( + /decl/emote/visible, + /decl/emote/visible/scratch, + /decl/emote/visible/drool, + /decl/emote/visible/nod, + /decl/emote/visible/sway, + /decl/emote/visible/sulk, + /decl/emote/visible/twitch, + /decl/emote/visible/twitch_v, + /decl/emote/visible/dance, + /decl/emote/visible/roll, + /decl/emote/visible/shake, + /decl/emote/visible/jump, + /decl/emote/visible/shiver, + /decl/emote/visible/collapse, + /decl/emote/visible/spin, + /decl/emote/visible/sidestep, + /decl/emote/audible, + /decl/emote/audible/hiss, + /decl/emote/audible/whimper, + /decl/emote/audible/gasp, + /decl/emote/audible/scretch, + /decl/emote/audible/choke, + /decl/emote/audible/moan, + /decl/emote/audible/gnarl, + /decl/emote/audible/purr, + /decl/emote/audible/purrlong +) + /mob/living/simple_mob/animal/passive/cat name = "cat" desc = "A domesticated, feline pet. Has a tendency to adopt crewmembers." @@ -28,6 +57,9 @@ update_icon() return ..() +/mob/living/simple_mob/animal/passive/cat/get_default_emotes() + return global._cat_default_emotes + /mob/living/simple_mob/animal/passive/cat/handle_special() if(!stat && prob(2)) // spooky var/mob/observer/dead/spook = locate() in range(src, 5) 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 a5419bc5599..f8d47a4b2dc 100644 --- a/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm +++ b/code/modules/mob/living/simple_mob/subtypes/slime/slime.dm @@ -1,5 +1,21 @@ -// The top-level slime defines. Xenobio slimes and feral slimes will inherit from this. +var/list/_slime_default_emotes = list( + /decl/emote/audible/moan, + /decl/emote/visible/twitch, + /decl/emote/visible/sway, + /decl/emote/visible/shiver, + /decl/emote/visible/bounce, + /decl/emote/visible/jiggle, + /decl/emote/visible/lightup, + /decl/emote/visible/vibrate, + /decl/emote/slime, + /decl/emote/slime/pout, + /decl/emote/slime/sad, + /decl/emote/slime/angry, + /decl/emote/slime/frown, + /decl/emote/slime/smile +) +// The top-level slime defines. Xenobio slimes and feral slimes will inherit from this. /mob/living/simple_mob/slime name = "slime" desc = "It's a slime." @@ -64,6 +80,9 @@ can_enter_vent_with = list(/obj/item/clothing/head) +/mob/living/simple_mob/slime/get_default_emotes() + return global._slime_default_emotes + /datum/say_list/slime speak = list("Blorp...", "Blop...") emote_see = list("bounces", "jiggles", "sways") diff --git a/code/modules/mob/living/voice/voice.dm b/code/modules/mob/living/voice/voice.dm index 2d070d1a298..9caa58cb33d 100644 --- a/code/modules/mob/living/voice/voice.dm +++ b/code/modules/mob/living/voice/voice.dm @@ -137,6 +137,6 @@ return TRUE return ..() -/mob/living/voice/custom_emote(var/m_type=1,var/message = null,var/range=world.view) +/mob/living/voice/custom_emote(var/m_type = VISIBLE_MESSAGE, var/message = null, var/range = world.view) if(!comm) return ..(m_type,message,comm.video_range) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 3b4b478a7eb..c41691a8575 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -42,6 +42,7 @@ lastarea = get_area(src) hook_vr("mob_new",list(src)) //VOREStation Code update_transform() // Some mobs may start bigger or smaller than normal. + update_emotes() return ..() /mob/proc/show_message(msg, type, alt, alt_type)//Message, type of message (1 or 2), alternative message, alt message type (1 or 2) @@ -49,19 +50,19 @@ if(!client && !teleop) return if (type) - if((type & 1) && (is_blind() || paralysis) )//Vision related + if((type & VISIBLE_MESSAGE) && (is_blind() || paralysis) )//Vision related if (!( alt )) return else msg = alt type = alt_type - if ((type & 2) && is_deaf())//Hearing related + if ((type & AUDIBLE_MESSAGE) && is_deaf())//Hearing related if (!( alt )) return else msg = alt type = alt_type - if ((type & 1) && (sdisabilities & BLIND)) + if ((type & VISIBLE_MESSAGE) && (sdisabilities & BLIND)) return // Added voice muffling for Issue 41. if(stat == UNCONSCIOUS || sleeping > 0) @@ -77,14 +78,17 @@ // message is the message output to anyone who can see e.g. "[src] does something!" // self_message (optional) is what the src mob sees e.g. "You do something!" // blind_message (optional) is what blind people will hear e.g. "You hear something!" -/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null) +/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null, var/range = world.view) if(self_message) if(LAZYLEN(exclude_mobs)) exclude_mobs |= src else exclude_mobs = list(src) src.show_message(self_message, 1, blind_message, 2) - . = ..(message, blind_message, exclude_mobs) + // Transfer messages about what we are doing to upstairs + if(shadow) + shadow.visible_message(message, self_message, blind_message, exclude_mobs, range) + . = ..(message, blind_message, exclude_mobs, range) // Really not ideal that atom/visible_message has different arg numbering :( // Returns an amount of power drawn from the object (-1 if it's not viable). // If drain_check is set it will not actually drain power, just return a value. @@ -99,7 +103,7 @@ // self_message (optional) is what the src mob hears. // deaf_message (optional) is what deaf people will see. // hearing_distance (optional) is the range, how many tiles away the message can be heard. -/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message) +/mob/audible_message(var/message, var/deaf_message, var/hearing_distance, var/self_message, var/radio_message) var/range = hearing_distance || world.view var/list/hear = get_mobs_and_objs_in_view_fast(get_turf(src),range,remote_ghosts = FALSE) @@ -107,16 +111,21 @@ var/list/hearing_mobs = hear["mobs"] var/list/hearing_objs = hear["objs"] - for(var/obj in hearing_objs) - var/obj/O = obj - O.show_message(message, 2, deaf_message, 1) + if(radio_message) + for(var/obj in hearing_objs) + var/obj/O = obj + O.hear_talk(src, list(new /datum/multilingual_say_piece(GLOB.all_languages["Noise"], radio_message)), null) + else + for(var/obj in hearing_objs) + var/obj/O = obj + O.show_message(message, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) for(var/mob in hearing_mobs) var/mob/M = mob var/msg = message if(self_message && M==src) msg = self_message - M.show_message(msg, 2, deaf_message, 1) + M.show_message(msg, AUDIBLE_MESSAGE, deaf_message, VISIBLE_MESSAGE) /mob/proc/findname(msg) for(var/mob/M in mob_list) @@ -576,9 +585,6 @@ /mob/proc/get_gender() return gender -/mob/proc/get_visible_gender() - return gender - /mob/proc/see(message) if(!is_active()) return 0 diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index f04cde9c4cf..1a13a7ed621 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -28,7 +28,7 @@ // Determines if the accessory will be skipped or included in random hair generations var/gender = NEUTER - // Restrict some styles to specific species + // Restrict some styles to specific species. Set to null to perform no checking. var/list/species_allowed = list(SPECIES_HUMAN,SPECIES_PROMETHEAN,SPECIES_HUMAN_VATBORN) // Whether or not the accessory can be affected by colouration @@ -38,7 +38,6 @@ // Ckey of person allowed to use this, if defined. var/list/ckeys_allowed = null - var/apply_restrictions = FALSE //whether to apply restrictions for specific tails/ears/wings /* //////////////////////////// diff --git a/code/modules/mob/new_player/sprite_accessories_ear.dm b/code/modules/mob/new_player/sprite_accessories_ear.dm index 6262b8ba606..24e82043e41 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear.dm @@ -23,7 +23,7 @@ icon_state = "shadekin" do_colouration = 1 color_blend_mode = ICON_MULTIPLY - apply_restrictions = TRUE + species_allowed = list() // SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW /datum/sprite_accessory/ears/taj_ears name = "Tajaran Ears" diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm index 7705e1a8217..fd82cac5b2e 100644 --- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm @@ -20,7 +20,6 @@ icon_state = "shadekin" do_colouration = 1 color_blend_mode = ICON_MULTIPLY - apply_restrictions = TRUE species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) // Ears avaliable to anyone diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm index 0b8d75b84e3..dec95139744 100644 --- a/code/modules/mob/new_player/sprite_accessories_tail.dm +++ b/code/modules/mob/new_player/sprite_accessories_tail.dm @@ -922,7 +922,6 @@ icon_state = "shadekin-short" do_colouration = 1 color_blend_mode = ICON_MULTIPLY - //apply_restrictions = TRUE //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) /datum/sprite_accessory/tail/wartacosushi_tail //brightened +20RGB from matching roboparts diff --git a/code/modules/mob/new_player/sprite_accessories_taur.dm b/code/modules/mob/new_player/sprite_accessories_taur.dm index db2394f84af..dad54ed188c 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur.dm @@ -333,7 +333,6 @@ hide_body_parts = null clip_mask_icon = null clip_mask_state = null - //apply_restrictions = TRUE //species_allowed = list(SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW) /datum/sprite_accessory/tail/taur/shadekin_tail/shadekin_tail_2c diff --git a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm index 4bc79e1629b..fc3994b528f 100644 --- a/code/modules/mob/new_player/sprite_accessories_taur_vr.dm +++ b/code/modules/mob/new_player/sprite_accessories_taur_vr.dm @@ -83,6 +83,12 @@ extra_overlay2 = "synthwolf_glow" //icon_sprite_tag = "synthwolf" +/datum/sprite_accessory/tail/taur/ch/wolf/fatsynthwolf + name = "Fat SynthWolf dual-color (Taur)" + icon_state = "fatsynthwolf_s" + extra_overlay = "fatsynthwolf_markings" + extra_overlay2 = "fatsynthwolf_glow" + /datum/sprite_accessory/tail/taur/skunk name = "Skunk (Taur)" icon_state = "skunk_s" @@ -213,6 +219,15 @@ extra_overlay = "lizard_markings" //icon_sprite_tag = "lizard2c" +/datum/sprite_accessory/tail/taur/ch/lizard/fat + name = "Fat Lizard (Taur)" + icon_state = "fatlizard_s" + +/datum/sprite_accessory/tail/taur/ch/lizard/fat_2c + name = "Fat Lizard (Taur, dual-color)" + icon_state = "fatlizard_s" + extra_overlay= "fatlizard_markings" + /datum/sprite_accessory/tail/taur/lizard/synthlizard name = "SynthLizard dual-color (Taur)" icon_state = "synthlizard_s" @@ -220,6 +235,12 @@ extra_overlay2 = "synthlizard_glow" //icon_sprite_tag = "synthlizard" +/datum/sprite_accessory/tail/taur/ch/lizard/fatsynthlizard + name = "Fat SynthLizard dual-color (Taur)" + icon_state = "fatsynthlizard_s" + extra_overlay = "fatsynthlizard_markings" + extra_overlay2 = "fatsynthlizard_glow" + /datum/sprite_accessory/tail/taur/spider name = "Spider (Taur)" icon_state = "spider_s" @@ -305,6 +326,12 @@ extra_overlay2 = "synthfeline_glow" //icon_sprite_tag = "synthfeline" +/datum/sprite_accessory/tail/taur/ch/feline/fatsynthfeline + name = "Fat SynthFeline dual-color (Taur)" + icon_state = "fatsynthfeline_s" + extra_overlay = "fatsynthfeline_markings" + extra_overlay2 = "fatsynthfeline_glow" + /datum/sprite_accessory/tail/taur/slug name = "Slug (Taur)" icon_state = "slug_s" diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index 52e843a9eeb..c30d256c596 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -105,11 +105,6 @@ verb = "asks" return verb - -/mob/proc/emote(var/act, var/type, var/message) - if(act == "me") - return custom_emote(type, message) - /mob/proc/get_ear() // returns an atom representing a location on the map from which this // mob can hear things diff --git a/code/modules/multiz/zshadow.dm b/code/modules/multiz/zshadow.dm index fcc5ecad650..e43ab219395 100644 --- a/code/modules/multiz/zshadow.dm +++ b/code/modules/multiz/zshadow.dm @@ -113,12 +113,6 @@ if(shadow) shadow.set_dir(new_dir) -// Transfer messages about what we are doing to upstairs -/mob/visible_message(var/message, var/self_message, var/blind_message, var/list/exclude_mobs = null) - . = ..() - if(shadow) - shadow.visible_message(message, self_message, blind_message, exclude_mobs) - /mob/zshadow/set_typing_indicator(var/state) if(!typing_indicator) init_typing_indicator("typing") diff --git a/code/modules/nifsoft/software/13_soulcatcher.dm b/code/modules/nifsoft/software/13_soulcatcher.dm index c1de0855326..07607216fbe 100644 --- a/code/modules/nifsoft/software/13_soulcatcher.dm +++ b/code/modules/nifsoft/software/13_soulcatcher.dm @@ -45,14 +45,14 @@ /datum/nifsoft/soulcatcher/install() if((. = ..())) nif.set_flag(NIF_O_SCOTHERS,NIF_FLAGS_OTHER) //Required on install, because other_flags aren't sufficient for our complicated settings. - nif.human.verbs |= /mob/living/carbon/human/proc/nsay - nif.human.verbs |= /mob/living/carbon/human/proc/nme + nif.human.verbs |= /mob/living/carbon/human/nsay + nif.human.verbs |= /mob/living/carbon/human/nme /datum/nifsoft/soulcatcher/uninstall() QDEL_LIST_NULL(brainmobs) if((. = ..()) && nif && nif.human) //Sometimes NIFs are deleted outside of a human - nif.human.verbs -= /mob/living/carbon/human/proc/nsay - nif.human.verbs -= /mob/living/carbon/human/proc/nme + nif.human.verbs -= /mob/living/carbon/human/nsay + nif.human.verbs -= /mob/living/carbon/human/nme /datum/nifsoft/soulcatcher/proc/save_settings() if(!nif) @@ -476,20 +476,26 @@ /////////////////// //Verbs for humans -/mob/living/carbon/human/proc/nsay(message as text|null) +/mob/proc/nsay(message as text|null) set name = "NSay" set desc = "Speak into your NIF's Soulcatcher." set category = "IC" + to_chat(src, SPAN_WARNING("You must be a humanoid with a NIF implanted to use that.")) + +/mob/living/carbon/human/nsay(message as text|null) + if(stat != CONSCIOUS) + to_chat(src,SPAN_WARNING("You can't use NSay while unconscious.")) + return if(!nif) - to_chat(src,"You can't use NSay without a NIF.") + to_chat(src,SPAN_WARNING("You can't use NSay without a NIF.")) return var/datum/nifsoft/soulcatcher/SC = nif.imp_check(NIF_SOULCATCHER) if(!SC) - to_chat(src,"You need the Soulcatcher software to use NSay.") + to_chat(src,SPAN_WARNING("You need the Soulcatcher software to use NSay.")) return if(!SC.brainmobs.len) - to_chat(src,"You need a loaded mind to use NSay.") + to_chat(src,SPAN_WARNING("You need a loaded mind to use NSay.")) return if(!message) message = input("Type a message to say.","Speak into Soulcatcher") as text|null @@ -497,20 +503,26 @@ var/sane_message = sanitize(message) SC.say_into(sane_message,src) -/mob/living/carbon/human/proc/nme(message as text|null) +/mob/proc/nme(message as text|null) set name = "NMe" set desc = "Emote into your NIF's Soulcatcher." set category = "IC" + + to_chat(src, SPAN_WARNING("You must be a humanoid with a NIF implanted to use that.")) +/mob/living/carbon/human/nme(message as text|null) + if(stat != CONSCIOUS) + to_chat(src,SPAN_WARNING("You can't use NMe while unconscious.")) + return if(!nif) - to_chat(src,"You can't use NMe without a NIF.") + to_chat(src,SPAN_WARNING("You can't use NMe without a NIF.")) return var/datum/nifsoft/soulcatcher/SC = nif.imp_check(NIF_SOULCATCHER) if(!SC) - to_chat(src,"You need the Soulcatcher software to use NMe.") + to_chat(src,SPAN_WARNING("You need the Soulcatcher software to use NMe.")) return if(!SC.brainmobs.len) - to_chat(src,"You need a loaded mind to use NMe.") + to_chat(src,SPAN_WARNING("You need a loaded mind to use NMe.")) return if(!message) @@ -563,7 +575,7 @@ QDEL_NULL(eyeobj) soulcatcher.notify_into("[src] ended AR projection.") -/mob/living/carbon/brain/caught_soul/verb/nsay(message as text|null) +/mob/living/carbon/brain/caught_soul/verb/nsay_brain(message as text|null) set name = "NSay" set desc = "Speak into the NIF's Soulcatcher (circumventing AR speaking)." set category = "Soulcatcher" @@ -574,7 +586,7 @@ var/sane_message = sanitize(message) soulcatcher.say_into(sane_message,src,null) -/mob/living/carbon/brain/caught_soul/verb/nme(message as text|null) +/mob/living/carbon/brain/caught_soul/verb/nme_brain(message as text|null) set name = "NMe" set desc = "Emote into the NIF's Soulcatcher (circumventing AR speaking)." set category = "Soulcatcher" diff --git a/code/modules/planet/sif.dm b/code/modules/planet/sif.dm index 798cebcaac2..cefc549d2a6 100644 --- a/code/modules/planet/sif.dm +++ b/code/modules/planet/sif.dm @@ -156,6 +156,9 @@ var/datum/planet/sif/planet_sif = null sky_visible = TRUE observed_message = "The sky is clear." + outdoor_sounds_type = /datum/looping_sound/weather/wind/gentle + indoor_sounds_type = /datum/looping_sound/weather/wind/gentle/indoors + /datum/weather/sif/overcast name = "overcast" light_modifier = 0.8 @@ -174,6 +177,9 @@ var/datum/planet/sif/planet_sif = null "It's very cloudy." ) + outdoor_sounds_type = /datum/looping_sound/weather/wind/gentle + indoor_sounds_type = /datum/looping_sound/weather/wind/gentle/indoors + /datum/weather/sif/light_snow name = "light snow" icon_state = "snowfall_light" @@ -192,6 +198,9 @@ var/datum/planet/sif/planet_sif = null "It begins to snow lightly.", ) + outdoor_sounds_type = /datum/looping_sound/weather/wind/gentle + indoor_sounds_type = /datum/looping_sound/weather/wind/gentle/indoors + /datum/weather/sif/snow name = "moderate snow" icon_state = "snowfall_med" @@ -282,8 +291,8 @@ var/datum/planet/sif/planet_sif = null transition_messages = list( "The sky is dark, and rain falls down upon you." ) -// outdoor_sounds_type = /datum/looping_sound/weather/rain -// indoor_sounds_type = /datum/looping_sound/weather/rain/indoors + outdoor_sounds_type = /datum/looping_sound/weather/rain + indoor_sounds_type = /datum/looping_sound/weather/rain/indoors /datum/weather/sif/rain/process_effects() ..() @@ -327,8 +336,8 @@ var/datum/planet/sif/planet_sif = null "Loud thunder is heard in the distance.", "A bright flash heralds the approach of a storm." ) -// outdoor_sounds_type = /datum/looping_sound/weather/rain -// indoor_sounds_type = /datum/looping_sound/weather/rain/indoors + outdoor_sounds_type = /datum/looping_sound/weather/rain/heavy + indoor_sounds_type = /datum/looping_sound/weather/rain/heavy/indoors transition_chances = list( diff --git a/code/modules/reagents/reagents/food_drinks_vr.dm b/code/modules/reagents/reagents/food_drinks_vr.dm index 246bb05b2c8..55436f295c5 100644 --- a/code/modules/reagents/reagents/food_drinks_vr.dm +++ b/code/modules/reagents/reagents/food_drinks_vr.dm @@ -458,4 +458,62 @@ M.adjustToxLoss(removed) //Equivalent to half as much protein, since it's half protein. if(M.species.organic_food_coeff) if(alien == IS_SLIME || alien == IS_CHIMERA) //slimes and chimera can get nutrition from injected nutriment and protein - M.nutrition += (alt_nutriment_factor * removed) \ No newline at end of file + M.nutrition += (alt_nutriment_factor * removed) + +//////////////////////Bepis Drinks (04/29/2021)////////////////////// + +/datum/reagent/drink/soda/bepis_cola + name = "Bepis" + id = "bepis" + description = "A weird cola-like beverage." + taste_description = "bepsi" + reagent_state = LIQUID + color = "#100800" + adj_drowsy = -3 + adj_temp = -5 + + glass_name = "Bepis Cola" + glass_desc = "A glass of weird cola beverage." + glass_special = list(DRINK_FIZZ) + +/datum/reagent/drink/soda/buzz_fuzz + name = "Buzz Fuzz" + id = "buzz_fuzz" + description = "A delicious frontier beverage that's simply a Hive of Flavour!" + taste_description = "carbonated honey and pollen" + reagent_state = LIQUID + color = "#8CFF00" + adj_drowsy = -3 + adj_temp = -5 + + glass_name = "Buzz Fuzz" + glass_desc = "A glass that's stinging with flavour." + glass_special = list(DRINK_FIZZ) + +/datum/reagent/drink/soda/sprited_cranberry + name = "Sprited Cranberry" + id = "sprited_cranberry" + description = "A winter spiced cranberry drink. Perfect for year-round consumption." + taste_description = "sweet spiced cranberry" + reagent_state = LIQUID + color = "#fffafa" + adj_drowsy = -3 + adj_temp = -5 + + glass_name = "Sprited Cranberry" + glass_desc = "A glass of sprited cranberry" + glass_special = list(DRINK_FIZZ) + +/datum/reagent/drink/soda/shamblers + name = "Shambler's Juice" + id = "shamblers" + description = "A strange off-brand beverage that's bursting with flavor." + taste_description = "carbonated metallic soda" + reagent_state = LIQUID + color = "#f00060" + adj_drowsy = -3 + adj_temp = -5 + + glass_name = "Shambler's Juice" + glass_desc = "A glass of something shambly" + glass_special = list(DRINK_FIZZ) \ No newline at end of file diff --git a/code/modules/tgui/modules/appearance_changer.dm b/code/modules/tgui/modules/appearance_changer.dm index e9478c3c31d..d063d6b41a3 100644 --- a/code/modules/tgui/modules/appearance_changer.dm +++ b/code/modules/tgui/modules/appearance_changer.dm @@ -542,7 +542,7 @@ // VOREStation Add - Ears/Tails/Wings /datum/tgui_module/appearance_changer/proc/can_use_sprite(datum/sprite_accessory/X, mob/living/carbon/human/target, mob/user) - if(X.apply_restrictions && !(target.species.name in X.species_allowed)) + if(!isnull(X.species_allowed) && !(target.species.name in X.species_allowed)) return FALSE if(LAZYLEN(X.ckeys_allowed) && !(user?.ckey in X.ckeys_allowed) && !(target.ckey in X.ckeys_allowed)) diff --git a/code/modules/vore/smoleworld/smoleworld_vr.dm b/code/modules/vore/smoleworld/smoleworld_vr.dm index 5e84d7cbd1f..50dbacfe1f3 100644 --- a/code/modules/vore/smoleworld/smoleworld_vr.dm +++ b/code/modules/vore/smoleworld/smoleworld_vr.dm @@ -60,7 +60,7 @@ recipes += new/datum/stack_recipe("smole houses", /obj/structure/smolebuilding/houses, 2, time = 10) recipes += new/datum/stack_recipe("smole business", /obj/structure/smolebuilding/business, 2, time = 10) recipes += new/datum/stack_recipe("smole warehouses", /obj/structure/smolebuilding/warehouses, 2, time = 10) - recipes += new/datum/stack_recipe("smole musem", /obj/structure/smolebuilding/musem, 2, time = 10) + recipes += new/datum/stack_recipe("smole museum", /obj/structure/smolebuilding/museum, 2, time = 10) /datum/material/smolebricks name = "smolebricks" @@ -86,7 +86,7 @@ //smolebrick case to make for easy bricks. /obj/item/weapon/storage/smolebrickcase name = "smolebrick case" - desc = "you feel the power of imagination." + desc = "You feel the power of imagination." icon = 'icons/vore/smoleworld_vr.dmi' icon_state = "smolestorage" throw_speed = 1 @@ -152,10 +152,10 @@ anchored = 1 /obj/structure/smoletrack/roadF - name = "road fourway piece" + name = "road four-way piece" icon = 'icons/vore/smoleworld_vr.dmi' icon_state = "carfourway" - desc = "A fourway road piece." + desc = "A four-way road piece." anchored = 1 //buildings code @@ -279,10 +279,10 @@ icon = 'icons/vore/smoleworld_vr.dmi' icon_state = "smolewarehouses" -/obj/structure/smolebuilding/musem - name = "smole musem" +/obj/structure/smolebuilding/museum + name = "smole museum" icon = 'icons/vore/smoleworld_vr.dmi' - icon_state = "smolemusem" + icon_state = "smolemuseum" // //CAR STUFF < WILL BE MESSED WITH IN A LATER UPDATE COMMENTED OUT FOR NOW ///obj/item/smolecar @@ -357,8 +357,8 @@ drop_sound = 'sound/items/drop/basketball.ogg' /obj/item/weapon/reagent_containers/food/snacks/snackplanet/virgo3b - name = "virgo3bB" - desc = "A sticky jelly jaw breaker in the shape of Virgo3B, it even has a tiny tether!" + name = "Virgo 3B" + desc = "A sticky jelly jaw breaker in the shape of Virgo-3B, it even has a tiny tether!" icon = 'icons/vore/smoleworld_vr.dmi' icon_state = "sp_Virgo3B" bitesize = 3 @@ -379,8 +379,8 @@ drop_sound = 'sound/items/drop/basketball.ogg' /obj/item/weapon/reagent_containers/food/snacks/snackplanet/virgoprime - name = "virgo prime" - desc = "Its a orange jaw breaker in the shape Virgo Prime!" + name = "Virgo Prime" + desc = "It's a orange jaw breaker in the shape of Virgo Prime!" icon = 'icons/vore/smoleworld_vr.dmi' icon_state = "sp_virgoprime" bitesize = 3 @@ -391,7 +391,7 @@ /obj/item/weapon/storage/bagoplanets name = "bag o' planets" - desc = "A cosmic bag of fist sized candy planets." + desc = "A cosmic bag of fist-sized candy planets." icon = 'icons/vore/smoleworld_vr.dmi' icon_state = "sp_storage" w_class = ITEMSIZE_LARGE diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index a20911d4355..b0130e58df5 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/corgi_back.dmi b/icons/mob/corgi_back.dmi index 81626df0333..27de68f79c0 100644 Binary files a/icons/mob/corgi_back.dmi and b/icons/mob/corgi_back.dmi differ diff --git a/icons/mob/corgi_head.dmi b/icons/mob/corgi_head.dmi index ca62243e79b..d8be15b3bc5 100644 Binary files a/icons/mob/corgi_head.dmi and b/icons/mob/corgi_head.dmi differ diff --git a/icons/mob/vore/taurs_vr.dmi b/icons/mob/vore/taurs_vr.dmi index 87f0b32cc2f..54e865150b9 100644 Binary files a/icons/mob/vore/taurs_vr.dmi and b/icons/mob/vore/taurs_vr.dmi differ diff --git a/icons/obj/drinks_vr.dmi b/icons/obj/drinks_vr.dmi index 280bf84cbd1..f1a34845330 100644 Binary files a/icons/obj/drinks_vr.dmi and b/icons/obj/drinks_vr.dmi differ diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi index ecae1504811..a794ff88a35 100644 Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ diff --git a/icons/obj/vending_vr.dmi b/icons/obj/vending_vr.dmi index 64c2ad0f5cb..94e2ba1fb67 100644 Binary files a/icons/obj/vending_vr.dmi and b/icons/obj/vending_vr.dmi differ diff --git a/icons/vore/smoleworld_vr.dmi b/icons/vore/smoleworld_vr.dmi index 206c0cef32c..035a6d6ce57 100644 Binary files a/icons/vore/smoleworld_vr.dmi and b/icons/vore/smoleworld_vr.dmi differ diff --git a/interface/skin.dmf b/interface/skin.dmf index 595a980bf15..4887895627f 100644 --- a/interface/skin.dmf +++ b/interface/skin.dmf @@ -603,6 +603,9 @@ macro "hotkeymode" elem name = "U" command = "Rest" + elem + name = "B" + command = "Resist" elem name = "NUMPAD1" command = "body-r-leg" diff --git a/sound/voice/Bug.ogg b/sound/voice/Bug.ogg new file mode 100644 index 00000000000..83486e436f2 Binary files /dev/null and b/sound/voice/Bug.ogg differ diff --git a/sound/voice/BugBuzz.ogg b/sound/voice/BugBuzz.ogg new file mode 100644 index 00000000000..43fda8be425 Binary files /dev/null and b/sound/voice/BugBuzz.ogg differ diff --git a/sound/voice/BugHiss.ogg b/sound/voice/BugHiss.ogg new file mode 100644 index 00000000000..3ab342f5c9d Binary files /dev/null and b/sound/voice/BugHiss.ogg differ diff --git a/sound/voice/cat_purr.ogg b/sound/voice/cat_purr.ogg new file mode 100644 index 00000000000..1125cb2bbd7 Binary files /dev/null and b/sound/voice/cat_purr.ogg differ diff --git a/sound/voice/cat_purr_long.ogg b/sound/voice/cat_purr_long.ogg new file mode 100644 index 00000000000..c74b845250d Binary files /dev/null and b/sound/voice/cat_purr_long.ogg differ diff --git a/sound/voice/multichirp.ogg b/sound/voice/multichirp.ogg new file mode 100644 index 00000000000..2db358e942b Binary files /dev/null and b/sound/voice/multichirp.ogg differ diff --git a/sound/voice/teshchirp.ogg b/sound/voice/teshchirp.ogg new file mode 100644 index 00000000000..f13c80dd335 Binary files /dev/null and b/sound/voice/teshchirp.ogg differ diff --git a/sound/voice/teshsqueak.ogg b/sound/voice/teshsqueak.ogg new file mode 100644 index 00000000000..41d205ab9fb Binary files /dev/null and b/sound/voice/teshsqueak.ogg differ diff --git a/sound/voice/teshtrill.ogg b/sound/voice/teshtrill.ogg new file mode 100644 index 00000000000..db30e988e53 Binary files /dev/null and b/sound/voice/teshtrill.ogg differ diff --git a/vorestation.dme b/vorestation.dme index e834755c4ab..e971212b986 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2069,8 +2069,29 @@ #include "code\modules\economy\TradeDestinations.dm" #include "code\modules\economy\vending.dm" #include "code\modules\economy\vending_machines.dm" +#include "code\modules\emotes\definitions\audible_furry_vr.dm" +#include "code\modules\emotes\definitions\helpers_vr.dm" +#include "code\modules\emotes\definitions\visible_vr.dm" #include "code\modules\entopics_vr\alternate_appearance.dm" #include "code\modules\entopics_vr\entopics.dm" +#include "code\modules\emotes\emote_define.dm" +#include "code\modules\emotes\emote_mob.dm" +#include "code\modules\emotes\definitions\_mob.dm" +#include "code\modules\emotes\definitions\_species.dm" +#include "code\modules\emotes\definitions\audible.dm" +#include "code\modules\emotes\definitions\audible_cough.dm" +#include "code\modules\emotes\definitions\audible_scream.dm" +#include "code\modules\emotes\definitions\audible_slap.dm" +#include "code\modules\emotes\definitions\audible_snap.dm" +#include "code\modules\emotes\definitions\audible_sneeze.dm" +#include "code\modules\emotes\definitions\audible_whistle.dm" +#include "code\modules\emotes\definitions\exertion.dm" +#include "code\modules\emotes\definitions\human.dm" +#include "code\modules\emotes\definitions\slimes.dm" +#include "code\modules\emotes\definitions\synthetics.dm" +#include "code\modules\emotes\definitions\visible.dm" +#include "code\modules\emotes\definitions\visible_animated.dm" +#include "code\modules\emotes\definitions\visible_vomit.dm" #include "code\modules\error_handler\_defines.dm" #include "code\modules\error_handler\error_handler.dm" #include "code\modules\error_handler\error_viewer.dm" @@ -2165,6 +2186,7 @@ #include "code\modules\food\drinkingglass\shaker.dm" #include "code\modules\food\drinkingglass\shaker_vr.dm" #include "code\modules\food\food\cans.dm" +#include "code\modules\food\food\cans_vr.dm" #include "code\modules\food\food\condiment.dm" #include "code\modules\food\food\drinks.dm" #include "code\modules\food\food\lunch.dm"