diff --git a/code/_macros.dm b/code/_macros.dm
index 13afdb27b8..e6c6e10636 100644
--- a/code/_macros.dm
+++ b/code/_macros.dm
@@ -62,6 +62,11 @@
#define to_file(file_entry, source_var) file_entry << source_var
#define from_file(file_entry, target_var) file_entry >> target_var
+// From TG, might be useful to have.
+// Didn't port SEND_TEXT() since to_chat() appears to serve the same purpose.
+#define DIRECT_OUTPUT(A, B) A << B
+#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image)
+#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound)
#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE)
diff --git a/code/datums/callback.dm b/code/datums/callback.dm
index a92a715ece..74d5719ce2 100644
--- a/code/datums/callback.dm
+++ b/code/datums/callback.dm
@@ -166,7 +166,7 @@
// Use sparingly
/world/proc/PushUsr(mob/M, datum/callback/CB)
var/temp = usr
- testing("PushUsr() in use")
+// testing("PushUsr() in use")
usr = M
. = CB.Invoke()
usr = temp
diff --git a/code/datums/looping_sounds/item_sounds.dm b/code/datums/looping_sounds/item_sounds.dm
new file mode 100644
index 0000000000..2cdc54adf4
--- /dev/null
+++ b/code/datums/looping_sounds/item_sounds.dm
@@ -0,0 +1,37 @@
+#define RAD_GEIGER_LOW 0.1 // Geiger counter sound thresholds
+#define RAD_GEIGER_MEDIUM 10
+#define RAD_GEIGER_HIGH 25
+
+/datum/looping_sound/geiger
+ mid_sounds = list(
+ list('sound/items/geiger/new/low1.ogg'=1, 'sound/items/geiger/new/low2.ogg'=1, 'sound/items/geiger/new/low3.ogg'=1, 'sound/items/geiger/new/low4.ogg'=1),
+ list('sound/items/geiger/new/med1.ogg'=1, 'sound/items/geiger/new/med2.ogg'=1, 'sound/items/geiger/new/med3.ogg'=1, 'sound/items/geiger/new/med4.ogg'=1),
+ list('sound/items/geiger/new/high1.ogg'=1, 'sound/items/geiger/new/high2.ogg'=1, 'sound/items/geiger/new/high3.ogg'=1, 'sound/items/geiger/new/high4.ogg'=1),
+ list('sound/items/geiger/new/ext1.ogg'=1, 'sound/items/geiger/new/ext2.ogg'=1, 'sound/items/geiger/new/ext3.ogg'=1, 'sound/items/geiger/new/ext4.ogg'=1)
+ )
+ mid_length = 1 SECOND
+ volume = 25
+ var/last_radiation
+
+/datum/looping_sound/geiger/get_sound(starttime)
+ var/danger
+ switch(last_radiation)
+ if(0 to RAD_GEIGER_LOW)
+ danger = 1
+ if(RAD_GEIGER_LOW to RAD_GEIGER_MEDIUM)
+ danger = 2
+ if(RAD_GEIGER_MEDIUM to RAD_GEIGER_HIGH)
+ danger = 3
+ if(RAD_GEIGER_HIGH to INFINITY)
+ danger = 4
+ else
+ return null
+ return ..(starttime, mid_sounds[danger])
+
+/datum/looping_sound/geiger/stop()
+ . = ..()
+ last_radiation = 0
+
+#undef RAD_GEIGER_LOW
+#undef RAD_GEIGER_MEDIUM
+#undef RAD_GEIGER_HIGH
\ No newline at end of file
diff --git a/code/datums/looping_sounds/looping_sound.dm b/code/datums/looping_sounds/looping_sound.dm
new file mode 100644
index 0000000000..9c8c3fc8b4
--- /dev/null
+++ b/code/datums/looping_sounds/looping_sound.dm
@@ -0,0 +1,105 @@
+/*
+ output_atoms (list of atoms) The destination(s) for the sounds
+
+ mid_sounds (list or soundfile) Since this can be either a list or a single soundfile you can have random sounds. May contain further lists but must contain a soundfile at the end.
+ mid_length (num) The length to wait between playing mid_sounds
+
+ start_sound (soundfile) Played before starting the mid_sounds loop
+ start_length (num) How long to wait before starting the main loop after playing start_sound
+
+ end_sound (soundfile) The sound played after the main loop has concluded
+
+ chance (num) Chance per loop to play a mid_sound
+ volume (num) Sound output volume
+ muted (bool) Private. Used to stop the sound loop.
+ max_loops (num) The max amount of loops to run for.
+ direct (bool) If true plays directly to provided atoms instead of from them
+ opacity_check (bool) If true, things behind walls/opaque things won't hear the sounds.
+*/
+/datum/looping_sound
+ var/list/atom/output_atoms
+ var/mid_sounds
+ var/mid_length
+ var/start_sound
+ var/start_length
+ var/end_sound
+ var/chance
+ var/volume = 100
+ var/max_loops
+ var/direct
+ var/opacity_check
+
+ var/timerid
+
+/datum/looping_sound/New(list/_output_atoms=list(), start_immediately=FALSE, _direct=FALSE)
+ if(!mid_sounds)
+ WARNING("A looping sound datum was created without sounds to play.")
+ return
+
+ output_atoms = _output_atoms
+ direct = _direct
+
+ if(start_immediately)
+ start()
+
+/datum/looping_sound/Destroy()
+ stop()
+ output_atoms = null
+ return ..()
+
+/datum/looping_sound/proc/start(atom/add_thing)
+ if(add_thing)
+ output_atoms |= add_thing
+ if(timerid)
+ return
+ on_start()
+
+/datum/looping_sound/proc/stop(atom/remove_thing)
+ if(remove_thing)
+ output_atoms -= remove_thing
+ if(!timerid)
+ return
+ on_stop()
+ deltimer(timerid)
+ timerid = null
+
+/datum/looping_sound/proc/sound_loop(starttime)
+ if(max_loops && world.time >= starttime + mid_length * max_loops)
+ stop()
+ return
+ if(!chance || prob(chance))
+ play(get_sound(starttime))
+ if(!timerid)
+ timerid = addtimer(CALLBACK(src, .proc/sound_loop, world.time), mid_length, TIMER_STOPPABLE | TIMER_LOOP)
+
+/datum/looping_sound/proc/play(soundfile)
+ var/list/atoms_cache = output_atoms
+ var/sound/S = sound(soundfile)
+ if(direct)
+ S.channel = open_sound_channel()
+ S.volume = volume
+ for(var/i in 1 to atoms_cache.len)
+ var/atom/thing = atoms_cache[i]
+ if(direct)
+ SEND_SOUND(thing, S)
+ else
+ playsound(thing, S, volume, ignore_walls = !opacity_check)
+
+/datum/looping_sound/proc/get_sound(starttime, _mid_sounds)
+ if(!_mid_sounds)
+ . = mid_sounds
+ else
+ . = _mid_sounds
+ while(!isfile(.) && !isnull(.))
+ . = pickweight(.)
+
+/datum/looping_sound/proc/on_start()
+ var/start_wait = 0
+ if(start_sound)
+ play(start_sound)
+ start_wait = start_length
+ addtimer(CALLBACK(src, .proc/sound_loop), start_wait)
+
+/datum/looping_sound/proc/on_stop()
+ if(end_sound)
+ play(end_sound)
\ No newline at end of file
diff --git a/code/datums/looping_sounds/machinery_sounds.dm b/code/datums/looping_sounds/machinery_sounds.dm
new file mode 100644
index 0000000000..7129b305c9
--- /dev/null
+++ b/code/datums/looping_sounds/machinery_sounds.dm
@@ -0,0 +1,45 @@
+/datum/looping_sound/showering
+ start_sound = 'sound/machines/shower/shower_start.ogg'
+ start_length = 2
+ mid_sounds = list('sound/machines/shower/shower_mid1.ogg'=1,'sound/machines/shower/shower_mid2.ogg'=1,'sound/machines/shower/shower_mid3.ogg'=1)
+ mid_length = 10
+ end_sound = 'sound/machines/shower/shower_end.ogg'
+ volume = 20
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/supermatter
+ mid_sounds = list('sound/machines/sm/supermatter1.ogg'=1,'sound/machines/sm/supermatter2.ogg'=1,'sound/machines/sm/supermatter3.ogg'=1)
+ mid_length = 10
+ volume = 1
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/generator
+ start_sound = 'sound/machines/generator/generator_start.ogg'
+ start_length = 4
+ mid_sounds = list('sound/machines/generator/generator_mid1.ogg'=1, 'sound/machines/generator/generator_mid2.ogg'=1, 'sound/machines/generator/generator_mid3.ogg'=1)
+ mid_length = 4
+ end_sound = 'sound/machines/generator/generator_end.ogg'
+ volume = 40
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+
+/datum/looping_sound/deep_fryer
+ start_sound = 'sound/machines/fryer/deep_fryer_immerse.ogg' //my immersions
+ start_length = 10
+ mid_sounds = list('sound/machines/fryer/deep_fryer_1.ogg' = 1, 'sound/machines/fryer/deep_fryer_2.ogg' = 1)
+ mid_length = 2
+ end_sound = 'sound/machines/fryer/deep_fryer_emerge.ogg'
+ volume = 15
+
+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/datum/looping_sound/microwave
+ start_sound = 'sound/machines/microwave/microwave-start.ogg'
+ start_length = 10
+ mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
+ mid_length = 10
+ end_sound = 'sound/machines/microwave/microwave-end.ogg'
+ volume = 90
\ No newline at end of file
diff --git a/code/game/objects/items/devices/geiger.dm b/code/game/objects/items/devices/geiger.dm
index 9ab63afce7..2096b436dd 100644
--- a/code/game/objects/items/devices/geiger.dm
+++ b/code/game/objects/items/devices/geiger.dm
@@ -15,12 +15,16 @@
w_class = ITEMSIZE_SMALL
var/scanning = 0
var/radiation_count = 0
+ var/datum/looping_sound/generator/soundloop
-/obj/item/device/geiger/New()
+/obj/item/device/geiger/Initialize()
START_PROCESSING(SSobj, src)
+ soundloop = new(list(src), FALSE)
+ return ..()
/obj/item/device/geiger/Destroy()
STOP_PROCESSING(SSobj, src)
+ QDEL_NULL(soundloop)
return ..()
/obj/item/device/geiger/process()
@@ -44,15 +48,20 @@
if(amount > radiation_count)
radiation_count = amount
- var/sound = "geiger"
- if(amount < 5)
- sound = "geiger_weak"
- playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
- if(sound == "geiger_weak") // A weak geiger sound every two seconds sounds too infrequent.
- spawn(1 SECOND)
- playsound(src, sound, between(10, 10 + (radiation_count * 4), 100), 0)
+ update_sound()
update_icon()
+/obj/item/device/geiger/proc/update_sound()
+ var/datum/looping_sound/geiger/loop = soundloop
+ if(!scanning)
+ loop.stop()
+ return
+ if(!radiation_count)
+ loop.stop()
+ return
+ loop.last_radiation = radiation_count
+ loop.start()
+
/obj/item/device/geiger/attack_self(var/mob/user)
scanning = !scanning
update_icon()
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index ff95dd44d8..464cf08f7d 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -131,10 +131,16 @@
var/watertemp = "normal" //freezing, normal, or boiling
var/is_washing = 0
var/list/temperature_settings = list("normal" = 310, "boiling" = T0C+100, "freezing" = T0C)
+ var/datum/looping_sound/showering/soundloop
-/obj/machinery/shower/New()
- ..()
+/obj/machinery/shower/Initialize()
create_reagents(50)
+ soundloop = new(list(src), FALSE)
+ return ..()
+
+/obj/machinery/shower/Destroy()
+ QDEL_NULL(soundloop)
+ return ..()
//add heat controls? when emagged, you can freeze to death in it?
@@ -151,11 +157,14 @@
on = !on
update_icon()
if(on)
+ soundloop.start()
if (M.loc == loc)
wash(M)
process_heat(M)
for (var/atom/movable/G in src.loc)
G.clean_blood()
+ else
+ soundloop.stop()
/obj/machinery/shower/attackby(obj/item/I as obj, mob/user as mob)
if(I.type == /obj/item/device/analyzer)
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 0741b0338f..eb385c696d 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -128,8 +128,8 @@
if ("fracture") soundin = pick('sound/effects/bonebreak1.ogg','sound/effects/bonebreak2.ogg','sound/effects/bonebreak3.ogg','sound/effects/bonebreak4.ogg')
if ("canopen") soundin = pick('sound/effects/can_open1.ogg','sound/effects/can_open2.ogg','sound/effects/can_open3.ogg','sound/effects/can_open4.ogg')
if ("mechstep") soundin = pick('sound/mecha/mechstep1.ogg', 'sound/mecha/mechstep2.ogg')
- if ("geiger") soundin = pick('sound/items/geiger1.ogg', 'sound/items/geiger2.ogg', 'sound/items/geiger3.ogg', 'sound/items/geiger4.ogg', 'sound/items/geiger5.ogg')
- if ("geiger_weak") soundin = pick('sound/items/geiger_weak1.ogg', 'sound/items/geiger_weak2.ogg', 'sound/items/geiger_weak3.ogg', 'sound/items/geiger_weak4.ogg')
+ if ("geiger") soundin = pick('sound/items/geiger/old/geiger1.ogg', 'sound/items/geiger/old/geiger2.ogg', 'sound/items/geiger/old/geiger3.ogg', 'sound/items/geiger/old/geiger4.ogg', 'sound/items/geiger/old/geiger5.ogg')
+ if ("geiger_weak") soundin = pick('sound/items/geiger/old/geiger_weak1.ogg', 'sound/items/geiger/old/geiger_weak2.ogg', 'sound/items/geiger/old/geiger_weak3.ogg', 'sound/items/geiger/old/geiger_weak4.ogg')
if ("thunder") soundin = pick('sound/effects/thunder/thunder1.ogg', 'sound/effects/thunder/thunder2.ogg', 'sound/effects/thunder/thunder3.ogg', 'sound/effects/thunder/thunder4.ogg',
'sound/effects/thunder/thunder5.ogg', 'sound/effects/thunder/thunder6.ogg', 'sound/effects/thunder/thunder7.ogg', 'sound/effects/thunder/thunder8.ogg', 'sound/effects/thunder/thunder9.ogg',
'sound/effects/thunder/thunder10.ogg')
diff --git a/code/modules/food/kitchen/cooking_machines/_cooker.dm b/code/modules/food/kitchen/cooking_machines/_cooker.dm
index 0ff53f4db7..a5215a747e 100644
--- a/code/modules/food/kitchen/cooking_machines/_cooker.dm
+++ b/code/modules/food/kitchen/cooking_machines/_cooker.dm
@@ -35,6 +35,10 @@
cooking_obj = null
return ..()
+/obj/machinery/cooker/proc/set_cooking(new_setting)
+ cooking = new_setting
+ icon_state = new_setting ? on_icon : off_icon
+
/obj/machinery/cooker/examine()
..()
if(cooking_obj && Adjacent(usr))
@@ -113,7 +117,7 @@
user.visible_message("\The [user] puts \the [I] into \the [src].")
cooking_obj = I
cooking_obj.forceMove(src)
- cooking = 1
+ set_cooking(TRUE)
icon_state = on_icon
// Doop de doo. Jeopardy theme goes here.
@@ -123,7 +127,7 @@
if(!cooking_obj || cooking_obj.loc != src)
cooking_obj = null
icon_state = off_icon
- cooking = 0
+ set_cooking(FALSE)
return
// RIP slow-moving held mobs.
@@ -166,7 +170,7 @@
if(!can_burn_food)
icon_state = off_icon
- cooking = 0
+ set_cooking(FALSE)
result.forceMove(get_turf(src))
cooking_obj = null
else
@@ -192,7 +196,7 @@
failed = 1
if(failed)
- cooking = 0
+ set_cooking(FALSE)
icon_state = off_icon
break
@@ -201,7 +205,7 @@
if(cooking_obj && user.Adjacent(src)) //Fixes borgs being able to teleport food in these machines to themselves.
user << "You grab \the [cooking_obj] from \the [src]."
user.put_in_hands(cooking_obj)
- cooking = 0
+ set_cooking(FALSE)
cooking_obj = null
icon_state = off_icon
return
diff --git a/code/modules/food/kitchen/cooking_machines/fryer.dm b/code/modules/food/kitchen/cooking_machines/fryer.dm
index 451f84c2ff..e0dc15cc45 100644
--- a/code/modules/food/kitchen/cooking_machines/fryer.dm
+++ b/code/modules/food/kitchen/cooking_machines/fryer.dm
@@ -8,6 +8,22 @@
off_icon = "fryer_off"
food_color = "#FFAD33"
cooked_sound = 'sound/machines/ding.ogg'
+ var/datum/looping_sound/deep_fryer/fry_loop
+
+/obj/machinery/cooker/fryer/Initialize()
+ fry_loop = new(list(src), FALSE)
+ return ..()
+
+/obj/machinery/cooker/fryer/Destroy()
+ QDEL_NULL(fry_loop)
+ return ..()
+
+/obj/machinery/cooker/fryer/set_cooking(new_setting)
+ ..()
+ if(new_setting)
+ fry_loop.start()
+ else
+ fry_loop.stop()
/obj/machinery/cooker/fryer/cook_mob(var/mob/living/victim, var/mob/user)
@@ -17,16 +33,19 @@
user.visible_message("\The [user] starts pushing \the [victim] into \the [src]!")
icon_state = on_icon
cooking = 1
+ fry_loop.start()
if(!do_mob(user, victim, 20))
cooking = 0
icon_state = off_icon
+ fry_loop.stop()
return
if(!victim || !victim.Adjacent(user))
user << "Your victim slipped free!"
cooking = 0
icon_state = off_icon
+ fry_loop.stop()
return
var/obj/item/organ/external/E
@@ -62,4 +81,5 @@
icon_state = off_icon
cooking = 0
+ fry_loop.stop()
return
diff --git a/code/modules/food/kitchen/microwave.dm b/code/modules/food/kitchen/microwave.dm
index 1ece9225b1..1fbd66286b 100644
--- a/code/modules/food/kitchen/microwave.dm
+++ b/code/modules/food/kitchen/microwave.dm
@@ -16,6 +16,7 @@
var/global/list/acceptable_items // List of the items you can put in
var/global/list/acceptable_reagents // List of the reagents you can put in
var/global/max_n_of_items = 0
+ var/datum/looping_sound/microwave/soundloop
// see code/modules/food/recipes_microwave.dm for recipes
@@ -24,8 +25,7 @@
* Initialising
********************/
-/obj/machinery/microwave/New()
- ..()
+/obj/machinery/microwave/Initialize()
reagents = new/datum/reagents(100)
reagents.my_atom = src
@@ -54,6 +54,12 @@
acceptable_items |= /obj/item/weapon/reagent_containers/food/snacks/grown
RefreshParts()
+ soundloop = new(list(src), FALSE)
+ return ..()
+
+/obj/machinery/microwave/Destroy()
+ QDEL_NULL(soundloop)
+ return ..()
/*******************
* Item Adding
@@ -311,20 +317,19 @@
/obj/machinery/microwave/proc/start()
src.visible_message("The microwave turns on.", "You hear a microwave.")
- src.operating = 1
+ soundloop.start()
+ src.operating = TRUE
src.icon_state = "mw1"
src.updateUsrDialog()
/obj/machinery/microwave/proc/abort()
- src.operating = 0 // Turn it off again aferwards
- src.icon_state = "mw"
- src.updateUsrDialog()
+ operating = FALSE // Turn it off again aferwards
+ icon_state = "mw"
+ updateUsrDialog()
+ soundloop.stop()
/obj/machinery/microwave/proc/stop()
- playsound(src.loc, 'sound/machines/ding.ogg', 50, 1)
- src.operating = 0 // Turn it off again aferwards
- src.icon_state = "mw"
- src.updateUsrDialog()
+ abort()
/obj/machinery/microwave/proc/dispose()
for (var/obj/O in ((contents-component_parts)-circuit))
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index 02095e0f81..4fbad576ed 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -22,12 +22,18 @@
var/lastgen2 = 0
var/effective_gen = 0
var/lastgenlev = 0
+ var/datum/looping_sound/generator/soundloop
-/obj/machinery/power/generator/New()
- ..()
+/obj/machinery/power/generator/Initialize()
+ soundloop = new(list(src), FALSE)
desc = initial(desc) + " Rated for [round(max_power/1000)] kW."
spawn(1)
reconnect()
+ return ..()
+
+/obj/machinery/power/generator/Destroy()
+ QDEL_NULL(soundloop)
+ return ..()
//generators connect in dir and reverse_dir(dir) directions
//mnemonic to determine circulator/generator directions: the cirulators orbit clockwise around the generator
@@ -124,6 +130,13 @@
stored_energy -= lastgen1
effective_gen = (lastgen1 + lastgen2) / 2
+ // Sounds.
+ if(effective_gen > (max_power * 0.05)) // More than 5% and sounds start.
+ soundloop.start()
+ soundloop.volume = LERP(1, 40, effective_gen / max_power)
+ else
+ soundloop.stop()
+
// update icon overlays and power usage only if displayed level has changed
var/genlev = max(0, min( round(11*effective_gen / max_power), 11))
if(effective_gen > 100 && genlev == 0)
diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm
index 87a0f3cb68..d1fd8151f7 100644
--- a/code/modules/power/supermatter/supermatter.dm
+++ b/code/modules/power/supermatter/supermatter.dm
@@ -88,9 +88,15 @@
var/debug = 0
+ var/datum/looping_sound/supermatter/soundloop
+
+/obj/machinery/power/supermatter/Initialize()
+ soundloop = new(list(src), TRUE)
+ return ..()
/obj/machinery/power/supermatter/Destroy()
- . = ..()
+ QDEL_NULL(soundloop)
+ return ..()
/obj/machinery/power/supermatter/proc/explode()
message_admins("Supermatter exploded at ([x],[y],[z] - JMP)",0,1)
@@ -196,6 +202,11 @@
if(grav_pulling)
supermatter_pull(src)
+ if(power)
+ // Volume will be 1 at no power, ~12.5 at ENERGY_NITROGEN, and 20+ at ENERGY_PHORON.
+ // Capped to 20 volume since higher volumes get annoying and it sounds worse.
+ soundloop.volume = min(round(power/10)+1, 20)
+
//Ok, get the air from the turf
var/datum/gas_mixture/removed = null
var/datum/gas_mixture/env = null
diff --git a/polaris.dme b/polaris.dme
index 958ad5f353..d9f906f0bc 100644
--- a/polaris.dme
+++ b/polaris.dme
@@ -254,6 +254,9 @@
#include "code\datums\locations\tau_ceti.dm"
#include "code\datums\locations\uueoa_esa.dm"
#include "code\datums\locations\vir.dm"
+#include "code\datums\looping_sounds\item_sounds.dm"
+#include "code\datums\looping_sounds\looping_sound.dm"
+#include "code\datums\looping_sounds\machinery_sounds.dm"
#include "code\datums\observation\_debug.dm"
#include "code\datums\observation\_defines.dm"
#include "code\datums\observation\destroyed.dm"
diff --git a/sound/items/geiger/new/ext1.ogg b/sound/items/geiger/new/ext1.ogg
new file mode 100644
index 0000000000..ca1b44e4d8
Binary files /dev/null and b/sound/items/geiger/new/ext1.ogg differ
diff --git a/sound/items/geiger/new/ext2.ogg b/sound/items/geiger/new/ext2.ogg
new file mode 100644
index 0000000000..c0c316245b
Binary files /dev/null and b/sound/items/geiger/new/ext2.ogg differ
diff --git a/sound/items/geiger/new/ext3.ogg b/sound/items/geiger/new/ext3.ogg
new file mode 100644
index 0000000000..fc367d9466
Binary files /dev/null and b/sound/items/geiger/new/ext3.ogg differ
diff --git a/sound/items/geiger/new/ext4.ogg b/sound/items/geiger/new/ext4.ogg
new file mode 100644
index 0000000000..d3b00ebaac
Binary files /dev/null and b/sound/items/geiger/new/ext4.ogg differ
diff --git a/sound/items/geiger/new/high1.ogg b/sound/items/geiger/new/high1.ogg
new file mode 100644
index 0000000000..8725affdd4
Binary files /dev/null and b/sound/items/geiger/new/high1.ogg differ
diff --git a/sound/items/geiger/new/high2.ogg b/sound/items/geiger/new/high2.ogg
new file mode 100644
index 0000000000..f1e3868898
Binary files /dev/null and b/sound/items/geiger/new/high2.ogg differ
diff --git a/sound/items/geiger/new/high3.ogg b/sound/items/geiger/new/high3.ogg
new file mode 100644
index 0000000000..bdc5282a5c
Binary files /dev/null and b/sound/items/geiger/new/high3.ogg differ
diff --git a/sound/items/geiger/new/high4.ogg b/sound/items/geiger/new/high4.ogg
new file mode 100644
index 0000000000..8e185d6f78
Binary files /dev/null and b/sound/items/geiger/new/high4.ogg differ
diff --git a/sound/items/geiger/new/low1.ogg b/sound/items/geiger/new/low1.ogg
new file mode 100644
index 0000000000..9bdb8bd327
Binary files /dev/null and b/sound/items/geiger/new/low1.ogg differ
diff --git a/sound/items/geiger/new/low2.ogg b/sound/items/geiger/new/low2.ogg
new file mode 100644
index 0000000000..ce4855f25f
Binary files /dev/null and b/sound/items/geiger/new/low2.ogg differ
diff --git a/sound/items/geiger/new/low3.ogg b/sound/items/geiger/new/low3.ogg
new file mode 100644
index 0000000000..70aaea064f
Binary files /dev/null and b/sound/items/geiger/new/low3.ogg differ
diff --git a/sound/items/geiger/new/low4.ogg b/sound/items/geiger/new/low4.ogg
new file mode 100644
index 0000000000..f36e3b7699
Binary files /dev/null and b/sound/items/geiger/new/low4.ogg differ
diff --git a/sound/items/geiger/new/med1.ogg b/sound/items/geiger/new/med1.ogg
new file mode 100644
index 0000000000..c062c4d2a8
Binary files /dev/null and b/sound/items/geiger/new/med1.ogg differ
diff --git a/sound/items/geiger/new/med2.ogg b/sound/items/geiger/new/med2.ogg
new file mode 100644
index 0000000000..210119a287
Binary files /dev/null and b/sound/items/geiger/new/med2.ogg differ
diff --git a/sound/items/geiger/new/med3.ogg b/sound/items/geiger/new/med3.ogg
new file mode 100644
index 0000000000..ed6f0f4d7f
Binary files /dev/null and b/sound/items/geiger/new/med3.ogg differ
diff --git a/sound/items/geiger/new/med4.ogg b/sound/items/geiger/new/med4.ogg
new file mode 100644
index 0000000000..70635a97a3
Binary files /dev/null and b/sound/items/geiger/new/med4.ogg differ
diff --git a/sound/items/geiger1.ogg b/sound/items/geiger/old/geiger1.ogg
similarity index 100%
rename from sound/items/geiger1.ogg
rename to sound/items/geiger/old/geiger1.ogg
diff --git a/sound/items/geiger2.ogg b/sound/items/geiger/old/geiger2.ogg
similarity index 100%
rename from sound/items/geiger2.ogg
rename to sound/items/geiger/old/geiger2.ogg
diff --git a/sound/items/geiger3.ogg b/sound/items/geiger/old/geiger3.ogg
similarity index 100%
rename from sound/items/geiger3.ogg
rename to sound/items/geiger/old/geiger3.ogg
diff --git a/sound/items/geiger4.ogg b/sound/items/geiger/old/geiger4.ogg
similarity index 100%
rename from sound/items/geiger4.ogg
rename to sound/items/geiger/old/geiger4.ogg
diff --git a/sound/items/geiger5.ogg b/sound/items/geiger/old/geiger5.ogg
similarity index 100%
rename from sound/items/geiger5.ogg
rename to sound/items/geiger/old/geiger5.ogg
diff --git a/sound/items/geiger_weak1.ogg b/sound/items/geiger/old/geiger_weak1.ogg
similarity index 100%
rename from sound/items/geiger_weak1.ogg
rename to sound/items/geiger/old/geiger_weak1.ogg
diff --git a/sound/items/geiger_weak2.ogg b/sound/items/geiger/old/geiger_weak2.ogg
similarity index 100%
rename from sound/items/geiger_weak2.ogg
rename to sound/items/geiger/old/geiger_weak2.ogg
diff --git a/sound/items/geiger_weak3.ogg b/sound/items/geiger/old/geiger_weak3.ogg
similarity index 100%
rename from sound/items/geiger_weak3.ogg
rename to sound/items/geiger/old/geiger_weak3.ogg
diff --git a/sound/items/geiger_weak4.ogg b/sound/items/geiger/old/geiger_weak4.ogg
similarity index 100%
rename from sound/items/geiger_weak4.ogg
rename to sound/items/geiger/old/geiger_weak4.ogg
diff --git a/sound/machines/fryer/deep_fryer_1.ogg b/sound/machines/fryer/deep_fryer_1.ogg
new file mode 100644
index 0000000000..7b726c9de6
Binary files /dev/null and b/sound/machines/fryer/deep_fryer_1.ogg differ
diff --git a/sound/machines/fryer/deep_fryer_2.ogg b/sound/machines/fryer/deep_fryer_2.ogg
new file mode 100644
index 0000000000..4bd4be7d77
Binary files /dev/null and b/sound/machines/fryer/deep_fryer_2.ogg differ
diff --git a/sound/machines/fryer/deep_fryer_emerge.ogg b/sound/machines/fryer/deep_fryer_emerge.ogg
new file mode 100644
index 0000000000..a803dd4c67
Binary files /dev/null and b/sound/machines/fryer/deep_fryer_emerge.ogg differ
diff --git a/sound/machines/fryer/deep_fryer_immerse.ogg b/sound/machines/fryer/deep_fryer_immerse.ogg
new file mode 100644
index 0000000000..3c06b865ca
Binary files /dev/null and b/sound/machines/fryer/deep_fryer_immerse.ogg differ
diff --git a/sound/machines/generator/generator_end.ogg b/sound/machines/generator/generator_end.ogg
new file mode 100644
index 0000000000..4397991167
Binary files /dev/null and b/sound/machines/generator/generator_end.ogg differ
diff --git a/sound/machines/generator/generator_mid1.ogg b/sound/machines/generator/generator_mid1.ogg
new file mode 100644
index 0000000000..10a0d01a7e
Binary files /dev/null and b/sound/machines/generator/generator_mid1.ogg differ
diff --git a/sound/machines/generator/generator_mid2.ogg b/sound/machines/generator/generator_mid2.ogg
new file mode 100644
index 0000000000..77656772cc
Binary files /dev/null and b/sound/machines/generator/generator_mid2.ogg differ
diff --git a/sound/machines/generator/generator_mid3.ogg b/sound/machines/generator/generator_mid3.ogg
new file mode 100644
index 0000000000..812a10e6fc
Binary files /dev/null and b/sound/machines/generator/generator_mid3.ogg differ
diff --git a/sound/machines/generator/generator_start.ogg b/sound/machines/generator/generator_start.ogg
new file mode 100644
index 0000000000..53f734388e
Binary files /dev/null and b/sound/machines/generator/generator_start.ogg differ
diff --git a/sound/machines/microwave/microwave-end.ogg b/sound/machines/microwave/microwave-end.ogg
new file mode 100644
index 0000000000..1c13d87e17
Binary files /dev/null and b/sound/machines/microwave/microwave-end.ogg differ
diff --git a/sound/machines/microwave/microwave-mid1.ogg b/sound/machines/microwave/microwave-mid1.ogg
new file mode 100644
index 0000000000..60a0cc8ec5
Binary files /dev/null and b/sound/machines/microwave/microwave-mid1.ogg differ
diff --git a/sound/machines/microwave/microwave-mid2.ogg b/sound/machines/microwave/microwave-mid2.ogg
new file mode 100644
index 0000000000..3b3dd32c28
Binary files /dev/null and b/sound/machines/microwave/microwave-mid2.ogg differ
diff --git a/sound/machines/microwave/microwave-start.ogg b/sound/machines/microwave/microwave-start.ogg
new file mode 100644
index 0000000000..5e59c78e8a
Binary files /dev/null and b/sound/machines/microwave/microwave-start.ogg differ
diff --git a/sound/machines/shower/shower_end.ogg b/sound/machines/shower/shower_end.ogg
new file mode 100644
index 0000000000..80b93af39e
Binary files /dev/null and b/sound/machines/shower/shower_end.ogg differ
diff --git a/sound/machines/shower/shower_mid1.ogg b/sound/machines/shower/shower_mid1.ogg
new file mode 100644
index 0000000000..e1ae5a0c45
Binary files /dev/null and b/sound/machines/shower/shower_mid1.ogg differ
diff --git a/sound/machines/shower/shower_mid2.ogg b/sound/machines/shower/shower_mid2.ogg
new file mode 100644
index 0000000000..4a54acd352
Binary files /dev/null and b/sound/machines/shower/shower_mid2.ogg differ
diff --git a/sound/machines/shower/shower_mid3.ogg b/sound/machines/shower/shower_mid3.ogg
new file mode 100644
index 0000000000..8b4776a9b9
Binary files /dev/null and b/sound/machines/shower/shower_mid3.ogg differ
diff --git a/sound/machines/shower/shower_start.ogg b/sound/machines/shower/shower_start.ogg
new file mode 100644
index 0000000000..e5529f401b
Binary files /dev/null and b/sound/machines/shower/shower_start.ogg differ
diff --git a/sound/machines/sm/supermatter1.ogg b/sound/machines/sm/supermatter1.ogg
new file mode 100644
index 0000000000..1860e78800
Binary files /dev/null and b/sound/machines/sm/supermatter1.ogg differ
diff --git a/sound/machines/sm/supermatter2.ogg b/sound/machines/sm/supermatter2.ogg
new file mode 100644
index 0000000000..fb2d39fe26
Binary files /dev/null and b/sound/machines/sm/supermatter2.ogg differ
diff --git a/sound/machines/sm/supermatter3.ogg b/sound/machines/sm/supermatter3.ogg
new file mode 100644
index 0000000000..93ac3d505b
Binary files /dev/null and b/sound/machines/sm/supermatter3.ogg differ