diff --git a/GainStation13/code/game/sound.dm b/GainStation13/code/game/sound.dm
index baa05d75..6c8cb7bb 100644
--- a/GainStation13/code/game/sound.dm
+++ b/GainStation13/code/game/sound.dm
@@ -1,38 +1,37 @@
-/proc/gs13_get_sfx(soundin)
- if(istext(soundin))
- switch(soundin)
- if("belch")
- soundin = pick( 'GainStation13/sound/voice/belch1.ogg',
- 'GainStation13/sound/voice/belch2.ogg',
- 'GainStation13/sound/voice/belch3.ogg',
- 'GainStation13/sound/voice/belch4.ogg',
- 'GainStation13/sound/voice/belch5.ogg',
- 'GainStation13/sound/voice/belch6.ogg',
- 'GainStation13/sound/voice/belch7.ogg',
- 'GainStation13/sound/voice/belch8.ogg',
- 'GainStation13/sound/voice/belch9.ogg',
- 'GainStation13/sound/voice/belch10.ogg',
- 'GainStation13/sound/voice/belch11.ogg')
- if("brap")
- soundin = pick( 'GainStation13/sound/voice/brap1.ogg',
- 'GainStation13/sound/voice/brap2.ogg',
- 'GainStation13/sound/voice/brap3.ogg',
- 'GainStation13/sound/voice/brap4.ogg',
- 'GainStation13/sound/voice/brap5.ogg',
- 'GainStation13/sound/voice/brap6.ogg',
- 'GainStation13/sound/voice/brap7.ogg',
- 'GainStation13/sound/voice/brap8.ogg')
- if("burp")
- soundin = pick( 'GainStation13/sound/voice/burp1.ogg')
- if("burunyu")
- soundin = pick( 'GainStation13/sound/voice/funnycat.ogg')
- if("fart")
- soundin = pick( 'GainStation13/sound/voice/fart1.ogg',
- 'GainStation13/sound/voice/fart2.ogg',
- 'GainStation13/sound/voice/fart3.ogg',
- 'GainStation13/sound/voice/fart4.ogg')
- if("gurgle")
- soundin = pick( 'GainStation13/sound/voice/gurgle1.ogg',
- 'GainStation13/sound/voice/gurgle2.ogg',
- 'GainStation13/sound/voice/gurgle3.ogg')
- return soundin
+/proc/playsound_prefed(atom/source, soundin, pref, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, soundenvwet = -10000, soundenvdry = 0)
+ if(isarea(source))
+ throw EXCEPTION("playsound(): source is an area")
+ return
+
+ var/turf/turf_source = get_turf(source)
+
+ if (!turf_source)
+ return
+
+ //allocate a channel if necessary now so its the same for everyone
+ channel = channel || open_sound_channel()
+
+ // Looping through the player list has the added bonus of working for mobs inside containers
+ var/sound/S = sound(get_sfx(soundin))
+ var/maxdistance = (world.view + extrarange)
+ var/z = turf_source.z
+ var/list/listeners = SSmobs.clients_by_zlevel[z]
+ if(!ignore_walls) //these sounds don't carry through walls
+ listeners = listeners & hearers(maxdistance,turf_source)
+
+ for(var/P in listeners)
+ var/mob/M = P
+ if(!M.client)
+ continue
+ if((!M.client?.prefs.cit_toggles & pref))
+ continue
+ if(get_dist(M, turf_source) <= maxdistance)
+ M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
+ for(var/P in SSmobs.dead_players_by_zlevel[z])
+ var/mob/M = P
+ if(!M.client)
+ continue
+ if((!M.client?.prefs.cit_toggles & pref))
+ continue
+ if(get_dist(M, turf_source) <= maxdistance)
+ M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
diff --git a/GainStation13/code/modules/mob/living/emote.dm b/GainStation13/code/modules/mob/living/emote.dm
index 0b4bc44f..7bf093de 100644
--- a/GainStation13/code/modules/mob/living/emote.dm
+++ b/GainStation13/code/modules/mob/living/emote.dm
@@ -1,136 +1,99 @@
-/datum/emote/living/proc/make_noise(var/mob/living/user, noise_name, pref_toggle)
- if(!ishuman(user))
- return FALSE
-
- var/turf/source = get_turf(user)
- var/sound/noise = sound(gs13_get_sfx(noise_name))
- for(var/mob/living/M in get_hearers_in_view(3, source))
- if ((pref_toggle == 0) || (M.client && M.client?.prefs?.cit_toggles & pref_toggle))
- M.playsound_local(source, noise_name, 50, 1, S = noise)
-
-/datum/emote/living/proc/reduce_fullness(var/mob/living/user, fullness_amount) // fullness_amount should be between 5 and 20 for balance and below 80 for functionality
- if(!ishuman(user))
- return FALSE
-
- var/mob/living/N = user
- if(N.fullness >= FULLNESS_LEVEL_BLOATED && N.fullness_reducion_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
- N.fullness -= fullness_amount
- if(fullness_amount <= 5)
- to_chat(N, "You felt that make some space")
- if(fullness_amount > 5)
- to_chat(N, "You felt that make a lot of space")
-
-/datum/emote/living/belch
- key = "belch"
- key_third_person = "belches loudly"
- message = "belches"
+/datum/emote/living/gurgle
+ key = "gurgle"
+ key_third_person = "gurgles"
+ message = "'s belly gurgles"
emote_type = EMOTE_AUDIBLE
- //god hates me for this -Metha
+ sound = 'GainStation13/sound/voice/gurgle1.ogg'
-/datum/emote/living/belch/run_emote(mob/living/user, params)
+/datum/emote/living/gurgle/get_sound()
+ return pick('GainStation13/sound/voice/gurgle1.ogg',
+ 'GainStation13/sound/voice/gurgle2.ogg',
+ 'GainStation13/sound/voice/gurgle3.ogg')
+
+/datum/emote/living/gurgle/run_emote(mob/living/user, params)
if(!ishuman(user))
- return FALSE
-
- make_noise(user, "belch", BURPING_NOISES)
+ return FALSE
- . = ..()
- reduce_fullness(user, rand(6,12))
+ playsound(user, "gurgle")
-/datum/emote/living/brap
- key = "brap"
- key_third_person = "braps"
- message = " "
- emote_type = EMOTE_AUDIBLE
-
-/datum/emote/living/brap/select_message_type(var/mob/living/user)
- return pick("farts loudly!", "cuts a fat one!", "rips absolute ass!")
-
-/datum/emote/living/brap/run_emote(var/mob/living/user, params)
- if(!ishuman(user))
- return FALSE
-
- make_noise(user, "brap", FARTING_NOISES)
- var/obj/item/storage/book/bible/b = locate(/obj/item/storage/book/bible) in get_turf(user) //Biblefart
- if(b) //Devine Retribution
- user.visible_message("\The [user] farts on \the [b], causing a violent, otherworldly ripple to echo outwards before they explode in a gorey mess of divine retribution!",
- "You feel a deep sense of dread as you release pressure from your rear over \the [b], immediately realizing your mistake as Divine Retribution rends your form into a gorey mess.")
- user.emote("scream")
- message_admins("[ADMIN_LOOKUPFLW(user)] farted on a bible at [ADMIN_VERBOSEJMP(user)] and was gibbed.")
- log_game("[key_name(user)] farted on a bible at [AREACOORD(user)] and was gibbed")
- user.gib()
- return ..() //Gassy is dead, no fullness to reduce
-
- . = ..()
- reduce_fullness(user, rand(6,12))
+ . = ..()
/datum/emote/living/burp
key = "burp"
key_third_person = "burps"
message = "burps"
emote_type = EMOTE_AUDIBLE
+ var/reduction_min = 4
+ var/reduction_max = 8
+ var/noise_type = "burp"
+ var/noise_pref = BURPING_NOISES
/datum/emote/living/burp/run_emote(mob/living/user, params)
- if(!ishuman(user))
+ . = ..()
+ if(!.)
return FALSE
- make_noise(user, "burp", BURPING_NOISES)
+ playsound_prefed(user, noise_type, noise_pref, 100, TRUE, -7)
- . = ..()
- reduce_fullness(user, rand(4,8))
+ user.reduce_fullness(rand(reduction_min,reduction_max))
-/datum/emote/living/fart
+/datum/emote/living/burp/fart //Butt burp.
key = "fart"
key_third_person = "farts"
message = "farts"
- emote_type = EMOTE_AUDIBLE
//god hates me for this -Metha
+ noise_type = "fart"
+ noise_pref = FARTING_NOISES
-/datum/emote/living/fart/run_emote(mob/living/user, params)
- if(!ishuman(user))
- return FALSE
-
- make_noise(user, "fart", FARTING_NOISES)
- var/obj/item/storage/book/bible/b = locate(/obj/item/storage/book/bible) in get_turf(user) //Biblefart
- if(b) //Devine Retribution
- user.visible_message("\The [user] farts on \the [b], causing a violent, otherworldly ripple to echo outwards before they explode in a gorey mess of divine retribution!",
- "You feel a deep sense of dread as you release pressure from your rear over \the [b], immediately realizing your mistake as Divine Retribution rends your form into a gorey mess.")
- user.emote("scream")
- message_admins("[ADMIN_LOOKUPFLW(user)] farted on a bible at [ADMIN_VERBOSEJMP(user)] and was gibbed.")
- log_game("[key_name(user)] farted on a bible at [AREACOORD(user)] and was gibbed")
- user.gib()
- return ..() //Gassy is dead, no fullness to reduce
-
- . = ..()
- reduce_fullness(user, rand(4,8))
-
-/datum/emote/living/gurgle
- key = "gurgle"
- key_third_person = "gurgles"
- message = "'s belly gurgles"
- emote_type = EMOTE_AUDIBLE
-
-/datum/emote/living/gurgle/run_emote(mob/living/user, params)
- if(!ishuman(user))
+/datum/emote/living/burp/fart/run_emote(mob/living/user, params)
+ . = ..()
+ if(!.)
return FALSE
- make_noise(user, "gurgle", 0)
+ var/obj/item/storage/book/bible/b = locate(/obj/item/storage/book/bible) in get_turf(user) //Biblefart
+ if(b)//Devine Retribution
+ var/mob/living/heretic = user //Heresy.
+ heretic.visible_message(
+ "\The [heretic] farts on \the [b], causing a violent, otherworldly ripple to echo \
+ outwards before they explode in a gorey mess of divine retribution!",
+ "You feel a deep sense of dread as you release pressure from your rear over \the [b], \
+ immediately realizing your mistake as Divine Retribution rends your form into a gorey mess.")
+ heretic.emote("scream")
+ message_admins("[ADMIN_LOOKUPFLW(heretic)] farted on a bible at [ADMIN_VERBOSEJMP(heretic)] and was gibbed.")
+ log_game("[key_name(heretic)] farted on a bible at [AREACOORD(heretic)] and was gibbed")
+ heretic.gib()
+ return //Gassy is dead
- . = ..()
+/datum/emote/living/burp/belch
+ key = "belch"
+ key_third_person = "belches loudly"
+ message = "belches"
+ //god hates me for this -Metha
+ reduction_min = 6
+ reduction_max = 12
+/datum/emote/living/burp/fart/brap
+ key = "brap"
+ key_third_person = "braps"
+ message = ""
+ reduction_min = 6
+ reduction_max = 12
+
+/datum/emote/living/burp/fart/brap/select_message_type(var/mob/living/user)
+ return pick("farts loudly!", "cuts a fat one!", "rips absolute ass!")
+
+/datum/emote/living/burp/fart/goon // Fart but it's funny !
+ key = "goonfart"
+ key_third_person = "goonfarts"
+ noise_type = 'goon/sound/voice/farts/fart4.ogg'
+
//Shhh... It's a secret! Don't tell or I'll steal your legs
/datum/emote/living/burunyu
key = "burunyu"
key_third_person = "burunyues"
message = "emits a strange feline sound"
emote_type = EMOTE_AUDIBLE
-
-/datum/emote/living/burunyu/run_emote(mob/living/user, params)
- if(!ishuman(user))
- return FALSE
-
- make_noise(user, "burunyu", 0)
-
- . = ..()
+ sound = 'GainStation13/sound/voice/funnycat.ogg'
/datum/emote/living/bellyrub
key = "bellyrub"
@@ -139,7 +102,8 @@
emote_type = EMOTE_VISIBLE
/datum/emote/living/bellyrub/run_emote(mob/living/user, params)
- if(!ishuman(user))
- return FALSE
. = ..()
- reduce_fullness(user, rand(4,16))
+ if(!.)
+ return FALSE
+
+ user.reduce_fullness(rand(4,16), FALSE)
diff --git a/GainStation13/code/modules/mob/living/fullness.dm b/GainStation13/code/modules/mob/living/fullness.dm
new file mode 100644
index 00000000..a21a7304
--- /dev/null
+++ b/GainStation13/code/modules/mob/living/fullness.dm
@@ -0,0 +1,16 @@
+/mob/living/proc/reduce_fullness(amount, notify = TRUE) // fullness_amount should be between 5 and 20 for balance and below 80 for functionality
+ if(!ishuman(src))
+ return
+
+ if(fullness >= FULLNESS_LEVEL_BLOATED && fullness_reducion_timer + FULLNESS_REDUCTION_COOLDOWN < world.time)
+
+ fullness -= amount // Remove Fullness
+
+ if(!notify)
+ return
+
+ if(amount <= 5)
+ to_chat(src, "You felt that make some space")
+ if(amount > 5)
+ to_chat(src, "You felt that make a lot of space")
+
diff --git a/code/game/sound.dm b/code/game/sound.dm
index 11e02610..13edfcef 100644
--- a/code/game/sound.dm
+++ b/code/game/sound.dm
@@ -227,4 +227,28 @@
if("slosh")
soundin = pick('sound/effects/slosh1.ogg', 'sound/effects/slosh2.ogg')
//END OF CIT CHANGES
+ // GS13 Start - Gainstation sounds
+ if("belch")
+ soundin = pick( 'GainStation13/sound/voice/belch1.ogg', 'GainStation13/sound/voice/belch2.ogg',
+ 'GainStation13/sound/voice/belch3.ogg', 'GainStation13/sound/voice/belch4.ogg',
+ 'GainStation13/sound/voice/belch5.ogg', 'GainStation13/sound/voice/belch6.ogg',
+ 'GainStation13/sound/voice/belch7.ogg', 'GainStation13/sound/voice/belch8.ogg',
+ 'GainStation13/sound/voice/belch9.ogg', 'GainStation13/sound/voice/belch10.ogg',
+ 'GainStation13/sound/voice/belch11.ogg')
+ if("brap")
+ soundin = pick( 'GainStation13/sound/voice/brap1.ogg', 'GainStation13/sound/voice/brap2.ogg',
+ 'GainStation13/sound/voice/brap3.ogg', 'GainStation13/sound/voice/brap4.ogg',
+ 'GainStation13/sound/voice/brap5.ogg', 'GainStation13/sound/voice/brap6.ogg',
+ 'GainStation13/sound/voice/brap7.ogg', 'GainStation13/sound/voice/brap8.ogg')
+ if("burp")
+ soundin = pick( 'GainStation13/sound/voice/burp1.ogg')
+ if("burunyu")
+ soundin = pick( 'GainStation13/sound/voice/funnycat.ogg')
+ if("fart")
+ soundin = pick( 'GainStation13/sound/voice/fart1.ogg', 'GainStation13/sound/voice/fart2.ogg',
+ 'GainStation13/sound/voice/fart3.ogg', 'GainStation13/sound/voice/fart4.ogg')
+ if("gurgle")
+ soundin = pick( 'GainStation13/sound/voice/gurgle1.ogg', 'GainStation13/sound/voice/gurgle2.ogg',
+ 'GainStation13/sound/voice/gurgle3.ogg')
+ // GS13 end
return soundin
diff --git a/goon/sound/voice/farts/fart4.ogg b/goon/sound/voice/farts/fart4.ogg
new file mode 100644
index 00000000..429b9ec9
Binary files /dev/null and b/goon/sound/voice/farts/fart4.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 369210fa..bb5a0379 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3127,6 +3127,7 @@
#include "GainStation13\code\modules\mob\living\emote.dm"
#include "GainStation13\code\modules\mob\living\emote_modular.dm"
#include "GainStation13\code\modules\mob\living\emote_ported.dm"
+#include "GainStation13\code\modules\mob\living\fullness.dm"
#include "GainStation13\code\modules\mob\living\nutribot.dm"
#include "GainStation13\code\modules\mob\living\vore\eating\living_vr.dm"
#include "GainStation13\code\modules\mob\living\vore\eating\trasheat_lists.dm"