mirror of
https://github.com/Yawn-Wider/YWPolarisVore.git
synced 2026-08-22 12:38:20 +01:00
Merge branch 'release' of https://github.com/VOREStation/VOREStation into izac
This commit is contained in:
@@ -14,5 +14,5 @@ SUBSYSTEM_DEF(assets)
|
||||
preload = cache.Copy() //don't preload assets generated during the round
|
||||
|
||||
for(var/client/C in GLOB.clients)
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/getFilesSlow, C, preload, FALSE), 10)
|
||||
return ..()
|
||||
addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(getFilesSlow), C, preload, FALSE), 10)
|
||||
return ..()
|
||||
|
||||
@@ -37,11 +37,11 @@ SUBSYSTEM_DEF(job)
|
||||
if(LAZYLEN(job.departments))
|
||||
add_to_departments(job)
|
||||
|
||||
sortTim(occupations, /proc/cmp_job_datums)
|
||||
sortTim(occupations, GLOBAL_PROC_REF(cmp_job_datums))
|
||||
for(var/D in department_datums)
|
||||
var/datum/department/dept = department_datums[D]
|
||||
sortTim(dept.jobs, /proc/cmp_job_datums, TRUE)
|
||||
sortTim(dept.primary_jobs, /proc/cmp_job_datums, TRUE)
|
||||
sortTim(dept.jobs, GLOBAL_PROC_REF(cmp_job_datums), TRUE)
|
||||
sortTim(dept.primary_jobs, GLOBAL_PROC_REF(cmp_job_datums), TRUE)
|
||||
|
||||
return TRUE
|
||||
|
||||
@@ -69,7 +69,7 @@ SUBSYSTEM_DEF(job)
|
||||
var/datum/department/D = new t()
|
||||
department_datums[D.name] = D
|
||||
|
||||
sortTim(department_datums, /proc/cmp_department_datums, TRUE)
|
||||
sortTim(department_datums, GLOBAL_PROC_REF(cmp_department_datums), TRUE)
|
||||
|
||||
/datum/controller/subsystem/job/proc/get_all_department_datums()
|
||||
var/list/dept_datums = list()
|
||||
@@ -140,4 +140,4 @@ SUBSYSTEM_DEF(job)
|
||||
|
||||
/datum/controller/subsystem/job/proc/job_debug_message(message)
|
||||
if(debug_messages)
|
||||
log_debug("JOB DEBUG: [message]")
|
||||
log_debug("JOB DEBUG: [message]")
|
||||
|
||||
@@ -30,60 +30,86 @@ SUBSYSTEM_DEF(lighting)
|
||||
MC_SPLIT_TICK_INIT(3)
|
||||
if(!init_tick_checks)
|
||||
MC_SPLIT_TICK
|
||||
|
||||
var/list/queue = sources_queue
|
||||
var/i = 0
|
||||
for (i in 1 to length(queue))
|
||||
var/datum/light_source/L = queue[i]
|
||||
|
||||
// UPDATE SOURCE QUEUE
|
||||
queue = sources_queue
|
||||
while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration
|
||||
i += 1
|
||||
|
||||
var/datum/light_source/L = queue[i]
|
||||
L.update_corners()
|
||||
|
||||
L.needs_update = LIGHTING_NO_UPDATE
|
||||
if(!QDELETED(L))
|
||||
L.needs_update = LIGHTING_NO_UPDATE
|
||||
else
|
||||
i -= 1 // update_corners() has removed L from the list, move back so we don't overflow or skip the next element
|
||||
|
||||
// We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us
|
||||
if(init_tick_checks)
|
||||
CHECK_TICK
|
||||
if(!TICK_CHECK)
|
||||
continue
|
||||
queue.Cut(1, i + 1)
|
||||
i = 0
|
||||
stoplag()
|
||||
else if (MC_TICK_CHECK)
|
||||
break
|
||||
if (i)
|
||||
queue.Cut(1, i+1)
|
||||
queue.Cut(1, i + 1)
|
||||
i = 0
|
||||
|
||||
if(!init_tick_checks)
|
||||
MC_SPLIT_TICK
|
||||
|
||||
// UPDATE CORNERS QUEUE
|
||||
queue = corners_queue
|
||||
for (i in 1 to length(queue))
|
||||
var/datum/lighting_corner/C = queue[i]
|
||||
while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration
|
||||
i += 1
|
||||
|
||||
var/datum/lighting_corner/C = queue[i]
|
||||
C.needs_update = FALSE //update_objects() can call qdel if the corner is storing no data
|
||||
C.update_objects()
|
||||
|
||||
|
||||
// We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us
|
||||
if(init_tick_checks)
|
||||
CHECK_TICK
|
||||
if(!TICK_CHECK)
|
||||
continue
|
||||
queue.Cut(1, i + 1)
|
||||
i = 0
|
||||
stoplag()
|
||||
else if (MC_TICK_CHECK)
|
||||
break
|
||||
if (i)
|
||||
queue.Cut(1, i+1)
|
||||
queue.Cut(1, i + 1)
|
||||
i = 0
|
||||
|
||||
|
||||
if(!init_tick_checks)
|
||||
MC_SPLIT_TICK
|
||||
|
||||
// UPDATE OBJECTS QUEUE
|
||||
queue = objects_queue
|
||||
for (i in 1 to length(queue))
|
||||
var/datum/lighting_object/O = queue[i]
|
||||
while(i < length(queue)) //we don't use for loop here because i cannot be changed during an iteration
|
||||
i += 1
|
||||
|
||||
var/datum/lighting_object/O = queue[i]
|
||||
if (QDELETED(O))
|
||||
continue
|
||||
|
||||
O.update()
|
||||
O.needs_update = FALSE
|
||||
|
||||
// We unroll TICK_CHECK here so we can clear out the queue to ensure any removals/additions when sleeping don't fuck us
|
||||
if(init_tick_checks)
|
||||
CHECK_TICK
|
||||
if(!TICK_CHECK)
|
||||
continue
|
||||
queue.Cut(1, i + 1)
|
||||
i = 0
|
||||
stoplag()
|
||||
else if (MC_TICK_CHECK)
|
||||
break
|
||||
if (i)
|
||||
queue.Cut(1, i+1)
|
||||
queue.Cut(1, i + 1)
|
||||
|
||||
|
||||
/datum/controller/subsystem/lighting/Recover()
|
||||
|
||||
@@ -2,7 +2,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
name = "Media Tracks"
|
||||
flags = SS_NO_FIRE
|
||||
init_order = INIT_ORDER_MEDIA_TRACKS
|
||||
|
||||
|
||||
/// Every track, including secret
|
||||
var/list/all_tracks = list()
|
||||
/// Non-secret jukebox tracks
|
||||
@@ -18,19 +18,19 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
/datum/controller/subsystem/media_tracks/proc/load_tracks()
|
||||
for(var/filename in config.jukebox_track_files)
|
||||
report_progress("Loading jukebox track: [filename]")
|
||||
|
||||
|
||||
if(!fexists(filename))
|
||||
error("File not found: [filename]")
|
||||
continue
|
||||
|
||||
|
||||
var/list/jsonData = json_decode(file2text(filename))
|
||||
|
||||
|
||||
if(!istype(jsonData))
|
||||
error("Failed to read tracks from [filename], json_decode failed.")
|
||||
continue
|
||||
|
||||
|
||||
for(var/entry in jsonData)
|
||||
|
||||
|
||||
// Critical problems that will prevent the track from working
|
||||
if(!istext(entry["url"]))
|
||||
error("Jukebox entry in [filename]: bad or missing 'url'. Tracks must have a URL.")
|
||||
@@ -47,21 +47,21 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
warning("Jukebox entry in [filename], [entry["title"]]: bad or missing 'artist'. Please consider crediting the artist.")
|
||||
if(!istext(entry["genre"]))
|
||||
warning("Jukebox entry in [filename], [entry["title"]]: bad or missing 'genre'. Please consider adding a genre.")
|
||||
|
||||
|
||||
var/datum/track/T = new(entry["url"], entry["title"], entry["duration"], entry["artist"], entry["genre"])
|
||||
|
||||
|
||||
T.secret = entry["secret"] ? 1 : 0
|
||||
T.lobby = entry["lobby"] ? 1 : 0
|
||||
|
||||
|
||||
all_tracks += T
|
||||
|
||||
/datum/controller/subsystem/media_tracks/proc/sort_tracks()
|
||||
report_progress("Sorting media tracks...")
|
||||
sortTim(all_tracks, /proc/cmp_media_track_asc)
|
||||
|
||||
sortTim(all_tracks, GLOBAL_PROC_REF(cmp_media_track_asc))
|
||||
|
||||
jukebox_tracks.Cut()
|
||||
lobby_tracks.Cut()
|
||||
|
||||
|
||||
for(var/datum/track/T in all_tracks)
|
||||
if(!T.secret)
|
||||
jukebox_tracks += T
|
||||
@@ -72,7 +72,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
var/client/C = usr.client
|
||||
if(!check_rights(R_DEBUG|R_FUN))
|
||||
return
|
||||
|
||||
|
||||
// Required
|
||||
var/url = tgui_input_text(C, "REQUIRED: Provide URL for track, or paste JSON if you know what you're doing. See code comments.", "Track URL", multiline = TRUE)
|
||||
if(!url)
|
||||
@@ -95,7 +95,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
* "secret": only on hacked jukeboxes (true/false)
|
||||
* "lobby": plays in the lobby (true/false)
|
||||
*/
|
||||
|
||||
|
||||
if(islist(json))
|
||||
for(var/song in json)
|
||||
if(!islist(song))
|
||||
@@ -104,18 +104,18 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
var/list/songdata = song
|
||||
if(!songdata["url"] || !songdata["title"] || !songdata["duration"])
|
||||
to_chat(C, "<span class='warning'>URL, Title, or Duration was missing from a song. Skipping.</span>")
|
||||
continue
|
||||
continue
|
||||
var/datum/track/T = new(songdata["url"], songdata["title"], songdata["duration"], songdata["artist"], songdata["genre"], songdata["secret"], songdata["lobby"])
|
||||
all_tracks += T
|
||||
|
||||
|
||||
report_progress("New media track added by [C]: [T.title]")
|
||||
sort_tracks()
|
||||
return
|
||||
|
||||
|
||||
var/title = tgui_input_text(C, "REQUIRED: Provide title for track", "Track Title")
|
||||
if(!title)
|
||||
return
|
||||
|
||||
|
||||
var/duration = tgui_input_number(C, "REQUIRED: Provide duration for track (in deciseconds, aka seconds*10)", "Track Duration")
|
||||
if(!duration)
|
||||
return
|
||||
@@ -124,11 +124,11 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
var/artist = tgui_input_text(C, "Optional: Provide artist for track", "Track Artist")
|
||||
if(isnull(artist)) // Cancel rather than empty string
|
||||
return
|
||||
|
||||
|
||||
var/genre = tgui_input_text(C, "Optional: Provide genre for track (try to match an existing one)", "Track Genre")
|
||||
if(isnull(genre)) // Cancel rather than empty string
|
||||
return
|
||||
|
||||
|
||||
var/secret = tgui_alert(C, "Optional: Mark track as secret?", "Track Secret", list("Yes", "Cancel", "No"))
|
||||
if(secret == "Cancel")
|
||||
return
|
||||
@@ -136,7 +136,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
secret = TRUE
|
||||
else
|
||||
secret = FALSE
|
||||
|
||||
|
||||
var/lobby = tgui_alert(C, "Optional: Mark track as lobby music?", "Track Lobby", list("Yes", "Cancel", "No"))
|
||||
if(lobby == "Cancel")
|
||||
return
|
||||
@@ -146,12 +146,12 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
secret = FALSE
|
||||
|
||||
var/datum/track/T = new(url, title, duration, artist, genre)
|
||||
|
||||
|
||||
T.secret = secret
|
||||
T.lobby = lobby
|
||||
|
||||
|
||||
all_tracks += T
|
||||
|
||||
|
||||
report_progress("New media track added by [C]: [title]")
|
||||
sort_tracks()
|
||||
|
||||
@@ -163,7 +163,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
var/track = tgui_input_text(C, "Input track title or URL to remove (must be exact)", "Remove Track")
|
||||
if(!track)
|
||||
return
|
||||
|
||||
|
||||
for(var/datum/track/T in all_tracks)
|
||||
if(T.title == track || T.url == track)
|
||||
all_tracks -= T
|
||||
@@ -171,7 +171,7 @@ SUBSYSTEM_DEF(media_tracks)
|
||||
report_progress("Media track removed by [C]: [track]")
|
||||
sort_tracks()
|
||||
return
|
||||
|
||||
|
||||
to_chat(C, "<span class='warning>Couldn't find a track matching the specified parameters.</span>")
|
||||
|
||||
/datum/controller/subsystem/media_tracks/vv_get_dropdown()
|
||||
|
||||
@@ -27,6 +27,7 @@ SUBSYSTEM_DEF(tgui)
|
||||
var/polyfill = file2text('tgui/public/tgui-polyfill.min.js')
|
||||
polyfill = "<script>\n[polyfill]\n</script>"
|
||||
basehtml = replacetextEx(basehtml, "<!-- tgui:inline-polyfill -->", polyfill)
|
||||
basehtml = replacetextEx(basehtml, "<!-- tgui:nt-copyright -->", "Nanotrasen (c) 2284-[CURRENT_STATION_YEAR]")
|
||||
|
||||
/datum/controller/subsystem/tgui/Shutdown()
|
||||
close_all_uis()
|
||||
@@ -344,4 +345,4 @@ SUBSYSTEM_DEF(tgui)
|
||||
target.tgui_open_uis.Add(ui)
|
||||
// Clear the old list.
|
||||
source.tgui_open_uis.Cut()
|
||||
return TRUE
|
||||
return TRUE
|
||||
|
||||
@@ -227,7 +227,7 @@ var/global/datum/controller/subsystem/ticker/ticker
|
||||
end_game_state = END_GAME_READY_TO_END
|
||||
current_state = GAME_STATE_FINISHED
|
||||
Master.SetRunLevel(RUNLEVEL_POSTGAME)
|
||||
INVOKE_ASYNC(src, .proc/declare_completion)
|
||||
INVOKE_ASYNC(src, PROC_REF(declare_completion))
|
||||
else if (mode_finished && (end_game_state < END_GAME_MODE_FINISHED))
|
||||
end_game_state = END_GAME_MODE_FINISHED // Only do this cleanup once!
|
||||
mode.cleanup()
|
||||
|
||||
@@ -256,7 +256,7 @@ SUBSYSTEM_DEF(timer)
|
||||
if (!length(alltimers))
|
||||
return
|
||||
|
||||
sortTim(alltimers, /proc/cmp_timer)
|
||||
sortTim(alltimers, GLOBAL_PROC_REF(cmp_timer))
|
||||
|
||||
var/datum/timedevent/head = alltimers[1]
|
||||
|
||||
@@ -516,4 +516,4 @@ SUBSYSTEM_DEF(timer)
|
||||
#undef BUCKET_LEN
|
||||
#undef BUCKET_POS
|
||||
#undef TIMER_MAX
|
||||
#undef TIMER_ID_MAX
|
||||
#undef TIMER_ID_MAX
|
||||
|
||||
Reference in New Issue
Block a user