PluginProbe
Code Block Pro – Beautiful Syntax Highlighting / 1.27.6
Code Block Pro – Beautiful Syntax Highlighting v1.27.6
1.27.1 1.27.2 1.27.3 1.27.4 1.27.5 1.27.6 1.27.7 1.28.0 1.3.0 1.4.0 1.5.0 1.5.1 1.5.2 1.6.0 1.7.0 1.8.0 1.9.0 1.9.1 1.9.2 1.9.3 trunk 1.1.0 1.10.0 1.11.0 1.11.1 All 63 releases
code-block-pro / build / shiki / samples / dm.sample

dm.sample in Code Block Pro – Beautiful Syntax Highlighting 1.27.6, at build/shiki/samples/dm.sample

78 lines 2.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 //Allows you to set a theme for a set of areas without tying them to looping sounds explicitly
2 /datum/component/area_sound_manager
3 //area -> looping sound type
4 var/list/area_to_looping_type = list()
5 //Current sound loop
6 var/datum/looping_sound/our_loop
7 //A list of "acceptable" z levels to be on. If you leave this, we're gonna delete ourselves
8 var/list/accepted_zs
9 //The timer id of our current start delay, if it exists
10 var/timerid
11
12 /datum/component/area_sound_manager/Initialize(area_loop_pairs, change_on, remove_on, acceptable_zs)
13 if(!ismovable(parent))
14 return
15 area_to_looping_type = area_loop_pairs
16 accepted_zs = acceptable_zs
17 change_the_track()
18
19 RegisterSignal(parent, COMSIG_MOVABLE_MOVED, .proc/react_to_move)
20 RegisterSignal(parent, COMSIG_MOVABLE_Z_CHANGED, .proc/react_to_z_move)
21 RegisterSignal(parent, change_on, .proc/handle_change)
22 RegisterSignal(parent, remove_on, .proc/handle_removal)
23
24 /datum/component/area_sound_manager/Destroy(force, silent)
25 QDEL_NULL(our_loop)
26 . = ..()
27
28 /datum/component/area_sound_manager/proc/react_to_move(datum/source, atom/oldloc, dir, forced)
29 SIGNAL_HANDLER
30 var/list/loop_lookup = area_to_looping_type
31 if(loop_lookup[get_area(oldloc)] == loop_lookup[get_area(parent)])
32 return
33 change_the_track(TRUE)
34
35 /datum/component/area_sound_manager/proc/react_to_z_move(datum/source, old_z, new_z)
36 SIGNAL_HANDLER
37 if(!length(accepted_zs) || (new_z in accepted_zs))
38 return
39 qdel(src)
40
41 /datum/component/area_sound_manager/proc/handle_removal(datum/source)
42 SIGNAL_HANDLER
43 qdel(src)
44
45 /datum/component/area_sound_manager/proc/handle_change(datum/source)
46 SIGNAL_HANDLER
47 change_the_track()
48
49 /datum/component/area_sound_manager/proc/change_the_track(skip_start = FALSE)
50 var/time_remaining = 0
51
52 if(our_loop)
53 var/our_id = our_loop.timerid || timerid
54 if(our_id)
55 time_remaining = timeleft(our_id, SSsound_loops) || 0
56 //Time left will sometimes return negative values, just ignore them and start a new sound loop now
57 time_remaining = max(time_remaining, 0)
58 QDEL_NULL(our_loop)
59
60 var/area/our_area = get_area(parent)
61 var/new_loop_type = area_to_looping_type[our_area]
62 if(!new_loop_type)
63 return
64
65 our_loop = new new_loop_type(parent, FALSE, TRUE, skip_start)
66
67 //If we're still playing, wait a bit before changing the sound so we don't double up
68 if(time_remaining)
69 timerid = addtimer(CALLBACK(src, .proc/start_looping_sound), time_remaining, TIMER_UNIQUE | TIMER_CLIENT_TIME | TIMER_STOPPABLE | TIMER_NO_HASH_WAIT | TIMER_DELETE_ME, SSsound_loops)
70 return
71 timerid = null
72 our_loop.start()
73
74 /datum/component/area_sound_manager/proc/start_looping_sound()
75 timerid = null
76 if(our_loop)
77 our_loop.start()
78