Skip to content

Commit 2d9a296

Browse files
authored
Merge pull request #5234 from MistakeNot4892/tweak/boombox
Separating boombox from music-playing item functionality.
2 parents 324db69 + a656748 commit 2d9a296

File tree

7 files changed

+132
-112
lines changed

7 files changed

+132
-112
lines changed
Lines changed: 25 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,32 @@
1-
/obj/item/boombox
1+
/obj/item/music_player/boombox
22
name = "boombox"
33
desc = "A device used to emit rhythmic sounds, colloquially referred to as a 'boombox'. It's in a retro style (massive), and absolutely unwieldy."
4-
icon = 'icons/obj/items/device/boombox.dmi'
5-
icon_state = ICON_STATE_WORLD
6-
_base_attack_force = 7
7-
w_class = ITEM_SIZE_HUGE //forbid putting something that emits loud sounds forever into a backpack
84
origin_tech = @'{"magnets":2,"combat":1}'
95
material = /decl/material/solid/organic/plastic
106
matter = list(
117
/decl/material/solid/metal/copper = MATTER_AMOUNT_REINFORCEMENT,
128
/decl/material/solid/metal/aluminium = MATTER_AMOUNT_REINFORCEMENT,
139
/decl/material/solid/silicon = MATTER_AMOUNT_TRACE,
1410
)
15-
var/playing = 0
16-
var/track_num = 1
17-
var/music_volume = 20
18-
var/max_volume = 40
19-
var/frequency = 1
20-
var/datum/sound_token/sound_token
21-
var/list/datum/track/tracks
22-
var/sound_id
11+
player_name = "BOOMTASTIC 3000"
12+
interact_sound = "switch"
13+
icon = 'icons/obj/items/device/boombox.dmi'
14+
2315
var/break_chance = 3
2416
var/broken
2517
var/panel = TRUE
2618

27-
/obj/item/boombox/attack_self(var/mob/user)
28-
interact(user)
29-
30-
/obj/item/boombox/Initialize()
31-
. = ..()
32-
sound_id = "[type]_[sequential_id(type)]"
33-
tracks = setup_music_tracks(tracks)
34-
35-
/obj/item/boombox/emp_act(severity)
19+
/obj/item/music_player/boombox/emp_act(severity)
3620
boombox_break()
3721

38-
/obj/item/boombox/get_examine_strings(mob/user, distance, infix, suffix)
22+
/obj/item/music_player/boombox/get_examine_strings(mob/user, distance, infix, suffix)
3923
. = ..()
4024
if(!panel)
4125
. += SPAN_NOTICE("The front panel is unhinged.")
4226
if(broken)
4327
. += SPAN_WARNING("It's broken.")
4428

45-
/obj/item/boombox/Destroy()
46-
stop()
47-
. = ..()
48-
49-
/obj/item/boombox/interact(var/mob/user)
50-
if(!CanPhysicallyInteract(user))
51-
return
52-
var/dat = "<A href='byond://?src=\ref[src];tracknum=1;'>NEXT</a>"
53-
dat += "<A href='byond://?src=\ref[src];tracknum=-1;'>PREV</a>"
54-
dat += "<A href='byond://?src=\ref[src];start=1;'>PLAY</a>"
55-
dat += "<A href='byond://?src=\ref[src];stop=1;'>STOP</a>"
56-
dat += "<A href='byond://?src=\ref[src];voldown=1;'>VOL -</a>"
57-
dat += "<A href='byond://?src=\ref[src];volup=1;'>VOL +</a>"
58-
var/datum/browser/popup = new(user, "boombox", "BOOMTASTIC 3000", 290, 110)
59-
popup.set_content(dat)
60-
popup.open()
61-
62-
/obj/item/boombox/DefaultTopicState()
63-
return global.physical_topic_state
64-
65-
/obj/item/boombox/CouldUseTopic(var/mob/user)
66-
..()
67-
playsound(src, "switch", 40)
68-
69-
/obj/item/boombox/OnTopic(var/user, var/list/href_list)
70-
if(href_list["tracknum"])
71-
var/diff = text2num(href_list["tracknum"])
72-
track_num += diff
73-
if(track_num > tracks.len)
74-
track_num = 1
75-
else if (track_num < 1)
76-
track_num = tracks.len
77-
if(playing)
78-
start()
79-
return TOPIC_REFRESH
80-
if(href_list["stop"])
81-
stop()
82-
return TOPIC_HANDLED
83-
if(href_list["start"] && !broken)
84-
start()
85-
return TOPIC_HANDLED
86-
if(href_list["volup"])
87-
change_volume(music_volume + 10)
88-
return TOPIC_HANDLED
89-
if(href_list["voldown"])
90-
change_volume(music_volume - 10)
91-
return TOPIC_HANDLED
92-
93-
/obj/item/boombox/attackby(var/obj/item/used_item, var/mob/user)
29+
/obj/item/music_player/boombox/attackby(var/obj/item/used_item, var/mob/user)
9430
if(IS_SCREWDRIVER(used_item))
9531
if(!panel)
9632
user.visible_message(SPAN_NOTICE("\The [user] re-attaches \the [src]'s front panel with \the [used_item]."), SPAN_NOTICE("You re-attach \the [src]'s front panel."))
@@ -115,7 +51,7 @@
11551
else
11652
. = ..()
11753

