diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 586a87cd4e..a63681cc21 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -138,6 +138,8 @@ What is the naming convention for planes or layers? #define PLANE_MESONS 30 //Stuff seen with mesons, like open ceilings. This is 30 for downstreams. +#define PLANE_STATUS 31 //Status Indicators that show over mobs' heads when certain things like stuns affect them. + #define PLANE_ADMIN2 33 //Purely for shenanigans (above lighting) #define PLANE_BUILDMODE 39 //Things that only show up when you have buildmode on diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index c7b1c0eb80..0019c3cbd7 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -399,7 +399,9 @@ #define VIS_CLOAKED 23 -#define VIS_COUNT 23 //Must be highest number from above. +#define VIS_STATUS 24 + +#define VIS_COUNT 24 //Must be highest number from above. //Some mob icon layering defines #define BODY_LAYER -100 diff --git a/code/__defines/sound.dm b/code/__defines/sound.dm index d954d34b2a..bd225bde45 100644 --- a/code/__defines/sound.dm +++ b/code/__defines/sound.dm @@ -124,8 +124,7 @@ 'sound/ambience/maintenance/maintenance2.ogg',\ 'sound/ambience/maintenance/maintenance3.ogg',\ 'sound/ambience/maintenance/maintenance4.ogg',\ - 'sound/ambience/maintenance/maintenance5.ogg',\ - 'sound/ambience/maintenance/maintenance6.ogg'\ + 'sound/ambience/maintenance/maintenance5.ogg'\ ) // Life support machinery at work, keeping everyone breathing. @@ -155,7 +154,11 @@ // Concerning sounds, for when one discovers something horrible happened in a PoI. #define AMBIENCE_FOREBODING list(\ 'sound/ambience/foreboding/foreboding1.ogg',\ - 'sound/ambience/foreboding/foreboding2.ogg'\ + 'sound/ambience/foreboding/foreboding2.ogg',\ + 'sound/ambience/foreboding/foreboding3.ogg',\ + 'sound/ambience/foreboding/foreboding4.ogg',\ + 'sound/ambience/foreboding/foreboding5.ogg',\ + 'sound/ambience/foreboding/foreboding6.ogg'\ ) // Ambience heard when aboveground on Sif and not in a Point of Interest. diff --git a/code/_helpers/type2type.dm b/code/_helpers/type2type.dm index 18a94a501d..77019ab7b9 100644 --- a/code/_helpers/type2type.dm +++ b/code/_helpers/type2type.dm @@ -281,3 +281,103 @@ return strtype return copytext(strtype, delim_pos) +// Concatenates a list of strings into a single string. A seperator may optionally be provided. +/proc/list2text(list/ls, sep) + if (ls.len <= 1) // Early-out code for empty or singleton lists. + return ls.len ? ls[1] : "" + + var/l = ls.len // Made local for sanic speed. + var/i = 0 // Incremented every time a list index is accessed. + + if (sep != null) + // Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc... + #define S1 sep, ls[++i] + #define S4 S1, S1, S1, S1 + #define S16 S4, S4, S4, S4 + #define S64 S16, S16, S16, S16 + + . = "[ls[++i]]" // Make sure the initial element is converted to text. + + // Having the small concatenations come before the large ones boosted speed by an average of at least 5%. + if (l-1 & 0x01) // 'i' will always be 1 here. + . = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2. + if (l-i & 0x02) + . = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. + if (l-i & 0x04) + . = text("[][][][][][][][][]", ., S4) // And so on.... + if (l-i & 0x08) + . = text("[][][][][][][][][][][][][][][][][]", ., S4, S4) + if (l-i & 0x10) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16) + if (l-i & 0x20) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) + if (l-i & 0x40) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) + while (l > i) // Chomp through the rest of the list, 128 elements at a time. + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) + + #undef S64 + #undef S16 + #undef S4 + #undef S1 + else + // Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc... + #define S1 ls[++i] + #define S4 S1, S1, S1, S1 + #define S16 S4, S4, S4, S4 + #define S64 S16, S16, S16, S16 + + . = "[ls[++i]]" // Make sure the initial element is converted to text. + + if (l-1 & 0x01) // 'i' will always be 1 here. + . += S1 // Append 1 element if the remaining elements are not a multiple of 2. + if (l-i & 0x02) + . = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. + if (l-i & 0x04) + . = text("[][][][][]", ., S4) // And so on... + if (l-i & 0x08) + . = text("[][][][][][][][][]", ., S4, S4) + if (l-i & 0x10) + . = text("[][][][][][][][][][][][][][][][][]", ., S16) + if (l-i & 0x20) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) + if (l-i & 0x40) + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) + while (l > i) // Chomp through the rest of the list, 128 elements at a time. + . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ + [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) + + #undef S64 + #undef S16 + #undef S4 + #undef S1 + +// Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator) +/proc/text2list(text, delimiter="\n") + var/delim_len = length(delimiter) + if (delim_len < 1) + return list(text) + + . = list() + var/last_found = 1 + var/found + + do + found = findtext(text, delimiter, last_found, 0) + . += copytext(text, last_found, found) + last_found = found + delim_len + while (found) diff --git a/code/_helpers/type2type_vr.dm b/code/_helpers/type2type_vr.dm deleted file mode 100644 index e6df531806..0000000000 --- a/code/_helpers/type2type_vr.dm +++ /dev/null @@ -1,107 +0,0 @@ -/* -// Contains VOREStation type2type functions -// list2text - takes delimiter and returns text -// text2list - takes delimiter, and creates list -// -*/ - -// Concatenates a list of strings into a single string. A seperator may optionally be provided. -/proc/list2text(list/ls, sep) - if (ls.len <= 1) // Early-out code for empty or singleton lists. - return ls.len ? ls[1] : "" - - var/l = ls.len // Made local for sanic speed. - var/i = 0 // Incremented every time a list index is accessed. - - if (sep <> null) - // Macros expand to long argument lists like so: sep, ls[++i], sep, ls[++i], sep, ls[++i], etc... - #define S1 sep, ls[++i] - #define S4 S1, S1, S1, S1 - #define S16 S4, S4, S4, S4 - #define S64 S16, S16, S16, S16 - - . = "[ls[++i]]" // Make sure the initial element is converted to text. - - // Having the small concatenations come before the large ones boosted speed by an average of at least 5%. - if (l-1 & 0x01) // 'i' will always be 1 here. - . = text("[][][]", ., S1) // Append 1 element if the remaining elements are not a multiple of 2. - if (l-i & 0x02) - . = text("[][][][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. - if (l-i & 0x04) - . = text("[][][][][][][][][]", ., S4) // And so on.... - if (l-i & 0x08) - . = text("[][][][][][][][][][][][][][][][][]", ., S4, S4) - if (l-i & 0x10) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16) - if (l-i & 0x20) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) - if (l-i & 0x40) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) - while (l > i) // Chomp through the rest of the list, 128 elements at a time. - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) - - #undef S64 - #undef S16 - #undef S4 - #undef S1 - else - // Macros expand to long argument lists like so: ls[++i], ls[++i], ls[++i], etc... - #define S1 ls[++i] - #define S4 S1, S1, S1, S1 - #define S16 S4, S4, S4, S4 - #define S64 S16, S16, S16, S16 - - . = "[ls[++i]]" // Make sure the initial element is converted to text. - - if (l-1 & 0x01) // 'i' will always be 1 here. - . += S1 // Append 1 element if the remaining elements are not a multiple of 2. - if (l-i & 0x02) - . = text("[][][]", ., S1, S1) // Append 2 elements if the remaining elements are not a multiple of 4. - if (l-i & 0x04) - . = text("[][][][][]", ., S4) // And so on... - if (l-i & 0x08) - . = text("[][][][][][][][][]", ., S4, S4) - if (l-i & 0x10) - . = text("[][][][][][][][][][][][][][][][][]", ., S16) - if (l-i & 0x20) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S16, S16) - if (l-i & 0x40) - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64) - while (l > i) // Chomp through the rest of the list, 128 elements at a time. - . = text("[][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]\ - [][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]", ., S64, S64) - - #undef S64 - #undef S16 - #undef S4 - #undef S1 - -// Converts a string into a list by splitting the string at each delimiter found. (discarding the seperator) -/proc/text2list(text, delimiter="\n") - var/delim_len = length(delimiter) - if (delim_len < 1) - return list(text) - - . = list() - var/last_found = 1 - var/found - - do - found = findtext(text, delimiter, last_found, 0) - . += copytext(text, last_found, found) - last_found = found + delim_len - while (found) diff --git a/code/_helpers/visual_filters.dm b/code/_helpers/visual_filters.dm new file mode 100644 index 0000000000..6cafa5a04d --- /dev/null +++ b/code/_helpers/visual_filters.dm @@ -0,0 +1,36 @@ +// These involve BYOND's built in filters that do visual effects, and not stuff that distinguishes between things. + +// All of this ported from TG. +/atom/movable + var/list/filter_data // For handling persistent filters + +/proc/cmp_filter_data_priority(list/A, list/B) + return A["priority"] - B["priority"] + +/atom/movable/proc/add_filter(filter_name, priority, list/params) + LAZYINITLIST(filter_data) + var/list/p = params.Copy() + p["priority"] = priority + filter_data[filter_name] = p + update_filters() + +/atom/movable/proc/update_filters() + filters = null + filter_data = sortTim(filter_data, /proc/cmp_filter_data_priority, TRUE) + for(var/f in filter_data) + var/list/data = filter_data[f] + var/list/arguments = data.Copy() + arguments -= "priority" + filters += filter(arglist(arguments)) + +/atom/movable/proc/get_filter(filter_name) + if(filter_data && filter_data[filter_name]) + return filters[filter_data.Find(filter_name)] + +// Polaris Extensions +/atom/movable/proc/remove_filter(filter_name) + var/thing = get_filter(filter_name) + if(thing) + LAZYREMOVE(filter_data, filter_name) + filters -= thing + update_filters() \ No newline at end of file diff --git a/code/controllers/subsystems/ticker.dm b/code/controllers/subsystems/ticker.dm index 70ff36fb1b..43431b049c 100644 --- a/code/controllers/subsystems/ticker.dm +++ b/code/controllers/subsystems/ticker.dm @@ -261,6 +261,8 @@ var/global/datum/controller/subsystem/ticker/ticker to_world("An admin has delayed the round end.") end_game_state = END_GAME_DELAYED else if(restart_timeleft <= 0) + to_world("Restarting world!") + sleep(5) world.Reboot() else if (world.time - last_restart_notify >= 1 MINUTE) to_world("Restarting in [round(restart_timeleft/600, 1)] minute\s.") diff --git a/code/datums/autolathe/general.dm b/code/datums/autolathe/general.dm index 40d036300e..c11319972f 100644 --- a/code/datums/autolathe/general.dm +++ b/code/datums/autolathe/general.dm @@ -54,6 +54,10 @@ name = "jar" path =/obj/item/glass_jar +/datum/category_item/autolathe/general/fishtank + name = "fish tank" + path =/obj/item/glass_jar + /datum/category_item/autolathe/general/radio_headset name = "radio headset" path =/obj/item/device/radio/headset diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index 65576a52a7..abc7ade225 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -202,7 +202,9 @@ var/obj/belly/destination_belly = destination.loc var/mob/living/telenommer = destination_belly.owner if(istype(telenommer)) - if(!isliving(teleatom)) + if(istype(teleatom, /obj/machinery) || istype(teleatom, /obj/structure)) + return 0 + else if(!isliving(teleatom)) return 1 else var/mob/living/telemob = teleatom diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 49c481be15..f6f2ddfce8 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -49,6 +49,7 @@ var/sound_env = STANDARD_STATION var/turf/base_turf //The base turf type of the area, which can be used to override the z-level's base turf var/forbid_events = FALSE // If true, random events will not start inside this area. + var/no_spoilers = FALSE // If true, makes it much more difficult to see what is inside an area with things like mesons. /area/Initialize() . = ..() @@ -64,6 +65,8 @@ power_equip = 0 power_environ = 0 power_change() // all machines set to current power level, also updates lighting icon + if(no_spoilers) + set_spoiler_obfuscation(TRUE) return INITIALIZE_HINT_LATELOAD // Changes the area of T to A. Do not do this manually. @@ -367,7 +370,10 @@ var/list/mob/living/forced_ambiance_list = new L.update_floating( L.Check_Dense_Object() ) L.lastarea = newarea + L.lastareachange = world.time play_ambience(L) + if(no_spoilers) + L.disable_spoiler_vision() /area/proc/play_ambience(var/mob/living/L) // Ambience goes down here -- make sure to list each area seperately for ease of adding things in later, thanks! Note: areas adjacent to each other should have the same sounds to prevent cutoff when possible.- LastyScratch @@ -500,4 +506,16 @@ var/list/ghostteleportlocs = list() /area/proc/get_name() if(secret_name) return "Unknown Area" - return name \ No newline at end of file + return name + +GLOBAL_DATUM(spoiler_obfuscation_image, /image) + +/area/proc/set_spoiler_obfuscation(should_obfuscate) + if(!GLOB.spoiler_obfuscation_image) + GLOB.spoiler_obfuscation_image = image(icon = 'icons/misc/static.dmi') + GLOB.spoiler_obfuscation_image.plane = PLANE_MESONS + + if(should_obfuscate) + add_overlay(GLOB.spoiler_obfuscation_image) + else + cut_overlay(GLOB.spoiler_obfuscation_image) \ No newline at end of file diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 09b226a076..bf5fc0ab18 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -19,6 +19,8 @@ var/icon_scale_x = 1 // Used to scale icons up or down horizonally in update_transform(). var/icon_scale_y = 1 // Used to scale icons up or down vertically in update_transform(). var/icon_rotation = 0 // Used to rotate icons in update_transform() + var/icon_expected_height = 32 + var/icon_expected_width = 32 var/old_x = 0 var/old_y = 0 var/datum/riding/riding_datum = null @@ -561,6 +563,14 @@ return null return text2num(pickweight(candidates)) +// Returns the current scaling of the sprite. +// Note this DOES NOT measure the height or width of the icon, but returns what number is being multiplied with to scale the icons, if any. +/atom/movable/proc/get_icon_scale_x() + return icon_scale_x + +/atom/movable/proc/get_icon_scale_y() + return icon_scale_y + /atom/movable/proc/update_transform() var/matrix/M = matrix() M.Scale(icon_scale_x, icon_scale_y) diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index 1914b72f14..8faff2b4e6 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -83,7 +83,7 @@ for(var/mob/living/carbon/M in ohearers(6, T)) if(M.get_ear_protection() >= 2) continue - M.sleeping = 0 + M.SetSleeping(0) M.stuttering += 20 M.ear_deaf += 30 M.Weaken(3) diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 8654df1c24..12f3b28b97 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -162,6 +162,11 @@ else return +/obj/machinery/bodyscanner/tgui_host(mob/user) + if(user == occupant) + return src + return console ? console : src + /obj/machinery/bodyscanner/tgui_interact(mob/user, datum/tgui/ui = null) ui = SStgui.try_update_ui(user, src, ui) if(!ui) diff --git a/code/game/machinery/air_alarm.dm b/code/game/machinery/air_alarm.dm index dc17042f15..3160af3c60 100644 --- a/code/game/machinery/air_alarm.dm +++ b/code/game/machinery/air_alarm.dm @@ -788,3 +788,14 @@ ..() spawn(rand(0,15)) update_icon() + +// VOREStation Edit Start +/obj/machinery/alarm/freezer + target_temperature = T0C - 13.15 // Chilly freezer room + +/obj/machinery/alarm/freezer/first_run() + . = ..() + + TLV["temperature"] = list(T0C - 40, T0C - 20, T0C + 40, T0C + 66) // K, Lower Temperature for Freezer Air Alarms (This is because TLV is hardcoded to be generated on first_run, and therefore the only way to modify this without changing TLV generation) + +// VOREStation Edit End \ No newline at end of file diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index c3041344a0..f83a87c266 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -85,7 +85,10 @@ return if(!occupier) restoring = FALSE - + + if(action) + playsound(src, "terminal_type", 50, 1) + switch(action) if("PRG_beginReconstruction") if(occupier?.health < 100) diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index 0ce27d99bb..070f291ede 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -156,6 +156,7 @@ blocked = 1 var/attackamt = rand(2,6) temp = "You attack for [attackamt] damage!" + playsound(src, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10) if(turtle > 0) turtle-- @@ -168,6 +169,7 @@ var/pointamt = rand(1,3) var/healamt = rand(6,8) temp = "You use [pointamt] magic to heal for [healamt] damage!" + playsound(src, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10) turtle++ sleep(10) @@ -180,6 +182,7 @@ blocked = 1 var/chargeamt = rand(4,7) temp = "You regain [chargeamt] points" + playsound(src, 'sound/arcade/mana.ogg', 50, 1, extrarange = -3, falloff = 10) player_mp += chargeamt if(turtle > 0) turtle-- @@ -210,6 +213,7 @@ if(!gameover) gameover = 1 temp = "[enemy_name] has fallen! Rejoice!" + playsound(src, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) feedback_inc("arcade_win_emagged") @@ -230,11 +234,13 @@ else if (emagged && (turtle >= 4)) var/boomamt = rand(5,10) enemy_action = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!" + playsound(src, 'sound/arcade/boom.ogg', 50, 1, extrarange = -3, falloff = 10) player_hp -= boomamt else if ((enemy_mp <= 5) && (prob(70))) var/stealamt = rand(2,3) enemy_action = "[enemy_name] steals [stealamt] of your power!" + playsound(src, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 10) player_mp -= stealamt if (player_mp <= 0) @@ -249,17 +255,20 @@ else if ((enemy_hp <= 10) && (enemy_mp > 4)) enemy_action = "[enemy_name] heals for 4 health!" + playsound(src, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10) enemy_hp += 4 enemy_mp -= 4 else var/attackamt = rand(3,6) enemy_action = "[enemy_name] attacks for [attackamt] damage!" + playsound(src, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10) player_hp -= attackamt if ((player_mp <= 0) || (player_hp <= 0)) gameover = 1 temp = "You have been crushed! GAME OVER" + playsound(src, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10) if(emagged) feedback_inc("arcade_loss_hp_emagged") usr.gib() @@ -393,6 +402,7 @@ user.set_machine(src) var/dat = "" if(gameStatus == ORION_STATUS_GAMEOVER) + playsound(src, 'sound/arcade/Ori_fail.ogg', 50, 1, extrarange = -3, falloff = 10) dat = "