mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-12 09:54:03 +00:00
217 lines
6.9 KiB
Plaintext
217 lines
6.9 KiB
Plaintext
/datum/song/ui_interact(mob/user, datum/tgui/ui)
|
|
ui = SStgui.try_update_ui(user, src, ui)
|
|
if (!ui)
|
|
ui = new(user, src, "InstrumentEditor", parent.name)
|
|
ui.open()
|
|
|
|
/datum/song/ui_host(mob/user)
|
|
return parent
|
|
|
|
/datum/song/ui_data(mob/user)
|
|
var/list/data = ..()
|
|
data["id"] = id
|
|
data["using_instrument"] = using_instrument?.name || "No instrument loaded!"
|
|
data["note_shift"] = note_shift
|
|
data["octaves"] = round(note_shift / 12, 0.01)
|
|
data["sustain_mode"] = sustain_mode
|
|
switch(sustain_mode)
|
|
if(SUSTAIN_LINEAR)
|
|
data["sustain_mode_button"] = "Linear Sustain Duration (in seconds)"
|
|
data["sustain_mode_duration"] = sustain_linear_duration / 10
|
|
data["sustain_mode_min"] = INSTRUMENT_MIN_TOTAL_SUSTAIN
|
|
data["sustain_mode_max"] = INSTRUMENT_MAX_TOTAL_SUSTAIN
|
|
if(SUSTAIN_EXPONENTIAL)
|
|
data["sustain_mode_button"] = "Exponential Falloff Factor (% per decisecond)"
|
|
data["sustain_mode_duration"] = sustain_exponential_dropoff
|
|
data["sustain_mode_min"] = INSTRUMENT_EXP_FALLOFF_MIN
|
|
data["sustain_mode_max"] = INSTRUMENT_EXP_FALLOFF_MAX
|
|
data["instrument_ready"] = using_instrument?.ready()
|
|
data["volume"] = volume
|
|
data["volume_dropoff_threshold"] = sustain_dropoff_volume
|
|
data["sustain_indefinitely"] = full_sustain_held_note
|
|
data["playing"] = playing
|
|
data["repeat"] = repeat
|
|
data["bpm"] = round(60 SECONDS / tempo)
|
|
data["lines"] = list()
|
|
var/linecount
|
|
for(var/line in lines)
|
|
linecount++
|
|
data["lines"] += list(list(
|
|
"line_count" = linecount,
|
|
"line_text" = line,
|
|
))
|
|
return data
|
|
|
|
/datum/song/ui_static_data(mob/user)
|
|
var/list/data = ..()
|
|
data["can_switch_instrument"] = (length(allowed_instrument_ids) > 1)
|
|
data["possible_instruments"] = list()
|
|
for(var/instrument in allowed_instrument_ids)
|
|
UNTYPED_LIST_ADD(data["possible_instruments"], list("name" = SSinstruments.instrument_data[instrument], "id" = instrument))
|
|
data["sustain_modes"] = SSinstruments.note_sustain_modes
|
|
data["max_repeats"] = max_repeats
|
|
data["min_volume"] = min_volume
|
|
data["max_volume"] = max_volume
|
|
data["note_shift_min"] = note_shift_min
|
|
data["note_shift_max"] = note_shift_max
|
|
data["max_line_chars"] = MUSIC_MAXLINECHARS
|
|
data["max_lines"] = MUSIC_MAXLINES
|
|
return data
|
|
|
|
/datum/song/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
|
|
. = ..()
|
|
var/mob/user = ui.user
|
|
if(!istype(user))
|
|
return FALSE
|
|
|
|
switch(action)
|
|
//SETTINGS
|
|
if("play_music")
|
|
if(!playing)
|
|
INVOKE_ASYNC(src, PROC_REF(start_playing), user)
|
|
else
|
|
stop_playing()
|
|
return TRUE
|
|
if("set_instrument_id")
|
|
var/new_id = reject_bad_name(LOWER_TEXT(params["id"]), max_length = 20, allow_numbers = TRUE, cap_after_symbols = FALSE)
|
|
if(new_id)
|
|
id = new_id
|
|
return TRUE
|
|
if("change_instrument")
|
|
var/new_instrument = params["new_instrument"]
|
|
//only one instrument, so no need to bother changing it.
|
|
if(!length(allowed_instrument_ids))
|
|
return FALSE
|
|
if(!(new_instrument in allowed_instrument_ids))
|
|
return FALSE
|
|
set_instrument(new_instrument)
|
|
return TRUE
|
|
if("tempo")
|
|
var/move_direction = params["tempo_change"]
|
|
var/tempo_diff
|
|
if(move_direction == "increase_speed")
|
|
tempo_diff = world.tick_lag
|
|
else
|
|
tempo_diff = -world.tick_lag
|
|
tempo = sanitize_tempo(tempo + tempo_diff)
|
|
return TRUE
|
|
|
|
//SONG MAKING
|
|
if("import_song")
|
|
var/song_text = ""
|
|
do
|
|
song_text = tgui_input_text(user, "Please paste the entire song, formatted:", name, max_length = (MUSIC_MAXLINES * MUSIC_MAXLINECHARS), multiline = TRUE)
|
|
if(!in_range(parent, user))
|
|
return
|
|
|
|
if(length_char(song_text) >= MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
|
|
var/should_continue = tgui_alert(user, "Your message is too long! Would you like to continue editing it?", "Warning", list("Yes", "No"))
|
|
if(should_continue != "Yes")
|
|
break
|
|
while(length_char(song_text) > MUSIC_MAXLINES * MUSIC_MAXLINECHARS)
|
|
ParseSong(user, song_text)
|
|
return TRUE
|
|
if("start_new_song")
|
|
name = ""
|
|
lines = new()
|
|
tempo = sanitize_tempo(5) // default 120 BPM
|
|
return TRUE
|
|
if("add_new_line")
|
|
var/newline = tgui_input_text(user, "Enter your line", parent.name, max_length = MUSIC_MAXLINECHARS)
|
|
if(!newline || !in_range(parent, user))
|
|
return
|
|
if(lines.len > MUSIC_MAXLINES)
|
|
return
|
|
if(length(newline) > MUSIC_MAXLINECHARS)
|
|
newline = copytext(newline, 1, MUSIC_MAXLINECHARS)
|
|
lines.Add(newline)
|
|
if("delete_line")
|
|
var/line_to_delete = params["line_deleted"]
|
|
if(line_to_delete > lines.len || line_to_delete < 1)
|
|
return FALSE
|
|
lines.Cut(line_to_delete, line_to_delete + 1)
|
|
return TRUE
|
|
if("modify_line")
|
|
var/line_to_edit = params["line_editing"]
|
|
if(line_to_edit > lines.len || line_to_edit < 1)
|
|
return FALSE
|
|
var/new_line_text = tgui_input_text(user, "Enter your line ", parent.name, lines[line_to_edit], max_length = MUSIC_MAXLINECHARS)
|
|
if(isnull(new_line_text) || !in_range(parent, user))
|
|
return FALSE
|
|
lines[line_to_edit] = new_line_text
|
|
return TRUE
|
|
|
|
//MODE STUFF
|
|
if("set_sustain_mode")
|
|
var/new_mode = params["new_mode"]
|
|
if(isnull(new_mode) || !(new_mode in SSinstruments.note_sustain_modes))
|
|
return FALSE
|
|
sustain_mode = new_mode
|
|
return TRUE
|
|
if("set_note_shift")
|
|
var/amount = params["amount"]
|
|
if(!isnum(amount))
|
|
return FALSE
|
|
note_shift = clamp(amount, note_shift_min, note_shift_max)
|
|
return TRUE
|
|
if("set_volume")
|
|
var/new_volume = params["amount"]
|
|
if(!isnum(new_volume))
|
|
return FALSE
|
|
set_volume(new_volume)
|
|
return TRUE
|
|
if("set_dropoff_volume")
|
|
var/dropoff_threshold = params["amount"]
|
|
if(!isnum(dropoff_threshold))
|
|
return FALSE
|
|
set_dropoff_volume(dropoff_threshold)
|
|
return TRUE
|
|
if("toggle_sustain_hold_indefinitely")
|
|
full_sustain_held_note = !full_sustain_held_note
|
|
return TRUE
|
|
if("set_repeat_amount")
|
|
if(playing)
|
|
return
|
|
var/repeat_amount = params["amount"]
|
|
if(!isnum(repeat_amount))
|
|
return FALSE
|
|
set_repeats(repeat_amount)
|
|
return TRUE
|
|
if("edit_sustain_mode")
|
|
var/sustain_amount = params["amount"]
|
|
if(isnull(sustain_amount) || !isnum(sustain_amount))
|
|
return
|
|
switch(sustain_mode)
|
|
if(SUSTAIN_LINEAR)
|
|
set_linear_falloff_duration(sustain_amount)
|
|
if(SUSTAIN_EXPONENTIAL)
|
|
set_exponential_drop_rate(sustain_amount)
|
|
|
|
/**
|
|
* Parses a song the user has input into lines and stores them.
|
|
*/
|
|
/datum/song/proc/ParseSong(mob/user, new_song)
|
|
set waitfor = FALSE
|
|
//split into lines
|
|
lines = islist(new_song) ? new_song : splittext(new_song, "\n")
|
|
if(lines.len)
|
|
var/bpm_string = "BPM: "
|
|
if(findtext(lines[1], bpm_string, 1, length(bpm_string) + 1))
|
|
var/divisor = text2num(copytext(lines[1], length(bpm_string) + 1)) || 120 // default
|
|
tempo = sanitize_tempo(BPM_TO_TEMPO_SETTING(divisor))
|
|
lines.Cut(1, 2)
|
|
else
|
|
tempo = sanitize_tempo(5) // default 120 BPM
|
|
if(lines.len > MUSIC_MAXLINES)
|
|
if(user)
|
|
to_chat(user, "Too many lines!")
|
|
lines.Cut(MUSIC_MAXLINES + 1)
|
|
var/linenum = 1
|
|
for(var/l in lines)
|
|
if(length_char(l) > MUSIC_MAXLINECHARS)
|
|
if(user)
|
|
to_chat(user, "Line [linenum] too long!")
|
|
lines.Remove(l)
|
|
else
|
|
linenum++
|