118-
/obj/item/boombox/proc/AdjustFrequency(var/obj/item/used_item, var/mob/user)
54+
/obj/item/music_player/boombox/proc/AdjustFrequency(var/obj/item/used_item, var/mob/user)
11955
var/const/MIN_FREQUENCY = 0.5
12056
var/const/MAX_FREQUENCY = 1.5
12157

@@ -126,9 +62,9 @@
12662
var/tighten = "Tighten (play slower)"
12763
var/loosen = "Loosen (play faster)"
12864

129-
if(frequency > MIN_FREQUENCY)
65+
if(music_frequency > MIN_FREQUENCY)
13066
options += tighten
131-
if(frequency < MAX_FREQUENCY)
67+
if(music_frequency < MAX_FREQUENCY)
13268
options += loosen
13369

13470
var/operation = input(user, "How do you wish to adjust the player head?", "Adjust player", options[1]) as null|anything in options
@@ -143,61 +79,43 @@
14379
return FALSE
14480

14581
if(operation == loosen)
146-
frequency += 0.1
82+
music_frequency += 0.1
14783
else if(operation == tighten)
148-
frequency -= 0.1
149-
frequency = clamp(frequency, MIN_FREQUENCY, MAX_FREQUENCY)
84+
music_frequency -= 0.1
85+
music_frequency = clamp(music_frequency, MIN_FREQUENCY, MAX_FREQUENCY)
15086

15187
user.visible_message(SPAN_NOTICE("\The [user] adjusts \the [src]'s player head."), SPAN_NOTICE("You adjust \the [src]'s player head."))
15288
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
15389

154-
if(frequency > 1.0)
90+
if(music_frequency > 1.0)
15591
to_chat(user, SPAN_NOTICE("\The [src] should be playing faster than usual."))
156-
else if(frequency < 1.0)
92+
else if(music_frequency < 1.0)
15793
to_chat(user, SPAN_NOTICE("\The [src] should be playing slower than usual."))
15894
else
15995
to_chat(user, SPAN_NOTICE("\The [src] should be playing as fast as usual."))
16096

16197
return TRUE
16298

163-
/obj/item/boombox/proc/MayAdjust(var/mob/user)
99+
/obj/item/music_player/boombox/proc/MayAdjust(var/mob/user)
164100
if(playing)
165101
to_chat(user, "<span class='warning'>You can only adjust \the [src] when it's not playing.</span>")
166102
return FALSE
167103
return TRUE
168104

