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 . += "