From 51a96cb43e53df2482242531ab426dd38ae9afb2 Mon Sep 17 00:00:00 2001
From: Fluffy <65877598+FluffyGhoster@users.noreply.github.com>
Date: Sun, 24 Dec 2023 12:18:41 +0100
Subject: [PATCH] sfad (#18021)
---
code/game/machinery/iv_drip.dm | 2 +-
code/game/objects/items/airbubble.dm | 10 ++--
code/game/objects/items/devices/geiger.dm | 2 +-
.../objects/items/devices/magnetic_lock.dm | 8 ++--
code/game/objects/items/weapons/autopsy.dm | 2 +-
.../items/weapons/material/twohanded.dm | 6 +--
code/game/objects/items/weapons/traps.dm | 7 +--
code/modules/admin/admin.dm | 2 +-
code/modules/admin/verbs/playsound.dm | 2 +-
code/modules/heavy_vehicle/mech_damage.dm | 4 +-
code/modules/mining/machine_processing.dm | 2 +-
code/modules/multiz/movement.dm | 20 ++++----
.../overmap/contacts/contact_sensors.dm | 6 +--
.../overmap/ships/computers/sensors.dm | 4 +-
code/modules/paperwork/faxmachine.dm | 2 +-
code/modules/shuttles/shuttle_lift.dm | 2 +-
code/modules/turbolift/turbolift.dm | 2 +-
.../fluffyghost-staticsoundfilepaths.yml | 43 ++++++++++++++++++
sound/machines/dotprinter.ogg | Bin 0 -> 52339 bytes
19 files changed, 88 insertions(+), 38 deletions(-)
create mode 100644 html/changelogs/fluffyghost-staticsoundfilepaths.yml
create mode 100644 sound/machines/dotprinter.ogg
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 8cc2effbea6..2c44ff35b41 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -448,7 +448,7 @@
user.visible_message(
SPAN_NOTICE("[user] [is_loose ? "tightens" : "loosens"] the nuts on [src]."),
SPAN_NOTICE("You [is_loose ? "tighten" : "loosen"] the nuts on [src], [is_loose ? "securing \the [tank]" : "allowing \the [tank] to be removed"]."))
- playsound(src.loc, "sound/items/wrench.ogg", 50, 1)
+ playsound(src.loc, 'sound/items/wrench.ogg', 50, 1)
is_loose = !is_loose
return TRUE
if(default_deconstruction_screwdriver(user, W))
diff --git a/code/game/objects/items/airbubble.dm b/code/game/objects/items/airbubble.dm
index 421874d6f7d..5945dcc210b 100644
--- a/code/game/objects/items/airbubble.dm
+++ b/code/game/objects/items/airbubble.dm
@@ -246,7 +246,8 @@
return FALSE
if ((world.time - last_shake) > 5 SECONDS)
- playsound(loc, "sound/items/[pick("rip1","rip2")].ogg", 100, 1)
+ var/sound_to_play = pick(list('sound/items/rip1.ogg', 'sound/items/rip2.ogg'))
+ playsound(loc, sound_to_play, 100, 1)
shake_animation()
last_shake = world.time
@@ -275,7 +276,8 @@
breakout = FALSE
to_chat(escapee, "You successfully break out! Tearing the bubble's walls!") // holy shit this is hilarious
visible_message("\the [escapee] successfully broke out of \the [src]! Tearing the bubble's walls!")
- playsound(loc, "sound/items/[pick("rip1","rip2")].ogg", 100, 1)
+ var/sound_to_play = pick(list('sound/items/rip1.ogg', 'sound/items/rip2.ogg'))
+ playsound(loc, sound_to_play, 100, 1)
break_open()
shake_animation()
desc += " It has hole in it! Maybe you shouldn't use it!"
@@ -513,11 +515,11 @@
STOP_PROCESSING(SSfast_process, src)
use_internal_tank = !use_internal_tank
visible_message("You hear last bits of air coming out from [src]'s hole.Maybe the tank run out of air?")
- playsound(loc, "sound/effects/wind/wind_2_1.ogg", 100, 1)
+ playsound(loc, 'sound/effects/wind/wind_2_1.ogg', 100, 1)
return
inside_air = get_turf_air()
visible_message("You hear air howling from [src]'s hole. Maybe it is good to shut off valve on the internals tank?")
- playsound(loc, "sound/effects/wind/wind_2_2.ogg", 100, 1)
+ playsound(loc, 'sound/effects/wind/wind_2_2.ogg', 100, 1)
var/transfer_moles = inside_air.volume/(inside_air.temperature * R_IDEAL_GAS_EQUATION)
var/datum/gas_mixture/removed = tank_air.remove(transfer_moles)
diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm
index 3d7ddae7809..9014a0b7f91 100644
--- a/code/game/objects/items/devices/geiger.dm
+++ b/code/game/objects/items/devices/geiger.dm
@@ -18,7 +18,7 @@
/obj/item/device/geiger/proc/update_sound(playing)
if(playing && !sound_token)
- sound_token = sound_player.PlayLoopingSound(src, sound_id, "sound/items/geiger.ogg", volume = geiger_volume, range = 4, falloff = 3, prefer_mute = TRUE)
+ sound_token = sound_player.PlayLoopingSound(src, sound_id, 'sound/items/geiger.ogg', volume = geiger_volume, range = 4, falloff = 3, prefer_mute = TRUE)
else if(!playing && sound_token)
QDEL_NULL(sound_token)
diff --git a/code/game/objects/items/devices/magnetic_lock.dm b/code/game/objects/items/devices/magnetic_lock.dm
index e979960da41..d4932e88fd8 100644
--- a/code/game/objects/items/devices/magnetic_lock.dm
+++ b/code/game/objects/items/devices/magnetic_lock.dm
@@ -138,11 +138,13 @@
if (I.force >= 18)
user.visible_message("[user] bashes [src] with [I]!", "You strike [src] with [I], damaging it!")
takedamage(I.force)
- playsound(loc, "sound/weapons/genhit[rand(1,3)].ogg", I.force*3, 1)
- addtimer(CALLBACK(GLOBAL_PROC, /proc/playsound, loc, "sound/effects/sparks[rand(1,4)].ogg", 30, 1), 3, TIMER_CLIENT_TIME)
+ var/sound_to_play = pick(list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))
+ playsound(loc, sound_to_play, I.force*3, 1)
+ sound_to_play = pick(list('sound/effects/sparks1.ogg', 'sound/effects/sparks2.ogg', 'sound/effects/sparks3.ogg', 'sound/effects/sparks4.ogg'))
+ addtimer(CALLBACK(GLOBAL_PROC, /proc/playsound, loc, sound_to_play, 30, 1), 3, TIMER_CLIENT_TIME)
else
user.visible_message("[user] hits [src] with [I] but fails to damage it.", "You hit [src] with [I], [I.force >= 10 ? "and it almost makes a dent!" : "but it appears to have no visible effect."]")
- playsound(loc, "sound/weapons/Genhit.ogg", I.force*2.5, 1)
+ playsound(loc, 'sound/weapons/Genhit.ogg', I.force*2.5, 1)
return TRUE
if(invincible)
diff --git a/code/game/objects/items/weapons/autopsy.dm b/code/game/objects/items/weapons/autopsy.dm
index 7b32f923ce0..94720efb7d2 100644
--- a/code/game/objects/items/weapons/autopsy.dm
+++ b/code/game/objects/items/weapons/autopsy.dm
@@ -140,7 +140,7 @@
for(var/mob/O in viewers(usr))
O.show_message(SPAN_NOTICE("\The [src] rattles and prints out a sheet of paper."), 1)
- playsound(loc, "sound/bureaucracy/print_short.ogg", 50, 1)
+ playsound(loc, 'sound/bureaucracy/print_short.ogg', 50, 1)
sleep(10)
diff --git a/code/game/objects/items/weapons/material/twohanded.dm b/code/game/objects/items/weapons/material/twohanded.dm
index f9bcf7ba8ea..e249075c43d 100644
--- a/code/game/objects/items/weapons/material/twohanded.dm
+++ b/code/game/objects/items/weapons/material/twohanded.dm
@@ -405,7 +405,7 @@
/obj/item/material/twohanded/chainsaw/proc/PowerUp()
var/turf/T = get_turf(src)
T.audible_message(SPAN_NOTICE("\The [src] rumbles to life."))
- playsound(src, "sound/weapons/chainsawstart.ogg", 25, 0, 30)
+ playsound(src, 'sound/weapons/saw/chainsawstart.ogg', 25, 0, 30)
force_unwielded = 30
force = force_unwielded
force_wielded = 60
@@ -482,7 +482,7 @@
/obj/item/material/twohanded/chainsaw/attack(mob/M as mob, mob/living/user as mob)
. = ..()
if(powered)
- playsound(loc, "sound/weapons/saw/chainsword.ogg", 25, 0, 30)
+ playsound(loc, 'sound/weapons/saw/chainsword.ogg', 25, 0, 30)
RemoveFuel(3)
/obj/item/material/twohanded/chainsaw/afterattack(obj/O as obj, mob/user as mob, proximity)
@@ -496,7 +496,7 @@
if(!istype(O))
user.visible_message(SPAN_DANGER("[user] revs the chainsaw!"), SPAN_WARNING("You rev the chainsaw!"), SPAN_WARNING("You hear a chainsaw rev!"))
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- playsound(loc, "sound/weapons/saw/chainsword.ogg", 25, 0, 30)
+ playsound(loc, 'sound/weapons/saw/chainsword.ogg', 25, 0, 30)
RemoveFuel(3)
. = ..()
diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm
index 929fbd88f44..73b1a11b4b4 100644
--- a/code/game/objects/items/weapons/traps.dm
+++ b/code/game/objects/items/weapons/traps.dm
@@ -247,7 +247,7 @@
return FALSE
if ((world.time - last_shake) > 5 SECONDS)
- playsound(loc, "sound/effects/grillehit.ogg", 100, 1)
+ playsound(loc, 'sound/effects/grillehit.ogg', 100, 1)
shake_animation()
last_shake = world.time
@@ -273,7 +273,7 @@
breakout = FALSE
to_chat(escapee, "You successfully break out!")
visible_message("\The [escapee] successfully breaks out of \the [src]!")
- playsound(loc, "sound/effects/grillehit.ogg", 100, 1)
+ playsound(loc, 'sound/effects/grillehit.ogg', 100, 1)
release()
@@ -419,7 +419,8 @@
user.visible_message("[user] is trying to [anchored ? "un" : "" ]secure \the [src]!",
"You are trying to [anchored ? "un" : "" ]secure \the [src]!")
- playsound(src.loc, "sound/items/[pick("Screwdriver", "Screwdriver2")].ogg", 50, 1)
+ var/sound_to_play = pick(list('sound/items/Screwdriver.ogg', 'sound/items/Screwdriver2.ogg'))
+ playsound(src.loc, sound_to_play, 50, 1)
if(W.use_tool(src, user, 30, volume = 50))
density = !density
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 37388bda5b2..a09c6565919 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -1356,7 +1356,7 @@ var/global/enabled_spooking = 0
message = sanitize(message, 500, extra = 0)
- var/list/sounds = file2list("sound/serversound_list.txt");
+ var/list/sounds = file2list('sound/serversound_list.txt');
sounds += "--CANCEL--"
sounds += "--LOCAL--"
sounds += sounds_cache
diff --git a/code/modules/admin/verbs/playsound.dm b/code/modules/admin/verbs/playsound.dm
index 5ac57624d7b..c37e0db4fa4 100644
--- a/code/modules/admin/verbs/playsound.dm
+++ b/code/modules/admin/verbs/playsound.dm
@@ -37,7 +37,7 @@ var/list/sounds_cache = list()
set name = "Play Server Sound"
if(!check_rights(R_SOUNDS)) return
- var/list/sounds = file2list("sound/serversound_list.txt");
+ var/list/sounds = file2list('sound/serversound_list.txt');
sounds += "--CANCEL--"
sounds += sounds_cache
diff --git a/code/modules/heavy_vehicle/mech_damage.dm b/code/modules/heavy_vehicle/mech_damage.dm
index a766f18a280..3704c63f41f 100644
--- a/code/modules/heavy_vehicle/mech_damage.dm
+++ b/code/modules/heavy_vehicle/mech_damage.dm
@@ -144,8 +144,8 @@
apply_damage(damage, DAMAGE_BRUTE, BP_L_LEG) // can target any leg, it will be changed to the proper component
- playsound(loc, "sound/effects/bang.ogg", 100, 1)
- playsound(loc, "sound/effects/bamf.ogg", 100, 1)
+ playsound(loc, 'sound/effects/bang.ogg', 100, 1)
+ playsound(loc, 'sound/effects/bamf.ogg', 100, 1)
return TRUE
/mob/living/heavy_vehicle/get_bullet_impact_effect_type(var/def_zone)
diff --git a/code/modules/mining/machine_processing.dm b/code/modules/mining/machine_processing.dm
index 5145a78e258..838eb83cad0 100644
--- a/code/modules/mining/machine_processing.dm
+++ b/code/modules/mining/machine_processing.dm
@@ -248,7 +248,7 @@
P.stamps += "
This paper has been stamped by the SCC Ore Processing System."
user.visible_message("\The [src] rattles and prints out a sheet of paper.")
- playsound(get_turf(src), "sound/bureaucracy/print_short.ogg", 50, 1)
+ playsound(get_turf(src), 'sound/bureaucracy/print_short.ogg', 50, 1)
// reset
output_mats = list()
diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm
index 0391b36fca3..b1e6ee786b7 100644
--- a/code/modules/multiz/movement.dm
+++ b/code/modules/multiz/movement.dm
@@ -471,15 +471,16 @@
if(!isSynthetic())
switch(damage)
if(-INFINITY to 10)
- playsound(src.loc, "sound/weapons/bladeslice.ogg", 50, 1)
+ playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1)
if(11 to 50)
- playsound(src.loc, "sound/weapons/punch[rand(1, 4)].ogg", 75, 1)
+ var/sound_to_play = pick(list('sound/weapons/punch1.ogg', 'sound/weapons/punch2.ogg', 'sound/weapons/punch3.ogg', 'sound/weapons/punch4.ogg'))
+ playsound(src.loc, sound_to_play, 75, 1)
if(51 to INFINITY)
- playsound(src.loc, "sound/weapons/heavysmash.ogg", 100, 1)
+ playsound(src.loc, 'sound/weapons/heavysmash.ogg', 100, 1)
else
playsound(src.loc, /singleton/sound_category/swing_hit_sound, 75, 1)
else
- playsound(src.loc, "sound/weapons/smash.ogg", 75, 1)
+ playsound(src.loc, 'sound/weapons/smash.ogg', 75, 1)
return TRUE
@@ -631,15 +632,15 @@
if(!isSynthetic())
switch(damage)
if(-INFINITY to 10)
- playsound(src.loc, "sound/weapons/bladeslice.ogg", 50, 1)
+ playsound(src.loc, 'sound/weapons/bladeslice.ogg', 50, 1)
if(11 to 50)
playsound(src.loc, /singleton/sound_category/punch_sound, 75, 1)
if(51 to INFINITY)
- playsound(src.loc, "sound/weapons/heavysmash.ogg", 100, 1)
+ playsound(src.loc, 'sound/weapons/heavysmash.ogg', 100, 1)
else
playsound(src.loc, /singleton/sound_category/swing_hit_sound, 75, 1)
else
- playsound(src.loc, "sound/weapons/smash.ogg", 75, 1)
+ playsound(src.loc, 'sound/weapons/smash.ogg', 75, 1)
// Stats.
SSstatistics.IncrementSimpleStat("openturf_human_falls")
@@ -667,7 +668,7 @@
health -= (damage * brute_dam_coeff)
- playsound(loc, "sound/effects/clang.ogg", 75, 1)
+ playsound(loc, 'sound/effects/clang.ogg', 75, 1)
/**
* Used to handle damage dealing for objects post fall. Why is it separated from
@@ -744,7 +745,8 @@
else
admin_attack_log((ismob(src) ? src : null), L, "fell onto", "was fallen on by", "fell ontop of")
- playsound(L.loc, "sound/waepons/genhit[rand(1, 3)].ogg", 75, 1)
+ var/sound_to_play = pick(list('sound/weapons/genhit1.ogg', 'sound/weapons/genhit2.ogg', 'sound/weapons/genhit3.ogg'))
+ playsound(L.loc, sound_to_play, 75, 1)
return L
diff --git a/code/modules/overmap/contacts/contact_sensors.dm b/code/modules/overmap/contacts/contact_sensors.dm
index 16c24714528..98d2ea04064 100644
--- a/code/modules/overmap/contacts/contact_sensors.dm
+++ b/code/modules/overmap/contacts/contact_sensors.dm
@@ -128,7 +128,7 @@
QDEL_IN(record, 2 SECOND) // Need to restart the search if you've lost contact with the object.
if(contact.scannable) // Scannable objects are the only ones that give off notifications to prevent spam
visible_message(SPAN_NOTICE("\The [src] states, \"Contact lost with [record.name].\""))
- playsound(loc, "sound/machines/sensors/contact_lost.ogg", 30, 1)
+ playsound(loc, 'sound/machines/sensors/contact_lost.ogg', 30, 1)
objects_in_view -= contact
continue
@@ -152,12 +152,12 @@
objects_in_view[contact] += round(sensors.sensor_strength**2)
if(!muted)
visible_message(SPAN_NOTICE("\The [src] states, \"Contact '[contact.unknown_id]' tracing [objects_in_view[contact]]% complete, bearing [bearing_estimate], error +/- [bearing_variability].\""))
- playsound(loc, "sound/machines/sensors/contactgeneric.ogg", 10, 1) //Let players know there's something nearby.
+ playsound(loc, 'sound/machines/sensors/contactgeneric.ogg', 10, 1) //Let players know there's something nearby.
if(objects_in_view[contact] >= 100) // Identification complete.
record = new /datum/overmap_contact(src, contact)
contact_datums[contact] = record
if(contact.scannable)
- playsound(loc, "sound/machines/sensors/newcontact.ogg", 30, 1)
+ playsound(loc, 'sound/machines/sensors/newcontact.ogg', 30, 1)
visible_message(SPAN_NOTICE("\The [src] states, \"New contact identified, designation [record.name], bearing [bearing].\""))
record.show()
animate(record.marker, alpha=255, 2 SECOND, 1, LINEAR_EASING)
diff --git a/code/modules/overmap/ships/computers/sensors.dm b/code/modules/overmap/ships/computers/sensors.dm
index 9664ab64e3f..77d37b1ca82 100644
--- a/code/modules/overmap/ships/computers/sensors.dm
+++ b/code/modules/overmap/ships/computers/sensors.dm
@@ -313,7 +313,7 @@
contact_details = null
if("print")
if(contact_details)
- playsound(loc, "sound/machines/dotprinter.ogg", 30, 1)
+ playsound(loc, 'sound/machines/dotprinter.ogg', 30, 1)
new/obj/item/paper/(get_turf(src), contact_details, "paper (Sensor Scan - [contact_name])")
return TRUE
@@ -321,7 +321,7 @@
var/obj/effect/overmap/O = locate(params["scan"])
if(istype(O) && !QDELETED(O))
if((O in view(7,linked))|| (O in contact_datums))
- playsound(loc, "sound/machines/dotprinter.ogg", 30, 1)
+ playsound(loc, 'sound/machines/dotprinter.ogg', 30, 1)
LAZYSET(last_scan, "data", O.get_scan_data(usr))
LAZYSET(last_scan, "location", "[O.x],[O.y]")
LAZYSET(last_scan, "name", "[O]")
diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm
index df0d9cde64d..594e7aaf669 100644
--- a/code/modules/paperwork/faxmachine.dm
+++ b/code/modules/paperwork/faxmachine.dm
@@ -226,7 +226,7 @@ var/list/admin_departments
if (!istype(incoming, /obj/item/paper) && !istype(incoming, /obj/item/photo) && !istype(incoming, /obj/item/paper_bundle))
return 0
- playsound(loc, "sound/bureaucracy/print.ogg", 75, 1)
+ playsound(loc, 'sound/bureaucracy/print.ogg', 75, 1)
// give the sprite some time to flick
spawn(20)
diff --git a/code/modules/shuttles/shuttle_lift.dm b/code/modules/shuttles/shuttle_lift.dm
index 12763cba299..276bbb195dd 100644
--- a/code/modules/shuttles/shuttle_lift.dm
+++ b/code/modules/shuttles/shuttle_lift.dm
@@ -24,7 +24,7 @@
if(!obstruction_check(start_location, destination))
if(assigned_controller)
assigned_controller.audible_message("\The [assigned_controller] buzzes loudly: Obstruction detected!")
- playsound(assigned_controller.loc, "sound/machines/buzz-two.ogg", 50, 1)
+ playsound(assigned_controller.loc, 'sound/machines/buzz-two.ogg', 50, 1)
return FALSE
..()
diff --git a/code/modules/turbolift/turbolift.dm b/code/modules/turbolift/turbolift.dm
index e9eed1566f6..b86f1027987 100644
--- a/code/modules/turbolift/turbolift.dm
+++ b/code/modules/turbolift/turbolift.dm
@@ -61,7 +61,7 @@
doors_closing = 0
open_doors()
control_panel_interior.audible_message("\The [current_floor.ext_panel] buzzes loudly.")
- playsound(control_panel_interior.loc, "sound/machines/buzz-two.ogg", 50, 1)
+ playsound(control_panel_interior.loc, 'sound/machines/buzz-two.ogg', 50, 1)
return 0
doors_closing = 0 // The doors weren't open, so they are done closing
diff --git a/html/changelogs/fluffyghost-staticsoundfilepaths.yml b/html/changelogs/fluffyghost-staticsoundfilepaths.yml
new file mode 100644
index 00000000000..f9511e6621d
--- /dev/null
+++ b/html/changelogs/fluffyghost-staticsoundfilepaths.yml
@@ -0,0 +1,43 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: FluffyGhost
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - backend: "Moved all filepaths for sounds to static links, with single quotes instead of doubles."
+ - bugfix: "Repathed wrong chainsaw sounds to the correct path."
+ - soundadd: "Added a missed sound that was forgotten when porting the overmap sensors, from Nebula."
diff --git a/sound/machines/dotprinter.ogg b/sound/machines/dotprinter.ogg
new file mode 100644
index 0000000000000000000000000000000000000000..6ab9cd9421af2647d77c030aa1886c19c68cb940
GIT binary patch
literal 52339
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