169-
/obj/item/boombox/on_update_icon()
170-
. = ..()
171-
icon_state = get_world_inventory_state()
172-
if(playing)
173-
icon_state = "[icon_state]_on"
174-
175-
/obj/item/boombox/proc/stop()
176-
playing = 0
177-
update_icon()
178-
QDEL_NULL(sound_token)
179-
180-
/obj/item/boombox/proc/start()
181-
QDEL_NULL(sound_token)
182-
var/datum/track/T = tracks[track_num]
183-
sound_token = play_looping_sound(src, sound_id, T.GetTrack(), volume = music_volume, frequency = frequency, range = 7, falloff = 4, prefer_mute = TRUE, preference = /datum/client_preference/play_game_music, streaming = TRUE)
184-
playing = 1
185-
update_icon()
186-
if(prob(break_chance))
187-
boombox_break()
188-
189-
/obj/item/boombox/proc/boombox_break()
105+
/obj/item/music_player/boombox/proc/boombox_break()
190106
audible_message(SPAN_WARNING("\The [src]'s speakers pop with a sharp crack!"))
191107
playsound(src.loc, 'sound/effects/snap.ogg', 100, 1)
192108
broken = TRUE
193109
stop()
194110

195-
/obj/item/boombox/proc/change_volume(var/new_volume)
196-
music_volume = clamp(new_volume, 0, max_volume)
197-
if(sound_token)
198-
sound_token.SetVolume(music_volume)
111+
/obj/item/music_player/boombox/start()
112+
if(broken)
113+
return
114+
. = ..()
115+
if(prob(break_chance))
116+
boombox_break()
199117

200118
/obj/random_multi/single_item/boombox
201119
name = "boombox spawnpoint"
202120
id = "boomtastic"
203-
item_path = /obj/item/boombox
121+
item_path = /obj/item/music_player/boombox
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
/obj/item/music_player
2+
abstract_type = /obj/item/music_player
3+
icon_state = ICON_STATE_WORLD
4+
_base_attack_force = 7
5+
w_class = ITEM_SIZE_HUGE //forbid putting something that emits loud sounds forever into a backpack
6+
7+
var/playing = 0
8+
var/track_num = 1
9+
var/music_volume = 20
10+
var/max_volume = 40
11+
var/datum/sound_token/sound_token
12+
var/list/datum/track/tracks
13+
var/sound_id
14+
var/player_name = "Music Player"
15+
var/interact_sound
16+
var/music_frequency = 1
17+
18+
/obj/item/music_player/on_update_icon()
19+
. = ..()
20+
icon_state = get_world_inventory_state()
21+
if(playing)
22+
icon_state = "[icon_state]_on"
23+
24+
/obj/item/music_player/proc/stop()
25+
playing = 0
26+
update_icon()
27+
QDEL_NULL(sound_token)
28+
29+
/obj/item/music_player/proc/start()
30+
QDEL_NULL(sound_token)
31+
var/datum/track/T = tracks[track_num]
32+
sound_token = play_looping_sound(src, sound_id, T.GetTrack(), volume = music_volume, frequency = music_frequency, range = 7, falloff = 4, prefer_mute = TRUE, preference = /datum/client_preference/play_game_music, streaming = TRUE)
33+
playing = 1
34+
update_icon()
35+
36+
/obj/item/music_player/attack_self(var/mob/user)
37+
interact(user)
38+
39+
/obj/item/music_player/Initialize()
40+
. = ..()
41+
sound_id = "[type]_[sequential_id(type)]"
42+
tracks = setup_music_tracks(tracks)
43+
44+
/obj/item/music_player/Destroy()
45+
stop()
46+
. = ..()
47+
48+
/obj/item/music_player/interact(var/mob/user)
49+
if(!CanPhysicallyInteract(user))
50+
return
51+
var/dat = list()
52+
var/datum/track/T = tracks[track_num]
53+
if(istype(T) && T.title)
54+
dat += "<h3>[T.title]</h3><br>"
55+
dat += "<A href='byond://?src=\ref[src];tracknum=1;'>NEXT</a>"
56+
dat += "<A href='byond://?src=\ref[src];tracknum=-1;'>PREV</a>"
57+
dat += "<A href='byond://?src=\ref[src];start=1;'>PLAY</a>"
58+
dat += "<A href='byond://?src=\ref[src];stop=1;'>STOP</a>"
59+
dat += "<A href='byond://?src=\ref[src];voldown=1;'>VOL -</a>"
60+
dat += "<A href='byond://?src=\ref[src];volup=1;'>VOL +</a>"
61+
var/datum/browser/popup = new(user, "music_player_[name]", "[player_name]", 350, 150)
62+
popup.set_content(JOINTEXT(dat))
63+
popup.open()
64+
65+
/obj/item/music_player/DefaultTopicState()
66+
return global.physical_topic_state
67+
68+
/obj/item/music_player/CouldUseTopic(var/mob/user)
69+
..()
70+
if(interact_sound)
71+
playsound(src, interact_sound, 40)
72+
73+
/obj/item/music_player/OnTopic(var/user, var/list/href_list)
74+
if(href_list["tracknum"])
75+
var/diff = text2num(href_list["tracknum"])
76+
track_num += diff
77+
if(track_num > tracks.len)
78+
track_num = 1
79+
else if (track_num < 1)
80+
track_num = tracks.len
81+
if(playing)
82+
start()
83+
interact(user)
84+
return TOPIC_REFRESH
85+
if(href_list["stop"])
86+
stop()
87+
return TOPIC_HANDLED
88+
if(href_list["start"])
89+
start()
90+
return TOPIC_HANDLED
91+
if(href_list["volup"])
92+
change_volume(music_volume + 10)
93+
return TOPIC_HANDLED
94+
if(href_list["voldown"])
95+
change_volume(music_volume - 10)
96+
return TOPIC_HANDLED
97+
98+
/obj/item/music_player/proc/change_volume(var/new_volume)
99+
music_volume = clamp(new_volume, 0, max_volume)
100+
if(sound_token)
101+
sound_token.SetVolume(music_volume)

