mirror of
https://github.com/SPLURT-Station/S.P.L.U.R.T-Station-13.git
synced 2025-12-10 01:49:19 +00:00
ImmursionAudio(TM)
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#define CHANNEL_ADMIN 1023
|
||||
#define CHANNEL_VOX 1022
|
||||
#define CHANNEL_JUKEBOX 1021
|
||||
|
||||
#define CHANNEL_JUKEBOX_START 1016 //The gap between this and CHANNEL_JUKEBOX determines the amount of free jukebox channels. This currently allows 6 jukebox channels to exist.
|
||||
#define CHANNEL_JUSTICAR_ARK 1015
|
||||
#define CHANNEL_HEARTBEAT 1014 //sound channel for heartbeats
|
||||
@@ -15,6 +16,17 @@
|
||||
#define CHANNEL_DIGEST 1009
|
||||
#define CHANNEL_PREYLOOP 1008
|
||||
|
||||
///Default range of a sound.
|
||||
#define SOUND_RANGE 17
|
||||
///default extra range for sounds considered to be quieter
|
||||
#define SHORT_RANGE_SOUND_EXTRARANGE -9
|
||||
///The range deducted from sound range for things that are considered silent / sneaky
|
||||
#define SILENCED_SOUND_EXTRARANGE -11
|
||||
///Percentage of sound's range where no falloff is applied
|
||||
#define SOUND_DEFAULT_FALLOFF_DISTANCE 1 //For a normal sound this would be 1 tile of no falloff
|
||||
///The default exponent of sound falloff
|
||||
#define SOUND_FALLOFF_EXPONENT 6
|
||||
|
||||
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
|
||||
//KEEP IT UPDATED
|
||||
|
||||
@@ -23,6 +35,7 @@
|
||||
#define MAX_INSTRUMENT_CHANNELS (128 * 6)
|
||||
|
||||
#define SOUND_MINIMUM_PRESSURE 10
|
||||
/// remove
|
||||
#define FALLOFF_SOUNDS 1
|
||||
|
||||
|
||||
@@ -53,7 +66,8 @@
|
||||
#define MINING list('sound/ambience/ambimine.ogg', 'sound/ambience/ambicave.ogg', 'sound/ambience/ambiruin.ogg',\
|
||||
'sound/ambience/ambiruin2.ogg', 'sound/ambience/ambiruin3.ogg', 'sound/ambience/ambiruin4.ogg',\
|
||||
'sound/ambience/ambiruin5.ogg', 'sound/ambience/ambiruin6.ogg', 'sound/ambience/ambiruin7.ogg',\
|
||||
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg', 'sound/ambience/ambilava.ogg')
|
||||
'sound/ambience/ambidanger.ogg', 'sound/ambience/ambidanger2.ogg', 'sound/ambience/ambimaint1.ogg',\
|
||||
'sound/ambience/ambilava.ogg')
|
||||
|
||||
#define MEDICAL list('sound/ambience/ambinice.ogg')
|
||||
|
||||
@@ -80,3 +94,55 @@
|
||||
'sound/hallucinations/growl3.ogg', 'sound/hallucinations/im_here1.ogg', 'sound/hallucinations/im_here2.ogg', 'sound/hallucinations/i_see_you1.ogg', 'sound/hallucinations/i_see_you2.ogg',\
|
||||
'sound/hallucinations/look_up1.ogg', 'sound/hallucinations/look_up2.ogg', 'sound/hallucinations/over_here1.ogg', 'sound/hallucinations/over_here2.ogg', 'sound/hallucinations/over_here3.ogg',\
|
||||
'sound/hallucinations/turn_around1.ogg', 'sound/hallucinations/turn_around2.ogg', 'sound/hallucinations/veryfar_noise.ogg', 'sound/hallucinations/wail.ogg')
|
||||
|
||||
|
||||
#define INTERACTION_SOUND_RANGE_MODIFIER -3
|
||||
#define EQUIP_SOUND_VOLUME 30
|
||||
#define PICKUP_SOUND_VOLUME 15
|
||||
#define DROP_SOUND_VOLUME 20
|
||||
#define YEET_SOUND_VOLUME 90
|
||||
|
||||
|
||||
//default byond sound environments
|
||||
#define SOUND_ENVIRONMENT_NONE -1
|
||||
#define SOUND_ENVIRONMENT_GENERIC 0
|
||||
#define SOUND_ENVIRONMENT_PADDED_CELL 1
|
||||
#define SOUND_ENVIRONMENT_ROOM 2
|
||||
#define SOUND_ENVIRONMENT_BATHROOM 3
|
||||
#define SOUND_ENVIRONMENT_LIVINGROOM 4
|
||||
#define SOUND_ENVIRONMENT_STONEROOM 5
|
||||
#define SOUND_ENVIRONMENT_AUDITORIUM 6
|
||||
#define SOUND_ENVIRONMENT_CONCERT_HALL 7
|
||||
#define SOUND_ENVIRONMENT_CAVE 8
|
||||
#define SOUND_ENVIRONMENT_ARENA 9
|
||||
#define SOUND_ENVIRONMENT_HANGAR 10
|
||||
#define SOUND_ENVIRONMENT_CARPETED_HALLWAY 11
|
||||
#define SOUND_ENVIRONMENT_HALLWAY 12
|
||||
#define SOUND_ENVIRONMENT_STONE_CORRIDOR 13
|
||||
#define SOUND_ENVIRONMENT_ALLEY 14
|
||||
#define SOUND_ENVIRONMENT_FOREST 15
|
||||
#define SOUND_ENVIRONMENT_CITY 16
|
||||
#define SOUND_ENVIRONMENT_MOUNTAINS 17
|
||||
#define SOUND_ENVIRONMENT_QUARRY 18
|
||||
#define SOUND_ENVIRONMENT_PLAIN 19
|
||||
#define SOUND_ENVIRONMENT_PARKING_LOT 20
|
||||
#define SOUND_ENVIRONMENT_SEWER_PIPE 21
|
||||
#define SOUND_ENVIRONMENT_UNDERWATER 22
|
||||
#define SOUND_ENVIRONMENT_DRUGGED 23
|
||||
#define SOUND_ENVIRONMENT_DIZZY 24
|
||||
#define SOUND_ENVIRONMENT_PSYCHOTIC 25
|
||||
//If we ever make custom ones add them here
|
||||
|
||||
//"sound areas": easy way of keeping different types of areas consistent.
|
||||
#define SOUND_AREA_STANDARD_STATION SOUND_ENVIRONMENT_PARKING_LOT
|
||||
#define SOUND_AREA_LARGE_ENCLOSED SOUND_ENVIRONMENT_QUARRY
|
||||
#define SOUND_AREA_SMALL_ENCLOSED SOUND_ENVIRONMENT_BATHROOM
|
||||
#define SOUND_AREA_TUNNEL_ENCLOSED SOUND_ENVIRONMENT_STONEROOM
|
||||
#define SOUND_AREA_LARGE_SOFTFLOOR SOUND_ENVIRONMENT_CARPETED_HALLWAY
|
||||
#define SOUND_AREA_MEDIUM_SOFTFLOOR SOUND_ENVIRONMENT_LIVINGROOM
|
||||
#define SOUND_AREA_SMALL_SOFTFLOOR SOUND_ENVIRONMENT_ROOM
|
||||
#define SOUND_AREA_ASTEROID SOUND_ENVIRONMENT_CAVE
|
||||
#define SOUND_AREA_SPACE SOUND_ENVIRONMENT_UNDERWATER
|
||||
#define SOUND_AREA_LAVALAND SOUND_ENVIRONMENT_MOUNTAINS
|
||||
#define SOUND_AREA_ICEMOON SOUND_ENVIRONMENT_CAVE
|
||||
#define SOUND_AREA_WOODFLOOR SOUND_ENVIRONMENT_CITY
|
||||
|
||||
@@ -116,7 +116,6 @@ SUBSYSTEM_DEF(jukeboxes)
|
||||
inrange = TRUE
|
||||
else
|
||||
song_played.status = SOUND_MUTE | SOUND_UPDATE //Setting volume = 0 doesn't let the sound properties update at all, which is lame.
|
||||
|
||||
M.playsound_local(currentturf, null, 100, channel = jukeinfo[2], S = song_played, envwet = (inrange ? -250 : 0), envdry = (inrange ? 0 : -10000))
|
||||
M.playsound_local(currentturf, null, 100, channel = jukeinfo[2], S = song_played, use_reverb = FALSE)
|
||||
CHECK_TICK
|
||||
return
|
||||
|
||||
@@ -89,7 +89,7 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
if(adminlog)
|
||||
message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [ADMIN_VERBOSEJMP(epicenter)]")
|
||||
log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in [loc_name(epicenter)]")
|
||||
|
||||
|
||||
deadchat_broadcast("<span class='deadsay bold'>An explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) has occured at ([get_area(epicenter)])</span>", turf_target = get_turf(epicenter))
|
||||
|
||||
var/x0 = epicenter.x
|
||||
@@ -115,7 +115,7 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
var/sound/creaking_explosion_sound = sound(get_sfx("explosion_creaking"))
|
||||
var/sound/hull_creaking_sound = sound(get_sfx("hull_creaking"))
|
||||
var/sound/explosion_echo_sound = sound('sound/effects/explosion_distant.ogg')
|
||||
var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION)
|
||||
var/on_station = SSmapping.level_trait(epicenter.z, ZTRAIT_STATION)
|
||||
var/creaking_explosion = FALSE
|
||||
|
||||
if(prob(devastation_range*30+heavy_impact_range*5) && on_station) // Huge explosions are near guaranteed to make the station creak and whine, smaller ones might.
|
||||
@@ -131,7 +131,7 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
baseshakeamount = sqrt((orig_max_distance - dist)*0.1)
|
||||
// If inside the blast radius + world.view - 2
|
||||
if(dist <= round(max_range + world.view - 2, 1))
|
||||
M.playsound_local(epicenter, null, 100, 1, frequency, falloff = 5, S = explosion_sound)
|
||||
M.playsound_local(epicenter, null, 100, 1, frequency, S = explosion_sound)
|
||||
if(baseshakeamount > 0)
|
||||
shake_camera(M, 25, clamp(baseshakeamount, 0, 10))
|
||||
// You hear a far explosion if you're outside the blast radius. Small bombs shouldn't be heard all over the station.
|
||||
@@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
var/far_volume = clamp(far_dist/2, 40, 60) // Volume is based on explosion size and dist
|
||||
if(creaking_explosion)
|
||||
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = creaking_explosion_sound, distance_multiplier = 0)
|
||||
else if(prob(75))
|
||||
else if(prob(75)) // Sound variety during meteor storm/tesloose/other bad event
|
||||
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = far_explosion_sound, distance_multiplier = 0) // Far sound
|
||||
else
|
||||
M.playsound_local(epicenter, null, far_volume, 1, frequency, S = explosion_echo_sound, distance_multiplier = 0) // Echo sound
|
||||
@@ -148,7 +148,7 @@ GLOBAL_LIST_EMPTY(explosions)
|
||||
if(!baseshakeamount) // Devastating explosions rock the station and ground
|
||||
baseshakeamount = devastation_range*3
|
||||
shake_camera(M, 10, clamp(baseshakeamount*0.25, 0, 2.5))
|
||||
|
||||
|
||||
else if(M.can_hear() && !isspaceturf(get_turf(M)) && heavy_impact_range) // Big enough explosions echo throughout the hull
|
||||
var/echo_volume = 40
|
||||
if(devastation_range)
|
||||
|
||||
@@ -44,6 +44,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
ambientsounds = SPACE
|
||||
blob_allowed = FALSE //Eating up space doesn't count for victory as a blob.
|
||||
considered_hull_exterior = TRUE
|
||||
sound_environment = SOUND_AREA_SPACE
|
||||
|
||||
/area/space/nearstation
|
||||
icon_state = "space_near"
|
||||
@@ -69,6 +70,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
blob_allowed = FALSE //Nope, no winning on the asteroid as a blob. Gotta eat the station.
|
||||
valid_territory = FALSE
|
||||
ambientsounds = MINING
|
||||
sound_environment = SOUND_AREA_ASTEROID
|
||||
|
||||
/area/asteroid/nearstation
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
@@ -106,7 +108,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/maintenance
|
||||
ambientsounds = MAINTENANCE
|
||||
valid_territory = FALSE
|
||||
|
||||
sound_environment = SOUND_AREA_TUNNEL_ENCLOSED
|
||||
|
||||
//Departments
|
||||
|
||||
@@ -121,6 +123,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/maintenance/department/crew_quarters/bar
|
||||
name = "Bar Maintenance"
|
||||
icon_state = "maint_bar"
|
||||
sound_environment = SOUND_AREA_WOODFLOOR
|
||||
|
||||
/area/maintenance/department/crew_quarters/dorms
|
||||
name = "Dormitory Maintenance"
|
||||
@@ -264,6 +267,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
/area/hallway
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_PUBLIC
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/hallway/primary/aft
|
||||
name = "Aft Primary Hallway"
|
||||
@@ -336,30 +340,36 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Bridge"
|
||||
icon_state = "bridge"
|
||||
music = "signal"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/bridge/meeting_room
|
||||
name = "Heads of Staff Meeting Room"
|
||||
icon_state = "meeting"
|
||||
music = null
|
||||
sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/bridge/meeting_room/council
|
||||
name = "Council Chamber"
|
||||
icon_state = "meeting"
|
||||
music = null
|
||||
sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/bridge/showroom/corporate
|
||||
name = "Corporate Showroom"
|
||||
icon_state = "showroom"
|
||||
music = null
|
||||
sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/heads/captain
|
||||
name = "Captain's Office"
|
||||
icon_state = "captain"
|
||||
clockwork_warp_allowed = FALSE
|
||||
sound_environment = SOUND_AREA_WOODFLOOR
|
||||
|
||||
/area/crew_quarters/heads/captain/private
|
||||
name = "Captain's Quarters"
|
||||
icon_state = "captain"
|
||||
sound_environment = SOUND_AREA_WOODFLOOR
|
||||
|
||||
/area/crew_quarters/heads/chief
|
||||
name = "Chief Engineer's Office"
|
||||
@@ -404,10 +414,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/comms
|
||||
name = "Communications Relay"
|
||||
icon_state = "tcomsatcham"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/server
|
||||
name = "Messaging Server Room"
|
||||
icon_state = "server"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
//Crew
|
||||
|
||||
@@ -416,6 +428,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
icon_state = "Sleep"
|
||||
safe = TRUE
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/crew_quarters/dorms/male
|
||||
name = "Male Dorm"
|
||||
@@ -434,6 +447,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/toilet
|
||||
name = "Dormitory Toilets"
|
||||
icon_state = "toilet"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/toilet/auxiliary
|
||||
name = "Auxiliary Restrooms"
|
||||
@@ -468,6 +482,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Lounge"
|
||||
icon_state = "yellow"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
|
||||
|
||||
/area/crew_quarters/fitness
|
||||
name = "Fitness Room"
|
||||
@@ -496,15 +511,18 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/kitchen/backroom
|
||||
name = "Kitchen Coldroom"
|
||||
icon_state = "kitchen"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/crew_quarters/bar
|
||||
name = "Bar"
|
||||
icon_state = "bar"
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
sound_environment = SOUND_AREA_WOODFLOOR
|
||||
|
||||
/area/crew_quarters/bar/atrium
|
||||
name = "Atrium"
|
||||
icon_state = "bar"
|
||||
sound_environment = SOUND_AREA_WOODFLOOR
|
||||
|
||||
/area/crew_quarters/electronic_marketing_den
|
||||
name = "Electronic Marketing Den"
|
||||
@@ -520,6 +538,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/crew_quarters/theatre
|
||||
name = "Theatre"
|
||||
icon_state = "Theatre"
|
||||
sound_environment = SOUND_AREA_WOODFLOOR
|
||||
|
||||
/area/crew_quarters/theatre/abandoned
|
||||
name = "Abandoned Theatre"
|
||||
@@ -540,10 +559,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
icon_state = "library"
|
||||
flags_1 = NONE
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
sound_environment = SOUND_AREA_LARGE_SOFTFLOOR
|
||||
|
||||
/area/library/lounge
|
||||
name = "Library Lounge"
|
||||
icon_state = "library"
|
||||
sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
|
||||
|
||||
/area/library/abandoned
|
||||
name = "Abandoned Library"
|
||||
@@ -558,6 +579,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
clockwork_warp_allowed = FALSE
|
||||
clockwork_warp_fail = "The consecration here prevents you from warping in."
|
||||
nightshift_public_area = NIGHTSHIFT_AREA_RECREATION
|
||||
sound_environment = SOUND_AREA_LARGE_ENCLOSED
|
||||
|
||||
/area/chapel/main
|
||||
name = "Chapel"
|
||||
@@ -573,6 +595,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/chapel/asteroid
|
||||
name = "Chapel Asteroid"
|
||||
icon_state = "explored"
|
||||
sound_environment = SOUND_AREA_ASTEROID
|
||||
|
||||
/area/chapel/asteroid/monastery
|
||||
name = "Monastery Asteroid"
|
||||
@@ -584,12 +607,14 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/lawoffice
|
||||
name = "Law Office"
|
||||
icon_state = "law"
|
||||
sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
|
||||
|
||||
|
||||
//Engineering
|
||||
|
||||
/area/engine
|
||||
ambientsounds = ENGINEERING
|
||||
sound_environment = SOUND_AREA_LARGE_ENCLOSED
|
||||
|
||||
/area/engine/engine_smes
|
||||
name = "Engineering SMES"
|
||||
@@ -607,14 +632,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/engine/atmospherics_engine
|
||||
name = "Atmospherics Engine"
|
||||
icon_state = "atmos_engine"
|
||||
sound_environment = SOUND_AREA_LARGE_ENCLOSED
|
||||
|
||||
/area/engine/supermatter
|
||||
name = "Supermatter Engine"
|
||||
icon_state = "engine_sm"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/engine/break_room
|
||||
name = "Engineering Foyer"
|
||||
icon_state = "engine_foyer"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/engine/gravity_generator
|
||||
name = "Gravity Generator Room"
|
||||
@@ -629,6 +657,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/engine/storage
|
||||
name = "Engineering Storage"
|
||||
icon_state = "engi_storage"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/engine/storage_shared
|
||||
name = "Shared Engineering Storage"
|
||||
@@ -648,10 +677,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
blob_allowed = FALSE
|
||||
flags_1 = NONE
|
||||
ambientsounds = ENGINEERING
|
||||
sound_environment = SOUND_AREA_SPACE
|
||||
|
||||
/area/solar/fore
|
||||
name = "Fore Solar Array"
|
||||
icon_state = "yellow"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/solar/aft
|
||||
name = "Aft Solar Array"
|
||||
@@ -757,6 +788,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
icon_state = "gateway"
|
||||
music = "signal"
|
||||
ambientsounds = ENGINEERING
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
//MedBay
|
||||
|
||||
@@ -764,11 +796,13 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Medical"
|
||||
icon_state = "medbay3"
|
||||
ambientsounds = MEDICAL
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/medical/abandoned
|
||||
name = "Abandoned Medbay"
|
||||
icon_state = "medbay3"
|
||||
music = 'sound/ambience/signal.ogg'
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/medical/medbay/central
|
||||
name = "Medbay Central"
|
||||
@@ -810,6 +844,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/medical/patients_rooms
|
||||
name = "Patients' Rooms"
|
||||
icon_state = "patients"
|
||||
sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
|
||||
|
||||
/area/medical/patients_rooms/room_a
|
||||
name = "Patient Room A"
|
||||
@@ -828,6 +863,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Morgue"
|
||||
icon_state = "morgue"
|
||||
ambientsounds = SPOOKY
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/medical/chemistry
|
||||
name = "Chemistry"
|
||||
@@ -868,6 +904,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Security"
|
||||
icon_state = "security"
|
||||
ambientsounds = HIGHSEC
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/security/main
|
||||
name = "Security Office"
|
||||
@@ -880,6 +917,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/security/courtroom
|
||||
name = "Courtroom"
|
||||
icon_state = "courtroom"
|
||||
sound_environment = SOUND_AREA_LARGE_ENCLOSED
|
||||
|
||||
/area/security/prison
|
||||
name = "Prison Wing"
|
||||
@@ -892,10 +930,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/security/processing/cremation
|
||||
name = "Security Crematorium"
|
||||
icon_state = "sec_prison"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/security/warden
|
||||
name = "Brig Control"
|
||||
icon_state = "Warden"
|
||||
sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
|
||||
|
||||
/area/security/armory
|
||||
name = "Armory"
|
||||
@@ -909,6 +949,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/security/detectives_office/private_investigators_office
|
||||
name = "Private Investigator's Office"
|
||||
icon_state = "detective"
|
||||
sound_environment = SOUND_AREA_SMALL_SOFTFLOOR
|
||||
|
||||
/area/security/range
|
||||
name = "Firing Range"
|
||||
@@ -986,18 +1027,17 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/quartermaster
|
||||
name = "Quartermasters"
|
||||
icon_state = "quart"
|
||||
|
||||
///////////WORK IN PROGRESS//////////
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/quartermaster/sorting
|
||||
name = "Delivery Office"
|
||||
icon_state = "cargo_delivery"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/quartermaster/warehouse
|
||||
name = "Warehouse"
|
||||
icon_state = "cargo_warehouse"
|
||||
|
||||
////////////WORK IN PROGRESS//////////
|
||||
sound_environment = SOUND_AREA_LARGE_ENCLOSED
|
||||
|
||||
/area/quartermaster/office
|
||||
name = "Cargo Office"
|
||||
@@ -1006,6 +1046,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/quartermaster/storage
|
||||
name = "Cargo Bay"
|
||||
icon_state = "cargo_bay"
|
||||
sound_environment = SOUND_AREA_LARGE_ENCLOSED
|
||||
|
||||
/area/quartermaster/qm
|
||||
name = "Quartermaster's Office"
|
||||
@@ -1035,10 +1076,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Custodial Closet"
|
||||
icon_state = "janitor"
|
||||
flags_1 = NONE
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/hydroponics
|
||||
name = "Hydroponics"
|
||||
icon_state = "hydro"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/hydroponics/garden
|
||||
name = "Garden"
|
||||
@@ -1047,6 +1090,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/hydroponics/garden/abandoned
|
||||
name = "Abandoned Garden"
|
||||
icon_state = "abandoned_garden"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/hydroponics/garden/monastery
|
||||
name = "Monastery Garden"
|
||||
@@ -1057,6 +1101,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/science
|
||||
name = "Science Division"
|
||||
icon_state = "toxlab"
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/science/lab
|
||||
name = "Research and Development"
|
||||
@@ -1139,12 +1184,15 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/science/research/abandoned
|
||||
name = "Abandoned Research Lab"
|
||||
icon_state = "medresearch"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/science/nanite
|
||||
name = "Nanite Lab"
|
||||
icon_state = "toxmisc"
|
||||
|
||||
//Storage
|
||||
/area/storage
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/storage/tools
|
||||
name = "Auxiliary Tool Storage"
|
||||
@@ -1210,6 +1258,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
name = "Construction Area"
|
||||
icon_state = "yellow"
|
||||
ambientsounds = ENGINEERING
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/construction/minisat_exterior
|
||||
name = "Minisat Exterior"
|
||||
@@ -1218,6 +1267,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/construction/mining/aux_base
|
||||
name = "Auxiliary Base Construction"
|
||||
icon_state = "yellow"
|
||||
sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/construction/mining/aux_base/closet
|
||||
name = "Auxiliary Closet Construction"
|
||||
@@ -1273,6 +1323,8 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
|
||||
|
||||
//AI
|
||||
/area/ai_monitored
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/ai_monitored/security/armory
|
||||
name = "Armory"
|
||||
@@ -1297,10 +1349,12 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/ai_monitored/turret_protected/ai_upload
|
||||
name = "AI Upload Chamber"
|
||||
icon_state = "ai_upload"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/ai_monitored/turret_protected/ai_upload_foyer
|
||||
name = "AI Upload Access"
|
||||
icon_state = "ai_foyer"
|
||||
sound_environment = SOUND_AREA_SMALL_ENCLOSED
|
||||
|
||||
/area/ai_monitored/turret_protected/ai
|
||||
name = "AI Chamber"
|
||||
@@ -1309,6 +1363,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/ai_monitored/turret_protected/aisat
|
||||
name = "AI Satellite"
|
||||
icon_state = "ai"
|
||||
sound_environment = SOUND_ENVIRONMENT_ROOM
|
||||
|
||||
/area/ai_monitored/turret_protected/aisat/atmos
|
||||
name = "AI Satellite Atmos"
|
||||
@@ -1333,6 +1388,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/ai_monitored/turret_protected/aisat_interior
|
||||
name = "AI Satellite Antechamber"
|
||||
icon_state = "ai"
|
||||
sound_environment = SOUND_AREA_LARGE_ENCLOSED
|
||||
|
||||
/area/ai_monitored/turret_protected/AIsatextFP
|
||||
name = "AI Sat Ext"
|
||||
@@ -1386,6 +1442,7 @@ NOTE: there are two lists of areas in the end of this file: centcom and station
|
||||
/area/tcommsat/computer
|
||||
name = "Telecomms Control Room"
|
||||
icon_state = "tcomsatcomp"
|
||||
sound_environment = SOUND_AREA_MEDIUM_SOFTFLOOR
|
||||
|
||||
/area/tcommsat/server
|
||||
name = "Telecomms Server Room"
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
clockwork_warp_allowed = FALSE
|
||||
var/list/obj/machinery/camera/motioncameras = list()
|
||||
var/list/datum/weakref/motionTargets = list()
|
||||
sound_environment = SOUND_ENVIRONMENT_ROOM
|
||||
|
||||
/area/ai_monitored/Initialize(mapload)
|
||||
. = ..()
|
||||
|
||||
@@ -1,16 +1,72 @@
|
||||
// Areas.dm
|
||||
|
||||
|
||||
/**
|
||||
* # area
|
||||
*
|
||||
* A grouping of tiles into a logical space, mostly used by map editors
|
||||
*/
|
||||
/area
|
||||
level = null
|
||||
name = "Space"
|
||||
icon = 'icons/turf/areas.dmi'
|
||||
icon_state = "unknown"
|
||||
layer = AREA_LAYER
|
||||
plane = BLACKNESS_PLANE //Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE.
|
||||
//Keeping this on the default plane, GAME_PLANE, will make area overlays fail to render on FLOOR_PLANE.
|
||||
plane = BLACKNESS_PLANE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
invisibility = INVISIBILITY_LIGHTING
|
||||
|
||||
var/fire = null
|
||||
///Whether there is an atmos alarm in this area
|
||||
var/atmosalm = FALSE
|
||||
var/poweralm = FALSE
|
||||
var/lightswitch = TRUE
|
||||
|
||||
/// All beauty in this area combined, only includes indoor area.
|
||||
var/totalbeauty = 0
|
||||
/// Beauty average per open turf in the area
|
||||
var/beauty = 0
|
||||
/// If a room is too big it doesn't have beauty.
|
||||
var/beauty_threshold = 150
|
||||
|
||||
/// For space, the asteroid, lavaland, etc. Used with blueprints or with weather to determine if we are adding a new area (vs editing a station room)
|
||||
var/outdoors = FALSE
|
||||
|
||||
/// Size of the area in open turfs, only calculated for indoors areas.
|
||||
var/areasize = 0
|
||||
|
||||
/// Bonus mood for being in this area
|
||||
var/mood_bonus = 0
|
||||
/// Mood message for being here, only shows up if mood_bonus != 0
|
||||
var/mood_message = "<span class='nicegreen'>This area is pretty nice!\n</span>"
|
||||
|
||||
///Will objects this area be needing power?
|
||||
var/requires_power = TRUE
|
||||
/// This gets overridden to 1 for space in area/Initialize().
|
||||
var/always_unpowered = FALSE
|
||||
|
||||
var/power_equip = TRUE
|
||||
var/power_light = TRUE
|
||||
var/power_environ = TRUE
|
||||
|
||||
var/has_gravity = FALSE
|
||||
|
||||
var/parallax_movedir = 0
|
||||
|
||||
var/list/ambientsounds = GENERIC
|
||||
flags_1 = CAN_BE_DIRTY_1
|
||||
|
||||
var/list/firedoors
|
||||
var/list/cameras
|
||||
var/list/firealarms
|
||||
var/firedoors_last_closed_on = 0
|
||||
|
||||
|
||||
///This datum, if set, allows terrain generation behavior to be ran on Initialize()
|
||||
// var/datum/map_generator/map_generator
|
||||
|
||||
///Used to decide what kind of reverb the area makes sound have
|
||||
var/sound_environment = SOUND_ENVIRONMENT_NONE
|
||||
|
||||
/// CIT SPECIFIC VARS
|
||||
|
||||
/// Set in New(); preserves the name set by the map maker, even if renamed by the Blueprints.
|
||||
var/map_name
|
||||
|
||||
@@ -37,29 +93,8 @@
|
||||
/// Considered space for hull shielding
|
||||
var/considered_hull_exterior = FALSE
|
||||
|
||||
var/fire = null
|
||||
var/atmos = TRUE
|
||||
var/atmosalm = FALSE
|
||||
var/poweralm = TRUE
|
||||
var/lightswitch = TRUE
|
||||
|
||||
var/totalbeauty = 0 //All beauty in this area combined, only includes indoor area.
|
||||
var/beauty = 0 // Beauty average per open turf in the area
|
||||
var/beauty_threshold = 150 //If a room is too big it doesn't have beauty.
|
||||
|
||||
var/requires_power = TRUE
|
||||
/// This gets overridden to 1 for space in area/Initialize().
|
||||
var/always_unpowered = FALSE
|
||||
|
||||
/// For space, the asteroid, lavaland, etc. Used with blueprints to determine if we are adding a new area (vs editing a station room)
|
||||
var/outdoors = FALSE
|
||||
|
||||
/// Size of the area in open turfs, only calculated for indoors areas.
|
||||
var/areasize = 0
|
||||
|
||||
var/power_equip = TRUE
|
||||
var/power_light = TRUE
|
||||
var/power_environ = TRUE
|
||||
var/music = null
|
||||
var/used_equip = 0
|
||||
var/used_light = 0
|
||||
@@ -68,7 +103,6 @@
|
||||
var/static_light = 0
|
||||
var/static_environ
|
||||
|
||||
var/has_gravity = 0
|
||||
/// Are you forbidden from teleporting to the area? (centcom, mobs, wizard, hand teleporter)
|
||||
var/noteleport = FALSE
|
||||
/// Hides area from player Teleport function.
|
||||
@@ -80,15 +114,6 @@
|
||||
|
||||
var/no_air = null
|
||||
|
||||
var/parallax_movedir = 0
|
||||
|
||||
var/list/ambientsounds = GENERIC
|
||||
flags_1 = CAN_BE_DIRTY_1
|
||||
|
||||
var/list/firedoors
|
||||
var/list/cameras
|
||||
var/list/firealarms
|
||||
var/firedoors_last_closed_on = 0
|
||||
var/xenobiology_compatible = FALSE //Can the Xenobio management console transverse this area by default?
|
||||
var/list/canSmoothWithAreas //typecache to limit the areas that atoms in this area can smooth with
|
||||
|
||||
@@ -107,10 +132,24 @@
|
||||
|
||||
var/nightshift_public_area = NIGHTSHIFT_AREA_NONE //considered a public area for nightshift
|
||||
|
||||
/*Adding a wizard area teleport list because motherfucking lag -- Urist*/
|
||||
/*I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game*/
|
||||
|
||||
/**
|
||||
* A list of teleport locations
|
||||
*
|
||||
* Adding a wizard area teleport list because motherfucking lag -- Urist
|
||||
* I am far too lazy to make it a proper list of areas so I'll just make it run the usual telepot routine at the start of the game
|
||||
*/
|
||||
GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
|
||||
/**
|
||||
* Generate a list of turfs you can teleport to from the areas list
|
||||
*
|
||||
* Includes areas if they're not a shuttle or not not teleport or have no contents
|
||||
*
|
||||
* The chosen turf is the first item in the areas contents that is a station level
|
||||
*
|
||||
* The returned list of turfs is sorted by name
|
||||
*/
|
||||
/proc/process_teleport_locs()
|
||||
for(var/V in GLOB.sortedAreas)
|
||||
var/area/AR = V
|
||||
@@ -124,11 +163,19 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
if (picked && is_station_level(picked.z))
|
||||
GLOB.teleportlocs[AR.name] = AR
|
||||
|
||||
sortTim(GLOB.teleportlocs, /proc/cmp_text_dsc)
|
||||
|
||||
// ===
|
||||
sortTim(GLOB.teleportlocs, /proc/cmp_text_asc)
|
||||
|
||||
/**
|
||||
* Called when an area loads
|
||||
*
|
||||
* Adds the item to the GLOB.areas_by_type list based on area type
|
||||
*/
|
||||
/area/New()
|
||||
// This interacts with the map loader, so it needs to be set immediately
|
||||
// rather than waiting for atoms to initialize.
|
||||
if (unique)
|
||||
GLOB.areas_by_type[type] = src
|
||||
|
||||
if(!minimap_color) // goes in New() because otherwise it doesn't fucking work
|
||||
// generate one using the icon_state
|
||||
if(icon_state && icon_state != "unknown")
|
||||
@@ -137,14 +184,18 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
minimap_color = I.GetPixel(1,1)
|
||||
else // no icon state? use random.
|
||||
minimap_color = rgb(rand(50,70),rand(50,70),rand(50,70)) // This interacts with the map loader, so it needs to be set immediately
|
||||
// rather than waiting for atoms to initialize.
|
||||
if (unique)
|
||||
GLOB.areas_by_type[type] = src
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Initalize this area
|
||||
*
|
||||
* intializes the dynamic area lighting and also registers the area with the z level via
|
||||
* reg_in_areas_in_z
|
||||
*
|
||||
* returns INITIALIZE_HINT_LATELOAD
|
||||
*/
|
||||
/area/Initialize()
|
||||
icon_state = ""
|
||||
layer = AREA_LAYER
|
||||
map_name = name // Save the initial (the name set in the map) name of the area.
|
||||
canSmoothWithAreas = typecacheof(canSmoothWithAreas)
|
||||
|
||||
@@ -198,29 +249,55 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/**
|
||||
* Sets machine power levels in the area
|
||||
*/
|
||||
/area/LateInitialize()
|
||||
if(!base_area) //we don't want to run it twice.
|
||||
power_change() // all machines set to current power level, also updates icon
|
||||
update_beauty()
|
||||
|
||||
/area/proc/reg_in_areas_in_z()
|
||||
if(contents.len)
|
||||
var/list/areas_in_z = SSmapping.areas_in_z
|
||||
var/z
|
||||
update_areasize()
|
||||
for(var/i in 1 to contents.len)
|
||||
var/atom/thing = contents[i]
|
||||
if(!thing)
|
||||
continue
|
||||
z = thing.z
|
||||
break
|
||||
if(!z)
|
||||
WARNING("No z found for [src]")
|
||||
return
|
||||
if(!areas_in_z["[z]"])
|
||||
areas_in_z["[z]"] = list()
|
||||
areas_in_z["[z]"] += src
|
||||
/// Soon ™
|
||||
/area/proc/RunGeneration()
|
||||
// if(map_generator)
|
||||
// map_generator = new map_generator()
|
||||
// var/list/turfs = list()
|
||||
// for(var/turf/T in contents)
|
||||
// turfs += T
|
||||
// map_generator.generate_terrain(turfs)
|
||||
|
||||
/area/proc/test_gen()
|
||||
// if(map_generator)
|
||||
// var/list/turfs = list()
|
||||
// for(var/turf/T in contents)
|
||||
// turfs += T
|
||||
// map_generator.generate_terrain(turfs)
|
||||
|
||||
/**
|
||||
* Register this area as belonging to a z level
|
||||
*
|
||||
* Ensures the item is added to the SSmapping.areas_in_z list for this z
|
||||
*/
|
||||
/area/proc/reg_in_areas_in_z()
|
||||
if(!length(contents))
|
||||
return
|
||||
var/list/areas_in_z = SSmapping.areas_in_z
|
||||
update_areasize()
|
||||
if(!z)
|
||||
WARNING("No z found for [src]")
|
||||
return
|
||||
if(!areas_in_z["[z]"])
|
||||
areas_in_z["[z]"] = list()
|
||||
areas_in_z["[z]"] += src
|
||||
|
||||
/**
|
||||
* Destroy an area and clean it up
|
||||
*
|
||||
* Removes the area from GLOB.areas_by_type and also stops it processing on SSobj
|
||||
*
|
||||
* This is despite the fact that no code appears to put it on SSobj, but
|
||||
* who am I to argue with old coders
|
||||
*/
|
||||
/area/Destroy()
|
||||
if(GLOB.areas_by_type[type] == src)
|
||||
GLOB.areas_by_type[type] = null
|
||||
@@ -240,6 +317,11 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
return ..()
|
||||
|
||||
/**
|
||||
* Generate a power alert for this area
|
||||
*
|
||||
* Sends to all ai players, alert consoles, drones and alarm monitor programs in the world
|
||||
*/
|
||||
/area/proc/poweralert(state, obj/source)
|
||||
if (state != poweralm)
|
||||
poweralm = state
|
||||
@@ -521,6 +603,13 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
used_environ += amount
|
||||
|
||||
|
||||
/**
|
||||
* Call back when an atom enters an area
|
||||
*
|
||||
* Sends signals COMSIG_AREA_ENTERED and COMSIG_ENTER_AREA (to the atom)
|
||||
*
|
||||
* If the area has ambience, then it plays some ambience music to the ambience channel
|
||||
*/
|
||||
/area/Entered(atom/movable/M, atom/OldLoc)
|
||||
set waitfor = FALSE
|
||||
SEND_SIGNAL(src, COMSIG_AREA_ENTERED, M)
|
||||
@@ -563,6 +652,12 @@ GLOBAL_LIST_EMPTY(teleportlocs)
|
||||
return FALSE //Too big
|
||||
beauty = totalbeauty / areasize
|
||||
|
||||
|
||||
/**
|
||||
* Called when an atom exits an area
|
||||
*
|
||||
* Sends signals COMSIG_AREA_EXITED and COMSIG_EXIT_AREA (to the atom)
|
||||
*/
|
||||
/area/Exited(atom/movable/M)
|
||||
SEND_SIGNAL(src, COMSIG_AREA_EXITED, M)
|
||||
SEND_SIGNAL(M, COMSIG_EXIT_AREA, src) //The atom that exits the area
|
||||
|
||||
@@ -9,6 +9,7 @@ Unused icons for new areas are "awaycontent1" ~ "awaycontent30"
|
||||
icon_state = "away"
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
ambientsounds = AWAY_MISSION
|
||||
sound_environment = SOUND_ENVIRONMENT_ROOM
|
||||
|
||||
/area/awaymission/beach
|
||||
name = "Beach"
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_DISABLED
|
||||
flags_1 = 0
|
||||
hidden = TRUE
|
||||
sound_environment = SOUND_ENVIRONMENT_PADDED_CELL
|
||||
|
||||
var/obj/machinery/computer/holodeck/linked
|
||||
var/restricted = 0 // if true, program goes on emag list
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
flags_1 = NONE
|
||||
ambientsounds = MINING
|
||||
flora_allowed = FALSE
|
||||
sound_environment = SOUND_AREA_STANDARD_STATION
|
||||
|
||||
/area/mine/unexplored
|
||||
name = "Mine"
|
||||
@@ -86,6 +87,7 @@
|
||||
has_gravity = STANDARD_GRAVITY
|
||||
flags_1 = NONE
|
||||
flora_allowed = TRUE
|
||||
sound_environment = SOUND_AREA_LAVALAND
|
||||
|
||||
/area/lavaland/surface
|
||||
name = "Lavaland"
|
||||
@@ -139,6 +141,7 @@
|
||||
flags_1 = NONE
|
||||
flora_allowed = TRUE
|
||||
blob_allowed = FALSE
|
||||
sound_environment = SOUND_AREA_ICEMOON
|
||||
|
||||
/area/icemoon/surface
|
||||
name = "Icemoon"
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
hidden = TRUE
|
||||
dynamic_lighting = DYNAMIC_LIGHTING_FORCED
|
||||
ambientsounds = RUINS
|
||||
sound_environment = SOUND_ENVIRONMENT_STONEROOM
|
||||
|
||||
|
||||
/area/ruin/unpowered
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
icon_state = "shuttle"
|
||||
// Loading the same shuttle map at a different time will produce distinct area instances.
|
||||
unique = FALSE
|
||||
sound_environment = SOUND_ENVIRONMENT_ROOM
|
||||
|
||||
/area/shuttle/Initialize()
|
||||
if(!canSmoothWithAreas)
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
blocked = TRUE
|
||||
var/attackamt = rand(2,6)
|
||||
temp = "You attack for [attackamt] damage!"
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
|
||||
updateUsrDialog()
|
||||
if(turtle > 0)
|
||||
turtle--
|
||||
@@ -74,7 +74,7 @@
|
||||
var/pointamt = rand(1,3)
|
||||
var/healamt = rand(6,8)
|
||||
temp = "You use [pointamt] magic to heal for [healamt] damage!"
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
|
||||
updateUsrDialog()
|
||||
turtle++
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
blocked = TRUE
|
||||
var/chargeamt = rand(4,7)
|
||||
temp = "You regain [chargeamt] points"
|
||||
playsound(loc, 'sound/arcade/mana.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3)
|
||||
player_mp += chargeamt
|
||||
if(turtle > 0)
|
||||
turtle--
|
||||
@@ -124,7 +124,7 @@
|
||||
if(!gameover)
|
||||
gameover = TRUE
|
||||
temp = "[enemy_name] has fallen! Rejoice!"
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3)
|
||||
|
||||
if(obj_flags & EMAGGED)
|
||||
new /obj/effect/spawner/newbomb/timer/syndicate(loc)
|
||||
@@ -141,13 +141,13 @@
|
||||
else if ((obj_flags & EMAGGED) && (turtle >= 4))
|
||||
var/boomamt = rand(5,10)
|
||||
temp = "[enemy_name] throws a bomb, exploding you for [boomamt] damage!"
|
||||
playsound(loc, 'sound/arcade/boom.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/boom.ogg', 50, TRUE, extrarange = -3)
|
||||
player_hp -= boomamt
|
||||
|
||||
else if ((enemy_mp <= 5) && (prob(70)))
|
||||
var/stealamt = rand(2,3)
|
||||
temp = "[enemy_name] steals [stealamt] of your power!"
|
||||
playsound(loc, 'sound/arcade/steal.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3)
|
||||
player_mp -= stealamt
|
||||
updateUsrDialog()
|
||||
|
||||
@@ -155,27 +155,27 @@
|
||||
gameover = TRUE
|
||||
sleep(turn_speed)
|
||||
temp = "You have been drained! GAME OVER"
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
|
||||
if(obj_flags & EMAGGED)
|
||||
usr.gib()
|
||||
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "mana", (obj_flags & EMAGGED ? "emagged":"normal")))
|
||||
|
||||
else if ((enemy_hp <= 10) && (enemy_mp > 4))
|
||||
temp = "[enemy_name] heals for 4 health!"
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
|
||||
enemy_hp += 4
|
||||
enemy_mp -= 4
|
||||
|
||||
else
|
||||
var/attackamt = rand(3,6)
|
||||
temp = "[enemy_name] attacks for [attackamt] damage!"
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
|
||||
player_hp -= attackamt
|
||||
|
||||
if ((player_mp <= 0) || (player_hp <= 0))
|
||||
gameover = TRUE
|
||||
temp = "You have been crushed! GAME OVER"
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
|
||||
if(obj_flags & EMAGGED)
|
||||
usr.gib()
|
||||
SSblackbox.record_feedback("nested tally", "arcade_results", 1, list("loss", "hp", (obj_flags & EMAGGED ? "emagged":"normal")))
|
||||
|
||||
@@ -78,7 +78,7 @@
|
||||
columns = 0
|
||||
mine_placed = 0
|
||||
if(href_list["Easy"])
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
@@ -87,7 +87,7 @@
|
||||
columns = 10
|
||||
mine_limit = 10
|
||||
if(href_list["Intermediate"])
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
@@ -96,7 +96,7 @@
|
||||
columns = 17
|
||||
mine_limit = 40
|
||||
if(href_list["Hard"])
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
flag_text = "OFF"
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
@@ -110,9 +110,9 @@
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
reset_board = TRUE
|
||||
difficulty = "Custom"
|
||||
playsound(loc, startup_sound, 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, startup_sound, 50, FALSE, extrarange = -3)
|
||||
if(href_list["Flag"])
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
if(!flagging)
|
||||
flagging = TRUE
|
||||
flag_text = "ON"
|
||||
@@ -122,10 +122,10 @@
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_emag2.ogg', 50, FALSE, extrarange = -3)
|
||||
web += "<font size='2'>Explode in the game, explode in real life!<br>What difficulty do you want to play?<br><br><br><br><b><a href='byond://?src=[REF(src)];Easy=1'><font color='#cc66ff'>Easy (9x9 board, 10 mines)</font></a><br><a href='byond://?src=[REF(src)];Intermediate=1'><font color='#cc66ff'>Intermediate (16x16 board, 40 mines)</font></a><br><a href='byond://?src=[REF(src)];Hard=1'><font color='#cc66ff'>Hard (16x30 board, 99 mines)</font></a><br><a href='byond://?src=[REF(src)];Custom=1'><font color='#cc66ff'>Custom</font>"
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_startup.ogg', 50, FALSE, extrarange = -3)
|
||||
web += web_difficulty_menu
|
||||
|
||||
if(game_status == MINESWEEPER_GAME_PLAYING)
|
||||
@@ -152,7 +152,7 @@
|
||||
if(table[y1][x1] < 10 && table[y1][x1] >= 0) //Check that it's not already revealed, and stop flag removal if we're out of flag mode
|
||||
table[y1][x1] += 10
|
||||
if(table[y1][x1] != 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
else
|
||||
if(game_status != MINESWEEPER_GAME_LOST && game_status != MINESWEEPER_GAME_WON)
|
||||
game_status = MINESWEEPER_GAME_LOST
|
||||
@@ -164,14 +164,14 @@
|
||||
if(mine_sound)
|
||||
switch(rand(1,3)) //Play every time a mine is hit
|
||||
if(1)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion1.ogg', 50, FALSE, extrarange = -3)
|
||||
if(2)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion2.ogg', 50, FALSE, extrarange = -3)
|
||||
if(3)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_explosion3.ogg', 50, FALSE, extrarange = -3)
|
||||
mine_sound = FALSE
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_boardpress.ogg', 50, FALSE, extrarange = -3)
|
||||
if(table[y1][x1] >= 0) //Check that it's not already flagged
|
||||
table[y1][x1] -= 10
|
||||
else if(table[y1][x1] < 0) //If flagged, remove the flag
|
||||
@@ -182,7 +182,7 @@
|
||||
game_status = MINESWEEPER_GAME_PLAYING
|
||||
if(table[y1][x1] >= 10) //If revealed, become unrevealed!
|
||||
if(mine_sound)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
mine_sound = FALSE
|
||||
table[y1][x1] -= 10
|
||||
if(table[y1][x1] > 10 && !reset_board)
|
||||
@@ -243,10 +243,10 @@
|
||||
if(safe_squares_revealed >= win_condition && game_status == MINESWEEPER_GAME_PLAYING)
|
||||
game_status = MINESWEEPER_GAME_WON
|
||||
if(rows < 10 || columns < 10) //If less than easy difficulty
|
||||
playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_winfail.ogg', 50, FALSE, extrarange = -3)
|
||||
say("You cleared the board of all mines, but you picked too small of a board! Try again with at least a 9x9 board!")
|
||||
else
|
||||
playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_win.ogg', 50, FALSE, extrarange = -3)
|
||||
say("You cleared the board of all mines! Congratulations!")
|
||||
if(CHECK_BITFIELD(obj_flags, EMAGGED))
|
||||
var/itemname
|
||||
@@ -299,32 +299,32 @@
|
||||
ENABLE_BITFIELD(obj_flags, EMAGGED)
|
||||
if(game_status == MINESWEEPER_GAME_MAIN_MENU)
|
||||
to_chat(user, "<span class='warning'>An ominous tune plays from the arcade's speakers!</span>")
|
||||
playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, 0, extrarange = 3, falloff = 10)
|
||||
playsound(user, 'sound/arcade/minesweeper_emag1.ogg', 100, FALSE, extrarange = 3)
|
||||
else //Can't let you do that, star fox!
|
||||
to_chat(user, "<span class='warning'>The machine buzzes and sparks... the game has been reset!</span>")
|
||||
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, 0, extrarange = 3, falloff = 10) //Loud buzz
|
||||
playsound(user, 'sound/machines/buzz-sigh.ogg', 100, FALSE, extrarange = 3) //Loud buzz
|
||||
game_status = MINESWEEPER_GAME_MAIN_MENU
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/computer/arcade/minesweeper/proc/custom_generation(mob/user)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10) //Entered into the menu so ping sound
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3) //Entered into the menu so ping sound
|
||||
var/new_rows = input(user, "How many rows do you want? (Minimum: 4, Maximum: 30)", "Minesweeper Rows") as null|num
|
||||
if(!new_rows || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
new_rows = clamp(new_rows + 1, 4, 30)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
var/new_columns = input(user, "How many columns do you want? (Minimum: 4, Maximum: 50)", "Minesweeper Squares") as null|num
|
||||
if(!new_columns || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
new_columns = clamp(new_columns + 1, 4, 50)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
var/grid_area = (new_rows - 1) * (new_columns - 1)
|
||||
var/lower_limit = round(grid_area*0.156)
|
||||
var/upper_limit = round(grid_area*0.85)
|
||||
var/new_mine_limit = input(user, "How many mines do you want? (Minimum: [lower_limit], Maximum: [upper_limit])", "Minesweeper Mines") as null|num
|
||||
if(!new_mine_limit || !user.canUseTopic(src, !hasSiliconAccessInArea(user)))
|
||||
return FALSE
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, 0, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/minesweeper_menuselect.ogg', 50, FALSE, extrarange = -3)
|
||||
rows = new_rows
|
||||
columns = new_columns
|
||||
mine_limit = clamp(new_mine_limit, lower_limit, upper_limit)
|
||||
|
||||
@@ -17,14 +17,14 @@
|
||||
to_chat(c_user, "<span class='warning'>You move your hand towards the machine, and begin to hesitate as a bloodied guillotine emerges from inside of it...</span>")
|
||||
if(do_after(c_user, 50, target = src))
|
||||
to_chat(c_user, "<span class='userdanger'>The guillotine drops on your arm, and the machine sucks it in!</span>")
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, TRUE, -1)
|
||||
var/which_hand = BODY_ZONE_L_ARM
|
||||
if(!(c_user.active_hand_index % 2))
|
||||
which_hand = BODY_ZONE_R_ARM
|
||||
var/obj/item/bodypart/chopchop = c_user.get_bodypart(which_hand)
|
||||
chopchop.dismember()
|
||||
qdel(chopchop)
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, 1, extrarange = -3, falloff = 10)
|
||||
playsound(loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3)
|
||||
for(var/i=1; i<=rand(3,5); i++)
|
||||
prizevend(user)
|
||||
else
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
|
||||
/obj/machinery/quantumpad/proc/doteleport(mob/user, obj/machinery/quantumpad/target_pad = linked_pad)
|
||||
if(target_pad)
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
|
||||
playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE)
|
||||
teleporting = TRUE
|
||||
|
||||
spawn(teleport_speed)
|
||||
@@ -155,9 +155,9 @@
|
||||
target_pad.sparks()
|
||||
|
||||
flick("qpad-beam", src)
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
|
||||
playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE)
|
||||
flick("qpad-beam", target_pad)
|
||||
playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, 1, extrarange = 3, falloff = 5)
|
||||
playsound(get_turf(target_pad), 'sound/weapons/emitter2.ogg', 25, TRUE)
|
||||
for(var/atom/movable/ROI in get_turf(src))
|
||||
if(QDELETED(ROI))
|
||||
continue //sleeps in CHECK_TICK
|
||||
|
||||
@@ -347,9 +347,9 @@
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/H in hearing_mobs)
|
||||
if(!istype(H.loc, /obj/item/dogborg/sleeper))
|
||||
H.playsound_local(source, null, 45, falloff = 0, S = pred_death)
|
||||
H.playsound_local(source, null, 45, S = pred_death)
|
||||
else if(H in contents)
|
||||
H.playsound_local(source, null, 65, falloff = 0, S = prey_death)
|
||||
H.playsound_local(source, null, 65, S = prey_death)
|
||||
for(var/belly in T.vore_organs)
|
||||
var/obj/belly/B = belly
|
||||
for(var/atom/movable/thing in B)
|
||||
@@ -391,9 +391,9 @@
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/H in hearing_mobs)
|
||||
if(!istype(H.loc, /obj/item/dogborg/sleeper))
|
||||
H.playsound_local(source, null, 45, falloff = 0, S = pred_digest)
|
||||
H.playsound_local(source, null, 45, S = pred_digest)
|
||||
else if(H in contents)
|
||||
H.playsound_local(source, null, 65, falloff = 0, S = prey_digest)
|
||||
H.playsound_local(source, null, 65, S = prey_digest)
|
||||
|
||||
update_gut(hound)
|
||||
|
||||
|
||||
@@ -1,4 +1,47 @@
|
||||
/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, soundenvwet = -10000, soundenvdry = 0)
|
||||
|
||||
///Default override for echo
|
||||
/sound
|
||||
echo = list(
|
||||
0, // Direct
|
||||
0, // DirectHF
|
||||
-10000, // Room, -10000 means no low frequency sound reverb
|
||||
-10000, // RoomHF, -10000 means no high frequency sound reverb
|
||||
0, // Obstruction
|
||||
0, // ObstructionLFRatio
|
||||
0, // Occlusion
|
||||
0.25, // OcclusionLFRatio
|
||||
1.5, // OcclusionRoomRatio
|
||||
1.0, // OcclusionDirectRatio
|
||||
0, // Exclusion
|
||||
1.0, // ExclusionLFRatio
|
||||
0, // OutsideVolumeHF
|
||||
0, // DopplerFactor
|
||||
0, // RolloffFactor
|
||||
0, // RoomRolloffFactor
|
||||
1.0, // AirAbsorptionFactor
|
||||
0, // Flags (1 = Auto Direct, 2 = Auto Room, 4 = Auto RoomHF)
|
||||
)
|
||||
environment = SOUND_ENVIRONMENT_NONE //Default to none so sounds without overrides dont get reverb
|
||||
|
||||
/*! playsound
|
||||
|
||||
playsound is a proc used to play a 3D sound in a specific range. This uses SOUND_RANGE + extra_range to determine that.
|
||||
|
||||
source - Origin of sound
|
||||
soundin - Either a file, or a string that can be used to get an SFX
|
||||
vol - The volume of the sound, excluding falloff and pressure affection.
|
||||
vary - bool that determines if the sound changes pitch every time it plays
|
||||
extrarange - modifier for sound range. This gets added on top of SOUND_RANGE
|
||||
falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive.
|
||||
frequency - playback speed of audio
|
||||
channel - The channel the sound is played at
|
||||
pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space)
|
||||
ignore_walls - Whether or not the sound can pass through walls.
|
||||
falloff_distance - Distance at which falloff begins. Sound is at peak volume (in regards to falloff) aslong as it is in this range.
|
||||
|
||||
*/
|
||||
|
||||
/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, use_reverb = TRUE)
|
||||
if(isarea(source))
|
||||
CRASH("playsound(): source is an area")
|
||||
|
||||
@@ -10,26 +53,60 @@
|
||||
//allocate a channel if necessary now so its the same for everyone
|
||||
channel = channel || SSsounds.random_available_channel()
|
||||
|
||||
// Looping through the player list has the added bonus of working for mobs inside containers
|
||||
// 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]
|
||||
var/maxdistance = SOUND_RANGE + extrarange
|
||||
var/source_z = turf_source.z
|
||||
var/list/listeners = SSmobs.clients_by_zlevel[source_z].Copy()
|
||||
|
||||
var/turf/above_turf = SSmapping.get_turf_above(turf_source)
|
||||
var/turf/below_turf = SSmapping.get_turf_below(turf_source)
|
||||
|
||||
if(!ignore_walls) //these sounds don't carry through walls
|
||||
listeners = listeners & hearers(maxdistance,turf_source)
|
||||
|
||||
if(above_turf && istransparentturf(above_turf))
|
||||
listeners += hearers(maxdistance,above_turf)
|
||||
|
||||
if(below_turf && istransparentturf(turf_source))
|
||||
listeners += hearers(maxdistance,below_turf)
|
||||
|
||||
else
|
||||
if(above_turf && istransparentturf(above_turf))
|
||||
listeners += SSmobs.clients_by_zlevel[above_turf.z]
|
||||
|
||||
if(below_turf && istransparentturf(turf_source))
|
||||
listeners += SSmobs.clients_by_zlevel[below_turf.z]
|
||||
|
||||
for(var/P in listeners)
|
||||
var/mob/M = P
|
||||
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])
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance)
|
||||
for(var/P in SSmobs.dead_players_by_zlevel[source_z])
|
||||
var/mob/M = P
|
||||
if(get_dist(M, turf_source) <= maxdistance)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, soundenvwet, soundenvdry)
|
||||
M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance)
|
||||
|
||||
/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff, channel = 0, pressure_affected = TRUE, sound/S, envwet = -10000, envdry = 0, manual_x, manual_y, distance_multiplier = 1)
|
||||
if(audiovisual_redirect)
|
||||
var/turf/T = get_turf(src)
|
||||
audiovisual_redirect.playsound_local(turf_source, soundin, vol, vary, frequency, falloff, channel, pressure_affected, S, 0, -1000, turf_source.x - T.x, turf_source.y - T.y, distance_multiplier)
|
||||
/*! playsound
|
||||
|
||||
playsound_local is a proc used to play a sound directly on a mob from a specific turf.
|
||||
This is called by playsound to send sounds to players, in which case it also gets the max_distance of that sound.
|
||||
|
||||
turf_source - Origin of sound
|
||||
soundin - Either a file, or a string that can be used to get an SFX
|
||||
vol - The volume of the sound, excluding falloff
|
||||
vary - bool that determines if the sound changes pitch every time it plays
|
||||
frequency - playback speed of audio
|
||||
falloff_exponent - Rate of falloff for the audio. Higher means quicker drop to low volume. Should generally be over 1 to indicate a quick dive to 0 rather than a slow dive.
|
||||
channel - The channel the sound is played at
|
||||
pressure_affected - Whether or not difference in pressure affects the sound (E.g. if you can hear in space)
|
||||
max_distance - The peak distance of the sound, if this is a 3D sound
|
||||
falloff_distance - Distance at which falloff begins, if this is a 3D sound
|
||||
distance_multiplier - Can be used to multiply the distance at which the sound is heard
|
||||
|
||||
*/
|
||||
|
||||
/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, use_reverb = TRUE)
|
||||
if(!client || !can_hear())
|
||||
return
|
||||
|
||||
@@ -39,7 +116,6 @@
|
||||
S.wait = 0 //No queue
|
||||
S.channel = channel || SSsounds.random_available_channel()
|
||||
S.volume = vol
|
||||
S.environment = 7
|
||||
|
||||
if(vary)
|
||||
if(frequency)
|
||||
@@ -51,13 +127,13 @@
|
||||
var/turf/T = get_turf(src)
|
||||
|
||||
//sound volume falloff with distance
|
||||
var/distance = 0
|
||||
if(!manual_x && !manual_y)
|
||||
distance = get_dist(T, turf_source)
|
||||
var/distance = get_dist(T, turf_source)
|
||||
|
||||
distance *= distance_multiplier
|
||||
|
||||
S.volume -= max(distance - world.view, 0) * 2 //multiplicative falloff to add on top of natural audio falloff.
|
||||
if(max_distance) //If theres no max_distance we're not a 3D sound, so no falloff.
|
||||
S.volume -= (max(distance - falloff_distance, 0) ** (1 / falloff_exponent)) / ((max(max_distance, distance) - falloff_distance) ** (1 / falloff_exponent)) * S.volume
|
||||
//https://www.desmos.com/calculator/sqdfl8ipgf
|
||||
|
||||
if(pressure_affected)
|
||||
//Atmosphere affects sound
|
||||
@@ -72,8 +148,6 @@
|
||||
else //space
|
||||
pressure_factor = 0
|
||||
|
||||
S.echo = list(envdry, null, envwet, null, null, null, null, null, null, null, null, null, null, 1, 1, 1, null, null)
|
||||
|
||||
if(distance <= 1)
|
||||
pressure_factor = max(pressure_factor, 0.15) //touching the source of the sound
|
||||
|
||||
@@ -83,31 +157,36 @@
|
||||
if(S.volume <= 0)
|
||||
return //No sound
|
||||
|
||||
var/dx = 0 // Hearing from the right/left
|
||||
if(!manual_x)
|
||||
dx = turf_source.x - T.x
|
||||
else
|
||||
dx = manual_x
|
||||
var/dx = turf_source.x - T.x // Hearing from the right/left
|
||||
S.x = dx * distance_multiplier
|
||||
var/dz = 0 // Hearing from infront/behind
|
||||
if(!manual_x)
|
||||
dz = turf_source.y - T.y
|
||||
else
|
||||
dz = manual_y
|
||||
var/dz = turf_source.y - T.y // Hearing from infront/behind
|
||||
S.z = dz * distance_multiplier
|
||||
// The y value is for above your head, but there is no ceiling in 2d spessmens.
|
||||
S.y = 1
|
||||
S.falloff = (falloff ? falloff : FALLOFF_SOUNDS)
|
||||
var/dy = (turf_source.z - T.z) * 5 * distance_multiplier // Hearing from above / below, multiplied by 5 because we assume height is further along coords.
|
||||
S.y = dy
|
||||
|
||||
S.falloff = max_distance || 1 //use max_distance, else just use 1 as we are a direct sound so falloff isnt relevant.
|
||||
|
||||
if(S.environment == SOUND_ENVIRONMENT_NONE)
|
||||
if(sound_environment_override != SOUND_ENVIRONMENT_NONE)
|
||||
S.environment = sound_environment_override
|
||||
else
|
||||
var/area/A = get_area(src)
|
||||
if(A.sound_environment != SOUND_ENVIRONMENT_NONE)
|
||||
S.environment = A.sound_environment
|
||||
|
||||
if(use_reverb && S.environment != SOUND_ENVIRONMENT_NONE) //We have reverb, reset our echo setting
|
||||
S.echo[3] = 0 //Room setting, 0 means normal reverb
|
||||
S.echo[4] = 0 //RoomHF setting, 0 means normal reverb.
|
||||
|
||||
SEND_SOUND(src, S)
|
||||
|
||||
/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, falloff = FALSE, channel = 0, pressure_affected = FALSE, sound/S)
|
||||
/proc/sound_to_playing_players(soundin, volume = 100, vary = FALSE, frequency = 0, channel = 0, pressure_affected = FALSE, sound/S)
|
||||
if(!S)
|
||||
S = sound(get_sfx(soundin))
|
||||
for(var/m in GLOB.player_list)
|
||||
if(ismob(m) && !isnewplayer(m))
|
||||
var/mob/M = m
|
||||
M.playsound_local(M, null, volume, vary, frequency, falloff, channel, pressure_affected, S)
|
||||
M.playsound_local(M, null, volume, vary, frequency, null, channel, pressure_affected, S)
|
||||
|
||||
/mob/proc/stop_sound_channel(chan)
|
||||
SEND_SOUND(src, sound(null, repeat = 0, wait = 0, channel = chan))
|
||||
@@ -130,14 +209,14 @@
|
||||
/proc/get_sfx(soundin)
|
||||
if(istext(soundin))
|
||||
switch(soundin)
|
||||
if ("explosion_creaking") // from skyrat-ss13/skyrat13/pull/3295
|
||||
soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg')
|
||||
if ("hull_creaking") // from skyrat-ss13/skyrat13/pull/3295
|
||||
soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg')
|
||||
if ("shatter")
|
||||
soundin = pick('sound/effects/glassbr1.ogg','sound/effects/glassbr2.ogg','sound/effects/glassbr3.ogg')
|
||||
if ("explosion")
|
||||
soundin = pick('sound/effects/explosion1.ogg','sound/effects/explosion2.ogg')
|
||||
if ("explosion_creaking")
|
||||
soundin = pick('sound/effects/explosioncreak1.ogg', 'sound/effects/explosioncreak2.ogg')
|
||||
if ("hull_creaking")
|
||||
soundin = pick('sound/effects/creak1.ogg', 'sound/effects/creak2.ogg', 'sound/effects/creak3.ogg')
|
||||
if ("sparks")
|
||||
soundin = pick('sound/effects/sparks1.ogg','sound/effects/sparks2.ogg','sound/effects/sparks3.ogg','sound/effects/sparks4.ogg')
|
||||
if ("rustle")
|
||||
|
||||
@@ -213,7 +213,7 @@
|
||||
if(canrespec)
|
||||
to_chat(owner.current, "<span class='notice'>We have removed our evolutions from this form, and are now ready to readapt.</span>")
|
||||
reset_powers()
|
||||
playsound(get_turf(owner.current), 'sound/effects/lingreadapt.ogg', 75, TRUE, 5, soundenvwet = 0)
|
||||
playsound(get_turf(owner.current), 'sound/effects/lingreadapt.ogg', 75, TRUE, 5)
|
||||
canrespec = 0
|
||||
SSblackbox.record_feedback("tally", "changeling_power_purchase", 1, "Readapt")
|
||||
return 1
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
for(var/obj/machinery/light/L in range(4, user))
|
||||
L.on = 1
|
||||
L.break_light_tube()
|
||||
playsound(get_turf(user), 'sound/effects/lingscreech.ogg', 75, TRUE, 5, soundenvwet = 0)
|
||||
playsound(get_turf(user), 'sound/effects/lingscreech.ogg', 75, TRUE, 5)
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/changeling/dissonant_shriek
|
||||
@@ -49,5 +49,5 @@
|
||||
L.on = 1
|
||||
L.break_light_tube()
|
||||
empulse_using_range(get_turf(user), 8, TRUE)
|
||||
playsound(get_turf(user), 'sound/effects/lingempscreech.ogg', 75, TRUE, 5, soundenvwet = 0)
|
||||
playsound(get_turf(user), 'sound/effects/lingempscreech.ogg', 75, TRUE, 5)
|
||||
return TRUE
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
for(var/mob/M in GLOB.player_list)
|
||||
if(M.z == z)
|
||||
if(get_dist(src, M) >= 7)
|
||||
M.playsound_local(src, 'sound/magic/blink.ogg', 10, FALSE, falloff = 10)
|
||||
M.playsound_local(src, 'sound/magic/blink.ogg', 10, FALSE)
|
||||
else
|
||||
M.playsound_local(src, 'sound/magic/blink.ogg', 50, FALSE)
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
var/path = "sound/chatter/[phomeme]_[length].ogg"
|
||||
|
||||
playsound(loc, path,
|
||||
vol = 40, vary = 0, extrarange = 3, falloff = FALSE)
|
||||
vol = 40, vary = 0, extrarange = 3)
|
||||
|
||||
sleep((length + 1) * chatter_get_sleep_multiplier(phomeme))
|
||||
|
||||
|
||||
@@ -82,5 +82,5 @@
|
||||
var/sound/music_played = sound(soundfile)
|
||||
for(var/i in hearing_mobs)
|
||||
var/mob/M = i
|
||||
M.playsound_local(source, null, volume * using_instrument.volume_multiplier, falloff = 5, S = music_played)
|
||||
M.playsound_local(source, null, volume * using_instrument.volume_multiplier, S = music_played)
|
||||
// Could do environment and echo later but not for now
|
||||
|
||||
@@ -594,10 +594,18 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
drunkenness = max(drunkenness - (drunkenness * 0.04), 0)
|
||||
if(drunkenness >= 6)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "drunk", /datum/mood_event/drunk)
|
||||
if(prob(25))
|
||||
slurring += 2
|
||||
jitteriness = max(jitteriness - 3, 0)
|
||||
// throw_alert("drunk", /atom/movable/screen/alert/drunk)
|
||||
if(HAS_TRAIT(src, TRAIT_DRUNK_HEALING))
|
||||
adjustBruteLoss(-0.12, FALSE)
|
||||
adjustFireLoss(-0.06, FALSE)
|
||||
sound_environment_override = SOUND_ENVIRONMENT_PSYCHOTIC
|
||||
else
|
||||
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "drunk")
|
||||
clear_alert("drunk")
|
||||
sound_environment_override = SOUND_ENVIRONMENT_NONE
|
||||
|
||||
if(mind && (mind.assigned_role == "Scientist" || mind.assigned_role == "Research Director"))
|
||||
if(SSresearch.science_tech)
|
||||
|
||||
@@ -8,10 +8,12 @@
|
||||
overlay_fullscreen("high", /obj/screen/fullscreen/high)
|
||||
throw_alert("high", /obj/screen/alert/high)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/high)
|
||||
sound_environment_override = SOUND_ENVIRONMENT_DRUGGED
|
||||
else
|
||||
clear_fullscreen("high")
|
||||
clear_alert("high")
|
||||
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "high")
|
||||
sound_environment_override = SOUND_ENVIRONMENT_NONE
|
||||
|
||||
/mob/living/carbon/set_drugginess(amount)
|
||||
druggy = max(amount, 0)
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
blocks_emissive = EMISSIVE_BLOCK_GENERIC
|
||||
|
||||
vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of mob in openspace.
|
||||
|
||||
|
||||
attack_hand_is_action = TRUE
|
||||
attack_hand_unwieldlyness = CLICK_CD_MELEE
|
||||
attack_hand_speed = 0
|
||||
@@ -169,3 +169,6 @@
|
||||
var/typing_indicator_timerid
|
||||
/// Current state of our typing indicator. Used for cut overlay, DO NOT RUNTIME ASSIGN OTHER THAN FROM SHOW/CLEAR. Used to absolutely ensure we do not get stuck overlays.
|
||||
var/mutable_appearance/typing_indicator_current
|
||||
|
||||
///Override for sound_environments. If this is set the user will always hear a specific type of reverb (Instead of the area defined reverb)
|
||||
var/sound_environment_override = SOUND_ENVIRONMENT_NONE
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
// user?.mind?.adjust_experience(/datum/skill/gaming, 1)
|
||||
if(boss_hp <= 0)
|
||||
heads_up = "You have crushed [boss_name]! Rejoice!"
|
||||
playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/win.ogg', 50, TRUE, extrarange = -3)
|
||||
game_active = FALSE
|
||||
program_icon_state = "arcade_off"
|
||||
if(istype(computer))
|
||||
@@ -37,7 +37,7 @@
|
||||
sleep(10)
|
||||
else if(player_hp <= 0 || player_mp <= 0)
|
||||
heads_up = "You have been defeated... how will the station survive?"
|
||||
playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/lose.ogg', 50, TRUE, extrarange = -3)
|
||||
game_active = FALSE
|
||||
program_icon_state = "arcade_off"
|
||||
if(istype(computer))
|
||||
@@ -57,17 +57,17 @@
|
||||
return
|
||||
if (boss_mp <= 5)
|
||||
heads_up = "[boss_mpamt] magic power has been stolen from you!"
|
||||
playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/steal.ogg', 50, TRUE, extrarange = -3)
|
||||
player_mp -= boss_mpamt
|
||||
boss_mp += boss_mpamt
|
||||
else if(boss_mp > 5 && boss_hp <12)
|
||||
heads_up = "[boss_name] heals for [bossheal] health!"
|
||||
playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
|
||||
boss_hp += bossheal
|
||||
boss_mp -= boss_mpamt
|
||||
else
|
||||
heads_up = "[boss_name] attacks you for [boss_attackamt] damage!"
|
||||
playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
|
||||
player_hp -= boss_attackamt
|
||||
|
||||
pause_state = FALSE
|
||||
@@ -106,7 +106,7 @@
|
||||
attackamt = rand(2,6)// + rand(0, gamerSkill)
|
||||
pause_state = TRUE
|
||||
heads_up = "You attack for [attackamt] damage."
|
||||
playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/hit.ogg', 50, TRUE, extrarange = -3)
|
||||
boss_hp -= attackamt
|
||||
sleep(10)
|
||||
game_check()
|
||||
@@ -123,7 +123,7 @@
|
||||
healcost = rand(1, maxPointCost)
|
||||
pause_state = TRUE
|
||||
heads_up = "You heal for [healamt] damage."
|
||||
playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/heal.ogg', 50, TRUE, extrarange = -3)
|
||||
player_hp += healamt
|
||||
player_mp -= healcost
|
||||
sleep(10)
|
||||
@@ -136,7 +136,7 @@
|
||||
rechargeamt = rand(4,7)// + rand(0, gamerSkill)
|
||||
pause_state = TRUE
|
||||
heads_up = "You regain [rechargeamt] magic power."
|
||||
playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3, falloff = 10)
|
||||
playsound(computer.loc, 'sound/arcade/mana.ogg', 50, TRUE, extrarange = -3)
|
||||
player_mp += rechargeamt
|
||||
sleep(10)
|
||||
game_check()
|
||||
|
||||
@@ -807,7 +807,7 @@
|
||||
for(var/mob/M in SSmobs.clients_by_zlevel[z])
|
||||
var/dist_far = get_dist(M, distant_source)
|
||||
if(dist_far <= long_range && dist_far > range)
|
||||
M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100, falloff = 20)
|
||||
M.playsound_local(distant_source, "sound/effects/[selected_sound]_distance.ogg", 100)
|
||||
else if(dist_far <= range)
|
||||
var/source
|
||||
if(engine_list.len == 0)
|
||||
@@ -819,7 +819,7 @@
|
||||
if(dist_near < closest_dist)
|
||||
source = O
|
||||
closest_dist = dist_near
|
||||
M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100, falloff = range / 2)
|
||||
M.playsound_local(source, "sound/effects/[selected_sound].ogg", 100)
|
||||
|
||||
// Losing all initial engines should get you 2
|
||||
// Adding another set of engines at 0.5 time
|
||||
|
||||
@@ -247,7 +247,7 @@
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
var/sound/releasement = GLOB.pred_release_sounds[release_sound]
|
||||
H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
H.playsound_local(owner.loc, releasement, 75, TRUE)
|
||||
else if(H?.client && (H in contents))
|
||||
var/sound/releasement = GLOB.prey_release_sounds[release_sound]
|
||||
SEND_SOUND(H,releasement)
|
||||
@@ -303,7 +303,7 @@
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
var/sound/releasement = GLOB.pred_release_sounds[release_sound]
|
||||
H.playsound_local(owner.loc, releasement, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
H.playsound_local(owner.loc, releasement, 75, TRUE)
|
||||
else if(H?.client && (H in contents))
|
||||
var/sound/releasement = GLOB.prey_release_sounds[release_sound]
|
||||
SEND_SOUND(H,releasement)
|
||||
@@ -365,7 +365,7 @@
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
var/sound/eating = GLOB.pred_vore_sounds[vore_sound]
|
||||
H.playsound_local(owner.loc, eating, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
H.playsound_local(owner.loc, eating, 75, TRUE)
|
||||
else if(H?.client && (H in contents))
|
||||
var/sound/eating = GLOB.prey_vore_sounds[vore_sound]
|
||||
SEND_SOUND(H,eating)
|
||||
@@ -584,14 +584,14 @@
|
||||
if(is_wet)
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc) || (H.loc != src.contents)))
|
||||
H.playsound_local(owner.loc, pred_struggle_snuggle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
H.playsound_local(owner.loc, pred_struggle_snuggle, 75, TRUE)
|
||||
else if(H && H.client && (H in contents))
|
||||
SEND_SOUND(H,prey_struggle_snuggle)
|
||||
|
||||
else
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client)
|
||||
H.playsound_local(owner.loc, struggle_rustle, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
H.playsound_local(owner.loc, struggle_rustle, 75, TRUE)
|
||||
|
||||
for(var/mob/living/H in hearing_mobs)
|
||||
if(H && H.client && (isturf(H.loc)))
|
||||
|
||||
@@ -245,7 +245,7 @@
|
||||
last_hearcheck = world.time
|
||||
for(var/mob/M in hearing_mobs) //so we don't fill the whole room with the sound effect
|
||||
if(M && M.client && (isturf(M.loc) || (M.loc != src.contents))) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
|
||||
M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
|
||||
M.playsound_local(owner.loc, play_sound, 75, TRUE)
|
||||
//these are all external sound triggers now, so it's ok.
|
||||
if(to_update)
|
||||
for(var/mob/living/M in contents)
|
||||
|
||||
Reference in New Issue
Block a user