mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-10 14:44:05 +01:00
3f87165a03
* CI change * world.dm * .dme world.dm * subsystem renaming * .dme for subsystems * ai_laws.dm * armor.dm * emote.dm * logging.dm * spell.dm * air_alarm.dm * crew.dm * decal.dm * emissive_blocker.dm * footstep.dm * spawner.dm * fire.dm * carbon.dm * living.dm * mob.dm * movement.dm * thermal_drill.dm * plasmamen.dm * lavaland.dm * chaplain.dm * lightning.dm * magnet.dm * mimic.dm * wizard.dm * morph.dm * vampire.dm * click.dm * self.dm * radiation_storm.dm * airlock.dm * autolathe.dm * mulebot.dm * nuclearbomb.dm * particle_accelerator.dm * smartfridge.dm * syndicatebomb.dm * vending.dm * wires.dm * sound.dm * mining.dm * syndicate_space_base.dm * monkey.dm * guardian.dm * bomb.dm * standard.dm * nuclear.dm * pinpointer.dm * access.dm * departments.dm * job.dm * science.dm * buttons.dm * cloning.dm * igniter.dm * wishgranter.dm * atmos_control.dm * message.dm * power_monitor.dm * mecha.dm * combat.dm * mining_tools.dm * meteors.dm * spiders.dm * contraband.dm * aliens.dm * uplinks.dm * voice.dm * intercom.dm * lights.dm * robot_items.dm * mineral.dm * dice.dm * extinguisher.dm * paint.dm * signs.dm * staff.dm * smokebomb.dm * boxes.dm * random.dm * janicart.dm * statue.dm * cargo.dm * asteroid.dm * headslug.dm * fulton.dm * atmospherics.dm * pump.dm * corpse.dm * oldstation.dm * gps.dm * preferences.dm * clothing.dm * ears.dm * glasses.dm * boxing.dm * color.dm * renames ninja gear files * recipes.dm * error_handler.dm * anomaly.dm * floorcluwne.dm * undead.dm * overmind.dm * shield.dm * bottle.dm * organ.dm * piano.dm * plasma_fist.dm * language.dm * mob_defines.dm * mob_helpers.dm * damage_procs.dm * _defines.dm * empress.dm and queen.dm * brain.dm * organ file renaming * subsystems.dm * constructs.dm * bot.dm * pet.dm * nature.dm * magic.dm * colors.dm * drugs.dm * medicine.dm * toxins.dm * shuttle.dm * surgery.dm * moves a bunch of define files * traits.dm * names.dm * other_mobs.dm * flags.dm * some final define files * well turns out contractor_pinpointer.dm was taken * I forgot to remove this file * how in the hell did this get unticked * I DID INCLUDE IT, but there was a "w" there * swaps the world definitions * camera renamed to SScamera * examine -> alien_examine
165 lines
5.7 KiB
Plaintext
165 lines
5.7 KiB
Plaintext
#define DATUMLESS "NO_DATUM"
|
|
|
|
SUBSYSTEM_DEF(sounds)
|
|
name = "Sounds"
|
|
init_order = INIT_ORDER_SOUNDS
|
|
flags = SS_NO_FIRE
|
|
offline_implications = "Sounds may not play correctly. Shuttle call recommended."
|
|
|
|
var/using_channels_max = CHANNEL_HIGHEST_AVAILABLE // BYOND max channels
|
|
/// Amount of channels to reserve for random usage rather than reservations being allowed to reserve all channels. Also a nice safeguard for when someone screws up.
|
|
var/random_channels_min = 50
|
|
// Hey uh these two needs to be initialized fast because the whole "things get deleted before init" thing.
|
|
/// Assoc list, "[channel]" = either the datum using it or TRUE for an unsafe-reserved (datumless reservation) channel
|
|
var/list/using_channels
|
|
/// Assoc list datum = list(channel1, channel2, ...) for what channels something reserved.
|
|
var/list/using_channels_by_datum
|
|
// Special datastructure for fast channel management
|
|
/// List of all channels as numbers
|
|
var/list/channel_list
|
|
/// Associative list of all reserved channels associated to their position. "[channel_number]" = index as number
|
|
var/list/reserved_channels
|
|
/// lower iteration position - Incremented and looped to get "random" sound channels for normal sounds. The channel at this index is returned when asking for a random channel.
|
|
var/channel_random_low
|
|
/// higher reserve position - decremented and incremented to reserve sound channels, anything above this is reserved. The channel at this index is the highest unreserved channel.
|
|
var/channel_reserve_high
|
|
|
|
/datum/controller/subsystem/sounds/Initialize()
|
|
setup_available_channels()
|
|
|
|
/**
|
|
* Sets up all available sound channels
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/setup_available_channels()
|
|
channel_list = list()
|
|
reserved_channels = list()
|
|
using_channels = list()
|
|
using_channels_by_datum = list()
|
|
for(var/i in 1 to using_channels_max)
|
|
channel_list += i
|
|
channel_random_low = 1
|
|
channel_reserve_high = length(channel_list)
|
|
|
|
/**
|
|
* Removes a channel from using list
|
|
*
|
|
* Arguments:
|
|
* * channel - The channel number
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/free_sound_channel(channel)
|
|
var/text_channel = num2text(channel)
|
|
var/using = using_channels[text_channel]
|
|
using_channels -= text_channel
|
|
if(!using) // datum channel
|
|
using_channels_by_datum[using] -= channel
|
|
if(!length(using_channels_by_datum[using]))
|
|
using_channels_by_datum -= using
|
|
free_channel(channel)
|
|
|
|
/**
|
|
* Frees all the channels a datum is using
|
|
*
|
|
* Arguments:
|
|
* * D - The datum
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/free_datum_channels(datum/D)
|
|
var/list/L = using_channels_by_datum[D]
|
|
if(!L)
|
|
return
|
|
for(var/channel in L)
|
|
using_channels -= num2text(channel)
|
|
free_channel(channel)
|
|
using_channels_by_datum -= D
|
|
|
|
/**
|
|
* Frees all datumless channels
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/free_datumless_channels()
|
|
free_datum_channels(DATUMLESS)
|
|
|
|
/**
|
|
* NO AUTOMATIC CLEANUP - If you use this, you better manually free it later!
|
|
*
|
|
* Returns an integer for channel
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/reserve_sound_channel_datumless()
|
|
. = reserve_channel()
|
|
if(!.) // oh no..
|
|
return FALSE
|
|
var/text_channel = num2text(.)
|
|
using_channels[text_channel] = DATUMLESS
|
|
LAZYADD(using_channels_by_datum[DATUMLESS], .)
|
|
|
|
/**
|
|
* Reserves a channel for a datum. Automatic cleanup only when the datum is deleted.
|
|
*
|
|
* Returns an integer for channel
|
|
* Arguments:
|
|
* * D - The datum
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/reserve_sound_channel(datum/D)
|
|
if(!D) // i don't like typechecks but someone will fuck it up
|
|
CRASH("Attempted to reserve sound channel without datum using the managed proc.")
|
|
. = reserve_channel()
|
|
if(!.)
|
|
return FALSE
|
|
var/text_channel = num2text(.)
|
|
using_channels[text_channel] = D
|
|
LAZYADD(using_channels_by_datum[D], .)
|
|
|
|
/**
|
|
* Reserves a channel and updates the datastructure. Private proc.
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/reserve_channel()
|
|
PRIVATE_PROC(TRUE)
|
|
if(channel_reserve_high <= random_channels_min) // out of channels
|
|
return
|
|
var/channel = channel_list[channel_reserve_high]
|
|
reserved_channels[num2text(channel)] = channel_reserve_high--
|
|
return channel
|
|
|
|
/**
|
|
* Frees a channel and updates the datastructure. Private proc.
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/free_channel(number)
|
|
PRIVATE_PROC(TRUE)
|
|
var/text_channel = num2text(number)
|
|
var/index = reserved_channels[text_channel]
|
|
if(!index)
|
|
CRASH("Attempted to (internally) free a channel that wasn't reserved.")
|
|
reserved_channels -= text_channel
|
|
// push reserve index up, which makes it now on a channel that is reserved
|
|
channel_reserve_high++
|
|
// swap the reserved channel with the unreserved channel so the reserve index is now on an unoccupied channel and the freed channel is next to be used.
|
|
channel_list.Swap(channel_reserve_high, index)
|
|
// now, an existing reserved channel will likely (exception: unreserving last reserved channel) be at index
|
|
// get it, and update position.
|
|
var/text_reserved = num2text(channel_list[index])
|
|
if(!reserved_channels[text_reserved]) // if it isn't already reserved make sure we don't accidently mistakenly put it on reserved list!
|
|
return
|
|
reserved_channels[text_reserved] = index
|
|
|
|
/**
|
|
* Random available channel, returns text
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/random_available_channel_text()
|
|
if(channel_random_low > channel_reserve_high)
|
|
channel_random_low = 1
|
|
. = "[channel_list[channel_random_low++]]"
|
|
|
|
/**
|
|
* Random available channel, returns number
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/random_available_channel()
|
|
if(channel_random_low > channel_reserve_high)
|
|
channel_random_low = 1
|
|
. = channel_list[channel_random_low++]
|
|
|
|
/**
|
|
* How many channels we have left
|
|
*/
|
|
/datum/controller/subsystem/sounds/proc/available_channels_left()
|
|
return length(channel_list) - random_channels_min
|
|
|
|
#undef DATUMLESS
|