code/modules/mob/living/silicon/robot/modules/module_uncertified.dm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
CAMERA_CHANNEL_TELEVISION
1919
)
2020
equipment = list(
21-
/obj/item/boombox,
21+
/obj/item/music_player/boombox,
2222
/obj/item/bikehorn/airhorn,
2323
/obj/item/flashlight/party,
2424
/obj/item/gun/launcher/money

maps/ministation/ministation-0.dmm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7267,7 +7267,7 @@
72677267
/turf/floor/laminate,
72687268
/area/ministation/engine)
72697269
"EM" = (
7270-
/obj/item/boombox,
7270+
/obj/item/music_player/boombox,
72717271
/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{
72727272
dir = 4
72737273
},

maps/ministation/space.dmm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747
/turf/floor/shuttle/blue,
4848
/area/shuttle/escape_shuttle)
4949
"am" = (
50-
/obj/item/boombox,
50+
/obj/item/music_player/boombox,
5151
/obj/structure/table/steel_reinforced,
5252
/turf/floor/shuttle/blue,
5353
/area/shuttle/escape_shuttle)

maps/tradeship/tradeship-2.dmm

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5429,7 +5429,7 @@
54295429
/obj/item/backpack/dufflebag/syndie,
54305430
/obj/item/box/ammo/shotgunshells,
54315431
/obj/item/handcuffs,
5432-
/obj/item/boombox,
5432+
/obj/item/music_player/boombox,
54335433
/obj/item/stack/tape_roll/barricade_tape/bureaucracy,
54345434
/obj/machinery/keycard_auth,
54355435
/turf/floor/laminate,
@@ -6623,7 +6623,7 @@
66236623
},
66246624
/obj/random/powercell,
66256625
/obj/random/powercell,
6626-
/obj/item/boombox,
6626+
/obj/item/music_player/boombox,
66276627
/turf/floor/tiled/techfloor/grid,
66286628
/area/ship/trade/maintenance/power)
66296629
"Jg" = (

nebula.dme

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1182,6 +1182,7 @@
11821182
#include "code\game\objects\items\devices\megaphone.dm"
11831183
#include "code\game\objects\items\devices\modkit.dm"
11841184
#include "code\game\objects\items\devices\multitool.dm"
1185+
#include "code\game\objects\items\devices\music_player.dm"
11851186
#include "code\game\objects\items\devices\oxycandle.dm"
11861187
#include "code\game\objects\items\devices\paicard.dm"
11871188
#include "code\game\objects\items\devices\paint_sprayer.dm"

0 commit comments

Comments
 (0)