Merge remote-tracking branch 'upstream/master' into just-defibrillator-things
@@ -6,11 +6,14 @@
|
||||
#define CHANNEL_HEARTBEAT 1020 //sound channel for heartbeats
|
||||
#define CHANNEL_BUZZ 1019
|
||||
#define CHANNEL_AMBIENCE 1018
|
||||
#define CHANNEL_ENGINE 1017 // Engine ambient sounds
|
||||
|
||||
#define USER_VOLUME(M, C) M?.client?.prefs.get_channel_volume(C)
|
||||
|
||||
//THIS SHOULD ALWAYS BE THE LOWEST ONE!
|
||||
//KEEP IT UPDATED
|
||||
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1017
|
||||
#define CHANNEL_HIGHEST_AVAILABLE 1016
|
||||
|
||||
#define MAX_INSTRUMENT_CHANNELS (128 * 6)
|
||||
|
||||
|
||||
@@ -84,13 +84,13 @@
|
||||
continue
|
||||
|
||||
if(!use_name)
|
||||
error("Loadout - Missing display name: [G]")
|
||||
stack_trace("Loadout - Missing display name: [G]")
|
||||
continue
|
||||
if(!initial(G.cost))
|
||||
error("Loadout - Missing cost: [G]")
|
||||
stack_trace("Loadout - Missing cost: [G]")
|
||||
continue
|
||||
if(!initial(G.path))
|
||||
error("Loadout - Missing path definition: [G]")
|
||||
stack_trace("Loadout - Missing path definition: [G]")
|
||||
continue
|
||||
|
||||
if(!GLOB.loadout_categories[use_category])
|
||||
|
||||
@@ -2116,6 +2116,8 @@ GLOBAL_DATUM_INIT(dview_mob, /mob/dview, new)
|
||||
return "White Noise"
|
||||
if(CHANNEL_AMBIENCE)
|
||||
return "Ambience"
|
||||
if(CHANNEL_ENGINE)
|
||||
return "Engine Ambience"
|
||||
|
||||
/proc/slot_bitfield_to_slot(input_slot_flags) // Kill off this garbage ASAP; slot flags and clothing flags should be IDENTICAL. GOSH DARN IT. Doesn't work with ears or pockets, either.
|
||||
switch(input_slot_flags)
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
var/falloff_exponent
|
||||
var/muted = TRUE
|
||||
var/falloff_distance
|
||||
/// Channel of the audio, random otherwise
|
||||
var/channel
|
||||
|
||||
/datum/looping_sound/New(list/_output_atoms = list(), start_immediately = FALSE, _direct = FALSE)
|
||||
if(!mid_sounds)
|
||||
@@ -75,14 +77,16 @@
|
||||
var/list/atoms_cache = output_atoms
|
||||
var/sound/S = sound(soundfile)
|
||||
if(direct)
|
||||
S.channel = SSsounds.random_available_channel()
|
||||
S.volume = volume
|
||||
S.channel = channel || SSsounds.random_available_channel()
|
||||
for(var/i in 1 to atoms_cache.len)
|
||||
var/atom/thing = atoms_cache[i]
|
||||
if(direct)
|
||||
if(ismob(thing))
|
||||
var/mob/M = thing
|
||||
S.volume = volume * (USER_VOLUME(M, channel) || 1)
|
||||
SEND_SOUND(thing, S)
|
||||
else
|
||||
playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance)
|
||||
playsound(thing, S, volume, vary, extra_range, falloff_exponent = falloff_exponent, falloff_distance = falloff_distance, channel = channel)
|
||||
|
||||
/datum/looping_sound/proc/get_sound(looped, _mid_sounds)
|
||||
if(!_mid_sounds)
|
||||
|
||||
@@ -16,3 +16,4 @@
|
||||
falloff_exponent = 10
|
||||
falloff_distance = 5
|
||||
vary = TRUE
|
||||
channel = CHANNEL_ENGINE
|
||||
|
||||
@@ -250,10 +250,9 @@
|
||||
var/name_list = list("Aries", "Leo", "Sagittarius", "Taurus", "Virgo", "Capricorn", "Gemini", "Libra", "Aquarius", "Cancer", "Scorpio", "Pisces")
|
||||
|
||||
/obj/item/guardiancreator/attack_self(mob/living/user)
|
||||
for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.alive_mob_list)
|
||||
if(G.summoner == user)
|
||||
to_chat(user, "You already have a [mob_name]!")
|
||||
return
|
||||
if(has_guardian(user))
|
||||
to_chat(user, "You already have a [mob_name]!")
|
||||
return
|
||||
if(user.mind && (user.mind.changeling || user.mind.vampire))
|
||||
to_chat(user, "[ling_failure]")
|
||||
return
|
||||
@@ -285,6 +284,10 @@
|
||||
|
||||
if(candidates.len)
|
||||
theghost = pick(candidates)
|
||||
if(has_guardian(user))
|
||||
to_chat(user, "You already have a [mob_name]!")
|
||||
used = FALSE
|
||||
return
|
||||
spawn_guardian(user, theghost.key, guardian_type)
|
||||
else
|
||||
to_chat(user, "[failure_message]")
|
||||
@@ -295,6 +298,13 @@
|
||||
if(used)
|
||||
. += "<span class='notice'>[used_message]</span>"
|
||||
|
||||
/obj/item/guardiancreator/proc/has_guardian(mob/living/user)
|
||||
for(var/mob/living/simple_animal/hostile/guardian/G in GLOB.alive_mob_list)
|
||||
if(G.summoner == user)
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
|
||||
/obj/item/guardiancreator/proc/spawn_guardian(mob/living/user, key, guardian_type)
|
||||
var/pickedtype = /mob/living/simple_animal/hostile/guardian/punch
|
||||
switch(guardian_type)
|
||||
|
||||
@@ -279,9 +279,14 @@
|
||||
if(toggle_command_bold)
|
||||
var/job = tcm.sender_job
|
||||
if((job in ert_jobs) || (job in heads) || (job in cc_jobs))
|
||||
for(var/datum/multilingual_say_piece/S in message_pieces)
|
||||
if(S.message)
|
||||
S.message = "<b>[capitalize(S.message)]</b>" // This only capitalizes the first word
|
||||
for(var/I in 1 to length(message_pieces))
|
||||
var/datum/multilingual_say_piece/S = message_pieces[I]
|
||||
if(!S.message)
|
||||
continue
|
||||
if(I == 1 && !istype(S.speaking, /datum/language/noise)) // Capitalise the first section only, unless it's an emote.
|
||||
S.message = "[capitalize(S.message)]"
|
||||
S.message = "<b>[S.message]</b>" // Make everything bolded
|
||||
|
||||
|
||||
// Language Conversion
|
||||
if(setting_language && valid_languages[setting_language])
|
||||
|
||||
@@ -164,10 +164,9 @@
|
||||
new /obj/item/clothing/shoes/jackboots(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/nyangirl/New()
|
||||
/obj/effect/landmark/costume/schoolgirl/New()
|
||||
. = ..()
|
||||
new /obj/item/clothing/under/schoolgirl(src.loc)
|
||||
new /obj/item/clothing/head/kitty(src.loc)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/landmark/costume/maid/New()
|
||||
|
||||
@@ -638,7 +638,7 @@
|
||||
/obj/item/twohanded/singularityhammer
|
||||
name = "singularity hammer"
|
||||
desc = "The pinnacle of close combat technology, the hammer harnesses the power of a miniaturized singularity to deal crushing blows."
|
||||
icon_state = "mjollnir0"
|
||||
icon_state = "singulohammer0"
|
||||
flags = CONDUCT
|
||||
slot_flags = SLOT_BACK
|
||||
force = 5
|
||||
@@ -665,7 +665,7 @@
|
||||
charged++
|
||||
|
||||
/obj/item/twohanded/singularityhammer/update_icon() //Currently only here to fuck with the on-mob icons.
|
||||
icon_state = "mjollnir[wielded]"
|
||||
icon_state = "singulohammer[wielded]"
|
||||
..()
|
||||
|
||||
/obj/item/twohanded/singularityhammer/proc/vortex(turf/pull, mob/wielder)
|
||||
|
||||
@@ -591,7 +591,7 @@
|
||||
verbs -= /obj/structure/table/verb/do_flip
|
||||
typecache_can_hold = typecacheof(typecache_can_hold)
|
||||
for(var/atom/movable/held in get_turf(src))
|
||||
if(is_type_in_typecache(held, typecache_can_hold))
|
||||
if(!held.anchored && held.move_resist != INFINITY && is_type_in_typecache(held, typecache_can_hold))
|
||||
held_items += held.UID()
|
||||
|
||||
/obj/structure/table/tray/Move(NewLoc, direct)
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
slot = slot_w_uniform
|
||||
sort_category = "Uniforms and Casual Dress"
|
||||
|
||||
/datum/gear/uniform/suits
|
||||
/datum/gear/uniform/suit
|
||||
subtype_path = /datum/gear/uniform/suit
|
||||
|
||||
//there's a lot more colors than I thought there were @_@
|
||||
|
||||
@@ -192,6 +192,7 @@ GLOBAL_LIST_INIT(special_role_times, list( //minimum age (in days) for accounts
|
||||
"1020" = 100, // CHANNEL_HEARTBEAT
|
||||
"1019" = 100, // CHANNEL_BUZZ
|
||||
"1018" = 100, // CHANNEL_AMBIENCE
|
||||
"1017" = 100, // CHANNEL_ENGINE
|
||||
)
|
||||
/// The volume mixer save timer handle. Used to debounce the DB call to save, to avoid spamming.
|
||||
var/volume_mixer_saving = null
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
plantname = "Red Onion Sprouts"
|
||||
weed_chance = 1
|
||||
product = /obj/item/reagent_containers/food/snacks/grown/onion/red
|
||||
mutatelist = list()
|
||||
reagents_add = list("vitamin" = 0.04, "plantmatter" = 0.1, "onionjuice" = 0.05)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/grown/onion/red
|
||||
|
||||
@@ -377,9 +377,9 @@
|
||||
if(last_accent_sound < world.time && prob(20))
|
||||
var/aggression = min(((damage / 800) * (power / 2500)), 1.0) * 100
|
||||
if(damage >= 300)
|
||||
playsound(src, "smdelam", max(50, aggression), FALSE, 40, 30, falloff_distance = 10)
|
||||
playsound(src, "smdelam", max(50, aggression), FALSE, 40, 30, falloff_distance = 10, channel = CHANNEL_ENGINE)
|
||||
else
|
||||
playsound(src, "smcalm", max(50, aggression), FALSE, 25, 25, falloff_distance = 10)
|
||||
playsound(src, "smcalm", max(50, aggression), FALSE, 25, 25, falloff_distance = 10, channel = CHANNEL_ENGINE)
|
||||
var/next_sound = round((100 - aggression) * 5)
|
||||
last_accent_sound = world.time + max(SUPERMATTER_ACCENT_SOUND_MIN_COOLDOWN, next_sound)
|
||||
|
||||
@@ -568,7 +568,7 @@
|
||||
zap_count += 1
|
||||
|
||||
if(zap_count >= 1)
|
||||
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10)
|
||||
playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, TRUE, extrarange = 10, channel = CHANNEL_ENGINE)
|
||||
for(var/i in 1 to zap_count)
|
||||
supermatter_zap(src, range, clamp(power*2, 4000, 20000), flags)
|
||||
|
||||
@@ -807,7 +807,7 @@
|
||||
icon_state = "darkmatter"
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/proc/supermatter_pull(turf/center, pull_range = 3)
|
||||
playsound(center, 'sound/weapons/marauder.ogg', 100, TRUE, extrarange = pull_range - world.view)
|
||||
playsound(center, 'sound/weapons/marauder.ogg', 100, TRUE, extrarange = pull_range - world.view, channel = CHANNEL_ENGINE)
|
||||
for(var/atom/movable/P in orange(pull_range,center))
|
||||
if((P.anchored || P.move_resist >= MOVE_FORCE_EXTREMELY_STRONG)) //move resist memes.
|
||||
if(istype(P, /obj/structure/closet))
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
move_the_basket_ball(4 + length(orbiting_balls) * 1.5)
|
||||
|
||||
playsound(loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30)
|
||||
playsound(loc, 'sound/magic/lightningbolt.ogg', 100, TRUE, extrarange = 30, channel = CHANNEL_ENGINE)
|
||||
|
||||
pixel_x = 0
|
||||
pixel_y = 0
|
||||
@@ -112,7 +112,7 @@
|
||||
energy_to_lower = energy_to_raise - 20
|
||||
energy_to_raise = energy_to_raise * 1.25
|
||||
|
||||
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, TRUE, extrarange = 30)
|
||||
playsound(src.loc, 'sound/magic/lightning_chargeup.ogg', 100, TRUE, extrarange = 30, channel = CHANNEL_ENGINE)
|
||||
addtimer(CALLBACK(src, .proc/new_mini_ball), 100)
|
||||
|
||||
else if(energy < energy_to_lower && length(orbiting_balls))
|
||||
|
||||
|
Before Width: | Height: | Size: 173 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 170 KiB After Width: | Height: | Size: 166 KiB |
|
Before Width: | Height: | Size: 89 KiB After Width: | Height: | Size: 88 KiB |
|
Before Width: | Height: | Size: 146 KiB After Width: | Height: | Size: 156 KiB |