Unit Test rework & Master/Ticker update (#17912)

* Unit Test rework & Master/Ticker update

* Fixes and working unit testing

* Fixes

* Test fixes and FA update

* Fixed runtimes

* Radio subsystem

* move that glob wherever later

* ident

* CIBUILDING compile option

* Fixed runtimes

* Some changes to the workflow

* CI Split

* More split

* Pathing

* Linters and Annotators

* ci dir fix

* Missing undef fixed

* Enable grep checks

* More test conversions

* More split

* Correct file

* Removes unneeded inputs

* oop

* More dependency changes

* More conversions

* Conversion fixes

* Fixes

* Some assert fixes

* Corrects start gate

* Converted some README.dms to README.mds

* Removes duplicate proc

* Removes unused defines

* Example configs

* fix dll access viol by double calling

* Post-rebase fixes

* Cleans up names global list

* Undef restart counter

* More code/game/ cleanup

* Statpanel update

* Skybox

* add

* Fix ticker

* Roundend fix

* Persistence dependency update

* Reordering

* Reordering

* Reordering

* Initstage fix

* .

* .

* Reorder

* Reorder

* Circle

* Mobs

* Air

* Test fix

* CI Script Fix

* Configs

* More ticker stuff

* This is now in 'reboot world'

* Restart world announcements

* no glob in PreInit

* to define

* Update

* Removed old include

* Make this file normal again

* moved

* test

* shared unit testing objects

* Updates batched_spritesheets and universal_icon

* .

* job data debug

* rm that

* init order

* show us

* .

* i wonder

* .

* .

* urg

* do we not have a job ID?

* .

* rm sleep for now

* updated rust-g linux binaries

* binaries update 2

* binaries update 3

* testing something

* change that

* test something

* .

* .

* .

* locavar

* test

* move that

* .

* debug

* don't run this test

* strack trace it

* cleaner

* .

* .

* cras again

* also comment this out

* return to official rust g

* Update robot_icons.dm

* monitor the generation

* .

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
Selis
2025-08-10 01:37:23 +02:00
committed by GitHub
parent 5e54e17ebd
commit f4bf017921
382 changed files with 10193 additions and 4421 deletions
+4 -4
View File
@@ -74,9 +74,9 @@
name = M.real_name
else
if(gender == MALE)
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
name = capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names))
else
name = capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
name = capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names))
mind = M.mind //we don't transfer the mind but we keep a reference to it.
@@ -96,7 +96,7 @@
to_chat(src, span_danger("Could not locate an observer spawn point. Use the Teleport verb to jump to the station map."))
if(!name) //To prevent nameless ghosts
name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
name = capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names))
real_name = name
animate(src, pixel_y = 2, time = 10, loop = -1)
animate(pixel_y = default_pixel_y, time = 10, loop = -1)
@@ -683,7 +683,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return 0 //something is terribly wrong
var/ghosts_can_write
if(ticker.mode.name == "cult")
if(SSticker.mode.name == "cult")
if(cult.current_antagonists.len > CONFIG_GET(number/cult_ghostwriter_req_cultists))
ghosts_can_write = 1
+2 -2
View File
@@ -116,8 +116,8 @@
handle_regular_hud_updates()
handle_vision()
if(ticker && ticker.mode)
ticker.mode.check_win()
if(SSticker && SSticker.mode)
SSticker.mode.check_win()
return 1
@@ -46,7 +46,7 @@
/obj/machinery/camera/Initialize(mapload)
. = ..()
//Camera must be added to global list of all cameras no matter what...
if(cameranet.cameras_unsorted || !ticker)
if(cameranet.cameras_unsorted || !SSticker)
cameranet.cameras += src
cameranet.cameras_unsorted = 1
else
+1 -1
View File
@@ -3,7 +3,7 @@
// TURFS
/proc/updateVisibility(atom/A, var/opacity_check = 1)
if(ticker)
if(SSticker)
for(var/datum/visualnet/VN in visual_nets)
VN.updateVisibility(A, opacity_check)
+1 -1
View File
@@ -92,7 +92,7 @@
/datum/visualnet/proc/updateVisibility(atom/A, var/opacity_check = 1)
if(!ticker || (opacity_check && !A.opacity))
if(!SSticker || (opacity_check && !A.opacity))
return
majorChunkChange(A, 2)
+2 -2
View File
@@ -26,9 +26,9 @@
/datum/language/proc/get_random_name(var/gender, name_count=2, syllable_count=4, syllable_divisor=2)
if(!syllables || !syllables.len)
if(gender==FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
return capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names))
else
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
return capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names))
var/full_name = ""
var/new_name = ""
+5 -5
View File
@@ -127,8 +127,8 @@
syllables = list("qr","qrr","xuq","qil","quum","xuqm","vol","xrim","zaoo","qu-uu","qix","qoo","zix")
/datum/language/skrell/get_random_name(var/gender)
var/list/first_names = file2list('config/names/first_name_skrell.txt')
var/list/last_names = file2list('config/names/last_name_skrell.txt')
var/list/first_names = file2list('strings/names/first_name_skrell.txt')
var/list/last_names = file2list('strings/names/last_name_skrell.txt')
return "[pick(first_names)] [pick(last_names)]"
/datum/language/human
@@ -152,9 +152,9 @@
/datum/language/human/get_random_name(var/gender)
if (prob(80))
if(gender==FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
return capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names))
else
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
return capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names))
else
return ..()
@@ -174,7 +174,7 @@
if(prob(70))
return "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
else
return pick(ai_names)
return pick(GLOB.ai_names)
/datum/language/teshari
name = LANGUAGE_SCHECHI
@@ -117,11 +117,11 @@
/datum/species/proc/get_random_name(var/gender)
if(!name_language)
if(gender == FEMALE)
return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
return capitalize(pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names))
else if(gender == MALE)
return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
return capitalize(pick(GLOB.first_names_male)) + " " + capitalize(pick(GLOB.last_names))
else
return capitalize(prob(50) ? pick(first_names_male) : pick(first_names_female)) + " " + capitalize(pick(last_names))
return capitalize(prob(50) ? pick(GLOB.first_names_male) : pick(GLOB.first_names_female)) + " " + capitalize(pick(GLOB.last_names))
var/datum/language/species_language = GLOB.all_languages[name_language]
if(!species_language)
+3 -3
View File
@@ -932,8 +932,8 @@
//check for nuke disks
if(client && stat != DEAD) //if they are clientless and dead don't bother, the parent will treat them as any other container
if(ticker && istype(ticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear
var/datum/game_mode/nuclear/G = ticker.mode
if(SSticker && istype(SSticker.mode, /datum/game_mode/nuclear)) //only really care if the game mode is nuclear
var/datum/game_mode/nuclear/G = SSticker.mode
if(G.check_mob(src))
if(x <= TRANSITIONEDGE)
inertia_dir = 4
@@ -1429,7 +1429,7 @@
"})
/mob/living/update_gravity(has_gravity)
if(!ticker)
if(!SSticker)
return
if(has_gravity)
clear_alert("weightless")
+2 -2
View File
@@ -113,11 +113,11 @@ var/list/ai_verbs_default = list(
announcement.announcement_type = "A.I. Announcement"
announcement.newscast = 1
var/list/possibleNames = ai_names
var/list/possibleNames = GLOB.ai_names
var/pickedName = null
while(!pickedName)
pickedName = pick(ai_names)
pickedName = pick(GLOB.ai_names)
for (var/mob/living/silicon/ai/A in GLOB.mob_list)
if (A.real_name == pickedName && possibleNames.len > 1) //fixing the theoretically possible infinite loop
possibleNames -= pickedName
@@ -15,7 +15,7 @@ GLOBAL_LIST_EMPTY(empty_playable_ai_cores)
set category = "OOC.Game"
set desc = "Enter intelligence storage. This is functionally equivalent to cryo or robotic storage, freeing up your job slot."
if(ticker && ticker.mode && ticker.mode.name == "AI malfunction")
if(SSticker && SSticker.mode && SSticker.mode.name == "AI malfunction")
to_chat(src, span_danger("You cannot use this verb in malfunction. If you need to leave, please adminhelp."))
return
@@ -40,7 +40,7 @@ var/datum/paiController/paiController // Global handler for pAI candidates
GLOB.paikeys |= pai.ckey
card.setPersonality(pai)
if(!candidate.name)
pai.SetName(pick(ninja_names))
pai.SetName(pick(GLOB.ninja_names))
else
pai.SetName(candidate.name)
if(candidate.description)
@@ -50,7 +50,7 @@
/obj/machinery/drone_fabricator/process()
if(ticker.current_state < GAME_STATE_PLAYING)
if(SSticker.current_state < GAME_STATE_PLAYING)
return
if(stat & NOPOWER || !produce_drones)
@@ -34,11 +34,11 @@
/mob/living/silicon/robot/platform/attack_ghost(mob/observer/dead/user)
if(client || key || stat == DEAD || !ticker || !ticker.mode)
if(client || key || stat == DEAD || !SSticker || !SSticker.mode)
return ..()
var/confirm = tgui_alert(user, "Do you wish to take control of \the [src]?", "Platform Control", list("No", "Yes"))
if(confirm != "Yes" || QDELETED(src) || client || key || stat == DEAD || !ticker || !ticker.mode)
if(confirm != "Yes" || QDELETED(src) || client || key || stat == DEAD || !SSticker || !SSticker.mode)
return ..()
if(jobban_isbanned(user, "Robot"))
+1 -1
View File
@@ -9,7 +9,7 @@
var/datum/admins/is_admin = GLOB.admin_datums[src.ckey]
if(is_admin && is_admin.check_for_rights(R_HOLDER))
message_admins("Staff logout: [key_name(src)]") // Staff logout notice displays no matter what
if (ticker && ticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
if (SSticker && SSticker.current_state == GAME_STATE_PLAYING) //Only report this stuff if we are currently playing.
var/admins_number = GLOB.admins.len
if(admins_number == 0) //Apparently the admin logging out is no longer an admin at this point, so we have to check this towards 0 and not towards 1. Awell.
+3 -3
View File
@@ -340,7 +340,7 @@
// Try to figure out what time to use
// Special cases, can never respawn
if(ticker?.mode?.deny_respawn)
if(SSticker?.mode?.deny_respawn)
time = -1
else if(!CONFIG_GET(flag/abandon_allowed))
time = -1
@@ -348,7 +348,7 @@
time = -1
// Special case for observing before game start
else if(ticker?.current_state <= GAME_STATE_SETTING_UP)
else if(SSticker?.current_state <= GAME_STATE_SETTING_UP)
time = 1 MINUTE
// Wasn't given a time, use the config time
@@ -377,7 +377,7 @@
to_chat(src, span_boldnotice("You are already in the lobby!"))
return
if(stat != DEAD || !ticker)
if(stat != DEAD || !SSticker)
to_chat(src, span_boldnotice("You must be dead to use this!"))
return
+3
View File
@@ -146,6 +146,9 @@
// Used many times below, faster reference.
var/atom/loc = my_mob.loc
if(HAS_TRAIT(my_mob, TRAIT_NO_TRANSFORM))
return FALSE //This is sorta the goto stop mobs from moving trait
// We're controlling an object which is when admins possess an object.
if(my_mob.control_object)
Move_object(direct)
+4 -4
View File
@@ -43,7 +43,7 @@
data["server_name"] = displayed_name
data["map"] = using_map.full_name
data["station_time"] = stationtime2text()
data["display_loading"] = SSticker.current_state == GAME_STATE_INIT
data["display_loading"] = SSticker.current_state == GAME_STATE_STARTUP
data["round_start"] = !SSticker.mode || SSticker.current_state <= GAME_STATE_PREGAME
data["round_time"] = roundduration2text()
data["ready"] = ready
@@ -82,7 +82,7 @@
ViewManifest()
return TRUE
if("late_join")
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING)
to_chat(usr, span_red("The round is either not ready, or has already finished..."))
return TRUE
@@ -97,7 +97,7 @@
if("observe")
if(QDELETED(src))
return FALSE
if(!SSticker || SSticker.current_state == GAME_STATE_INIT)
if(!SSticker || SSticker.current_state == GAME_STATE_STARTUP)
to_chat(src, span_warning("The game is still setting up, please try again later."))
return TRUE
if(tgui_alert(src,"Are you sure you wish to observe? If you do, make sure to not use any knowledge gained from observing if you decide to join later.","Observe Round?",list("Yes","No")) == "Yes")
@@ -160,7 +160,7 @@
client.changes()
return TRUE
if("keyboard")
if(!SSsounds.subsystem_initialized)
if(!SSsounds.initialized)
return
playsound_local(ui.user, get_sfx("keyboard"), vol = 20)
+10 -10
View File
@@ -42,11 +42,11 @@
// if(SSvote.mode)
// . += "Vote: [capitalize(SSvote.mode)] Time Left: [SSvote.time_remaining] s"
if(SSticker.current_state == GAME_STATE_INIT)
if(SSticker.current_state == GAME_STATE_STARTUP)
. += "Time To Start: Server Initializing"
else if(SSticker.current_state == GAME_STATE_PREGAME)
. += "Time To Start: [round(SSticker.pregame_timeleft,1)][GLOB.round_progressing ? "" : " (DELAYED)"]"
. += "Time To Start: [round(SSticker.timeLeft, 1)][GLOB.round_progressing ? "" : " (DELAYED)"]"
. += "Players: [totalPlayers]"
. += "Players Ready: [totalPlayersReady]"
totalPlayers = 0
@@ -223,7 +223,7 @@
/mob/new_player/proc/AttemptLateSpawn(rank,var/spawning_at)
if (src != usr)
return 0
if(!ticker || ticker.current_state != GAME_STATE_PLAYING)
if(!SSticker || SSticker.current_state != GAME_STATE_PLAYING)
to_chat(src, span_red("The round is either not ready, or has already finished..."))
return 0
if(!CONFIG_GET(flag/enter_allowed))
@@ -297,7 +297,7 @@
character = character.AIize(move = FALSE) // Dupe of code in /datum/controller/subsystem/ticker/proc/create_characters() for non-latespawn, unify?
AnnounceCyborg(character, rank, "has been transferred to the empty core in \the [character.loc.loc]")
ticker.mode.latespawn(character)
SSticker.mode.latespawn(character)
qdel(C) //Deletes empty core (really?)
qdel(src) //Deletes new_player
@@ -308,22 +308,22 @@
character.buckled.loc = character.loc
character.buckled.set_dir(character.dir)
ticker.mode.latespawn(character)
SSticker.mode.latespawn(character)
if(rank == JOB_OUTSIDER)
log_and_message_admins("has joined the round as non-crew. (<A href='byond://?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",character)
if(!(J.mob_type & JOB_SILICON))
ticker.minds += character.mind
SSticker.minds += character.mind
else if(rank == JOB_ANOMALY)
log_and_message_admins("has joined the round as anomaly. (<A href='byond://?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",character)
if(!(J.mob_type & JOB_SILICON))
ticker.minds += character.mind
SSticker.minds += character.mind
else if(J.mob_type & JOB_SILICON)
AnnounceCyborg(character, rank, join_message, announce_channel, character.z)
else
AnnounceArrival(character, rank, join_message, announce_channel, character.z)
GLOB.data_core.manifest_inject(character)
ticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
SSticker.minds += character.mind//Cyborgs and AIs handle this in the transform proc. //TODO!!!!! ~Carn
if(ishuman(character))
if(character.client.prefs.auto_backup_implant)
var/obj/item/implant/backup/imp = new(src)
@@ -370,7 +370,7 @@
qdel(src) // Delete new_player mob
/mob/new_player/proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message, var/channel, var/zlevel)
if (ticker.current_state == GAME_STATE_PLAYING)
if (SSticker.current_state == GAME_STATE_PLAYING)
var/list/zlevels = zlevel ? using_map.get_map_levels(zlevel, TRUE, om_range = DEFAULT_OVERMAP_RANGE) : null
if(character.mind.role_alt_title)
rank = character.mind.role_alt_title
@@ -402,7 +402,7 @@
if(!new_character)
new_character = new(T)
if(ticker.random_players)
if(CONFIG_GET(flag/force_random_names))
new_character.gender = pick(MALE, FEMALE)
client.prefs.real_name = random_name(new_character.gender)
else