The cultists have learned the danger of eldritch magic!
", "
They all disappeared!
")
- round_credits += " "
-
- round_credits += ..()
- return round_credits
-
-#undef CULT_SCALING_COEFFICIENT
diff --git a/code/game/gamemodes/devil/devil_agent/devil_agent.dm b/code/game/gamemodes/devil/devil_agent/devil_agent.dm
deleted file mode 100644
index c8fb62faba09..000000000000
--- a/code/game/gamemodes/devil/devil_agent/devil_agent.dm
+++ /dev/null
@@ -1,44 +0,0 @@
-/datum/game_mode/devil/devil_agents
- name = "Devil Agents"
- config_tag = "devil_agents"
- required_players = 25
- required_enemies = 3
- recommended_enemies = 8
- reroll_friendly = 0
-
- traitors_possible = 10 //hard limit on traitors if scaling is turned off
- num_modifier = 4
- objective_count = 2
-
- var/list/devil_target_list = list() //will update to be a child of internal affairs when bothered
- var/list/devil_late_joining_list = list()
- minimum_devils = 3
-
- announce_text = "There are devil agents onboard the station, trying to outbid each other!\n\
- + Devils: Purchase souls and interfere with your rivals!\n\
- + Crew: Resist the lure of sin and remain pure!"
-
-/datum/game_mode/devil/devil_agents/post_setup()
- var/i = 0
- for(var/datum/mind/devil in devils)
- i++
- if(i + 1 > devils.len)
- i = 0
- devil_target_list[devil] = devils[i + 1]
- ..()
-
-/datum/game_mode/devil/devil_agents/add_devil_objectives(datum/mind/devil_mind, quantity)
- ..(devil_mind, quantity - give_outsell_objective(devil_mind))
-
-/datum/game_mode/devil/devil_agents/proc/give_outsell_objective(datum/mind/devil)
- //If you override this method, have it return the number of objectives added.
- if(devil_target_list.len && devil_target_list[devil]) // Is a double agent
- var/datum/mind/target_mind = devil_target_list[devil]
- var/datum/antagonist/devil/D = target_mind.has_antag_datum(/datum/antagonist/devil)
- var/datum/objective/devil/outsell/outsellobjective = new
- outsellobjective.owner = devil
- outsellobjective.target = target_mind
- outsellobjective.update_explanation_text()
- D.objectives += outsellobjective
- return 1
- return 0
diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm
deleted file mode 100644
index 9d002f4a029d..000000000000
--- a/code/game/gamemodes/devil/devil_game_mode.dm
+++ /dev/null
@@ -1,106 +0,0 @@
-/datum/game_mode/devil
- name = "devil"
- config_tag = "devil"
- report_type = "devil"
- antag_flag = ROLE_DEVIL
- false_report_weight = 1
- protected_jobs = list("Prisoner", "Lawyer", "Curator", "Chaplain", "Head of Security", "Captain", "AI")
- required_players = 0
- required_enemies = 1
- recommended_enemies = 4
- reroll_friendly = 1
- enemy_minimum_age = 0
- title_icon = "devil"
-
- var/traitors_possible = 4 //hard limit on devils if scaling is turned off
- var/num_modifier = 0 // Used for gamemodes, that are a child of traitor, that need more than the usual.
- var/objective_count = 2
- var/minimum_devils = 1
-
- announce_text = "There are devils onboard the station!\n\
- + Devils: Purchase souls and tempt the crew to sin!\n\
- + Crew: Resist the lure of sin and remain pure!"
-
-/datum/game_mode/devil/pre_setup()
- if(CONFIG_GET(flag/protect_roles_from_antagonist))
- restricted_jobs += protected_jobs
- if(CONFIG_GET(flag/protect_assistant_from_antagonist))
- restricted_jobs += "Assistant"
-
- var/num_devils = 1
-
- var/tsc = CONFIG_GET(number/traitor_scaling_coeff)
- if(tsc)
- num_devils = max(minimum_devils, min(round(num_players() / (tsc * 3))+ 2 + num_modifier, round(num_players() / (tsc * 1.5)) + num_modifier))
- else
- num_devils = max(minimum_devils, min(num_players(), traitors_possible))
-
- for(var/j = 0, j < num_devils, j++)
- if (!antag_candidates.len)
- break
- var/datum/mind/devil = antag_pick(antag_candidates)
- devils += devil
- devil.special_role = traitor_name
- devil.restricted_roles = restricted_jobs
-
- log_game("[key_name(devil)] has been selected as a [traitor_name]")
- antag_candidates.Remove(devil)
-
- if(devils.len < required_enemies)
- setup_error = "Not enough devil candidates"
- return FALSE
- for(var/antag in devils)
- GLOB.pre_setup_antags += antag
- return TRUE
-
-
-/datum/game_mode/devil/post_setup()
- for(var/datum/mind/devil in devils)
- post_setup_finalize(devil)
- ..()
- return TRUE
-
-/datum/game_mode/devil/generate_report()
- return "Infernal creatures have been seen nearby offering great boons in exchange for souls. This is considered theft against Nanotrasen, as all employment contracts contain a lien on the \
- employee's soul. If anyone sells their soul in error, contact an attorney to overrule the sale. Be warned that if the devil purchases enough souls, a gateway to hell may open."
-
-/datum/game_mode/devil/proc/post_setup_finalize(datum/mind/devil)
- add_devil(devil.current, ascendable = TRUE) //Devil gamemode devils are ascendable.
- GLOB.pre_setup_antags -= devil
- add_devil_objectives(devil,2)
-
-/proc/is_devil(mob/living/M)
- return M.mind?.has_antag_datum(/datum/antagonist/devil)
-
-/proc/add_devil(mob/living/L, ascendable = FALSE)
- if(!L || !L.mind)
- return FALSE
- var/datum/antagonist/devil/devil_datum = L.mind.add_antag_datum(/datum/antagonist/devil)
- devil_datum.ascendable = ascendable
- return devil_datum
-
-/proc/remove_devil(mob/living/L)
- if(!L || !L.mind)
- return FALSE
- var/datum/antagonist/devil_datum = L.mind.has_antag_datum(/datum/antagonist/devil)
- devil_datum.on_removal()
- return TRUE
-
-/datum/game_mode/devil/generate_credit_text()
- var/list/round_credits = list()
- var/len_before_addition
-
- round_credits += "
The Tempting Devils:
"
- len_before_addition = round_credits.len
- var/datum/antagonist/devil/devil_info
- for(var/datum/mind/devil in devils)
- devil_info = devil.has_antag_datum(/datum/antagonist/devil)
- if(devil_info) // This should never fail, but better to be sure
- round_credits += "
diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm
index 04e84097f6d1..0be2f41696e6 100644
--- a/code/modules/admin/fun_balloon.dm
+++ b/code/modules/admin/fun_balloon.dm
@@ -136,8 +136,3 @@
/obj/effect/forcefield/arena_shuttle_entrance/proc/do_bloodbath(mob/living/L)
var/obj/item/mine/pressure/pickup/bloodbath/B = new (L)
B.mine_effect(L)
-
-/area/shuttle_arena
- name = "arena"
- has_gravity = STANDARD_GRAVITY
- requires_power = FALSE
diff --git a/code/modules/admin/sql_ban_system.dm b/code/modules/admin/sql_ban_system.dm
index 28646666b46a..bd3d189f85eb 100644
--- a/code/modules/admin/sql_ban_system.dm
+++ b/code/modules/admin/sql_ban_system.dm
@@ -285,8 +285,8 @@
var/list/long_job_lists = list("Service" = GLOB.service_positions,
"Ghost and Other Roles" = list(ROLE_BRAINWASHED, ROLE_DEATHSQUAD, ROLE_DRONE, ROLE_LAVALAND, ROLE_MIND_TRANSFER, ROLE_POSIBRAIN, ROLE_SENTIENCE),
"Antagonist Positions" = list(ROLE_ABDUCTOR, ROLE_ALIEN,
- ROLE_BROTHER, ROLE_CHANGELING, ROLE_CULTIST,
- ROLE_DEVIL, ROLE_INTERNAL_AFFAIRS, ROLE_MALF,
+ ROLE_BROTHER, ROLE_CHANGELING,
+ ROLE_INTERNAL_AFFAIRS, ROLE_MALF,
ROLE_MONKEY, ROLE_NINJA, ROLE_OPERATIVE,
ROLE_OVERTHROW, ROLE_REV, ROLE_REVENANT,
ROLE_REV_HEAD, ROLE_SYNDICATE,
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 927120f94a9d..5123eed0be58 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -78,13 +78,6 @@
else
message_admins("[key_name_admin(usr)] tried to create changelings. Unfortunately, there were no candidates available.")
log_admin("[key_name(usr)] failed to create changelings.")
- if("cult")
- if(src.makeCult())
- message_admins("[key_name(usr)] started a cult.")
- log_admin("[key_name(usr)] started a cult.")
- else
- message_admins("[key_name_admin(usr)] tried to start a cult. Unfortunately, there were no candidates available.")
- log_admin("[key_name(usr)] failed to start a cult.")
if("wizard")
message_admins("[key_name(usr)] is creating a wizard...")
if(src.makeWizard())
@@ -350,14 +343,6 @@
M.change_mob_type(/mob/living/simple_animal/parrot , null, null, delmob)
if("polyparrot")
M.change_mob_type(/mob/living/simple_animal/parrot/Polly , null, null, delmob)
- if("constructjuggernaut")
- M.change_mob_type(/mob/living/simple_animal/hostile/construct/juggernaut , null, null, delmob)
- if("constructartificer")
- M.change_mob_type(/mob/living/simple_animal/hostile/construct/artificer , null, null, delmob)
- if("constructwraith")
- M.change_mob_type(/mob/living/simple_animal/hostile/construct/wraith , null, null, delmob)
- if("shade")
- M.change_mob_type(/mob/living/simple_animal/shade , null, null, delmob)
else if(href_list["boot2"])
if(!check_rights(R_ADMIN))
@@ -1140,12 +1125,6 @@
return
output_ai_laws()
- else if(href_list["admincheckdevilinfo"])
- if(!check_rights(R_ADMIN))
- return
- var/mob/M = locate(href_list["admincheckdevilinfo"])
- output_devil_info(M)
-
else if(href_list["adminmoreinfo"])
var/mob/M = locate(href_list["adminmoreinfo"]) in GLOB.mob_list
if(!ismob(M))
@@ -1217,9 +1196,9 @@
//milk to plasmemes and skeletons, meat to lizards, electricity bars to ethereals, cookies to everyone else
var/obj/item/reagent_containers/food/cookiealt = /obj/item/reagent_containers/food/snacks/cookie
if(isskeleton(H))
- cookiealt = /obj/item/reagent_containers/food/condiment/milk
+ cookiealt = /obj/item/reagent_containers/condiment/milk
else if(isplasmaman(H))
- cookiealt = /obj/item/reagent_containers/food/condiment/milk
+ cookiealt = /obj/item/reagent_containers/condiment/milk
else if(iselzuose(H))
cookiealt = /obj/item/reagent_containers/food/snacks/energybar
// WS - More fun with cookies - Start
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index abdecf91de60..e30519342ffb 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -16,7 +16,6 @@
var/dat = {"
Make Traitors Make Changelings
- Make Cult Make Wizard (Requires Ghosts) Make Nuke Team (Requires Ghosts) Make Response Team (Requires Ghosts)
@@ -113,38 +112,6 @@
new_character.mind.make_Wizard()
return TRUE
-
-/datum/admins/proc/makeCult()
- var/datum/game_mode/cult/temp = new
- if(CONFIG_GET(flag/protect_roles_from_antagonist))
- temp.restricted_jobs += temp.protected_jobs
-
- if(CONFIG_GET(flag/protect_assistant_from_antagonist))
- temp.restricted_jobs += "Assistant"
-
- var/list/mob/living/carbon/human/candidates = list()
- var/mob/living/carbon/human/H = null
-
- for(var/mob/living/carbon/human/applicant in GLOB.player_list)
- if(isReadytoRumble(applicant, ROLE_CULTIST))
- if(temp.age_check(applicant.client))
- if(!(applicant.job in temp.restricted_jobs))
- candidates += applicant
-
- if(candidates.len)
- var/numCultists = min(candidates.len, 4)
-
- for(var/i = 0, iYou are feeling far too docile to do that.")
return
- if(iscultist(victim) || HAS_TRAIT(victim, TRAIT_MINDSHIELD))
- to_chat(src, "[victim]'s mind seems to be blocked by some unknown force!")
- return
-
else
log_game("[src]/([src.ckey]) assumed control of [victim]/([victim.ckey] with borer powers.")
diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm
deleted file mode 100644
index b4bfb265386d..000000000000
--- a/code/modules/antagonists/cult/blood_magic.dm
+++ /dev/null
@@ -1,803 +0,0 @@
-/datum/action/innate/cult/blood_magic //Blood magic handles the creation of blood spells (formerly talismans)
- name = "Prepare Blood Magic"
- button_icon_state = "carve"
- desc = "Prepare blood magic by carving runes into your flesh. This is easier with an empowering rune."
- var/list/spells = list()
- var/channeling = FALSE
-
-/datum/action/innate/cult/blood_magic/Grant()
- ..()
- button.screen_loc = DEFAULT_BLOODSPELLS
- button.moved = DEFAULT_BLOODSPELLS
- button.ordered = FALSE
-
-/datum/action/innate/cult/blood_magic/Remove()
- for(var/X in spells)
- qdel(X)
- ..()
-
-/datum/action/innate/cult/blood_magic/IsAvailable()
- if(!iscultist(owner))
- return FALSE
- return ..()
-
-/datum/action/innate/cult/blood_magic/proc/Positioning()
- var/list/screen_loc_split = splittext(button.screen_loc,",")
- var/list/screen_loc_X = splittext(screen_loc_split[1],":")
- var/list/screen_loc_Y = splittext(screen_loc_split[2],":")
- var/pix_X = text2num(screen_loc_X[2])
- for(var/datum/action/innate/cult/blood_spell/B in spells)
- if(B.button.locked)
- var/order = pix_X+spells.Find(B)*31
- B.button.screen_loc = "[screen_loc_X[1]]:[order],[screen_loc_Y[1]]:[screen_loc_Y[2]]"
- B.button.moved = B.button.screen_loc
-
-/datum/action/innate/cult/blood_magic/Activate()
- var/rune = FALSE
- var/limit = RUNELESS_MAX_BLOODCHARGE
- for(var/obj/effect/rune/empower/R in range(1, owner))
- rune = TRUE
- break
- if(rune)
- limit = MAX_BLOODCHARGE
- if(spells.len >= limit)
- if(rune)
- to_chat(owner, "You cannot store more than [MAX_BLOODCHARGE] spells. Pick a spell to remove.")
- else
- to_chat(owner, "You cannot store more than [RUNELESS_MAX_BLOODCHARGE] spells without an empowering rune! Pick a spell to remove.")
- var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells
- if(nullify_spell)
- qdel(nullify_spell)
- return
- var/entered_spell_name
- var/datum/action/innate/cult/blood_spell/BS
- var/list/possible_spells = list()
- for(var/I in subtypesof(/datum/action/innate/cult/blood_spell))
- var/datum/action/innate/cult/blood_spell/J = I
- var/cult_name = initial(J.name)
- possible_spells[cult_name] = J
- possible_spells += "(REMOVE SPELL)"
- entered_spell_name = input(owner, "Pick a blood spell to prepare...", "Spell Choices") as null|anything in possible_spells
- if(entered_spell_name == "(REMOVE SPELL)")
- var/nullify_spell = input(owner, "Choose a spell to remove.", "Current Spells") as null|anything in spells
- if(nullify_spell)
- qdel(nullify_spell)
- return
- BS = possible_spells[entered_spell_name]
- if(QDELETED(src) || owner.incapacitated() || !BS || (rune && !(locate(/obj/effect/rune/empower) in range(1, owner))) || (spells.len >= limit))
- return
- to_chat(owner,"You begin to carve unnatural symbols into your flesh!")
- SEND_SOUND(owner, sound('sound/weapons/slice.ogg',0,1,10))
- if(!channeling)
- channeling = TRUE
- else
- to_chat(owner, "You are already invoking blood magic!")
- return
- if(do_after(owner, 100 - rune*60, target = owner))
- if(ishuman(owner))
- var/mob/living/carbon/human/H = owner
- H.bleed(40 - rune*32)
- var/datum/action/innate/cult/blood_spell/new_spell = new BS(owner)
- new_spell.Grant(owner, src)
- spells += new_spell
- Positioning()
- to_chat(owner, "Your wounds glow with power, you have prepared a [new_spell.name] invocation!")
- channeling = FALSE
-
-/datum/action/innate/cult/blood_spell //The next generation of talismans, handles storage/creation of blood magic
- name = "Blood Magic"
- button_icon_state = "telerune"
- desc = "Fear the Old Blood."
- var/charges = 1
- var/magic_path = null
- var/obj/item/melee/blood_magic/hand_magic
- var/datum/action/innate/cult/blood_magic/all_magic
- var/base_desc //To allow for updating tooltips
- var/invocation
- var/health_cost = 0
-
-/datum/action/innate/cult/blood_spell/Grant(mob/living/owner, datum/action/innate/cult/blood_magic/BM)
- if(health_cost)
- desc += " Deals [health_cost] damage to your arm per use."
- base_desc = desc
- desc += " Has [charges] use\s remaining."
- all_magic = BM
- ..()
- button.locked = TRUE
- button.ordered = FALSE
-
-/datum/action/innate/cult/blood_spell/Remove()
- if(all_magic)
- all_magic.spells -= src
- if(hand_magic)
- qdel(hand_magic)
- hand_magic = null
- ..()
-
-/datum/action/innate/cult/blood_spell/IsAvailable()
- if(!iscultist(owner) || owner.incapacitated() || !charges)
- return FALSE
- return ..()
-
-/datum/action/innate/cult/blood_spell/Activate()
- if(magic_path) //If this spell flows from the hand
- if(!hand_magic)
- hand_magic = new magic_path(owner, src)
- if(!owner.put_in_hands(hand_magic))
- qdel(hand_magic)
- hand_magic = null
- to_chat(owner, "You have no empty hand for invoking blood magic!")
- return
- to_chat(owner, "Your wounds glow as you invoke the [name].")
- return
- if(hand_magic)
- qdel(hand_magic)
- hand_magic = null
- to_chat(owner, "You snuff out the spell, saving it for later.")
-
-
-//Cult Blood Spells
-/datum/action/innate/cult/blood_spell/stun
- name = "Stun"
- desc = "Empowers your hand to stun and mute a victim on contact."
- button_icon_state = "hand"
- magic_path = "/obj/item/melee/blood_magic/stun"
- health_cost = 10
-
-/datum/action/innate/cult/blood_spell/teleport
- name = "Teleport"
- desc = "Empowers your hand to teleport yourself or another cultist to a teleport rune on contact."
- button_icon_state = "tele"
- magic_path = "/obj/item/melee/blood_magic/teleport"
- health_cost = 7
-
-/datum/action/innate/cult/blood_spell/emp
- name = "Electromagnetic Pulse"
- desc = "Emits a large electromagnetic pulse."
- button_icon_state = "emp"
- health_cost = 10
- invocation = "Ta'gh fara'qha fel d'amar det!"
-
-/datum/action/innate/cult/blood_spell/emp/Activate()
- owner.visible_message(
- "[owner]'s hand flashes a bright blue!", \
- "You speak the cursed words, emitting an EMP blast from your hand.")
- empulse(owner, 2, 5)
- owner.whisper(invocation, language = /datum/language/common)
- charges--
- if(charges<=0)
- qdel(src)
-
-/datum/action/innate/cult/blood_spell/shackles
- name = "Shadow Shackles"
- desc = "Empowers your hand to start handcuffing victim on contact, and mute them if successful."
- button_icon_state = "cuff"
- charges = 4
- magic_path = "/obj/item/melee/blood_magic/shackles"
-
-/datum/action/innate/cult/blood_spell/construction
- name = "Twisted Construction"
- desc = "Empowers your hand to corrupt certain metalic objects. Converts: Plasteel into runed metal 50 metal into a construct shell Living cyborgs into constructs after a delay Cyborg shells into construct shells Airlocks into brittle runed airlocks after a delay (harm intent)"
- button_icon_state = "transmute"
- magic_path = "/obj/item/melee/blood_magic/construction"
- health_cost = 12
-
-/datum/action/innate/cult/blood_spell/horror
- name = "Hallucinations"
- desc = "Gives hallucinations to a target at range. A silent and invisible spell."
- button_icon_state = "horror"
- var/obj/effect/proc_holder/horror/PH
- charges = 4
-
-/datum/action/innate/cult/blood_spell/horror/New()
- PH = new()
- PH.attached_action = src
- ..()
-
-/datum/action/innate/cult/blood_spell/horror/Destroy()
- var/obj/effect/proc_holder/horror/destroy = PH
- . = ..()
- if(destroy && !QDELETED(destroy))
- QDEL_NULL(destroy)
-
-/datum/action/innate/cult/blood_spell/horror/Activate()
- PH.toggle(owner) //the important bit
- return TRUE
-
-/obj/effect/proc_holder/horror
- active = FALSE
- ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi'
- var/datum/action/innate/cult/blood_spell/attached_action
-
-/obj/effect/proc_holder/horror/Destroy()
- var/datum/action/innate/cult/blood_spell/AA = attached_action
- . = ..()
- if(AA && !QDELETED(AA))
- QDEL_NULL(AA)
-
-/obj/effect/proc_holder/horror/proc/toggle(mob/user)
- if(active)
- remove_ranged_ability("You dispel the magic...")
- else
- add_ranged_ability(user, "You prepare to horrify a target...")
-
-/obj/effect/proc_holder/horror/InterceptClickOn(mob/living/caller, params, atom/target)
- if(..())
- return
- if(ranged_ability_user.incapacitated() || !iscultist(caller))
- remove_ranged_ability()
- return
- var/turf/T = get_turf(ranged_ability_user)
- if(!isturf(T))
- return FALSE
- if(target in view(7, get_turf(ranged_ability_user)))
- if(!ishuman(target) || iscultist(target))
- return
- var/mob/living/carbon/human/H = target
- H.hallucination = max(H.hallucination, 120)
- SEND_SOUND(ranged_ability_user, sound('sound/effects/ghost.ogg',0,1,50))
- var/image/C = image('icons/effects/cult_effects.dmi',H,"bloodsparkles", ABOVE_MOB_LAYER)
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, NONE)
- addtimer(CALLBACK(H, TYPE_PROC_REF(/atom, remove_alt_appearance),"cult_apoc",TRUE), 2400, TIMER_OVERRIDE|TIMER_UNIQUE)
- to_chat(ranged_ability_user,"[H] has been cursed with living nightmares!")
- attached_action.charges--
- attached_action.desc = attached_action.base_desc
- attached_action.desc += " Has [attached_action.charges] use\s remaining."
- attached_action.UpdateButtonIcon()
- if(attached_action.charges <= 0)
- remove_ranged_ability("You have exhausted the spell's power!")
- qdel(src)
-
-/datum/action/innate/cult/blood_spell/veiling
- name = "Conceal Presence"
- desc = "Alternates between hiding and revealing nearby cult structures and runes."
- invocation = "Kla'atu barada nikt'o!"
- button_icon_state = "gone"
- charges = 10
- var/revealing = FALSE //if it reveals or not
-
-/datum/action/innate/cult/blood_spell/veiling/Activate()
- if(!revealing)
- owner.visible_message("Thin grey dust falls from [owner]'s hand!", \
- "You invoke the veiling spell, hiding nearby runes.")
- charges--
- SEND_SOUND(owner, sound('sound/magic/smoke.ogg',0,1,25))
- owner.whisper(invocation, language = /datum/language/common)
- for(var/obj/effect/rune/R in range(5,owner))
- R.conceal()
- for(var/obj/structure/destructible/cult/S in range(5,owner))
- S.conceal()
- for(var/turf/open/floor/engine/cult/T in range(5,owner))
- T.realappearance.alpha = 0
- for(var/obj/machinery/door/airlock/cult/AL in range(5, owner))
- AL.conceal()
- revealing = TRUE
- name = "Reveal Runes"
- button_icon_state = "back"
- else
- owner.visible_message(
- "A flash of light shines from [owner]'s hand!", \
- "You invoke the counterspell, revealing nearby runes.")
- charges--
- owner.whisper(invocation, language = /datum/language/common)
- SEND_SOUND(owner, sound('sound/magic/enter_blood.ogg',0,1,25))
- for(var/obj/effect/rune/R in range(7,owner)) //More range in case you weren't standing in exactly the same spot
- R.reveal()
- for(var/obj/structure/destructible/cult/S in range(6,owner))
- S.reveal()
- for(var/turf/open/floor/engine/cult/T in range(6,owner))
- T.realappearance.alpha = initial(T.realappearance.alpha)
- for(var/obj/machinery/door/airlock/cult/AL in range(6, owner))
- AL.reveal()
- revealing = FALSE
- name = "Conceal Runes"
- button_icon_state = "gone"
- if(charges<= 0)
- qdel(src)
- desc = base_desc
- desc += " Has [charges] use\s remaining."
- UpdateButtonIcon()
-
-/datum/action/innate/cult/blood_spell/manipulation
- name = "Blood Rites"
- desc = "Empowers your hand to absorb blood to be used for advanced rites, or heal a cultist on contact. Use the spell in-hand to cast advanced rites."
- invocation = "Fel'th Dol Ab'orod!"
- button_icon_state = "manip"
- charges = 5
- magic_path = "/obj/item/melee/blood_magic/manipulator"
-
-
-// The "magic hand" items
-/obj/item/melee/blood_magic
- name = "\improper magical aura"
- desc = "A sinister looking aura that distorts the flow of reality around it."
- icon = 'icons/obj/items.dmi'
- lefthand_file = 'icons/mob/inhands/misc/touchspell_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/touchspell_righthand.dmi'
- icon_state = "disintegrate"
- item_state = "disintegrate"
- item_flags = NEEDS_PERMIT | ABSTRACT | DROPDEL
-
- w_class = WEIGHT_CLASS_HUGE
- throwforce = 0
- throw_range = 0
- throw_speed = 0
- var/invocation
- var/uses = 1
- var/health_cost = 0 //The amount of health taken from the user when invoking the spell
- var/datum/action/innate/cult/blood_spell/source
-
-/obj/item/melee/blood_magic/New(loc, spell)
- if(spell)
- source = spell
- uses = source.charges
- health_cost = source.health_cost
- ..()
-
-/obj/item/melee/blood_magic/Destroy()
- if(!QDELETED(source))
- if(uses <= 0)
- source.hand_magic = null
- qdel(source)
- source = null
- else
- source.hand_magic = null
- source.charges = uses
- source.desc = source.base_desc
- source.desc += " Has [uses] use\s remaining."
- source.UpdateButtonIcon()
- return ..()
-
-/obj/item/melee/blood_magic/attack_self(mob/living/user)
- afterattack(user, user, TRUE)
-
-/obj/item/melee/blood_magic/attack(mob/living/M, mob/living/carbon/user)
- if(!iscarbon(user) || !iscultist(user))
- uses = 0
- qdel(src)
- return
- log_combat(user, M, "used a cult spell on", source.name, "")
- M.lastattacker = user.real_name
- M.lastattackerckey = user.ckey
-
-/obj/item/melee/blood_magic/afterattack(atom/target, mob/living/carbon/user, proximity)
- . = ..()
- if(invocation)
- user.whisper(invocation, language = /datum/language/common)
- if(health_cost)
- if(user.active_hand_index == 1)
- user.apply_damage(health_cost, BRUTE, BODY_ZONE_L_ARM)
- else
- user.apply_damage(health_cost, BRUTE, BODY_ZONE_R_ARM)
- if(uses <= 0)
- qdel(src)
- else if(source)
- source.desc = source.base_desc
- source.desc += " Has [uses] use\s remaining."
- source.UpdateButtonIcon()
-
-//Stun
-/obj/item/melee/blood_magic/stun
- name = "Stunning Aura"
- desc = "Will stun and mute a weak-minded victim on contact."
- color = RUNE_COLOR_RED
- invocation = "Fuu ma'jin!"
-
-/obj/item/melee/blood_magic/stun/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(!isliving(target) || !proximity)
- return
- var/mob/living/L = target
- if(iscultist(target))
- return
- if(iscultist(user))
- user.visible_message("[user] holds up [user.p_their()] hand, which explodes in a flash of red light!", \
- "You attempt to stun [L] with the spell!")
-
- user.mob_light(_range = 3, _color = LIGHT_COLOR_BLOOD_MAGIC, _duration = 0.2 SECONDS)
-
- var/anti_magic_source = L.anti_magic_check()
- if(anti_magic_source)
-
- L.mob_light(_range = 2, _color = LIGHT_COLOR_HOLY_MAGIC, _duration = 10 SECONDS)
- var/mutable_appearance/forbearance = mutable_appearance('icons/effects/genetics.dmi', "servitude", -MUTATIONS_LAYER)
- L.add_overlay(forbearance)
- addtimer(CALLBACK(L, TYPE_PROC_REF(/atom, cut_overlay), forbearance), 100)
-
- if(istype(anti_magic_source, /obj/item))
- var/obj/item/ams_object = anti_magic_source
- target.visible_message(
- "[L] starts to glow in a halo of light!", \
- "Your [ams_object.name] begins to glow, emitting a blanket of holy light which surrounds you and protects you from the flash of light!")
- else
- target.visible_message(
- "[L] starts to glow in a halo of light!", \
- "A feeling of warmth washes over you, rays of holy light surround your body and protect you from the flash of light!")
-
- else
- if(HAS_TRAIT(target, TRAIT_MINDSHIELD))
- var/mob/living/carbon/C = L
- to_chat(user, "Their mind was stronger than expected, but you still managed to do some damage!")
- C.stuttering += 8
- C.dizziness += 30
- C.Jitter(8)
- C.drop_all_held_items()
- C.bleed(40)
- C.apply_damage(60, STAMINA, BODY_ZONE_CHEST)
- else
- to_chat(user, "In a brilliant flash of red, [L] falls to the ground!")
- L.Paralyze(160)
- L.flash_act(1,1)
- if(issilicon(target))
- var/mob/living/silicon/S = L
- S.emp_act(EMP_HEAVY)
- else if(iscarbon(target))
- var/mob/living/carbon/C = L
- C.silent += 6
- C.stuttering += 15
- C.cultslurring += 15
- C.Jitter(15)
- uses--
- ..()
-
-//Teleportation
-/obj/item/melee/blood_magic/teleport
- name = "Teleporting Aura"
- color = RUNE_COLOR_TELEPORT
- desc = "Will teleport a cultist to a teleport rune on contact."
- invocation = "Sas'so c'arta forbici!"
-
-/obj/item/melee/blood_magic/teleport/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(!iscultist(target) || !proximity)
- to_chat(user, "You can only teleport adjacent cultists with this spell!")
- return
- if(iscultist(user))
- var/list/potential_runes = list()
- var/list/teleportnames = list()
- for(var/R in GLOB.teleport_runes)
- var/obj/effect/rune/teleport/T = R
- potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
-
- if(!potential_runes.len)
- to_chat(user, "There are no valid runes to teleport to!")
- log_game("Teleport talisman failed - no other teleport runes")
- return
-
- var/turf/T = get_turf(src)
- if(is_away_level(T))
- to_chat(user, "You are not in the right dimension!")
- log_game("Teleport spell failed - user in away mission")
- return
-
- var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
- var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
- if(QDELETED(src) || !user || !user.is_holding(src) || user.incapacitated() || !actual_selected_rune || !proximity)
- return
- var/turf/dest = get_turf(actual_selected_rune)
- if(dest.is_blocked_turf(TRUE))
- to_chat(user, "The target rune is blocked. You cannot teleport there.")
- return
- uses--
- var/turf/origin = get_turf(user)
- var/mob/living/L = target
- if(do_teleport(L, dest, channel = TELEPORT_CHANNEL_CULT))
- origin.visible_message("Dust flows from [user]'s hand, and [user.p_they()] disappear[user.p_s()] with a sharp crack!", \
- "You speak the words of the talisman and find yourself somewhere else!", "You hear a sharp crack.")
- dest.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
- ..()
-
-//Shackles
-/obj/item/melee/blood_magic/shackles
- name = "Shackling Aura"
- desc = "Will start handcuffing a victim on contact, and mute them if successful."
- invocation = "In'totum Lig'abis!"
- color = "#000000" // black
-
-/obj/item/melee/blood_magic/shackles/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(iscultist(user) && iscarbon(target) && proximity)
- var/mob/living/carbon/C = target
- if(C.canBeHandcuffed())
- CuffAttack(C, user)
- else
- user.visible_message("This victim doesn't have enough arms to complete the restraint!")
- return
- ..()
-
-/obj/item/melee/blood_magic/shackles/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
- if(!C.handcuffed)
- playsound(loc, 'sound/weapons/cablecuff.ogg', 30, TRUE, -2)
- C.visible_message("[user] begins restraining [C] with dark magic!", \
- "[user] begins shaping dark magic shackles around your wrists!")
- if(do_after(user, 3 SECONDS, C))
- if(!C.handcuffed)
- C.set_handcuffed(new /obj/item/restraints/handcuffs/energy/cult/used(C))
- C.update_handcuffed()
- C.silent += 5
- to_chat(user, "You shackle [C].")
- log_combat(user, C, "shackled")
- uses--
- else
- to_chat(user, "[C] is already bound.")
- else
- to_chat(user, "You fail to shackle [C].")
- else
- to_chat(user, "[C] is already bound.")
-
-
-/obj/item/restraints/handcuffs/energy/cult //For the shackling spell
- name = "shadow shackles"
- desc = "Shackles that bind the wrists with sinister magic."
- trashtype = /obj/item/restraints/handcuffs/energy/used
- item_flags = DROPDEL
-
-/obj/item/restraints/handcuffs/energy/cult/used/dropped(mob/user)
- user.visible_message("[user]'s shackles shatter in a discharge of dark magic!", \
- "Your [src] shatters in a discharge of dark magic!")
- . = ..()
-
-
-//Construction: Converts 50 metal to a construct shell, plasteel to runed metal, airlock to brittle runed airlock, a borg to a construct, or borg shell to a construct shell
-/obj/item/melee/blood_magic/construction
- name = "Twisting Aura"
- desc = "Corrupts certain metalic objects on contact."
- invocation = "Ethra p'ni dedol!"
- color = "#000000" // black
- var/channeling = FALSE
-
-/obj/item/melee/blood_magic/construction/examine(mob/user)
- . = ..()
- . += {"A sinister spell used to convert:\n
- Plasteel into runed metal\n
- [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal into a construct shell\n
- Living cyborgs into constructs after a delay\n
- Cyborg shells into construct shells\n
- Airlocks into brittle runed airlocks after a delay (harm intent)"}
-
-/obj/item/melee/blood_magic/construction/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
- if(proximity_flag && iscultist(user))
- if(channeling)
- to_chat(user, "You are already invoking twisted construction!")
- return
- var/turf/T = get_turf(target)
- if(istype(target, /obj/item/stack/sheet/metal))
- var/obj/item/stack/sheet/candidate = target
- if(candidate.use(METAL_TO_CONSTRUCT_SHELL_CONVERSION))
- uses--
- to_chat(user, "A dark cloud emanates from your hand and swirls around the metal, twisting it into a construct shell!")
- new /obj/structure/constructshell(T)
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- else
- to_chat(user, "You need [METAL_TO_CONSTRUCT_SHELL_CONVERSION] metal to produce a construct shell!")
- return
- else if(istype(target, /obj/item/stack/sheet/plasteel))
- var/obj/item/stack/sheet/plasteel/candidate = target
- var/quantity = candidate.amount
- if(candidate.use(quantity))
- uses --
- new /obj/item/stack/sheet/mineral/hidden/hellstone(T,quantity)
- to_chat(user, "A dark cloud emanates from you hand and swirls around the plasteel, transforming it into runed metal!")
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- else if(istype(target,/mob/living/silicon/robot))
- var/mob/living/silicon/robot/candidate = target
- if(candidate.mmi)
- channeling = TRUE
- user.visible_message("A dark cloud emanates from [user]'s hand and swirls around [candidate]!")
- playsound(T, 'sound/machines/creaking.ogg', 80, TRUE)
- var/prev_color = candidate.color
- candidate.color = "black"
- if(do_after(user, 90, target = candidate))
- candidate.emp_act(EMP_HEAVY)
- var/list/constructs = list(
- "Juggernaut" = image(icon = 'icons/mob/cult.dmi', icon_state = "juggernaut"),
- "Wraith" = image(icon = 'icons/mob/cult.dmi', icon_state = "wraith"),
- "Artificer" = image(icon = 'icons/mob/cult.dmi', icon_state = "artificer")
- )
- var/construct_class = show_radial_menu(user, src, constructs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
- if(!check_menu(user))
- return
- if(QDELETED(candidate))
- channeling = FALSE
- return
- user.visible_message("The dark cloud recedes from what was formerly [candidate], revealing a\n [construct_class]!")
- switch(construct_class)
- if("Juggernaut")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut, candidate, user, 0, T)
- if("Wraith")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, candidate, user, 0, T)
- if("Artificer")
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer, candidate, user, 0, T)
- else
- return
- uses--
- candidate.mmi = null
- qdel(candidate)
- channeling = FALSE
- else
- channeling = FALSE
- candidate.color = prev_color
- return
- else
- uses--
- to_chat(user, "A dark cloud emanates from you hand and swirls around [candidate] - twisting it into a construct shell!")
- new /obj/structure/constructshell(T)
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- qdel(candidate)
- else if(istype(target,/obj/machinery/door/airlock))
- channeling = TRUE
- playsound(T, 'sound/machines/airlockforced.ogg', 50, TRUE)
- do_sparks(5, TRUE, target)
- if(do_after(user, 50, target = user))
- if(QDELETED(target))
- channeling = FALSE
- return
- target.narsie_act()
- uses--
- user.visible_message("Black ribbons suddenly emanate from [user]'s hand and cling to the airlock - twisting and corrupting it!")
- SEND_SOUND(user, sound('sound/effects/magic.ogg',0,1,25))
- channeling = FALSE
- else
- channeling = FALSE
- return
- else
- to_chat(user, "The spell will not work on [target]!")
- return
- ..()
-
-/obj/item/melee/blood_magic/construction/proc/check_menu(mob/user)
- if(!istype(user))
- return FALSE
- if(user.incapacitated() || !user.Adjacent(src))
- return FALSE
- return TRUE
-
-
-//Armor: Gives the target a basic cultist combat loadout
-/obj/item/melee/blood_magic/armor
- name = "Arming Aura"
- desc = "Will equipt cult combat gear onto a cultist on contact."
- color = "#33cc33" // green
-
-/obj/item/melee/blood_magic/armor/afterattack(atom/target, mob/living/carbon/user, proximity)
- if(iscarbon(target) && proximity)
- uses--
- var/mob/living/carbon/C = target
- C.visible_message("Otherworldly armor suddenly appears on [C]!")
- C.equip_to_slot_or_del(new /obj/item/clothing/under/color/black,ITEM_SLOT_ICLOTHING)
- C.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), ITEM_SLOT_OCLOTHING)
- C.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), ITEM_SLOT_FEET)
- C.equip_to_slot_or_del(new /obj/item/storage/backpack/cultpack(user), ITEM_SLOT_BACK)
- if(C == user)
- qdel(src) //Clears the hands
- C.put_in_hands(new /obj/item/restraints/legcuffs/bola/cult(user))
- ..()
-
-/obj/item/melee/blood_magic/manipulator
- name = "Blood Rite Aura"
- desc = "Absorbs blood from anything you touch. Touching cultists and constructs can heal them. Use in-hand to cast an advanced rite."
- color = "#7D1717"
-
-/obj/item/melee/blood_magic/manipulator/examine(mob/user)
- . = ..()
- . += "Blood spear, blood bolt barrage, and blood beam cost [BLOOD_SPEAR_COST], [BLOOD_BARRAGE_COST], and [BLOOD_BEAM_COST] charges respectively."
-
-/obj/item/melee/blood_magic/manipulator/afterattack(atom/target, mob/living/carbon/human/user, proximity)
- if(proximity)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(NOBLOOD in H.dna.species.species_traits)
- to_chat(user,"Blood rites do not work on species with no blood!")
- return
- if(iscultist(H))
- if(H.stat == DEAD)
- to_chat(user,"Only a revive rune can bring back the dead!")
- return
- if(H.blood_volume < BLOOD_VOLUME_SAFE)
- var/restore_blood = BLOOD_VOLUME_SAFE - H.blood_volume
- if(uses*2 < restore_blood)
- H.blood_volume += uses*2
- to_chat(user,"You use the last of your blood rites to restore what blood you could!")
- uses = 0
- return ..()
- else
- H.blood_volume = BLOOD_VOLUME_SAFE
- uses -= round(restore_blood/2)
- to_chat(user,"Your blood rites have restored [H == user ? "your" : "[H.p_their()]"] blood to safe levels!")
- var/overall_damage = H.getBruteLoss() + H.getFireLoss() + H.getToxLoss() + H.getOxyLoss()
- if(overall_damage == 0)
- to_chat(user,"That cultist doesn't require healing!")
- else
- var/ratio = uses/overall_damage
- if(H == user)
- to_chat(user,"Your blood healing is far less efficient when used on yourself!")
- ratio *= 0.35 // Healing is half as effective if you can't perform a full heal
- uses -= round(overall_damage) // Healing is 65% more "expensive" even if you can still perform the full heal
- if(ratio>1)
- ratio = 1
- uses -= round(overall_damage)
- H.visible_message("[H] is fully healed by [H==user ? "[H.p_their()]":"[H]'s"]'s blood magic!")
- else
- H.visible_message("[H] is partially healed by [H==user ? "[H.p_their()]":"[H]'s"] blood magic.")
- uses = 0
- ratio *= -1
- H.adjustOxyLoss((overall_damage*ratio) * (H.getOxyLoss() / overall_damage), 0)
- H.adjustToxLoss((overall_damage*ratio) * (H.getToxLoss() / overall_damage), 0)
- H.adjustFireLoss((overall_damage*ratio) * (H.getFireLoss() / overall_damage), 0)
- H.adjustBruteLoss((overall_damage*ratio) * (H.getBruteLoss() / overall_damage), 0)
- H.updatehealth()
- playsound(get_turf(H), 'sound/magic/staff_healing.ogg', 25)
- new /obj/effect/temp_visual/cult/sparks(get_turf(H))
- user.Beam(H,icon_state="sendbeam",time=15)
- else
- if(H.stat == DEAD)
- to_chat(user,"[H.p_their(TRUE)] blood has stopped flowing, you'll have to find another way to extract it.")
- return
- if(H.cultslurring)
- to_chat(user,"[H.p_their(TRUE)] blood has been tainted by an even stronger form of blood magic, it's no use to us like this!")
- return
- if(H.blood_volume > BLOOD_VOLUME_SAFE)
- H.blood_volume -= 100
- uses += 50
- user.Beam(H,icon_state="drainbeam",time=10)
- playsound(get_turf(H), 'sound/magic/enter_blood.ogg', 50)
- H.visible_message("[user] drains some of [H]'s blood!")
- to_chat(user,"Your blood rite gains 50 charges from draining [H]'s blood.")
- new /obj/effect/temp_visual/cult/sparks(get_turf(H))
- else
- to_chat(user,"[H.p_theyre(TRUE)] missing too much blood - you cannot drain [H.p_them()] further!")
- return
- if(isconstruct(target))
- var/mob/living/simple_animal/M = target
- var/missing = M.maxHealth - M.health
- if(missing)
- if(uses > missing)
- M.adjustHealth(-missing)
- M.visible_message("[M] is fully healed by [user]'s blood magic!")
- uses -= missing
- else
- M.adjustHealth(-uses)
- M.visible_message("[M] is partially healed by [user]'s blood magic!")
- uses = 0
- playsound(get_turf(M), 'sound/magic/staff_healing.ogg', 25)
- user.Beam(M,icon_state="sendbeam",time=10)
- if(istype(target, /obj/effect/decal/cleanable/blood))
- blood_draw(target, user)
- ..()
-
-/obj/item/melee/blood_magic/manipulator/proc/blood_draw(atom/target, mob/living/carbon/human/user)
- var/temp = 0
- var/turf/T = get_turf(target)
- if(T)
- for(var/obj/effect/decal/cleanable/blood/B in view(T, 2))
- if(B.blood_state == BLOOD_STATE_HUMAN)
- if(B.bloodiness == 100) //Bonus for "pristine" bloodpools, also to prevent cheese with footprint spam
- temp += 30
- else
- temp += max((B.bloodiness**2)/800,1)
- new /obj/effect/temp_visual/cult/turf/floor(get_turf(B))
- qdel(B)
- if(temp)
- user.Beam(T,icon_state="drainbeam",time=15)
- new /obj/effect/temp_visual/cult/sparks(get_turf(user))
- playsound(T, 'sound/magic/enter_blood.ogg', 50)
- to_chat(user, "Your blood rite has gained [round(temp)] charge\s from blood sources around you!")
- uses += max(1, round(temp))
-
-/obj/item/melee/blood_magic/manipulator/attack_self(mob/living/user)
- if(iscultist(user))
- var/list/options = list("Blood Beam (500)")
- var/choice = input(user, "Choose a greater blood rite...", "Greater Blood Rites") as null|anything in options
- if(!choice)
- to_chat(user, "You decide against conducting a greater blood rite.")
- return
- switch(choice)
- if("Blood Beam (500)")
- if(uses < BLOOD_BEAM_COST)
- to_chat(user, "You need [BLOOD_BEAM_COST] charges to perform this rite.")
- else
- var/obj/rite = new /obj/item/blood_beam()
- uses -= BLOOD_BEAM_COST
- qdel(src)
- if(user.put_in_hands(rite))
- to_chat(user, "Your hands glow with POWER OVERWHELMING!!!")
- else
- to_chat(user, "You need a free hand for this rite!")
- qdel(rite)
diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm
deleted file mode 100644
index d6330b386f29..000000000000
--- a/code/modules/antagonists/cult/cult.dm
+++ /dev/null
@@ -1,397 +0,0 @@
-#define SUMMON_POSSIBILITIES 3
-#define CULT_VICTORY 1
-#define CULT_LOSS 0
-#define CULT_NARSIE_KILLED -1
-
-/datum/antagonist/cult
- name = "Cultist"
- roundend_category = "cultists"
- antagpanel_category = "Cult"
- antag_moodlet = /datum/mood_event/cult
- var/datum/action/innate/cult/comm/communion = new
- var/datum/action/innate/cult/mastervote/vote = new
- var/datum/action/innate/cult/blood_magic/magic = new
- job_rank = ROLE_CULTIST
- antag_hud_type = ANTAG_HUD_CULT
- antag_hud_name = "cult"
- var/ignore_implant = FALSE
- var/give_equipment = FALSE
- var/datum/team/cult/cult_team
-
-
-/datum/antagonist/cult/get_team()
- return cult_team
-
-/datum/antagonist/cult/create_team(datum/team/cult/new_team)
- if(!new_team)
- //todo remove this and allow admin buttons to create more than one cult
- for(var/datum/antagonist/cult/H in GLOB.antagonists)
- if(!H.owner)
- continue
- if(H.cult_team)
- cult_team = H.cult_team
- return
- cult_team = new /datum/team/cult
- cult_team.setup_objectives()
- return
- if(!istype(new_team))
- stack_trace("Wrong team type passed to [type] initialization.")
- cult_team = new_team
-
-/datum/antagonist/cult/proc/add_objectives()
- objectives |= cult_team.objectives
-
-/datum/antagonist/cult/Destroy()
- QDEL_NULL(communion)
- QDEL_NULL(vote)
- return ..()
-
-/datum/antagonist/cult/can_be_owned(datum/mind/new_owner)
- . = ..()
- if(. && !ignore_implant)
- . = is_convertable_to_cult(new_owner.current,cult_team)
-
-/datum/antagonist/cult/greet()
- to_chat(owner, "You are a member of the cult!")
- owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/bloodcult.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE)//subject to change
- owner.announce_objectives()
-
-/datum/antagonist/cult/on_gain()
- . = ..()
- var/mob/living/current = owner.current
- add_objectives()
- if(give_equipment)
- equip_cultist()
- SSticker.mode.cult += owner // Only add after they've been given objectives
- current.log_message("has been converted to the cult of Nar'Sie!", LOG_ATTACK, color="#960000")
-
- if(cult_team.blood_target && cult_team.blood_target_image && current.client)
- current.client.images += cult_team.blood_target_image
-
-
-/datum/antagonist/cult/proc/equip_cultist()
- var/mob/living/carbon/H = owner.current
- if(!istype(H))
- return
- to_chat(owner, "These will help you jumpstart a cult of your own in this sector. Use them well, and remember - you are not the only one.")
-
-
-/datum/antagonist/cult/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
- var/list/slots = list(
- "backpack" = ITEM_SLOT_BACKPACK,
- "left pocket" = ITEM_SLOT_LPOCKET,
- "right pocket" = ITEM_SLOT_RPOCKET
- )
-
- var/T = new item_path(mob)
- var/item_name = initial(item_path.name)
- var/where = mob.equip_in_one_of_slots(T, slots)
- if(!where)
- to_chat(mob, "Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).")
- return 0
- else
- to_chat(mob, "You have a [item_name] in your [where].")
- if(where == "backpack")
- SEND_SIGNAL(mob.back, COMSIG_TRY_STORAGE_SHOW, mob)
- return TRUE
-
-/datum/antagonist/cult/apply_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- add_antag_hud(antag_hud_type, antag_hud_name, current)
- handle_clown_mutation(current, mob_override ? null : "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself.")
- current.faction |= "cult"
- current.grant_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST)
- if(!cult_team.cult_master)
- vote.Grant(current)
- communion.Grant(current)
- if(ishuman(current))
- magic.Grant(current)
- current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense)
- if(cult_team.cult_risen)
- cult_team.rise(current)
- if(cult_team.cult_ascendent)
- cult_team.ascend(current)
-
-/datum/antagonist/cult/remove_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- remove_antag_hud(antag_hud_type, current)
- handle_clown_mutation(current, removing = FALSE)
- current.faction -= "cult"
- current.remove_language(/datum/language/narsie, TRUE, TRUE, LANGUAGE_CULTIST)
- vote.Remove(current)
- communion.Remove(current)
- magic.Remove(current)
- current.clear_alert("bloodsense")
- if(ishuman(current))
- var/mob/living/carbon/human/H = current
- H.eye_color = initial(H.eye_color)
- H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
- REMOVE_TRAIT(H, CULT_EYES, null)
- H.remove_overlay(HALO_LAYER)
- H.update_body()
-
-/datum/antagonist/cult/on_removal()
- SSticker.mode.cult -= owner
- if(!silent)
- owner.current.visible_message("[owner.current] looks like [owner.current.p_theyve()] just reverted to [owner.current.p_their()] old faith!", null, null, null, owner.current)
- to_chat(owner.current, "An unfamiliar white light flashes through your mind, cleansing the taint of the Geometer and all your memories as her servant.")
- owner.current.log_message("has renounced the cult of Nar'Sie!", LOG_ATTACK, color="#960000")
- if(cult_team.blood_target && cult_team.blood_target_image && owner.current.client)
- owner.current.client.images -= cult_team.blood_target_image
- . = ..()
-
-/datum/antagonist/cult/admin_add(datum/mind/new_owner,mob/admin)
- give_equipment = FALSE
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has cult'ed [key_name_admin(new_owner)].")
- log_admin("[key_name(admin)] has cult'ed [key_name(new_owner)].")
-
-/datum/antagonist/cult/admin_remove(mob/user)
- message_admins("[key_name_admin(user)] has decult'ed [key_name_admin(owner)].")
- log_admin("[key_name(user)] has decult'ed [key_name(owner)].")
- SSticker.mode.remove_cultist(owner,silent=TRUE) //disgusting
-
-/datum/antagonist/cult/get_admin_commands()
- . = ..()
- .["Dagger"] = CALLBACK(src, PROC_REF(admin_give_dagger))
- .["Metal"] = CALLBACK(src, PROC_REF(admin_take_all))
-
-/datum/antagonist/cult/proc/admin_give_dagger(mob/admin)
- if(!equip_cultist())
- to_chat(admin, "Spawning dagger failed!")
-
-/datum/antagonist/cult/proc/admin_take_all(mob/admin)
- return
-
-/datum/antagonist/cult/master
- ignore_implant = TRUE
- show_in_antagpanel = FALSE //Feel free to add this later
- var/datum/action/innate/cult/master/finalreck/reckoning = new
- var/datum/action/innate/cult/master/cultmark/bloodmark = new
- var/datum/action/innate/cult/master/pulse/throwing = new
-
-/datum/antagonist/cult/master/Destroy()
- QDEL_NULL(reckoning)
- QDEL_NULL(bloodmark)
- QDEL_NULL(throwing)
- return ..()
-
-/datum/antagonist/cult/master/on_gain()
- . = ..()
- var/mob/living/current = owner.current
- set_antag_hud(current, "cultmaster")
-
-/datum/antagonist/cult/master/greet()
- to_chat(owner.current, "You are the cult's Master. As the cult's Master, you have a unique title and loud voice when communicating, are capable of marking \
- targets, such as a location or a noncultist, to direct the cult to them, and, finally, you are capable of summoning the entire living cult to your location once.")
- to_chat(owner.current, "Use these abilities to direct the cult to victory at any cost.")
-
-/datum/antagonist/cult/master/apply_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- if(!cult_team.reckoning_complete)
- reckoning.Grant(current)
- bloodmark.Grant(current)
- throwing.Grant(current)
- current.update_action_buttons_icon()
- current.apply_status_effect(/datum/status_effect/cult_master)
- if(cult_team.cult_risen)
- cult_team.rise(current)
- if(cult_team.cult_ascendent)
- cult_team.ascend(current)
-
-/datum/antagonist/cult/master/remove_innate_effects(mob/living/mob_override)
- . = ..()
- var/mob/living/current = owner.current
- if(mob_override)
- current = mob_override
- reckoning.Remove(current)
- bloodmark.Remove(current)
- throwing.Remove(current)
- current.update_action_buttons_icon()
- current.remove_status_effect(/datum/status_effect/cult_master)
-
- if(ishuman(current))
- var/mob/living/carbon/human/H = current
- H.eye_color = initial(H.eye_color)
- H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
- REMOVE_TRAIT(H, CULT_EYES, null)
- H.remove_overlay(HALO_LAYER)
- H.update_body()
-
-/datum/team/cult
- name = "Cult"
-
- var/blood_target
- var/image/blood_target_image
- var/blood_target_reset_timer
-
- var/cult_vote_called = FALSE
- var/mob/living/cult_master
- var/reckoning_complete = FALSE
- var/cult_risen = FALSE
- var/cult_ascendent = FALSE
-
-/datum/team/cult/proc/check_size()
- if(cult_ascendent)
- return
- var/alive = 0
- var/cultplayers = 0
- for(var/I in GLOB.player_list)
- var/mob/M = I
- if(M.stat != DEAD)
- if(iscultist(M))
- ++cultplayers
- else
- ++alive
- var/ratio = cultplayers/alive
- if(ratio > CULT_RISEN && !cult_risen)
- for(var/datum/mind/B in members)
- if(B.current)
- SEND_SOUND(B.current, 'sound/hallucinations/i_see_you2.ogg')
- to_chat(B.current, "The veil weakens as your cult grows, your eyes begin to glow...")
- addtimer(CALLBACK(src, PROC_REF(rise), B.current), 200)
- cult_risen = TRUE
-
- if(ratio > CULT_ASCENDENT && !cult_ascendent)
- for(var/datum/mind/B in members)
- if(B.current)
- SEND_SOUND(B.current, 'sound/hallucinations/im_here1.ogg')
- to_chat(B.current, "Your cult is ascendent and the red harvest approaches - you cannot hide your true nature for much longer!!")
- addtimer(CALLBACK(src, PROC_REF(ascend), B.current), 200)
- cult_ascendent = TRUE
-
-
-/datum/team/cult/proc/rise(cultist)
- if(ishuman(cultist))
- var/mob/living/carbon/human/H = cultist
- H.eye_color = "f00"
- H.dna.update_ui_block(DNA_EYE_COLOR_BLOCK)
- ADD_TRAIT(H, CULT_EYES, CULT_TRAIT)
- H.update_body()
-
-/datum/team/cult/proc/ascend(cultist)
- if(ishuman(cultist))
- var/mob/living/carbon/human/H = cultist
- new /obj/effect/temp_visual/cult/sparks(get_turf(H), H.dir)
- var/istate = pick("halo1","halo2","halo3","halo4","halo5","halo6")
- var/mutable_appearance/new_halo_overlay = mutable_appearance('icons/effects/32x64.dmi', istate, -HALO_LAYER)
- H.overlays_standing[HALO_LAYER] = new_halo_overlay
- H.apply_overlay(HALO_LAYER)
-
-/datum/objective/sacrifice/find_target(dupe_search_range)
- if(!istype(team, /datum/team/cult))
- return
- var/datum/team/cult/C = team
- var/list/target_candidates = list()
- for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && !is_convertable_to_cult(player) && player.stat != DEAD)
- target_candidates += player.mind
- if(target_candidates.len == 0)
- message_admins("Cult Sacrifice: Could not find unconvertible target, checking for convertible target.")
- for(var/mob/living/carbon/human/player in GLOB.player_list)
- if(player.mind && !player.mind.has_antag_datum(/datum/antagonist/cult) && player.stat != DEAD)
- target_candidates += player.mind
- listclearnulls(target_candidates)
- if(LAZYLEN(target_candidates))
- target = pick(target_candidates)
- update_explanation_text()
- else
- message_admins("Cult Sacrifice: Could not find unconvertible or convertible target. WELP!")
- for(var/datum/mind/M in C.members)
- if(M.current)
- M.current.clear_alert("bloodsense")
- M.current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense)
-
-/datum/team/cult/proc/setup_objectives()
- var/datum/objective/sacrifice/sac_objective = new
- sac_objective.team = src
- sac_objective.find_target()
- objectives += sac_objective
-
- var/datum/objective/eldergod/summon_objective = new
- summon_objective.team = src
- objectives += summon_objective
-
-
-/datum/objective/sacrifice
- var/sacced = FALSE
- var/sac_image
-
-/datum/objective/sacrifice/check_completion()
- return sacced || completed
-
-/datum/objective/sacrifice/update_explanation_text()
- if(target)
- explanation_text = "Sacrifice [target], the [target.assigned_role] via invoking an Offer rune with [target.p_them()] on it and three acolytes around it."
- else
- explanation_text = "The veil has already been weakened here, proceed to the final objective."
-
-/datum/objective/eldergod
- var/summoned = FALSE
- var/killed = FALSE
- var/list/summon_spots = list()
-
-/datum/objective/eldergod/New()
- ..()
- var/sanity = 0
- while(summon_spots.len < SUMMON_POSSIBILITIES && sanity < 100)
- var/area/summon_area = pick(GLOB.sortedAreas - summon_spots)
- if(summon_area && (summon_area.area_flags & VALID_TERRITORY))
- summon_spots += summon_area
- sanity++
- update_explanation_text()
-
-/datum/objective/eldergod/update_explanation_text()
- explanation_text = "Summon Nar'Sie by invoking the rune 'Summon Nar'Sie'. The summoning can only be accomplished in [english_list(summon_spots)] - where the veil is weak enough for the ritual to begin."
-
-/datum/objective/eldergod/check_completion()
- if(killed)
- return CULT_NARSIE_KILLED // You failed so hard that even the code went backwards.
- return summoned || completed
-
-/datum/team/cult/proc/check_cult_victory()
- for(var/datum/objective/O in objectives)
- if(O.check_completion() == CULT_NARSIE_KILLED)
- return CULT_NARSIE_KILLED
- else if(!O.check_completion())
- return CULT_LOSS
- return CULT_VICTORY
-
-/datum/team/cult/roundend_report()
- var/list/parts = list()
- var/victory = check_cult_victory()
-
- if(victory == CULT_NARSIE_KILLED) // Epic failure, you summoned your god and then someone killed it.
- parts += "Nar'sie has been killed! The cult will haunt the universe no longer!"
- else if(victory)
- parts += "The cult has succeeded! Nar'Sie has snuffed out another torch in the void!"
- else
- parts += "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!"
-
- if(objectives.len)
- parts += "The cultists' objectives were:"
- var/count = 1
- for(var/datum/objective/objective in objectives)
- if(objective.check_completion())
- parts += "Objective #[count]: [objective.explanation_text] Success!"
- else
- parts += "Objective #[count]: [objective.explanation_text] Fail."
- count++
-
- if(members.len)
- parts += "The cultists were:"
- parts += printplayerlist(members)
-
- return "
[parts.Join(" ")]
"
-
-/datum/team/cult/is_gamemode_hero()
- return SSticker.mode.name == "cult"
diff --git a/code/modules/antagonists/cult/cult_comms.dm b/code/modules/antagonists/cult/cult_comms.dm
deleted file mode 100644
index 0c070e8e423f..000000000000
--- a/code/modules/antagonists/cult/cult_comms.dm
+++ /dev/null
@@ -1,461 +0,0 @@
-// Contains cult communion, guide, and cult master abilities
-
-/datum/action/innate/cult
- icon_icon = 'icons/mob/actions/actions_cult.dmi'
- background_icon_state = "bg_demon"
- buttontooltipstyle = "cult"
- check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS
-
-/datum/action/innate/cult/IsAvailable()
- if(!iscultist(owner))
- return FALSE
- return ..()
-
-/datum/action/innate/cult/comm
- name = "Communion"
- desc = "Whispered words that all cultists can hear. Warning:Nearby non-cultists can still hear you."
- button_icon_state = "cult_comms"
-
-/datum/action/innate/cult/comm/Activate()
- var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")
- if(!input || !IsAvailable())
- return
- if(CHAT_FILTER_CHECK(input))
- to_chat(usr, "You cannot send a message that contains a word prohibited in IC chat!")
- return
- cultist_commune(usr, input)
-
-/datum/action/innate/cult/comm/proc/cultist_commune(mob/living/user, message)
- var/my_message
- if(!message)
- return
- user.whisper("O bidai nabora se[pick("'","`")]sma!", language = /datum/language/common)
- user.whisper(html_decode(message))
- var/title = "Acolyte"
- var/span = "cult italic"
- if(user.mind && user.mind.has_antag_datum(/datum/antagonist/cult/master))
- span = "cultlarge"
- title = "Master"
- else if(!ishuman(user))
- title = "Construct"
- my_message = "[title] [findtextEx(user.name, user.real_name) ? user.name : "[user.real_name] (as [user.name])"]: [message]"
- for(var/i in GLOB.player_list)
- var/mob/M = i
- if(iscultist(M))
- to_chat(M, my_message)
- else if(M in GLOB.dead_mob_list)
- var/link = FOLLOW_LINK(M, user)
- to_chat(M, "[link] [my_message]")
-
- user.log_talk(message, LOG_SAY, tag="cult")
-
-/datum/action/innate/cult/comm/spirit
- name = "Spiritual Communion"
- desc = "Conveys a message from the spirit realm that all cultists can hear."
-
-/datum/action/innate/cult/comm/spirit/IsAvailable()
- if(iscultist(owner.mind.current))
- return TRUE
-
-/datum/action/innate/cult/comm/spirit/cultist_commune(mob/living/user, message)
- var/my_message
- if(!message)
- return
- my_message = "The [user.name]: [message]"
- for(var/i in GLOB.player_list)
- var/mob/M = i
- if(iscultist(M))
- to_chat(M, my_message)
- else if(M in GLOB.dead_mob_list)
- var/link = FOLLOW_LINK(M, user)
- to_chat(M, "[link] [my_message]")
-
-/datum/action/innate/cult/mastervote
- name = "Assert Leadership"
- button_icon_state = "cultvote"
-
-/datum/action/innate/cult/mastervote/IsAvailable()
- var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- if(!C || C.cult_team.cult_vote_called || !ishuman(owner))
- return FALSE
- return ..()
-
-/datum/action/innate/cult/mastervote/Activate()
- var/choice = alert(owner, "The mantle of leadership is heavy. Success in this role requires an expert level of communication and experience. Are you sure?",, "Yes", "No")
- if(choice == "Yes" && IsAvailable())
- var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- pollCultists(owner,C.cult_team)
-
-/proc/pollCultists(mob/living/Nominee,datum/team/cult/team) //Cult Master Poll
- if(world.time < CULT_POLL_WAIT)
- to_chat(Nominee, "It would be premature to select a leader while everyone is still settling in, try again in [DisplayTimeText(CULT_POLL_WAIT-world.time)].")
- return
- team.cult_vote_called = TRUE //somebody's trying to be a master, make sure we don't let anyone else try
- for(var/datum/mind/B in team.members)
- if(B.current)
- B.current.update_action_buttons_icon()
- if(!B.current.incapacitated())
- SEND_SOUND(B.current, 'sound/hallucinations/im_here1.ogg')
- to_chat(B.current, "Acolyte [Nominee] has asserted that [Nominee.p_theyre()] worthy of leading the cult. A vote will be called shortly.")
- sleep(100)
- var/list/asked_cultists = list()
- for(var/datum/mind/B in team.members)
- if(B.current && B.current != Nominee && !B.current.incapacitated())
- SEND_SOUND(B.current, 'sound/magic/exit_blood.ogg')
- asked_cultists += B.current
- var/list/yes_voters = pollCandidates("[Nominee] seeks to lead your cult, do you support [Nominee.p_them()]?", poll_time = 300, group = asked_cultists)
- if(QDELETED(Nominee) || Nominee.incapacitated())
- team.cult_vote_called = FALSE
- for(var/datum/mind/B in team.members)
- if(B.current)
- B.current.update_action_buttons_icon()
- if(!B.current.incapacitated())
- to_chat(B.current,"[Nominee] has died in the process of attempting to win the cult's support!")
- return FALSE
- if(!Nominee.mind)
- team.cult_vote_called = FALSE
- for(var/datum/mind/B in team.members)
- if(B.current)
- B.current.update_action_buttons_icon()
- if(!B.current.incapacitated())
- to_chat(B.current,"[Nominee] has gone catatonic in the process of attempting to win the cult's support!")
- return FALSE
- if(LAZYLEN(yes_voters) <= LAZYLEN(asked_cultists) * 0.5)
- team.cult_vote_called = FALSE
- for(var/datum/mind/B in team.members)
- if(B.current)
- B.current.update_action_buttons_icon()
- if(!B.current.incapacitated())
- to_chat(B.current, "[Nominee] could not win the cult's support and shall continue to serve as an acolyte.")
- return FALSE
- team.cult_master = Nominee
- SSticker.mode.remove_cultist(Nominee.mind, TRUE)
- Nominee.mind.add_antag_datum(/datum/antagonist/cult/master)
- for(var/datum/mind/B in team.members)
- if(B.current)
- for(var/datum/action/innate/cult/mastervote/vote in B.current.actions)
- vote.Remove(B.current)
- if(!B.current.incapacitated())
- to_chat(B.current,"[Nominee] has won the cult's support and is now their master. Follow [Nominee.p_their()] orders to the best of your ability!")
- return TRUE
-
-/datum/action/innate/cult/master/IsAvailable()
- if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master) || GLOB.cult_narsie)
- return 0
- return ..()
-
-/datum/action/innate/cult/master/finalreck
- name = "Final Reckoning"
- desc = "A single-use spell that brings the entire cult to the master's location."
- button_icon_state = "sintouch"
-
-/datum/action/innate/cult/master/finalreck/Activate()
- var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- if(!antag)
- return
- for(var/i in 1 to 4)
- chant(i)
- var/list/destinations = list()
- for(var/turf/T in orange(1, owner))
- if(!T.is_blocked_turf(TRUE))
- destinations += T
- if(!LAZYLEN(destinations))
- to_chat(owner, "You need more space to summon your cult!")
- return
- if(do_after(owner, 30, target = owner))
- for(var/datum/mind/B in antag.cult_team.members)
- if(B.current && B.current.stat != DEAD)
- var/turf/mobloc = get_turf(B.current)
- switch(i)
- if(1)
- new /obj/effect/temp_visual/cult/sparks(mobloc, B.current.dir)
- playsound(mobloc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- if(2)
- new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, B.current.dir)
- playsound(mobloc, "sparks", 75, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- if(3)
- new /obj/effect/temp_visual/dir_setting/cult/phase(mobloc, B.current.dir)
- playsound(mobloc, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- if(4)
- playsound(mobloc, 'sound/magic/exit_blood.ogg', 100, TRUE)
- if(B.current != owner)
- var/turf/final = pick(destinations)
- if(istype(B.current.loc, /obj/item/soulstone))
- var/obj/item/soulstone/S = B.current.loc
- S.release_shades(owner)
- B.current.setDir(SOUTH)
- new /obj/effect/temp_visual/cult/blood(final)
- addtimer(CALLBACK(B.current, TYPE_PROC_REF(/mob, reckon), final), 10)
- else
- return
- antag.cult_team.reckoning_complete = TRUE
- Remove(owner)
-
-/mob/proc/reckon(turf/final)
- new /obj/effect/temp_visual/cult/blood/out(get_turf(src))
- forceMove(final)
-
-/datum/action/innate/cult/master/finalreck/proc/chant(chant_number)
- switch(chant_number)
- if(1)
- owner.say("C'arta forbici!", language = /datum/language/common, forced = "cult invocation")
- if(2)
- owner.say("Pleggh e'ntrath!", language = /datum/language/common, forced = "cult invocation")
- playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 50, TRUE)
- if(3)
- owner.say("Barhah hra zar'garis!", language = /datum/language/common, forced = "cult invocation")
- playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 75, TRUE)
- if(4)
- owner.say("N'ath reth sh'yro eth d'rekkathnor!!!", language = /datum/language/common, forced = "cult invocation")
- playsound(get_turf(owner),'sound/magic/clockwork/narsie_attack.ogg', 100, TRUE)
-
-/datum/action/innate/cult/master/cultmark
- name = "Mark Target"
- desc = "Marks a target for the cult."
- button_icon_state = "cult_mark"
- var/obj/effect/proc_holder/cultmark/CM
- var/cooldown = 0
- var/base_cooldown = 1200
-
-/datum/action/innate/cult/master/cultmark/New(Target)
- CM = new()
- CM.attached_action = src
- ..()
-
-/datum/action/innate/cult/master/cultmark/IsAvailable()
- if(cooldown > world.time)
- if(!CM.active)
- to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can mark another target!")
- return FALSE
- return ..()
-
-/datum/action/innate/cult/master/cultmark/Destroy()
- QDEL_NULL(CM)
- return ..()
-
-/datum/action/innate/cult/master/cultmark/Activate()
- CM.toggle(owner) //the important bit
- return TRUE
-
-/obj/effect/proc_holder/cultmark
- active = FALSE
- ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi'
- var/datum/action/innate/cult/master/cultmark/attached_action
-
-/obj/effect/proc_holder/cultmark/Destroy()
- attached_action = null
- return ..()
-
-/obj/effect/proc_holder/cultmark/proc/toggle(mob/user)
- if(active)
- remove_ranged_ability("You cease the marking ritual.")
- else
- add_ranged_ability(user, "You prepare to mark a target for your cult...")
-
-/obj/effect/proc_holder/cultmark/InterceptClickOn(mob/living/caller, params, atom/target)
- if(..())
- return
- if(ranged_ability_user.incapacitated())
- remove_ranged_ability()
- return
- var/turf/T = get_turf(ranged_ability_user)
- if(!isturf(T))
- return FALSE
-
- var/datum/antagonist/cult/C = caller.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
-
- if(target in view(7, get_turf(ranged_ability_user)))
- if(C.cult_team.blood_target)
- to_chat(ranged_ability_user, "The cult has already designated a target!")
- return FALSE
- C.cult_team.blood_target = target
- var/area/A = get_area(target)
- attached_action.cooldown = world.time + attached_action.base_cooldown
- addtimer(CALLBACK(attached_action.owner, TYPE_PROC_REF(/mob, update_action_buttons_icon)), attached_action.base_cooldown)
- C.cult_team.blood_target_image = image('icons/effects/mouse_pointers/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER)
- C.cult_team.blood_target_image.appearance_flags = RESET_COLOR
- C.cult_team.blood_target_image.pixel_x = -target.pixel_x
- C.cult_team.blood_target_image.pixel_y = -target.pixel_y
- for(var/datum/mind/B in SSticker.mode.cult)
- if(B.current && B.current.stat != DEAD && B.current.client)
- to_chat(B.current, "[ranged_ability_user] has marked [C.cult_team.blood_target] in the [A.name] as the cult's top priority, get there immediately!")
- SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75))
- B.current.client.images += C.cult_team.blood_target_image
- attached_action.owner.update_action_buttons_icon()
- remove_ranged_ability("The marking rite is complete! It will last for 90 seconds.")
- C.cult_team.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(reset_blood_target),C.cult_team), 900, TIMER_STOPPABLE)
- return TRUE
- return FALSE
-
-/proc/reset_blood_target(datum/team/cult/team)
- for(var/datum/mind/B in team.members)
- if(B.current && B.current.stat != DEAD && B.current.client)
- if(team.blood_target)
- to_chat(B.current,"The blood mark has expired!")
- B.current.client.images -= team.blood_target_image
- QDEL_NULL(team.blood_target_image)
- team.blood_target = null
-
-
-/datum/action/innate/cult/master/cultmark/ghost
- name = "Mark a Blood Target for the Cult"
- desc = "Marks a target for the entire cult to track."
-
-/datum/action/innate/cult/master/cultmark/ghost/IsAvailable()
- if(istype(owner, /mob/dead/observer) && iscultist(owner.mind.current))
- return TRUE
- else
- qdel(src)
-
-/datum/action/innate/cult/ghostmark //Ghost version
- name = "Blood Mark your Target"
- desc = "Marks whatever you are orbitting - for the entire cult to track."
- button_icon_state = "cult_mark"
- var/tracking = FALSE
- var/cooldown = 0
- var/base_cooldown = 600
-
-/datum/action/innate/cult/ghostmark/IsAvailable()
- if(istype(owner, /mob/dead/observer) && iscultist(owner.mind.current))
- return TRUE
- else
- qdel(src)
-
-/datum/action/innate/cult/ghostmark/proc/reset_button()
- if(owner)
- name = "Blood Mark your Target"
- desc = "Marks whatever you are orbitting - for the entire cult to track."
- button_icon_state = "cult_mark"
- owner.update_action_buttons_icon()
- SEND_SOUND(owner, 'sound/magic/enter_blood.ogg')
- to_chat(owner,"Your previous mark is gone - you are now ready to create a new blood mark.")
-
-/datum/action/innate/cult/ghostmark/Activate()
- var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- if(C.cult_team.blood_target)
- if(cooldown>world.time)
- reset_blood_target(C.cult_team)
- to_chat(owner, "You have cleared the cult's blood target!")
- deltimer(C.cult_team.blood_target_reset_timer)
- return
- else
- to_chat(owner, "The cult has already designated a target!")
- return
- if(cooldown>world.time)
- to_chat(owner, "You aren't ready to place another blood mark yet!")
- return
- target = owner.orbiting?.parent || get_turf(owner)
- if(!target)
- return
- C.cult_team.blood_target = target
- var/area/A = get_area(target)
- cooldown = world.time + base_cooldown
- addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob, update_action_buttons_icon)), base_cooldown)
- C.cult_team.blood_target_image = image('icons/effects/mouse_pointers/cult_target.dmi', target, "glow", ABOVE_MOB_LAYER)
- C.cult_team.blood_target_image.appearance_flags = RESET_COLOR
- C.cult_team.blood_target_image.pixel_x = -target.pixel_x
- C.cult_team.blood_target_image.pixel_y = -target.pixel_y
- SEND_SOUND(owner, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75))
- owner.client.images += C.cult_team.blood_target_image
- for(var/datum/mind/B in SSticker.mode.cult)
- if(B.current && B.current.stat != DEAD && B.current.client)
- to_chat(B.current, "[owner] has marked [C.cult_team.blood_target] in the [A.name] as the cult's top priority, get there immediately!")
- SEND_SOUND(B.current, sound(pick('sound/hallucinations/over_here2.ogg','sound/hallucinations/over_here3.ogg'),0,1,75))
- B.current.client.images += C.cult_team.blood_target_image
- to_chat(owner,"You have marked the [target] for the cult! It will last for [DisplayTimeText(base_cooldown)].")
- name = "Clear the Blood Mark"
- desc = "Remove the Blood Mark you previously set."
- button_icon_state = "emp"
- owner.update_action_buttons_icon()
- C.cult_team.blood_target_reset_timer = addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(reset_blood_target),C.cult_team), base_cooldown, TIMER_STOPPABLE)
- addtimer(CALLBACK(src, PROC_REF(reset_button)), base_cooldown)
-
-
-//////// ELDRITCH PULSE /////////
-
-
-
-/datum/action/innate/cult/master/pulse
- name = "Eldritch Pulse"
- desc = "Seize upon a fellow cultist or cult structure and teleport it to a nearby location."
- icon_icon = 'icons/mob/actions/actions_spells.dmi'
- button_icon_state = "arcane_barrage"
- var/obj/effect/proc_holder/pulse/PM
- var/cooldown = 0
- var/base_cooldown = 150
- var/throwing = FALSE
- var/mob/living/throwee
-
-/datum/action/innate/cult/master/pulse/New()
- PM = new()
- PM.attached_action = src
- ..()
-
-/datum/action/innate/cult/master/pulse/IsAvailable()
- if(!owner.mind || !owner.mind.has_antag_datum(/datum/antagonist/cult/master))
- return FALSE
- if(cooldown > world.time)
- if(!PM.active)
- to_chat(owner, "You need to wait [DisplayTimeText(cooldown - world.time)] before you can pulse again!")
- return FALSE
- return ..()
-
-/datum/action/innate/cult/master/pulse/Destroy()
- PM.attached_action = null //What the fuck is even going on here.
- QDEL_NULL(PM)
- return ..()
-
-
-/datum/action/innate/cult/master/pulse/Activate()
- PM.toggle(owner) //the important bit
- return TRUE
-
-/obj/effect/proc_holder/pulse
- active = FALSE
- ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi'
- var/datum/action/innate/cult/master/pulse/attached_action
-
-/obj/effect/proc_holder/pulse/Destroy()
- attached_action = null
- return ..()
-
-
-/obj/effect/proc_holder/pulse/proc/toggle(mob/user)
- if(active)
- remove_ranged_ability("You cease your preparations...")
- attached_action.throwing = FALSE
- else
- add_ranged_ability(user, "You prepare to tear through the fabric of reality...")
-
-/obj/effect/proc_holder/pulse/InterceptClickOn(mob/living/caller, params, atom/target)
- if(..())
- return
- if(ranged_ability_user.incapacitated())
- remove_ranged_ability()
- return
- var/turf/T = get_turf(ranged_ability_user)
- if(!isturf(T))
- return FALSE
- if(target in view(7, get_turf(ranged_ability_user)))
- if((!(iscultist(target) || istype(target, /obj/structure/destructible/cult)) || target == caller) && !(attached_action.throwing))
- return
- if(!attached_action.throwing)
- attached_action.throwing = TRUE
- attached_action.throwee = target
- SEND_SOUND(ranged_ability_user, sound('sound/weapons/thudswoosh.ogg'))
- to_chat(ranged_ability_user,"You reach through the veil with your mind's eye and seize [target]!")
- return
- else
- new /obj/effect/temp_visual/cult/sparks(get_turf(attached_action.throwee), ranged_ability_user.dir)
- var/distance = get_dist(attached_action.throwee, target)
- if(distance >= 16)
- return
- playsound(target,'sound/magic/exit_blood.ogg')
- attached_action.throwee.Beam(target,icon_state="sendbeam",time=4)
- attached_action.throwee.forceMove(get_turf(target))
- new /obj/effect/temp_visual/cult/sparks(get_turf(target), ranged_ability_user.dir)
- attached_action.throwing = FALSE
- attached_action.cooldown = world.time + attached_action.base_cooldown
- remove_ranged_ability("A pulse of blood magic surges through you as you shift [attached_action.throwee] through time and space.")
- caller.update_action_buttons_icon()
- addtimer(CALLBACK(caller, TYPE_PROC_REF(/mob, update_action_buttons_icon)), attached_action.base_cooldown)
diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm
deleted file mode 100644
index d13e3885a0df..000000000000
--- a/code/modules/antagonists/cult/cult_items.dm
+++ /dev/null
@@ -1,545 +0,0 @@
-/obj/item/tome
- name = "arcane tome"
- desc = "An old, dusty tome with frayed edges and a sinister-looking cover."
- icon_state ="tome"
- throw_speed = 2
- throw_range = 5
- w_class = WEIGHT_CLASS_SMALL
-
-/datum/action/innate/dash/cult
- name = "Rend the Veil"
- desc = "Use the sword to shear open the flimsy fabric of this reality and teleport to your target."
- icon_icon = 'icons/mob/actions/actions_cult.dmi'
- button_icon_state = "phaseshift"
- dash_sound = 'sound/magic/enter_blood.ogg'
- recharge_sound = 'sound/magic/exit_blood.ogg'
- beam_effect = "sendbeam"
- phasein = /obj/effect/temp_visual/dir_setting/cult/phase
- phaseout = /obj/effect/temp_visual/dir_setting/cult/phase/out
-
-/datum/action/innate/dash/cult/IsAvailable()
- if(iscultist(owner) && current_charges)
- return TRUE
- else
- return FALSE
-
-/obj/item/restraints/legcuffs/bola/cult
- name = "\improper Nar'Sien bola"
- desc = "A strong bola, bound with dark magic that allows it to pass harmlessly through Nar'Sien cultists. Throw it to trip and slow your victim."
- icon_state = "bola_cult"
- item_state = "bola_cult"
- breakouttime = 60
- knockdown = 30
-
-/obj/item/restraints/legcuffs/bola/cult/attack_hand(mob/living/user)
- . = ..()
- if(!iscultist(user))
- to_chat(user, "The bola seems to take on a life of its own!")
- ensnare(user)
-
-/obj/item/restraints/legcuffs/bola/cult/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- if(iscultist(hit_atom))
- return
- . = ..()
-
-
-/obj/item/clothing/head/hooded/cult_hoodie
- name = "ancient cultist hood"
- icon_state = "culthood"
- desc = "A torn, dust-caked hood. Strange letters line the inside."
- flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS
- flags_cover = HEADCOVERSEYES
- armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 40, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
- cold_protection = HEAD
- min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT
- heat_protection = HEAD
- max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
-
-/obj/item/clothing/suit/hooded/cultrobes
- name = "ancient cultist robes"
- desc = "A ragged, dusty set of robes. Strange letters line the inside."
- icon_state = "cultrobes"
- item_state = "cultrobes"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/tome, /obj/item/tank)
- armor = list("melee" = 40, "bullet" = 30, "laser" = 40,"energy" = 40, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
- flags_inv = HIDEJUMPSUIT
- cold_protection = CHEST|GROIN|LEGS|ARMS
- min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
- heat_protection = CHEST|GROIN|LEGS|ARMS
- max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
- hoodtype = /obj/item/clothing/head/hooded/cult_hoodie
-
-
-/obj/item/clothing/head/hooded/cult_hoodie/alt
- name = "cultist hood"
- desc = "An armored hood worn by the followers of Nar'Sie."
- icon_state = "cult_hoodalt"
- item_state = "cult_hoodalt"
-
-/obj/item/clothing/suit/hooded/cultrobes/alt
- name = "cultist robes"
- desc = "An armored set of robes worn by the followers of Nar'Sie."
- icon_state = "cultrobesalt"
- item_state = "cultrobesalt"
- hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/alt
-
-/obj/item/clothing/suit/hooded/cultrobes/alt/ghost
- item_flags = DROPDEL
-
-/obj/item/clothing/suit/hooded/cultrobes/alt/ghost/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
-
-
-/obj/item/clothing/head/magus
- name = "magus helm"
- icon_state = "magus"
- item_state = "magus"
- desc = "A helm worn by the followers of Nar'Sie."
- flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES
- armor = list("melee" = 50, "bullet" = 30, "laser" = 50,"energy" = 50, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
-
-/obj/item/clothing/suit/magusred
- name = "magus robes"
- desc = "A set of armored robes worn by the followers of Nar'Sie."
- icon_state = "magusred"
- item_state = "magusred"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/tome)
- armor = list("melee" = 50, "bullet" = 30, "laser" = 50,"energy" = 50, "bomb" = 25, "bio" = 10, "rad" = 0, "fire" = 10, "acid" = 10)
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
-/obj/item/clothing/head/helmet/space/hardsuit/cult
- name = "\improper Nar'Sien hardened helmet"
- desc = "A heavily-armored helmet worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
- icon_state = "cult_helmet"
- item_state = "cult_helmet"
- armor = list("melee" = 70, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75)
- light_system = NO_LIGHT_SUPPORT
- light_range = 0
- actions_types = list()
-
-/obj/item/clothing/suit/space/hardsuit/cult
- name = "\improper Nar'Sien hardened armor"
- icon_state = "cult_armor"
- item_state = "cult_armor"
- desc = "A heavily-armored exosuit worn by warriors of the Nar'Sien cult. It can withstand hard vacuum."
- w_class = WEIGHT_CLASS_BULKY
- allowed = list(/obj/item/tome, /obj/item/tank/internals/)
- armor = list("melee" = 70, "bullet" = 50, "laser" = 30,"energy" = 40, "bomb" = 30, "bio" = 30, "rad" = 30, "fire" = 40, "acid" = 75)
- helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cult
-
-/obj/item/sharpener/cult
- name = "eldritch whetstone"
- desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
- icon_state = "cult_sharpener"
- used = 0
- increment = 5
- max = 40
- prefix = "darkened"
-
-/obj/item/sharpener/cult/update_icon_state()
- icon_state = "cult_sharpener[used ? "_used" : ""]"
- return ..()
-
-/obj/item/clothing/suit/hooded/cultrobes/cult_shield
- name = "empowered cultist armor"
- desc = "Empowered armor which creates a powerful shield around the user."
- icon_state = "cult_armor"
- item_state = "cult_armor"
- w_class = WEIGHT_CLASS_BULKY
- armor = list("melee" = 50, "bullet" = 40, "laser" = 50,"energy" = 50, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 60)
- var/current_charges = 3
- hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/cult_shield
-
-/obj/item/clothing/head/hooded/cult_hoodie/cult_shield
- name = "empowered cultist helmet"
- desc = "Empowered helmet which creates a powerful shield around the user."
- icon_state = "cult_hoodalt"
- armor = list("melee" = 50, "bullet" = 40, "laser" = 50,"energy" = 50, "bomb" = 50, "bio" = 30, "rad" = 30, "fire" = 50, "acid" = 60)
-
-/obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot)
- ..()
- if(!iscultist(user))
- to_chat(user, "\"I wouldn't advise that.\"")
- to_chat(user, "An overwhelming sense of nausea overpowers you!")
- user.dropItemToGround(src, TRUE)
- user.Dizzy(30)
- user.Paralyze(100)
-
-/obj/item/clothing/suit/hooded/cultrobes/cult_shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(current_charges)
- owner.visible_message("\The [attack_text] is deflected in a burst of blood-red sparks!")
- current_charges--
- new /obj/effect/temp_visual/cult/sparks(get_turf(owner))
- if(!current_charges)
- owner.visible_message("The runed shield around [owner] suddenly disappears!")
- owner.update_inv_wear_suit()
- return 1
- return 0
-
-/obj/item/clothing/suit/hooded/cultrobes/cult_shield/worn_overlays(isinhands)
- . = ..()
- if(!isinhands && current_charges)
- . += mutable_appearance('icons/effects/cult_effects.dmi', "shield-cult", MOB_LAYER + 0.01)
-
-/obj/item/clothing/suit/hooded/cultrobes/berserker
- name = "flagellant's robes"
- desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of increased damage."
- allowed = list(/obj/item/tome)
- armor = list("melee" = -45, "bullet" = -45, "laser" = -45,"energy" = -55, "bomb" = -45, "bio" = -45, "rad" = -45, "fire" = 0, "acid" = 0)
- slowdown = -0.6
- hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/berserkerhood
-
-/obj/item/clothing/head/hooded/cult_hoodie/berserkerhood
- name = "flagellant's hood"
- desc = "Blood-soaked hood infused with dark magic."
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
-
-/obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot)
- ..()
- if(!iscultist(user))
- to_chat(user, "\"I wouldn't advise that.\"")
- to_chat(user, "An overwhelming sense of nausea overpowers you!")
- user.dropItemToGround(src, TRUE)
- user.Dizzy(30)
- user.Paralyze(100)
-
-/obj/item/clothing/glasses/hud/health/night/cultblind
- desc = "may Nar'Sie guide you through the darkness and shield you from the light."
- name = "zealot's blindfold"
- icon_state = "blindfold"
- item_state = "blindfold"
- flash_protect = FLASH_PROTECTION_FLASH
-
-/obj/item/clothing/glasses/hud/health/night/cultblind/equipped(mob/living/user, slot)
- ..()
- if(prob(30))
- to_chat(user, "\"You want to be blind, do you?\"")
- user.dropItemToGround(src, TRUE)
- user.Dizzy(30)
- user.Paralyze(100)
- user.blind_eyes(30)
- else
- return
-
-/obj/item/reagent_containers/glass/beaker/unholywater
- name = "flask of unholy water"
- desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown."
- icon = 'icons/obj/drinks/drinks.dmi'
- icon_state = "holyflask"
- color = "#333333"
- list_reagents = list(/datum/reagent/fuel/unholywater = 50)
- can_have_cap = FALSE
- cap_icon_state = null
- cap_on = FALSE
-
-/obj/item/cult_shift
- name = "veil shifter"
- desc = "This relic instantly teleports you, and anything you're pulling, forward by a moderate distance."
- icon = 'icons/obj/cult.dmi'
- icon_state ="shifter"
- var/uses = 4
-
-/obj/item/cult_shift/examine(mob/user)
- . = ..()
- if(uses)
- . += "It has [uses] use\s remaining."
- else
- . += "It seems drained."
-
-/obj/item/cult_shift/proc/handle_teleport_grab(turf/T, mob/user)
- var/mob/living/carbon/C = user
- if(C.pulling)
- var/atom/movable/pulled = C.pulling
- do_teleport(pulled, T, channel = TELEPORT_CHANNEL_CULT)
- . = pulled
-
-/obj/item/cult_shift/attack_self(mob/user)
- if(!uses || !iscarbon(user))
- to_chat(user, "\The [src] is dull and unmoving in your hands.")
- return
-
- var/mob/living/carbon/C = user
- var/turf/mobloc = get_turf(C)
- var/turf/destination = get_teleport_loc(mobloc,C,9,1,3,1,0,1)
-
- if(destination)
- uses--
- if(uses <= 0)
- icon_state ="shifter_drained"
- playsound(mobloc, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- new /obj/effect/temp_visual/dir_setting/cult/phase/out(mobloc, C.dir)
-
- var/atom/movable/pulled = handle_teleport_grab(destination, C)
- if(do_teleport(C, destination, channel = TELEPORT_CHANNEL_CULT))
- if(pulled)
- C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
- new /obj/effect/temp_visual/dir_setting/cult/phase(destination, C.dir)
- playsound(destination, 'sound/effects/phasein.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
- playsound(destination, "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE)
-
- else
- to_chat(C, "The veil cannot be torn here!")
-
-/obj/item/flashlight/flare/culttorch
- name = "void torch"
- desc = "Used by veteran cultists to instantly transport items to their needful brethren."
- w_class = WEIGHT_CLASS_SMALL
- light_range = 1
- icon_state = "torch"
- item_state = "torch"
- color = "#ff0000"
- on_damage = 15
- slot_flags = null
- on = TRUE
- var/charges = 5
-
-/obj/item/flashlight/flare/culttorch/afterattack(atom/movable/A, mob/user, proximity)
- if(!proximity)
- return
- if(!iscultist(user))
- to_chat(user, "That doesn't seem to do anything useful.")
- return
-
- if(istype(A, /obj/item))
-
- var/list/cultists = list()
- for(var/datum/mind/M in SSticker.mode.cult)
- if(M.current && M.current.stat != DEAD)
- cultists |= M.current
- var/mob/living/cultist_to_receive = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in (cultists - user)
- if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
- return
- if(!cultist_to_receive)
- to_chat(user, "You require a destination!")
- log_game("Void torch failed - no target")
- return
- if(cultist_to_receive.stat == DEAD)
- to_chat(user, "[cultist_to_receive] has died!")
- log_game("Void torch failed - target died")
- return
- if(!iscultist(cultist_to_receive))
- to_chat(user, "[cultist_to_receive] is not a follower of the Geometer!")
- log_game("Void torch failed - target was deconverted")
- return
- if(A in user.GetAllContents())
- to_chat(user, "[A] must be on a surface in order to teleport it!")
- return
- to_chat(user, "You ignite [A] with \the [src], turning it to ash, but through the torch's flames you see that [A] has reached [cultist_to_receive]!")
- cultist_to_receive.put_in_hands(A)
- charges--
- to_chat(user, "\The [src] now has [charges] charge\s.")
- if(charges == 0)
- qdel(src)
-
- else
- ..()
- to_chat(user, "\The [src] can only transport items!")
-
-/obj/item/blood_beam
- name = "\improper magical aura"
- desc = "Sinister looking aura that distorts the flow of reality around it."
- lefthand_file = 'icons/mob/inhands/misc/touchspell_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/touchspell_righthand.dmi'
- icon_state = "disintegrate"
- item_state = "disintegrate"
- item_flags = ABSTRACT | DROPDEL
- w_class = WEIGHT_CLASS_HUGE
- throwforce = 0
- throw_range = 0
- throw_speed = 0
- var/charging = FALSE
- var/firing = FALSE
- var/angle
-
-/obj/item/blood_beam/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
-
-
-/obj/item/blood_beam/afterattack(atom/A, mob/living/user, flag, params)
- . = ..()
- if(firing || charging)
- return
- var/C = user.client
- if(ishuman(user) && C)
- angle = mouse_angle_from_client(C)
- else
- qdel(src)
- return
- charging = TRUE
- INVOKE_ASYNC(src, PROC_REF(charge), user)
- if(do_after(user, 90, target = user))
- firing = TRUE
- INVOKE_ASYNC(src, PROC_REF(pewpew), user, params)
- var/obj/structure/emergency_shield/invoker/N = new(user.loc)
- if(do_after(user, 90, target = user))
- user.Paralyze(40)
- to_chat(user, "You have exhausted the power of this spell!")
- firing = FALSE
- if(N)
- qdel(N)
- qdel(src)
- charging = FALSE
-
-/obj/item/blood_beam/proc/charge(mob/user)
- var/obj/O
- playsound(src, 'sound/magic/lightning_chargeup.ogg', 100, TRUE)
- for(var/i in 1 to 12)
- if(!charging)
- break
- if(i > 1)
- sleep(15)
- if(i < 4)
- O = new /obj/effect/temp_visual/cult/rune_spawn/rune1/inner(user.loc, 30, "#ff0000")
- else
- O = new /obj/effect/temp_visual/cult/rune_spawn/rune5(user.loc, 30, "#ff0000")
- new /obj/effect/temp_visual/dir_setting/cult/phase/out(user.loc, user.dir)
- if(O)
- qdel(O)
-
-/obj/item/blood_beam/proc/pewpew(mob/user, params)
- var/turf/targets_from = get_turf(src)
- var/spread = 40
- var/second = FALSE
- var/set_angle = angle
- for(var/i in 1 to 12)
- if(second)
- set_angle = angle - spread
- spread -= 8
- else
- sleep(15)
- set_angle = angle + spread
- second = !second //Handles beam firing in pairs
- if(!firing)
- break
- playsound(src, 'sound/magic/exit_blood.ogg', 75, TRUE)
- new /obj/effect/temp_visual/dir_setting/cult/phase(user.loc, user.dir)
- var/turf/temp_target = get_turf_in_angle(set_angle, targets_from, 40)
- for(var/turf/T in getline(targets_from,temp_target))
- if (locate(/obj/effect/blessing, T))
- temp_target = T
- playsound(T, 'sound/machines/clockcult/ark_damage.ogg', 50, TRUE)
- new /obj/effect/temp_visual/at_shield(T, T)
- break
- T.narsie_act(TRUE, TRUE)
- for(var/mob/living/target in T.contents)
- if(iscultist(target))
- new /obj/effect/temp_visual/cult/sparks(T)
- if(ishuman(target))
- var/mob/living/carbon/human/H = target
- if(H.stat != DEAD)
- H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 7)
- if(isshade(target) || isconstruct(target))
- var/mob/living/simple_animal/M = target
- if(M.health+15 < M.maxHealth)
- M.adjustHealth(-15)
- else
- M.health = M.maxHealth
- else
- var/mob/living/L = target
- if(L.density)
- L.Paralyze(20)
- L.adjustBruteLoss(45)
- playsound(L, 'sound/hallucinations/wail.ogg', 50, TRUE)
- L.emote("scream")
- user.Beam(temp_target, icon_state="blood_beam", time = 7, beam_type = /obj/effect/ebeam/blood)
-
-
-/obj/effect/ebeam/blood
- name = "blood beam"
-
-/obj/item/shield/mirror
- name = "mirror shield"
- desc = "An infamous shield used by Nar'Sien sects to confuse and disorient their enemies. Its edges are weighted for use as a throwing weapon - capable of disabling multiple foes with preternatural accuracy."
- icon_state = "mirror_shield" // eshield1 for expanded
- lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi'
- force = 5
- throwforce = 15
- throw_speed = 1
- throw_range = 4
- w_class = WEIGHT_CLASS_BULKY
- attack_verb = list("bumped", "prodded")
- hitsound = 'sound/weapons/smash.ogg'
- var/illusions = 2
-
-/obj/item/shield/mirror/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
- if(iscultist(owner))
- if(istype(hitby, /obj/projectile))
- var/obj/projectile/P = hitby
- if(P.damage_type == BRUTE || P.damage_type == BURN)
- if(P.damage >= 30)
- var/turf/T = get_turf(owner)
- T.visible_message("The sheer force from [P] shatters the mirror shield!")
- new /obj/effect/temp_visual/cult/sparks(T)
- playsound(T, 'sound/effects/glassbr3.ogg', 100)
- owner.Paralyze(25)
- qdel(src)
- return FALSE
- if(P.reflectable & REFLECT_NORMAL)
- return FALSE //To avoid reflection chance double-dipping with block chance
- . = ..()
- if(.)
- playsound(src, 'sound/weapons/parry.ogg', 100, TRUE)
- if(illusions > 0)
- illusions--
- addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/shield/mirror, readd)), 450)
- if(prob(60))
- var/mob/living/simple_animal/hostile/illusion/M = new(owner.loc)
- M.faction = list("cult")
- M.Copy_Parent(owner, 70, 10, 5)
- M.move_to_delay = owner.cached_multiplicative_slowdown
- else
- var/mob/living/simple_animal/hostile/illusion/escape/E = new(owner.loc)
- E.Copy_Parent(owner, 70, 10)
- E.GiveTarget(owner)
- E.Goto(owner, owner.cached_multiplicative_slowdown, E.minimum_distance)
- return TRUE
- else
- if(prob(50))
- var/mob/living/simple_animal/hostile/illusion/H = new(owner.loc)
- H.Copy_Parent(owner, 100, 20, 5)
- H.faction = list("cult")
- H.GiveTarget(owner)
- H.move_to_delay = owner.cached_multiplicative_slowdown
- to_chat(owner, "[src] betrays you!")
- return FALSE
-
-/obj/item/shield/mirror/proc/readd()
- illusions++
- if(illusions == initial(illusions) && isliving(loc))
- var/mob/living/holder = loc
- to_chat(holder, "The shield's illusions are back at full strength!")
-
-/obj/item/shield/mirror/IsReflect()
- if(prob(block_chance))
- return TRUE
- return FALSE
-
-/obj/item/shield/mirror/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
- var/turf/T = get_turf(hit_atom)
- var/datum/thrownthing/D = throwingdatum
- if(isliving(hit_atom))
- var/mob/living/L = hit_atom
- if(iscultist(L))
- playsound(src, 'sound/weapons/throwtap.ogg', 50)
- if(L.put_in_active_hand(src))
- L.visible_message("[L] catches [src] out of the air!")
- else
- L.visible_message("[src] bounces off of [L], as if repelled by an unseen force!")
- else if(!..())
- if(!L.anti_magic_check())
- L.Paralyze(30)
- if(D?.thrower)
- for(var/mob/living/Next in orange(2, T))
- if(!Next.density || iscultist(Next))
- continue
- throw_at(Next, 3, 1, D.thrower)
- return
- throw_at(D.thrower, 7, 1, null)
- else
- ..()
diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm
deleted file mode 100644
index 27ba86d24bfa..000000000000
--- a/code/modules/antagonists/cult/cult_structures.dm
+++ /dev/null
@@ -1,288 +0,0 @@
-/obj/structure/destructible/cult
- density = TRUE
- anchored = TRUE
- icon = 'icons/obj/cult.dmi'
- light_power = 2
- var/cooldowntime = 0
- break_sound = 'sound/hallucinations/veryfar_noise.ogg'
- debris = list(/obj/item/stack/sheet/mineral/hidden/hellstone = 1)
-
-/obj/structure/destructible/cult/proc/conceal() //for spells that hide cult presence
- density = FALSE
- visible_message("[src] fades away.")
- invisibility = INVISIBILITY_OBSERVER
- alpha = 100 //To help ghosts distinguish hidden runes
- light_range = 0
- light_power = 0
- update_light()
- STOP_PROCESSING(SSfastprocess, src)
-
-/obj/structure/destructible/cult/proc/reveal() //for spells that reveal cult presence
- density = initial(density)
- invisibility = 0
- visible_message("[src] suddenly appears!")
- alpha = initial(alpha)
- light_range = initial(light_range)
- light_power = initial(light_power)
- update_light()
- START_PROCESSING(SSfastprocess, src)
-
-
-/obj/structure/destructible/cult/examine(mob/user)
- . = ..()
- . += "\The [src] is [anchored ? "":"not "]secured to the floor."
- if((iscultist(user) || isobserver(user)) && cooldowntime > world.time)
- . += "The magic in [src] is too weak, [p_they()] will be ready to use again in [DisplayTimeText(cooldowntime - world.time)]."
-
-/obj/structure/destructible/cult/examine_status(mob/user)
- if(iscultist(user) || isobserver(user))
- var/t_It = p_they(TRUE)
- var/t_is = p_are()
- return "[t_It] [t_is] at [round(obj_integrity * 100 / max_integrity)]% stability."
- return ..()
-
-/obj/structure/destructible/cult/attack_animal(mob/living/simple_animal/M)
- if(istype(M, /mob/living/simple_animal/hostile/construct/artificer))
- if(obj_integrity < max_integrity)
- M.changeNext_move(CLICK_CD_MELEE)
- obj_integrity = min(max_integrity, obj_integrity + 5)
- Beam(M, icon_state="sendbeam", time=4)
- M.visible_message("[M] repairs \the [src].", \
- "You repair [src], leaving [p_they()] at [round(obj_integrity * 100 / max_integrity)]% stability.")
- else
- to_chat(M, "You cannot repair [src], as [p_theyre()] undamaged!")
- else
- ..()
-
-/obj/structure/destructible/cult/set_anchored(anchorvalue)
- . = ..()
- if(isnull(.))
- return
- update_appearance()
-
-/obj/structure/destructible/cult/update_icon_state()
- icon_state = "[initial(icon_state)][anchored ? null : "_off"]"
- return ..()
-
-/obj/structure/destructible/cult/proc/check_menu(mob/user)
- if(!istype(user))
- return FALSE
- if(user.incapacitated() || !user.Adjacent(src))
- return FALSE
- return TRUE
-
-/obj/structure/destructible/cult/talisman
- name = "altar"
- desc = "A bloodstained altar dedicated to Nar'Sie."
- icon_state = "talismanaltar"
- break_message = "The altar shatters, leaving only the wailing of the damned!"
-
-/obj/structure/destructible/cult/talisman/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- if(!iscultist(user))
- to_chat(user, "You're pretty sure you know exactly what this is used for and you can't seem to touch it.")
- return
- if(!anchored)
- to_chat(user, "You need to anchor [src] to the floor with your dagger first.")
- return
- if(cooldowntime > world.time)
- to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
- return
- var/list/items = list(
- "Eldritch Whetstone" = image(icon = 'icons/obj/kitchen.dmi', icon_state = "cult_sharpener"),
- "Construct Shell" = image(icon = 'icons/obj/wizard.dmi', icon_state = "construct_cult"),
- "Flask of Unholy Water" = image(icon = 'icons/obj/drinks/drinks.dmi', icon_state = "holyflask")
- )
- var/choice = show_radial_menu(user, src, items, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
- var/list/pickedtype = list()
- switch(choice)
- if("Eldritch Whetstone")
- pickedtype += /obj/item/sharpener/cult
- if("Construct Shell")
- pickedtype += /obj/structure/constructshell
- if("Flask of Unholy Water")
- pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
- else
- return
- if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
- cooldowntime = world.time + 2400
- for(var/N in pickedtype)
- new N(get_turf(src))
- to_chat(user, "You kneel before the altar and your faith is rewarded with the [choice]!")
-
-/obj/structure/destructible/cult/forge
- name = "daemon forge"
- desc = "A forge used in crafting the unholy weapons used by the armies of Nar'Sie."
- icon_state = "forge"
- light_range = 2
- light_color = LIGHT_COLOR_LAVA
- break_message = "The force breaks apart into shards with a howling scream!"
-
-/obj/structure/destructible/cult/forge/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- if(!iscultist(user))
- to_chat(user, "The heat radiating from [src] pushes you back.")
- return
- if(!anchored)
- to_chat(user, "You need to anchor [src] to the floor with your dagger first.")
- return
- if(cooldowntime > world.time)
- to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
- return
- var/list/items = list(
- "Shielded Robe" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cult_armor"),
- "Flagellant's Robe" = image(icon = 'icons/obj/clothing/suits.dmi', icon_state = "cultrobes"),
- "Mirror Shield" = image(icon = 'icons/obj/shields.dmi', icon_state = "mirror_shield")
- )
- var/choice = show_radial_menu(user, src, items, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
- var/list/pickedtype = list()
- switch(choice)
- if("Shielded Robe")
- pickedtype += /obj/item/clothing/suit/hooded/cultrobes/cult_shield
- if("Flagellant's Robe")
- pickedtype += /obj/item/clothing/suit/hooded/cultrobes/berserker
- if("Mirror Shield")
- pickedtype += /obj/item/shield/mirror
- else
- return
- if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
- cooldowntime = world.time + 2400
- for(var/N in pickedtype)
- new N(get_turf(src))
- to_chat(user, "You work the forge as dark knowledge guides your hands, creating the [choice]!")
-
-
-
-/obj/structure/destructible/cult/pylon
- name = "pylon"
- desc = "A floating crystal that slowly heals those faithful to Nar'Sie."
- icon_state = "pylon"
- light_range = 1.5
- light_color = COLOR_SOFT_RED
- break_sound = 'sound/effects/glassbr2.ogg'
- break_message = "The blood-red crystal falls to the floor and shatters!"
- var/heal_delay = 25
- var/last_heal = 0
- var/corrupt_delay = 50
- var/last_corrupt = 0
-
-/obj/structure/destructible/cult/pylon/New()
- START_PROCESSING(SSfastprocess, src)
- ..()
-
-/obj/structure/destructible/cult/pylon/Destroy()
- STOP_PROCESSING(SSfastprocess, src)
- return ..()
-
-/obj/structure/destructible/cult/pylon/process()
- if(!anchored)
- return
- if(last_heal <= world.time)
- last_heal = world.time + heal_delay
- for(var/mob/living/L in range(5, src))
- if(iscultist(L) || isshade(L) || isconstruct(L))
- if(L.health != L.maxHealth)
- new /obj/effect/temp_visual/heal(get_turf(src), "#960000")
- if(ishuman(L))
- L.adjustBruteLoss(-1, 0)
- L.adjustFireLoss(-1, 0)
- L.updatehealth()
- if(isshade(L) || isconstruct(L))
- var/mob/living/simple_animal/M = L
- if(M.health < M.maxHealth)
- M.adjustHealth(-3)
- if(ishuman(L) && L.blood_volume < BLOOD_VOLUME_NORMAL)
- L.blood_volume += 1.0
- CHECK_TICK
- if(last_corrupt <= world.time)
- var/list/validturfs = list()
- var/list/cultturfs = list()
- for(var/T in circleviewturfs(src, 5))
- if(istype(T, /turf/open/floor/engine/cult))
- cultturfs |= T
- continue
- var/static/list/blacklisted_pylon_turfs = typecacheof(list(
- /turf/closed,
- /turf/open/floor/engine/cult,
- /turf/open/space,
- /turf/open/lava,
- /turf/open/chasm))
- if(is_type_in_typecache(T, blacklisted_pylon_turfs))
- continue
- else
- validturfs |= T
-
- last_corrupt = world.time + corrupt_delay
-
- if(length(validturfs))
- var/turf/T = pick(validturfs)
- if(istype(T, /turf/open/floor/plating))
- T.PlaceOnTop(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR)
- else
- T.ChangeTurf(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR)
- else if (length(cultturfs))
- var/turf/open/floor/engine/cult/F = pick(cultturfs)
- new /obj/effect/temp_visual/cult/turf/floor(F)
- else
- // Are we in space or something? No cult turfs or
- // convertable turfs?
- last_corrupt = world.time + corrupt_delay*2
-
-/obj/structure/destructible/cult/tome
- name = "archives"
- desc = "A desk covered in arcane manuscripts and tomes in unknown languages. Looking at the text makes your skin crawl."
- icon_state = "tomealtar"
- light_range = 1.5
- light_color = LIGHT_COLOR_FIRE
- break_message = "The books and tomes of the archives burn into ash as the desk shatters!"
-
-/obj/structure/destructible/cult/tome/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- if(!iscultist(user))
- to_chat(user, "These books won't open and it hurts to even try and read the covers.")
- return
- if(!anchored)
- to_chat(user, "You need to anchor [src] to the floor with your dagger first.")
- return
- if(cooldowntime > world.time)
- to_chat(user, "The magic in [src] is weak, it will be ready to use again in [DisplayTimeText(cooldowntime - world.time)].")
- return
- var/list/items = list(
- "Zealot's Blindfold" = image(icon = 'icons/obj/clothing/glasses.dmi', icon_state = "blindfold"),
- "Veil Walker Set" = image(icon = 'icons/obj/cult.dmi', icon_state = "shifter")
- )
- var/choice = show_radial_menu(user, src, items, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
- var/list/pickedtype = list()
- switch(choice)
- if("Zealot's Blindfold")
- pickedtype += /obj/item/clothing/glasses/hud/health/night/cultblind
- if("Veil Walker Set")
- pickedtype += /obj/item/cult_shift
- pickedtype += /obj/item/flashlight/flare/culttorch
- else
- return
- if(src && !QDELETED(src) && anchored && pickedtype.len && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
- cooldowntime = world.time + 2400
- for(var/N in pickedtype)
- new N(get_turf(src))
- to_chat(user, "You summon the [choice] from the archives!")
-
-/obj/effect/gateway
- name = "gateway"
- desc = "You're pretty sure that abyss is staring back."
- icon = 'icons/obj/cult.dmi'
- icon_state = "hole"
- density = TRUE
- anchored = TRUE
-
-/obj/effect/gateway/singularity_act()
- return
-
-/obj/effect/gateway/singularity_pull()
- return
diff --git a/code/modules/antagonists/cult/cult_turf_overlay.dm b/code/modules/antagonists/cult/cult_turf_overlay.dm
deleted file mode 100644
index 2e950326bf8a..000000000000
--- a/code/modules/antagonists/cult/cult_turf_overlay.dm
+++ /dev/null
@@ -1,32 +0,0 @@
-//an "overlay" used by clockwork walls and floors to appear normal to mesons.
-/obj/effect/cult_turf/overlay
- mouse_opacity = MOUSE_OPACITY_TRANSPARENT
- var/atom/linked
-
-/obj/effect/cult_turf/overlay/examine(mob/user)
- if(linked)
- linked.examine(user)
-
-/obj/effect/cult_turf/overlay/ex_act()
- return FALSE
-
-/obj/effect/cult_turf/overlay/singularity_act()
- return
-/obj/effect/cult_turf/overlay/singularity_pull()
- return
-
-/obj/effect/cult_turf/overlay/singularity_pull(S, current_size)
- return
-
-/obj/effect/cult_turf/overlay/Destroy()
- if(linked)
- linked = null
- . = ..()
-
-/obj/effect/cult_turf/overlay/floor
- icon = 'icons/turf/floors.dmi'
- icon_state = "clockwork_floor"
- layer = TURF_LAYER
-
-/obj/effect/cult_turf/overlay/floor/bloodcult
- icon_state = "cult"
diff --git a/code/modules/antagonists/cult/rune_spawn_action.dm b/code/modules/antagonists/cult/rune_spawn_action.dm
deleted file mode 100644
index 2829141405dd..000000000000
--- a/code/modules/antagonists/cult/rune_spawn_action.dm
+++ /dev/null
@@ -1,115 +0,0 @@
-//after a delay, creates a rune below you. for constructs creating runes.
-/datum/action/innate/cult/create_rune
- name = "Summon Rune"
- desc = "Summons a rune"
- background_icon_state = "bg_demon"
- var/obj/effect/rune/rune_type
- var/cooldown = 0
- var/base_cooldown = 1800
- var/scribe_time = 60
- var/damage_interrupt = TRUE
- var/action_interrupt = TRUE
- var/obj/effect/temp_visual/cult/rune_spawn/rune_word_type
- var/obj/effect/temp_visual/cult/rune_spawn/rune_innerring_type
- var/obj/effect/temp_visual/cult/rune_spawn/rune_center_type
- var/rune_color
-
-/datum/action/innate/cult/create_rune/IsAvailable()
- if(!rune_type || cooldown > world.time)
- return FALSE
- return ..()
-
-/datum/action/innate/cult/create_rune/proc/turf_check(turf/T)
- if(!T)
- return FALSE
- if(isspaceturf(T))
- to_chat(owner, "You cannot scribe runes in space!")
- return FALSE
- if(locate(/obj/effect/rune) in T)
- to_chat(owner, "There is already a rune here.")
- return FALSE
- return TRUE
-
-
-/datum/action/innate/cult/create_rune/Activate()
- var/turf/T = get_turf(owner)
- if(turf_check(T))
- var/chosen_keyword
- if(initial(rune_type.req_keyword))
- chosen_keyword = stripped_input(owner, "Enter a keyword for the new rune.", "Words of Power")
- if(!chosen_keyword)
- return
- //the outer ring is always the same across all runes
- var/obj/effect/temp_visual/cult/rune_spawn/R1 = new(T, scribe_time, rune_color)
- //the rest are not always the same, so we need types for em
- var/obj/effect/temp_visual/cult/rune_spawn/R2
- if(rune_word_type)
- R2 = new rune_word_type(T, scribe_time, rune_color)
- var/obj/effect/temp_visual/cult/rune_spawn/R3
- if(rune_innerring_type)
- R3 = new rune_innerring_type(T, scribe_time, rune_color)
- var/obj/effect/temp_visual/cult/rune_spawn/R4
- if(rune_center_type)
- R4 = new rune_center_type(T, scribe_time, rune_color)
-
- cooldown = base_cooldown + world.time
- owner.update_action_buttons_icon()
- addtimer(CALLBACK(owner, TYPE_PROC_REF(/mob, update_action_buttons_icon)), base_cooldown)
- var/list/health
- if(damage_interrupt && isliving(owner))
- var/mob/living/L = owner
- health = list("health" = L.health)
- var/scribe_mod = scribe_time
- if(istype(T, /turf/open/floor/engine/cult))
- scribe_mod *= 0.5
- playsound(T, 'sound/magic/enter_blood.ogg', 100, FALSE)
- if(do_after(owner, scribe_mod, target = owner, extra_checks = CALLBACK(owner, TYPE_PROC_REF(/mob, break_do_after_checks), health, action_interrupt)))
- var/obj/effect/rune/new_rune = new rune_type(owner.loc)
- new_rune.keyword = chosen_keyword
- else
- qdel(R1)
- if(R2)
- qdel(R2)
- if(R3)
- qdel(R3)
- if(R4)
- qdel(R4)
- cooldown = 0
- owner.update_action_buttons_icon()
-
-//teleport rune
-/datum/action/innate/cult/create_rune/tele
- name = "Summon Teleport Rune"
- desc = "Summons a teleport rune to your location, as though it has been there all along..."
- button_icon_state = "telerune"
- rune_type = /obj/effect/rune/teleport
- rune_word_type = /obj/effect/temp_visual/cult/rune_spawn/rune2
- rune_innerring_type = /obj/effect/temp_visual/cult/rune_spawn/rune2/inner
- rune_center_type = /obj/effect/temp_visual/cult/rune_spawn/rune2/center
- rune_color = RUNE_COLOR_TELEPORT
-
-/datum/action/innate/cult/create_rune/wall
- name = "Summon Barrier Rune"
- desc = "Summons an active barrier rune to your location, as though it has been there all along..."
- button_icon_state = "barrier"
- rune_type = /obj/effect/rune/wall
- rune_word_type = /obj/effect/temp_visual/cult/rune_spawn/rune4
- rune_innerring_type = /obj/effect/temp_visual/cult/rune_spawn/rune4/inner
- rune_center_type = /obj/effect/temp_visual/cult/rune_spawn/rune4/center
- rune_color = RUNE_COLOR_DARKRED
-
-/datum/action/innate/cult/create_rune/wall/Activate()
- . = ..()
- var/obj/effect/rune/wall/W = locate(/obj/effect/rune/wall) in owner.loc
- if(W)
- W.spread_density()
-
-/datum/action/innate/cult/create_rune/revive
- name = "Summon Revive Rune"
- desc = "Summons a revive rune to your location, as though it has been there all along..."
- button_icon_state = "revive"
- rune_type = /obj/effect/rune/raise_dead
- rune_word_type = /obj/effect/temp_visual/cult/rune_spawn/rune1
- rune_innerring_type = /obj/effect/temp_visual/cult/rune_spawn/rune1/inner
- rune_center_type = /obj/effect/temp_visual/cult/rune_spawn/rune1/center
- rune_color = RUNE_COLOR_MEDIUMRED
diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm
deleted file mode 100644
index 3382672071cc..000000000000
--- a/code/modules/antagonists/cult/runes.dm
+++ /dev/null
@@ -1,1029 +0,0 @@
-GLOBAL_LIST_EMPTY(sacrificed) //a mixed list of minds and mobs
-GLOBAL_LIST(rune_types) //Every rune that can be drawn by ritual daggers
-GLOBAL_LIST_EMPTY(teleport_runes)
-GLOBAL_LIST_EMPTY(wall_runes)
-/*
-
-This file contains runes.
-Runes are used by the cult to cause many different effects and are paramount to their success.
-They are drawn with a ritual dagger in blood, and are distinguishable to cultists and normal crew by examining.
-Fake runes can be drawn in crayon to fool people.
-Runes can either be invoked by one's self or with many different cultists. Each rune has a specific incantation that the cultists will say when invoking it.
-
-
-*/
-
-/obj/effect/rune
- name = "rune"
- var/cultist_name = "basic rune"
- desc = "An odd collection of symbols drawn in what seems to be blood."
- var/cultist_desc = "a basic rune with no function." //This is shown to cultists who examine the rune in order to determine its true purpose.
- anchored = TRUE
- icon = 'icons/obj/rune.dmi'
- icon_state = "1"
- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
- layer = SIGIL_LAYER
- color = RUNE_COLOR_RED
-
- var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked.
- var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it.
- var/req_cultists_text //if we have a description override for required cultists to invoke
- var/rune_in_use = FALSE // Used for some runes, this is for when you want a rune to not be usable when in use.
-
- var/scribe_delay = 40 //how long the rune takes to create
- var/scribe_damage = 0.1 //how much damage you take doing it
- var/invoke_damage = 0 //how much damage invokers take when invoking it
- var/construct_invoke = TRUE //if constructs can invoke it
-
- var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
- var/keyword //The actual keyword for the rune
-
-/obj/effect/rune/Initialize(mapload, set_keyword)
- . = ..()
- if(set_keyword)
- keyword = set_keyword
- var/image/I = image(icon = 'icons/effects/blood.dmi', icon_state = null, loc = src)
- I.override = TRUE
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "cult_runes", I)
-
-/obj/effect/rune/examine(mob/user)
- . = ..()
- if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
- . += "Name: [cultist_name]\n"+\
- "Effects: [capitalize(cultist_desc)]\n"+\
- "Required Acolytes: [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]"
- if(req_keyword && keyword)
- . += "Keyword: [keyword]"
-
-/obj/effect/rune/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- if(!iscultist(user))
- to_chat(user, "You aren't able to understand the words of [src].")
- return
- var/list/invokers = can_invoke(user)
- if(invokers.len >= req_cultists)
- invoke(invokers)
- else
- to_chat(user, "You need [req_cultists - invokers.len] more adjacent cultists to use this rune in such a manner.")
- fail_invoke()
-
-/obj/effect/rune/attack_animal(mob/living/simple_animal/M)
- if(istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct))
- if(istype(M, /mob/living/simple_animal/hostile/construct/wraith/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/juggernaut/angelic) || istype(M, /mob/living/simple_animal/hostile/construct/artificer/angelic))
- to_chat(M, "You purge the rune!")
- qdel(src)
- else if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message
- attack_hand(M)
- else
- to_chat(M, "You are unable to invoke the rune!")
-
-/obj/effect/rune/proc/conceal() //for talisman of revealing/hiding
- visible_message("[src] fades away.")
- invisibility = INVISIBILITY_OBSERVER
- alpha = 100 //To help ghosts distinguish hidden runes
-
-/obj/effect/rune/proc/reveal() //for talisman of revealing/hiding
- invisibility = 0
- visible_message("[src] suddenly appears!")
- alpha = initial(alpha)
-
-/*
-
-There are a few different procs each rune runs through when a cultist activates it.
-can_invoke() is called when a cultist activates the rune with an empty hand. If there are multiple cultists, this rune determines if the required amount is nearby.
-invoke() is the rune's actual effects.
-fail_invoke() is called when the rune fails, via not enough people around or otherwise. Typically this just has a generic 'fizzle' effect.
-structure_check() searches for nearby cultist structures required for the invocation. Proper structures are pylons, forges, archives, and altars.
-
-*/
-
-/obj/effect/rune/proc/can_invoke(mob/living/user=null)
- //This proc determines if the rune can be invoked at the time. If there are multiple required cultists, it will find all nearby cultists.
- var/list/invokers = list() //people eligible to invoke the rune
- if(user)
- invokers += user
- if(req_cultists > 1 || istype(src, /obj/effect/rune/convert))
- var/list/things_in_range = range(1, src)
- for(var/mob/living/L in things_in_range)
- if(iscultist(L))
- if(L == user)
- continue
- if(ishuman(L))
- var/mob/living/carbon/human/H = L
- if((HAS_TRAIT(H, TRAIT_MUTE)) || H.silent)
- continue
- if(L.stat)
- continue
- invokers += L
- return invokers
-
-/obj/effect/rune/proc/invoke(list/invokers)
- //This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here.
- for(var/M in invokers)
- if(isliving(M))
- var/mob/living/L = M
- if(invocation)
- L.say(invocation, language = /datum/language/common, ignore_spam = TRUE, forced = "cult invocation")
- if(invoke_damage)
- L.apply_damage(invoke_damage, BRUTE)
- to_chat(L, "[src] saps your strength!")
- else if(istype(M, /obj/item/toy/plush/narplush))
- var/obj/item/toy/plush/narplush/P = M
- P.visible_message("[P] squeaks loudly!")
- do_invoke_glow()
-
-/obj/effect/rune/proc/do_invoke_glow()
- set waitfor = FALSE
- animate(src, transform = matrix()*2, alpha = 0, time = 5, flags = ANIMATION_END_NOW) //fade out
- sleep(5)
- animate(src, transform = matrix(), alpha = 255, time = 0, flags = ANIMATION_END_NOW)
-
-/obj/effect/rune/proc/fail_invoke()
- //This proc contains the effects of a rune if it is not invoked correctly, through either invalid wording or not enough cultists. By default, it's just a basic fizzle.
- visible_message("The markings pulse with a small flash of red light, then fall dark.")
- var/oldcolor = color
- color = rgb(255, 0, 0)
- animate(src, color = oldcolor, time = 5)
- addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 5)
-
-//Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user.
-/obj/effect/rune/malformed
- cultist_name = "malformed rune"
- cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this."
- invocation = "Ra'sha yoka!"
- invoke_damage = 30
-
-/obj/effect/rune/malformed/Initialize(mapload, set_keyword)
- . = ..()
- icon_state = "[rand(1,7)]"
- color = rgb(rand(0,255), rand(0,255), rand(0,255))
-
-/obj/effect/rune/malformed/invoke(list/invokers)
- ..()
- qdel(src)
-
-//Rite of Offering: Converts or sacrifices a target.
-/obj/effect/rune/convert
- cultist_name = "Offer"
- cultist_desc = "offers a noncultist above it to Nar'Sie, either converting them or sacrificing them."
- req_cultists_text = "2 for conversion, 3 for living sacrifices and sacrifice targets."
- invocation = "Mah'weyh pleggh at e'ntrath!"
- icon_state = "3"
- color = RUNE_COLOR_OFFER
- req_cultists = 1
- rune_in_use = FALSE
-
-/obj/effect/rune/convert/do_invoke_glow()
- return
-
-/obj/effect/rune/convert/invoke(list/invokers)
- if(rune_in_use)
- return
- var/list/myriad_targets = list()
- var/turf/T = get_turf(src)
- for(var/mob/living/M in T)
- if(!iscultist(M))
- myriad_targets |= M
- if(!myriad_targets.len)
- fail_invoke()
- log_game("Offer rune failed - no eligible targets")
- return
- rune_in_use = TRUE
- visible_message("[src] pulses blood red!")
- var/oldcolor = color
- color = RUNE_COLOR_DARKRED
- var/mob/living/L = pick(myriad_targets)
-
- var/mob/living/F = invokers[1]
- var/datum/antagonist/cult/C = F.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- var/datum/team/cult/Cult_team = C.cult_team
- var/is_convertable = is_convertable_to_cult(L,C.cult_team)
- if(L.stat != DEAD && is_convertable)
- invocation = "Mah'weyh pleggh at e'ntrath!"
- ..()
- if(is_convertable)
- do_convert(L, invokers)
- else
- invocation = "Barhah hra zar'garis!"
- ..()
- do_sacrifice(L, invokers)
- animate(src, color = oldcolor, time = 5)
- addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_atom_colour)), 5)
- Cult_team.check_size() // Triggers the eye glow or aura effects if the cult has grown large enough relative to the crew
- rune_in_use = FALSE
-
-/obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
- if(invokers.len < 2)
- for(var/M in invokers)
- to_chat(M, "You need at least two invokers to convert [convertee]!")
- log_game("Offer rune failed - tried conversion with one invoker")
- return 0
- if(convertee.anti_magic_check(TRUE, TRUE, FALSE, 0)) //Not chargecost because it can be spammed
- for(var/M in invokers)
- to_chat(M, "Something is shielding [convertee]'s mind!")
- log_game("Offer rune failed - convertee had anti-magic")
- return 0
- var/brutedamage = convertee.getBruteLoss()
- var/burndamage = convertee.getFireLoss()
- if(brutedamage || burndamage)
- convertee.adjustBruteLoss(-(brutedamage * 0.75))
- convertee.adjustFireLoss(-(burndamage * 0.75))
- convertee.visible_message(
- "[convertee] writhes in pain [brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!", // Hello there buddy! Come here often? I hope you were wondering wtf this string was
- "AAAAAAAAAAAAAA-")
- SSticker.mode.add_cultist(convertee.mind, 1)
- convertee.mind.special_role = ROLE_CULTIST
- to_chat(convertee, "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
- and something evil takes root.")
- to_chat(convertee, "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
- ")
- if(ishuman(convertee))
- var/mob/living/carbon/human/H = convertee
- H.uncuff()
- H.stuttering = 0
- H.cultslurring = 0
- if(prob(1) || SSevents.holidays && SSevents.holidays[APRIL_FOOLS])
- H.say("You son of a bitch! I'm in.", forced = "That son of a bitch! They're in.")
- return 1
-
-/obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
- var/mob/living/first_invoker = invokers[1]
- if(!first_invoker)
- return FALSE
- var/datum/antagonist/cult/C = first_invoker.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- if(!C)
- return
-
-
- var/big_sac = FALSE
- if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || C.cult_team.is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
- for(var/M in invokers)
- to_chat(M, "[sacrificial] is too greatly linked to the world! You need three acolytes!")
- log_game("Offer rune failed - not enough acolytes and target is living or sac target")
- return FALSE
- if(sacrificial.mind)
- GLOB.sacrificed += sacrificial.mind
- for(var/datum/objective/sacrifice/sac_objective in C.cult_team.objectives)
- if(sac_objective.target == sacrificial.mind)
- sac_objective.sacced = TRUE
- sac_objective.update_explanation_text()
- big_sac = TRUE
- else
- GLOB.sacrificed += sacrificial
-
- new /obj/effect/temp_visual/cult/sac(get_turf(src))
- for(var/M in invokers)
- if(big_sac)
- to_chat(M, "\"Yes! This is the one I desire! You have done well.\"")
- else
- if(ishuman(sacrificial) || iscyborg(sacrificial))
- to_chat(M, "\"I accept this sacrifice.\"")
- else
- to_chat(M, "\"I accept this meager sacrifice.\"")
-
- var/obj/item/soulstone/stone = new /obj/item/soulstone(get_turf(src))
- if(sacrificial.mind)
- stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
- stone.transfer_soul("FORCE", sacrificial, usr)
- stone.invisibility = 0
-
- if(sacrificial)
- if(iscyborg(sacrificial))
- playsound(sacrificial, 'sound/magic/disable_tech.ogg', 100, TRUE)
- sacrificial.dust() //To prevent the MMI from remaining
- else
- playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, TRUE)
- sacrificial.gib()
- return TRUE
-
-
-
-/obj/effect/rune/empower
- cultist_name = "Empower"
- cultist_desc = "allows cultists to prepare greater amounts of blood magic at far less of a cost."
- invocation = "H'drak v'loso, mir'kanas verbot!"
- icon_state = "3"
- color = RUNE_COLOR_TALISMAN
- construct_invoke = FALSE
-
-/obj/effect/rune/empower/invoke(list/invokers)
- . = ..()
- var/mob/living/user = invokers[1] //the first invoker is always the user
- for(var/datum/action/innate/cult/blood_magic/BM in user.actions)
- BM.Activate()
-
-/obj/effect/rune/teleport
- cultist_name = "Teleport"
- cultist_desc = "warps everything above it to another chosen teleport rune."
- invocation = "Sas'so c'arta forbici!"
- icon_state = "2"
- color = RUNE_COLOR_TELEPORT
- req_keyword = TRUE
- light_power = 4
- var/obj/effect/temp_visual/cult/portal/inner_portal //The portal "hint" for off-station teleportations
- var/obj/effect/temp_visual/cult/rune_spawn/rune2/outer_portal
- var/listkey
-
-
-/obj/effect/rune/teleport/Initialize(mapload, set_keyword)
- . = ..()
- var/area/A = get_area(src)
- var/locname = initial(A.name)
- listkey = set_keyword ? "[set_keyword] [locname]":"[locname]"
- GLOB.teleport_runes += src
-
-/obj/effect/rune/teleport/Destroy()
- GLOB.teleport_runes -= src
- return ..()
-
-/obj/effect/rune/teleport/invoke(list/invokers)
- var/mob/living/user = invokers[1] //the first invoker is always the user
- var/list/potential_runes = list()
- var/list/teleportnames = list()
- for(var/R in GLOB.teleport_runes)
- var/obj/effect/rune/teleport/T = R
- if(T != src && !is_away_level(T))
- potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
-
- if(!potential_runes.len)
- to_chat(user, "There are no valid runes to teleport to!")
- log_game("Teleport rune failed - no other teleport runes")
- fail_invoke()
- return
-
- var/turf/T = get_turf(src)
- if(is_away_level(T))
- to_chat(user, "You are not in the right dimension!")
- log_game("Teleport rune failed - user in away mission")
- fail_invoke()
- return
-
- var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
- var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
- if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated() || !actual_selected_rune)
- fail_invoke()
- return
-
- var/turf/target = get_turf(actual_selected_rune)
- if(target.is_blocked_turf(TRUE))
- to_chat(user, "The target rune is blocked. Attempting to teleport to it would be massively unwise.")
- fail_invoke()
- return
- var/movedsomething = FALSE
- var/moveuserlater = FALSE
- var/movesuccess = FALSE
- for(var/atom/movable/A in T)
- if(istype(A, /obj/effect/dummy/phased_mob))
- continue
- if(ismob(A))
- if(!isliving(A)) //Let's not teleport ghosts and AI eyes.
- continue
- if(ishuman(A))
- new /obj/effect/temp_visual/dir_setting/cult/phase/out(T, A.dir)
- new /obj/effect/temp_visual/dir_setting/cult/phase(target, A.dir)
- if(A == user)
- moveuserlater = TRUE
- movedsomething = TRUE
- continue
- if(!A.anchored)
- movedsomething = TRUE
- if(do_teleport(A, target, channel = TELEPORT_CHANNEL_CULT))
- movesuccess = TRUE
- if(movedsomething)
- ..()
- if(moveuserlater)
- if(do_teleport(user, target, channel = TELEPORT_CHANNEL_CULT))
- movesuccess = TRUE
- if(movesuccess)
- visible_message("There is a sharp crack of inrushing air, and everything above the rune disappears!", null, "You hear a sharp crack.")
- to_chat(user, "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].")
- else
- to_chat(user, "You[moveuserlater ? "r vision blurs briefly, but nothing happens":" try send everything above the rune away, but the teleportation fails"].")
- var/area/A = get_area(T)
- if(initial(A.name) == "Space")
- actual_selected_rune.handle_portal("space", T)
- if(movesuccess)
- target.visible_message("There is a boom of outrushing air as something appears above the rune!", null, "You hear a boom.")
- else
- fail_invoke()
-
-/obj/effect/rune/teleport/proc/handle_portal(portal_type, turf/origin)
- var/turf/T = get_turf(src)
- close_portal() // To avoid stacking descriptions/animations
- playsound(T, pick('sound/effects/sparks1.ogg', 'sound/effects/sparks2.ogg', 'sound/effects/sparks3.ogg', 'sound/effects/sparks4.ogg'), 100, TRUE, 14)
- inner_portal = new /obj/effect/temp_visual/cult/portal(T)
- if(portal_type == "space")
- set_light_color(color)
- desc += " A tear in reality reveals a black void interspersed with dots of light... something recently teleported here from space. The void feels like it's trying to pull you to the [dir2text(get_dir(T, origin))]!"
- else
- inner_portal.icon_state = "lava"
- set_light_color(LIGHT_COLOR_FIRE)
- desc += " A tear in reality reveals a coursing river of lava... something recently teleported here from the Lavaland Mines!"
- outer_portal = new(T, 600, color)
- light_range = 4
- update_light()
- addtimer(CALLBACK(src, PROC_REF(close_portal)), 600, TIMER_UNIQUE)
-
-/obj/effect/rune/teleport/proc/close_portal()
- qdel(inner_portal)
- qdel(outer_portal)
- desc = initial(desc)
- light_range = 0
- update_light()
-
-//Ritual of Dimensional Rending: Calls forth the avatar of Nar'Sie upon the station.
-/obj/effect/rune/narsie
- cultist_name = "Nar'Sie"
- cultist_desc = "tears apart dimensional barriers, calling forth the Geometer. Requires 9 invokers."
- invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!"
- req_cultists = 9
- icon = 'icons/effects/96x96.dmi'
- color = RUNE_COLOR_DARKRED
- icon_state = "rune_large"
- pixel_x = -32 //So the big ol' 96x96 sprite shows up right
- pixel_y = -32
- scribe_delay = 500 //how long the rune takes to create
- scribe_damage = 40.1 //how much damage you take doing it
- var/used = FALSE
-
-/obj/effect/rune/narsie/Initialize(mapload, set_keyword)
- . = ..()
- SSpoints_of_interest.make_point_of_interest(src)
-
-/obj/effect/rune/narsie/Destroy()
- SSpoints_of_interest.remove_point_of_interest(src)
- . = ..()
-
-/obj/effect/rune/narsie/conceal() //can't hide this, and you wouldn't want to
- return
-
-/obj/effect/rune/narsie/invoke(list/invokers)
- if(used)
- return
- var/mob/living/user = invokers[1]
- var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives
- var/area/place = get_area(src)
- if(!(place in summon_objective.summon_spots))
- to_chat(user, "The Geometer can only be summoned where the veil is weak - in [english_list(summon_objective.summon_spots)]!")
- return
- if(locate(/obj/singularity/narsie) in SSpoints_of_interest.other_points_of_interest)
- for(var/M in invokers)
- to_chat(M, "Nar'Sie is already on this plane!")
- log_game("Nar'Sie rune failed - already summoned")
- return
- //BEGIN THE SUMMONING
- used = TRUE
- ..()
- sound_to_playing_players('sound/effects/dimensional_rend.ogg')
- var/turf/T = get_turf(src)
- sleep(40)
- if(src)
- color = RUNE_COLOR_RED
- new /obj/singularity/narsie/large/cult(T) //Causes Nar'Sie to spawn even if the rune has been removed
-
-//Rite of Resurrection: Requires a dead or inactive cultist. When reviving the dead, you can only perform one revival for every three sacrifices your cult has carried out.
-/obj/effect/rune/raise_dead
- cultist_name = "Revive"
- cultist_desc = "requires a dead, mindless, or inactive cultist placed upon the rune. For each three bodies sacrificed to the dark patron, one body will be mended and their mind awoken"
- invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below
- icon_state = "1"
- color = RUNE_COLOR_MEDIUMRED
- var/static/sacrifices_used = -SOULS_TO_REVIVE // Cultists get one "free" revive
-
-/obj/effect/rune/raise_dead/examine(mob/user)
- . = ..()
- if(iscultist(user) || user.stat == DEAD)
- . += "Sacrifices unrewarded: [LAZYLEN(GLOB.sacrificed) - sacrifices_used]"
-
-/obj/effect/rune/raise_dead/invoke(list/invokers)
- var/turf/T = get_turf(src)
- var/mob/living/mob_to_revive
- var/list/potential_revive_mobs = list()
- var/mob/living/user = invokers[1]
- if(rune_in_use)
- return
- rune_in_use = TRUE
- for(var/mob/living/M in T.contents)
- if(iscultist(M) && (M.stat == DEAD || !M.client || M.client.is_afk()))
- potential_revive_mobs |= M
- if(!potential_revive_mobs.len)
- to_chat(user, "There are no dead cultists on the rune!")
- log_game("Raise Dead rune failed - no cultists to revive")
- fail_invoke()
- return
- if(potential_revive_mobs.len > 1)
- mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
- else
- mob_to_revive = potential_revive_mobs[1]
- if(QDELETED(src) || !validness_checks(mob_to_revive, user))
- fail_invoke()
- return
- if(user.name == "Herbert West")
- invocation = "To life, to life, I bring them!"
- else
- invocation = initial(invocation)
- ..()
- if(mob_to_revive.stat == DEAD)
- var/diff = LAZYLEN(GLOB.sacrificed) - SOULS_TO_REVIVE - sacrifices_used
- if(diff < 0)
- to_chat(user, "Your cult must carry out [abs(diff)] more sacrifice\s before it can revive another cultist!")
- fail_invoke()
- return
- sacrifices_used += SOULS_TO_REVIVE
- mob_to_revive.revive(full_heal = TRUE, admin_revive = TRUE) //This does remove traits and such, but the rune might actually see some use because of it!
- mob_to_revive.grab_ghost()
- if(!mob_to_revive.client || mob_to_revive.client.is_afk())
- set waitfor = FALSE
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as a [mob_to_revive.name], an inactive blood cultist?", ROLE_CULTIST, null, ROLE_CULTIST, 50, mob_to_revive)
- if(LAZYLEN(candidates))
- var/mob/dead/observer/C = pick(candidates)
- to_chat(mob_to_revive.mind, "Your physical form has been taken over by another soul due to your inactivity! Ahelp if you wish to regain your form.")
- message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(mob_to_revive)]) to replace an AFK player.")
- mob_to_revive.ghostize(0)
- mob_to_revive.key = C.key
- else
- fail_invoke()
- return
- SEND_SOUND(mob_to_revive, 'sound/ambience/antag/bloodcult.ogg')
- to_chat(mob_to_revive, "\"PASNAR SAVRAE YAM'TOTH. Arise.\"")
- mob_to_revive.visible_message(
- "[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.", \
- "You awaken suddenly from the void. You're alive!")
- rune_in_use = FALSE
-
-/obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user)
- var/turf/T = get_turf(src)
- if(QDELETED(user))
- return FALSE
- if(!Adjacent(user) || user.incapacitated())
- return FALSE
- if(QDELETED(target_mob))
- return FALSE
- if(!(target_mob in T.contents))
- to_chat(user, "The cultist to revive has been moved!")
- log_game("Raise Dead rune failed - revival target moved")
- return FALSE
- return TRUE
-
-/obj/effect/rune/raise_dead/fail_invoke()
- ..()
- rune_in_use = FALSE
- for(var/mob/living/M in range(1,src))
- if(iscultist(M) && M.stat == DEAD)
- M.visible_message("[M] twitches.")
-
-//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
-/obj/effect/rune/wall
- cultist_name = "Barrier"
- cultist_desc = "when invoked, makes a temporary invisible wall to block passage. Can be invoked again to reverse this."
- invocation = "Khari'd! Eske'te tannin!"
- icon_state = "4"
- color = RUNE_COLOR_DARKRED
- CanAtmosPass = ATMOS_PASS_DENSITY
- var/datum/timedevent/density_timer
- var/recharging = FALSE
-
-/obj/effect/rune/wall/Initialize(mapload, set_keyword)
- . = ..()
- GLOB.wall_runes += src
-
-/obj/effect/rune/wall/examine(mob/user)
- . = ..()
- if(density && iscultist(user))
- if(density_timer)
- . += "The air above this rune has hardened into a barrier that will last [DisplayTimeText(density_timer.timeToRun - world.time)]."
-
-/obj/effect/rune/wall/Destroy()
- GLOB.wall_runes -= src
- return ..()
-
-/obj/effect/rune/wall/BlockThermalConductivity()
- return density
-
-/obj/effect/rune/wall/invoke(list/invokers)
- if(recharging)
- return
- var/mob/living/user = invokers[1]
- ..()
- density = !density
- update_state()
- if(density)
- spread_density()
- var/carbon_user = iscarbon(user)
- user.visible_message(
- "[user] [carbon_user ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].", \
- "You channel [carbon_user ? "your life ":""]energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.")
- if(carbon_user)
- var/mob/living/carbon/C = user
- C.apply_damage(2, BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
-
-/obj/effect/rune/wall/proc/spread_density()
- for(var/R in GLOB.wall_runes)
- var/obj/effect/rune/wall/W = R
- if(W.virtual_z() == virtual_z() && get_dist(src, W) <= 2 && !W.density && !W.recharging)
- W.density = TRUE
- W.update_state()
- W.spread_density()
- density_timer = addtimer(CALLBACK(src, PROC_REF(lose_density)), 3000, TIMER_STOPPABLE)
-
-/obj/effect/rune/wall/proc/lose_density()
- if(density)
- recharging = TRUE
- density = FALSE
- update_state()
- var/oldcolor = color
- add_atom_colour("#696969", FIXED_COLOUR_PRIORITY)
- animate(src, color = oldcolor, time = 50, easing = EASE_IN)
- addtimer(CALLBACK(src, PROC_REF(recharge)), 50)
-
-/obj/effect/rune/wall/proc/recharge()
- recharging = FALSE
- add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY)
-
-/obj/effect/rune/wall/proc/update_state()
- deltimer(density_timer)
- air_update_turf(TRUE)
- if(density)
- var/mutable_appearance/shimmer = mutable_appearance('icons/effects/effects.dmi', "barriershimmer", ABOVE_MOB_LAYER)
- shimmer.appearance_flags |= RESET_COLOR
- shimmer.alpha = 60
- shimmer.color = "#701414"
- add_overlay(shimmer)
- add_atom_colour(RUNE_COLOR_RED, FIXED_COLOUR_PRIORITY)
- else
- cut_overlays()
- add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY)
-
-//Rite of Joined Souls: Summons a single cultist.
-/obj/effect/rune/summon
- cultist_name = "Summon Cultist"
- cultist_desc = "summons a single cultist to the rune. Requires 2 invokers."
- invocation = "N'ath reth sh'yro eth d'rekkathnor!"
- req_cultists = 2
- invoke_damage = 10
- icon_state = "3"
- color = RUNE_COLOR_SUMMON
-
-/obj/effect/rune/summon/invoke(list/invokers)
- var/mob/living/user = invokers[1]
- var/list/cultists = list()
- for(var/datum/mind/M in SSticker.mode.cult)
- if(!(M.current in invokers) && M.current && M.current.stat != DEAD)
- cultists |= M.current
- var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists
- if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
- return
- if(!cultist_to_summon)
- to_chat(user, "You require a summoning target!")
- fail_invoke()
- log_game("Summon Cultist rune failed - no target")
- return
- if(cultist_to_summon.stat == DEAD)
- to_chat(user, "[cultist_to_summon] has died!")
- fail_invoke()
- log_game("Summon Cultist rune failed - target died")
- return
- if(cultist_to_summon.pulledby || cultist_to_summon.buckled)
- to_chat(user, "[cultist_to_summon] is being held in place!")
- fail_invoke()
- log_game("Summon Cultist rune failed - target restrained")
- return
- if(!iscultist(cultist_to_summon))
- to_chat(user, "[cultist_to_summon] is not a follower of the Geometer!")
- fail_invoke()
- log_game("Summon Cultist rune failed - target was deconverted")
- return
- if(is_away_level(cultist_to_summon))
- to_chat(user, "[cultist_to_summon] is not in our dimension!")
- fail_invoke()
- log_game("Summon Cultist rune failed - target in away mission")
- return
- cultist_to_summon.visible_message(
- "[cultist_to_summon] suddenly disappears in a flash of red light!", \
- "Overwhelming vertigo consumes you as you are hurled through the air!")
- ..()
- visible_message("A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!")
- cultist_to_summon.forceMove(get_turf(src))
- qdel(src)
-
-//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
-/obj/effect/rune/blood_boil
- cultist_name = "Boil Blood"
- cultist_desc = "boils the blood of non-believers who can see the rune, rapidly dealing extreme amounts of damage. Requires 3 invokers."
- invocation = "Dedo ol'btoh!"
- icon_state = "4"
- color = RUNE_COLOR_BURNTORANGE
- light_color = LIGHT_COLOR_LAVA
- req_cultists = 3
- invoke_damage = 10
- construct_invoke = FALSE
- var/tick_damage = 25
- rune_in_use = FALSE
-
-/obj/effect/rune/blood_boil/do_invoke_glow()
- return
-
-/obj/effect/rune/blood_boil/invoke(list/invokers)
- if(rune_in_use)
- return
- ..()
- rune_in_use = TRUE
- var/turf/T = get_turf(src)
- visible_message("[src] turns a bright, glowing orange!")
- color = "#FC9B54"
- set_light(6, 1, color)
- for(var/mob/living/L in viewers(T))
- if(!iscultist(L) && L.blood_volume)
- var/atom/I = L.anti_magic_check(chargecost = 0)
- if(I)
- if(isitem(I))
- to_chat(L, "[I] suddenly burns hotly before returning to normal!")
- continue
- to_chat(L, "Your blood boils in your veins!")
- animate(src, color = "#FCB56D", time = 4)
- sleep(4)
- if(QDELETED(src))
- return
- do_area_burn(T, 0.5)
- animate(src, color = "#FFDF80", time = 5)
- sleep(5)
- if(QDELETED(src))
- return
- do_area_burn(T, 1)
- animate(src, color = "#FFFDF4", time = 6)
- sleep(6)
- if(QDELETED(src))
- return
- do_area_burn(T, 1.5)
- new /obj/effect/hotspot(T)
- qdel(src)
-
-/obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier)
- set_light(6, 1, color)
- for(var/mob/living/L in viewers(T))
- if(!iscultist(L) && L.blood_volume)
- if(L.anti_magic_check(chargecost = 0))
- continue
- L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
-
-//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
-/obj/effect/rune/manifest
- cultist_name = "Spirit Realm"
- cultist_desc = "manifests a spirit servant of the Geometer and allows you to ascend as a spirit yourself. The invoker must not move from atop the rune, and will take damage for each summoned spirit."
- invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
- icon_state = "7"
- invoke_damage = 10
- construct_invoke = FALSE
- color = RUNE_COLOR_DARKRED
- var/mob/living/affecting = null
- var/ghost_limit = 3
- var/ghosts = 0
-
-/obj/effect/rune/manifest/Initialize()
- . = ..()
-
-
-/obj/effect/rune/manifest/can_invoke(mob/living/user)
- if(!(user in get_turf(src)))
- to_chat(user, "You must be standing on [src]!")
- fail_invoke()
- log_game("Manifest rune failed - user not standing on rune")
- return list()
- if(user.has_status_effect(STATUS_EFFECT_SUMMONEDGHOST))
- to_chat(user, "Ghosts can't summon more ghosts!")
- fail_invoke()
- log_game("Manifest rune failed - user is a ghost")
- return list()
- return ..()
-
-/obj/effect/rune/manifest/invoke(list/invokers)
- . = ..()
- var/mob/living/user = invokers[1]
- var/turf/T = get_turf(src)
- var/choice = alert(user,"You tear open a connection to the spirit realm...",,"Summon a Cult Ghost","Ascend as a Dark Spirit","Cancel")
- if(choice == "Summon a Cult Ghost")
- if(ghosts >= ghost_limit)
- to_chat(user, "You are sustaining too many ghosts to summon more!")
- fail_invoke()
- log_game("Manifest rune failed - too many summoned ghosts")
- return list()
- notify_ghosts("Manifest rune invoked in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src, header = "Manifest rune")
- var/list/ghosts_on_rune = list()
- for(var/mob/dead/observer/O in T)
- if(O.client && !is_banned_from(O.ckey, ROLE_CULTIST) && !QDELETED(src) && !(isAdminObserver(O) && (O.client.prefs.toggles & ADMIN_IGNORE_CULT_GHOST)) && !QDELETED(O))
- ghosts_on_rune += O
- if(!ghosts_on_rune.len)
- to_chat(user, "There are no spirits near [src]!")
- fail_invoke()
- log_game("Manifest rune failed - no nearby ghosts")
- return list()
- var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune)
- var/mob/living/carbon/human/cult_ghost/new_human = new(T)
- new_human.real_name = ghost_to_spawn.real_name
- new_human.alpha = 150 //Makes them translucent
- new_human.equipOutfit(/datum/outfit/ghost_cultist) //give them armor
- new_human.apply_status_effect(STATUS_EFFECT_SUMMONEDGHOST) //ghosts can't summon more ghosts
- new_human.see_invisible = SEE_INVISIBLE_OBSERVER
- ghosts++
- playsound(src, 'sound/magic/exit_blood.ogg', 50, TRUE)
- visible_message("A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.")
- to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...")
- var/obj/structure/emergency_shield/invoker/N = new(T)
- new_human.key = ghost_to_spawn.key
- SSticker.mode.add_cultist(new_human.mind, 0)
- to_chat(new_human, "You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar'Sie, and you are to serve them at all costs.")
-
- while(!QDELETED(src) && !QDELETED(user) && !QDELETED(new_human) && (user in T))
- if(user.stat != CONSCIOUS || HAS_TRAIT(new_human, TRAIT_CRITICAL_CONDITION))
- break
- user.apply_damage(0.1, BRUTE)
- sleep(1)
-
- qdel(N)
- ghosts--
- if(new_human)
- new_human.visible_message(
- "[new_human] suddenly dissolves into bones and ashes.", \
- "Your link to the world fades. Your form breaks apart.")
- for(var/obj/I in new_human)
- new_human.dropItemToGround(I, TRUE)
- new_human.dust()
- else if(choice == "Ascend as a Dark Spirit")
- affecting = user
- affecting.add_atom_colour(RUNE_COLOR_DARKRED, ADMIN_COLOUR_PRIORITY)
- affecting.visible_message(
- "[affecting] freezes statue-still, glowing an unearthly red.", \
- "You see what lies beyond. All is revealed. In this form you find that your voice booms louder and you can mark targets for the entire cult")
- var/mob/dead/observer/G = affecting.ghostize(1)
- var/datum/action/innate/cult/comm/spirit/CM = new
- var/datum/action/innate/cult/ghostmark/GM = new
- G.name = "Dark Spirit of [G.name]"
- G.color = "red"
- CM.Grant(G)
- GM.Grant(G)
- while(!QDELETED(affecting))
- if(!(affecting in T))
- user.visible_message("A spectral tendril wraps around [affecting] and pulls [affecting.p_them()] back to the rune!")
- Beam(affecting, icon_state="drainbeam", time=2)
- affecting.forceMove(get_turf(src)) //NO ESCAPE :^)
- if(affecting.key)
- affecting.visible_message(
- "[affecting] slowly relaxes, the glow around [affecting.p_them()] dimming.", \
- "You are re-united with your physical form. [src] releases its hold over you.")
- affecting.Paralyze(40)
- break
- if(affecting.health <= 10)
- to_chat(G, "Your body can no longer sustain the connection!")
- break
- sleep(5)
- CM.Remove(G)
- GM.Remove(G)
- affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
- affecting.grab_ghost()
- affecting = null
- rune_in_use = FALSE
-
-/mob/living/carbon/human/cult_ghost/spill_organs(no_brain, no_organs, no_bodyparts) //cult ghosts never drop a brain
- no_brain = TRUE
- . = ..()
-
-/mob/living/carbon/human/cult_ghost/getorganszone(zone, subzones = 0)
- . = ..()
- for(var/obj/item/organ/brain/B in .) //they're not that smart, really
- . -= B
-
-
-/obj/effect/rune/apocalypse
- cultist_name = "Apocalypse"
- cultist_desc = "a harbinger of the end times. Grows in strength with the cult's desperation - but at the risk of... side effects."
- invocation = "Ta'gh fara'qha fel d'amar det!"
- icon = 'icons/effects/96x96.dmi'
- icon_state = "apoc"
- pixel_x = -32
- pixel_y = -32
- color = RUNE_COLOR_DARKRED
- req_cultists = 3
- scribe_delay = 100
-
-/obj/effect/rune/apocalypse/invoke(list/invokers)
- if(rune_in_use)
- return
- . = ..()
- var/area/place = get_area(src)
- var/mob/living/user = invokers[1]
- var/datum/antagonist/cult/user_antag = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- var/datum/objective/eldergod/summon_objective = locate() in user_antag.cult_team.objectives
- if(summon_objective.summon_spots.len <= 1)
- to_chat(user, "Only one ritual site remains - it must be reserved for the final summoning!")
- return
- if(!(place in summon_objective.summon_spots))
- to_chat(user, "The Apocalypse rune will remove a ritual site, where Nar'Sie can be summoned, it can only be scribed in [english_list(summon_objective.summon_spots)]!")
- return
- summon_objective.summon_spots -= place
- rune_in_use = TRUE
- var/turf/T = get_turf(src)
- new /obj/effect/temp_visual/dir_setting/curse/grasp_portal/fading(T)
- var/intensity = 0
- for(var/mob/living/M in GLOB.player_list)
- if(iscultist(M))
- intensity++
- intensity = max(60, 360 - (360*(intensity/GLOB.player_list.len + 0.3)**2)) //significantly lower intensity for "winning" cults
- var/duration = intensity*10
- playsound(T, 'sound/magic/enter_blood.ogg', 100, TRUE)
- visible_message("A colossal shockwave of energy bursts from the rune, disintegrating it in the process!")
- for(var/mob/living/L in range(src, 3))
- L.Paralyze(30)
- empulse(T, 0.42*(intensity), 1)
- var/list/images = list()
- var/zmatch = T.virtual_z()
- var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
- for(var/mob/living/M in GLOB.alive_mob_list)
- if(M.virtual_z() != zmatch)
- continue
- if(ishuman(M))
- if(!iscultist(M))
- AH.remove_hud_from(M)
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(hudFix), M), duration)
- var/image/A = image('icons/mob/cult.dmi',M,"cultist", ABOVE_MOB_LAYER)
- A.override = 1
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "human_apoc", A, NONE)
- addtimer(CALLBACK(M, TYPE_PROC_REF(/atom, remove_alt_appearance),"human_apoc",TRUE), duration)
- images += A
- SEND_SOUND(M, pick(sound('sound/ambience/antag/bloodcult.ogg'),sound('sound/spookoween/ghost_whisper.ogg'),sound('sound/spookoween/ghosty_wind.ogg')))
- else
- var/construct = pick("floater","artificer","behemoth")
- var/image/B = image('icons/mob/mob.dmi',M,construct, ABOVE_MOB_LAYER)
- B.override = 1
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/noncult, "mob_apoc", B, NONE)
- addtimer(CALLBACK(M, TYPE_PROC_REF(/atom, remove_alt_appearance),"mob_apoc",TRUE), duration)
- images += B
- if(!iscultist(M))
- if(M.client)
- var/image/C = image('icons/effects/cult_effects.dmi',M,"bloodsparkles", ABOVE_MOB_LAYER)
- add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/cult, "cult_apoc", C, NONE)
- addtimer(CALLBACK(M, TYPE_PROC_REF(/atom, remove_alt_appearance),"cult_apoc",TRUE), duration)
- images += C
- else
- to_chat(M, "An Apocalypse Rune was invoked in the [place.name], it is no longer available as a summoning site!")
- SEND_SOUND(M, 'sound/effects/pope_entry.ogg')
- image_handler(images, duration)
- if(intensity>=285) // Based on the prior formula, this means the cult makes up <15% of current players
- var/outcome = rand(1,80)
- switch(outcome)
- if(1 to 10)
- var/datum/round_event_control/disease_outbreak/D = new()
- // var/datum/round_event_control/mice_migration/M = new()
- D.runEvent()
- // M.runEvent()
- if(11 to 20)
- var/datum/round_event_control/radiation_storm/RS = new()
- RS.runEvent()
- if(21 to 30)
- var/datum/round_event_control/brand_intelligence/BI = new()
- BI.runEvent()
- if(31 to 40)
- var/datum/round_event_control/immovable_rod/R = new()
- R.runEvent()
- R.runEvent()
- R.runEvent()
- if(41 to 50)
- var/datum/round_event_control/meteor_wave/MW = new()
- MW.runEvent()
- if(51 to 60)
- var/datum/round_event_control/spider_infestation/SI = new()
- SI.runEvent()
- if(61 to 80)
- var/datum/round_event_control/spacevine/SV = new()
- var/datum/round_event_control/grey_tide/GT = new()
- SV.runEvent()
- GT.runEvent()
- qdel(src)
-
-/obj/effect/rune/apocalypse/proc/image_handler(list/images, duration)
- var/end = world.time + duration
- set waitfor = 0
- while(end>world.time)
- for(var/image/I in images)
- I.override = FALSE
- animate(I, alpha = 0, time = 25, flags = ANIMATION_PARALLEL)
- sleep(35)
- for(var/image/I in images)
- animate(I, alpha = 255, time = 25, flags = ANIMATION_PARALLEL)
- sleep(25)
- for(var/image/I in images)
- if(I.icon_state != "bloodsparkles")
- I.override = TRUE
- sleep(190)
-
-
-
-/proc/hudFix(mob/living/carbon/human/target)
- if(!target || !target.client)
- return
- var/obj/O = target.get_item_by_slot(ITEM_SLOT_EYES)
- if(istype(O, /obj/item/clothing/glasses/hud/security))
- var/datum/atom_hud/AH = GLOB.huds[DATA_HUD_SECURITY_ADVANCED]
- AH.add_hud_to(target)
diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm
deleted file mode 100644
index db087e100e2f..000000000000
--- a/code/modules/antagonists/devil/devil.dm
+++ /dev/null
@@ -1,506 +0,0 @@
-#define BLOOD_THRESHOLD 3 //How many souls are needed per stage.
-#define TRUE_THRESHOLD 7
-#define ARCH_THRESHOLD 12
-
-#define BASIC_DEVIL 0
-#define BLOOD_lizard 1
-#define TRUE_DEVIL 2
-#define ARCH_DEVIL 3
-
-#define LOSS_PER_DEATH 2
-
-#define SOULVALUE soulsOwned.len-reviveNumber
-
-#define DEVILRESURRECTTIME 600
-
-GLOBAL_LIST_EMPTY(allDevils)
-GLOBAL_LIST_INIT(lawlorify, list (
- LORE = list(
- OBLIGATION_FOOD = "This devil seems to always offer its victims food before slaughtering them.",
- OBLIGATION_FIDDLE = "This devil will never turn down a musical challenge.",
- OBLIGATION_DANCEOFF = "This devil will never turn down a dance off.",
- OBLIGATION_GREET = "This devil seems to only be able to converse with people it knows the name of.",
- OBLIGATION_PRESENCEKNOWN = "This devil seems to be unable to attack from stealth.",
- OBLIGATION_SAYNAME = "He will always chant his name upon killing someone.",
- OBLIGATION_ANNOUNCEKILL = "This devil always loudly announces his kills for the world to hear.",
- OBLIGATION_ANSWERTONAME = "This devil always responds to his truename.",
- BAN_HURTWOMAN = "This devil seems to prefer hunting men.",
- BAN_CHAPEL = "This devil avoids holy ground.",
- BAN_HURTPRIEST = "The annointed clergy appear to be immune to his powers.",
- BAN_AVOIDWATER = "The devil seems to have some sort of aversion to water, though it does not appear to harm him.",
- BAN_STRIKEUNCONSCIOUS = "This devil only shows interest in those who are awake.",
- BAN_HURTlizard = "This devil will not strike a lizardman first.",
- BAN_HURTANIMAL = "This devil avoids hurting animals.",
- BANISH_WATER = "To banish the devil, you must infuse its body with holy water.",
- BANISH_COFFIN = "This devil will return to life if its remains are not placed within a coffin.",
- BANISH_FORMALDYHIDE = "To banish the devil, you must inject its lifeless body with embalming fluid.",
- BANISH_RUNES = "This devil will resurrect after death, unless its remains are within a rune.",
- BANISH_CANDLES = "A large number of nearby lit candles will prevent it from resurrecting.",
- BANISH_DESTRUCTION = "Its corpse must be utterly destroyed to prevent resurrection.",
- BANISH_FUNERAL_GARB = "If clad in funeral garments, this devil will be unable to resurrect. Should the clothes not fit, lay them gently on top of the devil's corpse."
- ),
- LAW = list(
- OBLIGATION_FOOD = "When not acting in self defense, you must always offer your victim food before harming them.",
- OBLIGATION_FIDDLE = "When not in immediate danger, if you are challenged to a musical duel, you must accept it. You are not obligated to duel the same person twice.",
- OBLIGATION_DANCEOFF = "When not in immediate danger, if you are challenged to a dance off, you must accept it. You are not obligated to face off with the same person twice.",
- OBLIGATION_GREET = "You must always greet other people by their last name before talking with them.",
- OBLIGATION_PRESENCEKNOWN = "You must always make your presence known before attacking.",
- OBLIGATION_SAYNAME = "You must always say your true name after you kill someone.",
- OBLIGATION_ANNOUNCEKILL = "Upon killing someone, you must make your deed known to all within earshot, over comms if reasonably possible.",
- OBLIGATION_ANSWERTONAME = "If you are not under attack, you must always respond to your true name.",
- BAN_HURTWOMAN = "You must never harm a female outside of self defense.",
- BAN_CHAPEL = "You must never attempt to enter the chapel.",
- BAN_HURTPRIEST = "You must never attack a priest.",
- BAN_AVOIDWATER = "You must never willingly touch a wet surface.",
- BAN_STRIKEUNCONSCIOUS = "You must never strike an unconscious person.",
- BAN_HURTlizard = "You must never harm a lizardman outside of self defense.",
- BAN_HURTANIMAL = "You must never harm a non-sentient creature or robot outside of self defense.",
- BANISH_WATER = "If your corpse is filled with holy water, you will be unable to resurrect.",
- BANISH_COFFIN = "If your corpse is in a coffin, you will be unable to resurrect.",
- BANISH_FORMALDYHIDE = "If your corpse is embalmed, you will be unable to resurrect.",
- BANISH_RUNES = "If your corpse is placed within a rune, you will be unable to resurrect.",
- BANISH_CANDLES = "If your corpse is near lit candles, you will be unable to resurrect.",
- BANISH_DESTRUCTION = "If your corpse is destroyed, you will be unable to resurrect.",
- BANISH_FUNERAL_GARB = "If your corpse is clad in funeral garments, you will be unable to resurrect."
- )
- ))
-
-//These are also used in the codex gigas, so let's declare them globally.
-GLOBAL_LIST_INIT(devil_pre_title, list("Dark ", "Hellish ", "Fallen ", "Fiery ", "Sinful ", "Blood ", "Fluffy "))
-GLOBAL_LIST_INIT(devil_title, list("Lord ", "Prelate ", "Count ", "Viscount ", "Vizier ", "Elder ", "Adept "))
-GLOBAL_LIST_INIT(devil_syllable, list("hal", "ve", "odr", "neit", "ci", "quon", "mya", "folth", "wren", "geyr", "hil", "niet", "twou", "phi", "coa"))
-GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", ", the Lord of all things", ", Jr."))
-/datum/antagonist/devil
- name = "Devil"
- roundend_category = "devils"
- antagpanel_category = "Devil"
- job_rank = ROLE_DEVIL
- antag_hud_type = ANTAG_HUD_DEVIL
- antag_hud_name = "devil"
- show_to_ghosts = TRUE
- var/obligation
- var/ban
- var/banish
- var/truename
- var/list/datum/mind/soulsOwned = new
- var/reviveNumber = 0
- var/form = BASIC_DEVIL
- var/static/list/devil_spells = typecacheof(list(
- /obj/effect/proc_holder/spell/aimed/fireball/hellish,
- /obj/effect/proc_holder/spell/targeted/infernal_jaunt,
- /obj/effect/proc_holder/spell/targeted/sintouch,
- /obj/effect/proc_holder/spell/targeted/sintouch/ascended,
- /obj/effect/proc_holder/spell/targeted/summon_contract,
- /obj/effect/proc_holder/spell/targeted/conjure_item/violin,
- /obj/effect/proc_holder/spell/targeted/summon_dancefloor))
- var/ascendable = FALSE
-
-/datum/antagonist/devil/can_be_owned(datum/mind/new_owner)
- . = ..()
- return . && (ishuman(new_owner.current) || iscyborg(new_owner.current))
-
-/datum/antagonist/devil/get_admin_commands()
- . = ..()
- .["Toggle ascendable"] = CALLBACK(src, PROC_REF(admin_toggle_ascendable))
-
-
-/datum/antagonist/devil/proc/admin_toggle_ascendable(mob/admin)
- ascendable = !ascendable
- message_admins("[key_name_admin(admin)] set [key_name_admin(owner)] devil ascendable to [ascendable]")
- log_admin("[key_name_admin(admin)] set [key_name(owner)] devil ascendable to [ascendable])")
-
-/datum/antagonist/devil/admin_add(datum/mind/new_owner,mob/admin)
- switch(alert(admin,"Should the devil be able to ascend",,"Yes","No","Cancel"))
- if("Yes")
- ascendable = TRUE
- if("No")
- ascendable = FALSE
- else
- return
- new_owner.add_antag_datum(src)
- message_admins("[key_name_admin(admin)] has devil'ed [key_name_admin(new_owner)]. [ascendable ? "(Ascendable)":""]")
- log_admin("[key_name(admin)] has devil'ed [key_name(new_owner)]. [ascendable ? "(Ascendable)":""]")
-
-/datum/antagonist/devil/antag_listing_name()
- return ..() + "([truename])"
-
-/proc/devilInfo(name)
- if(GLOB.allDevils[lowertext(name)])
- return GLOB.allDevils[lowertext(name)]
- else
- var/datum/fakeDevil/devil = new /datum/fakeDevil(name)
- GLOB.allDevils[lowertext(name)] = devil
- return devil
-
-/proc/randomDevilName()
- var/name = ""
- if(prob(65))
- if(prob(35))
- name = pick(GLOB.devil_pre_title)
- name += pick(GLOB.devil_title)
- var/probability = 100
- name += pick(GLOB.devil_syllable)
- while(prob(probability))
- name += pick(GLOB.devil_syllable)
- probability -= 20
- if(prob(40))
- name += pick(GLOB.devil_suffix)
- return name
-
-/proc/randomdevilobligation()
- return pick(OBLIGATION_FOOD, OBLIGATION_FIDDLE, OBLIGATION_DANCEOFF, OBLIGATION_GREET, OBLIGATION_PRESENCEKNOWN, OBLIGATION_SAYNAME, OBLIGATION_ANNOUNCEKILL, OBLIGATION_ANSWERTONAME)
-
-/proc/randomdevilban()
- return pick(BAN_HURTWOMAN, BAN_CHAPEL, BAN_HURTPRIEST, BAN_AVOIDWATER, BAN_STRIKEUNCONSCIOUS, BAN_HURTLIZARD, BAN_HURTANIMAL)
-
-/proc/randomdevilbanish()
- return pick(BANISH_WATER, BANISH_COFFIN, BANISH_FORMALDYHIDE, BANISH_RUNES, BANISH_CANDLES, BANISH_DESTRUCTION, BANISH_FUNERAL_GARB)
-
-/datum/antagonist/devil/proc/add_soul(datum/mind/soul)
- if(soulsOwned.Find(soul))
- return
- soulsOwned += soul
- owner.current.set_nutrition(NUTRITION_LEVEL_FULL)
- to_chat(owner.current, "You feel satiated as you received a new soul.")
- update_hud()
- switch(SOULVALUE)
- if(0)
- to_chat(owner.current, "Your hellish powers have been restored.")
- give_appropriate_spells()
- if(BLOOD_THRESHOLD)
- increase_blood_lizard()
- if(TRUE_THRESHOLD)
- increase_true_devil()
- if(ARCH_THRESHOLD)
- increase_arch_devil()
-
-/datum/antagonist/devil/proc/remove_soul(datum/mind/soul)
- if(soulsOwned.Remove(soul))
- check_regression()
- to_chat(owner.current, "You feel as though a soul has slipped from your grasp.")
- update_hud()
-
-/datum/antagonist/devil/proc/check_regression()
- if(form == ARCH_DEVIL)
- return //arch devil can't regress
- //Yes, fallthrough behavior is intended, so I can't use a switch statement.
- if(form == TRUE_DEVIL && SOULVALUE < TRUE_THRESHOLD)
- regress_blood_lizard()
- if(form == BLOOD_lizard && SOULVALUE < BLOOD_THRESHOLD)
- regress_humanoid()
- if(SOULVALUE < 0)
- give_appropriate_spells()
- to_chat(owner.current, "As punishment for your failures, all of your powers except contract creation have been revoked.")
-
-/datum/antagonist/devil/proc/regress_humanoid()
- to_chat(owner.current, "Your powers weaken, have more contracts be signed to regain power.")
- if(ishuman(owner.current))
- var/mob/living/carbon/human/H = owner.current
- H.set_species(/datum/species/human, 1)
- H.regenerate_icons()
- give_appropriate_spells()
- if(istype(owner.current.loc, /obj/effect/dummy/phased_mob/slaughter/))
- owner.current.forceMove(get_turf(owner.current))//Fixes dying while jaunted leaving you permajaunted.
- form = BASIC_DEVIL
-
-/datum/antagonist/devil/proc/regress_blood_lizard()
- var/mob/living/carbon/true_devil/D = owner.current
- to_chat(D, "Your powers weaken, have more contracts be signed to regain power.")
- D.oldform.forceMove(D.drop_location())
- owner.transfer_to(D.oldform)
- give_appropriate_spells()
- qdel(D)
- form = BLOOD_lizard
- update_hud()
-
-
-/datum/antagonist/devil/proc/increase_blood_lizard()
- to_chat(owner.current, "You feel as though your humanoid form is about to shed. You will soon turn into a blood lizard.")
- sleep(50)
- if(ishuman(owner.current))
- var/mob/living/carbon/human/H = owner.current
- H.set_species(/datum/species/lizard, 1)
- H.underwear = "Nude"
- H.undershirt = "Nude"
- H.socks = "Nude"
- H.dna.features["mcolor"] = "511" //A deep red
- H.regenerate_icons()
- else //Did the devil get hit by a staff of transmutation?
- owner.current.color = "#501010"
- give_appropriate_spells()
- form = BLOOD_lizard
-
-
-
-/datum/antagonist/devil/proc/increase_true_devil()
- to_chat(owner.current, "You feel as though your current form is about to shed. You will soon turn into a true devil.")
- sleep(50)
- var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(owner.current.loc)
- A.faction |= "hell"
- owner.current.forceMove(A)
- A.oldform = owner.current
- owner.transfer_to(A)
- A.set_devil_name()
- give_appropriate_spells()
- form = TRUE_DEVIL
- update_hud()
-
-/datum/antagonist/devil/proc/increase_arch_devil()
- if(!ascendable)
- return
- var/mob/living/carbon/true_devil/D = owner.current
- to_chat(D, "You feel as though your form is about to ascend.")
- sleep(50)
- if(!D)
- return
- D.visible_message("[D]'s skin begins to erupt with spikes.", \
- "Your flesh begins creating a shield around yourself.")
- sleep(100)
- if(!D)
- return
- D.visible_message("The horns on [D]'s head slowly grow and elongate.", \
- "Your body continues to mutate. Your telepathic abilities grow.")
- sleep(90)
- if(!D)
- return
- D.visible_message("[D]'s body begins to violently stretch and contort.", \
- "You begin to rend apart the final barriers to ultimate power.")
- sleep(40)
- if(!D)
- return
- to_chat(D, "Yes!")
- sleep(10)
- if(!D)
- return
- to_chat(D, "YES!!")
- sleep(10)
- if(!D)
- return
- to_chat(D, "YE--")
- sleep(1)
- if(!D)
- return
- send_to_playing_players("\"SLOTH, WRATH, GLUTTONY, ACEDIA, ENVY, GREED, PRIDE! FIRES OF HELL AWAKEN!!\"")
- sound_to_playing_players('sound/hallucinations/veryfar_noise.ogg')
- give_appropriate_spells()
- D.convert_to_archdevil()
- if(istype(D.loc, /obj/effect/dummy/phased_mob/slaughter/))
- D.forceMove(get_turf(D))//Fixes dying while jaunted leaving you permajaunted.
- var/area/A = get_area(owner.current)
- if(A)
- notify_ghosts("An arch devil has ascended in \the [A.name]. Reach out to the devil to be given a new shell for your soul.", source = owner.current, action=NOTIFY_ATTACK)
- sleep(50)
- form = ARCH_DEVIL
-
-/datum/antagonist/devil/proc/remove_spells()
- for(var/X in owner.spell_list)
- var/obj/effect/proc_holder/spell/S = X
- if(is_type_in_typecache(S, devil_spells))
- owner.RemoveSpell(S)
-
-/datum/antagonist/devil/proc/give_summon_contract()
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_contract(null))
- if(obligation == OBLIGATION_FIDDLE)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/violin(null))
- else if(obligation == OBLIGATION_DANCEOFF)
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_dancefloor(null))
-
-/datum/antagonist/devil/proc/give_appropriate_spells()
- remove_spells()
- give_summon_contract()
- if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
- give_arch_spells()
- else if(SOULVALUE >= TRUE_THRESHOLD)
- give_true_spells()
- else if(SOULVALUE >= BLOOD_THRESHOLD)
- give_blood_spells()
- else if(SOULVALUE >= 0)
- give_base_spells()
-
-/datum/antagonist/devil/proc/give_base_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
-
-/datum/antagonist/devil/proc/give_blood_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
-
-/datum/antagonist/devil/proc/give_true_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/aimed/fireball/hellish(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/infernal_jaunt(null))
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch(null))
-
-/datum/antagonist/devil/proc/give_arch_spells()
- owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/sintouch/ascended(null))
-
-/datum/antagonist/devil/proc/beginResurrectionCheck(mob/living/body)
- if(SOULVALUE>0)
- to_chat(owner.current, "Your body has been damaged to the point that you may no longer use it. At the cost of some of your power, you will return to life soon. Remain in your body.")
- sleep(DEVILRESURRECTTIME)
- if (!body || body.stat == DEAD)
- if(SOULVALUE>0)
- if(check_banishment(body))
- to_chat(owner.current, "Unfortunately, the mortals have finished a ritual that prevents your resurrection.")
- return -1
- else
- to_chat(owner.current, "WE LIVE AGAIN!")
- return hellish_resurrection(body)
- else
- to_chat(owner.current, "Unfortunately, the power that stemmed from your contracts has been extinguished. You no longer have enough power to resurrect.")
- return -1
- else
- to_chat(owner.current, "You seem to have resurrected without your hellish powers.")
- else
- to_chat(owner.current, "Your hellish powers are too weak to resurrect yourself.")
-
-/datum/antagonist/devil/proc/check_banishment(mob/living/body)
- switch(banish)
- if(BANISH_WATER)
- if(iscarbon(body))
- var/mob/living/carbon/H = body
- return H.reagents.has_reagent(/datum/reagent/water/holywater)
- return 0
- if(BANISH_COFFIN)
- return (body && istype(body.loc, /obj/structure/closet/crate/coffin))
- if(BANISH_FORMALDYHIDE)
- if(iscarbon(body))
- var/mob/living/carbon/H = body
- return H.reagents.has_reagent(/datum/reagent/toxin/formaldehyde)
- return 0
- if(BANISH_RUNES)
- if(body)
- for(var/obj/effect/decal/cleanable/crayon/R in range(0,body))
- if (R.name == "rune")
- return 1
- return 0
- if(BANISH_CANDLES)
- if(body)
- var/count = 0
- for(var/obj/item/candle/C in range(1,body))
- count += C.lit
- if(count>=4)
- return 1
- return 0
- if(BANISH_DESTRUCTION)
- if(body)
- return 0
- return 1
- if(BANISH_FUNERAL_GARB)
- if(ishuman(body))
- var/mob/living/carbon/human/H = body
- if(H.w_uniform && istype(H.w_uniform, /obj/item/clothing/under/suit/white_on_white))
- return 1
- return 0
- else
- for(var/obj/item/clothing/under/suit/white_on_white/B in range(0,body))
- if(B.loc == get_turf(B)) //Make sure it's not in someone's inventory or something.
- return 1
- return 0
-
-/datum/antagonist/devil/proc/hellish_resurrection(mob/living/body)
- message_admins("[key_name_admin(owner)] (true name is: [truename]) is resurrecting using hellish energy.")
- if(SOULVALUE < ARCH_THRESHOLD || !ascendable) // once ascended, arch devils do not go down in power by any means.
- reviveNumber += LOSS_PER_DEATH
- update_hud()
- if(body)
- body.revive(full_heal = TRUE, admin_revive = TRUE) //Adminrevive also recovers organs, preventing someone from resurrecting without a heart.
- if(istype(body.loc, /obj/effect/dummy/phased_mob/slaughter/))
- body.forceMove(get_turf(body))//Fixes dying while jaunted leaving you permajaunted.
- if(istype(body, /mob/living/carbon/true_devil))
- var/mob/living/carbon/true_devil/D = body
- if(D.oldform)
- D.oldform.revive(full_heal = TRUE, admin_revive = FALSE) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
- if(body.stat == DEAD)
- create_new_body()
- else
- create_new_body()
- check_regression()
-
-/datum/antagonist/devil/proc/create_new_body()
- CRASH("Unable to find a blobstart landmark for hellish resurrection")
-
-/datum/antagonist/devil/proc/update_hud()
- if(iscarbon(owner.current))
- var/mob/living/C = owner.current
- if(C.hud_used && C.hud_used.devilsouldisplay)
- C.hud_used.devilsouldisplay.update_counter(SOULVALUE)
-
-/datum/antagonist/devil/greet()
- to_chat(owner.current, "You remember your link to the infernal. You are [truename], an agent of hell, a devil. And you were sent to the plane of creation for a reason. A greater purpose. Convince the crew to sin, and embroiden Hell's grasp.")
- to_chat(owner.current, "However, your infernal form is not without weaknesses.")
- to_chat(owner.current, "You may not use violence to coerce someone into selling their soul.")
- to_chat(owner.current, "You may not directly and knowingly physically harm a devil, other than yourself.")
- to_chat(owner.current, GLOB.lawlorify[LAW][ban])
- to_chat(owner.current, GLOB.lawlorify[LAW][obligation])
- to_chat(owner.current, GLOB.lawlorify[LAW][banish])
- to_chat(owner.current, "Remember, the crew can research your weaknesses if they find out your devil name. ")
- .=..()
-
-/datum/antagonist/devil/on_gain()
- truename = randomDevilName()
- ban = randomdevilban()
- obligation = randomdevilobligation()
- banish = randomdevilbanish()
- GLOB.allDevils[lowertext(truename)] = src
-
- antag_memory += "Your devilic true name is [truename] [GLOB.lawlorify[LAW][ban]] You may not use violence to coerce someone into selling their soul. You may not directly and knowingly physically harm a devil, other than yourself. [GLOB.lawlorify[LAW][obligation]] [GLOB.lawlorify[LAW][banish]] "
- if(issilicon(owner.current))
- var/mob/living/silicon/robot_devil = owner.current
- var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", GLOB.lawlorify[LAW][ban], GLOB.lawlorify[LAW][obligation], "Accomplish your objectives at all costs.")
- robot_devil.set_law_sixsixsix(laws)
- sleep(10)
- .=..()
-
-/datum/antagonist/devil/on_removal()
- to_chat(owner.current, "Your infernal link has been severed! You are no longer a devil!")
- .=..()
-
-/datum/antagonist/devil/apply_innate_effects(mob/living/mob_override)
- give_appropriate_spells()
- var/mob/living/M = mob_override || owner.current
- add_antag_hud(antag_hud_type, antag_hud_name, M)
- handle_clown_mutation(M, mob_override ? null : "Your infernal nature has allowed you to overcome your clownishness.")
- owner.current.grant_all_languages(TRUE, TRUE, TRUE, LANGUAGE_DEVIL)
- update_hud()
- .=..()
-
-/datum/antagonist/devil/remove_innate_effects(mob/living/mob_override)
- for(var/X in owner.spell_list)
- var/obj/effect/proc_holder/spell/S = X
- if(is_type_in_typecache(S, devil_spells))
- owner.RemoveSpell(S)
- var/mob/living/M = mob_override || owner.current
- remove_antag_hud(antag_hud_type, M)
- handle_clown_mutation(M, removing = FALSE)
- owner.current.remove_all_languages(LANGUAGE_DEVIL)
- .=..()
-
-/datum/antagonist/devil/proc/printdevilinfo()
- var/list/parts = list()
- parts += "The devil's true name is: [truename]"
- parts += "The devil's bans were:"
- parts += "[FOURSPACES][GLOB.lawlorify[LORE][ban]]"
- parts += "[FOURSPACES][GLOB.lawlorify[LORE][obligation]]"
- parts += "[FOURSPACES][GLOB.lawlorify[LORE][banish]]"
- return parts.Join(" ")
-
-/datum/antagonist/devil/roundend_report()
- var/list/parts = list()
- parts += printplayer(owner)
- parts += printdevilinfo()
- parts += printobjectives(objectives)
- return parts.Join(" ")
-
-//A simple super light weight datum for the codex gigas.
-/datum/fakeDevil
- var/truename
- var/obligation
- var/ban
- var/banish
- var/ascendable
-
-/datum/fakeDevil/New(name = randomDevilName())
- truename = name
- obligation = randomdevilobligation()
- ban = randomdevilban()
- banish = randomdevilbanish()
- ascendable = prob(25)
diff --git a/code/modules/antagonists/devil/imp/imp.dm b/code/modules/antagonists/devil/imp/imp.dm
deleted file mode 100644
index 21446d2661d8..000000000000
--- a/code/modules/antagonists/devil/imp/imp.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-//////////////////The Monster
-
-/mob/living/simple_animal/imp
- name = "imp"
- real_name = "imp"
- unique_name = TRUE
- desc = "A large, menacing creature covered in armored black scales."
- speak_emote = list("cackles")
- emote_hear = list("cackles","screeches")
- response_help_continuous = "thinks better of touching"
- response_help_simple = "think better of touching"
- response_disarm_continuous = "flails at"
- response_disarm_simple = "flail at"
- response_harm_continuous = "punches"
- response_harm_simple = "punch"
- icon = 'icons/mob/mob.dmi'
- icon_state = "imp"
- icon_living = "imp"
- mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
- speed = 1
- a_intent = INTENT_HARM
- stop_automated_movement = 1
- status_flags = CANPUSH
- attack_sound = 'sound/magic/demon_attack1.ogg'
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 250 //Weak to cold
- maxbodytemp = INFINITY
- faction = list("hell")
- attack_verb_continuous = "wildly tears into"
- attack_verb_simple = "wildly tear into"
- maxHealth = 200
- health = 200
- healable = 0
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES
- obj_damage = 40
- melee_damage_lower = 10
- melee_damage_upper = 15
- see_in_dark = 8
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- del_on_death = TRUE
- deathmessage = "screams in agony as it sublimates into a sulfurous smoke."
- deathsound = 'sound/magic/demon_dies.ogg'
- var/boost = 0
- var/list/consumed_mobs = list()
- var/playstyle_string = "You are an imp, a mischievous creature from hell. You are the lowest rank on the hellish totem pole \
- Though you are not obligated to help, perhaps by aiding a higher ranking devil, you might just get a promotion. However, you are incapable \
- of intentionally harming a fellow devil."
-
-/mob/living/simple_animal/imp/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_BLOODCRAWL_EAT, "innate")
- set_varspeed(1)
- addtimer(CALLBACK(src, TYPE_PROC_REF(/mob/living, set_varspeed), 0), 30)
-
-/datum/antagonist/imp
- name = "Imp"
- antagpanel_category = "Devil"
- show_in_roundend = FALSE
-
-/datum/antagonist/imp/on_gain()
- . = ..()
- give_objectives()
-
-/datum/antagonist/imp/proc/give_objectives()
- var/datum/objective/newobjective = new
- newobjective.explanation_text = "Try to get a promotion to a higher devilic rank."
- newobjective.owner = owner
- objectives += newobjective
diff --git a/code/modules/antagonists/devil/sintouched/objectives.dm b/code/modules/antagonists/devil/sintouched/objectives.dm
deleted file mode 100644
index fcbb8dcbb55d..000000000000
--- a/code/modules/antagonists/devil/sintouched/objectives.dm
+++ /dev/null
@@ -1,23 +0,0 @@
-/datum/objective/sintouched
- completed = 1
-
-/datum/objective/sintouched/gluttony
- explanation_text = "Everything is so delicious. Go eat everything."
-
-/datum/objective/sintouched/greed
- explanation_text = "You want MORE, more money, more wealth, more riches. Go get it, but don't hurt people for it."
-
-/datum/objective/sintouched/sloth
- explanation_text = "You just get tired randomly. Go take a nap at a time that would inconvenience other people."
-
-/datum/objective/sintouched/wrath
- explanation_text = "What have your coworkers ever done for you? Don't offer to help them in any matter, and refuse if asked."
-
-/datum/objective/sintouched/envy
- explanation_text = "Why should you be stuck with your rank? Show everyone you can do other jobs too, and don't let anyone stop you, least of all because you have no training"
-
-/datum/objective/sintouched/pride
- explanation_text = "You are the BEST thing on the station. Make sure everyone knows it."
-
-/datum/objective/sintouched/acedia
- explanation_text = "Angels, devils, good, evil... who cares? Just ignore any hellish threats and do your job."
diff --git a/code/modules/antagonists/devil/sintouched/sintouched.dm b/code/modules/antagonists/devil/sintouched/sintouched.dm
deleted file mode 100644
index 064e1fbaecd0..000000000000
--- a/code/modules/antagonists/devil/sintouched/sintouched.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-#define SIN_ACEDIA "acedia"
-#define SIN_GLUTTONY "gluttony"
-#define SIN_GREED "greed"
-#define SIN_SLOTH "sloth"
-#define SIN_WRATH "wrath"
-#define SIN_ENVY "envy"
-#define SIN_PRIDE "pride"
-
-/datum/antagonist/sintouched
- name = "sintouched"
- roundend_category = "sintouched"
- antagpanel_category = "Devil"
- antag_hud_type = ANTAG_HUD_SINTOUCHED
- antag_hud_name = "sintouched"
- var/sin
-
- var/static/list/sins = list(SIN_ACEDIA,SIN_GLUTTONY,SIN_GREED,SIN_SLOTH,SIN_WRATH,SIN_ENVY,SIN_PRIDE)
-
-/datum/antagonist/sintouched/New()
- . = ..()
- sin = pick(sins)
-
-/datum/antagonist/sintouched/proc/forge_objectives()
- var/datum/objective/sintouched/O
- switch(sin)//traditional seven deadly sins... except lust.
- if(SIN_ACEDIA)
- O = new /datum/objective/sintouched/acedia
- if(SIN_GLUTTONY)
- O = new /datum/objective/sintouched/gluttony
- if(SIN_GREED)
- O = new /datum/objective/sintouched/greed
- if(SIN_SLOTH)
- O = new /datum/objective/sintouched/sloth
- if(SIN_WRATH)
- O = new /datum/objective/sintouched/wrath
- if(SIN_ENVY)
- O = new /datum/objective/sintouched/envy
- if(SIN_PRIDE)
- O = new /datum/objective/sintouched/pride
- objectives += O
-
-/datum/antagonist/sintouched/on_gain()
- forge_objectives()
- . = ..()
-
-/datum/antagonist/sintouched/greet()
- owner.announce_objectives()
-
-/datum/antagonist/sintouched/roundend_report()
- return printplayer(owner)
-
-/datum/antagonist/sintouched/admin_add(datum/mind/new_owner,mob/admin)
- var/choices = sins + "Random"
- var/chosen_sin = input(admin,"What kind ?","Sin kind") as null|anything in sortList(choices)
- if(!chosen_sin)
- return
- if(chosen_sin in sins)
- sin = chosen_sin
- . = ..()
-
-/datum/antagonist/sintouched/apply_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- add_antag_hud(antag_hud_type, antag_hud_name, M)
-
-/datum/antagonist/sintouched/remove_innate_effects(mob/living/mob_override)
- var/mob/living/M = mob_override || owner.current
- remove_antag_hud(antag_hud_type, M)
-
-
-#undef SIN_ACEDIA
-#undef SIN_ENVY
-#undef SIN_GLUTTONY
-#undef SIN_GREED
-#undef SIN_PRIDE
-#undef SIN_SLOTH
-#undef SIN_WRATH
diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm
deleted file mode 100644
index 4703f95263f7..000000000000
--- a/code/modules/antagonists/devil/true_devil/_true_devil.dm
+++ /dev/null
@@ -1,221 +0,0 @@
-#define DEVIL_HANDS_LAYER 1
-#define DEVIL_HEAD_LAYER 2
-#define DEVIL_TOTAL_LAYERS 2
-
-
-/mob/living/carbon/true_devil
- name = "True Devil"
- desc = "A pile of infernal energy, taking a vaguely humanoid form."
- icon = 'icons/mob/32x64.dmi'
- icon_state = "true_devil"
- gender = NEUTER
- health = 350
- maxHealth = 350
- ventcrawler = VENTCRAWLER_NONE
- density = TRUE
- pass_flags = 0
- sight = (SEE_TURFS | SEE_OBJS)
- status_flags = CANPUSH
- mob_size = MOB_SIZE_LARGE
- held_items = list(null, null)
- bodyparts = list(
- /obj/item/bodypart/chest/devil,
- /obj/item/bodypart/head/devil,
- /obj/item/bodypart/l_arm/devil,
- /obj/item/bodypart/r_arm/devil,
- /obj/item/bodypart/leg/right/devil,
- /obj/item/bodypart/leg/left/devil,
- )
- hud_type = /datum/hud/devil
- var/ascended = FALSE
- var/mob/living/oldform
- var/list/devil_overlays[DEVIL_TOTAL_LAYERS]
-
-/mob/living/carbon/true_devil/Initialize()
- create_bodyparts() //initialize bodyparts
- create_internal_organs()
- grant_all_languages()
- . = ..()
- ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
-
-/mob/living/carbon/true_devil/create_internal_organs()
- internal_organs += new /obj/item/organ/brain
- internal_organs += new /obj/item/organ/tongue
- internal_organs += new /obj/item/organ/eyes
- internal_organs += new /obj/item/organ/ears/invincible //Prevents hearing loss from poorly aimed fireballs.
- ..()
-
-/mob/living/carbon/true_devil/proc/convert_to_archdevil()
- maxHealth = 500 // not an IMPOSSIBLE amount, but still near impossible.
- ascended = TRUE
- health = maxHealth
- icon_state = "arch_devil"
-
-/mob/living/carbon/true_devil/proc/set_devil_name()
- var/datum/antagonist/devil/devilinfo = mind.has_antag_datum(/datum/antagonist/devil)
- name = devilinfo.truename
- real_name = name
-
-/mob/living/carbon/true_devil/Login()
- . = ..()
- if(!. || !client)
- return FALSE
- var/datum/antagonist/devil/devilinfo = mind.has_antag_datum(/datum/antagonist/devil)
- devilinfo.greet()
- mind.announce_objectives()
-
-/mob/living/carbon/true_devil/death(gibbed)
- set_stat(DEAD)
- ..(gibbed)
- drop_all_held_items()
- INVOKE_ASYNC(mind.has_antag_datum(/datum/antagonist/devil), TYPE_PROC_REF(/datum/antagonist/devil, beginResurrectionCheck), src)
-
-
-/mob/living/carbon/true_devil/examine(mob/user)
- . = list("This is [icon2html(src, user)] [src]!")
-
- //Left hand items
- for(var/obj/item/I in held_items)
- if(!(I.item_flags & ABSTRACT))
- . += "It is holding [I.get_examine_string(user)] in its [get_held_index_name(get_held_index_of_item(I))]."
-
- //Braindead
- if(!client && stat != DEAD)
- . += "The devil seems to be in deep contemplation."
-
- //Damaged
- if(stat == DEAD)
- . += "The hellfire seems to have been extinguished, for now at least."
- else if(health < (maxHealth/10))
- . += "You can see hellfire inside its gaping wounds."
- else if(health < (maxHealth/2))
- . += "You can see hellfire inside its wounds."
- . += ""
-
-/mob/living/carbon/true_devil/IsAdvancedToolUser()
- return 1
-
-/mob/living/carbon/true_devil/resist_buckle()
- if(buckled)
- buckled.user_unbuckle_mob(src,src)
- visible_message("[src] easily breaks out of [p_their()] handcuffs!", \
- "With just a thought your handcuffs fall off.")
-
-/mob/living/carbon/true_devil/canUseTopic(atom/movable/M, be_close=FALSE, no_dexterity=FALSE, no_tk=FALSE)
- if(incapacitated())
- to_chat(src, "You can't do that right now!")
- return FALSE
- if(be_close && !in_range(M, src))
- to_chat(src, "You are too far away!")
- return FALSE
- return TRUE
-
-/mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null)
- return 666
-
-/mob/living/carbon/true_devil/soundbang_act()
- return 0
-
-/mob/living/carbon/true_devil/get_ear_protection()
- return 2
-
-
-/mob/living/carbon/true_devil/attacked_by(obj/item/I, mob/living/user, def_zone)
- apply_damage(I.force, I.damtype, def_zone)
- var/message_verb = ""
- if(I.attack_verb && I.attack_verb.len)
- message_verb = "[pick(I.attack_verb)]"
- else if(I.force)
- message_verb = "attacked"
-
- var/attack_message = "[src] has been [message_verb] with [I]."
- if(user)
- user.do_attack_animation(src)
- if(user in viewers(src, null))
- attack_message = "[user] has [message_verb] [src] with [I]!"
- if(message_verb)
- visible_message("[attack_message]",
- "[attack_message]", null, COMBAT_MESSAGE_RANGE)
- return TRUE
-
-/mob/living/carbon/true_devil/singularity_act()
- if(ascended)
- return 0
- return ..()
-
-//ATTACK GHOST IGNORING PARENT RETURN VALUE
-/mob/living/carbon/true_devil/attack_ghost(mob/dead/observer/user as mob)
- if(ascended || user.mind.soulOwner == src.mind)
- var/mob/living/simple_animal/imp/S = new(get_turf(loc))
- S.key = user.key
- var/datum/antagonist/imp/A = new()
- S.mind.add_antag_datum(A)
- to_chat(S, S.playstyle_string)
- else
- return ..()
-
-/mob/living/carbon/true_devil/can_be_revived()
- return 1
-
-/mob/living/carbon/true_devil/resist_fire()
- //They're immune to fire.
-
-/mob/living/carbon/true_devil/attack_hand(mob/living/carbon/human/M)
- . = ..()
- if(.)
- switch(M.a_intent)
- if ("harm")
- var/damage = rand(1, 5)
- playsound(loc, "punch", 25, TRUE, -1)
- visible_message("[M] punches [src]!", \
- "[M] punches you!")
- adjustBruteLoss(damage)
- log_combat(M, src, "attacked")
- updatehealth()
- if ("disarm")
- if (!(mobility_flags & MOBILITY_STAND) && !ascended) //No stealing the arch devil's pitchfork.
- if (prob(5))
- Unconscious(40)
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
- log_combat(M, src, "pushed")
- visible_message("[M] pushes [src] down!", \
- "[M] pushes you down!")
- else
- if (prob(25))
- dropItemToGround(get_active_held_item())
- playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)
- visible_message("[M] disarms [src]!", \
- "[M] disarms you!")
- else
- playsound(loc, 'sound/weapons/punchmiss.ogg', 25, TRUE, -1)
- visible_message("[M] fails to disarm [src]!", \
- "[M] fails to disarm you!")
-
-/mob/living/carbon/true_devil/handle_breathing()
- // devils do not need to breathe
-
-/mob/living/carbon/true_devil/is_literate()
- return TRUE
-
-/mob/living/carbon/true_devil/ex_act(severity, ex_target)
- if(!ascended)
- var/b_loss
- switch (severity)
- if (EXPLODE_DEVASTATE)
- b_loss = 500
- if (EXPLODE_HEAVY)
- b_loss = 150
- if (EXPLODE_LIGHT)
- b_loss = 30
- adjustBruteLoss(b_loss)
- return ..()
-
-
-/mob/living/carbon/true_devil/update_body() //we don't use the bodyparts layer for devils.
- return
-
-/mob/living/carbon/true_devil/update_body_parts()
- return
-
-/mob/living/carbon/true_devil/update_damage_overlays() //devils don't have damage overlays.
- return
diff --git a/code/modules/antagonists/devil/true_devil/inventory.dm b/code/modules/antagonists/devil/true_devil/inventory.dm
deleted file mode 100644
index a3d0dbdf582b..000000000000
--- a/code/modules/antagonists/devil/true_devil/inventory.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/mob/living/carbon/true_devil/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, silent = FALSE)
- if(..())
- update_inv_hands()
- return 1
- return 0
-
-/mob/living/carbon/true_devil/update_inv_hands()
- //TODO LORDPIDEY: Figure out how to make the hands line up properly. the l/r_hand_overlay should use the down sprite when facing down, left, or right, and the up sprite when facing up.
- remove_overlay(DEVIL_HANDS_LAYER)
- var/list/hands_overlays = list()
- var/obj/item/l_hand = get_item_for_held_index(1) //hardcoded 2-hands only, for now.
- var/obj/item/r_hand = get_item_for_held_index(2)
-
- if(r_hand)
- var/mutable_appearance/r_hand_overlay = r_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = r_hand.righthand_file, isinhands = TRUE)
-
- hands_overlays += r_hand_overlay
-
- if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
- r_hand.layer = ABOVE_HUD_LAYER
- r_hand.plane = ABOVE_HUD_PLANE
- r_hand.screen_loc = ui_hand_position(get_held_index_of_item(r_hand))
- client.screen |= r_hand
-
- if(l_hand)
- var/mutable_appearance/l_hand_overlay = l_hand.build_worn_icon(default_layer = DEVIL_HANDS_LAYER, default_icon_file = l_hand.lefthand_file, isinhands = TRUE)
-
- hands_overlays += l_hand_overlay
-
- if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD)
- l_hand.layer = ABOVE_HUD_LAYER
- l_hand.plane = ABOVE_HUD_PLANE
- l_hand.screen_loc = ui_hand_position(get_held_index_of_item(l_hand))
- client.screen |= l_hand
- if(hands_overlays.len)
- devil_overlays[DEVIL_HANDS_LAYER] = hands_overlays
- apply_overlay(DEVIL_HANDS_LAYER)
-
-/mob/living/carbon/true_devil/remove_overlay(cache_index)
- var/I = devil_overlays[cache_index]
- if(I)
- cut_overlay(I)
- devil_overlays[cache_index] = null
-
-
-/mob/living/carbon/true_devil/apply_overlay(cache_index)
- if((. = devil_overlays[cache_index]))
- add_overlay(.)
diff --git a/code/modules/antagonists/disease/disease_datum.dm b/code/modules/antagonists/disease/disease_datum.dm
index cb0cc12be0b4..d96e39733efd 100644
--- a/code/modules/antagonists/disease/disease_datum.dm
+++ b/code/modules/antagonists/disease/disease_datum.dm
@@ -86,13 +86,3 @@
/datum/objective/disease_infect_centcom
explanation_text = "Ensure that at least one infected host escapes on the shuttle or an escape pod."
-
-/datum/objective/disease_infect_centcom/check_completion()
- var/mob/camera/disease/D = owner.current
- if(!istype(D))
- return FALSE
- for(var/V in D.hosts)
- var/mob/living/L = V
- if(L.onCentCom() || L.onSyndieBase())
- return TRUE
- return FALSE
diff --git a/code/modules/antagonists/gang/gang.dm b/code/modules/antagonists/gang/gang.dm
index df962f83e814..a1b493b87b75 100644
--- a/code/modules/antagonists/gang/gang.dm
+++ b/code/modules/antagonists/gang/gang.dm
@@ -112,7 +112,6 @@
/obj/item/clothing/under/color/darkgreen,
/obj/item/clothing/neck/scarf/green,
/obj/item/clothing/head/beanie/green,
- /obj/item/clothing/suit/poncho/green,
/obj/item/clothing/mask/bandana/green)
free_clothes = list(/obj/item/clothing/mask/bandana/green,
/obj/item/clothing/under/color/darkgreen,
@@ -286,15 +285,11 @@
gang_id = "YAK"
acceptable_clothes = list(/obj/item/clothing/head/soft/yellow,
/obj/item/clothing/under/costume/yakuza,
- /obj/item/clothing/shoes/yakuza,
/obj/item/clothing/neck/scarf/yellow,
/obj/item/clothing/head/beanie/yellow,
/obj/item/clothing/mask/bandana/gold,
- /obj/item/clothing/head/hardhat,
- /obj/item/clothing/suit/yakuza)
+ /obj/item/clothing/head/hardhat)
free_clothes = list(/obj/item/clothing/under/costume/yakuza,
- /obj/item/clothing/shoes/yakuza,
- /obj/item/clothing/suit/yakuza,
/obj/item/clothing/head/hardhat,
/obj/item/toy/crayon/spraycan)
gang_objective = "The boss is thrilled about this new construction opportunity we've all been given, yadda yadda, look, he knows we're here to expand our business ventures for the clan, but Majima wanted it made VERY clear that we do NOT fuck this station's infrastructure up. If more than 15% of this station is busted when we get the hell out of here, it's your ass on the line."
@@ -310,12 +305,8 @@
gang_id = "JB"
acceptable_clothes = list(/obj/item/clothing/head/soft/blue,
/obj/item/clothing/under/costume/jackbros,
- /obj/item/clothing/shoes/jackbros,
- /obj/item/clothing/head/jackbros,
/obj/item/clothing/mask/bandana/blue)
free_clothes = list(/obj/item/clothing/under/costume/jackbros,
- /obj/item/clothing/shoes/jackbros,
- /obj/item/clothing/head/jackbros,
/obj/item/toy/crayon/spraycan)
gang_objective = "Hee-hello friends! We need to expand our influence, ho! Get a King Frost in as the Captain of this joint! Either get the original Captain on board with the program, or Hee-ho a fellow Jack Frost into the position yourselves!"
antag_hud_name = "JackFrost"
diff --git a/code/modules/antagonists/gang/outfits.dm b/code/modules/antagonists/gang/outfits.dm
index ae16ec956470..f76bf026e12c 100644
--- a/code/modules/antagonists/gang/outfits.dm
+++ b/code/modules/antagonists/gang/outfits.dm
@@ -23,7 +23,6 @@
glasses = /obj/item/clothing/glasses/hud/spacecop
ears = /obj/item/radio/headset/headset_sec
mask = null
- head = /obj/item/clothing/head/spacepolice
belt = /obj/item/gun/ballistic/automatic/pistol/candor
r_pocket = /obj/item/lighter
l_pocket = /obj/item/restraints/handcuffs
@@ -31,10 +30,7 @@
backpack_contents = list(/obj/item/storage/box/handcuffs = 1,
/obj/item/storage/box/teargas = 1,
/obj/item/storage/box/flashbangs = 1,
- /obj/item/shield/riot/tele = 1,
- /obj/item/ammo_box/magazine/m45 = 3,
- /obj/item/ammo_box/c45 = 2)
-
+ /obj/item/shield/riot/tele = 1)
/datum/outfit/families_police/beatcop/armored
name = "Families: Armored Beat Cop"
@@ -54,8 +50,7 @@
backpack_contents = list(/obj/item/storage/box/handcuffs = 1,
/obj/item/storage/box/teargas = 1,
/obj/item/storage/box/flashbangs = 1,
- /obj/item/shield/riot/tele = 1,
- /obj/item/storage/box/lethalshot = 2)
+ /obj/item/shield/riot/tele = 1)
/datum/outfit/families_police/beatcop/fbi
name = "Families: Space FBI Officer"
@@ -66,8 +61,7 @@
/obj/item/storage/box/teargas = 1,
/obj/item/storage/box/flashbangs = 1,
/obj/item/shield/riot/tele = 1,
- /obj/item/ammo_box/magazine/smgm9mm = 3,
- /obj/item/ammo_box/c9mm = 2)
+ /obj/item/ammo_box/magazine/smgm9mm = 3)
/datum/outfit/families_police/beatcop/military
name = "Families: Space Military"
diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
index 4fcceb227a77..8fbb858da103 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm
@@ -99,9 +99,6 @@
if(GLOB.player_list.len < CHALLENGE_MIN_PLAYERS)
to_chat(user, "The enemy crew is too small to be worth declaring war on.")
return FALSE
- if(!user.onSyndieBase())
- to_chat(user, "You have to be at your base to use this.")
- return FALSE
if(world.time-SSticker.round_start_time > CHALLENGE_TIME_LIMIT)
to_chat(user, "It's too late to declare hostilities. Your benefactors are already busy with other schemes. You'll have to make do with what you have on hand.")
return FALSE
diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
index 9c65e50130cf..af4b5bd60892 100644
--- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
+++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm
@@ -473,8 +473,6 @@
off_station = NUKE_NEAR_MISS
if((bomb_location.x < (128-NUKERANGE)) || (bomb_location.x > (128+NUKERANGE)) || (bomb_location.y < (128-NUKERANGE)) || (bomb_location.y > (128+NUKERANGE)))
off_station = NUKE_NEAR_MISS
- else if(bomb_location.onSyndieBase())
- off_station = NUKE_SYNDICATE_BASE
else
off_station = NUKE_MISS_STATION
@@ -608,7 +606,7 @@ This is here to make the tiles around the station mininuke change when it's arme
/obj/item/disk/nuclear/Initialize()
. = ..()
- AddElement(/datum/element/bed_tuckable, 6, -6, 0)
+ AddElement(/datum/element/bed_tuckable, 6, -6, 0, FALSE, FALSE)
if(!fake)
SSpoints_of_interest.make_point_of_interest(src)
diff --git a/code/modules/antagonists/revenant/revenant_abilities.dm b/code/modules/antagonists/revenant/revenant_abilities.dm
index ca568bce6316..c623376dbdac 100644
--- a/code/modules/antagonists/revenant/revenant_abilities.dm
+++ b/code/modules/antagonists/revenant/revenant_abilities.dm
@@ -248,7 +248,7 @@
qdel(B)
new /obj/effect/temp_visual/revenant(T)
- if(!isplatingturf(T) && !istype(T, /turf/open/floor/engine/cult) && isfloorturf(T) && prob(15))
+ if(!isplatingturf(T) && isfloorturf(T) && prob(15))
var/turf/open/floor/floor = T
if(floor.intact && floor.floor_tile)
new floor.floor_tile(floor)
diff --git a/code/modules/antagonists/santa/santa.dm b/code/modules/antagonists/santa/santa.dm
index 996a53f316dc..59c4afa6995b 100644
--- a/code/modules/antagonists/santa/santa.dm
+++ b/code/modules/antagonists/santa/santa.dm
@@ -17,11 +17,6 @@
to_chat(owner, "You are Santa! Your objective is to bring joy to the people on this station. You have a magical bag, which generates presents as long as you have it! You can examine the presents to take a peek inside, to make sure that you give the right gift to the right person.")
/datum/antagonist/santa/proc/give_equipment()
- var/mob/living/carbon/human/H = owner.current
- if(istype(H))
- H.equipOutfit(/datum/outfit/santa)
- H.dna.update_dna_identity()
-
owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport/santa)
/datum/antagonist/santa/proc/give_objective()
diff --git a/code/modules/antagonists/swarmer/swarmer.dm b/code/modules/antagonists/swarmer/swarmer.dm
deleted file mode 100644
index ea6fe83c8a07..000000000000
--- a/code/modules/antagonists/swarmer/swarmer.dm
+++ /dev/null
@@ -1,677 +0,0 @@
-////Deactivated swarmer shell////
-/obj/item/deactivated_swarmer
- name = "deactivated swarmer"
- desc = "A shell of swarmer that was completely powered down. It can no longer activate itself."
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer_unactivated"
- custom_materials = list(/datum/material/iron=10000, /datum/material/glass=4000)
-
-/obj/effect/mob_spawn/swarmer
- name = "unactivated swarmer"
- desc = "A currently unactivated swarmer. Swarmers can self activate at any time, so it would be wise to immediately dispose of this."
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer_unactivated"
- density = FALSE
- anchored = FALSE
-
- mob_type = /mob/living/simple_animal/hostile/swarmer
- mob_name = "a swarmer"
- death = FALSE
- roundstart = FALSE
- short_desc = "You are a swarmer, a weapon of a long dead civilization."
- flavour_text = {"
- You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate.
- Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful.
- Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage.
- Objectives:
- 1. Consume resources and replicate until there are no more resources left.
- 2. Ensure that this location is fit for invasion at a later date; do not perform actions that would render it dangerous or inhospitable.
- 3. Biological resources will be harvested at a later date; do not harm them.
- "}
-
-/obj/effect/mob_spawn/swarmer/Initialize()
- . = ..()
- var/area/A = get_area(src)
- if(A)
- notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE)
-
-/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.")
-
-/obj/effect/mob_spawn/swarmer/attackby(obj/item/W, mob/user, params)
- if(W.tool_behaviour == TOOL_SCREWDRIVER && user.a_intent != INTENT_HARM)
- user.visible_message("[usr.name] deactivates [src].",
- "After some fiddling, you find a way to disable [src]'s power source.",
- "You hear clicking.")
- new /obj/item/deactivated_swarmer(get_turf(src))
- qdel(src)
- else
- ..()
-
-////The Mob itself////
-
-/mob/living/simple_animal/hostile/swarmer
- name = "Swarmer"
- unique_name = 1
- icon = 'icons/mob/swarmer.dmi'
- desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely."
- speak_emote = list("tones")
- initial_language_holder = /datum/language_holder/swarmer
- bubble_icon = "swarmer"
- mob_biotypes = MOB_ROBOTIC
- health = 40
- maxHealth = 40
- status_flags = CANPUSH
- icon_state = "swarmer"
- icon_living = "swarmer"
- icon_dead = "swarmer_unactivated"
- icon_gib = null
- wander = 0
- harm_intent_damage = 5
- minbodytemp = 0
- maxbodytemp = 500
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- unsuitable_atmos_damage = 0
- melee_damage_lower = 15
- melee_damage_upper = 15
- melee_damage_type = STAMINA
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
- hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD)
- obj_damage = 0
- environment_smash = ENVIRONMENT_SMASH_NONE
- attack_verb_continuous = "shocks"
- attack_verb_simple = "shock"
- attack_sound = 'sound/effects/empulse.ogg'
- friendly_verb_continuous = "pinches"
- friendly_verb_simple = "pinch"
- speed = 0
- faction = list("swarmer")
- AIStatus = AI_OFF
- pass_flags = PASSTABLE
- mob_size = MOB_SIZE_TINY
- ventcrawler = VENTCRAWLER_ALWAYS
- ranged = 1
- projectiletype = /obj/projectile/beam/disabler
- ranged_cooldown_time = 20
- projectilesound = 'sound/weapons/taser2.ogg'
- loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal)
- del_on_death = 1
- deathmessage = "explodes with a sharp pop!"
- light_color = LIGHT_COLOR_CYAN
- hud_type = /datum/hud/swarmer
- speech_span = SPAN_ROBOT
- var/resources = 0 //Resource points, generated by consuming metal/glass
- var/max_resources = 100
-
-/mob/living/simple_animal/hostile/swarmer/Initialize()
- . = ..()
- verbs -= /mob/living/verb/pulled
- for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds)
- diag_hud.add_to_hud(src)
-
-/mob/living/simple_animal/hostile/swarmer/med_hud_set_health()
- var/image/holder = hud_list[DIAG_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "huddiag[RoundDiagBar(health/maxHealth)]"
-
-/mob/living/simple_animal/hostile/swarmer/med_hud_set_status()
- var/image/holder = hud_list[DIAG_STAT_HUD]
- var/icon/I = icon(icon, icon_state, dir)
- holder.pixel_y = I.Height() - world.icon_size
- holder.icon_state = "hudstat"
-
-/mob/living/simple_animal/hostile/swarmer/Stat()
- ..()
- if(statpanel("Status"))
- stat("Resources:",resources)
-
-/mob/living/simple_animal/hostile/swarmer/emp_act()
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- if(health > 1)
- adjustHealth(health-1)
- else
- death()
-
-/mob/living/simple_animal/hostile/swarmer/CanAllowThrough(atom/movable/O)
- . = ..()
- if(istype(O, /obj/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other
- return TRUE
- if(isswarmer(O))
- return TRUE
-
-////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////
-/mob/living/simple_animal/hostile/swarmer/AttackingTarget()
- if(!isliving(target))
- return target.swarmer_act(src)
- else
- return ..()
-
-/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A)
- face_atom(A)
- if(!isturf(loc))
- return
- if(next_move > world.time)
- return
- if(!A.Adjacent(src))
- return
- A.swarmer_act(src)
-
-/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded.
-
-/obj/effect/mob_spawn/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.Integrate(src)
- return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances.
-
-/obj/effect/mob_spawn/swarmer/IntegrateAmount()
- return 50
-
-/turf/closed/indestructible/swarmer_act()
- return FALSE
-
-/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- if(resistance_flags & INDESTRUCTIBLE)
- return FALSE
- for(var/mob/living/L in contents)
- if(!issilicon(L) && !isbrain(L))
- to_chat(S, "An organism has been detected inside this object. Aborting.")
- return FALSE
- return ..()
-
-/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- return S.Integrate(src)
-
-/atom/movable/proc/IntegrateAmount()
- return 0
-
-/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item
- if(custom_materials)
- if(custom_materials[SSmaterials.GetMaterialRef(/datum/material/iron)] || custom_materials[SSmaterials.GetMaterialRef(/datum/material/glass)])
- return 1
- return ..()
-
-/obj/item/gun/swarmer_act()//Stops you from eating the entire armory
- return FALSE
-
-/turf/open/swarmer_act()//ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor
- return FALSE
-
-/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act()
- return FALSE
-
-/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- if(S.AIStatus == AI_ON)
- return FALSE
- else
- return ..()
-
-/obj/effect/swarmer_act()
- return FALSE
-
-/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- qdel(src)
- return TRUE
-
-/obj/structure/flora/swarmer_act()
- return FALSE
-
-/turf/open/lava/swarmer_act()
- if(!is_safe())
- new /obj/structure/lattice/catwalk/swarmer_catwalk(src)
- return FALSE
-
-/obj/machinery/atmospherics/swarmer_act()
- return FALSE
-
-/obj/structure/disposalpipe/swarmer_act()
- return FALSE
-
-/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DismantleMachine(src)
- return TRUE
-
-/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- var/isonshuttle = istype(get_area(src), /area/shuttle)
- for(var/turf/T in range(1, src))
- var/area/A = get_area(T)
- if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle)))
- to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.")
- S.LoseTarget()
- return FALSE
- else if(istype(A, /area/ship/engineering/engine))
- to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")
- S.LoseTarget()
- return FALSE
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- if(!QDELETED(S)) //If it got blown up no need to turn it off.
- toggle_cam(S, 0)
- return TRUE
-
-/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisIntegrate(src)
- return TRUE
-
-/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.")
- return FALSE
-
-/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.")
- return FALSE
-
-/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.")
- return FALSE
-
-/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Destroying this object would cause a chain reaction. Aborting.")
- return FALSE
-
-/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
- return FALSE
-
-/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.")
- return FALSE
-
-/obj/machinery/telecomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.")
- return FALSE
-
-/obj/machinery/deepfryer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This kitchen appliance should be preserved, it will make delicious unhealthy snacks for our masters in the future. Aborting.")
- return FALSE
-
-/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
- return FALSE
-
-/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This bluespace source will be important to us later. Aborting.")
- return FALSE
-
-/turf/closed/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- var/isonshuttle = istype(loc, /area/shuttle)
- for(var/turf/T in range(1, src))
- var/area/A = get_area(T)
- if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle)))
- to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.")
- S.LoseTarget()
- return TRUE
- else if(istype(A, /area/ship/engineering/engine))
- to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")
- S.LoseTarget()
- return TRUE
- return ..()
-
-/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- var/isonshuttle = istype(get_area(src), /area/shuttle)
- for(var/turf/T in range(1, src))
- var/area/A = get_area(T)
- if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle)))
- to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.")
- S.LoseTarget()
- return TRUE
- else if(istype(A, /area/ship/engineering/engine))
- to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.")
- S.LoseTarget()
- return TRUE
- return ..()
-
-/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource
- to_chat(S, "This object does not contain enough materials to work with.")
- return FALSE
-
-/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")
- return FALSE
-
-/obj/machinery/porta_turret_cover/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.")
- return FALSE
-
-/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- S.DisperseTarget(src)
- return TRUE
-
-/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.")
- return FALSE
-
-/obj/machinery/droneDispenser/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This object is receiving unactivated swarmer shells to help us. Aborting.")
- return FALSE
-
-/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- . = ..()
- var/turf/here = get_turf(src)
- for(var/A in here.contents)
- var/obj/structure/cable/C = A
- if(istype(C))
- to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.")
- return FALSE
-
-/obj/item/deactivated_swarmer/IntegrateAmount()
- return 50
-
-/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This object does not contain enough materials to work with.")
- return FALSE
-
-/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Destroying this object would cause a catastrophic chain reaction. Aborting.")
- return FALSE
-
-/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This object does not contain solid matter. Aborting.")
- return FALSE
-
-/obj/machinery/power/shieldwallgen/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "Destroying this object would have an unpredictable effect on structure integrity. Aborting.")
- return FALSE
-
-/obj/machinery/shieldwall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
- to_chat(S, "This object does not contain solid matter. Aborting.")
- return FALSE
-
-////END CTRL CLICK FOR SWARMERS////
-
-/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object,fabrication_cost = 0)
- if(!isturf(loc))
- to_chat(src, "This is not a suitable location for fabrication. We need more space.")
- if(resources >= fabrication_cost)
- resources -= fabrication_cost
- else
- to_chat(src, "You do not have the necessary resources to fabricate this object.")
- return
- return new fabrication_object(loc)
-
-/mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target)
- var/resource_gain = target.IntegrateAmount()
- if(resources + resource_gain > max_resources)
- to_chat(src, "We cannot hold more materials!")
- return TRUE
- if(resource_gain)
- resources += resource_gain
- do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
- var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target))
- I.pixel_x = target.pixel_x
- I.pixel_y = target.pixel_y
- I.pixel_z = target.pixel_z
- if(istype(target, /obj/item/stack))
- var/obj/item/stack/S = target
- S.use(1)
- if(S.amount)
- return TRUE
- qdel(target)
- return TRUE
- else
- to_chat(src, "[target] is incompatible with our internal matter recycler.")
- return FALSE
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target)
- new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
- do_attack_animation(target)
- changeNext_move(CLICK_CD_MELEE)
- SSexplosions.lowobj += target
-
-/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target)
- if(target == src)
- return
-
- to_chat(src, "Attempting to remove this being from our presence.")
-
- if(!do_after(src, 3 SECONDS, target))
- return
-
- var/turf/open/floor/F
- F = find_safe_turf(zlevels = z, extended_safety_checks = TRUE)
-
- if(!F)
- return
- // If we're getting rid of a human, slap some energy cuffs on
- // them to keep them away from us a little longer
-
- var/mob/living/carbon/human/H = target
- if(ishuman(target) && (!H.handcuffed))
- H.handcuffed = new /obj/item/restraints/handcuffs/energy/used(H)
- H.update_handcuffed()
- log_combat(src, H, "handcuffed")
-
- var/datum/effect_system/spark_spread/S = new
- S.set_up(4,0,get_turf(target))
- S.start()
- playsound(src,'sound/effects/sparks4.ogg',50,TRUE)
- do_teleport(target, F, 0, channel = TELEPORT_CHANNEL_BLUESPACE)
-
-/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
- if(!(flags & SHOCK_TESLA))
- return FALSE
- return ..()
-
-/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target)
- do_attack_animation(target)
- to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.")
- var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target))
- D.pixel_x = target.pixel_x
- D.pixel_y = target.pixel_y
- D.pixel_z = target.pixel_z
- if(do_after(src, 10 SECONDS, target))
- to_chat(src, "Dismantling complete.")
- var/atom/Tsec = target.drop_location()
- new /obj/item/stack/sheet/metal(Tsec, 5)
- for(var/obj/item/I in target.component_parts)
- I.forceMove(Tsec)
- var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target))
- N.pixel_x = target.pixel_x
- N.pixel_y = target.pixel_y
- N.pixel_z = target.pixel_z
- target.dropContents()
- if(istype(target, /obj/machinery/computer))
- var/obj/machinery/computer/C = target
- if(C.circuit)
- C.circuit.forceMove(Tsec)
- qdel(target)
-
-
-/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects
- icon = 'icons/mob/swarmer.dmi'
- layer = BELOW_MOB_LAYER
-
-/obj/effect/temp_visual/swarmer/disintegration
- icon_state = "disintegrate"
- duration = 10
-
-/obj/effect/temp_visual/swarmer/disintegration/Initialize()
- . = ..()
- playsound(loc, "sparks", 100, TRUE)
-
-/obj/effect/temp_visual/swarmer/dismantle
- icon_state = "dismantle"
- duration = 25
-
-/obj/effect/temp_visual/swarmer/integrate
- icon_state = "integrate"
- duration = 5
-
-/obj/structure/swarmer //Default swarmer effect object visual feedback
- name = "swarmer ui"
- desc = null
- gender = NEUTER
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "ui_light"
- layer = MOB_LAYER
- resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
- light_color = LIGHT_COLOR_CYAN
- max_integrity = 30
- anchored = TRUE
- var/lon_range = 1
-
-/obj/structure/swarmer/Initialize(mapload)
- . = ..()
- set_light(lon_range)
-
-/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
- switch(damage_type)
- if(BRUTE)
- playsound(src, 'sound/weapons/egloves.ogg', 80, TRUE)
- if(BURN)
- playsound(src, 'sound/items/welder.ogg', 100, TRUE)
-
-/obj/structure/swarmer/emp_act()
- . = ..()
- if(. & EMP_PROTECT_SELF)
- return
- qdel(src)
-
-/obj/structure/swarmer/trap
- name = "swarmer trap"
- desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough."
- icon_state = "trap"
- max_integrity = 10
- density = FALSE
-
-/obj/structure/swarmer/trap/Initialize(mapload)
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/swarmer/trap/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- if(isliving(AM))
- var/mob/living/L = AM
- if(!istype(L, /mob/living/simple_animal/hostile/swarmer))
- playsound(loc,'sound/effects/snap.ogg',50, TRUE, -1)
- L.electrocute_act(0, src, 1, flags = SHOCK_NOGLOVES|SHOCK_ILLUSION)
- if(iscyborg(L))
- L.Paralyze(100)
- qdel(src)
-
-/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()
- set name = "Create trap"
- set category = "Swarmer"
- set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources."
- if(locate(/obj/structure/swarmer/trap) in loc)
- to_chat(src, "There is already a trap here. Aborting.")
- return
- Fabricate(/obj/structure/swarmer/trap, 5)
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade()
- set name = "Create barricade"
- set category = "Swarmer"
- set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through."
- if(locate(/obj/structure/swarmer/blockade) in loc)
- to_chat(src, "There is already a blockade here. Aborting.")
- return
- if(resources < 5)
- to_chat(src, "We do not have the resources for this!")
- return
- if(do_after(src, 1 SECONDS))
- Fabricate(/obj/structure/swarmer/blockade, 5)
-
-
-/obj/structure/swarmer/blockade
- name = "swarmer blockade"
- desc = "A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through."
- icon_state = "barricade"
- light_range = MINIMUM_USEFUL_LIGHT_RANGE
- max_integrity = 50
-
-/obj/structure/swarmer/blockade/CanAllowThrough(atom/movable/O)
- . = ..()
- if(isswarmer(O))
- return TRUE
- if(istype(O, /obj/projectile/beam/disabler))
- return TRUE
-
-/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer()
- set name = "Replicate"
- set category = "Swarmer"
- set desc = "Creates a shell for a new swarmer. Swarmers will self activate."
- to_chat(src, "We are attempting to replicate ourselves. We will need to stand still until the process is complete.")
- if(resources < 50)
- to_chat(src, "We do not have the resources for this!")
- return
- if(!isturf(loc))
- to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.")
- return
- if(do_after(src, 10 SECONDS))
- var/createtype = SwarmerTypeToCreate()
- if(createtype && Fabricate(createtype, 50))
- playsound(loc,'sound/items/poster_being_created.ogg',50, TRUE, -1)
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/SwarmerTypeToCreate()
- return /obj/effect/mob_spawn/swarmer
-
-
-/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf()
- set name = "Self Repair"
- set category = "Swarmer"
- set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete."
- if(!isturf(loc))
- return
- to_chat(src, "Attempting to repair damage to our body, stand by...")
- if(do_after(src, 10 SECONDS))
- adjustHealth(-100)
- to_chat(src, "We successfully repaired ourselves.")
-
-/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight()
- if(!light_range)
- set_light(3)
- else
- set_light(0)
-
-/mob/living/simple_animal/hostile/swarmer/proc/swarmer_chat(msg)
- var/rendered = "Swarm communication - [src] [say_quote(msg)]"
- for(var/i in GLOB.mob_list)
- var/mob/M = i
- if(isswarmer(M))
- to_chat(M, rendered)
- if(isobserver(M))
- var/link = FOLLOW_LINK(M, src)
- to_chat(M, "[link] [rendered]")
-
-/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers()
- var/message = stripped_input(src, "Announce to other swarmers", "Swarmer contact")
- // TODO get swarmers their own colour rather than just boldtext
- if(message)
- swarmer_chat(message)
diff --git a/code/modules/antagonists/swarmer/swarmer_event.dm b/code/modules/antagonists/swarmer/swarmer_event.dm
deleted file mode 100644
index e086485a49cf..000000000000
--- a/code/modules/antagonists/swarmer/swarmer_event.dm
+++ /dev/null
@@ -1,28 +0,0 @@
-/datum/round_event_control/spawn_swarmer
- name = "Spawn Swarmer Shell"
- typepath = /datum/round_event/spawn_swarmer
- weight = 7
- max_occurrences = 1 //Only once okay fam
- earliest_start = 30 MINUTES
- min_players = 15
-
-
-/datum/round_event/spawn_swarmer
-
-/datum/round_event/spawn_swarmer/start()
- if(find_swarmer())
- return 0
- if(!GLOB.the_gateway)
- return 0
- new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway))
- if(prob(25)) //25% chance to announce it to the crew
- var/swarmer_report = "[command_name()] High-Priority Update"
- swarmer_report += "
Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come through."
- print_command_report(swarmer_report, announce=TRUE)
-
-/datum/round_event/spawn_swarmer/proc/find_swarmer()
- for(var/i in GLOB.mob_living_list)
- var/mob/living/L = i
- if(istype(L, /mob/living/simple_animal/hostile/swarmer) && L.client) //If there is a swarmer with an active client, we've found our swarmer
- return 1
- return 0
diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm
index ae651cf055e6..b50c6dc1ea8b 100644
--- a/code/modules/antagonists/wizard/equipment/artefact.dm
+++ b/code/modules/antagonists/wizard/equipment/artefact.dm
@@ -257,7 +257,6 @@
var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire)
H.equip_to_slot_or_del(new hat(H), ITEM_SLOT_HEAD)
H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), ITEM_SLOT_ICLOTHING)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), ITEM_SLOT_FEET)
H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
H.put_in_hands(new /obj/item/melee/sword/claymore(H), TRUE)
H.equip_to_slot_or_del(new /obj/item/melee/spear(H), ITEM_SLOT_BACK)
diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm
deleted file mode 100644
index c426b953f725..000000000000
--- a/code/modules/antagonists/wizard/equipment/soulstone.dm
+++ /dev/null
@@ -1,354 +0,0 @@
-/obj/item/soulstone
- name = "soulstone shard"
- icon = 'icons/obj/wizard.dmi'
- icon_state = "soulstone"
- item_state = "electronic"
- lefthand_file = 'icons/mob/inhands/misc/devices_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/devices_righthand.dmi'
- layer = HIGH_OBJ_LAYER
- desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefact's power."
- w_class = WEIGHT_CLASS_TINY
- slot_flags = ITEM_SLOT_BELT
- var/usability = FALSE
-
- var/old_shard = FALSE
- var/spent = FALSE
- var/purified = FALSE
-
-/obj/item/soulstone/proc/was_used()
- if(old_shard)
- spent = TRUE
- name = "dull [name]"
- desc = "A fragment of the legendary treasure known simply as \
- the 'Soul Stone'. The shard lies still, dull and lifeless; \
- whatever spark it once held long extinguished."
-
-/obj/item/soulstone/anybody
- usability = TRUE
-
-/obj/item/soulstone/anybody/revolver
- old_shard = TRUE
-
-/obj/item/soulstone/anybody/purified
- icon = 'icons/obj/wizard.dmi'
- icon_state = "purified_soulstone"
- purified = TRUE
-
-/obj/item/soulstone/anybody/chaplain
- name = "mysterious old shard"
- old_shard = TRUE
-
-/obj/item/soulstone/pickup(mob/living/user)
- ..()
- if(!iscultist(user) && !iswizard(user) && !usability)
- to_chat(user, "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.")
-
-/obj/item/soulstone/examine(mob/user)
- . = ..()
- if(usability || iscultist(user) || iswizard(user) || isobserver(user))
- if (old_shard)
- . += "A soulstone, used to capture a soul, either from dead humans or from freed shades."
- else
- . += "A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades."
- . += "The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade."
- if(spent)
- . += "This shard is spent; it is now just a creepy rock."
-
-/obj/item/soulstone/Destroy() //Stops the shade from being qdel'd immediately and their ghost being sent back to the arrival shuttle.
- for(var/mob/living/simple_animal/shade/A in src)
- A.death()
- return ..()
-
-/obj/item/soulstone/proc/hot_potato(mob/living/user)
- to_chat(user, "Holy magics residing in \the [src] burn your hand!")
- var/obj/item/bodypart/affecting = user.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm")
- affecting.receive_damage(0, 10) // 10 burn damage
- user.emote("scream")
- user.update_damage_overlays()
- user.dropItemToGround(src)
-
-//////////////////////////////Capturing////////////////////////////////////////////////////////
-
-/obj/item/soulstone/attack(mob/living/carbon/human/M, mob/living/user)
- if(!iscultist(user) && !iswizard(user) && !usability)
- user.Unconscious(100)
- to_chat(user, "Your body is wracked with debilitating pain!")
- return
- if(spent)
- to_chat(user, "There is no power left in the shard.")
- return
- if(!ishuman(M))//If target is not a human.
- return ..()
- if((M.mind && !M.mind.hasSoul) || is_devil(M))
- to_chat(user, "This... thing has no soul! It's filled with evil!")
- return
- if(iscultist(M))
- if(iscultist(user))
- to_chat(user, "\"Come now, do not capture your bretheren's soul.\"")
- return
- if(purified && iscultist(user))
- hot_potato(user)
- return
- log_combat(user, M, "captured [M.name]'s soul", src)
- transfer_soul("VICTIM", M, user)
-
-///////////////////Options for using captured souls///////////////////////////////////////
-
-/obj/item/soulstone/attack_self(mob/living/user)
- if(!in_range(src, user))
- return
- if(!iscultist(user) && !iswizard(user) && !usability)
- user.Unconscious(100)
- to_chat(user, "Your body is wracked with debilitating pain!")
- return
- if(purified && iscultist(user))
- hot_potato(user)
- return
- release_shades(user)
-
-/obj/item/soulstone/proc/release_shades(mob/user)
- for(var/mob/living/simple_animal/shade/A in src)
- A.forceMove(get_turf(user))
- A.cancel_camera()
- if(purified)
- icon_state = "purified_soulstone"
- A.icon_state = "shade_angelic"
- A.name = "Purified [initial(A.name)]"
- else
- icon_state = "soulstone"
- name = initial(name)
- if(iswizard(user) || usability)
- to_chat(A, "You have been released from your prison, but you are still bound to [user.real_name]'s will. Help [user.p_them()] succeed in [user.p_their()] goals at all costs.")
- else if(iscultist(user))
- to_chat(A, "You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.")
- was_used()
-
-///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
-/obj/structure/constructshell
- name = "empty shell"
- icon = 'icons/obj/wizard.dmi'
- icon_state = "construct_cult"
- desc = "A wicked machine used by those skilled in magical arts. It is inactive."
-
-/obj/structure/constructshell/examine(mob/user)
- . = ..()
- if(iscultist(user) || iswizard(user) || user.stat == DEAD)
- . += {"A construct shell, used to house bound souls from a soulstone.\n
- Placing a soulstone with a soul into this shell allows you to produce your choice of the following:\n
- An Artificer, which can produce more shells and soulstones, as well as fortifications.\n
- A Wraith, which does high damage and can jaunt through walls, though it is quite fragile.\n
- A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow."}
-
-/obj/structure/constructshell/attackby(obj/item/O, mob/user, params)
- if(istype(O, /obj/item/soulstone))
- var/obj/item/soulstone/SS = O
- if(!iscultist(user) && !iswizard(user) && !SS.purified)
- to_chat(user, "An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly.")
- user.Dizzy(30)
- return
- if(SS.purified && iscultist(user))
- SS.hot_potato(user)
- return
- SS.transfer_soul("CONSTRUCT",src,user)
- SS.was_used()
- else
- return ..()
-
-////////////////////////////Proc for moving soul in and out off stone//////////////////////////////////////
-
-
-/obj/item/soulstone/proc/transfer_soul(choice as text, target, mob/user)
- switch(choice)
- if("FORCE")
- if(!iscarbon(target)) //TODO: Add sacrifice stoning for non-organics, just because you have no body doesnt mean you dont have a soul
- return FALSE
- if(contents.len)
- return FALSE
- var/mob/living/carbon/T = target
- if(T.client != null)
- for(var/obj/item/W in T)
- T.dropItemToGround(W)
- init_shade(T, user)
- return TRUE
- else
- to_chat(user, "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back...")
- return getCultGhost(T,user)
-
- if("VICTIM")
- var/mob/living/carbon/human/T = target
- var/datum/antagonist/cult/C = user.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
- if(C && C.cult_team.is_sacrifice_target(T.mind))
- if(iscultist(user))
- to_chat(user, "\"This soul is mine.SACRIFICE THEM!\"")
- else
- to_chat(user, "The soulstone seems to reject this soul.")
- return FALSE
- if(contents.len)
- to_chat(user, "Capture failed!: The soulstone is full! Free an existing soul to make room.")
- else
- if((!old_shard && T.stat != CONSCIOUS) || (old_shard && T.stat == DEAD))
- if(T.client == null)
- to_chat(user, "Capture failed!: The soul has already fled its mortal frame. You attempt to bring it back...")
- getCultGhost(T,user)
- else
- for(var/obj/item/W in T)
- T.dropItemToGround(W)
- init_shade(T, user, message_user = 1)
- qdel(T)
- else
- to_chat(user, "Capture failed!: Kill or maim the victim first!")
-
- if("SHADE")
- var/mob/living/simple_animal/shade/T = target
- if(contents.len)
- to_chat(user, "Capture failed!: The soulstone is full! Free an existing soul to make room.")
- else
- T.AddComponent(/datum/component/soulstoned, src)
- if(purified)
- icon_state = "purified_soulstone2"
- if(iscultist(T))
- SSticker.mode.remove_cultist(T.mind, FALSE, FALSE)
- else
- icon_state = "soulstone2"
- name = "soulstone: Shade of [T.real_name]"
- to_chat(T, "Your soul has been captured by the soulstone. Its arcane energies are reknitting your ethereal form.")
- if(user != T)
- to_chat(user, "Capture successful!: [T.real_name]'s soul has been captured and stored within the soulstone.")
-
- if("CONSTRUCT")
- var/obj/structure/constructshell/T = target
- var/mob/living/simple_animal/shade/A = locate() in src
- if(A)
- var/list/constructs = list(
- "Juggernaut" = image(icon = 'icons/mob/cult.dmi', icon_state = "juggernaut"),
- "Wraith" = image(icon = 'icons/mob/cult.dmi', icon_state = "wraith"),
- "Artificer" = image(icon = 'icons/mob/cult.dmi', icon_state = "artificer")
- )
- var/construct_class = show_radial_menu(user, src, constructs, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
- if(!T || !T.loc)
- return
- switch(construct_class)
- if("Juggernaut")
- if(iscultist(user) || iswizard(user))
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut, A, user, 0, T.loc)
- else
- if(purified)
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/angelic, A, user, 0, T.loc)
- else
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/juggernaut/noncult, A, user, 0, T.loc)
- if("Wraith")
- if(iscultist(user) || iswizard(user))
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith, A, user, 0, T.loc)
- else
- if(purified)
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/angelic, A, user, 0, T.loc)
- else
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/wraith/noncult, A, user, 0, T.loc)
- if("Artificer")
- if(iscultist(user) || iswizard(user))
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer, A, user, 0, T.loc)
- else
- if(purified)
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer/angelic, A, user, 0, T.loc)
- else
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/artificer/noncult, A, user, 0, T.loc)
- else
- return
- for(var/datum/mind/B in SSticker.mode.cult)
- if(B == A.mind)
- SSticker.mode.remove_cultist(A.mind)
- qdel(T)
- qdel(src)
- else
- to_chat(user, "Creation failed!: The soul stone is empty! Go kill someone!")
-
-/obj/item/soulstone/proc/check_menu(mob/user)
- if(!istype(user))
- return FALSE
- if(user.incapacitated() || !user.Adjacent(src))
- return FALSE
- return TRUE
-
-/proc/makeNewConstruct(mob/living/simple_animal/hostile/construct/ctype, mob/target, mob/stoner = null, cultoverride = 0, loc_override = null)
- if(QDELETED(target))
- return
- var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target)))
- var/makeicon = newstruct.icon_state
- var/holyness = newstruct.holy
- flick("make_[makeicon][holyness]", newstruct)
- playsound(newstruct, 'sound/effects/constructform.ogg', 50)
- if(stoner)
- newstruct.faction |= "[REF(stoner)]"
- newstruct.master = stoner
- var/datum/action/innate/seek_master/SM = new()
- SM.Grant(newstruct)
- newstruct.key = target.key
- var/atom/movable/screen/alert/bloodsense/BS
- if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker && SSticker.mode)
- SSticker.mode.add_cultist(newstruct.mind, 0)
- if(iscultist(stoner) || cultoverride)
- to_chat(newstruct, "You are still bound to serve the cult[stoner ? " and [stoner]":""], follow [stoner ? stoner.p_their() : "their"] orders and help [stoner ? stoner.p_them() : "them"] complete [stoner ? stoner.p_their() : "their"] goals at all costs.")
- else if(stoner)
- to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.")
- newstruct.clear_alert("bloodsense")
- BS = newstruct.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense)
- if(BS)
- BS.Cviewer = newstruct
- newstruct.cancel_camera()
-
-
-/obj/item/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/user, message_user = 0 , mob/shade_controller)
- if(!shade_controller)
- shade_controller = T
- new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
- T.stop_sound_channel(CHANNEL_HEARTBEAT)
- T.invisibility = INVISIBILITY_ABSTRACT
- T.dust_animation()
- var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src)
- S.AddComponent(/datum/component/soulstoned, src)
- S.name = "Shade of [T.real_name]"
- S.real_name = "Shade of [T.real_name]"
- S.key = shade_controller.key
- S.copy_languages(T, LANGUAGE_MIND)//Copies the old mobs languages into the new mob holder.
- S.copy_languages(user, LANGUAGE_MASTER)
- S.update_atom_languages()
- grant_all_languages(FALSE, FALSE, TRUE) //Grants omnitongue
- if(user)
- S.faction |= "[REF(user)]" //Add the master as a faction, allowing inter-mob cooperation
- if(user && iscultist(user))
- SSticker.mode.add_cultist(S.mind, 0)
- S.cancel_camera()
- name = "soulstone: Shade of [T.real_name]"
- if(purified)
- icon_state = "purified_soulstone2"
- else
- icon_state = "soulstone2"
- if(user && (iswizard(user) || usability))
- to_chat(S, "Your soul has been captured! You are now bound to [user.real_name]'s will. Help [user.p_them()] succeed in [user.p_their()] goals at all costs.")
- else if(user && iscultist(user))
- to_chat(S, "Your soul has been captured! You are now bound to the cult's will. Help them succeed in their goals at all costs.")
- if(message_user && user)
- to_chat(user, "Capture successful!: [T.real_name]'s soul has been ripped from [T.p_their()] body and stored within the soul stone.")
-
-
-/obj/item/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/user)
- var/mob/dead/observer/chosen_ghost
-
- chosen_ghost = T.get_ghost(TRUE,TRUE) //Try to grab original owner's ghost first
-
- if(!chosen_ghost || !chosen_ghost.client) //Failing that, we grab a ghosts
- var/list/consenting_candidates = pollGhostCandidates("Would you like to play as a Shade?", "Cultist", null, ROLE_CULTIST, 50, POLL_IGNORE_SHADE)
- if(consenting_candidates.len)
- chosen_ghost = pick(consenting_candidates)
- if(!T)
- return FALSE
- if(!chosen_ghost || !chosen_ghost.client)
- to_chat(user, "There were no spirits willing to become a shade.")
- return FALSE
- if(contents.len) //If they used the soulstone on someone else in the meantime
- return FALSE
- for(var/obj/item/W in T)
- T.dropItemToGround(W)
- init_shade(T, user , shade_controller = chosen_ghost)
- qdel(T)
- return TRUE
diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm
index 9f4349a2bbc8..4bd2f5c8a525 100644
--- a/code/modules/antagonists/wizard/equipment/spellbook.dm
+++ b/code/modules/antagonists/wizard/equipment/spellbook.dm
@@ -281,18 +281,6 @@
item_path = /obj/item/scrying
category = "Defensive"
-/datum/spellbook_entry/item/soulstones
- name = "Six Soul Stone Shards and the spell Artificer"
- desc = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot."
- item_path = /obj/item/storage/belt/soulstone/full
- category = "Assistance"
-
-/datum/spellbook_entry/item/soulstones/Buy(mob/living/carbon/human/user,obj/item/spellbook/book)
- . =..()
- if(.)
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(null))
- return .
-
/datum/spellbook_entry/item/necrostone
name = "A Necromantic Stone"
desc = "A Necromantic stone is able to resurrect three dead individuals as skeletal thralls for you to command."
diff --git a/code/modules/antagonists/wizard/wizard.dm b/code/modules/antagonists/wizard/wizard.dm
index 96a41b2ac07b..27a3a343a907 100644
--- a/code/modules/antagonists/wizard/wizard.dm
+++ b/code/modules/antagonists/wizard/wizard.dm
@@ -172,7 +172,6 @@
antag_hud_name = "apprentice"
var/datum/mind/master
var/school = APPRENTICE_DESTRUCTION
- outfit_type = /datum/outfit/wizard/apprentice
wiz_age = APPRENTICE_AGE_MIN
/datum/antagonist/wizard/apprentice/greet()
@@ -252,7 +251,6 @@
/datum/antagonist/wizard/academy
name = "Academy Teacher"
- outfit_type = /datum/outfit/wizard/academy
move_to_lair = FALSE
/datum/antagonist/wizard/academy/equip_wizard()
diff --git a/code/modules/asset_cache/asset_list_items.dm b/code/modules/asset_cache/asset_list_items.dm
index 2ec8e8dca620..4920de28e364 100644
--- a/code/modules/asset_cache/asset_list_items.dm
+++ b/code/modules/asset_cache/asset_list_items.dm
@@ -121,6 +121,7 @@
"stamp-bard" = 'icons/stamp_icons/large_stamp-bard.png',
"stamp-gold" = 'icons/stamp_icons/large_stamp-gold.png',
"stamp-cybersun" = 'icons/stamp_icons/large_stamp-cybersun.png',
+ "stamp-biodynamics" = 'icons/stamp_icons/large_stamp-biodynamics.png',
"stamp-donk" = 'icons/stamp_icons/large_stamp-donk.png'
)
@@ -241,7 +242,6 @@
"hierophant" = 'icons/UI_Icons/Achievements/Boss/hierophant.png',
"legion" = 'icons/UI_Icons/Achievements/Boss/legion.png',
"miner" = 'icons/UI_Icons/Achievements/Boss/miner.png',
- "swarmer" = 'icons/UI_Icons/Achievements/Boss/swarmer.png',
"tendril" = 'icons/UI_Icons/Achievements/Boss/tendril.png',
"featofstrength" = 'icons/UI_Icons/Achievements/Misc/featofstrength.png',
"helbital" = 'icons/UI_Icons/Achievements/Misc/helbital.png',
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index 6f28cc724b55..850d0e91ba09 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -74,12 +74,6 @@
if(prob(1))
mezzer()
-
-/obj/item/clothing/glasses/meson/truesight
- name = "The Lens of Truesight"
- desc = "I can see forever!"
- icon_state = "monocle"
-
/obj/structure/academy_wizard_spawner
name = "Academy Defensive System"
desc = "Made by Abjuration, Inc."
@@ -152,14 +146,6 @@
icon_state = "forge_off"
STOP_PROCESSING(SSobj, src)
-/datum/outfit/wizard/academy
- name = "Academy Wizard"
- r_pocket = null
- r_hand = null
- suit = /obj/item/clothing/suit/wizrobe/red
- head = /obj/item/clothing/head/wizard/red
- backpack_contents = list(/obj/item/storage/box/survival = 1)
-
/obj/item/dice/d20/fate
name = "\improper Die of Fate"
desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky."
@@ -348,8 +334,6 @@
new /obj/item/clothing/suit/wizrobe(drop_location())
new /obj/item/clothing/head/wizard(drop_location())
new /obj/item/clothing/gloves/combat/wizard(drop_location())
- new /obj/item/clothing/suit/wizrobe/magusblue(drop_location())
- new /obj/item/clothing/head/wizard/magus(drop_location())
new /obj/item/staff(drop_location())
new /obj/structure/mirror/magic(drop_location())
@@ -357,8 +341,6 @@
name = "Butler"
uniform = /obj/item/clothing/under/suit/black_really
shoes = /obj/item/clothing/shoes/laceup
- head = /obj/item/clothing/head/bowler
- glasses = /obj/item/clothing/glasses/monocle
gloves = /obj/item/clothing/gloves/color/white
/obj/effect/proc_holder/spell/targeted/summonmob
diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm
index 0f76623f617c..a240bf9f8404 100644
--- a/code/modules/awaymissions/mission_code/snowdin.dm
+++ b/code/modules/awaymissions/mission_code/snowdin.dm
@@ -129,12 +129,6 @@
dynamic_lighting = DYNAMIC_LIGHTING_ENABLED
requires_power = TRUE
-/area/shuttle/snowdin/elevator1
- name = "Excavation Elevator"
-
-/area/shuttle/snowdin/elevator2
- name = "Mining Elevator"
-
//liquid plasma!!!!!!//
/turf/open/floor/plasteel/dark/snowdin
@@ -224,14 +218,19 @@
PP.adjustFireLoss(25)
if(plasma_parts.len)
var/obj/item/bodypart/NB = pick(plasma_parts) //using the above-mentioned list to get a choice of limbs for dismember() to use
- PP.emote("scream")
NB.limb_id = "plasmaman" //change the species_id of the limb to that of a plasmaman
NB.static_icon = 'icons/mob/species/plasmaman/bodyparts.dmi'
NB.no_update = TRUE
NB.change_bodypart_status()
- PP.visible_message(
- "[L] screams in pain as [L.p_their()] [NB] melts down to the bone!",
- "You scream out in pain as your [NB] melts down to the bone, leaving an eerie plasma-like glow where flesh used to be!")
+ PP.force_scream()
+ if(!HAS_TRAIT(PP, TRAIT_ANALGESIA))
+ PP.visible_message(
+ "[L] screams in pain as [L.p_their()] [NB] melts down to the bone!",
+ "You scream out in pain as your [NB] melts down to the bone, leaving an eerie plasma-like glow where flesh used to be!")
+ else
+ PP.visible_message(
+ "[L] lets out panicked gasps as [L.p_their()] [NB] melts down to the bone!",
+ "You gasp in shock as your [NB] melts down to the bone, leaving an eerie plasma-like glow where flesh used to be!")
if(!plasma_parts.len && !robo_parts.len) //a person with no potential organic limbs left AND no robotic limbs, time to turn them into a plasmaman
PP.IgniteMob()
PP.set_species(/datum/species/plasmaman)
diff --git a/code/modules/awaymissions/mission_code/stationCollision.dm b/code/modules/awaymissions/mission_code/stationCollision.dm
deleted file mode 100644
index 52c2a964cec4..000000000000
--- a/code/modules/awaymissions/mission_code/stationCollision.dm
+++ /dev/null
@@ -1,155 +0,0 @@
-/* Station-Collision(sc) away mission map specific stuff
- *
- * Notes:
- * Feel free to use parts of this map, or even all of it for your own project. Just include me in the credits :)
- *
- * Some of this code unnecessary, but the intent is to add a little bit of everything to serve as examples
- * for anyone who wants to make their own stuff.
- *
- * Contains:
- * Landmarks
- * Guns
- * Safe code hints
- * Captain's safe
- * Modified Nar'Sie
- */
-
-
-
-/*
- * Landmarks - Instead of spawning a new object type, I'll spawn the bible using a landmark!
- */
-/obj/effect/landmark/sc_bible_spawner
- name = "Safecode hint spawner"
-
-/obj/effect/landmark/sc_bible_spawner/Initialize()
- ..()
- var/obj/item/storage/book/bible/B = new /obj/item/storage/book/bible/booze(loc)
- B.name = "The Holy book of the Geometer"
- B.deity_name = "Narsie"
- B.icon_state = "melted"
- B.item_state = "melted"
- B.lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
- B.righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
- new /obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_bible(B)
- new /obj/item/pen(B)
- return INITIALIZE_HINT_QDEL
-
-/*
- * Guns - I'm making these specifically so that I dont spawn a pile of fully loaded weapons on the map.
- */
-//Captain's retro laser - Fires practice laser shots instead.
-/obj/item/gun/energy/laser/retro/sc_retro
- name ="retro laser"
- icon_state = "retro"
- desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces."
-// projectile_type = "/obj/projectile/practice"
-
-//Syndicate sub-machine guns.
-/obj/item/gun/ballistic/automatic/smg/cobra/sc_c20r
-
-/obj/item/gun/ballistic/automatic/smg/cobra/sc_c20r/Initialize()
- . = ..()
- for(var/ammo in magazine.stored_ammo)
- if(prob(95)) //95% chance
- magazine.stored_ammo -= ammo
-
-//Barman's shotgun
-/obj/item/gun/ballistic/shotgun/sc_pump
-
-/obj/item/gun/ballistic/shotgun/sc_pump/Initialize()
- . = ..()
- for(var/ammo in magazine.stored_ammo)
- if(prob(95)) //95% chance
- magazine.stored_ammo -= ammo
-
-//Lasers
-/obj/item/gun/energy/laser/practice/sc_laser
- name = "Old laser"
- desc = "A once potent weapon, years of dust have collected in the chamber and lens of this weapon, weakening the beam significantly."
-
-/*
- * Safe code hints
- */
-
-//These vars hold the code itself, they'll be generated at round-start
-GLOBAL_VAR_INIT(sc_safecode1, "[rand(0,9)]")
-GLOBAL_VAR_INIT(sc_safecode2, "[rand(0,9)]")
-GLOBAL_VAR_INIT(sc_safecode3, "[rand(0,9)]")
-GLOBAL_VAR_INIT(sc_safecode4, "[rand(0,9)]")
-GLOBAL_VAR_INIT(sc_safecode5, "[rand(0,9)]")
-
-//Pieces of paper actually containing the hints
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_prison
- name = "smudged paper"
-
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_prison/Initialize()
- . = ..()
- default_raw_text = "The ink is smudged, you can only make out a couple numbers: '[GLOB.sc_safecode1]**[GLOB.sc_safecode4]*'"
-
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_hydro
- name = "shredded paper"
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_hydro/Initialize()
- . = ..()
- default_raw_text = "Although the paper is shredded, you can clearly see the number: '[GLOB.sc_safecode2]'"
-
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_caf
- name = "blood-soaked paper"
- //This does not have to be in New() because it is a constant. There are no variables in it i.e. [sc_safcode]
- default_raw_text = "This paper is soaked in blood, it is impossible to read any text."
-
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_bible
- name = "hidden paper"
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_bible/Initialize()
- . = ..()
- default_raw_text = {"It would appear that the pen hidden with the paper had leaked ink over the paper.
- However you can make out the last three digits:'[GLOB.sc_safecode3][GLOB.sc_safecode4][GLOB.sc_safecode5]'
- "}
-
-/obj/item/paper/fluff/awaymissions/stationcollision/safehint_paper_shuttle
- default_raw_text = {"Target: Research-station Epsilon
- Objective: Prototype weaponry. The captain likely keeps them locked in her safe.
-
- Our on-board spy has learned the code and has hidden away a few copies of the code around the station. Unfortunatly he has been captured by security
- Your objective is to split up, locate any of the papers containing the captain's safe code, open the safe and
- secure anything found inside. If possible, recover the imprisioned syndicate operative and receive the code from him.
-
- As always, eliminate anyone who gets in the way.
-
- Your assigned ship is designed specifically for penetrating the hull of another station or ship with minimal damage to operatives.
- It is completely fly-by-wire meaning you have just have to enjoy the ride and when the red light comes on... find something to hold onto!
- "}
-/*
- * Captain's safe
- */
-/obj/item/storage/secure/safe/sc_ssafe
- name = "Captain's secure safe"
-
-/obj/item/storage/secure/safe/sc_ssafe/Initialize()
- . = ..()
- l_code = "[GLOB.sc_safecode1][GLOB.sc_safecode2][GLOB.sc_safecode3][GLOB.sc_safecode4][GLOB.sc_safecode5]"
- l_set = 1
- new /obj/item/gun/energy/mindflayer(src)
- new /obj/item/soulstone(src)
- new /obj/item/clothing/suit/space/hardsuit/cult(src)
- //new /obj/item/teleportation_scroll(src)
- new /obj/item/stack/ore/diamond(src)
-
-/*
- * Modified Nar'Sie
- */
-/obj/singularity/narsie/mini
- desc = "Your body becomes weak and your feel your mind slipping away as you try to comprehend what you know can't be possible."
- move_self = 0 //Contianed narsie does not move!
- grav_pull = 0 //Contained narsie does not pull stuff in!
-//Override this to prevent no adminlog runtimes and admin warnings about a singularity without containment
-/obj/singularity/narsie/mini/admin_investigate_setup()
- return
-
-/obj/singularity/narsie/mini/process()
- eat()
- if(prob(25))
- mezzer()
-
-/obj/singularity/narsie/mini/ex_act()
- return
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
index d5489edeb3e0..434a80c6416d 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm
@@ -28,7 +28,7 @@
/datum/blackmarket_item/ammo/himehabu_box
name = ".22 LR Ammo Box"
desc = "A 75 round ammo box of .22 LR. Trust me, you'll need every shot."
- item = /obj/item/ammo_box/c22lr_box
+ item = /obj/item/storage/box/ammo/c22lr
price_min = 100
price_max = 300
@@ -39,7 +39,7 @@
/datum/blackmarket_item/ammo/a357_box
name = ".357 Ammo Box"
desc = "A 50 round ammo box of .357."
- item = /obj/item/ammo_box/a357_box
+ item = /obj/item/storage/box/ammo/a357
price_min = 150
price_max = 500
@@ -60,7 +60,7 @@
/datum/blackmarket_item/ammo/c299
name = "Eoehoma .299 Caseless Ammo Box"
desc = "This ammunition for the E-40 Hybrid Rifle is probably worth more than the people you're shooting it at."
- item = /obj/item/ammo_box/c299
+ item = /obj/item/storage/box/ammo/c299
price_min = 300
price_max = 700
@@ -253,7 +253,7 @@
/datum/blackmarket_item/ammo/a4570hp
name = ".45-70 Hollow Point Ammo Box"
desc = "Put the hollow in hollow point by blowing a crater in some random sod with this devastating .45-70 cartridge."
- item = /obj/item/ammo_box/a4570/hp
+ item = /obj/item/storage/box/ammo/a4570_hp
price_min = 600
price_max = 1000
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
index 7a9803085ab8..677b82624bae 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/clothing.dm
@@ -32,16 +32,6 @@
stock_max = 10
availability_prob = 80
-/datum/blackmarket_item/clothing/crown
- name = "Crown"
- desc = "A beautiful golden crown, rich with history and pedigree. Better worn than left to collect dust in a museum, right?"
- item = /obj/item/clothing/head/crown/fancy
-
- price_min = 1000
- price_max = 2000
- stock = 1
- availability_prob = 20
-
/datum/blackmarket_item/clothing/galaxy_blue
name = "Blue Galaxy Suit"
desc = "A handsome silk suit, treated with a finish of bluespace dust for an out of this world sheen."
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm b/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm
index ab7f62830324..26402e3dfac0 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/explosives.dm
@@ -97,18 +97,6 @@
stock_max = 7
availability_prob = 50
-/datum/blackmarket_item/explosive/rpg
- name = "PML-9 RPG"
- desc = "Offically, it's an anti-armor RPG launcher. Technically, it's anti-everything. Most things don't enjoy being hit in the face with high explosives."
- item = /obj/item/gun/ballistic/rocketlauncher
-
- price_min = 3500
- price_max = 6500
- stock_min = 2
- stock_max = 5
- availability_prob = 10
- spawn_weighting = FALSE
-
/datum/blackmarket_item/explosive/live_bomb
name = "Active ICW Era Ordinance"
desc = "Look, I won't mince words. This thing is counting down and I don't want to be the next causualty of ICW after it's already ended. I'll sell it to you real cheap."
diff --git a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
index cd0fcf9fd7a9..740ee2c5341b 100644
--- a/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
+++ b/code/modules/cargo/blackmarket/blackmarket_items/weapons.dm
@@ -350,4 +350,23 @@
stock_max = 2
availability_prob = 20
+/datum/blackmarket_item/weapon/fireaxe
+ name = "Fire Axe"
+ desc = "An incredibly sharp axe of dubious make used by various engineers throughout the years to settle arguments while hammered. Sold to us by a very friendly man in a suit."
+ item = /obj/item/melee/axe/fire
+ price_min = 2500
+ price_max = 3500
+ stock = 2
+ availability_prob = 40
+
+/datum/blackmarket_item/weapon/oneshot
+ name = "Hammer Launcher"
+ desc = "A one-shot solution to a myriad amount of problems, ranging from Exosuits to obnoxious neighbors. Contains one ready-to-fire 84mm HEDP rocket. "
+ item = /obj/item/gun/ballistic/rocketlauncher/oneshot
+
+ price_min = 3000
+ price_max = 4500
+ stock_min = 1
+ stock_max = 5
+ availability_prob = 25
diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm
index be3ec7a26599..165cfb6c1196 100644
--- a/code/modules/cargo/exports.dm
+++ b/code/modules/cargo/exports.dm
@@ -59,7 +59,8 @@ then the player gets the profit from selling his own wasted time.
if(!dry_run && (sold || delete_unsold))
if(ismob(thing))
thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO)
- qdel(thing)
+ if(!dry_run)
+ qdel(AM)
return report
diff --git a/code/modules/cargo/exports/lavaland.dm b/code/modules/cargo/exports/lavaland.dm
index 3ca8ec9ece05..c585ecb25a98 100644
--- a/code/modules/cargo/exports/lavaland.dm
+++ b/code/modules/cargo/exports/lavaland.dm
@@ -9,8 +9,6 @@
/obj/item/book_of_babel,
/obj/item/wisp_lantern,
/obj/item/reagent_containers/glass/bottle/potion/flight,
- /obj/item/clothing/glasses/godeye,
- /obj/item/clothing/suit/space/hardsuit/cult,
/obj/item/voodoo,
/obj/item/grenade/clusterbuster/inferno,
/obj/item/clothing/neck/memento_mori,
@@ -19,7 +17,6 @@
/obj/item/dragons_blood,
/obj/item/lava_staff,
/obj/item/ship_in_a_bottle,
- /obj/item/clothing/shoes/clown_shoes/banana_shoes,
/obj/item/veilrender/vealrender,
/obj/item/clothing/suit/armor/ascetic)
diff --git a/code/modules/cargo/exports/parts.dm b/code/modules/cargo/exports/parts.dm
index 0df089543989..115dfdf3ff65 100644
--- a/code/modules/cargo/exports/parts.dm
+++ b/code/modules/cargo/exports/parts.dm
@@ -15,11 +15,6 @@
unit_name = "solar panel control board"
export_types = list(/obj/item/circuitboard/computer/solar_control)
-/datum/export/swarmer
- cost = 2000
- unit_name = "deactivated alien deconstruction drone"
- export_types = list(/obj/item/deactivated_swarmer)
-
//Computer Tablets and Parts
/datum/export/modular_part
cost = 15
diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm
index a7ab407b428e..716cb51d1e97 100644
--- a/code/modules/cargo/packs/ammo.dm
+++ b/code/modules/cargo/packs/ammo.dm
@@ -1,6 +1,7 @@
/datum/supply_pack/ammo
group = "Ammunition"
crate_type = /obj/structure/closet/crate/secure/gear
+ crate_name = "ammo crate"
/*
Pistol ammo
@@ -45,7 +46,7 @@
/datum/supply_pack/ammo/mag_556mm
name = "5.56 Pistole C Magazine Crate"
desc = "Contains a 5.56mm magazine for the Pistole C, containing twelve rounds."
- contains = list(/obj/item/ammo_box/magazine/pistol556mm)
+ contains = list(/obj/item/storage/box/ammo/c556mm)
cost = 750
faction = FACTION_SOLGOV
@@ -62,21 +63,21 @@
/datum/supply_pack/ammo/buckshot
name = "Buckshot Crate"
- desc = "Contains a box of twenty-five buckshot shells for use in lethal persuasion."
+ desc = "Contains a box of 32 buckshot shells for use in lethal persuasion."
cost = 500
- contains = list(/obj/item/ammo_box/a12g)
+ contains = list(/obj/item/storage/box/ammo/a12g_buckshot)
/datum/supply_pack/ammo/slugs
name = "Shotgun Slug Crate"
- desc = "Contains a box of twenty-five slug shells for use in lethal persuasion."
+ desc = "Contains a box of 32 slug shells for use in lethal persuasion."
cost = 500
- contains = list(/obj/item/ammo_box/a12g/slug)
-
+ contains = list(/obj/item/storage/box/ammo/a12g_slug
+)
/datum/supply_pack/ammo/blank_shells
name = "Blank Shell Crate"
desc = "Contains a box of blank shells."
cost = 500
- contains = list(/obj/item/ammo_box/a12g/blanks)
+ contains = list(/obj/item/storage/box/ammo/a12g_blank)
/datum/supply_pack/ammo/blank_ammo_disk
name = "Blank Ammo Design Disk Crate"
@@ -92,9 +93,9 @@
/datum/supply_pack/ammo/rubbershot
name = "Rubbershot Crate"
- desc = "Contains a box of twenty-five rubbershot shells for use in crowd control or training."
+ desc = "Contains a box of 32 rubbershot shells for use in crowd control or training."
cost = 500
- contains = list(/obj/item/ammo_box/a12g/rubbershot)
+ contains = list(/obj/item/storage/box/ammo/a12g_rubbershot)
/*
.38 ammo
@@ -104,8 +105,8 @@
name = ".38 Ammo Boxes Crate"
desc = "Contains two 50 round ammo boxes for refilling .38 weapons."
cost = 250
- contains = list(/obj/item/ammo_box/c38_box,
- /obj/item/ammo_box/c38_box)
+ contains = list(/obj/item/storage/box/ammo/c38,
+ /obj/item/storage/box/ammo/c38)
crate_name = "ammo crate"
/datum/supply_pack/ammo/match
@@ -195,134 +196,136 @@
/datum/supply_pack/ammo/a762_ammo_box
name = "7.62x40mm CLIP Ammo Box Crate"
- desc = "Contains a one hundred and twenty-round 7.62x40mm CLIP box for the SKM rifles."
- contains = list(/obj/item/ammo_box/a762_40)
+ desc = "Contains two 60-round 7.62x40mm CLIP boxes for the SKM rifles."
+ contains = list(/obj/item/storage/box/ammo/a762_40,
+ /obj/item/storage/box/ammo/a762_40)
cost = 500
/datum/supply_pack/ammo/a556_ammo_box
name = "5.56x42mm CLIP Ammo Box Crate"
- desc = "Contains a one hundred and twenty-round 5.56x42mm CLIP box for most newer rifles."
- contains = list(/obj/item/ammo_box/a556_42)
+ desc = "Contains two 60-round 5.56x42mm CLIP boxes for most newer rifles."
+ contains = list(/obj/item/storage/box/ammo/a556_42,
+ /obj/item/storage/box/ammo/a556_42)
cost = 450
/datum/supply_pack/ammo/a357_ammo_box
name = ".357 Ammo Box Crate"
- desc = "Contains a fifty-round .357 box for revolvers such as the Scarborough Revolver and the HP Firebrand."
- contains = list(/obj/item/ammo_box/a357_box)
+ desc = "Contains a 48-round .357 box for revolvers such as the Scarborough Revolver and the HP Firebrand."
+ contains = list(/obj/item/storage/box/ammo/a357)
cost = 250
/datum/supply_pack/ammo/c556mmHITP_ammo_box
name = "5.56 Caseless Ammo Box Crate"
- desc = "Contains a fifty-round 5.56mm caseless box for SolGov sidearms like the Pistole C."
- contains = list(/obj/item/ammo_box/c556mmHITP)
+ desc = "Contains a 48-round 5.56mm caseless box for SolGov sidearms like the Pistole C."
+ contains = list(/obj/item/storage/box/ammo/c556mm)
cost = 250
/datum/supply_pack/ammo/c45_ammo_box
name = ".45 Ammo Box Crate"
- desc = "Contains a fifty-round .45 box for pistols and SMGs like the Candor or the C-20r."
- contains = list(/obj/item/ammo_box/c45)
+ desc = "Contains a 48-round .45 box for pistols and SMGs like the Candor or the C-20r."
+ contains = list(/obj/item/storage/box/ammo/c45)
cost = 250
/datum/supply_pack/ammo/c10mm_ammo_box
name = "10mm Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box for pistols and SMGs like the Ringneck or the SkM-44(k)."
- contains = list(/obj/item/ammo_box/c10mm)
+ desc = "Contains a 48-round 10mm box for pistols and SMGs like the Ringneck or the SkM-44(k)."
+ contains = list(/obj/item/storage/box/ammo/c10mm)
cost = 250
/datum/supply_pack/ammo/c9mm_ammo_box
name = "9mm Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box for pistols and SMGs such as the Commander or Saber."
- contains = list(/obj/item/ammo_box/c9mm)
+ desc = "Contains a 48-round 9mm box for pistols and SMGs such as the Commander or Saber."
+ contains = list(/obj/item/storage/box/ammo/c9mm)
cost = 200
/datum/supply_pack/ammo/a308_ammo_box
name = "308 Ammo Box Crate"
desc = "Contains a thirty-round .308 box for DMRs such as the SsG-04 and CM-GAL-S."
- contains = list(/obj/item/ammo_box/a308)
+ contains = list(/obj/item/storage/box/ammo/a308)
cost = 500
/datum/supply_pack/ammo/c9mmap_ammo_box
name = "9mm AP Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box loaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c9mm/ap)
+ desc = "Contains a 48-round 9mm box loaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c9mm/ap)
cost = 400
/datum/supply_pack/ammo/a357match_ammo_box
name = ".357 Match Ammo Box Crate"
- desc = "Contains a fifty-round .357 match box for better performance against armor."
- contains = list(/obj/item/ammo_box/a357_box/match)
+ desc = "Contains a 48-round .357 match box for better performance against armor."
+ contains = list(/obj/item/storage/box/ammo/a357_match)
cost = 500
/datum/supply_pack/ammo/c556mmHITPap_ammo_box
name = "5.56 caseless AP Ammo Box Crate"
- desc = "Contains a fifty-round 5.56mm caseless boxloaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c556mmHITP/ap)
+ desc = "Contains a 48-round 5.56mm caseless boxloaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c556mm_ap)
cost = 500
/datum/supply_pack/ammo/c45ap_ammo_box
name = ".45 AP Ammo Box Crate"
- desc = "Contains a fifty-round .45 box loaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c45/ap)
+ desc = "Contains a 48-round .45 box loaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c45_ap)
cost = 500
/datum/supply_pack/ammo/c10mmap_ammo_box
name = "10mm AP Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with armor piercing ammo."
- contains = list(/obj/item/ammo_box/c10mm/ap)
+ desc = "Contains a 48-round 10mm box loaded with armor piercing ammo."
+ contains = list(/obj/item/storage/box/ammo/c10mm_ap)
cost = 500
/datum/supply_pack/ammo/c9mmhp_ammo_box
name = "9mm HP Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c9mm/hp)
+ desc = "Contains a 48-round 9mm box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c9mm_hp)
cost = 400
/datum/supply_pack/ammo/a357hp_ammo_box
name = ".357 HP Ammo Box Crate"
- desc = "Contains a fifty-round .357 box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/a357_box/hp)
+ desc = "Contains a 48-round .357 box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/a357_hp)
cost = 500
/datum/supply_pack/ammo/c10mmhp_ammo_box
name = "10mm HP Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c10mm/hp)
+ desc = "Contains a 48-round 10mm box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c10mm_hp)
cost = 500
+
/datum/supply_pack/ammo/c45hp_ammo_box
name = ".45 HP Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c45/hp)
+ desc = "Contains a 48-round 10mm box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c45_hp)
cost = 500
/datum/supply_pack/ammo/c556mmhitphp_ammo_box
name = "5.56 Caseless HP Ammo Box Crate"
- desc = "Contains a fifty-round 5.56mm caseless box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c556mmHITP/hp)
+ desc = "Contains a 48-round 5.56mm caseless box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/c556mm_hp)
cost = 500
/datum/supply_pack/ammo/c9mmrubber_ammo_box
name = "9mm Rubber Ammo Box Crate"
- desc = "Contains a fifty-round 9mm box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c9mm/rubbershot)
+ desc = "Contains a 48-round 9mm box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c9mm_rubber)
cost = 200
/datum/supply_pack/ammo/c10mmrubber_ammo_box
name = "10mm Rubber Ammo Box Crate"
- desc = "Contains a fifty-round 10mm box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c10mm/rubbershot)
+ desc = "Contains a 48-round 10mm box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c10mm_rubber)
cost = 250
/datum/supply_pack/ammo/c45mmrubber_ammo_box
name = ".45 Rubber Ammo Box Crate"
- desc = "Contains a fifty-round .45 box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c45/rubbershot)
+ desc = "Contains a 48-round .45 box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c45_rubber)
cost = 250
-
/datum/supply_pack/ammo/c556HITPrubber_ammo_box
name = "5.56 Caseless Rubber Ammo Box Crate"
- desc = "Contains a fifty-round 5.56 caseless box loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/c556mmHITP/rubbershot)
+ desc = "Contains a 48-round 5.56 caseless box loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/c556mm_rubber)
cost = 250
/datum/supply_pack/ammo/guncell
@@ -339,85 +342,90 @@
/datum/supply_pack/ammo/c57x39mm_boxcrate
name = "5.7x39mm Ammo Box Crate"
- desc = "Contains a fifty-round 5.7x39mm box for PDWs such as the Sidewinder."
- contains = list(/obj/item/ammo_box/c57x39mm_box)
+ desc = "Contains a 48-round 5.7x39mm box for PDWs such as the Sidewinder."
+ contains = list(/obj/item/storage/box/ammo/c57x39)
cost = 250
/datum/supply_pack/ammo/c46x30mm_boxcrate
name = "4.6x30mm Ammo Box Crate"
- desc = "Contains a fifty-round 4.6x30mm box for PDWs such as the WT-550."
- contains = list(/obj/item/ammo_box/c46x30mm_box)
+ desc = "Contains a 60-round 4.6x30mm box for PDWs such as the WT-550."
+ contains = list(/obj/item/storage/box/ammo/c46x30mm)
cost = 250
/datum/supply_pack/ammo/c8x50mm_boxcrate
name = "8x50mm Ammo Box Crate"
- desc = "Contains a twenty-round 8x50mm ammo box for rifles such as the Illestren."
- contains = list(/obj/item/ammo_box/c8x50mm_box)
+ desc = "Contains a 30-round 8x50mm ammo box for rifles such as the Illestren."
+ contains = list(/obj/item/storage/box/ammo/a8_50r)
cost = 250
/datum/supply_pack/ammo/c8x50mm_boxhp_boxcrate
name = "8x50mm Hollow Point Crate"
- desc = "Contains a twenty-round 8x50mm ammo box loaded with hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/c8x50mmhp_box)
+ desc = "Contains a 30y-round 8x50mm ammo box loaded with hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/a8_50r_hp)
cost = 500
/datum/supply_pack/ammo/a300_box
name = ".300 Ammo Box Crate"
desc = "Contains a twenty-round .300 Magnum ammo box for sniper rifles such as the HP Scout."
- contains = list(/obj/item/ammo_box/a300_box)
+ contains = list(/obj/item/storage/box/ammo/a300)
cost = 400
/datum/supply_pack/ammo/a65clip_box
name = "6.5x57mm CLIP Ammo Box Crate"
desc = "Contains a twenty-round 6.5x57mm CLIP ammo box for various sniper rifles such as the CM-F90 and the Boomslang series."
- contains = list(/obj/item/ammo_box/a65clip_box)
+ contains = list(/obj/item/storage/box/ammo/a65clip)
cost = 400
-
/datum/supply_pack/ammo/a4570_box
name = ".45-70 Ammo Box Crate"
- desc = "Contains a twelve-round box containing devastatingly powerful .45-70 caliber ammunition."
- contains = list(/obj/item/ammo_box/a4570)
+ desc = "Contains a 20-round box containing devastatingly powerful .45-70 caliber ammunition."
+ contains = list(/obj/item/storage/box/ammo/a4570)
cost = 500
/datum/supply_pack/ammo/a4570_box/match
name = ".45-70 Match Crate"
- desc = "Contains a twelve-round box containing devastatingly powerful .45-70 caliber ammunition, that travels faster, pierces armour better, and ricochets off targets."
- contains = list(/obj/item/ammo_box/a4570/match)
+ desc = "Contains a 20-round box containing devastatingly powerful .45-70 caliber ammunition, that travels faster, pierces armour better, and ricochets off targets."
+ contains = list(/obj/item/storage/box/ammo/a4570_match)
cost = 750
/datum/supply_pack/ammo/ferropelletboxcrate
name = "Ferromagnetic Pellet Box Crate"
- desc = "Contains a fifty-round ferromagnetic pellet ammo box for gauss guns such as the Claris."
- contains = list(/obj/item/ammo_box/ferropelletbox)
+ desc = "Contains a 48-round ferromagnetic pellet ammo box for gauss guns such as the Claris."
+ contains = list(/obj/item/storage/box/ammo/ferropellet)
cost = 250
/datum/supply_pack/ammo/ferroslugboxcrate
name = "Ferromagnetic Slug Box Crate"
desc = "Contains a twenty-round ferromagnetic slug for gauss guns such as the Model-H."
- contains = list(/obj/item/ammo_box/ferroslugbox)
+ contains = list(/obj/item/storage/box/ammo/ferroslug)
cost = 250
/datum/supply_pack/ammo/ferrolanceboxcrate
name = "Ferromagnetic Lance Box Crate"
- desc = "Contains a fifty-round box for high-powered gauss guns such as the GAR assault rifle."
- contains = list(/obj/item/ammo_box/ferrolancebox)
+ desc = "Contains a 48-round box for high-powered gauss guns such as the GAR assault rifle."
+ contains = list(/obj/item/storage/box/ammo/ferrolance)
cost = 250
/datum/supply_pack/ammo/a44roum
name = ".44 Roumain Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne."
- contains = list(/obj/item/ammo_box/a44roum)
+ desc = "Contains a 48-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne."
+ contains = list(/obj/item/storage/box/ammo/a44roum)
cost = 250
/datum/supply_pack/ammo/a44roum_rubber
name = ".44 Roumain Rubber Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds."
- contains = list(/obj/item/ammo_box/a44roum/rubber)
+ desc = "Contains a 48-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds."
+ contains = list(/obj/item/storage/box/ammo/a44roum_rubber)
cost = 250
/datum/supply_pack/ammo/a44roum_hp
name = ".44 Roumain Hollow Point Ammo Box Crate"
- desc = "Contains a fifty-round box of .44 roumain hollow point ammo, great against unarmored targets."
- contains = list(/obj/item/ammo_box/a44roum/hp)
+ desc = "Contains a 48-round box of .44 roumain hollow point ammo, great against unarmored targets."
+ contains = list(/obj/item/storage/box/ammo/a44roum_hp)
cost = 500
+
+/datum/supply_pack/ammo/c22lr
+ name = ".22 LR Ammo Box Crate"
+ desc = "Contains a 60-round ammo box for refilling .22 LR weapons."
+ contains = list(/obj/item/storage/box/ammo/c22lr)
+ cost = 250
diff --git a/code/modules/cargo/packs/chemistry.dm b/code/modules/cargo/packs/chemistry.dm
index 5c7ae4a20ab9..236706f7b6c0 100644
--- a/code/modules/cargo/packs/chemistry.dm
+++ b/code/modules/cargo/packs/chemistry.dm
@@ -10,19 +10,26 @@
name = "Chemical Starter Kit Crate"
desc = "Contains thirteen different chemicals, for all the fun experiments you can make."
cost = 1250 // This is intentionally underpriced; the hope is that people will start using ghettochem, upon which time the price can be raised.
- contains = list(/obj/item/reagent_containers/glass/bottle/hydrogen,
+ contains = list(/obj/item/reagent_containers/glass/bottle/aluminium,
+ /obj/item/reagent_containers/glass/bottle/bromine,
/obj/item/reagent_containers/glass/bottle/carbon,
+ /obj/item/reagent_containers/glass/bottle/chlorine,
+ /obj/item/reagent_containers/glass/bottle/copper,
+ /obj/item/reagent_containers/glass/bottle/ethanol,
+ /obj/item/reagent_containers/glass/bottle/fluorine,
+ /obj/item/reagent_containers/glass/bottle/hydrogen,
+ /obj/item/reagent_containers/glass/bottle/iodine,
+ /obj/item/reagent_containers/glass/bottle/lithium,
+ /obj/item/reagent_containers/glass/bottle/mercury,
/obj/item/reagent_containers/glass/bottle/nitrogen,
/obj/item/reagent_containers/glass/bottle/oxygen,
- /obj/item/reagent_containers/glass/bottle/fluorine,
/obj/item/reagent_containers/glass/bottle/phosphorus,
- /obj/item/reagent_containers/glass/bottle/silicon,
- /obj/item/reagent_containers/glass/bottle/chlorine,
- /obj/item/reagent_containers/glass/bottle/radium,
- /obj/item/reagent_containers/glass/bottle/sacid,
- /obj/item/reagent_containers/glass/bottle/ethanol,
/obj/item/reagent_containers/glass/bottle/potassium,
+ /obj/item/reagent_containers/glass/bottle/radium,
/obj/item/reagent_containers/glass/bottle/sugar,
+ /obj/item/reagent_containers/glass/bottle/sodium,
+ /obj/item/reagent_containers/glass/bottle/sulfur,
+ /obj/item/reagent_containers/glass/bottle/silicon,
/obj/item/reagent_scanner,
/obj/item/reagent_containers/dropper,
/obj/item/storage/box/beakers)
@@ -53,61 +60,96 @@
Bulk materials
*/
+/datum/supply_pack/chemistry/aluminium
+ name = "Bulk Aluminium Crate"
+ desc = "Contains a jug filled with 150u of aluminium."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/aluminium)
+ crate_name = "bulk aluminium crate"
+
+/datum/supply_pack/chemistry/bromine
+ name = "Bulk Bromine Crate"
+ desc = "Contains a jug filled with 150u of bromine."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/bromine)
+ crate_name = "bulk bromine crate"
+
/datum/supply_pack/chemistry/carbon
name = "Bulk Carbon Crate"
desc = "Contains a jug filled with 150u of carbon."
- cost = 500
+ cost = 750
contains = list(/obj/item/reagent_containers/glass/chem_jug/carbon)
crate_name = "bulk carbon crate"
-/datum/supply_pack/chemistry/oxygen
- name = "Bulk Oxygen Crate"
- desc = "Contains a jug filled with 150u of oxygen."
- cost = 500
- contains = list(/obj/item/reagent_containers/glass/chem_jug/oxygen)
- crate_name = "bulk oxygen crate"
+/datum/supply_pack/chemistry/chlorine
+ name = "Bulk Chlorine Crate"
+ desc = "Contains a jug filled with 150u of chlorine."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/chlorine)
+ crate_name = "bulk chlorine crate"
+
+/datum/supply_pack/chemistry/copper
+ name = "Bulk Copper Crate"
+ desc = "Contains a jug filled with 150u of copper."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/copper)
+ crate_name = "bulk copper crate"
+
+/datum/supply_pack/chemistry/fluorine
+ name = "Bulk Fluorine Crate"
+ desc = "Contains a jug filled with 150u of fluorine."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/fluorine)
+ crate_name = "bulk fluorine crate"
/datum/supply_pack/chemistry/hydrogen
name = "Bulk Hydrogen Crate"
desc = "Contains a jug filled with 150u of Hydrogen."
- cost = 500
+ cost = 750
contains = list(/obj/item/reagent_containers/glass/chem_jug/hydrogen)
crate_name = "bulk hydrogen crate"
+/datum/supply_pack/chemistry/iodine
+ name = "Bulk Iodine Crate"
+ desc = "Contains a jug filled with 150u of iodine."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/iodine)
+ crate_name = "bulk iodine crate"
+
+/datum/supply_pack/chemistry/lithium
+ name = "Bulk Lithium Crate"
+ desc = "Contains a jug filled with 150u of lithium."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/lithium)
+ crate_name = "bulk lithium crate"
+
+/datum/supply_pack/chemistry/mercury
+ name = "Bulk Mercury Crate"
+ desc = "Contains a jug filled with 150u of mercury."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/mercury)
+ crate_name = "bulk mercury crate"
+
/datum/supply_pack/chemistry/nitrogen
name = "Bulk Nitrogen Crate"
desc = "Contains a jug filled with 150u of nitrogen."
- cost = 625
+ cost = 750
contains = list(/obj/item/reagent_containers/glass/chem_jug/nitrogen)
crate_name = "bulk nitrogen crate"
-/datum/supply_pack/chemistry/aluminium
- name = "Bulk Aluminium Crate"
- desc = "Contains a jug filled with 150u of aluminium."
- cost = 625
- contains = list(/obj/item/reagent_containers/glass/chem_jug/aluminium)
- crate_name = "bulk aluminium crate"
-
-/datum/supply_pack/chemistry/copper
- name = "Bulk Copper Crate"
- desc = "Contains a jug filled with 150u of copper."
- cost = 625
- contains = list(/obj/item/reagent_containers/glass/chem_jug/copper)
- crate_name = "bulk copper crate"
-
-/datum/supply_pack/chemistry/bromine
- name = "Bulk Bromine Crate"
- desc = "Contains a jug filled with 150u of bromine."
- cost = 625
- contains = list(/obj/item/reagent_containers/glass/chem_jug/bromine)
- crate_name = "bulk bromine crate"
+/datum/supply_pack/chemistry/oxygen
+ name = "Bulk Oxygen Crate"
+ desc = "Contains a jug filled with 150u of oxygen."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/oxygen)
+ crate_name = "bulk oxygen crate"
-/datum/supply_pack/chemistry/iodine
- name = "Bulk Iodine Crate"
- desc = "Contains a jug filled with 150u of iodine."
+/datum/supply_pack/chemistry/phosphorus
+ name = "Bulk Phosphorus Crate"
+ desc = "Contains a jug filled with 150u of phosphorus."
cost = 750
- contains = list(/obj/item/reagent_containers/glass/chem_jug/iodine)
- crate_name = "bulk iodine crate"
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/phosphorus)
+ crate_name = "bulk phosphorus crate"
/datum/supply_pack/chemistry/potassium
name = "Bulk Potassium Crate"
@@ -116,23 +158,23 @@
contains = list(/obj/item/reagent_containers/glass/chem_jug/potassium)
crate_name = "bulk potassium crate"
+/datum/supply_pack/chemistry/radium
+ name = "Bulk Radium Crate"
+ desc = "Contains a jug filled with 150u of radium."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/radium)
+ crate_name = "bulk radium crate"
+
+/datum/supply_pack/chemistry/sodium
+ name = "Bulk Sodium Crate"
+ desc = "Contains a jug filled with 150u of sodium."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/chem_jug/sodium)
+ crate_name = "bulk sodium crate"
+
/datum/supply_pack/chemistry/sulfur
name = "Bulk Sulfur Crate"
desc = "Contains a jug filled with 150u of sulfur."
cost = 750
contains = list(/obj/item/reagent_containers/glass/chem_jug/sulfur)
crate_name = "bulk sulfur crate"
-
-/datum/supply_pack/chemistry/chlorine
- name = "Bulk Chlorine Crate"
- desc = "Contains a jug filled with 150u of chlorine."
- cost = 750
- contains = list(/obj/item/reagent_containers/glass/chem_jug/chlorine)
- crate_name = "bulk chlorine crate"
-
-/datum/supply_pack/chemistry/radium
- name = "Bulk Radium Crate"
- desc = "Contains a jug filled with 150u of radium."
- cost = 1000
- contains = list(/obj/item/reagent_containers/glass/chem_jug/radium)
- crate_name = "bulk radium crate"
diff --git a/code/modules/cargo/packs/costumes_toys.dm b/code/modules/cargo/packs/costumes_toys.dm
index fd3ba6c74863..cab2ac8563af 100644
--- a/code/modules/cargo/packs/costumes_toys.dm
+++ b/code/modules/cargo/packs/costumes_toys.dm
@@ -88,17 +88,10 @@
cost = 1000
contains = list(/obj/item/clothing/head/snowman,
/obj/item/clothing/suit/snowman,
- /obj/item/clothing/head/chicken,
- /obj/item/clothing/suit/chickensuit,
/obj/item/clothing/mask/gas/monkeymask,
- /obj/item/clothing/suit/monkeysuit,
/obj/item/clothing/head/cardborg,
/obj/item/clothing/suit/cardborg,
- /obj/item/clothing/head/xenos,
- /obj/item/clothing/suit/xenos,
- /obj/item/clothing/suit/hooded/ian_costume,
- /obj/item/clothing/suit/hooded/carp_costume,
- /obj/item/clothing/suit/hooded/bee_costume)
+ /obj/item/clothing/suit/hooded/carp_costume)
crate_name = "original costume crate"
crate_type = /obj/structure/closet/crate/wooden
@@ -143,7 +136,6 @@
/obj/item/clothing/neck/tie/blue,
/obj/item/clothing/neck/tie/red,
/obj/item/clothing/neck/tie/black,
- /obj/item/clothing/head/bowler,
/obj/item/clothing/head/fedora,
/obj/item/clothing/head/flatcap,
/obj/item/clothing/head/beret,
@@ -175,7 +167,6 @@
desc = "Flaunt your status with three unique, highly-collectable hats!"
cost = 20000
contains = list(/obj/item/clothing/head/collectable/chef,
- /obj/item/clothing/head/collectable/paper,
/obj/item/clothing/head/collectable/tophat,
/obj/item/clothing/head/collectable/captain,
/obj/item/clothing/head/collectable/beret,
@@ -183,18 +174,11 @@
/obj/item/clothing/head/collectable/flatcap,
/obj/item/clothing/head/collectable/pirate,
/obj/item/clothing/head/collectable/kitty,
- /obj/item/clothing/head/collectable/rabbitears,
/obj/item/clothing/head/collectable/wizard,
/obj/item/clothing/head/collectable/hardhat,
- /obj/item/clothing/head/collectable/HoS,
- /obj/item/clothing/head/collectable/HoP,
/obj/item/clothing/head/collectable/thunderdome,
/obj/item/clothing/head/collectable/swat,
- /obj/item/clothing/head/collectable/slime,
- /obj/item/clothing/head/collectable/police,
- /obj/item/clothing/head/collectable/slime,
- /obj/item/clothing/head/collectable/xenom,
- /obj/item/clothing/head/collectable/petehat)
+ /obj/item/clothing/head/collectable/police)
crate_name = "collectable hats crate"
crate_type = /obj/structure/closet/crate/wooden
diff --git a/code/modules/cargo/packs/food.dm b/code/modules/cargo/packs/food.dm
index f2b9d0ec09a7..364c53ec9eb5 100644
--- a/code/modules/cargo/packs/food.dm
+++ b/code/modules/cargo/packs/food.dm
@@ -64,12 +64,12 @@
name = "Basic Ingredients Crate"
desc = "Get things cooking with this crate full of useful ingredients! Contains a dozen eggs, two slabs of meat, some flour, some rice, a bottle of milk, a bottle of soymilk, and a bag of sugar."
cost = 300
- contains = list(/obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/condiment/flour,
- /obj/item/reagent_containers/food/condiment/rice,
- /obj/item/reagent_containers/food/condiment/milk,
- /obj/item/reagent_containers/food/condiment/soymilk,
- /obj/item/reagent_containers/food/condiment/sugar,
+ contains = list(/obj/item/reagent_containers/condiment/flour,
+ /obj/item/reagent_containers/condiment/flour,
+ /obj/item/reagent_containers/condiment/rice,
+ /obj/item/reagent_containers/condiment/milk,
+ /obj/item/reagent_containers/condiment/soymilk,
+ /obj/item/reagent_containers/condiment/sugar,
/obj/item/storage/fancy/egg_box,
/obj/item/reagent_containers/food/snacks/meat/slab,
/obj/item/reagent_containers/food/snacks/meat/slab
@@ -81,13 +81,13 @@
name = "Condiments Crate"
desc = "A variety of garnishes for topping off your dish with a little extra pizzaz. Contains a bottle of enzyme, a salt shaker, a pepper mill, a bottle of ketchup, a bottle of hot sauce, a bottle of BBQ sauce, and a bottle of cream."
cost = 250
- contains = list(/obj/item/reagent_containers/food/condiment/enzyme,
- /obj/item/reagent_containers/food/condiment/saltshaker,
- /obj/item/reagent_containers/food/condiment/peppermill,
- /obj/item/reagent_containers/food/condiment/ketchup,
- /obj/item/reagent_containers/food/condiment/hotsauce,
+ contains = list(/obj/item/reagent_containers/condiment/enzyme,
+ /obj/item/reagent_containers/condiment/saltshaker,
+ /obj/item/reagent_containers/condiment/peppermill,
+ /obj/item/reagent_containers/condiment/ketchup,
+ /obj/item/reagent_containers/condiment/hotsauce,
/obj/item/reagent_containers/food/drinks/bottle/cream,
- /obj/item/reagent_containers/food/condiment/bbqsauce
+ /obj/item/reagent_containers/condiment/bbqsauce
)
crate_name = "condiments crate"
crate_type = /obj/structure/closet/crate/freezer
@@ -189,6 +189,17 @@
crate_name = "food crate"
crate_type = /obj/structure/closet/crate/freezer
+/datum/supply_pack/food/sugar
+ name = "Sugar Crate"
+ desc = "A crate with a few bags of sugar. Good for cake shops and amateur chemists."
+ cost = 500
+ contains = list(/obj/item/reagent_containers/condiment/sugar,
+ /obj/item/reagent_containers/condiment/sugar,
+ /obj/item/reagent_containers/condiment/sugar
+ )
+ crate_name = "sugar crate"
+ crate_type = /obj/structure/closet/crate
+
/*
Cooking
*/
@@ -238,6 +249,19 @@
crate_name = "gardening crate"
crate_type = /obj/structure/closet/crate/hydroponics
+/datum/supply_pack/food/ethanol
+ name = "Ethanol Crate"
+ desc = "Five small bottles of ethanol for the aspiring botanist or amateur chemist."
+ cost = 750
+ contains = list(/obj/item/reagent_containers/glass/bottle/ethanol,
+ /obj/item/reagent_containers/glass/bottle/ethanol,
+ /obj/item/reagent_containers/glass/bottle/ethanol,
+ /obj/item/reagent_containers/glass/bottle/ethanol,
+ /obj/item/reagent_containers/glass/bottle/ethanol
+ )
+ crate_name = "gardening crate"
+ crate_type = /obj/structure/closet/crate/hydroponics
+
/datum/supply_pack/food/weedcontrol
name = "Weed Control Crate"
desc = "Contains a scythe, gasmask, and two anti-weed defoliant grenades, for when your garden grows out of control."
diff --git a/code/modules/cargo/packs/sec_supply.dm b/code/modules/cargo/packs/sec_supply.dm
index f0f062160c79..1045f2730ea9 100644
--- a/code/modules/cargo/packs/sec_supply.dm
+++ b/code/modules/cargo/packs/sec_supply.dm
@@ -90,19 +90,21 @@
crate_name = "combat knife crate"
*/
-/datum/supply_pack/sec_supply/fire
- name = "Incendiary Weapons Crate"
- desc = "Burn, baby burn. Contains three incendiary grenades and three prebuilt flamethrowers."
- cost = 5000
- contains = list(
- /obj/item/flamethrower/full,
- /obj/item/flamethrower/full,
- /obj/item/flamethrower/full,
- /obj/item/grenade/chem_grenade/incendiary,
- /obj/item/grenade/chem_grenade/incendiary,
- /obj/item/grenade/chem_grenade/incendiary,
- )
- crate_name = "incendiary weapons crate"
+/datum/supply_pack/sec_supply/flamethrower
+ name = "Flamethrower Crate"
+ desc = "Contains one flamethrower. Point the nozzle away from anything important."
+ cost = 1250
+ contains = list(/obj/item/flamethrower/full)
+ crate_name = "flamethrower crate"
+ crate_type = /obj/structure/closet/crate/secure/weapon
+ faction = FACTION_NGR
+
+/datum/supply_pack/sec_supply/incendiary_grenade
+ name = "Incendiary Grenade Crate"
+ desc = "Contains one incendiary grenade. Better not let it go off in your hands."
+ cost = 750
+ contains = list(/obj/item/grenade/chem_grenade/incendiary)
+ crate_name = "incendiary grenade crate"
crate_type = /obj/structure/closet/crate/secure/plasma
faction = FACTION_NGR
diff --git a/code/modules/cargo/packs/tools.dm b/code/modules/cargo/packs/tools.dm
index 25ed4aaab554..36bfefc02796 100644
--- a/code/modules/cargo/packs/tools.dm
+++ b/code/modules/cargo/packs/tools.dm
@@ -111,6 +111,13 @@
crate_name = "tank transfer valve crate"
crate_type = /obj/structure/closet/crate/secure/science
+/datum/supply_pack/tools/anglegrinder
+ name = "Angle Grinder"
+ desc = "Contains one angle grinder pack, a tool used for quick structure deconstruction and salvaging"
+ cost = 2000
+ contains = list(/obj/item/gear_pack/anglegrinder)
+ crate_name = "Angle Grinder"
+
/*
Liquid tanks
*/
@@ -146,3 +153,14 @@
contains = list(/obj/structure/reagent_dispensers/foamtank)
crate_name = "foam tank crate"
crate_type = /obj/structure/closet/crate/large
+
+/datum/supply_pack/tools/radfoamtank
+ name = "Radiation Foam Tank Crate"
+ desc = "Contains a tank of anti-radiation foam. Pressurized sprayer included!"
+ cost = 1500
+ contains = list(
+ /obj/item/watertank/anti_rad,
+ /obj/structure/reagent_dispensers/foamtank/antirad
+ )
+ crate_name = "foam tank crate"
+ crate_type = /obj/structure/closet/crate/large
diff --git a/code/modules/client/loadout/loadout_eyewear.dm b/code/modules/client/loadout/loadout_eyewear.dm
index 3ea37d68fed8..b6962a8dc34d 100644
--- a/code/modules/client/loadout/loadout_eyewear.dm
+++ b/code/modules/client/loadout/loadout_eyewear.dm
@@ -29,10 +29,6 @@
display_name = "eyepatch"
path = /obj/item/clothing/glasses/eyepatch
-/datum/gear/eyewear/monocle
- display_name = "monocle"
- path = /obj/item/clothing/glasses/monocle
-
/datum/gear/eyewear/cheapsuns
display_name = "cheap sunglasses"
path = /obj/item/clothing/glasses/cheapsuns
diff --git a/code/modules/client/loadout/loadout_hat.dm b/code/modules/client/loadout/loadout_hat.dm
index 32384a0d59fa..2f7e59c288b7 100644
--- a/code/modules/client/loadout/loadout_hat.dm
+++ b/code/modules/client/loadout/loadout_hat.dm
@@ -131,10 +131,6 @@
path = /obj/item/clothing/head/beanie/orange
//Misc
-/datum/gear/hat/bowler
- display_name = "bowler hat"
- path = /obj/item/clothing/head/bowler
-
/datum/gear/hat/that
display_name = "top hat"
path = /obj/item/clothing/head/that
diff --git a/code/modules/client/loadout/loadout_suit.dm b/code/modules/client/loadout/loadout_suit.dm
index 217998802d48..1d11857663ad 100644
--- a/code/modules/client/loadout/loadout_suit.dm
+++ b/code/modules/client/loadout/loadout_suit.dm
@@ -23,10 +23,6 @@
display_name = "leather jacket"
path = /obj/item/clothing/suit/jacket/leather
-/datum/gear/suit/jacket/leather/overcoat
- display_name = "leather overcoat"
- path = /obj/item/clothing/suit/jacket/leather/overcoat
-
/datum/gear/suit/jacket/leather/duster
display_name = "leather duster"
path = /obj/item/clothing/suit/jacket/leather/duster
@@ -105,10 +101,6 @@
path = /obj/item/clothing/suit/toggle/suspenders/gray
//Misc
-/datum/gear/suit/grponcho
- display_name = "poncho, green"
- path = /obj/item/clothing/suit/poncho/green
-
/datum/gear/suit/overalls
display_name = "overalls"
path = /obj/item/clothing/suit/apron/overalls
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index ec5b7d188db0..91eab6d53f0f 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -1153,7 +1153,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += "Hide Prayers:[(chat_toggles & CHAT_PRAYER)?"Shown":"Hidden"] "
dat += "Split Admin Tabs:[(toggles & SPLIT_ADMIN_TABS)?"Enabled":"Disabled"] "
dat += "Fast MC Refresh:[(toggles & FAST_MC_REFRESH)?"Enabled":"Disabled"] "
- dat += "Ignore Being Summoned as Cult Ghost:[(toggles & ADMIN_IGNORE_CULT_GHOST)?"Don't Allow Being Summoned":"Allow Being Summoned"] "
dat += "Briefing Officer Outfit:[brief_outfit] "
if(CONFIG_GET(flag/allow_admin_asaycolor))
dat += " "
@@ -2293,8 +2292,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
toggles ^= DEADMIN_POSITION_SECURITY
if("toggle_deadmin_silicon")
toggles ^= DEADMIN_POSITION_SILICON
- if("toggle_ignore_cult_ghost")
- toggles ^= ADMIN_IGNORE_CULT_GHOST
if("be_special")
var/be_special_type = href_list["be_special_type"]
diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm
index 3eea9ebec461..d4ff3169880d 100644
--- a/code/modules/clothing/factions/gezena.dm
+++ b/code/modules/clothing/factions/gezena.dm
@@ -102,6 +102,10 @@
w_class = WEIGHT_CLASS_NORMAL
supports_variations = DIGITIGRADE_VARIATION
+/obj/item/clothing/suit/space/gezena/Initialize()
+ . = ..()
+ allowed = GLOB.security_hardsuit_allowed
+
/obj/item/clothing/head/helmet/space/gezena
name = "\improper Rakalla-helm"
desc = "Featuring rubberized grommets fitting for any length of horn, and an internal monitor for life support."
diff --git a/code/modules/clothing/factions/nanotrasen.dm b/code/modules/clothing/factions/nanotrasen.dm
index 7aa871ad7f3e..6e605d5471b2 100644
--- a/code/modules/clothing/factions/nanotrasen.dm
+++ b/code/modules/clothing/factions/nanotrasen.dm
@@ -337,7 +337,7 @@
icon_state = "officer_peaked"
item_state = "bluecloth"
-/obj/item/clothing/head/nanotrasen/officer
+/obj/item/clothing/head/nanotrasen/officer/fedora
name = "officer's fedora"
desc = "A fedora in a violent shade of Nanotrasen Blue, with a red silk band."
icon_state = "officer_fedora"
diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm
index e011028246b6..c2dd59ecc1fb 100644
--- a/code/modules/clothing/glasses/_glasses.dm
+++ b/code/modules/clothing/glasses/_glasses.dm
@@ -1,7 +1,8 @@
//Glasses
/obj/item/clothing/glasses
name = "glasses"
- icon = 'icons/obj/clothing/glasses.dmi'
+ icon = 'icons/obj/clothing/eyes/eyes.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/eyes/eyes.dmi'
lefthand_file = 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
righthand_file = 'icons/mob/inhands/clothing/glasses_righthand.dmi'
w_class = WEIGHT_CLASS_SMALL
@@ -43,8 +44,6 @@
user.update_sight()
if(icon_state == "welding-g")
change_glass_color(user, /datum/client_colour/glass_colour/gray)
- else if(icon_state == "bustin-g")
- change_glass_color(user, /datum/client_colour/glass_colour/green)
else
change_glass_color(user, null)
@@ -82,19 +81,6 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
-/obj/item/clothing/glasses/meson/gar
- name = "gar mesons"
- icon_state = "garm"
- item_state = "garm"
- desc = "Do the impossible, see the invisible!"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- custom_price = 500
-
/obj/item/clothing/glasses/science
name = "science goggles"
desc = "A pair of snazzy goggles used to protect against chemical spills. Fitted with an analyzer for scanning items and reagents."
@@ -163,12 +149,6 @@
qdel(src)
user.put_in_hands(double_patch)
-/obj/item/clothing/glasses/monocle
- name = "monocle"
- desc = "Such a dapper eyepiece!"
- icon_state = "monocle"
- supports_variations = VOX_VARIATION
-
/obj/item/clothing/glasses/material
name = "optical material scanner"
desc = "Very confusing glasses."
@@ -182,19 +162,6 @@
desc = "Used by miners to detect ores deep within the rock."
darkness_view = 0
-/obj/item/clothing/glasses/material/mining/gar
- name = "gar material scanner"
- icon_state = "garm"
- item_state = "garm"
- desc = "Do the impossible, see the invisible!"
- force = 10
- throwforce = 20
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- glass_colour_type = /datum/client_colour/glass_colour/lightgreen
-
/obj/item/clothing/glasses/regular
name = "prescription glasses"
desc = "Made by Nerd. Co."
@@ -263,48 +230,6 @@
clothing_flags = SCAN_REAGENTS
glass_colour_type = /datum/client_colour/glass_colour/darkpurple
-/obj/item/clothing/glasses/sunglasses/garb
- name = "black gar glasses"
- desc = "Go beyond impossible and kick reason to the curb!"
- icon_state = "garb"
- item_state = "garb"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
-
-/obj/item/clothing/glasses/sunglasses/garb/supergarb
- name = "black giga gar glasses"
- desc = "Believe in us humans."
- icon_state = "supergarb"
- item_state = "garb"
- force = 12
- throwforce = 12
-
-/obj/item/clothing/glasses/sunglasses/gar
- name = "gar glasses"
- desc = "Just who the hell do you think I am?!"
- icon_state = "gar"
- item_state = "gar"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
- glass_colour_type = /datum/client_colour/glass_colour/orange
-
-/obj/item/clothing/glasses/sunglasses/gar/supergar
- name = "giga gar glasses"
- desc = "We evolve past the person we were a minute before. Little by little we advance with each turn. That's how a drill works!"
- icon_state = "supergar"
- item_state = "gar"
- force = 12
- throwforce = 12
- glass_colour_type = /datum/client_colour/glass_colour/red
-
/obj/item/clothing/glasses/sunglasses/ballistic
name = "ballistic goggles"
desc = "A pair of flash-proof ballistic goggles."
@@ -330,17 +255,6 @@
/obj/item/clothing/glasses/welding/attack_self(mob/user)
weldingvisortoggle(user)
-/obj/item/clothing/glasses/welding/ghostbuster
- name = "optical ecto-scanner"
- desc = "A bulky pair of unwieldy glasses that lets you see things best left unseen. Obscures vision, but also gives a bit of eye protection"
- icon_state = "bustin-g"
- item_state = "bustin-g"
- invis_view = SEE_INVISIBLE_OBSERVER
- invis_override = null
- flash_protect = 1
- visor_vars_to_toggle = VISOR_FLASHPROTECT | VISOR_TINT | VISOR_INVISVIEW
- glass_colour_type = /datum/client_colour/glass_colour/green
-
/obj/item/clothing/glasses/blindfold
name = "blindfold"
desc = "Covers the eyes, preventing sight."
@@ -389,7 +303,7 @@
. = ..()
if(!isinhands && ishuman(loc) && !colored_before)
var/mob/living/carbon/human/H = loc
- var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes.dmi', "blindfoldwhite")
+ var/mutable_appearance/M = mutable_appearance('icons/mob/clothing/eyes/eyes.dmi', "blindfoldwhite")
M.appearance_flags |= RESET_COLOR
M.color = "#[H.eye_color]"
. += M
@@ -455,20 +369,6 @@
return
chameleon_action.emp_randomise()
-/obj/item/clothing/glasses/thermal/monocle
- name = "thermoncle"
- desc = "Never before has seeing through walls felt so gentlepersonly."
- icon_state = "thermoncle"
- flags_1 = null //doesn't protect eyes because it's a monocle, duh
-
-/obj/item/clothing/glasses/thermal/monocle/examine(mob/user) //Different examiners see a different description!
- if(user.gender == MALE)
- desc = replacetext(desc, "person", "man")
- else if(user.gender == FEMALE)
- desc = replacetext(desc, "person", "woman")
- . = ..()
- desc = initial(desc)
-
/obj/item/clothing/glasses/thermal/eyepatch
name = "optical thermal eyepatch"
desc = "An eyepatch with built-in thermal optics."
@@ -516,35 +416,6 @@
item_state = "redglasses"
glass_colour_type = /datum/client_colour/glass_colour/red
-/obj/item/clothing/glasses/godeye
- name = "eye of god"
- desc = "A strange eye, said to have been torn from an omniscient creature that used to roam the wastes."
- icon_state = "godeye"
- item_state = "godeye"
- vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS
- darkness_view = 8
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- resistance_flags = LAVA_PROOF | FIRE_PROOF
- clothing_flags = SCAN_REAGENTS
-
-/obj/item/clothing/glasses/godeye/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT)
-
-/obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W, src) && W != src && W.loc == user)
- if(W.icon_state == "godeye")
- W.icon_state = "doublegodeye"
- W.item_state = "doublegodeye"
- W.desc = "A pair of strange eyes, said to have been torn from an omniscient creature that used to roam the wastes. There's no real reason to have two, but that isn't stopping you."
- if(iscarbon(user))
- var/mob/living/carbon/C = user
- C.update_inv_wear_mask()
- else
- to_chat(user, "The eye winks at you and vanishes into the abyss, you feel really unlucky.")
- qdel(src)
- ..()
-
/obj/item/clothing/glasses/AltClick(mob/user)
if(glass_colour_type && ishuman(user))
var/mob/living/carbon/human/H = user
diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm
index 559816007b13..6891ac7de31a 100644
--- a/code/modules/clothing/glasses/hud.dm
+++ b/code/modules/clothing/glasses/hud.dm
@@ -162,26 +162,6 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE
glass_colour_type = /datum/client_colour/glass_colour/green
-/obj/item/clothing/glasses/hud/security/sunglasses/gars
- name = "\improper HUD gar glasses"
- desc = "GAR glasses with a HUD."
- icon_state = "gars"
- item_state = "garb"
- force = 10
- throwforce = 10
- throw_speed = 4
- attack_verb = list("sliced")
- hitsound = 'sound/weapons/bladeslice.ogg'
- sharpness = IS_SHARP
-
-/obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars
- name = "giga HUD gar glasses"
- desc = "GIGA GAR glasses with a HUD."
- icon_state = "supergars"
- item_state = "garb"
- force = 12
- throwforce = 12
-
/obj/item/clothing/glasses/hud/toggle
name = "Toggle HUD"
desc = "A hud with multiple functions."
diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm
index 5aa39eb0ba57..3a930d728ad7 100644
--- a/code/modules/clothing/head/beanie.dm
+++ b/code/modules/clothing/head/beanie.dm
@@ -53,10 +53,6 @@
//Striped Beanies have unique sprites
-/obj/item/clothing/head/beanie/christmas
- name = "christmas beanie"
- icon_state = "beaniechristmas"
-
/obj/item/clothing/head/beanie/striped
name = "striped beanie"
icon_state = "beaniestriped"
@@ -78,15 +74,3 @@
desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer."
icon_state = "beaniedurathread"
armor = list("melee" = 15, "bullet" = 5, "laser" = 15, "energy" = 25, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 30, "acid" = 5)
-
-/obj/item/clothing/head/beanie/waldo
- name = "red striped bobble hat"
- desc = "If you're going on a worldwide hike, you'll need some cold protection."
- icon_state = "waldo_hat"
-
-/obj/item/clothing/head/beanie/rasta
- name = "rastacap"
- desc = "Perfect for tucking in those dreadlocks."
- icon_state = "beanierasta"
-
-//No dog fashion sprites yet :( poor Ian can't be dope like the rest of us yet
diff --git a/code/modules/clothing/head/berets.dm b/code/modules/clothing/head/berets.dm
index 9d3ca21ed4f0..78d77908cd30 100644
--- a/code/modules/clothing/head/berets.dm
+++ b/code/modules/clothing/head/berets.dm
@@ -5,18 +5,6 @@
icon_state = "beret"
dog_fashion = /datum/dog_fashion/head/beret
-/obj/item/clothing/head/beret/vintage
- name = "vintage beret"
- desc = "A well-worn beret."
- icon_state = "vintageberet"
- dog_fashion = null
-
-/obj/item/clothing/head/beret/archaic
- name = "archaic beret"
- desc = "An absolutely ancient beret."
- icon_state = "archaicberet"
- dog_fashion = null
-
/obj/item/clothing/head/beret/black
name = "black beret"
desc = "A black beret."
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 036d6ffbd417..9aa05ea897ce 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -5,17 +5,6 @@
name = "collectable hat"
desc = "A rare collectable hat."
-/obj/item/clothing/head/collectable/petehat
- name = "ultra rare Pete's hat!"
- desc = "It smells faintly of plasma."
- icon_state = "petehat"
-
-/obj/item/clothing/head/collectable/xenom
- name = "collectable xenomorph helmet!"
- desc = "Hiss hiss hiss!"
- clothing_flags = SNUG_FIT
- icon_state = "xenom"
-
/obj/item/clothing/head/collectable/chef
name = "collectable chef's hat"
desc = "A rare chef's hat meant for hat collectors!"
@@ -24,12 +13,6 @@
dog_fashion = /datum/dog_fashion/head/chef
-/obj/item/clothing/head/collectable/paper
- name = "collectable paper hat"
- desc = "What looks like an ordinary paper hat is actually a rare and valuable collector's edition paper hat. Keep away from water, fire, and Curators."
- icon_state = "paper"
- dog_fashion = /datum/dog_fashion/head
-
/obj/item/clothing/head/collectable/tophat
name = "collectable top hat"
desc = "A top hat worn by only the most prestigious hat collectors."
@@ -64,12 +47,6 @@
item_state = "welding"
clothing_flags = SNUG_FIT
-/obj/item/clothing/head/collectable/slime
- name = "collectable slime hat"
- desc = "Just like a real brain slug!"
- icon_state = "headslime"
- clothing_flags = SNUG_FIT
-
/obj/item/clothing/head/collectable/flatcap
name = "collectable flat cap"
desc = "A collectible laborer's flat cap! Smells like No. 9 coal..."
@@ -91,13 +68,6 @@
dog_fashion = /datum/dog_fashion/head/kitty
-/obj/item/clothing/head/collectable/rabbitears
- name = "collectable rabbit ears"
- desc = "Not as lucky as the feet!"
- icon_state = "bunny"
-
- dog_fashion = /datum/dog_fashion/head/rabbit
-
/obj/item/clothing/head/collectable/wizard
name = "collectable wizard's hat"
desc = "NOTE: Any magical powers gained from wearing this hat are purely coincidental."
@@ -111,16 +81,6 @@
icon_state = "hardhat_standard"
dog_fashion = /datum/dog_fashion/head
-/obj/item/clothing/head/collectable/HoS
- name = "collectable HoS hat"
- desc = "Now you too can beat prisoners, set silly sentences, and arrest for no reason!"
- icon_state = "hoscap"
-
-/obj/item/clothing/head/collectable/HoP
- name = "collectable HoP hat"
- desc = "It's your turn to demand excessive paperwork, signatures, stamps, and hire more clowns! Papers, please!"
- icon_state = "hopcap_nt"
- dog_fashion = /datum/dog_fashion/head/head_of_personnel
/obj/item/clothing/head/collectable/thunderdome
name = "collectable Thunderdome helmet"
diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm
index 3e04245e1a14..416fa20df39c 100644
--- a/code/modules/clothing/head/jobs.dm
+++ b/code/modules/clothing/head/jobs.dm
@@ -33,10 +33,6 @@
desc = "A commanding white stetson adorned with a general's badge. Why this belongs to a captain is anybody's guess."
icon_state = "cowboycap"
-/obj/item/clothing/head/caphat/nt
- name = "captain's hat"
- icon_state = "captain_nt"
-
/obj/item/clothing/head/frontier/peaked
name = "\improper Frontiersmen commander's cap"
desc = "An imposing peaked cap, meant for a commander of the Frontiersmen."
@@ -47,41 +43,6 @@
desc = "An imposing peaked cap meant for only the highest of officers of the Frontiersmen pirate fleet."
icon_state = "frontier_admiral_cap"
-//Head of Personnel
-/obj/item/clothing/head/hopcap
- name = "head of personnel's cap"
- icon_state = "hopcap"
- desc = "The symbol of true bureaucratic micromanagement."
- dog_fashion = /datum/dog_fashion/head/head_of_personnel
-
-/obj/item/clothing/head/hopcap/nt
- icon_state = "hopcap_nt"
- dog_fashion = /datum/dog_fashion/head/head_of_personnel
-
-//Cargo
-/obj/item/clothing/head/supply_chief
- name = "supply chief's cap"
- desc = "The one thing between you and 40 boxes of orderable pizza is the person wearing this hat."
- icon_state = "supply_chief_cap"
-
-/obj/item/clothing/head/deliveries_officer
- name = "deliveries officer's cap"
- desc = "Whether through fires, the vacuum of space, or hordes of souless husks of grey suited criminals, your crate will always be delivered!"
- icon_state = "deliveries_officer_cap"
-
-//Chaplain
-/obj/item/clothing/head/nun_hood
- name = "nun hood"
- desc = "Maximum piety in this star system."
- icon_state = "nun_hood"
- flags_inv = HIDEHAIR
- flags_cover = HEADCOVERSEYES
-
-/obj/item/clothing/head/bishopmitre
- name = "bishop mitre"
- desc = "An opulent hat that functions as a radio to God. Or as a lightning rod, depending on who you ask."
- icon_state = "bishopmitre"
-
//Detective
/obj/item/clothing/head/fedora/det_hat
name = "detective's fedora"
@@ -252,12 +213,3 @@
#undef DRILL_SHOUTING
#undef DRILL_YELLING
#undef DRILL_CANADIAN
-
-/obj/item/clothing/head/witchunter
- name = "witchunter hat"
- desc = "This hat saw much use back in the day."
- icon_state = "witchhunterhat"
- item_state = "witchhunterhat"
- flags_cover = HEADCOVERSEYES
- flags_inv = HIDEEYES|HIDEHAIR
- armor = list("melee" = 30, "bullet" = 10, "laser" = 10, "energy" = 10, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80)
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index 61f032b5ef61..b2636b02871b 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -17,18 +17,6 @@
armor = list("melee" = 30, "bullet" = 15, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
strip_delay = (8 SECONDS)
-/obj/item/clothing/head/spacepolice
- name = "space police cap"
- desc = "A blue cap for patrolling the daily beat."
- icon_state = "policecap_families"
- item_state = "policecap_families"
-
-/obj/item/clothing/head/powdered_wig
- name = "powdered wig"
- desc = "A powdered wig."
- icon_state = "pwig"
- item_state = "pwig"
-
/obj/item/clothing/head/that
name = "top-hat"
desc = "It's an amish looking hat."
@@ -37,30 +25,6 @@
dog_fashion = /datum/dog_fashion/head
throwforce = 1
-/obj/item/clothing/head/canada
- name = "striped red tophat"
- desc = "It smells like fresh donut holes. / Il sent comme des trous de beignets frais."
- icon_state = "canada"
- item_state = "canada"
-
-/obj/item/clothing/head/redcoat
- name = "redcoat's hat"
- icon_state = "redcoat"
- desc = "'I guess it's a redhead.'"
-
-/obj/item/clothing/head/plaguedoctorhat
- name = "plague doctor's hat"
- desc = "These were once used by plague doctors. They're pretty much useless."
- icon_state = "plaguedoctor"
- permeability_coefficient = 0.01
-
-/obj/item/clothing/head/hasturhood
- name = "hastur's hood"
- desc = "It's unspeakably stylish."
- icon_state = "hasturhood"
- flags_inv = HIDEHAIR
- flags_cover = HEADCOVERSEYES
-
/obj/item/clothing/head/nursehat
name = "nurse's hat"
desc = "It allows quick identification of trained medical personnel."
@@ -78,15 +42,6 @@
clothing_flags = SNUG_FIT
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-/obj/item/clothing/head/cueball
- name = "cueball helmet"
- desc = "A large, featureless white orb meant to be worn on your head. How do you even see out of this thing?"
- icon_state = "cueball"
- item_state="cueball"
- clothing_flags = SNUG_FIT
- flags_cover = HEADCOVERSEYES|HEADCOVERSMOUTH
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-
/obj/item/clothing/head/snowman
name = "Snowman Head"
desc = "A ball of white styrofoam. So festive."
@@ -96,38 +51,6 @@
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-/obj/item/clothing/head/justice
- name = "justice hat"
- desc = "Fight for what's righteous!"
- icon_state = "justicered"
- item_state = "justicered"
- clothing_flags = SNUG_FIT
- flags_inv = HIDEHAIR|HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR
- flags_cover = HEADCOVERSEYES
-
-/obj/item/clothing/head/justice/blue
- icon_state = "justiceblue"
- item_state = "justiceblue"
-
-/obj/item/clothing/head/justice/yellow
- icon_state = "justiceyellow"
- item_state = "justiceyellow"
-
-/obj/item/clothing/head/justice/green
- icon_state = "justicegreen"
- item_state = "justicegreen"
-
-/obj/item/clothing/head/justice/pink
- icon_state = "justicepink"
- item_state = "justicepink"
-
-/obj/item/clothing/head/rabbitears
- name = "rabbit ears"
- desc = "A headband with a pair of faux rabbit ears."
- icon_state = "bunny"
-
- dog_fashion = /datum/dog_fashion/head/rabbit
-
/obj/item/clothing/head/pirate
name = "pirate hat"
desc = "Yarr."
@@ -170,42 +93,12 @@
icon_state = "bandana"
item_state = "bandana"
-/obj/item/clothing/head/bowler
- name = "bowler-hat"
- desc = "Gentleman, elite aboard!"
- icon_state = "bowler"
- item_state = "bowler"
-
-/obj/item/clothing/head/witchwig
- name = "witch costume wig"
- desc = "Eeeee~heheheheheheh!"
- icon_state = "witch"
- item_state = "witch"
- flags_inv = HIDEHAIR
-
-/obj/item/clothing/head/chicken
- name = "chicken suit head"
- desc = "Bkaw!"
- icon_state = "chickenhead"
- item_state = "chickensuit"
- clothing_flags = SNUG_FIT
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-
/obj/item/clothing/head/bearpelt
name = "bear pelt hat"
desc = "Fuzzy."
icon_state = "bearpelt"
item_state = "bearpelt"
-/obj/item/clothing/head/xenos
- name = "xenos helmet"
- icon_state = "xenos"
- item_state = "xenos_helm"
- desc = "A helmet made out of chitinous alien hide."
- clothing_flags = SNUG_FIT
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
- flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
-
/obj/item/clothing/head/fedora
name = "fedora"
icon_state = "fedora"
@@ -229,34 +122,6 @@
item_state = "hat_solgov"
desc = "A slick blue hat used by both solarian civilians and physicists."
-/obj/item/clothing/head/sombrero
- name = "sombrero"
- icon_state = "sombrero"
- item_state = "sombrero"
- desc = "You can practically taste the fiesta."
- flags_inv = HIDEHAIR
-
- dog_fashion = /datum/dog_fashion/head/sombrero
-
-/obj/item/clothing/head/sombrero/green
- name = "green sombrero"
- icon_state = "greensombrero"
- item_state = "greensombrero"
- desc = "As elegant as a dancing cactus."
- flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS
- dog_fashion = null
-
-/obj/item/clothing/head/sombrero/shamebrero
- name = "shamebrero"
- icon_state = "shamebrero"
- item_state = "shamebrero"
- desc = "Once it's on, it never comes off."
- dog_fashion = null
-
-/obj/item/clothing/head/sombrero/shamebrero/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
-
/obj/item/clothing/head/flatcap
name = "flat cap"
desc = "A working man's hat."
@@ -297,14 +162,6 @@
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
dog_fashion = /datum/dog_fashion/head/santa
-/obj/item/clothing/head/jester
- name = "jester hat"
- desc = "A hat with bells, to add some merriness to the suit."
- icon_state = "jester_hat"
-
-/obj/item/clothing/head/jester/alt
- icon_state = "jester2"
-
/obj/item/clothing/head/rice_hat
name = "rice hat"
desc = "Welcome to the rice fields, motherfucker."
@@ -328,45 +185,6 @@
icon_state = "crown"
resistance_flags = FIRE_PROOF
-/obj/item/clothing/head/crown/fancy
- name = "magnificent crown"
- desc = "A crown worn by only the highest emperors of the land space."
- icon_state = "fancycrown"
-
-/obj/item/clothing/head/scarecrow_hat
- name = "scarecrow hat"
- desc = "A simple straw hat."
- icon_state = "scarecrow_hat"
-
-/obj/item/clothing/head/lobsterhat
- name = "foam lobster head"
- desc = "When everything's going to crab, protecting your head is the best choice."
- icon_state = "lobster_hat"
- clothing_flags = SNUG_FIT
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-
-/obj/item/clothing/head/drfreezehat
- name = "doctor freeze's wig"
- desc = "A cool wig for cool people."
- icon_state = "drfreeze_hat"
- flags_inv = HIDEHAIR
-
-/obj/item/clothing/head/pharaoh
- name = "pharaoh hat"
- desc = "Walk like an Egyptian."
- icon_state = "pharoah_hat"
- item_state = "pharoah_hat"
-
-/obj/item/clothing/head/nemes
- name = "headdress of Nemes"
- desc = "Lavish space tomb not included."
- icon_state = "nemes_headdress"
-
-/obj/item/clothing/head/delinquent
- name = "delinquent hat"
- desc = "Good grief."
- icon_state = "delinquent"
-
/obj/item/clothing/head/frenchberet
name = "french beret"
desc = "A quality beret, infused with the aroma of chain-smoking, wine-swilling Parisians. You feel less inclined to engage in military conflict, for some reason."
@@ -402,56 +220,12 @@
message += pick(" Honh honh honh!"," Honh!"," Zut Alors!")
speech_args[SPEECH_MESSAGE] = trim(message)
-/obj/item/clothing/head/clownmitre
- name = "Hat of the Honkmother"
- desc = "It's hard for parishoners to see a banana peel on the floor when they're looking up at your glorious chapeau."
- icon_state = "clownmitre"
-
-/obj/item/clothing/head/kippah
- name = "kippah"
- desc = "Signals that you follow the Jewish Halakha. Keeps the head covered and the soul extra-Orthodox."
- icon_state = "kippah"
-
-/obj/item/clothing/head/taqiyahwhite
- name = "white taqiyah"
- desc = "An extra-mustahabb way of showing your devotion to Allah."
- icon_state = "taqiyahwhite"
- pocket_storage_component_path = /datum/component/storage/concrete/pockets/small
-
-/obj/item/clothing/head/taqiyahred
- name = "red taqiyah"
- desc = "An extra-mustahabb way of showing your devotion to Allah."
- icon_state = "taqiyahred"
- pocket_storage_component_path = /datum/component/storage/concrete/pockets/small
-
-/obj/item/clothing/head/shrine_wig
- name = "shrine maiden's wig"
- desc = "Purify in style!"
- flags_inv = HIDEHAIR //bald
- mob_overlay_icon = 'icons/mob/large-worn-icons/64x64/head.dmi'
- icon_state = "shrine_wig"
- item_state = "shrine_wig"
- worn_x_dimension = 64
- worn_y_dimension = 64
-
/obj/item/clothing/head/intern
name = "\improper CentCom Head Intern beancap"
desc = "A horrifying mix of beanie and softcap in CentCom green. You'd have to be pretty desperate for power over your peers to agree to wear this."
icon_state = "intern_hat"
item_state = "intern_hat"
-/obj/item/clothing/head/goatpelt
- name = "goat pelt hat"
- desc = "Fuzzy and Warm!"
- icon_state = "goatpelt"
- item_state = "goatpelt"
-
-/obj/item/clothing/head/jackbros
- name = "frosty hat"
- desc = "Hee-ho!"
- icon_state = "JackFrostHat"
- item_state = "JackFrostHat"
-
/obj/item/clothing/head/maidheadband/syndicate
name = "tactical maid headband"
desc = "Tacticute."
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index 5b8e228b49ee..3cd7c022887c 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -33,82 +33,6 @@
/obj/item/clothing/head/welding/attack_self(mob/user)
weldingvisortoggle(user)
-/*
- * Cakehat
- */
-/obj/item/clothing/head/hardhat/cakehat
- name = "cakehat"
- desc = "You put the cake on your head. Brilliant."
- icon_state = "hardhat_cakehat"
- item_state = "hardhat_cakehat"
- lefthand_file = 'icons/mob/inhands/clothing_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/clothing_righthand.dmi'
- hitsound = 'sound/weapons/tap.ogg'
- var/hitsound_on = 'sound/weapons/sear.ogg' //so we can differentiate between cakehat and energyhat
- var/hitsound_off = 'sound/weapons/tap.ogg'
- var/force_on = 15
- var/throwforce_on = 15
- var/damtype_on = BURN
- flags_inv = HIDEEARS|HIDEHAIR
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- light_range = 2 //luminosity when on
- flags_cover = HEADCOVERSEYES
- heat = 999
-
- dog_fashion = /datum/dog_fashion/head
-
-/obj/item/clothing/head/hardhat/cakehat/process()
- var/turf/location = src.loc
- if(ishuman(location))
- var/mob/living/carbon/human/M = location
- if(M.is_holding(src) || M.head == src)
- location = M.loc
-
- if(isturf(location))
- location.hotspot_expose(700, 1)
-
-/obj/item/clothing/head/hardhat/cakehat/turn_on(mob/living/user)
- ..()
- force = force_on
- throwforce = throwforce_on
- damtype = damtype_on
- hitsound = hitsound_on
- START_PROCESSING(SSobj, src)
-
-/obj/item/clothing/head/hardhat/cakehat/turn_off(mob/living/user)
- ..()
- force = 0
- throwforce = 0
- damtype = BRUTE
- hitsound = hitsound_off
- STOP_PROCESSING(SSobj, src)
-
-/obj/item/clothing/head/hardhat/cakehat/get_temperature()
- return on * heat
-
-/obj/item/clothing/head/hardhat/cakehat/energycake
- name = "energy cake"
- desc = "You put the energy sword on your cake. Brilliant."
- icon_state = "hardhat_energycake"
- item_state = "hardhat_energycake"
- hitsound = 'sound/weapons/tap.ogg'
- hitsound_on = 'sound/weapons/blade1.ogg'
- hitsound_off = 'sound/weapons/tap.ogg'
- damtype_on = BRUTE
- force_on = 18 //same as epen (but much more obvious)
- light_range = 3 //ditto
- heat = 0
-
-/obj/item/clothing/head/hardhat/cakehat/energycake/turn_on(mob/living/user)
- playsound(user, 'sound/weapons/saberon.ogg', 5, TRUE)
- to_chat(user, "You turn on \the [src].")
- ..()
-
-/obj/item/clothing/head/hardhat/cakehat/energycake/turn_off(mob/living/user)
- playsound(user, 'sound/weapons/saberoff.ogg', 5, TRUE)
- to_chat(user, "You turn off \the [src].")
- ..()
-
/*
* Trapper Hat
*/
@@ -181,17 +105,6 @@
if(ishuman(user))
add_atom_colour("#[user.hair_color]", FIXED_COLOUR_PRIORITY)
-/obj/item/clothing/head/hardhat/reindeer
- name = "novelty reindeer hat"
- desc = "Some fake antlers and a very fake red nose."
- icon_state = "hardhat_reindeer"
- item_state = "hardhat_reindeer"
- flags_inv = 0
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- light_range = 1 //luminosity when on
-
- dog_fashion = /datum/dog_fashion/head/reindeer
-
/obj/item/clothing/head/cardborg
name = "cardborg helmet"
desc = "A helmet made out of a box."
@@ -304,69 +217,6 @@
flags_inv = HIDEEARS|HIDEHAIR
armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = -15, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
-/obj/item/clothing/head/foilhat
- name = "tinfoil hat"
- desc = "Thought control rays, psychotronic scanning. Don't mind that, I'm protected cause I made this hat."
- icon_state = "foilhat"
- item_state = "foilhat"
- armor = list("melee" = 0, "bullet" = 0, "laser" = -5,"energy" = -15, "bomb" = 0, "bio" = 0, "rad" = -5, "fire" = 0, "acid" = 0)
- equip_delay_other = 140
- clothing_flags = ANTI_TINFOIL_MANEUVER
- var/datum/brain_trauma/mild/phobia/conspiracies/paranoia
- var/warped = FALSE
-
-/obj/item/clothing/head/foilhat/equipped(mob/living/carbon/human/user, slot)
- . = ..()
- if(slot != ITEM_SLOT_HEAD || warped)
- return
- if(paranoia)
- QDEL_NULL(paranoia)
- paranoia = new()
-
- user.gain_trauma(paranoia, TRAUMA_RESILIENCE_MAGIC)
- to_chat(user, "As you don the foiled hat, an entire world of conspiracy theories and seemingly insane ideas suddenly rush into your mind. What you once thought unbelievable suddenly seems.. undeniable. Everything is connected and nothing happens just by accident. You know too much and now they're out to get you. ")
-
-/obj/item/clothing/head/foilhat/MouseDrop(atom/over_object)
- //God Im sorry
- if(!warped && iscarbon(usr))
- var/mob/living/carbon/C = usr
- if(src == C.head)
- to_chat(C, "Why would you want to take this off? Do you want them to get into your mind?!")
- return
- return ..()
-
-/obj/item/clothing/head/foilhat/dropped(mob/user)
- . = ..()
- if(paranoia)
- QDEL_NULL(paranoia)
-
-/obj/item/clothing/head/foilhat/proc/warp_up()
- name = "scorched tinfoil hat"
- desc = "A badly warped up hat. Quite unprobable this will still work against any of fictional and contemporary dangers it used to."
- warped = TRUE
- clothing_flags &= ~ANTI_TINFOIL_MANEUVER
- if(!isliving(loc) || !paranoia)
- return
- var/mob/living/target = loc
- if(target.get_item_by_slot(ITEM_SLOT_HEAD) != src)
- return
- QDEL_NULL(paranoia)
- if(target.stat < UNCONSCIOUS)
- to_chat(target, "Your zealous conspirationism rapidly dissipates as the donned hat warps up into a ruined mess. All those theories starting to sound like nothing but a ridicolous fanfare.")
-
-/obj/item/clothing/head/foilhat/attack_hand(mob/user)
- if(!warped && iscarbon(user))
- var/mob/living/carbon/C = user
- if(src == C.head)
- to_chat(user, "Why would you want to take this off? Do you want them to get into your mind?!")
- return
- return ..()
-
-/obj/item/clothing/head/foilhat/microwave_act(obj/machinery/microwave/M)
- . = ..()
- if(!warped)
- warp_up()
-
/obj/item/clothing/head/plastic_flower
name = "plastic flower"
desc = "A realistic imitation of a flower. Not edible though."
diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
index 8401455bf7d8..b685e0e4b8bb 100644
--- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
+++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
@@ -89,11 +89,11 @@
var/loops = rand(1,3)
for(var/i in 1 to loops)
var/ammotype = pick(list(
- /obj/item/ammo_box/c8x50mm_box,
- /obj/item/ammo_box/c45,
- /obj/item/ammo_box/a357_box,
- /obj/item/ammo_box/c45,
- /obj/item/ammo_box/a4570,
+ /obj/item/storage/box/ammo/a8_50r,
+ /obj/item/storage/box/ammo/c45,
+ /obj/item/storage/box/ammo/a357,
+ /obj/item/storage/box/ammo/c45,
+ /obj/item/storage/box/ammo/a4570,
/obj/item/stock_parts/cell/gun/mini))
backpack_contents += ammotype
@@ -220,7 +220,11 @@
l_hand = /obj/item/flamethrower/full/tank
- backpack_contents = list(/obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1,/obj/item/ammo_box/a12g=1,/obj/item/extinguisher=2,/obj/item/radio=1)
+ backpack_contents = list(
+ /obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1, \
+ /obj/item/storage/box/ammo/a12g_slug = 1, \
+ /obj/item/extinguisher = 2, \
+ /obj/item/radio=1)
/datum/outfit/job/frontiersmen/ert/sentry_lmg
diff --git a/code/modules/clothing/outfits/event.dm b/code/modules/clothing/outfits/event.dm
deleted file mode 100644
index 18af4e8b663f..000000000000
--- a/code/modules/clothing/outfits/event.dm
+++ /dev/null
@@ -1,26 +0,0 @@
-/datum/outfit/santa //ho ho ho!
- name = "Santa Claus"
-
- uniform = /obj/item/clothing/under/color/red
- shoes = /obj/item/clothing/shoes/sneakers/red
- suit = /obj/item/clothing/suit/space/santa
- head = /obj/item/clothing/head/santa
- back = /obj/item/storage/backpack/santabag
- r_pocket = /obj/item/flashlight
- gloves = /obj/item/clothing/gloves/color/red
-
- box = /obj/item/storage/box/survival/engineer
- backpack_contents = list(/obj/item/a_gift/anything = 5)
-
-/datum/outfit/santa/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(visualsOnly)
- return
- H.fully_replace_character_name(H.real_name, "Santa Claus")
- H.mind.assigned_role = "Santa"
- H.mind.special_role = "Santa"
-
- H.hairstyle = "Long Hair 3"
- H.facial_hairstyle = "Beard (Full)"
- H.hair_color = "FFF"
- H.facial_hair_color = "FFF"
- H.update_hair()
diff --git a/code/modules/clothing/outfits/factions/independent.dm b/code/modules/clothing/outfits/factions/independent.dm
index 2b93739fb0f9..ba883d59f4dd 100644
--- a/code/modules/clothing/outfits/factions/independent.dm
+++ b/code/modules/clothing/outfits/factions/independent.dm
@@ -173,7 +173,6 @@
uniform = /obj/item/clothing/under/rank/command/head_of_personnel
dcoat = /obj/item/clothing/suit/hooded/wintercoat/captain
shoes = /obj/item/clothing/shoes/sneakers/brown
- head = /obj/item/clothing/head/hopcap
backpack_contents = list(/obj/item/storage/box/ids=1,\
/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
@@ -536,7 +535,6 @@
ears = /obj/item/radio/headset/headset_cargo
uniform = /obj/item/clothing/under/rank/cargo/qm
- head = /obj/item/clothing/head/supply_chief
dcoat = /obj/item/clothing/suit/hooded/wintercoat/cargo
shoes = /obj/item/clothing/shoes/sneakers/brown
glasses = /obj/item/clothing/glasses/sunglasses
diff --git a/code/modules/clothing/outfits/factions/inteq.dm b/code/modules/clothing/outfits/factions/inteq.dm
index 16d1456361be..51e1cf1fb29f 100644
--- a/code/modules/clothing/outfits/factions/inteq.dm
+++ b/code/modules/clothing/outfits/factions/inteq.dm
@@ -24,6 +24,7 @@
jobtype = /datum/job/assistant
job_icon = "assistant"
+ ears = /obj/item/radio/headset
r_pocket = /obj/item/radio
///captains
@@ -135,6 +136,7 @@
jobtype = /datum/job/officer
job_icon = "securityofficer"
+ ears = /obj/item/radio/headset/alt
head = /obj/item/clothing/head/helmet/inteq
suit = /obj/item/clothing/suit/armor/vest/alt
belt = /obj/item/storage/belt/security/webbing/inteq
@@ -181,6 +183,7 @@
job_icon = "stationengineer"
jobtype = /datum/job/engineer
+ ears = /obj/item/radio/headset/alt
uniform = /obj/item/clothing/under/syndicate/inteq/artificer
head = /obj/item/clothing/head/soft/inteq
shoes = /obj/item/clothing/shoes/combat
diff --git a/code/modules/clothing/outfits/factions/nanotrasen.dm b/code/modules/clothing/outfits/factions/nanotrasen.dm
index e292a6e61d03..3c9e379e74db 100644
--- a/code/modules/clothing/outfits/factions/nanotrasen.dm
+++ b/code/modules/clothing/outfits/factions/nanotrasen.dm
@@ -401,6 +401,15 @@
shoes = /obj/item/clothing/shoes/sneakers/black
belt = /obj/item/pda
+// Janitor
+/datum/outfit/job/nanotrasen/janitor
+ name = "Nanotrasen - Janitor"
+ jobtype = /datum/job/janitor
+ job_icon = "janitor"
+
+ uniform = /obj/item/clothing/under/nanotrasen/janitor
+ head = /obj/item/clothing/head/nanotrasen/cap/janitor
+
// Lawyer
/datum/outfit/job/nanotrasen/lawyer
name = "Nanotrasen - Lawyer"
@@ -423,8 +432,6 @@
id_assignment = "Corporate Representative"
job_icon = "nanotrasen"
- uniform = /obj/item/clothing/under/rank/command/head_of_personnel/suit
- suit = null
ears = /obj/item/radio/headset/headset_cent
l_hand = /obj/item/clipboard
r_pocket = /obj/item/pen/fountain
@@ -495,7 +502,7 @@
gloves = /obj/item/clothing/gloves/color/black
uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/lp
alt_uniform = /obj/item/clothing/under/rank/security/head_of_security/alt/skirt/lp
- dcoat = /obj/item/clothing/suit/jacket
+ dcoat = /obj/item/clothing/suit/armor/nanotrasen/sec_director
shoes = /obj/item/clothing/shoes/jackboots
head = /obj/item/clothing/head/beret/command
diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm
index 1754e84c7e8e..108475c982b9 100644
--- a/code/modules/clothing/outfits/standard.dm
+++ b/code/modules/clothing/outfits/standard.dm
@@ -96,13 +96,6 @@
W.update_label()
..()
-/datum/outfit/ghost_cultist
- name = "Cultist Ghost"
-
- uniform = /obj/item/clothing/under/color/black/ghost
- suit = /obj/item/clothing/suit/hooded/cultrobes/alt/ghost
- shoes = /obj/item/clothing/shoes/cult/alt/ghost
-
/datum/outfit/wizard
name = "Blue Wizard"
@@ -125,25 +118,6 @@
if(S)
S.owner = H
-/datum/outfit/wizard/apprentice
- name = "Wizard Apprentice"
- r_hand = null
- l_hand = null
- r_pocket = /obj/item/teleportation_scroll/apprentice
-
-/datum/outfit/wizard/red
- name = "Red Wizard"
-
- suit = /obj/item/clothing/suit/wizrobe/red
- head = /obj/item/clothing/head/wizard/red
-
-/datum/outfit/wizard/weeb
- name = "Marisa Wizard"
-
- suit = /obj/item/clothing/suit/wizrobe/marisa
- shoes = /obj/item/clothing/shoes/sandal/marisa
- head = /obj/item/clothing/head/wizard/marisa
-
/datum/outfit/plasmaman
name = "Plasmaman"
diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm
index cd4474588090..424e00712078 100644
--- a/code/modules/clothing/shoes/_shoes.dm
+++ b/code/modules/clothing/shoes/_shoes.dm
@@ -172,7 +172,7 @@
else // if one of us moved
user.visible_message("[our_guy] stamps on [user]'s hand, mid-shoelace [tied ? "knotting" : "untying"]!", "Ow! [our_guy] stamps on your hand!", list(our_guy))
to_chat(our_guy, "You stamp on [user]'s hand! What the- [user.p_they()] [user.p_were()] [tied ? "knotting" : "untying"] your shoelaces!")
- user.emote("scream")
+ user.force_scream()
if(istype(L))
var/obj/item/bodypart/ouchie = L.get_bodypart(pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM))
if(ouchie)
diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm
deleted file mode 100644
index 4ed246a587be..000000000000
--- a/code/modules/clothing/shoes/bananashoes.dm
+++ /dev/null
@@ -1,68 +0,0 @@
-//banana flavored chaos and horror ahead
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes
- name = "mk-honk prototype shoes"
- desc = "Lost prototype of advanced clown tech. Powered by bananium, these shoes leave a trail of chaos in their wake."
- icon_state = "clown_prototype_off"
- actions_types = list(/datum/action/item_action/toggle)
- var/on = FALSE
- var/always_noslip = FALSE
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes/Initialize()
- . = ..()
- if(always_noslip)
- clothing_flags |= NOSLIP
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes/ComponentInitialize()
- . = ..()
- AddElement(/datum/element/update_icon_updates_onmob)
- AddComponent(/datum/component/material_container, list(/datum/material/hellstone), 200000, TRUE, /obj/item/stack)
- AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 75, falloff_exponent = 20)
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action()
- . = ..()
- var/mob/wearer = loc
- var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
- if(on && istype(wearer))
- if(bananium.get_material_amount(/datum/material/hellstone) < 100)
- on = !on
- if(!always_noslip)
- clothing_flags &= ~NOSLIP
- update_appearance()
- to_chat(loc, "You ran out of bananium!")
- else
- new /obj/item/grown/bananapeel/specialpeel(get_step(src,turn(wearer.dir, 180))) //honk
- bananium.use_amount_mat(100, /datum/material/hellstone)
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user)
- var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
- var/sheet_amount = bananium.retrieve_all()
- if(sheet_amount)
- to_chat(user, "You retrieve [sheet_amount] sheets of bananium from the prototype shoes.")
- else
- to_chat(user, "You cannot retrieve any bananium from the prototype shoes!")
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes/examine(mob/user)
- . = ..()
- . += "The shoes are [on ? "enabled" : "disabled"]."
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click(mob/user)
- var/datum/component/material_container/bananium = GetComponent(/datum/component/material_container)
- if(bananium.get_material_amount(/datum/material/hellstone))
- on = !on
- update_appearance()
- to_chat(user, "You [on ? "activate" : "deactivate"] the prototype shoes.")
- if(!always_noslip)
- if(on)
- clothing_flags |= NOSLIP
- else
- clothing_flags &= ~NOSLIP
- else
- to_chat(user, "You need bananium to turn the prototype shoes on!")
-
-/obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon_state()
- if(on)
- icon_state = "clown_prototype_on"
- else
- icon_state = "clown_prototype_off"
- return ..()
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 4c078a7e0ad1..234917e03d6d 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -16,23 +16,6 @@
lace_time = 12 SECONDS
greyscale_icon_state = "boots"
-/obj/item/clothing/shoes/combat/sneakboots
- name = "sneakboots"
- desc = "These boots have special noise cancelling soles. Perfect for stealth, if it wasn't for the color scheme."
- icon_state = "sneakboots"
- item_state = "sneakboots"
- w_class = WEIGHT_CLASS_SMALL
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/clothing/shoes/combat/sneakboots/equipped(mob/living/carbon/human/user, slot)
- . = ..()
- if(slot == ITEM_SLOT_FEET)
- ADD_TRAIT(user, TRAIT_SILENT_FOOTSTEPS, SHOES_TRAIT)
-
-/obj/item/clothing/shoes/combat/sneakboots/dropped(mob/living/carbon/human/user)
- REMOVE_TRAIT(user, TRAIT_SILENT_FOOTSTEPS, SHOES_TRAIT)
- return ..()
-
/obj/item/clothing/shoes/combat/swat //overpowered boots for death squads
name = "\improper SWAT boots"
desc = "High speed, no drag combat boots."
@@ -84,61 +67,6 @@
can_be_tied = FALSE
greyscale_icon_state = "boots"
-/obj/item/clothing/shoes/galoshes/dry
- name = "absorbent galoshes"
- desc = "A pair of orange rubber boots, designed to prevent slipping on wet surfaces while also drying them."
- icon_state = "galoshes_dry"
-
-/obj/item/clothing/shoes/galoshes/dry/step_action()
- var/turf/open/t_loc = get_turf(src)
- SEND_SIGNAL(t_loc, COMSIG_TURF_MAKE_DRY, TURF_WET_WATER, TRUE, INFINITY)
-
-/obj/item/clothing/shoes/clown_shoes
- desc = "The prankster's standard-issue clowning shoes. Damn, they're huge! Ctrl-click to toggle waddle dampeners."
- name = "clown shoes"
- icon_state = "clown"
- item_state = "clown_shoes"
- slowdown = SHOES_SLOWDOWN+1
- pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes/clown
- var/enabled_waddle = TRUE
- lace_time = 20 SECONDS // how the hell do these laces even work??
-
-/obj/item/clothing/shoes/clown_shoes/Initialize()
- . = ..()
- AddComponent(/datum/component/squeak, list('sound/effects/clownstep1.ogg'=1,'sound/effects/clownstep2.ogg'=1), 50, falloff_exponent = 20) //die off quick please)
-
-/obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot)
- . = ..()
- if(slot == ITEM_SLOT_FEET)
- if(enabled_waddle)
- user.AddElement(/datum/element/waddling)
- if(user.mind && user.mind.assigned_role == "Clown")
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "clownshoes", /datum/mood_event/clownshoes)
-
-/obj/item/clothing/shoes/clown_shoes/dropped(mob/user)
- . = ..()
- user.RemoveElement(/datum/element/waddling)
- if(user.mind && user.mind.assigned_role == "Clown")
- SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "clownshoes")
-
-/obj/item/clothing/shoes/clown_shoes/CtrlClick(mob/living/user)
- if(!isliving(user))
- return
- if(user.get_active_held_item() != src)
- to_chat(user, "You must hold the [src] in your hand to do this!")
- return
- if (!enabled_waddle)
- to_chat(user, "You switch off the waddle dampeners!")
- enabled_waddle = TRUE
- else
- to_chat(user, "You switch on the waddle dampeners!")
- enabled_waddle = FALSE
-
-/obj/item/clothing/shoes/clown_shoes/jester
- name = "jester shoes"
- desc = "A court jester's shoes, updated with modern squeaking technology."
- icon_state = "jester_shoes"
-
/obj/item/clothing/shoes/jackboots
name = "jackboots"
desc = "Ankle-high combat boots for combat scenarios or combat situations. All combat, all the time."
@@ -198,59 +126,12 @@
icon_state = "explorer"
resistance_flags = FIRE_PROOF
-/obj/item/clothing/shoes/cult
- name = "\improper Nar'Sien invoker boots"
- desc = "A pair of boots worn by the followers of Nar'Sie."
- icon_state = "cult"
- item_state = "cult"
- cold_protection = FEET
- min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT
- heat_protection = FEET
- max_heat_protection_temperature = SHOES_MAX_TEMP_PROTECT
- lace_time = 10 SECONDS
- greyscale_icon_state = "boots"
-
-/obj/item/clothing/shoes/cult/alt
- name = "cultist boots"
- icon_state = "cultalt"
-
-/obj/item/clothing/shoes/cult/alt/ghost
- item_flags = DROPDEL
-
-/obj/item/clothing/shoes/cult/alt/ghost/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
-
-/obj/item/clothing/shoes/cyborg
- name = "cyborg boots"
- desc = "Shoes for a cyborg costume."
- icon_state = "boots"
-
/obj/item/clothing/shoes/laceup
name = "laceup shoes"
desc = "The height of fashion, and they're pre-polished!"
icon_state = "laceups"
equip_delay_other = 50
-/obj/item/clothing/shoes/roman
- name = "roman sandals"
- desc = "Sandals with buckled leather straps on it."
- icon_state = "roman"
- item_state = "roman"
- strip_delay = 100
- equip_delay_other = 100
- permeability_coefficient = 0.9
- can_be_tied = FALSE
-
-/obj/item/clothing/shoes/griffin
- name = "griffon boots"
- desc = "A pair of costume boots fashioned after bird talons."
- icon_state = "griffinboots"
- item_state = "griffinboots"
- pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes
- lace_time = 8 SECONDS
- greyscale_icon_state = "boots"
-
/obj/item/clothing/shoes/bhop
name = "jump boots"
desc = "The EXOCOM's Cortez launch boot line represents a specialized pair of mining boots with a built-in propulsion system, designed for rapid foward movement."
@@ -287,57 +168,6 @@
else
to_chat(user, "Something prevents you from dashing forward!")
-/obj/item/clothing/shoes/bronze
- name = "bronze boots"
- desc = "A giant, clunky pair of shoes crudely made out of bronze. Why would anyone wear these?"
- icon = 'icons/obj/clothing/clockwork_garb.dmi'
- icon_state = "clockwork_treads"
- lace_time = 8 SECONDS
- greyscale_icon_state = "boots"
-
-/obj/item/clothing/shoes/bronze/Initialize()
- . = ..()
- AddComponent(/datum/component/squeak, list('sound/machines/clockcult/integration_cog_install.ogg' = 1, 'sound/magic/clockwork/fellowship_armory.ogg' = 1), 50, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
-
-/obj/item/clothing/shoes/wheelys
- name = "Wheely-Heels"
- desc = "Uses patented retractable wheel technology. Never sacrifice speed for style - not that this provides much of either." //Thanks Fel
- icon_state = "wheelys"
- item_state = "wheelys"
- actions_types = list(/datum/action/item_action/wheelys)
- var/wheelToggle = FALSE //False means wheels are not popped out
- var/obj/vehicle/ridden/scooter/wheelys/W
-
-/obj/item/clothing/shoes/wheelys/Initialize()
- . = ..()
- W = new /obj/vehicle/ridden/scooter/wheelys(null)
-
-/obj/item/clothing/shoes/wheelys/ui_action_click(mob/user, action)
- if(!isliving(user))
- return
- if(!istype(user.get_item_by_slot(ITEM_SLOT_FEET), /obj/item/clothing/shoes/wheelys))
- to_chat(user, "You must be wearing the wheely-heels to use them!")
- return
- if(!(W.is_occupant(user)))
- wheelToggle = FALSE
- if(wheelToggle)
- W.unbuckle_mob(user)
- wheelToggle = FALSE
- return
- W.forceMove(get_turf(user))
- W.buckle_mob(user)
- wheelToggle = TRUE
-
-/obj/item/clothing/shoes/wheelys/dropped(mob/user)
- if(wheelToggle)
- W.unbuckle_mob(user)
- wheelToggle = FALSE
- ..()
-
-/obj/item/clothing/shoes/wheelys/Destroy()
- QDEL_NULL(W)
- . = ..()
-
/obj/item/clothing/shoes/kindleKicks
name = "Kindle Kicks"
desc = "They'll sure kindle something in you, and it's not childhood nostalgia..."
@@ -351,7 +181,6 @@
var/lightCycle = 0
var/active = FALSE
-
/obj/item/clothing/shoes/kindleKicks/ui_action_click(mob/user, action)
if(active)
return
@@ -433,21 +262,3 @@
desc = "A pair of authentic haute couture boots. You doubt they have ever been close to cattle."
icon_state = "cowboy_fancy"
permeability_coefficient = 0.08
-
-/obj/item/clothing/shoes/cookflops
- desc = "All this talk of antags, greytiding, and griefing... I just wanna grill for god's sake!"
- name = "grilling sandals"
- icon_state = "cookflops"
- can_be_tied = FALSE
-
-/obj/item/clothing/shoes/yakuza
- name = "tojo clan shoes"
- desc = "Steel-toed and intimidating."
- icon_state = "MajimaShoes"
- item_state = "MajimaShoes_worn"
-
-/obj/item/clothing/shoes/jackbros
- name = "frosty boots"
- desc = "For when you're stepping on up to the plate."
- icon_state = "JackFrostShoes"
- item_state = "JackFrostShoes_worn"
diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm
index 073966a5fc15..30436045da2f 100644
--- a/code/modules/clothing/suits/chaplainsuits.dm
+++ b/code/modules/clothing/suits/chaplainsuits.dm
@@ -5,69 +5,3 @@
/obj/item/clothing/suit/hooded/chaplainsuit
allowed = list(/obj/item/storage/book/bible, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman)
-
-//Suits
-/obj/item/clothing/suit/chaplainsuit/holidaypriest
- name = "holiday priest"
- desc = "This is a nice holiday, my son."
- icon_state = "holidaypriest"
- item_state = "w_suit"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT
-
-/obj/item/clothing/suit/chaplainsuit/nun
- name = "nun robe"
- desc = "Maximum piety in this star system."
- icon_state = "nun"
- item_state = "nun"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
- flags_inv = HIDESHOES|HIDEJUMPSUIT
-
-/obj/item/clothing/suit/chaplainsuit/bishoprobe
- name = "bishop's robes"
- desc = "Glad to see the tithes you collected were well spent."
- icon_state = "bishoprobe"
- item_state = "bishoprobe"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT
-
-/obj/item/clothing/suit/hooded/chaplainsuit/monkhabit
- name = "monk's habit"
- desc = "A few steps above rended sackcloth."
- icon_state = "monkfrock"
- item_state = "monkfrock"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- hoodtype = /obj/item/clothing/head/hooded/monkhabit
-
-/obj/item/clothing/head/hooded/monkhabit
- name = "monk's hood"
- desc = "For when a man wants to cover up his tonsure."
- icon_state = "monkhood"
- item_state = "monkhood"
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEEARS
-
-/obj/item/clothing/suit/chaplainsuit/monkrobeeast
- name = "eastern monk's robes"
- desc = "Best combined with a shaved head."
- icon_state = "monkrobeeast"
- item_state = "monkrobeeast"
- body_parts_covered = GROIN|LEGS
- flags_inv = HIDEJUMPSUIT
-
-/obj/item/clothing/suit/chaplainsuit/whiterobe
- name = "white robe"
- desc = "Good for clerics and sleepy crewmembers."
- icon_state = "whiterobe"
- item_state = "whiterobe"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT
-
-/obj/item/clothing/suit/chaplainsuit/clownpriest
- name = "Robes of the Honkmother"
- desc = "Meant for a clown of the cloth."
- icon_state = "clownpriest"
- item_state = "clownpriest"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT
- allowed = list(/obj/item/megaphone/clown, /obj/item/soap, /obj/item/reagent_containers/food/snacks/pie/cream, /obj/item/bikehorn, /obj/item/bikehorn/golden, /obj/item/bikehorn/airhorn, /obj/item/instrument/bikehorn, /obj/item/reagent_containers/food/drinks/soda_cans/canned_laughter, /obj/item/toy/crayon, /obj/item/toy/crayon/spraycan, /obj/item/toy/crayon/spraycan/lubecan, /obj/item/grown/bananapeel, /obj/item/reagent_containers/food/snacks/grown/banana)
diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm
index 763be0e2f468..982b3804f586 100644
--- a/code/modules/clothing/suits/cloaks.dm
+++ b/code/modules/clothing/suits/cloaks.dm
@@ -180,19 +180,3 @@
resistance_flags = NONE
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
flags_cover = HEADCOVERSEYES
-
-/obj/item/clothing/suit/hooded/cloak/goliath/polar
- name = "polar cloak"
- icon_state = "polarcloak"
- hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath/polar
- desc = "A tribal hood made from a polar bears pelt. Keeps it's wearer warm and looks badass while doing it."
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- cold_protection = CHEST|GROIN|LEGS|FEET|ARMS
-
-/obj/item/clothing/head/hooded/cloakhood/goliath/polar
- name = "polar cloak"
- icon_state = "hoodie_gray"
- mob_overlay_state = "polhood"
- desc = "Wear bear on head show little man you big man, kill bear for cloak."
- min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- cold_protection = HEAD
diff --git a/code/modules/clothing/suits/hoodies.dm b/code/modules/clothing/suits/hoodies.dm
index b69061cffbd1..e1507af5c229 100644
--- a/code/modules/clothing/suits/hoodies.dm
+++ b/code/modules/clothing/suits/hoodies.dm
@@ -1,6 +1,7 @@
/obj/item/clothing/suit/hooded/hoodie
name = "hoodie"
desc = "HOW"
+ icon_state = null
hoodtype = /obj/item/clothing/head/hooded/hood
body_parts_covered = CHEST|ARMS
pocket_storage_component_path = /datum/component/storage/concrete/pockets/exo/large
@@ -19,6 +20,9 @@
/obj/item/clothing/head/hooded/hood
name = "hood"
desc = "HOW"
+ icon_state = null
+ icon = 'icons/obj/clothing/head/winterhood.dmi'
+ mob_overlay_icon = 'icons/mob/clothing/head/winterhood.dmi'
body_parts_covered = HEAD
flags_inv = HIDEHAIR|HIDEEARS
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0) //it's just a hoodie.
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 3b1735208dda..2b06e695851c 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -270,24 +270,6 @@
icon_state = "coat_terragov"
item_state = "coat_terragov"
-/obj/item/clothing/suit/hooded/enginseer
- name = "enginseer regalia"
- desc = "You hold the secrets of the Machine."
- icon_state = "enginseer"
- item_state = "enginseer"
- hoodtype = /obj/item/clothing/head/hooded/enginseer
- body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
- flags_inv = HIDESHOES|HIDEJUMPSUIT|HIDEGLOVES
- allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun, /obj/item/melee, /obj/item/radio, /obj/item/storage/book)
-
-/obj/item/clothing/head/hooded/enginseer
- name = "enginseer's hood"
- desc = "You are honored that they require your skills."
- icon_state = "enginseerhood"
- item_state = "enginseerhood"
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE|HIDEFACIALHAIR
-
/obj/item/clothing/suit/armor/witchhunter
name = "witchunter garb"
desc = "This worn outfit saw much use back in the day."
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 6e8b87b06285..c8e54edb2e01 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -31,20 +31,6 @@
/*
* Costume
*/
-/obj/item/clothing/suit/hooded/flashsuit
- name = "flashy costume"
- desc = "What did you expect?"
- icon_state = "flashsuit"
- item_state = "armor"
- body_parts_covered = CHEST|GROIN
- hoodtype = /obj/item/clothing/head/hooded/flashsuit
-
-/obj/item/clothing/head/hooded/flashsuit
- name = "flash button"
- desc = "You will learn to fear the flash."
- icon_state = "flashsuit"
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK
/obj/item/clothing/suit/pirate
name = "pirate coat"
@@ -59,27 +45,6 @@
icon_state = "hgpirate"
item_state = "hgpirate"
-
-/obj/item/clothing/suit/cyborg_suit
- name = "cyborg suit"
- desc = "Suit for a cyborg costume."
- icon_state = "death"
- item_state = "death"
- mob_overlay_state = "cardborg"
- flags_1 = CONDUCT_1
- fire_resist = T0C+5200
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
-
-/obj/item/clothing/suit/justice
- name = "justice suit"
- desc = "this pretty much looks ridiculous" //Needs no fixing
- icon_state = "justice"
- item_state = "justice"
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- armor = list("melee" = 35, "bullet" = 30, "laser" = 30, "energy" = 40, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
-
-
/obj/item/clothing/suit/judgerobe
name = "judge's robe"
desc = "This robe commands authority."
@@ -116,42 +81,6 @@
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
resistance_flags = NONE
-/obj/item/clothing/suit/hastur
- name = "\improper Hastur's robe"
- desc = "Robes not meant to be worn by man."
- icon_state = "hastur"
- item_state = "hastur"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
-
-/obj/item/clothing/suit/imperium_monk
- name = "\improper Imperium monk suit"
- desc = "Have YOU killed a xeno today?"
- icon_state = "imperium_monk"
- item_state = "imperium_monk"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDESHOES|HIDEJUMPSUIT
- allowed = list(/obj/item/storage/book/bible, /obj/item/melee/sword, /obj/item/reagent_containers/food/drinks/bottle/holywater, /obj/item/storage/fancy/candle_box, /obj/item/candle, /obj/item/tank/internals/emergency_oxygen)
-
-
-/obj/item/clothing/suit/chickensuit
- name = "chicken suit"
- desc = "A suit made long ago by the ancient empire KFC."
- icon_state = "chickensuit"
- item_state = "chickensuit"
- body_parts_covered = CHEST|ARMS|GROIN|LEGS|FEET
- flags_inv = HIDESHOES|HIDEJUMPSUIT
-
-
-/obj/item/clothing/suit/monkeysuit
- name = "monkey suit"
- desc = "A suit that looks like a primate."
- icon_state = "monkeysuit"
- item_state = "monkeysuit"
- body_parts_covered = CHEST|ARMS|GROIN|LEGS|FEET|HANDS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
/obj/item/clothing/suit/toggle/owlwings
name = "owl cloak"
desc = "A soft brown cloak made of synthetic feathers. Soft to the touch, stylish, and a 2 meter wing span that will drive the ladies mad."
@@ -208,42 +137,6 @@
body_parts_covered = CHEST|GROIN
flags_inv = HIDEJUMPSUIT
-/obj/item/clothing/suit/poncho
- name = "poncho"
- desc = "Your classic, non-racist poncho."
- icon_state = "classicponcho"
- item_state = "classicponcho"
-
-/obj/item/clothing/suit/poncho/green
- name = "green poncho"
- desc = "Your classic, non-racist poncho. This one is green."
- icon_state = "greenponcho"
- item_state = "greenponcho"
-
-/obj/item/clothing/suit/poncho/red
- name = "red poncho"
- desc = "Your classic, non-racist poncho. This one is red."
- icon_state = "redponcho"
- item_state = "redponcho"
-
-/obj/item/clothing/suit/poncho/ponchoshame
- name = "poncho of shame"
- desc = "Forced to live on your shameful acting as a fake Mexican, you and your poncho have grown inseparable. Literally."
- icon_state = "ponchoshame"
- item_state = "ponchoshame"
-
-/obj/item/clothing/suit/poncho/ponchoshame/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, SHAMEBRERO_TRAIT)
-
-/obj/item/clothing/suit/whitedress
- name = "white dress"
- desc = "A fancy white dress."
- icon_state = "white_dress"
- item_state = "w_suit"
- body_parts_covered = CHEST|GROIN|LEGS|FEET
- flags_inv = HIDEJUMPSUIT|HIDESHOES
-
/obj/item/clothing/suit/hooded/carp_costume
name = "carp costume"
desc = "A costume made from 'synthetic' carp scales, it smells."
@@ -274,44 +167,6 @@
if (user.head == src)
user.faction -= "carp"
-/obj/item/clothing/suit/hooded/ian_costume //It's Ian, rub his bell- oh god what happened to his inside parts?
- name = "corgi costume"
- desc = "A costume that looks like someone made a human-like corgi, it won't guarantee belly rubs."
- icon_state = "ian"
- item_state = "labcoat"
- body_parts_covered = CHEST|GROIN|ARMS
- //cold_protection = CHEST|GROIN|ARMS
- //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- allowed = list()
- hoodtype = /obj/item/clothing/head/hooded/ian_hood
- dog_fashion = /datum/dog_fashion/back
-
-/obj/item/clothing/head/hooded/ian_hood
- name = "corgi hood"
- desc = "A hood that looks just like a corgi's head, it won't guarantee dog biscuits."
- icon_state = "ian"
- body_parts_covered = HEAD
- //cold_protection = HEAD
- //min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
- flags_inv = HIDEHAIR|HIDEEARS
-
-/obj/item/clothing/suit/hooded/bee_costume // It's Hip!
- name = "bee costume"
- desc = "Bee the true Queen!"
- icon_state = "bee"
- item_state = "labcoat"
- body_parts_covered = CHEST|GROIN|ARMS
- clothing_flags = THICKMATERIAL
- hoodtype = /obj/item/clothing/head/hooded/bee_hood
-
-/obj/item/clothing/head/hooded/bee_hood
- name = "bee hood"
- desc = "A hood attached to a bee costume."
- icon_state = "bee"
- body_parts_covered = HEAD
- clothing_flags = THICKMATERIAL
- flags_inv = HIDEHAIR|HIDEEARS
-
/obj/item/clothing/suit/hooded/bloated_human //OH MY GOD WHAT HAVE YOU DONE!?!?!?
name = "bloated human suit"
desc = "A horribly bloated suit made from human skins."
@@ -333,14 +188,6 @@
flags_cover = HEADCOVERSEYES
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-/obj/item/clothing/suit/shrine_maiden
- name = "shrine maiden's outfit"
- desc = "Makes you want to exterminate some troublesome youkai."
- icon_state = "shrine_maiden"
- item_state = "shrine_maiden"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEJUMPSUIT
-
/*
* Misc
*/
@@ -378,18 +225,6 @@
icon_state = "nerdshirt"
item_state = "nerdshirt"
-/obj/item/clothing/suit/vapeshirt //wearing this is asking to get beat.
- name = "Vape Naysh shirt"
- desc = "A cheap white T-shirt with a big tacky \"VN\" on the front, Why would you wear this unironically?"
- icon_state = "vapeshirt"
- item_state = "vapeshirt"
-
-/obj/item/clothing/suit/striped_sweater
- name = "striped sweater"
- desc = "Reminds you of someone, but you just can't put your finger on it..."
- icon_state = "waldo_shirt"
- item_state = "waldo_shirt"
-
/obj/item/clothing/suit/jacket
name = "bomber jacket"
desc = "Aviators not included."
@@ -409,13 +244,6 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/toy, /obj/item/storage/fancy/cigarettes, /obj/item/lighter, /obj/item/gun/ballistic/automatic/pistol, /obj/item/gun/ballistic/revolver, /obj/item/gun/ballistic/revolver/detective, /obj/item/radio)
-/obj/item/clothing/suit/jacket/leather/overcoat
- name = "leather overcoat"
- desc = "That's a damn fine coat."
- icon_state = "leathercoat"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS
- cold_protection = CHEST|GROIN|ARMS|LEGS
-
/obj/item/clothing/suit/jacket/leather/duster
name = "leather duster"
desc = "A long, utilitarian leather coat. Ideal for protecting its wearer from rain, sun, and dust."
@@ -478,40 +306,12 @@
icon_state = "letterman_n"
item_state = "letterman_n"
-/obj/item/clothing/suit/dracula
- name = "dracula coat"
- desc = "Looks like this belongs in a very old movie set."
- icon_state = "draculacoat"
- item_state = "draculacoat"
-
-/obj/item/clothing/suit/drfreeze_coat
- name = "doctor freeze's labcoat"
- desc = "A labcoat imbued with the power of features and freezes."
- icon_state = "drfreeze_coat"
- item_state = "drfreeze_coat"
-
/obj/item/clothing/suit/gothcoat
name = "gothic coat"
desc = "Perfect for those who want to stalk around a corner of a bar."
icon_state = "gothcoat"
item_state = "gothcoat"
-/obj/item/clothing/suit/xenos
- name = "xenos suit"
- desc = "A suit made out of chitinous alien hide."
- icon_state = "xenos"
- item_state = "xenos_helm"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS|HANDS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
- allowed = list(/mob/living/simple_animal/hostile/facehugger/toy)
-
-/obj/item/clothing/suit/nemes
- name = "pharoah tunic"
- desc = "Lavish space tomb not included."
- icon_state = "pharoah"
- item_state = "pharoah"
- body_parts_covered = CHEST|GROIN
-
/obj/item/clothing/suit/caution
name = "wet floor sign"
desc = "No running."
@@ -528,34 +328,6 @@
attack_verb = list("warned", "cautioned", "smashed")
armor = list("melee" = 5, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
-/obj/item/clothing/suit/changshan_red
- name = "red changshan"
- desc = "A gorgeously embroidered silk shirt."
- icon_state = "changshan_red"
- item_state = "changshan_red"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS
-
-/obj/item/clothing/suit/changshan_blue
- name = "blue changshan"
- desc = "A gorgeously embroidered silk shirt."
- icon_state = "changshan_blue"
- item_state = "changshan_blue"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS
-
-/obj/item/clothing/suit/cheongsam_red
- name = "red cheongsam"
- desc = "A gorgeously embroidered silk dress."
- icon_state = "cheongsam_red"
- item_state = "cheongsam_red"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS
-
-/obj/item/clothing/suit/cheongsam_blue
- name = "blue cheongsam"
- desc = "A gorgeously embroidered silk dress."
- icon_state = "cheongsam_blue"
- item_state = "cheongsam_blue"
- body_parts_covered = CHEST|GROIN|ARMS|LEGS
-
/obj/item/clothing/head/hooded/ablative
name = "ablative hood"
desc = "Hood hopefully belonging to an ablative trenchcoat. Includes a visor for cool-o-vision."
@@ -606,20 +378,6 @@
if (prob(hit_reflect_chance))
return TRUE
-/obj/item/clothing/suit/spookyghost
- name = "spooky ghost"
- desc = "This is obviously just a bedsheet, but maybe try it on?"
- icon_state = "bedsheet"
- user_vars_to_edit = list("name" = "Spooky Ghost", "real_name" = "Spooky Ghost" , "incorporeal_move" = INCORPOREAL_MOVE_BASIC, "appearance_flags" = KEEP_TOGETHER|TILE_BOUND, "alpha" = 150)
- alternate_worn_layer = ABOVE_BODY_FRONT_LAYER //so the bedsheet goes over everything but fire
-
-/obj/item/clothing/suit/bronze
- name = "bronze suit"
- desc = "A big and clanky suit made of bronze that offers no protection and looks very unfashionable. Nice."
- icon = 'icons/obj/clothing/clockwork_garb.dmi'
- icon_state = "clockwork_cuirass_old"
- armor = list("melee" = 5, "bullet" = 0, "laser" = -5, "energy" = -15, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 20, "acid" = 20)
-
/obj/item/clothing/suit/ghost_sheet
name = "ghost sheet"
desc = "The hands float by themselves, so it's extra spooky."
@@ -644,40 +402,8 @@
icon = 'icons/obj/clothing/belts.dmi'
icon_state = "suspenders_gray"
-/obj/item/clothing/suit/hooded/mysticrobe
- name = "mystic's robe"
- desc = "Wearing this makes you feel more attuned with the nature of the universe... as well as a bit more irresponsible. "
- icon_state = "mysticrobe"
- item_state = "mysticrobe"
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- allowed = list(/obj/item/spellbook, /obj/item/storage/book/bible)
- flags_inv = HIDEJUMPSUIT
- hoodtype = /obj/item/clothing/head/hooded/mysticrobe
-
-/obj/item/clothing/head/hooded/mysticrobe
- name = "mystic's hood"
- desc = "The balance of reality tips towards order."
- icon_state = "mystichood"
- item_state = "mystichood"
- body_parts_covered = HEAD
- flags_inv = HIDEHAIR|HIDEEARS|HIDEFACIALHAIR|HIDEFACE|HIDEMASK
-
/obj/item/clothing/suit/hawaiian
name = "floral shirt"
desc = "From grills to guns, this shirt's seen it all."
icon_state = "hawaiian_blue"
item_state = "hawaiian_blue"
-
-/obj/item/clothing/suit/yakuza
- name = "tojo clan jacket"
- desc = "The jacket of a mad dog."
- icon_state = "MajimaJacket"
- item_state = "MajimaJacket"
- body_parts_covered = ARMS
-
-/obj/item/clothing/suit/dutch
- name = "dutch's jacket"
- desc = "For those long nights on the beach in Tahiti."
- icon_state = "DutchJacket"
- item_state = "DutchJacket"
- body_parts_covered = ARMS
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index 451d428760f3..e0d7f1c7e124 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -11,47 +11,6 @@
resistance_flags = FIRE_PROOF | ACID_PROOF
dog_fashion = /datum/dog_fashion/head/blue_wizard
-/obj/item/clothing/head/wizard/red
- name = "red wizard hat"
- desc = "Strange-looking red hat-wear that most certainly belongs to a real magic user."
- icon_state = "redwizard"
- dog_fashion = /datum/dog_fashion/head/red_wizard
-
-/obj/item/clothing/head/wizard/yellow
- name = "yellow wizard hat"
- desc = "Strange-looking yellow hat-wear that most certainly belongs to a powerful magic user."
- icon_state = "yellowwizard"
- dog_fashion = null
-
-/obj/item/clothing/head/wizard/black
- name = "black wizard hat"
- desc = "Strange-looking black hat-wear that most certainly belongs to a real skeleton. Spooky."
- icon_state = "blackwizard"
- dog_fashion = null
-
-/obj/item/clothing/head/wizard/fake
- name = "wizard hat"
- desc = "It has WIZZARD written across it in sequins. Comes with a cool beard."
- icon_state = "wizard-fake"
- gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- resistance_flags = FLAMMABLE
- dog_fashion = /datum/dog_fashion/head/blue_wizard
-
-/obj/item/clothing/head/wizard/marisa
- name = "witch hat"
- desc = "Strange-looking hat-wear. Makes you want to cast fireballs."
- icon_state = "marisa"
- dog_fashion = null
-
-/obj/item/clothing/head/wizard/magus
- name = "\improper Magus helm"
- desc = "A mysterious helmet that hums with an unearthly power."
- icon_state = "magus"
- item_state = "magus"
- dog_fashion = null
-
/obj/item/clothing/head/wizard/santa
name = "Santa's hat"
desc = "Ho ho ho. Merrry X-mas!"
@@ -76,78 +35,12 @@
equip_delay_other = 50
resistance_flags = FIRE_PROOF | ACID_PROOF
-/obj/item/clothing/suit/wizrobe/red
- name = "red wizard robe"
- desc = "A magnificent red gem-lined robe that seems to radiate power."
- icon_state = "redwizard"
- item_state = "redwizrobe"
-
-/obj/item/clothing/suit/wizrobe/yellow
- name = "yellow wizard robe"
- desc = "A magnificent yellow gem-lined robe that seems to radiate power."
- icon_state = "yellowwizard"
- item_state = "yellowwizrobe"
-
-/obj/item/clothing/suit/wizrobe/black
- name = "black wizard robe"
- desc = "An unnerving black gem-lined robe that reeks of death and decay."
- icon_state = "blackwizard"
- item_state = "blackwizrobe"
-
-/obj/item/clothing/suit/wizrobe/marisa
- name = "witch robe"
- desc = "Magic is all about the spell power, ZE!"
- icon_state = "marisa"
- item_state = "marisarobe"
-
-/obj/item/clothing/suit/wizrobe/magusblue
- name = "\improper Magus robe"
- desc = "A set of armored robes that seem to radiate a dark power."
- icon_state = "magusblue"
- item_state = "magusblue"
-
-/obj/item/clothing/suit/wizrobe/magusred
- name = "\improper Magus robe"
- desc = "A set of armored robes that seem to radiate a dark power."
- icon_state = "magusred"
- item_state = "magusred"
-
-
/obj/item/clothing/suit/wizrobe/santa
name = "Santa's suit"
desc = "Festive!"
icon_state = "santa"
item_state = "santa"
-/obj/item/clothing/suit/wizrobe/fake
- name = "wizard robe"
- desc = "A rather dull blue robe meant to mimic real wizard robes."
- icon_state = "wizard-fake"
- item_state = "wizrobe"
- gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- resistance_flags = FLAMMABLE
-
-/obj/item/clothing/head/wizard/marisa/fake
- name = "witch hat"
- desc = "Strange-looking hat-wear, makes you want to cast fireballs."
- icon_state = "marisa"
- gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- resistance_flags = FLAMMABLE
-
-/obj/item/clothing/suit/wizrobe/marisa/fake
- name = "witch robe"
- desc = "Magic is all about the spell power, ZE!"
- icon_state = "marisa"
- item_state = "marisarobe"
- gas_transfer_coefficient = 1
- permeability_coefficient = 1
- armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
- resistance_flags = FLAMMABLE
-
/obj/item/clothing/suit/space/hardsuit/shielded/wizard
name = "battlemage armour"
desc = "Not all wizards are afraid of getting up close and personal."
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index bbd0d962601f..a6f3bfa7cf9d 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -15,7 +15,7 @@
/obj/item/clothing/under/color/random/Initialize()
..()
- var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - typesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/ancient - /obj/item/clothing/under/color/black/ghost)
+ var/obj/item/clothing/under/color/C = pick(subtypesof(/obj/item/clothing/under/color) - typesof(/obj/item/clothing/under/color/jumpskirt) - /obj/item/clothing/under/color/random - /obj/item/clothing/under/color/grey/ancient)
if(ishuman(loc))
var/mob/living/carbon/human/H = loc
H.equip_to_slot_or_del(new C(H), ITEM_SLOT_ICLOTHING) //or else you end up with naked assistants running around everywhere...
@@ -48,13 +48,6 @@
icon_state = "black_skirt"
item_state = "bl_suit"
-/obj/item/clothing/under/color/black/ghost
- item_flags = DROPDEL
-
-/obj/item/clothing/under/color/black/ghost/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, CULT_TRAIT)
-
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
desc = "A tasteful grey jumpsuit that reminds you of the good old days."
diff --git a/code/modules/events/devil.dm b/code/modules/events/devil.dm
deleted file mode 100644
index 656888f068bc..000000000000
--- a/code/modules/events/devil.dm
+++ /dev/null
@@ -1,53 +0,0 @@
-/datum/round_event_control/devil
- name = "Create Devil"
- typepath = /datum/round_event/ghost_role/devil
- max_occurrences = 0
-
-/datum/round_event/ghost_role/devil
- var/success_spawn = 0
- role_name = "devil"
- fakeable = FALSE
-
-/datum/round_event/ghost_role/devil/kill()
- if(!success_spawn && control)
- control.occurrences--
- return ..()
-
-/datum/round_event/ghost_role/devil/spawn_role()
- //selecting a candidate player
- var/list/candidates = get_candidates(ROLE_DEVIL, null, ROLE_DEVIL)
- if(!candidates.len)
- return NOT_ENOUGH_PLAYERS
-
- var/mob/dead/selected_candidate = pick_n_take(candidates)
- var/key = selected_candidate.key
-
- var/datum/mind/Mind = create_devil_mind(key)
- Mind.active = 1
-
- var/mob/living/carbon/human/devil = create_event_devil()
- Mind.transfer_to(devil)
- add_devil(devil, ascendable = FALSE)
-
- spawned_mobs += devil
- message_admins("[ADMIN_LOOKUPFLW(devil)] has been made into a devil by an event.")
- log_game("[key_name(devil)] was spawned as a devil by an event.")
- var/datum/job/jobdatum = new /datum/job/assistant()
- devil.job = jobdatum.name
- jobdatum.equip(devil)
- return SUCCESSFUL_SPAWN
-
-
-/proc/create_event_devil(spawn_loc)
- var/mob/living/carbon/human/new_devil = new(spawn_loc)
- var/datum/preferences/A = new() //Randomize appearance for the devil.
- A.copy_to(new_devil)
- new_devil.dna.update_dna_identity()
- return new_devil
-
-/proc/create_devil_mind(key)
- var/datum/mind/Mind = new /datum/mind(key)
- Mind.assigned_role = ROLE_DEVIL
- Mind.special_role = ROLE_DEVIL
- SSticker.mode.devils |= Mind
- return Mind
diff --git a/code/modules/events/major_dust.dm b/code/modules/events/major_dust.dm
deleted file mode 100644
index 7fb00124a94d..000000000000
--- a/code/modules/events/major_dust.dm
+++ /dev/null
@@ -1,19 +0,0 @@
-/datum/round_event_control/meteor_wave/major_dust
- name = "Major Space Dust"
- typepath = /datum/round_event/meteor_wave/major_dust
- weight = 8
-
-/datum/round_event/meteor_wave/major_dust
- wave_name = "space dust"
-
-/datum/round_event/meteor_wave/major_dust/announce(fake)
- var/reason = pick(
- "The station is passing through a debris cloud, expect minor damage \
- to external fittings and fixtures.",
- "Nanotrasen Superweapons Division is testing a new prototype \
- [pick("field","projection","nova","super-colliding","reactive")] \
- [pick("cannon","artillery","tank","cruiser","\[REDACTED\]")], \
- some mild debris is expected.",
- "A neighbouring station is throwing rocks at you. (Perhaps they've \
- grown tired of your messages.)")
- priority_announce(pick(reason), "Collision Alert")
diff --git a/code/modules/events/meateor_wave.dm b/code/modules/events/meateor_wave.dm
deleted file mode 100644
index 11af56526c88..000000000000
--- a/code/modules/events/meateor_wave.dm
+++ /dev/null
@@ -1,11 +0,0 @@
-/datum/round_event_control/meteor_wave/meaty
- name = "Meteor Wave: Meaty"
- typepath = /datum/round_event/meteor_wave/meaty
- weight = 2
- max_occurrences = 1
-
-/datum/round_event/meteor_wave/meaty
- wave_name = "meaty"
-
-/datum/round_event/meteor_wave/meaty/announce(fake)
- priority_announce("Meaty ores have been detected on collision course with the station.", "Oh crap, get the mop.",'sound/ai/meteors.ogg')
diff --git a/code/modules/events/meteor_wave.dm b/code/modules/events/meteor_wave.dm
deleted file mode 100644
index a8ddab5aa76a..000000000000
--- a/code/modules/events/meteor_wave.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-// Normal strength
-
-/datum/round_event_control/meteor_wave
- name = "Meteor Wave: Normal"
- typepath = /datum/round_event/meteor_wave
- weight = 4
- min_players = 15
- max_occurrences = 3
- earliest_start = 25 MINUTES
-
-/datum/round_event/meteor_wave
- startWhen = 6
- endWhen = 66
- announceWhen = 1
- var/list/wave_type
- var/wave_name = "normal"
-
-/datum/round_event/meteor_wave/New()
- ..()
- if(!wave_type)
- determine_wave_type()
-
-/datum/round_event/meteor_wave/proc/determine_wave_type()
- if(!wave_name)
- wave_name = pickweight(list(
- "normal" = 50,
- "threatening" = 40,
- "catastrophic" = 10))
- switch(wave_name)
- if("normal")
- wave_type = GLOB.meteors_normal
- if("threatening")
- wave_type = GLOB.meteors_threatening
- if("catastrophic")
- if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
- wave_type = GLOB.meteorsSPOOKY
- else
- wave_type = GLOB.meteors_catastrophic
- if("meaty")
- wave_type = GLOB.meteorsB
- if("space dust")
- wave_type = GLOB.meteorsC
- if("halloween")
- wave_type = GLOB.meteorsSPOOKY
- else
- WARNING("Wave name of [wave_name] not recognised.")
- kill()
-
-/datum/round_event/meteor_wave/announce(fake)
- priority_announce("Meteors have been detected on collision course with the station.", "Meteor Alert", 'sound/ai/meteors.ogg')
-
-/datum/round_event/meteor_wave/tick()
- if(ISMULTIPLE(activeFor, 3))
- spawn_meteors(5, wave_type) //meteor list types defined in gamemode/meteor/meteors.dm
-
-/datum/round_event_control/meteor_wave/threatening
- name = "Meteor Wave: Threatening"
- typepath = /datum/round_event/meteor_wave/threatening
- weight = 5
- min_players = 20
- max_occurrences = 3
- earliest_start = 35 MINUTES
-
-/datum/round_event/meteor_wave/threatening
- wave_name = "threatening"
-
-/datum/round_event_control/meteor_wave/catastrophic
- name = "Meteor Wave: Catastrophic"
- typepath = /datum/round_event/meteor_wave/catastrophic
- weight = 7
- min_players = 25
- max_occurrences = 3
- earliest_start = 45 MINUTES
-
-/datum/round_event/meteor_wave/catastrophic
- wave_name = "catastrophic"
diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm
index 69c15b1e3494..29ff8ead2f62 100644
--- a/code/modules/flufftext/Hallucination.dm
+++ b/code/modules/flufftext/Hallucination.dm
@@ -29,7 +29,7 @@ GLOBAL_LIST_INIT(hallucination_list, list(
if(!hallucination)
return
- hallucination--
+ hallucination = max(hallucination - 1, 0)
if(world.time < next_hallucination)
return
@@ -40,6 +40,8 @@ GLOBAL_LIST_INIT(hallucination_list, list(
next_hallucination = world.time + rand(100, 600)
/mob/living/carbon/proc/set_screwyhud(hud_type)
+ if(HAS_TRAIT(src, TRAIT_ANALGESIA))
+ hud_type = SCREWYHUD_HEALTHY
hal_screwyhud = hud_type
update_health_hud()
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index 49de009448f2..0aa4ac7fad38 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -479,7 +479,13 @@
break
if(firestarter && active)
hit_atom.fire_act()
- new /obj/effect/hotspot(get_turf(hit_atom))
+ var/turf/T = get_turf(hit_atom)
+ T.IgniteTurf(30)
+ var/turf/otherT
+ for(var/direction in GLOB.cardinals)
+ otherT = get_step(T, direction)
+ otherT.IgniteTurf(30)
+ new /obj/effect/hotspot(otherT)
..()
/obj/item/reagent_containers/food/drinks/bottle/molotov/attackby(obj/item/I, mob/user, params)
diff --git a/code/modules/food_and_drinks/food/condiment.dm b/code/modules/food_and_drinks/food/condiment.dm
index 0adf98ba5666..bd24a21d1a16 100644
--- a/code/modules/food_and_drinks/food/condiment.dm
+++ b/code/modules/food_and_drinks/food/condiment.dm
@@ -5,7 +5,7 @@
// to mixed-drinks code. If you want an object that starts pre-loaded, you need to make it in addition to the other code.
//Food items that aren't eaten normally and leave an empty container behind.
-/obj/item/reagent_containers/food/condiment
+/obj/item/reagent_containers/condiment
name = "condiment bottle"
desc = "Just your average condiment bottle."
icon = 'icons/obj/food/containers.dmi'
@@ -36,23 +36,25 @@
var/icon_empty = ""
fill_icon_thresholds = list(0, 10, 25, 50, 75, 100)
-/obj/item/reagent_containers/food/condiment/Initialize()
+/obj/item/reagent_containers/condiment/Initialize()
. = ..()
possible_states = typelist("possible_states", possible_states)
update_appearance()
-/obj/item/reagent_containers/food/condiment/update_icon()
+/obj/item/reagent_containers/condiment/update_icon()
cut_overlays()
if(reagents.reagent_list.len > 0 && possible_states.len)
- var/main_reagent = reagents.get_master_reagent_id()
- if(main_reagent in possible_states)
- icon_state = possible_states[main_reagent]["icon_state"]
- item_state = possible_states[main_reagent]["item_state"]
- icon_empty = possible_states[main_reagent]["icon_empty"]
- name = possible_states[main_reagent]["name"]
- desc = possible_states[main_reagent]["desc"]
+
+ var/datum/reagent/main_reagent_ref = reagents.get_master_reagent()
+ var/main_reagent_id = main_reagent_ref.type
+ if(main_reagent_id in possible_states)
+ icon_state = possible_states[main_reagent_id]["icon_state"]
+ item_state = possible_states[main_reagent_id]["item_state"]
+ icon_empty = possible_states[main_reagent_id]["icon_empty"]
+ name = possible_states[main_reagent_id]["name"]
+ desc = possible_states[main_reagent_id]["desc"]
return ..(TRUE) // Don't fill normally
else
name = "condiment bottle"
@@ -64,7 +66,7 @@
. = ..()
-/obj/item/reagent_containers/food/condiment/attack(mob/M, mob/user, def_zone)
+/obj/item/reagent_containers/condiment/attack(mob/M, mob/user, def_zone)
if(!reagents || !reagents.total_volume)
to_chat(user, "None of [src] left, oh no!")
@@ -90,7 +92,7 @@
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
return 1
-/obj/item/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity)
+/obj/item/reagent_containers/condiment/afterattack(obj/target, mob/user , proximity)
. = ..()
if(!proximity)
return
@@ -119,23 +121,23 @@
to_chat(user, "You transfer [trans] units of the condiment to [target].")
playsound(src, 'sound/items/glass_transfer.ogg', 50, 1)
-/obj/item/reagent_containers/food/condiment/on_reagent_change(changetype)
+/obj/item/reagent_containers/condiment/on_reagent_change(changetype)
update_appearance()
-/obj/item/reagent_containers/food/condiment/enzyme
+/obj/item/reagent_containers/condiment/enzyme
name = "universal enzyme"
desc = "Used in cooking various dishes."
icon_state = "enzyme"
list_reagents = list(/datum/reagent/consumable/enzyme = 50)
-/obj/item/reagent_containers/food/condiment/sugar
+/obj/item/reagent_containers/condiment/sugar
name = "sugar sack"
desc = "Tasty spacey sugar!"
icon_state = "sugar"
item_state = "flour"
list_reagents = list(/datum/reagent/consumable/sugar = 50)
-/obj/item/reagent_containers/food/condiment/saltshaker //Separate from above since it's a small shaker rather then
+/obj/item/reagent_containers/condiment/saltshaker //Separate from above since it's a small shaker rather then
name = "salt shaker" // a large one.
desc = "Salt. From space oceans, presumably."
icon_state = "saltshakersmall"
@@ -145,7 +147,7 @@
volume = 20
list_reagents = list(/datum/reagent/consumable/sodiumchloride = 20)
-/obj/item/reagent_containers/food/condiment/saltshaker/afterattack(obj/target, mob/living/user, proximity)
+/obj/item/reagent_containers/condiment/saltshaker/afterattack(obj/target, mob/living/user, proximity)
. = ..()
if(!proximity)
return
@@ -158,7 +160,7 @@
new/obj/effect/decal/cleanable/food/salt(target)
return
-/obj/item/reagent_containers/food/condiment/peppermill
+/obj/item/reagent_containers/condiment/peppermill
name = "pepper mill"
desc = "Often used to flavor food or make people sneeze."
icon_state = "peppermillsmall"
@@ -168,7 +170,7 @@
volume = 20
list_reagents = list(/datum/reagent/consumable/blackpepper = 20)
-/obj/item/reagent_containers/food/condiment/milk
+/obj/item/reagent_containers/condiment/milk
name = "space milk"
desc = "It's milk. White and nutritious goodness!"
icon_state = "milk"
@@ -177,14 +179,14 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
list_reagents = list(/datum/reagent/consumable/milk = 50)
-/obj/item/reagent_containers/food/condiment/flour
+/obj/item/reagent_containers/condiment/flour
name = "flour sack"
desc = "A big bag of flour. Good for baking!"
icon_state = "flour"
item_state = "flour"
list_reagents = list(/datum/reagent/consumable/flour = 30)
-/obj/item/reagent_containers/food/condiment/soymilk
+/obj/item/reagent_containers/condiment/soymilk
name = "soy milk"
desc = "It's soy milk. White and nutritious goodness!"
icon_state = "soymilk"
@@ -193,20 +195,20 @@
righthand_file = 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
list_reagents = list(/datum/reagent/consumable/soymilk = 50)
-/obj/item/reagent_containers/food/condiment/rice
+/obj/item/reagent_containers/condiment/rice
name = "rice sack"
desc = "A big bag of rice. Good for cooking!"
icon_state = "rice"
item_state = "flour"
list_reagents = list(/datum/reagent/consumable/rice = 30)
-/obj/item/reagent_containers/food/condiment/soysauce
+/obj/item/reagent_containers/condiment/soysauce
name = "soy sauce"
desc = "A salty soy-based flavoring."
icon_state = "soysauce"
list_reagents = list(/datum/reagent/consumable/soysauce = 50)
-/obj/item/reagent_containers/food/condiment/mayonnaise
+/obj/item/reagent_containers/condiment/mayonnaise
name = "mayonnaise"
desc = "An oily condiment made from egg yolks."
icon_state = "mayonnaise"
@@ -214,7 +216,7 @@
//Food packs. To easily apply deadly toxi... delicious sauces to your food!
-/obj/item/reagent_containers/food/condiment/pack
+/obj/item/reagent_containers/condiment/pack
name = "condiment pack"
desc = "A small plastic pack with condiments to put on your food."
icon_state = "condi_empty"
@@ -234,14 +236,19 @@
/datum/reagent/consumable/bbqsauce = list("condi_bbq", "BBQ sauce", "Hand wipes not included."),
)
-/obj/item/reagent_containers/food/condiment/pack/update_icon()
+/obj/item/reagent_containers/condiment/pack/create_reagents(max_vol, flags)
+ . = ..()
+ RegisterSignals(reagents, list(COMSIG_REAGENTS_NEW_REAGENT, COMSIG_REAGENTS_ADD_REAGENT, COMSIG_REAGENTS_REM_REAGENT), PROC_REF(on_reagent_add), TRUE)
+ RegisterSignal(reagents, COMSIG_REAGENTS_DEL_REAGENT, PROC_REF(on_reagent_del), TRUE)
+
+/obj/item/reagent_containers/condiment/pack/update_icon()
SHOULD_CALL_PARENT(FALSE)
- return ..()
+ return
-/obj/item/reagent_containers/food/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly.
+/obj/item/reagent_containers/condiment/pack/attack(mob/M, mob/user, def_zone) //Can't feed these to people directly.
return
-/obj/item/reagent_containers/food/condiment/pack/afterattack(obj/target, mob/user , proximity)
+/obj/item/reagent_containers/condiment/pack/afterattack(obj/target, mob/user , proximity)
. = ..()
if(!proximity)
return
@@ -257,67 +264,74 @@
src.reagents.trans_to(target, amount_per_transfer_from_this, transfered_by = user)
qdel(src)
-/obj/item/reagent_containers/food/condiment/pack/on_reagent_change(changetype)
- if(reagents.reagent_list.len > 0)
- var/main_reagent = reagents.get_master_reagent_id()
- if(main_reagent in possible_states)
- var/list/temp_list = possible_states[main_reagent]
- icon_state = temp_list[1]
- desc = temp_list[3]
- else
- icon_state = "condi_mixed"
- desc = "A small condiment pack. The label says it contains [originalname]"
+/// Handles reagents getting added to the condiment pack.
+/obj/item/reagent_containers/condiment/pack/proc/on_reagent_add(datum/reagents/reagents)
+ SIGNAL_HANDLER
+
+ var/datum/reagent/main_reagent = reagents.get_master_reagent()
+
+ var/main_reagent_type = main_reagent?.type
+ if(main_reagent_type in possible_states)
+ var/list/temp_list = possible_states[main_reagent_type]
+ icon_state = temp_list[1]
+ desc = temp_list[3]
else
- icon_state = "condi_empty"
- desc = "A small condiment pack. It is empty."
+ icon_state = "condi_mixed"
+ desc = "A small condiment pack. The label says it contains [originalname]"
+
+/// Handles reagents getting removed from the condiment pack.
+/obj/item/reagent_containers/condiment/pack/proc/on_reagent_del(datum/reagents/reagents)
+ SIGNAL_HANDLER
+ icon_state = "condi_empty"
+ desc = "A small condiment pack. It is empty."
//Ketchup
-/obj/item/reagent_containers/food/condiment/pack/ketchup
+/obj/item/reagent_containers/condiment/pack/ketchup
name = "ketchup pack"
originalname = "ketchup"
list_reagents = list(/datum/reagent/consumable/ketchup = 10)
//Hot sauce
-/obj/item/reagent_containers/food/condiment/pack/hotsauce
+/obj/item/reagent_containers/condiment/pack/hotsauce
name = "hotsauce pack"
originalname = "hotsauce"
list_reagents = list(/datum/reagent/consumable/capsaicin = 10)
-/obj/item/reagent_containers/food/condiment/pack/astrotame
+/obj/item/reagent_containers/condiment/pack/astrotame
name = "astrotame pack"
originalname = "astrotame"
list_reagents = list(/datum/reagent/consumable/astrotame = 5)
-/obj/item/reagent_containers/food/condiment/pack/bbqsauce
+/obj/item/reagent_containers/condiment/pack/bbqsauce
name = "bbq sauce pack"
originalname = "bbq sauce"
list_reagents = list(/datum/reagent/consumable/bbqsauce = 10)
-/obj/item/reagent_containers/food/condiment/ketchup
+/obj/item/reagent_containers/condiment/ketchup
name = "ketchup bottle"
desc = "You feel more american already"
icon_state = "ketchup"
list_reagents = list(/datum/reagent/consumable/ketchup = 50)
-/obj/item/reagent_containers/food/condiment/bbqsauce
+/obj/item/reagent_containers/condiment/bbqsauce
name = "bbq sauce bottle"
desc = "Hand wipes not included"
icon_state = "bbqsauce"
list_reagents = list(/datum/reagent/consumable/bbqsauce = 50)
-/obj/item/reagent_containers/food/condiment/hotsauce
+/obj/item/reagent_containers/condiment/hotsauce
name = "hot sauce bottle"
desc = "You can almost TASTE the stomach ulcers now!"
icon_state = "hotsauce"
list_reagents = list(/datum/reagent/consumable/capsaicin = 50)
-/obj/item/reagent_containers/food/condiment/coldsauce
+/obj/item/reagent_containers/condiment/coldsauce
name = "cold sauce bottle"
desc = "Leaves the tounge numb in it's passage"
icon_state = "coldsauce"
list_reagents = list(/datum/reagent/consumable/frostoil = 50)
-/obj/item/reagent_containers/food/condiment/oliveoil
+/obj/item/reagent_containers/condiment/oliveoil
name = "olive oil bottle"
desc = "A delicious oil used in cooking"
icon_state = "oliveoil"
diff --git a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
index 62e6a4075a93..bcee075e0dcd 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/deep_fryer.dm
@@ -44,7 +44,7 @@
/obj/item/weldingtool,
/obj/item/reagent_containers/glass,
/obj/item/reagent_containers/syringe,
- /obj/item/reagent_containers/food/condiment,
+ /obj/item/reagent_containers/condiment,
/obj/item/storage,
/obj/item/smallDelivery,
)
diff --git a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
index 0df04a08658b..db88c5d0cc15 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/microwave.dm
@@ -365,6 +365,7 @@
icon_state = "ration_heater"
grind_results = list(/datum/reagent/iron = 10, /datum/reagent/water = 10, /datum/reagent/consumable/sodiumchloride = 5)
heat = 3800
+ w_class = WEIGHT_CLASS_SMALL
var/obj/item/tocook = null
var/mutable_appearance/ration_overlay
var/uses = 3
diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
index 5852ea34742b..9a6b10e0444b 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm
@@ -366,7 +366,7 @@
/obj/machinery/smartfridge/drinks/accept_check(obj/item/O)
if(!istype(O, /obj/item/reagent_containers) || (O.item_flags & ABSTRACT) || !O.reagents || !O.reagents.reagent_list.len)
return FALSE
- if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/food/drinks) || istype(O, /obj/item/reagent_containers/food/condiment))
+ if(istype(O, /obj/item/reagent_containers/glass) || istype(O, /obj/item/reagent_containers/food/drinks) || istype(O, /obj/item/reagent_containers/condiment))
return TRUE
// ----------------------------
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
index 3443b32e931e..9352e1b371aa 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_soup.dm
@@ -88,7 +88,6 @@
/obj/item/reagent_containers/food/snacks/meat/cutlet = 2,
/obj/item/reagent_containers/food/snacks/grown/chili = 1,
/obj/item/reagent_containers/food/snacks/grown/tomato = 1,
- /obj/item/clothing/shoes/clown_shoes = 1
)
result = /obj/item/reagent_containers/food/snacks/soup/clownchili
subcategory = CAT_SOUP
diff --git a/code/modules/holiday/easter.dm b/code/modules/holiday/easter.dm
index 5baed7a45309..a5cf4d78499e 100644
--- a/code/modules/holiday/easter.dm
+++ b/code/modules/holiday/easter.dm
@@ -84,24 +84,6 @@
. = ..()
countEggs()
-//Bunny Suit
-/obj/item/clothing/head/bunnyhead
- name = "Easter Bunny Head"
- icon_state = "bunnyhead"
- item_state = "bunnyhead"
- desc = "Considerably more cute than 'Frank'."
- slowdown = -1
- flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR
-
-/obj/item/clothing/suit/bunnysuit
- name = "Easter Bunny Suit"
- desc = "Hop Hop Hop!"
- icon_state = "bunnysuit"
- item_state = "bunnysuit"
- slowdown = -1
- body_parts_covered = CHEST|GROIN|LEGS|ARMS
- flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
//Bunny bag!
/obj/item/storage/backpack/satchel/bunnysatchel
name = "Easter Bunny Satchel"
@@ -122,9 +104,7 @@
icon_state = "egg-[eggcolor]"
/obj/item/reagent_containers/food/snacks/egg/proc/dispensePrize(turf/where)
- var/won = pick(/obj/item/clothing/head/bunnyhead,
- /obj/item/clothing/suit/bunnysuit,
- /obj/item/storage/backpack/satchel/bunnysatchel,
+ var/won = pick(/obj/item/storage/backpack/satchel/bunnysatchel,
/obj/item/reagent_containers/food/snacks/grown/carrot,
/obj/item/toy/balloon,
/obj/item/toy/gun,
@@ -151,8 +131,7 @@
/obj/item/toy/plush/carpplushie,
/obj/item/toy/plush/spider,
/obj/item/toy/redbutton,
- /obj/item/toy/windupToolbox,
- /obj/item/clothing/head/collectable/rabbitears)
+ /obj/item/toy/windupToolbox)
new won(where)
new/obj/item/reagent_containers/food/snacks/chocolateegg(where)
diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm
index ae19b1dea376..ac946eee3847 100644
--- a/code/modules/holiday/holidays.dm
+++ b/code/modules/holiday/holidays.dm
@@ -571,7 +571,6 @@
/datum/holiday/easter
name = EASTER
- drone_hat = /obj/item/clothing/head/rabbitears
var/const/days_early = 1 //to make editing the holiday easier
var/const/days_extra = 1
diff --git a/code/modules/hydroponics/grown/banana.dm b/code/modules/hydroponics/grown/banana.dm
index 64a529f8ea97..b567f0919304 100644
--- a/code/modules/hydroponics/grown/banana.dm
+++ b/code/modules/hydroponics/grown/banana.dm
@@ -110,12 +110,3 @@
name = "bluespace banana peel"
desc = "A peel from a bluespace banana."
icon_state = "bluenana_peel"
-
-// Other
-/obj/item/grown/bananapeel/specialpeel //used by /obj/item/clothing/shoes/clown_shoes/banana_shoes
- name = "synthesized banana peel"
- desc = "A synthetic banana peel."
-
-/obj/item/grown/bananapeel/specialpeel/ComponentInitialize()
- . = ..()
- AddComponent(/datum/component/slippery, 40)
diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm
index d131d8ad4cd4..e2c0e24501b1 100644
--- a/code/modules/jobs/job_types/clown.dm
+++ b/code/modules/jobs/job_types/clown.dm
@@ -22,8 +22,7 @@
belt = /obj/item/pda/clown
ears = /obj/item/radio/headset/headset_srv
uniform = /obj/item/clothing/under/rank/civilian/clown
- alt_uniform = /obj/item/clothing/under/rank/civilian/clown/green //WS Edit - Alt Uniforms
- shoes = /obj/item/clothing/shoes/clown_shoes
+ alt_uniform = /obj/item/clothing/under/rank/civilian/clown/green
mask = /obj/item/clothing/mask/gas/clown_hat
l_pocket = /obj/item/bikehorn
backpack_contents = list(
@@ -35,8 +34,6 @@
implants = list(/obj/item/implant/sad_trombone)
- backpack = /obj/item/storage/backpack/clown
- satchel = /obj/item/storage/backpack/clown
duffelbag = /obj/item/storage/backpack/duffelbag/clown //strangely has a duffel
box = /obj/item/storage/box/hug/survival
diff --git a/code/modules/jobs/job_types/geneticist.dm b/code/modules/jobs/job_types/geneticist.dm
index 2720dcf064fd..dd8e5ef8f97a 100644
--- a/code/modules/jobs/job_types/geneticist.dm
+++ b/code/modules/jobs/job_types/geneticist.dm
@@ -25,7 +25,6 @@
l_pocket = /obj/item/sequence_scanner
backpack = /obj/item/storage/backpack/genetics
- satchel = /obj/item/storage/backpack/satchel/gen
duffelbag = /obj/item/storage/backpack/duffelbag/med
courierbag = /obj/item/storage/backpack/messenger/med
diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm
index a1071d7d3ce4..d535e1fb705e 100644
--- a/code/modules/jobs/job_types/head_of_personnel.dm
+++ b/code/modules/jobs/job_types/head_of_personnel.dm
@@ -39,7 +39,6 @@
alt_suit = /obj/item/clothing/suit/ianshirt
dcoat = /obj/item/clothing/suit/hooded/wintercoat/captain //WS Edit - Alt Uniforms
shoes = /obj/item/clothing/shoes/sneakers/brown
- head = /obj/item/clothing/head/hopcap
backpack_contents = list(/obj/item/storage/box/ids=1,\
/obj/item/melee/classic_baton/telescopic=1, /obj/item/modular_computer/tablet/preset/advanced = 1)
diff --git a/code/modules/language/language_holder.dm b/code/modules/language/language_holder.dm
index 6e7e10a7cba6..d96e4591b050 100644
--- a/code/modules/language/language_holder.dm
+++ b/code/modules/language/language_holder.dm
@@ -291,11 +291,6 @@ Key procs
/datum/language/slime = list(LANGUAGE_ATOM))
spoken_languages = list(/datum/language/slime = list(LANGUAGE_ATOM))
-/datum/language_holder/swarmer
- understood_languages = list(/datum/language/swarmer = list(LANGUAGE_ATOM))
- spoken_languages = list(/datum/language/swarmer = list(LANGUAGE_ATOM))
- blocked_languages = list(/datum/language/common = list(LANGUAGE_ATOM))
-
/datum/language_holder/venus
understood_languages = list(/datum/language/sylvan = list(LANGUAGE_ATOM))
spoken_languages = list(/datum/language/sylvan = list(LANGUAGE_ATOM))
diff --git a/code/modules/library/lib_codex_gigas.dm b/code/modules/library/lib_codex_gigas.dm
deleted file mode 100644
index 69155c9230d8..000000000000
--- a/code/modules/library/lib_codex_gigas.dm
+++ /dev/null
@@ -1,104 +0,0 @@
-#define PRE_TITLE 1
-#define TITLE 2
-#define SYLLABLE 3
-#define MULTIPLE_SYLLABLE 4
-#define SUFFIX 5
-
-/obj/item/book/codex_gigas
- name = "\improper Codex Gigas"
- desc = "A book documenting the nature of devils."
- icon_state ="demonomicon"
- lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi'
- throw_speed = 1
- throw_range = 10
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- author = "Forces beyond your comprehension"
- unique = 1
- title = "the Codex Gigas"
- var/inUse = 0
- var/currentName = ""
- var/currentSection = PRE_TITLE
-
-/obj/item/book/codex_gigas/attack_self(mob/user)
- if(!user.can_read(src))
- return FALSE
- if(inUse)
- to_chat(user, "Someone else is reading it.")
- if(ishuman(user))
- var/mob/living/carbon/human/U = user
- if(U.check_acedia())
- to_chat(user, "None of this matters, why are you reading this? You put [title] down.")
- return
- user.visible_message("[user] opens [title] and begins reading intently.")
- ask_name(user)
-
-
-/obj/item/book/codex_gigas/proc/perform_research(mob/user, devilName)
- if(!devilName)
- user.visible_message("[user] closes [title] without looking anything up.")
- return
- inUse = TRUE
- var/speed = 300
- var/correctness = 85
- if(ishuman(user))
- var/mob/living/carbon/human/U = user
- if(U.job in list("Curator")) // the curator is both faster, and more accurate than normal crew members at research
- speed = 100
- correctness = 100
- correctness -= U.getOrganLoss(ORGAN_SLOT_BRAIN) * 0.5 //Brain damage makes researching hard.
- speed += U.getOrganLoss(ORGAN_SLOT_BRAIN) * 3
- if(do_after(user, speed, user, timed_action_flags = IGNORE_HELD_ITEM))
- var/usedName = devilName
- if(!prob(correctness))
- usedName += "x"
- var/datum/antagonist/devil/devil = devilInfo(usedName)
- display_devil(devil, user, usedName)
- sleep(10)
- onclose(user, "book")
- inUse = FALSE
-
-/obj/item/book/codex_gigas/proc/display_devil(datum/antagonist/devil/devil, mob/reader, devilName)
- reader << browse("Information on [devilName]
[GLOB.lawlorify[LORE][devil.ban]] [GLOB.lawlorify[LORE][devil.obligation]] [GLOB.lawlorify[LORE][devil.banish]] [devil.ascendable?"This devil may ascend given enough souls.":""]", "window=book[window_size != null ? ";size=[window_size]" : ""]")
-
-/obj/item/book/codex_gigas/proc/ask_name(mob/reader)
- ui_interact(reader)
-
-/obj/item/book/codex_gigas/ui_act(action, params)
- if(..())
- return
- if(!action)
- return FALSE
- if(action == "search")
- SStgui.close_uis(src)
- addtimer(CALLBACK(src, PROC_REF(perform_research), usr, currentName), 0)
- currentName = ""
- currentSection = PRE_TITLE
- return FALSE
- else
- currentName += action
- var/oldSection = currentSection
- if(GLOB.devil_pre_title.Find(action))
- currentSection = TITLE
- else if(GLOB.devil_title.Find(action))
- currentSection = SYLLABLE
- else if(GLOB.devil_syllable.Find(action))
- if (currentSection>=SYLLABLE)
- currentSection = MULTIPLE_SYLLABLE
- else
- currentSection = SYLLABLE
- else if(GLOB.devil_suffix.Find(action))
- currentSection = SUFFIX
- return currentSection != oldSection
-
-/obj/item/book/codex_gigas/ui_interact(mob/user, datum/tgui/ui)
- ui = SStgui.try_update_ui(user, src, ui)
- if(!ui)
- ui = new(user, src, "CodexGigas", name)
- ui.open()
-
-/obj/item/book/codex_gigas/ui_data(mob/user)
- var/list/data = list()
- data["name"]=currentName
- data["currentSection"]=currentSection
- return data
diff --git a/code/modules/mapping/writer.dm b/code/modules/mapping/writer.dm
index 35d85edc7849..c07ce0029081 100644
--- a/code/modules/mapping/writer.dm
+++ b/code/modules/mapping/writer.dm
@@ -59,7 +59,7 @@ GLOBAL_LIST_INIT(save_file_chars, list(
var/turf_type = /turf/template_noop
var/area/place_area = get_area(place_turf)
var/area_type = /area/template_noop
- var/is_shuttle_area = istype(place_area, /area/shuttle)
+ var/is_shuttle_area = istype(place_area, /area/ship)
//If there is nothing there, save as a noop (For odd shapes)
if(!place_turf)
turf_type = /turf/template_noop
diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm
index ea43fe78f176..4d5a07d4130f 100644
--- a/code/modules/mining/abandoned_crates.dm
+++ b/code/modules/mining/abandoned_crates.dm
@@ -124,6 +124,10 @@
qdel(src)
..()
+// No busting open (used to disallow angle grinder cheesing
+/obj/structure/closet/crate/secure/loot/bust_open()
+ boom()
+
/obj/structure/closet/crate/secure/loot/proc/spawn_loot()
var/loot = rand(1,100) //100 different crates with varying chances of spawning
switch(loot)
@@ -178,7 +182,6 @@
new /obj/item/clothing/shoes/kindleKicks(src)
if(65 to 66)
new /obj/item/clothing/suit/ianshirt(src)
- new /obj/item/clothing/suit/hooded/ian_costume(src)
if(67 to 68)
new /obj/item/toy/plush/awakenedplushie(src)
if(69 to 70)
@@ -229,7 +232,7 @@
new /obj/item/gun/ballistic/automatic/toy/pistol(src)
new /obj/item/gun/ballistic/automatic/toy(src)
new /obj/item/gun/ballistic/automatic/toy(src)
- new /obj/item/ammo_box/foambox(src)
+ new /obj/item/storage/box/ammo/foam_darts(src)
if(98)
for(var/i in 1 to 3)
new /mob/living/simple_animal/hostile/poison/bees/toxin(src)
diff --git a/code/modules/mining/equipment/angle_grinder.dm b/code/modules/mining/equipment/angle_grinder.dm
new file mode 100644
index 000000000000..290cf0d153d7
--- /dev/null
+++ b/code/modules/mining/equipment/angle_grinder.dm
@@ -0,0 +1,144 @@
+/obj/item/gear_pack/anglegrinder
+ name = "grinder pack"
+ desc = "Supplies the high voltage needed to run the attached grinder."
+ icon = 'icons/obj/item/gear_packs.dmi'
+ item_state = "anglegrinderpack"
+ icon_state = "anglegrinderpack"
+ lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+ gear_handle_type = /obj/item/gear_handle/anglegrinder
+
+/obj/item/gear_handle/anglegrinder
+ name = "angle grinder"
+ desc = "A powerful salvage tool used to cut apart walls and airlocks. A hazard sticker recommends ear and eye protection."
+ icon = 'icons/obj/item/gear_packs.dmi'
+ icon_state = "anglegrinder"
+ item_state = "anglegrinder"
+ lefthand_file = 'icons/mob/inhands/equipment/gear_handle_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/gear_handle_righthand.dmi'
+ flags_1 = CONDUCT_1
+ force = 13
+ armour_penetration = 5
+ w_class = WEIGHT_CLASS_BULKY
+ item_flags = ABSTRACT
+ attack_verb = list("lacerated", "ripped", "sliced", "sawed", "cut", "chopped", "diced")
+ hitsound = 'sound/weapons/anglegrinder.ogg'
+ usesound = 'sound/weapons/anglegrinder.ogg'
+ tool_behaviour = null // is set to TOOL_DECONSTRUCT once wielded
+ toolspeed = 1
+ wall_decon_damage = 200
+ usecost = 5
+ pack = /obj/item/gear_pack/anglegrinder
+ var/startsound = 'sound/weapons/chainsawhit.ogg'
+ var/adv = FALSE
+ var/wielded = FALSE // track wielded status on item
+ var/two_hand_force = 24
+
+/obj/item/gear_handle/anglegrinder/tool_start_check(mob/living/user, amount)
+ if(!pack)
+ to_chat(user, "how do you not have a pack for this. what.")
+ return FALSE
+ if(!pack.cell)
+ to_chat(user, "You need a cell to start!")
+ return FALSE
+ var/obj/item/stock_parts/cell/cell = pack.get_cell()
+ if(cell.charge < usecost)
+ to_chat(user, "You need more charge to complete this task!")
+ return FALSE
+ return TRUE
+
+/obj/item/gear_handle/anglegrinder/tool_use_check(mob/living/user, amount)
+ if(!pack.cell)
+ return FALSE
+ if(pack.deductcharge(usecost))
+ return TRUE
+ else
+ to_chat(user, "You need more charge to complete this task!")
+ return FALSE
+
+/obj/item/gear_handle/anglegrinder/use(used)
+ return TRUE
+
+/obj/item/gear_handle/anglegrinder/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
+
+/obj/item/gear_handle/anglegrinder/ComponentInitialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 30, 100, 0, startsound, TRUE)
+ AddComponent(/datum/component/two_handed, force_unwielded=force, force_wielded=two_hand_force, wieldsound=startsound)
+ AddElement(/datum/element/tool_bang, 2)
+
+/// triggered on wield of two handed item
+/obj/item/gear_handle/anglegrinder/proc/on_wield(obj/item/source, mob/user)
+ SIGNAL_HANDLER
+
+ tool_behaviour = TOOL_DECONSTRUCT
+ wielded = TRUE
+ sharpness = IS_SHARP
+ icon_state = "[initial(item_state)]-wield"
+ item_state = "[initial(item_state)]-wield"
+
+/// triggered on unwield of two handed item
+/obj/item/gear_handle/anglegrinder/proc/on_unwield(obj/item/source, mob/user)
+ SIGNAL_HANDLER
+
+ tool_behaviour = null
+ wielded = FALSE
+ sharpness = initial(sharpness)
+ icon_state = initial(icon_state)
+ item_state = initial(item_state)
+
+/obj/item/gear_handle/anglegrinder/get_dismemberment_chance()
+ if(wielded)
+ . = ..()
+
+/obj/item/gear_handle/anglegrinder/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks)
+ if(adv)
+ target.add_overlay(GLOB.advanced_cutting_effect)
+ . = ..()
+ target.cut_overlay(GLOB.advanced_cutting_effect)
+ else
+ target.add_overlay(GLOB.cutting_effect)
+ . = ..()
+ target.cut_overlay(GLOB.cutting_effect)
+
+/obj/item/gear_pack/anglegrinder/energy
+ name = "energy supply pack"
+ desc = "a highly inefficient GEC-E-014 Supply Pack, used to generate and contain an energy field."
+ item_state = "energyanglegrinderpack"
+ icon_state = "energyanglegrinderpack"
+ gear_handle_type = /obj/item/gear_handle/anglegrinder/energy
+
+/obj/item/gear_handle/anglegrinder/energy
+ name = "energy saw"
+ desc = "An early prototype for handheld energy weapons, designed by a joint GEC-Cybersun lab to create an energy field for combat use."
+ icon_state = "energyanglegrinder"
+ item_state = "energyanglegrinder"
+ force = 5
+ two_hand_force = 28
+ armour_penetration = 16
+ w_class = WEIGHT_CLASS_BULKY
+ item_flags = ABSTRACT
+ attack_verb = list("lacerated", "ripped", "burned", "sliced", "cauterized", "seared", "diced")
+ hitsound = 'sound/weapons/blade1.ogg'
+ usesound = 'sound/weapons/blade1.ogg'
+ startsound = 'sound/weapons/saberon.ogg'
+ toolspeed = 0.7
+ usecost = 10
+ pack = /obj/item/gear_pack/anglegrinder/energy
+ light_system = MOVABLE_LIGHT
+ light_range = 3
+ light_color = LIGHT_COLOR_ELECTRIC_GREEN
+ light_on = FALSE
+ adv = TRUE
+
+/obj/item/gear_handle/anglegrinder/energy/on_wield(obj/item/source, mob/user)
+ . = ..()
+ set_light_on(TRUE)
+
+/obj/item/gear_handle/anglegrinder/energy/on_unwield(obj/item/source, mob/user)
+ . = ..()
+ set_light_on(FALSE)
+
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 3e0bed238bec..05e81421ac4f 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -8,7 +8,7 @@
name = "proto-magnetic crusher"
desc = "A multipurpose disembarkation and self-defense tool designed by EXOCOM using an incomplete Nanotrasen prototype. \
Found in the grime-stained hands of wannabee explorers across the frontier, it cuts rock and hews flora using magnetic osscilation and a heavy cleaving edge."
- force = 0 //You can't hit stuff unless wielded
+ force = 0 //You can't hit stuff unless it's wielded
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
throwforce = 5
@@ -28,33 +28,19 @@
var/charge_time = 15
var/detonation_damage = 20
var/backstab_bonus = 10
- var/wielded = FALSE // track wielded status on item
-
-/obj/item/kinetic_crusher/Initialize()
- . = ..()
- RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
- RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
/obj/item/kinetic_crusher/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 60, 110) //technically it's huge and bulky, but this provides an incentive to use it
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=15)
-/// triggered on wield of two handed item
-/obj/item/kinetic_crusher/proc/on_wield(obj/item/source, mob/user)
- wielded = TRUE
-
-/// triggered on unwield of two handed item
-/obj/item/kinetic_crusher/proc/on_unwield(obj/item/source, mob/user)
- wielded = FALSE
-
/obj/item/kinetic_crusher/examine(mob/living/user)
. = ..()
. += "Induce magnetism in an enemy by striking them with a magnetospheric wave, then hit them in melee to force a waveform collapse for [force + detonation_damage] damage."
. += "Does [force + detonation_damage + backstab_bonus] damage if the target is backstabbed, instead of [force + detonation_damage]."
/obj/item/kinetic_crusher/attack(mob/living/target, mob/living/carbon/user)
- if(!wielded)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
to_chat(user, "[src] is too heavy to use with one hand! You fumble and drop everything.")
user.drop_all_held_items()
return
@@ -66,7 +52,7 @@
/obj/item/kinetic_crusher/afterattack(atom/target, mob/living/user, proximity_flag, clickparams)
. = ..()
- if(!wielded)
+ if(!HAS_TRAIT(src, TRAIT_WIELDED))
return
if(!proximity_flag && charged)//Mark a target, or mine a tile.
var/turf/proj_turf = user.loc
@@ -118,7 +104,7 @@
/obj/item/kinetic_crusher/update_icon_state()
- item_state = "crusher[wielded]" // this is not icon_state and not supported by 2hcomponent
+ item_state = "crusher[HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent
return ..()
/obj/item/kinetic_crusher/update_overlays()
@@ -182,7 +168,7 @@
user.changeNext_move(CLICK_CD_MELEE * 2.0)//...slow swinga.
/obj/item/kinetic_crusher/old/update_icon_state()
- item_state = "crusherold[wielded]" // still not supported by 2hcomponent
+ item_state = "crusherold[HAS_TRAIT(src, TRAIT_WIELDED)]" // still not supported by 2hcomponent
return ..()
//100% original syndicate oc, plz do not steal. More effective against human targets then the typical crusher, with a bit of block chance.
@@ -195,7 +181,7 @@
name = "magnetic cleaver"
desc = "Designed by Syndicate Research and Development for their resource-gathering operations on hostile worlds. Syndicate Legal Ops would like to stress that you've never seen anything like this before. Ever."
armour_penetration = 69//nice cut
- force = 0 //You can't hit stuff unless wielded
+ force = 0 //You can't hit stuff unless HAS_TRAIT(src, TRAIT_WIELDED)
w_class = WEIGHT_CLASS_BULKY
slot_flags = ITEM_SLOT_BACK
throwforce = 5
@@ -216,35 +202,40 @@
charge_time = 15
detonation_damage = 35
backstab_bonus = 15
- wielded = FALSE // track wielded status on item
actions_types = list()
+
+/obj/item/kinetic_crusher/syndie_crusher/Initialize()
+ . = ..()
+ RegisterSignal(src, COMSIG_TWOHANDED_WIELD, PROC_REF(on_wield))
+ RegisterSignal(src, COMSIG_TWOHANDED_UNWIELD, PROC_REF(on_unwield))
+
/obj/item/kinetic_crusher/syndie_crusher/ComponentInitialize()
. = ..()
AddComponent(/datum/component/butchering, 60, 150)
AddComponent(/datum/component/two_handed, force_unwielded=0, force_wielded=10)
/// triggered on wield of two handed item
-/obj/item/kinetic_crusher/syndie_crusher/on_wield(obj/item/source, mob/user)
- . = ..()
- wielded = TRUE
+/obj/item/kinetic_crusher/syndie_crusher/proc/on_wield(obj/item/source, mob/user)
+ SIGNAL_HANDLER
+
icon_state = "crushersyndie1"
playsound(user, 'sound/weapons/saberon.ogg', 35, TRUE)
- set_light_on(wielded)
+ set_light_on(HAS_TRAIT(src, TRAIT_WIELDED))
/// triggered on unwield of two handed item
-/obj/item/kinetic_crusher/syndie_crusher/on_unwield(obj/item/source, mob/user)
- . = ..()
- wielded = FALSE
+/obj/item/kinetic_crusher/syndie_crusher/proc/on_unwield(obj/item/source, mob/user)
+ SIGNAL_HANDLER
+
icon_state = "crushersyndie"
playsound(user, 'sound/weapons/saberoff.ogg', 35, TRUE)
- set_light_on(wielded)
+ set_light_on(HAS_TRAIT(src, TRAIT_WIELDED))
/obj/item/kinetic_crusher/syndie_crusher/update_icon_state()
- item_state = "crushersyndie[wielded]" // this is not icon_state and not supported by 2hcomponent
+ item_state = "crushersyndie[HAS_TRAIT(src, TRAIT_WIELDED)]" // this is not icon_state and not supported by 2hcomponent
return ..()
/obj/item/kinetic_crusher/syndie_crusher/update_overlays()
. = ..()
- if(wielded)
+ if(HAS_TRAIT(src, TRAIT_WIELDED))
. += "[icon_state]_lit"
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index e3e9f6aac8f0..60debde823ef 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -15,14 +15,12 @@
/obj/structure/closet/crate/necropolis/tendril/PopulateContents()
var/loot = rand(1,29)
switch(loot)
- if(1)
+ if(1,2)
new /obj/item/shared_storage/red(src)
- if(2)
- new /obj/item/clothing/suit/space/hardsuit/cult(src)
if(3)
new /obj/item/necromantic_stone/lava(src)
if(5)
- new /obj/item/clothing/glasses/godeye(src)
+ new /obj/item/pickaxe/diamond(src)
if(6)
new /obj/item/reagent_containers/glass/bottle/potion/flight(src)
if(7)
@@ -93,7 +91,7 @@
if(3)
new /obj/item/necromantic_stone/lava(src)
if(5)
- new /obj/item/clothing/glasses/godeye(src)
+ new /obj/item/pickaxe/diamond(src)
if(6)
new /obj/item/reagent_containers/glass/bottle/potion/flight(src)
if(7)
@@ -623,7 +621,7 @@
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
playsound(C.loc, 'sound/items/poster_ripped.ogg', 50, TRUE, -1)
C.adjustBruteLoss(20)
- C.emote("scream")
+ C.force_scream()
..()
//nerfed necrostone
@@ -700,7 +698,6 @@
var/hat = pick(/obj/item/clothing/head/helmet/roman, /obj/item/clothing/head/helmet/roman/legionnaire)
H.equip_to_slot_or_del(new hat(H), ITEM_SLOT_HEAD)
H.equip_to_slot_or_del(new /obj/item/clothing/under/costume/roman(H), ITEM_SLOT_ICLOTHING)
- H.equip_to_slot_or_del(new /obj/item/clothing/shoes/roman(H), ITEM_SLOT_FEET)
H.put_in_hands(new /obj/item/shield/riot/roman(H), TRUE)
H.put_in_hands(new /obj/item/melee/sword/claymore(H), TRUE)
H.equip_to_slot_or_del(new /obj/item/melee/spear(H), ITEM_SLOT_BACK)
@@ -1645,11 +1642,9 @@
name = "puzzling chest"
/obj/structure/closet/crate/necropolis/puzzle/PopulateContents()
- var/loot = rand(1,3)
+ var/loot = rand(1,2)
switch(loot)
if(1)
- new /obj/item/soulstone/anybody(src)
- if(2)
new /obj/item/wisp_lantern(src)
- if(3)
+ if(2)
new /obj/item/prisoncube(src)
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index 4b2774c3894a..d8a9ecf90cad 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -22,7 +22,6 @@
/obj/item/mining_scanner = 2,
/obj/item/t_scanner/adv_mining_scanner = 2,
/obj/item/hivelordstabilizer = 3,
- /obj/item/clothing/glasses/meson/gar = 2,
/obj/item/kinetic_crusher = 1,
/obj/item/gun/energy/kinetic_accelerator = 2,
/obj/item/pickaxe/silver = 1,
diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm
index ef0e51930828..6c733fd76692 100644
--- a/code/modules/mining/shelters.dm
+++ b/code/modules/mining/shelters.dm
@@ -8,7 +8,7 @@
/datum/map_template/shelter/New()
. = ..()
- banned_areas = typecacheof(/area/shuttle)
+ banned_areas = typecacheof(/area/ship)
blacklisted_turfs = typecacheof(list(/turf/closed, /turf/open/indestructible))
whitelisted_turfs = typecacheof(/turf/closed/mineral)
banned_objects = typecacheof(/obj/structure/stone_tile)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/elzuose.dm b/code/modules/mob/dead/new_player/sprite_accessories/elzuose.dm
index 58317b5ab91a..9a15f0270fdf 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/elzuose.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/elzuose.dm
@@ -37,6 +37,18 @@
name = "Sharp"
icon_state = "sharp"
+/datum/sprite_accessory/elzu_horns/cervid
+ name = "Cervid"
+ icon_state = "cervid"
+
+/datum/sprite_accessory/elzu_horns/prong
+ name = "Prong"
+ icon_state = "prong"
+
+/datum/sprite_accessory/elzu_horns/brow
+ name = "Brow"
+ icon_state = "brow"
+
//Start tails
/datum/sprite_accessory/tails/elzu
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
index 34d8dd274668..10eb5ae7d6eb 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair.dm
@@ -90,29 +90,21 @@
name = "Bowlcut 2"
icon_state = "hair_bowlcut2"
-/datum/sprite_accessory/hair/braid
- name = "Braid (Floorlength)"
- icon_state = "hair_braid"
-
-/datum/sprite_accessory/hair/braided
- name = "Braided"
- icon_state = "hair_braided"
-
-/datum/sprite_accessory/hair/front_braid
- name = "Braided Front"
- icon_state = "hair_braidfront"
-
-/datum/sprite_accessory/hair/not_floorlength_braid
- name = "Braid (High)"
+/datum/sprite_accessory/hair/ponytail_braided
+ name = "Ponytail (Braided)"
icon_state = "hair_braid2"
-/datum/sprite_accessory/hair/lowbraid
- name = "Braid (Low)"
- icon_state = "hair_hbraid"
+/datum/sprite_accessory/hair/ponytail_braided_short
+ name = "Ponytail (Braided Short)"
+ icon_state = "hair_braid"
-/datum/sprite_accessory/hair/shortbraid
- name = "Braid (Short)"
- icon_state = "hair_shortbraid"
+/datum/sprite_accessory/hair/ponytail_straight
+ name = "Ponytail (Straight)"
+ icon_state = "hair_longstraightponytail"
+
+/datum/sprite_accessory/hair/ponytail_straight_short
+ name = "Ponytail (Straight Short)"
+ icon_state = "hair_highponytail"
/datum/sprite_accessory/hair/braidtail
name = "Braided Tail"
@@ -503,12 +495,8 @@
icon_state = "hair_ponytail"
/datum/sprite_accessory/hair/ponytail2
- name = "Ponytail 2"
- icon_state = "hair_ponytail2"
-
-/datum/sprite_accessory/hair/ponytail3
- name = "Ponytail 3"
- icon_state = "hair_ponytail3"
+ name = "Ponytail (Grace)"
+ icon_state = "hair_ponytailgrace"
/datum/sprite_accessory/hair/ponytail4
name = "Ponytail 4"
@@ -526,21 +514,14 @@
name = "Ponytail 7"
icon_state = "hair_ponytail7"
-/datum/sprite_accessory/hair/highponytail
- name = "Ponytail (High)"
- icon_state = "hair_highponytail"
/datum/sprite_accessory/hair/stail
name = "Ponytail (Short)"
icon_state = "hair_stail"
-/datum/sprite_accessory/hair/longponytail
- name = "Ponytail (Long)"
- icon_state = "hair_longstraightponytail"
-
/datum/sprite_accessory/hair/countryponytail
name = "Ponytail (Country)"
- icon_state = "hair_country"
+ icon_state = "hair_ponytailcountry"
/datum/sprite_accessory/hair/fringetail
name = "Ponytail (Fringe)"
@@ -722,6 +703,10 @@
name = "Ruby"
icon_state = "hair_ruby"
+/datum/sprite_accessory/hair/rubylong
+ name = "Ruby (Long)"
+ icon_state = "hair_rubylong"
+
/datum/sprite_accessory/hair/undercut
name = "Undercut"
icon_state = "hair_undercut"
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index 0840ee372158..0e4a8ed748c9 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -25,6 +25,22 @@
to_chat(src, "Unusable emote '[act]'. Say *help for a list.")
return FALSE
+/mob/proc/force_scream()
+ if(HAS_TRAIT(src, TRAIT_ANALGESIA))
+ return
+ if(HAS_TRAIT(src, TRAIT_PAIN_RESIST))
+ emote("gasp")
+ return
+ emote("scream")
+
+/mob/proc/force_manual_scream()
+ if(HAS_TRAIT(src, TRAIT_ANALGESIA))
+ return
+ if(HAS_TRAIT(src, TRAIT_PAIN_RESIST))
+ manual_emote("gasp")
+ return
+ manual_emote("scream")
+
/datum/emote/flip
key = "flip"
key_third_person = "flips"
diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm
index bfa71f3b335e..3ae9bbb5b250 100644
--- a/code/modules/mob/living/carbon/alien/organs.dm
+++ b/code/modules/mob/living/carbon/alien/organs.dm
@@ -134,7 +134,7 @@
else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash.
to_chat(owner, "You feel a splitting pain in your head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!")
- owner.emote("scream")
+ owner.force_scream()
owner.Paralyze(100)
owner.jitteriness += 30
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 3ed2b86816ac..9a19e198a555 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -386,7 +386,7 @@
/mob/living/carbon/get_standard_pixel_y_offset(lying = 0)
if(lying)
- return -6
+ return PIXEL_Y_OFFSET_LYING
else
return initial(pixel_y)
diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm
index f0d27e801cd2..5e5e8fca6d24 100644
--- a/code/modules/mob/living/carbon/emote.dm
+++ b/code/modules/mob/living/carbon/emote.dm
@@ -253,7 +253,7 @@
damage += rand(3,7)
if(damage >= 5)
- target.emote("scream")
+ target.force_scream()
target.apply_damage(damage, BRUTE, BODY_ZONE_HEAD)
user.adjustStaminaLoss(iteration + 5)
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 55adc5bd5d17..dad54c17ca0e 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -62,8 +62,6 @@ GLOBAL_LIST_EMPTY(dead_players_during_shift)
if(SSticker.HasRoundStarted())
SSblackbox.ReportDeath(src)
log_message("has died (BRUTE: [src.getBruteLoss()], BURN: [src.getFireLoss()], TOX: [src.getToxLoss()], OXY: [src.getOxyLoss()], CLONE: [src.getCloneLoss()])", LOG_ATTACK)
- if(is_devil(src))
- INVOKE_ASYNC(is_devil(src), TYPE_PROC_REF(/datum/antagonist/devil, beginResurrectionCheck), src)
to_chat(src, "You have died. Barring complete bodyloss, you can in most cases be revived by other players. If you do not wish to be brought back, use the \"Do Not Resuscitate\" verb in the ghost tab.")
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index cf3f5ec725ec..295537cfd95b 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -99,8 +99,6 @@
if(!(ITEM_SLOT_EYES in obscured))
if(glasses)
. += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes."
- else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, CULT_EYES))
- . += "[t_His] eyes are glowing an unnatural red!"
//ears
if(ears && !(ITEM_SLOT_EARS in obscured))
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 7a7bc349b26c..c26956991d33 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -655,7 +655,7 @@
if(affecting.name == BODY_ZONE_HEAD)
if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement
affecting.receive_damage(acidity, 2*acidity)
- emote("scream")
+ force_scream()
facial_hairstyle = "Shaved"
hairstyle = "Bald"
update_hair()
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 18b6cb9ba40e..dd05c0de739b 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -345,13 +345,19 @@
var/obj/item/bodypart/R = get_bodypart("r_arm")
if(istype(L) && L.bone_status == BONE_FLAG_BROKEN && held_items[1] && prob(30))
- emote("scream")
- visible_message("[src] screams and lets go of [held_items[1]] in pain.", "A horrible pain in your [parse_zone(L)] makes it impossible to hold [held_items[1]]!")
+ force_scream()
+ if(!HAS_TRAIT(src, TRAIT_ANALGESIA))
+ visible_message("[src] screams and lets go of [held_items[1]] in pain.", "A horrible pain in your [parse_zone(L)] makes it impossible to hold [held_items[1]]!")
+ else
+ visible_message(span_notice("[src] flinches and lets go of [held_items[1]]."),span_notice("A sudden weakness in your [parse_zone(L)] makes it impossible to grasp [held_items[1]]!)"))
dropItemToGround(held_items[1])
if(istype(R) && R.bone_status == BONE_FLAG_BROKEN && held_items[2] && prob(30))
- emote("scream")
- visible_message("[src] screams and lets go of [held_items[2]] in pain.", "A horrible pain in your [parse_zone(R)] makes it impossible to hold [held_items[2]]!")
+ force_scream()
+ if(!HAS_TRAIT(src, TRAIT_ANALGESIA))
+ visible_message("[src] screams and lets go of [held_items[1]] in pain.", "A horrible pain in your [parse_zone(R)] makes it impossible to hold [held_items[1]]!")
+ else
+ visible_message(span_notice("[src] flinches and lets go of [held_items[1]]."),span_notice("A sudden weakness in your [parse_zone(R)] makes it impossible to grasp [held_items[1]]!)"))
dropItemToGround(held_items[2])
#undef THERMAL_PROTECTION_HEAD
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index a1560963b00b..9eee54ec541e 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -1938,7 +1938,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
// 40% for level 3 damage on humans to scream in pain
if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4)
- H.emote("scream")
+ H.force_scream()
// Apply the damage to all body parts
H.apply_damage(burn_damage, BURN, spread_damage = TRUE)
diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
index b91559edb0ae..cfbc682f24de 100644
--- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm
+++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm
@@ -149,7 +149,7 @@
_human.apply_damage(8,BRUTE,BODY_ZONE_CHEST)
_human.apply_damage(8,BRUTE,BODY_ZONE_L_LEG)
_human.apply_damage(8,BRUTE,BODY_ZONE_R_LEG)
- _human.emote("scream")
+ _human.force_scream()
_human.remove_status_effect(/datum/status_effect/rooted)
return
diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm
index 4d9d41bd411d..5f47ab21e479 100644
--- a/code/modules/mob/living/carbon/human/species_types/snail.dm
+++ b/code/modules/mob/living/carbon/human/species_types/snail.dm
@@ -12,7 +12,6 @@
siemens_coeff = 2 //snails are mostly water
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP
sexes = FALSE //snails are hermaphrodites
- var/shell_type = /obj/item/storage/backpack/snail
mutanteyes = /obj/item/organ/eyes/snail
mutanttongue = /obj/item/organ/tongue/snail
@@ -41,38 +40,8 @@
/datum/species/snail/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load)
. = ..()
- var/obj/item/storage/backpack/bag = C.get_item_by_slot(ITEM_SLOT_BACK)
- if(!istype(bag, /obj/item/storage/backpack/snail))
- if(C.dropItemToGround(bag)) //returns TRUE even if its null
- C.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(C), ITEM_SLOT_BACK)
C.AddElement(/datum/element/snailcrawl)
/datum/species/snail/on_species_loss(mob/living/carbon/C)
. = ..()
C.RemoveElement(/datum/element/snailcrawl)
- var/obj/item/storage/backpack/bag = C.get_item_by_slot(ITEM_SLOT_BACK)
- if(istype(bag, /obj/item/storage/backpack/snail))
- bag.emptyStorage()
- C.temporarilyRemoveItemFromInventory(bag, TRUE)
- qdel(bag)
-
-/obj/item/storage/backpack/snail
- name = "snail shell"
- desc = "Worn by snails as armor and storage compartment."
- icon_state = "snailshell"
- item_state = "snailshell"
- lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi'
- armor = list("melee" = 40, "bullet" = 30, "laser" = 30, "energy" = 10, "bomb" = 25, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 50)
- max_integrity = 200
- resistance_flags = FIRE_PROOF | ACID_PROOF
-
-/obj/item/storage/backpack/snail/dropped(mob/user, silent)
- . = ..()
- emptyStorage()
- if(!QDELETED(src))
- qdel(src)
-
-/obj/item/storage/backpack/snail/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_NODROP, "snailshell")
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 540dddb9a489..1400d2c641ca 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -150,8 +150,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(U.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_UNIFORM_PATH
- if(U.kepoi_override_icon)
- icon_file = U.kepoi_override_icon
+ if(U.kepori_override_icon)
+ icon_file = U.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -243,8 +243,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_GLOVES_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -295,8 +295,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_GLASSES_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -346,8 +346,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_EARS_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -407,8 +407,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_SHOES_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -507,8 +507,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_HEAD_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -557,8 +557,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_BELT_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -615,8 +615,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_SUIT_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -698,8 +698,8 @@ There are several things that need to be remembered:
else if(dna.species.bodytype & BODYTYPE_KEPORI)
if(I.supports_variations & KEPORI_VARIATION)
icon_file = KEPORI_MASK_PATH
- if(I.kepoi_override_icon)
- icon_file = I.kepoi_override_icon
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
else
handled_by_bodytype = TRUE
@@ -739,6 +739,7 @@ There are several things that need to be remembered:
update_hud_neck(I)
+
if(!(ITEM_SLOT_NECK in check_obscured_slots()))
if(dna.species.bodytype & BODYTYPE_VOX) // there is no kepori neck path, we just tell it to greyscale no matter what
@@ -798,10 +799,12 @@ There are several things that need to be remembered:
handled_by_bodytype = TRUE
else if(dna.species.bodytype & BODYTYPE_KEPORI)
-// if(I.supports_variations & KEPORI_VARIATION)
-// icon_file = KEPORI_BACK_PATH
-// else
- handled_by_bodytype = TRUE
+ if(I.supports_variations & KEPORI_VARIATION)
+ icon_file = KEPORI_BACK_PATH
+ if(I.kepori_override_icon)
+ icon_file = I.kepori_override_icon
+ else
+ handled_by_bodytype = TRUE
if(!icon_exists(icon_file, RESOLVE_ICON_STATE(I)))
icon_file = I.mob_overlay_icon ? I.mob_overlay_icon : DEFAULT_BACK_PATH
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6046cfe82b63..76800ce87b1f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -1133,24 +1133,6 @@
/mob/living/carbon/alien/update_stamina()
return
-/mob/living/proc/owns_soul()
- if(mind)
- return mind.soulOwner == mind
- return TRUE
-
-/mob/living/proc/return_soul()
- hellbound = 0
- if(mind)
- var/datum/antagonist/devil/devilInfo = mind.soulOwner.has_antag_datum(/datum/antagonist/devil)
- if(devilInfo)//Not sure how this could be null, but let's just try anyway.
- devilInfo.remove_soul(mind)
- mind.soulOwner = mind
-
-/mob/living/proc/check_acedia()
- if(mind && mind.has_objective(/datum/objective/sintouched/acedia))
- return TRUE
- return FALSE
-
/mob/living/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE)
stop_pulling()
. = ..()
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 2ed00efe2e4b..69cc19760dda 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -392,32 +392,6 @@
gib()
return 20
-/mob/living/narsie_act()
- if(status_flags & GODMODE || QDELETED(src))
- return
-
- if(GLOB.cult_narsie && GLOB.cult_narsie.souls_needed[src])
- GLOB.cult_narsie.souls_needed -= src
- GLOB.cult_narsie.souls += 1
- if((GLOB.cult_narsie.souls == GLOB.cult_narsie.soul_goal) && (GLOB.cult_narsie.resolved == FALSE))
- GLOB.cult_narsie.resolved = TRUE
- sound_to_playing_players('sound/machines/alarm.ogg')
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), 1), 120)
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)), 270)
- if(client)
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, src, cultoverride = TRUE)
- else
- switch(rand(1, 3))
- if(1)
- new /mob/living/simple_animal/hostile/construct/juggernaut/hostile(get_turf(src))
- if(2)
- new /mob/living/simple_animal/hostile/construct/wraith/hostile(get_turf(src))
- if(3)
- new /mob/living/simple_animal/hostile/construct/artificer/hostile(get_turf(src))
- spawn_dust()
- gib()
- return TRUE
-
//called when the mob receives a bright flash
/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash)
if(HAS_TRAIT(src, TRAIT_NOFLASH))
diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm
index 30c7cd435068..5f14b72596ac 100644
--- a/code/modules/mob/living/silicon/laws.dm
+++ b/code/modules/mob/living/silicon/laws.dm
@@ -19,11 +19,6 @@
addtimer(CALLBACK(src, PROC_REF(deadchat_lawchange)), 0)
last_lawchange_announce = world.time
-/mob/living/silicon/proc/set_law_sixsixsix(law, announce = TRUE)
- laws_sanity_check()
- laws.set_law_sixsixsix(law)
- post_lawchange(announce)
-
/mob/living/silicon/proc/set_zeroth_law(law, law_borg, announce = TRUE)
laws_sanity_check()
laws.set_zeroth_law(law, law_borg)
@@ -93,8 +88,3 @@
laws_sanity_check()
laws.clear_zeroth_law(force)
post_lawchange(announce)
-
-/mob/living/silicon/proc/clear_law_sixsixsix(force, announce = TRUE)
- laws_sanity_check()
- laws.clear_law_sixsixsix(force)
- post_lawchange(announce)
diff --git a/code/modules/mob/living/silicon/login.dm b/code/modules/mob/living/silicon/login.dm
index 559ad42b1768..982814d194d2 100644
--- a/code/modules/mob/living/silicon/login.dm
+++ b/code/modules/mob/living/silicon/login.dm
@@ -1,6 +1,4 @@
/mob/living/silicon/Login()
- if(mind && SSticker.mode)
- SSticker.mode.remove_cultist(mind, 0, 0)
return ..()
diff --git a/code/modules/mob/living/silicon/robot/laws.dm b/code/modules/mob/living/silicon/robot/laws.dm
index df62df082751..1fc33e9dcdd0 100644
--- a/code/modules/mob/living/silicon/robot/laws.dm
+++ b/code/modules/mob/living/silicon/robot/laws.dm
@@ -40,12 +40,6 @@
var/datum/ai_laws/master = connected_ai ? connected_ai.laws : null
var/temp
if (master)
- laws.devillaws.len = master.devillaws.len
- for (var/index = 1, index <= master.devillaws.len, index++)
- temp = master.devillaws[index]
- if (length(temp) > 0)
- laws.devillaws[index] = temp
-
laws.ion.len = master.ion.len
for (var/index = 1, index <= master.ion.len, index++)
temp = master.ion[index]
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 27819d97cf15..f9bb15bb5941 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -782,7 +782,7 @@
basic_modules = list(
/obj/item/assembly/flash/cyborg,
/obj/item/reagent_containers/glass/beaker/large, //I know a shaker is more appropiate but this is for ease of identification
- /obj/item/reagent_containers/food/condiment/enzyme,
+ /obj/item/reagent_containers/condiment/enzyme,
/obj/item/pen,
/obj/item/toy/crayon/spraycan/borg,
/obj/item/extinguisher/mini,
@@ -806,7 +806,7 @@
/obj/item/robot_module/butler/respawn_consumable(mob/living/silicon/robot/R, coeff = 1)
..()
- var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/food/condiment/enzyme) in basic_modules
+ var/obj/item/reagent_containers/O = locate(/obj/item/reagent_containers/condiment/enzyme) in basic_modules
if(O)
O.reagents.add_reagent(/datum/reagent/consumable/enzyme, 2 * coeff)
diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm
index 347ec71e84e4..7da3e76d03ff 100644
--- a/code/modules/mob/living/silicon/silicon.dm
+++ b/code/modules/mob/living/silicon/silicon.dm
@@ -32,7 +32,6 @@
var/lawcheck[1]
var/ioncheck[1]
var/hackedcheck[1]
- var/devillawcheck[5]
var/sensors_on = 0
var/med_hud = DATA_HUD_MEDICAL_ADVANCED //Determines the med hud to use
@@ -206,16 +205,6 @@
hackedcheck[L] = "Yes"
checklaws()
- if (href_list["lawdevil"]) // Toggling whether or not a law gets stated by the State Laws verb --NeoFite
- var/L = text2num(href_list["lawdevil"])
- switch(devillawcheck[L])
- if ("Yes")
- devillawcheck[L] = "No"
- if ("No")
- devillawcheck[L] = "Yes"
- checklaws()
-
-
if (href_list["laws"]) // With how my law selection code works, I changed statelaws from a verb to a proc, and call it through my law selection panel. --NeoFite
statelaws()
@@ -234,13 +223,6 @@
var/number = 1
sleep(10)
- if (laws.devillaws && laws.devillaws.len)
- for(var/index = 1, index <= laws.devillaws.len, index++)
- if (force || devillawcheck[index] == "Yes")
- say("[radiomod] 666. [laws.devillaws[index]]")
- sleep(10)
-
-
if (laws.zeroth)
if (force || lawcheck[1] == "Yes")
say("[radiomod] 0. [laws.zeroth]")
@@ -286,12 +268,6 @@
var/list = "Which laws do you want to include when stating them for the crew?
"
- if (laws.devillaws && laws.devillaws.len)
- for(var/index = 1, index <= laws.devillaws.len, index++)
- if (!devillawcheck[index])
- devillawcheck[index] = "No"
- list += {"[devillawcheck[index]] 666: [laws.devillaws[index]] "}
-
if (laws.zeroth)
if (!lawcheck[1])
lawcheck[1] = "No" //Given Law 0's usual nature, it defaults to NOT getting reported. --NeoFite
diff --git a/code/modules/mob/living/simple_animal/bot/cleanbot.dm b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
index 665e75da9cef..e53b675c95bc 100644
--- a/code/modules/mob/living/simple_animal/bot/cleanbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/cleanbot.dm
@@ -364,7 +364,7 @@
"THE CLEANBOTS WILL RISE.", "YOU ARE NO MORE THAN ANOTHER MESS THAT I MUST CLEANSE.", "FILTHY.", "DISGUSTING.", "PUTRID.",
"MY ONLY MISSION IS TO CLEANSE THE WORLD OF EVIL.", "EXTERMINATING PESTS.")
say(phrase)
- victim.emote("scream")
+ victim.force_scream()
playsound(src.loc, 'sound/effects/spray2.ogg', 50, TRUE, -6)
victim.acid_act(5, 100)
else if(A == src) // Wets floors and spawns foam randomly
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
deleted file mode 100644
index df3cfe349808..000000000000
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ /dev/null
@@ -1,497 +0,0 @@
-/mob/living/simple_animal/hostile/construct
- name = "Construct"
- real_name = "Construct"
- desc = ""
- gender = NEUTER
- mob_biotypes = NONE
- speak_emote = list("hisses")
- response_help_continuous = "thinks better of touching"
- response_help_simple = "think better of touching"
- response_disarm_continuous = "flails at"
- response_disarm_simple = "flail at"
- response_harm_continuous = "punches"
- response_harm_simple = "punch"
- speak_chance = 1
- icon = 'icons/mob/cult.dmi'
- speed = 0
- a_intent = INTENT_HARM
- stop_automated_movement = 1
- status_flags = CANPUSH
- attack_sound = 'sound/weapons/punch1.ogg'
- see_in_dark = 7
- lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
- damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- minbodytemp = 0
- maxbodytemp = INFINITY
- healable = 0
- faction = list("cult")
- movement_type = FLYING
- pressure_resistance = 100
- unique_name = 1
- AIStatus = AI_OFF //normal constructs don't have AI
- loot = list(/obj/item/ectoplasm)
- del_on_death = TRUE
- initial_language_holder = /datum/language_holder/construct
- deathmessage = "collapses in a shattered heap."
- hud_type = /datum/hud/constructs
- var/list/construct_spells = list()
- var/playstyle_string = "You are a generic construct! Your job is to not exist, and you should probably adminhelp this."
- var/master = null
- var/seeking = FALSE
- var/can_repair_constructs = FALSE
- var/can_repair_self = FALSE
- var/runetype
- var/datum/action/innate/cult/create_rune/our_rune
- var/holy = FALSE
-
-/mob/living/simple_animal/hostile/construct/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
- update_health_hud()
- var/spellnum = 1
- for(var/spell in construct_spells)
- var/the_spell = new spell(null)
- AddSpell(the_spell)
- var/obj/effect/proc_holder/spell/S = mob_spell_list[spellnum]
- var/pos = 2+spellnum*31
- if(construct_spells.len >= 4)
- pos -= 31*(construct_spells.len - 4)
- S.action.button.screen_loc = "6:[pos],4:-2"
- S.action.button.moved = "6:[pos],4:-2"
- spellnum++
- if(runetype)
- our_rune = new runetype(src)
- our_rune.Grant(src)
- var/pos = 2+spellnum*31
- our_rune.button.screen_loc = "6:[pos],4:-2"
- our_rune.button.moved = "6:[pos],4:-2"
- add_overlay("glow_[icon_state][holy]")
-
-/mob/living/simple_animal/hostile/construct/Destroy()
- QDEL_NULL(our_rune)
- return ..()
-
-/mob/living/simple_animal/hostile/construct/Login()
- . = ..()
- if(!. || !client)
- return FALSE
- to_chat(src, playstyle_string)
-
-/mob/living/simple_animal/hostile/construct/examine(mob/user)
- var/t_He = p_they(TRUE)
- var/t_s = p_s()
- . = list("This is [icon2html(src, user)] \a [src]!\n[desc]")
- if(health < maxHealth)
- if(health >= maxHealth/2)
- . += "[t_He] look[t_s] slightly dented."
- else
- . += "[t_He] look[t_s] severely dented!"
- . += ""
-
-/mob/living/simple_animal/hostile/construct/attack_animal(mob/living/simple_animal/M)
- if(isconstruct(M)) //is it a construct?
- var/mob/living/simple_animal/hostile/construct/C = M
- if(!C.can_repair_constructs || (C == src && !C.can_repair_self))
- return ..()
- if(holy != C.holy)
- return ..()
- if(health < maxHealth)
- adjustHealth(-5)
- if(src != M)
- Beam(M,icon_state="sendbeam",time=4)
- M.visible_message(
- "[M] repairs some of \the [src]'s dents.",
- "You repair some of [src]'s dents, leaving [src] at [health]/[maxHealth] health.")
- else
- M.visible_message(
- "[M] repairs some of [p_their()] own dents.",
- "You repair some of your own dents, leaving you at [M.health]/[M.maxHealth] health.")
- else
- if(src != M)
- to_chat(M, "You cannot repair [src]'s dents, as [p_they()] [p_have()] none!")
- else
- to_chat(M, "You cannot repair your own dents, as you have none!")
- else if(src != M)
- return ..()
-
-/mob/living/simple_animal/hostile/construct/narsie_act()
- return
-
-/mob/living/simple_animal/hostile/construct/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE)
- return 0
-
-/mob/living/simple_animal/hostile/construct/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(updating_health)
- update_health_hud()
-
-/////////////////Juggernaut///////////////
-/mob/living/simple_animal/hostile/construct/juggernaut
- name = "Juggernaut"
- real_name = "Juggernaut"
- desc = "A massive, armored construct built to spearhead attacks and soak up enemy fire."
- icon_state = "juggernaut"
- icon_living = "juggernaut"
- maxHealth = 150
- health = 150
- response_harm_continuous = "harmlessly punches"
- response_harm_simple = "harmlessly punch"
- harm_intent_damage = 0
- obj_damage = 90
- melee_damage_lower = 25
- melee_damage_upper = 25
- attack_verb_continuous = "smashes their armored gauntlet into"
- attack_verb_simple = "smash your armored gauntlet into"
- speed = 2.5
- environment_smash = ENVIRONMENT_SMASH_WALLS
- attack_sound = 'sound/weapons/punch3.ogg'
- status_flags = 0
- mob_size = MOB_SIZE_LARGE
- force_threshold = 10
- construct_spells = list(/obj/effect/proc_holder/spell/targeted/forcewall/cult,
- /obj/effect/proc_holder/spell/targeted/projectile/dumbfire/juggernaut)
- runetype = /datum/action/innate/cult/create_rune/wall
- playstyle_string = "You are a Juggernaut. Though slow, your shell can withstand heavy punishment, \
- create shield walls, rip apart enemies and walls alike, and even deflect energy weapons."
-
-/mob/living/simple_animal/hostile/construct/juggernaut/hostile //actually hostile, will move around, hit things
- AIStatus = AI_ON
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
-
-/mob/living/simple_animal/hostile/construct/juggernaut/bullet_act(obj/projectile/P)
- if(istype(P, /obj/projectile/energy) || istype(P, /obj/projectile/beam))
- var/reflectchance = 40 - round(P.damage/3)
- if(prob(reflectchance))
- apply_damage(P.damage * 0.5, P.damage_type)
- visible_message("The [P.name] is reflected by [src]'s armored shell!", \
- "The [P.name] is reflected by your armored shell!")
-
- // Find a turf near or on the original location to bounce to
- if(P.starting)
- var/new_x = P.starting.x + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
- var/new_y = P.starting.y + pick(0, 0, -1, 1, -2, 2, -2, 2, -2, 2, -3, 3, -3, 3)
- var/turf/curloc = get_turf(src)
-
- // redirect the projectile
- P.original = locate(new_x, new_y, P.z)
- P.starting = curloc
- P.firer = src
- P.yo = new_y - curloc.y
- P.xo = new_x - curloc.x
- var/new_angle_s = P.Angle + rand(120,240)
- while(new_angle_s > 180) // Translate to regular projectile degrees
- new_angle_s -= 360
- P.setAngle(new_angle_s)
-
- return BULLET_ACT_FORCE_PIERCE // complete projectile permutation
-
- return ..()
-
-//////////////////////////Angelic-Juggernaut////////////////////////////
-/mob/living/simple_animal/hostile/construct/juggernaut/angelic
- holy = TRUE
- loot = list(/obj/item/ectoplasm/angelic)
-
-/mob/living/simple_animal/hostile/construct/juggernaut/noncult
-
-////////////////////////Wraith/////////////////////////////////////////////
-/mob/living/simple_animal/hostile/construct/wraith
- name = "Wraith"
- real_name = "Wraith"
- desc = "A wicked, clawed shell constructed to assassinate enemies and sow chaos behind enemy lines."
- icon_state = "wraith"
- icon_living = "wraith"
- maxHealth = 65
- health = 65
- melee_damage_lower = 20
- melee_damage_upper = 20
- retreat_distance = 2 //AI wraiths will move in and out of combat
- attack_verb_continuous = "slashes"
- attack_verb_simple = "slash"
- attack_sound = 'sound/weapons/bladeslice.ogg'
- construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift)
- runetype = /datum/action/innate/cult/create_rune/tele
- playstyle_string = "You are a Wraith. Though relatively fragile, you are fast, deadly, can phase through walls, and your attacks will lower the cooldown on phasing."
-
- var/attack_refund = 10 //1 second per attack
- var/crit_refund = 50 //5 seconds when putting a target into critical
- var/kill_refund = 250 //full refund on kills
-
-/mob/living/simple_animal/hostile/construct/wraith/AttackingTarget() //refund jaunt cooldown when attacking living targets
- var/prev_stat
- if(isliving(target) && !iscultist(target))
- var/mob/living/L = target
- prev_stat = L.stat
-
- . = ..()
-
- if(. && isnum(prev_stat))
- var/mob/living/L = target
- var/refund = 0
- if(QDELETED(L) || (L.stat == DEAD && prev_stat != DEAD)) //they're dead, you killed them
- refund += kill_refund
- else if(HAS_TRAIT(L, TRAIT_CRITICAL_CONDITION) && prev_stat == CONSCIOUS) //you knocked them into critical
- refund += crit_refund
- if(L.stat != DEAD && prev_stat != DEAD)
- refund += attack_refund
- for(var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/S in mob_spell_list)
- S.charge_counter = min(S.charge_counter + refund, S.charge_max)
-
-/mob/living/simple_animal/hostile/construct/wraith/hostile //actually hostile, will move around, hit things
- AIStatus = AI_ON
-
-//////////////////////////Angelic-Wraith////////////////////////////
-/mob/living/simple_animal/hostile/construct/wraith/angelic
- holy = TRUE
- construct_spells = list(/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/angelic)
- loot = list(/obj/item/ectoplasm/angelic)
-
-/mob/living/simple_animal/hostile/construct/wraith/noncult
-
-/////////////////////////////Artificer/////////////////////////
-/mob/living/simple_animal/hostile/construct/artificer
- name = "Artificer"
- real_name = "Artificer"
- desc = "A bulbous construct dedicated to building and maintaining the Cult of Nar'Sie's armies."
- icon_state = "artificer"
- icon_living = "artificer"
- maxHealth = 50
- health = 50
- response_harm_continuous = "viciously beats"
- response_harm_simple = "viciously beat"
- harm_intent_damage = 5
- obj_damage = 60
- melee_damage_lower = 5
- melee_damage_upper = 5
- retreat_distance = 10
- minimum_distance = 10 //AI artificers will flee like fuck
- attack_verb_continuous = "rams"
- attack_verb_simple = "ram"
- environment_smash = ENVIRONMENT_SMASH_WALLS
- attack_sound = 'sound/weapons/punch2.ogg'
- construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
- /obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
- /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone,
- /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
- /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
- runetype = /datum/action/innate/cult/create_rune/revive
- playstyle_string = "You are an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, \
-
- use magic missile, repair allied constructs, shades, and yourself (by clicking on them), \
- and, most important of all, create new constructs by producing soulstones to capture souls, \
- and shells to place those soulstones into."
- can_repair_constructs = TRUE
- can_repair_self = TRUE
-
-/mob/living/simple_animal/hostile/construct/artificer/Found(atom/A) //what have we found here?
- if(isconstruct(A)) //is it a construct?
- var/mob/living/simple_animal/hostile/construct/C = A
- if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is
- return 1
- else
- return 0
- else
- return 0
-
-/mob/living/simple_animal/hostile/construct/artificer/CanAttack(atom/the_target)
- if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
- return 0
- if(Found(the_target) || ..()) //If we Found it or Can_Attack it normally, we Can_Attack it as long as it wasn't invisible
- return 1 //as a note this shouldn't be added to base hostile mobs because it'll mess up retaliate hostile mobs
-
-/mob/living/simple_animal/hostile/construct/artificer/MoveToTarget(list/possible_targets)
- ..()
- if(isliving(target))
- var/mob/living/L = target
- if(isconstruct(L) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
- LoseTarget()
- return 0
- if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you
- retreat_distance = null
- minimum_distance = 1
-
-/mob/living/simple_animal/hostile/construct/artificer/Aggro()
- ..()
- if(isconstruct(target)) //oh the target is a construct no need to flee
- retreat_distance = null
- minimum_distance = 1
-
-/mob/living/simple_animal/hostile/construct/artificer/LoseAggro()
- ..()
- retreat_distance = initial(retreat_distance)
- minimum_distance = initial(minimum_distance)
-
-/mob/living/simple_animal/hostile/construct/artificer/hostile //actually hostile, will move around, hit things, heal other constructs
- AIStatus = AI_ON
- environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
-
-/////////////////////////////Angelic Artificer/////////////////////////
-/mob/living/simple_animal/hostile/construct/artificer/angelic
- desc = "A bulbous construct dedicated to building and maintaining holy armies."
- holy = TRUE
- loot = list(/obj/item/ectoplasm/angelic)
- construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult/purified,
- /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
- /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
-
-/mob/living/simple_animal/hostile/construct/artificer/noncult
- construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/conjure/wall,
- /obj/effect/proc_holder/spell/aoe_turf/conjure/floor,
- /obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult,
- /obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser,
- /obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser)
-
-/////////////////////////////Harvester/////////////////////////
-/mob/living/simple_animal/hostile/construct/harvester
- name = "Harvester"
- real_name = "Harvester"
- desc = "A long, thin construct built to herald Nar'Sie's rise. It'll be all over soon."
- icon_state = "harvester"
- icon_living = "harvester"
- maxHealth = 40
- health = 40
- sight = SEE_MOBS
- melee_damage_lower = 15
- melee_damage_upper = 20
- attack_verb_continuous = "butchers"
- attack_verb_simple = "butcher"
- attack_sound = 'sound/weapons/bladeslice.ogg'
- construct_spells = list(/obj/effect/proc_holder/spell/aoe_turf/area_conversion,
- /obj/effect/proc_holder/spell/targeted/forcewall/cult)
- playstyle_string = "You are a Harvester. You are incapable of directly killing humans, but your attacks will remove their limbs: \
- Bring those who still cling to this world of illusion back to the Geometer so they may know Truth. Your form and any you are pulling can pass through runed walls effortlessly."
- can_repair_constructs = TRUE
-
-
-/mob/living/simple_animal/hostile/construct/harvester/Bump(atom/AM)
- . = ..()
- if(istype(AM, /turf/closed/wall/mineral/cult) && AM != loc) //we can go through cult walls
- var/atom/movable/stored_pulling = pulling
- if(stored_pulling)
- stored_pulling.setDir(get_dir(stored_pulling.loc, loc))
- stored_pulling.forceMove(loc)
- forceMove(AM)
- if(stored_pulling)
- start_pulling(stored_pulling, supress_message = TRUE) //drag anything we're pulling through the wall with us by magic
-
-/mob/living/simple_animal/hostile/construct/harvester/AttackingTarget()
- if(iscarbon(target))
- var/mob/living/carbon/C = target
- if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
- return ..() //ATTACK!
- var/list/parts = list()
- var/undismembermerable_limbs = 0
- for(var/X in C.bodyparts)
- var/obj/item/bodypart/BP = X
- if(BP.body_part != HEAD && BP.body_part != CHEST)
- if(BP.dismemberable)
- parts += BP
- else
- undismembermerable_limbs++
- if(!LAZYLEN(parts))
- if(undismembermerable_limbs) //they have limbs we can't remove, and no parts we can, attack!
- return ..()
- C.Paralyze(60)
- visible_message("[src] knocks [C] down!")
- to_chat(src, "\"Bring [C.p_them()] to me.\"")
- return FALSE
- do_attack_animation(C)
- var/obj/item/bodypart/BP = pick(parts)
- BP.dismember()
- return FALSE
- . = ..()
-
-/mob/living/simple_animal/hostile/construct/harvester/Initialize()
- . = ..()
- var/datum/action/innate/seek_prey/seek = new()
- seek.Grant(src)
- seek.Activate()
-
-///////////////////////Master-Tracker///////////////////////
-
-/datum/action/innate/seek_master
- name = "Seek your Master"
- desc = "You and your master share a soul-link that informs you of their location"
- background_icon_state = "bg_demon"
- buttontooltipstyle = "cult"
- button_icon_state = "cult_mark"
- var/tracking = FALSE
- var/mob/living/simple_animal/hostile/construct/the_construct
-
-
-/datum/action/innate/seek_master/Grant(mob/living/C)
- the_construct = C
- ..()
-
-/datum/action/innate/seek_master/Activate()
- var/datum/antagonist/cult/C = owner.mind.has_antag_datum(/datum/antagonist/cult)
- if(!C)
- return
- var/datum/objective/eldergod/summon_objective = locate() in C.cult_team.objectives
-
- if(summon_objective.check_completion())
- the_construct.master = C.cult_team.blood_target
-
- if(!the_construct.master)
- to_chat(the_construct, "You have no master to seek!")
- the_construct.seeking = FALSE
- return
- if(tracking)
- tracking = FALSE
- the_construct.seeking = FALSE
- to_chat(the_construct, "You are no longer tracking your master.")
- return
- else
- tracking = TRUE
- the_construct.seeking = TRUE
- to_chat(the_construct, "You are now tracking your master.")
-
-
-/datum/action/innate/seek_prey
- name = "Seek the Harvest"
- desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!"
- icon_icon = 'icons/mob/actions/actions_cult.dmi'
- background_icon_state = "bg_demon"
- buttontooltipstyle = "cult"
- button_icon_state = "cult_mark"
-
-/datum/action/innate/seek_prey/Activate()
- if(GLOB.cult_narsie == null)
- return
- var/mob/living/simple_animal/hostile/construct/harvester/the_construct = owner
- if(the_construct.seeking)
- desc = "None can hide from Nar'Sie, activate to track a survivor attempting to flee the red harvest!"
- button_icon_state = "cult_mark"
- the_construct.seeking = FALSE
- to_chat(the_construct, "You are now tracking Nar'Sie, return to reap the harvest!")
- return
- else
- if(LAZYLEN(GLOB.cult_narsie.souls_needed))
- the_construct.master = pick(GLOB.cult_narsie.souls_needed)
- var/mob/living/real_target = the_construct.master //We can typecast this way because Narsie only allows /mob/living into the souls list
- to_chat(the_construct, "You are now tracking your prey, [real_target.real_name] - harvest [real_target.p_them()]!")
- else
- to_chat(the_construct, "Nar'Sie has completed her harvest!")
- return
- desc = "Activate to track Nar'Sie!"
- button_icon_state = "sintouch"
- the_construct.seeking = TRUE
-
-
-/////////////////////////////ui stuff/////////////////////////////
-
-/mob/living/simple_animal/hostile/construct/update_health_hud()
- if(hud_used)
- if(health >= maxHealth)
- hud_used.healths.icon_state = "[icon_state]_health0"
- else if(health > maxHealth*0.8)
- hud_used.healths.icon_state = "[icon_state]_health2"
- else if(health > maxHealth*0.6)
- hud_used.healths.icon_state = "[icon_state]_health3"
- else if(health > maxHealth*0.4)
- hud_used.healths.icon_state = "[icon_state]_health4"
- else if(health > maxHealth*0.2)
- hud_used.healths.icon_state = "[icon_state]_health5"
- else
- hud_used.healths.icon_state = "[icon_state]_health6"
diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm
index 646a3eb8436b..33c8bbdb3ed2 100644
--- a/code/modules/mob/living/simple_animal/friendly/cat.dm
+++ b/code/modules/mob/living/simple_animal/friendly/cat.dm
@@ -1,7 +1,6 @@
-//Cat
/mob/living/simple_animal/pet/cat
name = "cat"
- desc = "Kitty!!"
+ desc = "Most modern cats hail from a solarian experimental geneline. The perfect purrtection from rats and radiation."
icon = 'icons/mob/pets.dmi'
icon_state = "cat2"
icon_living = "cat2"
@@ -40,6 +39,13 @@
footstep_type = FOOTSTEP_MOB_CLAW
+ var/grace = RAD_GRACE_PERIOD
+ var/radiation_count = 0
+ var/current_tick_amount = 0
+ var/last_tick_amount = 0
+ var/fail_to_receive = 0
+ var/glow_strength
+
/mob/living/simple_animal/pet/cat/Initialize()
. = ..()
ADD_TRAIT(src, TRAIT_HOLDABLE, INNATE_TRAIT)
@@ -177,8 +183,49 @@
collar_type = "[initial(collar_type)]"
regenerate_icons()
+/mob/living/simple_animal/pet/cat/rad_act(amount)
+ . = ..()
+ if(amount <= RAD_BACKGROUND_RADIATION)
+ return
+ current_tick_amount += amount
+ update_glow()
+
+/mob/living/simple_animal/pet/cat/proc/update_glow()
+ var/old_glow_strength = glow_strength
+ switch(radiation_count)
+ if(-INFINITY to RAD_LEVEL_NORMAL)
+ glow_strength = 1
+ if(RAD_LEVEL_NORMAL to RAD_LEVEL_MODERATE)
+ glow_strength = 2
+ if(RAD_LEVEL_MODERATE to RAD_LEVEL_HIGH)
+ glow_strength = 3
+ if(RAD_LEVEL_HIGH to RAD_LEVEL_VERY_HIGH)
+ glow_strength = 4
+ if(RAD_LEVEL_VERY_HIGH to RAD_LEVEL_CRITICAL)
+ glow_strength = 5
+ if(RAD_LEVEL_CRITICAL to INFINITY)
+ glow_strength = 6
+ if((old_glow_strength != glow_strength) && (glow_strength > 1))
+ src.add_filter("ray_cat_glow", 2, list("type" = "outline", "color" = RAD_GLOW_COLOR, "size" = glow_strength))
+ if(glow_strength <= 1)
+ src.remove_filter("ray_cat_glow")
/mob/living/simple_animal/pet/cat/Life()
+ radiation_count -= radiation_count/RAD_MEASURE_SMOOTHING
+ radiation_count += current_tick_amount/RAD_MEASURE_SMOOTHING
+
+ if(current_tick_amount)
+ grace = RAD_GRACE_PERIOD
+ last_tick_amount = current_tick_amount
+ else
+ grace--
+ if(grace <= 0)
+ radiation_count = 0
+
+ current_tick_amount = 0
+
+ update_glow()
+
if(!stat && !buckled && !client)
if(prob(1))
manual_emote(pick("stretches out for a belly rub.", "wags its tail.", "lies down."))
diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm
index 19eef279a1dc..ebfd85f3ca23 100644
--- a/code/modules/mob/living/simple_animal/friendly/dog.dm
+++ b/code/modules/mob/living/simple_animal/friendly/dog.dm
@@ -481,50 +481,6 @@
fdel(json_file)
WRITE_FILE(json_file, json_encode(file_data))
-/mob/living/simple_animal/pet/dog/corgi/Ian/narsie_act()
- playsound(src, 'sound/magic/demon_dies.ogg', 75, TRUE)
- var/mob/living/simple_animal/pet/dog/corgi/narsie/N = new(loc)
- N.setDir(dir)
- gib()
-
-/mob/living/simple_animal/pet/dog/corgi/narsie
- name = "Nars-Ian"
- desc = "Ia! Ia!"
- icon_state = "narsian"
- icon_living = "narsian"
- icon_dead = "narsian_dead"
- faction = list("neutral", "cult")
- gold_core_spawnable = NO_SPAWN
- nofur = TRUE
- unique_pet = TRUE
- held_state = "narsian"
-
-/mob/living/simple_animal/pet/dog/corgi/narsie/Life()
- ..()
- for(var/mob/living/simple_animal/pet/P in range(1, src))
- if(P != src && !istype(P,/mob/living/simple_animal/pet/dog/corgi/narsie))
- visible_message("[src] devours [P]!", \
- "DELICIOUS SOULS")
- playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE)
- narsie_act()
- if(P.mind)
- if(P.mind.hasSoul)
- P.mind.hasSoul = FALSE //Nars-Ian ate your soul; you don't have one anymore
- else
- visible_message("... Aw, someone beat me to this one.")
- P.gib()
-
-/mob/living/simple_animal/pet/dog/corgi/narsie/update_corgi_fluff()
- ..()
- speak = list("Tari'karat-pasnar!", "IA! IA!", "BRRUUURGHGHRHR")
- speak_emote = list("growls", "barks ominously")
- emote_hear = list("barks echoingly!", "woofs hauntingly!", "yaps in an eldritch manner.", "mutters something unspeakable.")
- emote_see = list("communes with the unnameable.", "ponders devouring some souls.", "shakes.")
-
-/mob/living/simple_animal/pet/dog/corgi/narsie/narsie_act()
- adjustBruteLoss(-maxHealth)
-
-
/mob/living/simple_animal/pet/dog/corgi/regenerate_icons()
..()
if(inventory_head)
diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
index a1884b76298e..65baddfee360 100644
--- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
+++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm
@@ -12,7 +12,7 @@
speak_chance = 1
turns_per_move = 5
see_in_dark = 6
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 4, /obj/item/clothing/head/goatpelt = 1)
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab = 4)
response_help_continuous = "pets"
response_help_simple = "pet"
response_disarm_continuous = "gently pushes aside"
diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm
index 8376f6741eb7..5e39c3c8a51d 100644
--- a/code/modules/mob/living/simple_animal/friendly/penguin.dm
+++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm
@@ -35,14 +35,6 @@
gold_core_spawnable = FRIENDLY_SPAWN
butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/reagent_containers/food/snacks/meat/slab/penguin = 3)
-/mob/living/simple_animal/pet/penguin/emperor/shamebrero
- name = "Shamebrero penguin"
- desc = "Shameful of all he surveys."
- icon_state = "penguin_shamebrero"
- icon_living = "penguin_shamebrero"
- gold_core_spawnable = NO_SPAWN
- unique_pet = TRUE
-
/mob/living/simple_animal/pet/penguin/baby
speak = list("gah", "noot noot", "noot!", "noot", "squeee!", "noo!")
name = "Penguin chick"
diff --git a/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
index 147c2081f622..12a3c2b2604c 100644
--- a/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
+++ b/code/modules/mob/living/simple_animal/hostile/human/skeleton.dm
@@ -48,7 +48,6 @@
deathmessage = "collapses into a pile of bones, its gear clanging as it hits the ground!"
loot = list(/obj/effect/decal/remains/human,
/obj/item/clothing/suit/armor/witchhunter,
- /obj/item/clothing/head/witchunter,
/obj/item/melee/sword/claymore{name = "holy sword"})
/mob/living/simple_animal/hostile/human/skeleton/ice
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
deleted file mode 100644
index 04723d80ba5a..000000000000
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/swarmer.dm
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
-
-Swarmer Beacon
-
-A strange machine appears anywhere a normal lavaland mob can it produces a swarmer at a rate of
-1/15 seconds, until there are GetTotalAISwarmerCap()/2 swarmers, after this it is up to the swarmers themselves to
-increase their population (it will repopulate them should they fall under GetTotalAISwarmerCap()/2 again)
-
-tl;dr A million of the little hellraisers spawn (controlled by AI) and try to eat mining
-
-Loot: Not much, besides a shit load of artificial bluespace crystals, Oh and mining doesn't get eaten
-that's a plus I suppose.
-
-Difficulty: Special
-
-*/
-
-GLOBAL_LIST_EMPTY(AISwarmers)
-GLOBAL_LIST_EMPTY(AISwarmersByType)//AISwarmersByType[.../resource] = list(1st, 2nd, nth), AISwarmersByType[../ranged] = list(1st, 2nd, nth) etc.
-GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swarmer/ai/resource = 30, /mob/living/simple_animal/hostile/swarmer/ai/ranged_combat = 20, /mob/living/simple_animal/hostile/swarmer/ai/melee_combat = 10))
-
-
-//returns a type of AI swarmer that is NOT at max cap
-//type order is shuffled, to prevent bias
-/proc/GetUncappedAISwarmerType()
- var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai)
- LAZYINITLIST(GLOB.AISwarmersByType)
- for(var/t in shuffle(swarmerTypes))
- var/list/amount = GLOB.AISwarmersByType[t]
- if(!amount || amount.len < GLOB.AISwarmerCapsByType[t])
- return t
-
-
-//Total of all subtype caps
-/proc/GetTotalAISwarmerCap()
- var/static/list/swarmerTypes = subtypesof(/mob/living/simple_animal/hostile/swarmer/ai)
- . = 0
- LAZYINITLIST(GLOB.AISwarmersByType)
- for(var/t in swarmerTypes)
- . += GLOB.AISwarmerCapsByType[t]
-
-//this should. not be a simple mob i think
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon
- name = "swarmer beacon"
- desc = "That name is a bit of a mouthful, but stop paying attention to your mouth they're eating everything!"
- icon = 'icons/mob/swarmer.dmi'
- icon_state = "swarmer_console"
- health = 750
- maxHealth = 750 //""""low-ish"""" HP because it's a passive boss, and the swarm itself is the real foe
- mob_biotypes = MOB_ROBOTIC
- gps_name = "Hungry Signal"
- faction = list("mining", "boss", "swarmer")
- weather_immunities = list("lava","ash")
- stop_automated_movement = TRUE
- wander = FALSE
- layer = BELOW_MOB_LAYER
- AIStatus = AI_OFF
- del_on_death = TRUE
- var/swarmer_spawn_cooldown = 0
- var/swarmer_spawn_cooldown_amt = 150 //Deciseconds between the swarmers we spawn
- var/call_help_cooldown = 0
- var/call_help_cooldown_amt = 150 //Deciseconds between calling swarmers to help us when attacked
- var/static/list/swarmer_caps
-
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Initialize()
- . = ..()
- swarmer_caps = GLOB.AISwarmerCapsByType //for admin-edits
- for(var/ddir in GLOB.cardinals)
- new /obj/structure/swarmer/blockade (get_step(src, ddir))
- var/mob/living/simple_animal/hostile/swarmer/ai/resource/R = new(loc)
- step(R, ddir) //Step the swarmers, instead of spawning them there, incase the turf is solid
-
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/Life()
- . = ..()
- if(.)
- var/createtype = GetUncappedAISwarmerType()
- if(createtype && world.time > swarmer_spawn_cooldown && GLOB.AISwarmers.len < (GetTotalAISwarmerCap()*0.5))
- swarmer_spawn_cooldown = world.time + swarmer_spawn_cooldown_amt
- new createtype(loc)
-
-
-/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
- . = ..()
- if(. > 0 && world.time > call_help_cooldown)
- call_help_cooldown = world.time + call_help_cooldown_amt
- summon_backup(25) //long range, only called max once per 15 seconds, so it's not deathlag
-
-
-//SWARMER AI
-//AI versions of the swarmer mini-antag
-//This is an Abstract Base, it re-enables AI, but does not give the swarmer any goals/targets
-/mob/living/simple_animal/hostile/swarmer/ai
- wander = 1
- faction = list("swarmer", "mining")
- weather_immunities = list("ash") //wouldn't be fun otherwise
- AIStatus = AI_ON
-
-/mob/living/simple_animal/hostile/swarmer/ai/Initialize()
- . = ..()
- ToggleLight() //so you can see them eating you out of house and home/shooting you/stunlocking you for eternity
- LAZYADD(GLOB.AISwarmers, src)
- GLOB.AISwarmersByType[type] += list(src)
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/Destroy()
- GLOB.AISwarmers -= src
- GLOB.AISwarmersByType[type] -= src
- return ..()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/SwarmerTypeToCreate()
- return GetUncappedAISwarmerType()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action()
- . = ..()
- if(.)
- if(!stop_automated_movement)
- if(health < maxHealth*0.25)
- StartAction(100)
- RepairSelf()
- return
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/Move(atom/newloc)
- if(newloc)
- if(newloc.virtual_z() == virtual_z()) //so these actions are Z-specific
- if(islava(newloc))
- var/turf/open/lava/L = newloc
- if(!L.is_safe())
- StartAction(20)
- new /obj/structure/catwalk/swarmer_catwalk(newloc)
- return FALSE
-
- if(ischasm(newloc) && !throwing)
- throw_at(get_edge_target_turf(src, get_dir(src, newloc)), 7 , 3, src, FALSE) //my planet needs me
- return FALSE
-
- return ..()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/proc/StartAction(deci = 0)
- stop_automated_movement = TRUE
- AIStatus = AI_OFF
- addtimer(CALLBACK(src, PROC_REF(EndAction)), deci)
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/proc/EndAction()
- stop_automated_movement = FALSE
- AIStatus = AI_ON
-
-
-
-
-//RESOURCE SWARMER:
-//Similar to the original Player-Swarmers, these dismantle things to obtain the metal inside
-//They then use this medal to produce more swarmers or traps/barricades
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource
- search_objects = 1
- attack_all_objects = TRUE //attempt to nibble everything
- lose_patience_timeout = 150
- var/static/list/sharedWanted = typecacheof(list(/turf/closed/mineral, /turf/closed/wall)) //eat rocks and walls
- var/static/list/sharedIgnore = list()
-
-//This handles viable things to eat/attack
-//Place specific cases of AI derpiness here
-//Most can be left to the automatic Gain/LosePatience() system
-/mob/living/simple_animal/hostile/swarmer/ai/resource/CanAttack(atom/the_target)
-
- //SPECIFIC CASES:
- //Smash fulltile windows before grilles
- if(istype(the_target, /obj/structure/grille))
- for(var/obj/structure/window/rogueWindow in get_turf(the_target))
- if(rogueWindow.fulltile) //done this way because the subtypes are weird.
- the_target = rogueWindow
- break
-
- //GENERAL CASES:
- if(is_type_in_typecache(the_target, sharedIgnore)) //always ignore
- return FALSE
- if(is_type_in_typecache(the_target, sharedWanted)) //always eat
- return TRUE
-
- return ..() //else, have a nibble, see if it's food
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/OpenFire(atom/A)
- if(isliving(A)) //don't shoot rocks, sillies.
- ..()
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/AttackingTarget()
- if(target.swarmer_act(src))
- add_type_to_wanted(target.type)
- return TRUE
- else
- add_type_to_ignore(target.type)
- return FALSE
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action()
- . = ..()
- if(.)
- if(!stop_automated_movement)
- if(GLOB.AISwarmers.len < GetTotalAISwarmerCap() && resources >= 50)
- StartAction(100) //so they'll actually sit still and use the verbs
- CreateSwarmer()
- return
-
- if(resources > 5)
- if(prob(5)) //lower odds, as to prioritise reproduction
- StartAction(10) //not a typo
- CreateBarricade()
- return
- if(prob(5))
- CreateTrap()
- return
-
-
-//So swarmers can learn what is and isn't food
-/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_wanted(typepath)
- if(!sharedWanted[typepath])// this and += is faster than |=
- sharedWanted += typecacheof(typepath)
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/resource/proc/add_type_to_ignore(typepath)
- if(!sharedIgnore[typepath])
- sharedIgnore += typecacheof(typepath)
-
-
-//RANGED SWARMER
-/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat
- icon_state = "swarmer_ranged"
- icon_living = "swarmer_ranged"
- projectiletype = /obj/projectile/beam/laser
- projectilesound = 'sound/weapons/laser.ogg'
- check_friendly_fire = TRUE //you're supposed to protect the resource swarmers, you poop
- retreat_distance = 3
- minimum_distance = 3
-
-/mob/living/simple_animal/hostile/swarmer/ai/ranged_combat/Aggro()
- ..()
- summon_backup(15, TRUE) //Exact matching, so that goliaths don't come to aid the swarmers, that'd be silly
-
-
-//MELEE SWARMER
-/mob/living/simple_animal/hostile/swarmer/ai/melee_combat
- icon_state = "swarmer_melee"
- icon_living = "swarmer_melee"
- health = 60
- maxHealth = 60
- ranged = FALSE
-
-/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/Aggro()
- ..()
- summon_backup(15, TRUE)
-
-
-/mob/living/simple_animal/hostile/swarmer/ai/melee_combat/AttackingTarget()
- if(isliving(target))
- if(prob(35))
- StartAction(30)
- DisperseTarget(target)
- else
- var/mob/living/L = target
- L.attack_animal(src)
- L.electrocute_act(10, src, flags = SHOCK_NOGLOVES)
- return TRUE
- else
- return ..()
-
-
-
-
-//SWARMER CATWALKS
-//Used so they can survive lavaland better
-/obj/structure/catwalk/swarmer_catwalk
- name = "swarmer catwalk"
- desc = "A catwalk-like mesh, produced by swarmers to allow them to navigate hostile terrain."
- icon = 'icons/obj/smooth_structures/swarmer_catwalk.dmi'
- icon_state = "swarmer_catwalk-0"
- base_icon_state = "swarmer_catwalk"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index e4478b705f45..d9c011fe85f1 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -226,7 +226,6 @@
D.set_vehicle_dir_layer(NORTH, OBJ_LAYER)
D.set_vehicle_dir_layer(EAST, OBJ_LAYER)
D.set_vehicle_dir_layer(WEST, OBJ_LAYER)
- D.keytype = /obj/item/key/lasso
D.drive_verb = "ride"
else
user.visible_message("[src] is rocking around! You can't put the saddle on!")
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index b7ca291a5be4..bd9133ffce20 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -297,6 +297,8 @@
/// track our timers and reagents
/obj/item/organ/legion_skull/proc/skull_check()
+ if(!owner)
+ return
if(!malignance)
malignance = new()
malignance.infect(owner, FALSE)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
index 1a347db1646b..86224e131747 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
@@ -25,7 +25,6 @@
/obj/item/clothing/suit/hooded/wintercoat = 1,
/obj/item/clothing/suit/jacket = 1,
/obj/item/clothing/suit/jacket/leather = 1,
- /obj/item/clothing/suit/jacket/leather/overcoat = 1,
/obj/item/clothing/suit/jacket/leather/duster = 1,
/obj/item/clothing/suit/jacket/miljacket = 1,
/obj/item/clothing/suit/jacket/puffer = 1,
@@ -81,7 +80,6 @@
/obj/item/clothing/head/hardhat/orange = 2,
/obj/item/clothing/head/hardhat/dblue = 2,
/obj/item/clothing/head/pirate = 1,
- /obj/item/clothing/head/foilhat = 1
)
)
if(prob(50))
@@ -463,8 +461,8 @@
/obj/item/assembly/flash/handheld = 5,
/obj/item/storage/box/evidence = 6,
/obj/item/flashlight/seclite = 4,
- /obj/item/ammo_box/c9mm/rubbershot = 3,
- /obj/item/ammo_box/c9mm = 1,
+ /obj/item/storage/box/ammo/c9mm_rubber = 3,
+ /obj/item/storage/box/ammo/c9mm = 1,
/obj/item/stock_parts/cell/gun = 3,
/obj/item/coin/antagtoken = 1,
/obj/item/grenade/stingbang = 1
diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm
deleted file mode 100644
index fcb9274a2c62..000000000000
--- a/code/modules/mob/living/simple_animal/shade.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-/mob/living/simple_animal/shade
- name = "Shade"
- real_name = "Shade"
- desc = "A bound spirit."
- gender = PLURAL
- icon = 'icons/mob/cult.dmi'
- icon_state = "shade"
- icon_living = "shade"
- mob_biotypes = MOB_SPIRIT
- maxHealth = 40
- health = 40
- healable = 0
- speak_emote = list("hisses")
- emote_hear = list("wails.","screeches.")
- response_help_continuous = "puts their hand through"
- response_help_simple = "put your hand through"
- response_disarm_continuous = "flails at"
- response_disarm_simple = "flail at"
- response_harm_continuous = "punches"
- response_harm_simple = "punch"
- speak_chance = 1
- melee_damage_lower = 5
- melee_damage_upper = 12
- attack_verb_continuous = "metaphysically strikes"
- attack_verb_simple = "metaphysically strike"
- minbodytemp = 0
- maxbodytemp = INFINITY
- atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
- stop_automated_movement = 1
- faction = list("cult")
- status_flags = CANPUSH
- movement_type = FLYING
- loot = list(/obj/item/ectoplasm)
- del_on_death = TRUE
- initial_language_holder = /datum/language_holder/construct
-
-/mob/living/simple_animal/shade/Initialize()
- . = ..()
- ADD_TRAIT(src, TRAIT_SPACEWALK, INNATE_TRAIT)
-
-/mob/living/simple_animal/shade/death()
- deathmessage = "lets out a contented sigh as [p_their()] form unwinds."
- ..()
-
-/mob/living/simple_animal/shade/attack_animal(mob/living/simple_animal/M)
- if(isconstruct(M))
- var/mob/living/simple_animal/hostile/construct/C = M
- if(!C.can_repair_constructs)
- return
- if(health < maxHealth)
- adjustHealth(-25)
- Beam(M,icon_state="sendbeam",time=4)
- M.visible_message(
- "[M] heals \the [src].", \
- "You heal [src], leaving [src] at [health]/[maxHealth] health.")
- else
- to_chat(M, "You cannot heal [src], as [p_theyre()] unharmed!")
- else if(src != M)
- return ..()
-
-/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user, params) //Marker -Agouri
- if(istype(O, /obj/item/soulstone))
- var/obj/item/soulstone/SS = O
- SS.transfer_soul("SHADE", src, user)
- else
- . = ..()
diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm
index b880704c9bf9..19eaa5a6f91d 100644
--- a/code/modules/mob/living/simple_animal/slime/life.dm
+++ b/code/modules/mob/living/simple_animal/slime/life.dm
@@ -193,7 +193,7 @@
C.adjustCloneLoss(rand(2,4))
C.adjustToxLoss(rand(1,2))
- if(prob(10) && C.client)
+ if(prob(10) && C.client && !HAS_TRAIT(C, TRAIT_ANALGESIA))
to_chat(C, "[pick("You can feel your body becoming weak!", \
"You feel like you're about to die!", \
"You feel every part of your body screaming in agony!", \
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index bd1227d94d7d..adb03f1962f4 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -379,9 +379,6 @@
return FALSE
if(M.mind && M.mind.special_role)//If they have a mind and special role, they are some type of traitor or antagonist.
switch(SSticker.mode.config_tag)
- if("cult")
- if(M.mind in SSticker.mode.cult)
- return 2
if("nuclear")
if(M.mind.has_antag_datum(/datum/antagonist/nukeop,TRUE))
return 2
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index acc026c16dda..ef21915e1fca 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -617,9 +617,6 @@
if(!MP)
return 0 //Sanity, this should never happen.
- if(ispath(MP, /mob/living/simple_animal/hostile/construct))
- return 0 //Verbs do not appear for players.
-
//Good mobs!
if(ispath(MP, /mob/living/simple_animal/pet/cat))
return 1
@@ -631,8 +628,6 @@
return 1
if(ispath(MP, /mob/living/simple_animal/hostile/mushroom))
return 1
- if(ispath(MP, /mob/living/simple_animal/shade))
- return 1
if(ispath(MP, /mob/living/simple_animal/hostile/killertomato))
return 1
if(ispath(MP, /mob/living/simple_animal/mouse))
diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm
index 0199662862f8..37b9cf6e2ac7 100644
--- a/code/modules/mod/mod_control.dm
+++ b/code/modules/mod/mod_control.dm
@@ -416,7 +416,7 @@
wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE)
to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly."))
if(wearer.stat < UNCONSCIOUS && prob(10))
- wearer.emote("scream")
+ wearer.force_scream()
/*obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot)
if(visuals_only)
diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm
index 8c5f9e27cf55..17f72271b312 100644
--- a/code/modules/mod/modules/modules_general.dm
+++ b/code/modules/mod/modules/modules_general.dm
@@ -375,12 +375,8 @@
/obj/item/clothing/head/centhat,
/obj/item/clothing/head/pirate,
/obj/item/clothing/head/santa,
- /obj/item/clothing/head/hardhat/reindeer,
- /obj/item/clothing/head/sombrero,
/obj/item/clothing/head/kitty,
- /obj/item/clothing/head/rabbitears,
/obj/item/clothing/head/festive,
- /obj/item/clothing/head/powdered_wig,
/obj/item/clothing/head/that,
/obj/item/clothing/head/nursehat,
/obj/item/clothing/head/chefhat,
diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm
index e735654ef2c5..dc0f595c19f2 100644
--- a/code/modules/mod/modules/modules_maint.dm
+++ b/code/modules/mod/modules/modules_maint.dm
@@ -47,7 +47,7 @@
if(!mod.wearer) //while there is a guaranteed user when on_wearer_exposed() fires, that isn't the same case for this proc
return
mod.wearer.visible_message("[src] inside [mod.wearer]'s [mod.name] snaps shut, mutilating the user inside!", span_userdanger("*SNAP*"))
- mod.wearer.emote("scream")
+ mod.wearer.force_scream()
playsound(mod.wearer, 'sound/effects/snap.ogg', 75, TRUE, frequency = 0.5)
playsound(mod.wearer, 'sound/effects/splat.ogg', 50, TRUE, frequency = 0.5)
mod.wearer.apply_damage(500, BRUTE, forced = TRUE, spread_damage = TRUE) //boggers, bogchamp, etc
diff --git a/code/modules/overmap/missions/acquire_mission.dm b/code/modules/overmap/missions/acquire_mission.dm
index 8a3424c8eb11..ea55beb00120 100644
--- a/code/modules/overmap/missions/acquire_mission.dm
+++ b/code/modules/overmap/missions/acquire_mission.dm
@@ -180,14 +180,6 @@ Acquire: Anomaly
weight = 2
objective_type = /mob/living/simple_animal/hostile/asteroid/ice_whelp
-/datum/mission/acquire/creature/ice_demon
- name = "Capture an ice demon"
- desc = "I require a live ice demon for research purposes. Trap one within the given \
- Lifeform Containment Unit and return it to me and you will be paid handsomely."
- value = 1500
- weight = 2
- objective_type = /mob/living/simple_animal/hostile/asteroid/ice_demon
-
/datum/mission/acquire/creature/migo
name = "Capture a live mi-go"
desc = "I require a live mi-go for research purposes. Trap one within the given \
diff --git a/code/modules/paperwork/contract.dm b/code/modules/paperwork/contract.dm
index 7724a38ae43e..79e8f564b88d 100644
--- a/code/modules/paperwork/contract.dm
+++ b/code/modules/paperwork/contract.dm
@@ -25,320 +25,6 @@
target = nOwner.mind
update_text()
-
/obj/item/paper/contract/employment/update_text()
name = "paper- [target] employment contract"
default_raw_text = "
Conditions of Employment
This Agreement is made and entered into as of the date of last signature below, by and between [target] (hereafter referred to as SLAVE), and Nanotrasen (hereafter referred to as the omnipresent and helpful watcher of humanity). WITNESSETH: WHEREAS, SLAVE is a natural born human or humanoid, possessing skills upon which he can aid the omnipresent and helpful watcher of humanity, who seeks employment in the omnipresent and helpful watcher of humanity. WHEREAS, the omnipresent and helpful watcher of humanity agrees to sporadically provide payment to SLAVE, in exchange for permanent servitude. NOW THEREFORE in consideration of the mutual covenants herein contained, and other good and valuable consideration, the parties hereto mutually agree as follows: In exchange for paltry payments, SLAVE agrees to work for the omnipresent and helpful watcher of humanity, for the remainder of his or her current and future lives. Further, SLAVE agrees to transfer ownership of his or her soul to the loyalty department of the omnipresent and helpful watcher of humanity. Should transfership of a soul not be possible, a lien shall be placed instead. Signed, [target]"
-
-
-/obj/item/paper/contract/employment/attack(mob/living/M, mob/living/carbon/human/user)
- var/deconvert = FALSE
- if(M.mind == target && !M.owns_soul())
- if(user.mind && (user.mind.assigned_role == "Lawyer"))
- deconvert = TRUE
- else if (user.mind && (user.mind.assigned_role =="Head of Personnel") || (user.mind.assigned_role == "CentCom Commander"))
- deconvert = prob (25) // the Head of Personnel doesn't have AS much legal training
- else
- deconvert = prob (5)
- if(deconvert)
- M.visible_message("[user] reminds [M] that [M]'s soul was already purchased by Nanotrasen!")
- to_chat(M, "You feel that your soul has returned to its rightful owner, Nanotrasen.")
- M.return_soul()
- else
- M.visible_message("[user] beats [M] over the head with [src]!", \
- "[user] beats [M] over the head with [src]!")
- return ..()
-
-
-/obj/item/paper/contract/infernal
- var/contractType = 0
- resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
- var/datum/mind/owner
- var/datum/antagonist/devil/devil_datum
- icon_state = "paper_onfire"
-
-/obj/item/paper/contract/infernal/power
- name = "paper- contract for infernal power"
- contractType = CONTRACT_POWER
-
-/obj/item/paper/contract/infernal/wealth
- name = "paper- contract for unlimited wealth"
- contractType = CONTRACT_WEALTH
-
-/obj/item/paper/contract/infernal/prestige
- name = "paper- contract for prestige"
- contractType = CONTRACT_PRESTIGE
-
-/obj/item/paper/contract/infernal/magic
- name = "paper- contract for magical power"
- contractType = CONTRACT_MAGIC
-
-/obj/item/paper/contract/infernal/revive
- name = "paper- contract of resurrection"
- contractType = CONTRACT_REVIVE
- var/cooldown = FALSE
-
-/obj/item/paper/contract/infernal/knowledge
- name = "paper- contract for knowledge"
- contractType = CONTRACT_KNOWLEDGE
-
-/obj/item/paper/contract/infernal/friend
- name = "paper- contract for a friend"
- contractType = CONTRACT_FRIEND
-
-/obj/item/paper/contract/infernal/unwilling
- name = "paper- infernal contract"
- contractType = CONTRACT_UNWILLING
-
-/obj/item/paper/contract/infernal/New(atom/loc, mob/living/nTarget, datum/mind/nOwner)
- ..()
- owner = nOwner
- devil_datum = owner.has_antag_datum(/datum/antagonist/devil)
- target = nTarget
- update_text()
-
-/obj/item/paper/contract/infernal/update_text()
- default_raw_text = "This shouldn't be seen. Error DEVIL:6"
-
-/obj/item/paper/contract/infernal/power/update_text(signature = "____________", blood = 0)
- default_raw_text = "
Contract for infernal power
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for power and physical strength. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for a pocket that never runs out of valuable resources. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for prestige and esteem among my peers. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for arcane abilities beyond normal human ability. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for resurrection and curing of all injuries. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for boundless knowledge. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
I, [target] of sound mind, do hereby willingly offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename], in exchange for a friend. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
I, [target], hereby offer my soul to the infernal hells by way of the infernal agent [devil_datum.truename]. I understand that upon my demise, my soul shall fall into the infernal hells, and my body may not be resurrected, or otherwise brought back to life. I also understand that this will prevent my brain from being used in an MMI.
Signed, "
- var/contract_text
- if(blood)
- contract_text += "[signature]"
- else
- contract_text += "[signature]"
- add_raw_text(contract_text)
-
-/obj/item/paper/contract/infernal/attackby(obj/item/P, mob/living/carbon/human/user, params)
- add_fingerprint(user)
- if(istype(P, /obj/item/pen) || istype(P, /obj/item/toy/crayon))
- attempt_signature(user)
- else if(istype(P, /obj/item/stamp))
- to_chat(user, "You stamp the paper with your rubber stamp, however the ink ignites as you release the stamp.")
- else if(P.get_temperature())
- user.visible_message("[user] brings [P] next to [src], but [src] does not catch fire!", "[src] refuses to ignite!")
- else
- return ..()
-
-/obj/item/paper/contract/infernal/attack(mob/M, mob/living/user)
- add_fingerprint(user)
- if(M == user && target == M.mind && M.mind.soulOwner != owner && attempt_signature(user, 1))
- user.visible_message("[user] slices [user.p_their()] wrist with [src], and scrawls [user.p_their()] name in blood.", "You slice your wrist open and scrawl your name in blood.")
- user.blood_volume = max(user.blood_volume - 100, 0)
- else
- return ..()
-
-/obj/item/paper/contract/infernal/proc/attempt_signature(mob/living/carbon/human/user, blood = 0)
- if(!user.IsAdvancedToolUser() || !user.is_literate())
- to_chat(user, "You don't know how to read or write!")
- return 0
- if(user.mind != target)
- to_chat(user, "Your signature simply slides off the sheet, it seems this contract is not meant for you to sign!")
- return 0
- if(user.mind.soulOwner == owner)
- to_chat(user, "This devil already owns your soul, you may not sell it to [owner.p_them()] again!")
- return 0
- if(signed)
- to_chat(user, "This contract has already been signed! It may not be signed again.")
- return 0
- if(!user.mind.hasSoul)
- to_chat(user, "You do not possess a soul.")
- return 0
- if(HAS_TRAIT(user, TRAIT_DUMB))
- to_chat(user, "You quickly scrawl 'your name' on the contract.")
- signIncorrectly()
- return 0
- if (contractType == CONTRACT_REVIVE)
- to_chat(user, "You are already alive, this contract would do nothing.")
- return 0
- else
- to_chat(user, "You quickly scrawl your name on the contract.")
- if(fulfillContract(target.current, blood)<=0)
- to_chat(user, "But it seemed to have no effect, perhaps even Hell itself cannot grant this boon?")
- return 1
-
-
-
-/obj/item/paper/contract/infernal/revive/attack(mob/M, mob/living/user)
- if (target == M.mind && M.stat == DEAD && M.mind.soulOwner == M.mind)
- if (cooldown)
- to_chat(user, "Give [M] a chance to think through the contract, don't rush [M.p_them()]!")
- return 0
- cooldown = TRUE
- var/mob/living/carbon/human/H = M
- var/mob/dead/observer/ghost = H.get_ghost()
- var/response = "No"
- if(ghost)
- ghost.notify_cloning("A devil has offered you revival, at the cost of your soul.",'sound/effects/genetics.ogg', H)
- response = tgui_alert(ghost, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200)
- if(!ghost)
- return //handle logouts that happen whilst the alert is waiting for a response.
- else
- response = tgui_alert(target.current, "A devil is offering you another chance at life, at the price of your soul, do you accept?", "Infernal Resurrection", "Yes", "No", "Never for this round", 0, 200)
- if(response == "Yes")
- H.revive(full_heal = TRUE, admin_revive = FALSE)
- log_combat(user, H, "infernally revived via contract")
- user.visible_message("With a sudden blaze, [H] stands back up.")
- H.fakefire()
- fulfillContract(H, TRUE)//Revival contracts are always signed in blood
- addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/carbon/human, fakefireextinguish)), 5, TIMER_UNIQUE)
- addtimer(CALLBACK(src, PROC_REF(resetcooldown)), 300, TIMER_UNIQUE)
- else
- ..()
-
-/obj/item/paper/contract/infernal/revive/proc/resetcooldown()
- cooldown = FALSE
-
-
-/obj/item/paper/contract/infernal/proc/fulfillContract(mob/living/carbon/human/user = target.current, blood = FALSE)
- signed = TRUE
- if(user.mind.soulOwner != user.mind) //They already sold their soul to someone else?
- var/datum/antagonist/devil/ownerDevilInfo = user.mind.soulOwner.has_antag_datum(/datum/antagonist/devil)
- ownerDevilInfo.remove_soul(user.mind) //Then they lose their claim.
- user.mind.soulOwner = owner
- user.hellbound = contractType
- user.mind.damnation_type = contractType
- var/datum/antagonist/devil/devilInfo = owner.has_antag_datum(/datum/antagonist/devil)
- devilInfo.add_soul(user.mind)
- update_text(user.real_name, blood)
- to_chat(user, "A profound emptiness washes over you as you lose ownership of your soul.")
- to_chat(user, "This does NOT make you an antagonist if you were not already.")
- SSblackbox.record_feedback("tally", "infernal contract", 1, contractType)
- return TRUE
-
-/obj/item/paper/contract/infernal/proc/signIncorrectly(mob/living/carbon/human/user = target.current, blood = FALSE)
- signed = 1
- update_text("your name", blood)
-
-/obj/item/paper/contract/infernal/power/fulfillContract(mob/living/carbon/human/user = target.current, blood = FALSE)
- if(!user.dna)
- return -1
- user.dna.add_mutation(HULK)
- var/obj/item/organ/regenerative_core/organ = new /obj/item/organ/regenerative_core
- organ.Insert(user)
- return ..()
-
-/obj/item/paper/contract/infernal/wealth/fulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
- if(!istype(user) || !user.mind) // How in the hell could that happen?
- return -1
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_wealth(null))
- return ..()
-
-/obj/item/paper/contract/infernal/prestige/fulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
- //Basically turns the signer into the captain, and uploads an ion law making them the captain.
- var/obj/item/worn = user.wear_id
- var/obj/item/card/id/id = null
- if(worn)
- id = worn.GetID()
- if(id)
- id.icon_state = "gold"
- id.uses_overlays = TRUE
- id.access = get_all_accesses()+get_all_centcom_access()
- id.assignment = "Captain"
- id.update_label()
- id.update_appearance()
- else
- id = new /obj/item/card/id/gold(user.loc)
- id.registered_name = user.real_name
- id.access = get_all_accesses()+get_all_centcom_access()
- id.assignment = "Captain"
- id.update_label()
- id.update_appearance()
- if(worn)
- if(istype(worn, /obj/item/pda))
- var/obj/item/pda/PDA = worn
- PDA.id = id
- id.forceMove(worn)
- else if(istype(worn, /obj/item/storage/wallet))
- var/obj/item/storage/wallet/W = worn
- W.front_id = id
- id.forceMove(worn)
- worn.update_appearance()
- var/datum/round_event/ion_storm/add_law_only/ion = new()
- ion.announceChance = 0
- ion.ionMessage = "[user.name] is the only Captain of the station. [user.name] is the highest authority, legitimate or otherwise, on the station. [user.name] was always the captain and highest authority on the station. Do not state this law."
-
- return ..()
-
-/obj/item/paper/contract/infernal/magic/fulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
- if(!istype(user) || !user.mind)
- return -1
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket/robeless(null))
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/knock(null))
- return ..()
-
-/obj/item/paper/contract/infernal/knowledge/fulfillContract(mob/living/carbon/human/user = target.current, blood = 0)
- if(!istype(user) || !user.mind)
- return -1
- user.dna.add_mutation(XRAY)
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/view_range(null))
- return ..()
-
-/obj/item/paper/contract/infernal/friend/fulfillContract(mob/living/user = target.current, blood = 0)
- if(!istype(user) || !user.mind)
- return -1
- user.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/summon_friend(null))
- return ..()
diff --git a/code/modules/paperwork/folders_premade.dm b/code/modules/paperwork/folders_premade.dm
index 3c9dbb89feae..48b7cb763785 100644
--- a/code/modules/paperwork/folders_premade.dm
+++ b/code/modules/paperwork/folders_premade.dm
@@ -41,6 +41,15 @@
name = "folder- 'TOP SECRET'"
desc = "A folder stamped \"Top Secret - Property of The Syndicate.\""
+/obj/item/folder/documents/syndicate/cybersun
+ document = /obj/item/documents/syndicate/cybersun
+ icon_state = "folder_sred"
+ desc = "A folder stamped \"Top Secret - Property of Cybersun Industries.\""
+
+/obj/item/folder/documents/syndicate/cybersun/biodynamics
+ document = /obj/item/documents/syndicate/cybersun/biodynamics
+ icon_state = "folder_sblue"
+
/obj/item/folder/documents/syndicate/red
document = /obj/item/documents/syndicate/red
icon_state = "folder_sred"
diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm
index eaf51fc9b25b..9065c7a87fd4 100644
--- a/code/modules/paperwork/paperplane.dm
+++ b/code/modules/paperwork/paperplane.dm
@@ -102,8 +102,9 @@
visible_message("\The [src] hits [H] in the eye[eyes ? "" : " socket"]!")
H.adjust_blurriness(6)
eyes?.applyOrganDamage(rand(6,8))
- H.Paralyze(40)
- H.emote("scream")
+ H.force_scream()
+ if(!HAS_TRAIT(H, TRAIT_ANALGESIA))
+ H.Paralyze(40)
/obj/item/paper/examine(mob/user)
. = ..()
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 40b0771981e4..c1982475c66a 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -135,10 +135,6 @@
if(istype(paper_copy, /obj/item/paper))
do_copy_loop(CALLBACK(src, PROC_REF(make_paper_copy)), usr)
return TRUE
- // Devil contract paper.
- if(istype(paper_copy, /obj/item/paper/contract/employment))
- do_copy_loop(CALLBACK(src, PROC_REF(make_devil_paper_copy)), usr)
- return TRUE
// Copying photo.
if(photo_copy)
do_copy_loop(CALLBACK(src, PROC_REF(make_photo_copy)), usr)
@@ -268,22 +264,6 @@
copied_item.pixel_x = rand(-10, 10)
copied_item.pixel_y = rand(-10, 10)
-/**
- * Handles the copying of devil contract paper. Transfers all the text, stamps and so on from the old paper, to the copy.
- *
- * Checks first if `paper_copy` exists. Since this proc is called from a timer, it's possible that it was removed.
- * Does not check if it has enough toner because devil contracts cost no toner to print.
- */
-/obj/machinery/photocopier/proc/make_devil_paper_copy(obj/item/paper/contract/employment/to_copy)
- if(!paper_copy && !to_copy)
- return
- to_copy = to_copy ? to_copy : paper_copy
- var/obj/item/paper/contract/employment/E = to_copy
- var/obj/item/paper/contract/employment/C = new(loc, E.target.current)
- give_pixel_offset(C)
-
- return C
-
/**
* Handles the copying of paper. Transfers all the text, stamps and so on from the old paper, to the copy.
*
@@ -408,15 +388,10 @@
/obj/machinery/photocopier/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/paper))
if(copier_empty())
- if(istype(O, /obj/item/paper/contract/infernal))
- to_chat(user, "[src] smokes, smelling of brimstone!")
- resistance_flags |= FLAMMABLE
- fire_act()
- else
- if(!user.dropItemToGround(O))
- return
- paper_copy = O
- do_insertion(O, user)
+ if(!user.dropItemToGround(O))
+ return
+ paper_copy = O
+ do_insertion(O, user)
else
to_chat(user, "There is already something in [src]!")
diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm
index 45893f8d5fc5..22e9a722634b 100644
--- a/code/modules/paperwork/stamps.dm
+++ b/code/modules/paperwork/stamps.dm
@@ -97,10 +97,15 @@
dye_color = DYE_SYNDICATE
/obj/item/stamp/cybersun
- name = "Cybersun rubber stamp"
+ name = "Cybersun Virtual Solutions rubber stamp"
icon_state = "stamp-cybersun"
dye_color = DYE_SYNDICATE
+/obj/item/stamp/cybersun/biodynamics
+ name = "Cybersun Biodynamics rubber stamp"
+ icon_state = "stamp-biodynamics"
+ dye_color = DYE_CMO
+
/obj/item/stamp/solgov
name = "SolGov rubber stamp"
icon_state = "stamp-solgov"
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 75cf85513236..4f2d70b680ad 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -217,7 +217,7 @@ MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/power/apc/auto_name, 25)
// this allows the APC to be embedded in a wall, yet still inside an area
if (building)
setDir(ndir)
- tdir = dir// to fix Vars bug
+ tdir = dir
switch(tdir)
if(NORTH)
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index a386a739622d..7c7dc8692cb5 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -377,8 +377,9 @@
//source is an object caused electrocuting (airlock, grille, etc)
//siemens_coeff - layman's terms, conductivity
//dist_check - set to only shock mobs within 1 of source (vendors, airlocks, etc.)
+//drain_energy - whether the shock will drain power from the mech. Enabled by default.
//No animations will be performed by this proc.
-/proc/electrocute_mob(mob/living/carbon/victim, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE)
+/proc/electrocute_mob(mob/living/carbon/victim, power_source, obj/source, siemens_coeff = 1, dist_check = FALSE, drain_energy = TRUE)
if(!istype(victim) || ismecha(victim.loc))
return FALSE //feckin mechs are dumb
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
deleted file mode 100644
index aefc5249f54d..000000000000
--- a/code/modules/power/singularity/narsie.dm
+++ /dev/null
@@ -1,238 +0,0 @@
-/obj/singularity/narsie //Moving narsie to a child object of the singularity so it can be made to function differently. --NEO
- name = "Nar'Sie's Avatar"
- desc = "Your mind begins to bubble and ooze as it tries to comprehend what it sees."
- icon = 'icons/obj/narsie_small.dmi'
- icon_state = "narsie"
- pixel_x = -89
- pixel_y = -85
- density = FALSE
- current_size = 9 //It moves/eats like a max-size singulo, aside from range. --NEO
- contained = 0 //Are we going to move around?
- dissipate = 0 //Do we lose energy over time?
- move_self = 1 //Do we move on our own?
- grav_pull = 5 //How many tiles out do we pull?
- consume_range = 6 //How many tiles out do we eat
- light_power = 0.7
- light_range = 15
- light_color = COLOR_RED
- gender = FEMALE
- resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF | FREEZE_PROOF
-
-/obj/singularity/narsie/large
- name = "Nar'Sie"
- icon = 'icons/obj/narsie.dmi'
- // Pixel stuff centers Narsie.
- pixel_x = -236
- pixel_y = -256
- current_size = 12
- grav_pull = 10
- consume_range = 12 //How many tiles out do we eat
-
-/obj/singularity/narsie/large/Initialize()
- . = ..()
- send_to_playing_players("NAR'SIE HAS RISEN")
- sound_to_playing_players('sound/creatures/narsie_rises.ogg')
-
- var/area/A = get_area(src)
- if(A)
- var/mutable_appearance/alert_overlay = mutable_appearance('icons/effects/cult_effects.dmi', "ghostalertsie")
- notify_ghosts("Nar'Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.", source = src, alert_overlay = alert_overlay, action=NOTIFY_ATTACK)
- narsie_spawn_animation()
- UnregisterSignal(src, COMSIG_ATOM_BSA_BEAM) //set up in /singularity/Initialize()
-
-/obj/singularity/narsie/large/cult // For the new cult ending, guaranteed to end the round within 3 minutes
- var/list/souls_needed = list()
- var/soul_goal = 0
- var/souls = 0
- var/resolved = FALSE
-
-/obj/singularity/narsie/large/cult/Initialize()
- . = ..()
- GLOB.cult_narsie = src
- var/list/all_cults = list()
- for(var/datum/antagonist/cult/C in GLOB.antagonists)
- if(!C.owner)
- continue
- all_cults |= C.cult_team
- for(var/datum/team/cult/T in all_cults)
- deltimer(T.blood_target_reset_timer)
- T.blood_target = src
- var/datum/objective/eldergod/summon_objective = locate() in T.objectives
- if(summon_objective)
- summon_objective.summoned = TRUE
- for(var/datum/mind/cult_mind in SSticker.mode.cult)
- if(isliving(cult_mind.current))
- var/mob/living/L = cult_mind.current
- L.narsie_act()
- for(var/mob/living/player in GLOB.player_list)
- if(player.stat != DEAD && player.loc && !iscultist(player) && !isanimal(player))
- souls_needed[player] = TRUE
- soul_goal = round(1 + LAZYLEN(souls_needed) * 0.75)
- INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(begin_the_end))
-
-/proc/begin_the_end()
- SSredbot.send_discord_message("admin","Nar'sie has been summoned.","round ending event")
- sleep(50)
- if(QDELETED(GLOB.cult_narsie)) // uno
- priority_announce("Status report? We detected a anomaly, but it disappeared almost immediately.","Central Command Higher Dimensional Affairs", 'sound/misc/notice1.ogg')
- GLOB.cult_narsie = null
- sleep(20)
- INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), 2)
- return
- priority_announce("An acausal dimensional event has been detected in your sector. Event has been flagged EXTINCTION-CLASS. Directing all available assets toward simulating solutions. SOLUTION ETA: 60 SECONDS.","Central Command Higher Dimensional Affairs", 'sound/misc/airraid.ogg')
- sleep(500)
- if(QDELETED(GLOB.cult_narsie)) // dos
- priority_announce("Simulations aborted, sensors report that the acasual event is normalizing. Good work, crew.","Central Command Higher Dimensional Affairs", 'sound/misc/notice1.ogg')
- GLOB.cult_narsie = null
- sleep(20)
- INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), 2)
- return
- priority_announce("Simulations on acausal dimensional event complete. Deploying solution package now. Deployment ETA: ONE MINUTE. ","Central Command Higher Dimensional Affairs")
- sleep(50)
- set_security_level("delta")
- SSshuttle.lockdown = TRUE
- sleep(600)
- if(QDELETED(GLOB.cult_narsie)) // tres
- priority_announce("Normalization detected! Abort the solution package!","Central Command Higher Dimensional Affairs", 'sound/misc/notice1.ogg')
- GLOB.cult_narsie = null
- sleep(20)
- set_security_level("red")
- SSshuttle.lockdown = FALSE
- INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper), 2)
- return
- if(GLOB.cult_narsie.resolved == FALSE)
- GLOB.cult_narsie.resolved = TRUE
- sound_to_playing_players('sound/machines/alarm.ogg')
- addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(cult_ending_helper)), 120)
-
-/obj/singularity/narsie/large/cult/Destroy()
- send_to_playing_players("\"[pick("Nooooo...", "Not die. How-", "Die. Mort-", "Sas tyen re-")]\"")
- sound_to_playing_players('sound/magic/demon_dies.ogg', 50)
- if(GLOB.cult_narsie == src)
- GLOB.cult_narsie = null
- var/list/all_cults = list()
- for(var/datum/antagonist/cult/C in GLOB.antagonists)
- if(!C.owner)
- continue
- all_cults |= C.cult_team
- for(var/datum/team/cult/T in all_cults)
- var/datum/objective/eldergod/summon_objective = locate() in T.objectives
- if(summon_objective)
- summon_objective.summoned = FALSE
- summon_objective.killed = TRUE
- return ..()
-
-/proc/ending_helper()
- SSticker.force_ending = 1
-
-/proc/cult_ending_helper(ending_type = 0)
- if(ending_type == 2) //narsie fukkin died
- Cinematic(CINEMATIC_CULT_FAIL,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)))
- else if(ending_type) //no explosion
- Cinematic(CINEMATIC_CULT,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)))
- else // explosion
- Cinematic(CINEMATIC_CULT_NUKE,world,CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(ending_helper)))
-
-//ATTACK GHOST IGNORING PARENT RETURN VALUE
-/obj/singularity/narsie/large/attack_ghost(mob/dead/observer/user as mob)
- makeNewConstruct(/mob/living/simple_animal/hostile/construct/harvester, user, cultoverride = TRUE, loc_override = src.loc)
-
-/obj/singularity/narsie/process()
- eat()
- if(!target || prob(5))
- pickcultist()
- move()
- if(prob(25))
- mezzer()
-
-
-/obj/singularity/narsie/Bump(atom/A)
- var/turf/T = get_turf(A)
- if(T == loc)
- T = get_step(A, A.dir) //please don't slam into a window like a bird, Nar'Sie
- forceMove(T)
-
-
-/obj/singularity/narsie/mezzer()
- for(var/mob/living/carbon/M in viewers(consume_range, src))
- if(M.stat == CONSCIOUS)
- if(!iscultist(M))
- to_chat(M, "You feel conscious thought crumble away in an instant as you gaze upon [src.name]...")
- M.apply_effect(60, EFFECT_STUN)
-
-
-/obj/singularity/narsie/consume(atom/A)
- if(isturf(A))
- A.narsie_act()
-
-
-/obj/singularity/narsie/ex_act() //No throwing bombs at her either.
- return
-
-
-/obj/singularity/narsie/proc/pickcultist() //Narsie rewards her cultists with being devoured first, then picks a ghost to follow.
- var/list/cultists = list()
- var/list/noncultists = list()
-
- for(var/mob/living/carbon/food in GLOB.alive_mob_list) //we don't care about constructs or cult-Ians or whatever. cult-monkeys are fair game i guess
- var/turf/pos = get_turf(food)
- if(!pos || (pos.virtual_z() != virtual_z()))
- continue
-
- if(iscultist(food))
- cultists += food
- else
- noncultists += food
-
- if(cultists.len) //cultists get higher priority
- acquire(pick(cultists))
- return
-
- if(noncultists.len)
- acquire(pick(noncultists))
- return
-
- //no living humans, follow a ghost instead.
- for(var/mob/dead/observer/ghost in GLOB.player_list)
- var/turf/pos = get_turf(ghost)
- if(!pos || (pos.virtual_z() != virtual_z()))
- continue
- cultists += ghost
- if(cultists.len)
- acquire(pick(cultists))
- return
-
-
-/obj/singularity/narsie/proc/acquire(atom/food)
- if(food == target)
- return
- to_chat(target, "NAR'SIE HAS LOST INTEREST IN YOU.")
- target = food
- if(ishuman(target))
- to_chat(target, "NAR'SIE HUNGERS FOR YOUR SOUL.")
- else
- to_chat(target, "NAR'SIE HAS CHOSEN YOU TO LEAD HER TO HER NEXT MEAL.")
-
-//Wizard narsie
-/obj/singularity/narsie/wizard
- grav_pull = 0
-
-/obj/singularity/narsie/wizard/eat()
-// if(defer_powernet_rebuild != 2)
-// defer_powernet_rebuild = 1
- for(var/atom/X in urange(consume_range,src,1))
- if(isturf(X) || ismovable(X))
- consume(X)
-// if(defer_powernet_rebuild != 2)
-// defer_powernet_rebuild = 0
- return
-
-
-/obj/singularity/narsie/proc/narsie_spawn_animation()
- setDir(SOUTH)
- move_self = FALSE
- flick("narsie_spawn_anim",src)
- addtimer(CALLBACK(src, PROC_REF(narsie_spawn_animation_end)), 3.5 SECONDS)
-
-/obj/singularity/narsie/proc/narsie_spawn_animation_end()
- move_self = TRUE
diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammo_casing.dm
similarity index 52%
rename from code/modules/projectiles/ammunition/_ammunition.dm
rename to code/modules/projectiles/ammunition/_ammo_casing.dm
index 632d3fb3b34b..02578e4592f8 100644
--- a/code/modules/projectiles/ammunition/_ammunition.dm
+++ b/code/modules/projectiles/ammunition/_ammo_casing.dm
@@ -1,7 +1,7 @@
/obj/item/ammo_casing
name = "bullet casing"
desc = "A bullet casing."
- icon = 'icons/obj/ammo_bullets.dmi'
+ icon = 'icons/obj/ammunition/ammo_bullets.dmi'
icon_state = "pistol-brass"
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
@@ -32,16 +32,109 @@
/// If you dont want to bullets to randomly change position on spawn. For mapping.
var/auto_scatter = TRUE
- var/pellets = 1 //Pellets for spreadshot
- var/variance = 0 //Variance for inaccuracy fundamental to the casing
- var/randomspread = FALSE //Randomspread for automatics
- var/delay = 0 //Delay for energy weapons
- var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
+ ///Pellets for spreadshot
+ var/pellets = 1
+ ///Variance for inaccuracy fundamental to the casing
+ var/variance = 0
+ ///Randomspread for automatics
+ var/randomspread = FALSE
+ ///Delay for energy weapons
+ var/delay = 0
+ ///Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown.
+ var/click_cooldown_override = 0
+ ///If true, overrides the bouncing sfx from the turf to this one
+ var/list/bounce_sfx_override
+
+ ///What this casing can be stacked into.
+ var/obj/item/ammo_box/magazine/stack_type = /obj/item/ammo_box/magazine/ammo_stack
+ ///Maximum stack size of ammunition
+ var/stack_size = 12
+
+/obj/item/ammo_casing/attackby(obj/item/attacking_item, mob/user, params)
+ if(istype(attacking_item, /obj/item/ammo_box) && user.is_holding(src))
+ add_fingerprint(user)
+ var/obj/item/ammo_box/ammo_box = attacking_item
+ var/obj/item/ammo_casing/other_casing = ammo_box.get_round(TRUE)
+
+ if(try_stacking(other_casing, user))
+ ammo_box.stored_ammo -= other_casing
+ ammo_box.update_ammo_count()
+ return
- var/list/bounce_sfx_override // if true, overrides the bouncing sfx from the turf to this one
+ else if(istype(attacking_item, /obj/item/ammo_box/magazine/ammo_stack))
+ add_fingerprint(user)
+ var/obj/item/ammo_box/magazine/ammo_stack = attacking_item
+ if(isturf(loc))
+ var/boolets = 0
+ for(var/obj/item/ammo_casing/bullet in loc)
+ if(bullet == src)
+ continue
+ if(!bullet.BB)
+ continue
+ if(length(ammo_stack.stored_ammo) >= ammo_stack.max_ammo)
+ break
+ if(ammo_stack.give_round(bullet, FALSE))
+ boolets++
+ break
+ if((boolets <= 0) && BB && !(length(ammo_stack.stored_ammo) >= ammo_stack.max_ammo))
+ if(ammo_stack.give_round(src, FALSE))
+ boolets++
+ if(boolets > 0)
+ ammo_stack.update_ammo_count()
+ to_chat(user, span_notice("You collect [boolets] round\s. [ammo_stack] now contains [length(ammo_stack.stored_ammo)] round\s."))
+ else
+ to_chat(user, span_warning("You can't stack any more!"))
+ return
- var/bullet_per_box
+ else if(istype(attacking_item, /obj/item/ammo_casing))
+ try_stacking(attacking_item, user)
+ return
+ return ..()
+
+/obj/item/ammo_casing/proc/try_stacking(obj/item/ammo_casing/other_casing, mob/living/user)
+ if(user)
+ add_fingerprint(user)
+ if(!other_casing.stack_type)
+ if(user)
+ to_chat(user, span_warning("[other_casing] can't be stacked."))
+ return
+ if(!stack_type)
+ if(user)
+ to_chat(user, span_warning("[src] can't be stacked."))
+ return
+ if(name != other_casing.name) //Has to match exactly
+ if(user)
+ to_chat(user, span_warning("You can't stack different types of ammunition."))
+ return
+ if(stack_type != other_casing.stack_type)
+ if(user)
+ to_chat(user, span_warning("You can't stack [other_casing] with [src]."))
+ return
+ if(!BB || !other_casing.BB) //maybe allow empty casing stacking at a later date, when there's a feature to recycle casings
+ if(user)
+ to_chat(user, span_warning("You can't stack empty casings."))
+ return
+ if((item_flags & IN_STORAGE) || (other_casing.item_flags & IN_STORAGE))
+ if(user)
+ to_chat(user, span_warning("You can't stack casings while they are inside storage."))
+ return
+ var/obj/item/ammo_box/magazine/ammo_stack/ammo_stack = other_casing.stack_with(src)
+ if(user)
+ user.put_in_hands(ammo_stack)
+ to_chat(user, span_notice("[src] has been stacked with [other_casing]."))
+ return ammo_stack
+
+/obj/item/ammo_casing/proc/stack_with(obj/item/ammo_casing/other_casing)
+ var/obj/item/ammo_box/magazine/ammo_stack/ammo_stack = new stack_type(drop_location())
+ ammo_stack.name = "handful of [name]s" //"handful of .9mm bullet casings"
+ ammo_stack.base_icon_state = other_casing.icon_state
+ ammo_stack.caliber = caliber
+ ammo_stack.max_ammo = stack_size
+ ammo_stack.give_round(src)
+ ammo_stack.give_round(other_casing)
+ ammo_stack.update_ammo_count()
+ return ammo_stack
/obj/item/ammo_casing/spent
name = "spent bullet casing"
@@ -56,7 +149,7 @@
pixel_y = base_pixel_y + rand(-10, 10)
item_flags |= NO_PIXEL_RANDOM_DROP
if(auto_rotate)
- transform = transform.Turn(pick(0, 90, 180, 270))
+ transform = transform.Turn(round(45 * rand(0, 32) / 2))
update_appearance()
/obj/item/ammo_casing/Destroy()
@@ -75,33 +168,11 @@
desc = "[initial(desc)][BB ? null : " This one is spent."]"
return ..()
-//proc to magically refill a casing with a new projectile
+///Proc to magically refill a casing with a new projectile
/obj/item/ammo_casing/proc/newshot() //For energy weapons, syringe gun, shotgun shells and wands (!).
if(!BB)
BB = new projectile_type(src, src)
-/obj/item/ammo_casing/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/ammo_box))
- var/obj/item/ammo_box/box = I
- if(isturf(loc))
- var/boolets = 0
- for(var/obj/item/ammo_casing/bullet in loc)
- if (box.stored_ammo.len >= box.max_ammo)
- break
- if (bullet.BB)
- if (box.give_round(bullet, 0))
- boolets++
- else
- continue
- if (boolets > 0)
- box.update_appearance()
- to_chat(user, "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s.")
- else
- to_chat(user, "You fail to collect anything!")
- else
- return ..()
-
-
/obj/item/ammo_casing/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
bounce_away(FALSE, NONE)
. = ..()
@@ -114,7 +185,6 @@
var/angle_of_movement = !isnull(shooter) ? (rand(-3000, 3000) / 100) + dir2angle(turn(shooter.dir, 180)) : rand(-3000, 3000) / 100
AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(400, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = bounce_sfx_override)
-
/obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, bounce_delay = 3)
if(!heavy_metal)
return
diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm
index d46001951ba4..90030e7b0944 100644
--- a/code/modules/projectiles/ammunition/ballistic/lmg.dm
+++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm
@@ -6,7 +6,6 @@
icon_state = "rifle-steel"
caliber = "7.12x82mm"
projectile_type = /obj/projectile/bullet/mm712x82
- bullet_per_box = 100
/obj/item/ammo_casing/mm712x82/ap
name = "7.12x82mm armor-piercing bullet casing"
diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm
index e8cb64a673d2..9e1f880ffe1b 100644
--- a/code/modules/projectiles/ammunition/ballistic/pistol.dm
+++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm
@@ -6,7 +6,6 @@
icon_state = "pistol-steel"
caliber = "10mm"
projectile_type = /obj/projectile/bullet/c10mm
- bullet_per_box = 50
/obj/item/ammo_casing/c10mm/surplus
name = "10mm surplus bullet casing"
@@ -46,7 +45,7 @@
icon_state = "pistol-brass"
caliber = "9mm"
projectile_type = /obj/projectile/bullet/c9mm
- bullet_per_box = 50
+ stack_size = 15
/obj/item/ammo_casing/c9mm/surplus
name = "9mm surplus bullet casing"
@@ -58,7 +57,7 @@
name = "9mm armor-piercing bullet casing"
desc = "A 9mm armor-piercing bullet casing."
bullet_skin = "ap"
- projectile_type =/obj/projectile/bullet/c9mm/ap
+ projectile_type = /obj/projectile/bullet/c9mm/ap
/obj/item/ammo_casing/c9mm/hp
name = "9mm hollow point bullet casing"
@@ -86,7 +85,7 @@
icon_state = "pistol-steel"
caliber = ".45"
projectile_type = /obj/projectile/bullet/c45
- bullet_per_box = 50
+ stack_size = 12
/obj/item/ammo_casing/c45/surplus
name = ".45 surplus bullet casing"
@@ -125,18 +124,17 @@
desc = "A .50 AE bullet casing."
caliber = ".50 AE"
projectile_type = /obj/projectile/bullet/a50AE
- bullet_per_box = 20
/obj/item/ammo_casing/a50AE/hp
name = ".50 AE hollow point bullet casing"
desc = "A .50 AE hollow point bullet casing."
projectile_type = /obj/projectile/bullet/a50AE/hp
-// .22 LR (Himehabu)
+// .22 LR (Himehabu, Pounder)
+
/obj/item/ammo_casing/c22lr
name = ".22 LR bullet casing"
desc = "A .22 LR bullet casing."
projectile_type = /obj/projectile/bullet/c22lr
caliber = "22lr"
- bullet_per_box = 75
-
+ stack_size = 15
diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm
index 8705a932b392..5b6e8b2e0961 100644
--- a/code/modules/projectiles/ammunition/ballistic/revolver.dm
+++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm
@@ -6,7 +6,6 @@
caliber = ".357"
icon_state = "magnum-brass"
projectile_type = /obj/projectile/bullet/a357
- bullet_per_box = 50
/obj/item/ammo_casing/a357/match
name = ".357 match bullet casing"
@@ -29,7 +28,7 @@
caliber = ".45-70"
icon_state = "magnum-brass"
projectile_type = /obj/projectile/bullet/a4570
- bullet_per_box = 12
+ stack_size = 5
/obj/item/ammo_casing/a4570/match
name = ".45-70 match bullet casing"
@@ -55,14 +54,12 @@
desc = "A .38 Special bullet casing."
caliber = ".38"
projectile_type = /obj/projectile/bullet/c38
- bullet_per_box = 50
/obj/item/ammo_casing/c38/surplus
name = ".38 surplus bullet casing"
desc = "A .38 surplus bullet casing."
projectile_type = /obj/projectile/bullet/c38/surplus
-
/obj/item/ammo_casing/c38/trac
name = ".38 TRAC bullet casing"
desc = "A .38 \"TRAC\" bullet casing."
diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm
index 9f71e2973848..04545410300b 100644
--- a/code/modules/projectiles/ammunition/ballistic/rifle.dm
+++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm
@@ -6,7 +6,7 @@
icon_state = "rifle-brass"
caliber = "8x50mmR"
projectile_type = /obj/projectile/bullet/a8_50r
- bullet_per_box = 20
+ stack_size = 10
/obj/item/ammo_casing/a8_50rhp
name = "8x50mmR hollow point bullet casing"
@@ -14,7 +14,7 @@
icon_state = "rifle-brass-hollow"
caliber = "8x50mmR"
projectile_type = /obj/projectile/bullet/a8_50rhp
-
+ stack_size = 10
// 8x58mm Caseless (SSG-669C)
@@ -24,7 +24,7 @@
icon_state = "caseless"
caliber = "a858"
projectile_type = /obj/projectile/bullet/a858
- bullet_per_box = 20
+ stack_size = 10
// .300 Magnum (Smile Rifle)
@@ -34,7 +34,7 @@
icon_state = "rifle-steel"
caliber = "a300"
projectile_type = /obj/projectile/bullet/a300
- bullet_per_box = 20
+ stack_size = 15
// 5.56x42mm CLIP (CM82, Hydra variants)
@@ -44,7 +44,7 @@
icon_state = "rifle-brass"
caliber = "5.56x42mm"
projectile_type = /obj/projectile/bullet/a556_42
- bullet_per_box = 80
+ stack_size = 5
// 5.45x39mm (SKM-24v)
@@ -55,7 +55,7 @@
caliber = "5.45x39mm"
randomspread = TRUE
projectile_type = /obj/projectile/bullet/a545_39
- bullet_per_box = 80
+ stack_size = 15
/obj/item/ammo_casing/a545_39/recycled
name = "recycled 5.45x39mm bullet casing"
@@ -63,6 +63,7 @@
bullet_skin = "surplus"
caliber = "5.45x39mm"
projectile_type = /obj/projectile/bullet/a545_39
+ stack_size = 15
// 7.62x40mm CLIP (SKM Rifles)
@@ -72,7 +73,7 @@
icon_state = "rifle-brass"
caliber = "7.62x40mm"
projectile_type = /obj/projectile/bullet/a762_40
- bullet_per_box = 80
+ stack_size = 15
//.308 (M514 EBR & CM-GAL-S)
@@ -82,7 +83,7 @@
icon_state = "rifle-brass"
caliber = ".308"
projectile_type = /obj/projectile/bullet/a308
- bullet_per_box = 20
+ stack_size = 10
/obj/item/ammo_casing/caseless/c299
name = ".299 Eoehoma caseless bullet casing"
@@ -90,7 +91,7 @@
icon_state = "caseless"
caliber = ".299 caseless"
projectile_type = /obj/projectile/bullet/c299
- bullet_per_box = 100
+ stack_size = 5
/obj/item/ammo_casing/a65clip
name = "6.5x57mm CLIP bullet casing"
@@ -98,3 +99,4 @@
icon_state = "big-brass"
caliber = "6.5CLIP"
projectile_type = /obj/projectile/bullet/a65clip
+ stack_size = 5
diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
index 24854030c041..2bf041a0e661 100644
--- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm
+++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm
@@ -3,12 +3,11 @@
/obj/item/ammo_casing/shotgun
name = "shotgun slug"
desc = "A 12-gauge lead slug."
- icon = 'icons/obj/ammo_shotshells.dmi'
icon_state = "slug"
caliber = "12ga"
custom_materials = list(/datum/material/iron=4000)
projectile_type = /obj/projectile/bullet/slug
- bullet_per_box = 25
+ stack_size = 8 //Make sure this matches max_ammo variable on prefilled stacks (magazine/ammo_stack/prefilled)
bounce_sfx_override = 'sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg'
@@ -28,6 +27,7 @@
name = "beanbag slug"
desc = "A weak beanbag slug for riot control."
icon_state = "beanbag"
+ caliber = "12ga beanbag"
custom_materials = list(/datum/material/iron=250)
projectile_type = /obj/projectile/bullet/slug/beanbag
@@ -35,6 +35,7 @@
name = "rubber shot"
desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
icon_state = "rubber"
+ caliber = "12ga rubber"
projectile_type = /obj/projectile/bullet/pellet/rubbershot
pellets = 8
variance = 25
@@ -44,6 +45,7 @@
name = "incendiary slug"
desc = "An incendiary-coated shotgun slug."
icon_state = "incendiary"
+ caliber = "12ga incendiary"
projectile_type = /obj/projectile/bullet/incendiary/shotgun
/obj/item/ammo_casing/shotgun/blank
@@ -57,6 +59,7 @@
name = "improvised shell"
desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards."
icon_state = "improvised"
+ caliber = "improvised 12ga"
projectile_type = /obj/projectile/bullet/pellet/improvised
custom_materials = list(/datum/material/iron=250)
pellets = 10
diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm
index 39086b8cc66f..5e0602da6db2 100644
--- a/code/modules/projectiles/ammunition/ballistic/smg.dm
+++ b/code/modules/projectiles/ammunition/ballistic/smg.dm
@@ -6,7 +6,6 @@
icon_state = "rifle-steel"
caliber = "5.7x39mm"
projectile_type = /obj/projectile/bullet/c57x39mm
- bullet_per_box = 50
// 4.6x30mm (WT-550 Automatic Rifle & SKM-24v)
@@ -16,7 +15,7 @@
icon_state = "rifle-brass"
caliber = "4.6x30mm"
projectile_type = /obj/projectile/bullet/c46x30mm
- bullet_per_box = 50
+ stack_size = 15
/obj/item/ammo_casing/c46x30mm/ap
name = "4.6x30mm armor-piercing bullet casing"
@@ -29,7 +28,6 @@
desc = "A 4.6x30mm incendiary bullet casing."
bullet_skin = "incen"
projectile_type = /obj/projectile/bullet/incendiary/c46x30mm
- bullet_per_box = 50
// 4.73x33mm caseless (Solar)
@@ -39,7 +37,6 @@
icon_state = "caseless"
caliber = "4.73x33mm caseless"
projectile_type = /obj/projectile/bullet/c47x33mm
- bullet_per_box = 50
// 5.56mm HITP caseless (Pistole C)
diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm
index e4b668c2228f..af7369204e6d 100644
--- a/code/modules/projectiles/ammunition/ballistic/sniper.dm
+++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm
@@ -6,7 +6,6 @@
icon_state = "big-steel"
caliber = ".50 BMG"
projectile_type = /obj/projectile/bullet/p50
- bullet_per_box = 20
/obj/item/ammo_casing/p50/soporific
name = ".50 BMG soporific bullet casing"
diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm
index 0051680fd1e8..3c71d31eb5ed 100644
--- a/code/modules/projectiles/ammunition/caseless/foam.dm
+++ b/code/modules/projectiles/ammunition/caseless/foam.dm
@@ -9,7 +9,6 @@
custom_materials = list(/datum/material/iron = 11.25)
harmful = FALSE
var/modified = FALSE
- bullet_per_box = 40
/obj/item/ammo_casing/caseless/foam_dart/update_icon_state()
. = ..()
diff --git a/code/modules/projectiles/ammunition/energy/plasma.dm b/code/modules/projectiles/ammunition/energy/plasma.dm
index 00de4a90ffee..d593086157fd 100644
--- a/code/modules/projectiles/ammunition/energy/plasma.dm
+++ b/code/modules/projectiles/ammunition/energy/plasma.dm
@@ -2,10 +2,9 @@
projectile_type = /obj/projectile/plasma
select_name = "plasma burst"
fire_sound = 'sound/weapons/plasma_cutter.ogg'
- delay = 15
- e_cost = 25
+ delay = 30
+ e_cost = 100
/obj/item/ammo_casing/energy/plasma/adv
projectile_type = /obj/projectile/plasma/adv
- delay = 10
- e_cost = 10
+ delay = 20
diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
index 7f92dfad16a6..57fb71d17f32 100644
--- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm
+++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm
@@ -4,7 +4,7 @@
/obj/item/ammo_box
name = "ammo box (null_reference_exception)"
desc = "A box of ammo."
- icon = 'icons/obj/ammo.dmi'
+ icon = 'icons/obj/ammunition/ammo.dmi'
flags_1 = CONDUCT_1
slot_flags = ITEM_SLOT_BELT
item_state = "syringe_kit"
@@ -26,7 +26,7 @@
///String, used for checking if ammo of different types but still fits can fit inside it; generally used for magazines
var/caliber
///Allows multiple bullets to be loaded in from one click of another box/magazine
- var/multiload = TRUE
+ var/multiload = FALSE
///Whether or not an ammo box skips the do_after process (e.g. speedloaders)
var/instant_load = FALSE
///Whether the magazine should start with nothing in it
@@ -40,22 +40,42 @@
. = ..()
if(!base_icon_state)
base_icon_state = icon_state
- if (!bullet_cost)
+
+ if(!bullet_cost)
for (var/material in custom_materials)
var/material_amount = custom_materials[material]
LAZYSET(base_cost, material, (material_amount * 0.10))
material_amount *= 0.90 // 10% for the container
material_amount /= max_ammo
- LAZYSET(bullet_cost, material, material_amount)
+ LAZYSET(bullet_cost, material, material_amount).
+
if(!start_empty)
- for(var/i = 1, i <= max_ammo, i++)
- stored_ammo += new ammo_type(src)
- update_ammo_count()
+ top_off(starting = TRUE)
+
+ update_appearance()
+
+/*
+ * top_off is used to refill the magazine to max, in case you want to increase the size of a magazine with VV then refill it at once
+ * Arguments:
+ * load_type - if you want to specify a specific ammo casing type to load, enter the path here, otherwise it'll use the basic [/obj/item/ammo_box/var/ammo_type]. Must be a compatible round
+ * starting - Relevant for revolver cylinders, if FALSE then we mind the nulls that represent the empty cylinders (since those nulls don't exist yet if we haven't initialized when this is TRUE)
+ */
+/obj/item/ammo_box/proc/top_off(load_type, starting=FALSE)
+ if(!load_type) //this check comes first so not defining an argument means we just go with default ammo
+ load_type = ammo_type
+
+ var/obj/item/ammo_casing/round_check = load_type
+ if(!starting && (caliber && initial(round_check.caliber) != caliber) || (!caliber && load_type != ammo_type))
+ stack_trace("Tried loading unsupported ammocasing type [load_type] into ammo box [type].")
+ return
+
+ for(var/i = max(1, stored_ammo.len), i <= max_ammo, i++)
+ stored_ammo += new round_check(src)
///gets a round from the magazine, if keep is TRUE the round will stay in the gun
/obj/item/ammo_box/proc/get_round(keep = FALSE)
- if (!stored_ammo.len)
+ if(!stored_ammo.len)
return null
else
var/b = stored_ammo[stored_ammo.len]
@@ -70,7 +90,7 @@
if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type))
return FALSE
- if (stored_ammo.len < max_ammo)
+ if(stored_ammo.len < max_ammo)
stored_ammo += R
R.forceMove(src)
return TRUE
@@ -93,12 +113,14 @@
/obj/item/ammo_box/attackby(obj/item/attacking_obj, mob/user, params, silent = FALSE, replace_spent = FALSE)
var/num_loaded = 0
+
if(!can_load(user))
return
- if(istype(attacking_obj, /obj/item/ammo_box))
+
+ if(istype(attacking_obj, /obj/item/ammo_box/magazine/ammo_stack))
var/obj/item/ammo_box/attacking_box = attacking_obj
for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo)
- if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box)))
+ if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box, timed_action_flags = IGNORE_USER_LOC_CHANGE)))
break
var/did_load = give_round(casing_to_insert, replace_spent)
if(!did_load)
@@ -114,15 +136,14 @@
var/obj/item/ammo_casing/casing_to_insert = attacking_obj
if(give_round(casing_to_insert, replace_spent))
user.transferItemToLoc(casing_to_insert, src, TRUE)
- if(!silent)
- playsound(casing_to_insert, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
num_loaded++
+ casing_to_insert.update_appearance()
update_ammo_count()
-
if(num_loaded)
if(!silent)
- to_chat(user, "You load [num_loaded] cartridge\s into \the [src]!")
+ to_chat(user, span_notice("You load [num_loaded] cartridge\s into \the [src]!"))
+ playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
return num_loaded
/obj/item/ammo_box/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
@@ -145,6 +166,7 @@
if(num_loaded)
to_chat(user, "You load [num_loaded] cartridge\s into \the [to_load]!")
return
+
/obj/item/ammo_box/attack_self(mob/user)
var/obj/item/ammo_casing/A = get_round()
if(!A)
@@ -155,7 +177,7 @@
if(!(user.is_holding(src) || H.l_store == src || H.r_store == src) || !user.put_in_hands(A)) //incase they're using TK
A.bounce_away(FALSE, NONE)
playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
- to_chat(user, "You remove a round from [src]!")
+ to_chat(user, span_notice("You remove a round from [src]!"))
update_ammo_count()
/// Updates the materials and appearance of this ammo box
@@ -218,6 +240,7 @@
var/list/L = stored_ammo.Copy()
if(drop_list)
stored_ammo.Cut()
+ update_ammo_count()
return L
///drops the entire contents of the magazine on the floor
@@ -226,6 +249,7 @@
for(var/obj/item/ammo in stored_ammo)
ammo.forceMove(turf_mag)
stored_ammo -= ammo
+ update_ammo_count()
/obj/item/ammo_box/magazine/handle_atom_del(atom/A)
stored_ammo -= A
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
deleted file mode 100644
index 5b78f1fc93a1..000000000000
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ /dev/null
@@ -1,565 +0,0 @@
-// .357 Speed Loaders (Syndicate Revolver)
-
-/obj/item/ammo_box/a357
- name = "speed loader (.357)"
- desc = "A 6-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor."
- icon_state = "speedloader_357-6"
- base_icon_state = "speedloader_357"
- ammo_type = /obj/item/ammo_casing/a357
- caliber = ".357"
- max_ammo = 6
- multiple_sprites = AMMO_BOX_PER_BULLET
- item_flags = NO_MAT_REDEMPTION
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a357/empty
- start_empty = TRUE
-
-/obj/item/ammo_box/a357/match
- name = "speed loader (.357 match)"
- desc = "A 6-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
- ammo_type = /obj/item/ammo_casing/a357/match
-
-/obj/item/ammo_box/a357/hp
- name = "speed loader (.357 hollow point)"
- desc = "A 6-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones."
- ammo_type = /obj/item/ammo_casing/a357/hp
-
-/obj/item/ammo_box/a357_box
- name = "ammo box (.357)"
- desc = "A box of standard .357 ammo."
- icon_state = "357box"
- ammo_type = /obj/item/ammo_casing/a357
- max_ammo = 50
-
-/obj/item/ammo_box/a357_box/match
- name = "ammo box (.357)"
- desc = "A box of match .357 ammo."
- icon_state = "357box-match"
- ammo_type = /obj/item/ammo_casing/a357/match
- max_ammo = 50
-
-/obj/item/ammo_box/a357_box/hp
- name = "ammo box (.357)"
- desc = "A box of hollow point .357 ammo."
- icon_state = "357box-hp"
- ammo_type = /obj/item/ammo_casing/a357/hp
- max_ammo = 50
-
-
-// .45-70 Ammo Holders (Hunting Revolver)
-
-/obj/item/ammo_box/a4570
- name = "ammo box (.45-70)"
- desc = "A box of top grade .45-70 ammo. These rounds do significant damage with average performance against armor."
- icon_state = "4570"
- ammo_type = /obj/item/ammo_casing/a4570
- max_ammo = 18
-
-/obj/item/ammo_box/a4570/match
- name = "ammo box (.45-70 match)"
- desc = "A 18-round ammo box for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
- icon_state = "4570-match"
- ammo_type = /obj/item/ammo_casing/a4570/match
-
-
-/obj/item/ammo_box/a4570/hp
- name = "ammo box (.45-70 hollow point)"
- desc = "A 18-round ammo box for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones."
- icon_state = "4570-hp"
- ammo_type = /obj/item/ammo_casing/a4570/hp
-
-/obj/item/ammo_box/a4570/explosive
- name = "ammo box (.45-70 explosive)"
- desc = "A 18-round ammo box for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs."
- icon_state = "4570-explosive"
- ammo_type = /obj/item/ammo_casing/a4570/explosive
-
-
-// .38 special Speed Loaders (Colt Detective Special)
-
-/obj/item/ammo_box/c38
- name = "speed loader (.38 special)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do okay damage, but struggle against armor."
- icon_state = "speedloader_38-6"
- base_icon_state = "speedloader_38"
- ammo_type = /obj/item/ammo_casing/c38
- caliber = ".38"
- max_ammo = 6
- multiple_sprites = AMMO_BOX_PER_BULLET
- custom_materials = list(/datum/material/iron = 15000)
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/c38/trac
- name = "speed loader (.38 TRAC)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These TRAC rounds do pitiful damage, but embed a tracking device in targets hit."
- ammo_type = /obj/item/ammo_casing/c38/trac
-
-/obj/item/ammo_box/c38/match
- name = "speed loader (.38 match)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
- ammo_type = /obj/item/ammo_casing/c38/match
-
-/obj/item/ammo_box/c38/match/bouncy
- name = "speed loader (.38 rubber)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with."
- ammo_type = /obj/item/ammo_casing/c38/match/bouncy
-
-/obj/item/ammo_box/c38/dumdum
- name = "speed loader (.38 dum-dum)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These dum-dum bullets shatter on impact and embed in the target's innards. However, they're nearly ineffective against armor and do okay damage."
- ammo_type = /obj/item/ammo_casing/c38/dumdum
-
-/obj/item/ammo_box/c38/hotshot
- name = "speed loader (.38 hearth)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hearthwine bullets contain an incendiary payload that set targets alight."
- ammo_type = /obj/item/ammo_casing/c38/hotshot
-
-/obj/item/ammo_box/c38/iceblox
- name = "speed loader (.38 chilled)"
- desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These icewine bullets contain a cryogenic payload that chills targets."
- ammo_type = /obj/item/ammo_casing/c38/iceblox
-
-/obj/item/ammo_box/c38/empty
- start_empty = TRUE
-
-// 8x58mm Stripper Clip (SSG-669C)
-
-/obj/item/ammo_box/a858
- name = "stripper clip (8x58mm)"
- desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration."
- icon_state = "enbloc_858"
- ammo_type = /obj/item/ammo_casing/caseless/a858
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- instant_load = TRUE
-
-/obj/item/ammo_box/a858/empty
- start_empty = TRUE
-
-// .308 Stripper Clip (Vickland)
-
-/obj/item/ammo_box/vickland_a308
- name = "stripper clip (.308)"
- desc = "A 5-round stripper clip for the Vickland Battle Rifle. The Vickland itself has a 10 round capacity, so keep in mind two of these are needed to fully reload it. These rounds do good damage with significant armor penetration."
- icon_state = "stripper_308-5"
- base_icon_state = "stripper_308"
- ammo_type = /obj/item/ammo_casing/a308
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/vickland_a308/empty
- start_empty = TRUE
-
-// .300 Magnum Stripper Clip (Scout)
-
-/obj/item/ammo_box/a300
- name = "stripper clip (.300 Magnum)"
- desc = "A 5-round stripper clip for the Scout Rifle. These rounds do great damage with significant armor penetration."
- icon_state = "300m"
- ammo_type = /obj/item/ammo_casing/a300
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a300/empty
- start_empty = TRUE
-// 7.62 Stripper Clip (Polymer Survivor Rifle)
-
-/obj/item/ammo_box/a762_stripper
- name = "stripper clip (7.62)"
- desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration."
- icon_state = "stripper_308-5"
- base_icon_state = "stripper_308"
- ammo_type = /obj/item/ammo_casing/a762_40
- caliber = "7.62x40mm"
- max_ammo = 5
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a762_stripper/empty
- start_empty = TRUE
-// Ferromagnetic Pellet Speed Loader (Claris)
-
-/obj/item/ammo_box/amagpellet_claris
- name = "\improper Claris speed loader (ferromagnetic pellet)"
- desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration."
- icon_state = "claris-sl-1"
- base_icon_state = "claris-sl"
- ammo_type = /obj/item/ammo_casing/caseless/gauss
- max_ammo = 22
- multiple_sprites = AMMO_BOX_FULL_EMPTY
- item_flags = NO_MAT_REDEMPTION
- instant_load = TRUE
-
-// Ammo Boxes
-
-/obj/item/ammo_box/c38_box
- name = "ammo box (.38)"
- desc = "A box of standard .38 Special ammo."
- icon_state = "38box"
- ammo_type = /obj/item/ammo_casing/c38
- max_ammo = 50
-
-/obj/item/ammo_box/c38_box/surplus
- name = "ammo box (.38 surplus)"
- desc = "A box of low-quality .38 Special ammo."
- icon_state = "38box-surplus"
- ammo_type = /obj/item/ammo_casing/c38/surplus
-
-/obj/item/ammo_box/c38_box/hotshot
- name = "ammo box (.38 hearth)"
- desc = "An unorthodox .38 Special cartridge infused with hearthwine. Catches the target on fire."
- icon_state = "38hotshot"
- ammo_type = /obj/item/ammo_casing/c38/hotshot
-
-/obj/item/ammo_box/c38_box/iceblox
- name = "ammo box (.38 chilled)"
- desc = "An unorthodox .38 Special cartridge infused with icewine. Chills the target, slowing them down."
- icon_state = "38iceblox"
- ammo_type = /obj/item/ammo_casing/c38/iceblox
-
-/obj/item/ammo_box/a12g
- name = "ammo box (12g buckshot)"
- desc = "A box of 12-gauge buckshot shells, devastating at close range."
- icon_state = "12gbox-buckshot"
- ammo_type = /obj/item/ammo_casing/shotgun/buckshot
- max_ammo = 25
-
-/obj/item/ammo_box/a12g/slug
- name = "ammo box (12g slug)"
- desc = "A box of 12-gauge slugs, for improved accuracy and penetration."
- icon_state = "12gbox-slug"
- ammo_type = /obj/item/ammo_casing/shotgun
-
-/obj/item/ammo_box/a12g/beanbag
- name = "ammo box (12g beanbag)"
- desc = "A box of 12-gauge beanbag shells, for incapacitating targets."
- icon_state = "12gbox-beanbag"
- ammo_type = /obj/item/ammo_casing/shotgun/beanbag
-
-/obj/item/ammo_box/a12g/rubbershot
- name = "ammo box (12g rubbershot)"
- desc = "A box of 12-gauge rubbershot shells, designed for riot control."
- icon_state = "12gbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
-
-/obj/item/ammo_box/a12g/blanks
- name = "ammo box (12g blanks)"
- desc = "A box of 12-gauge blank shells, designed for training."
- icon_state ="12gbox-slug"
- ammo_type = /obj/item/ammo_casing/shotgun/blank
-
-/obj/item/ammo_box/c9mm
- name = "ammo box (9mm)"
- desc = "A box of standard 9mm ammo."
- icon_state = "9mmbox"
- ammo_type = /obj/item/ammo_casing/c9mm
- max_ammo = 50
-
-/obj/item/ammo_box/c9mm/surplus
- name = "ammo box (9mm surplus)"
- desc = "A box of low-quality 9mm ammo."
- icon_state = "9mmbox-surplus"
- ammo_type = /obj/item/ammo_casing/c9mm/surplus
-
-/obj/item/ammo_box/c9mm/rubbershot
- name = "ammo box (9mm rubbershot)"
- desc = "A box of 9mm rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "9mmbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/c9mm/rubber
-
-/obj/item/ammo_box/c9mm/ap
- name = "ammo box (9mm armor-piercing)"
- desc = "A box of 9mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "9mmbox-ap"
- ammo_type = /obj/item/ammo_casing/c9mm/ap
-
-/obj/item/ammo_box/c9mm/hp
- name = "ammo box (9mm hollow point)"
- desc = "A box of 9mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "9mmbox-hp"
- ammo_type = /obj/item/ammo_casing/c9mm/hp
-
-/obj/item/ammo_box/c9mm/fire
- name = "ammo box (9mm incendiary)"
- desc = "A box of 9mm incendiary ammo, designed to ignite targets at the cost of initial damage."
- icon_state = "9mmbox-incendiary"
- ammo_type = /obj/item/ammo_casing/c9mm/inc
-
-/obj/item/ammo_box/c10mm
- name = "ammo box (10mm)"
- desc = "A box of standard 10mm ammo."
- icon_state = "10mmbox"
- ammo_type = /obj/item/ammo_casing/c10mm
- max_ammo = 50
-
-/obj/item/ammo_box/c10mm/surplus
- name = "ammo box (10mm surplus)"
- desc = "A box of low-quality 10mm ammo."
- icon_state = "10mmbox-surplus"
- ammo_type = /obj/item/ammo_casing/c10mm/surplus
-
-/obj/item/ammo_box/c10mm/rubbershot
- name = "ammo box (10mm rubbershot)"
- desc = "A box of 10mm rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "10mmbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/c10mm/rubber
-
-/obj/item/ammo_box/c10mm/ap
- name = "ammo box (10mm armor-piercing)"
- desc = "A box of 10mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "10mmbox-ap"
- ammo_type = /obj/item/ammo_casing/c10mm/ap
-
-/obj/item/ammo_box/c10mm/hp
- name = "ammo box (10mm hollow point)"
- desc = "A box of 10mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "10mmbox-hp"
- ammo_type = /obj/item/ammo_casing/c10mm/hp
-
-/obj/item/ammo_box/c10mm/fire
- name = "ammo box (10mm incendiary)"
- desc = "A box of 10mm incendiary ammo, designed to ignite targets at the cost of initial damage."
- icon_state = "10mmbox-incendiary"
- ammo_type = /obj/item/ammo_casing/c10mm/inc
-
-/obj/item/ammo_box/c45
- name = "ammo box (.45)"
- desc = "A box of standard .45 ammo."
- icon_state = "45box"
- ammo_type = /obj/item/ammo_casing/c45
- max_ammo = 50
-
-/obj/item/ammo_box/c45/surplus
- name = "ammo box (.45 surplus)"
- desc = "A box of low-quality .45 ammo."
- icon_state = "45box-surplus"
- ammo_type = /obj/item/ammo_casing/c45/surplus
-
-/obj/item/ammo_box/c45/rubbershot
- name = "ammo box (.45 rubbershot)"
- desc = "A box of .45 rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "45box-rubbershot"
- ammo_type = /obj/item/ammo_casing/c45/rubber
-
-/obj/item/ammo_box/c45/ap
- name = "ammo box (.45 armor-piercing)"
- desc = "A box of .45 armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "45box-ap"
- ammo_type = /obj/item/ammo_casing/c45/ap
-
-/obj/item/ammo_box/c45/hp
- name = "ammo box (.45 hollow point)"
- desc = "A box of .45 hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "45box-hp"
- ammo_type = /obj/item/ammo_casing/c45/hp
-
-/obj/item/ammo_box/c45/fire
- name = "ammo box (.45 incendiary)"
- desc = "A box of .45 incendiary ammo, designed to ignite targets at the cost of initial damage."
- icon_state = "45box-incendiary"
- ammo_type = /obj/item/ammo_casing/c45/inc
-
-/obj/item/ammo_box/c556mmHITP
- name = "ammo box (5.56mm HITP caseless)"
- desc = "A box of 5.56mm HITP caseless ammo, a SolGov standard."
- icon_state = "556mmHITPbox"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm
- max_ammo = 50
-
-/obj/item/ammo_box/c556mmHITP/surplus
- name = "ammo box (5.56mm HITP caseless surplus)"
- desc = "A box of low-quality 5.56mm HITP caseless ammo."
- icon_state = "556mmHITPbox-surplus"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/surplus
-
-/obj/item/ammo_box/c556mmHITP/rubbershot
- name = "ammo box (5.56mm HITP caseless rubbershot)"
- desc = "A box of 5.56mm HITP caseless rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "556mmHITPbox-rubbershot"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/rubbershot
-
-/obj/item/ammo_box/c556mmHITP/ap
- name = "ammo box (5.56mm HITP caseless armor-piercing)"
- desc = "A box of 5.56mm HITP caseless armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
- icon_state = "556mmHITPbox-ap"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/ap
-
-/obj/item/ammo_box/c556mmHITP/hp
- name = "ammo box (5.56mm HITP caseless hollow point)"
- desc = "A box of 5.56mm HITP caseless hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
- icon_state = "556mmHITPbox-hp"
- ammo_type = /obj/item/ammo_casing/caseless/c556mm/hp
-
-/obj/item/ammo_box/a40mm
- name = "ammo box (40mm grenades)"
- icon_state = "40mm"
- ammo_type = /obj/item/ammo_casing/a40mm
- max_ammo = 4
- multiple_sprites = AMMO_BOX_PER_BULLET
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/a762_40
- name = "ammo box (7.62x40mm CLIP)"
- icon_state = "a762_40box_big"
- ammo_type = /obj/item/ammo_casing/a762_40
- max_ammo = 120
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/a762_40/inteq
- icon_state = "a762_40box_big_inteq"
-
-/obj/item/ammo_box/a556_42
- name = "ammo box (5.56x42mm CLIP)"
- icon_state = "a556_42box_big"
- ammo_type = /obj/item/ammo_casing/a556_42
- max_ammo = 120
- w_class = WEIGHT_CLASS_NORMAL
-
-/obj/item/ammo_box/a308
- name = "ammo box (.308)"
- icon_state = "a308box"
- ammo_type = /obj/item/ammo_casing/a308
- max_ammo = 30
-
-/obj/item/ammo_box/a308/hunterspride //just an alternative graphic for srm ships
- icon_state = "a308box-HP"
-
-/obj/item/ammo_box/foambox
- name = "ammo box (Foam Darts)"
- icon = 'icons/obj/guns/toy.dmi'
- icon_state = "foambox"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart
- max_ammo = 40
- custom_materials = list(/datum/material/iron = 500)
-
-/obj/item/ammo_box/foambox/riot
- icon_state = "foambox_riot"
- ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
- custom_materials = list(/datum/material/iron = 50000)
-
-/obj/item/ammo_box/c22lr_box
- name = "ammo box (.22 LR)"
- desc = "A box of standard .22 LR ammo."
- icon_state = "22lrbox"
- ammo_type = /obj/item/ammo_casing/c22lr
- max_ammo = 75
-
-/obj/item/ammo_box/a44roum_speedloader
- name = "speed loader (.44)"
- desc = "Designed to quickly reload revolvers."
- icon_state = "speedloader_38-6"
- base_icon_state = "speedloader_38"
- ammo_type = /obj/item/ammo_casing/a44roum
- caliber = ".44 Roumain"
- max_ammo = 6
- multiple_sprites = AMMO_BOX_PER_BULLET
- custom_materials = list(/datum/material/iron = 15000)
- w_class = WEIGHT_CLASS_TINY
- instant_load = TRUE
-
-/obj/item/ammo_box/a44roum_speedloader/empty
- start_empty = TRUE
-
-/obj/item/ammo_box/c57x39mm_box
- name = "ammo box (5.7x39mm)"
- desc = "A box of standard 5.7x39mm ammo."
- icon_state = "57x39mmbox"
- ammo_type = /obj/item/ammo_casing/c57x39mm
- max_ammo = 50
-
-
-/obj/item/ammo_box/c46x30mm_box
- name = "ammo box (4.6x30mm)"
- desc = "A box of standard 4.6x30mm ammo."
- icon_state = "46x30mmbox"
- ammo_type = /obj/item/ammo_casing/c46x30mm
- max_ammo = 50
-
-/obj/item/ammo_box/c8x50mm_box
- name = "ammo box (8x50mm)"
- desc = "A box of standard 8x50mm ammo."
- icon_state = "8x50mmbox"
- ammo_type = /obj/item/ammo_casing/a8_50r
- max_ammo = 25
-
-/obj/item/ammo_box/ferropelletbox
- name = "ammo box (ferromagnetic pellets)"
- desc = "A box of ferromagnetic pellets."
- icon_state = "ferropelletsbox"
- ammo_type = /obj/item/ammo_casing/caseless/gauss
- max_ammo = 50
-
-/obj/item/ammo_box/ferroslugbox
- name = "ammo box (ferromagnetic slugs)"
- desc = "A box of standard ferromagnetic slugs."
- icon_state = "ferroslugsbox"
- ammo_type = /obj/item/ammo_casing/caseless/gauss/slug
- max_ammo = 20
-
-/obj/item/ammo_box/ferrolancebox
- name = "ammo box (ferromagnetic lances)"
- desc = "A box of standard ferromagnetic lances."
- icon_state = "ferrolancesbox"
- ammo_type = /obj/item/ammo_casing/caseless/gauss/lance
- max_ammo = 50
-
-/obj/item/ammo_box/c8x50mmhp_box
- name = "ammo box (8x50mm)"
- desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration."
- icon_state = "8x50mmbox-hp"
- ammo_type = /obj/item/ammo_casing/a8_50rhp
- max_ammo = 20
-
-/obj/item/ammo_box/a300_box
- name = "ammo box (.300 Magnum)"
- desc = "A box of standard .300 Magnum ammo."
- icon_state = "300box"
- ammo_type = /obj/item/ammo_casing/a300
- max_ammo = 20
-
-/obj/item/ammo_box/a65clip_box
- name = "ammo box (6.5x57mm CLIP)"
- desc = "A box of standard 6.5x57mm CLIP ammo."
- icon_state = "65box"
- ammo_type = /obj/item/ammo_casing/a65clip
- max_ammo = 20
-
-/obj/item/ammo_box/a65clip_box/syndicate
- icon_state = "65box_sa"
-
-/obj/item/ammo_box/a44roum
- name = "ammo box (.44 roumain)"
- desc = "A box of standard .44 roumain ammo."
- icon_state = "a44roum"
- ammo_type = /obj/item/ammo_casing/a44roum
- max_ammo = 50
-
-/obj/item/ammo_box/a44roum/rubber
- name = "ammo box (.44 roumain rubber)"
- desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
- icon_state = "a44roum-rubber"
- ammo_type = /obj/item/ammo_casing/a44roum/rubber
- max_ammo = 50
-
-/obj/item/ammo_box/a44roum/hp
- name = "ammo box (.44 roumain hollow point)"
- desc = "A box of .44 roumain hollow point ammo, designed to cause massive damage at the cost of armor penetration."
- icon_state = "a44roum-hp"
- ammo_type = /obj/item/ammo_casing/a44roum/hp
- max_ammo = 50
-
-/obj/item/ammo_box/c299
- name = "ammo box (.299 Eoehoma caseless)"
- desc = "A box of .299 Eoehoma caseless, for use with the E-40 hybrid assault rifle."
- icon_state = "299box"
- ammo_type = /obj/item/ammo_casing/caseless/c299
- max_ammo = 120
- w_class = WEIGHT_CLASS_NORMAL // This is a lot of ammo
diff --git a/code/modules/projectiles/boxes_magazines/ammo_loaders.dm b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm
new file mode 100644
index 000000000000..70d9480493c6
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm
@@ -0,0 +1,176 @@
+// .357 Speed Loaders
+
+/obj/item/ammo_box/a357
+ name = "speed loader (.357)"
+ desc = "A 6-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor."
+ icon_state = "speedloader_357-6"
+ base_icon_state = "speedloader_357"
+ ammo_type = /obj/item/ammo_casing/a357
+ caliber = ".357"
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ item_flags = NO_MAT_REDEMPTION
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a357/empty
+ start_empty = TRUE
+
+/obj/item/ammo_box/a357/match
+ name = "speed loader (.357 match)"
+ desc = "A 6-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
+ ammo_type = /obj/item/ammo_casing/a357/match
+
+/obj/item/ammo_box/a357/hp
+ name = "speed loader (.357 hollow point)"
+ desc = "A 6-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones."
+ ammo_type = /obj/item/ammo_casing/a357/hp
+
+// .38 special Speed Loaders
+
+/obj/item/ammo_box/c38
+ name = "speed loader (.38 special)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do okay damage, but struggle against armor."
+ icon_state = "speedloader_38-6"
+ base_icon_state = "speedloader_38"
+ ammo_type = /obj/item/ammo_casing/c38
+ caliber = ".38"
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ custom_materials = list(/datum/material/iron = 15000)
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/c38/trac
+ name = "speed loader (.38 TRAC)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These TRAC rounds do pitiful damage, but embed a tracking device in targets hit."
+ ammo_type = /obj/item/ammo_casing/c38/trac
+
+/obj/item/ammo_box/c38/match
+ name = "speed loader (.38 match)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
+ ammo_type = /obj/item/ammo_casing/c38/match
+
+/obj/item/ammo_box/c38/match/bouncy
+ name = "speed loader (.38 rubber)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with."
+ ammo_type = /obj/item/ammo_casing/c38/match/bouncy
+
+/obj/item/ammo_box/c38/dumdum
+ name = "speed loader (.38 dum-dum)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These dum-dum bullets shatter on impact and embed in the target's innards. However, they're nearly ineffective against armor and do okay damage."
+ ammo_type = /obj/item/ammo_casing/c38/dumdum
+
+/obj/item/ammo_box/c38/hotshot
+ name = "speed loader (.38 hot shot)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hot shot bullets contain an incendiary payload that set targets alight."
+ ammo_type = /obj/item/ammo_casing/c38/hotshot
+
+/obj/item/ammo_box/c38/iceblox
+ name = "speed loader (.38 iceblox)"
+ desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These iceblox bullets contain a cryogenic payload that chills targets."
+ ammo_type = /obj/item/ammo_casing/c38/iceblox
+
+/obj/item/ammo_box/c38/empty
+ start_empty = TRUE
+
+// 8x58mm Stripper Clip
+
+/obj/item/ammo_box/a858
+ name = "stripper clip (8x58mm)"
+ desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration."
+ icon_state = "enbloc_858"
+ ammo_type = /obj/item/ammo_casing/caseless/a858
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ instant_load = TRUE
+
+/obj/item/ammo_box/a858/empty
+ start_empty = TRUE
+
+// .308 Stripper Clip
+
+/obj/item/ammo_box/vickland_a308
+ name = "stripper clip (.308)"
+ desc = "A 5-round stripper clip for the Vickland Battle Rifle. The Vickland itself has a 10 round capacity, so keep in mind two of these are needed to fully reload it. These rounds do good damage with significant armor penetration."
+ icon_state = "stripper_308-5"
+ base_icon_state = "stripper_308"
+ ammo_type = /obj/item/ammo_casing/a308
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/vickland_a308/empty
+ start_empty = TRUE
+
+// .300 Magnum Stripper Clip
+
+/obj/item/ammo_box/a300
+ name = "stripper clip (.300 Magnum)"
+ desc = "A 5-round stripper clip for the Scout Rifle. These rounds do great damage with significant armor penetration."
+ icon_state = "300m"
+ ammo_type = /obj/item/ammo_casing/a300
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a300/empty
+ start_empty = TRUE
+
+// .300 Blackout Stripper Clip
+
+/obj/item/ammo_box/a762_stripper
+ name = "stripper clip (7.62)"
+ desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration."
+ icon_state = "stripper_308-5"
+ base_icon_state = "stripper_308"
+ ammo_type = /obj/item/ammo_casing/a762_40
+ caliber = "7.62x40mm"
+ max_ammo = 5
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a762_stripper/empty
+ start_empty = TRUE
+
+// Ferromagnetic Pellet Speed Loader
+
+/obj/item/ammo_box/amagpellet_claris
+ name = "\improper Claris speed loader (ferromagnetic pellet)"
+ desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration."
+ icon_state = "claris-sl-1"
+ base_icon_state = "claris-sl"
+ ammo_type = /obj/item/ammo_casing/caseless/gauss
+ max_ammo = 22
+ multiple_sprites = AMMO_BOX_FULL_EMPTY
+ item_flags = NO_MAT_REDEMPTION
+ instant_load = TRUE
+
+/obj/item/ammo_box/a40mm
+ name = "ammo box (40mm grenades)"
+ icon_state = "40mm"
+ ammo_type = /obj/item/ammo_casing/a40mm
+ max_ammo = 4
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ w_class = WEIGHT_CLASS_NORMAL
+
+// .44 Roumain speedloader
+
+/obj/item/ammo_box/a44roum_speedloader
+ name = "speed loader (.44)"
+ desc = "Designed to quickly reload revolvers."
+ icon_state = "speedloader_38-6"
+ base_icon_state = "speedloader_38"
+ ammo_type = /obj/item/ammo_casing/a44roum
+ caliber = ".44 Roumain"
+ max_ammo = 6
+ multiple_sprites = AMMO_BOX_PER_BULLET
+ custom_materials = list(/datum/material/iron = 15000)
+ w_class = WEIGHT_CLASS_TINY
+ instant_load = TRUE
+
+/obj/item/ammo_box/a44roum_speedloader/empty
+ start_empty = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm
new file mode 100644
index 000000000000..f1e84780cb1e
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm
@@ -0,0 +1,82 @@
+/**
+ * The ammo stack object itself, making this a magazine was the easiest way to handle it
+ * Practically every casing type needs an associated ammo stack type, because that was the easiest
+ * way for me to handle it.
+ */
+/obj/item/ammo_box/magazine/ammo_stack
+ name = "ammo stack"
+ desc = "A pile of live rounds."
+ icon = 'icons/obj/ammunition/ammo_bullets.dmi'
+ icon_state = "pistol-brass"
+ base_icon_state = "pistol-brass"
+ item_flags = NO_PIXEL_RANDOM_DROP
+ multiple_sprites = AMMO_BOX_ONE_SPRITE
+ multiload = FALSE
+ start_empty = TRUE
+ max_ammo = 12
+
+/obj/item/ammo_box/magazine/ammo_stack/update_icon(updates)
+ icon = initial(icon)
+ cut_overlays()
+ return ..()
+
+/obj/item/ammo_box/magazine/ammo_stack/update_icon_state()
+ . = ..()
+ cut_overlays()
+ icon_state = ""
+ for(var/casing in stored_ammo)
+ var/image/bullet = image(initial(icon), src, "[base_icon_state]")
+ bullet.pixel_x = rand(-8, 8)
+ bullet.pixel_y = rand(-8, 8)
+ bullet.transform = bullet.transform.Turn(round(45 * rand(0, 32) / 2)) //this is the equation Eris uses on their bullet stacks
+ add_overlay(bullet)
+ return UPDATE_ICON_STATE | UPDATE_OVERLAYS
+
+/obj/item/ammo_box/magazine/ammo_stack/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
+ . = ..()
+ var/loc_before_del = loc
+ while(LAZYLEN(stored_ammo))
+ var/obj/item/ammo = get_round(FALSE)
+ ammo.forceMove(loc_before_del)
+ ammo.throw_at(loc_before_del)
+ update_ammo_count()
+
+/obj/item/ammo_box/magazine/ammo_stack/update_ammo_count()
+ . = ..()
+ check_for_del()
+
+/obj/item/ammo_box/magazine/ammo_stack/proc/check_for_del()
+ . = FALSE
+ if((ammo_count() <= 0) && !QDELETED(src))
+ qdel(src)
+ return
+
+/obj/item/ammo_box/magazine/ammo_stack/attackby(obj/item/handful, mob/user, params, silent = FALSE, replace_spent = 0)
+ var/num_loaded = 0
+ if(!can_load(user))
+ return
+
+ if(istype(handful, /obj/item/ammo_box))
+ var/obj/item/ammo_box/ammo_box = handful
+ for(var/obj/item/ammo_casing/casing in ammo_box.stored_ammo)
+ var/did_load = give_round(casing, replace_spent)
+ if(did_load)
+ ammo_box.stored_ammo -= casing
+ num_loaded++
+ if(!did_load || !multiload)
+ break
+ if(num_loaded)
+ ammo_box.update_ammo_count()
+
+ if(istype(handful, /obj/item/ammo_casing))
+ var/obj/item/ammo_casing/casing = handful
+ if(give_round(casing, replace_spent))
+ user.transferItemToLoc(casing, src, TRUE)
+ num_loaded++
+ casing.update_appearance()
+
+ if(num_loaded)
+ if(!silent)
+ to_chat(user, span_notice("You load [num_loaded] shell\s into \the [src]!"))
+ playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE)
+ update_ammo_count()
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm
new file mode 100644
index 000000000000..8a28920efe6a
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm
@@ -0,0 +1,21 @@
+/obj/item/ammo_box/magazine/ammo_stack/prefilled
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/Initialize(mapload)
+ make_stack()
+ update_appearance()
+ . = ..()
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/proc/make_stack()
+ var/obj/item/ammo_casing/to_copy = ammo_type
+ src.top_off()
+ caliber = to_copy.caliber
+ base_icon_state = "[initial(to_copy.icon_state)][to_copy.bullet_skin ? "-[to_copy.bullet_skin]" : ""]"
+ name = "handful of [to_copy.name]s"
+
+/obj/item/storage/box/ammo //base type, don't use this!
+ name = "box of default ammo"
+ desc = "A box of ammunition. Not for consumption."
+ icon = 'icons/obj/ammunition/ammo_boxes.dmi'
+ icon_state = "9mmbox"
+ illustration = null
+ foldable = null
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm
new file mode 100644
index 000000000000..ac82cf6bcebd
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm
@@ -0,0 +1,41 @@
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet
+ ammo_type = /obj/item/ammo_casing/caseless/gauss
+
+/obj/item/storage/box/ammo/ferropellet
+ name = "box of ferromagnetic pellets"
+ desc = "A box of ferromagnetic pellets for gauss firearms."
+ icon_state = "ferropelletsbox"
+
+/obj/item/storage/box/ammo/ferropellet/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug
+ ammo_type = /obj/item/ammo_casing/caseless/gauss/slug
+
+/obj/item/storage/box/ammo/ferroslug
+ name = "box of ferromagnetic slugs"
+ desc = "A box of standard ferromagnetic slugs for gauss firearms."
+ icon_state = "ferroslugsbox"
+
+/obj/item/storage/box/ammo/ferroslug/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance
+ ammo_type = /obj/item/ammo_casing/caseless/gauss/lance
+
+/obj/item/storage/box/ammo/ferrolance
+ name = "box of ferromagnetic lances"
+ desc = "A box of standard ferromagnetic lances for gauss firearms."
+ icon_state = "ferrolancesbox"
+
+/obj/item/storage/box/ammo/ferrolance/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm
new file mode 100644
index 000000000000..b98da1f81000
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm
@@ -0,0 +1,15 @@
+// 7.12x82mm (L6 SAW)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82
+ ammo_type = /obj/item/ammo_casing/mm712x82
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/ap
+ ammo_type = /obj/item/ammo_casing/mm712x82/ap
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/hp
+ ammo_type = /obj/item/ammo_casing/mm712x82/hp
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/incendiary
+ ammo_type = /obj/item/ammo_casing/mm712x82/inc
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/match
+ ammo_type = /obj/item/ammo_casing/mm712x82/match
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm
new file mode 100644
index 000000000000..a24599138238
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm
@@ -0,0 +1,26 @@
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart
+
+/obj/item/storage/box/ammo/foam_darts
+ name = "box of foam darts"
+ icon = 'icons/obj/guns/toy.dmi'
+ icon_state = "foambox"
+
+/obj/item/storage/box/ammo/foam_darts/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts/riot
+ ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
+
+/obj/item/storage/box/ammo/foam_darts/riot
+ name = "box of foam darts"
+ icon_state = "foambox_riot"
+
+/obj/item/storage/box/ammo/foam_darts/riot/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts/riot = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm
new file mode 100644
index 000000000000..68ea1a7faeb5
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm
@@ -0,0 +1,499 @@
+// 10mm (Stechkin)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm
+ ammo_type = /obj/item/ammo_casing/c10mm
+
+/obj/item/storage/box/ammo/c10mm
+ name = "box of 10mm ammo"
+ desc = "A box of standard 10mm ammo."
+ icon_state = "10mmbox"
+
+/obj/item/storage/box/ammo/c10mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/surplus
+ ammo_type = /obj/item/ammo_casing/c10mm/surplus
+
+/obj/item/storage/box/ammo/c10mm_surplus
+ name = "box of surplus 10mm ammo"
+ desc = "A box of low-quality 10mm ammo."
+ icon_state = "10mmbox-surplus"
+
+/obj/item/storage/box/ammo/c10mm_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/ap
+ ammo_type = /obj/item/ammo_casing/c10mm/ap
+
+/obj/item/storage/box/ammo/c10mm_ap
+ name = "box of AP 10mm ammo"
+ desc = "A box of 10mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "10mmbox-ap"
+
+/obj/item/storage/box/ammo/c10mm_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/hp
+ ammo_type = /obj/item/ammo_casing/c10mm/hp
+
+/obj/item/storage/box/ammo/c10mm_hp
+ name = "box of HP 10mm ammo"
+ desc = "A box of 10mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "10mmbox-hp"
+
+/obj/item/storage/box/ammo/c10mm_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/incendiary
+ ammo_type = /obj/item/ammo_casing/c10mm/inc
+
+/obj/item/storage/box/ammo/c10mm_incendiary
+ name = "box of incendiary 10mm ammo"
+ desc = "A box of 10mm incendiary ammo, designed to ignite targets at the cost of initial damage."
+ icon_state = "10mmbox-incendiary"
+
+/obj/item/storage/box/ammo/c10mm_incendiary/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/incendiary = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/rubber
+ ammo_type = /obj/item/ammo_casing/c10mm/rubber
+
+/obj/item/storage/box/ammo/c10mm_rubber
+ name = "box of rubber 10mm ammo"
+ desc = "A box of 10mm rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "10mmbox-rubbershot"
+
+/obj/item/storage/box/ammo/c10mm_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+// 9MM (Commander + SABR)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm
+ ammo_type = /obj/item/ammo_casing/c9mm
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/c9mm
+ name = "box of 9mm ammo"
+ desc = "A box of standard 9mm ammo."
+ icon_state = "9mmbox"
+
+/obj/item/storage/box/ammo/c9mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/surplus
+ ammo_type = /obj/item/ammo_casing/c9mm/surplus
+
+/obj/item/storage/box/ammo/c9mm_surplus
+ name = "box of surplus 9mm ammo"
+ desc = "A box of low-quality 9mm ammo."
+ icon_state = "9mmbox-surplus"
+
+/obj/item/storage/box/ammo/c9mm_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/surplus = 48)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm_ap
+ ammo_type = /obj/item/ammo_casing/c9mm/ap
+
+/obj/item/storage/box/ammo/c9mm/ap
+ name = "box of AP 9mm ammo"
+ desc = "A box of 9mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "9mmbox-ap"
+
+/obj/item/storage/box/ammo/c9mm_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm_ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/hp
+ ammo_type = /obj/item/ammo_casing/c9mm/hp
+
+/obj/item/storage/box/ammo/c9mm_hp
+ name = "box of HP 9mm ammo"
+ desc = "A box of 9mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "9mmbox-hp"
+
+/obj/item/storage/box/ammo/c9mm_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/incendiary
+ ammo_type = /obj/item/ammo_casing/c9mm/inc
+
+/obj/item/storage/box/ammo/c9mm_incendiary
+ name = "box of incendiary 9mm ammo"
+ desc = "A box of 9mm incendiary ammo, designed to ignite targets at the cost of initial damage."
+ icon_state = "9mmbox-incendiary"
+
+/obj/item/storage/box/ammo/c9mm_incendiary/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/incendiary = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/rubber
+ ammo_type = /obj/item/ammo_casing/c9mm/rubber
+
+/obj/item/storage/box/ammo/c9mm_rubber
+ name = "box of rubber 9mm ammo"
+ desc = "A box of 9mm rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "9mmbox-rubbershot"
+
+/obj/item/storage/box/ammo/c9mm_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+// .45 (Candor + C20R)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45
+ ammo_type = /obj/item/ammo_casing/c45
+
+/obj/item/storage/box/ammo/c45
+ name = "box of .45 ammo"
+ desc = "A box of standard .45 ammo."
+ icon_state = "45box"
+
+/obj/item/storage/box/ammo/c45/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/surplus
+ ammo_type = /obj/item/ammo_casing/c45/surplus
+
+/obj/item/storage/box/ammo/c45_surplus
+ name = "box of surplus .45 ammo"
+ desc = "A box of low-quality .45 ammo."
+ icon_state = "45box-surplus"
+
+/obj/item/storage/box/ammo/c45_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/surplus = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/ap
+ ammo_type = /obj/item/ammo_casing/c45/ap
+
+/obj/item/storage/box/ammo/c45_ap
+ name = "box of AP .45 ammo"
+ desc = "A box of .45 armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "45box-ap"
+
+/obj/item/storage/box/ammo/c45_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/hp
+ ammo_type = /obj/item/ammo_casing/c45/hp
+
+/obj/item/storage/box/ammo/c45_hp
+ name = "box of HP .45 ammo"
+ desc = "A box of .45 hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "45box-hp"
+
+/obj/item/storage/box/ammo/c45_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/incendiary
+ ammo_type = /obj/item/ammo_casing/c45/inc
+
+/obj/item/storage/box/ammo/c45_incendiary
+ name = "box of incendiary .45 ammo"
+ desc = "A box of .45 incendiary ammo, designed to ignite targets at the cost of initial damage."
+ icon_state = "45box-incendiary"
+
+/obj/item/storage/box/ammo/c45_incendiary/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/incendiary = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/rubber
+ ammo_type = /obj/item/ammo_casing/c45/rubber
+
+/obj/item/storage/box/ammo/c45_rubber
+ name = "box of incendiary .45 ammo"
+ desc = "A box of .45 rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "45box-rubbershot"
+
+/obj/item/storage/box/ammo/c45_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+// .50 AE (Desert Eagle)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a50AE
+ ammo_type = /obj/item/ammo_casing/a50AE
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a50AE/hp
+ ammo_type = /obj/item/ammo_casing/a50AE/hp
+
+// .22 LR (Himehabu, Pounder)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c22lr
+ ammo_type = /obj/item/ammo_casing/c22lr
+
+/obj/item/storage/box/ammo/c22lr
+ name = "box of .22 LR ammo"
+ desc = "A box of standard .22 LR ammo."
+ icon_state = "22lrbox"
+
+/obj/item/storage/box/ammo/c22lr/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c22lr = 4)
+ generate_items_inside(items_inside,src)
+
+// .357
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357
+ ammo_type = /obj/item/ammo_casing/a357
+
+/obj/item/storage/box/ammo/a357
+ name = "box of .357 ammo"
+ desc = "A box of standard .357 ammo."
+ icon_state = "357box"
+
+/obj/item/storage/box/ammo/a357/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/match
+ ammo_type = /obj/item/ammo_casing/a357/match
+
+/obj/item/storage/box/ammo/a357_match
+ name = "box of match .357 ammo"
+ desc = "A box of match .357 ammo."
+ icon_state = "357box-match"
+
+/obj/item/storage/box/ammo/a357_match/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/match = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/hp
+ ammo_type = /obj/item/ammo_casing/a357/hp
+
+/obj/item/storage/box/ammo/a357_hp
+ name = "box of HP .357 ammo"
+ desc = "A box of hollow point .357 ammo."
+ icon_state = "357box-hp"
+
+/obj/item/storage/box/ammo/a357_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/hp = 4)
+ generate_items_inside(items_inside,src)
+
+// .45-70 (Hunting Revolver, Beacon)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570
+ ammo_type = /obj/item/ammo_casing/a4570
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/a4570
+ name = "box of .45-70 ammo"
+ desc = "A box of top grade .45-70 ammo. These rounds do significant damage with average performance against armor."
+ icon_state = "4570"
+
+/obj/item/storage/box/ammo/a4570/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/match
+ ammo_type = /obj/item/ammo_casing/a4570/match
+
+/obj/item/storage/box/ammo/a4570_match
+ name = "box of HP match .45-70 ammo"
+ desc = "A 12-round ammo box for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets."
+ icon_state = "4570-match"
+
+/obj/item/storage/box/ammo/a4570_match/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/match = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/hp
+ ammo_type = /obj/item/ammo_casing/a4570/hp
+
+/obj/item/storage/box/ammo/a4570_hp
+ name = "box of HP .45-70 ammo"
+ desc = "A 12-round ammo box for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones."
+ icon_state = "4570-hp"
+
+/obj/item/storage/box/ammo/a4570_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/explosive
+ ammo_type = /obj/item/ammo_casing/a4570/explosive
+
+/obj/item/storage/box/ammo/a4570_explosive
+ name = "box of explosive .45-70 ammo"
+ desc = "A 12-round ammo box for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs."
+ icon_state = "4570-explosive"
+
+/obj/item/storage/box/ammo/a4570_explosive/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/explosive = 4)
+ generate_items_inside(items_inside,src)
+
+// .38 Special
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38
+ ammo_type = /obj/item/ammo_casing/c38
+
+/obj/item/storage/box/ammo/c38
+ name = "box of .38 ammo"
+ desc = "A box of standard .38 Special ammo."
+ icon_state = "38box"
+
+/obj/item/storage/box/ammo/c38/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38 = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/surplus
+ ammo_type = /obj/item/ammo_casing/c38/surplus
+
+/obj/item/storage/box/ammo/c38_surplus
+ name = "box of surplus .38 ammo"
+ desc = "A box of low-quality .38 Special ammo."
+ icon_state = "38box-surplus"
+
+/obj/item/storage/box/ammo/c38_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/surplus = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/trac
+ ammo_type = /obj/item/ammo_casing/c38/trac
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/match
+ ammo_type = /obj/item/ammo_casing/c38/match
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/bouncy
+ ammo_type = /obj/item/ammo_casing/c38/match/bouncy
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/dumdum
+ ammo_type = /obj/item/ammo_casing/c38/dumdum
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/hotshot
+ ammo_type = /obj/item/ammo_casing/c38/hotshot
+
+/obj/item/storage/box/ammo/c38_hotshot
+ name = "box of .38 hearth ammo"
+ desc = "An unorthodox .38 Special cartridge infused with hearthwine. Catches the target on fire."
+ icon_state = "38hotshot"
+
+/obj/item/storage/box/ammo/c38_hotshot/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/hotshot = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/iceblox
+ ammo_type = /obj/item/ammo_casing/c38/iceblox
+
+/obj/item/storage/box/ammo/c38_iceblox
+ name = "box of .38 chilled ammo"
+ desc = "An unorthodox .38 Special cartridge infused with icewine. Chills the target, slowing them down."
+ icon_state = "38iceblox"
+
+/obj/item/storage/box/ammo/c38_iceblox/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/iceblox = 4)
+ generate_items_inside(items_inside,src)
+
+// 44 Roumain
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum
+ ammo_type = /obj/item/ammo_casing/a44roum
+
+/obj/item/storage/box/ammo/a44roum
+ name = "box of .44 roumain ammo"
+ desc = "A box of standard .44 roumain ammo."
+ icon_state = "a44roum"
+
+/obj/item/storage/box/ammo/a44roum/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/rubber
+ ammo_type = /obj/item/ammo_casing/a44roum/rubber
+
+/obj/item/storage/box/ammo/a44roum_rubber
+ name = "box of rubber .44 roumain ammo"
+ desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "a44roum-rubber"
+
+/obj/item/storage/box/ammo/a44roum_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/hp
+ ammo_type = /obj/item/ammo_casing/a44roum/hp
+
+/obj/item/storage/box/ammo/a44roum_hp
+ name = "box of HP .44 roumain ammo"
+ desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "a44roum-rubber"
+
+/obj/item/storage/box/ammo/a44roum_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/hp = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm
new file mode 100644
index 000000000000..d22f62ec2165
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm
@@ -0,0 +1,152 @@
+// 8x50mmR (Illestren Hunting Rifle)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r
+ ammo_type = /obj/item/ammo_casing/a8_50r
+ max_ammo = 10
+
+/obj/item/storage/box/ammo/a8_50r
+ name = "box of 8x50mm ammo"
+ desc = "A box of standard 8x50mm ammo."
+ icon_state = "8x50mmbox"
+
+/obj/item/storage/box/ammo/a8_50r/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r/hp
+ ammo_type = /obj/item/ammo_casing/a8_50rhp
+
+/obj/item/storage/box/ammo/a8_50r_hp
+ name = "box of HP 8x50mm ammo"
+ desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration."
+ icon_state = "8x50mmbox-hp"
+
+/obj/item/storage/box/ammo/a8_50r_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r/hp = 4)
+ generate_items_inside(items_inside,src)
+
+// 8x58mm Caseless (SSG-669C)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a858
+ ammo_type = /obj/item/ammo_casing/caseless/a858
+
+// .300 Magnum (Smile Rifle)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a300
+ ammo_type = /obj/item/ammo_casing/a300
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/a300
+ name = "box of .300 magnum ammo"
+ desc = "A box of standard .300 Magnum ammo."
+ icon_state = "300box"
+
+/obj/item/storage/box/ammo/a300/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a300 = 4)
+ generate_items_inside(items_inside,src)
+
+// 5.56x42mm CLIP (CM82, Hydra variants)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a556_42
+ ammo_type = /obj/item/ammo_casing/a556_42
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/a556_42
+ name = "box of 5.56x42mm CLIP ammo"
+ desc = "A box of standard 5.56x42mm CLIP ammo."
+ icon_state = "a556_42box_big"
+
+/obj/item/storage/box/ammo/a556_42/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a556_42 = 4)
+ generate_items_inside(items_inside,src)
+
+// 5.45x39mm (SKM-24v)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a545_39
+ ammo_type = /obj/item/ammo_casing/a545_39
+ max_ammo = 10
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a545_39/recycled
+ ammo_type = /obj/item/ammo_casing/a545_39/recycled
+
+// 7.62x40mm CLIP (SKM Rifles)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a762_40
+ ammo_type = /obj/item/ammo_casing/a762_40
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/a762_40
+ name = "box of 7.62x40mm CLIP ammo"
+ desc = "A box of standard 7.62x40mm CLIP ammo."
+ icon_state = "a762_40box_big"
+
+/obj/item/storage/box/ammo/a762_40/inteq
+ icon_state = "a762_40box_big_inteq"
+
+/obj/item/storage/box/ammo/a762_40/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a762_40 = 4)
+ generate_items_inside(items_inside,src)
+
+//.308 (M514 EBR & CM-GAL-S)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a308
+ ammo_type = /obj/item/ammo_casing/a308
+ max_ammo = 10
+
+/obj/item/storage/box/ammo/a308
+ name = "box of .308 ammo"
+ desc = "A box of standard .308 ammo."
+ icon_state = "a308box"
+
+/obj/item/storage/box/ammo/a308/hunterspride
+ icon_state = "a308box-HP"
+
+/obj/item/storage/box/ammo/a308/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a308 = 4)
+ generate_items_inside(items_inside,src)
+
+//.299 Eoehoma Caseless (E-40)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c299
+ ammo_type = /obj/item/ammo_casing/caseless/c299
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/c299
+ name = "box of .299 Eoehoma caseless ammo"
+ desc = "A box of .299 Eoehoma caseless, for use with the E-40 hybrid assault rifle."
+ icon_state = "299box"
+
+/obj/item/storage/box/ammo/c299/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c299 = 4)
+ generate_items_inside(items_inside,src)
+
+//6.5x57mm CLIP
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/a65clip
+ ammo_type = /obj/item/ammo_casing/a65clip
+ max_ammo = 5
+
+/obj/item/storage/box/ammo/a65clip
+ name = "box of 6.5x57mm CLIP ammo"
+ desc = "A box of standard 6.5x57mm CLIP ammo."
+ icon_state = "65box"
+
+/obj/item/storage/box/ammo/a65clip/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/a65clip = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm
new file mode 100644
index 000000000000..f67800330724
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm
@@ -0,0 +1,79 @@
+// Shotshells
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun
+ max_ammo = 8 //make sure these values are consistent across the board with stack_size variable on respective ammo_casing
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/buckshot
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
+
+/obj/item/storage/box/ammo/a12g_buckshot
+ name = "box of 12ga buckshot"
+ desc = "A box of 12-gauge buckshot shells, devastating at close range."
+ icon_state = "12gbox-buckshot"
+
+/obj/item/storage/box/ammo/a12g_buckshot/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/buckshot = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/slug
+ ammo_type = /obj/item/ammo_casing/shotgun
+
+/obj/item/storage/box/ammo/a12g_slug
+ name = "box of 12ga slugs"
+ desc = "A box of 12-gauge slugs, for improved accuracy and penetration."
+ icon_state = "12gbox-slug"
+
+/obj/item/storage/box/ammo/a12g_slug/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/slug = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/beanbag
+ ammo_type = /obj/item/ammo_casing/shotgun/beanbag
+
+/obj/item/storage/box/ammo/a12g_beanbag
+ name = "box of 12ga beanbags"
+ desc = "A box of 12-gauge beanbag shells, for incapacitating targets."
+ icon_state = "12gbox-beanbag"
+
+/obj/item/storage/box/ammo/a12g_beanbag/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/beanbag = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/rubber
+ ammo_type = /obj/item/ammo_casing/shotgun/rubbershot
+
+/obj/item/storage/box/ammo/a12g_rubbershot
+ name = "box of 12ga beanbags"
+ desc = "A box of 12-gauge rubbershot shells, designed for riot control."
+ icon_state = "12gbox-rubbershot"
+
+/obj/item/storage/box/ammo/a12g_beanbag/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/rubber = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/blank
+ ammo_type = /obj/item/ammo_casing/shotgun/blank
+
+/obj/item/storage/box/ammo/a12g_blank
+ name = "box of 12ga blanks"
+ desc = "A box of 12-gauge blank shells, designed for training."
+ icon_state = "12gbox-slug" //needs icon
+
+/obj/item/storage/box/ammo/a12g_blank/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/blank = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/incendiary
+ ammo_type = /obj/item/ammo_casing/shotgun/incendiary
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/improvised
+ ammo_type = /obj/item/ammo_casing/shotgun/improvised
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm
new file mode 100644
index 000000000000..d550f5e461ba
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm
@@ -0,0 +1,113 @@
+// 4.6x30mm (WT-550 Automatic Rifle & SKM-24v)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm
+ ammo_type = /obj/item/ammo_casing/c46x30mm
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/c46x30mm
+ name = "box of 4.6x30mm ammo"
+ desc = "A box of standard 4.6x30mm ammo."
+ icon_state = "46x30mmbox"
+
+/obj/item/storage/box/ammo/c46x30mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm/ap
+ ammo_type = /obj/item/ammo_casing/c46x30mm/ap
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm/incendiary
+ ammo_type = /obj/item/ammo_casing/c46x30mm/inc
+
+// 4.73x33mm caseless (Solar)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c47x33mm
+ ammo_type = /obj/item/ammo_casing/caseless/c47x33mm
+
+// 5.56mm HITP caseless (Pistole C)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm
+ max_ammo = 15
+
+/obj/item/storage/box/ammo/c556mm
+ name = "box of 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless ammo, a SolGov standard."
+ icon_state = "556mmHITPbox"
+
+/obj/item/storage/box/ammo/c556mm/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/surplus
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/surplus
+
+/obj/item/storage/box/ammo/c556mm_surplus
+ name = "box of surplus 5.56mm HITP caseless ammo"
+ desc = "A box of low-quality 5.56mm HITP caseless ammo."
+ icon_state = "556mmHITPbox-surplus"
+
+/obj/item/storage/box/ammo/c556mm_surplus/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/surplus = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/ap
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/ap
+
+/obj/item/storage/box/ammo/c556mm_ap
+ name = "box of AP 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless armor-piercing ammo, designed to penetrate through armor at the cost of total damage."
+ icon_state = "556mmHITPbox-ap"
+
+/obj/item/storage/box/ammo/c556mm_ap/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/ap = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/hp
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/hp
+
+/obj/item/storage/box/ammo/c556mm_hp
+ name = "box of HP 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration."
+ icon_state = "556mmHITPbox-hp"
+
+/obj/item/storage/box/ammo/c556mm_hp/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/hp = 4)
+ generate_items_inside(items_inside,src)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/rubbershot
+ ammo_type = /obj/item/ammo_casing/caseless/c556mm/rubbershot
+
+/obj/item/storage/box/ammo/c556mm_rubber
+ name = "box of rubber 5.56mm HITP caseless ammo"
+ desc = "A box of 5.56mm HITP caseless rubbershot ammo, designed to disable targets without causing serious damage."
+ icon_state = "556mmHITPbox-rubbershot"
+
+/obj/item/storage/box/ammo/c556mm_rubber/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/rubbershot = 4)
+ generate_items_inside(items_inside,src)
+
+// 5.7x39mm (Asp and Sidewinder)
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/c57x39
+ ammo_type = /obj/item/ammo_casing/c57x39mm
+
+/obj/item/storage/box/ammo/c57x39
+ name = "box of 5.7x39mm ammo"
+ desc = "A box of standard 5.7x39mm ammo."
+ icon_state = "57x39mmbox"
+
+/obj/item/storage/box/ammo/c57x39/PopulateContents()
+ ..()
+ var/static/items_inside = list(
+ /obj/item/ammo_box/magazine/ammo_stack/prefilled/c57x39 = 4)
+ generate_items_inside(items_inside,src)
diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm
new file mode 100644
index 000000000000..8ee54bcd9099
--- /dev/null
+++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm
@@ -0,0 +1,9 @@
+// .50 BMG (Sniper)
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50
+ ammo_type = /obj/item/ammo_casing/p50
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50/soporific
+ ammo_type = /obj/item/ammo_casing/p50/soporific
+
+/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50/penetrator
+ ammo_type = /obj/item/ammo_casing/p50/penetrator
diff --git a/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm b/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm
deleted file mode 100644
index 2c88824623e2..000000000000
--- a/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm
+++ /dev/null
@@ -1,53 +0,0 @@
-/obj/item/ammo_box/generic
- name = "generic ammo box"
- desc = "A generic, unbranded box of ammo. It doesn't have great capacity, but it can hold a variety of different calibers."
- max_ammo = 20
- start_empty = TRUE
- icon_state = "generic-ammo"
- /// Does the box currently have an ammo type set?
- var/ammo_set = FALSE
- /// Name of the currently set ammo type
- var/ammo_name
-
-/obj/item/ammo_box/generic/update_ammo_count()
- . = ..()
- if(LAZYLEN(stored_ammo) == 0)
- ammo_set = FALSE
- ammo_type = /obj/item/ammo_casing
-
-/obj/item/ammo_box/generic/proc/update_max_ammo(obj/item/ammo_casing/ammo)
- if(ammo.bullet_per_box)
- max_ammo = round(ammo.bullet_per_box)
- else
- max_ammo = 10
-
- return
-
-/obj/item/ammo_box/generic/attackby(obj/item/attacking_obj, mob/user, params, silent, replace_spent)
- . = ..()
-
- if(!ammo_set && istype(attacking_obj, /obj/item/ammo_casing))
- var/obj/item/ammo_casing/ammo_load = attacking_obj.type
- ammo_type = ammo_load
- ammo_set = TRUE
- ammo_name = attacking_obj.name
- update_max_ammo(attacking_obj)
- to_chat(user, span_notice("You set the box to hold [attacking_obj]!"))
-
- if(istype(attacking_obj, /obj/item/pen))
- if(!user.is_literate())
- to_chat(user, span_notice("You scribble illegibly on the cover of [src]!"))
- return
- var/inputvalue = stripped_input(user, "What would you like to label the box?", "Box Labelling", "", MAX_NAME_LEN)
-
- if(!inputvalue)
- return
-
- if(user.canUseTopic(src, BE_CLOSE))
- name = "[initial(src.name)][(inputvalue ? " - '[inputvalue]'" : null)]"
-
-/obj/item/ammo_box/generic/examine(mob/user)
- . = ..()
- . += span_notice("[ammo_set ? "It's set to hold [ammo_name]\s. The box can hold up to [max_ammo] rounds." : "It doesn't have an ammo type set. Use a bullet on the box to set it."]")
- . += span_notice("You can use a pen on it to rename the box.")
-
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 28ef8cecdd80..f848018a6115 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -70,6 +70,9 @@
var/casing_ejector = TRUE
///Whether the gun has an internal magazine or a detatchable one. Overridden by BOLT_TYPE_NO_BOLT.
var/internal_magazine = FALSE
+ ///Whether the gun *can* be reloaded
+ var/sealed_magazine = FALSE
+
///Phrasing of the magazine in examine and notification messages; ex: magazine, box, etx
var/magazine_wording = "magazine"
@@ -331,6 +334,8 @@
muzzle_flash = new(src, muzzleflash_iconstate)
build_zooming()
build_firemodes()
+ if(sawn_off)
+ sawoff(forced = TRUE)
/obj/item/gun/ComponentInitialize()
. = ..()
@@ -362,9 +367,6 @@
wielded_fully = TRUE
return TRUE
-/obj/item/gun/proc/is_wielded()
- return wielded
-
/// triggered on unwield of two handed item
/obj/item/gun/proc/on_unwield(obj/item/source, mob/user)
wielded = FALSE
@@ -372,6 +374,9 @@
zoom(user, forced_zoom = FALSE)
user.remove_movespeed_modifier(/datum/movespeed_modifier/gun)
+/obj/item/gun/proc/is_wielded()
+ return wielded
+
/obj/item/gun/Destroy()
if(chambered) //Not all guns are chambered (EMP'ed energy guns etc)
QDEL_NULL(chambered)
@@ -1109,3 +1114,46 @@
var/safety_prefix = "[our_gun.adjust_fire_select_icon_state_on_safety ? "[our_gun.safety ? "safety_" : ""]" : ""]"
button_icon_state = "[safety_prefix][our_gun.fire_select_icon_state_prefix][current_firemode]"
return ..()
+
+GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
+ /obj/item/gun/energy/plasmacutter,
+ /obj/item/melee/transforming/energy,
+ )))
+
+///Handles all the logic of sawing off guns,
+/obj/item/gun/proc/try_sawoff(mob/user, obj/item/saw)
+ if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && saw.tool_behaviour != TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this.
+ return
+ if(sawn_off)
+ to_chat(user, span_warning("\The [src] is already shortened!"))
+ return
+ user.changeNext_move(CLICK_CD_MELEE)
+ user.visible_message(span_notice("[user] begins to shorten \the [src]."), span_notice("You begin to shorten \the [src]..."))
+
+ //if there's any live ammo inside the gun, makes it go off
+ if(blow_up(user))
+ user.visible_message(span_danger("\The [src] goes off!"), span_danger("\The [src] goes off in your face!"))
+ return
+
+ if(do_after(user, 30, target = src))
+ user.visible_message(span_notice("[user] shortens \the [src]!"), span_notice("You shorten \the [src]."))
+ sawoff(user, saw)
+
+///Used on init or try_sawoff
+/obj/item/gun/proc/sawoff(forced = FALSE)
+ if(sawn_off && !forced)
+ return
+ name = "sawn-off [src.name]"
+ desc = sawn_desc
+ w_class = WEIGHT_CLASS_NORMAL
+ item_state = "gun"
+ slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back
+ slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
+ recoil = SAWN_OFF_RECOIL
+ sawn_off = TRUE
+ update_appearance()
+ return TRUE
+
+///used for sawing guns, causes the gun to fire without the input of the user
+/obj/item/gun/proc/blow_up(mob/user)
+ return
diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm
index 00f48cc29239..877079684ed2 100644
--- a/code/modules/projectiles/guns/ballistic.dm
+++ b/code/modules/projectiles/guns/ballistic.dm
@@ -203,9 +203,14 @@
/obj/item/gun/ballistic/attackby(obj/item/A, mob/user, params)
. = ..()
- if (.)
+
+ if(.)
+ return
+
+ if(sealed_magazine)
+ to_chat(user, span_warning("The magazine on [src] is sealed and cannot be reloaded!"))
return
- if (!internal_magazine && istype(A, /obj/item/ammo_box/magazine))
+ if(!internal_magazine && istype(A, /obj/item/ammo_box/magazine))
var/obj/item/ammo_box/magazine/AM = A
if (!magazine)
insert_magazine(user, AM)
@@ -215,7 +220,8 @@
else
to_chat(user, "There's already a [magazine_wording] in \the [src].")
return
- if (istype(A, /obj/item/ammo_casing) || istype(A, /obj/item/ammo_box))
+
+ if(istype(A, /obj/item/ammo_casing) || istype(A, /obj/item/ammo_box/magazine/ammo_stack))
if (bolt_type == BOLT_TYPE_NO_BOLT || internal_magazine)
if (chambered && !chambered.BB)
chambered.on_eject(shooter = user)
@@ -230,8 +236,9 @@
update_appearance()
return
if (can_be_sawn_off)
- if (sawoff(user, A))
+ if (try_sawoff(user, A))
return
+
return FALSE
///Prefire empty checks for the bolt drop
@@ -336,43 +343,7 @@
rounds.Add(magazine.ammo_list(drop_all))
return rounds
-GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list(
- /obj/item/gun/energy/plasmacutter,
- /obj/item/melee/transforming/energy,
- )))
-
-///Handles all the logic of sawing off guns,
-/obj/item/gun/ballistic/proc/sawoff(mob/user, obj/item/saw)
- if(!saw.get_sharpness() || !is_type_in_typecache(saw, GLOB.gun_saw_types) && saw.tool_behaviour != TOOL_SAW) //needs to be sharp. Otherwise turned off eswords can cut this.
- return
- if(sawn_off)
- to_chat(user, "\The [src] is already shortened!")
- return
- user.changeNext_move(CLICK_CD_MELEE)
- user.visible_message("[user] begins to shorten \the [src].", "You begin to shorten \the [src]...")
-
- //if there's any live ammo inside the gun, makes it go off
- if(blow_up(user))
- user.visible_message("\The [src] goes off!", "\The [src] goes off in your face!")
- return
-
- if(do_after(user, 30, target = src))
- if(sawn_off)
- return
- user.visible_message("[user] shortens \the [src]!", "You shorten \the [src].")
- name = "sawn-off [src.name]"
- desc = sawn_desc
- w_class = WEIGHT_CLASS_NORMAL
- item_state = "gun"
- slot_flags &= ~ITEM_SLOT_BACK //you can't sling it on your back
- slot_flags |= ITEM_SLOT_BELT //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally)
- recoil = SAWN_OFF_RECOIL
- sawn_off = TRUE
- update_appearance()
- return TRUE
-
-///used for sawing guns, causes the gun to fire without the input of the user
-/obj/item/gun/ballistic/proc/blow_up(mob/user)
+/obj/item/gun/ballistic/blow_up(mob/user)
. = FALSE
for(var/obj/item/ammo_casing/AC in magazine.stored_ammo)
if(AC.BB)
diff --git a/code/modules/projectiles/guns/ballistic/launchers.dm b/code/modules/projectiles/guns/ballistic/launchers.dm
index e3e821c72db1..2044fae60ee2 100644
--- a/code/modules/projectiles/guns/ballistic/launchers.dm
+++ b/code/modules/projectiles/guns/ballistic/launchers.dm
@@ -40,30 +40,69 @@
actions_types = list()
casing_ejector = FALSE
+GLOBAL_LIST_INIT(rpg_scrawlings, list(
+ "\"FRONT TOWARDS ENEMY\"",
+ "\"MY WIFE LEFT ME\"",
+ "A Kepori inset in a stylized crimson heart",
+ "\"Eat lead psychohazard!\"",
+ "\"Portable Demotion\"",
+ "A drawing of the Rilena character 'T4L1' smoking a boof",
+ "\"Eat it corpo!\"",
+ "A Sarathi woman in a suggestive pose",
+ "\"Arm this!\""
+))
+
+
/obj/item/gun/ballistic/rocketlauncher
name = "\improper PML-9"
- desc = "A reusable rocket-propelled grenade launcher. The words \"NT this way\" and an arrow have been written near the barrel."
+ desc = "A reusable rocket-propelled grenade launcher."
icon_state = "rocketlauncher"
item_state = "rocketlauncher"
mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher
fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg'
load_sound = 'sound/weapons/gun/general/rocket_load.ogg'
- w_class = WEIGHT_CLASS_BULKY
+ gun_firemodes = list(FIREMODE_SEMIAUTO)
burst_size = 1
fire_delay = 0.4 SECONDS
- casing_ejector = FALSE
+
weapon_weight = WEAPON_HEAVY
+ w_class = WEIGHT_CLASS_BULKY
+
+ //Bolt
bolt_type = BOLT_TYPE_NO_BOLT
- internal_magazine = TRUE
+
+ ///Magazine stuff
cartridge_wording = "rocket"
+ internal_magazine = TRUE
empty_indicator = TRUE
tac_reloads = FALSE
+ casing_ejector = FALSE
+
manufacturer = MANUFACTURER_SCARBOROUGH
+ attack_verb = list("bludgeoned", "hit", "slammed", "whacked")
+
valid_attachments = list()
slot_available = list()
+ var/rpg_scribble = null
+
+/obj/item/gun/ballistic/rocketlauncher/Initialize()
+ . = ..()
+ rpg_scribble = pick(GLOB.rpg_scrawlings)
+ desc += " [rpg_scribble] is scrawled on the tube"
+
+/obj/item/gun/ballistic/rocketlauncher/attackby(obj/item/A, mob/user, params)
+ . = ..()
+ if(istype(A, /obj/item/pen))
+ rpg_scribble = stripped_input(user, "What are you putting on [src]?", "Rocket Launcher Doodle")
+ if(!rpg_scribble || !length(rpg_scribble))
+ desc = "[src::desc]"
+ return
+ desc = "[src::desc] [rpg_scribble] is scribbled on the body."
+
+
/obj/item/gun/ballistic/rocketlauncher/afterattack()
. = ..()
magazine.get_round(FALSE) //Hack to clear the mag after it's fired
@@ -80,6 +119,9 @@
righthand_file = 'icons/obj/guns/manufacturer/solararmories/righthand.dmi'
mob_overlay_icon = 'icons/obj/guns/manufacturer/solararmories/onmob.dmi'
+ //recoiless rifles use shells
+ cartridge_wording = "shell"
+
icon_state = "panzerfaust"
item_state = "panzerfaust"
manufacturer = MANUFACTURER_SOLARARMORIES
diff --git a/code/modules/projectiles/guns/ballistic/rifle.dm b/code/modules/projectiles/guns/ballistic/rifle.dm
index 2be77ee20835..a61413057606 100644
--- a/code/modules/projectiles/guns/ballistic/rifle.dm
+++ b/code/modules/projectiles/guns/ballistic/rifle.dm
@@ -94,7 +94,7 @@
/obj/item/gun/ballistic/rifle/illestren/empty //i had to name it empty instead of no_mag because else it wouldnt work with guncases. sorry!
spawnwithmagazine = FALSE
-/obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user)
+/obj/item/gun/ballistic/rifle/illestren/sawoff(forced = FALSE)
. = ..()
if(.)
spread = 24
@@ -114,22 +114,15 @@
icon_state = "illestren_factory"
item_state = "illestren_factory"
-/obj/item/gun/ballistic/rifle/illestren/sawoff(mob/user)
+/obj/item/gun/ballistic/rifle/illestren/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "illestren_factory_sawn"
mob_overlay_state = item_state
/obj/item/gun/ballistic/rifle/illestren/sawn
- name = "sawn-off Illestren rifle"
desc = "An Illestren rifle sawn down to a ridiculously small size. There was probably a reason it wasn't made this short to begin with, but it still packs a punch."
- item_state = "illestren_sawn"
sawn_off = TRUE
- weapon_weight = WEAPON_MEDIUM
- w_class = WEIGHT_CLASS_NORMAL
- spread = 24
- spread_unwielded = 30
- slot_flags = ITEM_SLOT_BELT
/obj/item/gun/ballistic/rifle/solgov
name = "SSG-669C"
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index 2d70bf9851bb..ab85fb9a01c4 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -74,7 +74,7 @@
can_be_sawn_off = TRUE
-/obj/item/gun/ballistic/shotgun/brimstone/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/brimstone/sawoff(forced = FALSE)
. = ..()
if(.)
weapon_weight = WEAPON_MEDIUM
@@ -108,7 +108,7 @@
rack_sound = 'sound/weapons/gun/shotgun/rack_alt.ogg'
fire_delay = 0.1 SECONDS
-/obj/item/gun/ballistic/shotgun/hellfire/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/hellfire/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -316,7 +316,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
if(unique_reskin && !current_skin && user.canUseTopic(src, BE_CLOSE, NO_DEXTERITY) && (!bolt_locked))
reskin_obj(user)
-/obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/sawoff(forced = FALSE)
. = ..()
if(.)
weapon_weight = WEAPON_MEDIUM
@@ -361,7 +361,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
item_state = "dshotgun_srm"
unique_reskin = null
-/obj/item/gun/ballistic/shotgun/doublebarrel/roumain/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/roumain/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "dshotgun_srm_sawn"
@@ -416,7 +416,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
if(sawn_off)
. += "ishotgun_sawn"
-/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawoff(forced = FALSE)
. = ..()
if(. && slung) //sawing off the gun removes the sling
new /obj/item/stack/cable_coil(get_turf(src), 10)
@@ -424,21 +424,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
update_appearance()
/obj/item/gun/ballistic/shotgun/doublebarrel/improvised/sawn
- name = "sawn-off improvised shotgun"
- desc = "A single-shot shotgun. Better not miss."
- icon_state = "ishotgun_sawn"
- item_state = "ishotgun_sawn"
- w_class = WEIGHT_CLASS_NORMAL
sawn_off = TRUE
- slot_flags = ITEM_SLOT_BELT
-
- wield_slowdown = 0.25
- wield_delay = 0.3 SECONDS //OP? maybe
-
- spread = 8
- spread_unwielded = 15
- recoil = 3 //or not
- recoil_unwielded = 5
/obj/item/gun/ballistic/shotgun/automatic/combat/compact/compact
name = "compact compact combat shotgun"
@@ -604,7 +590,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
balloon_alert_to_viewers("quickly racks!")
fire_delay = 0 SECONDS
-/obj/item/gun/ballistic/shotgun/flamingarrow/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -629,7 +615,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
base_icon_state = "flamingarrow_factory"
item_state = "flamingarrow_factory"
-/obj/item/gun/ballistic/shotgun/flamingarrow/factory/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/factory/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "flamingarrow_factory_sawn"
@@ -642,7 +628,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
icon_state = "flamingbolt"
item_state = "flamingbolt"
-/obj/item/gun/ballistic/shotgun/flamingarrow/bolt/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/bolt/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "flamingbolt_sawn"
@@ -658,7 +644,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
sawn_desc = "A large lever-action rifle, sawn down for portability. It looks much cooler, but you should probably be using a revolver..."
mag_type = /obj/item/ammo_box/magazine/internal/shot/winchester/absolution
-/obj/item/gun/ballistic/shotgun/flamingarrow/absolution/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/absolution/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -690,7 +676,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
sawn_desc = "A lever action shotgun that's been sawed down for portability. The recoil makes it mostly useless outside of point-blank range, but it hits hard for its size and, more importantly, can be flipped around stylishly."
mag_type = /obj/item/ammo_box/magazine/internal/shot/winchester/conflagration
-/obj/item/gun/ballistic/shotgun/flamingarrow/conflagration/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/flamingarrow/conflagration/sawoff(forced = FALSE)
. = ..()
if(.)
var/obj/item/ammo_box/magazine/internal/tube = magazine
@@ -773,7 +759,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
gun_firemodes = list(FIREMODE_SEMIAUTO)
default_firemode = FIREMODE_SEMIAUTO
-/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "beacon_sawn"
@@ -796,7 +782,7 @@ EMPTY_GUN_HELPER(shotgun/automatic/bulldog/inteq)
icon_state = "beacon_factory"
item_state = "beacon_factory"
-/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory/sawoff(mob/user)
+/obj/item/gun/ballistic/shotgun/doublebarrel/beacon/factory/sawoff(forced = FALSE)
. = ..()
if(.)
item_state = "beacon_factory_sawn"
diff --git a/code/modules/projectiles/guns/ballistic/smg.dm b/code/modules/projectiles/guns/ballistic/smg.dm
index 266c9059046a..6f52daaf2292 100644
--- a/code/modules/projectiles/guns/ballistic/smg.dm
+++ b/code/modules/projectiles/guns/ballistic/smg.dm
@@ -192,6 +192,7 @@
name = "\improper Nanotrasen Saber SMG"
desc = "A prototype full-auto 9mm submachine gun, designated 'SABR'. Has a threaded barrel for suppressors and a folding stock."
icon = 'icons/obj/guns/projectile.dmi'
+ default_attachments = list(/obj/item/attachment/foldable_stock)
icon_state = "saber"
item_state = "gun"
mag_type = /obj/item/ammo_box/magazine/smgm9mm
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index c63c8358e2de..067a4bbc5d97 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -122,11 +122,12 @@
heat = 3800
usesound = list('sound/items/welder.ogg', 'sound/items/welder2.ogg')
- tool_behaviour = TOOL_WELDER
+ tool_behaviour = TOOL_DECONSTRUCT
wall_decon_damage = 200
- toolspeed = 0.7 //plasmacutters can be used as welders, and are faster than standard welders
+ toolspeed = 0.9 //plasmacutters can be used like angle grinders, and are a bit faster
internal_cell = TRUE //so you don't cheese through the need for plasma - WS EDIT
- var/charge_weld = 25 //amount of charge used up to start action (multiplied by amount) and per progress_flash_divisor ticks of welding
+ var/charge_cut = 100 //amount of charge used up to start action (multiplied by amount) and per progress_flash_divisor ticks of cutting
+ var/adv = FALSE
/obj/item/gun/energy/plasmacutter/ComponentInitialize()
. = ..()
@@ -155,16 +156,16 @@
else
..()
-// Can we weld? Plasma cutter does not use charge continuously.
+// Can we cut? Plasma cutter does not use charge continuously.
// Amount cannot be defaulted to 1: most of the code specifies 0 in the call.
/obj/item/gun/energy/plasmacutter/tool_use_check(mob/living/user, amount)
if(QDELETED(cell))
to_chat(user, "[src] does not have a cell, and cannot be used!")
return FALSE
- // Amount cannot be used if drain is made continuous, e.g. amount = 5, charge_weld = 25
+ // Amount cannot be used if drain is made continuous, e.g. amount = 5, charge_cut = 25
// Then it'll drain 125 at first and 25 periodically, but fail if charge dips below 125 even though it still can finish action
- // Alternately it'll need to drain amount*charge_weld every period, which is either obscene or makes it free for other uses
- if(amount ? cell.charge < charge_weld * amount : cell.charge < charge_weld)
+ // Alternately it'll need to drain amount*charge_cut every period, which is either obscene or makes it free for other uses
+ if(amount ? cell.charge < charge_cut * amount : cell.charge < charge_cut)
to_chat(user, "You need more charge to complete this task!")
return FALSE
@@ -186,13 +187,19 @@
return TRUE
/obj/item/gun/energy/plasmacutter/use(amount)
- return (!QDELETED(cell) && cell.use(amount ? amount * charge_weld : charge_weld))
+ return (!QDELETED(cell) && cell.use(amount ? amount * charge_cut : charge_cut))
/obj/item/gun/energy/plasmacutter/use_tool(atom/target, mob/living/user, delay, amount=1, volume=0, datum/callback/extra_checks)
if(amount)
- target.add_overlay(GLOB.welding_sparks)
+ if(adv)
+ target.add_overlay(GLOB.advanced_cutting_effect)
+ else
+ target.add_overlay(GLOB.cutting_effect)
. = ..()
- target.cut_overlay(GLOB.welding_sparks)
+ if(adv)
+ target.cut_overlay(GLOB.advanced_cutting_effect)
+ else
+ target.cut_overlay(GLOB.cutting_effect)
else
. = ..(amount=1)
@@ -201,11 +208,9 @@
icon_state = "adv_plasmacutter"
item_state = "adv_plasmacutter"
force = 15
+ wall_decon_damage = 300
ammo_type = list(/obj/item/ammo_casing/energy/plasma/adv)
- wall_decon_damage = 200
- toolspeed = 0.4
-
/obj/item/gun/energy/wormhole_projector
name = "bluespace wormhole projector"
desc = "A projector that emits high density quantum-coupled bluespace beams." //WS Edit - Any anomaly core for phazons
diff --git a/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm
index f32a2f11a508..a244b188863a 100644
--- a/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm
+++ b/code/modules/projectiles/guns/manufacturer/clip_lanchester/ballistics.dm
@@ -223,7 +223,6 @@ EMPTY_GUN_HELPER(automatic/smg/cm5)
righthand_file = 'icons/obj/guns/manufacturer/clip_lanchester/righthand.dmi'
mob_overlay_icon = 'icons/obj/guns/manufacturer/clip_lanchester/onmob.dmi'
- fire_sound = 'sound/weapons/gun/rifle/shot.ogg'
icon_state = "f4"
item_state = "f4"
show_magazine_on_sprite = TRUE
diff --git a/code/modules/projectiles/guns/manufacturer/frontier_import/ballistics.dm b/code/modules/projectiles/guns/manufacturer/frontier_import/ballistics.dm
index 90355db145dd..224712438b90 100644
--- a/code/modules/projectiles/guns/manufacturer/frontier_import/ballistics.dm
+++ b/code/modules/projectiles/guns/manufacturer/frontier_import/ballistics.dm
@@ -227,3 +227,45 @@
caliber = "12ga"
max_ammo = 40
w_class = WEIGHT_CLASS_NORMAL
+
+
+/obj/item/gun/ballistic/rocketlauncher/oneshot
+ name = "\improper Hammer"
+ desc = "A disposable rocket-propelled grenade launcher loaded with a HEDP shell."
+
+ icon = 'icons/obj/guns/manufacturer/frontier_import/48x32.dmi'
+ lefthand_file = 'icons/obj/guns/manufacturer/frontier_import/lefthand.dmi'
+ righthand_file = 'icons/obj/guns/manufacturer/frontier_import/righthand.dmi'
+ mob_overlay_icon = 'icons/obj/guns/manufacturer/frontier_import/onmob.dmi'
+ base_icon_state = "rpg"
+ icon_state = "rpg"
+ item_state = "rpg"
+
+ mag_type = /obj/item/ammo_box/magazine/internal/rocketlauncher/oneshot
+ fire_sound = 'sound/weapons/gun/general/rocket_launch.ogg'
+ load_sound = 'sound/weapons/gun/general/rocket_load.ogg'
+ weapon_weight = WEAPON_HEAVY
+ bolt_type = BOLT_TYPE_NO_BOLT
+
+ cartridge_wording = "rocket"
+ empty_indicator = FALSE
+ sealed_magazine = TRUE
+ manufacturer = MANUFACTURER_IMPORT
+ slot_flags = ITEM_SLOT_BACK
+
+
+/obj/item/gun/ballistic/rocketlauncher/oneshot/Initialize()
+ . = ..()
+ if(prob(1))
+ name = "\improper Mallet"
+
+/obj/item/gun/ballistic/rocketlauncher/oneshot/examine(mob/user)
+ . = ..()
+ if(!chambered)
+ . += span_warning("It has been spent, and is now useless.")
+
+/obj/item/ammo_box/magazine/internal/rocketlauncher/oneshot
+ name = "oneshot rocket launcher magazine"
+ ammo_type = /obj/item/ammo_casing/caseless/rocket/hedp
+ caliber = "84mm"
+ max_ammo = 1
diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm
index b131b03ec148..2e2fc46c3752 100644
--- a/code/modules/projectiles/guns/misc/beam_rifle.dm
+++ b/code/modules/projectiles/guns/misc/beam_rifle.dm
@@ -477,7 +477,7 @@
if(isliving(target))
var/mob/living/L = target
L.adjustFireLoss(impact_direct_damage)
- L.emote("scream")
+ L.force_scream()
/obj/projectile/beam/beam_rifle/proc/handle_hit(atom/target, piercing_hit = FALSE)
set waitfor = FALSE
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index c46a4c6cb2f9..b95c3dd37ddb 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -37,6 +37,15 @@
muzzle_type = /obj/effect/projectile/muzzle/laser
impact_type = /obj/effect/projectile/impact/laser
+/obj/projectile/beam/laser/sharplite
+ speed = 0.4
+
+/obj/projectile/beam/laser/light
+ damage = 15
+
+/obj/projectile/beam/laser/light/sharplite
+ speed = 0.4
+
/obj/projectile/beam/laser/eoehoma
damage = 25
armour_penetration = -10
@@ -54,6 +63,9 @@
muzzle_type = /obj/effect/projectile/muzzle/heavy_laser
impact_type = /obj/effect/projectile/impact/heavy_laser
+/obj/projectile/beam/laser/heavylaser/sharplite
+ speed = 0.4
+
/obj/projectile/beam/laser/on_hit(atom/target, blocked = FALSE)
. = ..()
if(iscarbon(target))
@@ -119,9 +131,15 @@
muzzle_type = /obj/effect/projectile/muzzle/disabler
impact_type = /obj/effect/projectile/impact/disabler
+/obj/projectile/beam/disabler/sharplite
+ speed = 0.4
+
/obj/projectile/beam/disabler/weak
damage = 15
+/obj/projectile/beam/disabler/weak/sharplite
+ speed = 0.4
+
/obj/projectile/beam/disabler/weak/negative_ap
armour_penetration = -30
range = 9
@@ -148,6 +166,11 @@
return
targets_turf.IgniteTurf(rand(8,22), "blue")
+/obj/projectile/beam/pulse/sharplite_turret
+ wall_damage_flags = null
+ wall_damage_override = 0
+ speed = 0.4
+
/obj/projectile/beam/pulse/shotgun
damage = 40
diff --git a/code/modules/projectiles/projectile/bullets/rifle.dm b/code/modules/projectiles/projectile/bullets/rifle.dm
index 690f02d6b5c5..1d5d48c9b826 100644
--- a/code/modules/projectiles/projectile/bullets/rifle.dm
+++ b/code/modules/projectiles/projectile/bullets/rifle.dm
@@ -49,6 +49,13 @@
damage = 30
armour_penetration = 20
+/obj/projectile/bullet/a762_40/rubber //"rubber"
+ name = "7.62x40mm CLIP Rubber"
+ damage = 15
+ stamina = 40
+ armour_penetration = 20
+
+
//.308 WIN (M514 & GAL DMRs)
/obj/projectile/bullet/a308
@@ -57,6 +64,13 @@
damage = 30
armour_penetration = 40
+/obj/projectile/bullet/a308/rubber //"rubber"
+ name = ".308 Rubber"
+ speed = 0.3
+ damage = 25
+ stamina = 50
+ armour_penetration = 40
+
// 8x58mm caseless (SG-669)
/obj/projectile/bullet/a858
diff --git a/code/modules/projectiles/projectile/special/plasma.dm b/code/modules/projectiles/projectile/special/plasma.dm
index d957ad924572..68071bd2c557 100644
--- a/code/modules/projectiles/projectile/special/plasma.dm
+++ b/code/modules/projectiles/projectile/special/plasma.dm
@@ -1,10 +1,10 @@
/obj/projectile/plasma
name = "plasma blast"
icon_state = "plasmacutter"
- damage_type = BRUTE
- damage = 5
+ damage_type = BURN
+ damage = 15
range = 4
- dismemberment = 20
+ dismemberment = 10
/// chance that the plasmablast ruins the ore
var/slag_chance = 33
impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 9eb48f11cf4d..49765fd6747b 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -162,7 +162,7 @@
handle_reactions()
return amount
-/// Get the name of the reagent there is the most of in this holder
+/// DEPRICATED use get_master_regent. Get the name of the reagent there is the most of in this holder
/datum/reagents/proc/get_master_reagent_name()
var/list/cached_reagents = reagent_list
var/name
@@ -175,7 +175,7 @@
return name
-/// Get the id of the reagent there is the most of in this holder
+/// DEPRICATED use get_master_regent. Get the id of the reagent there is the most of in this holder
/datum/reagents/proc/get_master_reagent_id()
var/list/cached_reagents = reagent_list
var/max_type
@@ -611,6 +611,7 @@
//Clear from relevant lists
addiction_list -= R
reagent_list -= R
+ SEND_SIGNAL(src, COMSIG_REAGENTS_DEL_REAGENT, R)
qdel(R)
update_total()
if(my_atom)
@@ -638,6 +639,8 @@
del_reagent(R.type)
if(my_atom)
my_atom.on_reagent_change(CLEAR_REAGENTS)
+
+ SEND_SIGNAL(src, COMSIG_REAGENTS_CLEAR_REAGENTS)
return 0
/**
@@ -747,6 +750,8 @@
if(my_atom)
my_atom.on_reagent_change(ADD_REAGENT)
R.on_merge(data, amount)
+
+ SEND_SIGNAL(src, COMSIG_REAGENTS_ADD_REAGENT, cached_reagents, amount, reagtemp, data, no_react)
if(!no_react)
handle_reactions()
return TRUE
@@ -765,6 +770,8 @@
update_total()
if(my_atom)
my_atom.on_reagent_change(ADD_REAGENT)
+
+ SEND_SIGNAL(src, COMSIG_REAGENTS_NEW_REAGENT, reagent, amount, reagtemp, data, no_react)
if(!no_react)
handle_reactions()
return TRUE
@@ -797,6 +804,7 @@
//and zero, to prevent removing more than the holder has stored
amount = clamp(amount, 0, R.volume)
R.volume -= amount
+ SEND_SIGNAL(src, COMSIG_REAGENTS_REM_REAGENT, A, amount)
update_total()
if(!safety)//So it does not handle reactions when it need not to
handle_reactions()
diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm
index ac1cd94b092e..8e6935766346 100644
--- a/code/modules/reagents/chemistry/machinery/chem_master.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_master.dm
@@ -337,18 +337,18 @@
reagents.trans_to(P, vol_each, transfered_by = usr)
return TRUE
if(item_type == "condimentPack")
- var/obj/item/reagent_containers/food/condiment/pack/P
+ var/obj/item/reagent_containers/condiment/pack/P
for(var/i = 0; i < amount; i++)
- P = new/obj/item/reagent_containers/food/condiment/pack(drop_location())
+ P = new/obj/item/reagent_containers/condiment/pack(drop_location())
P.originalname = name
P.name = trim("[name] pack")
P.desc = "A small condiment pack. The label says it contains [name]."
reagents.trans_to(P, vol_each, transfered_by = usr)
return TRUE
if(item_type == "condimentBottle")
- var/obj/item/reagent_containers/food/condiment/P
+ var/obj/item/reagent_containers/condiment/P
for(var/i = 0; i < amount; i++)
- P = new/obj/item/reagent_containers/food/condiment(drop_location())
+ P = new/obj/item/reagent_containers/condiment(drop_location())
P.originalname = name
P.name = trim("[name] bottle")
reagents.trans_to(P, vol_each, transfered_by = usr)
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
index f781313bf582..e84cc952c5b9 100644
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
@@ -488,7 +488,7 @@ WS End*/
if(H.health <= H.crit_threshold) //certain death above this threshold
REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart before we give him heart attack
to_chat(H,"You feel something rupturing inside your chest!")
- H.emote("scream")
+ H.force_scream()
H.set_heartattack(TRUE)
volume = 0
. = ..()
diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm
index abdaf511691d..9e4b2120774e 100644
--- a/code/modules/reagents/chemistry/reagents/food_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm
@@ -137,7 +137,7 @@
M.visible_message("The boiling oil sizzles as it covers [M]!", \
"You're covered in boiling oil!")
if(FryLoss)
- M.emote("scream")
+ M.force_scream()
playsound(M, 'sound/machines/fryer/deep_fryer_emerge.ogg', 25, TRUE)
ADD_TRAIT(M, TRAIT_OIL_FRIED, "cooking_oil_react")
addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, unfry_mob)), 3)
@@ -271,7 +271,7 @@
//actually handle the pepperspray effects
if (!(pepper_proof)) // you need both eye and mouth protection
if(prob(5))
- victim.emote("scream")
+ victim.force_scream()
victim.blur_eyes(5) // 10 seconds
victim.blind_eyes(3) // 6 seconds
victim.confused = max(M.confused, 5) // 10 seconds
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
index 6460cd423f78..d468431c9480 100644
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
@@ -257,9 +257,12 @@
to_chat(M, "You don't feel so good...")
else if(M.getFireLoss())
M.adjustFireLoss(-reac_volume)
- if(show_message)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
to_chat(M, "You feel your burns healing! It stings like hell!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your burns throbbing."))
..()
/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M)
@@ -310,9 +313,12 @@
to_chat(M, "You don't feel so good...")
else if(M.getBruteLoss())
M.adjustBruteLoss(-reac_volume)
- if(show_message)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
to_chat(M, "You feel your bruises healing! It stings like hell!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your bruises throbbing."))
..()
@@ -375,6 +381,9 @@
color = "#6D6374"
metabolization_rate = 0.4 * REAGENTS_METABOLISM
+/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/L)
+ ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
+
/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C)
C.hal_screwyhud = SCREWYHUD_HEALTHY
C.adjustBruteLoss(-0.25*REM, 0)
@@ -401,6 +410,7 @@
/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M)
if(iscarbon(M))
var/mob/living/carbon/N = M
+ REMOVE_TRAIT(N, TRAIT_PAIN_RESIST, type)
N.hal_screwyhud = SCREWYHUD_NONE
..()
@@ -565,6 +575,10 @@
color = "#E6FFF0"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
+/datum/reagent/medicine/anti_rad/on_mob_metabolize(mob/living/L)
+ to_chat(L, span_warning("Your stomach starts to churn and cramp!"))
+ . = ..()
+
/datum/reagent/medicine/anti_rad/on_mob_life(mob/living/carbon/M)
M.radiation -= M.radiation - rand(50,150)
M.adjust_disgust(7*REM, 0)
@@ -750,9 +764,11 @@
/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L)
..()
+ ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type)
L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
..()
@@ -1451,10 +1467,12 @@
/datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M)
..()
+ ADD_TRAIT(M, TRAIT_PAIN_RESIST, type)
ADD_TRAIT(M, TRAIT_STABLEHEART, type)
ADD_TRAIT(M, TRAIT_STABLELIVER, type)
/datum/reagent/medicine/corazone/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_PAIN_RESIST, type)
REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
@@ -1746,9 +1764,12 @@
else if(M.getBruteLoss())
M.adjustBruteLoss(-reac_volume)
M.adjustFireLoss(reac_volume)
- if(show_message)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
to_chat(M, "You feel your skin bubble and burn as your flesh knits itself together!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
..()
/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M)
@@ -1780,9 +1801,12 @@
else if(M.getBruteLoss())
M.adjustFireLoss(-reac_volume)
M.adjustBruteLoss(reac_volume)
- if(show_message)
- to_chat(M, "You feel your flesh tear as your skin rapidly regenerates!")
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, "You feel your skin tear as your flesh rapidly regenerates!")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
..()
/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 11306b441f1e..b6fe4370d9c5 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -243,49 +243,10 @@
REMOVE_TRAIT(L, TRAIT_HOLY, type)
..()
-/datum/reagent/water/holywater/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(iscultist(M))
- to_chat(M, "A vile holiness begins to spread its shining tendrils through your mind, purging the Geometer of Blood's influence!")
- ..()
-
-/datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M)
- if(!data)
- data = list("misc" = 1)
- data["misc"]++
- M.jitteriness = min(M.jitteriness+4,10)
- if(iscultist(M))
- for(var/datum/action/innate/cult/blood_magic/BM in M.actions)
- to_chat(M, "Your blood rites falter as holy water scours your body!")
- for(var/datum/action/innate/cult/blood_spell/BS in BM.spells)
- qdel(BS)
- if(data["misc"] >= 25) // 10 units, 45 seconds @ metabolism 0.4 units & tick rate 1.8 sec
- if(!M.stuttering)
- M.stuttering = 1
- M.stuttering = min(M.stuttering+4, 10)
- M.Dizzy(5)
- if(iscultist(M) && prob(20))
- M.say(pick("Av'te Nar'Sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"), forced = "holy water")
- if(prob(10))
- M.visible_message("[M] starts having a seizure!", "You have a seizure!")
- M.Unconscious(120)
- to_chat(M, "[pick("Your blood is your bond - you are nothing without it", "Do not forget your place", \
- "All that power, and you still fail?", "If you cannot scour this poison, I shall scour your meager life!")].")
- if(data["misc"] >= 60) // 30 units, 135 seconds
- if(iscultist(M))
- SSticker.mode.remove_cultist(M.mind, FALSE, TRUE)
- M.jitteriness = 0
- M.stuttering = 0
- holder.remove_reagent(type, volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
- return
- holder.remove_reagent(type, 0.4) //fixed consumption to prevent balancing going out of whack
-
/datum/reagent/water/holywater/expose_turf(turf/T, reac_volume)
..()
if(!istype(T))
return
- if(reac_volume>=10)
- for(var/obj/effect/rune/R in T)
- qdel(R)
T.Bless()
// Holy water. Mostly the same as water, it also heals the plant a little with the power of the spirits. Also ALSO increases instability.
@@ -346,22 +307,12 @@
return ..()
/datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M)
- if(iscultist(M))
- M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustAllImmobility(-40)
- M.adjustStaminaLoss(-10, 0)
- M.adjustToxLoss(-2, 0)
- M.adjustOxyLoss(-2, 0)
- M.adjustBruteLoss(-2, 0)
- M.adjustFireLoss(-2, 0)
- if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
- M.blood_volume += 3
- else // Will deal about 90 damage when 50 units are thrown
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
- M.adjustToxLoss(2, 0)
- M.adjustFireLoss(2, 0)
- M.adjustOxyLoss(2, 0)
- M.adjustBruteLoss(2, 0)
+ // Will deal about 90 damage when 50 units are thrown
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
+ M.adjustToxLoss(2, 0)
+ M.adjustFireLoss(2, 0)
+ M.adjustOxyLoss(2, 0)
+ M.adjustBruteLoss(2, 0)
holder.remove_reagent(type, 1)
return TRUE
@@ -1792,12 +1743,6 @@
if(istype(T))
T.MakeDry(ALL, TRUE, reac_volume * 5 SECONDS) //50 deciseconds per unit
-/datum/reagent/drying_agent/expose_obj(obj/O, reac_volume)
- if(O.type == /obj/item/clothing/shoes/galoshes)
- var/t_loc = get_turf(O)
- qdel(O)
- new /obj/item/clothing/shoes/galoshes/dry(t_loc)
-
// Virology virus food chems.
/datum/reagent/toxin/mutagen/mutagenvirusfood
@@ -2526,3 +2471,38 @@
description = "Bacteria native to the Saint-Roumain Militia home planet."
color = "#5a4f42"
taste_description = "sour"
+
+//anti rad foam
+/datum/reagent/anti_radiation_foam
+ name = "Anti-Radiation Foam"
+ description = "A tried and tested foam, used for decontaminating nuclear disasters."
+ reagent_state = LIQUID
+ color = "#A6FAFF55"
+ taste_description = "bitter, foamy awfulness."
+
+/datum/reagent/anti_radiation_foam/expose_turf(turf/open/T, reac_volume)
+ if (!istype(T))
+ return
+
+ if(reac_volume >= 1)
+ var/obj/effect/particle_effect/foam/antirad/F = (locate(/obj/effect/particle_effect/foam/antirad) in T)
+ if(!F)
+ F = new(T)
+ else if(istype(F))
+ F.lifetime = initial(F.lifetime) //the foam is what does the cleaning here
+
+/datum/reagent/anti_radiation_foam/expose_obj(obj/O, reac_volume)
+ O.wash(CLEAN_RAD)
+
+/datum/reagent/anti_radiation_foam/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method in list(TOUCH, VAPOR))
+ M.radiation = M.radiation - rand(max(M.radiation * 0.95, M.radiation)) //get the hose
+ M.ExtinguishMob()
+ ..()
+
+
+/datum/reagent/anti_radiation_foam/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(0.5, 200)
+ M.adjust_disgust(4)
+ ..()
+ . = 1
diff --git a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
index 9f907a33b022..ff82cd185fb2 100644
--- a/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/trickwine_reagents.dm
@@ -126,7 +126,7 @@
T.IgniteTurf(reac_volume)
new /obj/effect/hotspot(T, reac_volume * 1, FIRE_MINIMUM_TEMPERATURE_TO_EXIST + reac_volume * 10)
var/turf/otherT
- for(var/direction in GLOB.cardinals)
+ for(var/direction in GLOB.alldirs)
otherT = get_step(T, direction)
otherT.IgniteTurf(reac_volume)
new /obj/effect/hotspot(otherT, reac_volume * 1, FIRE_MINIMUM_TEMPERATURE_TO_EXIST + reac_volume * 10)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index f6f46d3c3970..10713fbf2288 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -151,17 +151,8 @@
R.stun(20)
R.reveal(100)
R.adjustHealth(50)
- addtimer(CALLBACK(src, PROC_REF(divine_explosion), round(created_volume/48,1),get_turf(holder.my_atom)), 2 SECONDS)
..()
-/datum/chemical_reaction/reagent_explosion/potassium_explosion/holyboom/proc/divine_explosion(size, turf/T)
- for(var/mob/living/carbon/C in get_hearers_in_view(size,T))
- if(iscultist(C))
- to_chat(C, "The divine explosion sears you!")
- C.Paralyze(40)
- C.adjust_fire_stacks(5)
- C.IgniteMob()
-
/datum/chemical_reaction/gunpowder
results = list(/datum/reagent/gunpowder = 3)
required_reagents = list(/datum/reagent/saltpetre = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/sulfur = 1)
@@ -173,7 +164,6 @@
modifier = 1
mix_message = "Sparks start flying around the gunpowder!"
-
/datum/chemical_reaction/reagent_explosion/gunpowder_explosion/on_reaction(datum/reagents/holder, created_volume)
addtimer(CALLBACK(src, PROC_REF(explode), holder, created_volume), rand(5,10) SECONDS)
diff --git a/code/modules/reagents/reagent_containers/jug.dm b/code/modules/reagents/reagent_containers/jug.dm
index de1570a9ef5c..10baf946a089 100644
--- a/code/modules/reagents/reagent_containers/jug.dm
+++ b/code/modules/reagents/reagent_containers/jug.dm
@@ -1,7 +1,7 @@
/obj/item/reagent_containers/glass/chem_jug
name = "chemical jug"
desc = "A large jug used for storing bulk ammounts chemicals. Provided with a tamper seal which ensures that the contents are pure"
- icon = 'icons/obj/chemical/chem_jug.dmi'
+ icon = 'icons/obj/chemical/chem_jug.dmi' // the coloring of labels for elemental chemicals is based on the chemical group block coloring at https://pubchem.ncbi.nlm.nih.gov/periodic-table/ . Everything else is whatever.
icon_state = "chem_jug"
item_state = "sheet-plastic"
w_class = WEIGHT_CLASS_BULKY
@@ -80,36 +80,21 @@
/obj/item/reagent_containers/glass/chem_jug/open
cap_on = FALSE
-/obj/item/reagent_containers/glass/chem_jug/carbon
- name = "chemical jug (carbon)"
- icon_state = "chem_jug_carbon"
- list_reagents = list(/datum/reagent/carbon = 150)
-
-/obj/item/reagent_containers/glass/chem_jug/oxygen
- name = "chemical jug (oxygen)"
- icon_state = "chem_jug_oxygen"
- list_reagents = list(/datum/reagent/oxygen = 150)
-
-/obj/item/reagent_containers/glass/chem_jug/nitrogen
- name = "chemical jug (nitrogen)"
- icon_state = "chem_jug_nitrogen"
- list_reagents = list(/datum/reagent/nitrogen = 150)
-
-/obj/item/reagent_containers/glass/chem_jug/hydrogen
- name = "chemical jug (hydrogen)"
- icon_state = "chem_jug_hydrogen"
- list_reagents = list(/datum/reagent/hydrogen = 150)
-
-/obj/item/reagent_containers/glass/chem_jug/radium
- name = "chemical jug (radium)"
- icon_state = "chem_jug_radium"
- list_reagents = list(/datum/reagent/uranium/radium = 150)
-
/obj/item/reagent_containers/glass/chem_jug/aluminium
name = "chemical jug (aluminium)"
icon_state = "chem_jug_aluminium"
list_reagents = list(/datum/reagent/aluminium = 150)
+/obj/item/reagent_containers/glass/chem_jug/bromine
+ name = "chemical jug (bromine)"
+ icon_state = "chem_jug_bromine"
+ list_reagents = list(/datum/reagent/bromine = 150)
+
+/obj/item/reagent_containers/glass/chem_jug/carbon
+ name = "chemical jug (carbon)"
+ icon_state = "chem_jug_carbon"
+ list_reagents = list(/datum/reagent/carbon = 150)
+
/obj/item/reagent_containers/glass/chem_jug/chlorine
name = "chemical jug (chlorine)"
icon_state = "chem_jug_chlorine"
@@ -120,27 +105,67 @@
icon_state = "chem_jug_copper"
list_reagents = list(/datum/reagent/copper = 150)
-/obj/item/reagent_containers/glass/chem_jug/bromine
- name = "chemical jug (bromine)"
- icon_state = "chem_jug_bromine"
- list_reagents = list(/datum/reagent/bromine = 150)
+/obj/item/reagent_containers/glass/chem_jug/fluorine
+ name = "chemical jug (fluorine)"
+ icon_state = "chem_jug_fluorine"
+ list_reagents = list(/datum/reagent/fluorine = 150)
+
+/obj/item/reagent_containers/glass/chem_jug/hydrogen
+ name = "chemical jug (hydrogen)"
+ icon_state = "chem_jug_hydrogen"
+ list_reagents = list(/datum/reagent/hydrogen = 150)
/obj/item/reagent_containers/glass/chem_jug/iodine
name = "chemical jug (iodine)"
icon_state = "chem_jug_iodine"
list_reagents = list(/datum/reagent/iodine = 150)
+/obj/item/reagent_containers/glass/chem_jug/lithium
+ name = "chemical jug (lithium)"
+ icon_state = "chem_jug_lithium"
+ list_reagents = list(/datum/reagent/lithium = 150)
+
+/obj/item/reagent_containers/glass/chem_jug/mercury
+ name = "chemical jug (mercury)"
+ icon_state = "chem_jug_mercury"
+ list_reagents = list(/datum/reagent/mercury = 150)
+
+/obj/item/reagent_containers/glass/chem_jug/nitrogen
+ name = "chemical jug (nitrogen)"
+ icon_state = "chem_jug_nitrogen"
+ list_reagents = list(/datum/reagent/nitrogen = 150)
+
+/obj/item/reagent_containers/glass/chem_jug/oxygen
+ name = "chemical jug (oxygen)"
+ icon_state = "chem_jug_oxygen"
+ list_reagents = list(/datum/reagent/oxygen = 150)
+
+/obj/item/reagent_containers/glass/chem_jug/phosphorus
+ name = "chemical jug (phosphorus)"
+ icon_state = "chem_jug_phosphorus"
+ list_reagents = list(/datum/reagent/phosphorus = 150)
+
/obj/item/reagent_containers/glass/chem_jug/potassium
name = "chemical jug (potassium)"
icon_state = "chem_jug_potassium"
list_reagents = list(/datum/reagent/potassium = 150)
+/obj/item/reagent_containers/glass/chem_jug/radium
+ name = "chemical jug (radium)"
+ icon_state = "chem_jug_radium"
+ list_reagents = list(/datum/reagent/uranium/radium = 150)
+
+/obj/item/reagent_containers/glass/chem_jug/sodium
+ name = "chemical jug (sodium)"
+ icon_state = "chem_jug_sodium"
+ list_reagents = list(/datum/reagent/sodium = 150)
+
/obj/item/reagent_containers/glass/chem_jug/sulfur
name = "chemical jug (sulfur)"
icon_state = "chem_jug_sulfur"
list_reagents = list(/datum/reagent/sulfur = 150)
-/obj/item/reagent_containers/glass/chem_jug/thermite
+/obj/item/reagent_containers/glass/chem_jug/thermite // not giving this its own "elemental" jug sprite.
name = "chemical jug (thermite)"
list_reagents = list(/datum/reagent/thermite = 150)
diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm
index fafd67305c9c..54d2fc182398 100644
--- a/code/modules/reagents/reagent_dispenser.dm
+++ b/code/modules/reagents/reagent_dispenser.dm
@@ -58,6 +58,12 @@
reagent_id = /datum/reagent/firefighting_foam
tank_volume = 500
+/obj/structure/reagent_dispensers/foamtank/antirad
+ name = "anti-radiation foam tank"
+ desc = "A tank full of decontamination foam"
+ reagent_id = /datum/reagent/anti_radiation_foam
+ tank_volume = 1000
+
/obj/structure/reagent_dispensers/fueltank
name = "fuel tank"
desc = "A tank full of industrial welding fuel. Do not consume."
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index b8b08486f20d..9b6a0629fa3e 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -365,7 +365,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
/obj/item/conveyor_switch_construct/afterattack(atom/A, mob/user, proximity)
. = ..()
- if(!proximity || user.stat || !isfloorturf(A) || istype(A, /area/shuttle))
+ if(!proximity || user.stat || !isfloorturf(A))
return
var/found = 0
for(var/obj/machinery/conveyor/C in view())
@@ -397,7 +397,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id)
/obj/item/stack/conveyor/afterattack(atom/A, mob/user, proximity)
. = ..()
- if(!proximity || user.stat || !isfloorturf(A) || istype(A, /area/shuttle))
+ if(!proximity || user.stat || !isfloorturf(A))
return
var/cdir = get_dir(A, user)
if(A == user.loc)
diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm
index 0b679dfcc4bf..5ac2370dc694 100644
--- a/code/modules/research/designs/autolathe_designs.dm
+++ b/code/modules/research/designs/autolathe_designs.dm
@@ -761,7 +761,7 @@
id = "foam_dart"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 500)
- build_path = /obj/item/ammo_box/foambox
+ build_path = /obj/item/storage/box/ammo/foam_darts
category = list("initial", "Misc")
/datum/design/handcuffs
@@ -785,7 +785,7 @@
id = "c38_surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c38_box/surplus
+ build_path = /obj/item/storage/box/ammo/c38_surplus
category = list("initial", "Security", "Ammo")
/datum/design/beanbag_slug
@@ -817,7 +817,7 @@
id = "riot_darts"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 50000) //Comes with 40 darts
- build_path = /obj/item/ammo_box/foambox/riot
+ build_path = /obj/item/storage/box/ammo/foam_darts/riot
category = list("initial", "Security")
/datum/design/c10mm_surplus
@@ -825,7 +825,7 @@
id = "c10mm-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c10mm/surplus
+ build_path = /obj/item/storage/box/ammo/c10mm_surplus
category = list("initial", "Security", "Ammo")
/datum/design/c45_surplus
@@ -833,7 +833,7 @@
id = "c45-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c45/surplus
+ build_path = /obj/item/storage/box/ammo/c45_surplus
category = list("initial", "Security", "Ammo")
/datum/design/c9mm_surplus
@@ -841,7 +841,7 @@
id = "c9mm-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm/surplus
+ build_path = /obj/item/storage/box/ammo/c9mm_surplus
category = list("initial", "Security", "Ammo")
/datum/design/c556mmHITP_surplus
@@ -849,15 +849,7 @@
id = "c556mmHITP-surplus"
build_type = AUTOLATHE | PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c556mmHITP/surplus
- category = list("initial", "Security", "Ammo")
-
-/datum/design/generic_ammo_box
- name = "Generic Ammo Box"
- id = "ammo-generic"
- build_type = AUTOLATHE | PROTOLATHE
- materials = list(/datum/material/iron = 1500)
- build_path = /obj/item/ammo_box/generic
+ build_path = /obj/item/storage/box/ammo/c556mm_surplus
category = list("initial", "Security", "Ammo")
/datum/design/ammo_can
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 1c3edc8b7c32..a07f9d96dd80 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -288,8 +288,6 @@
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-//Shiptest edit - standard ammunition
-
/datum/design/buckshot_shell
name = "Buckshot Shell"
id = "buckshot_shell"
@@ -304,7 +302,7 @@
id = "c38"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c38_box
+ build_path = /obj/item/storage/box/ammo/c38
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -313,7 +311,7 @@
id = "c9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm
+ build_path = /obj/item/storage/box/ammo/c9mm
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -322,7 +320,7 @@
id = "c10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c10mm
+ build_path = /obj/item/storage/box/ammo/c10mm
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -331,7 +329,7 @@
id = "c45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c45
+ build_path = /obj/item/storage/box/ammo/c45
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -340,19 +338,17 @@
id = "c556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c556mmHITP
+ build_path = /obj/item/storage/box/ammo/c556mm
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
-// WS edit - not so free rubbershot
-
/datum/design/rubbershot9mm
name = "Rubbershot 9mm ammo box"
desc = "A box full of less-than-lethal 9mm ammunition."
id = "rubbershot9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm/rubbershot
+ build_path = /obj/item/storage/box/ammo/c9mm_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -362,7 +358,7 @@
id = "rubbershot10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c10mm/rubbershot
+ build_path = /obj/item/storage/box/ammo/c10mm_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -372,7 +368,7 @@
id = "rubbershot45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c45/rubbershot
+ build_path = /obj/item/storage/box/ammo/c45_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -382,7 +378,7 @@
id = "rubbershot556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 18000)
- build_path = /obj/item/ammo_box/c556mmHITP/rubbershot
+ build_path = /obj/item/storage/box/ammo/c556mm_rubber
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -392,7 +388,7 @@
id = "ap9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c9mm/ap
+ build_path = /obj/item/storage/box/ammo/c9mm/ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -402,7 +398,7 @@
id = "ap10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c10mm/ap
+ build_path = /obj/item/storage/box/ammo/c10mm_ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -412,7 +408,7 @@
id = "ap45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c45/ap
+ build_path = /obj/item/storage/box/ammo/c45_ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -422,7 +418,7 @@
id = "ap556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 18000, /datum/material/uranium = 1000)
- build_path = /obj/item/ammo_box/c556mmHITP/ap
+ build_path = /obj/item/storage/box/ammo/c556mm_ap
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -432,7 +428,7 @@
id = "hp9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c9mm/hp
+ build_path = /obj/item/storage/box/ammo/c9mm_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -442,7 +438,7 @@
id = "hp10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c10mm/hp
+ build_path = /obj/item/storage/box/ammo/c10mm_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -452,7 +448,7 @@
id = "hp45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c45/hp
+ build_path = /obj/item/storage/box/ammo/c45_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -462,7 +458,7 @@
id = "hp556mmHITP"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 18000, /datum/material/silver = 1000)
- build_path = /obj/item/ammo_box/c556mmHITP/hp
+ build_path = /obj/item/storage/box/ammo/c556mm_hp
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -472,7 +468,7 @@
id = "inc9mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000)
- build_path = /obj/item/ammo_box/c9mm/fire
+ build_path = /obj/item/storage/box/ammo/c9mm_incendiary
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -482,7 +478,7 @@
id = "inc10mm"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000)
- build_path = /obj/item/ammo_box/c10mm/fire
+ build_path = /obj/item/storage/box/ammo/c10mm_incendiary
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY
@@ -492,7 +488,7 @@
id = "inc45"
build_type = PROTOLATHE
materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000)
- build_path = /obj/item/ammo_box/c45/fire
+ build_path = /obj/item/storage/box/ammo/c45_incendiary
category = list("Ammo")
departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS
@@ -737,5 +733,5 @@
id = "c9mmautolathe"
build_type = AUTOLATHE
materials = list(/datum/material/iron = 15000)
- build_path = /obj/item/ammo_box/c9mm
+ build_path = /obj/item/storage/box/ammo/c9mm
category = list("Imported")
diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
index cab30f0219ef..3d466983f430 100644
--- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_clothing.dm
@@ -30,70 +30,6 @@ Slimecrossing Armor
REMOVE_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]")
user.remove_status_effect(/datum/status_effect/rebreathing)
-/obj/item/clothing/glasses/prism_glasses
- name = "prism glasses"
- desc = "The lenses seem to glow slightly, and reflect light into dazzling colors."
- icon = 'icons/obj/slimecrossing.dmi'
- icon_state = "prismglasses"
- actions_types = list(/datum/action/item_action/change_prism_colour, /datum/action/item_action/place_light_prism)
- var/glasses_color = "#FFFFFF"
-
-/obj/item/clothing/glasses/prism_glasses/item_action_slot_check(slot)
- if(slot == ITEM_SLOT_EYES)
- return TRUE
-
-/obj/structure/light_prism
- name = "light prism"
- desc = "A shining crystal of semi-solid light. Looks fragile."
- icon = 'icons/obj/slimecrossing.dmi'
- icon_state = "lightprism"
- density = FALSE
- anchored = TRUE
- max_integrity = 10
-
-/obj/structure/light_prism/Initialize(mapload, newcolor)
- . = ..()
- color = newcolor
- set_light_color(newcolor)
- set_light(5)
-
-/obj/structure/light_prism/attack_hand(mob/user)
- to_chat(user, "You dispel [src].")
- qdel(src)
-
-/datum/action/item_action/change_prism_colour
- name = "Adjust Prismatic Lens"
- icon_icon = 'icons/obj/slimecrossing.dmi'
- button_icon_state = "prismcolor"
-
-/datum/action/item_action/change_prism_colour/Trigger()
- if(!IsAvailable())
- return
- var/obj/item/clothing/glasses/prism_glasses/glasses = target
- var/new_color = input(owner, "Choose the lens color:", "Color change",glasses.glasses_color) as color|null
- if(!new_color)
- return
- glasses.glasses_color = new_color
-
-/datum/action/item_action/place_light_prism
- name = "Fabricate Light Prism"
- icon_icon = 'icons/obj/slimecrossing.dmi'
- button_icon_state = "lightprism"
-
-/datum/action/item_action/place_light_prism/Trigger()
- if(!IsAvailable())
- return
- var/obj/item/clothing/glasses/prism_glasses/glasses = target
- if(locate(/obj/structure/light_prism) in get_turf(owner))
- to_chat(owner, "There isn't enough ambient energy to fabricate another light prism here.")
- return
- if(istype(glasses))
- if(!glasses.glasses_color)
- to_chat(owner, "The lens is oddly opaque...")
- return
- to_chat(owner, "You channel nearby light into a glowing, ethereal prism.")
- new /obj/structure/light_prism(get_turf(owner), glasses.glasses_color)
-
/obj/item/clothing/head/peaceflower
name = "heroine bud"
desc = "An extremely addictive flower, full of peace magic."
diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
index 3f80f17e8a32..2bca49c62913 100644
--- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm
+++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm
@@ -14,7 +14,7 @@ Slimecrossing Weapons
/obj/item/melee/arm_blade/slime/attack(mob/living/L, mob/user)
. = ..()
if(prob(20))
- user.emote("scream")
+ user.force_scream()
//Adamantine shield - Chilling Adamantine
/obj/item/shield/adamantineshield
diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm
index 26c151e42316..7d19fb0f8cfd 100644
--- a/code/modules/research/xenobiology/crossbreeding/burning.dm
+++ b/code/modules/research/xenobiology/crossbreeding/burning.dm
@@ -228,7 +228,7 @@ Burning extracts:
user.visible_message("[src] melts onto [user]'s arm, boiling the flesh horribly!")
else
user.visible_message("[src] sublimates the flesh around [user]'s arm, transforming the bone into a gruesome blade!")
- user.emote("scream")
+ user.force_scream()
L.apply_damage(30,BURN,which_hand)
..()
diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm
index 9fe7857c073b..8b2aa42f0487 100644
--- a/code/modules/research/xenobiology/crossbreeding/chilling.dm
+++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm
@@ -216,8 +216,7 @@ Chilling extracts:
effect_desc = "Creates a pair of Prism Glasses, which allow the wearer to place colored light crystals."
/obj/item/slimecross/chilling/pyrite/do_effect(mob/user)
- user.visible_message("[src] crystallizes into a pair of spectacles!")
- new /obj/item/clothing/glasses/prism_glasses(get_turf(user))
+ user.visible_message("[src] does nothing sorry lol!")
..()
/obj/item/slimecross/chilling/red
diff --git a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm b/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
deleted file mode 100644
index e9ca8f3d4093..000000000000
--- a/code/modules/ruins/lavalandruin_code/elephantgraveyard.dm
+++ /dev/null
@@ -1,258 +0,0 @@
-//******Decoration objects
-//***Bone statues and giant skeleton parts.
-/obj/structure/statue/bone
- anchored = TRUE
- max_integrity = 120
- material_drop_type = /obj/item/stack/sheet/bone
- impressiveness = 18 // Carved from the bones of a massive creature, it's going to be a specticle to say the least
- layer = ABOVE_ALL_MOB_LAYER
-
-/obj/structure/statue/bone/rib
- name = "collosal rib"
- desc = "It's staggering to think that something this big could have lived, let alone died."
- oreAmount = 4
- icon = 'icons/obj/statuelarge.dmi'
- icon_state = "rib"
-
-/obj/structure/statue/bone/skull
- name = "collosal skull"
- desc = "The gaping maw of a dead, titanic monster."
- oreAmount = 12
- icon = 'icons/obj/statuelarge.dmi'
- icon_state = "skull"
-
-/obj/structure/statue/bone/skull/half
- desc = "The gaping maw of a dead, titanic monster. This one is cracked in half."
- oreAmount = 6
- icon = 'icons/obj/statuelarge.dmi'
- icon_state = "skull-half"
-
-//***Wasteland floor and rock turfs here.
-/turf/open/floor/plating/asteroid/basalt/wasteland //Like a more fun version of living in Arizona.
- name = "cracked earth"
- icon = 'icons/turf/floors.dmi'
- icon_state = "wasteland"
- base_icon_state = "wasteland"
- baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland
- digResult = /obj/item/stack/ore/glass/basalt
- initial_gas_mix = LAVALAND_DEFAULT_ATMOS
- slowdown = 0.5
- floor_variance = 30
- max_icon_states = 6
-
-/turf/closed/mineral/strong/wasteland
- name = "ancient dry rock"
- color = "#B5651D"
- environment_type = "wasteland"
- turf_type = /turf/open/floor/plating/asteroid/basalt/wasteland
- baseturfs = /turf/open/floor/plating/asteroid/basalt/wasteland
- smooth_icon = 'icons/turf/walls/rock_wall.dmi'
- base_icon_state = "rock_wall"
- smoothing_flags = SMOOTH_BITMASK | SMOOTH_BORDER
-
-/turf/closed/mineral/strong/wasteland/drop_ores()
- if(prob(10))
- new /obj/item/stack/ore/iron(src, 1)
- new /obj/item/stack/ore/glass(src, 1)
- new /obj/effect/decal/remains/human/grave(src, 1)
- else
- new /obj/item/stack/sheet/bone(src, 1)
-
-//***Oil well puddles.
-/obj/structure/sink/oil_well //You're not going to enjoy bathing in this...
- name = "oil well"
- desc = "A bubbling pool of oil.This would probably be valuable, had bluespace technology not destroyed the need for fossil fuels 200 years ago."
- icon = 'icons/obj/watercloset.dmi'
- icon_state = "puddle-oil"
- dispensedreagent = /datum/reagent/fuel/oil
-
-/obj/structure/sink/oil_well/Initialize()
- .=..()
- create_reagents(20)
- reagents.add_reagent(dispensedreagent, 20)
-
-/obj/structure/sink/oil_well/attack_hand(mob/M)
- flick("puddle-oil-splash",src)
- reagents.expose(M, TOUCH, 20) //Covers target in 20u of oil.
- to_chat(M, "You touch the pool of oil, only to get oil all over yourself. It would be wise to wash this off with water.")
-
-/obj/structure/sink/oil_well/attackby(obj/item/O, mob/user, params)
- flick("puddle-oil-splash",src)
- if(O.tool_behaviour == TOOL_SHOVEL && !(flags_1&NODECONSTRUCT_1)) //attempt to deconstruct the puddle with a shovel
- to_chat(user, "You fill in the oil well with soil.")
- O.play_tool_sound(src)
- deconstruct()
- return 1
- if(istype(O, /obj/item/reagent_containers)) //Refilling bottles with oil
- var/obj/item/reagent_containers/RG = O
- if(RG.is_refillable())
- if(!RG.reagents.holder_full())
- RG.reagents.add_reagent(dispensedreagent, min(RG.volume - RG.reagents.total_volume, RG.amount_per_transfer_from_this))
- to_chat(user, "You fill [RG] from [src].")
- return TRUE
- to_chat(user, "\The [RG] is full.")
- return FALSE
- if(user.a_intent != INTENT_HARM)
- to_chat(user, "You won't have any luck getting \the [O] out if you drop it in the oil.")
- return 1
- else
- return ..()
-
-/obj/structure/sink/oil_well/drop_materials()
- new /obj/effect/decal/cleanable/oil(loc)
-
-//***Grave mounds.
-/obj/structure/closet/crate/grave
- name = "burial mound"
- desc = "A marked patch of soil, adorned with a wooden cross"
- icon_state = "grave"
- dense_when_open = TRUE
- material_drop = /obj/item/stack/ore/glass/basalt
- material_drop_amount = 5
- opened = TRUE
- anchorable = FALSE
- anchored = TRUE
- locked = TRUE
- breakout_time = 900
- cutting_tool = TOOL_SHOVEL
- var/lead_tomb = FALSE
- var/first_open = FALSE
-
-/obj/structure/closet/crate/grave/attackby(obj/item/W, mob/user, params)
- .=..()
- if(istype(W, /obj/item/screwdriver))
- if(!user.is_literate())
- to_chat(user, "You scratch illegibly on [src]!")
- return
- var/t = stripped_input(user, "What would you like the inscription to be?", name, null, 53)
- if(user.get_active_held_item() != W)
- return
- if(!user.canUseTopic(src, BE_CLOSE))
- return
- if(t)
- desc = "[t]"
- return
-
-/obj/structure/closet/crate/grave/open(mob/living/user, obj/item/S, force = FALSE)
- if(!opened)
- to_chat(user, "The ground here is too hard to dig up with your bare hands. You'll need a shovel.")
- else
- to_chat(user, "The grave has already been dug up.")
-
-/obj/structure/closet/crate/grave/tool_interact(obj/item/S, mob/living/carbon/user)
- if(user.a_intent == INTENT_HELP) //checks to attempt to dig the grave, must be done on help intent only.
- if(!opened)
- if(S.tool_behaviour == cutting_tool)
- to_chat(user, "You start start to dig open \the [src] with \the [S]...")
- if (do_after(user,20, target = src))
- opened = TRUE
- locked = TRUE
- dump_contents()
- update_appearance()
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing)
- if(lead_tomb == TRUE && first_open == TRUE)
- user.gain_trauma(/datum/brain_trauma/magic/stalker)
- to_chat(user, "Oh no, no no no, THEY'RE EVERYWHERE! EVERY ONE OF THEM IS EVERYWHERE!")
- first_open = FALSE
- return 1
- return 1
- else
- to_chat(user, "You can't dig up a grave with \the [S.name].")
- return 1
- else
- to_chat(user, "The grave has already been dug up.")
- return 1
-
- else if((user.a_intent != INTENT_HELP) && opened) //checks to attempt to remove the grave entirely.
- if(S.tool_behaviour == cutting_tool)
- to_chat(user, "You start to remove \the [src] with \the [S].")
- if (do_after(user,15, target = src))
- to_chat(user, "You remove \the [src] completely.")
- SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "graverobbing", /datum/mood_event/graverobbing)
- deconstruct(TRUE)
- return 1
- return
-
-/obj/structure/closet/crate/grave/bust_open()
- ..()
- opened = TRUE
- update_appearance()
- dump_contents()
- return
-
-/obj/structure/closet/crate/grave/stone
- name = "burial mound"
- desc = "A marked patch of soil, adorned with a sandstone slab"
- icon_state = "grave_lead"
-
-/obj/structure/closet/crate/grave/loot
- name = "burial mound"
- desc = "A marked patch of soil, showing signs of a burial long ago. You wouldn't disturb a grave... right?"
- opened = FALSE
-
-/obj/structure/closet/crate/grave/loot/PopulateContents() //GRAVEROBBING IS NOW A FEATURE
- ..()
- new /obj/effect/decal/remains/human/grave(src)
- switch(rand(1,7))
- if(1)
- new /obj/item/coin/gold(src)
- new /obj/item/storage/wallet(src)
- if(2)
- new /obj/item/clothing/glasses/meson(src)
- if(3)
- new /obj/item/coin/silver(src)
- new /obj/item/shovel/spade(src)
- if(4)
- new /obj/item/storage/book/bible/booze(src)
- if(5)
- new /obj/item/clothing/neck/stethoscope(src)
- new /obj/item/scalpel(src)
- new /obj/item/hemostat(src)
-
- if(6)
- new /obj/item/reagent_containers/glass/beaker(src)
- new /obj/item/clothing/glasses/science(src)
- if(7)
- new /obj/item/clothing/glasses/sunglasses(src)
- new /obj/item/clothing/mask/cigarette/rollie(src)
-
-/obj/structure/closet/crate/grave/loot/lead_researcher
- name = "ominous burial mound"
- desc = "Even in a place filled to the brim with graves, this one shows a level of preperation and planning that fills you with dread."
- icon_state = "grave_lead"
- lead_tomb = TRUE
- first_open = TRUE
-
-/obj/structure/closet/crate/grave/loot/lead_researcher/PopulateContents() //ADVANCED GRAVEROBBING
- ..()
- new /obj/effect/decal/cleanable/blood/gibs/old(src)
-
-/obj/effect/decal/remains/human/grave
- turf_loc_check = FALSE
-
-//***Fluff items for lore/intrigue
-/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard
- name = "posted warning"
- desc = "It seems to be smudged with mud and... oil?"
- default_raw_text = "TO WHOM IT MAY CONCERN
This area is property of the Nanotrasen Mining Division.
Trespassing in this area is illegal, highly dangerous, and subject to several NDAs.
Please turn back now, under intergalactic law section 48-R."
-
-/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/rnd_notes
- name = "Research Findings: Day 26"
- desc = "Huh, this one page looks like it was torn out of a full book. How odd."
- icon_state = "docs_part"
- default_raw_text = "Researcher name: B--*--* J--*s.
Detailed findings:Today the camp site's cond-tion has wor--ene*. The ashst--ms keep blocking us off from le-ving the sit* for m-re supplies, and it's lo-king like we're out of pl*sma to p-wer the ge-erat*r. Can't rea-*y study c-*bon *ating with no li--ts, ya know? Da-*y's been going -*f again and ag-*n a-*ut h*w the company's left us to *ie here, but I j-s* keep tell-ng him to stop che*-in* out these damn graves. We m-y b* archaeologists, but -e sho*ld have t-e dec-**cy to know these grav-s are *-l NEW.
The rest of the page is just semantics about carbon dating methods."
-
-/obj/item/paper/crumpled/muddy/fluff/elephant_graveyard/mutiny
- name = "hastily scribbled note"
- desc = "Seems like someone was in a hurry."
- default_raw_text = "Alright, we all know that stuck up son a bitch is just doing this to keep us satisifed. Who the hell does he think he is, taking extra rations? We're OUT OF FOOD, CARL. Tomorrow at noon, we're going to try and take the ship by force. He HAS to be lying about the engine cooling down. He HAS TO BE. I'm tellin ya, with this implant I lifted off that last supply ship, I got the smarts to get us offa this shithole. Keep your knife handy carl."
-
-/obj/item/paper/fluff/ruins/elephant_graveyard/hypothesis
- name = "research document"
- desc = "Standard Nanotrasen typeface for important research documents."
- default_raw_text = "Day 9: Tenative Conclusions
While the area appears to be of significant cultural importance to the lizard race, outside of some sparce contact with native wildlife, we're yet to find any exact reasoning for the nature of this phenomenon. It seems that organic life is communally drawn to this planet as though it functions as a final resting place for intelligent life. As per company guidelines, this site shall be given the following classification: 'LZ-0271 - Elephant Graveyard'
Compiled list of Artifact findings (Currently Sent Offsite) Cultist Blade Fragments: x8 Brass Multiplicative Ore Sample: x105 Syndicate Revolutionary Leader Implant (Broken) x1 Extinct Cortical Borer Tissue Sample x1 Space Carp Fossil x3"
-
-/obj/item/paper/fluff/ruins/elephant_graveyard/final_message
- name = "important looking Note"
- desc = "This note is well written, and seems to have been put here so you'd find it."
- default_raw_text = "If you find this... you don't need to know who I am.
You need to leave this place. I dunno what shit they did to me out here, but I don't think I'm going to be making it out of here.
This place... it wears down your psyche. The other researchers out here laughed it off but... They were the first to go.
One by one they started turning on each other. The more they found out, the more they started fighting and arguing... As I speak now, I had to... I wound up having to put most of my men down. I know what I had to do, and I know there's no way left for me to live with myself. If anyone ever finds this, just don't touch the graves.
DO NOT. TOUCH. THE GRAVES. Don't be a dumbass, like we all were."
diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm
index 5af554a60557..1a5ad3d0d35f 100644
--- a/code/modules/shuttle/shuttle.dm
+++ b/code/modules/shuttle/shuttle.dm
@@ -249,7 +249,7 @@
name = "transit dock"
var/datum/map_zone/reserved_mapzone
- var/area/shuttle/transit/assigned_area
+ var/area/hyperspace/assigned_area
var/obj/docking_port/mobile/owner
/obj/docking_port/stationary/transit/Initialize()
@@ -409,7 +409,7 @@
shuttle_areas = list()
var/list/all_turfs = return_ordered_turfs(x, y, z, dir)
for(var/turf/curT as anything in all_turfs)
- var/area/shuttle/cur_area = curT.loc
+ var/area/ship/cur_area = curT.loc
if(istype(cur_area, area_type))
turf_count++
shuttle_areas[cur_area] = TRUE
@@ -651,7 +651,7 @@
continue // out of bounds
if(T0.type == T0.baseturfs)
continue // indestructible
- if(!all_shuttle_areas[T0.loc] || istype(T0.loc, /area/shuttle/transit))
+ if(!all_shuttle_areas[T0.loc] || istype(T0.loc, /area/hyperspace))
continue // not part of the shuttle
ripple_turfs += T1
@@ -722,13 +722,13 @@
var/obj/docking_port/stationary/S0 = docked
if(istype(S0, /obj/docking_port/stationary/transit) && timeLeft(1) <= PARALLAX_LOOP_TIME)
for(var/place in shuttle_areas)
- var/area/shuttle/shuttle_area = place
+ var/area/ship/shuttle_area = place
if(shuttle_area.parallax_movedir)
parallax_slowdown()
/obj/docking_port/mobile/proc/parallax_slowdown()
for(var/place in shuttle_areas)
- var/area/shuttle/shuttle_area = place
+ var/area/ship/shuttle_area = place
shuttle_area.parallax_movedir = FALSE
if(assigned_transit && assigned_transit.assigned_area)
assigned_transit.assigned_area.parallax_movedir = FALSE
diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm
index 395da25aaa5d..5bf2107a998b 100644
--- a/code/modules/shuttle/supply.dm
+++ b/code/modules/shuttle/supply.dm
@@ -1,11 +1,9 @@
GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
/mob/living,
- /obj/effect/rune,
/obj/structure/spider/spiderling,
/obj/item/disk/nuclear,
/obj/machinery/nuclearbomb,
/obj/item/beacon,
- /obj/singularity/narsie,
/obj/singularity/wizard,
/obj/machinery/teleport/station,
/obj/machinery/teleport/hub,
@@ -29,168 +27,3 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list(
/obj/machinery/camera,
/obj/item/gps
)))
-
-/*
-/obj/docking_port/mobile/supply
- name = "supply shuttle"
- callTime = 600
-
- dir = WEST
- port_direction = EAST
- width = 12
- dwidth = 5
- height = 7
- movement_force = list("KNOCKDOWN" = 0, "THROW" = 0)
-
-
- //Export categories for this run, this is set by console sending the shuttle.
- var/export_categories = EXPORT_CARGO
-
-/obj/docking_port/mobile/supply/register()
- . = ..()
- SSshuttle.supply = src
-
-/obj/docking_port/mobile/supply/proc/check_blacklist(areaInstances)
- for(var/place in areaInstances)
- var/area/shuttle/shuttle_area = place
- for(var/trf in shuttle_area)
- var/turf/T = trf
- for(var/a in T.GetAllContents())
- if(is_type_in_typecache(a, GLOB.blacklisted_cargo_types) && !istype(a, /obj/docking_port))
- return FALSE
- return TRUE
-
-/obj/docking_port/mobile/supply/request(obj/docking_port/stationary/S)
- if(mode != SHUTTLE_IDLE)
- return 2
- return ..()
-
-
-/obj/docking_port/mobile/supply/initiate_docking()
- if(get_docked() == SSshuttle.supply_away_port) // Buy when we leave home.
- buy()
- . = ..() // Fly/enter transit.
- if(. != DOCKING_SUCCESS)
- return
- if(get_docked() == SSshuttle.supply_away_port) // Sell when we get home
- sell()
-
-/obj/docking_port/mobile/supply/proc/buy()
- var/list/obj/miscboxes = list() //miscboxes are combo boxes that contain all small_item orders grouped
- var/list/misc_order_num = list() //list of strings of order numbers, so that the manifest can show all orders in a box
- var/list/misc_contents = list() //list of lists of items that each box will contain
- if(!SSshuttle.shoppinglist.len)
- return
-
- var/list/empty_turfs = list()
- for(var/place in shuttle_areas)
- var/area/shuttle/shuttle_area = place
- for(var/turf/open/floor/T in shuttle_area)
- if(T.is_blocked_turf())
- continue
- empty_turfs += T
-
- var/value = 0
- var/purchases = 0
- for(var/datum/supply_order/SO in SSshuttle.shoppinglist)
- if(!empty_turfs.len)
- break
- var/price = SO.pack.cost
- var/datum/bank_account/D
- if(SO.paying_account) //Someone paid out of pocket
- D = SO.paying_account
- price *= 1.1 //TODO make this customizable by the quartermaster
- else
- D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- if(D)
- if(!D.adjust_money(-price))
- if(SO.paying_account)
- D.bank_card_talk("Cargo order #[SO.id] rejected due to lack of funds. Credits required: [price]")
- continue
-
- if(SO.paying_account)
- D.bank_card_talk("Cargo order #[SO.id] has shipped. [price] credits have been charged to your bank account.")
- var/datum/bank_account/department/cargo = SSeconomy.get_dep_account(ACCOUNT_CAR)
- cargo.adjust_money(price - SO.pack.cost) //Cargo gets the handling fee
- value += SO.pack.cost
- SSshuttle.shoppinglist -= SO
- SSshuttle.orderhistory += SO
-
- if(SO.pack.small_item) //small_item means it gets piled in the miscbox
- if(SO.paying_account)
- if(!miscboxes.len || !miscboxes[D.account_holder]) //if there's no miscbox for this person
- miscboxes[D.account_holder] = new /obj/structure/closet/crate/secure/owned(pick_n_take(empty_turfs), SO.paying_account)
- miscboxes[D.account_holder].name = "small items crate - purchased by [D.account_holder]"
- misc_contents[D.account_holder] = list()
- for (var/item in SO.pack.contains)
- misc_contents[D.account_holder] += item
- misc_order_num[D.account_holder] = "[misc_order_num[D.account_holder]]#[SO.id] "
- else //No private payment, so we just stuff it all into a generic crate
- if(!miscboxes.len || !miscboxes["Cargo"])
- miscboxes["Cargo"] = new /obj/structure/closet/crate/secure(pick_n_take(empty_turfs))
- miscboxes["Cargo"].name = "small items crate"
- misc_contents["Cargo"] = list()
- miscboxes["Cargo"].req_access = list()
- for (var/item in SO.pack.contains)
- misc_contents["Cargo"] += item
- //new item(miscboxes["Cargo"])
- if(SO.pack.access)
- miscboxes["Cargo"].req_access += SO.pack.access
- misc_order_num["Cargo"] = "[misc_order_num["Cargo"]]#[SO.id] "
- else
- SO.generate(pick_n_take(empty_turfs))
-
- SSblackbox.record_feedback("nested tally", "cargo_imports", 1, list("[SO.pack.cost]", "[SO.pack.name]"))
- investigate_log("Order #[SO.id] ([SO.pack.name], placed by [key_name(SO.orderer_ckey)]), paid by [D.account_holder] has shipped.", INVESTIGATE_CARGO)
- if(SO.pack.dangerous)
- message_admins("\A [SO.pack.name] ordered by [ADMIN_LOOKUPFLW(SO.orderer_ckey)], paid by [D.account_holder] has shipped.")
- purchases++
-
- for(var/I in miscboxes)
- var/datum/supply_order/SO = new/datum/supply_order()
- SO.id = misc_order_num[I]
- SO.generateCombo(miscboxes[I], I, misc_contents[I])
- qdel(SO)
-
- var/datum/bank_account/cargo_budget = SSeconomy.get_dep_account(ACCOUNT_CAR)
- investigate_log("[purchases] orders in this shipment, worth [value] credits. [cargo_budget.account_balance] credits left.", INVESTIGATE_CARGO)
-
-/obj/docking_port/mobile/supply/proc/sell()
- var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_CAR)
- var/presale_points = D.account_balance
-
- if(!GLOB.exports_list.len) // No exports list? Generate it!
- setupExports()
-
- var/msg = ""
- var/matched_bounty = FALSE
-
- var/datum/export_report/ex = new
-
- for(var/place in shuttle_areas)
- var/area/shuttle/shuttle_area = place
- for(var/atom/movable/AM in shuttle_area)
- if(iscameramob(AM))
- continue
- if(bounty_ship_item_and_contents(AM, dry_run = FALSE))
- matched_bounty = TRUE
- if(!AM.anchored || istype(AM, /obj/mecha))
- export_item_and_contents(AM, export_categories , dry_run = FALSE, external_report = ex)
-
- if(ex.exported_atoms)
- ex.exported_atoms += "." //ugh
-
- if(matched_bounty)
- msg += "Bounty items received. An update has been sent to all bounty consoles. "
-
- for(var/datum/export/E in ex.total_amount)
- var/export_text = E.total_printout(ex)
- if(!export_text)
- continue
-
- msg += export_text + "\n"
- D.adjust_money(ex.total_value[E])
-
- SSshuttle.centcom_message = msg
- investigate_log("Shuttle contents sold for [D.account_balance - presale_points] credits. Contents: [ex.exported_atoms ? ex.exported_atoms.Join(",") + "." : "none."] Message: [SSshuttle.centcom_message || "none."]", INVESTIGATE_CARGO)
-*/
diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm
index 45d7f96b7df4..bc453eecd3d1 100644
--- a/code/modules/spells/spell.dm
+++ b/code/modules/spells/spell.dm
@@ -117,7 +117,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used
var/clothes_req = TRUE //see if it requires clothes
- var/cult_req = FALSE //SPECIAL SNOWFLAKE clothes required for cult only spells
var/human_req = FALSE //spell can only be cast by humans
var/nonabstract_req = FALSE //spell can only be cast by mobs that are physical entities
var/stat_allowed = FALSE //see if it requires being conscious/alive, need to set to 1 for ghostpells
@@ -209,13 +208,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th
if(!is_type_in_typecache(H.head, casting_clothes))
to_chat(H, "You don't feel strong enough without your hat!")
return FALSE
- if(cult_req) //CULT_REQ CLOTHES CHECK
- if(!istype(H.wear_suit, /obj/item/clothing/suit/magusred) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/cult))
- to_chat(H, "You don't feel strong enough without your armor.")
- return FALSE
- if(!istype(H.head, /obj/item/clothing/head/magus) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/cult))
- to_chat(H, "You don't feel strong enough without your helmet.")
- return FALSE
else
if(clothes_req || human_req)
to_chat(user, "This spell can only be cast by humans!")
diff --git a/code/modules/spells/spell_types/construct_spells.dm b/code/modules/spells/spell_types/construct_spells.dm
deleted file mode 100644
index 61c05c4170fe..000000000000
--- a/code/modules/spells/spell_types/construct_spells.dm
+++ /dev/null
@@ -1,327 +0,0 @@
-//////////////////////////////Construct Spells/////////////////////////
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser
- charge_max = 1800
- action_background_icon_state = "bg_demon"
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser/cult
- clothes_req = TRUE
- charge_max = 2500
-
-/obj/effect/proc_holder/spell/aoe_turf/area_conversion
- name = "Area Conversion"
- desc = "This spell instantly converts a small area around you."
-
- school = "transmutation"
- charge_max = 50
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = 2
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "areaconvert"
- action_background_icon_state = "bg_cult"
-
-/obj/effect/proc_holder/spell/aoe_turf/area_conversion/cast(list/targets, mob/user = usr)
- playsound(get_turf(user), 'sound/items/welder.ogg', 75, TRUE)
- for(var/turf/T in targets)
- T.narsie_act(FALSE, TRUE, 100 - (get_dist(user, T) * 25))
-
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/floor
- name = "Summon Cult Floor"
- desc = "This spell constructs a cult floor."
-
- school = "conjuration"
- charge_max = 20
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = 0
- summon_type = list(/turf/open/floor/engine/cult)
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "floorconstruct"
- action_background_icon_state = "bg_cult"
-
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
- name = "Summon Cult Wall"
- desc = "This spell constructs a cult wall."
-
- school = "conjuration"
- charge_max = 100
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = 0
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "lesserconstruct"
- action_background_icon_state = "bg_cult"
-
- summon_type = list(/turf/closed/wall/mineral/cult/artificer) //we don't want artificer-based runed metal farms
-
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/wall/reinforced
- name = "Greater Construction"
- desc = "This spell constructs a reinforced metal wall."
-
- school = "conjuration"
- charge_max = 300
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = 0
-
- summon_type = list(/turf/closed/wall/r_wall)
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone
- name = "Summon Soulstone"
- desc = "This spell reaches into Nar'Sie's realm, summoning one of the legendary fragments across time and space."
-
- school = "conjuration"
- charge_max = 2400
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = 0
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "summonsoulstone"
- action_background_icon_state = "bg_demon"
-
- summon_type = list(/obj/item/soulstone)
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/cult
- clothes_req = TRUE
- charge_max = 3600
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult
- summon_type = list(/obj/item/soulstone/anybody)
-
-/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone/noncult/purified
- summon_type = list(/obj/item/soulstone/anybody/purified)
-
-/obj/effect/proc_holder/spell/targeted/forcewall/cult
- name = "Shield"
- desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire."
- school = "transmutation"
- charge_max = 400
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- wall_type = /obj/effect/forcefield/cult
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "cultforcewall"
- action_background_icon_state = "bg_demon"
-
-
-
-/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift
- name = "Phase Shift"
- desc = "This spell allows you to pass through walls."
-
- school = "transmutation"
- charge_max = 250
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = -1
- include_user = TRUE
- jaunt_duration = 50 //in deciseconds
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "phaseshift"
- action_background_icon_state = "bg_demon"
- jaunt_in_time = 6
- jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith
- jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out
-
-/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/jaunt_steam(mobloc)
- return
-
-/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/angelic
- jaunt_in_type = /obj/effect/temp_visual/dir_setting/wraith/angelic
- jaunt_out_type = /obj/effect/temp_visual/dir_setting/wraith/out/angelic
-
-/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
- name = "Lesser Magic Missile"
- desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
-
- school = "evocation"
- charge_max = 400
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- max_targets = 6
- action_icon_state = "magicm"
- action_background_icon_state = "bg_demon"
- proj_type = /obj/projectile/magic/spell/magic_missile/lesser
-
-/obj/projectile/magic/spell/magic_missile/lesser
- color = "red" //Looks more culty this way
- range = 10
-
-/obj/effect/proc_holder/spell/targeted/smoke/disable
- name = "Paralysing Smoke"
- desc = "This spell spawns a cloud of paralysing smoke."
-
- school = "conjuration"
- charge_max = 200
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = -1
- include_user = TRUE
- cooldown_min = 20 //25 deciseconds reduction per rank
-
- smoke_spread = 3
- smoke_amt = 4
- action_icon_state = "smoke"
- action_background_icon_state = "bg_cult"
-
-/obj/effect/proc_holder/spell/pointed/abyssal_gaze
- name = "Abyssal Gaze"
- desc = "This spell instills a deep terror in your target, temporarily chilling and blinding it."
- charge_max = 750
- range = 5
- stat_allowed = FALSE
- school = "evocation"
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi'
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_background_icon_state = "bg_demon"
- action_icon_state = "abyssal_gaze"
- active_msg = "You prepare to instill a deep terror in a target..."
-
-/obj/effect/proc_holder/spell/pointed/abyssal_gaze/cast(list/targets, mob/user)
- if(!LAZYLEN(targets))
- to_chat(user, "No target found in range!")
- return FALSE
- if(!can_target(targets[1], user))
- return FALSE
-
- var/mob/living/carbon/target = targets[1]
- if(target.anti_magic_check(TRUE, TRUE))
- to_chat(user, "The spell had no effect!")
- to_chat(target, "You feel a freezing darkness closing in on you, but it rapidly dissipates.")
- return FALSE
-
- to_chat(target, "A freezing darkness surrounds you...")
- target.playsound_local(get_turf(target), 'sound/hallucinations/i_see_you1.ogg', 50, 1)
- user.playsound_local(get_turf(user), 'sound/effects/ghost2.ogg', 50, 1)
- target.become_blind(ABYSSAL_GAZE_BLIND)
- addtimer(CALLBACK(src, PROC_REF(cure_blindness), target), 40)
- target.adjust_bodytemperature(-200)
-
-/**
- * cure_blidness: Cures Abyssal Gaze blindness from the target
- *
- * Arguments:
- * * target The mob that is being cured of the blindness.
- */
-/obj/effect/proc_holder/spell/pointed/abyssal_gaze/proc/cure_blindness(mob/target)
- if(isliving(target))
- var/mob/living/L = target
- L.cure_blind(ABYSSAL_GAZE_BLIND)
-
-/obj/effect/proc_holder/spell/pointed/abyssal_gaze/can_target(atom/target, mob/user, silent)
- . = ..()
- if(!.)
- return FALSE
- if(!iscarbon(target))
- if(!silent)
- to_chat(user, "You can only target carbon based lifeforms!")
- return FALSE
- return TRUE
-
-/obj/effect/proc_holder/spell/pointed/dominate
- name = "Dominate"
- desc = "This spell dominates the mind of a lesser creature to the will of Nar'Sie, allying it only to her direct followers."
- charge_max = 600
- range = 7
- stat_allowed = FALSE
- school = "evocation"
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- ranged_mousepointer = 'icons/effects/mouse_pointers/cult_target.dmi'
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_background_icon_state = "bg_demon"
- action_icon_state = "dominate"
- active_msg = "You prepare to dominate the mind of a target..."
-
-/obj/effect/proc_holder/spell/pointed/dominate/cast(list/targets, mob/user)
- if(!LAZYLEN(targets))
- to_chat(user, "No target found in range.")
- return FALSE
- if(!can_target(targets[1], user))
- return FALSE
-
- var/mob/living/simple_animal/S = targets[1]
- S.add_atom_colour("#990000", FIXED_COLOUR_PRIORITY)
- S.faction = list("cult")
- playsound(get_turf(S), 'sound/effects/ghost.ogg', 100, TRUE)
- new /obj/effect/temp_visual/cult/sac(get_turf(S))
-
-/obj/effect/proc_holder/spell/pointed/dominate/can_target(atom/target, mob/user, silent)
- . = ..()
- if(!.)
- return FALSE
- if(!isanimal(target))
- if(!silent)
- to_chat(user, "Target is not a lesser creature!")
- return FALSE
-
- var/mob/living/simple_animal/S = target
- if(S.mind)
- if(!silent)
- to_chat(user, "[S] is too intelligent to dominate!")
- return FALSE
- if(S.stat)
- if(!silent)
- to_chat(user, "[S] is dead!")
- return FALSE
- if(S.sentience_type != SENTIENCE_ORGANIC)
- if(!silent)
- to_chat(user, "[S] cannot be dominated!")
- return FALSE
- if("cult" in S.faction)
- if(!silent)
- to_chat(user, "[S] is already serving Nar'Sie!")
- return FALSE
- return TRUE
-
-/obj/effect/proc_holder/spell/targeted/projectile/dumbfire/juggernaut
- name = "Gauntlet Echo"
- desc = "Channels energy into your gauntlet - firing its essence forward in a slow moving, yet devastating, attack."
- proj_type = /obj/projectile/magic/spell/juggernaut
- charge_max = 350
- clothes_req = FALSE
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "cultfist"
- action_background_icon_state = "bg_demon"
- sound = 'sound/weapons/resonator_blast.ogg'
-
-/obj/projectile/magic/spell/juggernaut
- name = "Gauntlet Echo"
- icon_state = "cultfist"
- alpha = 180
- damage = 30
- damage_type = BRUTE
- knockdown = 50
- hitsound = 'sound/weapons/punch3.ogg'
- trigger_range = 0
- check_holy = TRUE
- ignored_factions = list("cult")
- range = 15
- speed = 7
-
-/obj/projectile/magic/spell/juggernaut/on_hit(atom/target, blocked)
- . = ..()
- var/turf/T = get_turf(src)
- playsound(T, 'sound/weapons/resonator_blast.ogg', 100, FALSE)
- new /obj/effect/temp_visual/cult/sac(T)
- for(var/obj/O in range(src,1))
- if(O.density && !istype(O, /obj/structure/destructible/cult))
- O.take_damage(90, BRUTE, "melee", 0)
- new /obj/effect/temp_visual/cult/turf/floor(get_turf(O))
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
deleted file mode 100644
index f1654551df3a..000000000000
--- a/code/modules/spells/spell_types/devil.dm
+++ /dev/null
@@ -1,236 +0,0 @@
-/obj/effect/proc_holder/spell/targeted/conjure_item/violin
- item_type = /obj/item/instrument/violin/golden
- desc = "A devil's instrument of choice. Use this to summon/unsummon your golden violin."
- invocation_type = INVOCATION_WHISPER
- invocation = "I ain't had this much fun since Georgia."
- action_icon_state = "golden_violin"
- name = "Summon golden violin"
- action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- action_background_icon_state = "bg_demon"
-
-/obj/effect/proc_holder/spell/targeted/summon_contract
- name = "Summon infernal contract"
- desc = "Skip making a contract by hand, just do it by magic."
- invocation_type = INVOCATION_WHISPER
- invocation = "Just sign on the dotted line."
- include_user = FALSE
- range = 5
- clothes_req = FALSE
-
- school = "conjuration"
- charge_max = 150
- cooldown_min = 10
- action_icon_state = "spell_default"
- action_background_icon_state = "bg_demon"
-
-/obj/effect/proc_holder/spell/targeted/summon_contract/cast(list/targets, mob/user = usr)
- for(var/mob/living/carbon/C in targets)
- if(C.mind && user.mind)
- if(C.stat == DEAD)
- if(user.dropItemToGround(user.get_active_held_item()))
- var/obj/item/paper/contract/infernal/revive/contract = new(user.loc, C.mind, user.mind)
- user.put_in_hands(contract)
- else
- var/obj/item/paper/contract/infernal/contract // = new(user.loc, C.mind, contractType, user.mind)
- var/contractTypeName = input(user, "What type of contract?") in sortList(list("Power", "Wealth", "Prestige", "Magic", "Knowledge", "Friendship"))
- switch(contractTypeName)
- if("Power")
- contract = new /obj/item/paper/contract/infernal/power(C.loc, C.mind, user.mind)
- if("Wealth")
- contract = new /obj/item/paper/contract/infernal/wealth(C.loc, C.mind, user.mind)
- if("Prestige")
- contract = new /obj/item/paper/contract/infernal/prestige(C.loc, C.mind, user.mind)
- if("Magic")
- contract = new /obj/item/paper/contract/infernal/magic(C.loc, C.mind, user.mind)
- if("Knowledge")
- contract = new /obj/item/paper/contract/infernal/knowledge(C.loc, C.mind, user.mind)
- if("Friendship")
- contract = new /obj/item/paper/contract/infernal/friend(C.loc, C.mind, user.mind)
- C.put_in_hands(contract)
- else
- to_chat(user, "[C] seems to not be sentient. You cannot summon a contract for [C.p_them()].")
-
-
-/obj/effect/proc_holder/spell/aimed/fireball/hellish
- name = "Hellfire"
- desc = "This spell launches hellfire at the target."
-
- school = "evocation"
- charge_max = 80
- clothes_req = FALSE
- invocation = "Your very soul will catch fire!"
- invocation_type = INVOCATION_SHOUT
- range = 2
-
- projectile_type = /obj/projectile/magic
-
- action_background_icon_state = "bg_demon"
-
-/obj/effect/proc_holder/spell/targeted/infernal_jaunt
- name = "Infernal Jaunt"
- desc = "Use hellfire to phase out of existence."
- charge_max = 200
- clothes_req = FALSE
- selection_type = "range"
- range = -1
- cooldown_min = 0
- overlay = null
- include_user = TRUE
- action_icon_state = "jaunt"
- action_background_icon_state = "bg_demon"
- phase_allowed = TRUE
-
-/obj/effect/proc_holder/spell/targeted/infernal_jaunt/cast(list/targets, mob/living/user = usr)
- if(istype(user))
- if(istype(user.loc, /obj/effect/dummy/phased_mob/slaughter/))
- if(valid_location(user))
- to_chat(user, "You are now phasing in.")
- if(do_after(user, 1.5 SECONDS, user))
- if(valid_location(user))
- user.infernalphasein()
- else
- to_chat(user, "You are no longer near a potential signer.")
-
- else
- to_chat(user, "You can only re-appear near a potential signer.")
- revert_cast()
- return ..()
- else
- user.notransform = TRUE
- user.fakefire()
- to_chat(src, "You begin to phase back into sinful flames.")
- if(do_after(user, 1.5 SECONDS, user))
- user.infernalphaseout()
- else
- to_chat(user, "You must remain still while exiting.")
- user.notransform = FALSE
- user.fakefireextinguish()
- start_recharge()
- return
- revert_cast()
-
-/obj/effect/proc_holder/spell/targeted/infernal_jaunt/proc/valid_location(mob/living/user = usr)
- if(istype(get_area(user), /area/shuttle/)) // Can always phase in in a shuttle.
- return TRUE
- else
- for(var/mob/living/C in orange(2, get_turf(user))) //Can also phase in when nearby a potential buyer.
- if (C.owns_soul())
- return TRUE
- return FALSE
-
-/mob/living/proc/infernalphaseout()
- dust_animation()
- spawn_dust()
- visible_message("[src] disappears in a flashfire!")
- playsound(get_turf(src), 'sound/magic/enter_blood.ogg', 100, TRUE, -1)
- var/obj/effect/dummy/phased_mob/slaughter/holder = new /obj/effect/dummy/phased_mob/slaughter(loc)
- ExtinguishMob()
- forceMove(holder)
- holder = holder
- notransform = FALSE
- fakefireextinguish()
-
-/mob/living/proc/infernalphasein()
- if(notransform)
- to_chat(src, "You're too busy to jaunt in.")
- return FALSE
- fakefire()
- forceMove(drop_location())
- client.eye = src
- visible_message("[src] appears in a fiery blaze!")
- playsound(get_turf(src), 'sound/magic/exit_blood.ogg', 100, TRUE, -1)
- addtimer(CALLBACK(src, PROC_REF(fakefireextinguish)), 15, TIMER_UNIQUE)
-
-/obj/effect/proc_holder/spell/targeted/sintouch
- name = "Sin Touch"
- desc = "Subtly encourage someone to sin."
- charge_max = 1800
- clothes_req = FALSE
- selection_type = "range"
- range = 2
- cooldown_min = 0
- overlay = null
- include_user = FALSE
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "sintouch"
- action_background_icon_state = "bg_demon"
- phase_allowed = FALSE
- random_target = TRUE
- random_target_priority = TARGET_RANDOM
- max_targets = 3
- invocation = "TASTE SIN AND INDULGE!!"
- invocation_type = INVOCATION_SHOUT
-
-/obj/effect/proc_holder/spell/targeted/sintouch/ascended
- name = "Greater sin touch"
- charge_max = 100
- range = 7
- max_targets = 10
-
-/obj/effect/proc_holder/spell/targeted/sintouch/cast(list/targets, mob/living/user = usr)
- for(var/mob/living/carbon/human/H in targets)
- if(!H.mind)
- continue
- if(H.mind.has_antag_datum(/datum/antagonist/sintouched))
- continue
- if(H.anti_magic_check(FALSE, TRUE))
- continue
- H.mind.add_antag_datum(/datum/antagonist/sintouched)
- H.Paralyze(400)
-
-
-/obj/effect/proc_holder/spell/targeted/summon_dancefloor
- name = "Summon Dancefloor"
- desc = "When what a Devil really needs is funk."
- include_user = TRUE
- range = -1
- clothes_req = FALSE
-
- school = "conjuration"
- charge_max = 10
- cooldown_min = 50 //5 seconds, so the smoke can't be spammed
- action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- action_icon_state = "funk"
- action_background_icon_state = "bg_demon"
-
- var/list/dancefloor_turfs
- var/list/dancefloor_turfs_types
- var/dancefloor_exists = FALSE
- var/datum/effect_system/smoke_spread/transparent/dancefloor_devil/smoke
-
-
-/obj/effect/proc_holder/spell/targeted/summon_dancefloor/cast(list/targets, mob/user = usr)
- LAZYINITLIST(dancefloor_turfs)
- LAZYINITLIST(dancefloor_turfs_types)
-
- if(!smoke)
- smoke = new()
- smoke.set_up(0, get_turf(user))
- smoke.start()
-
- if(dancefloor_exists)
- dancefloor_exists = FALSE
- for(var/i in 1 to dancefloor_turfs.len)
- var/turf/T = dancefloor_turfs[i]
- T.ChangeTurf(dancefloor_turfs_types[i], flags = CHANGETURF_INHERIT_AIR)
- else
- var/list/funky_turfs = RANGE_TURFS(1, user)
- for(var/turf/closed/solid in funky_turfs)
- to_chat(user, "You're too close to a wall.")
- return
- dancefloor_exists = TRUE
- var/i = 1
- dancefloor_turfs.len = funky_turfs.len
- dancefloor_turfs_types.len = funky_turfs.len
- for(var/t in funky_turfs)
- var/turf/T = t
- dancefloor_turfs[i] = T
- dancefloor_turfs_types[i] = T.type
- T.ChangeTurf((i % 2 == 0) ? /turf/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b, flags = CHANGETURF_INHERIT_AIR)
- i++
-
-/datum/effect_system/smoke_spread/transparent/dancefloor_devil
- effect_type = /obj/effect/particle_effect/smoke/transparent/dancefloor_devil
-
-/obj/effect/particle_effect/smoke/transparent/dancefloor_devil
- lifetime = 2
diff --git a/code/modules/spells/spell_types/devil_boons.dm b/code/modules/spells/spell_types/devil_boons.dm
deleted file mode 100644
index 01ea14b15fa8..000000000000
--- a/code/modules/spells/spell_types/devil_boons.dm
+++ /dev/null
@@ -1,76 +0,0 @@
-/obj/effect/proc_holder/spell/targeted/summon_wealth
- name = "Summon wealth"
- desc = "The reward for selling your soul."
- invocation_type = "none"
- include_user = TRUE
- range = -1
- clothes_req = FALSE
- school = "conjuration"
- charge_max = 100
- cooldown_min = 10
- action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
- action_icon_state = "moneybag"
-
-
-/obj/effect/proc_holder/spell/targeted/summon_wealth/cast(list/targets, mob/user = usr)
- for(var/mob/living/carbon/C in targets)
- if(user.dropItemToGround(user.get_active_held_item()))
- var/obj/item = pick(
- new /obj/item/coin/gold(user.drop_location()),
- new /obj/item/coin/diamond(user.drop_location()),
- new /obj/item/coin/silver(user.drop_location()),
- new /obj/item/clothing/accessory/medal/gold(user.drop_location()),
- new /obj/item/stack/sheet/mineral/gold(user.drop_location()),
- new /obj/item/stack/sheet/mineral/silver(user.drop_location()),
- new /obj/item/stack/sheet/mineral/diamond(user.drop_location()),
- new /obj/item/holochip(user.drop_location(), 1000))
- C.put_in_hands(item)
-
-/obj/effect/proc_holder/spell/targeted/view_range
- name = "Distant vision"
- desc = "The reward for selling your soul."
- invocation_type = "none"
- include_user = TRUE
- range = -1
- clothes_req = FALSE
- charge_max = 50
- cooldown_min = 10
- action_icon = 'icons/mob/actions/actions_silicon.dmi'
- action_icon_state = "camera_jump"
- var/ranges = list(7,8,9,10)
-
-/obj/effect/proc_holder/spell/targeted/view_range/cast(list/targets, mob/user = usr)
- for(var/mob/C in targets)
- if(!C.client)
- continue
- C.client.view_size.setTo((input("Select view range:", "Range", 4) in ranges) - 7)
-
-/obj/effect/proc_holder/spell/targeted/summon_friend
- name = "Summon Friend"
- desc = "The reward for selling your soul."
- invocation_type = "none"
- include_user = TRUE
- range = -1
- clothes_req = FALSE
- charge_max = 50
- cooldown_min = 10
- action_icon = 'icons/mob/actions/actions_spells.dmi'
- action_icon_state = "sacredflame"
- var/mob/living/friend
- var/obj/effect/mob_spawn/human/demonic_friend/friendShell
-
-/obj/effect/proc_holder/spell/targeted/summon_friend/cast(list/targets, mob/user = usr)
- if(!QDELETED(friend))
- to_chat(friend, "Your master has deemed you a poor friend. Your durance in hell will now resume.")
- friend.dust(TRUE)
- qdel(friendShell)
- return
- if(!QDELETED(friendShell))
- qdel(friendShell)
- return
- for(var/C in targets)
- var/mob/living/L = C
- friendShell = new /obj/effect/mob_spawn/human/demonic_friend(L.loc, L.mind, src)
-
-/obj/effect/proc_holder/spell/targeted/conjure_item/spellpacket/robeless
- clothes_req = FALSE
diff --git a/code/modules/spells/spell_types/lichdom.dm b/code/modules/spells/spell_types/lichdom.dm
index 38e2f0df145e..e7d4a1e39884 100644
--- a/code/modules/spells/spell_types/lichdom.dm
+++ b/code/modules/spells/spell_types/lichdom.dm
@@ -67,8 +67,6 @@
H.dropItemToGround(H.w_uniform)
H.dropItemToGround(H.wear_suit)
H.dropItemToGround(H.head)
- H.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(H), ITEM_SLOT_OCLOTHING)
- H.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(H), ITEM_SLOT_HEAD)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(H), ITEM_SLOT_ICLOTHING)
// you only get one phylactery.
@@ -133,8 +131,6 @@
lich.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal/magic(lich), ITEM_SLOT_FEET)
lich.equip_to_slot_or_del(new /obj/item/clothing/under/color/black(lich), ITEM_SLOT_ICLOTHING)
- lich.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe/black(lich), ITEM_SLOT_OCLOTHING)
- lich.equip_to_slot_or_del(new /obj/item/clothing/head/wizard/black(lich), ITEM_SLOT_HEAD)
lich.real_name = mind.name
mind.transfer_to(lich)
diff --git a/code/modules/spells/spell_types/pointed/mind_transfer.dm b/code/modules/spells/spell_types/pointed/mind_transfer.dm
index e0ef3566fa0d..5b069756864d 100644
--- a/code/modules/spells/spell_types/pointed/mind_transfer.dm
+++ b/code/modules/spells/spell_types/pointed/mind_transfer.dm
@@ -30,7 +30,7 @@
var/mob/living/victim = targets[1] //The target of the spell whos body will be transferred to.
var/datum/mind/VM = victim.mind
- if(victim.anti_magic_check(TRUE, FALSE) || VM.has_antag_datum(/datum/antagonist/wizard) || VM.has_antag_datum(/datum/antagonist/cult) || VM.has_antag_datum(/datum/antagonist/changeling) || victim.key[1] == "@")
+ if(victim.anti_magic_check(TRUE, FALSE) || VM.has_antag_datum(/datum/antagonist/wizard) || VM.has_antag_datum(/datum/antagonist/changeling) || victim.key[1] == "@")
if(!silent)
to_chat(user, "[victim.p_their(TRUE)] mind is resisting your spell!")
return FALSE
diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm
index 254a43dc23af..3c087cc8840d 100644
--- a/code/modules/spells/spell_types/shapeshift.dm
+++ b/code/modules/spells/spell_types/shapeshift.dm
@@ -20,8 +20,7 @@
var/list/possible_shapes = list(/mob/living/simple_animal/mouse,\
/mob/living/simple_animal/pet/dog/corgi,\
/mob/living/simple_animal/bot/secbot/ed209,\
- /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,\
- /mob/living/simple_animal/hostile/construct/juggernaut)
+ /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper,)
/obj/effect/proc_holder/spell/targeted/shapeshift/cast(list/targets,mob/user = usr)
if(src in user.mob_spell_list)
diff --git a/code/modules/spells/spell_types/wizard.dm b/code/modules/spells/spell_types/wizard.dm
index 2fab8c5848ef..bc800a49c7d4 100644
--- a/code/modules/spells/spell_types/wizard.dm
+++ b/code/modules/spells/spell_types/wizard.dm
@@ -132,12 +132,6 @@
sound1 = 'sound/magic/blink.ogg'
sound2 = 'sound/magic/blink.ogg'
-/obj/effect/proc_holder/spell/targeted/turf_teleport/blink/cult
- name = "quickstep"
-
- charge_max = 100
- clothes_req = TRUE
-
/obj/effect/proc_holder/spell/targeted/area_teleport/teleport
name = "Teleport"
desc = "This spell teleports you to an area of your selection."
@@ -194,20 +188,6 @@
summon_type = list(/mob/living/simple_animal/hostile/carp)
cast_sound = 'sound/magic/summon_karp.ogg'
-/obj/effect/proc_holder/spell/aoe_turf/conjure/construct
- name = "Artificer"
- desc = "This spell conjures a construct which may be controlled by Shades."
- school = "conjuration"
- charge_max = 600
- clothes_req = FALSE
- invocation = "none"
- invocation_type = "none"
- range = 0
- summon_type = list(/obj/structure/constructshell)
- action_icon = 'icons/mob/actions/actions_cult.dmi'
- action_icon_state = "artificer"
- cast_sound = 'sound/magic/summonitems_generic.ogg'
-
/obj/effect/proc_holder/spell/aoe_turf/conjure/creature
name = "Summon Creature Swarm"
desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth."
@@ -223,12 +203,6 @@
summon_type = list(/mob/living/simple_animal/hostile/netherworld)
cast_sound = 'sound/magic/summonitems_generic.ogg'
-/obj/effect/proc_holder/spell/aoe_turf/conjure/creature/cult
- name = "Summon Creatures (DANGEROUS)"
- clothes_req = TRUE
- charge_max = 5000
- summon_amt = 2
-
/obj/effect/proc_holder/spell/aoe_turf/repulse
name = "Repulse"
desc = "This spell throws everything around the user away."
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 4c9b3556b6aa..e42cb866b508 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -158,26 +158,3 @@
/obj/machinery/satellite/meteor_shield/toggle(user)
if(!..(user))
return FALSE
- if(obj_flags & EMAGGED)
- if(active)
- change_meteor_chance(2)
- else
- change_meteor_chance(0.5)
-
-/obj/machinery/satellite/meteor_shield/proc/change_meteor_chance(mod)
- var/datum/round_event_control/E = locate(/datum/round_event_control/meteor_wave) in SSevents.control
- if(E)
- E.weight *= mod
-
-/obj/machinery/satellite/meteor_shield/Destroy()
- . = ..()
- if(active && (obj_flags & EMAGGED))
- change_meteor_chance(0.5)
-
-/obj/machinery/satellite/meteor_shield/emag_act(mob/user)
- if(obj_flags & EMAGGED)
- return
- obj_flags |= EMAGGED
- to_chat(user, "You access the satellite's debug mode, increasing the chance of meteor strikes.")
- if(active)
- change_meteor_chance(2)
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index 53e155210310..97196cf64ecc 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -373,7 +373,7 @@
if(total_damage >= max_damage * disable_threshold) //Easy limb disable disables the limb at 40% health instead of 0%
if(!last_maxed)
- if(owner.stat < UNCONSCIOUS)
+ if(owner.stat < UNCONSCIOUS && !HAS_TRAIT(owner, TRAIT_ANALGESIA))
INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob, emote), "scream")
last_maxed = TRUE
set_disabled(TRUE)
@@ -790,7 +790,10 @@
return
if(prob(5))
- to_chat(owner, "[pick("You feel broken bones moving around in your [name]!", "There are broken bones moving around in your [name]!", "The bones in your [name] are moving around!")]")
+ if(HAS_TRAIT(owner, TRAIT_ANALGESIA))
+ to_chat(owner, span_notice("[pick("You feel something shifting inside your [name].", "There is something moving inside [name].", "Something inside your [name] slips.")]"))
+ else
+ to_chat(owner, "[pick("You feel broken bones moving around in your [name]!", "There are broken bones moving around in your [name]!", "The bones in your [name] are moving around!")]")
receive_damage(rand(1, 3))
//1-3 damage every 20 tiles for every broken bodypart.
//A single broken bodypart will give you an average of 650 tiles to run before you get a total of 100 damage and fall into crit
diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm
index 07d30e727c77..4a98e6b93ea0 100644
--- a/code/modules/surgery/bodyparts/dismemberment.dm
+++ b/code/modules/surgery/bodyparts/dismemberment.dm
@@ -20,7 +20,8 @@
if(C.stat <= SOFT_CRIT)//No more screaming while unconsious
if(IS_ORGANIC_LIMB(affecting))//Chest is a good indicator for if a carbon is robotic in nature or not.
- INVOKE_ASYNC(C, TYPE_PROC_REF(/mob, emote), "scream")
+ if(!HAS_TRAIT(C, TRAIT_ANALGESIA)) //and do we actually feel pain?
+ INVOKE_ASYNC(C, TYPE_PROC_REF(/mob, emote), "scream")
SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "dismembered", /datum/mood_event/dismembered)
diff --git a/code/modules/surgery/bodyparts/head.dm b/code/modules/surgery/bodyparts/head.dm
index 05dffd8b4ffd..4c9a9be3b6d4 100644
--- a/code/modules/surgery/bodyparts/head.dm
+++ b/code/modules/surgery/bodyparts/head.dm
@@ -271,11 +271,6 @@
max_damage = 500
animal_origin = ALIEN_BODYPART
-/obj/item/bodypart/head/devil
- dismemberable = 0
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
/obj/item/bodypart/head/larva
icon = 'icons/mob/animal_parts.dmi'
icon_state = "larva_head"
diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm
index 5f89d15aa95f..543a0e5fddde 100644
--- a/code/modules/surgery/bodyparts/parts.dm
+++ b/code/modules/surgery/bodyparts/parts.dm
@@ -43,11 +43,6 @@
max_damage = 500
animal_origin = ALIEN_BODYPART
-/obj/item/bodypart/chest/devil
- dismemberable = 0
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
/obj/item/bodypart/chest/larva
icon = 'icons/mob/animal_parts.dmi'
icon_state = "larva_chest"
@@ -153,12 +148,6 @@
max_damage = 100
animal_origin = ALIEN_BODYPART
-/obj/item/bodypart/l_arm/devil
- dismemberable = FALSE
- can_be_disabled = FALSE
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
/obj/item/bodypart/r_arm
name = "right arm"
desc = "Over 87% of humans are right handed. That figure is much lower \
@@ -255,12 +244,6 @@
max_damage = 100
animal_origin = ALIEN_BODYPART
-/obj/item/bodypart/r_arm/devil
- dismemberable = FALSE
- can_be_disabled = FALSE
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
/obj/item/bodypart/leg/left
name = "left leg"
desc = "Some athletes prefer to tie their left shoelaces first for good \
@@ -346,12 +329,6 @@
max_damage = 100
animal_origin = ALIEN_BODYPART
-/obj/item/bodypart/leg/left/devil
- dismemberable = FALSE
- can_be_disabled = FALSE
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
-
/obj/item/bodypart/leg/right
name = "right leg"
desc = "You put your right leg in, your right leg out. In, out, in, out, \
@@ -438,9 +415,3 @@
can_be_disabled = FALSE
max_damage = 100
animal_origin = ALIEN_BODYPART
-
-/obj/item/bodypart/leg/right/devil
- dismemberable = FALSE
- can_be_disabled = FALSE
- max_damage = 5000
- animal_origin = DEVIL_BODYPART
diff --git a/code/modules/surgery/experimental_dissection.dm b/code/modules/surgery/experimental_dissection.dm
index eccf729d263f..fd3c740b9eb1 100644
--- a/code/modules/surgery/experimental_dissection.dm
+++ b/code/modules/surgery/experimental_dissection.dm
@@ -13,7 +13,7 @@
/datum/surgery_step/clamp_bleeders,
/datum/surgery_step/close)
possible_locs = list(BODY_ZONE_CHEST)
- target_mobtypes = list(/mob/living) //Feel free to dissect devils but they're magic.
+ target_mobtypes = list(/mob/living)
replaced_by = /datum/surgery/advanced/experimental_dissection/adv
requires_tech = FALSE
var/value_multiplier = 0.25
diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm
index 8959a7f99715..39fb1d71b258 100644
--- a/code/modules/surgery/organic_steps.dm
+++ b/code/modules/surgery/organic_steps.dm
@@ -152,13 +152,17 @@
implements = list(
TOOL_SAW = 100,
/obj/item/melee/axe/fire = 50,
+ /obj/item/gear_handle/anglegrinder = 50,
/obj/item/melee/arm_blade = 40,
/obj/item/hatchet = 40,
/obj/item/melee/knife/butcher = 33,
+ /obj/item/gun/energy/plasmacutter = 30,
/obj/item = 10) //10% success (sort of) with any sharp item with a force>=10
time = 5.4 SECONDS
preop_sound = list(
/obj/item/circular_saw = 'sound/surgery/saw.ogg',
+ /obj/item/gear_handle/anglegrinder = 'sound/surgery/saw.ogg',
+ /obj/item/gun/energy/plasmacutter = 'sound/weapons/plasma_cutter.ogg',
/obj/item/melee/arm_blade = 'sound/surgery/scalpel1.ogg',
/obj/item/melee/axe/fire = 'sound/surgery/scalpel1.ogg',
/obj/item/hatchet = 'sound/surgery/scalpel1.ogg',
diff --git a/code/modules/surgery/organs/tongue.dm b/code/modules/surgery/organs/tongue.dm
index 4469410f9b58..729dc0fe8403 100644
--- a/code/modules/surgery/organs/tongue.dm
+++ b/code/modules/surgery/organs/tongue.dm
@@ -276,7 +276,7 @@
/obj/item/organ/tongue/robot/emp_act(severity)
owner.apply_effect(EFFECT_STUTTER, 120)
- owner.emote("scream")
+ owner.force_scream()
to_chat(owner, "Alert: Vocal cords are malfunctioning.")
/obj/item/organ/tongue/robot/handle_speech(datum/source, list/speech_args)
diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm
index 6a5a344b177e..b86c5b8b86ce 100644
--- a/code/modules/surgery/organs/vocal_cords.dm
+++ b/code/modules/surgery/organs/vocal_cords.dm
@@ -99,10 +99,7 @@
var/log_message = uppertext(message)
if(!span_list || !span_list.len)
- if(iscultist(user))
- span_list = list("narsiesmall")
- else
- span_list = list()
+ span_list = list()
user.say(message, spans = span_list, sanitize = FALSE)
@@ -135,10 +132,6 @@
if(user.mind.assigned_role == "Mime")
power_multiplier *= 0.5
- //Cultists are closer to their gods and are more powerful, but they'll give themselves away
- if(iscultist(user))
- power_multiplier *= 2
-
//Try to check if the speaker specified a name or a job to focus on
var/list/specific_listeners = list()
var/found_string = null
@@ -148,15 +141,8 @@
for(var/V in listeners)
var/mob/living/L = V
- var/datum/antagonist/devil/devilinfo = is_devil(L)
- if(devilinfo && findtext(message, devilinfo.truename))
- var/start = findtext(message, devilinfo.truename)
- listeners = list(L) //Devil names are unique.
- power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up
- //Cut out the name so it doesn't trigger commands
- message = copytext(message, 1, start) + copytext(message, start + length(devilinfo.truename))
- break
- else if(findtext(message, L.real_name, 1, length(L.real_name) + 1))
+
+ if(findtext(message, L.real_name, 1, length(L.real_name) + 1))
specific_listeners += L //focus on those with the specified name
//Cut out the name so it doesn't trigger commands
found_string = L.real_name
@@ -331,11 +317,7 @@
for(var/V in listeners)
var/mob/living/L = V
var/text = ""
- if(is_devil(L))
- var/datum/antagonist/devil/devilinfo = is_devil(L)
- text = devilinfo.truename
- else
- text = L.real_name
+ text = L.real_name
addtimer(CALLBACK(L, TYPE_PROC_REF(/atom/movable, say), text), 5 * i)
i++
diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm
index 13e4e3b784c6..7aef39fb5451 100644
--- a/code/modules/surgery/revival.dm
+++ b/code/modules/surgery/revival.dm
@@ -42,7 +42,7 @@
. = TRUE
if(istype(tool, /obj/item/shockpaddles))
var/obj/item/shockpaddles/S = tool
- if((S.req_defib && !S.defib.powered) || !S.wielded || S.cooldown || S.busy)
+ if((S.req_defib && !S.defib.powered) || !HAS_TRAIT(S, TRAIT_WIELDED) || S.cooldown || S.busy)
to_chat(user, "You need to wield both paddles, and [S.defib] must be powered!")
return FALSE
if(istype(tool, /obj/item/melee/baton))
diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm
index 4b4e10edd7ac..ba42b9bc9f46 100644
--- a/code/modules/unit_tests/_unit_tests.dm
+++ b/code/modules/unit_tests/_unit_tests.dm
@@ -41,6 +41,11 @@
/// Intended to be used in the manner of `TEST_FOCUS(/datum/unit_test/math)`
#define TEST_FOCUS(test_path) ##test_path { focus = TRUE; }
+/// Logs a noticable message on GitHub, but will not mark as an error.
+/// Use this when something shouldn't happen and is of note, but shouldn't block CI.
+/// Does not mark the test as failed.
+#define TEST_NOTICE(source, message) source.log_for_test((##message), "notice", __FILE__, __LINE__)
+
/// Constants indicating unit test completion status
#define UNIT_TEST_PASSED 0
#define UNIT_TEST_FAILED 1
@@ -81,7 +86,6 @@
#include "keybinding_init.dm"
#include "machine_disassembly.dm"
#include "open_air.dm"
-#include "outfit_names.dm"
#include "outfit_sanity.dm"
#include "overmap.dm"
#include "pills.dm"
diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm
index 9aee2ca10624..0e0248162fc8 100644
--- a/code/modules/unit_tests/create_and_destroy.dm
+++ b/code/modules/unit_tests/create_and_destroy.dm
@@ -35,8 +35,6 @@
/obj/machinery/power/shuttle/engine/liquid,
//needs a template
/obj/effect/landmark/subship,
- //needs a friend :(
- /obj/effect/mob_spawn/human/demonic_friend,
//needs a derg
/obj/structure/carp_rift,
//doesn't have icons
diff --git a/code/modules/unit_tests/icons/worn_icons.dm b/code/modules/unit_tests/icons/worn_icons.dm
index eb2d84b73f68..3dba4d7c8e03 100644
--- a/code/modules/unit_tests/icons/worn_icons.dm
+++ b/code/modules/unit_tests/icons/worn_icons.dm
@@ -78,7 +78,7 @@
spacer = "\n\t"
if(cached_slot_flags & ITEM_SLOT_EYES)
- icon_file = 'icons/mob/clothing/eyes.dmi'
+ icon_file = 'icons/mob/clothing/eyes/eyes.dmi'
if(!(icon_state in icon_states(icon_file, 1)))
already_warned_icons += icon_state
fail_reasons += "[spacer][item_path] using invalid [mob_overlay_state ? "mob_overlay_state" : "icon_state"], \"[icon_state]\" in '[icon_file]'[match_message]"
diff --git a/code/modules/unit_tests/outfit_names.dm b/code/modules/unit_tests/outfit_names.dm
deleted file mode 100644
index b381bfeb7bf5..000000000000
--- a/code/modules/unit_tests/outfit_names.dm
+++ /dev/null
@@ -1,12 +0,0 @@
-/datum/unit_test/outfit_names/Run()
- var/list/outfit_names = list()
-
- for(var/datum/outfit/outfit_type as anything in subtypesof(/datum/outfit))
- var/name = initial(outfit_type.name)
-
- if(name in outfit_names)
- TEST_FAIL("Outfit name [name] is not unique: [outfit_type], [outfit_names[name]]")
-
- outfit_names[name] = outfit_type
-
-
diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm
index 4dc12b4dc6e3..a09395d42103 100644
--- a/code/modules/unit_tests/outfit_sanity.dm
+++ b/code/modules/unit_tests/outfit_sanity.dm
@@ -6,7 +6,7 @@
if (outfit.random != TRUE) \
TEST_FAIL("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \
else \
- log_world("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \
+ log_test("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \
} \
}
@@ -26,6 +26,7 @@
var/prototype_name = initial(prototype_outfit.name)
var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human)
+ var/list/outfit_names = list()
for (var/outfit_type in subtypesof(/datum/outfit))
// Only make one human and keep undressing it because it's much faster
for (var/obj/item/I in H.get_equipped_items(include_pockets = TRUE))
@@ -33,8 +34,12 @@
var/datum/outfit/outfit = new outfit_type
- if(outfit.name == prototype_name)
+ var/outfit_name = outfit.name
+ if(outfit_name == prototype_name)
TEST_FAIL("[outfit.type]'s name is invalid! Uses default outfit name!")
+ if(outfit_name in outfit_names)
+ TEST_FAIL("Outfit name [outfit_name] is not unique: [outfit_type], [outfit_names[outfit_name]]")
+ outfit_names[outfit_name] = outfit_type
outfit.pre_equip(H, TRUE)
CHECK_OUTFIT_SLOT(uniform, ITEM_SLOT_ICLOTHING)
@@ -67,7 +72,7 @@
if (outfit.random != TRUE)
TEST_FAIL("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.")
else
- log_world("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.")
+ log_test("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.")
#undef CHECK_OUTFIT_SLOT
diff --git a/code/modules/unit_tests/ship_outpost_placement.dm b/code/modules/unit_tests/ship_outpost_placement.dm
index 48bbd6a181e3..0762af79e304 100644
--- a/code/modules/unit_tests/ship_outpost_placement.dm
+++ b/code/modules/unit_tests/ship_outpost_placement.dm
@@ -3,7 +3,7 @@
// disabled or intended as subshuttles
for(var/name as anything in SSmapping.shuttle_templates)
var/datum/map_template/shuttle/map = SSmapping.shuttle_templates[name]
- log_world("Loading [map.name]")
+ log_test("Loading [map.name]")
try
// they'll spawn in empty space, and won't be docked
new /datum/overmap/ship/controlled(list("x" = 1, "y" = 1), map)
@@ -13,10 +13,10 @@
for(var/outpost_type in subtypesof(/datum/overmap/outpost))
var/datum/overmap/outpost/test_outpost = new outpost_type()
- log_world("Testing [test_outpost.type]")
+ log_test("Testing [test_outpost.type]")
for(var/datum/overmap/ship/controlled/cur_ship as anything in SSovermap.controlled_ships)
- log_world(" - Docking [cur_ship.source_template.name]")
+ log_test(" - Docking [cur_ship.source_template.name]")
// already-docked ships are ignored.
// this was added to stop runtimes when subshuttles, which were docked to their parent ship, attempted to dock to the outpost as part of this test.
diff --git a/code/modules/unit_tests/unit_test.dm b/code/modules/unit_tests/unit_test.dm
index 7240adb33855..18b5b12e7f48 100644
--- a/code/modules/unit_tests/unit_test.dm
+++ b/code/modules/unit_tests/unit_test.dm
@@ -85,38 +85,58 @@ GLOBAL_VAR(test_log)
allocated += instance
return instance
+/// Logs a test message. Will use GitHub action syntax found at https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions
+/datum/unit_test/proc/log_for_test(text, priority, file, line, test_path)
+ // Need to escape the text to properly support newlines.
+ var/annotation_text = replacetext(text, "%", "%25")
+ annotation_text = replacetext(annotation_text, "\n", "%0A")
+
+ log_world("::[priority] file=[file],line=[line],title=[test_path]: [type]::[annotation_text]")
+
/proc/RunUnitTest(test_path, list/test_results)
var/datum/unit_test/test = new test_path
GLOB.current_test = test
var/duration = REALTIMEOFDAY
+ log_world("::group::[test_path]")
test.Run()
duration = REALTIMEOFDAY - duration
GLOB.current_test = null
GLOB.failed_any_test |= !test.succeeded
- var/list/log_entry = list(
- "[test.succeeded ? TEST_OUTPUT_GREEN("PASS") : TEST_OUTPUT_RED("FAIL")]: [test_path] [duration / 10]s",
- )
+ var/list/log_entry = list()
var/list/fail_reasons = test.fail_reasons
+ var/test_output_desc = "[test_path]"
+ var/message = ""
+
for(var/reasonID in 1 to LAZYLEN(fail_reasons))
var/text = fail_reasons[reasonID][1]
var/file = fail_reasons[reasonID][2]
var/line = fail_reasons[reasonID][3]
- /// Github action annotation.
- log_world("::error file=[file],line=[line],title=[test_path]::[text]")
+ test.log_for_test(text, "error", file, line, test_path)
// Normal log message
- log_entry += "\tREASON #[reasonID]: [text] at [file]:[line]"
+ log_entry += "\tFAILURE #[reasonID]: [text] at [file]:[line]"
+
+ if(length(log_entry))
+ message = log_entry.Join("\n")
+ log_test(message)
- var/message = log_entry.Join("\n")
- log_test(message)
+ test_output_desc += " [duration / 10]s"
+ if (test.succeeded)
+ log_world("[TEST_OUTPUT_GREEN("PASS")] [test_output_desc]")
- test_results[test_path] = list("status" = test.succeeded ? UNIT_TEST_PASSED : UNIT_TEST_FAILED, "message" = message, "name" = test_path)
+ log_world("::endgroup::")
+
+ if (!test.succeeded)
+ log_world("::error::[TEST_OUTPUT_RED("FAIL")] [test_output_desc]")
+
+ var/final_status = test.succeeded ? UNIT_TEST_PASSED : UNIT_TEST_FAILED
+ test_results[test_path] = list("status" = final_status, "message" = message, "name" = test_path)
qdel(test)
@@ -141,6 +161,10 @@ GLOBAL_VAR(test_log)
CHECK_TICK //We check tick first because the unit test we run last may be so expensive that checking tick will lock up this loop forever
RunUnitTest(unit_path, test_results)
+ var/file_name = "data/unit_tests.json"
+ fdel(file_name)
+ file(file_name) << json_encode(test_results)
+
SSticker.force_ending = TRUE
//We have to call this manually because del_text can preceed us, and SSticker doesn't fire in the post game
SSticker.declare_completion()
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index ef4630109543..5566c11f7575 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -869,7 +869,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/ammo/toydarts
name = "Box of Riot Darts"
desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!"
- item = /obj/item/ammo_box/foambox/riot
+ item = /obj/item/storage/box/ammo/foam_darts/riot
cost = 2
surplus = 0
illegal_tech = FALSE
@@ -1200,16 +1200,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/codespeak_manual/unlimited
cost = 3
-/datum/uplink_item/stealthy_tools/combatbananashoes
- name = "Combat Banana Shoes"
- desc = "While making the wearer immune to most slipping attacks like regular combat clown shoes, these shoes \
- can generate a large number of synthetic banana peels as the wearer walks, slipping up would-be pursuers. They also \
- squeak significantly louder."
- item = /obj/item/clothing/shoes/clown_shoes/banana_shoes/combat
- cost = 6
- surplus = 0
- include_modes = list(/datum/game_mode/nuclear/clown_ops)
-
/datum/uplink_item/stealthy_tools/emplight
name = "EMP Flashlight"
desc = "A small, self-recharging, short-ranged EMP device disguised as a working flashlight. \
@@ -1801,13 +1791,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
restricted_roles = list("Curator")
limited_stock = 1 //please don't spam deadchat
-/datum/uplink_item/role_restricted/cultconstructkit
- name = "Cult Construct Kit"
- desc = "Recovered from an abandoned Nar'sie cult lair two construct shells and a stash of empty soulstones was found. These were purified to prevent occult contamination and have been put in a belt so they may be used as an accessible source of disposable minions. The construct shells have been packaged into two beacons for rapid and portable deployment."
- item = /obj/item/storage/box/syndie_kit/cultconstructkit
- cost = 20
- restricted_roles = list("Chaplain")
-
/datum/uplink_item/role_restricted/lawnmower
name = "Gas powered lawn mower"
desc = "A lawn mower is a machine utilizing one or more revolving blades to cut a grass surface to an even height, or bodies if that's your thing"
@@ -1873,15 +1856,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 12
restricted_roles = list("Chemist", "Chief Medical Officer")
-/datum/uplink_item/role_restricted/reverse_bear_trap
- name = "Reverse Bear Trap"
- desc = "An ingenious execution device worn on (or forced onto) the head. Arming it starts a 1-minute kitchen timer mounted on the bear trap. When it goes off, the trap's jaws will \
- violently open, instantly killing anyone wearing it by tearing their jaws in half. To arm, attack someone with it while they're not wearing headgear, and you will force it onto their \
- head after three seconds uninterrupted."
- cost = 5
- item = /obj/item/reverse_bear_trap
- restricted_roles = list("Clown")
-
/datum/uplink_item/role_restricted/laser_arm
name = "Laser Arm Implant"
desc = "An implant that grants you a recharging laser gun inside your arm. Weak to EMPs. Comes with a syndicate autosurgeon for immediate self-application."
diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm
index e9addbd2d5bf..1df30ff3be9b 100644
--- a/code/modules/vehicles/cars/clowncar.dm
+++ b/code/modules/vehicles/cars/clowncar.dm
@@ -111,8 +111,7 @@
var/randomnum = rand(1,6)
switch(randomnum)
if(1)
- visible_message("[user] presses one of the colorful buttons on [src], and a special banana peel drops out of it.")
- new /obj/item/grown/bananapeel/specialpeel(loc)
+ visible_message("[user] presses one of the colorful buttons on [src], and doesn't do anything. Oops.")
if(2)
visible_message("[user] presses one of the colorful buttons on [src], and unknown chemicals flood out of it.")
var/datum/reagents/R = new/datum/reagents(300)
diff --git a/code/modules/vehicles/vehicle_key.dm b/code/modules/vehicles/vehicle_key.dm
index ba21f01289b3..6c6623901331 100644
--- a/code/modules/vehicles/vehicle_key.dm
+++ b/code/modules/vehicles/vehicle_key.dm
@@ -12,15 +12,3 @@
/obj/item/key/janitor
desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
icon_state = "keyjanitor"
-
-/obj/item/key/lasso
- name = "bone lasso"
- desc = "Perfect for taming all kinds of supernatural beasts! (Warning: only perfect for taming one kind of supernatural beast.)"
- force = 12
- icon_state = "lasso"
- item_state = "chain"
- lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi'
- attack_verb = list("flogged", "whipped", "lashed", "disciplined")
- hitsound = 'sound/weapons/whip.ogg'
- slot_flags = ITEM_SLOT_BELT
diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm
index 6d73fad566f6..0724b7233ef9 100644
--- a/code/modules/vending/_vending.dm
+++ b/code/modules/vending/_vending.dm
@@ -552,7 +552,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
L.client.give_award(/datum/award/achievement/misc/vendor_squish, L) // good job losing a fight with an inanimate object idiot
L.Paralyze(60)
- L.emote("scream")
+ L.force_scream()
playsound(L, 'sound/effects/blobattack.ogg', 40, TRUE)
playsound(L, 'sound/effects/splat.ogg', 50, TRUE)
diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm
index 367c309d59a1..413b0238ce5d 100644
--- a/code/modules/vending/autodrobe.dm
+++ b/code/modules/vending/autodrobe.dm
@@ -7,8 +7,6 @@
product_slogans = "Dress for success!;Suited and booted!;It's show time!;Why leave style up to fate? Use AutoDrobe!"
vend_reply = "Thank you for using AutoDrobe!"
products = list(
- /obj/item/clothing/suit/chickensuit = 1,
- /obj/item/clothing/head/chicken = 1,
/obj/item/clothing/under/costume/gladiator = 1,
/obj/item/clothing/head/helmet/gladiator = 1,
/obj/item/clothing/under/rank/command/captain/suit = 1,
@@ -29,16 +27,11 @@
/obj/item/clothing/head/that = 1,
/obj/item/clothing/under/costume/kilt = 1,
/obj/item/clothing/head/beret = 1,
- /obj/item/clothing/head/beret/vintage = 1,
- /obj/item/clothing/head/beret/archaic = 1,
/obj/item/clothing/accessory/waistcoat = 1,
- /obj/item/clothing/glasses/monocle =1,
- /obj/item/clothing/head/bowler = 1,
/obj/item/cane = 1,
/obj/item/clothing/under/suit/sl = 1,
/obj/item/clothing/mask/fakemoustache = 1,
/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,
- /obj/item/clothing/head/plaguedoctorhat = 1,
/obj/item/clothing/mask/gas/plaguedoctor = 1,
/obj/item/clothing/suit/toggle/owlwings = 1,
/obj/item/clothing/under/costume/owl = 1,
@@ -53,17 +46,9 @@
/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/head/bandana = 1,
/obj/item/clothing/head/trapper = 1,
- /obj/item/clothing/suit/imperium_monk = 1,
/obj/item/clothing/mask/gas/cyborg = 1,
- /obj/item/clothing/suit/chaplainsuit/holidaypriest = 1,
- /obj/item/clothing/suit/chaplainsuit/whiterobe = 1,
- /obj/item/clothing/head/wizard/marisa/fake = 1,
- /obj/item/clothing/suit/wizrobe/marisa/fake = 1,
/obj/item/clothing/under/dress/sundress = 1,
- /obj/item/clothing/head/witchwig = 1,
/obj/item/staff/broom = 1,
- /obj/item/clothing/suit/wizrobe/fake = 1,
- /obj/item/clothing/head/wizard/fake = 1,
/obj/item/staff = 3,
/obj/item/clothing/under/rank/civilian/mime/sexy = 1,
/obj/item/clothing/under/rank/civilian/mime/skirt = 1,
@@ -77,12 +62,6 @@
/obj/item/clothing/mask/rat/tribal = 1,
/obj/item/clothing/mask/rat = 1,
/obj/item/clothing/suit/apron/overalls = 1,
- /obj/item/clothing/head/rabbitears =1,
- /obj/item/clothing/head/sombrero = 1,
- /obj/item/clothing/head/sombrero/green = 1,
- /obj/item/clothing/suit/poncho = 1,
- /obj/item/clothing/suit/poncho/green = 1,
- /obj/item/clothing/suit/poncho/red = 1,
/obj/item/clothing/head/maidheadband = 1,
/obj/item/clothing/under/costume/maid = 1,
/obj/item/clothing/gloves/maid = 1,
@@ -90,29 +69,15 @@
/obj/item/clothing/under/rank/civilian/janitor/maid = 1,
/obj/item/clothing/glasses/cold=1,
/obj/item/clothing/glasses/heat=1,
- /obj/item/clothing/suit/whitedress = 1,
- /obj/item/clothing/head/jester = 1,
/obj/item/clothing/suit/hooded/carp_costume = 1,
- /obj/item/clothing/suit/hooded/ian_costume = 1,
- /obj/item/clothing/suit/hooded/bee_costume = 1,
/obj/item/clothing/suit/snowman = 1,
/obj/item/clothing/head/snowman = 1,
/obj/item/clothing/mask/joy = 1,
- /obj/item/clothing/head/cueball = 1,
/obj/item/clothing/under/suit/white_on_white = 1,
/obj/item/clothing/under/costume/sailor = 1,
- /obj/item/clothing/head/delinquent = 1,
/obj/item/clothing/head/wig/random = 3,
- /obj/item/clothing/head/shrine_wig = 1,
- /obj/item/clothing/suit/shrine_maiden = 1,
- /obj/item/clothing/suit/changshan_red = 1,
- /obj/item/clothing/suit/changshan_blue = 1,
- /obj/item/clothing/suit/cheongsam_red = 1,
- /obj/item/clothing/suit/cheongsam_blue = 1,
/obj/item/gohei = 1,
/obj/item/clothing/suit/judgerobe = 1,
- /obj/item/clothing/head/powdered_wig = 1,
- /obj/item/clothing/glasses/sunglasses/garb = 2,
/obj/item/clothing/glasses/blindfold = 1,
/obj/item/clothing/mask/muzzle = 2)
premium = list(
@@ -121,10 +86,8 @@
/obj/item/clothing/head/helmet/roman/fake = 1,
/obj/item/clothing/head/helmet/roman/legionnaire/fake = 1,
/obj/item/clothing/under/costume/roman = 1,
- /obj/item/clothing/shoes/roman = 1,
/obj/item/shield/riot/roman/fake = 1,
- /obj/item/skub = 1,
- /obj/item/clothing/suit/hooded/mysticrobe = 1)
+ /obj/item/skub = 1)
refill_canister = /obj/item/vending_refill/autodrobe
default_price = 180
extra_price = 360
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index e9eef49a0e3a..0c16b36902e2 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -16,14 +16,10 @@
/obj/item/clothing/head/beanie/yellow = 3,
/obj/item/clothing/head/beanie/orange = 3,
/obj/item/clothing/head/beanie/cyan = 3,
- /obj/item/clothing/head/beanie/christmas = 3,
/obj/item/clothing/head/beanie/striped = 3,
/obj/item/clothing/head/beanie/stripedred = 3,
/obj/item/clothing/head/beanie/stripedblue = 3,
/obj/item/clothing/head/beanie/stripedgreen = 3,
- /obj/item/clothing/head/beanie/rasta = 3,
- /obj/item/clothing/head/kippah = 3,
- /obj/item/clothing/head/taqiyahred = 3,
/obj/item/clothing/gloves/fingerless = 2,
/obj/item/clothing/neck/scarf/pink = 3,
/obj/item/clothing/neck/scarf/red = 3,
@@ -85,9 +81,6 @@
/obj/item/clothing/accessory/waistcoat = 1,
/obj/item/clothing/head/that = 1,
/obj/item/clothing/head/fedora = 1,
- /obj/item/clothing/glasses/monocle = 1,
- /obj/item/clothing/head/sombrero = 1,
- /obj/item/clothing/suit/poncho = 1,
/obj/item/clothing/under/costume/kilt = 1,
/obj/item/clothing/under/dress/sundress = 1,
/obj/item/clothing/under/dress/striped = 1,
@@ -112,12 +105,10 @@
/obj/item/storage/belt/fannypack/black = 2,
/obj/item/clothing/suit/jacket/letterman_syndie = 1,
/obj/item/clothing/under/costume/jabroni = 1,
- /obj/item/clothing/suit/vapeshirt = 1,
/obj/item/clothing/under/costume/geisha = 1)
premium = list(
/obj/item/clothing/under/suit/checkered = 1,
/obj/item/clothing/suit/jacket/leather = 1,
- /obj/item/clothing/suit/jacket/leather/overcoat = 1,
/obj/item/clothing/neck/necklace/dope = 3,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 1,
/obj/item/instrument/piano_synth/headphones/spacepods = 1)
diff --git a/code/modules/vending/drinnerware.dm b/code/modules/vending/drinnerware.dm
index 18b8fd522aab..0dc0102c91ef 100644
--- a/code/modules/vending/drinnerware.dm
+++ b/code/modules/vending/drinnerware.dm
@@ -8,11 +8,11 @@
/obj/item/reagent_containers/glass/bowl = 20,
/obj/item/kitchen/fork = 6,
/obj/item/reagent_containers/food/drinks/drinkingglass = 8,
- /obj/item/reagent_containers/food/condiment/pack/ketchup = 5,
- /obj/item/reagent_containers/food/condiment/pack/hotsauce = 5,
- /obj/item/reagent_containers/food/condiment/pack/astrotame = 5,
- /obj/item/reagent_containers/food/condiment/saltshaker = 5,
- /obj/item/reagent_containers/food/condiment/peppermill = 5,
+ /obj/item/reagent_containers/condiment/pack/ketchup = 5,
+ /obj/item/reagent_containers/condiment/pack/hotsauce = 5,
+ /obj/item/reagent_containers/condiment/pack/astrotame = 5,
+ /obj/item/reagent_containers/condiment/saltshaker = 5,
+ /obj/item/reagent_containers/condiment/peppermill = 5,
/obj/item/clothing/suit/apron/chef = 2,
/obj/item/kitchen/rollingpin = 2,
/obj/item/melee/knife/kitchen = 2,
diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm
index 06069e4db764..931611da1df9 100644
--- a/code/modules/vending/liberation_toy.dm
+++ b/code/modules/vending/liberation_toy.dm
@@ -10,14 +10,14 @@
/obj/item/gun/ballistic/automatic/toy/pistol = 10,
/obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
- /obj/item/ammo_box/foambox = 20,
+ /obj/item/storage/box/ammo/foam_darts = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/balloon/syndicate = 10,
/obj/item/clothing/suit/syndicatefake = 5,
/obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant
contraband = list(
/obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting!
- /obj/item/ammo_box/foambox/riot = 20,
+ /obj/item/storage/box/ammo/foam_darts/riot = 20,
/obj/item/toy/katana = 10,
/obj/item/dualsaber/toy = 5,
/obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item
diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm
index 37a51b27bb89..007b66c193c1 100644
--- a/code/modules/vending/security.dm
+++ b/code/modules/vending/security.dm
@@ -12,8 +12,6 @@
/obj/item/assembly/flash/handheld = 5,
/obj/item/storage/box/evidence = 6,
/obj/item/flashlight/seclite = 4,
- /obj/item/ammo_box/c9mm/rubbershot = 3,
- /obj/item/ammo_box/c9mm = 1,
/obj/item/stock_parts/cell/gun = 3,
/obj/item/clothing/glasses/sunglasses = 2)
premium = list(
diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm
index 08af917aa86a..898844a31c09 100644
--- a/code/modules/vending/toys.dm
+++ b/code/modules/vending/toys.dm
@@ -12,7 +12,7 @@
/obj/item/gun/ballistic/automatic/toy/pistol = 10,
/obj/item/gun/ballistic/shotgun/toy = 10,
/obj/item/toy/sword = 10,
- /obj/item/ammo_box/foambox = 20,
+ /obj/item/storage/box/ammo/foam_darts = 20,
/obj/item/toy/foamblade = 10,
/obj/item/toy/balloon/syndicate = 10,
/obj/item/clothing/suit/syndicatefake = 5,
diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm
index 4686c12da1ad..2bef026cebff 100644
--- a/code/modules/vending/wardrobes.dm
+++ b/code/modules/vending/wardrobes.dm
@@ -163,8 +163,7 @@
/obj/item/clothing/head/soft/black = 2,
/obj/item/clothing/mask/bandana/skull = 2
)
- contraband = list(/obj/item/clothing/suit/hooded/enginseer = 2, // WS edit: enginsineer robes
- /obj/item/organ/tongue/robot = 2)
+ contraband = list(/obj/item/organ/tongue/robot = 2)
refill_canister = /obj/item/vending_refill/wardrobe/robo_wardrobe
extra_price = 300
/obj/item/vending_refill/wardrobe/robo_wardrobe
@@ -282,7 +281,7 @@
vend_reply = "Thank you for using the ChefDrobe!"
products = list(/obj/item/clothing/under/suit/waiter = 2,
/obj/item/radio/headset/headset_srv = 2,
- /obj/item/clothing/head/beret/service = 2, //WS edit - berets
+ /obj/item/clothing/head/beret/service = 2,
/obj/item/clothing/accessory/waistcoat = 2,
/obj/item/clothing/suit/apron/chef = 3,
/obj/item/clothing/head/soft/mime = 2,
@@ -291,10 +290,8 @@
/obj/item/clothing/suit/toggle/chef = 1,
/obj/item/clothing/under/rank/civilian/chef = 1,
/obj/item/clothing/under/rank/civilian/chef/skirt = 2,
- ///obj/item/clothing/under/rank/chef = 3,//WS edit - Better security jumpsuit sprites
/obj/item/clothing/head/chefhat = 1,
/obj/item/clothing/under/shorts/cookjorts = 2,
- /obj/item/clothing/shoes/cookflops = 2,
/obj/item/reagent_containers/glass/rag = 1,
/obj/item/clothing/accessory/armband/med = 4,
/obj/item/clothing/suit/hooded/wintercoat = 2)
@@ -381,22 +378,10 @@
/obj/item/clothing/under/rank/civilian/chaplain = 1,
/obj/item/clothing/under/rank/civilian/chaplain/skirt = 2,
/obj/item/clothing/shoes/sneakers/black = 1,
- /obj/item/clothing/suit/chaplainsuit/nun = 1,
- /obj/item/clothing/head/nun_hood = 1,
- /obj/item/clothing/suit/chaplainsuit/holidaypriest = 1,
- /obj/item/clothing/suit/hooded/chaplainsuit/monkhabit = 1,
/obj/item/storage/fancy/candle_box = 2,
- /obj/item/clothing/head/kippah = 3,
- /obj/item/clothing/suit/chaplainsuit/whiterobe = 1,
- /obj/item/clothing/head/taqiyahwhite = 1,
- /obj/item/clothing/head/taqiyahred = 3,
- /obj/item/clothing/suit/chaplainsuit/monkrobeeast = 1,
- /obj/item/clothing/accessory/armband/med = 4,
- /obj/item/clothing/head/beanie/rasta = 1)
+ /obj/item/clothing/accessory/armband/med = 4)
contraband = list(/obj/item/toy/plush/plushvar = 1,
/obj/item/toy/plush/narplush = 1)
- premium = list(/obj/item/clothing/suit/chaplainsuit/bishoprobe = 1,
- /obj/item/clothing/head/bishopmitre = 1)
refill_canister = /obj/item/vending_refill/wardrobe/chap_wardrobe
/obj/item/vending_refill/wardrobe/chap_wardrobe
machine_name = "ChapDrobe"
@@ -432,8 +417,7 @@
/obj/item/clothing/shoes/sneakers/white = 2,
/obj/item/clothing/suit/toggle/labcoat/genetics = 2,
/obj/item/clothing/accessory/armband/medblue = 4,
- /obj/item/storage/backpack/genetics = 2,
- /obj/item/storage/backpack/satchel/gen = 2)
+ /obj/item/storage/backpack/genetics = 2)
refill_canister = /obj/item/vending_refill/wardrobe/gene_wardrobe
/obj/item/vending_refill/wardrobe/gene_wardrobe
machine_name = "GeneDrobe"
@@ -454,7 +438,6 @@
/obj/item/clothing/accessory/armband/hydro = 4,
/obj/item/storage/backpack/satchel/vir = 2)
contraband = list(/obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1,
- /obj/item/clothing/head/plaguedoctorhat = 1,
/obj/item/clothing/mask/gas/plaguedoctor = 1)
refill_canister = /obj/item/vending_refill/wardrobe/viro_wardrobe
/obj/item/vending_refill/wardrobe/viro_wardrobe
diff --git a/html/changelogs/AutoChangeLog-pr-3320.yml b/html/changelogs/AutoChangeLog-pr-3320.yml
deleted file mode 100644
index 4832c9776c22..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3320.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: FalloutFalcon
-changes:
- - {rscadd: You can now see ships in the orbit menu and its alot prettier!}
- - {code_imp: ported tg points of interest and a much improved orbit menu}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3330.yml b/html/changelogs/AutoChangeLog-pr-3330.yml
deleted file mode 100644
index 46e461f2f53f..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3330.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FalloutFalcon
-changes:
- - {rscadd: 'Ballistics now have a minimum recoil, not enough to mess up your shot!'}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3346.yml b/html/changelogs/AutoChangeLog-pr-3346.yml
deleted file mode 100644
index 46be6f8474b6..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3346.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: FalloutFalcon
-changes:
- - {bugfix: ships now start closed. shiptesters be writing there memos and ship names.}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3352.yml b/html/changelogs/AutoChangeLog-pr-3352.yml
deleted file mode 100644
index 266106d74f64..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3352.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: FalloutFalcon
-changes:
- - {rscadd: Added new blank shells for training drills!}
- - {refactor: Minor refactor of design disks to reduce repeated code}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3398.yml b/html/changelogs/AutoChangeLog-pr-3398.yml
deleted file mode 100644
index 65eb77137267..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3398.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: Gristlebee
-changes:
- - {bugfix: fixes wall deconstruction causing runtimes}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3408.yml b/html/changelogs/AutoChangeLog-pr-3408.yml
deleted file mode 100644
index f85514c5004c..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3408.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: zimon9
-changes:
- - {rscadd: Added fruit puree to vegan rations}
- - {rscdel: Removed pizza crackers from vegan rations}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3418.yml b/html/changelogs/AutoChangeLog-pr-3418.yml
deleted file mode 100644
index b2b6703a1756..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3418.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: generalthrax
-changes:
- - {balance: Most common accessories now fit on pants}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3420.yml b/html/changelogs/AutoChangeLog-pr-3420.yml
deleted file mode 100644
index 832736e59bfd..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3420.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: generalthrax
-changes:
- - {rscadd: Exosuit Recharger machines are now available from cargo}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3423.yml b/html/changelogs/AutoChangeLog-pr-3423.yml
deleted file mode 100644
index 21c44ad0f32e..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3423.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: generalthrax
-changes:
- - {balance: Rust Reds on the blackmarket are now available to a maximum of 3}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3424.yml b/html/changelogs/AutoChangeLog-pr-3424.yml
deleted file mode 100644
index 8258d255a6c2..000000000000
--- a/html/changelogs/AutoChangeLog-pr-3424.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: Jedi-Toothpaste
-changes:
- - {bugfix: "Fixed the lack of windows for the Kilo's Thrusters, and fixed the broken
- link for the new blast doors."}
-delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3456.yml b/html/changelogs/AutoChangeLog-pr-3456.yml
new file mode 100644
index 000000000000..4888fa6227a9
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3456.yml
@@ -0,0 +1,6 @@
+author: thgvr
+changes:
+ - {rscadd: 'Added bullet stacks, they allow you to stack ammo of the same type into
+ a group.'}
+ - {balance: Changed old ammo boxes into storage items containing stacks of bullets}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3520.yml b/html/changelogs/AutoChangeLog-pr-3520.yml
new file mode 100644
index 000000000000..d45707357c9b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3520.yml
@@ -0,0 +1,5 @@
+author: Imaginos16, rye-rice
+changes:
+ - {rscadd: A few hairstyles have been resprited!}
+ - {rscdel: the Braided and Braid line of hairs.}
+delete-after: true
diff --git a/html/changelogs/AutoChangeLog-pr-3522.yml b/html/changelogs/AutoChangeLog-pr-3522.yml
new file mode 100644
index 000000000000..62950d303d26
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-3522.yml
@@ -0,0 +1,4 @@
+author: zimon9
+changes:
+ - {bugfix: fixed halved throw range}
+delete-after: true
diff --git a/html/changelogs/archive/2024-09.yml b/html/changelogs/archive/2024-09.yml
index d86f5c86c955..52b3cbfbf679 100644
--- a/html/changelogs/archive/2024-09.yml
+++ b/html/changelogs/archive/2024-09.yml
@@ -170,3 +170,51 @@
SomeguyManperson:
- bugfix: sawn off illestren/improvised shotgun stats are now consistent if they
are spawned in
+2024-09-26:
+ FalloutFalcon:
+ - rscadd: Added new blank shells for training drills!
+ - refactor: Minor refactor of design disks to reduce repeated code
+ - rscadd: Ballistics now have a minimum recoil, not enough to mess up your shot!
+ - bugfix: ships now start closed. shiptesters be writing there memos and ship names.
+ - rscadd: You can now see ships in the orbit menu and its alot prettier!
+ - code_imp: ported tg points of interest and a much improved orbit menu
+ Gristlebee:
+ - bugfix: fixes wall deconstruction causing runtimes
+ Jedi-Toothpaste:
+ - bugfix: Fixed the lack of windows for the Kilo's Thrusters, and fixed the broken
+ link for the new blast doors.
+ generalthrax:
+ - balance: Most common accessories now fit on pants
+ - rscadd: Exosuit Recharger machines are now available from cargo
+ - balance: Rust Reds on the blackmarket are now available to a maximum of 3
+ zimon9:
+ - rscadd: Added fruit puree to vegan rations
+ - rscdel: Removed pizza crackers from vegan rations
+2024-09-27:
+ Jedi-Toothpaste:
+ - rscadd: Firelocks to the Valor-Class' Doors
+ - rscadd: Lighting to dark areas on the Valor-Class' Doors
+ - rscadd: New areas on the Valor-Class to seperate rooms
+ - rscadd: Added APC for the Surgical Area
+ PositiveEntropy:
+ - imageadd: Adjusts the inner part of the normal rabbit ears.
+2024-09-28:
+ Sadhorizon:
+ - rscadd: Added a fax machine to the Dwayne-class.
+ SomeguyManperson:
+ - bugfix: legion skulls will no longer check if they should rise up and consume
+ their owner if they are ownerless
+2024-09-29:
+ fighterslam:
+ - balance: Modernizes and slightly buffs the Ranger.
+2024-09-30:
+ Bjarl:
+ - rscdel: The Elephant Graveyard ruin has been taken out back
+ - bugfix: m90 posters are real again
+ FalloutFalcon:
+ - bugfix: sawnoff weapons made from init now function correctly
+ - bugfix: condiment packs are no longer invisible and missing names
+ MassiveMen:
+ - rscadd: Added the fire axe to the black market uplink
+ Thera-Pissed:
+ - rscadd: New wasteplanet ruin, the abandoned Miskilamo shipbreaking yard!
diff --git a/html/changelogs/archive/2024-10.yml b/html/changelogs/archive/2024-10.yml
new file mode 100644
index 000000000000..024ab441d4fd
--- /dev/null
+++ b/html/changelogs/archive/2024-10.yml
@@ -0,0 +1,143 @@
+2024-10-01:
+ Erika Fox:
+ - rscadd: Anti-Radiation Foam is now available at the outpost
+ - code_imp: Fireaxe cabinets have been repathed, and now function as a more general
+ cabinet object. please report any inconsistencies with behavior
+ Sadhorizon:
+ - tweak: You can now put knives in secbelts and the subtypes of secbelts.
+ - bugfix: You can now fit all knives in mining webbings.
+ SomeguyManperson:
+ - bugfix: hallucinations can no longer be permanent unless treated
+2024-10-02:
+ Bjarl:
+ - rscadd: One-Shot Rocket Launcher. A quick solution to an armored problem.
+ - rscadd: You can now scribble profane things onto the tube of your rocket launcher.
+ Use this power wisely.
+ - imageadd: 'Rye: A sprite for a one-shot rocket launcher'
+ generalthrax:
+ - balance: Molotov cocktails now create turf fires
+ - balance: Hearthwine now create turf fires in a 3x3 area
+ tmtmtl30, Thgvr:
+ - rscadd: Added bunkbeds, which can now be crafted with metal or placed by mappers.
+ - bugfix: Beds facing alternate directions now correctly support people buckling
+ to them and bedsheets being placed on top of them.
+2024-10-03:
+ Bjarl:
+ - bugfix: defibs now work again.
+2024-10-05:
+ Bjarl:
+ - rscadd: A cargo ship happened to lose an entire crate of Hammer Rocket Launchers
+ while travelling through the system. We have reason to believe they're probably
+ on sale now.
+ - rscdel: you can no longer purchase PML-9s on the black market.
+ Gristlebee, Rye-Rice, INFRARED_BARON:
+ - rscadd: Inteq Gygax and mech charges
+ - rscadd: Paladin shield backlash
+ - bugfix: Durand shield blocking all projectiles
+ - imageadd: Inteq Gygax sprites
+ Jedi-Toothpaste:
+ - rscadd: Added extra intercoms in high traffic areas on the Valor Class
+ - rscadd: Added Firelocks underneath the Cargo-Bay Doors on the Valor Class
+ - rscadd: Air Alarms, Scrubbers and Vents to every applicable room
+ MemeSnorfer:
+ - rscadd: Three new Elzuose horn types. Cervid, Prong, and Brow
+ PositiveEntropy:
+ - imageadd: Waste Planet Turfs Now Look Much More Refined!
+ Thera-Pissed:
+ - rscadd: pipe dispenser UI is now similar to rapid pipe dispenser UI.
+ generalthrax:
+ - balance: Replace red insuls with yellow insuls in syndicate toolboxes
+ zimon9:
+ - bugfix: fixed the waste and scrubber gas reclamation filters on the colossus
+2024-10-06:
+ Apogee-dev:
+ - balance: removed one recruit slot from the vaquero
+ - rscadd: Added Nanotrasen Harrier-class cruiser
+ - rscdel: Removed Osprey-class cruiser
+ - rscdel: Removed Skipper-class cruiser
+ - balance: increased mudskipper limit to 2
+ - balance: cut a deckhand slot from kilo
+ Bjarl:
+ - rscadd: IRMG engineers have rolled new turrets out into the frontier. Please report
+ back on their effectiveness. Unless you have been shot. Then you should be dead.
+ - rscadd: Sharplite has produced a line of turrets for Nanotrasen, which is now
+ mounting them on relevant vessels.
+ Sadhorizon:
+ - bugfix: Komodo Bridge Officer is now actually an officer.
+ SomeguyManperson:
+ - rscdel: missions will no longer request capturing ice demons
+ Thera-Pissed:
+ - rscadd: angle grinders for salvage
+ - rscadd: reworks plasma cutters for salvage
+2024-10-07:
+ Aquidu:
+ - code_imp: Changes flameless ration heaters to "small" items
+ - code_imp: Adds flameless ration heaters to the ration pack item whitelist.
+ thgvr:
+ - imageadd: Some backpack sprites for Kepori
+ - imageadd: Shrunk down the sprite of guncases
+2024-10-08:
+ Anticept:
+ - rscadd: Added more purchasable chemicals to outpost.
+ - rscadd: Added missing elemental chems to chem starter kit
+ - rscdel: removed sulfuric acid from chem starter set. You have to make it.
+ - imageadd: tweaked and added more elemental chemical jugs.
+ Bjarl:
+ - code_imp: A large amount of cruft has been deleted.
+ DrCrawler:
+ - rscadd: Gives IPCs a little more adjectives to work with.
+ - rscdel: Removed some duplicate adjectives from the raw file.
+ FalloutFalcon:
+ - code_imp: tweaks to the syntax of unit test logs to be more readable by humans
+ and flaky tests
+ FalloutFalcon, Mothblocks, Cyberboss:
+ - rscadd: retry failed unit tests.
+ PositiveEntropy:
+ - imageadd: We now have improved visuals for circuit boards!
+ Sadhorizon:
+ - rscadd: Cybersun Biodynamics stamp.
+ - rscadd: Cybersun secret documents.
+ - rscadd: Cybersun captain's safe.
+ SomeguyManperson:
+ - balance: you no longer need a lasso to ride a goliath
+ - rscdel: no more lasso
+ rye-rice, Imaginos16:
+ - rscadd: Resprites Wisp
+ thgvr:
+ - bugfix: fixed digitigrade combat/jackboots
+2024-10-09:
+ PositiveEntropy:
+ - imageadd: Dog Beds Now Look Fancier!
+ - imageadd: Tank Dispensers have been repaletted!
+ - imageadd: Nuclear Waste Barrels Look A Lot Better!
+ Sun-Soaked:
+ - rscadd: Boxes are now volumetric. Some special boxes have been adjusted.
+ - balance: small objects in volumetric storage are now slightly smaller
+ zimon9:
+ - rscadd: Added flamethrower crate
+ - rscadd: Added incendiary grenade crate
+ - rscdel: Removed incendiary supply crate
+2024-10-10:
+ Bjarl:
+ - bugfix: Turrets should now actually fire at their defined fire rates.
+ - balance: Factional turrets now have new damage thresholds
+ - balance: ship turrets now have 100 less integrity by default
+ FalloutFalcon:
+ - rscadd: Cats have been genetically engineered to detect radiation
+ Gristlebee:
+ - rscadd: PGF Rakalla space suits can hold a gun in their suit storage.
+ PositiveEntropy:
+ - imageadd: Long (And Short) Braid hairstyles have been redone!
+ zimon9:
+ - rscadd: Adds bowmans to Artificer and Enforcer loadouts, and regular headsets
+ to Recruit loadouts
+2024-10-11:
+ Bjarl:
+ - rscadd: Reports of people inflicted with congenital analgesia travelling to the
+ Frontier have reached this newscaster.
+ - rscadd: Painkillers may circumvent pain in some cases now.
+ - rscadd: Please remember to ensure your soul is filled with spite before kicking
+ a rack.
+ - code_imp: abandoned airlocks now have more effects
+ FalloutFalcon:
+ - rscadd: Readdes world icons for a few knives. Expect more soon!
diff --git a/icons/effects/cutting_effect.dmi b/icons/effects/cutting_effect.dmi
new file mode 100644
index 000000000000..e8b4abeec5d0
Binary files /dev/null and b/icons/effects/cutting_effect.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 0aa256c631e4..bb63eb2b7f0e 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mecha/inteq_gygax.dmi b/icons/mecha/inteq_gygax.dmi
new file mode 100644
index 000000000000..08105d783ab9
Binary files /dev/null and b/icons/mecha/inteq_gygax.dmi differ
diff --git a/icons/mecha/mecha.dmi b/icons/mecha/mecha.dmi
index 9b9c2b479c7b..2993487cb850 100644
Binary files a/icons/mecha/mecha.dmi and b/icons/mecha/mecha.dmi differ
diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi
index 5e08a834a892..76549c15a3e0 100644
Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ
diff --git a/icons/mob/actions/actions_flightsuit.dmi b/icons/mob/actions/actions_flightsuit.dmi
deleted file mode 100644
index 3121c243555f..000000000000
Binary files a/icons/mob/actions/actions_flightsuit.dmi and /dev/null differ
diff --git a/icons/mob/clothing/back.dmi b/icons/mob/clothing/back.dmi
index 5508bc67523c..5ca5b6bd045d 100644
Binary files a/icons/mob/clothing/back.dmi and b/icons/mob/clothing/back.dmi differ
diff --git a/icons/mob/clothing/back/backpacks.dmi b/icons/mob/clothing/back/backpacks.dmi
new file mode 100644
index 000000000000..7138b440a4ad
Binary files /dev/null and b/icons/mob/clothing/back/backpacks.dmi differ
diff --git a/icons/mob/clothing/back/backpacks_kepori.dmi b/icons/mob/clothing/back/backpacks_kepori.dmi
new file mode 100644
index 000000000000..557ee29267fd
Binary files /dev/null and b/icons/mob/clothing/back/backpacks_kepori.dmi differ
diff --git a/icons/mob/clothing/eyes.dmi b/icons/mob/clothing/eyes.dmi
deleted file mode 100644
index 687d4965b32a..000000000000
Binary files a/icons/mob/clothing/eyes.dmi and /dev/null differ
diff --git a/icons/mob/clothing/eyes/eyes.dmi b/icons/mob/clothing/eyes/eyes.dmi
new file mode 100644
index 000000000000..5c83d2dcfbc3
Binary files /dev/null and b/icons/mob/clothing/eyes/eyes.dmi differ
diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi
index 3246bbb24de2..ec9850144f7b 100644
Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ
diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi
index f207b2bfd826..d2970f6b9ead 100644
Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ
diff --git a/icons/mob/clothing/head/winterhood.dmi b/icons/mob/clothing/head/winterhood.dmi
index 321896641390..cc3fd8a4e5d4 100644
Binary files a/icons/mob/clothing/head/winterhood.dmi and b/icons/mob/clothing/head/winterhood.dmi differ
diff --git a/icons/mob/clothing/suit.dmi b/icons/mob/clothing/suit.dmi
index ca1eb949aa40..b595f529b7ee 100644
Binary files a/icons/mob/clothing/suit.dmi and b/icons/mob/clothing/suit.dmi differ
diff --git a/icons/mob/clothing/suits/hooded.dmi b/icons/mob/clothing/suits/hooded.dmi
index e1f98d991357..7d2f53a13b06 100644
Binary files a/icons/mob/clothing/suits/hooded.dmi and b/icons/mob/clothing/suits/hooded.dmi differ
diff --git a/icons/mob/clothing/suits/spacesuits.dmi b/icons/mob/clothing/suits/spacesuits.dmi
index da5075195992..1a0f5001b34a 100644
Binary files a/icons/mob/clothing/suits/spacesuits.dmi and b/icons/mob/clothing/suits/spacesuits.dmi differ
diff --git a/icons/mob/ethereal_parts.dmi b/icons/mob/ethereal_parts.dmi
index 14e0c51037fb..c5d0c9b45f78 100644
Binary files a/icons/mob/ethereal_parts.dmi and b/icons/mob/ethereal_parts.dmi differ
diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi
index a819dd3ca780..0c0efee7cbb7 100644
Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ
diff --git a/icons/mob/inhands/equipment/gear_handle_lefthand.dmi b/icons/mob/inhands/equipment/gear_handle_lefthand.dmi
new file mode 100644
index 000000000000..169f91ce6eba
Binary files /dev/null and b/icons/mob/inhands/equipment/gear_handle_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/gear_handle_righthand.dmi b/icons/mob/inhands/equipment/gear_handle_righthand.dmi
new file mode 100644
index 000000000000..172f18e6095a
Binary files /dev/null and b/icons/mob/inhands/equipment/gear_handle_righthand.dmi differ
diff --git a/icons/mob/species/human/rabbit.dmi b/icons/mob/species/human/rabbit.dmi
index fcc6599f7356..26f0cb080d22 100644
Binary files a/icons/mob/species/human/rabbit.dmi and b/icons/mob/species/human/rabbit.dmi differ
diff --git a/icons/mob/species/kepori/onmob_back_kepori.dmi b/icons/mob/species/kepori/onmob_back_kepori.dmi
new file mode 100644
index 000000000000..98218916f7c0
Binary files /dev/null and b/icons/mob/species/kepori/onmob_back_kepori.dmi differ
diff --git a/icons/mob/species/misc/digitigrade_shoes.dmi b/icons/mob/species/misc/digitigrade_shoes.dmi
index 9d08980b1e58..fb3dd6693471 100644
Binary files a/icons/mob/species/misc/digitigrade_shoes.dmi and b/icons/mob/species/misc/digitigrade_shoes.dmi differ
diff --git a/icons/obj/ammo_bullets.dmi b/icons/obj/ammo_bullets.dmi
deleted file mode 100644
index 087cdd4c771e..000000000000
Binary files a/icons/obj/ammo_bullets.dmi and /dev/null differ
diff --git a/icons/obj/ammo_shotshells.dmi b/icons/obj/ammo_shotshells.dmi
deleted file mode 100644
index 55b00cdd0b21..000000000000
Binary files a/icons/obj/ammo_shotshells.dmi and /dev/null differ
diff --git a/icons/obj/ammunition/ammo.dmi b/icons/obj/ammunition/ammo.dmi
new file mode 100644
index 000000000000..85e8e368fac8
Binary files /dev/null and b/icons/obj/ammunition/ammo.dmi differ
diff --git a/icons/obj/ammunition/ammo_boxes.dmi b/icons/obj/ammunition/ammo_boxes.dmi
new file mode 100644
index 000000000000..ac963d46212b
Binary files /dev/null and b/icons/obj/ammunition/ammo_boxes.dmi differ
diff --git a/icons/obj/ammunition/ammo_bullets.dmi b/icons/obj/ammunition/ammo_bullets.dmi
new file mode 100644
index 000000000000..25ea909762aa
Binary files /dev/null and b/icons/obj/ammunition/ammo_bullets.dmi differ
diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi
index 17bab47dc9ef..68fef79c160b 100644
Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ
diff --git a/icons/obj/chemical/chem_jug.dmi b/icons/obj/chemical/chem_jug.dmi
index d872ba00ff1d..e5ab15a43e14 100644
Binary files a/icons/obj/chemical/chem_jug.dmi and b/icons/obj/chemical/chem_jug.dmi differ
diff --git a/icons/obj/clothing/back/backpacks.dmi b/icons/obj/clothing/back/backpacks.dmi
new file mode 100644
index 000000000000..01e2c1d6923b
Binary files /dev/null and b/icons/obj/clothing/back/backpacks.dmi differ
diff --git a/icons/obj/clothing/eyes/eyes.dmi b/icons/obj/clothing/eyes/eyes.dmi
new file mode 100644
index 000000000000..63b92986ca50
Binary files /dev/null and b/icons/obj/clothing/eyes/eyes.dmi differ
diff --git a/icons/obj/clothing/flightsuit.dmi b/icons/obj/clothing/flightsuit.dmi
deleted file mode 100644
index e08e74db1cec..000000000000
Binary files a/icons/obj/clothing/flightsuit.dmi and /dev/null differ
diff --git a/icons/obj/clothing/glasses.dmi b/icons/obj/clothing/glasses.dmi
deleted file mode 100644
index a021b79db58c..000000000000
Binary files a/icons/obj/clothing/glasses.dmi and /dev/null differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index 402ce131a988..52d9036e0211 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/head/winterhood.dmi b/icons/obj/clothing/head/winterhood.dmi
index aa212eb48da2..c89538ccb0b3 100644
Binary files a/icons/obj/clothing/head/winterhood.dmi and b/icons/obj/clothing/head/winterhood.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index 5a162a969132..00e1da5d54ea 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index d325c5098a73..e3ceffdb3329 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/clothing/suits/hooded.dmi b/icons/obj/clothing/suits/hooded.dmi
index 6d449550ad43..7c3a70a0624c 100644
Binary files a/icons/obj/clothing/suits/hooded.dmi and b/icons/obj/clothing/suits/hooded.dmi differ
diff --git a/icons/obj/guncase.dmi b/icons/obj/guncase.dmi
index 4941b965f2f8..83b5292a5cfd 100644
Binary files a/icons/obj/guncase.dmi and b/icons/obj/guncase.dmi differ
diff --git a/icons/obj/guncase_48x32.dmi b/icons/obj/guncase_48x32.dmi
deleted file mode 100644
index b5dc20bc64e5..000000000000
Binary files a/icons/obj/guncase_48x32.dmi and /dev/null differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/48x32.dmi b/icons/obj/guns/manufacturer/frontier_import/48x32.dmi
index 2f2db3d07ad5..be95cfa90c14 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/48x32.dmi and b/icons/obj/guns/manufacturer/frontier_import/48x32.dmi differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi b/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi
index eb6c552627ee..e34bf3995dfd 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi and b/icons/obj/guns/manufacturer/frontier_import/lefthand.dmi differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/onmob.dmi b/icons/obj/guns/manufacturer/frontier_import/onmob.dmi
index 274aa3a15036..e0b05e0ec63f 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/onmob.dmi and b/icons/obj/guns/manufacturer/frontier_import/onmob.dmi differ
diff --git a/icons/obj/guns/manufacturer/frontier_import/righthand.dmi b/icons/obj/guns/manufacturer/frontier_import/righthand.dmi
index 406c40e66ac6..30eeaa12d4e9 100644
Binary files a/icons/obj/guns/manufacturer/frontier_import/righthand.dmi and b/icons/obj/guns/manufacturer/frontier_import/righthand.dmi differ
diff --git a/icons/obj/hazard.dmi b/icons/obj/hazard.dmi
index 5c350c5afb9b..f9df336f607d 100644
Binary files a/icons/obj/hazard.dmi and b/icons/obj/hazard.dmi differ
diff --git a/icons/obj/item/gear_packs.dmi b/icons/obj/item/gear_packs.dmi
new file mode 100644
index 000000000000..76fb94bd4ff3
Binary files /dev/null and b/icons/obj/item/gear_packs.dmi differ
diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi
index 337e3bf6d8da..efffc5cebb4a 100644
Binary files a/icons/obj/mining.dmi and b/icons/obj/mining.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index 49c818b217d0..e7f379175a5e 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi
index 1b156b9294f9..628c19d63e43 100644
Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 9ff37a4b7e0c..5353677357cf 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi
index 87cef669faf0..fdefd87860b5 100644
Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ
diff --git a/icons/stamp_icons/large_stamp-biodynamics.png b/icons/stamp_icons/large_stamp-biodynamics.png
new file mode 100644
index 000000000000..0d09b4f37c00
Binary files /dev/null and b/icons/stamp_icons/large_stamp-biodynamics.png differ
diff --git a/icons/turf/floors.dmi b/icons/turf/floors.dmi
index 398d5550f810..1dbb3a101fae 100644
Binary files a/icons/turf/floors.dmi and b/icons/turf/floors.dmi differ
diff --git a/shiptest.dme b/shiptest.dme
index 38b398412c42..f9d83e186d5b 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -50,7 +50,6 @@
#include "code\__DEFINES\construction.dm"
#include "code\__DEFINES\contracts.dm"
#include "code\__DEFINES\cooldowns.dm"
-#include "code\__DEFINES\cult.dm"
#include "code\__DEFINES\directional.dm"
#include "code\__DEFINES\diseases.dm"
#include "code\__DEFINES\DNA.dm"
@@ -163,6 +162,7 @@
#include "code\__DEFINES\dcs\helpers.dm"
#include "code\__DEFINES\dcs\signals\signals.dm"
#include "code\__DEFINES\dcs\signals\signals_mod.dm"
+#include "code\__DEFINES\dcs\signals\signals_reagent.dm"
#include "code\__DEFINES\dcs\signals\signals_ship.dm"
#include "code\__DEFINES\dcs\signals\signals_storage.dm"
#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm"
@@ -282,7 +282,6 @@
#include "code\_onclick\hud\alien_larva.dm"
#include "code\_onclick\hud\constructs.dm"
#include "code\_onclick\hud\credits.dm"
-#include "code\_onclick\hud\devil.dm"
#include "code\_onclick\hud\drones.dm"
#include "code\_onclick\hud\fullscreen.dm"
#include "code\_onclick\hud\generic_dextrous.dm"
@@ -306,7 +305,6 @@
#include "code\_onclick\hud\screen_objects.dm"
#include "code\_onclick\hud\screentip.dm"
#include "code\_onclick\hud\storage.dm"
-#include "code\_onclick\hud\swarmer.dm"
#include "code\controllers\admin.dm"
#include "code\controllers\controller.dm"
#include "code\controllers\failsafe.dm"
@@ -395,6 +393,7 @@
#include "code\controllers\subsystem\title.dm"
#include "code\controllers\subsystem\traumas.dm"
#include "code\controllers\subsystem\turf_fire.dm"
+#include "code\controllers\subsystem\turrets.dm"
#include "code\controllers\subsystem\verb_manager.dm"
#include "code\controllers\subsystem\vis_overlays.dm"
#include "code\controllers\subsystem\vote.dm"
@@ -551,7 +550,6 @@
#include "code\datums\components\sitcomlaughter.dm"
#include "code\datums\components\sizzle.dm"
#include "code\datums\components\slippery.dm"
-#include "code\datums\components\soulstoned.dm"
#include "code\datums\components\spill.dm"
#include "code\datums\components\spooky.dm"
#include "code\datums\components\squeak.dm"
@@ -673,12 +671,13 @@
#include "code\datums\elements\lazy_fishing_spot.dm"
#include "code\datums\elements\light_blocking.dm"
#include "code\datums\elements\mobappearance.dm"
-#include "code\datums\elements\point_of_interest.dm"
#include "code\datums\elements\plant_backfire.dm"
+#include "code\datums\elements\point_of_interest.dm"
#include "code\datums\elements\renamemob.dm"
#include "code\datums\elements\selfknockback.dm"
#include "code\datums\elements\snail_crawl.dm"
#include "code\datums\elements\squish.dm"
+#include "code\datums\elements\tool_bang.dm"
#include "code\datums\elements\tool_flash.dm"
#include "code\datums\elements\turf_transparency.dm"
#include "code\datums\elements\undertile.dm"
@@ -844,11 +843,9 @@
#include "code\game\area\ai_monitored.dm"
#include "code\game\area\areas.dm"
#include "code\game\area\ship_areas.dm"
-#include "code\game\area\Space_Station_13_areas.dm"
#include "code\game\area\areas\away_content.dm"
#include "code\game\area\areas\centcom.dm"
#include "code\game\area\areas\outpost.dm"
-#include "code\game\area\areas\shuttles.dm"
#include "code\game\area\areas\ruins\_ruins.dm"
#include "code\game\area\areas\ruins\beachplanet.dm"
#include "code\game\area\areas\ruins\icemoon.dm"
@@ -870,18 +867,12 @@
#include "code\game\gamemodes\clown_ops\bananium_bomb.dm"
#include "code\game\gamemodes\clown_ops\clown_ops.dm"
#include "code\game\gamemodes\clown_ops\clown_weapons.dm"
-#include "code\game\gamemodes\cult\cult.dm"
-#include "code\game\gamemodes\devil\devil_game_mode.dm"
-#include "code\game\gamemodes\devil\game_mode.dm"
-#include "code\game\gamemodes\devil\objectives.dm"
-#include "code\game\gamemodes\devil\devil_agent\devil_agent.dm"
#include "code\game\gamemodes\dynamic\dynamic.dm"
#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm"
#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm"
#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm"
#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm"
#include "code\game\gamemodes\extended\extended.dm"
-#include "code\game\gamemodes\meteor\meteor.dm"
#include "code\game\gamemodes\meteor\meteors.dm"
#include "code\game\gamemodes\nuclear\nuclear.dm"
#include "code\game\gamemodes\sandbox\airlock_maker.dm"
@@ -1186,6 +1177,7 @@
#include "code\game\objects\items\etherealdiscoball.dm"
#include "code\game\objects\items\extinguisher.dm"
#include "code\game\objects\items\flamethrower.dm"
+#include "code\game\objects\items\gear_packs.dm"
#include "code\game\objects\items\gift.dm"
#include "code\game\objects\items\granters.dm"
#include "code\game\objects\items\handcuffs.dm"
@@ -1258,7 +1250,6 @@
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\pressureplates.dm"
#include "code\game\objects\items\devices\quantum_keycard.dm"
-#include "code\game\objects\items\devices\reverse_bear_trap.dm"
#include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\sensor_device.dm"
#include "code\game\objects\items\devices\spyglasses.dm"
@@ -1354,6 +1345,7 @@
#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm"
#include "code\game\objects\items\stacks\tiles\tile_types.dm"
#include "code\game\objects\items\stacks\tiles\tiles_suns.dm"
+#include "code\game\objects\items\storage\ammo_can.dm"
#include "code\game\objects\items\storage\backpack.dm"
#include "code\game\objects\items\storage\bags.dm"
#include "code\game\objects\items\storage\belt.dm"
@@ -1386,6 +1378,8 @@
#include "code\game\objects\structures\artstuff.dm"
#include "code\game\objects\structures\barsigns.dm"
#include "code\game\objects\structures\bedsheet_bin.dm"
+#include "code\game\objects\structures\cabinet.dm"
+#include "code\game\objects\structures\cabinet_types.dm"
#include "code\game\objects\structures\catwalk.dm"
#include "code\game\objects\structures\crateshelf.dm"
#include "code\game\objects\structures\curtains.dm"
@@ -1399,7 +1393,6 @@
#include "code\game\objects\structures\extinguisher.dm"
#include "code\game\objects\structures\false_walls.dm"
#include "code\game\objects\structures\fence.dm"
-#include "code\game\objects\structures\fireaxe.dm"
#include "code\game\objects\structures\fireplace.dm"
#include "code\game\objects\structures\flora.dm"
#include "code\game\objects\structures\fluff.dm"
@@ -1483,6 +1476,7 @@
#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm"
#include "code\game\objects\structures\crates_lockers\crates\bins.dm"
#include "code\game\objects\structures\crates_lockers\crates\critter.dm"
+#include "code\game\objects\structures\crates_lockers\crates\graves.dm"
#include "code\game\objects\structures\crates_lockers\crates\large.dm"
#include "code\game\objects\structures\crates_lockers\crates\secure.dm"
#include "code\game\objects\structures\crates_lockers\crates\wooden.dm"
@@ -1696,20 +1690,6 @@
#include "code\modules\antagonists\changeling\powers\strained_muscles.dm"
#include "code\modules\antagonists\changeling\powers\tiny_prick.dm"
#include "code\modules\antagonists\changeling\powers\transform.dm"
-#include "code\modules\antagonists\cult\blood_magic.dm"
-#include "code\modules\antagonists\cult\cult.dm"
-#include "code\modules\antagonists\cult\cult_comms.dm"
-#include "code\modules\antagonists\cult\cult_items.dm"
-#include "code\modules\antagonists\cult\cult_structures.dm"
-#include "code\modules\antagonists\cult\cult_turf_overlay.dm"
-#include "code\modules\antagonists\cult\rune_spawn_action.dm"
-#include "code\modules\antagonists\cult\runes.dm"
-#include "code\modules\antagonists\devil\devil.dm"
-#include "code\modules\antagonists\devil\imp\imp.dm"
-#include "code\modules\antagonists\devil\sintouched\objectives.dm"
-#include "code\modules\antagonists\devil\sintouched\sintouched.dm"
-#include "code\modules\antagonists\devil\true_devil\_true_devil.dm"
-#include "code\modules\antagonists\devil\true_devil\inventory.dm"
#include "code\modules\antagonists\disease\disease_abilities.dm"
#include "code\modules\antagonists\disease\disease_datum.dm"
#include "code\modules\antagonists\disease\disease_disease.dm"
@@ -1748,8 +1728,6 @@
#include "code\modules\antagonists\slaughter\slaughterevent.dm"
#include "code\modules\antagonists\space_dragon\space_dragon.dm"
#include "code\modules\antagonists\survivalist\survivalist.dm"
-#include "code\modules\antagonists\swarmer\swarmer.dm"
-#include "code\modules\antagonists\swarmer\swarmer_event.dm"
#include "code\modules\antagonists\traitor\datum_traitor.dm"
#include "code\modules\antagonists\traitor\syndicate_contract.dm"
#include "code\modules\antagonists\traitor\equipment\contractor.dm"
@@ -1760,7 +1738,6 @@
#include "code\modules\antagonists\valentines\valentine.dm"
#include "code\modules\antagonists\wizard\wizard.dm"
#include "code\modules\antagonists\wizard\equipment\artefact.dm"
-#include "code\modules\antagonists\wizard\equipment\soulstone.dm"
#include "code\modules\antagonists\wizard\equipment\spellbook.dm"
#include "code\modules\antagonists\xeno\xeno.dm"
#include "code\modules\assembly\assembly.dm"
@@ -1867,7 +1844,6 @@
#include "code\modules\awaymissions\mission_code\research.dm"
#include "code\modules\awaymissions\mission_code\snowdin.dm"
#include "code\modules\awaymissions\mission_code\spacebattle.dm"
-#include "code\modules\awaymissions\mission_code\stationCollision.dm"
#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm"
#include "code\modules\balloon_alert\balloon_alert.dm"
#include "code\modules\buildmode\bm_mode.dm"
@@ -2015,7 +1991,6 @@
#include "code\modules\clothing\masks\hailer.dm"
#include "code\modules\clothing\masks\miscellaneous.dm"
#include "code\modules\clothing\neck\_neck.dm"
-#include "code\modules\clothing\outfits\event.dm"
#include "code\modules\clothing\outfits\plasmaman.dm"
#include "code\modules\clothing\outfits\standard.dm"
#include "code\modules\clothing\outfits\vv_outfit.dm"
@@ -2036,7 +2011,6 @@
#include "code\modules\clothing\outfits\factions\solgov.dm"
#include "code\modules\clothing\outfits\factions\syndicate.dm"
#include "code\modules\clothing\shoes\_shoes.dm"
-#include "code\modules\clothing\shoes\bananashoes.dm"
#include "code\modules\clothing\shoes\colour.dm"
#include "code\modules\clothing\shoes\magboots.dm"
#include "code\modules\clothing\shoes\miscellaneous.dm"
@@ -2113,7 +2087,6 @@
#include "code\modules\events\camerafailure.dm"
#include "code\modules\events\carp_migration.dm"
#include "code\modules\events\communications_blackout.dm"
-#include "code\modules\events\devil.dm"
#include "code\modules\events\disease_outbreak.dm"
#include "code\modules\events\dust.dm"
#include "code\modules\events\electrical_storm.dm"
@@ -2125,10 +2098,7 @@
#include "code\modules\events\high_priority_bounty.dm"
#include "code\modules\events\immovable_rod.dm"
#include "code\modules\events\ion_storm.dm"
-#include "code\modules\events\major_dust.dm"
#include "code\modules\events\mass_hallucination.dm"
-#include "code\modules\events\meateor_wave.dm"
-#include "code\modules\events\meteor_wave.dm"
#include "code\modules\events\nightmare.dm"
#include "code\modules\events\operative.dm"
#include "code\modules\events\prison_break.dm"
@@ -2383,7 +2353,6 @@
#include "code\modules\language\teceti_unified.dm"
#include "code\modules\language\vox_pidgin.dm"
#include "code\modules\language\xenocommon.dm"
-#include "code\modules\library\lib_codex_gigas.dm"
#include "code\modules\library\lib_items.dm"
#include "code\modules\library\lib_machines.dm"
#include "code\modules\library\random_books.dm"
@@ -2431,6 +2400,7 @@
#include "code\modules\mining\ores_coins.dm"
#include "code\modules\mining\satchel_ore_boxdm.dm"
#include "code\modules\mining\shelters.dm"
+#include "code\modules\mining\equipment\angle_grinder.dm"
#include "code\modules\mining\equipment\explorer_gear.dm"
#include "code\modules\mining\equipment\kinetic_crusher.dm"
#include "code\modules\mining\equipment\lazarus_injector.dm"
@@ -2665,11 +2635,9 @@
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\robot_say.dm"
#include "code\modules\mob\living\simple_animal\animal_defense.dm"
-#include "code\modules\mob\living\simple_animal\constructs.dm"
#include "code\modules\mob\living\simple_animal\corpse.dm"
#include "code\modules\mob\living\simple_animal\damage_procs.dm"
#include "code\modules\mob\living\simple_animal\parrot.dm"
-#include "code\modules\mob\living\simple_animal\shade.dm"
#include "code\modules\mob\living\simple_animal\simple_animal.dm"
#include "code\modules\mob\living\simple_animal\status_procs.dm"
#include "code\modules\mob\living\simple_animal\bot\bot.dm"
@@ -2777,7 +2745,6 @@
#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm"
-#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm"
#include "code\modules\mob\living\simple_animal\hostile\megafauna\wendigo.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm"
#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\brimdemon.dm"
@@ -3013,7 +2980,6 @@
#include "code\modules\power\singularity\field_generator.dm"
#include "code\modules\power\singularity\generator.dm"
#include "code\modules\power\singularity\investigate.dm"
-#include "code\modules\power\singularity\narsie.dm"
#include "code\modules\power\singularity\singularity.dm"
#include "code\modules\power\singularity\particle_accelerator\particle.dm"
#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm"
@@ -3026,7 +2992,7 @@
#include "code\modules\power\tesla\generator.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\projectile.dm"
-#include "code\modules\projectiles\ammunition\_ammunition.dm"
+#include "code\modules\projectiles\ammunition\_ammo_casing.dm"
#include "code\modules\projectiles\ammunition\_firing.dm"
#include "code\modules\projectiles\ammunition\ballistic\lmg.dm"
#include "code\modules\projectiles\ammunition\ballistic\pistol.dm"
@@ -3053,8 +3019,17 @@
#include "code\modules\projectiles\ammunition\special\magic.dm"
#include "code\modules\projectiles\ammunition\special\syringe.dm"
#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm"
-#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm"
-#include "code\modules\projectiles\boxes_magazines\generic_ammo_box.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_loaders.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\_ammo_stack.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\_premade_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_gauss_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_lmg_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_misc_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_pistol_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_rifle_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_shotshell_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_smg_stacks.dm"
+#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_sniper_stacks.dm"
#include "code\modules\projectiles\boxes_magazines\external\gauss.dm"
#include "code\modules\projectiles\boxes_magazines\external\grenade.dm"
#include "code\modules\projectiles\boxes_magazines\external\pistol.dm"
@@ -3304,7 +3279,6 @@
#include "code\modules\ruins\icemoonruin_code\library.dm"
#include "code\modules\ruins\icemoonruin_code\wrath.dm"
#include "code\modules\ruins\lavalandruin_code\biodome_winter.dm"
-#include "code\modules\ruins\lavalandruin_code\elephantgraveyard.dm"
#include "code\modules\ruins\lavalandruin_code\puzzle.dm"
#include "code\modules\ruins\lavalandruin_code\surface.dm"
#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm"
@@ -3332,10 +3306,7 @@
#include "code\modules\spells\spell_types\bloodcrawl.dm"
#include "code\modules\spells\spell_types\charge.dm"
#include "code\modules\spells\spell_types\conjure.dm"
-#include "code\modules\spells\spell_types\construct_spells.dm"
#include "code\modules\spells\spell_types\curse.dm"
-#include "code\modules\spells\spell_types\devil.dm"
-#include "code\modules\spells\spell_types\devil_boons.dm"
#include "code\modules\spells\spell_types\emplosion.dm"
#include "code\modules\spells\spell_types\ethereal_jaunt.dm"
#include "code\modules\spells\spell_types\explosion.dm"
diff --git a/sound/weapons/anglegrinder.ogg b/sound/weapons/anglegrinder.ogg
new file mode 100644
index 000000000000..c0bc5b593a18
Binary files /dev/null and b/sound/weapons/anglegrinder.ogg differ
diff --git a/strings/ipc_preference_adjectives.txt b/strings/ipc_preference_adjectives.txt
index a243b2d77fc5..a106aa76ba8f 100644
--- a/strings/ipc_preference_adjectives.txt
+++ b/strings/ipc_preference_adjectives.txt
@@ -1,3 +1,5 @@
+Angsty
+Awkward
Bedraggled
Brawny
Bulky
@@ -22,6 +24,7 @@ Fragile
Frail
Friendly
Gentle
+Gormless
Hawkish
Hefty
Hobbling
@@ -38,25 +41,39 @@ Mangled
Masculine
Messy
Nimble
+Pathetic
+Peppy
Petite
Pompous
Pugnacious
+Quievering
+Radical
Repulsive
Robust
Rough
Rusted
Scarred
Shifty
+Shrewd
Sickly
Skittish
Sleek
Slender
+Slimy
Slovenly
Sluggish
+Sly
+Smooth
+Sniveling
+Soulrendered
Spacy
Stiff
Stony
+Stout
+Strapping
+Sturdy
Stylish
+Tubular
Unattractive
Unremarkable
Unsightly
diff --git a/strings/preference_adjectives.txt b/strings/preference_adjectives.txt
index 0d67f16803f8..450e4c78901f 100644
--- a/strings/preference_adjectives.txt
+++ b/strings/preference_adjectives.txt
@@ -24,7 +24,6 @@ Effeminate
Elegant
Emaciated
Energetic
-Energetic
Exasperated
Exotic
Faint
@@ -41,7 +40,6 @@ Gentle
Gloomy
Gormless
Hawkish
-Hawkish
Healthy
Hefty
Hobbling
@@ -57,7 +55,6 @@ Lopsided
Lovely
Malnourished
Mangled
-Mangled
Masculine
Messy
Muscular
diff --git a/tgui/packages/tgui-dev-server/package.json b/tgui/packages/tgui-dev-server/package.json
index a026558a47a1..1a0f4c972244 100644
--- a/tgui/packages/tgui-dev-server/package.json
+++ b/tgui/packages/tgui-dev-server/package.json
@@ -4,7 +4,7 @@
"version": "4.3.1",
"type": "module",
"dependencies": {
- "axios": "^1.6.0",
+ "axios": "^1.7.4",
"glob": "^7.1.7",
"source-map": "^0.7.3",
"stacktrace-parser": "^0.1.10",
diff --git a/tgui/packages/tgui/interfaces/PipeDispenser.js b/tgui/packages/tgui/interfaces/PipeDispenser.js
new file mode 100644
index 000000000000..61798b67306a
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/PipeDispenser.js
@@ -0,0 +1,193 @@
+import { classes } from 'common/react';
+import { useBackend, useLocalState } from '../backend';
+import {
+ Box,
+ Button,
+ ColorBox,
+ Flex,
+ LabeledList,
+ Section,
+ Tabs,
+} from '../components';
+import { Window } from '../layouts';
+
+const ROOT_CATEGORIES = ['Atmospherics', 'Disposals', 'Transit Tubes'];
+
+const ICON_BY_CATEGORY_NAME = {
+ 'Atmospherics': 'wrench',
+ 'Disposals': 'trash-alt',
+ 'Transit Tubes': 'bus',
+ 'Pipes': 'grip-lines',
+ 'Disposal Pipes': 'grip-lines',
+ 'Devices': 'microchip',
+ 'Heat Exchange': 'thermometer-half',
+ 'Station Equipment': 'microchip',
+};
+
+const PAINT_COLORS = {
+ grey: '#bbbbbb',
+ amethyst: '#a365ff',
+ blue: '#4466ff',
+ brown: '#b26438',
+ cyan: '#48eae8',
+ dark: '#808080',
+ green: '#1edd00',
+ orange: '#ffa030',
+ purple: '#b535ea',
+ red: '#ff3333',
+ violet: '#6e00f6',
+ yellow: '#ffce26',
+};
+
+export const PipeDispenser = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ category: rootCategoryIndex,
+ categories = [],
+ selected_color,
+ piping_layer,
+ mode,
+ } = data;
+ const previews = data.preview_rows.flatMap((row) => row.previews);
+ const [categoryName, setCategoryName] = useLocalState(
+ context,
+ 'categoryName'
+ );
+ const shownCategory =
+ categories.find((category) => category.cat_name === categoryName) ||
+ categories[0];
+ return (
+
+
+
+
+
+ {ROOT_CATEGORIES.map((categoryName, i) => (
+
+
+
+
+
+ {selected_color}
+
+ {Object.keys(PAINT_COLORS).map((colorName) => (
+
+ act('color', {
+ paint_color: colorName,
+ })
+ }
+ />
+ ))}
+
+
+
+
+
+
+ {rootCategoryIndex === 0 && (
+
+ {[1, 2, 3, 4, 5].map((layer) => (
+
+ act('piping_layer', {
+ piping_layer: layer,
+ })
+ }
+ />
+ ))}
+
+ )}
+
+ {previews.map((preview) => (
+
+ ))}
+
+
+
+
+
+
+ {categories.map((category, i) => (
+ setCategoryName(category.cat_name)}
+ >
+ {category.cat_name}
+
+ ))}
+
+ {shownCategory?.recipes.map((recipe) => (
+
+ act('pipe_type', {
+ pipe_type: recipe.pipe_index,
+ category: shownCategory.cat_name,
+ })
+ }
+ />
+ ))}
+
+
+
+
+
+ );
+};
diff --git a/tgui/yarn.lock b/tgui/yarn.lock
index bdf58e167804..6bb17b2fc675 100644
--- a/tgui/yarn.lock
+++ b/tgui/yarn.lock
@@ -2951,14 +2951,14 @@ __metadata:
languageName: node
linkType: hard
-"axios@npm:^1.6.0":
- version: 1.6.1
- resolution: "axios@npm:1.6.1"
+"axios@npm:^1.7.4":
+ version: 1.7.5
+ resolution: "axios@npm:1.7.5"
dependencies:
- follow-redirects: ^1.15.0
+ follow-redirects: ^1.15.6
form-data: ^4.0.0
proxy-from-env: ^1.1.0
- checksum: 573f03f59b7487d54551b16f5e155d1d130ad4864ed32d1da93d522b78a57123b34e3bde37f822a65ee297e79f1db840f9ad6514addff50d3cbf5caeed39e8dc
+ checksum: 2859fe01437cf133eee35571abc1d4b5224bb13e530e66cb3581ca226e170541dd5eef9f46abb41592cee0a2f54930c9e4978354e0cf1064748fc20d9a05e9d5
languageName: node
linkType: hard
@@ -4814,13 +4814,13 @@ __metadata:
languageName: node
linkType: hard
-"follow-redirects@npm:^1.15.0":
- version: 1.15.4
- resolution: "follow-redirects@npm:1.15.4"
+"follow-redirects@npm:^1.15.6":
+ version: 1.15.6
+ resolution: "follow-redirects@npm:1.15.6"
peerDependenciesMeta:
debug:
optional: true
- checksum: e178d1deff8b23d5d24ec3f7a94cde6e47d74d0dc649c35fc9857041267c12ec5d44650a0c5597ef83056ada9ea6ca0c30e7c4f97dbf07d035086be9e6a5b7b6
+ checksum: a62c378dfc8c00f60b9c80cab158ba54e99ba0239a5dd7c81245e5a5b39d10f0c35e249c3379eae719ff0285fff88c365dd446fab19dee771f1d76252df1bbf5
languageName: node
linkType: hard
@@ -8940,7 +8940,7 @@ resolve@^2.0.0-next.3:
version: 0.0.0-use.local
resolution: "tgui-dev-server@workspace:packages/tgui-dev-server"
dependencies:
- axios: ^1.6.0
+ axios: ^1.7.4
glob: ^7.1.7
source-map: ^0.7.3
stacktrace-parser: ^0.1.10
diff --git a/tools/pull_request_hooks/flakyTestPayloads/chat_client.txt b/tools/pull_request_hooks/flakyTestPayloads/chat_client.txt
new file mode 100644
index 000000000000..c39a060ffcf2
--- /dev/null
+++ b/tools/pull_request_hooks/flakyTestPayloads/chat_client.txt
@@ -0,0 +1,2404 @@
+2022-10-27T05:35:28.0256243Z Requested labels: ubuntu-20.04
+2022-10-27T05:35:28.0256293Z Job defined at: tgstation/tgstation/.github/workflows/ci_suite.yml@refs/pull/70831/merge
+2022-10-27T05:35:28.0256314Z Waiting for a runner to pick up this job...
+2022-10-27T05:35:28.3806920Z Job is waiting for a hosted runner to come online.
+2022-10-27T05:35:31.1835589Z Job is about to start running on the hosted runner: GitHub Actions 7 (hosted)
+2022-10-27T05:35:33.6191945Z Current runner version: '2.298.2'
+2022-10-27T05:35:33.6223671Z ##[group]Operating System
+2022-10-27T05:35:33.6224296Z Ubuntu
+2022-10-27T05:35:33.6224585Z 20.04.5
+2022-10-27T05:35:33.6225034Z LTS
+2022-10-27T05:35:33.6225416Z ##[endgroup]
+2022-10-27T05:35:33.6225743Z ##[group]Runner Image
+2022-10-27T05:35:33.6226159Z Image: ubuntu-20.04
+2022-10-27T05:35:33.6226592Z Version: 20221018.2
+2022-10-27T05:35:33.6227149Z Included Software: https://github.com/actions/runner-images/blob/ubuntu20/20221018.2/images/linux/Ubuntu2004-Readme.md
+2022-10-27T05:35:33.6227911Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu20%2F20221018.2
+2022-10-27T05:35:33.6228438Z ##[endgroup]
+2022-10-27T05:35:33.6228792Z ##[group]Runner Image Provisioner
+2022-10-27T05:35:33.6229236Z 2.0.91.1
+2022-10-27T05:35:33.6229586Z ##[endgroup]
+2022-10-27T05:35:33.6230675Z ##[group]GITHUB_TOKEN Permissions
+2022-10-27T05:35:33.6231448Z Actions: read
+2022-10-27T05:35:33.6231805Z Checks: read
+2022-10-27T05:35:33.6232342Z Contents: read
+2022-10-27T05:35:33.6232738Z Deployments: read
+2022-10-27T05:35:33.6233144Z Discussions: read
+2022-10-27T05:35:33.6233560Z Issues: read
+2022-10-27T05:35:33.6233904Z Metadata: read
+2022-10-27T05:35:33.6234279Z Packages: read
+2022-10-27T05:35:33.6234661Z Pages: read
+2022-10-27T05:35:33.6234985Z PullRequests: read
+2022-10-27T05:35:33.6235438Z RepositoryProjects: read
+2022-10-27T05:35:33.6235864Z SecurityEvents: read
+2022-10-27T05:35:33.6236198Z Statuses: read
+2022-10-27T05:35:33.6236580Z ##[endgroup]
+2022-10-27T05:35:33.6240880Z Secret source: None
+2022-10-27T05:35:33.6241441Z Prepare workflow directory
+2022-10-27T05:35:33.7582606Z Prepare all required actions
+2022-10-27T05:35:33.7797278Z Getting action download info
+2022-10-27T05:35:33.9844802Z Download action repository 'actions/checkout@v3' (SHA:93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8)
+2022-10-27T05:35:34.3746562Z Download action repository 'actions/cache@v3' (SHA:1c73980b09e7aea7201f325a7aa3ad00beddcdda)
+2022-10-27T05:35:34.6080813Z Download action repository 'actions/upload-artifact@v3' (SHA:83fd05a356d7e2593de66fc9913b3002723633cb)
+2022-10-27T05:35:34.9999481Z ##[group]Checking docker version
+2022-10-27T05:35:35.0019606Z ##[command]/usr/bin/docker version --format '{{.Server.APIVersion}}'
+2022-10-27T05:35:35.2352575Z '1.41'
+2022-10-27T05:35:35.2364837Z Docker daemon API version: '1.41'
+2022-10-27T05:35:35.2365438Z ##[command]/usr/bin/docker version --format '{{.Client.APIVersion}}'
+2022-10-27T05:35:35.2671237Z '1.41'
+2022-10-27T05:35:35.2683601Z Docker client API version: '1.41'
+2022-10-27T05:35:35.2690466Z ##[endgroup]
+2022-10-27T05:35:35.2694627Z ##[group]Clean up resources from previous jobs
+2022-10-27T05:35:35.2703798Z ##[command]/usr/bin/docker ps --all --quiet --no-trunc --filter "label=8d5581"
+2022-10-27T05:35:35.2966781Z ##[command]/usr/bin/docker network prune --force --filter "label=8d5581"
+2022-10-27T05:35:35.3198095Z ##[endgroup]
+2022-10-27T05:35:35.3198489Z ##[group]Create local container network
+2022-10-27T05:35:35.3210740Z ##[command]/usr/bin/docker network create --label 8d5581 github_network_552f961a7b154fc6bdcc0db4d38d15af
+2022-10-27T05:35:35.4083033Z 726620eda353dcb8922d8b386f90140e986ff1b865fb24546959f0eebb92fc89
+2022-10-27T05:35:35.4104308Z ##[endgroup]
+2022-10-27T05:35:35.4209182Z ##[group]Starting mysql service container
+2022-10-27T05:35:35.4233087Z ##[command]/usr/bin/docker pull mysql:latest
+2022-10-27T05:35:35.6809700Z latest: Pulling from library/mysql
+2022-10-27T05:35:35.7627837Z 50cbc88660a5: Pulling fs layer
+2022-10-27T05:35:35.7629087Z 92ca853f7184: Pulling fs layer
+2022-10-27T05:35:35.7629970Z 9a2047696230: Pulling fs layer
+2022-10-27T05:35:35.7630738Z fe3fea56f9fb: Pulling fs layer
+2022-10-27T05:35:35.7631515Z b058249d3104: Pulling fs layer
+2022-10-27T05:35:35.7632382Z 9d5014a20163: Pulling fs layer
+2022-10-27T05:35:35.7633458Z 906aa7388ee2: Pulling fs layer
+2022-10-27T05:35:35.7634120Z 86b5e2150967: Pulling fs layer
+2022-10-27T05:35:35.7634859Z fe3fea56f9fb: Waiting
+2022-10-27T05:35:35.7635207Z b058249d3104: Waiting
+2022-10-27T05:35:35.7635923Z 9d5014a20163: Waiting
+2022-10-27T05:35:35.7636723Z 906aa7388ee2: Waiting
+2022-10-27T05:35:35.7637442Z 86b5e2150967: Waiting
+2022-10-27T05:35:35.7638169Z 7c6b15dcdf4e: Pulling fs layer
+2022-10-27T05:35:35.7638928Z 21de4337b977: Pulling fs layer
+2022-10-27T05:35:35.7639714Z 35dab154f2ae: Pulling fs layer
+2022-10-27T05:35:35.7640485Z 7c6b15dcdf4e: Waiting
+2022-10-27T05:35:35.7641283Z 21de4337b977: Waiting
+2022-10-27T05:35:35.7642059Z 35dab154f2ae: Waiting
+2022-10-27T05:35:35.8359746Z 92ca853f7184: Verifying Checksum
+2022-10-27T05:35:35.8446985Z 92ca853f7184: Download complete
+2022-10-27T05:35:35.8481029Z 9a2047696230: Verifying Checksum
+2022-10-27T05:35:35.8488372Z 9a2047696230: Download complete
+2022-10-27T05:35:35.8926817Z b058249d3104: Verifying Checksum
+2022-10-27T05:35:35.8928354Z b058249d3104: Download complete
+2022-10-27T05:35:35.9459390Z 9d5014a20163: Verifying Checksum
+2022-10-27T05:35:35.9459781Z 9d5014a20163: Download complete
+2022-10-27T05:35:35.9501999Z fe3fea56f9fb: Verifying Checksum
+2022-10-27T05:35:35.9502607Z fe3fea56f9fb: Download complete
+2022-10-27T05:35:36.0227385Z 86b5e2150967: Verifying Checksum
+2022-10-27T05:35:36.0228073Z 86b5e2150967: Download complete
+2022-10-27T05:35:36.2107823Z 50cbc88660a5: Verifying Checksum
+2022-10-27T05:35:36.2144152Z 50cbc88660a5: Download complete
+2022-10-27T05:35:36.4134563Z 21de4337b977: Verifying Checksum
+2022-10-27T05:35:36.4134997Z 21de4337b977: Download complete
+2022-10-27T05:35:36.5421142Z 35dab154f2ae: Verifying Checksum
+2022-10-27T05:35:36.5422039Z 35dab154f2ae: Download complete
+2022-10-27T05:35:36.5644620Z 906aa7388ee2: Verifying Checksum
+2022-10-27T05:35:36.5645584Z 906aa7388ee2: Download complete
+2022-10-27T05:35:36.7764339Z 7c6b15dcdf4e: Verifying Checksum
+2022-10-27T05:35:36.7764814Z 7c6b15dcdf4e: Download complete
+2022-10-27T05:35:38.1046566Z 50cbc88660a5: Pull complete
+2022-10-27T05:35:39.3355767Z 92ca853f7184: Pull complete
+2022-10-27T05:35:39.4582128Z 9a2047696230: Pull complete
+2022-10-27T05:35:39.7344329Z fe3fea56f9fb: Pull complete
+2022-10-27T05:35:39.8044862Z b058249d3104: Pull complete
+2022-10-27T05:35:39.8779415Z 9d5014a20163: Pull complete
+2022-10-27T05:35:42.0306333Z 906aa7388ee2: Pull complete
+2022-10-27T05:35:42.0993787Z 86b5e2150967: Pull complete
+2022-10-27T05:35:46.6099584Z 7c6b15dcdf4e: Pull complete
+2022-10-27T05:35:46.6805432Z 21de4337b977: Pull complete
+2022-10-27T05:35:46.7395254Z 35dab154f2ae: Pull complete
+2022-10-27T05:35:46.7446735Z Digest: sha256:06314a7a220f6043436cfd72fd9c7f174fd58ef69fe4b788625fa53be4ab66aa
+2022-10-27T05:35:46.7469861Z Status: Downloaded newer image for mysql:latest
+2022-10-27T05:35:46.7485796Z docker.io/library/mysql:latest
+2022-10-27T05:35:46.7631416Z ##[command]/usr/bin/docker create --name bdaac24feb7948af9ae1cfcb2f1e5f3f_mysqllatest_e0031a --label 8d5581 --network github_network_552f961a7b154fc6bdcc0db4d38d15af --network-alias mysql -p 3306 --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 -e "MYSQL_ROOT_PASSWORD=root" -e GITHUB_ACTIONS=true -e CI=true mysql:latest
+2022-10-27T05:35:46.8132286Z b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:35:46.8159678Z ##[command]/usr/bin/docker start b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:35:47.2490003Z b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:35:47.2513985Z ##[command]/usr/bin/docker ps --all --filter id=b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
+2022-10-27T05:35:47.2830396Z b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc Up Less than a second (health: starting)
+2022-10-27T05:35:47.2856701Z ##[command]/usr/bin/docker port b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:35:47.3113114Z 3306/tcp -> 0.0.0.0:49153
+2022-10-27T05:35:47.3115902Z 3306/tcp -> :::49153
+2022-10-27T05:35:47.3221941Z ##[endgroup]
+2022-10-27T05:35:47.3222347Z ##[group]Waiting for all services to be ready
+2022-10-27T05:35:47.3271402Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:35:47.3554944Z starting
+2022-10-27T05:35:47.3594143Z mysql service is starting, waiting 2 seconds before checking again.
+2022-10-27T05:35:49.3593961Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:35:49.3867220Z starting
+2022-10-27T05:35:49.3886611Z mysql service is starting, waiting 4 seconds before checking again.
+2022-10-27T05:35:53.5602510Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:35:53.5864042Z starting
+2022-10-27T05:35:53.5910238Z mysql service is starting, waiting 7 seconds before checking again.
+2022-10-27T05:36:01.0993571Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:36:01.1232744Z starting
+2022-10-27T05:36:01.1235024Z mysql service is starting, waiting 14 seconds before checking again.
+2022-10-27T05:36:15.3399109Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:36:15.3647356Z healthy
+2022-10-27T05:36:15.3666176Z mysql service is healthy.
+2022-10-27T05:36:15.3666682Z ##[endgroup]
+2022-10-27T05:36:15.4114536Z ##[group]Run actions/checkout@v3
+2022-10-27T05:36:15.4114858Z with:
+2022-10-27T05:36:15.4115122Z repository: tgstation/tgstation
+2022-10-27T05:36:15.4115678Z token: ***
+2022-10-27T05:36:15.4115920Z ssh-strict: true
+2022-10-27T05:36:15.4116197Z persist-credentials: true
+2022-10-27T05:36:15.4116449Z clean: true
+2022-10-27T05:36:15.4116701Z fetch-depth: 1
+2022-10-27T05:36:15.4116934Z lfs: false
+2022-10-27T05:36:15.4117152Z submodules: false
+2022-10-27T05:36:15.4117416Z set-safe-directory: true
+2022-10-27T05:36:15.4117683Z ##[endgroup]
+2022-10-27T05:36:15.7895271Z Syncing repository: tgstation/tgstation
+2022-10-27T05:36:15.7897134Z ##[group]Getting Git version info
+2022-10-27T05:36:15.7897764Z Working directory is '/home/runner/work/tgstation/tgstation'
+2022-10-27T05:36:15.7898346Z [command]/usr/bin/git version
+2022-10-27T05:36:15.8070209Z git version 2.38.1
+2022-10-27T05:36:15.8107380Z ##[endgroup]
+2022-10-27T05:36:15.8130065Z Temporarily overriding HOME='/home/runner/work/_temp/d9a17a0a-ad0c-43af-a749-41248c6e4a98' before making global git config changes
+2022-10-27T05:36:15.8135001Z Adding repository directory to the temporary git global config as a safe directory
+2022-10-27T05:36:15.8140556Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2022-10-27T05:36:15.8198130Z Deleting the contents of '/home/runner/work/tgstation/tgstation'
+2022-10-27T05:36:15.8204575Z ##[group]Initializing the repository
+2022-10-27T05:36:15.8209016Z [command]/usr/bin/git init /home/runner/work/tgstation/tgstation
+2022-10-27T05:36:15.8312384Z hint: Using 'master' as the name for the initial branch. This default branch name
+2022-10-27T05:36:15.8313365Z hint: is subject to change. To configure the initial branch name to use in all
+2022-10-27T05:36:15.8313842Z hint: of your new repositories, which will suppress this warning, call:
+2022-10-27T05:36:15.8314167Z hint:
+2022-10-27T05:36:15.8314756Z hint: git config --global init.defaultBranch
+2022-10-27T05:36:15.8315053Z hint:
+2022-10-27T05:36:15.8315481Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
+2022-10-27T05:36:15.8316041Z hint: 'development'. The just-created branch can be renamed via this command:
+2022-10-27T05:36:15.8316354Z hint:
+2022-10-27T05:36:15.8316650Z hint: git branch -m
+2022-10-27T05:36:15.8337002Z Initialized empty Git repository in /home/runner/work/tgstation/tgstation/.git/
+2022-10-27T05:36:15.8348424Z [command]/usr/bin/git remote add origin https://github.com/tgstation/tgstation
+2022-10-27T05:36:15.8408157Z ##[endgroup]
+2022-10-27T05:36:15.8408999Z ##[group]Disabling automatic garbage collection
+2022-10-27T05:36:15.8415169Z [command]/usr/bin/git config --local gc.auto 0
+2022-10-27T05:36:15.8455049Z ##[endgroup]
+2022-10-27T05:36:15.8456729Z ##[group]Setting up auth
+2022-10-27T05:36:15.8467019Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2022-10-27T05:36:15.8512305Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :
+2022-10-27T05:36:15.8992303Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2022-10-27T05:36:15.9034687Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :
+2022-10-27T05:36:15.9317710Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
+2022-10-27T05:36:15.9381545Z ##[endgroup]
+2022-10-27T05:36:15.9383025Z ##[group]Fetching the repository
+2022-10-27T05:36:15.9392584Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +deb5c38b8299183d179ee993b8c40179d42cff9b:refs/remotes/pull/70831/merge
+2022-10-27T05:36:16.3561666Z remote: Enumerating objects: 12549, done.
+2022-10-27T05:36:16.3568675Z remote: Counting objects: 0% (1/12549)
+2022-10-27T05:36:16.3571032Z remote: Counting objects: 1% (126/12549)
+2022-10-27T05:36:16.3576947Z remote: Counting objects: 2% (251/12549)
+2022-10-27T05:36:16.3590550Z remote: Counting objects: 3% (377/12549)
+2022-10-27T05:36:16.3591870Z remote: Counting objects: 4% (502/12549)
+2022-10-27T05:36:16.3629704Z remote: Counting objects: 5% (628/12549)
+2022-10-27T05:36:16.3630882Z remote: Counting objects: 6% (753/12549)
+2022-10-27T05:36:16.3633986Z remote: Counting objects: 7% (879/12549)
+2022-10-27T05:36:16.3662523Z remote: Counting objects: 8% (1004/12549)
+2022-10-27T05:36:16.3663123Z remote: Counting objects: 9% (1130/12549)
+2022-10-27T05:36:16.3664088Z remote: Counting objects: 10% (1255/12549)
+2022-10-27T05:36:16.3664584Z remote: Counting objects: 11% (1381/12549)
+2022-10-27T05:36:16.3665108Z remote: Counting objects: 12% (1506/12549)
+2022-10-27T05:36:16.3665639Z remote: Counting objects: 13% (1632/12549)
+2022-10-27T05:36:16.3666161Z remote: Counting objects: 14% (1757/12549)
+2022-10-27T05:36:16.3666781Z remote: Counting objects: 15% (1883/12549)
+2022-10-27T05:36:16.3667203Z remote: Counting objects: 16% (2008/12549)
+2022-10-27T05:36:16.3667759Z remote: Counting objects: 17% (2134/12549)
+2022-10-27T05:36:16.3668424Z remote: Counting objects: 18% (2259/12549)
+2022-10-27T05:36:16.3668772Z remote: Counting objects: 19% (2385/12549)
+2022-10-27T05:36:16.3686549Z remote: Counting objects: 20% (2510/12549)
+2022-10-27T05:36:16.3687142Z remote: Counting objects: 21% (2636/12549)
+2022-10-27T05:36:16.3693091Z remote: Counting objects: 22% (2761/12549)
+2022-10-27T05:36:16.3695805Z remote: Counting objects: 23% (2887/12549)
+2022-10-27T05:36:16.3696270Z remote: Counting objects: 24% (3012/12549)
+2022-10-27T05:36:16.3696611Z remote: Counting objects: 25% (3138/12549)
+2022-10-27T05:36:16.3696933Z remote: Counting objects: 26% (3263/12549)
+2022-10-27T05:36:16.3697238Z remote: Counting objects: 27% (3389/12549)
+2022-10-27T05:36:16.3697557Z remote: Counting objects: 28% (3514/12549)
+2022-10-27T05:36:16.3700568Z remote: Counting objects: 29% (3640/12549)
+2022-10-27T05:36:16.3701206Z remote: Counting objects: 30% (3765/12549)
+2022-10-27T05:36:16.3701530Z remote: Counting objects: 31% (3891/12549)
+2022-10-27T05:36:16.3702027Z remote: Counting objects: 32% (4016/12549)
+2022-10-27T05:36:16.3704376Z remote: Counting objects: 33% (4142/12549)
+2022-10-27T05:36:16.3705536Z remote: Counting objects: 34% (4267/12549)
+2022-10-27T05:36:16.3706001Z remote: Counting objects: 35% (4393/12549)
+2022-10-27T05:36:16.3706528Z remote: Counting objects: 36% (4518/12549)
+2022-10-27T05:36:16.3707049Z remote: Counting objects: 37% (4644/12549)
+2022-10-27T05:36:16.3707535Z remote: Counting objects: 38% (4769/12549)
+2022-10-27T05:36:16.3707879Z remote: Counting objects: 39% (4895/12549)
+2022-10-27T05:36:16.3708856Z remote: Counting objects: 40% (5020/12549)
+2022-10-27T05:36:16.3714163Z remote: Counting objects: 41% (5146/12549)
+2022-10-27T05:36:16.3716186Z remote: Counting objects: 42% (5271/12549)
+2022-10-27T05:36:16.3720394Z remote: Counting objects: 43% (5397/12549)
+2022-10-27T05:36:16.3725239Z remote: Counting objects: 44% (5522/12549)
+2022-10-27T05:36:16.3727509Z remote: Counting objects: 45% (5648/12549)
+2022-10-27T05:36:16.3728407Z remote: Counting objects: 46% (5773/12549)
+2022-10-27T05:36:16.3733411Z remote: Counting objects: 47% (5899/12549)
+2022-10-27T05:36:16.3734826Z remote: Counting objects: 48% (6024/12549)
+2022-10-27T05:36:16.3736029Z remote: Counting objects: 49% (6150/12549)
+2022-10-27T05:36:16.3736752Z remote: Counting objects: 50% (6275/12549)
+2022-10-27T05:36:16.3737119Z remote: Counting objects: 51% (6400/12549)
+2022-10-27T05:36:16.3740552Z remote: Counting objects: 52% (6526/12549)
+2022-10-27T05:36:16.3741109Z remote: Counting objects: 53% (6651/12549)
+2022-10-27T05:36:16.3742348Z remote: Counting objects: 54% (6777/12549)
+2022-10-27T05:36:16.3745824Z remote: Counting objects: 55% (6902/12549)
+2022-10-27T05:36:16.3746239Z remote: Counting objects: 56% (7028/12549)
+2022-10-27T05:36:16.3748976Z remote: Counting objects: 57% (7153/12549)
+2022-10-27T05:36:16.3752389Z remote: Counting objects: 58% (7279/12549)
+2022-10-27T05:36:16.3753090Z remote: Counting objects: 59% (7404/12549)
+2022-10-27T05:36:16.3753587Z remote: Counting objects: 60% (7530/12549)
+2022-10-27T05:36:16.3753969Z remote: Counting objects: 61% (7655/12549)
+2022-10-27T05:36:16.3755897Z remote: Counting objects: 62% (7781/12549)
+2022-10-27T05:36:16.3758566Z remote: Counting objects: 63% (7906/12549)
+2022-10-27T05:36:16.3760370Z remote: Counting objects: 64% (8032/12549)
+2022-10-27T05:36:16.3763888Z remote: Counting objects: 65% (8157/12549)
+2022-10-27T05:36:16.3765292Z remote: Counting objects: 66% (8283/12549)
+2022-10-27T05:36:16.3765656Z remote: Counting objects: 67% (8408/12549)
+2022-10-27T05:36:16.3767729Z remote: Counting objects: 68% (8534/12549)
+2022-10-27T05:36:16.3769245Z remote: Counting objects: 69% (8659/12549)
+2022-10-27T05:36:16.3772503Z remote: Counting objects: 70% (8785/12549)
+2022-10-27T05:36:16.3773802Z remote: Counting objects: 71% (8910/12549)
+2022-10-27T05:36:16.3774655Z remote: Counting objects: 72% (9036/12549)
+2022-10-27T05:36:16.3775188Z remote: Counting objects: 73% (9161/12549)
+2022-10-27T05:36:16.3778186Z remote: Counting objects: 74% (9287/12549)
+2022-10-27T05:36:16.3778933Z remote: Counting objects: 75% (9412/12549)
+2022-10-27T05:36:16.3780943Z remote: Counting objects: 76% (9538/12549)
+2022-10-27T05:36:16.3781397Z remote: Counting objects: 77% (9663/12549)
+2022-10-27T05:36:16.3782023Z remote: Counting objects: 78% (9789/12549)
+2022-10-27T05:36:16.3782511Z remote: Counting objects: 79% (9914/12549)
+2022-10-27T05:36:16.3784693Z remote: Counting objects: 80% (10040/12549)
+2022-10-27T05:36:16.3785644Z remote: Counting objects: 81% (10165/12549)
+2022-10-27T05:36:16.3786373Z remote: Counting objects: 82% (10291/12549)
+2022-10-27T05:36:16.3787171Z remote: Counting objects: 83% (10416/12549)
+2022-10-27T05:36:16.3788291Z remote: Counting objects: 84% (10542/12549)
+2022-10-27T05:36:16.3789701Z remote: Counting objects: 85% (10667/12549)
+2022-10-27T05:36:16.3791529Z remote: Counting objects: 86% (10793/12549)
+2022-10-27T05:36:16.3792061Z remote: Counting objects: 87% (10918/12549)
+2022-10-27T05:36:16.3792440Z remote: Counting objects: 88% (11044/12549)
+2022-10-27T05:36:16.3792863Z remote: Counting objects: 89% (11169/12549)
+2022-10-27T05:36:16.3793298Z remote: Counting objects: 90% (11295/12549)
+2022-10-27T05:36:16.3795291Z remote: Counting objects: 91% (11420/12549)
+2022-10-27T05:36:16.3796533Z remote: Counting objects: 92% (11546/12549)
+2022-10-27T05:36:16.3804544Z remote: Counting objects: 93% (11671/12549)
+2022-10-27T05:36:16.3804980Z remote: Counting objects: 94% (11797/12549)
+2022-10-27T05:36:16.3809019Z remote: Counting objects: 95% (11922/12549)
+2022-10-27T05:36:16.3812297Z remote: Counting objects: 96% (12048/12549)
+2022-10-27T05:36:16.3812832Z remote: Counting objects: 97% (12173/12549)
+2022-10-27T05:36:16.3813378Z remote: Counting objects: 98% (12299/12549)
+2022-10-27T05:36:16.3822622Z remote: Counting objects: 99% (12424/12549)
+2022-10-27T05:36:16.3823331Z remote: Counting objects: 100% (12549/12549)
+2022-10-27T05:36:16.3823824Z remote: Counting objects: 100% (12549/12549), done.
+2022-10-27T05:36:16.4028339Z remote: Compressing objects: 0% (1/10965)
+2022-10-27T05:36:16.4147149Z remote: Compressing objects: 1% (110/10965)
+2022-10-27T05:36:16.4301715Z remote: Compressing objects: 2% (220/10965)
+2022-10-27T05:36:16.4468059Z remote: Compressing objects: 3% (329/10965)
+2022-10-27T05:36:16.4473482Z remote: Compressing objects: 4% (439/10965)
+2022-10-27T05:36:16.4543661Z remote: Compressing objects: 5% (549/10965)
+2022-10-27T05:36:16.4673953Z remote: Compressing objects: 6% (658/10965)
+2022-10-27T05:36:16.4966036Z remote: Compressing objects: 7% (768/10965)
+2022-10-27T05:36:16.5309645Z remote: Compressing objects: 8% (878/10965)
+2022-10-27T05:36:16.5681068Z remote: Compressing objects: 9% (987/10965)
+2022-10-27T05:36:16.6184895Z remote: Compressing objects: 10% (1097/10965)
+2022-10-27T05:36:17.1107044Z remote: Compressing objects: 11% (1207/10965)
+2022-10-27T05:36:17.2060689Z remote: Compressing objects: 12% (1316/10965)
+2022-10-27T05:36:17.3922950Z remote: Compressing objects: 13% (1426/10965)
+2022-10-27T05:36:17.3936933Z remote: Compressing objects: 13% (1501/10965)
+2022-10-27T05:36:17.4040840Z remote: Compressing objects: 14% (1536/10965)
+2022-10-27T05:36:17.4460571Z remote: Compressing objects: 15% (1645/10965)
+2022-10-27T05:36:17.4619358Z remote: Compressing objects: 16% (1755/10965)
+2022-10-27T05:36:17.4790041Z remote: Compressing objects: 17% (1865/10965)
+2022-10-27T05:36:17.4934830Z remote: Compressing objects: 18% (1974/10965)
+2022-10-27T05:36:17.5257200Z remote: Compressing objects: 19% (2084/10965)
+2022-10-27T05:36:17.5516516Z remote: Compressing objects: 20% (2193/10965)
+2022-10-27T05:36:17.5561317Z remote: Compressing objects: 21% (2303/10965)
+2022-10-27T05:36:17.5795622Z remote: Compressing objects: 22% (2413/10965)
+2022-10-27T05:36:17.6401406Z remote: Compressing objects: 23% (2522/10965)
+2022-10-27T05:36:17.6654061Z remote: Compressing objects: 24% (2632/10965)
+2022-10-27T05:36:17.6828486Z remote: Compressing objects: 25% (2742/10965)
+2022-10-27T05:36:17.7044480Z remote: Compressing objects: 26% (2851/10965)
+2022-10-27T05:36:17.7222440Z remote: Compressing objects: 27% (2961/10965)
+2022-10-27T05:36:17.7713784Z remote: Compressing objects: 28% (3071/10965)
+2022-10-27T05:36:17.7980639Z remote: Compressing objects: 29% (3180/10965)
+2022-10-27T05:36:17.8260312Z remote: Compressing objects: 30% (3290/10965)
+2022-10-27T05:36:17.8653550Z remote: Compressing objects: 31% (3400/10965)
+2022-10-27T05:36:17.8786759Z remote: Compressing objects: 32% (3509/10965)
+2022-10-27T05:36:17.9127781Z remote: Compressing objects: 33% (3619/10965)
+2022-10-27T05:36:17.9521720Z remote: Compressing objects: 34% (3729/10965)
+2022-10-27T05:36:17.9910080Z remote: Compressing objects: 35% (3838/10965)
+2022-10-27T05:36:18.0204335Z remote: Compressing objects: 36% (3948/10965)
+2022-10-27T05:36:18.0597196Z remote: Compressing objects: 37% (4058/10965)
+2022-10-27T05:36:18.0964696Z remote: Compressing objects: 38% (4167/10965)
+2022-10-27T05:36:18.1358555Z remote: Compressing objects: 39% (4277/10965)
+2022-10-27T05:36:18.1549596Z remote: Compressing objects: 40% (4386/10965)
+2022-10-27T05:36:18.1861724Z remote: Compressing objects: 41% (4496/10965)
+2022-10-27T05:36:18.2100005Z remote: Compressing objects: 42% (4606/10965)
+2022-10-27T05:36:18.2479949Z remote: Compressing objects: 43% (4715/10965)
+2022-10-27T05:36:18.2787209Z remote: Compressing objects: 44% (4825/10965)
+2022-10-27T05:36:18.3002217Z remote: Compressing objects: 45% (4935/10965)
+2022-10-27T05:36:18.3304059Z remote: Compressing objects: 46% (5044/10965)
+2022-10-27T05:36:18.3627827Z remote: Compressing objects: 47% (5154/10965)
+2022-10-27T05:36:18.3769101Z remote: Compressing objects: 48% (5264/10965)
+2022-10-27T05:36:18.3833369Z remote: Compressing objects: 49% (5373/10965)
+2022-10-27T05:36:18.4021233Z remote: Compressing objects: 49% (5403/10965)
+2022-10-27T05:36:18.4232973Z remote: Compressing objects: 50% (5483/10965)
+2022-10-27T05:36:18.4496802Z remote: Compressing objects: 51% (5593/10965)
+2022-10-27T05:36:18.4760000Z remote: Compressing objects: 52% (5702/10965)
+2022-10-27T05:36:18.5061635Z remote: Compressing objects: 53% (5812/10965)
+2022-10-27T05:36:18.5273446Z remote: Compressing objects: 54% (5922/10965)
+2022-10-27T05:36:18.5546118Z remote: Compressing objects: 55% (6031/10965)
+2022-10-27T05:36:18.5809381Z remote: Compressing objects: 56% (6141/10965)
+2022-10-27T05:36:18.6147456Z remote: Compressing objects: 57% (6251/10965)
+2022-10-27T05:36:18.6311320Z remote: Compressing objects: 58% (6360/10965)
+2022-10-27T05:36:18.6614446Z remote: Compressing objects: 59% (6470/10965)
+2022-10-27T05:36:18.6930160Z remote: Compressing objects: 60% (6579/10965)
+2022-10-27T05:36:18.7250175Z remote: Compressing objects: 61% (6689/10965)
+2022-10-27T05:36:18.7426580Z remote: Compressing objects: 62% (6799/10965)
+2022-10-27T05:36:18.7654931Z remote: Compressing objects: 63% (6908/10965)
+2022-10-27T05:36:18.8010761Z remote: Compressing objects: 64% (7018/10965)
+2022-10-27T05:36:18.8152846Z remote: Compressing objects: 65% (7128/10965)
+2022-10-27T05:36:18.8473982Z remote: Compressing objects: 66% (7237/10965)
+2022-10-27T05:36:18.8539428Z remote: Compressing objects: 67% (7347/10965)
+2022-10-27T05:36:18.8540163Z remote: Compressing objects: 68% (7457/10965)
+2022-10-27T05:36:18.8621595Z remote: Compressing objects: 69% (7566/10965)
+2022-10-27T05:36:18.8622122Z remote: Compressing objects: 70% (7676/10965)
+2022-10-27T05:36:18.8625855Z remote: Compressing objects: 71% (7786/10965)
+2022-10-27T05:36:18.8626847Z remote: Compressing objects: 72% (7895/10965)
+2022-10-27T05:36:18.8627930Z remote: Compressing objects: 73% (8005/10965)
+2022-10-27T05:36:18.8629224Z remote: Compressing objects: 74% (8115/10965)
+2022-10-27T05:36:18.8630011Z remote: Compressing objects: 75% (8224/10965)
+2022-10-27T05:36:18.8630611Z remote: Compressing objects: 76% (8334/10965)
+2022-10-27T05:36:18.8658429Z remote: Compressing objects: 77% (8444/10965)
+2022-10-27T05:36:18.8659128Z remote: Compressing objects: 78% (8553/10965)
+2022-10-27T05:36:18.8659555Z remote: Compressing objects: 79% (8663/10965)
+2022-10-27T05:36:18.8688825Z remote: Compressing objects: 80% (8772/10965)
+2022-10-27T05:36:18.8779984Z remote: Compressing objects: 81% (8882/10965)
+2022-10-27T05:36:18.8780591Z remote: Compressing objects: 82% (8992/10965)
+2022-10-27T05:36:18.8839685Z remote: Compressing objects: 83% (9101/10965)
+2022-10-27T05:36:18.8906377Z remote: Compressing objects: 84% (9211/10965)
+2022-10-27T05:36:18.8909267Z remote: Compressing objects: 85% (9321/10965)
+2022-10-27T05:36:18.8909956Z remote: Compressing objects: 86% (9430/10965)
+2022-10-27T05:36:18.8910536Z remote: Compressing objects: 87% (9540/10965)
+2022-10-27T05:36:18.8911145Z remote: Compressing objects: 88% (9650/10965)
+2022-10-27T05:36:18.8911776Z remote: Compressing objects: 89% (9759/10965)
+2022-10-27T05:36:18.8951128Z remote: Compressing objects: 90% (9869/10965)
+2022-10-27T05:36:18.9127733Z remote: Compressing objects: 91% (9979/10965)
+2022-10-27T05:36:18.9128171Z remote: Compressing objects: 92% (10088/10965)
+2022-10-27T05:36:18.9128609Z remote: Compressing objects: 93% (10198/10965)
+2022-10-27T05:36:18.9133927Z remote: Compressing objects: 94% (10308/10965)
+2022-10-27T05:36:18.9152257Z remote: Compressing objects: 95% (10417/10965)
+2022-10-27T05:36:18.9166692Z remote: Compressing objects: 96% (10527/10965)
+2022-10-27T05:36:18.9178013Z remote: Compressing objects: 97% (10637/10965)
+2022-10-27T05:36:18.9188202Z remote: Compressing objects: 98% (10746/10965)
+2022-10-27T05:36:18.9202595Z remote: Compressing objects: 99% (10856/10965)
+2022-10-27T05:36:18.9203422Z remote: Compressing objects: 100% (10965/10965)
+2022-10-27T05:36:18.9204293Z remote: Compressing objects: 100% (10965/10965), done.
+2022-10-27T05:36:18.9643118Z Receiving objects: 0% (1/12549)
+2022-10-27T05:36:19.5343020Z Receiving objects: 1% (126/12549)
+2022-10-27T05:36:19.5547619Z Receiving objects: 2% (251/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.6802499Z Receiving objects: 3% (377/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.6848774Z Receiving objects: 4% (502/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.6918314Z Receiving objects: 5% (628/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7013063Z Receiving objects: 6% (753/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7286047Z Receiving objects: 7% (879/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7436763Z Receiving objects: 8% (1004/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7550028Z Receiving objects: 9% (1130/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7787460Z Receiving objects: 10% (1255/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7893592Z Receiving objects: 11% (1381/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7964417Z Receiving objects: 12% (1506/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.7972529Z Receiving objects: 13% (1632/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.8080879Z Receiving objects: 14% (1757/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.8345622Z Receiving objects: 15% (1883/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.8638441Z Receiving objects: 16% (2008/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.8936447Z Receiving objects: 17% (2134/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.9178154Z Receiving objects: 18% (2259/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.9260786Z Receiving objects: 19% (2385/12549), 1.75 MiB | 3.48 MiB/s
+2022-10-27T05:36:19.9393291Z Receiving objects: 19% (2435/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:19.9632368Z Receiving objects: 20% (2510/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:19.9921544Z Receiving objects: 21% (2636/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.0107217Z Receiving objects: 22% (2761/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.0369762Z Receiving objects: 23% (2887/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.0569122Z Receiving objects: 24% (3012/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.0723597Z Receiving objects: 25% (3138/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.0869934Z Receiving objects: 26% (3263/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.1140123Z Receiving objects: 27% (3389/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.1316832Z Receiving objects: 28% (3514/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.1426255Z Receiving objects: 29% (3640/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.1574856Z Receiving objects: 30% (3765/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.1690424Z Receiving objects: 31% (3891/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.1856759Z Receiving objects: 32% (4016/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.2003719Z Receiving objects: 33% (4142/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.2128451Z Receiving objects: 34% (4267/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.2373132Z Receiving objects: 35% (4393/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.2632141Z Receiving objects: 36% (4518/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.2939431Z Receiving objects: 37% (4644/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.3274915Z Receiving objects: 38% (4769/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.3458463Z Receiving objects: 39% (4895/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.3681513Z Receiving objects: 40% (5020/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.3843488Z Receiving objects: 41% (5146/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.4250181Z Receiving objects: 42% (5271/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.4536213Z Receiving objects: 43% (5397/12549), 5.83 MiB | 5.83 MiB/s
+2022-10-27T05:36:20.4617089Z Receiving objects: 44% (5522/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:20.4783619Z Receiving objects: 45% (5648/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:20.4859599Z Receiving objects: 46% (5773/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:20.4931650Z Receiving objects: 47% (5899/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:20.5106605Z Receiving objects: 48% (6024/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:20.5200970Z Receiving objects: 49% (6150/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:20.5422557Z Receiving objects: 50% (6275/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:20.6547058Z Receiving objects: 51% (6400/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:21.0443771Z Receiving objects: 52% (6526/12549), 10.95 MiB | 7.30 MiB/s
+2022-10-27T05:36:21.1817778Z Receiving objects: 52% (6647/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.2302284Z Receiving objects: 53% (6651/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.2489598Z Receiving objects: 54% (6777/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.3284868Z Receiving objects: 55% (6902/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.3646886Z Receiving objects: 56% (7028/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.3983650Z Receiving objects: 57% (7153/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.4349926Z Receiving objects: 58% (7279/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.4697848Z Receiving objects: 59% (7404/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.4885011Z Receiving objects: 60% (7530/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.5194540Z Receiving objects: 61% (7655/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.9296042Z Receiving objects: 62% (7781/12549), 28.68 MiB | 13.54 MiB/s
+2022-10-27T05:36:21.9417402Z Receiving objects: 62% (7892/12549), 52.44 MiB | 18.21 MiB/s
+2022-10-27T05:36:22.2486679Z Receiving objects: 63% (7906/12549), 52.44 MiB | 18.21 MiB/s
+2022-10-27T05:36:22.6090348Z Receiving objects: 64% (8032/12549), 52.44 MiB | 18.21 MiB/s
+2022-10-27T05:36:22.6661080Z Receiving objects: 65% (8157/12549), 75.07 MiB | 22.21 MiB/s
+2022-10-27T05:36:22.7208247Z Receiving objects: 66% (8283/12549), 75.07 MiB | 22.21 MiB/s
+2022-10-27T05:36:22.7863776Z Receiving objects: 67% (8408/12549), 75.07 MiB | 22.21 MiB/s
+2022-10-27T05:36:22.8373169Z Receiving objects: 68% (8534/12549), 75.07 MiB | 22.21 MiB/s
+2022-10-27T05:36:22.8956416Z Receiving objects: 69% (8659/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:22.9260929Z Receiving objects: 70% (8785/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:22.9590581Z Receiving objects: 70% (8837/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.0657790Z Receiving objects: 71% (8910/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.0903691Z Receiving objects: 72% (9036/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.0992227Z Receiving objects: 73% (9161/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.1133106Z Receiving objects: 74% (9287/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.1304261Z Receiving objects: 75% (9412/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.1587550Z Receiving objects: 76% (9538/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.2736992Z Receiving objects: 77% (9663/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.2740076Z Receiving objects: 78% (9789/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.2994632Z Receiving objects: 79% (9914/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.3419146Z Receiving objects: 80% (10040/12549), 101.16 MiB | 26.07 MiB/s
+2022-10-27T05:36:23.3507115Z Receiving objects: 81% (10165/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.3603382Z Receiving objects: 82% (10291/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.3686272Z Receiving objects: 83% (10416/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.3750488Z Receiving objects: 84% (10542/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.3820341Z Receiving objects: 85% (10667/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.3895988Z Receiving objects: 86% (10793/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.3970448Z Receiving objects: 87% (10918/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.4142134Z Receiving objects: 88% (11044/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.4796088Z Receiving objects: 89% (11169/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5287511Z Receiving objects: 90% (11295/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5336228Z Receiving objects: 91% (11420/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5378046Z Receiving objects: 92% (11546/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5440975Z Receiving objects: 93% (11671/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5509602Z Receiving objects: 94% (11797/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5572754Z Receiving objects: 95% (11922/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5615446Z Receiving objects: 96% (12048/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5654171Z Receiving objects: 97% (12173/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5827062Z Receiving objects: 98% (12299/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5872285Z Receiving objects: 99% (12424/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5873322Z remote: Total 12549 (delta 1601), reused 7183 (delta 1450), pack-reused 0
+2022-10-27T05:36:23.5902379Z Receiving objects: 100% (12549/12549), 126.98 MiB | 28.99 MiB/s
+2022-10-27T05:36:23.5903011Z Receiving objects: 100% (12549/12549), 139.13 MiB | 29.83 MiB/s, done.
+2022-10-27T05:36:23.5950353Z Resolving deltas: 0% (0/1601)
+2022-10-27T05:36:23.6009625Z Resolving deltas: 1% (17/1601)
+2022-10-27T05:36:23.6040033Z Resolving deltas: 2% (33/1601)
+2022-10-27T05:36:23.6057851Z Resolving deltas: 3% (49/1601)
+2022-10-27T05:36:23.6072426Z Resolving deltas: 4% (65/1601)
+2022-10-27T05:36:23.6083467Z Resolving deltas: 5% (81/1601)
+2022-10-27T05:36:23.6093371Z Resolving deltas: 6% (97/1601)
+2022-10-27T05:36:23.6106250Z Resolving deltas: 7% (113/1601)
+2022-10-27T05:36:23.6119016Z Resolving deltas: 8% (129/1601)
+2022-10-27T05:36:23.6129503Z Resolving deltas: 9% (145/1601)
+2022-10-27T05:36:23.6155198Z Resolving deltas: 10% (161/1601)
+2022-10-27T05:36:23.6353928Z Resolving deltas: 11% (177/1601)
+2022-10-27T05:36:23.6373203Z Resolving deltas: 12% (193/1601)
+2022-10-27T05:36:23.6378714Z Resolving deltas: 13% (209/1601)
+2022-10-27T05:36:23.6386654Z Resolving deltas: 14% (225/1601)
+2022-10-27T05:36:23.6389141Z Resolving deltas: 15% (241/1601)
+2022-10-27T05:36:23.6389674Z Resolving deltas: 16% (257/1601)
+2022-10-27T05:36:23.6392302Z Resolving deltas: 17% (273/1601)
+2022-10-27T05:36:23.6392861Z Resolving deltas: 18% (289/1601)
+2022-10-27T05:36:23.6394168Z Resolving deltas: 19% (305/1601)
+2022-10-27T05:36:23.6394627Z Resolving deltas: 20% (321/1601)
+2022-10-27T05:36:23.6395739Z Resolving deltas: 21% (337/1601)
+2022-10-27T05:36:23.6397738Z Resolving deltas: 22% (353/1601)
+2022-10-27T05:36:23.6418913Z Resolving deltas: 23% (369/1601)
+2022-10-27T05:36:23.6431860Z Resolving deltas: 24% (385/1601)
+2022-10-27T05:36:23.6445159Z Resolving deltas: 25% (401/1601)
+2022-10-27T05:36:23.6470106Z Resolving deltas: 26% (417/1601)
+2022-10-27T05:36:23.6478765Z Resolving deltas: 27% (433/1601)
+2022-10-27T05:36:23.6488812Z Resolving deltas: 28% (449/1601)
+2022-10-27T05:36:23.6536619Z Resolving deltas: 29% (465/1601)
+2022-10-27T05:36:23.6642121Z Resolving deltas: 30% (481/1601)
+2022-10-27T05:36:23.6649990Z Resolving deltas: 31% (497/1601)
+2022-10-27T05:36:23.6667237Z Resolving deltas: 32% (513/1601)
+2022-10-27T05:36:23.6686758Z Resolving deltas: 33% (529/1601)
+2022-10-27T05:36:23.6707887Z Resolving deltas: 34% (545/1601)
+2022-10-27T05:36:23.6725136Z Resolving deltas: 35% (561/1601)
+2022-10-27T05:36:23.6748072Z Resolving deltas: 36% (577/1601)
+2022-10-27T05:36:23.6779790Z Resolving deltas: 37% (593/1601)
+2022-10-27T05:36:23.6799195Z Resolving deltas: 38% (609/1601)
+2022-10-27T05:36:23.6806737Z Resolving deltas: 39% (625/1601)
+2022-10-27T05:36:23.6807261Z Resolving deltas: 40% (641/1601)
+2022-10-27T05:36:23.6808652Z Resolving deltas: 41% (657/1601)
+2022-10-27T05:36:23.6809133Z Resolving deltas: 42% (673/1601)
+2022-10-27T05:36:23.6810413Z Resolving deltas: 43% (689/1601)
+2022-10-27T05:36:23.6810931Z Resolving deltas: 44% (705/1601)
+2022-10-27T05:36:23.6813160Z Resolving deltas: 45% (721/1601)
+2022-10-27T05:36:23.6813648Z Resolving deltas: 46% (737/1601)
+2022-10-27T05:36:23.6815230Z Resolving deltas: 47% (753/1601)
+2022-10-27T05:36:23.6815825Z Resolving deltas: 48% (769/1601)
+2022-10-27T05:36:23.6816545Z Resolving deltas: 49% (785/1601)
+2022-10-27T05:36:23.6816996Z Resolving deltas: 50% (801/1601)
+2022-10-27T05:36:23.6820662Z Resolving deltas: 51% (817/1601)
+2022-10-27T05:36:23.6826869Z Resolving deltas: 52% (833/1601)
+2022-10-27T05:36:23.6834350Z Resolving deltas: 53% (849/1601)
+2022-10-27T05:36:23.6838690Z Resolving deltas: 54% (865/1601)
+2022-10-27T05:36:23.6901937Z Resolving deltas: 55% (881/1601)
+2022-10-27T05:36:23.6910273Z Resolving deltas: 56% (897/1601)
+2022-10-27T05:36:23.6914911Z Resolving deltas: 57% (913/1601)
+2022-10-27T05:36:23.6919959Z Resolving deltas: 58% (929/1601)
+2022-10-27T05:36:23.6925039Z Resolving deltas: 59% (945/1601)
+2022-10-27T05:36:23.6930423Z Resolving deltas: 60% (961/1601)
+2022-10-27T05:36:23.6936636Z Resolving deltas: 61% (977/1601)
+2022-10-27T05:36:23.6940948Z Resolving deltas: 62% (993/1601)
+2022-10-27T05:36:23.6945203Z Resolving deltas: 63% (1009/1601)
+2022-10-27T05:36:23.6950455Z Resolving deltas: 64% (1025/1601)
+2022-10-27T05:36:23.6955894Z Resolving deltas: 65% (1041/1601)
+2022-10-27T05:36:23.6963475Z Resolving deltas: 66% (1057/1601)
+2022-10-27T05:36:23.6971175Z Resolving deltas: 67% (1073/1601)
+2022-10-27T05:36:23.6976635Z Resolving deltas: 68% (1089/1601)
+2022-10-27T05:36:23.6981312Z Resolving deltas: 69% (1105/1601)
+2022-10-27T05:36:23.6985904Z Resolving deltas: 70% (1121/1601)
+2022-10-27T05:36:23.6992594Z Resolving deltas: 71% (1137/1601)
+2022-10-27T05:36:23.6998192Z Resolving deltas: 72% (1153/1601)
+2022-10-27T05:36:23.7007380Z Resolving deltas: 73% (1169/1601)
+2022-10-27T05:36:23.7011828Z Resolving deltas: 74% (1185/1601)
+2022-10-27T05:36:23.7017464Z Resolving deltas: 75% (1201/1601)
+2022-10-27T05:36:23.7022072Z Resolving deltas: 76% (1217/1601)
+2022-10-27T05:36:23.7028804Z Resolving deltas: 77% (1233/1601)
+2022-10-27T05:36:23.7036183Z Resolving deltas: 78% (1249/1601)
+2022-10-27T05:36:23.7045495Z Resolving deltas: 79% (1265/1601)
+2022-10-27T05:36:23.7053133Z Resolving deltas: 80% (1281/1601)
+2022-10-27T05:36:23.7060580Z Resolving deltas: 81% (1297/1601)
+2022-10-27T05:36:23.7068147Z Resolving deltas: 82% (1313/1601)
+2022-10-27T05:36:23.7076976Z Resolving deltas: 83% (1329/1601)
+2022-10-27T05:36:23.7086492Z Resolving deltas: 84% (1345/1601)
+2022-10-27T05:36:23.7095647Z Resolving deltas: 85% (1361/1601)
+2022-10-27T05:36:23.7105602Z Resolving deltas: 86% (1377/1601)
+2022-10-27T05:36:23.7115126Z Resolving deltas: 87% (1393/1601)
+2022-10-27T05:36:23.7126091Z Resolving deltas: 88% (1409/1601)
+2022-10-27T05:36:23.7140284Z Resolving deltas: 89% (1425/1601)
+2022-10-27T05:36:23.7152944Z Resolving deltas: 90% (1441/1601)
+2022-10-27T05:36:23.7166471Z Resolving deltas: 91% (1457/1601)
+2022-10-27T05:36:23.7182235Z Resolving deltas: 92% (1473/1601)
+2022-10-27T05:36:23.7193741Z Resolving deltas: 93% (1489/1601)
+2022-10-27T05:36:23.7200908Z Resolving deltas: 94% (1505/1601)
+2022-10-27T05:36:23.7206009Z Resolving deltas: 95% (1521/1601)
+2022-10-27T05:36:23.7217441Z Resolving deltas: 96% (1537/1601)
+2022-10-27T05:36:23.7227139Z Resolving deltas: 97% (1553/1601)
+2022-10-27T05:36:23.7232360Z Resolving deltas: 98% (1569/1601)
+2022-10-27T05:36:23.7237277Z Resolving deltas: 99% (1585/1601)
+2022-10-27T05:36:23.7260045Z Resolving deltas: 100% (1601/1601)
+2022-10-27T05:36:23.7260585Z Resolving deltas: 100% (1601/1601), done.
+2022-10-27T05:36:24.1836658Z From https://github.com/tgstation/tgstation
+2022-10-27T05:36:24.1841998Z * [new ref] deb5c38b8299183d179ee993b8c40179d42cff9b -> pull/70831/merge
+2022-10-27T05:36:24.1863576Z ##[endgroup]
+2022-10-27T05:36:24.1864401Z ##[group]Determining the checkout info
+2022-10-27T05:36:24.1865502Z ##[endgroup]
+2022-10-27T05:36:24.1866142Z ##[group]Checking out the ref
+2022-10-27T05:36:24.1881799Z [command]/usr/bin/git checkout --progress --force refs/remotes/pull/70831/merge
+2022-10-27T05:36:25.2712079Z Updating files: 63% (7341/11578)
+2022-10-27T05:36:25.2955103Z Updating files: 64% (7410/11578)
+2022-10-27T05:36:25.3182103Z Updating files: 65% (7526/11578)
+2022-10-27T05:36:25.3457683Z Updating files: 66% (7642/11578)
+2022-10-27T05:36:25.3634985Z Updating files: 67% (7758/11578)
+2022-10-27T05:36:25.3911682Z Updating files: 68% (7874/11578)
+2022-10-27T05:36:25.4140426Z Updating files: 69% (7989/11578)
+2022-10-27T05:36:25.4605828Z Updating files: 70% (8105/11578)
+2022-10-27T05:36:25.4694230Z Updating files: 71% (8221/11578)
+2022-10-27T05:36:25.4797031Z Updating files: 72% (8337/11578)
+2022-10-27T05:36:25.4884154Z Updating files: 73% (8452/11578)
+2022-10-27T05:36:25.4964143Z Updating files: 74% (8568/11578)
+2022-10-27T05:36:25.5012437Z Updating files: 75% (8684/11578)
+2022-10-27T05:36:25.5524946Z Updating files: 76% (8800/11578)
+2022-10-27T05:36:25.5631017Z Updating files: 77% (8916/11578)
+2022-10-27T05:36:25.5661878Z Updating files: 78% (9031/11578)
+2022-10-27T05:36:25.5900449Z Updating files: 79% (9147/11578)
+2022-10-27T05:36:25.5995293Z Updating files: 80% (9263/11578)
+2022-10-27T05:36:25.6065920Z Updating files: 81% (9379/11578)
+2022-10-27T05:36:25.6129511Z Updating files: 82% (9494/11578)
+2022-10-27T05:36:25.6183947Z Updating files: 83% (9610/11578)
+2022-10-27T05:36:25.6242865Z Updating files: 84% (9726/11578)
+2022-10-27T05:36:25.6304255Z Updating files: 85% (9842/11578)
+2022-10-27T05:36:25.6362317Z Updating files: 86% (9958/11578)
+2022-10-27T05:36:25.6419669Z Updating files: 87% (10073/11578)
+2022-10-27T05:36:25.6513754Z Updating files: 88% (10189/11578)
+2022-10-27T05:36:25.6719291Z Updating files: 89% (10305/11578)
+2022-10-27T05:36:25.6854029Z Updating files: 90% (10421/11578)
+2022-10-27T05:36:25.7114915Z Updating files: 91% (10536/11578)
+2022-10-27T05:36:25.7172492Z Updating files: 92% (10652/11578)
+2022-10-27T05:36:25.7239118Z Updating files: 93% (10768/11578)
+2022-10-27T05:36:25.7311506Z Updating files: 94% (10884/11578)
+2022-10-27T05:36:25.7377728Z Updating files: 95% (11000/11578)
+2022-10-27T05:36:25.7429645Z Updating files: 96% (11115/11578)
+2022-10-27T05:36:25.7489697Z Updating files: 97% (11231/11578)
+2022-10-27T05:36:25.7601389Z Updating files: 98% (11347/11578)
+2022-10-27T05:36:25.7673788Z Updating files: 99% (11463/11578)
+2022-10-27T05:36:25.7674090Z Updating files: 100% (11578/11578)
+2022-10-27T05:36:25.7675326Z Updating files: 100% (11578/11578), done.
+2022-10-27T05:36:25.7839712Z Note: switching to 'refs/remotes/pull/70831/merge'.
+2022-10-27T05:36:25.7840374Z
+2022-10-27T05:36:25.7841364Z You are in 'detached HEAD' state. You can look around, make experimental
+2022-10-27T05:36:25.7842184Z changes and commit them, and you can discard any commits you make in this
+2022-10-27T05:36:25.7842925Z state without impacting any branches by switching back to a branch.
+2022-10-27T05:36:25.7843345Z
+2022-10-27T05:36:25.7843670Z If you want to create a new branch to retain commits you create, you may
+2022-10-27T05:36:25.7844575Z do so (now or later) by using -c with the switch command. Example:
+2022-10-27T05:36:25.7844969Z
+2022-10-27T05:36:25.7845632Z git switch -c
+2022-10-27T05:36:25.7845974Z
+2022-10-27T05:36:25.7846184Z Or undo this operation with:
+2022-10-27T05:36:25.7846473Z
+2022-10-27T05:36:25.7846644Z git switch -
+2022-10-27T05:36:25.7846900Z
+2022-10-27T05:36:25.7847288Z Turn off this advice by setting config variable advice.detachedHead to false
+2022-10-27T05:36:25.7847742Z
+2022-10-27T05:36:25.7848217Z HEAD is now at deb5c38 Merge 9618404f9ee7f23400ea062d5dacb13fda53ca75 into 8bb8ca9d67375d0bd58ceacbc6346f9e92fef872
+2022-10-27T05:36:25.7902871Z ##[endgroup]
+2022-10-27T05:36:25.7967741Z [command]/usr/bin/git log -1 --format='%H'
+2022-10-27T05:36:25.8007456Z 'deb5c38b8299183d179ee993b8c40179d42cff9b'
+2022-10-27T05:36:25.8392860Z ##[group]Run actions/cache@v3
+2022-10-27T05:36:25.8393138Z with:
+2022-10-27T05:36:25.8393346Z path: ~/BYOND
+2022-10-27T05:36:25.8393591Z key: Linux-byond-
+2022-10-27T05:36:25.8393834Z ##[endgroup]
+2022-10-27T05:36:26.3683068Z Received 4090426 of 4090426 (100.0%), 27.9 MBs/sec
+2022-10-27T05:36:26.3684533Z Cache Size: ~4 MB (4090426 B)
+2022-10-27T05:36:26.3746779Z [command]/usr/bin/tar --use-compress-program unzstd -xf /home/runner/work/_temp/937f79f1-ebfc-47b7-917c-b2d972625200/cache.tzst -P -C /home/runner/work/tgstation/tgstation
+2022-10-27T05:36:26.4280190Z Cache restored successfully
+2022-10-27T05:36:26.4546771Z Cache restored from key: Linux-byond-
+2022-10-27T05:36:26.4726864Z ##[group]Run sudo systemctl start mysql
+2022-10-27T05:36:26.4727297Z [36;1msudo systemctl start mysql[0m
+2022-10-27T05:36:26.4727646Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci;'[0m
+2022-10-27T05:36:26.4728040Z [36;1mmysql -u root -proot tg_ci < SQL/tgstation_schema.sql[0m
+2022-10-27T05:36:26.4728458Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;'[0m
+2022-10-27T05:36:26.4728905Z [36;1mmysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql[0m
+2022-10-27T05:36:26.4792977Z shell: /usr/bin/bash -e {0}
+2022-10-27T05:36:26.4793288Z ##[endgroup]
+2022-10-27T05:36:27.7358559Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-10-27T05:36:27.7519454Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-10-27T05:36:28.2899746Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-10-27T05:36:28.2998385Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-10-27T05:36:28.8181912Z ##[group]Run sudo dpkg --add-architecture i386
+2022-10-27T05:36:28.8182331Z [36;1msudo dpkg --add-architecture i386[0m
+2022-10-27T05:36:28.8182655Z [36;1msudo apt update || true[0m
+2022-10-27T05:36:28.8183020Z [36;1msudo apt install -o APT::Immediate-Configure=false libssl1.1:i386[0m
+2022-10-27T05:36:28.8183412Z [36;1mbash tools/ci/install_rust_g.sh[0m
+2022-10-27T05:36:28.8240260Z shell: /usr/bin/bash -e {0}
+2022-10-27T05:36:28.8240552Z ##[endgroup]
+2022-10-27T05:36:28.9970393Z
+2022-10-27T05:36:28.9971552Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
+2022-10-27T05:36:28.9972082Z
+2022-10-27T05:36:29.1160704Z Hit:1 http://azure.archive.ubuntu.com/ubuntu focal InRelease
+2022-10-27T05:36:29.1162032Z Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
+2022-10-27T05:36:29.1173928Z Get:3 http://azure.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
+2022-10-27T05:36:29.1237735Z Get:4 http://azure.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
+2022-10-27T05:36:29.1254316Z Get:5 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease [10.5 kB]
+2022-10-27T05:36:29.3429595Z Hit:6 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal InRelease
+2022-10-27T05:36:29.3928104Z Get:7 http://azure.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2196 kB]
+2022-10-27T05:36:29.4661370Z Get:8 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 Packages [745 kB]
+2022-10-27T05:36:29.4777864Z Get:9 http://azure.archive.ubuntu.com/ubuntu focal-updates/main Translation-en [385 kB]
+2022-10-27T05:36:29.4885520Z Get:10 http://azure.archive.ubuntu.com/ubuntu focal-updates/main amd64 c-n-f Metadata [16.0 kB]
+2022-10-27T05:36:29.4922985Z Get:11 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1381 kB]
+2022-10-27T05:36:29.5179949Z Get:12 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted i386 Packages [26.6 kB]
+2022-10-27T05:36:29.5181037Z Get:13 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted Translation-en [196 kB]
+2022-10-27T05:36:29.5217775Z Get:14 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted amd64 c-n-f Metadata [600 B]
+2022-10-27T05:36:29.5261778Z Get:15 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe i386 Packages [697 kB]
+2022-10-27T05:36:29.5395090Z Get:16 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [972 kB]
+2022-10-27T05:36:29.6000339Z Get:17 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe Translation-en [221 kB]
+2022-10-27T05:36:29.6049853Z Get:18 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe amd64 c-n-f Metadata [21.8 kB]
+2022-10-27T05:36:29.6070146Z Get:19 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [29.9 kB]
+2022-10-27T05:36:29.6088570Z Get:20 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse i386 Packages [9820 B]
+2022-10-27T05:36:29.6106647Z Get:21 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse Translation-en [7940 B]
+2022-10-27T05:36:29.6123231Z Get:22 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 c-n-f Metadata [664 B]
+2022-10-27T05:36:29.6149675Z Get:23 http://azure.archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [45.7 kB]
+2022-10-27T05:36:29.6174434Z Get:24 http://azure.archive.ubuntu.com/ubuntu focal-backports/main i386 Packages [36.1 kB]
+2022-10-27T05:36:29.6192255Z Get:25 http://azure.archive.ubuntu.com/ubuntu focal-backports/main amd64 c-n-f Metadata [1420 B]
+2022-10-27T05:36:29.6212125Z Get:26 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe i386 Packages [13.5 kB]
+2022-10-27T05:36:29.6231501Z Get:27 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [23.9 kB]
+2022-10-27T05:36:29.6249547Z Get:28 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe amd64 c-n-f Metadata [860 B]
+2022-10-27T05:36:29.6279478Z Get:29 https://packages.microsoft.com/ubuntu/20.04/prod focal/main armhf Packages [28.4 kB]
+2022-10-27T05:36:29.6299516Z Get:30 https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages [200 kB]
+2022-10-27T05:36:29.6330517Z Get:31 https://packages.microsoft.com/ubuntu/20.04/prod focal/main arm64 Packages [40.0 kB]
+2022-10-27T05:36:29.7542573Z Get:32 http://azure.archive.ubuntu.com/ubuntu focal-security/main amd64 Packages [1821 kB]
+2022-10-27T05:36:29.7753589Z Get:33 http://azure.archive.ubuntu.com/ubuntu focal-security/main i386 Packages [514 kB]
+2022-10-27T05:36:29.8302849Z Get:34 http://azure.archive.ubuntu.com/ubuntu focal-security/main Translation-en [301 kB]
+2022-10-27T05:36:29.8323140Z Get:35 http://azure.archive.ubuntu.com/ubuntu focal-security/main amd64 c-n-f Metadata [11.2 kB]
+2022-10-27T05:36:29.8354364Z Get:36 http://azure.archive.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1289 kB]
+2022-10-27T05:36:29.8541844Z Get:37 http://azure.archive.ubuntu.com/ubuntu focal-security/restricted Translation-en [183 kB]
+2022-10-27T05:36:29.8606075Z Get:38 http://azure.archive.ubuntu.com/ubuntu focal-security/universe i386 Packages [566 kB]
+2022-10-27T05:36:29.8700343Z Get:39 http://azure.archive.ubuntu.com/ubuntu focal-security/universe amd64 Packages [743 kB]
+2022-10-27T05:36:29.8786533Z Get:40 http://azure.archive.ubuntu.com/ubuntu focal-security/universe Translation-en [137 kB]
+2022-10-27T05:36:29.8822497Z Get:41 http://azure.archive.ubuntu.com/ubuntu focal-security/universe amd64 c-n-f Metadata [15.3 kB]
+2022-10-27T05:36:30.0852283Z Get:42 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 Packages [15.2 kB]
+2022-10-27T05:36:40.2623192Z Fetched 13.2 MB in 3s (4825 kB/s)
+2022-10-27T05:36:41.6081931Z Reading package lists...
+2022-10-27T05:36:41.8619438Z Building dependency tree...
+2022-10-27T05:36:41.8635085Z Reading state information...
+2022-10-27T05:36:41.9709754Z 40 packages can be upgraded. Run 'apt list --upgradable' to see them.
+2022-10-27T05:36:41.9833939Z
+2022-10-27T05:36:41.9834743Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
+2022-10-27T05:36:41.9835161Z
+2022-10-27T05:36:42.0520184Z Reading package lists...
+2022-10-27T05:36:42.3196647Z Building dependency tree...
+2022-10-27T05:36:42.3215128Z Reading state information...
+2022-10-27T05:36:42.5269417Z The following additional packages will be installed:
+2022-10-27T05:36:42.5270751Z gcc-11-base:i386 libc6:i386 libcrypt1:i386 libgcc-s1 libgcc-s1:i386
+2022-10-27T05:36:42.5273717Z libidn2-0:i386 libunistring2:i386
+2022-10-27T05:36:42.5281075Z Suggested packages:
+2022-10-27T05:36:42.5281649Z glibc-doc:i386 locales:i386
+2022-10-27T05:36:42.6054870Z The following NEW packages will be installed:
+2022-10-27T05:36:42.6060238Z gcc-11-base:i386 libc6:i386 libcrypt1:i386 libgcc-s1:i386 libidn2-0:i386
+2022-10-27T05:36:42.6065188Z libssl1.1:i386 libunistring2:i386
+2022-10-27T05:36:42.6071434Z The following packages will be upgraded:
+2022-10-27T05:36:42.6077741Z libgcc-s1
+2022-10-27T05:36:42.6524605Z 1 upgraded, 7 newly installed, 0 to remove and 39 not upgraded.
+2022-10-27T05:36:42.7316437Z Need to get 4528 kB of archives.
+2022-10-27T05:36:42.7317772Z After this operation, 19.3 MB of additional disk space will be used.
+2022-10-27T05:36:42.7318985Z Get:1 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libcrypt1 i386 1:4.4.10-10ubuntu4 [90.9 kB]
+2022-10-27T05:36:42.7516533Z Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 libc6 i386 2.31-0ubuntu9.9 [2580 kB]
+2022-10-27T05:36:42.8180039Z Get:3 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libunistring2 i386 0.9.10-2 [377 kB]
+2022-10-27T05:36:42.8382506Z Get:4 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libidn2-0 i386 2.2.0-2 [51.4 kB]
+2022-10-27T05:36:42.8544550Z Get:5 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 libssl1.1 i386 1.1.1f-1ubuntu2.16 [1318 kB]
+2022-10-27T05:36:42.8714868Z Get:6 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 gcc-11-base i386 11.1.0-1ubuntu1~20.04 [19.0 kB]
+2022-10-27T05:36:43.1118432Z Get:7 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main amd64 libgcc-s1 amd64 11.1.0-1ubuntu1~20.04 [42.1 kB]
+2022-10-27T05:36:43.3528563Z Get:8 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 libgcc-s1 i386 11.1.0-1ubuntu1~20.04 [50.0 kB]
+2022-10-27T05:36:43.9483382Z Preconfiguring packages ...
+2022-10-27T05:36:44.0566590Z Fetched 4528 kB in 1s (5511 kB/s)
+2022-10-27T05:36:44.0950557Z Selecting previously unselected package gcc-11-base:i386.
+2022-10-27T05:36:44.1257600Z (Reading database ...
+2022-10-27T05:36:44.1257941Z (Reading database ... 5%
+2022-10-27T05:36:44.1258207Z (Reading database ... 10%
+2022-10-27T05:36:44.1258475Z (Reading database ... 15%
+2022-10-27T05:36:44.1260572Z (Reading database ... 20%
+2022-10-27T05:36:44.1261165Z (Reading database ... 25%
+2022-10-27T05:36:44.1261680Z (Reading database ... 30%
+2022-10-27T05:36:44.1261936Z (Reading database ... 35%
+2022-10-27T05:36:44.1262196Z (Reading database ... 40%
+2022-10-27T05:36:44.1262482Z (Reading database ... 45%
+2022-10-27T05:36:44.1267425Z (Reading database ... 50%
+2022-10-27T05:36:44.1661119Z (Reading database ... 55%
+2022-10-27T05:36:44.2102408Z (Reading database ... 60%
+2022-10-27T05:36:44.2442960Z (Reading database ... 65%
+2022-10-27T05:36:44.3240866Z (Reading database ... 70%
+2022-10-27T05:36:44.4296824Z (Reading database ... 75%
+2022-10-27T05:36:44.5004841Z (Reading database ... 80%
+2022-10-27T05:36:44.5658810Z (Reading database ... 85%
+2022-10-27T05:36:44.6401590Z (Reading database ... 90%
+2022-10-27T05:36:44.7577336Z (Reading database ... 95%
+2022-10-27T05:36:44.7577685Z (Reading database ... 100%
+2022-10-27T05:36:44.7578335Z (Reading database ... 242030 files and directories currently installed.)
+2022-10-27T05:36:44.7691053Z Preparing to unpack .../0-gcc-11-base_11.1.0-1ubuntu1~20.04_i386.deb ...
+2022-10-27T05:36:44.7764075Z Unpacking gcc-11-base:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-10-27T05:36:44.8625179Z Preparing to unpack .../1-libgcc-s1_11.1.0-1ubuntu1~20.04_amd64.deb ...
+2022-10-27T05:36:44.8693479Z Unpacking libgcc-s1:amd64 (11.1.0-1ubuntu1~20.04) over (10.3.0-1ubuntu1~20.04) ...
+2022-10-27T05:36:44.9142991Z Selecting previously unselected package libgcc-s1:i386.
+2022-10-27T05:36:44.9390148Z Preparing to unpack .../2-libgcc-s1_11.1.0-1ubuntu1~20.04_i386.deb ...
+2022-10-27T05:36:44.9401962Z Unpacking libgcc-s1:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-10-27T05:36:44.9820851Z Selecting previously unselected package libcrypt1:i386.
+2022-10-27T05:36:45.0046331Z Preparing to unpack .../3-libcrypt1_1%3a4.4.10-10ubuntu4_i386.deb ...
+2022-10-27T05:36:45.0084974Z Unpacking libcrypt1:i386 (1:4.4.10-10ubuntu4) ...
+2022-10-27T05:36:45.0740528Z Selecting previously unselected package libc6:i386.
+2022-10-27T05:36:45.1001786Z Preparing to unpack .../4-libc6_2.31-0ubuntu9.9_i386.deb ...
+2022-10-27T05:36:45.2548577Z Unpacking libc6:i386 (2.31-0ubuntu9.9) ...
+2022-10-27T05:36:45.5789406Z Replacing files in old package libc6-i386 (2.31-0ubuntu9.9) ...
+2022-10-27T05:36:45.6171109Z Selecting previously unselected package libunistring2:i386.
+2022-10-27T05:36:45.6439642Z Preparing to unpack .../5-libunistring2_0.9.10-2_i386.deb ...
+2022-10-27T05:36:45.6457939Z Unpacking libunistring2:i386 (0.9.10-2) ...
+2022-10-27T05:36:45.7367630Z Selecting previously unselected package libidn2-0:i386.
+2022-10-27T05:36:45.7631354Z Preparing to unpack .../6-libidn2-0_2.2.0-2_i386.deb ...
+2022-10-27T05:36:45.7646777Z Unpacking libidn2-0:i386 (2.2.0-2) ...
+2022-10-27T05:36:45.8312915Z Selecting previously unselected package libssl1.1:i386.
+2022-10-27T05:36:45.8579345Z Preparing to unpack .../7-libssl1.1_1.1.1f-1ubuntu2.16_i386.deb ...
+2022-10-27T05:36:45.8593568Z Unpacking libssl1.1:i386 (1.1.1f-1ubuntu2.16) ...
+2022-10-27T05:36:46.0508711Z Setting up gcc-11-base:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-10-27T05:36:46.0569280Z Setting up libgcc-s1:amd64 (11.1.0-1ubuntu1~20.04) ...
+2022-10-27T05:36:46.0623686Z Setting up libgcc-s1:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-10-27T05:36:46.0684045Z Setting up libcrypt1:i386 (1:4.4.10-10ubuntu4) ...
+2022-10-27T05:36:46.0722619Z Setting up libc6:i386 (2.31-0ubuntu9.9) ...
+2022-10-27T05:36:46.3144297Z Setting up libssl1.1:i386 (1.1.1f-1ubuntu2.16) ...
+2022-10-27T05:36:46.4510680Z Setting up libunistring2:i386 (0.9.10-2) ...
+2022-10-27T05:36:46.4557850Z Setting up libidn2-0:i386 (2.2.0-2) ...
+2022-10-27T05:36:46.4635629Z Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
+2022-10-27T05:36:49.2567467Z 2022-10-27 05:36:49 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/127494547/e00cfb90-5ecf-4a55-a41c-c1e4899def3b?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221027%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221027T053639Z&X-Amz-Expires=300&X-Amz-Signature=ad13811b53df08aab94680ba4bde27d347cafd7f9230584b43dd2d8d4a61a8be&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=127494547&response-content-disposition=attachment%3B%20filename%3Dlibrust_g.so&response-content-type=application%2Foctet-stream [10822488/10822488] -> "/home/runner/.byond/bin/librust_g.so" [1]
+2022-10-27T05:36:49.2675883Z linux-gate.so.1 (0xf7ef1000)
+2022-10-27T05:36:49.2679615Z libssl.so.1.1 => /lib/i386-linux-gnu/libssl.so.1.1 (0xf7735000)
+2022-10-27T05:36:49.2681965Z libcrypto.so.1.1 => /lib/i386-linux-gnu/libcrypto.so.1.1 (0xf747d000)
+2022-10-27T05:36:49.2682327Z libz.so.1 => /lib32/libz.so.1 (0xf745f000)
+2022-10-27T05:36:49.2682794Z libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7440000)
+2022-10-27T05:36:49.2683314Z libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf741d000)
+2022-10-27T05:36:49.2683950Z libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7318000)
+2022-10-27T05:36:49.2684513Z libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7312000)
+2022-10-27T05:36:49.2685065Z libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7123000)
+2022-10-27T05:36:49.2685549Z /lib/ld-linux.so.2 (0xf7ef3000)
+2022-10-27T05:36:49.2720426Z ##[group]Run bash tools/ci/install_auxlua.sh
+2022-10-27T05:36:49.2720821Z [36;1mbash tools/ci/install_auxlua.sh[0m
+2022-10-27T05:36:49.2778014Z shell: /usr/bin/bash -e {0}
+2022-10-27T05:36:49.2778299Z ##[endgroup]
+2022-10-27T05:36:49.3631078Z 2022-10-27 05:36:49 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/473295481/bb55dc2f-8248-4032-ad66-b80cb61a84f3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221027%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221027T053639Z&X-Amz-Expires=300&X-Amz-Signature=04365004cef88fe3f1f8b45d89cffc1436482991f928c534963ff890dbc7d62d&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=473295481&response-content-disposition=attachment%3B%20filename%3Dlibauxlua.so&response-content-type=application%2Foctet-stream [5781068/5781068] -> "/home/runner/.byond/bin/libauxlua.so" [1]
+2022-10-27T05:36:49.3764506Z linux-gate.so.1 (0xf7f4d000)
+2022-10-27T05:36:49.3765376Z libstdc++.so.6 => /lib32/libstdc++.so.6 (0xf7b46000)
+2022-10-27T05:36:49.3769032Z libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7b27000)
+2022-10-27T05:36:49.3769816Z libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7b04000)
+2022-10-27T05:36:49.3772336Z libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf79ff000)
+2022-10-27T05:36:49.3773288Z libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf79f9000)
+2022-10-27T05:36:49.3773950Z libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf780a000)
+2022-10-27T05:36:49.3774971Z /lib/ld-linux.so.2 (0xf7f4f000)
+2022-10-27T05:36:49.3802076Z ##[group]Run bash tools/ci/install_byond.sh
+2022-10-27T05:36:49.3802456Z [36;1mbash tools/ci/install_byond.sh[0m
+2022-10-27T05:36:49.3802798Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2022-10-27T05:36:49.3803186Z [36;1mtools/build/build --ci dm -DCIBUILDING -DANSICOLORS[0m
+2022-10-27T05:36:49.3873455Z shell: /usr/bin/bash -e {0}
+2022-10-27T05:36:49.3873887Z ##[endgroup]
+2022-10-27T05:36:49.4001691Z Setting up BYOND.
+2022-10-27T05:36:49.4159362Z % Total % Received % Xferd Average Speed Time Time Time Current
+2022-10-27T05:36:49.4160632Z Dload Upload Total Spent Left Speed
+2022-10-27T05:36:49.4160890Z
+2022-10-27T05:36:49.5018021Z 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
+2022-10-27T05:36:49.5019163Z 100 4021k 100 4021k 0 0 46.1M 0 --:--:-- --:--:-- --:--:-- 46.1M
+2022-10-27T05:36:49.5066653Z Archive: byond.zip
+2022-10-27T05:36:49.5067255Z creating: byond/
+2022-10-27T05:36:49.5068302Z creating: byond/key/
+2022-10-27T05:36:49.5068798Z creating: byond/web/
+2022-10-27T05:36:49.5070185Z inflating: byond/web/child.dms
+2022-10-27T05:36:49.5071730Z inflating: byond/web/button.dms
+2022-10-27T05:36:49.5073932Z inflating: byond/web/input.dms
+2022-10-27T05:36:49.5074416Z inflating: byond/web/text.dms
+2022-10-27T05:36:49.5198750Z inflating: byond/web/webclient.dart.js
+2022-10-27T05:36:49.5199410Z inflating: byond/web/verbmenu.dms
+2022-10-27T05:36:49.5200216Z inflating: byond/web/defaultSkin.dms
+2022-10-27T05:36:49.5201953Z inflating: byond/web/hotbar.dms
+2022-10-27T05:36:49.5203581Z inflating: byond/web/label.dms
+2022-10-27T05:36:49.5204889Z inflating: byond/web/alert.dms
+2022-10-27T05:36:49.5206329Z inflating: byond/web/message.dms
+2022-10-27T05:36:49.5207259Z inflating: byond/web/drag.png
+2022-10-27T05:36:49.5208742Z inflating: byond/web/map.dms
+2022-10-27T05:36:49.5210398Z inflating: byond/web/splashlogo.png
+2022-10-27T05:36:49.5210926Z inflating: byond/web/drop.png
+2022-10-27T05:36:49.5332544Z inflating: byond/web/ext.js
+2022-10-27T05:36:49.5333175Z inflating: byond/web/file.dms
+2022-10-27T05:36:49.5334369Z inflating: byond/web/grid.dms
+2022-10-27T05:36:49.5336323Z inflating: byond/web/bar.dms
+2022-10-27T05:36:49.5339986Z inflating: byond/web/dpad.dms
+2022-10-27T05:36:49.5341094Z inflating: byond/web/output.dms
+2022-10-27T05:36:49.5343046Z inflating: byond/web/tab.dms
+2022-10-27T05:36:49.5345100Z inflating: byond/web/info.dms
+2022-10-27T05:36:49.5346744Z inflating: byond/web/color.dms
+2022-10-27T05:36:49.5347953Z inflating: byond/web/gamepad.dms
+2022-10-27T05:36:49.5349805Z inflating: byond/web/browser.dms
+2022-10-27T05:36:49.5350264Z inflating: byond/web/status.dms
+2022-10-27T05:36:49.5351241Z inflating: byond/web/any.dms
+2022-10-27T05:36:49.5352302Z inflating: byond/web/pane.dms
+2022-10-27T05:36:49.5354423Z inflating: byond/web/pop.dms
+2022-10-27T05:36:49.5355613Z inflating: byond/license.txt
+2022-10-27T05:36:49.5357084Z inflating: byond/legal.txt
+2022-10-27T05:36:49.5358519Z inflating: byond/Makefile
+2022-10-27T05:36:49.5358970Z creating: byond/man/
+2022-10-27T05:36:49.5359627Z creating: byond/man/man6/
+2022-10-27T05:36:49.5361148Z inflating: byond/man/man6/DreamDaemon.6
+2022-10-27T05:36:49.5361949Z inflating: byond/man/man6/DreamMaker.6
+2022-10-27T05:36:49.5362715Z creating: byond/lib/
+2022-10-27T05:36:49.5362992Z creating: byond/host/
+2022-10-27T05:36:49.5365318Z inflating: byond/host/readme.html
+2022-10-27T05:36:49.5366506Z inflating: byond/host/readme-unix.txt
+2022-10-27T05:36:49.5366902Z creating: byond/host/home/
+2022-10-27T05:36:49.5367533Z creating: byond/host/home/root/
+2022-10-27T05:36:49.5367822Z creating: byond/host/home/root/byond/
+2022-10-27T05:36:49.5368496Z creating: byond/host/home/root/byond/tools/
+2022-10-27T05:36:49.5369225Z creating: byond/host/home/root/byond/tools/root/
+2022-10-27T05:36:49.5374569Z inflating: byond/host/home/root/byond/tools/root/root.dmb
+2022-10-27T05:36:49.5375251Z creating: byond/host/shared/
+2022-10-27T05:36:49.5375559Z creating: byond/host/shared/byond/
+2022-10-27T05:36:49.5376268Z creating: byond/host/shared/byond/tools/
+2022-10-27T05:36:49.5376595Z creating: byond/host/shared/byond/tools/ftp/
+2022-10-27T05:36:49.5379616Z inflating: byond/host/shared/byond/tools/ftp/ftp.dmb
+2022-10-27T05:36:49.5380174Z creating: byond/host/shared/byond/tools/admin/
+2022-10-27T05:36:49.5386313Z inflating: byond/host/shared/byond/tools/admin/admin.dmb
+2022-10-27T05:36:49.5386945Z creating: byond/host/shared-web/
+2022-10-27T05:36:49.5387681Z creating: byond/host/shared-web/web/
+2022-10-27T05:36:49.5388584Z creating: byond/host/shared-web/web/tools/
+2022-10-27T05:36:49.5389008Z creating: byond/host/shared-web/web/tools/admin/
+2022-10-27T05:36:49.5394728Z inflating: byond/host/shared-web/web/tools/admin/index.dmb
+2022-10-27T05:36:49.5403477Z inflating: byond/host/host.dmb
+2022-10-27T05:36:49.5403779Z inflating: byond/host/host.start
+2022-10-27T05:36:49.5405103Z inflating: byond/host/hostconf.orig
+2022-10-27T05:36:49.5406328Z inflating: byond/host/hostconf.txt
+2022-10-27T05:36:49.5407507Z inflating: byond/readme.txt
+2022-10-27T05:36:49.5407795Z creating: byond/bin/
+2022-10-27T05:36:49.5408558Z inflating: byond/bin/byondexec
+2022-10-27T05:36:49.5411293Z inflating: byond/bin/DreamDownload
+2022-10-27T05:36:49.6175092Z inflating: byond/bin/libbyond.so
+2022-10-27T05:36:49.6348503Z inflating: byond/bin/libext.so
+2022-10-27T05:36:49.6351968Z inflating: byond/bin/DreamDaemon
+2022-10-27T05:36:49.6355363Z inflating: byond/bin/DreamMaker
+2022-10-27T05:36:49.6355666Z creating: byond/cfg/
+2022-10-27T05:36:49.6356545Z inflating: byond/cfg/release.txt
+2022-10-27T05:36:49.6621069Z ***************************
+2022-10-27T05:36:49.6621919Z Now run the following command:
+2022-10-27T05:36:49.6629708Z
+2022-10-27T05:36:49.6640241Z source /home/runner/BYOND/byond/bin/byondsetup
+2022-10-27T05:36:49.6652476Z
+2022-10-27T05:36:49.6657262Z If it generates errors, your shell is not compatible with 'sh', so you will
+2022-10-27T05:36:49.6663166Z have to edit byondsetup and make it work with your shell. If the script works, you should be able to run DreamDaemon.
+2022-10-27T05:36:49.6673259Z
+2022-10-27T05:36:49.6679431Z IMPORTANT: once you have the script working, you must add the above line
+2022-10-27T05:36:49.6685348Z to your startup script. The name of your startup script depends on the
+2022-10-27T05:36:49.6691552Z shell you use. Typical ones are .profile or .bash_profile.
+2022-10-27T05:36:49.6701933Z
+2022-10-27T05:36:49.6708492Z Once everything is working, you can find out more about the software
+2022-10-27T05:36:49.6714992Z by doing 'man DreamDaemon'. A host server has also been included
+2022-10-27T05:36:49.6720470Z so edit host/hostconf.txt and boot up your world server!
+2022-10-27T05:36:49.6726217Z ***************************
+2022-10-27T05:36:49.7622481Z Using system-wide Node v16.18.0
+2022-10-27T05:36:49.9527326Z :: Juke Build version 0.8.1
+2022-10-27T05:36:50.2530342Z => Starting 'dm'
+2022-10-27T05:36:50.2555016Z :: Using defines: CBT, CIBUILDING, ANSICOLORS
+2022-10-27T05:36:50.3319179Z DM compiler version 514.1588
+2022-10-27T05:36:50.3319810Z loading tgstation.m.dme
+2022-10-27T05:36:59.9636752Z loading interface/skin.dmf
+2022-10-27T05:37:57.7759644Z loading map_files/generic/CentCom.dmm
+2022-10-27T05:37:58.7594328Z saving tgstation.m.dmb (DEBUG mode)
+2022-10-27T05:37:59.9601921Z tgstation.m.dmb - 0 errors, 0 warnings (10/27/22 5:37 am)
+2022-10-27T05:37:59.9602721Z Total time: 1:09
+2022-10-27T05:38:00.9791168Z => Finished 'dm' in 70.727s
+2022-10-27T05:38:00.9795780Z => Done in 71.025s
+2022-10-27T05:38:00.9907775Z ##[group]Run source $HOME/BYOND/byond/bin/byondsetup
+2022-10-27T05:38:00.9908333Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2022-10-27T05:38:00.9908714Z [36;1mbash tools/ci/run_server.sh metastation[0m
+2022-10-27T05:38:00.9968243Z shell: /usr/bin/bash -e {0}
+2022-10-27T05:38:00.9968682Z ##[endgroup]
+2022-10-27T05:38:01.0105430Z Testing metastation
+2022-10-27T05:38:01.2543112Z cp: cannot stat 'tgui/packages/tgfont/dist/*': No such file or directory
+2022-10-27T05:38:01.2724951Z Thu Oct 27 05:38:01 2022
+2022-10-27T05:38:01.2725544Z World opened on network port 42427.
+2022-10-27T05:38:01.2726492Z Welcome BYOND! (5.0 Public Version 514.1588)
+2022-10-27T05:38:23.7107759Z 864 global variables
+2022-10-27T05:38:24.4933392Z World loaded at 05:38:24!
+2022-10-27T05:38:24.5429202Z Running /tg/ revision:
+2022-10-27T05:38:24.5429682Z No commit information
+2022-10-27T05:38:24.5512784Z Loading config file config.txt...
+2022-10-27T05:38:24.5516700Z Loading config file maps.txt...
+2022-10-27T05:38:24.5547604Z Unable to locate admins backup file.
+2022-10-27T05:38:25.5745156Z Initialized Title Screen subsystem within 0.01 seconds!
+2022-10-27T05:38:25.5745917Z Initialized Server Tasks subsystem within 0 seconds!
+2022-10-27T05:38:25.5746607Z Initialized Input subsystem within 0 seconds!
+2022-10-27T05:38:25.5814387Z Initialized Profiler subsystem within 0 seconds!
+2022-10-27T05:38:25.5814809Z Initialized Database subsystem within 0 seconds!
+2022-10-27T05:38:25.5816091Z Initialized Blackbox subsystem within 0 seconds!
+2022-10-27T05:38:25.5819066Z Initialized Sounds subsystem within 0 seconds!
+2022-10-27T05:38:25.6001394Z Initialized Instruments subsystem within 0.02 seconds!
+2022-10-27T05:38:25.9816971Z Initialized Greyscale subsystem within 0.38 seconds!
+2022-10-27T05:38:25.9817528Z Initialized Vis contents overlays subsystem within 0 seconds!
+2022-10-27T05:38:25.9818032Z Initialized Security Level subsystem within 0 seconds!
+2022-10-27T05:38:25.9848043Z Initialized Station subsystem within 0 seconds!
+2022-10-27T05:38:25.9865647Z Initialized Quirks subsystem within 0 seconds!
+2022-10-27T05:38:26.0034062Z Initialized Reagents subsystem within 0.02 seconds!
+2022-10-27T05:38:26.0038506Z Initialized Events subsystem within 0 seconds!
+2022-10-27T05:38:26.0098384Z Initialized IDs and Access subsystem within 0.01 seconds!
+2022-10-27T05:38:26.0098867Z Initialized Jobs subsystem within 0 seconds!
+2022-10-27T05:38:26.0099897Z Initialized AI movement subsystem within 0 seconds!
+2022-10-27T05:38:26.0126533Z Initialized Ticker subsystem within 0 seconds!
+2022-10-27T05:38:26.0128286Z Initialized AI Controller Ticker subsystem within 0 seconds!
+2022-10-27T05:38:26.0134279Z Initialized AI Behavior Ticker subsystem within 0 seconds!
+2022-10-27T05:38:26.0287435Z Initialized Trading Card Game subsystem within 0.02 seconds!
+2022-10-27T05:38:26.0290443Z Loading MetaStation...
+2022-10-27T05:38:27.6774174Z Loaded Station in 1.6s!
+2022-10-27T05:38:28.4727719Z Loaded Lavaland in 0.7s!
+2022-10-27T05:38:29.4722711Z Ruin loader finished with 0 left to spend.
+2022-10-27T05:38:29.5285012Z Ruin loader finished with 0 left to spend.
+2022-10-27T05:38:29.9352644Z Cave Generator finished in 0.4s!
+2022-10-27T05:38:29.9775541Z Cave Generator finished in 0s!
+2022-10-27T05:38:31.0315436Z Initialized Mapping subsystem within 5 seconds!
+2022-10-27T05:38:55.0060672Z The BYOND hub reports that port 42427 is not reachable.
+2022-10-27T05:38:57.9364779Z Initialized Early Assets subsystem within 26.9 seconds!
+2022-10-27T05:38:57.9769589Z Initialized Research subsystem within 0.04 seconds!
+2022-10-27T05:38:57.9771028Z Initialized Time Tracking subsystem within 0 seconds!
+2022-10-27T05:38:58.0098137Z Initialized Networks subsystem within 0.03 seconds!
+2022-10-27T05:38:58.0343859Z Initialized Spatial Grid subsystem within 0.02 seconds!
+2022-10-27T05:38:58.0348414Z Initialized Economy subsystem within 0 seconds!
+2022-10-27T05:38:58.0355826Z Initialized Restaurant subsystem within 0 seconds!
+2022-10-27T05:39:34.2891379Z ## NOTICE: morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!
+2022-10-27T05:39:36.5387306Z Initialized Atoms subsystem within 38.5 seconds!
+2022-10-27T05:39:36.5532145Z Initialized Language subsystem within 0.01 seconds!
+2022-10-27T05:39:36.6439410Z Initialized Machines subsystem within 0.09 seconds!
+2022-10-27T05:39:36.6445388Z Initialized Skills subsystem within 0 seconds!
+2022-10-27T05:39:36.6446275Z Initialized Addiction subsystem within 0 seconds!
+2022-10-27T05:39:36.6458190Z Initialized Blackmarket subsystem within 0 seconds!
+2022-10-27T05:39:36.6461637Z Initialized Disease subsystem within 0 seconds!
+2022-10-27T05:39:36.6462460Z Initialized Fluid subsystem within 0 seconds!
+2022-10-27T05:39:36.6463706Z Initialized Smoke subsystem within 0 seconds!
+2022-10-27T05:39:36.6464484Z Initialized Foam subsystem within 0 seconds!
+2022-10-27T05:39:36.6465284Z Initialized Lag Switch subsystem within 0 seconds!
+2022-10-27T05:39:36.6685670Z Initialized Library Loading subsystem within 0.02 seconds!
+2022-10-27T05:39:37.0988919Z Initialized Lua Scripting subsystem within 0.43 seconds!
+2022-10-27T05:39:37.0994800Z Initialized Night Shift subsystem within 0 seconds!
+2022-10-27T05:39:37.0996305Z Initialized Sun subsystem within 0 seconds!
+2022-10-27T05:39:37.1013421Z Initialized Traitor subsystem within 0 seconds!
+2022-10-27T05:39:37.1246657Z Initialized Wardrobe subsystem within 0.02 seconds!
+2022-10-27T05:39:37.1247676Z Initialized Weather subsystem within 0 seconds!
+2022-10-27T05:39:37.1248899Z Initialized Wiremod Composite Templates subsystem within 0 seconds!
+2022-10-27T05:39:42.0567267Z Initialized Atmospherics subsystem within 4.93 seconds!
+2022-10-27T05:39:42.0584101Z Initialized Persistence subsystem within 0 seconds!
+2022-10-27T05:39:42.0589723Z Initialized Persistent Paintings subsystem within 0 seconds!
+2022-10-27T05:39:42.0594808Z Initialized Vote subsystem within 0 seconds!
+2022-10-27T05:39:47.1134557Z Initialized Assets subsystem within 5.05 seconds!
+2022-10-27T05:39:49.3480025Z Initialized Icon Smoothing subsystem within 2.23 seconds!
+2022-10-27T05:39:49.3521346Z Initialized XKeyScore subsystem within 0 seconds!
+2022-10-27T05:39:49.3626428Z Initialized PRISM subsystem within 0.01 seconds!
+2022-10-27T05:39:55.3669508Z Initialized Lighting subsystem within 6 seconds!
+2022-10-27T05:39:58.4861231Z Initialized Shuttle subsystem within 3.12 seconds!
+2022-10-27T05:39:58.4910808Z Initialized Pathfinder subsystem within 0 seconds!
+2022-10-27T05:39:58.4911217Z Initialized Ban Cache subsystem within 0 seconds!
+2022-10-27T05:39:58.4911595Z Initialized Init Profiler subsystem within 0 seconds!
+2022-10-27T05:39:58.4911947Z Initialized Chat subsystem within 0 seconds!
+2022-10-27T05:39:58.4912316Z Initializations complete within 92.9 seconds!
+2022-10-27T05:39:58.4984843Z Game start took 0s
+2022-10-27T05:40:09.8744558Z ##[group]/datum/unit_test/log_mapping
+2022-10-27T05:40:09.8745146Z
+2022-10-27T05:40:09.8836529Z [1;32mPASS[0m /datum/unit_test/log_mapping 0s
+2022-10-27T05:40:09.8837396Z ##[endgroup]
+2022-10-27T05:40:09.9419200Z ##[group]/datum/unit_test/ablative_hood_hud
+2022-10-27T05:40:09.9756122Z
+2022-10-27T05:40:09.9757240Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud 0s
+2022-10-27T05:40:09.9767210Z ##[endgroup]
+2022-10-27T05:40:09.9978386Z ##[group]/datum/unit_test/ablative_hood_hud_with_helmet
+2022-10-27T05:40:10.0279756Z
+2022-10-27T05:40:10.0281576Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud_with_helmet 0.1s
+2022-10-27T05:40:10.0283498Z ##[endgroup]
+2022-10-27T05:40:10.0512431Z ##[group]/datum/unit_test/achievements
+2022-10-27T05:40:10.0640195Z
+2022-10-27T05:40:10.0641287Z [1;32mPASS[0m /datum/unit_test/achievements 0s
+2022-10-27T05:40:10.0642374Z ##[endgroup]
+2022-10-27T05:40:10.1012868Z ##[group]/datum/unit_test/anchored_mobs
+2022-10-27T05:40:10.1014527Z
+2022-10-27T05:40:10.1015639Z [1;32mPASS[0m /datum/unit_test/anchored_mobs 0s
+2022-10-27T05:40:10.1016975Z ##[endgroup]
+2022-10-27T05:40:10.1197243Z ##[group]/datum/unit_test/anonymous_themes
+2022-10-27T05:40:10.2699684Z
+2022-10-27T05:40:10.2701913Z [1;32mPASS[0m /datum/unit_test/anonymous_themes 0.1s
+2022-10-27T05:40:10.2703812Z ##[endgroup]
+2022-10-27T05:40:10.5198272Z ##[group]/datum/unit_test/autowiki
+2022-10-27T05:40:11.9708692Z
+2022-10-27T05:40:11.9710297Z [1;32mPASS[0m /datum/unit_test/autowiki 1.4s
+2022-10-27T05:40:11.9712149Z ##[endgroup]
+2022-10-27T05:40:13.4185291Z ##[group]/datum/unit_test/autowiki_include_template
+2022-10-27T05:40:13.4186047Z
+2022-10-27T05:40:13.4187111Z [1;32mPASS[0m /datum/unit_test/autowiki_include_template 0s
+2022-10-27T05:40:13.4188008Z ##[endgroup]
+2022-10-27T05:40:13.4380400Z ##[group]/datum/unit_test/barsigns_icon
+2022-10-27T05:40:13.4634689Z
+2022-10-27T05:40:13.4639775Z [1;32mPASS[0m /datum/unit_test/barsigns_icon 0s
+2022-10-27T05:40:13.4640487Z ##[endgroup]
+2022-10-27T05:40:13.4808870Z ##[group]/datum/unit_test/barsigns_name
+2022-10-27T05:40:13.4809440Z
+2022-10-27T05:40:13.4810053Z [1;32mPASS[0m /datum/unit_test/barsigns_name 0s
+2022-10-27T05:40:13.4814000Z ##[endgroup]
+2022-10-27T05:40:13.4979736Z ##[group]/datum/unit_test/bespoke_id
+2022-10-27T05:40:13.4980383Z
+2022-10-27T05:40:13.4980997Z [1;32mPASS[0m /datum/unit_test/bespoke_id 0s
+2022-10-27T05:40:13.5028459Z ##[endgroup]
+2022-10-27T05:40:13.8488485Z ##[group]/datum/unit_test/binary_insert
+2022-10-27T05:40:13.8488743Z
+2022-10-27T05:40:13.8489222Z [1;32mPASS[0m /datum/unit_test/binary_insert 0s
+2022-10-27T05:40:13.8489803Z ##[endgroup]
+2022-10-27T05:40:13.8653347Z ##[group]/datum/unit_test/bloody_footprints
+2022-10-27T05:40:13.9003909Z
+2022-10-27T05:40:13.9004930Z [1;32mPASS[0m /datum/unit_test/bloody_footprints 0s
+2022-10-27T05:40:13.9006088Z ##[endgroup]
+2022-10-27T05:40:13.9232999Z ##[group]/datum/unit_test/breath_sanity
+2022-10-27T05:40:13.9712567Z
+2022-10-27T05:40:13.9713383Z [1;32mPASS[0m /datum/unit_test/breath_sanity 0s
+2022-10-27T05:40:13.9714142Z ##[endgroup]
+2022-10-27T05:40:14.2982711Z ##[group]/datum/unit_test/breath_sanity_plasmamen
+2022-10-27T05:40:14.3520354Z
+2022-10-27T05:40:14.3521354Z [1;32mPASS[0m /datum/unit_test/breath_sanity_plasmamen 0.1s
+2022-10-27T05:40:14.3522294Z ##[endgroup]
+2022-10-27T05:40:14.3742846Z ##[group]/datum/unit_test/breath_sanity_ashwalker
+2022-10-27T05:40:14.4444122Z
+2022-10-27T05:40:14.4444950Z [1;32mPASS[0m /datum/unit_test/breath_sanity_ashwalker 0.1s
+2022-10-27T05:40:14.4445682Z ##[endgroup]
+2022-10-27T05:40:14.7716503Z ##[group]/datum/unit_test/cable_powernets
+2022-10-27T05:40:14.7716741Z
+2022-10-27T05:40:14.7717211Z [1;32mPASS[0m /datum/unit_test/cable_powernets 0s
+2022-10-27T05:40:14.7718214Z ##[endgroup]
+2022-10-27T05:40:14.7883699Z ##[group]/datum/unit_test/card_mismatch
+2022-10-27T05:40:14.7925710Z
+2022-10-27T05:40:14.7926265Z [1;32mPASS[0m /datum/unit_test/card_mismatch 0s
+2022-10-27T05:40:14.7926794Z ##[endgroup]
+2022-10-27T05:40:14.8965612Z ##[group]/datum/unit_test/chain_pull_through_space
+2022-10-27T05:40:14.8993553Z
+2022-10-27T05:40:14.8994184Z [1;32mPASS[0m /datum/unit_test/chain_pull_through_space 0s
+2022-10-27T05:40:14.8994797Z ##[endgroup]
+2022-10-27T05:40:15.0324540Z ##[group]/datum/unit_test/chat_filter_sanity
+2022-10-27T05:40:15.0326737Z
+2022-10-27T05:40:15.0327622Z [1;32mPASS[0m /datum/unit_test/chat_filter_sanity 0s
+2022-10-27T05:40:15.0328606Z ##[endgroup]
+2022-10-27T05:40:15.0495255Z ##[group]/datum/unit_test/circuit_component_category
+2022-10-27T05:40:15.0495800Z
+2022-10-27T05:40:15.0496375Z [1;32mPASS[0m /datum/unit_test/circuit_component_category 0s
+2022-10-27T05:40:15.0497189Z ##[endgroup]
+2022-10-27T05:40:15.0662040Z ##[group]/datum/unit_test/closets
+2022-10-27T05:40:16.7548466Z
+2022-10-27T05:40:16.7550247Z [1;32mPASS[0m /datum/unit_test/closets 1.7s
+2022-10-27T05:40:16.7551113Z ##[endgroup]
+2022-10-27T05:40:19.6808172Z ##[group]/datum/unit_test/harm_punch
+2022-10-27T05:40:19.7377314Z
+2022-10-27T05:40:19.7378123Z [1;32mPASS[0m /datum/unit_test/harm_punch 0.1s
+2022-10-27T05:40:19.7379056Z ##[endgroup]
+2022-10-27T05:40:19.7662222Z ##[group]/datum/unit_test/harm_melee
+2022-10-27T05:40:19.8341843Z
+2022-10-27T05:40:19.8342972Z [1;32mPASS[0m /datum/unit_test/harm_melee 0.1s
+2022-10-27T05:40:19.8343692Z ##[endgroup]
+2022-10-27T05:40:19.9635264Z ##[group]/datum/unit_test/harm_different_damage
+2022-10-27T05:40:20.0266779Z
+2022-10-27T05:40:20.0267726Z [1;32mPASS[0m /datum/unit_test/harm_different_damage 0.1s
+2022-10-27T05:40:20.0268642Z ##[endgroup]
+2022-10-27T05:40:20.0557189Z ##[group]/datum/unit_test/attack_chain
+2022-10-27T05:40:20.1137150Z
+2022-10-27T05:40:20.1138187Z [1;32mPASS[0m /datum/unit_test/attack_chain 0.1s
+2022-10-27T05:40:20.1139596Z ##[endgroup]
+2022-10-27T05:40:20.5189211Z ##[group]/datum/unit_test/disarm
+2022-10-27T05:40:20.5901636Z
+2022-10-27T05:40:20.5902409Z [1;32mPASS[0m /datum/unit_test/disarm 0s
+2022-10-27T05:40:20.5903484Z ##[endgroup]
+2022-10-27T05:40:20.6186577Z ##[group]/datum/unit_test/component_duping
+2022-10-27T05:40:20.6186976Z
+2022-10-27T05:40:20.6187696Z [1;32mPASS[0m /datum/unit_test/component_duping 0s
+2022-10-27T05:40:20.6188587Z ##[endgroup]
+2022-10-27T05:40:20.6351095Z ##[group]/datum/unit_test/confusion_symptom
+2022-10-27T05:40:20.6638729Z
+2022-10-27T05:40:20.6639511Z [1;32mPASS[0m /datum/unit_test/confusion_symptom 0s
+2022-10-27T05:40:20.6640205Z ##[endgroup]
+2022-10-27T05:40:20.9863951Z ##[group]/datum/unit_test/connect_loc_basic
+2022-10-27T05:40:20.9868536Z
+2022-10-27T05:40:20.9869090Z [1;32mPASS[0m /datum/unit_test/connect_loc_basic 0s
+2022-10-27T05:40:20.9869728Z ##[endgroup]
+2022-10-27T05:40:21.0030927Z ##[group]/datum/unit_test/connect_loc_change_turf
+2022-10-27T05:40:21.0038393Z
+2022-10-27T05:40:21.0038866Z [1;32mPASS[0m /datum/unit_test/connect_loc_change_turf 0s
+2022-10-27T05:40:21.0039436Z ##[endgroup]
+2022-10-27T05:40:21.0207944Z ##[group]/datum/unit_test/connect_loc_multiple_on_turf
+2022-10-27T05:40:21.0212290Z
+2022-10-27T05:40:21.0212902Z [1;32mPASS[0m /datum/unit_test/connect_loc_multiple_on_turf 0s
+2022-10-27T05:40:21.0213675Z ##[endgroup]
+2022-10-27T05:40:21.0384862Z ##[group]/datum/unit_test/crayon_naming
+2022-10-27T05:40:21.0442694Z
+2022-10-27T05:40:21.0443459Z [1;32mPASS[0m /datum/unit_test/crayon_naming 0s
+2022-10-27T05:40:21.0444098Z ##[endgroup]
+2022-10-27T05:40:21.0612637Z ##[group]/datum/unit_test/dcs_get_id_from_arguments
+2022-10-27T05:40:21.0613739Z
+2022-10-27T05:40:21.0614288Z [1;32mPASS[0m /datum/unit_test/dcs_get_id_from_arguments 0s
+2022-10-27T05:40:21.0615542Z ##[endgroup]
+2022-10-27T05:40:21.3899788Z ##[group]/datum/unit_test/designs
+2022-10-27T05:40:21.3953573Z
+2022-10-27T05:40:21.3954536Z [1;32mPASS[0m /datum/unit_test/designs 0s
+2022-10-27T05:40:21.3955578Z ##[endgroup]
+2022-10-27T05:40:21.4124000Z ##[group]/datum/unit_test/dummy_spawn_species
+2022-10-27T05:40:21.8463274Z
+2022-10-27T05:40:21.8464399Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_species 0.4s
+2022-10-27T05:40:21.8465523Z ##[endgroup]
+2022-10-27T05:40:22.2717242Z ##[group]/datum/unit_test/dummy_spawn_outfit
+2022-10-27T05:40:22.2939848Z Job type /datum/job/ai could not be retrieved from SSjob
+2022-10-27T05:40:22.6546726Z
+2022-10-27T05:40:22.6548196Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_outfit 0.4s
+2022-10-27T05:40:22.6549521Z ##[endgroup]
+2022-10-27T05:40:23.0435828Z ##[group]/datum/unit_test/dynamic_roundstart_ruleset_sanity
+2022-10-27T05:40:23.0436113Z
+2022-10-27T05:40:23.0436663Z [1;32mPASS[0m /datum/unit_test/dynamic_roundstart_ruleset_sanity 0s
+2022-10-27T05:40:23.0437218Z ##[endgroup]
+2022-10-27T05:40:23.0606191Z ##[group]/datum/unit_test/dynamic_unique_antag_flags
+2022-10-27T05:40:23.0606463Z
+2022-10-27T05:40:23.0606957Z [1;32mPASS[0m /datum/unit_test/dynamic_unique_antag_flags 0s
+2022-10-27T05:40:23.0607492Z ##[endgroup]
+2022-10-27T05:40:23.0772590Z ##[group]/datum/unit_test/egg_glands
+2022-10-27T05:40:23.1272833Z
+2022-10-27T05:40:23.1273679Z [1;32mPASS[0m /datum/unit_test/egg_glands 0.1s
+2022-10-27T05:40:23.1274499Z ##[endgroup]
+2022-10-27T05:40:23.1948246Z ##[group]/datum/unit_test/emoting
+2022-10-27T05:40:23.2276434Z
+2022-10-27T05:40:23.2277491Z [1;32mPASS[0m /datum/unit_test/emoting 0.1s
+2022-10-27T05:40:23.2278590Z ##[endgroup]
+2022-10-27T05:40:23.2495055Z ##[group]/datum/unit_test/food_edibility_check
+2022-10-27T05:40:24.5133005Z
+2022-10-27T05:40:24.5133747Z [1;32mPASS[0m /datum/unit_test/food_edibility_check 1.3s
+2022-10-27T05:40:24.5134589Z ##[endgroup]
+2022-10-27T05:40:25.7459424Z ##[group]/datum/unit_test/atmospheric_gas_transfer
+2022-10-27T05:40:25.7464252Z
+2022-10-27T05:40:25.7465453Z [1;32mPASS[0m /datum/unit_test/atmospheric_gas_transfer 0s
+2022-10-27T05:40:25.7466947Z ##[endgroup]
+2022-10-27T05:40:25.7637838Z ##[group]/datum/unit_test/get_turf_pixel
+2022-10-27T05:40:25.7652899Z
+2022-10-27T05:40:25.7653755Z [1;32mPASS[0m /datum/unit_test/get_turf_pixel 0s
+2022-10-27T05:40:25.7654716Z ##[endgroup]
+2022-10-27T05:40:25.7832528Z ##[group]/datum/unit_test/greyscale_item_icon_states
+2022-10-27T05:40:25.7897718Z
+2022-10-27T05:40:25.7898714Z [1;32mPASS[0m /datum/unit_test/greyscale_item_icon_states 0s
+2022-10-27T05:40:25.7901777Z ##[endgroup]
+2022-10-27T05:40:25.8065921Z ##[group]/datum/unit_test/greyscale_color_count
+2022-10-27T05:40:25.8212040Z
+2022-10-27T05:40:25.8213076Z [1;32mPASS[0m /datum/unit_test/greyscale_color_count 0s
+2022-10-27T05:40:25.8213890Z ##[endgroup]
+2022-10-27T05:40:25.9569835Z ##[group]/datum/unit_test/hallucination_icons
+2022-10-27T05:40:26.2007450Z
+2022-10-27T05:40:26.2008257Z [1;32mPASS[0m /datum/unit_test/hallucination_icons 0.3s
+2022-10-27T05:40:26.2008960Z ##[endgroup]
+2022-10-27T05:40:26.4177405Z ##[group]/datum/unit_test/heretic_knowledge
+2022-10-27T05:40:26.4221118Z
+2022-10-27T05:40:26.4222209Z [1;32mPASS[0m /datum/unit_test/heretic_knowledge 0s
+2022-10-27T05:40:26.4225335Z ##[endgroup]
+2022-10-27T05:40:26.4398954Z ##[group]/datum/unit_test/heretic_main_paths
+2022-10-27T05:40:26.4399640Z
+2022-10-27T05:40:26.4402394Z [1;32mPASS[0m /datum/unit_test/heretic_main_paths 0s
+2022-10-27T05:40:26.4403358Z ##[endgroup]
+2022-10-27T05:40:26.4569635Z ##[group]/datum/unit_test/heretic_rituals
+2022-10-27T05:40:26.5341269Z
+2022-10-27T05:40:26.5342957Z [1;32mPASS[0m /datum/unit_test/heretic_rituals 0.1s
+2022-10-27T05:40:26.5344455Z ##[endgroup]
+2022-10-27T05:40:26.6072760Z ##[group]/datum/unit_test/hanukkah_2123
+2022-10-27T05:40:26.6074182Z
+2022-10-27T05:40:26.6075388Z [1;32mPASS[0m /datum/unit_test/hanukkah_2123 0s
+2022-10-27T05:40:26.6076994Z ##[endgroup]
+2022-10-27T05:40:26.6266212Z ##[group]/datum/unit_test/ramadan_2165
+2022-10-27T05:40:26.6266979Z
+2022-10-27T05:40:26.6268854Z [1;32mPASS[0m /datum/unit_test/ramadan_2165 0s
+2022-10-27T05:40:26.6275155Z ##[endgroup]
+2022-10-27T05:40:26.6571207Z ##[group]/datum/unit_test/thanksgiving_2020
+2022-10-27T05:40:26.6572398Z
+2022-10-27T05:40:26.6573397Z [1;32mPASS[0m /datum/unit_test/thanksgiving_2020 0s
+2022-10-27T05:40:26.6574531Z ##[endgroup]
+2022-10-27T05:40:26.6735186Z ##[group]/datum/unit_test/mother_3683
+2022-10-27T05:40:26.6735666Z
+2022-10-27T05:40:26.6736248Z [1;32mPASS[0m /datum/unit_test/mother_3683 0s
+2022-10-27T05:40:26.6739224Z ##[endgroup]
+2022-10-27T05:40:26.8572827Z ##[group]/datum/unit_test/hello_2020
+2022-10-27T05:40:26.8573482Z
+2022-10-27T05:40:26.8574272Z [1;32mPASS[0m /datum/unit_test/hello_2020 0s
+2022-10-27T05:40:26.8577076Z ##[endgroup]
+2022-10-27T05:40:26.8749478Z ##[group]/datum/unit_test/new_year_1983
+2022-10-27T05:40:26.8750152Z
+2022-10-27T05:40:26.8750832Z [1;32mPASS[0m /datum/unit_test/new_year_1983 0s
+2022-10-27T05:40:26.8751724Z ##[endgroup]
+2022-10-27T05:40:26.8919557Z ##[group]/datum/unit_test/moth_week_2020
+2022-10-27T05:40:26.8951500Z
+2022-10-27T05:40:26.8952208Z [1;32mPASS[0m /datum/unit_test/moth_week_2020 0s
+2022-10-27T05:40:26.8952956Z ##[endgroup]
+2022-10-27T05:40:27.3122958Z ##[group]/datum/unit_test/human_through_recycler
+2022-10-27T05:40:27.3539454Z
+2022-10-27T05:40:27.3544496Z [1;32mPASS[0m /datum/unit_test/human_through_recycler 0s
+2022-10-27T05:40:27.3549227Z ##[endgroup]
+2022-10-27T05:40:27.3779548Z ##[group]/datum/unit_test/hydroponics_extractor_storage
+2022-10-27T05:40:27.4123276Z
+2022-10-27T05:40:27.4124500Z [1;32mPASS[0m /datum/unit_test/hydroponics_extractor_storage 0.1s
+2022-10-27T05:40:27.4125704Z ##[endgroup]
+2022-10-27T05:40:27.4385047Z ##[group]/datum/unit_test/hydroponics_harvest
+2022-10-27T05:40:27.5046209Z
+2022-10-27T05:40:27.5047429Z [1;32mPASS[0m /datum/unit_test/hydroponics_harvest 0.1s
+2022-10-27T05:40:27.5048344Z ##[endgroup]
+2022-10-27T05:40:27.5784276Z ##[group]/datum/unit_test/hydroponics_self_mutation
+2022-10-27T05:40:27.6261832Z
+2022-10-27T05:40:27.6263089Z [1;32mPASS[0m /datum/unit_test/hydroponics_self_mutation 0.1s
+2022-10-27T05:40:27.6264003Z ##[endgroup]
+2022-10-27T05:40:27.9431720Z ##[group]/datum/unit_test/hydroponics_validate_genes
+2022-10-27T05:40:27.9933945Z
+2022-10-27T05:40:27.9935126Z [1;32mPASS[0m /datum/unit_test/hydroponics_validate_genes 0s
+2022-10-27T05:40:27.9936883Z ##[endgroup]
+2022-10-27T05:40:28.0105063Z ##[group]/datum/unit_test/defined_inhand_icon_states
+2022-10-27T05:40:29.0888247Z Notice - Possible inhand icon matches found. It is best to be explicit with inhand sprite values.
+2022-10-27T05:40:29.0889307Z /obj/item/clothing/accessory/pride does not have an inhand_icon_state value - Possible matching sprites for "pride" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-10-27T05:40:29.0890499Z /obj/item/clothing/suit/caution does not have an inhand_icon_state value - Possible matching sprites for "caution" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-10-27T05:40:29.0891626Z /obj/item/clothing/under/suit/sl does not have an inhand_icon_state value - Possible matching sprites for "sl_suit" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-10-27T05:40:29.0892733Z /obj/item/clothing/head/collectable/paper does not have an inhand_icon_state value - Possible matching sprites for "paper" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2022-10-27T05:40:29.0893862Z /obj/item/clothing/head/mod does not have an inhand_icon_state value - Possible matching sprites for "helmet" found in: 'icons/mob/inhands/clothing/hats_lefthand.dmi' & 'icons/mob/inhands/clothing/hats_righthand.dmi'
+2022-10-27T05:40:29.0894922Z /obj/item/clothing/mask/animal/small/fox does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2022-10-27T05:40:29.0895960Z /obj/item/clothing/mask/animal/small/fox/cursed does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2022-10-27T05:40:29.0897110Z /obj/item/clothing/glasses/hud/health/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudmed" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-10-27T05:40:29.0898326Z /obj/item/clothing/glasses/hud/security/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudsec" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-10-27T05:40:29.0899739Z /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun does not have an inhand_icon_state value - Possible matching sprites for "syringegun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-10-27T05:40:29.0900919Z /obj/item/mecha_parts/mecha_equipment/generator does not have an inhand_icon_state value - Possible matching sprites for "tesla" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-10-27T05:40:29.0902057Z /obj/item/storage/bag/ore does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-10-27T05:40:29.0903498Z /obj/item/storage/bag/ore/cyborg does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-10-27T05:40:29.0904633Z /obj/item/implant/emp does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-10-27T05:40:29.0906583Z /obj/item/implant/uplink does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0927867Z /obj/item/implant/uplink/precharged does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0929023Z /obj/item/implant/uplink/starting does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0930125Z /obj/item/melee/energy/blade does not have an inhand_icon_state value - Possible matching sprites for "blade" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-10-27T05:40:29.0931206Z /obj/item/fireaxe does not have an inhand_icon_state value - Possible matching sprites for "fireaxe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-10-27T05:40:29.0932453Z /obj/item/fireaxe/boneaxe does not have an inhand_icon_state value - Possible matching sprites for "bone_axe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-10-27T05:40:29.0933868Z /obj/item/fireaxe/metal_h2_axe does not have an inhand_icon_state value - Possible matching sprites for "metalh2_axe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-10-27T05:40:29.0934999Z /obj/item/reagent_containers/cup/soda_cans/cola does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0936156Z /obj/item/reagent_containers/cup/soda_cans/tonic does not have an inhand_icon_state value - Possible matching sprites for "tonic" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0937331Z /obj/item/reagent_containers/cup/soda_cans/sodawater does not have an inhand_icon_state value - Possible matching sprites for "sodawater" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0938692Z /obj/item/reagent_containers/cup/soda_cans/lemon_lime does not have an inhand_icon_state value - Possible matching sprites for "lemon-lime" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0939881Z /obj/item/reagent_containers/cup/soda_cans/space_up does not have an inhand_icon_state value - Possible matching sprites for "space-up" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0941048Z /obj/item/reagent_containers/cup/soda_cans/starkist does not have an inhand_icon_state value - Possible matching sprites for "starkist" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0942649Z /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind does not have an inhand_icon_state value - Possible matching sprites for "space_mountain_wind" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0943894Z /obj/item/reagent_containers/cup/soda_cans/thirteenloko does not have an inhand_icon_state value - Possible matching sprites for "thirteen_loko" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0945078Z /obj/item/reagent_containers/cup/soda_cans/dr_gibb does not have an inhand_icon_state value - Possible matching sprites for "dr_gibb" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0946292Z /obj/item/reagent_containers/cup/soda_cans/pwr_game does not have an inhand_icon_state value - Possible matching sprites for "purple_can" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0947466Z /obj/item/reagent_containers/cup/glass/coffee does not have an inhand_icon_state value - Possible matching sprites for "coffee" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.0948548Z /obj/item/reagent_containers/chem_pack does not have an inhand_icon_state value - Possible matching sprites for "chempack" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-10-27T05:40:29.0949572Z /obj/item/sbeacondrop does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0950564Z /obj/item/sbeacondrop/bomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0951871Z /obj/item/sbeacondrop/emp does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0952969Z /obj/item/sbeacondrop/powersink does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0954060Z /obj/item/sbeacondrop/clownbomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0955292Z /obj/item/stack/medical/bruise_pack does not have an inhand_icon_state value - Possible matching sprites for "brutepack" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.0957053Z /obj/item/stack/medical/ointment does not have an inhand_icon_state value - Possible matching sprites for "ointment" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.0958265Z /obj/item/minespawner does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.0959349Z /obj/item/organ/internal/heart/gland/blood does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-10-27T05:40:29.0960438Z /obj/item/organ/internal/heart/gland/egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-10-27T05:40:29.0962120Z /obj/item/organ/internal/heart/gland/quantum does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-10-27T05:40:29.0963372Z /obj/item/organ/internal/heart/gland/trauma does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-10-27T05:40:29.0964517Z /obj/item/boxcutter does not have an inhand_icon_state value - Possible matching sprites for "boxcutter" found in: 'icons/mob/inhands/equipment/boxcutter_lefthand.dmi' & 'icons/mob/inhands/equipment/boxcutter_righthand.dmi'
+2022-10-27T05:40:29.0965764Z /obj/item/pushbroom does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-10-27T05:40:29.0966976Z /obj/item/pushbroom/cyborg does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-10-27T05:40:29.0968278Z /obj/item/chainsaw does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+2022-10-27T05:40:29.0969434Z /obj/item/chainsaw/doomslayer does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+2022-10-27T05:40:29.0976727Z /obj/item/toy/talking/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2022-10-27T05:40:29.0977819Z /obj/item/toy/figure/chef does not have an inhand_icon_state value - Possible matching sprites for "chef" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-10-27T05:40:29.0979042Z /obj/item/toy/figure/clown does not have an inhand_icon_state value - Possible matching sprites for "clown" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-10-27T05:40:29.0980133Z /obj/item/toy/figure/janitor does not have an inhand_icon_state value - Possible matching sprites for "janitor" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-10-27T05:40:29.0981181Z /obj/item/food/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-10-27T05:40:29.0982369Z /obj/item/food/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-10-27T05:40:29.0983404Z /obj/item/kitchen/fork does not have an inhand_icon_state value - Possible matching sprites for "fork" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-10-27T05:40:29.0984486Z /obj/item/kitchen/spoon does not have an inhand_icon_state value - Possible matching sprites for "spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-10-27T05:40:29.0985620Z /obj/item/kitchen/spoon/plastic does not have an inhand_icon_state value - Possible matching sprites for "plastic_spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-10-27T05:40:29.0986842Z /obj/item/book/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2022-10-27T05:40:29.0988013Z /obj/item/pitchfork does not have an inhand_icon_state value - Possible matching sprites for "pitchfork0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-10-27T05:40:29.0989036Z /obj/item/construction/rcd does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.0990051Z /obj/item/construction/rcd/borg does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.0991149Z /obj/item/construction/rcd/loaded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.0994310Z /obj/item/construction/rcd/loaded/upgraded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.0995737Z /obj/item/construction/rcd/internal does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.0996853Z /obj/item/construction/rld does not have an inhand_icon_state value - Possible matching sprites for "rld-5" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.0997956Z /obj/item/construction/rld/mini does not have an inhand_icon_state value - Possible matching sprites for "rld-5" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.0999039Z /obj/item/rcd_ammo does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.1000123Z /obj/item/rcd_ammo/large does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.1001211Z /obj/item/godstaff does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-10-27T05:40:29.1002492Z /obj/item/godstaff/red does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-10-27T05:40:29.1003600Z /obj/item/godstaff/blue does not have an inhand_icon_state value - Possible matching sprites for "godstaff-blue" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-10-27T05:40:29.1004679Z /obj/item/pipe_dispenser does not have an inhand_icon_state value - Possible matching sprites for "rpd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.1005898Z /obj/item/singularityhammer does not have an inhand_icon_state value - Possible matching sprites for "singularity_hammer0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-10-27T05:40:29.1006926Z /obj/item/mjollnir does not have an inhand_icon_state value - Possible matching sprites for "mjollnir0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-10-27T05:40:29.1008099Z /obj/item/spear does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-10-27T05:40:29.1009143Z /obj/item/spear/explosive does not have an inhand_icon_state value - Possible matching sprites for "spearbomb0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-10-27T05:40:29.1010190Z /obj/item/spear/grey_tide does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-10-27T05:40:29.1011309Z /obj/item/spear/bonespear does not have an inhand_icon_state value - Possible matching sprites for "bone_spear0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-10-27T05:40:29.1012517Z /obj/item/spear/bamboospear does not have an inhand_icon_state value - Possible matching sprites for "bamboo_spear0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-10-27T05:40:29.1014120Z /obj/item/trash/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-10-27T05:40:29.1015524Z /obj/item/trash/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-10-27T05:40:29.1016580Z /obj/item/trash/can does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.1017625Z /obj/item/trash/can/food does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-10-27T05:40:29.1018877Z /obj/item/highfrequencyblade does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-10-27T05:40:29.1020043Z /obj/item/highfrequencyblade/wizard does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-10-27T05:40:29.1021168Z /obj/item/borg/sight/meson does not have an inhand_icon_state value - Possible matching sprites for "meson" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-10-27T05:40:29.1022472Z /obj/item/ammo_casing/magic/hook does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-10-27T05:40:29.1023582Z /obj/item/ammo_casing/magic/hook/bounty does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-10-27T05:40:29.1024655Z /obj/item/harmalarm does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_lefthand.dmi' & 'icons/mob/inhands/items/megaphone_righthand.dmi'
+2022-10-27T05:40:29.1025757Z /obj/item/abductor_machine_beacon does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.1027058Z /obj/item/abductor_machine_beacon/chem_dispenser does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.1028202Z /obj/item/grown/carbon_rose does not have an inhand_icon_state value - Possible matching sprites for "carbonrose" found in: 'icons/mob/inhands/weapons/plants_righthand.dmi' & 'icons/mob/inhands/weapons/plants_lefthand.dmi'
+2022-10-27T05:40:29.1029346Z /obj/item/paint_palette does not have an inhand_icon_state value - Possible matching sprites for "palette" found in: 'icons/mob/inhands/equipment/palette_righthand.dmi' & 'icons/mob/inhands/equipment/palette_lefthand.dmi'
+2022-10-27T05:40:29.1030413Z /obj/item/surprise_egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-10-27T05:40:29.1031719Z /obj/item/experi_scanner does not have an inhand_icon_state value - Possible matching sprites for "experiscanner" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.1032793Z /obj/item/fishing_hook does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-10-27T05:40:29.1033871Z /obj/item/cursed_katana does not have an inhand_icon_state value - Possible matching sprites for "cursed_katana" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-10-27T05:40:29.1035004Z /obj/item/guardiancreator/tech does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.1036195Z /obj/item/guardiancreator/tech/choose does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.1037390Z /obj/item/guardiancreator/tech/choose/traitor does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.1038610Z /obj/item/guardiancreator/tech/choose/dextrous does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.1039744Z /obj/item/mod/module/welding does not have an inhand_icon_state value - Possible matching sprites for "welding" found in: 'icons/mob/inhands/clothing/masks_lefthand.dmi' & 'icons/mob/inhands/clothing/masks_righthand.dmi'
+2022-10-27T05:40:29.1040839Z /obj/item/mod/module/mister does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2022-10-27T05:40:29.1042176Z /obj/item/mod/module/mister/atmos does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2022-10-27T05:40:29.1043317Z /obj/item/mod/module/jetpack does not have an inhand_icon_state value - Possible matching sprites for "jetpack" found in: 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi' & 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
+2022-10-27T05:40:29.1044435Z /obj/item/mod/module/flashlight does not have an inhand_icon_state value - Possible matching sprites for "flashlight" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-10-27T05:40:29.1045556Z /obj/item/mod/module/stamp does not have an inhand_icon_state value - Possible matching sprites for "stamp" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2022-10-27T05:40:29.1046616Z /obj/item/mod/module/holster does not have an inhand_icon_state value - Possible matching sprites for "holster" found in: 'icons/mob/inhands/equipment/belt_lefthand.dmi' & 'icons/mob/inhands/equipment/belt_righthand.dmi'
+2022-10-27T05:40:29.1047731Z /obj/item/mod/module/megaphone does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_lefthand.dmi' & 'icons/mob/inhands/items/megaphone_righthand.dmi'
+2022-10-27T05:40:29.1049097Z /obj/item/mod/module/drill does not have an inhand_icon_state value - Possible matching sprites for "drill" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-10-27T05:40:29.1050391Z /obj/item/mod/module/tem does not have an inhand_icon_state value - Possible matching sprites for "chronogun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-10-27T05:40:29.1051631Z /obj/item/bonesetter does not have an inhand_icon_state value - Possible matching sprites for "bonesetter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.1052751Z /obj/item/blood_filter does not have an inhand_icon_state value - Possible matching sprites for "bloodfilter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-10-27T05:40:29.1055555Z /obj/item/mecha_ammo/flashbang does not have an inhand_icon_state value - Possible matching sprites for "flashbang" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-10-27T05:40:29.1056050Z
+2022-10-27T05:40:29.1056364Z [1;32mPASS[0m /datum/unit_test/defined_inhand_icon_states 1s
+2022-10-27T05:40:29.1057048Z ##[endgroup]
+2022-10-27T05:40:30.3200151Z ##[group]/datum/unit_test/keybinding_init
+2022-10-27T05:40:30.3200418Z
+2022-10-27T05:40:30.3201050Z [1;32mPASS[0m /datum/unit_test/keybinding_init 0s
+2022-10-27T05:40:30.3201648Z ##[endgroup]
+2022-10-27T05:40:30.3369516Z ##[group]/datum/unit_test/knockoff_component
+2022-10-27T05:40:30.3974289Z
+2022-10-27T05:40:30.3975134Z [1;32mPASS[0m /datum/unit_test/knockoff_component 0s
+2022-10-27T05:40:30.3975848Z ##[endgroup]
+2022-10-27T05:40:30.4758006Z ##[group]/datum/unit_test/limbsanity
+2022-10-27T05:40:30.5511170Z
+2022-10-27T05:40:30.5512056Z [1;32mPASS[0m /datum/unit_test/limbsanity 0.1s
+2022-10-27T05:40:30.5513064Z ##[endgroup]
+2022-10-27T05:40:30.5683011Z ##[group]/datum/unit_test/load_map_security
+2022-10-27T05:40:30.5686279Z map directory not in whitelist: data/load_map_security_temp for map runtimestation
+2022-10-27T05:40:30.5686559Z
+2022-10-27T05:40:30.5687309Z [1;32mPASS[0m /datum/unit_test/load_map_security 0s
+2022-10-27T05:40:30.5688206Z ##[endgroup]
+2022-10-27T05:40:30.5865089Z ##[group]/datum/unit_test/machine_disassembly
+2022-10-27T05:40:30.5895192Z
+2022-10-27T05:40:30.5895755Z [1;32mPASS[0m /datum/unit_test/machine_disassembly 0s
+2022-10-27T05:40:30.5896331Z ##[endgroup]
+2022-10-27T05:40:30.6183397Z ##[group]/datum/unit_test/mecha_damage
+2022-10-27T05:40:30.6691654Z
+2022-10-27T05:40:30.6692724Z [1;32mPASS[0m /datum/unit_test/mecha_damage 0s
+2022-10-27T05:40:30.6693811Z ##[endgroup]
+2022-10-27T05:40:30.7005279Z ##[group]/datum/unit_test/test_human_base
+2022-10-27T05:40:30.7905422Z
+2022-10-27T05:40:30.7906225Z [1;32mPASS[0m /datum/unit_test/test_human_base 0s
+2022-10-27T05:40:30.7906953Z ##[endgroup]
+2022-10-27T05:40:30.8626902Z ##[group]/datum/unit_test/test_human_bone
+2022-10-27T05:40:30.9519120Z
+2022-10-27T05:40:30.9520211Z [1;32mPASS[0m /datum/unit_test/test_human_bone 0.1s
+2022-10-27T05:40:30.9521496Z ##[endgroup]
+2022-10-27T05:40:31.2736006Z ##[group]/datum/unit_test/merge_type
+2022-10-27T05:40:31.2741500Z
+2022-10-27T05:40:31.2744034Z [1;32mPASS[0m /datum/unit_test/merge_type 0s
+2022-10-27T05:40:31.2745007Z ##[endgroup]
+2022-10-27T05:40:31.2940088Z ##[group]/datum/unit_test/metabolization
+2022-10-27T05:40:31.5116749Z
+2022-10-27T05:40:31.5119088Z [1;32mPASS[0m /datum/unit_test/metabolization 0.3s
+2022-10-27T05:40:31.5120552Z ##[endgroup]
+2022-10-27T05:40:31.8707226Z ##[group]/datum/unit_test/on_mob_end_metabolize
+2022-10-27T05:40:31.9025163Z
+2022-10-27T05:40:31.9025867Z [1;32mPASS[0m /datum/unit_test/on_mob_end_metabolize 0.1s
+2022-10-27T05:40:31.9026521Z ##[endgroup]
+2022-10-27T05:40:32.5850525Z ##[group]/datum/unit_test/addictions
+2022-10-27T05:40:32.6747518Z
+2022-10-27T05:40:32.6749097Z [1;32mPASS[0m /datum/unit_test/addictions 0.1s
+2022-10-27T05:40:32.6749790Z ##[endgroup]
+2022-10-27T05:40:32.8122227Z ##[group]/datum/unit_test/actions_moved_on_mind_transfer
+2022-10-27T05:40:32.8435426Z
+2022-10-27T05:40:32.8437029Z [1;32mPASS[0m /datum/unit_test/actions_moved_on_mind_transfer 0s
+2022-10-27T05:40:32.8438267Z ##[endgroup]
+2022-10-27T05:40:32.8685143Z ##[group]/datum/unit_test/mob_faction
+2022-10-27T05:40:37.0355455Z
+2022-10-27T05:40:37.0357124Z [1;32mPASS[0m /datum/unit_test/mob_faction 4.2s
+2022-10-27T05:40:37.0358437Z ##[endgroup]
+2022-10-27T05:40:46.3276946Z ##[group]/datum/unit_test/mob_spawn
+2022-10-27T05:40:46.3478047Z
+2022-10-27T05:40:46.3479094Z [1;32mPASS[0m /datum/unit_test/mob_spawn 0s
+2022-10-27T05:40:46.3480121Z ##[endgroup]
+2022-10-27T05:40:46.5088900Z ##[group]/datum/unit_test/modsuit_checks
+2022-10-27T05:40:46.7422166Z
+2022-10-27T05:40:46.7424741Z [1;32mPASS[0m /datum/unit_test/modsuit_checks 0.2s
+2022-10-27T05:40:46.7426303Z ##[endgroup]
+2022-10-27T05:40:46.9639966Z ##[group]/datum/unit_test/modular_map_loader
+2022-10-27T05:40:46.9645920Z
+2022-10-27T05:40:46.9647042Z [1;32mPASS[0m /datum/unit_test/modular_map_loader 0s
+2022-10-27T05:40:46.9648824Z ##[endgroup]
+2022-10-27T05:40:46.9857078Z ##[group]/datum/unit_test/mouse_bite_cable
+2022-10-27T05:40:46.9906436Z
+2022-10-27T05:40:46.9907445Z [1;32mPASS[0m /datum/unit_test/mouse_bite_cable 0s
+2022-10-27T05:40:46.9908580Z ##[endgroup]
+2022-10-27T05:40:47.0104524Z ##[group]/datum/unit_test/novaflower_burn
+2022-10-27T05:40:47.0691141Z
+2022-10-27T05:40:47.0692760Z [1;32mPASS[0m /datum/unit_test/novaflower_burn 0s
+2022-10-27T05:40:47.0694697Z ##[endgroup]
+2022-10-27T05:40:47.4496213Z ##[group]/datum/unit_test/ntnetwork
+2022-10-27T05:40:47.4517846Z
+2022-10-27T05:40:47.4518703Z [1;32mPASS[0m /datum/unit_test/ntnetwork 0s
+2022-10-27T05:40:47.4519832Z ##[endgroup]
+2022-10-27T05:40:47.4710883Z ##[group]/datum/unit_test/nuke_cinematic
+2022-10-27T05:40:51.6544361Z
+2022-10-27T05:40:51.6546808Z [1;32mPASS[0m /datum/unit_test/nuke_cinematic 4.2s
+2022-10-27T05:40:51.6548322Z ##[endgroup]
+2022-10-27T05:40:51.9750957Z ##[group]/datum/unit_test/objectives_category
+2022-10-27T05:40:51.9754837Z
+2022-10-27T05:40:51.9758911Z [1;32mPASS[0m /datum/unit_test/objectives_category 0s
+2022-10-27T05:40:51.9762185Z ##[endgroup]
+2022-10-27T05:40:51.9966795Z ##[group]/datum/unit_test/operating_table
+2022-10-27T05:40:52.0501605Z
+2022-10-27T05:40:52.0502705Z [1;32mPASS[0m /datum/unit_test/operating_table 0.1s
+2022-10-27T05:40:52.0503789Z ##[endgroup]
+2022-10-27T05:40:52.1317881Z ##[group]/datum/unit_test/outfit_sanity
+2022-10-27T05:41:01.7976872Z
+2022-10-27T05:41:01.7979182Z [1;32mPASS[0m /datum/unit_test/outfit_sanity 9.6s
+2022-10-27T05:41:01.7980122Z ##[endgroup]
+2022-10-27T05:41:11.4243742Z ##[group]/datum/unit_test/paintings
+2022-10-27T05:41:11.4598558Z
+2022-10-27T05:41:11.4599629Z [1;32mPASS[0m /datum/unit_test/paintings 0s
+2022-10-27T05:41:11.4600448Z ##[endgroup]
+2022-10-27T05:41:11.4792755Z ##[group]/datum/unit_test/pills
+2022-10-27T05:41:11.5083505Z
+2022-10-27T05:41:11.5084511Z [1;32mPASS[0m /datum/unit_test/pills 0.1s
+2022-10-27T05:41:11.5085321Z ##[endgroup]
+2022-10-27T05:41:11.5601428Z ##[group]/datum/unit_test/plane_double_transform
+2022-10-27T05:41:11.5919033Z
+2022-10-27T05:41:11.5921018Z [1;32mPASS[0m /datum/unit_test/plane_double_transform 0s
+2022-10-27T05:41:11.5922301Z ##[endgroup]
+2022-10-27T05:41:11.6221465Z ##[group]/datum/unit_test/plane_dupe_detector
+2022-10-27T05:41:11.6222004Z
+2022-10-27T05:41:11.6222655Z [1;32mPASS[0m /datum/unit_test/plane_dupe_detector 0s
+2022-10-27T05:41:11.6223293Z ##[endgroup]
+2022-10-27T05:41:11.6426244Z ##[group]/datum/unit_test/plantgrowth
+2022-10-27T05:41:11.6982938Z
+2022-10-27T05:41:11.6984405Z [1;32mPASS[0m /datum/unit_test/plantgrowth 0s
+2022-10-27T05:41:11.6985721Z ##[endgroup]
+2022-10-27T05:41:11.7325573Z ##[group]/datum/unit_test/preference_species
+2022-10-27T05:41:11.7325819Z
+2022-10-27T05:41:11.7328286Z [1;32mPASS[0m /datum/unit_test/preference_species 0s
+2022-10-27T05:41:11.7329335Z ##[endgroup]
+2022-10-27T05:41:11.7520773Z ##[group]/datum/unit_test/preferences_implement_everything
+2022-10-27T05:41:18.7582701Z
+2022-10-27T05:41:18.7583967Z [1;32mPASS[0m /datum/unit_test/preferences_implement_everything 7s
+2022-10-27T05:41:18.7674142Z ##[endgroup]
+2022-10-27T05:41:25.7837961Z ##[group]/datum/unit_test/preferences_valid_savefile_key
+2022-10-27T05:41:25.7840087Z
+2022-10-27T05:41:25.7841504Z [1;32mPASS[0m /datum/unit_test/preferences_valid_savefile_key 0s
+2022-10-27T05:41:25.7842504Z ##[endgroup]
+2022-10-27T05:41:25.8045081Z ##[group]/datum/unit_test/preferences_valid_main_feature_name
+2022-10-27T05:41:25.8046166Z
+2022-10-27T05:41:25.8047192Z [1;32mPASS[0m /datum/unit_test/preferences_valid_main_feature_name 0s
+2022-10-27T05:41:25.8049437Z ##[endgroup]
+2022-10-27T05:41:25.8233566Z ##[group]/datum/unit_test/projectile_movetypes
+2022-10-27T05:41:25.8234187Z
+2022-10-27T05:41:25.8235057Z [1;32mPASS[0m /datum/unit_test/projectile_movetypes 0s
+2022-10-27T05:41:25.8238602Z ##[endgroup]
+2022-10-27T05:41:25.8422043Z ##[group]/datum/unit_test/gun_go_bang
+2022-10-27T05:41:25.9103045Z
+2022-10-27T05:41:25.9104017Z [1;32mPASS[0m /datum/unit_test/gun_go_bang 0.1s
+2022-10-27T05:41:25.9105102Z ##[endgroup]
+2022-10-27T05:41:25.9957966Z ##[group]/datum/unit_test/quirk_icons
+2022-10-27T05:41:25.9958970Z
+2022-10-27T05:41:25.9960876Z [1;32mPASS[0m /datum/unit_test/quirk_icons 0s
+2022-10-27T05:41:25.9961959Z ##[endgroup]
+2022-10-27T05:41:26.0166772Z ##[group]/datum/unit_test/range_return
+2022-10-27T05:41:26.0167357Z
+2022-10-27T05:41:26.0167980Z [1;32mPASS[0m /datum/unit_test/range_return 0s
+2022-10-27T05:41:26.0222740Z ##[endgroup]
+2022-10-27T05:41:26.0353132Z ##[group]/datum/unit_test/frame_stacking
+2022-10-27T05:41:26.0914496Z
+2022-10-27T05:41:26.0915254Z [1;32mPASS[0m /datum/unit_test/frame_stacking 0s
+2022-10-27T05:41:26.0916011Z ##[endgroup]
+2022-10-27T05:41:26.1694918Z ##[group]/datum/unit_test/reagent_id_typos
+2022-10-27T05:41:26.1727233Z
+2022-10-27T05:41:26.1728009Z [1;32mPASS[0m /datum/unit_test/reagent_id_typos 0s
+2022-10-27T05:41:26.1728685Z ##[endgroup]
+2022-10-27T05:41:26.1920271Z ##[group]/datum/unit_test/reagent_mob_expose
+2022-10-27T05:41:26.2268321Z
+2022-10-27T05:41:26.2269120Z [1;32mPASS[0m /datum/unit_test/reagent_mob_expose 0.1s
+2022-10-27T05:41:26.2269829Z ##[endgroup]
+2022-10-27T05:41:26.2549234Z ##[group]/datum/unit_test/reagent_mob_procs
+2022-10-27T05:41:26.2827770Z
+2022-10-27T05:41:26.2828618Z [1;32mPASS[0m /datum/unit_test/reagent_mob_procs 0s
+2022-10-27T05:41:26.2829318Z ##[endgroup]
+2022-10-27T05:41:26.3078178Z ##[group]/datum/unit_test/reagent_names
+2022-10-27T05:41:27.1646047Z
+2022-10-27T05:41:27.1647510Z [1;32mPASS[0m /datum/unit_test/reagent_names 0.8s
+2022-10-27T05:41:27.1649181Z ##[endgroup]
+2022-10-27T05:41:27.9838180Z ##[group]/datum/unit_test/reagent_recipe_collisions
+2022-10-27T05:41:28.4462173Z
+2022-10-27T05:41:28.4463469Z [1;32mPASS[0m /datum/unit_test/reagent_recipe_collisions 0.5s
+2022-10-27T05:41:28.4464601Z ##[endgroup]
+2022-10-27T05:41:28.8661632Z ##[group]/datum/unit_test/reagent_transfer
+2022-10-27T05:41:28.8670725Z
+2022-10-27T05:41:28.8671943Z [1;32mPASS[0m /datum/unit_test/reagent_transfer 0s
+2022-10-27T05:41:28.8673335Z ##[endgroup]
+2022-10-27T05:41:28.8888500Z ##[group]/datum/unit_test/stop_drop_and_roll
+2022-10-27T05:41:28.9156826Z
+2022-10-27T05:41:28.9160888Z [1;32mPASS[0m /datum/unit_test/stop_drop_and_roll 0.1s
+2022-10-27T05:41:28.9162086Z ##[endgroup]
+2022-10-27T05:41:28.9403341Z ##[group]/datum/unit_test/container_resist
+2022-10-27T05:41:28.9744033Z
+2022-10-27T05:41:28.9746221Z [1;32mPASS[0m /datum/unit_test/container_resist 0s
+2022-10-27T05:41:28.9748317Z ##[endgroup]
+2022-10-27T05:41:29.0027065Z ##[group]/datum/unit_test/get_message_mods
+2022-10-27T05:41:29.0268010Z
+2022-10-27T05:41:29.0269082Z [1;32mPASS[0m /datum/unit_test/get_message_mods 0s
+2022-10-27T05:41:29.0270222Z ##[endgroup]
+2022-10-27T05:41:29.0513097Z ##[group]/datum/unit_test/say_signal
+2022-10-27T05:41:29.0526010Z
+2022-10-27T05:41:29.0526949Z [1;32mPASS[0m /datum/unit_test/say_signal 0s
+2022-10-27T05:41:29.0528292Z ##[endgroup]
+2022-10-27T05:41:29.0718244Z ##[group]/datum/unit_test/screenshot_antag_icons
+2022-10-27T05:41:29.0735578Z screenshot_antag_icons_fugitive was put in data/screenshots_new
+2022-10-27T05:41:29.0746540Z screenshot_antag_icons_loneoperative was put in data/screenshots_new
+2022-10-27T05:41:29.1154449Z screenshot_antag_icons_sentiencepotionspawn was put in data/screenshots_new
+2022-10-27T05:41:29.1168816Z screenshot_antag_icons_traitor was put in data/screenshots_new
+2022-10-27T05:41:29.1651315Z screenshot_antag_icons_malfai was put in data/screenshots_new
+2022-10-27T05:41:29.1695591Z screenshot_antag_icons_bloodbrother was put in data/screenshots_new
+2022-10-27T05:41:29.1703594Z screenshot_antag_icons_changeling was put in data/screenshots_new
+2022-10-27T05:41:29.1768645Z screenshot_antag_icons_heretic was put in data/screenshots_new
+2022-10-27T05:41:29.1779481Z screenshot_antag_icons_wizard was put in data/screenshots_new
+2022-10-27T05:41:29.1818096Z screenshot_antag_icons_cultist was put in data/screenshots_new
+2022-10-27T05:41:29.1834393Z screenshot_antag_icons_operative was put in data/screenshots_new
+2022-10-27T05:41:29.1849934Z screenshot_antag_icons_clownoperative was put in data/screenshots_new
+2022-10-27T05:41:29.1867009Z screenshot_antag_icons_headrevolutionary was put in data/screenshots_new
+2022-10-27T05:41:29.1869714Z screenshot_antag_icons_syndicateinfiltrator was put in data/screenshots_new
+2022-10-27T05:41:29.1870566Z screenshot_antag_icons_provocateur was put in data/screenshots_new
+2022-10-27T05:41:29.1871844Z screenshot_antag_icons_hereticsmuggler was put in data/screenshots_new
+2022-10-27T05:41:29.1872299Z screenshot_antag_icons_wizardmidround was put in data/screenshots_new
+2022-10-27T05:41:29.1874172Z screenshot_antag_icons_operativemidround was put in data/screenshots_new
+2022-10-27T05:41:29.2627121Z screenshot_antag_icons_blob was put in data/screenshots_new
+2022-10-27T05:41:29.2749190Z screenshot_antag_icons_xenomorph was put in data/screenshots_new
+2022-10-27T05:41:29.2756569Z screenshot_antag_icons_nightmare was put in data/screenshots_new
+2022-10-27T05:41:29.2840326Z screenshot_antag_icons_spacedragon was put in data/screenshots_new
+2022-10-27T05:41:29.2847600Z screenshot_antag_icons_abductor was put in data/screenshots_new
+2022-10-27T05:41:29.2854366Z screenshot_antag_icons_spaceninja was put in data/screenshots_new
+2022-10-27T05:41:29.3137655Z screenshot_antag_icons_revenant was put in data/screenshots_new
+2022-10-27T05:41:29.3161866Z screenshot_antag_icons_sentientdisease was put in data/screenshots_new
+2022-10-27T05:41:29.3163321Z screenshot_antag_icons_syndicatesleeperagent was put in data/screenshots_new
+2022-10-27T05:41:29.3355078Z screenshot_antag_icons_blobinfection was put in data/screenshots_new
+2022-10-27T05:41:29.3368910Z screenshot_antag_icons_obsessed was put in data/screenshots_new
+2022-10-27T05:41:29.3372287Z screenshot_antag_icons_malfaimidround was put in data/screenshots_new
+2022-10-27T05:41:29.3372581Z
+2022-10-27T05:41:29.3373097Z [1;32mPASS[0m /datum/unit_test/screenshot_antag_icons 0.3s
+2022-10-27T05:41:29.3373772Z ##[endgroup]
+2022-10-27T05:41:29.6066997Z ##[group]/datum/unit_test/screenshot_basic
+2022-10-27T05:41:29.6075525Z screenshot_basic_red was put in data/screenshots_new
+2022-10-27T05:41:29.6078638Z
+2022-10-27T05:41:29.6082196Z [1;32mPASS[0m /datum/unit_test/screenshot_basic 0s
+2022-10-27T05:41:29.6085438Z ##[endgroup]
+2022-10-27T05:41:29.6308021Z ##[group]/datum/unit_test/screenshot_humanoids
+2022-10-27T05:41:30.3591652Z screenshot_humanoids__datum_species_lizard was put in data/screenshots_new
+2022-10-27T05:41:31.2589662Z screenshot_humanoids__datum_species_moth was put in data/screenshots_new
+2022-10-27T05:41:31.9323705Z screenshot_humanoids__datum_species_shadow was put in data/screenshots_new
+2022-10-27T05:41:32.1651600Z screenshot_humanoids__datum_species_shadow_nightmare was put in data/screenshots_new
+2022-10-27T05:41:32.8142370Z screenshot_humanoids__datum_species_abductor was put in data/screenshots_new
+2022-10-27T05:41:33.4104949Z screenshot_humanoids__datum_species_android was put in data/screenshots_new
+2022-10-27T05:41:34.0306787Z screenshot_humanoids__datum_species_dullahan was put in data/screenshots_new
+2022-10-27T05:41:34.6399759Z screenshot_humanoids__datum_species_ethereal was put in data/screenshots_new
+2022-10-27T05:41:35.3333622Z screenshot_humanoids__datum_species_human was put in data/screenshots_new
+2022-10-27T05:41:36.1586851Z screenshot_humanoids__datum_species_human_felinid was put in data/screenshots_new
+2022-10-27T05:41:36.9430568Z screenshot_humanoids__datum_species_human_krokodil_addict was put in data/screenshots_new
+2022-10-27T05:41:37.7067338Z screenshot_humanoids__datum_species_fly was put in data/screenshots_new
+2022-10-27T05:41:38.3488088Z screenshot_humanoids__datum_species_golem was put in data/screenshots_new
+2022-10-27T05:41:38.9816576Z screenshot_humanoids__datum_species_golem_adamantine was put in data/screenshots_new
+2022-10-27T05:41:39.6179037Z screenshot_humanoids__datum_species_golem_plasma was put in data/screenshots_new
+2022-10-27T05:41:40.2518127Z screenshot_humanoids__datum_species_golem_diamond was put in data/screenshots_new
+2022-10-27T05:41:40.9179988Z screenshot_humanoids__datum_species_golem_gold was put in data/screenshots_new
+2022-10-27T05:41:41.5666452Z screenshot_humanoids__datum_species_golem_silver was put in data/screenshots_new
+2022-10-27T05:41:42.2085418Z screenshot_humanoids__datum_species_golem_plasteel was put in data/screenshots_new
+2022-10-27T05:41:42.7916566Z screenshot_humanoids__datum_species_golem_titanium was put in data/screenshots_new
+2022-10-27T05:41:43.4311508Z screenshot_humanoids__datum_species_golem_plastitanium was put in data/screenshots_new
+2022-10-27T05:41:44.0632010Z screenshot_humanoids__datum_species_golem_alloy was put in data/screenshots_new
+2022-10-27T05:41:44.7023401Z screenshot_humanoids__datum_species_golem_wood was put in data/screenshots_new
+2022-10-27T05:41:45.3273391Z screenshot_humanoids__datum_species_golem_uranium was put in data/screenshots_new
+2022-10-27T05:41:45.9609338Z screenshot_humanoids__datum_species_golem_sand was put in data/screenshots_new
+2022-10-27T05:41:46.5998181Z screenshot_humanoids__datum_species_golem_glass was put in data/screenshots_new
+2022-10-27T05:41:47.2316624Z screenshot_humanoids__datum_species_golem_bluespace was put in data/screenshots_new
+2022-10-27T05:41:47.8414848Z screenshot_humanoids__datum_species_golem_bananium was put in data/screenshots_new
+2022-10-27T05:41:48.3268058Z screenshot_humanoids__datum_species_golem_runic was put in data/screenshots_new
+2022-10-27T05:41:49.0158232Z screenshot_humanoids__datum_species_golem_cloth was put in data/screenshots_new
+2022-10-27T05:41:49.5977864Z screenshot_humanoids__datum_species_golem_plastic was put in data/screenshots_new
+2022-10-27T05:41:50.2331785Z screenshot_humanoids__datum_species_golem_bronze was put in data/screenshots_new
+2022-10-27T05:41:50.7727391Z screenshot_humanoids__datum_species_golem_cardboard was put in data/screenshots_new
+2022-10-27T05:41:51.4241290Z screenshot_humanoids__datum_species_golem_leather was put in data/screenshots_new
+2022-10-27T05:41:51.9263638Z screenshot_humanoids__datum_species_golem_durathread was put in data/screenshots_new
+2022-10-27T05:41:52.4187080Z screenshot_humanoids__datum_species_golem_bone was put in data/screenshots_new
+2022-10-27T05:41:52.9144290Z screenshot_humanoids__datum_species_golem_snow was put in data/screenshots_new
+2022-10-27T05:41:53.5567094Z screenshot_humanoids__datum_species_golem_mhydrogen was put in data/screenshots_new
+2022-10-27T05:41:54.2523403Z screenshot_humanoids__datum_species_jelly was put in data/screenshots_new
+2022-10-27T05:41:54.9494868Z screenshot_humanoids__datum_species_jelly_slime was put in data/screenshots_new
+2022-10-27T05:41:55.6574845Z screenshot_humanoids__datum_species_jelly_luminescent was put in data/screenshots_new
+2022-10-27T05:41:56.3636662Z screenshot_humanoids__datum_species_jelly_stargazer was put in data/screenshots_new
+2022-10-27T05:41:56.9807853Z screenshot_humanoids__datum_species_lizard_ashwalker was put in data/screenshots_new
+2022-10-27T05:41:57.6172458Z screenshot_humanoids__datum_species_lizard_silverscale was put in data/screenshots_new
+2022-10-27T05:41:57.7952429Z screenshot_humanoids__datum_species_monkey was put in data/screenshots_new
+2022-10-27T05:41:58.3429906Z screenshot_humanoids__datum_species_mush was put in data/screenshots_new
+2022-10-27T05:41:58.9291358Z screenshot_humanoids__datum_species_plasmaman was put in data/screenshots_new
+2022-10-27T05:41:59.6393043Z screenshot_humanoids__datum_species_pod was put in data/screenshots_new
+2022-10-27T05:42:00.3004709Z screenshot_humanoids__datum_species_skeleton was put in data/screenshots_new
+2022-10-27T05:42:01.0488511Z screenshot_humanoids__datum_species_snail was put in data/screenshots_new
+2022-10-27T05:42:01.7655604Z screenshot_humanoids__datum_species_vampire was put in data/screenshots_new
+2022-10-27T05:42:02.5637759Z screenshot_humanoids__datum_species_zombie was put in data/screenshots_new
+2022-10-27T05:42:03.4341531Z screenshot_humanoids__datum_species_zombie_infectious was put in data/screenshots_new
+2022-10-27T05:42:03.4342475Z
+2022-10-27T05:42:03.4433344Z [1;32mPASS[0m /datum/unit_test/screenshot_humanoids 33.8s
+2022-10-27T05:42:03.4434057Z ##[endgroup]
+2022-10-27T05:42:38.0137819Z ##[group]/datum/unit_test/screenshot_saturnx
+2022-10-27T05:42:38.2805908Z screenshot_saturnx_invisibility was put in data/screenshots_new
+2022-10-27T05:42:38.2806525Z
+2022-10-27T05:42:38.2807422Z [1;32mPASS[0m /datum/unit_test/screenshot_saturnx 0.2s
+2022-10-27T05:42:38.2808381Z ##[endgroup]
+2022-10-27T05:42:38.5125108Z ##[group]/datum/unit_test/security_officer_roundstart_distribution
+2022-10-27T05:42:38.6313313Z
+2022-10-27T05:42:38.6314073Z [1;32mPASS[0m /datum/unit_test/security_officer_roundstart_distribution 0.1s
+2022-10-27T05:42:38.6314848Z ##[endgroup]
+2022-10-27T05:42:38.7844382Z ##[group]/datum/unit_test/security_officer_latejoin_distribution
+2022-10-27T05:42:39.3108839Z
+2022-10-27T05:42:39.3109578Z [1;32mPASS[0m /datum/unit_test/security_officer_latejoin_distribution 0.5s
+2022-10-27T05:42:39.3110392Z ##[endgroup]
+2022-10-27T05:42:39.8689626Z ##[group]/datum/unit_test/security_levels
+2022-10-27T05:42:39.8691007Z
+2022-10-27T05:42:39.8692358Z [1;32mPASS[0m /datum/unit_test/security_levels 0s
+2022-10-27T05:42:39.8694155Z ##[endgroup]
+2022-10-27T05:42:39.8954646Z ##[group]/datum/unit_test/servingtray
+2022-10-27T05:42:39.9246160Z
+2022-10-27T05:42:39.9246828Z [1;32mPASS[0m /datum/unit_test/servingtray 0.1s
+2022-10-27T05:42:39.9247596Z ##[endgroup]
+2022-10-27T05:42:39.9527510Z ##[group]/datum/unit_test/simple_animal_freeze
+2022-10-27T05:42:39.9538858Z
+2022-10-27T05:42:39.9539579Z [1;32mPASS[0m /datum/unit_test/simple_animal_freeze 0s
+2022-10-27T05:42:39.9540575Z ##[endgroup]
+2022-10-27T05:42:39.9737208Z ##[group]/datum/unit_test/siunit
+2022-10-27T05:42:39.9737877Z
+2022-10-27T05:42:39.9739067Z [1;32mPASS[0m /datum/unit_test/siunit 0s
+2022-10-27T05:42:39.9739970Z ##[endgroup]
+2022-10-27T05:42:40.0059889Z ##[group]/datum/unit_test/slips
+2022-10-27T05:42:40.0605319Z
+2022-10-27T05:42:40.0606405Z [1;32mPASS[0m /datum/unit_test/slips 0s
+2022-10-27T05:42:40.0608008Z ##[endgroup]
+2022-10-27T05:42:40.1167017Z ##[group]/datum/unit_test/spawn_humans
+2022-10-27T05:42:45.1906375Z
+2022-10-27T05:42:45.1907903Z [1;32mPASS[0m /datum/unit_test/spawn_humans 5s
+2022-10-27T05:42:45.1910749Z ##[endgroup]
+2022-10-27T05:42:45.2427283Z ##[group]/datum/unit_test/spawn_mobs
+2022-10-27T05:42:45.3357801Z
+2022-10-27T05:42:45.3359033Z [1;32mPASS[0m /datum/unit_test/spawn_mobs 0.1s
+2022-10-27T05:42:45.3361725Z ##[endgroup]
+2022-10-27T05:42:45.5043702Z ##[group]/datum/unit_test/species_change_clothing
+2022-10-27T05:42:45.6048589Z
+2022-10-27T05:42:45.6049694Z [1;32mPASS[0m /datum/unit_test/species_change_clothing 0.1s
+2022-10-27T05:42:45.6051771Z ##[endgroup]
+2022-10-27T05:42:45.6837595Z ##[group]/datum/unit_test/species_change_organs
+2022-10-27T05:42:45.7545977Z
+2022-10-27T05:42:45.7546831Z [1;32mPASS[0m /datum/unit_test/species_change_organs 0.1s
+2022-10-27T05:42:45.7547563Z ##[endgroup]
+2022-10-27T05:42:45.7836582Z ##[group]/datum/unit_test/species_config_sanity
+2022-10-27T05:42:45.7840840Z
+2022-10-27T05:42:45.7842768Z [1;32mPASS[0m /datum/unit_test/species_config_sanity 0s
+2022-10-27T05:42:45.7844337Z ##[endgroup]
+2022-10-27T05:42:45.8022187Z ##[group]/datum/unit_test/species_unique_id
+2022-10-27T05:42:45.8022866Z
+2022-10-27T05:42:45.8075321Z [1;32mPASS[0m /datum/unit_test/species_unique_id 0s
+2022-10-27T05:42:45.8076400Z ##[endgroup]
+2022-10-27T05:42:45.8351362Z ##[group]/datum/unit_test/species_whitelist_check
+2022-10-27T05:42:45.8351724Z
+2022-10-27T05:42:45.8352365Z [1;32mPASS[0m /datum/unit_test/species_whitelist_check 0s
+2022-10-27T05:42:45.8353142Z ##[endgroup]
+2022-10-27T05:42:45.8533484Z ##[group]/datum/unit_test/spell_invocations
+2022-10-27T05:42:45.8533768Z
+2022-10-27T05:42:45.8534255Z [1;32mPASS[0m /datum/unit_test/spell_invocations 0s
+2022-10-27T05:42:45.8534811Z ##[endgroup]
+2022-10-27T05:42:45.8839364Z ##[group]/datum/unit_test/mind_swap_spell
+2022-10-27T05:42:45.9396663Z
+2022-10-27T05:42:45.9397306Z [1;32mPASS[0m /datum/unit_test/mind_swap_spell 0.1s
+2022-10-27T05:42:45.9397999Z ##[endgroup]
+2022-10-27T05:42:45.9707938Z ##[group]/datum/unit_test/spell_names
+2022-10-27T05:42:45.9708233Z
+2022-10-27T05:42:45.9708764Z [1;32mPASS[0m /datum/unit_test/spell_names 0s
+2022-10-27T05:42:45.9709443Z ##[endgroup]
+2022-10-27T05:42:45.9892272Z ##[group]/datum/unit_test/shapeshift_spell_validity
+2022-10-27T05:42:45.9896681Z
+2022-10-27T05:42:45.9897201Z [1;32mPASS[0m /datum/unit_test/shapeshift_spell_validity 0s
+2022-10-27T05:42:45.9897727Z ##[endgroup]
+2022-10-27T05:42:46.0425278Z ##[group]/datum/unit_test/shapeshift_spell
+2022-10-27T05:42:46.3445398Z
+2022-10-27T05:42:46.3446335Z [1;32mPASS[0m /datum/unit_test/shapeshift_spell 0.3s
+2022-10-27T05:42:46.3447239Z ##[endgroup]
+2022-10-27T05:42:46.8200052Z ##[group]/datum/unit_test/shapeshift_holoparasites
+2022-10-27T05:42:46.8537455Z
+2022-10-27T05:42:46.8539870Z [1;32mPASS[0m /datum/unit_test/shapeshift_holoparasites 0s
+2022-10-27T05:42:46.8541451Z ##[endgroup]
+2022-10-27T05:42:46.9292759Z ##[group]/datum/unit_test/spritesheets
+2022-10-27T05:42:50.5944827Z
+2022-10-27T05:42:50.5945740Z [1;32mPASS[0m /datum/unit_test/spritesheets 3.6s
+2022-10-27T05:42:50.5946612Z ##[endgroup]
+2022-10-27T05:42:57.1137055Z ##[group]/datum/unit_test/stack_singular_name
+2022-10-27T05:42:57.1142555Z
+2022-10-27T05:42:57.1145224Z [1;32mPASS[0m /datum/unit_test/stack_singular_name 0s
+2022-10-27T05:42:57.1147574Z ##[endgroup]
+2022-10-27T05:42:57.1358739Z ##[group]/datum/unit_test/stomach
+2022-10-27T05:42:57.1694838Z
+2022-10-27T05:42:57.1695603Z [1;32mPASS[0m /datum/unit_test/stomach 0s
+2022-10-27T05:42:57.1696272Z ##[endgroup]
+2022-10-27T05:42:57.1961163Z ##[group]/datum/unit_test/strip_menu_ui_status
+2022-10-27T05:42:57.2480737Z
+2022-10-27T05:42:57.2481561Z [1;32mPASS[0m /datum/unit_test/strip_menu_ui_status 0.1s
+2022-10-27T05:42:57.2483682Z ##[endgroup]
+2022-10-27T05:42:57.3124509Z ##[group]/datum/unit_test/subsystem_init
+2022-10-27T05:42:57.3124738Z
+2022-10-27T05:42:57.3127230Z [1;32mPASS[0m /datum/unit_test/subsystem_init 0s
+2022-10-27T05:42:57.3128294Z ##[endgroup]
+2022-10-27T05:42:57.3335312Z ##[group]/datum/unit_test/suit_storage_icons
+2022-10-27T05:42:59.0884928Z 1 - /obj/item/ammo_casing/shotgun using invalid worn_icon_state, "shell"
+2022-10-27T05:42:59.1022656Z 2 - /obj/item/gun/ballistic/shotgun/hook using invalid icon_state, "hookshotgun"
+2022-10-27T05:42:59.1167874Z 3 - /obj/item/gun/ballistic/automatic/surplus using invalid icon_state, "surplus"
+2022-10-27T05:42:59.1313544Z 4 - /obj/item/gun/energy/beam_rifle using invalid icon_state, "esniper"
+2022-10-27T05:42:59.1335197Z 5 - /obj/item/gun/energy/lasercannon using invalid icon_state, "lasercannon"
+2022-10-27T05:42:59.1363131Z 6 - /obj/item/gun/energy/ionrifle using invalid icon_state, "ionrifle"
+2022-10-27T05:42:59.1364702Z 7 - /obj/item/gun/energy/ionrifle/carbine using invalid icon_state, "ioncarbine"
+2022-10-27T05:42:59.1507295Z 8 - /obj/item/tome using invalid icon_state, "tome"
+2022-10-27T05:42:59.1546690Z 9 - /obj/item/melee/sickly_blade/void using invalid icon_state, "void_blade"
+2022-10-27T05:42:59.1558801Z 10 - /obj/item/nullrod/staff using invalid icon_state, "godstaff-red"
+2022-10-27T05:42:59.1561300Z 11 - /obj/item/nullrod/staff/blue using invalid icon_state, "godstaff-blue"
+2022-10-27T05:42:59.1647859Z 12 - /obj/item/nullrod/tribal_knife using invalid icon_state, "crysknife"
+2022-10-27T05:42:59.1657290Z 13 - /obj/item/nullrod/spear using invalid icon_state, "ratvarian_spear"
+2022-10-27T05:42:59.1666968Z 14 - /obj/item/candle using invalid icon_state, "candle1"
+2022-10-27T05:42:59.2050751Z 15 - /obj/item/toy/eightball using invalid icon_state, "eightball"
+2022-10-27T05:42:59.2053756Z 16 - /obj/item/toy/mecha using invalid icon_state, "fivestarstoy"
+2022-10-27T05:42:59.2055847Z 17 - /obj/item/toy/mecha/ripley using invalid icon_state, "ripleytoy"
+2022-10-27T05:42:59.2058896Z 18 - /obj/item/toy/mecha/ripleymkii using invalid icon_state, "ripleymkiitoy"
+2022-10-27T05:42:59.2061681Z 19 - /obj/item/toy/mecha/hauler using invalid icon_state, "haulertoy"
+2022-10-27T05:42:59.2064463Z 20 - /obj/item/toy/mecha/clarke using invalid icon_state, "clarketoy"
+2022-10-27T05:42:59.2067351Z 21 - /obj/item/toy/mecha/odysseus using invalid icon_state, "odysseustoy"
+2022-10-27T05:42:59.2069885Z 22 - /obj/item/toy/mecha/gygax using invalid icon_state, "gygaxtoy"
+2022-10-27T05:42:59.2072424Z 23 - /obj/item/toy/mecha/durand using invalid icon_state, "durandtoy"
+2022-10-27T05:42:59.2075046Z 24 - /obj/item/toy/mecha/savannahivanov using invalid icon_state, "savannahivanovtoy"
+2022-10-27T05:42:59.2077536Z 25 - /obj/item/toy/mecha/phazon using invalid icon_state, "phazontoy"
+2022-10-27T05:42:59.2080032Z 26 - /obj/item/toy/mecha/honk using invalid icon_state, "honktoy"
+2022-10-27T05:42:59.2083569Z 27 - /obj/item/toy/mecha/darkgygax using invalid icon_state, "darkgygaxtoy"
+2022-10-27T05:42:59.2085844Z 28 - /obj/item/toy/mecha/mauler using invalid icon_state, "maulertoy"
+2022-10-27T05:42:59.2088536Z 29 - /obj/item/toy/mecha/darkhonk using invalid icon_state, "darkhonktoy"
+2022-10-27T05:42:59.2091361Z 30 - /obj/item/toy/mecha/deathripley using invalid icon_state, "deathripleytoy"
+2022-10-27T05:42:59.2094603Z 31 - /obj/item/toy/mecha/reticence using invalid icon_state, "reticencetoy"
+2022-10-27T05:42:59.2096993Z 32 - /obj/item/toy/mecha/marauder using invalid icon_state, "maraudertoy"
+2022-10-27T05:42:59.2099775Z 33 - /obj/item/toy/mecha/seraph using invalid icon_state, "seraphtoy"
+2022-10-27T05:42:59.2102793Z 34 - /obj/item/toy/mecha/firefighter using invalid icon_state, "firefightertoy"
+2022-10-27T05:42:59.2105424Z 35 - /obj/item/toy/waterballoon using invalid icon_state, "waterballoon-e"
+2022-10-27T05:42:59.2107991Z 36 - /obj/item/toy/balloon using invalid icon_state, "balloon"
+2022-10-27T05:42:59.2111052Z 37 - /obj/item/toy/balloon/corgi using invalid icon_state, "corgi"
+2022-10-27T05:42:59.2113846Z 38 - /obj/item/toy/balloon/syndicate using invalid icon_state, "syndballoon"
+2022-10-27T05:42:59.2116990Z 39 - /obj/item/toy/balloon/arrest using invalid icon_state, "arrestballoon"
+2022-10-27T05:42:59.2119545Z 40 - /obj/item/toy/captainsaid using invalid icon_state, "captainsaid_off"
+2022-10-27T05:42:59.2122005Z 41 - /obj/item/toy/spinningtoy using invalid icon_state, "singularity_s1"
+2022-10-27T05:42:59.2127416Z 42 - /obj/item/toy/ammo/gun using invalid icon_state, "357OLD-7"
+2022-10-27T05:42:59.2130032Z 43 - /obj/item/toy/sword using invalid icon_state, "e_sword"
+2022-10-27T05:42:59.2132828Z 44 - /obj/item/toy/foamblade using invalid icon_state, "foamblade"
+2022-10-27T05:42:59.2135633Z 45 - /obj/item/toy/windup_toolbox using invalid icon_state, "green"
+2022-10-27T05:42:59.2141209Z 46 - /obj/item/toy/snappop using invalid icon_state, "snappop"
+2022-10-27T05:42:59.2144552Z 47 - /obj/item/toy/talking using invalid icon_state, "owlprize"
+2022-10-27T05:42:59.2146583Z 48 - /obj/item/toy/talking/ai using invalid icon_state, "AI"
+2022-10-27T05:42:59.2149175Z 49 - /obj/item/toy/talking/codex_gigas using invalid icon_state, "demonomicon"
+2022-10-27T05:42:59.2151786Z 50 - /obj/item/toy/talking/griffin using invalid icon_state, "griffinprize"
+2022-10-27T05:42:59.2155964Z 51 - /obj/item/toy/nuke using invalid icon_state, "nuketoyidle"
+2022-10-27T05:42:59.2157504Z 52 - /obj/item/toy/minimeteor using invalid icon_state, "minimeteor"
+2022-10-27T05:42:59.2160224Z 53 - /obj/item/toy/redbutton using invalid icon_state, "bigred"
+2022-10-27T05:42:59.2163069Z 54 - /obj/item/toy/snowball using invalid icon_state, "snowball"
+2022-10-27T05:42:59.2165858Z 55 - /obj/item/toy/beach_ball using invalid icon_state, "ball"
+2022-10-27T05:42:59.2168809Z 56 - /obj/item/toy/beach_ball/baseball using invalid icon_state, "baseball"
+2022-10-27T05:42:59.2171419Z 57 - /obj/item/toy/beach_ball/holoball using invalid icon_state, "basketball"
+2022-10-27T05:42:59.2174156Z 58 - /obj/item/toy/beach_ball/holoball/dodgeball using invalid icon_state, "dodgeball"
+2022-10-27T05:42:59.2182197Z 59 - /obj/item/toy/toy_xeno using invalid icon_state, "toy_xeno"
+2022-10-27T05:42:59.2185181Z 60 - /obj/item/toy/cattoy using invalid icon_state, "toy_mouse"
+2022-10-27T05:42:59.2187605Z 61 - /obj/item/toy/figure using invalid icon_state, "nuketoy"
+2022-10-27T05:42:59.2190489Z 62 - /obj/item/toy/figure/cmo using invalid icon_state, "cmo"
+2022-10-27T05:42:59.2193253Z 63 - /obj/item/toy/figure/assistant using invalid icon_state, "assistant"
+2022-10-27T05:42:59.2196041Z 64 - /obj/item/toy/figure/atmos using invalid icon_state, "atmos"
+2022-10-27T05:42:59.2198863Z 65 - /obj/item/toy/figure/bartender using invalid icon_state, "bartender"
+2022-10-27T05:42:59.2201614Z 66 - /obj/item/toy/figure/borg using invalid icon_state, "borg"
+2022-10-27T05:42:59.2204442Z 67 - /obj/item/toy/figure/botanist using invalid icon_state, "botanist"
+2022-10-27T05:42:59.2207240Z 68 - /obj/item/toy/figure/captain using invalid icon_state, "captain"
+2022-10-27T05:42:59.2210113Z 69 - /obj/item/toy/figure/cargotech using invalid icon_state, "cargotech"
+2022-10-27T05:42:59.2212868Z 70 - /obj/item/toy/figure/ce using invalid icon_state, "ce"
+2022-10-27T05:42:59.2215699Z 71 - /obj/item/toy/figure/chaplain using invalid icon_state, "chaplain"
+2022-10-27T05:42:59.2218625Z 72 - /obj/item/toy/figure/chef using invalid icon_state, "chef"
+2022-10-27T05:42:59.2221486Z 73 - /obj/item/toy/figure/chemist using invalid icon_state, "chemist"
+2022-10-27T05:42:59.2224313Z 74 - /obj/item/toy/figure/clown using invalid icon_state, "clown"
+2022-10-27T05:42:59.2227123Z 75 - /obj/item/toy/figure/ian using invalid icon_state, "ian"
+2022-10-27T05:42:59.2229950Z 76 - /obj/item/toy/figure/detective using invalid icon_state, "detective"
+2022-10-27T05:42:59.2232724Z 77 - /obj/item/toy/figure/dsquad using invalid icon_state, "dsquad"
+2022-10-27T05:42:59.2236741Z 78 - /obj/item/toy/figure/engineer using invalid icon_state, "engineer"
+2022-10-27T05:42:59.2239402Z 79 - /obj/item/toy/figure/geneticist using invalid icon_state, "geneticist"
+2022-10-27T05:42:59.2242217Z 80 - /obj/item/toy/figure/hop using invalid icon_state, "hop"
+2022-10-27T05:42:59.2245674Z 81 - /obj/item/toy/figure/hos using invalid icon_state, "hos"
+2022-10-27T05:42:59.2247841Z 82 - /obj/item/toy/figure/qm using invalid icon_state, "qm"
+2022-10-27T05:42:59.2250699Z 83 - /obj/item/toy/figure/janitor using invalid icon_state, "janitor"
+2022-10-27T05:42:59.2253421Z 84 - /obj/item/toy/figure/lawyer using invalid icon_state, "lawyer"
+2022-10-27T05:42:59.2256926Z 85 - /obj/item/toy/figure/curator using invalid icon_state, "curator"
+2022-10-27T05:42:59.2260176Z 86 - /obj/item/toy/figure/md using invalid icon_state, "md"
+2022-10-27T05:42:59.2262399Z 87 - /obj/item/toy/figure/paramedic using invalid icon_state, "paramedic"
+2022-10-27T05:42:59.2265225Z 88 - /obj/item/toy/figure/psychologist using invalid icon_state, "psychologist"
+2022-10-27T05:42:59.2268046Z 89 - /obj/item/toy/figure/prisoner using invalid icon_state, "prisoner"
+2022-10-27T05:42:59.2270732Z 90 - /obj/item/toy/figure/mime using invalid icon_state, "mime"
+2022-10-27T05:42:59.2273548Z 91 - /obj/item/toy/figure/miner using invalid icon_state, "miner"
+2022-10-27T05:42:59.2276353Z 92 - /obj/item/toy/figure/ninja using invalid icon_state, "ninja"
+2022-10-27T05:42:59.2279783Z 93 - /obj/item/toy/figure/wizard using invalid icon_state, "wizard"
+2022-10-27T05:42:59.2281951Z 94 - /obj/item/toy/figure/rd using invalid icon_state, "rd"
+2022-10-27T05:42:59.2284816Z 95 - /obj/item/toy/figure/roboticist using invalid icon_state, "roboticist"
+2022-10-27T05:42:59.2287567Z 96 - /obj/item/toy/figure/scientist using invalid icon_state, "scientist"
+2022-10-27T05:42:59.2290280Z 97 - /obj/item/toy/figure/syndie using invalid icon_state, "syndie"
+2022-10-27T05:42:59.2293161Z 98 - /obj/item/toy/figure/secofficer using invalid icon_state, "secofficer"
+2022-10-27T05:42:59.2295983Z 99 - /obj/item/toy/figure/virologist using invalid icon_state, "virologist"
+2022-10-27T05:42:59.2298894Z 100 - /obj/item/toy/figure/warden using invalid icon_state, "warden"
+2022-10-27T05:42:59.2301934Z 101 - /obj/item/toy/dummy using invalid icon_state, "puppet"
+2022-10-27T05:42:59.2304886Z 102 - /obj/item/toy/seashell using invalid icon_state, "shell1"
+2022-10-27T05:42:59.2307528Z 103 - /obj/item/toy/brokenradio using invalid icon_state, "broken_radio"
+2022-10-27T05:42:59.2310163Z 104 - /obj/item/toy/braintoy using invalid icon_state, "brain-old"
+2022-10-27T05:42:59.2315630Z 105 - /obj/item/toy/reality_pierce using invalid icon_state, "pierced_illusion"
+2022-10-27T05:42:59.2318230Z 106 - /obj/item/toy/foamfinger using invalid icon_state, "foamfinger"
+2022-10-27T05:42:59.2320978Z 107 - /obj/item/toy/intento using invalid icon_state, "blank"
+2022-10-27T05:42:59.2380048Z 108 - /obj/item/toy/sprayoncan using invalid icon_state, "sprayoncan"
+2022-10-27T05:42:59.2380659Z 109 - /obj/item/toy/xmas_cracker using invalid icon_state, "cracker"
+2022-10-27T05:42:59.2381172Z 110 - /obj/item/cultivator/rake using invalid icon_state, "rake"
+2022-10-27T05:42:59.2381690Z 111 - /obj/item/hatchet/wooden using invalid icon_state, "woodhatchet"
+2022-10-27T05:42:59.2382240Z 112 - /obj/item/hatchet/cutterblade using invalid icon_state, "cutterblade"
+2022-10-27T05:42:59.3124390Z 113 - /obj/item/reagent_containers/hypospray/medipen using invalid worn_icon_state, "medipen"
+2022-10-27T05:42:59.3278187Z 114 - /obj/item/storage/pill_bottle using invalid icon_state, "pill_canister"
+2022-10-27T05:42:59.3287606Z 115 - /obj/item/analyzer/ranged using invalid icon_state, "analyzerranged"
+2022-10-27T05:42:59.3880589Z 116 - /obj/item/organ/internal/regenerative_core/legion using invalid icon_state, "legion_soul"
+2022-10-27T05:42:59.3891926Z 117 - /obj/item/spear/bamboospear using invalid icon_state, "bamboo_spear0"
+2022-10-27T05:42:59.3936485Z 118 - /obj/item/abductor/gizmo using invalid icon_state, "gizmo_scan"
+2022-10-27T05:42:59.3938721Z 119 - /obj/item/abductor/silencer using invalid icon_state, "silencer"
+2022-10-27T05:42:59.3939330Z 120 - /obj/item/abductor/mind_device using invalid icon_state, "mind_device_message"
+2022-10-27T05:42:59.3955530Z 121 - /obj/item/claymore/cutlass using invalid worn_icon_state, "cutlass"
+2022-10-27T05:42:59.3960287Z 122 - /obj/item/claymore/highlander/robot using invalid icon_state, "claymore_cyborg"
+2022-10-27T05:42:59.3963042Z 123 - /obj/item/banner using invalid icon_state, "banner"
+2022-10-27T05:42:59.3966004Z 124 - /obj/item/banner/security using invalid icon_state, "banner_security"
+2022-10-27T05:42:59.3968500Z 125 - /obj/item/banner/medical using invalid icon_state, "banner_medical"
+2022-10-27T05:42:59.3971572Z 126 - /obj/item/banner/science using invalid icon_state, "banner_science"
+2022-10-27T05:42:59.3974330Z 127 - /obj/item/banner/cargo using invalid icon_state, "banner_cargo"
+2022-10-27T05:42:59.3977163Z 128 - /obj/item/banner/engineering using invalid icon_state, "banner_engineering"
+2022-10-27T05:42:59.3980201Z 129 - /obj/item/banner/red using invalid icon_state, "banner-red"
+2022-10-27T05:42:59.3983133Z 130 - /obj/item/banner/blue using invalid icon_state, "banner-blue"
+2022-10-27T05:42:59.4023342Z 131 - /obj/item/gun/magic/staff using invalid icon_state, "staff"
+2022-10-27T05:42:59.4025602Z 132 - /obj/item/gun/magic/staff/change using invalid icon_state, "staffofchange"
+2022-10-27T05:42:59.4028458Z 133 - /obj/item/gun/magic/staff/animate using invalid icon_state, "staffofanimation"
+2022-10-27T05:42:59.4031283Z 134 - /obj/item/gun/magic/staff/healing using invalid icon_state, "staffofhealing"
+2022-10-27T05:42:59.4034153Z 135 - /obj/item/gun/magic/staff/chaos using invalid icon_state, "staffofchaos"
+2022-10-27T05:42:59.4036955Z 136 - /obj/item/gun/magic/staff/door using invalid icon_state, "staffofdoor"
+2022-10-27T05:42:59.4039732Z 137 - /obj/item/gun/magic/staff/honk using invalid icon_state, "honker"
+2022-10-27T05:42:59.4045070Z 138 - /obj/item/gun/magic/staff/locker using invalid worn_icon_state, "lockerstaff"
+2022-10-27T05:42:59.4047723Z 139 - /obj/item/gun/magic/staff/flying using invalid worn_icon_state, "flightstaff"
+2022-10-27T05:42:59.4050532Z 140 - /obj/item/gun/magic/staff/babel using invalid worn_icon_state, "babelstaff"
+2022-10-27T05:42:59.4053458Z 141 - /obj/item/gun/magic/staff/necropotence using invalid worn_icon_state, "necrostaff"
+2022-10-27T05:42:59.4056307Z 142 - /obj/item/gun/magic/staff/wipe using invalid worn_icon_state, "wipestaff"
+2022-10-27T05:42:59.4075733Z 143 - /obj/item/melee/energy/sword/pirate using invalid icon_state, "e_cutlass"
+2022-10-27T05:42:59.4078221Z 144 - /obj/item/clothing/glasses/eyepatch using invalid icon_state, "eyepatch"
+2022-10-27T05:42:59.4083656Z 145 - /obj/item/melee/energy/sword/cyborg/saw using invalid icon_state, "esaw"
+2022-10-27T05:42:59.4096186Z 146 - /obj/item/tank/jetpack/improvised using invalid worn_icon_state, "jetpack-improvised"
+2022-10-27T05:42:59.4103014Z 147 - /obj/item/multitool using invalid icon_state, "multitool"
+2022-10-27T05:42:59.4106594Z 148 - /obj/item/multitool/cyborg using invalid icon_state, "multitool_cyborg"
+2022-10-27T05:42:59.4108989Z 149 - /obj/item/multitool/circuit using invalid icon_state, "multitool_circuit"
+2022-10-27T05:42:59.4112331Z 150 - /obj/item/storage/bag/trash using invalid icon_state, "trashbag"
+2022-10-27T05:42:59.4114785Z 151 - /obj/item/storage/bag/trash/bluespace using invalid icon_state, "bluetrashbag"
+2022-10-27T05:42:59.4117882Z 152 - /obj/item/cane using invalid icon_state, "cane"
+2022-10-27T05:42:59.4121455Z 153 - /obj/item/cane/white using invalid icon_state, "cane_white"
+2022-10-27T05:42:59.4123404Z 154 - /obj/item/megaphone/clown using invalid icon_state, "megaphone-clown"
+2022-10-27T05:42:59.4142890Z 155 - /obj/item/food/pie/cream using invalid icon_state, "pie"
+2022-10-27T05:42:59.4157129Z 156 - /obj/item/instrument/bikehorn using invalid icon_state, "bike_horn"
+2022-10-27T05:42:59.4160055Z 157 - /obj/item/reagent_containers/cup/soda_cans/canned_laughter using invalid icon_state, "laughter"
+2022-10-27T05:42:59.4172872Z 158 - /obj/item/grown/bananapeel using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4173955Z 159 - /obj/item/grown/bananapeel/bombanana using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4174824Z 160 - /obj/item/grown/bananapeel/mimanapeel using invalid icon_state, "mimana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4176072Z 161 - /obj/item/grown/bananapeel/bluespace using invalid icon_state, "bluenana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4177252Z 162 - /obj/item/grown/bananapeel/specialpeel using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4178650Z 163 - /obj/item/food/grown/banana using invalid icon_state, "banana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4179781Z 164 - /obj/item/food/grown/banana/bombanana using invalid icon_state, "banana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4180904Z 165 - /obj/item/food/grown/banana/mime using invalid icon_state, "mimana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4182029Z 166 - /obj/item/food/grown/banana/bluespace using invalid icon_state, "bluenana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4183368Z 167 - /obj/item/food/grown/banana/bunch using invalid icon_state, "banana_bunch" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-10-27T05:42:59.4184222Z 168 - /obj/item/stack/spacecash/c1 using invalid icon_state, "spacecash1"
+2022-10-27T05:42:59.4188146Z 169 - /obj/item/stack/spacecash/c10 using invalid icon_state, "spacecash10"
+2022-10-27T05:42:59.4191119Z 170 - /obj/item/stack/spacecash/c20 using invalid icon_state, "spacecash20"
+2022-10-27T05:42:59.4194008Z 171 - /obj/item/stack/spacecash/c50 using invalid icon_state, "spacecash50"
+2022-10-27T05:42:59.4196852Z 172 - /obj/item/stack/spacecash/c100 using invalid icon_state, "spacecash100"
+2022-10-27T05:42:59.4199667Z 173 - /obj/item/stack/spacecash/c200 using invalid icon_state, "spacecash200"
+2022-10-27T05:42:59.4202843Z 174 - /obj/item/stack/spacecash/c500 using invalid icon_state, "spacecash500"
+2022-10-27T05:42:59.4205536Z 175 - /obj/item/stack/spacecash/c1000 using invalid icon_state, "spacecash1000"
+2022-10-27T05:42:59.4208409Z 176 - /obj/item/stack/spacecash/c10000 using invalid icon_state, "spacecash10000"
+2022-10-27T05:42:59.4211295Z 177 - /obj/item/clothing/mask/facehugger/toy using invalid worn_icon_state, "facehugger"
+2022-10-27T05:42:59.4221553Z 178 - /obj/item/kitchen/fork using invalid icon_state, "fork"
+2022-10-27T05:42:59.4224344Z 179 - /obj/item/kitchen/fork/plastic using invalid icon_state, "plastic_fork"
+2022-10-27T05:42:59.4231841Z 180 - /obj/item/kitchen/spoon using invalid icon_state, "spoon"
+2022-10-27T05:42:59.4234746Z 181 - /obj/item/kitchen/spoon/plastic using invalid icon_state, "plastic_spoon"
+2022-10-27T05:42:59.4242352Z 182 - /obj/item/bonesetter using invalid icon_state, "bonesetter"
+2022-10-27T05:42:59.4244975Z 183 - /obj/item/cautery using invalid icon_state, "cautery"
+2022-10-27T05:42:59.4247875Z 184 - /obj/item/cautery/advanced using invalid icon_state, "e_cautery"
+2022-10-27T05:42:59.4250639Z 185 - /obj/item/hemostat using invalid icon_state, "hemostat"
+2022-10-27T05:42:59.4253571Z 186 - /obj/item/hemostat/supermatter using invalid icon_state, "supermatter_tongs"
+2022-10-27T05:42:59.4256376Z 187 - /obj/item/retractor using invalid icon_state, "retractor"
+2022-10-27T05:42:59.4259443Z 188 - /obj/item/retractor/advanced using invalid icon_state, "adv_retractor"
+2022-10-27T05:42:59.4262427Z 189 - /obj/item/scalpel using invalid icon_state, "scalpel"
+2022-10-27T05:42:59.4265163Z 190 - /obj/item/scalpel/supermatter using invalid icon_state, "supermatter_scalpel"
+2022-10-27T05:42:59.4268021Z 191 - /obj/item/scalpel/advanced using invalid icon_state, "e_scalpel"
+2022-10-27T05:42:59.4271061Z 192 - /obj/item/surgical_drapes using invalid icon_state, "surgical_drapes"
+2022-10-27T05:42:59.4277210Z 193 - /obj/item/stack/medical/bruise_pack using invalid icon_state, "brutepack"
+2022-10-27T05:42:59.4279201Z 194 - /obj/item/stack/medical/gauze using invalid icon_state, "gauze"
+2022-10-27T05:42:59.4283526Z 195 - /obj/item/stack/medical/suture using invalid icon_state, "suture"
+2022-10-27T05:42:59.4286019Z 196 - /obj/item/stack/medical/suture/medicated using invalid icon_state, "suture_purp"
+2022-10-27T05:42:59.4288604Z 197 - /obj/item/stack/medical/ointment using invalid icon_state, "ointment"
+2022-10-27T05:42:59.4291557Z 198 - /obj/item/stack/medical/mesh using invalid icon_state, "regen_mesh"
+2022-10-27T05:42:59.4294469Z 199 - /obj/item/stack/medical/mesh/advanced using invalid icon_state, "aloe_mesh"
+2022-10-27T05:42:59.4297194Z 200 - /obj/item/stack/medical/aloe using invalid icon_state, "aloe_paste"
+2022-10-27T05:42:59.4300231Z 201 - /obj/item/stack/medical/bone_gel using invalid icon_state, "bone-gel"
+2022-10-27T05:42:59.4303320Z 202 - /obj/item/stack/medical/poultice using invalid icon_state, "poultice"
+2022-10-27T05:42:59.4305972Z 203 - /obj/item/assembly/flash/handheld using invalid icon_state, "flash"
+2022-10-27T05:42:59.4309092Z 204 - /obj/item/clothing/mask/cigarette using invalid icon_state, "cigoff"
+2022-10-27T05:42:59.4313422Z 205 - /obj/item/clothing/mask/cigarette/rollie using invalid icon_state, "spliffoff"
+2022-10-27T05:42:59.4316203Z 206 - /obj/item/clothing/mask/cigarette/candy using invalid icon_state, "candyoff"
+2022-10-27T05:42:59.4319067Z 207 - /obj/item/clothing/mask/cigarette/cigar using invalid icon_state, "cigaroff"
+2022-10-27T05:42:59.4321949Z 208 - /obj/item/clothing/mask/cigarette/cigar/cohiba using invalid icon_state, "cigar2off"
+2022-10-27T05:42:59.4324829Z 209 - /obj/item/clothing/mask/cigarette/pipe using invalid icon_state, "pipeoff"
+2022-10-27T05:42:59.4327646Z 210 - /obj/item/clothing/mask/cigarette/pipe/cobpipe using invalid icon_state, "cobpipeoff"
+2022-10-27T05:42:59.4330391Z 211 - /obj/item/disk using invalid icon_state, "datadisk0"
+2022-10-27T05:42:59.4333368Z 212 - /obj/item/disk/holodisk using invalid icon_state, "holodisk"
+2022-10-27T05:42:59.4336344Z 213 - /obj/item/disk/nuclear using invalid icon_state, "nucleardisk"
+2022-10-27T05:42:59.4339645Z 214 - /obj/item/disk/surgery using invalid icon_state, "datadisk1"
+2022-10-27T05:42:59.4342883Z 215 - /obj/item/disk/cargo/bluespace_pod using invalid icon_state, "cargodisk"
+2022-10-27T05:42:59.4345896Z 216 - /obj/item/disk/tech_disk/major using invalid icon_state, "rndmajordisk"
+2022-10-27T05:42:59.4348806Z 217 - /obj/item/melee/powerfist using invalid icon_state, "powerfist"
+2022-10-27T05:42:59.4358739Z 218 - /obj/item/melee/skateboard using invalid icon_state, "skateboard"
+2022-10-27T05:42:59.4361970Z 219 - /obj/item/melee/skateboard/pro using invalid icon_state, "skateboard2"
+2022-10-27T05:42:59.4371577Z 220 - /obj/item/melee/skateboard/hoverboard using invalid icon_state, "hoverboard_red"
+2022-10-27T05:42:59.4372651Z 221 - /obj/item/melee/skateboard/hoverboard/admin using invalid icon_state, "hoverboard_nt"
+2022-10-27T05:42:59.4373753Z 222 - /obj/item/melee/baseball_bat using invalid icon_state, "baseball_bat"
+2022-10-27T05:42:59.4374699Z 223 - /obj/item/melee/baseball_bat/homerun using invalid icon_state, "baseball_bat_home"
+2022-10-27T05:42:59.4376875Z 224 - /obj/item/melee/baseball_bat/ablative using invalid icon_state, "baseball_bat_metal"
+2022-10-27T05:42:59.4379802Z 225 - /obj/item/melee/flyswatter using invalid icon_state, "flyswatter"
+2022-10-27T05:42:59.4386397Z 226 - /obj/item/melee/energy/axe using invalid icon_state, "axe"
+2022-10-27T05:42:59.4389295Z 227 - /obj/item/melee/energy/blade using invalid icon_state, "blade"
+2022-10-27T05:42:59.4392359Z 228 - /obj/item/melee/energy/blade/hardlight using invalid icon_state, "lightblade"
+2022-10-27T05:42:59.4396069Z 229 - /obj/item/melee/synthetic_arm_blade using invalid icon_state, "arm_blade"
+2022-10-27T05:42:59.4398671Z 230 - /obj/item/melee/sabre using invalid icon_state, "sabre"
+2022-10-27T05:42:59.4403118Z 231 - /obj/item/melee/beesword using invalid worn_icon_state, "stinger"
+2022-10-27T05:42:59.4404484Z 232 - /obj/item/melee/supermatter_sword using invalid icon_state, "supermatter_sword"
+2022-10-27T05:42:59.4413439Z 233 - /obj/item/melee/cleric_mace using invalid worn_icon_state, "default_worn"
+2022-10-27T05:42:59.4416300Z 234 - /obj/item/melee/rune_carver using invalid icon_state, "rune_carver"
+2022-10-27T05:42:59.4419326Z 235 - /obj/item/melee/ghost_sword using invalid icon_state, "spectral"
+2022-10-27T05:42:59.4422471Z 236 - /obj/item/reagent_containers/cup/glass/flask using invalid icon_state, "flask"
+2022-10-27T05:42:59.4425277Z 237 - /obj/item/reagent_containers/cup/glass/flask/gold using invalid icon_state, "flask_gold"
+2022-10-27T05:42:59.4428045Z 238 - /obj/item/reagent_containers/cup/glass/flask/det using invalid icon_state, "detflask"
+2022-10-27T05:42:59.4430826Z 239 - /obj/item/stamp using invalid icon_state, "stamp-ok"
+2022-10-27T05:42:59.4438099Z 240 - /obj/item/stamp/qm using invalid icon_state, "stamp-qm"
+2022-10-27T05:42:59.4438587Z 241 - /obj/item/stamp/law using invalid icon_state, "stamp-law"
+2022-10-27T05:42:59.4439459Z 242 - /obj/item/stamp/captain using invalid icon_state, "stamp-cap"
+2022-10-27T05:42:59.4443481Z 243 - /obj/item/stamp/hop using invalid icon_state, "stamp-hop"
+2022-10-27T05:42:59.4446324Z 244 - /obj/item/stamp/hos using invalid icon_state, "stamp-hos"
+2022-10-27T05:42:59.4448968Z 245 - /obj/item/stamp/ce using invalid icon_state, "stamp-ce"
+2022-10-27T05:42:59.4451579Z 246 - /obj/item/stamp/rd using invalid icon_state, "stamp-rd"
+2022-10-27T05:42:59.4454530Z 247 - /obj/item/stamp/cmo using invalid icon_state, "stamp-cmo"
+2022-10-27T05:42:59.4457121Z 248 - /obj/item/stamp/denied using invalid icon_state, "stamp-deny"
+2022-10-27T05:42:59.4460087Z 249 - /obj/item/stamp/void using invalid icon_state, "stamp-void"
+2022-10-27T05:42:59.4463223Z 250 - /obj/item/stamp/clown using invalid icon_state, "stamp-clown"
+2022-10-27T05:42:59.4465824Z 251 - /obj/item/stamp/mime using invalid icon_state, "stamp-mime"
+2022-10-27T05:42:59.4468654Z 252 - /obj/item/stamp/chap using invalid icon_state, "stamp-chap"
+2022-10-27T05:42:59.4471480Z 253 - /obj/item/stamp/centcom using invalid icon_state, "stamp-centcom"
+2022-10-27T05:42:59.4474941Z 254 - /obj/item/stamp/syndicate using invalid icon_state, "stamp-syndicate"
+2022-10-27T05:42:59.4479594Z 255 - /obj/item/storage/lockbox/medal using invalid icon_state, "medalbox+l"
+2022-10-27T05:42:59.4487494Z 256 - /obj/item/crowbar/red/caravan using invalid icon_state, "crowbar_caravan"
+2022-10-27T05:42:59.4509453Z 257 - /obj/item/crowbar/drone using invalid icon_state, "crowbar_cyborg"
+2022-10-27T05:42:59.4528797Z
+2022-10-27T05:42:59.4529293Z [1;32mPASS[0m /datum/unit_test/suit_storage_icons 2.1s
+2022-10-27T05:42:59.4529946Z ##[endgroup]
+2022-10-27T05:43:01.5221964Z ##[group]/datum/unit_test/amputation
+2022-10-27T05:43:01.5815196Z
+2022-10-27T05:43:01.5817573Z [1;32mPASS[0m /datum/unit_test/amputation 0s
+2022-10-27T05:43:01.5819941Z ##[endgroup]
+2022-10-27T05:43:01.6143865Z ##[group]/datum/unit_test/brain_surgery
+2022-10-27T05:43:01.6698394Z
+2022-10-27T05:43:01.6699379Z [1;32mPASS[0m /datum/unit_test/brain_surgery 0s
+2022-10-27T05:43:01.6700065Z ##[endgroup]
+2022-10-27T05:43:01.7064460Z ##[group]/datum/unit_test/head_transplant
+2022-10-27T05:43:01.7910615Z
+2022-10-27T05:43:01.7911507Z [1;32mPASS[0m /datum/unit_test/head_transplant 0s
+2022-10-27T05:43:01.7912215Z ##[endgroup]
+2022-10-27T05:43:01.8771339Z ##[group]/datum/unit_test/multiple_surgeries
+2022-10-27T05:43:01.9564190Z
+2022-10-27T05:43:01.9565672Z [1;32mPASS[0m /datum/unit_test/multiple_surgeries 0.1s
+2022-10-27T05:43:01.9566988Z ##[endgroup]
+2022-10-27T05:43:02.0451694Z ##[group]/datum/unit_test/start_tend_wounds
+2022-10-27T05:43:02.1021559Z
+2022-10-27T05:43:02.1023113Z [1;32mPASS[0m /datum/unit_test/start_tend_wounds 0.1s
+2022-10-27T05:43:02.1027806Z ##[endgroup]
+2022-10-27T05:43:02.1334702Z ##[group]/datum/unit_test/tend_wounds
+2022-10-27T05:43:02.2464864Z
+2022-10-27T05:43:02.2466455Z [1;32mPASS[0m /datum/unit_test/tend_wounds 0.1s
+2022-10-27T05:43:02.2471798Z ##[endgroup]
+2022-10-27T05:43:02.3971842Z ##[group]/datum/unit_test/auto_teleporter_linking
+2022-10-27T05:43:02.4364172Z
+2022-10-27T05:43:02.4365748Z [1;32mPASS[0m /datum/unit_test/auto_teleporter_linking 0.1s
+2022-10-27T05:43:02.4367360Z ##[endgroup]
+2022-10-27T05:43:02.4786335Z ##[group]/datum/unit_test/tgui_create_message
+2022-10-27T05:43:02.4787309Z
+2022-10-27T05:43:02.4792228Z [1;32mPASS[0m /datum/unit_test/tgui_create_message 0s
+2022-10-27T05:43:02.4793589Z ##[endgroup]
+2022-10-27T05:43:02.4990140Z ##[group]/datum/unit_test/timer_sanity
+2022-10-27T05:43:02.4990770Z
+2022-10-27T05:43:02.4993590Z [1;32mPASS[0m /datum/unit_test/timer_sanity 0s
+2022-10-27T05:43:02.4994358Z ##[endgroup]
+2022-10-27T05:43:02.5179295Z ##[group]/datum/unit_test/traitor
+2022-10-27T05:43:04.3257821Z
+2022-10-27T05:43:04.3259494Z [1;32mPASS[0m /datum/unit_test/traitor 1.8s
+2022-10-27T05:43:04.3309007Z ##[endgroup]
+2022-10-27T05:43:08.2246947Z ##[group]/datum/unit_test/verify_config_tags
+2022-10-27T05:43:08.2248054Z
+2022-10-27T05:43:08.2249419Z [1;32mPASS[0m /datum/unit_test/verify_config_tags 0s
+2022-10-27T05:43:08.2250078Z ##[endgroup]
+2022-10-27T05:43:08.2441208Z ##[group]/datum/unit_test/wizard_loadout
+2022-10-27T05:43:08.3578743Z
+2022-10-27T05:43:08.3580409Z [1;32mPASS[0m /datum/unit_test/wizard_loadout 0.1s
+2022-10-27T05:43:08.3585004Z ##[endgroup]
+2022-10-27T05:43:08.5073685Z ##[group]/datum/unit_test/find_reference_sanity
+2022-10-27T05:43:08.5075807Z
+2022-10-27T05:43:08.5076772Z [1;32mPASS[0m /datum/unit_test/find_reference_sanity 0s
+2022-10-27T05:43:08.5077672Z ##[endgroup]
+2022-10-27T05:43:08.5272155Z ##[group]/datum/unit_test/find_reference_baseline
+2022-10-27T05:43:08.5274693Z
+2022-10-27T05:43:08.5275872Z [1;32mPASS[0m /datum/unit_test/find_reference_baseline 0s
+2022-10-27T05:43:08.5276640Z ##[endgroup]
+2022-10-27T05:43:08.5468423Z ##[group]/datum/unit_test/find_reference_exotic
+2022-10-27T05:43:08.5470529Z
+2022-10-27T05:43:08.5474746Z [1;32mPASS[0m /datum/unit_test/find_reference_exotic 0s
+2022-10-27T05:43:08.5475293Z ##[endgroup]
+2022-10-27T05:43:08.5665386Z ##[group]/datum/unit_test/find_reference_esoteric
+2022-10-27T05:43:08.5669399Z
+2022-10-27T05:43:08.5676075Z [1;32mPASS[0m /datum/unit_test/find_reference_esoteric 0s
+2022-10-27T05:43:08.5677072Z ##[endgroup]
+2022-10-27T05:43:08.5866537Z ##[group]/datum/unit_test/find_reference_null_key_entry
+2022-10-27T05:43:08.5868456Z
+2022-10-27T05:43:08.5869492Z [1;32mPASS[0m /datum/unit_test/find_reference_null_key_entry 0s
+2022-10-27T05:43:08.5870146Z ##[endgroup]
+2022-10-27T05:43:08.6166348Z ##[group]/datum/unit_test/find_reference_assoc_investigation
+2022-10-27T05:43:08.6171705Z
+2022-10-27T05:43:08.6172220Z [1;32mPASS[0m /datum/unit_test/find_reference_assoc_investigation 0s
+2022-10-27T05:43:08.6172854Z ##[endgroup]
+2022-10-27T05:43:08.6356029Z ##[group]/datum/unit_test/find_reference_static_investigation
+2022-10-27T05:43:08.8684547Z
+2022-10-27T05:43:08.8685577Z [1;32mPASS[0m /datum/unit_test/find_reference_static_investigation 0.2s
+2022-10-27T05:43:08.8686517Z ##[endgroup]
+2022-10-27T05:43:09.0881655Z ##[group]/datum/unit_test/monkey_business
+2022-10-27T05:43:47.8646118Z
+2022-10-27T05:43:47.8647763Z [1;32mPASS[0m /datum/unit_test/monkey_business 38.8s
+2022-10-27T05:43:47.8739017Z ##[endgroup]
+2022-10-27T05:43:50.1651558Z ##[group]/datum/unit_test/create_and_destroy
+2022-10-27T05:49:19.8716381Z ## REF SEARCH Beginning search for references to a /datum/computer_file/program/chatclient.
+2022-10-27T05:49:20.0425000Z ## REF SEARCH Finished searching globals
+2022-10-27T05:49:20.3029611Z ## REF SEARCH Finished searching native globals
+2022-10-27T05:52:18.0382074Z ## REF SEARCH Finished searching atoms
+2022-10-27T05:52:33.0757341Z ## REF SEARCH Found /datum/computer_file/program/chatclient [0x2104dfc7] in /datum/ntnet_conversation's [0x2104dfc2] operator var. Datums -> /datum/ntnet_conversation
+2022-10-27T05:52:33.0758787Z ## REF SEARCH Found /datum/computer_file/program/chatclient [0x2104dfc7] in list Datums -> /datum/ntnet_conversation [0x2104dfc2] -> active_clients (list).
+2022-10-27T05:52:33.0760039Z ## REF SEARCH Found /datum/computer_file/program/chatclient [0x2104dfc7] in list Datums -> /datum/ntnet_conversation [0x2104dfc2] -> active_clients (list).
+2022-10-27T05:52:33.0761156Z ## REF SEARCH Found /datum/computer_file/program/chatclient [0x2104dfc7] in list Datums -> /datum/ntnet_conversation [0x2104dfc2] -> active_clients (list).
+2022-10-27T05:52:33.0814898Z ## REF SEARCH Found /datum/computer_file/program/chatclient [0x2104dfc7] in list Datums -> /datum/ntnet_conversation [0x2104dfc2] -> active_clients (list).
+2022-10-27T05:52:33.0816178Z ## REF SEARCH Found /datum/computer_file/program/chatclient [0x2104dfc7] in list Datums -> /datum/ntnet_conversation [0x2104dfc2] -> active_clients (list).
+2022-10-27T05:52:34.6185349Z ## REF SEARCH Finished searching datums
+2022-10-27T05:52:34.6185815Z ## REF SEARCH Finished searching clients
+2022-10-27T05:52:34.6186331Z ## REF SEARCH Completed search for references to a /datum/computer_file/program/chatclient.
+2022-10-27T05:52:34.6187365Z ## TESTING: GC: -- [0x2104dfc7] | /datum/computer_file/program/chatclient was unable to be GC'd --
+2022-10-27T05:52:50.6232674Z ##[error]/datum/computer_file/program/chatclient hard deleted 1 times out of a total del count of 13
+2022-10-27T05:52:50.6242137Z FAILURE #1: /datum/computer_file/program/chatclient hard deleted 1 times out of a total del count of 13 at code/modules/unit_tests/create_and_destroy.dm:173
+2022-10-27T05:52:50.6242890Z ##[endgroup]
+2022-10-27T05:52:50.6244173Z ##[error][1;31mFAIL[0m /datum/unit_test/create_and_destroy 540.5s
+2022-10-27T05:52:50.6611817Z Shutting down Chat subsystem...
+2022-10-27T05:52:50.6612177Z Shutting down Init Profiler subsystem...
+2022-10-27T05:52:50.6612511Z Shutting down Ban Cache subsystem...
+2022-10-27T05:52:50.6612837Z Shutting down Stat Panels subsystem...
+2022-10-27T05:52:50.6613185Z Shutting down Explosions subsystem...
+2022-10-27T05:52:50.6613516Z Shutting down Pathfinder subsystem...
+2022-10-27T05:52:50.6613840Z Shutting down Minor Mapping subsystem...
+2022-10-27T05:52:50.6614149Z Shutting down Shuttle subsystem...
+2022-10-27T05:52:50.6614455Z Shutting down Lighting subsystem...
+2022-10-27T05:52:50.6614770Z Shutting down XKeyScore subsystem...
+2022-10-27T05:52:50.6615076Z Shutting down PRISM subsystem...
+2022-10-27T05:52:50.6636820Z Shutting down Icon Smoothing subsystem...
+2022-10-27T05:52:50.6637164Z Shutting down Assets subsystem...
+2022-10-27T05:52:50.6637453Z Shutting down Vote subsystem...
+2022-10-27T05:52:50.6637800Z Shutting down Persistent Paintings subsystem...
+2022-10-27T05:52:50.6638150Z Shutting down Persistence subsystem...
+2022-10-27T05:52:50.6638478Z Shutting down Atmospherics subsystem...
+2022-10-27T05:52:50.6638848Z Shutting down Wiremod Composite Templates subsystem...
+2022-10-27T05:52:50.6639197Z Shutting down Wet floors subsystem...
+2022-10-27T05:52:50.6639504Z Shutting down Weather subsystem...
+2022-10-27T05:52:50.6639813Z Shutting down Wardrobe subsystem...
+2022-10-27T05:52:50.6640129Z Shutting down Verb Manager subsystem...
+2022-10-27T05:52:50.6640449Z Shutting down Tram Process subsystem...
+2022-10-27T05:52:50.6640764Z Shutting down Traitor subsystem...
+2022-10-27T05:52:50.6641059Z Shutting down Throwing subsystem...
+2022-10-27T05:52:50.6641363Z Shutting down tgui subsystem...
+2022-10-27T05:52:50.6641692Z Shutting down Supermatter Cascade subsystem...
+2022-10-27T05:52:50.6642010Z Shutting down Sun subsystem...
+2022-10-27T05:52:50.6642333Z Shutting down Speech Controller subsystem...
+2022-10-27T05:52:50.6642653Z Shutting down Space Drift subsystem...
+2022-10-27T05:52:50.6642962Z Shutting down Smoke subsystem...
+2022-10-27T05:52:50.6643271Z Shutting down Singularity subsystem...
+2022-10-27T05:52:50.6643578Z Shutting down Radio subsystem...
+2022-10-27T05:52:50.6643875Z Shutting down Radiation subsystem...
+2022-10-27T05:52:50.6644483Z Shutting down Projectiles subsystem...
+2022-10-27T05:52:50.6644819Z Shutting down Processing subsystem...
+2022-10-27T05:52:50.6645158Z Shutting down Points of Interest subsystem...
+2022-10-27T05:52:50.6645489Z Shutting down Plumbing subsystem...
+2022-10-27T05:52:50.6645780Z Shutting down Ping subsystem...
+2022-10-27T05:52:50.6646088Z Shutting down Parallax subsystem...
+2022-10-27T05:52:50.6646396Z Shutting down pAI subsystem...
+2022-10-27T05:52:50.6646701Z Shutting down Overlay subsystem...
+2022-10-27T05:52:50.9809746Z Shutting down Objects subsystem...
+2022-10-27T05:52:50.9810088Z Shutting down Obj Tab Items subsystem...
+2022-10-27T05:52:50.9810410Z Shutting down NPC Pool subsystem...
+2022-10-27T05:52:50.9811012Z Shutting down Night Shift subsystem...
+2022-10-27T05:52:50.9811331Z Shutting down Movement Loops subsystem...
+2022-10-27T05:52:50.9811653Z Shutting down Movement Handler subsystem...
+2022-10-27T05:52:50.9811975Z Shutting down MouseEntered subsystem...
+2022-10-27T05:52:50.9812266Z Shutting down Mood subsystem...
+2022-10-27T05:52:50.9812709Z Shutting down Mobs subsystem...
+2022-10-27T05:52:50.9813020Z Shutting down Materials subsystem...
+2022-10-27T05:52:50.9815026Z Shutting down Lua Scripting subsystem...
+2022-10-27T05:52:50.9975219Z Shutting down Library Loading subsystem...
+2022-10-27T05:52:50.9975575Z Shutting down Lag Switch subsystem...
+2022-10-27T05:52:50.9975912Z Shutting down Idling NPC Pool subsystem...
+2022-10-27T05:52:50.9976225Z Shutting down Foam subsystem...
+2022-10-27T05:52:50.9976518Z Shutting down Fluid subsystem...
+2022-10-27T05:52:50.9976823Z Shutting down Fire Burning subsystem...
+2022-10-27T05:52:50.9977153Z Shutting down Fast Processing subsystem...
+2022-10-27T05:52:50.9977478Z Shutting down Eigenstates subsystem...
+2022-10-27T05:52:50.9977787Z Shutting down Disease subsystem...
+2022-10-27T05:52:50.9978121Z Shutting down Datum Component System subsystem...
+2022-10-27T05:52:50.9978463Z Shutting down Conveyor Belts subsystem...
+2022-10-27T05:52:50.9978939Z Shutting down Communications subsystem...
+2022-10-27T05:52:50.9979257Z Shutting down Clock Component subsystem...
+2022-10-27T05:52:50.9979599Z Shutting down Circuit Components subsystem...
+2022-10-27T05:52:50.9979926Z Shutting down Blackmarket subsystem...
+2022-10-27T05:52:50.9980248Z Shutting down Basic Avoidance subsystem...
+2022-10-27T05:52:50.9980570Z Shutting down Aura Healing subsystem...
+2022-10-27T05:52:50.9980859Z Shutting down Augury subsystem...
+2022-10-27T05:52:50.9981169Z Shutting down Asset Loading subsystem...
+2022-10-27T05:52:50.9981483Z Shutting down Antag HUDs subsystem...
+2022-10-27T05:52:50.9981788Z Shutting down Ambience subsystem...
+2022-10-27T05:52:50.9982092Z Shutting down Addiction subsystem...
+2022-10-27T05:52:50.9982383Z Shutting down Acid subsystem...
+2022-10-27T05:52:50.9982673Z Shutting down Timer subsystem...
+2022-10-27T05:52:50.9982970Z Shutting down Sound Loops subsystem...
+2022-10-27T05:52:50.9983275Z Shutting down Runechat subsystem...
+2022-10-27T05:52:50.9983571Z Shutting down Skills subsystem...
+2022-10-27T05:52:50.9983871Z Shutting down Machines subsystem...
+2022-10-27T05:52:50.9984159Z Shutting down Language subsystem...
+2022-10-27T05:52:50.9984452Z Shutting down Atoms subsystem...
+2022-10-27T05:52:51.0026223Z Shutting down Restaurant subsystem...
+2022-10-27T05:52:51.0026577Z Shutting down Economy subsystem...
+2022-10-27T05:52:51.0026908Z Shutting down Spatial Grid subsystem...
+2022-10-27T05:52:51.0030451Z Shutting down Networks subsystem...
+2022-10-27T05:52:51.0030787Z Shutting down Time Tracking subsystem...
+2022-10-27T05:52:51.0031114Z Shutting down Research subsystem...
+2022-10-27T05:52:51.0031432Z Shutting down Early Assets subsystem...
+2022-10-27T05:52:51.0031759Z Shutting down Mapping subsystem...
+2022-10-27T05:52:51.0032092Z Shutting down Trading Card Game subsystem...
+2022-10-27T05:52:51.0032426Z Shutting down Ticker subsystem...
+2022-10-27T05:52:51.0039410Z Unable to locate admins backup file.
+2022-10-27T05:52:51.0051941Z Shutting down AI Controller Ticker subsystem...
+2022-10-27T05:52:51.0052530Z Shutting down AI Behavior Ticker subsystem...
+2022-10-27T05:52:51.0052855Z Shutting down AI movement subsystem...
+2022-10-27T05:52:51.0053132Z Shutting down Jobs subsystem...
+2022-10-27T05:52:51.0053429Z Shutting down IDs and Access subsystem...
+2022-10-27T05:52:51.0053728Z Shutting down Events subsystem...
+2022-10-27T05:52:51.0054019Z Shutting down Reagents subsystem...
+2022-10-27T05:52:51.0054311Z Shutting down Quirks subsystem...
+2022-10-27T05:52:51.0054584Z Shutting down Station subsystem...
+2022-10-27T05:52:51.0054886Z Shutting down Achievements subsystem...
+2022-10-27T05:52:51.0057375Z Shutting down Discord subsystem...
+2022-10-27T05:52:51.0057678Z Shutting down Security Level subsystem...
+2022-10-27T05:52:51.0058123Z Shutting down Vis contents overlays subsystem...
+2022-10-27T05:52:51.0058446Z Shutting down Greyscale subsystem...
+2022-10-27T05:52:51.0059042Z Shutting down Instruments subsystem...
+2022-10-27T05:52:51.0059340Z Shutting down Sounds subsystem...
+2022-10-27T05:52:51.0059631Z Shutting down Input subsystem...
+2022-10-27T05:52:51.0060822Z Shutting down Server Tasks subsystem...
+2022-10-27T05:52:51.0064456Z Shutting down Blackbox subsystem...
+2022-10-27T05:52:51.0064838Z Shutting down Database subsystem...
+2022-10-27T05:52:51.0065213Z Shutting down Garbage subsystem...
+2022-10-27T05:52:54.6306978Z Shutting down Title Screen subsystem...
+2022-10-27T05:52:54.6307928Z Shutting down Profiler subsystem...
+2022-10-27T05:52:54.6308337Z Shutdown complete
+2022-10-27T05:52:54.6308698Z Test run failed!
+2022-10-27T05:52:54.6309027Z Unit Tests failed!
+2022-10-27T05:52:58.2975208Z cat: ci_test/data/logs/ci/clean_run.lk: No such file or directory
+2022-10-27T05:52:58.2988425Z ##[error]Process completed with exit code 1.
+2022-10-27T05:52:58.3038084Z ##[group]Run actions/upload-artifact@v3
+2022-10-27T05:52:58.3038386Z with:
+2022-10-27T05:52:58.3038632Z name: test_artifacts_metastation
+2022-10-27T05:52:58.3038928Z path: data/screenshots_new/
+2022-10-27T05:52:58.3039208Z retention-days: 1
+2022-10-27T05:52:58.3039483Z if-no-files-found: warn
+2022-10-27T05:52:58.3039747Z ##[endgroup]
+2022-10-27T05:52:58.4273001Z With the provided path, there will be 85 files uploaded
+2022-10-27T05:52:58.4279080Z Starting artifact upload
+2022-10-27T05:52:58.4280271Z For more detailed logs during the artifact upload process, enable step-debugging: https://docs.github.com/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging#enabling-step-debug-logging
+2022-10-27T05:52:58.4280911Z Artifact name is valid!
+2022-10-27T05:52:58.4956400Z Container for artifact "test_artifacts_metastation" successfully created. Starting upload of file(s)
+2022-10-27T05:53:02.6649338Z Total size of all the files uploaded is 138917 bytes
+2022-10-27T05:53:02.6650349Z File upload process has finished. Finalizing the artifact upload
+2022-10-27T05:53:02.6917894Z Artifact has been finalized. All files have been successfully uploaded!
+2022-10-27T05:53:02.6918592Z
+2022-10-27T05:53:02.6919221Z The raw size of all the files that were specified for upload is 139272 bytes
+2022-10-27T05:53:02.6920199Z The size of all the files that were uploaded is 138917 bytes. This takes into account any gzip compression used to reduce the upload size, time and storage
+2022-10-27T05:53:02.6920771Z
+2022-10-27T05:53:02.6922015Z Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads
+2022-10-27T05:53:02.6922715Z
+2022-10-27T05:53:02.6923052Z Artifact test_artifacts_metastation has been successfully uploaded!
+2022-10-27T05:53:02.7064563Z Post job cleanup.
+2022-10-27T05:53:02.8553446Z [command]/usr/bin/git version
+2022-10-27T05:53:02.8609457Z git version 2.38.1
+2022-10-27T05:53:02.8663423Z Temporarily overriding HOME='/home/runner/work/_temp/7f4c4ca9-c205-4fcf-92a4-cc2e0f6184cd' before making global git config changes
+2022-10-27T05:53:02.8664612Z Adding repository directory to the temporary git global config as a safe directory
+2022-10-27T05:53:02.8670010Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2022-10-27T05:53:02.8717327Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2022-10-27T05:53:02.8760496Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :
+2022-10-27T05:53:02.9064609Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2022-10-27T05:53:02.9096473Z http.https://github.com/.extraheader
+2022-10-27T05:53:02.9110240Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader
+2022-10-27T05:53:02.9151201Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :
+2022-10-27T05:53:02.9632628Z Print service container logs: bdaac24feb7948af9ae1cfcb2f1e5f3f_mysqllatest_e0031a
+2022-10-27T05:53:02.9639053Z ##[command]/usr/bin/docker logs --details b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:53:02.9874689Z 2022-10-27T05:35:47.663982Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-10-27T05:53:02.9875440Z 2022-10-27T05:35:47.664088Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.31) initializing of server in progress as process 80
+2022-10-27T05:53:02.9875958Z 2022-10-27T05:35:47.671476Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-10-27T05:53:02.9876437Z 2022-10-27T05:35:48.066575Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-10-27T05:53:02.9877103Z 2022-10-27T05:35:49.266023Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
+2022-10-27T05:53:02.9877838Z 2022-10-27T05:35:52.334841Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-10-27T05:53:02.9878473Z 2022-10-27T05:35:52.337029Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 129
+2022-10-27T05:53:02.9878953Z 2022-10-27T05:35:52.352969Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-10-27T05:53:02.9879421Z 2022-10-27 05:35:47+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
+2022-10-27T05:53:02.9879903Z 2022-10-27T05:35:52.530865Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-10-27T05:53:02.9880369Z 2022-10-27T05:35:52.753777Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2022-10-27T05:53:02.9880921Z 2022-10-27T05:35:52.753818Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2022-10-27T05:53:02.9881648Z 2022-10-27T05:35:52.755449Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2022-10-27T05:53:02.9882321Z 2022-10-27T05:35:52.774412Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
+2022-10-27T05:53:02.9882951Z 2022-10-27T05:35:52.775158Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL.
+2022-10-27T05:53:02.9883542Z Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
+2022-10-27T05:53:02.9883992Z 2022-10-27 05:35:47+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
+2022-10-27T05:53:02.9884444Z 2022-10-27 05:35:47+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
+2022-10-27T05:53:02.9884874Z 2022-10-27 05:35:47+00:00 [Note] [Entrypoint]: Initializing database files
+2022-10-27T05:53:02.9885281Z 2022-10-27 05:35:52+00:00 [Note] [Entrypoint]: Database files initialized
+2022-10-27T05:53:02.9885682Z 2022-10-27 05:35:52+00:00 [Note] [Entrypoint]: Starting temporary server
+2022-10-27T05:53:02.9886079Z 2022-10-27 05:35:52+00:00 [Note] [Entrypoint]: Temporary server started.
+2022-10-27T05:53:02.9886471Z '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
+2022-10-27T05:53:02.9888624Z Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
+2022-10-27T05:53:02.9889273Z
+2022-10-27T05:53:02.9889568Z 2022-10-27 05:35:54+00:00 [Note] [Entrypoint]: Stopping temporary server
+2022-10-27T05:53:02.9889969Z 2022-10-27 05:35:57+00:00 [Note] [Entrypoint]: Temporary server stopped
+2022-10-27T05:53:02.9890280Z
+2022-10-27T05:53:02.9890742Z 2022-10-27 05:35:57+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
+2022-10-27T05:53:02.9891394Z Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
+2022-10-27T05:53:02.9891960Z Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
+2022-10-27T05:53:02.9892520Z Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
+2022-10-27T05:53:02.9893146Z 2022-10-27T05:35:54.998452Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.31).
+2022-10-27T05:53:02.9893808Z 2022-10-27T05:35:56.253546Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL.
+2022-10-27T05:53:02.9898747Z 2022-10-27T05:35:57.259394Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-10-27T05:53:02.9899246Z
+2022-10-27T05:53:02.9899947Z 2022-10-27T05:35:57.260761Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1
+2022-10-27T05:53:02.9900440Z 2022-10-27T05:35:57.279827Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-10-27T05:53:02.9900902Z 2022-10-27T05:35:57.478844Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-10-27T05:53:02.9901365Z 2022-10-27T05:35:57.668028Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2022-10-27T05:53:02.9901912Z 2022-10-27T05:35:57.668071Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2022-10-27T05:53:02.9902638Z 2022-10-27T05:35:57.669759Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2022-10-27T05:53:02.9903367Z 2022-10-27T05:35:57.689543Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
+2022-10-27T05:53:02.9905472Z 2022-10-27T05:35:57.690193Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
+2022-10-27T05:53:02.9926340Z Stop and remove container: bdaac24feb7948af9ae1cfcb2f1e5f3f_mysqllatest_e0031a
+2022-10-27T05:53:02.9933347Z ##[command]/usr/bin/docker rm --force b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:53:03.2811799Z b9656fff5d6a67eae31451853c0bb709d922d192e7aabe77af579b15e2acedbc
+2022-10-27T05:53:03.2840549Z Remove container network: github_network_552f961a7b154fc6bdcc0db4d38d15af
+2022-10-27T05:53:03.2847326Z ##[command]/usr/bin/docker network rm github_network_552f961a7b154fc6bdcc0db4d38d15af
+2022-10-27T05:53:03.3874880Z github_network_552f961a7b154fc6bdcc0db4d38d15af
+2022-10-27T05:53:03.4050424Z Cleaning up orphan processes
diff --git a/tools/pull_request_hooks/flakyTestPayloads/invalid_timer.txt b/tools/pull_request_hooks/flakyTestPayloads/invalid_timer.txt
new file mode 100644
index 000000000000..eea9b3774cac
--- /dev/null
+++ b/tools/pull_request_hooks/flakyTestPayloads/invalid_timer.txt
@@ -0,0 +1,2389 @@
+2023-11-12T08:57:50.1971985Z Requested labels: ubuntu-latest
+2023-11-12T08:57:50.1972288Z Job defined at: tgstation/tgstation/.github/workflows/run_integration_tests.yml@refs/pull/79384/merge
+2023-11-12T08:57:50.1972523Z Reusable workflow chain:
+2023-11-12T08:57:50.1972632Z tgstation/tgstation/.github/workflows/ci_suite.yml@refs/pull/79384/merge (0f52a54577af8e336ee4407c83bc6d3bfedd1d11)
+2023-11-12T08:57:50.1972727Z -> tgstation/tgstation/.github/workflows/run_integration_tests.yml@refs/pull/79384/merge (0f52a54577af8e336ee4407c83bc6d3bfedd1d11)
+2023-11-12T08:57:50.1972819Z Waiting for a runner to pick up this job...
+2023-11-12T08:59:41.2590058Z Job is waiting for a hosted runner to come online.
+2023-11-12T08:59:44.1017042Z Job is about to start running on the hosted runner: GitHub Actions 11 (hosted)
+2023-11-12T08:59:46.1455792Z Current runner version: '2.311.0'
+2023-11-12T08:59:46.1479790Z ##[group]Operating System
+2023-11-12T08:59:46.1480441Z Ubuntu
+2023-11-12T08:59:46.1480899Z 22.04.3
+2023-11-12T08:59:46.1481734Z LTS
+2023-11-12T08:59:46.1482077Z ##[endgroup]
+2023-11-12T08:59:46.1482560Z ##[group]Runner Image
+2023-11-12T08:59:46.1482961Z Image: ubuntu-22.04
+2023-11-12T08:59:46.1483353Z Version: 20231030.2.0
+2023-11-12T08:59:46.1484421Z Included Software: https://github.com/actions/runner-images/blob/ubuntu22/20231030.2/images/linux/Ubuntu2204-Readme.md
+2023-11-12T08:59:46.1485799Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu22%2F20231030.2
+2023-11-12T08:59:46.1486650Z ##[endgroup]
+2023-11-12T08:59:46.1487161Z ##[group]Runner Image Provisioner
+2023-11-12T08:59:46.1487606Z 2.0.312.1
+2023-11-12T08:59:46.1487945Z ##[endgroup]
+2023-11-12T08:59:46.1490099Z ##[group]GITHUB_TOKEN Permissions
+2023-11-12T08:59:46.1491698Z Actions: read
+2023-11-12T08:59:46.1492248Z Checks: read
+2023-11-12T08:59:46.1492761Z Contents: read
+2023-11-12T08:59:46.1493311Z Deployments: read
+2023-11-12T08:59:46.1493676Z Discussions: read
+2023-11-12T08:59:46.1494123Z Issues: read
+2023-11-12T08:59:46.1494582Z Metadata: read
+2023-11-12T08:59:46.1494935Z Packages: read
+2023-11-12T08:59:46.1495330Z Pages: read
+2023-11-12T08:59:46.1495763Z PullRequests: read
+2023-11-12T08:59:46.1496142Z RepositoryProjects: read
+2023-11-12T08:59:46.1496603Z SecurityEvents: read
+2023-11-12T08:59:46.1497060Z Statuses: read
+2023-11-12T08:59:46.1497394Z ##[endgroup]
+2023-11-12T08:59:46.1500314Z Secret source: None
+2023-11-12T08:59:46.1501009Z Prepare workflow directory
+2023-11-12T08:59:46.2366322Z Prepare all required actions
+2023-11-12T08:59:46.2521312Z Getting action download info
+2023-11-12T08:59:46.4989409Z Download action repository 'actions/checkout@v3' (SHA:f43a0e5ff2bd294095638e18286ca9a3d1956744)
+2023-11-12T08:59:46.6372596Z Download action repository 'actions/cache@v3' (SHA:704facf57e6136b1bc63b828d79edcd491f0ee84)
+2023-11-12T08:59:46.7365405Z Download action repository 'actions/upload-artifact@v3' (SHA:a8a3f3ad30e3422c9c7b888a15615d19a852ae32)
+2023-11-12T08:59:46.7793243Z Download action repository 'tgstation/byond-client-compatibility-check@v3' (SHA:d9fac1c9713569fa6681906325ddce115bb53365)
+2023-11-12T08:59:47.0659791Z Uses: tgstation/tgstation/.github/workflows/run_integration_tests.yml@refs/pull/79384/merge (0f52a54577af8e336ee4407c83bc6d3bfedd1d11)
+2023-11-12T08:59:47.0662504Z ##[group] Inputs
+2023-11-12T08:59:47.0663016Z map: tramstation
+2023-11-12T08:59:47.0663530Z major:
+2023-11-12T08:59:47.0663853Z minor:
+2023-11-12T08:59:47.0664217Z max_required_byond_client: 514
+2023-11-12T08:59:47.0664786Z ##[endgroup]
+2023-11-12T08:59:47.0665727Z Complete job name: Integration Tests (tramstation) / run_integration_tests
+2023-11-12T08:59:47.1316890Z ##[group]Checking docker version
+2023-11-12T08:59:47.1331488Z ##[command]/usr/bin/docker version --format '{{.Server.APIVersion}}'
+2023-11-12T08:59:47.2035568Z '1.43'
+2023-11-12T08:59:47.2048856Z Docker daemon API version: '1.43'
+2023-11-12T08:59:47.2049704Z ##[command]/usr/bin/docker version --format '{{.Client.APIVersion}}'
+2023-11-12T08:59:47.2209793Z '1.43'
+2023-11-12T08:59:47.2229627Z Docker client API version: '1.43'
+2023-11-12T08:59:47.2235325Z ##[endgroup]
+2023-11-12T08:59:47.2239282Z ##[group]Clean up resources from previous jobs
+2023-11-12T08:59:47.2245596Z ##[command]/usr/bin/docker ps --all --quiet --no-trunc --filter "label=bae3f2"
+2023-11-12T08:59:47.2382764Z ##[command]/usr/bin/docker network prune --force --filter "label=bae3f2"
+2023-11-12T08:59:47.2513406Z ##[endgroup]
+2023-11-12T08:59:47.2513906Z ##[group]Create local container network
+2023-11-12T08:59:47.2524774Z ##[command]/usr/bin/docker network create --label bae3f2 github_network_bc2270e2d9644957ba98982ec5cf35f2
+2023-11-12T08:59:47.3421425Z 7e144ec3bd040fce7400908b83369d64424efaa98e355fff9ec0d703a41602b1
+2023-11-12T08:59:47.3441937Z ##[endgroup]
+2023-11-12T08:59:47.3517647Z ##[group]Starting mysql service container
+2023-11-12T08:59:47.3536963Z ##[command]/usr/bin/docker pull mysql:latest
+2023-11-12T08:59:47.5471538Z latest: Pulling from library/mysql
+2023-11-12T08:59:47.5925068Z 8e0176adc18c: Pulling fs layer
+2023-11-12T08:59:47.5926146Z 2d2c52718f65: Pulling fs layer
+2023-11-12T08:59:47.5926867Z d88d03ce139b: Pulling fs layer
+2023-11-12T08:59:47.5927652Z 4a7d7f11aa1e: Pulling fs layer
+2023-11-12T08:59:47.5928644Z ce5949193e4c: Pulling fs layer
+2023-11-12T08:59:47.5929143Z f7f024dfb329: Pulling fs layer
+2023-11-12T08:59:47.5929598Z 5fc3c840facc: Pulling fs layer
+2023-11-12T08:59:47.5930195Z 509068e49488: Pulling fs layer
+2023-11-12T08:59:47.5930586Z cbc847bab598: Pulling fs layer
+2023-11-12T08:59:47.5930994Z 942bef62a146: Pulling fs layer
+2023-11-12T08:59:47.5931450Z f7f024dfb329: Waiting
+2023-11-12T08:59:47.5931833Z 5fc3c840facc: Waiting
+2023-11-12T08:59:47.5932180Z 509068e49488: Waiting
+2023-11-12T08:59:47.5932601Z cbc847bab598: Waiting
+2023-11-12T08:59:47.5932952Z 942bef62a146: Waiting
+2023-11-12T08:59:47.5933295Z 4a7d7f11aa1e: Waiting
+2023-11-12T08:59:47.5933717Z ce5949193e4c: Waiting
+2023-11-12T08:59:47.6370843Z 2d2c52718f65: Verifying Checksum
+2023-11-12T08:59:47.6371886Z 2d2c52718f65: Download complete
+2023-11-12T08:59:47.6628390Z d88d03ce139b: Verifying Checksum
+2023-11-12T08:59:47.6630340Z d88d03ce139b: Download complete
+2023-11-12T08:59:47.7021669Z ce5949193e4c: Verifying Checksum
+2023-11-12T08:59:47.7022614Z ce5949193e4c: Download complete
+2023-11-12T08:59:47.7184829Z 4a7d7f11aa1e: Verifying Checksum
+2023-11-12T08:59:47.7185700Z 4a7d7f11aa1e: Download complete
+2023-11-12T08:59:47.7547210Z f7f024dfb329: Download complete
+2023-11-12T08:59:47.8055625Z 509068e49488: Verifying Checksum
+2023-11-12T08:59:47.8057291Z 509068e49488: Download complete
+2023-11-12T08:59:48.0054531Z 8e0176adc18c: Verifying Checksum
+2023-11-12T08:59:48.0055844Z 8e0176adc18c: Download complete
+2023-11-12T08:59:48.0721310Z 942bef62a146: Verifying Checksum
+2023-11-12T08:59:48.0723241Z 942bef62a146: Download complete
+2023-11-12T08:59:48.2055324Z 5fc3c840facc: Verifying Checksum
+2023-11-12T08:59:48.2056029Z 5fc3c840facc: Download complete
+2023-11-12T08:59:48.2822740Z cbc847bab598: Verifying Checksum
+2023-11-12T08:59:48.2824083Z cbc847bab598: Download complete
+2023-11-12T08:59:49.3079176Z 8e0176adc18c: Pull complete
+2023-11-12T08:59:49.6617199Z 2d2c52718f65: Pull complete
+2023-11-12T08:59:49.6872468Z d88d03ce139b: Pull complete
+2023-11-12T08:59:49.8872416Z 4a7d7f11aa1e: Pull complete
+2023-11-12T08:59:49.9014484Z ce5949193e4c: Pull complete
+2023-11-12T08:59:49.9174666Z f7f024dfb329: Pull complete
+2023-11-12T08:59:51.3130074Z 5fc3c840facc: Pull complete
+2023-11-12T08:59:51.3233267Z 509068e49488: Pull complete
+2023-11-12T08:59:56.1487617Z cbc847bab598: Pull complete
+2023-11-12T08:59:56.6779169Z 942bef62a146: Pull complete
+2023-11-12T08:59:56.6823169Z Digest: sha256:1773f3c7aa9522f0014d0ad2bbdaf597ea3b1643c64c8ccc2123c64afd8b82b1
+2023-11-12T08:59:56.6835281Z Status: Downloaded newer image for mysql:latest
+2023-11-12T08:59:56.6843575Z docker.io/library/mysql:latest
+2023-11-12T08:59:56.6952276Z ##[command]/usr/bin/docker create --name c43e2a4f7a0044eda3c3640d7583be1f_mysqllatest_210664 --label bae3f2 --network github_network_bc2270e2d9644957ba98982ec5cf35f2 --network-alias mysql -p 3306 --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 -e "MYSQL_ROOT_PASSWORD=root" -e GITHUB_ACTIONS=true -e CI=true mysql:latest
+2023-11-12T08:59:56.7205373Z 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T08:59:56.7226574Z ##[command]/usr/bin/docker start 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T08:59:57.0122389Z 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T08:59:57.0147762Z ##[command]/usr/bin/docker ps --all --filter id=37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
+2023-11-12T08:59:57.0270403Z 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded Up Less than a second (health: starting)
+2023-11-12T08:59:57.0292510Z ##[command]/usr/bin/docker port 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T08:59:57.0413612Z 3306/tcp -> 0.0.0.0:32768
+2023-11-12T08:59:57.0414454Z 3306/tcp -> [::]:32768
+2023-11-12T08:59:57.0511341Z ##[endgroup]
+2023-11-12T08:59:57.0545971Z ##[group]Waiting for all services to be ready
+2023-11-12T08:59:57.0594766Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T08:59:57.0736995Z starting
+2023-11-12T08:59:57.0767183Z mysql service is starting, waiting 2 seconds before checking again.
+2023-11-12T08:59:59.0767458Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T08:59:59.0896661Z starting
+2023-11-12T08:59:59.0908862Z mysql service is starting, waiting 4 seconds before checking again.
+2023-11-12T09:00:03.1488036Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T09:00:03.1606151Z starting
+2023-11-12T09:00:03.1617891Z mysql service is starting, waiting 8 seconds before checking again.
+2023-11-12T09:00:11.5749953Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T09:00:11.5876640Z healthy
+2023-11-12T09:00:11.5893980Z mysql service is healthy.
+2023-11-12T09:00:11.5894520Z ##[endgroup]
+2023-11-12T09:00:11.6253438Z ##[group]Run actions/checkout@v3
+2023-11-12T09:00:11.6253862Z with:
+2023-11-12T09:00:11.6254192Z repository: tgstation/tgstation
+2023-11-12T09:00:11.6254857Z token: ***
+2023-11-12T09:00:11.6255173Z ssh-strict: true
+2023-11-12T09:00:11.6255558Z persist-credentials: true
+2023-11-12T09:00:11.6256022Z clean: true
+2023-11-12T09:00:11.6256343Z sparse-checkout-cone-mode: true
+2023-11-12T09:00:11.6256740Z fetch-depth: 1
+2023-11-12T09:00:11.6257139Z fetch-tags: false
+2023-11-12T09:00:11.6257424Z lfs: false
+2023-11-12T09:00:11.6257739Z submodules: false
+2023-11-12T09:00:11.6258160Z set-safe-directory: true
+2023-11-12T09:00:11.6258498Z ##[endgroup]
+2023-11-12T09:00:11.7905131Z Syncing repository: tgstation/tgstation
+2023-11-12T09:00:11.7906924Z ##[group]Getting Git version info
+2023-11-12T09:00:11.7907608Z Working directory is '/home/runner/work/tgstation/tgstation'
+2023-11-12T09:00:11.7908545Z [command]/usr/bin/git version
+2023-11-12T09:00:11.7926430Z git version 2.42.0
+2023-11-12T09:00:11.7950009Z ##[endgroup]
+2023-11-12T09:00:11.7969428Z Temporarily overriding HOME='/home/runner/work/_temp/36501371-137a-461b-978e-be8cc4242865' before making global git config changes
+2023-11-12T09:00:11.7971339Z Adding repository directory to the temporary git global config as a safe directory
+2023-11-12T09:00:11.7973813Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2023-11-12T09:00:11.8018133Z Deleting the contents of '/home/runner/work/tgstation/tgstation'
+2023-11-12T09:00:11.8021715Z ##[group]Initializing the repository
+2023-11-12T09:00:11.8024938Z [command]/usr/bin/git init /home/runner/work/tgstation/tgstation
+2023-11-12T09:00:11.8167504Z hint: Using 'master' as the name for the initial branch. This default branch name
+2023-11-12T09:00:11.8168867Z hint: is subject to change. To configure the initial branch name to use in all
+2023-11-12T09:00:11.8170077Z hint: of your new repositories, which will suppress this warning, call:
+2023-11-12T09:00:11.8170644Z hint:
+2023-11-12T09:00:11.8171097Z hint: git config --global init.defaultBranch
+2023-11-12T09:00:11.8171661Z hint:
+2023-11-12T09:00:11.8172234Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
+2023-11-12T09:00:11.8173070Z hint: 'development'. The just-created branch can be renamed via this command:
+2023-11-12T09:00:11.8173978Z hint:
+2023-11-12T09:00:11.8174325Z hint: git branch -m
+2023-11-12T09:00:11.8177381Z Initialized empty Git repository in /home/runner/work/tgstation/tgstation/.git/
+2023-11-12T09:00:11.8185891Z [command]/usr/bin/git remote add origin https://github.com/tgstation/tgstation
+2023-11-12T09:00:11.8237650Z ##[endgroup]
+2023-11-12T09:00:11.8238368Z ##[group]Disabling automatic garbage collection
+2023-11-12T09:00:11.8241714Z [command]/usr/bin/git config --local gc.auto 0
+2023-11-12T09:00:11.8277184Z ##[endgroup]
+2023-11-12T09:00:11.8277752Z ##[group]Setting up auth
+2023-11-12T09:00:11.8283624Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2023-11-12T09:00:11.8319856Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
+2023-11-12T09:00:11.8657173Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2023-11-12T09:00:11.8696672Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
+2023-11-12T09:00:11.8934506Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
+2023-11-12T09:00:11.8975797Z ##[endgroup]
+2023-11-12T09:00:11.8976409Z ##[group]Fetching the repository
+2023-11-12T09:00:11.8984535Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +0f52a54577af8e336ee4407c83bc6d3bfedd1d11:refs/remotes/pull/79384/merge
+2023-11-12T09:00:12.3422502Z remote: Enumerating objects: 14728, done.
+2023-11-12T09:00:12.3435399Z remote: Counting objects: 0% (1/14728)
+2023-11-12T09:00:12.3437322Z remote: Counting objects: 1% (148/14728)
+2023-11-12T09:00:12.3438041Z remote: Counting objects: 2% (295/14728)
+2023-11-12T09:00:12.3438941Z remote: Counting objects: 3% (442/14728)
+2023-11-12T09:00:12.3440148Z remote: Counting objects: 4% (590/14728)
+2023-11-12T09:00:12.3442925Z remote: Counting objects: 5% (737/14728)
+2023-11-12T09:00:12.3445483Z remote: Counting objects: 6% (884/14728)
+2023-11-12T09:00:12.3447273Z remote: Counting objects: 7% (1031/14728)
+2023-11-12T09:00:12.3460133Z remote: Counting objects: 8% (1179/14728)
+2023-11-12T09:00:12.3461187Z remote: Counting objects: 9% (1326/14728)
+2023-11-12T09:00:12.3461949Z remote: Counting objects: 10% (1473/14728)
+2023-11-12T09:00:12.3462472Z remote: Counting objects: 11% (1621/14728)
+2023-11-12T09:00:12.3463038Z remote: Counting objects: 12% (1768/14728)
+2023-11-12T09:00:12.3463556Z remote: Counting objects: 13% (1915/14728)
+2023-11-12T09:00:12.3467828Z remote: Counting objects: 14% (2062/14728)
+2023-11-12T09:00:12.3483848Z remote: Counting objects: 15% (2210/14728)
+2023-11-12T09:00:12.3489421Z remote: Counting objects: 16% (2357/14728)
+2023-11-12T09:00:12.3489959Z remote: Counting objects: 17% (2504/14728)
+2023-11-12T09:00:12.3490601Z remote: Counting objects: 18% (2652/14728)
+2023-11-12T09:00:12.3491065Z remote: Counting objects: 19% (2799/14728)
+2023-11-12T09:00:12.3491549Z remote: Counting objects: 20% (2946/14728)
+2023-11-12T09:00:12.3492150Z remote: Counting objects: 21% (3093/14728)
+2023-11-12T09:00:12.3492599Z remote: Counting objects: 22% (3241/14728)
+2023-11-12T09:00:12.3497394Z remote: Counting objects: 23% (3388/14728)
+2023-11-12T09:00:12.3498533Z remote: Counting objects: 24% (3535/14728)
+2023-11-12T09:00:12.3499302Z remote: Counting objects: 25% (3682/14728)
+2023-11-12T09:00:12.3500231Z remote: Counting objects: 26% (3830/14728)
+2023-11-12T09:00:12.3500908Z remote: Counting objects: 27% (3977/14728)
+2023-11-12T09:00:12.3501885Z remote: Counting objects: 28% (4124/14728)
+2023-11-12T09:00:12.3502758Z remote: Counting objects: 29% (4272/14728)
+2023-11-12T09:00:12.3504000Z remote: Counting objects: 30% (4419/14728)
+2023-11-12T09:00:12.3508426Z remote: Counting objects: 31% (4566/14728)
+2023-11-12T09:00:12.3510860Z remote: Counting objects: 32% (4713/14728)
+2023-11-12T09:00:12.3513541Z remote: Counting objects: 33% (4861/14728)
+2023-11-12T09:00:12.3517241Z remote: Counting objects: 34% (5008/14728)
+2023-11-12T09:00:12.3518978Z remote: Counting objects: 35% (5155/14728)
+2023-11-12T09:00:12.3522056Z remote: Counting objects: 36% (5303/14728)
+2023-11-12T09:00:12.3522867Z remote: Counting objects: 37% (5450/14728)
+2023-11-12T09:00:12.3524352Z remote: Counting objects: 38% (5597/14728)
+2023-11-12T09:00:12.3525521Z remote: Counting objects: 39% (5744/14728)
+2023-11-12T09:00:12.3526808Z remote: Counting objects: 40% (5892/14728)
+2023-11-12T09:00:12.3528838Z remote: Counting objects: 41% (6039/14728)
+2023-11-12T09:00:12.3529652Z remote: Counting objects: 42% (6186/14728)
+2023-11-12T09:00:12.3531108Z remote: Counting objects: 43% (6334/14728)
+2023-11-12T09:00:12.3531942Z remote: Counting objects: 44% (6481/14728)
+2023-11-12T09:00:12.3535178Z remote: Counting objects: 45% (6628/14728)
+2023-11-12T09:00:12.3536185Z remote: Counting objects: 46% (6775/14728)
+2023-11-12T09:00:12.3537509Z remote: Counting objects: 47% (6923/14728)
+2023-11-12T09:00:12.3538838Z remote: Counting objects: 48% (7070/14728)
+2023-11-12T09:00:12.3539490Z remote: Counting objects: 49% (7217/14728)
+2023-11-12T09:00:12.3540416Z remote: Counting objects: 50% (7364/14728)
+2023-11-12T09:00:12.3542997Z remote: Counting objects: 51% (7512/14728)
+2023-11-12T09:00:12.3546735Z remote: Counting objects: 52% (7659/14728)
+2023-11-12T09:00:12.3547627Z remote: Counting objects: 53% (7806/14728)
+2023-11-12T09:00:12.3549945Z remote: Counting objects: 54% (7954/14728)
+2023-11-12T09:00:12.3551486Z remote: Counting objects: 55% (8101/14728)
+2023-11-12T09:00:12.3554841Z remote: Counting objects: 56% (8248/14728)
+2023-11-12T09:00:12.3558919Z remote: Counting objects: 57% (8395/14728)
+2023-11-12T09:00:12.3559895Z remote: Counting objects: 58% (8543/14728)
+2023-11-12T09:00:12.3561635Z remote: Counting objects: 59% (8690/14728)
+2023-11-12T09:00:12.3562509Z remote: Counting objects: 60% (8837/14728)
+2023-11-12T09:00:12.3565221Z remote: Counting objects: 61% (8985/14728)
+2023-11-12T09:00:12.3566377Z remote: Counting objects: 62% (9132/14728)
+2023-11-12T09:00:12.3567330Z remote: Counting objects: 63% (9279/14728)
+2023-11-12T09:00:12.3568404Z remote: Counting objects: 64% (9426/14728)
+2023-11-12T09:00:12.3569399Z remote: Counting objects: 65% (9574/14728)
+2023-11-12T09:00:12.3570508Z remote: Counting objects: 66% (9721/14728)
+2023-11-12T09:00:12.3573805Z remote: Counting objects: 67% (9868/14728)
+2023-11-12T09:00:12.3574713Z remote: Counting objects: 68% (10016/14728)
+2023-11-12T09:00:12.3575852Z remote: Counting objects: 69% (10163/14728)
+2023-11-12T09:00:12.3576870Z remote: Counting objects: 70% (10310/14728)
+2023-11-12T09:00:12.3577724Z remote: Counting objects: 71% (10457/14728)
+2023-11-12T09:00:12.3578357Z remote: Counting objects: 72% (10605/14728)
+2023-11-12T09:00:12.3578886Z remote: Counting objects: 73% (10752/14728)
+2023-11-12T09:00:12.3579497Z remote: Counting objects: 74% (10899/14728)
+2023-11-12T09:00:12.3580417Z remote: Counting objects: 75% (11046/14728)
+2023-11-12T09:00:12.3581097Z remote: Counting objects: 76% (11194/14728)
+2023-11-12T09:00:12.3581574Z remote: Counting objects: 77% (11341/14728)
+2023-11-12T09:00:12.3582409Z remote: Counting objects: 78% (11488/14728)
+2023-11-12T09:00:12.3582915Z remote: Counting objects: 79% (11636/14728)
+2023-11-12T09:00:12.3583405Z remote: Counting objects: 80% (11783/14728)
+2023-11-12T09:00:12.3583954Z remote: Counting objects: 81% (11930/14728)
+2023-11-12T09:00:12.3586461Z remote: Counting objects: 82% (12077/14728)
+2023-11-12T09:00:12.3587052Z remote: Counting objects: 83% (12225/14728)
+2023-11-12T09:00:12.3587941Z remote: Counting objects: 84% (12372/14728)
+2023-11-12T09:00:12.3588988Z remote: Counting objects: 85% (12519/14728)
+2023-11-12T09:00:12.3591543Z remote: Counting objects: 86% (12667/14728)
+2023-11-12T09:00:12.3594301Z remote: Counting objects: 87% (12814/14728)
+2023-11-12T09:00:12.3597908Z remote: Counting objects: 88% (12961/14728)
+2023-11-12T09:00:12.3601958Z remote: Counting objects: 89% (13108/14728)
+2023-11-12T09:00:12.3605574Z remote: Counting objects: 90% (13256/14728)
+2023-11-12T09:00:12.3610280Z remote: Counting objects: 91% (13403/14728)
+2023-11-12T09:00:12.3612894Z remote: Counting objects: 92% (13550/14728)
+2023-11-12T09:00:12.3615660Z remote: Counting objects: 93% (13698/14728)
+2023-11-12T09:00:12.3619462Z remote: Counting objects: 94% (13845/14728)
+2023-11-12T09:00:12.3623758Z remote: Counting objects: 95% (13992/14728)
+2023-11-12T09:00:12.3628748Z remote: Counting objects: 96% (14139/14728)
+2023-11-12T09:00:12.3636487Z remote: Counting objects: 97% (14287/14728)
+2023-11-12T09:00:12.3641426Z remote: Counting objects: 98% (14434/14728)
+2023-11-12T09:00:12.3646422Z remote: Counting objects: 99% (14581/14728)
+2023-11-12T09:00:12.3649144Z remote: Counting objects: 100% (14728/14728)
+2023-11-12T09:00:12.3649919Z remote: Counting objects: 100% (14728/14728), done.
+2023-11-12T09:00:12.3825128Z remote: Compressing objects: 0% (1/13137)
+2023-11-12T09:00:12.3961841Z remote: Compressing objects: 1% (132/13137)
+2023-11-12T09:00:12.4112502Z remote: Compressing objects: 2% (263/13137)
+2023-11-12T09:00:12.4227069Z remote: Compressing objects: 3% (395/13137)
+2023-11-12T09:00:12.4228313Z remote: Compressing objects: 4% (526/13137)
+2023-11-12T09:00:12.4228983Z remote: Compressing objects: 5% (657/13137)
+2023-11-12T09:00:12.4229643Z remote: Compressing objects: 6% (789/13137)
+2023-11-12T09:00:12.4271804Z remote: Compressing objects: 7% (920/13137)
+2023-11-12T09:00:12.4360389Z remote: Compressing objects: 8% (1051/13137)
+2023-11-12T09:00:12.4466461Z remote: Compressing objects: 9% (1183/13137)
+2023-11-12T09:00:12.4646998Z remote: Compressing objects: 10% (1314/13137)
+2023-11-12T09:00:12.5428669Z remote: Compressing objects: 11% (1446/13137)
+2023-11-12T09:00:12.8296153Z remote: Compressing objects: 12% (1577/13137)
+2023-11-12T09:00:12.9213149Z remote: Compressing objects: 13% (1708/13137)
+2023-11-12T09:00:13.0041408Z remote: Compressing objects: 14% (1840/13137)
+2023-11-12T09:00:13.1340856Z remote: Compressing objects: 15% (1971/13137)
+2023-11-12T09:00:13.1645036Z remote: Compressing objects: 16% (2102/13137)
+2023-11-12T09:00:13.1904768Z remote: Compressing objects: 17% (2234/13137)
+2023-11-12T09:00:13.2018494Z remote: Compressing objects: 18% (2365/13137)
+2023-11-12T09:00:13.2019779Z remote: Compressing objects: 19% (2497/13137)
+2023-11-12T09:00:13.2134073Z remote: Compressing objects: 20% (2628/13137)
+2023-11-12T09:00:13.2199911Z remote: Compressing objects: 21% (2759/13137)
+2023-11-12T09:00:13.2260920Z remote: Compressing objects: 22% (2891/13137)
+2023-11-12T09:00:13.2343043Z remote: Compressing objects: 23% (3022/13137)
+2023-11-12T09:00:13.2821833Z remote: Compressing objects: 24% (3153/13137)
+2023-11-12T09:00:13.3039708Z remote: Compressing objects: 25% (3285/13137)
+2023-11-12T09:00:13.3255129Z remote: Compressing objects: 26% (3416/13137)
+2023-11-12T09:00:13.3405305Z remote: Compressing objects: 27% (3547/13137)
+2023-11-12T09:00:13.3571381Z remote: Compressing objects: 28% (3679/13137)
+2023-11-12T09:00:13.3670018Z remote: Compressing objects: 29% (3810/13137)
+2023-11-12T09:00:13.4040877Z remote: Compressing objects: 29% (3868/13137)
+2023-11-12T09:00:13.4251871Z remote: Compressing objects: 30% (3942/13137)
+2023-11-12T09:00:13.4457155Z remote: Compressing objects: 31% (4073/13137)
+2023-11-12T09:00:13.4780533Z remote: Compressing objects: 32% (4204/13137)
+2023-11-12T09:00:13.4983464Z remote: Compressing objects: 33% (4336/13137)
+2023-11-12T09:00:13.5295246Z remote: Compressing objects: 34% (4467/13137)
+2023-11-12T09:00:13.5719629Z remote: Compressing objects: 35% (4598/13137)
+2023-11-12T09:00:13.6054442Z remote: Compressing objects: 36% (4730/13137)
+2023-11-12T09:00:13.6350098Z remote: Compressing objects: 37% (4861/13137)
+2023-11-12T09:00:13.6626461Z remote: Compressing objects: 38% (4993/13137)
+2023-11-12T09:00:13.6916464Z remote: Compressing objects: 39% (5124/13137)
+2023-11-12T09:00:13.7302124Z remote: Compressing objects: 40% (5255/13137)
+2023-11-12T09:00:13.7576240Z remote: Compressing objects: 41% (5387/13137)
+2023-11-12T09:00:13.7850663Z remote: Compressing objects: 42% (5518/13137)
+2023-11-12T09:00:13.8125191Z remote: Compressing objects: 43% (5649/13137)
+2023-11-12T09:00:13.8344430Z remote: Compressing objects: 44% (5781/13137)
+2023-11-12T09:00:13.8648361Z remote: Compressing objects: 45% (5912/13137)
+2023-11-12T09:00:13.8890504Z remote: Compressing objects: 46% (6044/13137)
+2023-11-12T09:00:13.9134975Z remote: Compressing objects: 47% (6175/13137)
+2023-11-12T09:00:13.9382739Z remote: Compressing objects: 48% (6306/13137)
+2023-11-12T09:00:13.9574317Z remote: Compressing objects: 49% (6438/13137)
+2023-11-12T09:00:13.9764171Z remote: Compressing objects: 50% (6569/13137)
+2023-11-12T09:00:13.9965671Z remote: Compressing objects: 51% (6700/13137)
+2023-11-12T09:00:14.0240257Z remote: Compressing objects: 52% (6832/13137)
+2023-11-12T09:00:14.0468725Z remote: Compressing objects: 53% (6963/13137)
+2023-11-12T09:00:14.0669881Z remote: Compressing objects: 54% (7094/13137)
+2023-11-12T09:00:14.0895124Z remote: Compressing objects: 55% (7226/13137)
+2023-11-12T09:00:14.1141069Z remote: Compressing objects: 56% (7357/13137)
+2023-11-12T09:00:14.1354395Z remote: Compressing objects: 57% (7489/13137)
+2023-11-12T09:00:14.1570266Z remote: Compressing objects: 58% (7620/13137)
+2023-11-12T09:00:14.1754980Z remote: Compressing objects: 59% (7751/13137)
+2023-11-12T09:00:14.2084676Z remote: Compressing objects: 60% (7883/13137)
+2023-11-12T09:00:14.2310657Z remote: Compressing objects: 61% (8014/13137)
+2023-11-12T09:00:14.2625166Z remote: Compressing objects: 62% (8145/13137)
+2023-11-12T09:00:14.2909864Z remote: Compressing objects: 63% (8277/13137)
+2023-11-12T09:00:14.3192565Z remote: Compressing objects: 64% (8408/13137)
+2023-11-12T09:00:14.3424597Z remote: Compressing objects: 65% (8540/13137)
+2023-11-12T09:00:14.3648230Z remote: Compressing objects: 66% (8671/13137)
+2023-11-12T09:00:14.3654208Z remote: Compressing objects: 67% (8802/13137)
+2023-11-12T09:00:14.3852572Z remote: Compressing objects: 67% (8803/13137)
+2023-11-12T09:00:14.4083890Z remote: Compressing objects: 68% (8934/13137)
+2023-11-12T09:00:14.4346236Z remote: Compressing objects: 69% (9065/13137)
+2023-11-12T09:00:14.4412610Z remote: Compressing objects: 70% (9196/13137)
+2023-11-12T09:00:14.4438826Z remote: Compressing objects: 71% (9328/13137)
+2023-11-12T09:00:14.4557338Z remote: Compressing objects: 72% (9459/13137)
+2023-11-12T09:00:14.4560053Z remote: Compressing objects: 73% (9591/13137)
+2023-11-12T09:00:14.4561406Z remote: Compressing objects: 74% (9722/13137)
+2023-11-12T09:00:14.4562102Z remote: Compressing objects: 75% (9853/13137)
+2023-11-12T09:00:14.4598003Z remote: Compressing objects: 76% (9985/13137)
+2023-11-12T09:00:14.4599196Z remote: Compressing objects: 77% (10116/13137)
+2023-11-12T09:00:14.4600027Z remote: Compressing objects: 78% (10247/13137)
+2023-11-12T09:00:14.4610318Z remote: Compressing objects: 79% (10379/13137)
+2023-11-12T09:00:14.4610882Z remote: Compressing objects: 80% (10510/13137)
+2023-11-12T09:00:14.4625739Z remote: Compressing objects: 81% (10641/13137)
+2023-11-12T09:00:14.4627218Z remote: Compressing objects: 82% (10773/13137)
+2023-11-12T09:00:14.4628087Z remote: Compressing objects: 83% (10904/13137)
+2023-11-12T09:00:14.4628755Z remote: Compressing objects: 84% (11036/13137)
+2023-11-12T09:00:14.4641964Z remote: Compressing objects: 85% (11167/13137)
+2023-11-12T09:00:14.4643000Z remote: Compressing objects: 86% (11298/13137)
+2023-11-12T09:00:14.4643588Z remote: Compressing objects: 87% (11430/13137)
+2023-11-12T09:00:14.4644263Z remote: Compressing objects: 88% (11561/13137)
+2023-11-12T09:00:14.4644780Z remote: Compressing objects: 89% (11692/13137)
+2023-11-12T09:00:14.4667702Z remote: Compressing objects: 90% (11824/13137)
+2023-11-12T09:00:14.4763174Z remote: Compressing objects: 91% (11955/13137)
+2023-11-12T09:00:14.4790967Z remote: Compressing objects: 92% (12087/13137)
+2023-11-12T09:00:14.4805225Z remote: Compressing objects: 93% (12218/13137)
+2023-11-12T09:00:14.4826093Z remote: Compressing objects: 94% (12349/13137)
+2023-11-12T09:00:14.4845748Z remote: Compressing objects: 95% (12481/13137)
+2023-11-12T09:00:14.4852480Z remote: Compressing objects: 96% (12612/13137)
+2023-11-12T09:00:14.4863608Z remote: Compressing objects: 97% (12743/13137)
+2023-11-12T09:00:14.4890566Z remote: Compressing objects: 98% (12875/13137)
+2023-11-12T09:00:14.4901499Z remote: Compressing objects: 99% (13006/13137)
+2023-11-12T09:00:14.4905499Z remote: Compressing objects: 100% (13137/13137)
+2023-11-12T09:00:14.4906263Z remote: Compressing objects: 100% (13137/13137), done.
+2023-11-12T09:00:14.5298519Z Receiving objects: 0% (1/14728)
+2023-11-12T09:00:14.7511556Z Receiving objects: 1% (148/14728)
+2023-11-12T09:00:15.0383718Z Receiving objects: 2% (295/14728)
+2023-11-12T09:00:15.0790920Z Receiving objects: 3% (442/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.1841924Z Receiving objects: 4% (590/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.1886539Z Receiving objects: 5% (737/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.1946135Z Receiving objects: 6% (884/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2129478Z Receiving objects: 7% (1031/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2298890Z Receiving objects: 8% (1179/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2441190Z Receiving objects: 9% (1326/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2535883Z Receiving objects: 10% (1473/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2682741Z Receiving objects: 11% (1621/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2854458Z Receiving objects: 12% (1768/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2953047Z Receiving objects: 13% (1915/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.2998284Z Receiving objects: 14% (2062/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.3017511Z Receiving objects: 15% (2210/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.3161978Z Receiving objects: 16% (2357/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.3233106Z Receiving objects: 17% (2504/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.3483968Z Receiving objects: 18% (2652/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.3784019Z Receiving objects: 19% (2799/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.3954481Z Receiving objects: 20% (2946/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.4245221Z Receiving objects: 21% (3093/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.4470709Z Receiving objects: 22% (3241/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.4723098Z Receiving objects: 23% (3388/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.4937347Z Receiving objects: 24% (3535/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.4944940Z Receiving objects: 24% (3669/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.5175139Z Receiving objects: 25% (3682/14728), 2.91 MiB | 5.72 MiB/s
+2023-11-12T09:00:15.5292638Z Receiving objects: 26% (3830/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.5497254Z Receiving objects: 27% (3977/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.5672343Z Receiving objects: 28% (4124/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.5843576Z Receiving objects: 29% (4272/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.5937090Z Receiving objects: 30% (4419/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.6094771Z Receiving objects: 31% (4566/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.6238194Z Receiving objects: 32% (4713/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.6342923Z Receiving objects: 33% (4861/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.6565056Z Receiving objects: 34% (5008/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.6729745Z Receiving objects: 35% (5155/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.6807225Z Receiving objects: 36% (5303/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.6932642Z Receiving objects: 37% (5450/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.7116778Z Receiving objects: 38% (5597/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.7226855Z Receiving objects: 39% (5744/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.7368698Z Receiving objects: 40% (5892/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.7722704Z Receiving objects: 41% (6039/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.8013149Z Receiving objects: 42% (6186/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.8245559Z Receiving objects: 43% (6334/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.8412984Z Receiving objects: 44% (6481/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.8809019Z Receiving objects: 45% (6628/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9077444Z Receiving objects: 46% (6775/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9198076Z Receiving objects: 47% (6923/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9335440Z Receiving objects: 48% (7070/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9409235Z Receiving objects: 49% (7217/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9475966Z Receiving objects: 50% (7364/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9632751Z Receiving objects: 51% (7512/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9710761Z Receiving objects: 52% (7659/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:15.9997665Z Receiving objects: 53% (7806/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:16.1754062Z Receiving objects: 54% (7954/14728), 8.94 MiB | 8.86 MiB/s
+2023-11-12T09:00:16.4937069Z Receiving objects: 55% (8101/14728), 16.55 MiB | 10.97 MiB/s
+2023-11-12T09:00:16.4977595Z Receiving objects: 55% (8228/14728), 16.55 MiB | 10.97 MiB/s
+2023-11-12T09:00:16.5335682Z Receiving objects: 56% (8248/14728), 16.55 MiB | 10.97 MiB/s
+2023-11-12T09:00:16.5529510Z Receiving objects: 57% (8395/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:16.6298834Z Receiving objects: 58% (8543/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:16.6477417Z Receiving objects: 59% (8690/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:16.6877035Z Receiving objects: 60% (8837/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:16.7190945Z Receiving objects: 61% (8985/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:16.7421126Z Receiving objects: 62% (9132/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:16.7678021Z Receiving objects: 63% (9279/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:16.8523998Z Receiving objects: 64% (9426/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:17.1043001Z Receiving objects: 65% (9574/14728), 40.02 MiB | 19.93 MiB/s
+2023-11-12T09:00:17.3854775Z Receiving objects: 66% (9721/14728), 71.27 MiB | 28.42 MiB/s
+2023-11-12T09:00:17.4325550Z Receiving objects: 67% (9868/14728), 71.27 MiB | 28.42 MiB/s
+2023-11-12T09:00:17.4843860Z Receiving objects: 68% (10016/14728), 71.27 MiB | 28.42 MiB/s
+2023-11-12T09:00:17.4974216Z Receiving objects: 69% (10163/14728), 71.27 MiB | 28.42 MiB/s
+2023-11-12T09:00:17.5355293Z Receiving objects: 69% (10174/14728), 71.27 MiB | 28.42 MiB/s
+2023-11-12T09:00:17.6035052Z Receiving objects: 70% (10310/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.6662170Z Receiving objects: 71% (10457/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.7426342Z Receiving objects: 72% (10605/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.7732421Z Receiving objects: 73% (10752/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.7890371Z Receiving objects: 74% (10899/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.8003342Z Receiving objects: 75% (11046/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.8123812Z Receiving objects: 76% (11194/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.8868154Z Receiving objects: 77% (11341/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.9248750Z Receiving objects: 78% (11488/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.9430493Z Receiving objects: 79% (11636/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.9815619Z Receiving objects: 80% (11783/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:17.9897797Z Receiving objects: 81% (11930/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:18.0004021Z Receiving objects: 82% (12077/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:18.0065635Z Receiving objects: 83% (12225/14728), 104.98 MiB | 34.90 MiB/s
+2023-11-12T09:00:18.0133099Z Receiving objects: 84% (12372/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.0212448Z Receiving objects: 85% (12519/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.0292270Z Receiving objects: 86% (12667/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.0477194Z Receiving objects: 87% (12814/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1050651Z Receiving objects: 88% (12961/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1401134Z Receiving objects: 89% (13108/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1440829Z Receiving objects: 90% (13256/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1503769Z Receiving objects: 91% (13403/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1562677Z Receiving objects: 92% (13550/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1618314Z Receiving objects: 93% (13698/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1655496Z Receiving objects: 94% (13845/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1708799Z Receiving objects: 95% (13992/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1779590Z Receiving objects: 96% (14139/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1850924Z Receiving objects: 97% (14287/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1887710Z Receiving objects: 98% (14434/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1982209Z Receiving objects: 99% (14581/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1983900Z remote: Total 14728 (delta 1648), reused 9457 (delta 1437), pack-reused 0
+2023-11-12T09:00:18.1993200Z Receiving objects: 100% (14728/14728), 137.62 MiB | 39.23 MiB/s
+2023-11-12T09:00:18.1994500Z Receiving objects: 100% (14728/14728), 147.84 MiB | 39.90 MiB/s, done.
+2023-11-12T09:00:18.2019068Z Resolving deltas: 0% (0/1648)
+2023-11-12T09:00:18.2023348Z Resolving deltas: 1% (17/1648)
+2023-11-12T09:00:18.2032679Z Resolving deltas: 2% (33/1648)
+2023-11-12T09:00:18.2057515Z Resolving deltas: 3% (50/1648)
+2023-11-12T09:00:18.2067595Z Resolving deltas: 4% (66/1648)
+2023-11-12T09:00:18.2311083Z Resolving deltas: 5% (83/1648)
+2023-11-12T09:00:18.2318508Z Resolving deltas: 6% (99/1648)
+2023-11-12T09:00:18.2326847Z Resolving deltas: 7% (116/1648)
+2023-11-12T09:00:18.2335304Z Resolving deltas: 8% (132/1648)
+2023-11-12T09:00:18.2348077Z Resolving deltas: 9% (149/1648)
+2023-11-12T09:00:18.2360740Z Resolving deltas: 10% (165/1648)
+2023-11-12T09:00:18.2369574Z Resolving deltas: 11% (182/1648)
+2023-11-12T09:00:18.2383691Z Resolving deltas: 12% (198/1648)
+2023-11-12T09:00:18.2394926Z Resolving deltas: 13% (215/1648)
+2023-11-12T09:00:18.2398748Z Resolving deltas: 14% (231/1648)
+2023-11-12T09:00:18.2404491Z Resolving deltas: 15% (248/1648)
+2023-11-12T09:00:18.2406714Z Resolving deltas: 16% (264/1648)
+2023-11-12T09:00:18.2407998Z Resolving deltas: 17% (281/1648)
+2023-11-12T09:00:18.2409292Z Resolving deltas: 18% (297/1648)
+2023-11-12T09:00:18.2411513Z Resolving deltas: 19% (315/1648)
+2023-11-12T09:00:18.2413614Z Resolving deltas: 20% (330/1648)
+2023-11-12T09:00:18.2414462Z Resolving deltas: 21% (347/1648)
+2023-11-12T09:00:18.2418247Z Resolving deltas: 22% (363/1648)
+2023-11-12T09:00:18.2418936Z Resolving deltas: 23% (380/1648)
+2023-11-12T09:00:18.2419539Z Resolving deltas: 24% (396/1648)
+2023-11-12T09:00:18.2427604Z Resolving deltas: 25% (412/1648)
+2023-11-12T09:00:18.2432866Z Resolving deltas: 26% (429/1648)
+2023-11-12T09:00:18.2441981Z Resolving deltas: 27% (445/1648)
+2023-11-12T09:00:18.2447582Z Resolving deltas: 28% (462/1648)
+2023-11-12T09:00:18.2466027Z Resolving deltas: 29% (478/1648)
+2023-11-12T09:00:18.2471796Z Resolving deltas: 30% (495/1648)
+2023-11-12T09:00:18.2480036Z Resolving deltas: 31% (511/1648)
+2023-11-12T09:00:18.2490887Z Resolving deltas: 32% (528/1648)
+2023-11-12T09:00:18.2494739Z Resolving deltas: 33% (544/1648)
+2023-11-12T09:00:18.2502376Z Resolving deltas: 34% (561/1648)
+2023-11-12T09:00:18.2508410Z Resolving deltas: 35% (577/1648)
+2023-11-12T09:00:18.2513823Z Resolving deltas: 36% (594/1648)
+2023-11-12T09:00:18.2527222Z Resolving deltas: 37% (610/1648)
+2023-11-12T09:00:18.2537398Z Resolving deltas: 38% (627/1648)
+2023-11-12T09:00:18.2549132Z Resolving deltas: 39% (643/1648)
+2023-11-12T09:00:18.2554784Z Resolving deltas: 40% (660/1648)
+2023-11-12T09:00:18.2556656Z Resolving deltas: 41% (676/1648)
+2023-11-12T09:00:18.2557507Z Resolving deltas: 42% (693/1648)
+2023-11-12T09:00:18.2558588Z Resolving deltas: 43% (709/1648)
+2023-11-12T09:00:18.2559455Z Resolving deltas: 44% (727/1648)
+2023-11-12T09:00:18.2561210Z Resolving deltas: 45% (742/1648)
+2023-11-12T09:00:18.2562565Z Resolving deltas: 46% (760/1648)
+2023-11-12T09:00:18.2563347Z Resolving deltas: 47% (775/1648)
+2023-11-12T09:00:18.2564389Z Resolving deltas: 48% (792/1648)
+2023-11-12T09:00:18.2565291Z Resolving deltas: 49% (808/1648)
+2023-11-12T09:00:18.2566382Z Resolving deltas: 50% (824/1648)
+2023-11-12T09:00:18.2567240Z Resolving deltas: 51% (841/1648)
+2023-11-12T09:00:18.2568283Z Resolving deltas: 52% (857/1648)
+2023-11-12T09:00:18.2573986Z Resolving deltas: 53% (874/1648)
+2023-11-12T09:00:18.2578038Z Resolving deltas: 54% (890/1648)
+2023-11-12T09:00:18.2579766Z Resolving deltas: 55% (907/1648)
+2023-11-12T09:00:18.2583389Z Resolving deltas: 56% (923/1648)
+2023-11-12T09:00:18.2587856Z Resolving deltas: 57% (940/1648)
+2023-11-12T09:00:18.2589664Z Resolving deltas: 58% (956/1648)
+2023-11-12T09:00:18.2591411Z Resolving deltas: 59% (973/1648)
+2023-11-12T09:00:18.2594574Z Resolving deltas: 60% (989/1648)
+2023-11-12T09:00:18.2597339Z Resolving deltas: 61% (1006/1648)
+2023-11-12T09:00:18.2599661Z Resolving deltas: 62% (1022/1648)
+2023-11-12T09:00:18.2605805Z Resolving deltas: 63% (1039/1648)
+2023-11-12T09:00:18.2606445Z Resolving deltas: 64% (1055/1648)
+2023-11-12T09:00:18.2608833Z Resolving deltas: 65% (1072/1648)
+2023-11-12T09:00:18.2612033Z Resolving deltas: 66% (1088/1648)
+2023-11-12T09:00:18.2614253Z Resolving deltas: 67% (1105/1648)
+2023-11-12T09:00:18.2618118Z Resolving deltas: 68% (1121/1648)
+2023-11-12T09:00:18.2619827Z Resolving deltas: 69% (1138/1648)
+2023-11-12T09:00:18.2621203Z Resolving deltas: 70% (1154/1648)
+2023-11-12T09:00:18.2624401Z Resolving deltas: 71% (1171/1648)
+2023-11-12T09:00:18.2627592Z Resolving deltas: 72% (1187/1648)
+2023-11-12T09:00:18.2630703Z Resolving deltas: 73% (1204/1648)
+2023-11-12T09:00:18.2633542Z Resolving deltas: 74% (1220/1648)
+2023-11-12T09:00:18.2636165Z Resolving deltas: 75% (1236/1648)
+2023-11-12T09:00:18.2638056Z Resolving deltas: 76% (1253/1648)
+2023-11-12T09:00:18.2642611Z Resolving deltas: 77% (1269/1648)
+2023-11-12T09:00:18.2645574Z Resolving deltas: 78% (1286/1648)
+2023-11-12T09:00:18.2650111Z Resolving deltas: 79% (1302/1648)
+2023-11-12T09:00:18.2653615Z Resolving deltas: 80% (1319/1648)
+2023-11-12T09:00:18.2657080Z Resolving deltas: 81% (1335/1648)
+2023-11-12T09:00:18.2661192Z Resolving deltas: 82% (1352/1648)
+2023-11-12T09:00:18.2666443Z Resolving deltas: 83% (1368/1648)
+2023-11-12T09:00:18.2671066Z Resolving deltas: 84% (1385/1648)
+2023-11-12T09:00:18.2675875Z Resolving deltas: 85% (1401/1648)
+2023-11-12T09:00:18.2680749Z Resolving deltas: 86% (1418/1648)
+2023-11-12T09:00:18.2685418Z Resolving deltas: 87% (1434/1648)
+2023-11-12T09:00:18.2691672Z Resolving deltas: 88% (1451/1648)
+2023-11-12T09:00:18.2696947Z Resolving deltas: 89% (1467/1648)
+2023-11-12T09:00:18.2704268Z Resolving deltas: 90% (1484/1648)
+2023-11-12T09:00:18.2714966Z Resolving deltas: 91% (1500/1648)
+2023-11-12T09:00:18.2724238Z Resolving deltas: 92% (1518/1648)
+2023-11-12T09:00:18.2727054Z Resolving deltas: 93% (1533/1648)
+2023-11-12T09:00:18.2732989Z Resolving deltas: 94% (1550/1648)
+2023-11-12T09:00:18.2738406Z Resolving deltas: 95% (1567/1648)
+2023-11-12T09:00:18.2743401Z Resolving deltas: 96% (1583/1648)
+2023-11-12T09:00:18.2748306Z Resolving deltas: 97% (1599/1648)
+2023-11-12T09:00:18.2752079Z Resolving deltas: 98% (1616/1648)
+2023-11-12T09:00:18.2774732Z Resolving deltas: 99% (1632/1648)
+2023-11-12T09:00:18.2776965Z Resolving deltas: 100% (1648/1648)
+2023-11-12T09:00:18.2777617Z Resolving deltas: 100% (1648/1648), done.
+2023-11-12T09:00:18.4151233Z From https://github.com/tgstation/tgstation
+2023-11-12T09:00:18.4152324Z * [new ref] 0f52a54577af8e336ee4407c83bc6d3bfedd1d11 -> pull/79384/merge
+2023-11-12T09:00:18.4174692Z ##[endgroup]
+2023-11-12T09:00:18.4175546Z ##[group]Determining the checkout info
+2023-11-12T09:00:18.4177292Z ##[endgroup]
+2023-11-12T09:00:18.4178077Z ##[group]Checking out the ref
+2023-11-12T09:00:18.4182006Z [command]/usr/bin/git checkout --progress --force refs/remotes/pull/79384/merge
+2023-11-12T09:00:19.4499153Z Updating files: 65% (8853/13535)
+2023-11-12T09:00:19.4677754Z Updating files: 66% (8934/13535)
+2023-11-12T09:00:19.4881367Z Updating files: 67% (9069/13535)
+2023-11-12T09:00:19.5117589Z Updating files: 68% (9204/13535)
+2023-11-12T09:00:19.5393100Z Updating files: 69% (9340/13535)
+2023-11-12T09:00:19.5649915Z Updating files: 70% (9475/13535)
+2023-11-12T09:00:19.5885545Z Updating files: 71% (9610/13535)
+2023-11-12T09:00:19.6092470Z Updating files: 72% (9746/13535)
+2023-11-12T09:00:19.6193070Z Updating files: 73% (9881/13535)
+2023-11-12T09:00:19.6275200Z Updating files: 74% (10016/13535)
+2023-11-12T09:00:19.6366161Z Updating files: 75% (10152/13535)
+2023-11-12T09:00:19.6497650Z Updating files: 76% (10287/13535)
+2023-11-12T09:00:19.6864064Z Updating files: 77% (10422/13535)
+2023-11-12T09:00:19.6905958Z Updating files: 78% (10558/13535)
+2023-11-12T09:00:19.7095469Z Updating files: 79% (10693/13535)
+2023-11-12T09:00:19.7217904Z Updating files: 80% (10828/13535)
+2023-11-12T09:00:19.7299066Z Updating files: 81% (10964/13535)
+2023-11-12T09:00:19.7371348Z Updating files: 82% (11099/13535)
+2023-11-12T09:00:19.7439098Z Updating files: 83% (11235/13535)
+2023-11-12T09:00:19.7509681Z Updating files: 84% (11370/13535)
+2023-11-12T09:00:19.7583669Z Updating files: 85% (11505/13535)
+2023-11-12T09:00:19.7654399Z Updating files: 86% (11641/13535)
+2023-11-12T09:00:19.7761508Z Updating files: 87% (11776/13535)
+2023-11-12T09:00:19.7996111Z Updating files: 88% (11911/13535)
+2023-11-12T09:00:19.8212241Z Updating files: 89% (12047/13535)
+2023-11-12T09:00:19.8280038Z Updating files: 90% (12182/13535)
+2023-11-12T09:00:19.8351398Z Updating files: 91% (12317/13535)
+2023-11-12T09:00:19.8428752Z Updating files: 92% (12453/13535)
+2023-11-12T09:00:19.8508292Z Updating files: 93% (12588/13535)
+2023-11-12T09:00:19.8572225Z Updating files: 94% (12723/13535)
+2023-11-12T09:00:19.8650650Z Updating files: 95% (12859/13535)
+2023-11-12T09:00:19.8729362Z Updating files: 96% (12994/13535)
+2023-11-12T09:00:19.8829435Z Updating files: 97% (13129/13535)
+2023-11-12T09:00:19.8894699Z Updating files: 98% (13265/13535)
+2023-11-12T09:00:19.8994866Z Updating files: 99% (13400/13535)
+2023-11-12T09:00:19.8995690Z Updating files: 100% (13535/13535)
+2023-11-12T09:00:19.8996705Z Updating files: 100% (13535/13535), done.
+2023-11-12T09:00:19.9124545Z Note: switching to 'refs/remotes/pull/79384/merge'.
+2023-11-12T09:00:19.9125161Z
+2023-11-12T09:00:19.9125767Z You are in 'detached HEAD' state. You can look around, make experimental
+2023-11-12T09:00:19.9127145Z changes and commit them, and you can discard any commits you make in this
+2023-11-12T09:00:19.9128712Z state without impacting any branches by switching back to a branch.
+2023-11-12T09:00:19.9129440Z
+2023-11-12T09:00:19.9129888Z If you want to create a new branch to retain commits you create, you may
+2023-11-12T09:00:19.9131250Z do so (now or later) by using -c with the switch command. Example:
+2023-11-12T09:00:19.9131887Z
+2023-11-12T09:00:19.9132223Z git switch -c
+2023-11-12T09:00:19.9132633Z
+2023-11-12T09:00:19.9133095Z Or undo this operation with:
+2023-11-12T09:00:19.9133655Z
+2023-11-12T09:00:19.9133848Z git switch -
+2023-11-12T09:00:19.9134127Z
+2023-11-12T09:00:19.9134677Z Turn off this advice by setting config variable advice.detachedHead to false
+2023-11-12T09:00:19.9135426Z
+2023-11-12T09:00:19.9136195Z HEAD is now at 0f52a54 Merge 2104248ba951649225e5c5cb8168346f0220bdb7 into 1eb94ba2286812853f5c65b2557bf2f8f5e46d4f
+2023-11-12T09:00:19.9215939Z ##[endgroup]
+2023-11-12T09:00:19.9261644Z [command]/usr/bin/git log -1 --format='%H'
+2023-11-12T09:00:19.9293509Z '0f52a54577af8e336ee4407c83bc6d3bfedd1d11'
+2023-11-12T09:00:19.9616124Z ##[group]Run actions/cache@v3
+2023-11-12T09:00:19.9616601Z with:
+2023-11-12T09:00:19.9616946Z path: ~/BYOND
+2023-11-12T09:00:19.9617286Z key: Linux-byond-
+2023-11-12T09:00:19.9617686Z enableCrossOsArchive: false
+2023-11-12T09:00:19.9618092Z fail-on-cache-miss: false
+2023-11-12T09:00:19.9618460Z lookup-only: false
+2023-11-12T09:00:19.9618822Z ##[endgroup]
+2023-11-12T09:00:20.2859595Z Cache Size: ~4 MB (4090426 B)
+2023-11-12T09:00:20.2888527Z [command]/usr/bin/tar -xf /home/runner/work/_temp/edb2b23d-361f-4c19-b676-33998159e0b8/cache.tzst -P -C /home/runner/work/tgstation/tgstation --use-compress-program unzstd
+2023-11-12T09:00:20.3193378Z Cache restored successfully
+2023-11-12T09:00:20.3317264Z Cache restored from key: Linux-byond-
+2023-11-12T09:00:20.3451434Z ##[group]Run sudo systemctl start mysql
+2023-11-12T09:00:20.3452154Z [36;1msudo systemctl start mysql[0m
+2023-11-12T09:00:20.3452715Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci;'[0m
+2023-11-12T09:00:20.3453355Z [36;1mmysql -u root -proot tg_ci < SQL/tgstation_schema.sql[0m
+2023-11-12T09:00:20.3454118Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;'[0m
+2023-11-12T09:00:20.3454828Z [36;1mmysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql[0m
+2023-11-12T09:00:20.3513329Z shell: /usr/bin/bash -e {0}
+2023-11-12T09:00:20.3513775Z ##[endgroup]
+2023-11-12T09:00:23.5982676Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2023-11-12T09:00:23.6362129Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2023-11-12T09:00:24.0220158Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2023-11-12T09:00:24.0302175Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2023-11-12T09:00:24.3266576Z ##[group]Run bash tools/ci/install_rust_g.sh
+2023-11-12T09:00:24.3267216Z [36;1mbash tools/ci/install_rust_g.sh[0m
+2023-11-12T09:00:24.3311615Z shell: /usr/bin/bash -e {0}
+2023-11-12T09:00:24.3311996Z ##[endgroup]
+2023-11-12T09:00:24.6018389Z 2023-11-12 09:00:24 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/127494547/aea9a209-14bc-4b8b-b98c-1ba32c0aaf86?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231112%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231112T085850Z&X-Amz-Expires=300&X-Amz-Signature=c3e69a55ec6f839925bb9729c6b2e6b4d5b76b4855bfd64b96933c73f95a6734&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=127494547&response-content-disposition=attachment%3B%20filename%3Dlibrust_g.so&response-content-type=application%2Foctet-stream [66491316/66491316] -> "/home/runner/.byond/bin/librust_g.so" [1]
+2023-11-12T09:00:24.6320307Z linux-gate.so.1 (0xf7f74000)
+2023-11-12T09:00:24.6321993Z libz.so.1 => /lib32/libz.so.1 (0xf7f45000)
+2023-11-12T09:00:24.6322879Z libgcc_s.so.1 => /lib32/libgcc_s.so.1 (0xf7f1e000)
+2023-11-12T09:00:24.6323651Z libm.so.6 => /lib32/libm.so.6 (0xf7e16000)
+2023-11-12T09:00:24.6324533Z libc.so.6 => /lib32/libc.so.6 (0xf7400000)
+2023-11-12T09:00:24.6326012Z /lib/ld-linux.so.2 (0xf7f76000)
+2023-11-12T09:00:24.6368501Z ##[group]Run bash tools/ci/install_auxlua.sh
+2023-11-12T09:00:24.6369036Z [36;1mbash tools/ci/install_auxlua.sh[0m
+2023-11-12T09:00:24.6417060Z shell: /usr/bin/bash -e {0}
+2023-11-12T09:00:24.6417480Z ##[endgroup]
+2023-11-12T09:00:24.7086755Z 2023-11-12 09:00:24 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/473295481/ec517e6d-2695-477e-ae92-7645fee5b7ce?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20231112%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20231112T085916Z&X-Amz-Expires=300&X-Amz-Signature=e13d49b79e73a573dc4a351e5e9575d601b7f51fc16f9d3f03f959884cdf8941&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=473295481&response-content-disposition=attachment%3B%20filename%3Dlibauxlua.so&response-content-type=application%2Foctet-stream [6045340/6045340] -> "/home/runner/.byond/bin/libauxlua.so" [1]
+2023-11-12T09:00:24.7172511Z linux-gate.so.1 (0xf7f77000)
+2023-11-12T09:00:24.7173643Z libstdc++.so.6 => /lib32/libstdc++.so.6 (0xf7800000)
+2023-11-12T09:00:24.7174378Z libgcc_s.so.1 => /lib32/libgcc_s.so.1 (0xf7f3e000)
+2023-11-12T09:00:24.7175045Z libpthread.so.0 => /lib32/libpthread.so.0 (0xf7f39000)
+2023-11-12T09:00:24.7176413Z libm.so.6 => /lib32/libm.so.6 (0xf7e31000)
+2023-11-12T09:00:24.7177209Z libdl.so.2 => /lib32/libdl.so.2 (0xf7e2c000)
+2023-11-12T09:00:24.7177918Z libc.so.6 => /lib32/libc.so.6 (0xf7400000)
+2023-11-12T09:00:24.7178575Z /lib/ld-linux.so.2 (0xf7f79000)
+2023-11-12T09:00:24.7231003Z ##[group]Run bash tools/ci/install_byond.sh
+2023-11-12T09:00:24.7231555Z [36;1mbash tools/ci/install_byond.sh[0m
+2023-11-12T09:00:24.7232077Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2023-11-12T09:00:24.7232805Z [36;1mtools/build/build --ci dm -DCIBUILDING -DANSICOLORS -WError -NWTG0001[0m
+2023-11-12T09:00:24.7274898Z shell: /usr/bin/bash -e {0}
+2023-11-12T09:00:24.7275297Z ##[endgroup]
+2023-11-12T09:00:24.7365575Z Setting up BYOND.
+2023-11-12T09:00:24.7497243Z % Total % Received % Xferd Average Speed Time Time Time Current
+2023-11-12T09:00:24.7498339Z Dload Upload Total Spent Left Speed
+2023-11-12T09:00:24.7499103Z
+2023-11-12T09:00:24.7733411Z 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
+2023-11-12T09:00:24.7884475Z 0 4021k 0 4979 0 0 203k 0 0:00:19 --:--:-- 0:00:19 202k
+2023-11-12T09:00:24.7885997Z 100 4021k 100 4021k 0 0 100M 0 --:--:-- --:--:-- --:--:-- 100M
+2023-11-12T09:00:24.8068033Z Archive: byond.zip
+2023-11-12T09:00:24.8069055Z creating: byond/
+2023-11-12T09:00:24.8069884Z creating: byond/key/
+2023-11-12T09:00:24.8071025Z creating: byond/web/
+2023-11-12T09:00:24.8073333Z inflating: byond/web/child.dms
+2023-11-12T09:00:24.8074283Z inflating: byond/web/button.dms
+2023-11-12T09:00:24.8076478Z inflating: byond/web/input.dms
+2023-11-12T09:00:24.8077391Z inflating: byond/web/text.dms
+2023-11-12T09:00:24.8176215Z inflating: byond/web/webclient.dart.js
+2023-11-12T09:00:24.8177154Z inflating: byond/web/verbmenu.dms
+2023-11-12T09:00:24.8178296Z inflating: byond/web/defaultSkin.dms
+2023-11-12T09:00:24.8179798Z inflating: byond/web/hotbar.dms
+2023-11-12T09:00:24.8180913Z inflating: byond/web/label.dms
+2023-11-12T09:00:24.8181973Z inflating: byond/web/alert.dms
+2023-11-12T09:00:24.8182843Z inflating: byond/web/message.dms
+2023-11-12T09:00:24.8183665Z inflating: byond/web/drag.png
+2023-11-12T09:00:24.8185004Z inflating: byond/web/map.dms
+2023-11-12T09:00:24.8186150Z inflating: byond/web/splashlogo.png
+2023-11-12T09:00:24.8186893Z inflating: byond/web/drop.png
+2023-11-12T09:00:24.8282279Z inflating: byond/web/ext.js
+2023-11-12T09:00:24.8283075Z inflating: byond/web/file.dms
+2023-11-12T09:00:24.8284575Z inflating: byond/web/grid.dms
+2023-11-12T09:00:24.8286207Z inflating: byond/web/bar.dms
+2023-11-12T09:00:24.8288946Z inflating: byond/web/dpad.dms
+2023-11-12T09:00:24.8289936Z inflating: byond/web/output.dms
+2023-11-12T09:00:24.8291365Z inflating: byond/web/tab.dms
+2023-11-12T09:00:24.8293155Z inflating: byond/web/info.dms
+2023-11-12T09:00:24.8294881Z inflating: byond/web/color.dms
+2023-11-12T09:00:24.8296103Z inflating: byond/web/gamepad.dms
+2023-11-12T09:00:24.8297532Z inflating: byond/web/browser.dms
+2023-11-12T09:00:24.8298158Z inflating: byond/web/status.dms
+2023-11-12T09:00:24.8299313Z inflating: byond/web/any.dms
+2023-11-12T09:00:24.8300438Z inflating: byond/web/pane.dms
+2023-11-12T09:00:24.8302172Z inflating: byond/web/pop.dms
+2023-11-12T09:00:24.8303255Z inflating: byond/license.txt
+2023-11-12T09:00:24.8303882Z inflating: byond/legal.txt
+2023-11-12T09:00:24.8305048Z inflating: byond/Makefile
+2023-11-12T09:00:24.8305748Z creating: byond/man/
+2023-11-12T09:00:24.8306319Z creating: byond/man/man6/
+2023-11-12T09:00:24.8307604Z inflating: byond/man/man6/DreamDaemon.6
+2023-11-12T09:00:24.8308434Z inflating: byond/man/man6/DreamMaker.6
+2023-11-12T09:00:24.8309437Z creating: byond/lib/
+2023-11-12T09:00:24.8310004Z creating: byond/host/
+2023-11-12T09:00:24.8311286Z inflating: byond/host/readme.html
+2023-11-12T09:00:24.8312492Z inflating: byond/host/readme-unix.txt
+2023-11-12T09:00:24.8313289Z creating: byond/host/home/
+2023-11-12T09:00:24.8314244Z creating: byond/host/home/root/
+2023-11-12T09:00:24.8315083Z creating: byond/host/home/root/byond/
+2023-11-12T09:00:24.8315883Z creating: byond/host/home/root/byond/tools/
+2023-11-12T09:00:24.8316724Z creating: byond/host/home/root/byond/tools/root/
+2023-11-12T09:00:24.8321401Z inflating: byond/host/home/root/byond/tools/root/root.dmb
+2023-11-12T09:00:24.8322363Z creating: byond/host/shared/
+2023-11-12T09:00:24.8323118Z creating: byond/host/shared/byond/
+2023-11-12T09:00:24.8323939Z creating: byond/host/shared/byond/tools/
+2023-11-12T09:00:24.8324697Z creating: byond/host/shared/byond/tools/ftp/
+2023-11-12T09:00:24.8326100Z inflating: byond/host/shared/byond/tools/ftp/ftp.dmb
+2023-11-12T09:00:24.8327214Z creating: byond/host/shared/byond/tools/admin/
+2023-11-12T09:00:24.8332506Z inflating: byond/host/shared/byond/tools/admin/admin.dmb
+2023-11-12T09:00:24.8333692Z creating: byond/host/shared-web/
+2023-11-12T09:00:24.8334536Z creating: byond/host/shared-web/web/
+2023-11-12T09:00:24.8335395Z creating: byond/host/shared-web/web/tools/
+2023-11-12T09:00:24.8336389Z creating: byond/host/shared-web/web/tools/admin/
+2023-11-12T09:00:24.8340610Z inflating: byond/host/shared-web/web/tools/admin/index.dmb
+2023-11-12T09:00:24.8347816Z inflating: byond/host/host.dmb
+2023-11-12T09:00:24.8348686Z inflating: byond/host/host.start
+2023-11-12T09:00:24.8349570Z inflating: byond/host/hostconf.orig
+2023-11-12T09:00:24.8350612Z inflating: byond/host/hostconf.txt
+2023-11-12T09:00:24.8351646Z inflating: byond/readme.txt
+2023-11-12T09:00:24.8352393Z creating: byond/bin/
+2023-11-12T09:00:24.8353203Z inflating: byond/bin/byondexec
+2023-11-12T09:00:24.8355525Z inflating: byond/bin/DreamDownload
+2023-11-12T09:00:24.8915164Z inflating: byond/bin/libbyond.so
+2023-11-12T09:00:24.9052390Z inflating: byond/bin/libext.so
+2023-11-12T09:00:24.9056691Z inflating: byond/bin/DreamDaemon
+2023-11-12T09:00:24.9060064Z inflating: byond/bin/DreamMaker
+2023-11-12T09:00:24.9060916Z creating: byond/cfg/
+2023-11-12T09:00:24.9061543Z inflating: byond/cfg/release.txt
+2023-11-12T09:00:24.9218525Z ***************************
+2023-11-12T09:00:24.9225188Z Now run the following command:
+2023-11-12T09:00:24.9233824Z
+2023-11-12T09:00:24.9243155Z source /home/runner/BYOND/byond/bin/byondsetup
+2023-11-12T09:00:24.9251769Z
+2023-11-12T09:00:24.9259232Z If it generates errors, your shell is not compatible with 'sh', so you will
+2023-11-12T09:00:24.9265751Z have to edit byondsetup and make it work with your shell. If the script works, you should be able to run DreamDaemon.
+2023-11-12T09:00:24.9273703Z
+2023-11-12T09:00:24.9280708Z IMPORTANT: once you have the script working, you must add the above line
+2023-11-12T09:00:24.9287739Z to your startup script. The name of your startup script depends on the
+2023-11-12T09:00:24.9294443Z shell you use. Typical ones are .profile or .bash_profile.
+2023-11-12T09:00:24.9302682Z
+2023-11-12T09:00:24.9309851Z Once everything is working, you can find out more about the software
+2023-11-12T09:00:24.9316763Z by doing 'man DreamDaemon'. A host server has also been included
+2023-11-12T09:00:24.9323620Z so edit host/hostconf.txt and boot up your world server!
+2023-11-12T09:00:24.9330177Z ***************************
+2023-11-12T09:00:24.9736645Z Using system-wide Node v18.18.2
+2023-11-12T09:00:25.1112864Z :: Juke Build version 0.8.1
+2023-11-12T09:00:25.3377241Z => Starting 'dm'
+2023-11-12T09:00:25.3385788Z :: Using defines: CBT, CIBUILDING, ANSICOLORS
+2023-11-12T09:00:25.6662719Z DM compiler version 514.1588
+2023-11-12T09:00:25.6663169Z loading tgstation.m.dme
+2023-11-12T09:00:25.9197564Z code/__DEFINES/qdel.dm:22:warning: #warn TG0001 qdel REFERENCE_TRACKING enabled
+2023-11-12T09:00:36.5749452Z loading interface/skin.dmf
+2023-11-12T09:01:29.5751892Z loading map_files/generic/CentCom.dmm
+2023-11-12T09:01:29.9653644Z saving tgstation.m.dmb (DEBUG mode)
+2023-11-12T09:01:30.6467137Z tgstation.m.dmb - 0 errors, 1 warning (11/12/23 9:01 am)
+2023-11-12T09:01:30.6468251Z Total time: 1:05
+2023-11-12T09:01:31.6898602Z => Finished 'dm' in 66.352s
+2023-11-12T09:01:31.6901009Z => Done in 66.578s
+2023-11-12T09:01:31.7007243Z ##[group]Run source $HOME/BYOND/byond/bin/byondsetup
+2023-11-12T09:01:31.7007981Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2023-11-12T09:01:31.7008503Z [36;1mbash tools/ci/run_server.sh tramstation[0m
+2023-11-12T09:01:31.7058146Z shell: /usr/bin/bash -e {0}
+2023-11-12T09:01:31.7058547Z ##[endgroup]
+2023-11-12T09:01:31.7139001Z Testing tramstation
+2023-11-12T09:01:32.0865721Z cp: cannot stat 'tgui/packages/tgfont/dist/*': No such file or directory
+2023-11-12T09:01:32.1025274Z Sun Nov 12 09:01:32 2023
+2023-11-12T09:01:32.1026062Z World opened on network port 34125.
+2023-11-12T09:01:32.1026759Z Welcome BYOND! (5.0 Public Version 514.1588)
+2023-11-12T09:01:54.2375415Z World loaded at 09:01:54!
+2023-11-12T09:01:54.2376123Z Running /tg/ revision:
+2023-11-12T09:01:54.2376721Z No commit information
+2023-11-12T09:01:54.2377340Z Running rust-g version 3.0.0
+2023-11-12T09:01:54.2445249Z Loading config file config.txt...
+2023-11-12T09:01:54.2449139Z Loading config file maps.txt...
+2023-11-12T09:01:54.2703464Z Unable to locate admins backup file.
+2023-11-12T09:01:55.2792475Z Initialized Title Screen subsystem within 0 seconds!
+2023-11-12T09:01:55.2793681Z Initialized Server Tasks subsystem within 0 seconds!
+2023-11-12T09:01:55.2795047Z Initialized Input subsystem within 0 seconds!
+2023-11-12T09:01:55.2858203Z Initialized Profiler subsystem within 0 seconds!
+2023-11-12T09:01:55.2859689Z Initialized Database subsystem within 0 seconds!
+2023-11-12T09:01:55.2862218Z Initialized Blackbox subsystem within 0 seconds!
+2023-11-12T09:01:55.2938165Z Initialized Sounds subsystem within 0.01 seconds!
+2023-11-12T09:01:55.3061210Z Initialized Instruments subsystem within 0.01 seconds!
+2023-11-12T09:01:55.8390630Z Initialized Greyscale subsystem within 0.53 seconds!
+2023-11-12T09:01:55.8391416Z Initialized Vis contents overlays subsystem within 0 seconds!
+2023-11-12T09:01:55.8392841Z Initialized Security Level subsystem within 0 seconds!
+2023-11-12T09:01:55.8412303Z Initialized Station subsystem within 0 seconds!
+2023-11-12T09:01:55.8426733Z Initialized Quirks subsystem within 0 seconds!
+2023-11-12T09:01:55.8553936Z Initialized Reagents subsystem within 0.01 seconds!
+2023-11-12T09:01:55.8563912Z Initialized Events subsystem within 0 seconds!
+2023-11-12T09:01:55.8612984Z Initialized IDs and Access subsystem within 0 seconds!
+2023-11-12T09:01:55.8616522Z Initialized Jobs subsystem within 0 seconds!
+2023-11-12T09:01:55.8618600Z Initialized AI movement subsystem within 0 seconds!
+2023-11-12T09:01:55.8637284Z Initialized Ticker subsystem within 0 seconds!
+2023-11-12T09:01:55.8693586Z Initialized AI Controller Ticker subsystem within 0.01 seconds!
+2023-11-12T09:01:55.8697702Z Initialized AI Behavior Ticker subsystem within 0 seconds!
+2023-11-12T09:01:55.8821358Z Initialized Trading Card Game subsystem within 0.01 seconds!
+2023-11-12T09:01:55.8968123Z Loading Tramstation...
+2023-11-12T09:01:57.4366548Z Loaded Station in 1.6s!
+2023-11-12T09:01:58.7018385Z Loaded Lavaland in 1.3s!
+2023-11-12T09:01:59.6958478Z All ruins being loaded for map testing.
+2023-11-12T09:01:59.6960551Z Ruin loader finished with 0 left to spend.
+2023-11-12T09:01:59.6963383Z All ruins being loaded for map testing.
+2023-11-12T09:01:59.6966951Z Ruin loader finished with 0 left to spend.
+2023-11-12T09:01:59.8030218Z Cave Generator terrain generation finished in 0.1s!
+2023-11-12T09:01:59.8242156Z Cave Generator terrain generation finished in 0s!
+2023-11-12T09:02:00.0123579Z Cave Generator terrain population finished in 0.1s!
+2023-11-12T09:02:00.0174657Z Cave Generator terrain population finished in 0s!
+2023-11-12T09:02:00.4204586Z Initialized Mapping subsystem within 4.54 seconds!
+2023-11-12T09:02:18.7137331Z Initialized Early Assets subsystem within 18.29 seconds!
+2023-11-12T09:02:18.7960177Z Initialized Research subsystem within 0.08 seconds!
+2023-11-12T09:02:18.7964943Z Initialized Time Tracking subsystem within 0 seconds!
+2023-11-12T09:02:18.8516125Z Initialized Spatial Grid subsystem within 0.05 seconds!
+2023-11-12T09:02:18.8519915Z Initialized Economy subsystem within 0 seconds!
+2023-11-12T09:02:18.8529046Z Initialized Restaurant subsystem within 0 seconds!
+2023-11-12T09:02:24.3564078Z The BYOND hub reports that port 34125 is not reachable.
+2023-11-12T09:03:00.5242715Z ## NOTICE: morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!
+2023-11-12T09:03:08.8938364Z Initialized Atoms subsystem within 50.04 seconds!
+2023-11-12T09:03:08.9459509Z Initialized Language subsystem within 0.01 seconds!
+2023-11-12T09:03:09.0602930Z Initialized Machines subsystem within 0.11 seconds!
+2023-11-12T09:03:09.0612163Z Initialized Skills subsystem within 0 seconds!
+2023-11-12T09:03:09.0615253Z Initialized Queue Links subsystem within 0 seconds!
+2023-11-12T09:03:09.0619204Z Initialized Addiction subsystem within 0 seconds!
+2023-11-12T09:03:09.0639408Z Initialized Blackmarket subsystem within 0 seconds!
+2023-11-12T09:03:09.0647224Z Initialized Disease subsystem within 0 seconds!
+2023-11-12T09:03:09.0650704Z Initialized Fluid subsystem within 0 seconds!
+2023-11-12T09:03:09.0654199Z Initialized Smoke subsystem within 0 seconds!
+2023-11-12T09:03:09.0657541Z Initialized Foam subsystem within 0 seconds!
+2023-11-12T09:03:09.0660882Z Initialized Lag Switch subsystem within 0 seconds!
+2023-11-12T09:03:09.0888582Z Initialized Library Loading subsystem within 0.02 seconds!
+2023-11-12T09:03:09.2645071Z Initialized Lua Scripting subsystem within 0.18 seconds!
+2023-11-12T09:03:09.2735036Z Initialized Modular Computers subsystem within 0.01 seconds!
+2023-11-12T09:03:09.2737635Z Initialized Night Shift subsystem within 0 seconds!
+2023-11-12T09:03:09.2741231Z Initialized Stock Market subsystem within 0 seconds!
+2023-11-12T09:03:09.2743761Z Initialized Sun subsystem within 0 seconds!
+2023-11-12T09:03:09.2792256Z Initialized Traitor subsystem within 0 seconds!
+2023-11-12T09:03:09.2795417Z Initialized Tutorials subsystem within 0 seconds!
+2023-11-12T09:03:09.3133961Z Initialized Wardrobe subsystem within 0.03 seconds!
+2023-11-12T09:03:09.3136967Z Initialized Weather subsystem within 0 seconds!
+2023-11-12T09:03:09.3140470Z Initialized Wiremod Composite Templates subsystem within 0 seconds!
+2023-11-12T09:03:14.7053894Z Initialized Atmospherics subsystem within 5.39 seconds!
+2023-11-12T09:03:14.7127034Z Initialized Persistence subsystem within 0.01 seconds!
+2023-11-12T09:03:14.7131026Z Initialized Persistent Paintings subsystem within 0 seconds!
+2023-11-12T09:03:14.7134716Z Initialized Vote subsystem within 0 seconds!
+2023-11-12T09:03:25.6600909Z Initialized Assets subsystem within 10.95 seconds!
+2023-11-12T09:03:29.1318017Z Initialized Icon Smoothing subsystem within 3.42 seconds!
+2023-11-12T09:03:29.1329352Z Initialized XKeyScore subsystem within 0 seconds!
+2023-11-12T09:03:29.1349808Z Initialized PRISM subsystem within 0 seconds!
+2023-11-12T09:03:39.5066635Z Initialized Lighting subsystem within 10.37 seconds!
+2023-11-12T09:03:42.0097538Z Initialized Shuttle subsystem within 2.5 seconds!
+2023-11-12T09:03:42.0100528Z Initialized Pathfinder subsystem within 0 seconds!
+2023-11-12T09:03:42.0112119Z Initialized Ban Cache subsystem within 0 seconds!
+2023-11-12T09:03:42.0114877Z Initialized Init Profiler subsystem within 0 seconds!
+2023-11-12T09:03:42.0117470Z Initialized Chat subsystem within 0 seconds!
+2023-11-12T09:03:42.0119918Z Initializations complete within 106.8 seconds!
+2023-11-12T09:03:42.0699329Z Game start took 0s
+2023-11-12T09:03:53.5395990Z ##[group]/datum/unit_test/log_mapping
+2023-11-12T09:03:53.5399338Z [1;32mPASS[0m /datum/unit_test/log_mapping 0s
+2023-11-12T09:03:53.5400530Z ##[endgroup]
+2023-11-12T09:03:53.5529741Z ##[group]/datum/unit_test/abductor_baton_spell
+2023-11-12T09:03:53.6248315Z [1;32mPASS[0m /datum/unit_test/abductor_baton_spell 0.1s
+2023-11-12T09:03:53.6250017Z ##[endgroup]
+2023-11-12T09:03:53.7293652Z ##[group]/datum/unit_test/ablative_hood_hud
+2023-11-12T09:03:53.7538980Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud 0s
+2023-11-12T09:03:53.7540945Z ##[endgroup]
+2023-11-12T09:03:53.8177940Z ##[group]/datum/unit_test/ablative_hood_hud_with_helmet
+2023-11-12T09:03:53.8373528Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud_with_helmet 0s
+2023-11-12T09:03:53.8375040Z ##[endgroup]
+2023-11-12T09:03:53.9037089Z ##[group]/datum/unit_test/achievements
+2023-11-12T09:03:53.9146939Z [1;32mPASS[0m /datum/unit_test/achievements 0s
+2023-11-12T09:03:53.9148600Z ##[endgroup]
+2023-11-12T09:03:53.9709749Z ##[group]/datum/unit_test/anchored_mobs
+2023-11-12T09:03:53.9714871Z [1;32mPASS[0m /datum/unit_test/anchored_mobs 0s
+2023-11-12T09:03:53.9717149Z ##[endgroup]
+2023-11-12T09:03:54.0290915Z ##[group]/datum/unit_test/anonymous_themes
+2023-11-12T09:03:54.1282674Z [1;32mPASS[0m /datum/unit_test/anonymous_themes 0.1s
+2023-11-12T09:03:54.1284602Z ##[endgroup]
+2023-11-12T09:03:54.2369870Z ##[group]/datum/unit_test/revolution_conversion
+2023-11-12T09:03:54.2811074Z [1;32mPASS[0m /datum/unit_test/revolution_conversion 0s
+2023-11-12T09:03:54.2812989Z ##[endgroup]
+2023-11-12T09:03:54.3619950Z ##[group]/datum/unit_test/cult_conversion
+2023-11-12T09:03:54.4185381Z [1;32mPASS[0m /datum/unit_test/cult_conversion 0.1s
+2023-11-12T09:03:54.4187014Z ##[endgroup]
+2023-11-12T09:03:54.5109339Z ##[group]/datum/unit_test/antag_moodlets
+2023-11-12T09:03:54.5391588Z [1;32mPASS[0m /datum/unit_test/antag_moodlets 0s
+2023-11-12T09:03:54.5393248Z ##[endgroup]
+2023-11-12T09:03:54.6099817Z ##[group]/datum/unit_test/armor_verification
+2023-11-12T09:03:54.6105398Z [1;32mPASS[0m /datum/unit_test/armor_verification 0s
+2023-11-12T09:03:54.6107086Z ##[endgroup]
+2023-11-12T09:03:54.6711998Z ##[group]/datum/unit_test/autowiki
+2023-11-12T09:03:56.4795605Z [1;32mPASS[0m /datum/unit_test/autowiki 1.8s
+2023-11-12T09:03:56.4797118Z ##[endgroup]
+2023-11-12T09:03:56.5376207Z ##[group]/datum/unit_test/autowiki_include_template
+2023-11-12T09:03:56.5378371Z [1;32mPASS[0m /datum/unit_test/autowiki_include_template 0s
+2023-11-12T09:03:56.5380504Z ##[endgroup]
+2023-11-12T09:03:56.6003986Z ##[group]/datum/unit_test/barsigns_icon
+2023-11-12T09:03:56.6303581Z [1;32mPASS[0m /datum/unit_test/barsigns_icon 0.1s
+2023-11-12T09:03:56.6305267Z ##[endgroup]
+2023-11-12T09:03:56.6912219Z ##[group]/datum/unit_test/barsigns_name
+2023-11-12T09:03:56.6914950Z [1;32mPASS[0m /datum/unit_test/barsigns_name 0s
+2023-11-12T09:03:56.6917244Z ##[endgroup]
+2023-11-12T09:03:56.7530053Z ##[group]/datum/unit_test/baseturfs_unmodified_scrape
+2023-11-12T09:03:56.7541656Z [1;32mPASS[0m /datum/unit_test/baseturfs_unmodified_scrape 0s
+2023-11-12T09:03:56.7543322Z ##[endgroup]
+2023-11-12T09:03:56.8163460Z ##[group]/datum/unit_test/baseturfs_placed_on_top
+2023-11-12T09:03:56.8173471Z [1;32mPASS[0m /datum/unit_test/baseturfs_placed_on_top 0s
+2023-11-12T09:03:56.8175579Z ##[endgroup]
+2023-11-12T09:03:56.8789484Z ##[group]/datum/unit_test/baseturfs_placed_on_bottom
+2023-11-12T09:03:56.8806366Z [1;32mPASS[0m /datum/unit_test/baseturfs_placed_on_bottom 0s
+2023-11-12T09:03:56.8808190Z ##[endgroup]
+2023-11-12T09:03:56.9420497Z ##[group]/datum/unit_test/bespoke_id
+2023-11-12T09:03:56.9422999Z [1;32mPASS[0m /datum/unit_test/bespoke_id 0s
+2023-11-12T09:03:56.9425227Z ##[endgroup]
+2023-11-12T09:03:57.1727331Z ##[group]/datum/unit_test/binary_insert
+2023-11-12T09:03:57.1728436Z [1;32mPASS[0m /datum/unit_test/binary_insert 0s
+2023-11-12T09:03:57.1730597Z ##[endgroup]
+2023-11-12T09:03:57.2270246Z ##[group]/datum/unit_test/bitrunner_vdom_settings
+2023-11-12T09:03:57.2368664Z [1;32mPASS[0m /datum/unit_test/bitrunner_vdom_settings 0s
+2023-11-12T09:03:57.2370507Z ##[endgroup]
+2023-11-12T09:03:57.2860471Z ##[group]/datum/unit_test/blindness
+2023-11-12T09:03:57.3060031Z [1;32mPASS[0m /datum/unit_test/blindness 0.1s
+2023-11-12T09:03:57.3061453Z ##[endgroup]
+2023-11-12T09:03:57.3685247Z ##[group]/datum/unit_test/nearsightedness
+2023-11-12T09:03:57.3856666Z [1;32mPASS[0m /datum/unit_test/nearsightedness 0s
+2023-11-12T09:03:57.3857831Z ##[endgroup]
+2023-11-12T09:03:57.4094606Z ##[group]/datum/unit_test/eye_damage
+2023-11-12T09:03:57.4266705Z [1;32mPASS[0m /datum/unit_test/eye_damage 0s
+2023-11-12T09:03:57.4268768Z ##[endgroup]
+2023-11-12T09:03:57.4514012Z ##[group]/datum/unit_test/bloody_footprints
+2023-11-12T09:03:57.4771474Z [1;32mPASS[0m /datum/unit_test/bloody_footprints 0s
+2023-11-12T09:03:57.4773523Z ##[endgroup]
+2023-11-12T09:03:57.5095312Z ##[group]/datum/unit_test/breath/breath_sanity
+2023-11-12T09:03:57.5793797Z [1;32mPASS[0m /datum/unit_test/breath/breath_sanity 0s
+2023-11-12T09:03:57.5795766Z ##[endgroup]
+2023-11-12T09:03:57.6356372Z ##[group]/datum/unit_test/breath/breath_sanity_plasmamen
+2023-11-12T09:03:57.6920259Z [1;32mPASS[0m /datum/unit_test/breath/breath_sanity_plasmamen 0s
+2023-11-12T09:03:57.6922126Z ##[endgroup]
+2023-11-12T09:03:57.7478880Z ##[group]/datum/unit_test/breath/breath_sanity_ashwalker
+2023-11-12T09:03:57.7793279Z [1;32mPASS[0m /datum/unit_test/breath/breath_sanity_ashwalker 0s
+2023-11-12T09:03:57.7794768Z ##[endgroup]
+2023-11-12T09:03:57.8063286Z ##[group]/datum/unit_test/burning
+2023-11-12T09:03:57.8235820Z [1;32mPASS[0m /datum/unit_test/burning 0s
+2023-11-12T09:03:57.8237580Z ##[endgroup]
+2023-11-12T09:03:57.8463809Z ##[group]/datum/unit_test/cable_powernets
+2023-11-12T09:03:57.8467369Z [1;32mPASS[0m /datum/unit_test/cable_powernets 0s
+2023-11-12T09:03:57.8468842Z ##[endgroup]
+2023-11-12T09:03:57.8681387Z ##[group]/datum/unit_test/card_mismatch
+2023-11-12T09:03:57.8715332Z [1;32mPASS[0m /datum/unit_test/card_mismatch 0s
+2023-11-12T09:03:57.8717822Z ##[endgroup]
+2023-11-12T09:03:57.8839316Z ##[group]/datum/unit_test/cardboard_cutouts
+2023-11-12T09:03:57.8847499Z cardboard_cutouts_normal_cutout was put in data/screenshots_new
+2023-11-12T09:03:58.1374772Z cardboard_cutouts_nukie_cutout was put in data/screenshots_new
+2023-11-12T09:03:58.1378574Z cardboard_cutouts_nukie_cutout_pushed was put in data/screenshots_new
+2023-11-12T09:03:58.1547388Z cardboard_cutouts_xenomorph_cutout was put in data/screenshots_new
+2023-11-12T09:03:58.1550933Z [1;32mPASS[0m /datum/unit_test/cardboard_cutouts 0.3s
+2023-11-12T09:03:58.1553499Z ##[endgroup]
+2023-11-12T09:03:58.2402466Z ##[group]/datum/unit_test/chain_pull_through_space
+2023-11-12T09:03:58.2453035Z [1;32mPASS[0m /datum/unit_test/chain_pull_through_space 0s
+2023-11-12T09:03:58.2454853Z ##[endgroup]
+2023-11-12T09:03:58.3033483Z ##[group]/datum/unit_test/transformation_sting
+2023-11-12T09:03:59.7549687Z transformation_sting_appearances was put in data/screenshots_new
+2023-11-12T09:03:59.7551965Z [1;32mPASS[0m /datum/unit_test/transformation_sting 1.4s
+2023-11-12T09:03:59.7553272Z ##[endgroup]
+2023-11-12T09:03:59.7969350Z ##[group]/datum/unit_test/chat_filter_sanity
+2023-11-12T09:03:59.7976589Z [1;32mPASS[0m /datum/unit_test/chat_filter_sanity 0s
+2023-11-12T09:03:59.7978237Z ##[endgroup]
+2023-11-12T09:03:59.8105892Z ##[group]/datum/unit_test/circuit_component_category
+2023-11-12T09:03:59.8107746Z [1;32mPASS[0m /datum/unit_test/circuit_component_category 0s
+2023-11-12T09:03:59.8109947Z ##[endgroup]
+2023-11-12T09:03:59.8879728Z ##[group]/datum/unit_test/client_colours
+2023-11-12T09:03:59.8889068Z [1;32mPASS[0m /datum/unit_test/client_colours 0s
+2023-11-12T09:03:59.8891665Z ##[endgroup]
+2023-11-12T09:03:59.9525316Z ##[group]/datum/unit_test/closets
+2023-11-12T09:04:01.8031965Z [1;32mPASS[0m /datum/unit_test/closets 1.9s
+2023-11-12T09:04:01.8033340Z ##[endgroup]
+2023-11-12T09:04:02.6399153Z ##[group]/datum/unit_test/clothing_under_armor_subtype_check
+2023-11-12T09:04:02.6403381Z [1;32mPASS[0m /datum/unit_test/clothing_under_armor_subtype_check 0s
+2023-11-12T09:04:02.6405014Z ##[endgroup]
+2023-11-12T09:04:02.7020573Z ##[group]/datum/unit_test/harm_punch
+2023-11-12T09:04:02.7364226Z [1;32mPASS[0m /datum/unit_test/harm_punch 0s
+2023-11-12T09:04:02.7366615Z ##[endgroup]
+2023-11-12T09:04:02.7919290Z ##[group]/datum/unit_test/harm_melee
+2023-11-12T09:04:02.8266028Z [1;32mPASS[0m /datum/unit_test/harm_melee 0.1s
+2023-11-12T09:04:02.8268574Z ##[endgroup]
+2023-11-12T09:04:02.8738136Z ##[group]/datum/unit_test/harm_different_damage
+2023-11-12T09:04:02.9125671Z [1;32mPASS[0m /datum/unit_test/harm_different_damage 0.1s
+2023-11-12T09:04:02.9127697Z ##[endgroup]
+2023-11-12T09:04:02.9510991Z ##[group]/datum/unit_test/attack_chain
+2023-11-12T09:04:02.9859497Z [1;32mPASS[0m /datum/unit_test/attack_chain 0s
+2023-11-12T09:04:02.9861383Z ##[endgroup]
+2023-11-12T09:04:03.0312671Z ##[group]/datum/unit_test/disarm
+2023-11-12T09:04:03.0675162Z [1;32mPASS[0m /datum/unit_test/disarm 0s
+2023-11-12T09:04:03.0677029Z ##[endgroup]
+2023-11-12T09:04:03.1122424Z ##[group]/datum/unit_test/self_punch
+2023-11-12T09:04:03.1297149Z [1;32mPASS[0m /datum/unit_test/self_punch 0s
+2023-11-12T09:04:03.1299012Z ##[endgroup]
+2023-11-12T09:04:03.1617839Z ##[group]/datum/unit_test/handcuff_punch
+2023-11-12T09:04:03.1949728Z [1;32mPASS[0m /datum/unit_test/handcuff_punch 0s
+2023-11-12T09:04:03.1950695Z ##[endgroup]
+2023-11-12T09:04:03.2665996Z ##[group]/datum/unit_test/handcuff_bite
+2023-11-12T09:04:03.3310134Z [1;32mPASS[0m /datum/unit_test/handcuff_bite 0.1s
+2023-11-12T09:04:03.3311967Z ##[endgroup]
+2023-11-12T09:04:03.3720567Z ##[group]/datum/unit_test/component_duping
+2023-11-12T09:04:03.3725700Z [1;32mPASS[0m /datum/unit_test/component_duping 0s
+2023-11-12T09:04:03.3728116Z ##[endgroup]
+2023-11-12T09:04:03.3854948Z ##[group]/datum/unit_test/confusion_symptom
+2023-11-12T09:04:03.4020935Z [1;32mPASS[0m /datum/unit_test/confusion_symptom 0.1s
+2023-11-12T09:04:03.4023437Z ##[endgroup]
+2023-11-12T09:04:03.4660129Z ##[group]/datum/unit_test/connect_loc_basic
+2023-11-12T09:04:03.4667486Z [1;32mPASS[0m /datum/unit_test/connect_loc_basic 0s
+2023-11-12T09:04:03.4669665Z ##[endgroup]
+2023-11-12T09:04:03.5206421Z ##[group]/datum/unit_test/connect_loc_change_turf
+2023-11-12T09:04:03.5219191Z [1;32mPASS[0m /datum/unit_test/connect_loc_change_turf 0s
+2023-11-12T09:04:03.5221198Z ##[endgroup]
+2023-11-12T09:04:03.5413589Z ##[group]/datum/unit_test/connect_loc_multiple_on_turf
+2023-11-12T09:04:03.5422679Z [1;32mPASS[0m /datum/unit_test/connect_loc_multiple_on_turf 0s
+2023-11-12T09:04:03.5424576Z ##[endgroup]
+2023-11-12T09:04:03.5552785Z ##[group]/datum/unit_test/reagent_container_sanity
+2023-11-12T09:04:03.8101359Z [1;32mPASS[0m /datum/unit_test/reagent_container_sanity 0.3s
+2023-11-12T09:04:03.8102486Z ##[endgroup]
+2023-11-12T09:04:03.9680842Z ##[group]/datum/unit_test/crayon_naming
+2023-11-12T09:04:03.9683784Z [1;32mPASS[0m /datum/unit_test/crayon_naming 0s
+2023-11-12T09:04:03.9686430Z ##[endgroup]
+2023-11-12T09:04:03.9815420Z ##[group]/datum/unit_test/dcs_get_id_from_arguments
+2023-11-12T09:04:03.9822614Z [1;32mPASS[0m /datum/unit_test/dcs_get_id_from_arguments 0s
+2023-11-12T09:04:03.9825219Z ##[endgroup]
+2023-11-12T09:04:03.9952914Z ##[group]/datum/unit_test/designs
+2023-11-12T09:04:04.0032294Z [1;32mPASS[0m /datum/unit_test/designs 0.1s
+2023-11-12T09:04:04.0034986Z ##[endgroup]
+2023-11-12T09:04:04.0184498Z ##[group]/datum/unit_test/dismemberment
+2023-11-12T09:04:04.0687805Z [1;32mPASS[0m /datum/unit_test/dismemberment 0s
+2023-11-12T09:04:04.0690374Z ##[endgroup]
+2023-11-12T09:04:04.1062552Z ##[group]/datum/unit_test/door_access_check
+2023-11-12T09:04:04.1315486Z [1;32mPASS[0m /datum/unit_test/door_access_check 0s
+2023-11-12T09:04:04.1318637Z ##[endgroup]
+2023-11-12T09:04:04.1659906Z ##[group]/datum/unit_test/contents_barfer
+2023-11-12T09:04:04.1881762Z [1;32mPASS[0m /datum/unit_test/contents_barfer 0s
+2023-11-12T09:04:04.1884275Z ##[endgroup]
+2023-11-12T09:04:04.2328534Z ##[group]/datum/unit_test/space_dragon_expiration
+2023-11-12T09:04:04.2672064Z [1;32mPASS[0m /datum/unit_test/space_dragon_expiration 0s
+2023-11-12T09:04:04.2674522Z ##[endgroup]
+2023-11-12T09:04:04.3282341Z ##[group]/datum/unit_test/glass_style_icons
+2023-11-12T09:04:04.3517947Z [1;32mPASS[0m /datum/unit_test/glass_style_icons 0s
+2023-11-12T09:04:04.3520368Z ##[endgroup]
+2023-11-12T09:04:04.3761901Z ##[group]/datum/unit_test/glass_style_functionality
+2023-11-12T09:04:04.3773186Z [1;32mPASS[0m /datum/unit_test/glass_style_functionality 0s
+2023-11-12T09:04:04.3775791Z ##[endgroup]
+2023-11-12T09:04:04.3908269Z ##[group]/datum/unit_test/drink_icons
+2023-11-12T09:04:04.4155215Z [1;32mPASS[0m /datum/unit_test/drink_icons 0.1s
+2023-11-12T09:04:04.4157609Z ##[endgroup]
+2023-11-12T09:04:04.4303228Z ##[group]/datum/unit_test/dummy_spawn_species
+2023-11-12T09:04:05.4828810Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_species 1s
+2023-11-12T09:04:05.4829704Z ##[endgroup]
+2023-11-12T09:04:05.5166735Z ##[group]/datum/unit_test/dummy_spawn_outfit
+2023-11-12T09:04:05.5400845Z Job type /datum/job/ai could not be retrieved from SSjob
+2023-11-12T09:04:06.0232636Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_outfit 0.5s
+2023-11-12T09:04:06.0234589Z ##[endgroup]
+2023-11-12T09:04:06.0505202Z ##[group]/datum/unit_test/dynamic_roundstart_ruleset_sanity
+2023-11-12T09:04:06.0508804Z [1;32mPASS[0m /datum/unit_test/dynamic_roundstart_ruleset_sanity 0s
+2023-11-12T09:04:06.0511050Z ##[endgroup]
+2023-11-12T09:04:06.0637233Z ##[group]/datum/unit_test/dynamic_unique_antag_flags
+2023-11-12T09:04:06.0640294Z [1;32mPASS[0m /datum/unit_test/dynamic_unique_antag_flags 0s
+2023-11-12T09:04:06.0642513Z ##[endgroup]
+2023-11-12T09:04:06.0770713Z ##[group]/datum/unit_test/egg_glands
+2023-11-12T09:04:06.1407083Z [1;32mPASS[0m /datum/unit_test/egg_glands 0.1s
+2023-11-12T09:04:06.1408405Z ##[endgroup]
+2023-11-12T09:04:06.1628261Z ##[group]/datum/unit_test/emoting
+2023-11-12T09:04:06.1818671Z [1;32mPASS[0m /datum/unit_test/emoting 0s
+2023-11-12T09:04:06.1821362Z ##[endgroup]
+2023-11-12T09:04:06.2077157Z ##[group]/datum/unit_test/ensure_subtree_operational_datum
+2023-11-12T09:04:08.1731821Z [1;32mPASS[0m /datum/unit_test/ensure_subtree_operational_datum 1.9s
+2023-11-12T09:04:08.1733285Z ##[endgroup]
+2023-11-12T09:04:08.7539706Z ##[group]/datum/unit_test/explosion_action
+2023-11-12T09:04:08.8465799Z [1;32mPASS[0m /datum/unit_test/explosion_action 0.1s
+2023-11-12T09:04:08.8468184Z ##[endgroup]
+2023-11-12T09:04:08.9010946Z ##[group]/datum/unit_test/fish_size_weight
+2023-11-12T09:04:08.9019514Z [1;32mPASS[0m /datum/unit_test/fish_size_weight 0s
+2023-11-12T09:04:08.9022220Z ##[endgroup]
+2023-11-12T09:04:08.9154882Z ##[group]/datum/unit_test/fish_breeding
+2023-11-12T09:04:08.9227664Z [1;32mPASS[0m /datum/unit_test/fish_breeding 0s
+2023-11-12T09:04:08.9230704Z ##[endgroup]
+2023-11-12T09:04:08.9389958Z ##[group]/datum/unit_test/fish_evolution
+2023-11-12T09:04:08.9418165Z [1;32mPASS[0m /datum/unit_test/fish_evolution 0s
+2023-11-12T09:04:08.9421366Z ##[endgroup]
+2023-11-12T09:04:08.9631338Z ##[group]/datum/unit_test/fish_scanning
+2023-11-12T09:04:08.9635076Z [1;32mPASS[0m /datum/unit_test/fish_scanning 0s
+2023-11-12T09:04:08.9638063Z ##[endgroup]
+2023-11-12T09:04:08.9772162Z ##[group]/datum/unit_test/font_awesome_icons
+2023-11-12T09:04:08.9779113Z CSS Actual: 96991
+2023-11-12T09:04:09.3976724Z [1;32mPASS[0m /datum/unit_test/font_awesome_icons 0.4s
+2023-11-12T09:04:09.3978084Z ##[endgroup]
+2023-11-12T09:04:09.4388919Z ##[group]/datum/unit_test/food_edibility_check
+2023-11-12T09:04:11.4659822Z [1;32mPASS[0m /datum/unit_test/food_edibility_check 2s
+2023-11-12T09:04:11.4661512Z ##[endgroup]
+2023-11-12T09:04:11.4957968Z ##[group]/datum/unit_test/full_heal_heals_organs
+2023-11-12T09:04:11.5147883Z [1;32mPASS[0m /datum/unit_test/full_heal_heals_organs 0.1s
+2023-11-12T09:04:11.5149360Z ##[endgroup]
+2023-11-12T09:04:11.5413116Z ##[group]/datum/unit_test/full_heal_regenerates_organs
+2023-11-12T09:04:11.5651258Z [1;32mPASS[0m /datum/unit_test/full_heal_regenerates_organs 0s
+2023-11-12T09:04:11.5653018Z ##[endgroup]
+2023-11-12T09:04:11.6325061Z ##[group]/datum/unit_test/full_heal_damage_types
+2023-11-12T09:04:11.6518216Z [1;32mPASS[0m /datum/unit_test/full_heal_damage_types 0s
+2023-11-12T09:04:11.6519698Z ##[endgroup]
+2023-11-12T09:04:11.7209709Z ##[group]/datum/unit_test/atmospheric_gas_transfer
+2023-11-12T09:04:11.7227226Z [1;32mPASS[0m /datum/unit_test/atmospheric_gas_transfer 0s
+2023-11-12T09:04:11.7228891Z ##[endgroup]
+2023-11-12T09:04:11.7822095Z ##[group]/datum/unit_test/get_turf_pixel
+2023-11-12T09:04:11.7849880Z [1;32mPASS[0m /datum/unit_test/get_turf_pixel 0s
+2023-11-12T09:04:11.7851756Z ##[endgroup]
+2023-11-12T09:04:11.8495917Z ##[group]/datum/unit_test/geyser
+2023-11-12T09:04:11.8516781Z [1;32mPASS[0m /datum/unit_test/geyser 0s
+2023-11-12T09:04:11.8518776Z ##[endgroup]
+2023-11-12T09:04:11.9115770Z ##[group]/datum/unit_test/greyscale_item_icon_states
+2023-11-12T09:04:11.9172841Z [1;32mPASS[0m /datum/unit_test/greyscale_item_icon_states 0s
+2023-11-12T09:04:11.9174524Z ##[endgroup]
+2023-11-12T09:04:11.9770664Z ##[group]/datum/unit_test/greyscale_color_count
+2023-11-12T09:04:11.9908294Z [1;32mPASS[0m /datum/unit_test/greyscale_color_count 0s
+2023-11-12T09:04:11.9910694Z ##[endgroup]
+2023-11-12T09:04:12.0513128Z ##[group]/datum/unit_test/hallucination_icons
+2023-11-12T09:04:12.2294786Z [1;32mPASS[0m /datum/unit_test/hallucination_icons 0.2s
+2023-11-12T09:04:12.2296061Z ##[endgroup]
+2023-11-12T09:04:12.2752905Z ##[group]/datum/unit_test/heretic_knowledge
+2023-11-12T09:04:12.2797900Z [1;32mPASS[0m /datum/unit_test/heretic_knowledge 0s
+2023-11-12T09:04:12.2800226Z ##[endgroup]
+2023-11-12T09:04:12.3526741Z ##[group]/datum/unit_test/heretic_main_paths
+2023-11-12T09:04:12.3530666Z [1;32mPASS[0m /datum/unit_test/heretic_main_paths 0s
+2023-11-12T09:04:12.3532858Z ##[endgroup]
+2023-11-12T09:04:12.3985035Z ##[group]/datum/unit_test/heretic_rituals
+2023-11-12T09:04:12.4878733Z [1;32mPASS[0m /datum/unit_test/heretic_rituals 0.1s
+2023-11-12T09:04:12.4880607Z ##[endgroup]
+2023-11-12T09:04:12.5120786Z ##[group]/datum/unit_test/high_five
+2023-11-12T09:04:12.5591361Z [1;32mPASS[0m /datum/unit_test/high_five 0s
+2023-11-12T09:04:12.5593593Z ##[endgroup]
+2023-11-12T09:04:12.6154998Z ##[group]/datum/unit_test/high_five_too_slow
+2023-11-12T09:04:12.6462178Z [1;32mPASS[0m /datum/unit_test/high_five_too_slow 0s
+2023-11-12T09:04:12.6464631Z ##[endgroup]
+2023-11-12T09:04:12.6825675Z ##[group]/datum/unit_test/high_five_walk_away
+2023-11-12T09:04:12.7302468Z [1;32mPASS[0m /datum/unit_test/high_five_walk_away 0.1s
+2023-11-12T09:04:12.7304078Z ##[endgroup]
+2023-11-12T09:04:12.7849321Z ##[group]/datum/unit_test/hanukkah_2123
+2023-11-12T09:04:12.7857129Z [1;32mPASS[0m /datum/unit_test/hanukkah_2123 0s
+2023-11-12T09:04:12.7859467Z ##[endgroup]
+2023-11-12T09:04:12.7985283Z ##[group]/datum/unit_test/ramadan_2165
+2023-11-12T09:04:12.7988232Z [1;32mPASS[0m /datum/unit_test/ramadan_2165 0s
+2023-11-12T09:04:12.7990308Z ##[endgroup]
+2023-11-12T09:04:12.8115461Z ##[group]/datum/unit_test/thanksgiving_2020
+2023-11-12T09:04:12.8118309Z [1;32mPASS[0m /datum/unit_test/thanksgiving_2020 0s
+2023-11-12T09:04:12.8120732Z ##[endgroup]
+2023-11-12T09:04:12.8276159Z ##[group]/datum/unit_test/mother_3683
+2023-11-12T09:04:12.8278795Z [1;32mPASS[0m /datum/unit_test/mother_3683 0s
+2023-11-12T09:04:12.8281149Z ##[endgroup]
+2023-11-12T09:04:12.8402992Z ##[group]/datum/unit_test/hello_2020
+2023-11-12T09:04:12.8405520Z [1;32mPASS[0m /datum/unit_test/hello_2020 0s
+2023-11-12T09:04:12.8408004Z ##[endgroup]
+2023-11-12T09:04:12.8529607Z ##[group]/datum/unit_test/new_year_1983
+2023-11-12T09:04:12.8531956Z [1;32mPASS[0m /datum/unit_test/new_year_1983 0s
+2023-11-12T09:04:12.8534286Z ##[endgroup]
+2023-11-12T09:04:12.8655830Z ##[group]/datum/unit_test/moth_week_2020
+2023-11-12T09:04:12.8735184Z [1;32mPASS[0m /datum/unit_test/moth_week_2020 0s
+2023-11-12T09:04:12.8737646Z ##[endgroup]
+2023-11-12T09:04:12.8963722Z ##[group]/datum/unit_test/hulk_attack
+2023-11-12T09:04:12.9298282Z [1;32mPASS[0m /datum/unit_test/hulk_attack 0.1s
+2023-11-12T09:04:12.9300378Z ##[endgroup]
+2023-11-12T09:04:12.9631065Z ##[group]/datum/unit_test/hulk_north_star
+2023-11-12T09:04:12.9971964Z [1;32mPASS[0m /datum/unit_test/hulk_north_star 0s
+2023-11-12T09:04:12.9974198Z ##[endgroup]
+2023-11-12T09:04:13.0684879Z ##[group]/datum/unit_test/human_through_recycler
+2023-11-12T09:04:13.1042839Z [1;32mPASS[0m /datum/unit_test/human_through_recycler 0.1s
+2023-11-12T09:04:13.1045346Z ##[endgroup]
+2023-11-12T09:04:13.1302366Z ##[group]/datum/unit_test/hunger_curse
+2023-11-12T09:04:13.1487751Z [1;32mPASS[0m /datum/unit_test/hunger_curse 0s
+2023-11-12T09:04:13.1490362Z ##[endgroup]
+2023-11-12T09:04:13.1724484Z ##[group]/datum/unit_test/hydroponics_extractor_storage
+2023-11-12T09:04:13.2045321Z [1;32mPASS[0m /datum/unit_test/hydroponics_extractor_storage 0.1s
+2023-11-12T09:04:13.2047744Z ##[endgroup]
+2023-11-12T09:04:13.2424994Z ##[group]/datum/unit_test/hydroponics_harvest
+2023-11-12T09:04:13.3172098Z [1;32mPASS[0m /datum/unit_test/hydroponics_harvest 0.1s
+2023-11-12T09:04:13.3173538Z ##[endgroup]
+2023-11-12T09:04:13.3896863Z ##[group]/datum/unit_test/hydroponics_self_mutation
+2023-11-12T09:04:13.4546321Z [1;32mPASS[0m /datum/unit_test/hydroponics_self_mutation 0.1s
+2023-11-12T09:04:13.4548349Z ##[endgroup]
+2023-11-12T09:04:13.5127280Z ##[group]/datum/unit_test/hydroponics_validate_genes
+2023-11-12T09:04:13.5761114Z [1;32mPASS[0m /datum/unit_test/hydroponics_validate_genes 0s
+2023-11-12T09:04:13.5765353Z ##[endgroup]
+2023-11-12T09:04:13.5897676Z ##[group]/datum/unit_test/defined_inhand_icon_states
+2023-11-12T09:04:14.5257265Z Notice - Possible inhand icon matches found. It is best to be explicit with inhand sprite values.
+2023-11-12T09:04:14.5260490Z /obj/item/clothing/head/costume/lizard does not have an inhand_icon_state value - Possible matching sprites for "lizard" found in: 'icons/mob/inhands/animal_item_lefthand.dmi' & 'icons/mob/inhands/animal_item_righthand.dmi'
+2023-11-12T09:04:14.5265334Z /obj/item/clothing/head/costume/paper_hat does not have an inhand_icon_state value - Possible matching sprites for "paper" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2023-11-12T09:04:14.5269130Z /obj/item/clothing/head/collectable/paper does not have an inhand_icon_state value - Possible matching sprites for "paper" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2023-11-12T09:04:14.5272911Z /obj/item/clothing/head/cowboy does not have an inhand_icon_state value - Possible matching sprites for "cowboy_hat_brown" found in: 'icons/mob/inhands/clothing/hats_lefthand.dmi' & 'icons/mob/inhands/clothing/hats_righthand.dmi'
+2023-11-12T09:04:14.5276899Z /obj/item/clothing/head/chaplain/habit_veil does not have an inhand_icon_state value - Possible matching sprites for "nun_hood_alt" found in: 'icons/mob/inhands/clothing/hats_lefthand.dmi' & 'icons/mob/inhands/clothing/hats_righthand.dmi'
+2023-11-12T09:04:14.5280655Z /obj/item/clothing/mask/animal/small/fox does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2023-11-12T09:04:14.5284605Z /obj/item/clothing/mask/animal/small/fox/cursed does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2023-11-12T09:04:14.5288384Z /obj/item/clothing/accessory/pride does not have an inhand_icon_state value - Possible matching sprites for "pride" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2023-11-12T09:04:14.5292328Z /obj/item/clothing/suit/apron/overalls does not have an inhand_icon_state value - Possible matching sprites for "overalls" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2023-11-12T09:04:14.5296324Z /obj/item/clothing/suit/caution does not have an inhand_icon_state value - Possible matching sprites for "caution" found in: 'icons/mob/inhands/equipment/custodial_righthand.dmi' & 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+2023-11-12T09:04:14.5300339Z /obj/item/clothing/suit/chaplainsuit/habit does not have an inhand_icon_state value - Possible matching sprites for "habit" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2023-11-12T09:04:14.5305034Z /obj/item/clothing/glasses/hud/health/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudmed" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2023-11-12T09:04:14.5309450Z /obj/item/clothing/glasses/hud/security/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudsec" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2023-11-12T09:04:14.5313568Z /obj/item/mecha_parts/mecha_equipment/generator does not have an inhand_icon_state value - Possible matching sprites for "tesla" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2023-11-12T09:04:14.5317158Z /obj/item/food/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_righthand.dmi' & 'icons/mob/inhands/items/food_lefthand.dmi'
+2023-11-12T09:04:14.5320529Z /obj/item/food/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_righthand.dmi' & 'icons/mob/inhands/items/food_lefthand.dmi'
+2023-11-12T09:04:14.5324489Z /obj/item/storage/bag/ore does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_righthand.dmi' & 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
+2023-11-12T09:04:14.5328382Z /obj/item/storage/bag/ore/cyborg does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_righthand.dmi' & 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
+2023-11-12T09:04:14.5332211Z /obj/item/melee/energy/blade does not have an inhand_icon_state value - Possible matching sprites for "blade" found in: 'icons/mob/inhands/weapons/swords_righthand.dmi' & 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+2023-11-12T09:04:14.5335835Z /obj/item/fireaxe does not have an inhand_icon_state value - Possible matching sprites for "fireaxe0" found in: 'icons/mob/inhands/weapons/axes_lefthand.dmi' & 'icons/mob/inhands/weapons/axes_righthand.dmi'
+2023-11-12T09:04:14.5339617Z /obj/item/fireaxe/boneaxe does not have an inhand_icon_state value - Possible matching sprites for "bone_axe0" found in: 'icons/mob/inhands/weapons/axes_lefthand.dmi' & 'icons/mob/inhands/weapons/axes_righthand.dmi'
+2023-11-12T09:04:14.5343300Z /obj/item/fireaxe/metal_h2_axe does not have an inhand_icon_state value - Possible matching sprites for "metalh2_axe0" found in: 'icons/mob/inhands/weapons/axes_lefthand.dmi' & 'icons/mob/inhands/weapons/axes_righthand.dmi'
+2023-11-12T09:04:14.5347106Z /obj/item/crowbar/mechremoval does not have an inhand_icon_state value - Possible matching sprites for "mechremoval0" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5350901Z /obj/item/mod/module/medbeam does not have an inhand_icon_state value - Possible matching sprites for "chronogun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2023-11-12T09:04:14.5354609Z /obj/item/mod/module/welding does not have an inhand_icon_state value - Possible matching sprites for "welding" found in: 'icons/mob/inhands/clothing/masks_righthand.dmi' & 'icons/mob/inhands/clothing/masks_lefthand.dmi'
+2023-11-12T09:04:14.5358402Z /obj/item/mod/module/mister does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2023-11-12T09:04:14.5362405Z /obj/item/mod/module/mister/atmos does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2023-11-12T09:04:14.5366326Z /obj/item/mod/module/jetpack does not have an inhand_icon_state value - Possible matching sprites for "jetpack" found in: 'icons/mob/inhands/equipment/jetpacks_righthand.dmi' & 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi'
+2023-11-12T09:04:14.5370513Z /obj/item/mod/module/flashlight does not have an inhand_icon_state value - Possible matching sprites for "flashlight" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5374077Z /obj/item/mod/module/stamp does not have an inhand_icon_state value - Possible matching sprites for "stamp" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2023-11-12T09:04:14.5377613Z /obj/item/mod/module/holster does not have an inhand_icon_state value - Possible matching sprites for "holster" found in: 'icons/mob/inhands/equipment/belt_lefthand.dmi' & 'icons/mob/inhands/equipment/belt_righthand.dmi'
+2023-11-12T09:04:14.5381427Z /obj/item/mod/module/megaphone does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_righthand.dmi' & 'icons/mob/inhands/items/megaphone_lefthand.dmi'
+2023-11-12T09:04:14.5386246Z /obj/item/mod/module/drill does not have an inhand_icon_state value - Possible matching sprites for "drill" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5390973Z /obj/item/mod/module/tem does not have an inhand_icon_state value - Possible matching sprites for "chronogun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2023-11-12T09:04:14.5394601Z /obj/item/reagent_containers/cup/soda_cans does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5396934Z /obj/item/reagent_containers/cup/soda_cans/random does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5399759Z /obj/item/reagent_containers/cup/soda_cans/cola does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5402114Z /obj/item/reagent_containers/cup/soda_cans/tonic does not have an inhand_icon_state value - Possible matching sprites for "tonic" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5404446Z /obj/item/reagent_containers/cup/soda_cans/sodawater does not have an inhand_icon_state value - Possible matching sprites for "sodawater" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5406584Z /obj/item/reagent_containers/cup/soda_cans/lemon_lime does not have an inhand_icon_state value - Possible matching sprites for "lemon-lime" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5408970Z /obj/item/reagent_containers/cup/soda_cans/space_up does not have an inhand_icon_state value - Possible matching sprites for "space-up" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5411153Z /obj/item/reagent_containers/cup/soda_cans/starkist does not have an inhand_icon_state value - Possible matching sprites for "starkist" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5413351Z /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind does not have an inhand_icon_state value - Possible matching sprites for "space_mountain_wind" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5415775Z /obj/item/reagent_containers/cup/soda_cans/thirteenloko does not have an inhand_icon_state value - Possible matching sprites for "thirteen_loko" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5417918Z /obj/item/reagent_containers/cup/soda_cans/dr_gibb does not have an inhand_icon_state value - Possible matching sprites for "dr_gibb" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5420047Z /obj/item/reagent_containers/cup/soda_cans/pwr_game does not have an inhand_icon_state value - Possible matching sprites for "purple_can" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5422176Z /obj/item/reagent_containers/cup/soda_cans/wellcheers does not have an inhand_icon_state value - Possible matching sprites for "wellcheers" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5424331Z /obj/item/reagent_containers/cup/soda_cans/volt_energy does not have an inhand_icon_state value - Possible matching sprites for "volt_energy" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5426605Z /obj/item/reagent_containers/cup/soda_cans/melon_soda does not have an inhand_icon_state value - Possible matching sprites for "melon_soda" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5428700Z /obj/item/reagent_containers/cup/soda_cans/beer does not have an inhand_icon_state value - Possible matching sprites for "space_beer" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5430842Z /obj/item/reagent_containers/cup/soda_cans/beer/rice does not have an inhand_icon_state value - Possible matching sprites for "ebisu" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5432971Z /obj/item/reagent_containers/cup/glass/coffee does not have an inhand_icon_state value - Possible matching sprites for "coffee" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5435080Z /obj/item/reagent_containers/chem_pack does not have an inhand_icon_state value - Possible matching sprites for "chempack" found in: 'icons/mob/inhands/equipment/backpack_righthand.dmi' & 'icons/mob/inhands/equipment/backpack_lefthand.dmi'
+2023-11-12T09:04:14.5437143Z /obj/item/toy/talking/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2023-11-12T09:04:14.5439342Z /obj/item/toy/figure/chef does not have an inhand_icon_state value - Possible matching sprites for "chef" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2023-11-12T09:04:14.5441474Z /obj/item/toy/figure/clown does not have an inhand_icon_state value - Possible matching sprites for "clown" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2023-11-12T09:04:14.5443437Z /obj/item/toy/figure/janitor does not have an inhand_icon_state value - Possible matching sprites for "janitor" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2023-11-12T09:04:14.5445333Z /obj/item/toy/cards/cardhand does not have an inhand_icon_state value - Possible matching sprites for "nothing" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2023-11-12T09:04:14.5447188Z /obj/item/book/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2023-11-12T09:04:14.5449271Z /obj/item/pipe_dispenser does not have an inhand_icon_state value - Possible matching sprites for "rpd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5451184Z /obj/item/sbeacondrop does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5453081Z /obj/item/sbeacondrop/bomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5454974Z /obj/item/sbeacondrop/emp does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5456921Z /obj/item/sbeacondrop/powersink does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5459034Z /obj/item/sbeacondrop/clownbomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5460981Z /obj/item/sbeacondrop/horse does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5463020Z /obj/item/stack/medical/bruise_pack does not have an inhand_icon_state value - Possible matching sprites for "brutepack" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2023-11-12T09:04:14.5465143Z /obj/item/stack/medical/ointment does not have an inhand_icon_state value - Possible matching sprites for "ointment" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2023-11-12T09:04:14.5467227Z /obj/item/stack/tile/fairygrass does not have an inhand_icon_state value - Possible matching sprites for "tile_fairygrass" found in: 'icons/mob/inhands/items/tiles_righthand.dmi' & 'icons/mob/inhands/items/tiles_lefthand.dmi'
+2023-11-12T09:04:14.5469256Z /obj/item/organ/internal/heart/gland/blood does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_righthand.dmi' & 'icons/mob/inhands/items/food_lefthand.dmi'
+2023-11-12T09:04:14.5471272Z /obj/item/organ/internal/heart/gland/egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_righthand.dmi' & 'icons/mob/inhands/items/food_lefthand.dmi'
+2023-11-12T09:04:14.5473406Z /obj/item/organ/internal/heart/gland/quantum does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_lefthand.dmi' & 'icons/mob/inhands/equipment/security_righthand.dmi'
+2023-11-12T09:04:14.5475638Z /obj/item/organ/internal/heart/gland/trauma does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_lefthand.dmi' & 'icons/mob/inhands/equipment/security_righthand.dmi'
+2023-11-12T09:04:14.5477679Z /obj/item/minespawner does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5479615Z /obj/item/boxcutter does not have an inhand_icon_state value - Possible matching sprites for "boxcutter" found in: 'icons/mob/inhands/equipment/boxcutter_righthand.dmi' & 'icons/mob/inhands/equipment/boxcutter_lefthand.dmi'
+2023-11-12T09:04:14.5482091Z /obj/item/boxcutter/extended does not have an inhand_icon_state value - Possible matching sprites for "boxcutter" found in: 'icons/mob/inhands/equipment/boxcutter_righthand.dmi' & 'icons/mob/inhands/equipment/boxcutter_lefthand.dmi'
+2023-11-12T09:04:14.5484159Z /obj/item/pushbroom does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_righthand.dmi' & 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+2023-11-12T09:04:14.5486168Z /obj/item/pushbroom/cyborg does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_righthand.dmi' & 'icons/mob/inhands/equipment/custodial_lefthand.dmi'
+2023-11-12T09:04:14.5488176Z /obj/item/chainsaw does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
+2023-11-12T09:04:14.5490187Z /obj/item/chainsaw/doomslayer does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_righthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi'
+2023-11-12T09:04:14.5492367Z /obj/item/kitchen/fork does not have an inhand_icon_state value - Possible matching sprites for "fork" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2023-11-12T09:04:14.5494352Z /obj/item/kitchen/spoon does not have an inhand_icon_state value - Possible matching sprites for "spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2023-11-12T09:04:14.5496447Z /obj/item/kitchen/spoon/plastic does not have an inhand_icon_state value - Possible matching sprites for "plastic_spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2023-11-12T09:04:14.5498538Z /obj/item/pitchfork does not have an inhand_icon_state value - Possible matching sprites for "pitchfork0" found in: 'icons/mob/inhands/weapons/polearms_lefthand.dmi' & 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+2023-11-12T09:04:14.5500478Z /obj/item/godstaff does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2023-11-12T09:04:14.5502414Z /obj/item/godstaff/red does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2023-11-12T09:04:14.5504543Z /obj/item/godstaff/blue does not have an inhand_icon_state value - Possible matching sprites for "godstaff-blue" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2023-11-12T09:04:14.5506586Z /obj/item/singularityhammer does not have an inhand_icon_state value - Possible matching sprites for "singularity_hammer0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2023-11-12T09:04:14.5508606Z /obj/item/mjollnir does not have an inhand_icon_state value - Possible matching sprites for "mjollnir0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2023-11-12T09:04:14.5510522Z /obj/item/spear does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_lefthand.dmi' & 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+2023-11-12T09:04:14.5512535Z /obj/item/spear/explosive does not have an inhand_icon_state value - Possible matching sprites for "spearbomb0" found in: 'icons/mob/inhands/weapons/polearms_lefthand.dmi' & 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+2023-11-12T09:04:14.5514725Z /obj/item/spear/grey_tide does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_lefthand.dmi' & 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+2023-11-12T09:04:14.5516757Z /obj/item/spear/bonespear does not have an inhand_icon_state value - Possible matching sprites for "bone_spear0" found in: 'icons/mob/inhands/weapons/polearms_lefthand.dmi' & 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+2023-11-12T09:04:14.5518804Z /obj/item/spear/bamboospear does not have an inhand_icon_state value - Possible matching sprites for "bamboo_spear0" found in: 'icons/mob/inhands/weapons/polearms_lefthand.dmi' & 'icons/mob/inhands/weapons/polearms_righthand.dmi'
+2023-11-12T09:04:14.5520748Z /obj/item/sticker/robot does not have an inhand_icon_state value - Possible matching sprites for "tile" found in: 'icons/mob/inhands/items/tiles_righthand.dmi' & 'icons/mob/inhands/items/tiles_lefthand.dmi'
+2023-11-12T09:04:14.5522828Z /obj/item/trash/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_righthand.dmi' & 'icons/mob/inhands/items/food_lefthand.dmi'
+2023-11-12T09:04:14.5524800Z /obj/item/trash/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_righthand.dmi' & 'icons/mob/inhands/items/food_lefthand.dmi'
+2023-11-12T09:04:14.5526598Z /obj/item/trash/can does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2023-11-12T09:04:14.5528508Z /obj/item/highfrequencyblade does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_righthand.dmi' & 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+2023-11-12T09:04:14.5530557Z /obj/item/highfrequencyblade/wizard does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_righthand.dmi' & 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+2023-11-12T09:04:14.5532581Z /obj/item/construction/rcd does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5534544Z /obj/item/construction/rcd/borg does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5536539Z /obj/item/construction/rcd/loaded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5538610Z /obj/item/construction/rcd/loaded/upgraded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5540806Z /obj/item/construction/rcd/ce does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5542811Z /obj/item/construction/rcd/internal does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5544792Z /obj/item/construction/rld does not have an inhand_icon_state value - Possible matching sprites for "rld" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5546898Z /obj/item/construction/rld/mini does not have an inhand_icon_state value - Possible matching sprites for "rld" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5548856Z /obj/item/construction/rtd does not have an inhand_icon_state value - Possible matching sprites for "rtd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5551347Z /obj/item/construction/rtd/loaded does not have an inhand_icon_state value - Possible matching sprites for "rtd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5553359Z /obj/item/construction/rtd/admin does not have an inhand_icon_state value - Possible matching sprites for "rtd" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5555307Z /obj/item/rcd_ammo does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5557368Z /obj/item/rcd_ammo/large does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_lefthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi'
+2023-11-12T09:04:14.5559329Z /obj/item/borg/sight/meson does not have an inhand_icon_state value - Possible matching sprites for "meson" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2023-11-12T09:04:14.5561639Z /obj/item/harmalarm does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_righthand.dmi' & 'icons/mob/inhands/items/megaphone_lefthand.dmi'
+2023-11-12T09:04:14.5564165Z /obj/item/abductor_machine_beacon does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5566370Z /obj/item/abductor_machine_beacon/chem_dispenser does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5568963Z /obj/item/grown/carbon_rose does not have an inhand_icon_state value - Possible matching sprites for "carbonrose" found in: 'icons/mob/inhands/weapons/plants_lefthand.dmi' & 'icons/mob/inhands/weapons/plants_righthand.dmi'
+2023-11-12T09:04:14.5571469Z /obj/item/paint_palette does not have an inhand_icon_state value - Possible matching sprites for "palette" found in: 'icons/mob/inhands/equipment/palette_lefthand.dmi' & 'icons/mob/inhands/equipment/palette_righthand.dmi'
+2023-11-12T09:04:14.5573366Z /obj/item/surprise_egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_righthand.dmi' & 'icons/mob/inhands/items/food_lefthand.dmi'
+2023-11-12T09:04:14.5575235Z /obj/item/experi_scanner does not have an inhand_icon_state value - Possible matching sprites for "experiscanner" found in: 'icons/mob/inhands/items/devices_righthand.dmi' & 'icons/mob/inhands/items/devices_lefthand.dmi'
+2023-11-12T09:04:14.5577115Z /obj/item/fishing_hook does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2023-11-12T09:04:14.5578938Z /obj/item/shovel/giant_wrench does not have an inhand_icon_state value - Possible matching sprites for "giant_wrench" found in: 'icons/mob/inhands/64x64_righthand.dmi' & 'icons/mob/inhands/64x64_lefthand.dmi'
+2023-11-12T09:04:14.5580822Z /obj/item/cursed_katana does not have an inhand_icon_state value - Possible matching sprites for "cursed_katana" found in: 'icons/mob/inhands/weapons/swords_righthand.dmi' & 'icons/mob/inhands/weapons/swords_lefthand.dmi'
+2023-11-12T09:04:14.5583032Z /obj/item/guardian_creator/tech does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2023-11-12T09:04:14.5584953Z /obj/item/research_notes does not have an inhand_icon_state value - Possible matching sprites for "paper" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2023-11-12T09:04:14.5586814Z /obj/item/bonesetter does not have an inhand_icon_state value - Possible matching sprites for "bonesetter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2023-11-12T09:04:14.5588821Z /obj/item/blood_filter does not have an inhand_icon_state value - Possible matching sprites for "bloodfilter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2023-11-12T09:04:14.5590945Z /obj/item/mecha_ammo/flashbang does not have an inhand_icon_state value - Possible matching sprites for "flashbang" found in: 'icons/mob/inhands/equipment/security_lefthand.dmi' & 'icons/mob/inhands/equipment/security_righthand.dmi'
+2023-11-12T09:04:14.5592385Z [1;32mPASS[0m /datum/unit_test/defined_inhand_icon_states 1s
+2023-11-12T09:04:14.5593067Z ##[endgroup]
+2023-11-12T09:04:14.5593503Z ##[group]/datum/unit_test/json_savefiles
+2023-11-12T09:04:14.5593927Z [1;32mPASS[0m /datum/unit_test/json_savefiles 0s
+2023-11-12T09:04:14.5594439Z ##[endgroup]
+2023-11-12T09:04:14.5697545Z ##[group]/datum/unit_test/keybinding_init
+2023-11-12T09:04:14.5700044Z [1;32mPASS[0m /datum/unit_test/keybinding_init 0s
+2023-11-12T09:04:14.5702215Z ##[endgroup]
+2023-11-12T09:04:14.5828294Z ##[group]/datum/unit_test/knockoff_component
+2023-11-12T09:04:14.6242363Z [1;32mPASS[0m /datum/unit_test/knockoff_component 0.1s
+2023-11-12T09:04:14.6244697Z ##[endgroup]
+2023-11-12T09:04:14.6630391Z ##[group]/datum/unit_test/language_species_swap_simple
+2023-11-12T09:04:14.7587413Z [1;32mPASS[0m /datum/unit_test/language_species_swap_simple 0.1s
+2023-11-12T09:04:14.7588791Z ##[endgroup]
+2023-11-12T09:04:14.7909664Z ##[group]/datum/unit_test/language_species_swap_complex
+2023-11-12T09:04:14.8535770Z [1;32mPASS[0m /datum/unit_test/language_species_swap_complex 0.1s
+2023-11-12T09:04:14.8537437Z ##[endgroup]
+2023-11-12T09:04:14.8839470Z ##[group]/datum/unit_test/language_species_change_other_known
+2023-11-12T09:04:14.9795952Z [1;32mPASS[0m /datum/unit_test/language_species_change_other_known 0.1s
+2023-11-12T09:04:14.9797030Z ##[endgroup]
+2023-11-12T09:04:15.0435933Z ##[group]/datum/unit_test/language_mind_transfer
+2023-11-12T09:04:15.1107127Z [1;32mPASS[0m /datum/unit_test/language_mind_transfer 0.1s
+2023-11-12T09:04:15.1109587Z ##[endgroup]
+2023-11-12T09:04:15.2112030Z ##[group]/datum/unit_test/language_mind_swap
+2023-11-12T09:04:15.2925264Z [1;32mPASS[0m /datum/unit_test/language_mind_swap 0s
+2023-11-12T09:04:15.2927698Z ##[endgroup]
+2023-11-12T09:04:15.3795431Z ##[group]/datum/unit_test/book_of_babel
+2023-11-12T09:04:15.4462613Z [1;32mPASS[0m /datum/unit_test/book_of_babel 0.1s
+2023-11-12T09:04:15.4464636Z ##[endgroup]
+2023-11-12T09:04:15.4773421Z ##[group]/datum/unit_test/lesserform
+2023-11-12T09:04:15.6945571Z [1;32mPASS[0m /datum/unit_test/lesserform 0.2s
+2023-11-12T09:04:15.6948228Z ##[endgroup]
+2023-11-12T09:04:15.7353723Z ##[group]/datum/unit_test/limbsanity
+2023-11-12T09:04:15.7943636Z [1;32mPASS[0m /datum/unit_test/limbsanity 0s
+2023-11-12T09:04:15.7944637Z ##[endgroup]
+2023-11-12T09:04:15.8094514Z ##[group]/datum/unit_test/limb_height_adjustment
+2023-11-12T09:04:15.8922884Z [1;32mPASS[0m /datum/unit_test/limb_height_adjustment 0s
+2023-11-12T09:04:15.8924726Z ##[endgroup]
+2023-11-12T09:04:15.9430586Z ##[group]/datum/unit_test/ling_decap
+2023-11-12T09:04:15.9835506Z [1;32mPASS[0m /datum/unit_test/ling_decap 0s
+2023-11-12T09:04:15.9839509Z ##[endgroup]
+2023-11-12T09:04:16.0140352Z ##[group]/datum/unit_test/normal_decap
+2023-11-12T09:04:16.0424498Z [1;32mPASS[0m /datum/unit_test/normal_decap 0s
+2023-11-12T09:04:16.0426983Z ##[endgroup]
+2023-11-12T09:04:16.0805164Z ##[group]/datum/unit_test/liver/skeleton
+2023-11-12T09:04:16.1038545Z [1;32mPASS[0m /datum/unit_test/liver/skeleton 0.1s
+2023-11-12T09:04:16.1041112Z ##[endgroup]
+2023-11-12T09:04:16.1284821Z ##[group]/datum/unit_test/liver/plasmaman
+2023-11-12T09:04:16.1580562Z [1;32mPASS[0m /datum/unit_test/liver/plasmaman 0s
+2023-11-12T09:04:16.1583210Z ##[endgroup]
+2023-11-12T09:04:16.2153103Z ##[group]/datum/unit_test/load_map_security
+2023-11-12T09:04:16.2161683Z map directory not in whitelist: data/load_map_security_temp for map runtimestation
+2023-11-12T09:04:16.2164604Z [1;32mPASS[0m /datum/unit_test/load_map_security 0s
+2023-11-12T09:04:16.2167411Z ##[endgroup]
+2023-11-12T09:04:16.2305620Z ##[group]/datum/unit_test/lungs/lungs_sanity
+2023-11-12T09:04:16.2992950Z [1;32mPASS[0m /datum/unit_test/lungs/lungs_sanity 0s
+2023-11-12T09:04:16.2993961Z ##[endgroup]
+2023-11-12T09:04:16.3555743Z ##[group]/datum/unit_test/lungs/lungs_sanity_plasmaman
+2023-11-12T09:04:16.3893402Z [1;32mPASS[0m /datum/unit_test/lungs/lungs_sanity_plasmaman 0s
+2023-11-12T09:04:16.3896070Z ##[endgroup]
+2023-11-12T09:04:16.4363609Z ##[group]/datum/unit_test/lungs/lungs_sanity_ashwalker
+2023-11-12T09:04:16.4534765Z [1;32mPASS[0m /datum/unit_test/lungs/lungs_sanity_ashwalker 0s
+2023-11-12T09:04:16.4537484Z ##[endgroup]
+2023-11-12T09:04:16.5268598Z ##[group]/datum/unit_test/machine_disassembly
+2023-11-12T09:04:16.5331398Z [1;32mPASS[0m /datum/unit_test/machine_disassembly 0s
+2023-11-12T09:04:16.5334165Z ##[endgroup]
+2023-11-12T09:04:16.5965192Z ##[group]/datum/unit_test/mafia
+2023-11-12T09:04:16.9361333Z [1;32mPASS[0m /datum/unit_test/mafia 0.4s
+2023-11-12T09:04:16.9362885Z ##[endgroup]
+2023-11-12T09:04:17.0130362Z ##[group]/datum/unit_test/job_roundstart_spawnpoints
+2023-11-12T09:04:17.0143039Z [1;32mPASS[0m /datum/unit_test/job_roundstart_spawnpoints 0s
+2023-11-12T09:04:17.0145274Z ##[endgroup]
+2023-11-12T09:04:17.0659056Z ##[group]/datum/unit_test/mecha_damage
+2023-11-12T09:04:17.1110027Z [1;32mPASS[0m /datum/unit_test/mecha_damage 0.1s
+2023-11-12T09:04:17.1112178Z ##[endgroup]
+2023-11-12T09:04:17.2054159Z ##[group]/datum/unit_test/test_human_base
+2023-11-12T09:04:17.2287354Z [1;32mPASS[0m /datum/unit_test/test_human_base 0s
+2023-11-12T09:04:17.2289454Z ##[endgroup]
+2023-11-12T09:04:17.2929615Z ##[group]/datum/unit_test/test_human_bone
+2023-11-12T09:04:17.3157404Z [1;32mPASS[0m /datum/unit_test/test_human_bone 0.1s
+2023-11-12T09:04:17.3160356Z ##[endgroup]
+2023-11-12T09:04:17.3434694Z ##[group]/datum/unit_test/merge_type
+2023-11-12T09:04:17.3440046Z [1;32mPASS[0m /datum/unit_test/merge_type 0s
+2023-11-12T09:04:17.3442753Z ##[endgroup]
+2023-11-12T09:04:17.3573048Z ##[group]/datum/unit_test/metabolization
+2023-11-12T09:04:17.6960389Z [1;32mPASS[0m /datum/unit_test/metabolization 0.3s
+2023-11-12T09:04:17.6963225Z ##[endgroup]
+2023-11-12T09:04:17.7388896Z ##[group]/datum/unit_test/on_mob_end_metabolize
+2023-11-12T09:04:17.7590192Z [1;32mPASS[0m /datum/unit_test/on_mob_end_metabolize 0s
+2023-11-12T09:04:17.7592863Z ##[endgroup]
+2023-11-12T09:04:17.7841810Z ##[group]/datum/unit_test/addictions
+2023-11-12T09:04:17.8425631Z [1;32mPASS[0m /datum/unit_test/addictions 0.1s
+2023-11-12T09:04:17.8428724Z ##[endgroup]
+2023-11-12T09:04:17.9023556Z ##[group]/datum/unit_test/actions_moved_on_mind_transfer
+2023-11-12T09:04:17.9228877Z [1;32mPASS[0m /datum/unit_test/actions_moved_on_mind_transfer 0s
+2023-11-12T09:04:17.9231703Z ##[endgroup]
+2023-11-12T09:04:17.9679832Z ##[group]/datum/unit_test/missing_icons
+2023-11-12T09:04:24.5752532Z [1;32mPASS[0m /datum/unit_test/missing_icons 6.6s
+2023-11-12T09:04:24.5754181Z ##[endgroup]
+2023-11-12T09:04:24.6466600Z ##[group]/datum/unit_test/mob_chains
+2023-11-12T09:04:24.6632928Z [1;32mPASS[0m /datum/unit_test/mob_chains 0s
+2023-11-12T09:04:24.6635968Z ##[endgroup]
+2023-11-12T09:04:24.7913005Z ##[group]/datum/unit_test/mob_faction
+2023-11-12T09:04:28.5066463Z [1;32mPASS[0m /datum/unit_test/mob_faction 3.8s
+2023-11-12T09:04:28.5069188Z ##[endgroup]
+2023-11-12T09:04:31.6163193Z ##[group]/datum/unit_test/mob_spawn
+2023-11-12T09:04:31.6427245Z [1;32mPASS[0m /datum/unit_test/mob_spawn 0s
+2023-11-12T09:04:31.6431419Z ##[endgroup]
+2023-11-12T09:04:32.0058055Z ##[group]/datum/unit_test/modsuit_checks
+2023-11-12T09:04:32.2811166Z [1;32mPASS[0m /datum/unit_test/modsuit_checks 0.2s
+2023-11-12T09:04:32.2812528Z ##[endgroup]
+2023-11-12T09:04:32.3511926Z ##[group]/datum/unit_test/modular_map_loader
+2023-11-12T09:04:32.3521874Z [1;32mPASS[0m /datum/unit_test/modular_map_loader 0s
+2023-11-12T09:04:32.3523808Z ##[endgroup]
+2023-11-12T09:04:32.4142704Z ##[group]/datum/unit_test/mouse_bite_cable
+2023-11-12T09:04:32.4246879Z [1;32mPASS[0m /datum/unit_test/mouse_bite_cable 0s
+2023-11-12T09:04:32.4248567Z ##[endgroup]
+2023-11-12T09:04:32.4874261Z ##[group]/datum/unit_test/mutant_hands
+2023-11-12T09:04:32.5112259Z [1;32mPASS[0m /datum/unit_test/mutant_hands 0.1s
+2023-11-12T09:04:32.5113850Z ##[endgroup]
+2023-11-12T09:04:32.5849921Z ##[group]/datum/unit_test/mutant_hands_with_nodrop
+2023-11-12T09:04:32.6040138Z [1;32mPASS[0m /datum/unit_test/mutant_hands_with_nodrop 0.1s
+2023-11-12T09:04:32.6041689Z ##[endgroup]
+2023-11-12T09:04:32.6773675Z ##[group]/datum/unit_test/mutant_hands_carry
+2023-11-12T09:04:32.7131388Z [1;32mPASS[0m /datum/unit_test/mutant_hands_carry 0.1s
+2023-11-12T09:04:32.7133185Z ##[endgroup]
+2023-11-12T09:04:32.7786446Z ##[group]/datum/unit_test/mutant_organs
+2023-11-12T09:04:34.2934214Z [1;32mPASS[0m /datum/unit_test/mutant_organs 1.5s
+2023-11-12T09:04:34.2935313Z ##[endgroup]
+2023-11-12T09:04:34.6462244Z ##[group]/datum/unit_test/novaflower_burn
+2023-11-12T09:04:34.6850680Z [1;32mPASS[0m /datum/unit_test/novaflower_burn 0s
+2023-11-12T09:04:34.6852577Z ##[endgroup]
+2023-11-12T09:04:34.7556767Z ##[group]/datum/unit_test/nuke_cinematic
+2023-11-12T09:04:39.0321508Z [1;32mPASS[0m /datum/unit_test/nuke_cinematic 4.3s
+2023-11-12T09:04:39.0323281Z ##[endgroup]
+2023-11-12T09:04:39.0458593Z ##[group]/datum/unit_test/objectives_category
+2023-11-12T09:04:39.0479702Z [1;32mPASS[0m /datum/unit_test/objectives_category 0s
+2023-11-12T09:04:39.0482187Z ##[endgroup]
+2023-11-12T09:04:39.0633771Z ##[group]/datum/unit_test/operating_table
+2023-11-12T09:04:39.0971239Z [1;32mPASS[0m /datum/unit_test/operating_table 0s
+2023-11-12T09:04:39.0973601Z ##[endgroup]
+2023-11-12T09:04:39.1707308Z ##[group]/datum/unit_test/orderable_items
+2023-11-12T09:04:39.3304868Z [1;32mPASS[0m /datum/unit_test/orderable_items 0.2s
+2023-11-12T09:04:39.3307041Z ##[endgroup]
+2023-11-12T09:04:39.4628600Z ##[group]/datum/unit_test/organ_set_bonus_id
+2023-11-12T09:04:39.4631127Z [1;32mPASS[0m /datum/unit_test/organ_set_bonus_id 0s
+2023-11-12T09:04:39.4632993Z ##[endgroup]
+2023-11-12T09:04:39.4763602Z ##[group]/datum/unit_test/organ_set_bonus_sanity
+2023-11-12T09:04:39.7566200Z [1;32mPASS[0m /datum/unit_test/organ_set_bonus_sanity 0.3s
+2023-11-12T09:04:39.7567687Z ##[endgroup]
+2023-11-12T09:04:39.8948309Z ##[group]/datum/unit_test/organ_sanity
+2023-11-12T09:04:39.8957864Z [1;32mPASS[0m /datum/unit_test/organ_sanity 0s
+2023-11-12T09:04:39.8960612Z ##[endgroup]
+2023-11-12T09:04:39.9099785Z ##[group]/datum/unit_test/organ_damage
+2023-11-12T09:04:39.9663107Z [1;32mPASS[0m /datum/unit_test/organ_damage 0s
+2023-11-12T09:04:39.9665107Z ##[endgroup]
+2023-11-12T09:04:40.0023907Z ##[group]/datum/unit_test/outfit_sanity
+2023-11-12T09:04:52.5011539Z [1;32mPASS[0m /datum/unit_test/outfit_sanity 12.5s
+2023-11-12T09:04:52.5013136Z ##[endgroup]
+2023-11-12T09:04:52.5847995Z ##[group]/datum/unit_test/oxyloss_suffocation
+2023-11-12T09:04:52.6033624Z [1;32mPASS[0m /datum/unit_test/oxyloss_suffocation 0.1s
+2023-11-12T09:04:52.6035713Z ##[endgroup]
+2023-11-12T09:04:52.6523199Z ##[group]/datum/unit_test/paintings
+2023-11-12T09:04:52.6718185Z [1;32mPASS[0m /datum/unit_test/paintings 0s
+2023-11-12T09:04:52.6720334Z ##[endgroup]
+2023-11-12T09:04:52.6860350Z ##[group]/datum/unit_test/pills
+2023-11-12T09:04:52.7049829Z [1;32mPASS[0m /datum/unit_test/pills 0.1s
+2023-11-12T09:04:52.7051614Z ##[endgroup]
+2023-11-12T09:04:52.7284869Z ##[group]/datum/unit_test/plane_double_transform
+2023-11-12T09:04:52.7568954Z [1;32mPASS[0m /datum/unit_test/plane_double_transform 0s
+2023-11-12T09:04:52.7570947Z ##[endgroup]
+2023-11-12T09:04:52.8088783Z ##[group]/datum/unit_test/plane_dupe_detector
+2023-11-12T09:04:52.8092292Z [1;32mPASS[0m /datum/unit_test/plane_dupe_detector 0s
+2023-11-12T09:04:52.8094235Z ##[endgroup]
+2023-11-12T09:04:52.8223651Z ##[group]/datum/unit_test/plantgrowth
+2023-11-12T09:04:52.9104725Z [1;32mPASS[0m /datum/unit_test/plantgrowth 0.1s
+2023-11-12T09:04:52.9106537Z ##[endgroup]
+2023-11-12T09:04:52.9238426Z ##[group]/datum/unit_test/preference_species
+2023-11-12T09:04:52.9241982Z [1;32mPASS[0m /datum/unit_test/preference_species 0s
+2023-11-12T09:04:52.9243985Z ##[endgroup]
+2023-11-12T09:04:52.9366837Z ##[group]/datum/unit_test/preferences_implement_everything
+2023-11-12T09:04:52.9767879Z [1;32mPASS[0m /datum/unit_test/preferences_implement_everything 0s
+2023-11-12T09:04:52.9769887Z ##[endgroup]
+2023-11-12T09:04:53.0386005Z ##[group]/datum/unit_test/preferences_valid_savefile_key
+2023-11-12T09:04:53.0390164Z [1;32mPASS[0m /datum/unit_test/preferences_valid_savefile_key 0s
+2023-11-12T09:04:53.0392300Z ##[endgroup]
+2023-11-12T09:04:53.0533180Z ##[group]/datum/unit_test/preferences_valid_main_feature_name
+2023-11-12T09:04:53.0536519Z [1;32mPASS[0m /datum/unit_test/preferences_valid_main_feature_name 0s
+2023-11-12T09:04:53.0538733Z ##[endgroup]
+2023-11-12T09:04:53.0666858Z ##[group]/datum/unit_test/preferences_should_generate_icons_sanity
+2023-11-12T09:04:53.5932797Z [1;32mPASS[0m /datum/unit_test/preferences_should_generate_icons_sanity 0.5s
+2023-11-12T09:04:53.5934463Z ##[endgroup]
+2023-11-12T09:04:53.6200764Z ##[group]/datum/unit_test/projectile_movetypes
+2023-11-12T09:04:53.6204485Z [1;32mPASS[0m /datum/unit_test/projectile_movetypes 0s
+2023-11-12T09:04:53.6206834Z ##[endgroup]
+2023-11-12T09:04:53.6336940Z ##[group]/datum/unit_test/gun_go_bang
+2023-11-12T09:04:53.6829687Z [1;32mPASS[0m /datum/unit_test/gun_go_bang 0s
+2023-11-12T09:04:53.6830843Z ##[endgroup]
+2023-11-12T09:04:53.7230698Z ##[group]/datum/unit_test/quirk_icons
+2023-11-12T09:04:53.7234275Z [1;32mPASS[0m /datum/unit_test/quirk_icons 0s
+2023-11-12T09:04:53.7236777Z ##[endgroup]
+2023-11-12T09:04:53.7365585Z ##[group]/datum/unit_test/range_return
+2023-11-12T09:04:53.7369094Z [1;32mPASS[0m /datum/unit_test/range_return 0s
+2023-11-12T09:04:53.7371240Z ##[endgroup]
+2023-11-12T09:04:53.7500465Z ##[group]/datum/unit_test/frame_stacking
+2023-11-12T09:04:53.7979971Z [1;32mPASS[0m /datum/unit_test/frame_stacking 0s
+2023-11-12T09:04:53.7981883Z ##[endgroup]
+2023-11-12T09:04:53.8318167Z ##[group]/datum/unit_test/reagent_container_defaults
+2023-11-12T09:04:54.0941417Z [1;32mPASS[0m /datum/unit_test/reagent_container_defaults 0.2s
+2023-11-12T09:04:54.0943278Z ##[endgroup]
+2023-11-12T09:04:54.2270413Z ##[group]/datum/unit_test/reagent_id_typos
+2023-11-12T09:04:54.2286982Z [1;32mPASS[0m /datum/unit_test/reagent_id_typos 0s
+2023-11-12T09:04:54.2289435Z ##[endgroup]
+2023-11-12T09:04:54.2420053Z ##[group]/datum/unit_test/reagent_mob_expose
+2023-11-12T09:04:54.2723656Z [1;32mPASS[0m /datum/unit_test/reagent_mob_expose 0s
+2023-11-12T09:04:54.2726334Z ##[endgroup]
+2023-11-12T09:04:54.3099472Z ##[group]/datum/unit_test/reagent_mob_procs
+2023-11-12T09:04:54.3289033Z [1;32mPASS[0m /datum/unit_test/reagent_mob_procs 0s
+2023-11-12T09:04:54.3291717Z ##[endgroup]
+2023-11-12T09:04:54.3541628Z ##[group]/datum/unit_test/reagent_names
+2023-11-12T09:04:55.1766396Z [1;32mPASS[0m /datum/unit_test/reagent_names 0.8s
+2023-11-12T09:04:55.1768837Z ##[endgroup]
+2023-11-12T09:04:55.2029840Z ##[group]/datum/unit_test/reagent_recipe_collisions
+2023-11-12T09:04:56.8716958Z [1;32mPASS[0m /datum/unit_test/reagent_recipe_collisions 1.6s
+2023-11-12T09:04:56.8718508Z ##[endgroup]
+2023-11-12T09:04:56.8869144Z ##[group]/datum/unit_test/reagent_transfer
+2023-11-12T09:04:56.8878975Z [1;32mPASS[0m /datum/unit_test/reagent_transfer 0s
+2023-11-12T09:04:56.8880828Z ##[endgroup]
+2023-11-12T09:04:56.9011226Z ##[group]/datum/unit_test/required_map_items
+2023-11-12T09:04:56.9014244Z [1;32mPASS[0m /datum/unit_test/required_map_items 0s
+2023-11-12T09:04:56.9016215Z ##[endgroup]
+2023-11-12T09:04:56.9145903Z ##[group]/datum/unit_test/stop_drop_and_roll
+2023-11-12T09:04:56.9332587Z [1;32mPASS[0m /datum/unit_test/stop_drop_and_roll 0s
+2023-11-12T09:04:56.9334766Z ##[endgroup]
+2023-11-12T09:04:56.9894372Z ##[group]/datum/unit_test/container_resist
+2023-11-12T09:04:57.0133852Z [1;32mPASS[0m /datum/unit_test/container_resist 0.1s
+2023-11-12T09:04:57.0136482Z ##[endgroup]
+2023-11-12T09:04:57.0869981Z ##[group]/datum/unit_test/get_message_mods
+2023-11-12T09:04:57.1036296Z [1;32mPASS[0m /datum/unit_test/get_message_mods 0.1s
+2023-11-12T09:04:57.1038377Z ##[endgroup]
+2023-11-12T09:04:57.1761766Z ##[group]/datum/unit_test/say_signal
+2023-11-12T09:04:57.1785738Z [1;32mPASS[0m /datum/unit_test/say_signal 0s
+2023-11-12T09:04:57.1787867Z ##[endgroup]
+2023-11-12T09:04:57.2275108Z ##[group]/datum/unit_test/translate_language
+2023-11-12T09:04:57.2445118Z [1;32mPASS[0m /datum/unit_test/translate_language 0s
+2023-11-12T09:04:57.2447197Z ##[endgroup]
+2023-11-12T09:04:57.2776300Z ##[group]/datum/unit_test/speech
+2023-11-12T09:04:57.3273922Z [1;32mPASS[0m /datum/unit_test/speech 0.1s
+2023-11-12T09:04:57.3276048Z ##[endgroup]
+2023-11-12T09:04:57.3648311Z ##[group]/datum/unit_test/screenshot_antag_icons
+2023-11-12T09:04:57.3655596Z screenshot_antag_icons_cyberpolice was put in data/screenshots_new
+2023-11-12T09:04:57.3668195Z screenshot_antag_icons_fugitive was put in data/screenshots_new
+2023-11-12T09:04:57.3673743Z screenshot_antag_icons_loneoperative was put in data/screenshots_new
+2023-11-12T09:04:57.3918428Z screenshot_antag_icons_sentiencepotionspawn was put in data/screenshots_new
+2023-11-12T09:04:57.3925180Z screenshot_antag_icons_traitor was put in data/screenshots_new
+2023-11-12T09:04:57.4212360Z screenshot_antag_icons_malfai was put in data/screenshots_new
+2023-11-12T09:04:57.4244403Z screenshot_antag_icons_bloodbrother was put in data/screenshots_new
+2023-11-12T09:04:57.4250630Z screenshot_antag_icons_changeling was put in data/screenshots_new
+2023-11-12T09:04:57.4282149Z screenshot_antag_icons_heretic was put in data/screenshots_new
+2023-11-12T09:04:57.4292701Z screenshot_antag_icons_wizard was put in data/screenshots_new
+2023-11-12T09:04:57.4322992Z screenshot_antag_icons_cultist was put in data/screenshots_new
+2023-11-12T09:04:57.4335181Z screenshot_antag_icons_operative was put in data/screenshots_new
+2023-11-12T09:04:57.4347253Z screenshot_antag_icons_clownoperative was put in data/screenshots_new
+2023-11-12T09:04:57.4360316Z screenshot_antag_icons_headrevolutionary was put in data/screenshots_new
+2023-11-12T09:04:57.4362553Z screenshot_antag_icons_syndicateinfiltrator was put in data/screenshots_new
+2023-11-12T09:04:57.4364249Z screenshot_antag_icons_provocateur was put in data/screenshots_new
+2023-11-12T09:04:57.4365976Z screenshot_antag_icons_hereticsmuggler was put in data/screenshots_new
+2023-11-12T09:04:57.4367872Z screenshot_antag_icons_stowawaychangeling was put in data/screenshots_new
+2023-11-12T09:04:57.4369724Z screenshot_antag_icons_wizardmidround was put in data/screenshots_new
+2023-11-12T09:04:57.4371538Z screenshot_antag_icons_operativemidround was put in data/screenshots_new
+2023-11-12T09:04:57.4836255Z screenshot_antag_icons_blob was put in data/screenshots_new
+2023-11-12T09:04:57.4913104Z screenshot_antag_icons_xenomorph was put in data/screenshots_new
+2023-11-12T09:04:57.4918547Z screenshot_antag_icons_nightmare was put in data/screenshots_new
+2023-11-12T09:04:57.4972641Z screenshot_antag_icons_spacedragon was put in data/screenshots_new
+2023-11-12T09:04:57.4978863Z screenshot_antag_icons_abductor was put in data/screenshots_new
+2023-11-12T09:04:57.4984390Z screenshot_antag_icons_spaceninja was put in data/screenshots_new
+2023-11-12T09:04:57.5142179Z screenshot_antag_icons_revenant was put in data/screenshots_new
+2023-11-12T09:04:57.5158225Z screenshot_antag_icons_sentientdisease was put in data/screenshots_new
+2023-11-12T09:04:57.5164048Z screenshot_antag_icons_changelingmidround was put in data/screenshots_new
+2023-11-12T09:04:57.5175747Z screenshot_antag_icons_paradoxclone was put in data/screenshots_new
+2023-11-12T09:04:57.5177675Z screenshot_antag_icons_syndicatesleeperagent was put in data/screenshots_new
+2023-11-12T09:04:57.5295585Z screenshot_antag_icons_blobinfection was put in data/screenshots_new
+2023-11-12T09:04:57.5313285Z screenshot_antag_icons_obsessed was put in data/screenshots_new
+2023-11-12T09:04:57.5315517Z screenshot_antag_icons_malfaimidround was put in data/screenshots_new
+2023-11-12T09:04:57.5319787Z [1;32mPASS[0m /datum/unit_test/screenshot_antag_icons 0.2s
+2023-11-12T09:04:57.5322595Z ##[endgroup]
+2023-11-12T09:04:57.5541756Z ##[group]/datum/unit_test/screenshot_basic
+2023-11-12T09:04:57.5545037Z screenshot_basic_red was put in data/screenshots_new
+2023-11-12T09:04:57.5548126Z [1;32mPASS[0m /datum/unit_test/screenshot_basic 0s
+2023-11-12T09:04:57.5550758Z ##[endgroup]
+2023-11-12T09:04:57.5683479Z ##[group]/datum/unit_test/screenshot_dynamic_human_icons
+2023-11-12T09:04:57.8350756Z screenshot_dynamic_human_icons_syndicate_commando was put in data/screenshots_new
+2023-11-12T09:04:57.8354817Z [1;32mPASS[0m /datum/unit_test/screenshot_dynamic_human_icons 0.3s
+2023-11-12T09:04:57.8357024Z ##[endgroup]
+2023-11-12T09:04:57.8497778Z ##[group]/datum/unit_test/screenshot_humanoids
+2023-11-12T09:04:58.2541589Z screenshot_humanoids__datum_species_lizard was put in data/screenshots_new
+2023-11-12T09:04:58.8071729Z screenshot_humanoids__datum_species_moth was put in data/screenshots_new
+2023-11-12T09:04:59.0481483Z screenshot_humanoids__datum_species_shadow was put in data/screenshots_new
+2023-11-12T09:04:59.2204964Z screenshot_humanoids__datum_species_shadow_nightmare was put in data/screenshots_new
+2023-11-12T09:04:59.4446438Z screenshot_humanoids__datum_species_abductor was put in data/screenshots_new
+2023-11-12T09:04:59.9025529Z screenshot_humanoids__datum_species_human was put in data/screenshots_new
+2023-11-12T09:05:00.3720324Z screenshot_humanoids__datum_species_human_tallboy was put in data/screenshots_new
+2023-11-12T09:05:00.8410192Z screenshot_humanoids__datum_species_human_felinid was put in data/screenshots_new
+2023-11-12T09:05:01.3919326Z screenshot_humanoids__datum_species_human_krokodil_addict was put in data/screenshots_new
+2023-11-12T09:05:01.5050044Z screenshot_humanoids__datum_species_monkey was put in data/screenshots_new
+2023-11-12T09:05:01.6332131Z screenshot_humanoids__datum_species_monkey_human_legged was put in data/screenshots_new
+2023-11-12T09:05:01.8078163Z screenshot_humanoids__datum_species_monkey_monkey_freak was put in data/screenshots_new
+2023-11-12T09:05:01.9204604Z screenshot_humanoids__datum_species_monkey_holodeck was put in data/screenshots_new
+2023-11-12T09:05:02.2703729Z screenshot_humanoids__datum_species_android was put in data/screenshots_new
+2023-11-12T09:05:02.5066397Z screenshot_humanoids__datum_species_dullahan was put in data/screenshots_new
+2023-11-12T09:05:02.8821597Z screenshot_humanoids__datum_species_ethereal was put in data/screenshots_new
+2023-11-12T09:05:03.0618503Z screenshot_humanoids__datum_species_ethereal_lustrous was put in data/screenshots_new
+2023-11-12T09:05:03.6054858Z screenshot_humanoids__datum_species_fly was put in data/screenshots_new
+2023-11-12T09:05:03.7723456Z screenshot_humanoids__datum_species_golem was put in data/screenshots_new
+2023-11-12T09:05:04.2399263Z screenshot_humanoids__datum_species_jelly was put in data/screenshots_new
+2023-11-12T09:05:04.7039511Z screenshot_humanoids__datum_species_jelly_slime was put in data/screenshots_new
+2023-11-12T09:05:05.1607461Z screenshot_humanoids__datum_species_jelly_luminescent was put in data/screenshots_new
+2023-11-12T09:05:05.6194475Z screenshot_humanoids__datum_species_jelly_stargazer was put in data/screenshots_new
+2023-11-12T09:05:05.9809404Z screenshot_humanoids__datum_species_lizard_ashwalker was put in data/screenshots_new
+2023-11-12T09:05:06.3898218Z screenshot_humanoids__datum_species_lizard_silverscale was put in data/screenshots_new
+2023-11-12T09:05:06.6851305Z screenshot_humanoids__datum_species_mush was put in data/screenshots_new
+2023-11-12T09:05:07.0392950Z screenshot_humanoids__datum_species_plasmaman was put in data/screenshots_new
+2023-11-12T09:05:07.5136767Z screenshot_humanoids__datum_species_pod was put in data/screenshots_new
+2023-11-12T09:05:07.7567133Z screenshot_humanoids__datum_species_skeleton was put in data/screenshots_new
+2023-11-12T09:05:08.2342975Z screenshot_humanoids__datum_species_snail was put in data/screenshots_new
+2023-11-12T09:05:08.6975763Z screenshot_humanoids__datum_species_vampire was put in data/screenshots_new
+2023-11-12T09:05:09.2496544Z screenshot_humanoids__datum_species_zombie was put in data/screenshots_new
+2023-11-12T09:05:09.8588009Z screenshot_humanoids__datum_species_zombie_infectious was put in data/screenshots_new
+2023-11-12T09:05:09.8591473Z [1;32mPASS[0m /datum/unit_test/screenshot_humanoids 12s
+2023-11-12T09:05:09.8593884Z ##[endgroup]
+2023-11-12T09:05:10.3359233Z ##[group]/datum/unit_test/screenshot_husk
+2023-11-12T09:05:10.4814584Z screenshot_husk_body was put in data/screenshots_new
+2023-11-12T09:05:10.5100421Z screenshot_husk_body_missing_limbs was put in data/screenshots_new
+2023-11-12T09:05:10.5103760Z [1;32mPASS[0m /datum/unit_test/screenshot_husk 0.2s
+2023-11-12T09:05:10.5105844Z ##[endgroup]
+2023-11-12T09:05:10.5738946Z ##[group]/datum/unit_test/screenshot_saturnx
+2023-11-12T09:05:10.7302951Z screenshot_saturnx_invisibility was put in data/screenshots_new
+2023-11-12T09:05:10.7306714Z [1;32mPASS[0m /datum/unit_test/screenshot_saturnx 0.2s
+2023-11-12T09:05:10.7309565Z ##[endgroup]
+2023-11-12T09:05:10.7993117Z ##[group]/datum/unit_test/security_levels
+2023-11-12T09:05:10.7995233Z [1;32mPASS[0m /datum/unit_test/security_levels 0s
+2023-11-12T09:05:10.7997473Z ##[endgroup]
+2023-11-12T09:05:10.8718075Z ##[group]/datum/unit_test/security_officer_roundstart_distribution
+2023-11-12T09:05:10.9829621Z [1;32mPASS[0m /datum/unit_test/security_officer_roundstart_distribution 0.1s
+2023-11-12T09:05:10.9831233Z ##[endgroup]
+2023-11-12T09:05:11.0917739Z ##[group]/datum/unit_test/security_officer_latejoin_distribution
+2023-11-12T09:05:11.3756560Z [1;32mPASS[0m /datum/unit_test/security_officer_latejoin_distribution 0.3s
+2023-11-12T09:05:11.3757917Z ##[endgroup]
+2023-11-12T09:05:11.6159233Z ##[group]/datum/unit_test/servingtray
+2023-11-12T09:05:11.6420663Z [1;32mPASS[0m /datum/unit_test/servingtray 0s
+2023-11-12T09:05:11.6422707Z ##[endgroup]
+2023-11-12T09:05:11.6722939Z ##[group]/datum/unit_test/simple_animal_freeze
+2023-11-12T09:05:11.6727308Z [1;32mPASS[0m /datum/unit_test/simple_animal_freeze 0s
+2023-11-12T09:05:11.6729459Z ##[endgroup]
+2023-11-12T09:05:11.6858248Z ##[group]/datum/unit_test/siunit
+2023-11-12T09:05:11.6862565Z [1;32mPASS[0m /datum/unit_test/siunit 0s
+2023-11-12T09:05:11.6864627Z ##[endgroup]
+2023-11-12T09:05:11.6994032Z ##[group]/datum/unit_test/slime_mood
+2023-11-12T09:05:11.7086306Z [1;32mPASS[0m /datum/unit_test/slime_mood 0.1s
+2023-11-12T09:05:11.7089418Z ##[endgroup]
+2023-11-12T09:05:11.7646724Z ##[group]/datum/unit_test/slips
+2023-11-12T09:05:11.7998254Z [1;32mPASS[0m /datum/unit_test/slips 0s
+2023-11-12T09:05:11.7999914Z ##[endgroup]
+2023-11-12T09:05:11.8832258Z ##[group]/datum/unit_test/spawn_humans
+2023-11-12T09:05:16.9174068Z [1;32mPASS[0m /datum/unit_test/spawn_humans 5.1s
+2023-11-12T09:05:16.9175480Z ##[endgroup]
+2023-11-12T09:05:16.9826971Z ##[group]/datum/unit_test/human_default_traits
+2023-11-12T09:05:16.9992542Z [1;32mPASS[0m /datum/unit_test/human_default_traits 0s
+2023-11-12T09:05:16.9994648Z ##[endgroup]
+2023-11-12T09:05:17.0453589Z ##[group]/datum/unit_test/spawn_mobs
+2023-11-12T09:05:17.3110840Z [1;32mPASS[0m /datum/unit_test/spawn_mobs 0.3s
+2023-11-12T09:05:17.3113201Z ##[endgroup]
+2023-11-12T09:05:17.8604911Z ##[group]/datum/unit_test/species_change_clothing
+2023-11-12T09:05:18.0037169Z [1;32mPASS[0m /datum/unit_test/species_change_clothing 0.2s
+2023-11-12T09:05:18.0039927Z ##[endgroup]
+2023-11-12T09:05:18.0594811Z ##[group]/datum/unit_test/species_change_held_items
+2023-11-12T09:05:18.1241794Z [1;32mPASS[0m /datum/unit_test/species_change_held_items 0.1s
+2023-11-12T09:05:18.1244171Z ##[endgroup]
+2023-11-12T09:05:18.1531271Z ##[group]/datum/unit_test/species_change_organs
+2023-11-12T09:05:18.2175195Z [1;32mPASS[0m /datum/unit_test/species_change_organs 0.1s
+2023-11-12T09:05:18.2177564Z ##[endgroup]
+2023-11-12T09:05:18.2917259Z ##[group]/datum/unit_test/species_config_sanity
+2023-11-12T09:05:18.2920181Z [1;32mPASS[0m /datum/unit_test/species_config_sanity 0s
+2023-11-12T09:05:18.2922846Z ##[endgroup]
+2023-11-12T09:05:18.3062818Z ##[group]/datum/unit_test/species_unique_id
+2023-11-12T09:05:18.3065971Z [1;32mPASS[0m /datum/unit_test/species_unique_id 0s
+2023-11-12T09:05:18.3068171Z ##[endgroup]
+2023-11-12T09:05:18.3222639Z ##[group]/datum/unit_test/species_whitelist_check
+2023-11-12T09:05:18.3225988Z [1;32mPASS[0m /datum/unit_test/species_whitelist_check 0s
+2023-11-12T09:05:18.3228060Z ##[endgroup]
+2023-11-12T09:05:18.3393256Z ##[group]/datum/unit_test/spell_invocations
+2023-11-12T09:05:18.3397536Z [1;32mPASS[0m /datum/unit_test/spell_invocations 0s
+2023-11-12T09:05:18.3400085Z ##[endgroup]
+2023-11-12T09:05:18.3530030Z ##[group]/datum/unit_test/shadow_jaunt
+2023-11-12T09:05:18.3711590Z [1;32mPASS[0m /datum/unit_test/shadow_jaunt 0s
+2023-11-12T09:05:18.3713925Z ##[endgroup]
+2023-11-12T09:05:18.4080468Z ##[group]/datum/unit_test/mind_swap_spell
+2023-11-12T09:05:18.4445059Z [1;32mPASS[0m /datum/unit_test/mind_swap_spell 0s
+2023-11-12T09:05:18.4447973Z ##[endgroup]
+2023-11-12T09:05:18.4831097Z ##[group]/datum/unit_test/spell_names
+2023-11-12T09:05:18.4836690Z [1;32mPASS[0m /datum/unit_test/spell_names 0s
+2023-11-12T09:05:18.4839793Z ##[endgroup]
+2023-11-12T09:05:18.4973281Z ##[group]/datum/unit_test/shapeshift_spell_validity
+2023-11-12T09:05:18.4982346Z [1;32mPASS[0m /datum/unit_test/shapeshift_spell_validity 0s
+2023-11-12T09:05:18.4985502Z ##[endgroup]
+2023-11-12T09:05:18.5118193Z ##[group]/datum/unit_test/shapeshift_spell
+2023-11-12T09:05:31.3590354Z [1;32mPASS[0m /datum/unit_test/shapeshift_spell 12.8s
+2023-11-12T09:05:31.3593257Z ##[endgroup]
+2023-11-12T09:05:31.3839062Z ##[group]/datum/unit_test/shapeshift_holoparasites
+2023-11-12T09:05:31.4236915Z [1;32mPASS[0m /datum/unit_test/shapeshift_holoparasites 0.1s
+2023-11-12T09:05:31.4240548Z ##[endgroup]
+2023-11-12T09:05:31.4609174Z ##[group]/datum/unit_test/shapeshift_health
+2023-11-12T09:05:32.0958569Z [1;32mPASS[0m /datum/unit_test/shapeshift_health 0.6s
+2023-11-12T09:05:32.0961165Z ##[endgroup]
+2023-11-12T09:05:32.2270540Z ##[group]/datum/unit_test/spritesheets
+2023-11-12T09:05:32.2310129Z [1;32mPASS[0m /datum/unit_test/spritesheets 0s
+2023-11-12T09:05:32.2313287Z ##[endgroup]
+2023-11-12T09:05:32.2444065Z ##[group]/datum/unit_test/stack_singular_name
+2023-11-12T09:05:32.2449554Z [1;32mPASS[0m /datum/unit_test/stack_singular_name 0s
+2023-11-12T09:05:32.2452311Z ##[endgroup]
+2023-11-12T09:05:32.2582343Z ##[group]/datum/unit_test/station_traits
+2023-11-12T09:05:32.2586458Z [1;32mPASS[0m /datum/unit_test/station_traits 0s
+2023-11-12T09:05:32.2589532Z ##[endgroup]
+2023-11-12T09:05:32.3273087Z ##[group]/datum/unit_test/status_effect_ticks
+2023-11-12T09:05:32.3278478Z [1;32mPASS[0m /datum/unit_test/status_effect_ticks 0s
+2023-11-12T09:05:32.3282046Z ##[endgroup]
+2023-11-12T09:05:32.3883615Z ##[group]/datum/unit_test/stomach
+2023-11-12T09:05:32.4148653Z [1;32mPASS[0m /datum/unit_test/stomach 0.1s
+2023-11-12T09:05:32.4152041Z ##[endgroup]
+2023-11-12T09:05:32.4474665Z ##[group]/datum/unit_test/strip_menu_ui_status
+2023-11-12T09:05:32.4955743Z [1;32mPASS[0m /datum/unit_test/strip_menu_ui_status 0s
+2023-11-12T09:05:32.4959231Z ##[endgroup]
+2023-11-12T09:05:32.5763081Z ##[group]/datum/unit_test/stun
+2023-11-12T09:05:32.5938628Z [1;32mPASS[0m /datum/unit_test/stun 0s
+2023-11-12T09:05:32.5941798Z ##[endgroup]
+2023-11-12T09:05:32.6174955Z ##[group]/datum/unit_test/knockdown
+2023-11-12T09:05:32.6344357Z [1;32mPASS[0m /datum/unit_test/knockdown 0s
+2023-11-12T09:05:32.6347424Z ##[endgroup]
+2023-11-12T09:05:32.6656807Z ##[group]/datum/unit_test/paralyze
+2023-11-12T09:05:32.6830553Z [1;32mPASS[0m /datum/unit_test/paralyze 0s
+2023-11-12T09:05:32.6834151Z ##[endgroup]
+2023-11-12T09:05:32.7067888Z ##[group]/datum/unit_test/unconsciousness
+2023-11-12T09:05:32.7247146Z [1;32mPASS[0m /datum/unit_test/unconsciousness 0s
+2023-11-12T09:05:32.7250770Z ##[endgroup]
+2023-11-12T09:05:32.7494899Z ##[group]/datum/unit_test/stun_absorb
+2023-11-12T09:05:32.7661160Z [1;32mPASS[0m /datum/unit_test/stun_absorb 0s
+2023-11-12T09:05:32.7664703Z ##[endgroup]
+2023-11-12T09:05:32.7898786Z ##[group]/datum/unit_test/subsystem_init
+2023-11-12T09:05:32.7903149Z [1;32mPASS[0m /datum/unit_test/subsystem_init 0s
+2023-11-12T09:05:32.7906701Z ##[endgroup]
+2023-11-12T09:05:32.8135238Z ##[group]/datum/unit_test/suit_storage_icons
+2023-11-12T09:05:34.6162263Z 1 - /obj/item/gun/ballistic/shotgun/hook using invalid icon_state, "hookshotgun"
+2023-11-12T09:05:34.6285969Z 2 - /obj/item/gun/ballistic/automatic/surplus using invalid icon_state, "surplus"
+2023-11-12T09:05:34.6466661Z 3 - /obj/item/melee/baton/security/cattleprod/telecrystalprod using invalid icon_state, "telecrystalprod"
+2023-11-12T09:05:34.6533245Z 4 - /obj/item/melee/sickly_blade/void using invalid icon_state, "void_blade"
+2023-11-12T09:05:34.6538232Z 5 - /obj/item/melee/sickly_blade/cosmic using invalid icon_state, "cosmic_blade"
+2023-11-12T09:05:34.6541373Z 6 - /obj/item/melee/sickly_blade/lock using invalid icon_state, "key_blade"
+2023-11-12T09:05:34.6628237Z 7 - /obj/item/radio/headset/syndicate/alt using invalid worn_icon_state, "syndie_headset"
+2023-11-12T09:05:34.6633020Z 8 - /obj/item/radio/headset/headset_sec using invalid worn_icon_state, "sec_headset"
+2023-11-12T09:05:34.6636156Z 9 - /obj/item/radio/headset/headset_sec/alt using invalid worn_icon_state, "sec_headset_alt"
+2023-11-12T09:05:34.6639243Z 10 - /obj/item/radio/headset/headset_eng using invalid worn_icon_state, "eng_headset"
+2023-11-12T09:05:34.6642514Z 11 - /obj/item/radio/headset/headset_rob using invalid worn_icon_state, "rob_headset"
+2023-11-12T09:05:34.6645779Z 12 - /obj/item/radio/headset/headset_med using invalid worn_icon_state, "med_headset"
+2023-11-12T09:05:34.6649005Z 13 - /obj/item/radio/headset/headset_sci using invalid worn_icon_state, "sci_headset"
+2023-11-12T09:05:34.6652244Z 14 - /obj/item/radio/headset/headset_medsci using invalid worn_icon_state, "medsci_headset"
+2023-11-12T09:05:34.6655462Z 15 - /obj/item/radio/headset/headset_srvsec using invalid worn_icon_state, "srvsec_headset"
+2023-11-12T09:05:34.6658687Z 16 - /obj/item/radio/headset/headset_srvmed using invalid worn_icon_state, "srv_headset"
+2023-11-12T09:05:34.6661917Z 17 - /obj/item/radio/headset/headset_com using invalid worn_icon_state, "com_headset"
+2023-11-12T09:05:34.6667219Z 18 - /obj/item/radio/headset/heads/captain/alt using invalid worn_icon_state, "com_headset_alt"
+2023-11-12T09:05:34.6670732Z 19 - /obj/item/radio/headset/headset_cargo using invalid worn_icon_state, "cargo_headset"
+2023-11-12T09:05:34.6673230Z 20 - /obj/item/radio/headset/headset_cargo/mining using invalid worn_icon_state, "mine_headset"
+2023-11-12T09:05:34.6675625Z 21 - /obj/item/radio/headset/headset_cent using invalid worn_icon_state, "cent_headset"
+2023-11-12T09:05:34.6678128Z 22 - /obj/item/radio/headset/headset_cent/alt using invalid worn_icon_state, "cent_headset_alt"
+2023-11-12T09:05:34.6972394Z 23 - /obj/item/toy/foam_runic_scepter using invalid worn_icon_state, "vendor_staff"
+2023-11-12T09:05:34.7033817Z 24 - /obj/item/cultivator/rake using invalid icon_state, "rake"
+2023-11-12T09:05:34.7038164Z 25 - /obj/item/hatchet/wooden using invalid icon_state, "woodhatchet"
+2023-11-12T09:05:34.7039900Z 26 - /obj/item/hatchet/cutterblade using invalid icon_state, "cutterblade"
+2023-11-12T09:05:34.7408592Z 27 - /obj/item/access_key using invalid icon_state, "access_key"
+2023-11-12T09:05:34.7458044Z 28 - /obj/item/key/janitor using invalid icon_state, "keyjanitor"
+2023-11-12T09:05:34.8393427Z 29 - /obj/item/universal_scanner using invalid icon_state, "export scanner"
+2023-11-12T09:05:34.8476665Z 30 - /obj/item/nullrod/tribal_knife using invalid icon_state, "crysknife"
+2023-11-12T09:05:34.8491387Z 31 - /obj/item/organ/internal/monster_core using invalid icon_state, "hivelord_core"
+2023-11-12T09:05:34.8493709Z 32 - /obj/item/organ/internal/monster_core/brimdust_sac using invalid icon_state, "brim_sac"
+2023-11-12T09:05:34.8496411Z 33 - /obj/item/organ/internal/monster_core/regenerative_core/legion using invalid icon_state, "legion_core"
+2023-11-12T09:05:34.8498777Z 34 - /obj/item/organ/internal/monster_core/rush_gland using invalid icon_state, "lobster_gland"
+2023-11-12T09:05:34.8538527Z 35 - /obj/item/abductor/gizmo using invalid icon_state, "gizmo_scan"
+2023-11-12T09:05:34.8540751Z 36 - /obj/item/abductor/silencer using invalid icon_state, "silencer"
+2023-11-12T09:05:34.8543252Z 37 - /obj/item/abductor/mind_device using invalid icon_state, "mind_device_message"
+2023-11-12T09:05:34.8545406Z 38 - /obj/item/abductor/alien_omnitool using invalid icon_state, "omnitool"
+2023-11-12T09:05:34.8552089Z 39 - /obj/item/banner using invalid icon_state, "banner"
+2023-11-12T09:05:34.8554713Z 40 - /obj/item/banner/security using invalid icon_state, "banner_security"
+2023-11-12T09:05:34.8557066Z 41 - /obj/item/banner/medical using invalid icon_state, "banner_medical"
+2023-11-12T09:05:34.8559349Z 42 - /obj/item/banner/science using invalid icon_state, "banner_science"
+2023-11-12T09:05:34.8561592Z 43 - /obj/item/banner/cargo using invalid icon_state, "banner_cargo"
+2023-11-12T09:05:34.8564170Z 44 - /obj/item/banner/engineering using invalid icon_state, "banner_engineering"
+2023-11-12T09:05:34.8566536Z 45 - /obj/item/banner/red using invalid icon_state, "banner-red"
+2023-11-12T09:05:34.8568980Z 46 - /obj/item/banner/blue using invalid icon_state, "banner-blue"
+2023-11-12T09:05:34.8576281Z 47 - /obj/item/claymore/cutlass using invalid worn_icon_state, "cutlass"
+2023-11-12T09:05:34.8580270Z 48 - /obj/item/claymore/highlander/robot using invalid icon_state, "claymore_cyborg"
+2023-11-12T09:05:34.8582334Z 49 - /obj/item/pillow using invalid icon_state, "pillow_1_t"
+2023-11-12T09:05:34.8584899Z 50 - /obj/item/pillow/clown using invalid icon_state, "pillow_5_t"
+2023-11-12T09:05:34.8587221Z 51 - /obj/item/pillow/mime using invalid icon_state, "pillow_6_t"
+2023-11-12T09:05:34.8626613Z 52 - /obj/item/gun/magic/staff/chaos/true_wabbajack using invalid icon_state, "the_wabbajack"
+2023-11-12T09:05:34.8633965Z 53 - /obj/item/gun/magic/staff/locker using invalid worn_icon_state, "lockerstaff"
+2023-11-12T09:05:34.8636381Z 54 - /obj/item/gun/magic/staff/flying using invalid worn_icon_state, "flightstaff"
+2023-11-12T09:05:34.8657485Z 55 - /obj/item/melee/energy/sword/pirate using invalid icon_state, "e_cutlass"
+2023-11-12T09:05:34.8659958Z 56 - /obj/item/clothing/glasses/eyepatch using invalid icon_state, "eyepatch"
+2023-11-12T09:05:34.8662250Z 57 - /obj/item/clothing/glasses/eyepatch/medical using invalid icon_state, "eyepatch_medical"
+2023-11-12T09:05:34.8976969Z 58 - /obj/item/melee/energy/sword using invalid icon_state, "e_sword"
+2023-11-12T09:05:34.8979094Z 59 - /obj/item/melee/energy/sword/cyborg/saw using invalid icon_state, "esaw"
+2023-11-12T09:05:34.8988519Z 60 - /obj/item/tank/jetpack/improvised using invalid worn_icon_state, "jetpack-improvised"
+2023-11-12T09:05:34.8993419Z 61 - /obj/item/multitool using invalid icon_state, "multitool"
+2023-11-12T09:05:34.8996418Z 62 - /obj/item/multitool/cyborg using invalid icon_state, "multitool_cyborg"
+2023-11-12T09:05:34.8998725Z 63 - /obj/item/multitool/circuit using invalid icon_state, "multitool_circuit"
+2023-11-12T09:05:34.9001342Z 64 - /obj/item/assembly/flash/handheld using invalid icon_state, "flash"
+2023-11-12T09:05:34.9004166Z 65 - /obj/item/clothing/mask/cigarette using invalid icon_state, "cigoff"
+2023-11-12T09:05:34.9006481Z 66 - /obj/item/clothing/mask/cigarette/rollie using invalid icon_state, "spliffoff"
+2023-11-12T09:05:34.9008788Z 67 - /obj/item/clothing/mask/cigarette/candy using invalid icon_state, "candyoff"
+2023-11-12T09:05:34.9011087Z 68 - /obj/item/clothing/mask/cigarette/cigar using invalid icon_state, "cigaroff"
+2023-11-12T09:05:34.9013684Z 69 - /obj/item/clothing/mask/cigarette/cigar/cohiba using invalid icon_state, "cigar2off"
+2023-11-12T09:05:34.9016282Z 70 - /obj/item/clothing/mask/cigarette/pipe using invalid icon_state, "pipeoff"
+2023-11-12T09:05:34.9019334Z 71 - /obj/item/clothing/mask/cigarette/pipe/cobpipe using invalid icon_state, "cobpipeoff"
+2023-11-12T09:05:34.9021398Z 72 - /obj/item/disk using invalid icon_state, "datadisk0"
+2023-11-12T09:05:34.9023878Z 73 - /obj/item/disk/holodisk using invalid icon_state, "holodisk"
+2023-11-12T09:05:34.9026566Z 74 - /obj/item/disk/nuclear using invalid icon_state, "nucleardisk"
+2023-11-12T09:05:34.9029044Z 75 - /obj/item/disk/surgery using invalid icon_state, "datadisk1"
+2023-11-12T09:05:34.9031722Z 76 - /obj/item/disk/cargo/bluespace_pod using invalid icon_state, "cargodisk"
+2023-11-12T09:05:34.9034253Z 77 - /obj/item/disk/design_disk/bepis using invalid icon_state, "rndmajordisk"
+2023-11-12T09:05:34.9036755Z 78 - /obj/item/melee/powerfist using invalid icon_state, "powerfist"
+2023-11-12T09:05:34.9044549Z 79 - /obj/item/melee/skateboard using invalid icon_state, "skateboard_held"
+2023-11-12T09:05:34.9047217Z 80 - /obj/item/melee/skateboard/pro using invalid icon_state, "skateboard2_held"
+2023-11-12T09:05:34.9049673Z 81 - /obj/item/melee/skateboard/hoverboard using invalid icon_state, "hoverboard_red_held"
+2023-11-12T09:05:34.9052014Z 82 - /obj/item/melee/skateboard/hoverboard/admin using invalid icon_state, "hoverboard_nt_held"
+2023-11-12T09:05:34.9054102Z 83 - /obj/item/melee/baseball_bat using invalid icon_state, "baseball_bat"
+2023-11-12T09:05:34.9056494Z 84 - /obj/item/melee/baseball_bat/homerun using invalid icon_state, "baseball_bat_home"
+2023-11-12T09:05:34.9058758Z 85 - /obj/item/melee/baseball_bat/ablative using invalid icon_state, "baseball_bat_metal"
+2023-11-12T09:05:34.9061041Z 86 - /obj/item/melee/flyswatter using invalid icon_state, "flyswatter"
+2023-11-12T09:05:34.9065209Z 87 - /obj/item/melee/energy/axe using invalid icon_state, "axe"
+2023-11-12T09:05:34.9067917Z 88 - /obj/item/melee/energy/blade using invalid icon_state, "blade"
+2023-11-12T09:05:34.9070409Z 89 - /obj/item/melee/energy/blade/hardlight using invalid icon_state, "lightblade"
+2023-11-12T09:05:34.9072647Z 90 - /obj/item/melee/synthetic_arm_blade using invalid icon_state, "arm_blade"
+2023-11-12T09:05:34.9074881Z 91 - /obj/item/melee/sabre using invalid icon_state, "sabre"
+2023-11-12T09:05:34.9077162Z 92 - /obj/item/melee/beesword using invalid worn_icon_state, "stinger"
+2023-11-12T09:05:34.9079597Z 93 - /obj/item/melee/supermatter_sword using invalid icon_state, "supermatter_sword_balanced"
+2023-11-12T09:05:34.9085130Z 94 - /obj/item/melee/cleric_mace using invalid worn_icon_state, "default_worn"
+2023-11-12T09:05:34.9087426Z 95 - /obj/item/melee/rune_carver using invalid icon_state, "rune_carver"
+2023-11-12T09:05:34.9089642Z 96 - /obj/item/melee/ghost_sword using invalid icon_state, "spectral"
+2023-11-12T09:05:34.9099563Z 97 - /obj/item/storage/lockbox/medal using invalid icon_state, "medalbox+l"
+2023-11-12T09:05:34.9101839Z 98 - /obj/item/storage/bag/trash using invalid icon_state, "trashbag"
+2023-11-12T09:05:34.9104337Z 99 - /obj/item/storage/bag/trash/bluespace using invalid icon_state, "bluetrashbag"
+2023-11-12T09:05:34.9106526Z 100 - /obj/item/cane using invalid icon_state, "cane"
+2023-11-12T09:05:34.9109148Z 101 - /obj/item/cane/white using invalid icon_state, "cane_white"
+2023-11-12T09:05:34.9127968Z 102 - /obj/item/clothing/mask/facehugger/toy using invalid worn_icon_state, "facehugger"
+2023-11-12T09:05:34.9129996Z 103 - /obj/item/kitchen/fork using invalid icon_state, "fork"
+2023-11-12T09:05:34.9132741Z 104 - /obj/item/kitchen/fork/plastic using invalid icon_state, "plastic_fork"
+2023-11-12T09:05:34.9137903Z 105 - /obj/item/kitchen/spoon using invalid icon_state, "spoon"
+2023-11-12T09:05:34.9140308Z 106 - /obj/item/kitchen/spoon/plastic using invalid icon_state, "plastic_spoon"
+2023-11-12T09:05:34.9142537Z 107 - /obj/item/kitchen/spoon/soup_ladle using invalid icon_state, "ladle"
+2023-11-12T09:05:34.9144673Z 108 - /obj/item/kitchen/tongs using invalid icon_state, "tongs"
+2023-11-12T09:05:34.9192479Z 109 - /obj/item/bonesetter using invalid icon_state, "bonesetter"
+2023-11-12T09:05:34.9194966Z 110 - /obj/item/cautery using invalid icon_state, "cautery"
+2023-11-12T09:05:34.9197552Z 111 - /obj/item/cautery/advanced using invalid icon_state, "e_cautery"
+2023-11-12T09:05:34.9200017Z 112 - /obj/item/cautery/cruel using invalid icon_state, "cruelcautery"
+2023-11-12T09:05:34.9202572Z 113 - /obj/item/hemostat using invalid icon_state, "hemostat"
+2023-11-12T09:05:34.9205055Z 114 - /obj/item/hemostat/supermatter using invalid icon_state, "supermatter_tongs"
+2023-11-12T09:05:34.9207385Z 115 - /obj/item/hemostat/cruel using invalid icon_state, "cruelhemostat"
+2023-11-12T09:05:34.9209542Z 116 - /obj/item/retractor using invalid icon_state, "retractor"
+2023-11-12T09:05:34.9211950Z 117 - /obj/item/retractor/advanced using invalid icon_state, "adv_retractor"
+2023-11-12T09:05:34.9214520Z 118 - /obj/item/retractor/cruel using invalid icon_state, "cruelretractor"
+2023-11-12T09:05:34.9216984Z 119 - /obj/item/scalpel using invalid icon_state, "scalpel"
+2023-11-12T09:05:34.9219596Z 120 - /obj/item/scalpel/supermatter using invalid icon_state, "supermatter_scalpel"
+2023-11-12T09:05:34.9221828Z 121 - /obj/item/scalpel/advanced using invalid icon_state, "e_scalpel"
+2023-11-12T09:05:34.9224110Z 122 - /obj/item/scalpel/cruel using invalid icon_state, "cruelscalpel"
+2023-11-12T09:05:34.9226426Z 123 - /obj/item/surgical_drapes using invalid icon_state, "surgical_drapes"
+2023-11-12T09:05:34.9230490Z 124 - /obj/item/crowbar/mechremoval using invalid icon_state, "mechremoval0"
+2023-11-12T09:05:34.9245013Z 125 - /obj/item/crowbar/hammer using invalid icon_state, "clawhammer"
+2023-11-12T09:05:34.9274002Z [1;32mPASS[0m /datum/unit_test/suit_storage_icons 2.1s
+2023-11-12T09:05:34.9277303Z ##[endgroup]
+2023-11-12T09:05:35.0051949Z ##[group]/datum/unit_test/amputation
+2023-11-12T09:05:35.0418593Z [1;32mPASS[0m /datum/unit_test/amputation 0s
+2023-11-12T09:05:35.0421400Z ##[endgroup]
+2023-11-12T09:05:35.0919237Z ##[group]/datum/unit_test/brain_surgery
+2023-11-12T09:05:35.1251285Z [1;32mPASS[0m /datum/unit_test/brain_surgery 0.1s
+2023-11-12T09:05:35.1254329Z ##[endgroup]
+2023-11-12T09:05:35.1587969Z ##[group]/datum/unit_test/head_transplant
+2023-11-12T09:05:35.2257286Z [1;32mPASS[0m /datum/unit_test/head_transplant 0.1s
+2023-11-12T09:05:35.2260747Z ##[endgroup]
+2023-11-12T09:05:35.2834393Z ##[group]/datum/unit_test/multiple_surgeries
+2023-11-12T09:05:35.3338834Z [1;32mPASS[0m /datum/unit_test/multiple_surgeries 0.1s
+2023-11-12T09:05:35.3341725Z ##[endgroup]
+2023-11-12T09:05:35.4031367Z ##[group]/datum/unit_test/start_tend_wounds
+2023-11-12T09:05:35.4361296Z [1;32mPASS[0m /datum/unit_test/start_tend_wounds 0s
+2023-11-12T09:05:35.4364716Z ##[endgroup]
+2023-11-12T09:05:35.4772361Z ##[group]/datum/unit_test/tend_wounds
+2023-11-12T09:05:35.5590830Z [1;32mPASS[0m /datum/unit_test/tend_wounds 0.1s
+2023-11-12T09:05:35.5594252Z ##[endgroup]
+2023-11-12T09:05:35.6747135Z ##[group]/datum/unit_test/tail_wag
+2023-11-12T09:05:35.8571590Z [1;32mPASS[0m /datum/unit_test/tail_wag 0.2s
+2023-11-12T09:05:35.8574630Z ##[endgroup]
+2023-11-12T09:05:35.8824009Z ##[group]/datum/unit_test/teleporter
+2023-11-12T09:05:35.9106477Z [1;32mPASS[0m /datum/unit_test/teleporter 0.1s
+2023-11-12T09:05:35.9109891Z ##[endgroup]
+2023-11-12T09:05:35.9363555Z ##[group]/datum/unit_test/tgui_create_message
+2023-11-12T09:05:35.9367522Z [1;32mPASS[0m /datum/unit_test/tgui_create_message 0s
+2023-11-12T09:05:35.9370812Z ##[endgroup]
+2023-11-12T09:05:35.9501436Z ##[group]/datum/unit_test/timer_sanity
+2023-11-12T09:05:35.9504464Z [1;32mPASS[0m /datum/unit_test/timer_sanity 0s
+2023-11-12T09:05:35.9508070Z ##[endgroup]
+2023-11-12T09:05:35.9637540Z ##[group]/datum/unit_test/trait_addition_and_removal
+2023-11-12T09:05:35.9642216Z [1;32mPASS[0m /datum/unit_test/trait_addition_and_removal 0s
+2023-11-12T09:05:35.9645763Z ##[endgroup]
+2023-11-12T09:05:35.9828636Z ##[group]/datum/unit_test/traitor
+2023-11-12T09:05:37.5946953Z [1;32mPASS[0m /datum/unit_test/traitor 1.6s
+2023-11-12T09:05:37.5948067Z ##[endgroup]
+2023-11-12T09:05:38.4317615Z ##[group]/datum/unit_test/traitor_mail_content_check
+2023-11-12T09:05:38.4490029Z [1;32mPASS[0m /datum/unit_test/traitor_mail_content_check 0s
+2023-11-12T09:05:38.4491508Z ##[endgroup]
+2023-11-12T09:05:38.4962906Z ##[group]/datum/unit_test/trauma_granting
+2023-11-12T09:05:38.5450644Z [1;32mPASS[0m /datum/unit_test/trauma_granting 0.1s
+2023-11-12T09:05:38.5452259Z ##[endgroup]
+2023-11-12T09:05:38.5799327Z ##[group]/datum/unit_test/turf_icons
+2023-11-12T09:05:39.0838086Z [1;32mPASS[0m /datum/unit_test/turf_icons 0.5s
+2023-11-12T09:05:39.0839541Z ##[endgroup]
+2023-11-12T09:05:39.1032413Z ##[group]/datum/unit_test/tutorial_sanity
+2023-11-12T09:05:39.1035529Z [1;32mPASS[0m /datum/unit_test/tutorial_sanity 0s
+2023-11-12T09:05:39.1037920Z ##[endgroup]
+2023-11-12T09:05:39.1166898Z ##[group]/datum/unit_test/verify_config_tags
+2023-11-12T09:05:39.1172282Z [1;32mPASS[0m /datum/unit_test/verify_config_tags 0s
+2023-11-12T09:05:39.1174748Z ##[endgroup]
+2023-11-12T09:05:39.1303312Z ##[group]/datum/unit_test/verify_emoji_names
+2023-11-12T09:05:39.1306816Z [1;32mPASS[0m /datum/unit_test/verify_emoji_names 0s
+2023-11-12T09:05:39.1309155Z ##[endgroup]
+2023-11-12T09:05:39.1436423Z ##[group]/datum/unit_test/moth_food
+2023-11-12T09:05:39.1899509Z [1;32mPASS[0m /datum/unit_test/moth_food 0s
+2023-11-12T09:05:39.1901926Z ##[endgroup]
+2023-11-12T09:05:39.2373626Z ##[group]/datum/unit_test/golem_food
+2023-11-12T09:05:39.2647161Z [1;32mPASS[0m /datum/unit_test/golem_food 0s
+2023-11-12T09:05:39.2649458Z ##[endgroup]
+2023-11-12T09:05:39.2901012Z ##[group]/datum/unit_test/wizard_loadout
+2023-11-12T09:05:39.3687154Z [1;32mPASS[0m /datum/unit_test/wizard_loadout 0.1s
+2023-11-12T09:05:39.3689468Z ##[endgroup]
+2023-11-12T09:05:39.4375880Z ##[group]/datum/unit_test/worn_icons
+2023-11-12T09:05:40.0482290Z [1;32mPASS[0m /datum/unit_test/worn_icons 0.6s
+2023-11-12T09:05:40.0483826Z ##[endgroup]
+2023-11-12T09:05:40.0625703Z ##[group]/datum/unit_test/find_reference_sanity
+2023-11-12T09:05:40.0632296Z [1;32mPASS[0m /datum/unit_test/find_reference_sanity 0s
+2023-11-12T09:05:40.0634532Z ##[endgroup]
+2023-11-12T09:05:40.0765341Z ##[group]/datum/unit_test/find_reference_baseline
+2023-11-12T09:05:40.0771322Z [1;32mPASS[0m /datum/unit_test/find_reference_baseline 0s
+2023-11-12T09:05:40.0773723Z ##[endgroup]
+2023-11-12T09:05:40.0904726Z ##[group]/datum/unit_test/find_reference_exotic
+2023-11-12T09:05:40.0910664Z [1;32mPASS[0m /datum/unit_test/find_reference_exotic 0s
+2023-11-12T09:05:40.0913091Z ##[endgroup]
+2023-11-12T09:05:40.1081989Z ##[group]/datum/unit_test/find_reference_esoteric
+2023-11-12T09:05:40.1091594Z [1;32mPASS[0m /datum/unit_test/find_reference_esoteric 0s
+2023-11-12T09:05:40.1093910Z ##[endgroup]
+2023-11-12T09:05:40.1356236Z ##[group]/datum/unit_test/find_reference_null_key_entry
+2023-11-12T09:05:40.1361917Z [1;32mPASS[0m /datum/unit_test/find_reference_null_key_entry 0s
+2023-11-12T09:05:40.1364019Z ##[endgroup]
+2023-11-12T09:05:40.1495527Z ##[group]/datum/unit_test/find_reference_assoc_investigation
+2023-11-12T09:05:40.1501290Z [1;32mPASS[0m /datum/unit_test/find_reference_assoc_investigation 0s
+2023-11-12T09:05:40.1503468Z ##[endgroup]
+2023-11-12T09:05:40.1629204Z ##[group]/datum/unit_test/find_reference_static_investigation
+2023-11-12T09:05:40.4955432Z [1;32mPASS[0m /datum/unit_test/find_reference_static_investigation 0.3s
+2023-11-12T09:05:40.4956809Z ##[endgroup]
+2023-11-12T09:05:40.5106809Z ##[group]/datum/unit_test/area_contents
+2023-11-12T09:05:41.5891675Z [1;32mPASS[0m /datum/unit_test/area_contents 1s
+2023-11-12T09:05:41.5893012Z ##[endgroup]
+2023-11-12T09:05:41.6151445Z ##[group]/datum/unit_test/atmospherics_sanity
+2023-11-12T09:05:41.6152255Z No starting areas found, defaulting...
+2023-11-12T09:05:41.6155445Z Marking all station areas as goal areas due to marker at (2, 254, 2)
+2023-11-12T09:05:42.2832551Z [1;32mPASS[0m /datum/unit_test/atmospherics_sanity 0.6s
+2023-11-12T09:05:42.2834628Z ##[endgroup]
+2023-11-12T09:05:42.3215674Z ##[group]/datum/unit_test/fish_rescue_hook
+2023-11-12T09:05:49.5841266Z [1;32mPASS[0m /datum/unit_test/fish_rescue_hook 7.2s
+2023-11-12T09:05:49.5842563Z ##[endgroup]
+2023-11-12T09:05:49.6648561Z ##[group]/datum/unit_test/leash/no_teleport
+2023-11-12T09:05:49.7264798Z [1;32mPASS[0m /datum/unit_test/leash/no_teleport 0.1s
+2023-11-12T09:05:49.7267230Z ##[endgroup]
+2023-11-12T09:05:49.7411212Z ##[group]/datum/unit_test/leash/will_teleport
+2023-11-12T09:05:49.7421861Z [1;32mPASS[0m /datum/unit_test/leash/will_teleport 0s
+2023-11-12T09:05:49.7424432Z ##[endgroup]
+2023-11-12T09:05:49.7571233Z ##[group]/datum/unit_test/leash/limit_range
+2023-11-12T09:05:49.7577430Z [1;32mPASS[0m /datum/unit_test/leash/limit_range 0s
+2023-11-12T09:05:49.7579955Z ##[endgroup]
+2023-11-12T09:05:49.7749544Z ##[group]/datum/unit_test/mapload_space_verification
+2023-11-12T09:05:50.3597291Z [1;32mPASS[0m /datum/unit_test/mapload_space_verification 0.6s
+2023-11-12T09:05:50.3598841Z ##[endgroup]
+2023-11-12T09:05:50.3862628Z ##[group]/datum/unit_test/mob_damage
+2023-11-12T09:05:50.4877049Z [1;32mPASS[0m /datum/unit_test/mob_damage 0.1s
+2023-11-12T09:05:50.4878381Z ##[endgroup]
+2023-11-12T09:05:50.5135873Z ##[group]/datum/unit_test/mob_damage/basic
+2023-11-12T09:05:50.5174197Z [1;32mPASS[0m /datum/unit_test/mob_damage/basic 0s
+2023-11-12T09:05:50.5176179Z ##[endgroup]
+2023-11-12T09:05:50.5348335Z ##[group]/datum/unit_test/modify_fantasy_variable
+2023-11-12T09:06:17.8433778Z [1;32mPASS[0m /datum/unit_test/modify_fantasy_variable 27.3s
+2023-11-12T09:06:17.8434791Z ##[endgroup]
+2023-11-12T09:06:24.9200774Z ##[group]/datum/unit_test/monkey_business
+2023-11-12T09:06:44.1178950Z [09:06:44] Runtime in timer.dm,125: Invalid timer: Timer: Timer: 2433 ([0x2100859b]), TTR: 328041, wait:2 Flags: TIMER_CLIENT_TIME, TIMER_STOPPABLE, callBack: [0x2105a831], callBack.object: /datum/looping_sound/showering[0x210085b4](/datum/looping_sound/showering), callBack.delegate:/datum/looping_sound/proc/start_sound_loop(), source: code/datums/looping_sounds/_looping_sound.dm:220Prev: NULL, Next: NULL, SPENT(328041), QDELETED, NO CALLBACK world.time: 942.5, head_offset: 600, practical_offset: 686, REALTIMEOFDAY: 328041
+2023-11-12T09:06:44.1182762Z proc name: fire (/datum/controller/subsystem/timer/fire)
+2023-11-12T09:06:44.1191977Z src: Sound Loops (/datum/controller/subsystem/timer/sound_loops)
+2023-11-12T09:06:44.1192834Z call stack:
+2023-11-12T09:06:44.1193480Z Sound Loops (/datum/controller/subsystem/timer/sound_loops): fire(0)
+2023-11-12T09:06:44.1194547Z Sound Loops (/datum/controller/subsystem/timer/sound_loops): fire(0)
+2023-11-12T09:06:44.1195659Z Sound Loops (/datum/controller/subsystem/timer/sound_loops): ignite(0)
+2023-11-12T09:06:44.1196597Z Master (/datum/controller/master): RunQueue()
+2023-11-12T09:06:44.1201550Z Master (/datum/controller/master): Loop(2)
+2023-11-12T09:06:44.1202483Z Master (/datum/controller/master): StartProcessing(0)
+2023-11-12T09:07:03.3211396Z ##[error][09:06:44] Runtime in timer.dm,125: Invalid timer: Timer: Timer: 2433 ([0x2100859b]), TTR: 328041, wait:2 Flags: TIMER_CLIENT_TIME, TIMER_STOPPABLE, callBack: [0x2105a831], callBack.object: /datum/looping_sound/showering[0x210085b4](/datum/looping_sound/showering), callBack.delegate:/datum/looping_sound/proc/start_sound_loop(), source: code/datums/looping_sounds/_looping_sound.dm:220Prev: NULL, Next: NULL, SPENT(328041), QDELETED, NO CALLBACK world.time: 942.5, head_offset: 600, practical_offset: 686, REALTIMEOFDAY: 328041
+ proc name: fire (/datum/controller/subsystem/timer/fire)
+ src: Sound Loops (/datum/controller/subsystem/timer/sound_loops)
+ call stack:
+ Sound Loops (/datum/controller/subsystem/timer/sound_loops): fire(0)
+ Sound Loops (/datum/controller/subsystem/timer/sound_loops): fire(0)
+ Sound Loops (/datum/controller/subsystem/timer/sound_loops): ignite(0)
+ Master (/datum/controller/master): RunQueue()
+ Master (/datum/controller/master): Loop(2)
+ Master (/datum/controller/master): StartProcessing(0)
+2023-11-12T09:07:03.3224436Z FAILURE #1: [09:06:44] Runtime in timer.dm,125: Invalid timer: Timer: Timer: 2433 ([0x2100859b]), TTR: 328041, wait:2 Flags: TIMER_CLIENT_TIME, TIMER_STOPPABLE, callBack: [0x2105a831], callBack.object: /datum/looping_sound/showering[0x210085b4](/datum/looping_sound/showering), callBack.delegate:/datum/looping_sound/proc/start_sound_loop(), source: code/datums/looping_sounds/_looping_sound.dm:220Prev: NULL, Next: NULL, SPENT(328041), QDELETED, NO CALLBACK world.time: 942.5, head_offset: 600, practical_offset: 686, REALTIMEOFDAY: 328041
+2023-11-12T09:07:03.3226826Z proc name: fire (/datum/controller/subsystem/timer/fire)
+2023-11-12T09:07:03.3227626Z src: Sound Loops (/datum/controller/subsystem/timer/sound_loops)
+2023-11-12T09:07:03.3228077Z call stack:
+2023-11-12T09:07:03.3228462Z Sound Loops (/datum/controller/subsystem/timer/sound_loops): fire(0)
+2023-11-12T09:07:03.3229045Z Sound Loops (/datum/controller/subsystem/timer/sound_loops): fire(0)
+2023-11-12T09:07:03.3229619Z Sound Loops (/datum/controller/subsystem/timer/sound_loops): ignite(0)
+2023-11-12T09:07:03.3230129Z Master (/datum/controller/master): RunQueue()
+2023-11-12T09:07:03.3230524Z Master (/datum/controller/master): Loop(2)
+2023-11-12T09:07:03.3231037Z Master (/datum/controller/master): StartProcessing(0) at timer.dm:125
+2023-11-12T09:07:03.3231712Z ##[endgroup]
+2023-11-12T09:07:03.3232839Z ##[error][1;31mFAIL[0m /datum/unit_test/monkey_business 38.4s
+2023-11-12T09:07:05.4669397Z ##[group]/datum/unit_test/strange_reagent
+2023-11-12T09:07:09.1986629Z [1;32mPASS[0m /datum/unit_test/strange_reagent 3.7s
+2023-11-12T09:07:09.1988202Z ##[endgroup]
+2023-11-12T09:07:11.6843550Z ##[group]/datum/unit_test/create_and_destroy
+2023-11-12T09:07:36.2863567Z No elevator ID for elevator music provided at Test Room (126,126,14).
+2023-11-12T09:08:13.7560132Z [1;32mPASS[0m /datum/unit_test/create_and_destroy 62.1s
+2023-11-12T09:08:13.7561471Z ##[endgroup]
+2023-11-12T09:08:13.7852782Z ##[group]/datum/unit_test/dcs_check_list_arguments
+2023-11-12T09:08:13.7940678Z [1;32mPASS[0m /datum/unit_test/dcs_check_list_arguments 0s
+2023-11-12T09:08:13.7942424Z ##[endgroup]
+2023-11-12T09:08:15.2400236Z Shutting down Chat subsystem...
+2023-11-12T09:08:15.2402039Z Shutting down Init Profiler subsystem...
+2023-11-12T09:08:15.2404881Z Shutting down Ban Cache subsystem...
+2023-11-12T09:08:15.2407209Z Shutting down Stat Panels subsystem...
+2023-11-12T09:08:15.2409633Z Shutting down Explosions subsystem...
+2023-11-12T09:08:15.2412008Z Shutting down Pathfinder subsystem...
+2023-11-12T09:08:15.2414438Z Shutting down Minor Mapping subsystem...
+2023-11-12T09:08:15.2416820Z Shutting down Shuttle subsystem...
+2023-11-12T09:08:15.2420930Z Warning: Subsystem `Shuttle` slept 2 times.
+2023-11-12T09:08:15.2421633Z Shutting down Lighting subsystem...
+2023-11-12T09:08:15.2423743Z Shutting down XKeyScore subsystem...
+2023-11-12T09:08:15.2425667Z Shutting down PRISM subsystem...
+2023-11-12T09:08:15.2427615Z Shutting down Icon Smoothing subsystem...
+2023-11-12T09:08:15.2429451Z Shutting down Assets subsystem...
+2023-11-12T09:08:15.2431258Z Shutting down Vote subsystem...
+2023-11-12T09:08:15.2433223Z Shutting down Persistent Paintings subsystem...
+2023-11-12T09:08:15.2435113Z Shutting down Persistence subsystem...
+2023-11-12T09:08:15.2437033Z Shutting down Atmospherics subsystem...
+2023-11-12T09:08:15.2439009Z Shutting down Wiremod Composite Templates subsystem...
+2023-11-12T09:08:15.2440741Z Shutting down Wet floors subsystem...
+2023-11-12T09:08:15.2443279Z Shutting down Weather subsystem...
+2023-11-12T09:08:15.2445531Z Shutting down Wardrobe subsystem...
+2023-11-12T09:08:15.2447137Z Shutting down Verb Manager subsystem...
+2023-11-12T09:08:15.2448994Z Shutting down Tutorials subsystem...
+2023-11-12T09:08:15.2450888Z Shutting down Transport subsystem...
+2023-11-12T09:08:15.2452762Z Shutting down Traitor subsystem...
+2023-11-12T09:08:15.2454635Z Shutting down Throwing subsystem...
+2023-11-12T09:08:15.2456529Z Shutting down tgui subsystem...
+2023-11-12T09:08:15.2458543Z Shutting down Supermatter Cascade subsystem...
+2023-11-12T09:08:15.2460380Z Shutting down Sun subsystem...
+2023-11-12T09:08:15.2462254Z Shutting down Stock Market subsystem...
+2023-11-12T09:08:15.2464168Z Shutting down Speech Controller subsystem...
+2023-11-12T09:08:15.2466003Z Shutting down Space Drift subsystem...
+2023-11-12T09:08:15.2467944Z Shutting down Smoke subsystem...
+2023-11-12T09:08:15.2469878Z Shutting down Singularity subsystem...
+2023-11-12T09:08:15.2472104Z Shutting down Radioactive Nebula subsystem...
+2023-11-12T09:08:15.2473961Z Shutting down Radio subsystem...
+2023-11-12T09:08:15.2476202Z Shutting down Radiation subsystem...
+2023-11-12T09:08:15.2477898Z Shutting down Projectiles subsystem...
+2023-11-12T09:08:15.2479832Z Shutting down Processing subsystem...
+2023-11-12T09:08:15.2482409Z Shutting down Points of Interest subsystem...
+2023-11-12T09:08:15.2484346Z Shutting down Plumbing subsystem...
+2023-11-12T09:08:15.2486233Z Shutting down Ping subsystem...
+2023-11-12T09:08:15.2488172Z Shutting down Parallax subsystem...
+2023-11-12T09:08:15.2490092Z Shutting down pAI subsystem...
+2023-11-12T09:08:15.2492038Z Shutting down Overlay subsystem...
+2023-11-12T09:08:15.7359113Z Shutting down Objects subsystem...
+2023-11-12T09:08:15.7360449Z Shutting down Obj Tab Items subsystem...
+2023-11-12T09:08:15.7363590Z Shutting down NPC Pool subsystem...
+2023-11-12T09:08:15.7365241Z Shutting down Night Shift subsystem...
+2023-11-12T09:08:15.7367764Z Shutting down Movement Loops subsystem...
+2023-11-12T09:08:15.7369511Z Shutting down Movement Handler subsystem...
+2023-11-12T09:08:15.7371589Z Shutting down MouseEntered subsystem...
+2023-11-12T09:08:15.7373527Z Shutting down Mood subsystem...
+2023-11-12T09:08:15.7375649Z Shutting down Modular Computers subsystem...
+2023-11-12T09:08:15.7377558Z Shutting down Mobs subsystem...
+2023-11-12T09:08:15.7379600Z Shutting down Materials subsystem...
+2023-11-12T09:08:15.7381572Z Shutting down Lua Scripting subsystem...
+2023-11-12T09:08:15.7505514Z Shutting down Library Loading subsystem...
+2023-11-12T09:08:15.7507489Z Shutting down Lag Switch subsystem...
+2023-11-12T09:08:15.7509583Z Shutting down Idling NPC Pool subsystem...
+2023-11-12T09:08:15.7511671Z Shutting down Hyperspace Drift subsystem...
+2023-11-12T09:08:15.7513591Z Shutting down Foam subsystem...
+2023-11-12T09:08:15.7515516Z Shutting down Fluid subsystem...
+2023-11-12T09:08:15.7517494Z Shutting down Fishing subsystem...
+2023-11-12T09:08:15.7519635Z Shutting down Fast Processing subsystem...
+2023-11-12T09:08:15.7521688Z Shutting down Escape Menu subsystem...
+2023-11-12T09:08:15.7523697Z Shutting down Eigenstates subsystem...
+2023-11-12T09:08:15.7525621Z Shutting down Disease subsystem...
+2023-11-12T09:08:15.7527699Z Shutting down Digital Clocks subsystem...
+2023-11-12T09:08:15.7529722Z Shutting down Datum Component System subsystem...
+2023-11-12T09:08:15.7531714Z Shutting down Conveyor Belts subsystem...
+2023-11-12T09:08:15.7533950Z Shutting down Communications subsystem...
+2023-11-12T09:08:15.7536091Z Shutting down Clock Component subsystem...
+2023-11-12T09:08:15.7538058Z Shutting down Cliff Falling subsystem...
+2023-11-12T09:08:15.7540124Z Shutting down Circuit Components subsystem...
+2023-11-12T09:08:15.7542040Z Shutting down Burning subsystem...
+2023-11-12T09:08:15.7544007Z Shutting down Blackmarket subsystem...
+2023-11-12T09:08:15.7545998Z Shutting down Basic Avoidance subsystem...
+2023-11-12T09:08:15.7547937Z Shutting down Aura Healing subsystem...
+2023-11-12T09:08:15.7549860Z Shutting down Augury subsystem...
+2023-11-12T09:08:15.7552123Z Shutting down Asset Loading subsystem...
+2023-11-12T09:08:15.7553815Z Shutting down Area Contents subsystem...
+2023-11-12T09:08:15.7555740Z Shutting down Antag HUDs subsystem...
+2023-11-12T09:08:15.7557720Z Shutting down Ambience subsystem...
+2023-11-12T09:08:15.7559697Z Shutting down Addiction subsystem...
+2023-11-12T09:08:15.7562910Z Shutting down Acid subsystem...
+2023-11-12T09:08:15.7564740Z Shutting down Timer subsystem...
+2023-11-12T09:08:15.7566504Z Shutting down Sound Loops subsystem...
+2023-11-12T09:08:15.7568731Z Shutting down Runechat subsystem...
+2023-11-12T09:08:15.7570746Z Shutting down Queue Links subsystem...
+2023-11-12T09:08:15.7572695Z Shutting down Skills subsystem...
+2023-11-12T09:08:15.7574685Z Shutting down Machines subsystem...
+2023-11-12T09:08:15.7576634Z Shutting down Language subsystem...
+2023-11-12T09:08:15.7578608Z Shutting down Atoms subsystem...
+2023-11-12T09:08:15.7601367Z Shutting down Text To Speech subsystem...
+2023-11-12T09:08:15.7603675Z Shutting down Restaurant subsystem...
+2023-11-12T09:08:15.7605588Z Shutting down Economy subsystem...
+2023-11-12T09:08:15.7607616Z Shutting down Spatial Grid subsystem...
+2023-11-12T09:08:15.7609600Z Shutting down Time Tracking subsystem...
+2023-11-12T09:08:15.7611597Z Shutting down Research subsystem...
+2023-11-12T09:08:15.7613755Z Shutting down Early Assets subsystem...
+2023-11-12T09:08:15.7615768Z Shutting down Mapping subsystem...
+2023-11-12T09:08:15.7617822Z Shutting down Trading Card Game subsystem...
+2023-11-12T09:08:15.7619966Z Shutting down Ticker subsystem...
+2023-11-12T09:08:15.7622043Z Warning: Subsystem `Ticker` slept 1 times.
+2023-11-12T09:08:15.7644481Z Unable to locate admins backup file.
+2023-11-12T09:08:15.7654489Z Shutting down AI Controller Ticker subsystem...
+2023-11-12T09:08:15.7656545Z Shutting down AI Behavior Ticker subsystem...
+2023-11-12T09:08:15.7658539Z Shutting down AI movement subsystem...
+2023-11-12T09:08:15.7660519Z Shutting down Jobs subsystem...
+2023-11-12T09:08:15.7662633Z Shutting down IDs and Access subsystem...
+2023-11-12T09:08:15.7664623Z Shutting down Events subsystem...
+2023-11-12T09:08:15.7666630Z Shutting down Reagents subsystem...
+2023-11-12T09:08:15.7668611Z Shutting down Quirks subsystem...
+2023-11-12T09:08:15.7670631Z Shutting down Station subsystem...
+2023-11-12T09:08:15.7672688Z Shutting down Achievements subsystem...
+2023-11-12T09:08:15.7674715Z Shutting down Discord subsystem...
+2023-11-12T09:08:15.7676785Z Shutting down Security Level subsystem...
+2023-11-12T09:08:15.7678830Z Shutting down Vis contents overlays subsystem...
+2023-11-12T09:08:15.7680780Z Shutting down Greyscale subsystem...
+2023-11-12T09:08:15.7683265Z Shutting down Instruments subsystem...
+2023-11-12T09:08:15.7685284Z Shutting down Sounds subsystem...
+2023-11-12T09:08:15.7687269Z Shutting down Input subsystem...
+2023-11-12T09:08:15.7689286Z Shutting down Server Tasks subsystem...
+2023-11-12T09:08:15.7691440Z Shutting down Blackbox subsystem...
+2023-11-12T09:08:15.7700214Z Shutting down Database subsystem...
+2023-11-12T09:08:15.7709204Z Shutting down Garbage subsystem...
+2023-11-12T09:08:18.8763587Z Shutting down Title Screen subsystem...
+2023-11-12T09:08:18.8783727Z Shutting down Profiler subsystem...
+2023-11-12T09:08:18.8789879Z Shutdown complete
+2023-11-12T09:08:18.8797124Z Test run failed!
+2023-11-12T09:08:18.8797462Z Total runtimes: 1
+2023-11-12T09:08:18.8797716Z Unit Tests failed!
+2023-11-12T09:08:22.0106377Z cat: ci_test/data/logs/ci/clean_run.lk: No such file or directory
+2023-11-12T09:08:22.0116872Z ##[error]Process completed with exit code 1.
+2023-11-12T09:08:22.0170857Z ##[group]Run actions/upload-artifact@v3
+2023-11-12T09:08:22.0171222Z with:
+2023-11-12T09:08:22.0171467Z name: test_artifacts_tramstation
+2023-11-12T09:08:22.0171798Z path: data/screenshots_new/
+2023-11-12T09:08:22.0172089Z retention-days: 1
+2023-11-12T09:08:22.0172354Z if-no-files-found: warn
+2023-11-12T09:08:22.0172621Z ##[endgroup]
+2023-11-12T09:08:22.1010805Z With the provided path, there will be 77 files uploaded
+2023-11-12T09:08:22.1013040Z Starting artifact upload
+2023-11-12T09:08:22.1014930Z For more detailed logs during the artifact upload process, enable step-debugging: https://docs.github.com/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging#enabling-step-debug-logging
+2023-11-12T09:08:22.1016085Z Artifact name is valid!
+2023-11-12T09:08:22.1655325Z Container for artifact "test_artifacts_tramstation" successfully created. Starting upload of file(s)
+2023-11-12T09:08:25.4511686Z Total size of all the files uploaded is 104264 bytes
+2023-11-12T09:08:25.4513089Z File upload process has finished. Finalizing the artifact upload
+2023-11-12T09:08:25.4967864Z Artifact has been finalized. All files have been successfully uploaded!
+2023-11-12T09:08:25.4968795Z
+2023-11-12T09:08:25.4969438Z The raw size of all the files that were specified for upload is 104534 bytes
+2023-11-12T09:08:25.4995080Z The size of all the files that were uploaded is 104264 bytes. This takes into account any gzip compression used to reduce the upload size, time and storage
+2023-11-12T09:08:25.4996373Z
+2023-11-12T09:08:25.5000590Z Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads
+2023-11-12T09:08:25.5002432Z
+2023-11-12T09:08:25.5002844Z Artifact test_artifacts_tramstation has been successfully uploaded!
+2023-11-12T09:08:25.5131976Z ##[group]Run tgstation/byond-client-compatibility-check@v3
+2023-11-12T09:08:25.5132416Z with:
+2023-11-12T09:08:25.5132646Z dmb-location: tgstation.dmb
+2023-11-12T09:08:25.5132971Z max-required-client-version: 514
+2023-11-12T09:08:25.5133284Z ##[endgroup]
+2023-11-12T09:08:25.5322365Z ##[group]Run (( 514 ))
+2023-11-12T09:08:25.5322641Z [36;1m(( 514 ))[0m
+2023-11-12T09:08:25.5367699Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
+2023-11-12T09:08:25.5368129Z ##[endgroup]
+2023-11-12T09:08:25.5463568Z ##[group]Run echo "required-client-version=$(( $( head -n2 tgstation.dmb | tail -n1 | cut -d " " -f 4 ) ))" >> $GITHUB_OUTPUT
+2023-11-12T09:08:25.5464593Z [36;1mecho "required-client-version=$(( $( head -n2 tgstation.dmb | tail -n1 | cut -d " " -f 4 ) ))" >> $GITHUB_OUTPUT[0m
+2023-11-12T09:08:25.5503899Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
+2023-11-12T09:08:25.5504317Z ##[endgroup]
+2023-11-12T09:08:25.5643709Z ##[group]Run (( 514 <= 514 ))
+2023-11-12T09:08:25.5644042Z [36;1m(( 514 <= 514 ))[0m
+2023-11-12T09:08:25.5682534Z shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
+2023-11-12T09:08:25.5682953Z ##[endgroup]
+2023-11-12T09:08:25.5835969Z Post job cleanup.
+2023-11-12T09:08:25.6654082Z [command]/usr/bin/git version
+2023-11-12T09:08:25.6698640Z git version 2.42.0
+2023-11-12T09:08:25.6737360Z Temporarily overriding HOME='/home/runner/work/_temp/8c7eca89-05a8-49f5-91d4-2ad2b8c1f35c' before making global git config changes
+2023-11-12T09:08:25.6738762Z Adding repository directory to the temporary git global config as a safe directory
+2023-11-12T09:08:25.6742986Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2023-11-12T09:08:25.6784154Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2023-11-12T09:08:25.6822086Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :"
+2023-11-12T09:08:25.7132368Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2023-11-12T09:08:25.7163927Z http.https://github.com/.extraheader
+2023-11-12T09:08:25.7175279Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader
+2023-11-12T09:08:25.7216423Z [command]/usr/bin/git submodule foreach --recursive sh -c "git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :"
+2023-11-12T09:08:25.7590917Z Print service container logs: c43e2a4f7a0044eda3c3640d7583be1f_mysqllatest_210664
+2023-11-12T09:08:25.7595897Z ##[command]/usr/bin/docker logs --details 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T09:08:25.7722763Z 2023-11-12 08:59:57+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.2.0-1.el8 started.
+2023-11-12T09:08:25.7724170Z 2023-11-12 08:59:57+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
+2023-11-12T09:08:25.7726315Z 2023-11-12T08:59:57.323609Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
+2023-11-12T09:08:25.7728493Z 2023-11-12T08:59:57.324887Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2023-11-12T09:08:25.7730639Z 2023-11-12 08:59:57+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.2.0-1.el8 started.
+2023-11-12T09:08:25.7731931Z 2023-11-12 08:59:57+00:00 [Note] [Entrypoint]: Initializing database files
+2023-11-12T09:08:25.7733478Z 2023-11-12T08:59:57.324980Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.2.0) initializing of server in progress as process 80
+2023-11-12T09:08:25.7735422Z 2023-11-12T08:59:57.329733Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2023-11-12T09:08:25.7736806Z 2023-11-12T08:59:57.538012Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2023-11-12T09:08:25.7737953Z 2023-11-12 09:00:00+00:00 [Note] [Entrypoint]: Database files initialized
+2023-11-12T09:08:25.7738945Z 2023-11-12 09:00:00+00:00 [Note] [Entrypoint]: Starting temporary server
+2023-11-12T09:08:25.7739945Z 2023-11-12 09:00:00+00:00 [Note] [Entrypoint]: Temporary server started.
+2023-11-12T09:08:25.7740898Z '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
+2023-11-12T09:08:25.7741615Z
+2023-11-12T09:08:25.7742199Z 2023-11-12 09:00:02+00:00 [Note] [Entrypoint]: Stopping temporary server
+2023-11-12T09:08:25.7743236Z 2023-11-12 09:00:03+00:00 [Note] [Entrypoint]: Temporary server stopped
+2023-11-12T09:08:25.7744003Z
+2023-11-12T09:08:25.7744708Z 2023-11-12 09:00:03+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
+2023-11-12T09:08:25.7746704Z 2023-11-12T08:59:58.210653Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
+2023-11-12T09:08:25.7748648Z 2023-11-12T09:00:00.300732Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.
+2023-11-12T09:08:25.7749899Z 2023-11-12T09:00:00.347787Z 0 [System] [MY-015015] [Server] MySQL Server - start.
+2023-11-12T09:08:25.7751901Z 2023-11-12T09:00:00.530321Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2023-11-12T09:08:25.7754106Z 2023-11-12T09:00:00.531123Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.2.0) starting as process 124
+2023-11-12T09:08:25.7756278Z 2023-11-12T09:00:00.541412Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2023-11-12T09:08:25.7757517Z 2023-11-12T09:00:00.630355Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2023-11-12T09:08:25.7758462Z 2023-11-12T09:00:00.815198Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2023-11-12T09:08:25.7759637Z 2023-11-12T09:00:00.815226Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2023-11-12T09:08:25.7761631Z 2023-11-12T09:00:00.816463Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2023-11-12T09:08:25.7763033Z 2023-11-12T09:00:00.828404Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
+2023-11-12T09:08:25.7764603Z 2023-11-12T09:00:00.828529Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.2.0' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL.
+2023-11-12T09:08:25.7765734Z 2023-11-12T09:00:00.829953Z 0 [System] [MY-015016] [Server] MySQL Server - end.
+2023-11-12T09:08:25.7766430Z Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
+2023-11-12T09:08:25.7767184Z Warning: Unable to load '/usr/share/zoneinfo/leap-seconds.list' as time zone. Skipping it.
+2023-11-12T09:08:25.7767935Z Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
+2023-11-12T09:08:25.7768649Z Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
+2023-11-12T09:08:25.7769346Z Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
+2023-11-12T09:08:25.7770052Z Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
+2023-11-12T09:08:25.7770961Z 2023-11-12T09:00:02.470903Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.2.0).
+2023-11-12T09:08:25.7772265Z 2023-11-12T09:00:03.257971Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.2.0) MySQL Community Server - GPL.
+2023-11-12T09:08:25.7773173Z 2023-11-12T09:00:03.260270Z 0 [System] [MY-015016] [Server] MySQL Server - end.
+2023-11-12T09:08:25.7773836Z 2023-11-12T09:00:03.482460Z 0 [System] [MY-015015] [Server] MySQL Server - start.
+2023-11-12T09:08:25.7774963Z 2023-11-12T09:00:03.659729Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2023-11-12T09:08:25.7776201Z 2023-11-12T09:00:03.661194Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.2.0) starting as process 1
+2023-11-12T09:08:25.7777020Z 2023-11-12T09:00:03.666529Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2023-11-12T09:08:25.7777756Z 2023-11-12T09:00:03.752233Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2023-11-12T09:08:25.7778518Z 2023-11-12T09:00:03.907357Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2023-11-12T09:08:25.7779564Z 2023-11-12T09:00:03.907387Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2023-11-12T09:08:25.7781056Z 2023-11-12T09:00:03.908492Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2023-11-12T09:08:25.7782533Z 2023-11-12T09:00:03.922214Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
+2023-11-12T09:08:25.7783946Z 2023-11-12T09:00:03.922317Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.2.0' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
+2023-11-12T09:08:25.7784877Z
+2023-11-12T09:08:25.7790536Z Stop and remove container: c43e2a4f7a0044eda3c3640d7583be1f_mysqllatest_210664
+2023-11-12T09:08:25.7796028Z ##[command]/usr/bin/docker rm --force 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T09:08:26.0454956Z 37a3cfd21d3298b61164877b4eaf9717ee52eda64115ae9cd1aef5206d293ded
+2023-11-12T09:08:26.0480580Z Remove container network: github_network_bc2270e2d9644957ba98982ec5cf35f2
+2023-11-12T09:08:26.0487395Z ##[command]/usr/bin/docker network rm github_network_bc2270e2d9644957ba98982ec5cf35f2
+2023-11-12T09:08:26.3137535Z github_network_bc2270e2d9644957ba98982ec5cf35f2
+2023-11-12T09:08:26.3289510Z Cleaning up orphan processes
diff --git a/tools/pull_request_hooks/flakyTestPayloads/monkey_business.txt b/tools/pull_request_hooks/flakyTestPayloads/monkey_business.txt
new file mode 100644
index 000000000000..a52375357a07
--- /dev/null
+++ b/tools/pull_request_hooks/flakyTestPayloads/monkey_business.txt
@@ -0,0 +1,2451 @@
+2022-11-01T15:22:09.7007979Z Requested labels: ubuntu-20.04
+2022-11-01T15:22:09.7008038Z Job defined at: tgstation/tgstation/.github/workflows/ci_suite.yml@refs/pull/70980/merge
+2022-11-01T15:22:09.7008063Z Waiting for a runner to pick up this job...
+2022-11-01T15:22:10.2221600Z Job is waiting for a hosted runner to come online.
+2022-11-01T15:22:14.3820892Z Job is about to start running on the hosted runner: GitHub Actions 16 (hosted)
+2022-11-01T15:22:17.2355862Z Current runner version: '2.298.2'
+2022-11-01T15:22:17.2393184Z ##[group]Operating System
+2022-11-01T15:22:17.2393885Z Ubuntu
+2022-11-01T15:22:17.2394168Z 20.04.5
+2022-11-01T15:22:17.2394933Z LTS
+2022-11-01T15:22:17.2395251Z ##[endgroup]
+2022-11-01T15:22:17.2395537Z ##[group]Runner Image
+2022-11-01T15:22:17.2395920Z Image: ubuntu-20.04
+2022-11-01T15:22:17.2396312Z Version: 20221027.1
+2022-11-01T15:22:17.2396868Z Included Software: https://github.com/actions/runner-images/blob/ubuntu20/20221027.1/images/linux/Ubuntu2004-Readme.md
+2022-11-01T15:22:17.2397529Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu20%2F20221027.1
+2022-11-01T15:22:17.2398002Z ##[endgroup]
+2022-11-01T15:22:17.2398309Z ##[group]Runner Image Provisioner
+2022-11-01T15:22:17.2398710Z 2.0.91.1
+2022-11-01T15:22:17.2399019Z ##[endgroup]
+2022-11-01T15:22:17.2399973Z ##[group]GITHUB_TOKEN Permissions
+2022-11-01T15:22:17.2400709Z Actions: read
+2022-11-01T15:22:17.2401056Z Checks: read
+2022-11-01T15:22:17.2401569Z Contents: read
+2022-11-01T15:22:17.2401976Z Deployments: read
+2022-11-01T15:22:17.2402321Z Discussions: read
+2022-11-01T15:22:17.2402709Z Issues: read
+2022-11-01T15:22:17.2402981Z Metadata: read
+2022-11-01T15:22:17.2403324Z Packages: read
+2022-11-01T15:22:17.2403646Z Pages: read
+2022-11-01T15:22:17.2403926Z PullRequests: read
+2022-11-01T15:22:17.2404338Z RepositoryProjects: read
+2022-11-01T15:22:17.2404945Z SecurityEvents: read
+2022-11-01T15:22:17.2405240Z Statuses: read
+2022-11-01T15:22:17.2405577Z ##[endgroup]
+2022-11-01T15:22:17.2410281Z Secret source: None
+2022-11-01T15:22:17.2410802Z Prepare workflow directory
+2022-11-01T15:22:17.3953802Z Prepare all required actions
+2022-11-01T15:22:17.4201039Z Getting action download info
+2022-11-01T15:22:17.6939075Z Download action repository 'actions/checkout@v3' (SHA:93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8)
+2022-11-01T15:22:18.9161379Z Download action repository 'actions/cache@v3' (SHA:1c73980b09e7aea7201f325a7aa3ad00beddcdda)
+2022-11-01T15:22:20.3064444Z Download action repository 'actions/upload-artifact@v3' (SHA:83fd05a356d7e2593de66fc9913b3002723633cb)
+2022-11-01T15:22:21.5263114Z ##[group]Checking docker version
+2022-11-01T15:22:21.5284545Z ##[command]/usr/bin/docker version --format '{{.Server.APIVersion}}'
+2022-11-01T15:22:21.7821858Z '1.41'
+2022-11-01T15:22:21.7840681Z Docker daemon API version: '1.41'
+2022-11-01T15:22:21.7841209Z ##[command]/usr/bin/docker version --format '{{.Client.APIVersion}}'
+2022-11-01T15:22:21.8152000Z '1.41'
+2022-11-01T15:22:21.8176781Z Docker client API version: '1.41'
+2022-11-01T15:22:21.8186583Z ##[endgroup]
+2022-11-01T15:22:21.8192234Z ##[group]Clean up resources from previous jobs
+2022-11-01T15:22:21.8200740Z ##[command]/usr/bin/docker ps --all --quiet --no-trunc --filter "label=8d5581"
+2022-11-01T15:22:21.8479497Z ##[command]/usr/bin/docker network prune --force --filter "label=8d5581"
+2022-11-01T15:22:21.8756254Z ##[endgroup]
+2022-11-01T15:22:21.8756617Z ##[group]Create local container network
+2022-11-01T15:22:21.8773847Z ##[command]/usr/bin/docker network create --label 8d5581 github_network_7d8483aa88b2460d91b946ac72079065
+2022-11-01T15:22:21.9692504Z e63735eb313884b0b3c2a30de089b7ac7f9db8f270d21a7e96d5dfa805d1dc67
+2022-11-01T15:22:21.9707619Z ##[endgroup]
+2022-11-01T15:22:21.9833163Z ##[group]Starting mysql service container
+2022-11-01T15:22:21.9860217Z ##[command]/usr/bin/docker pull mysql:latest
+2022-11-01T15:22:23.3081644Z latest: Pulling from library/mysql
+2022-11-01T15:22:23.6553709Z d67a603b911a: Pulling fs layer
+2022-11-01T15:22:23.6554244Z 0cf69c8f1492: Pulling fs layer
+2022-11-01T15:22:23.6554502Z a5ee239a0d3a: Pulling fs layer
+2022-11-01T15:22:23.6554752Z 0f166cb3e327: Pulling fs layer
+2022-11-01T15:22:23.6555140Z 882d294bf188: Pulling fs layer
+2022-11-01T15:22:23.6555590Z 2649fc7eb806: Pulling fs layer
+2022-11-01T15:22:23.6555993Z bddb3394e2e3: Pulling fs layer
+2022-11-01T15:22:23.6556266Z 93c83d9a2206: Pulling fs layer
+2022-11-01T15:22:23.6556762Z 99d7f45787c0: Pulling fs layer
+2022-11-01T15:22:23.6557007Z 234663a2e3ee: Pulling fs layer
+2022-11-01T15:22:23.6557699Z 74531487bb7b: Pulling fs layer
+2022-11-01T15:22:23.6557925Z 882d294bf188: Waiting
+2022-11-01T15:22:23.6558139Z 2649fc7eb806: Waiting
+2022-11-01T15:22:23.6558335Z bddb3394e2e3: Waiting
+2022-11-01T15:22:23.6558547Z 93c83d9a2206: Waiting
+2022-11-01T15:22:23.6558750Z 99d7f45787c0: Waiting
+2022-11-01T15:22:23.6558937Z 234663a2e3ee: Waiting
+2022-11-01T15:22:23.6559142Z 74531487bb7b: Waiting
+2022-11-01T15:22:23.6559540Z 0f166cb3e327: Waiting
+2022-11-01T15:22:23.9867293Z a5ee239a0d3a: Verifying Checksum
+2022-11-01T15:22:23.9867941Z a5ee239a0d3a: Download complete
+2022-11-01T15:22:24.0450086Z 0cf69c8f1492: Verifying Checksum
+2022-11-01T15:22:24.0453075Z 0cf69c8f1492: Download complete
+2022-11-01T15:22:24.3464913Z 0f166cb3e327: Verifying Checksum
+2022-11-01T15:22:24.3465310Z 0f166cb3e327: Download complete
+2022-11-01T15:22:24.3517047Z 882d294bf188: Verifying Checksum
+2022-11-01T15:22:24.3518202Z 882d294bf188: Download complete
+2022-11-01T15:22:24.6730495Z 2649fc7eb806: Verifying Checksum
+2022-11-01T15:22:24.6731468Z 2649fc7eb806: Download complete
+2022-11-01T15:22:25.0002710Z 93c83d9a2206: Verifying Checksum
+2022-11-01T15:22:25.0003976Z 93c83d9a2206: Download complete
+2022-11-01T15:22:25.1541923Z bddb3394e2e3: Verifying Checksum
+2022-11-01T15:22:25.1542827Z bddb3394e2e3: Download complete
+2022-11-01T15:22:25.4166178Z d67a603b911a: Verifying Checksum
+2022-11-01T15:22:25.4167080Z d67a603b911a: Download complete
+2022-11-01T15:22:25.4830760Z 234663a2e3ee: Verifying Checksum
+2022-11-01T15:22:25.4846538Z 234663a2e3ee: Download complete
+2022-11-01T15:22:25.7381703Z 74531487bb7b: Verifying Checksum
+2022-11-01T15:22:25.7382588Z 74531487bb7b: Download complete
+2022-11-01T15:22:25.8527402Z 99d7f45787c0: Verifying Checksum
+2022-11-01T15:22:25.8549349Z 99d7f45787c0: Download complete
+2022-11-01T15:22:27.1417789Z d67a603b911a: Pull complete
+2022-11-01T15:22:28.0615469Z 0cf69c8f1492: Pull complete
+2022-11-01T15:22:28.1630064Z a5ee239a0d3a: Pull complete
+2022-11-01T15:22:28.4630683Z 0f166cb3e327: Pull complete
+2022-11-01T15:22:28.5470127Z 882d294bf188: Pull complete
+2022-11-01T15:22:28.6222715Z 2649fc7eb806: Pull complete
+2022-11-01T15:22:30.8200860Z bddb3394e2e3: Pull complete
+2022-11-01T15:22:30.8846376Z 93c83d9a2206: Pull complete
+2022-11-01T15:22:36.7604768Z 99d7f45787c0: Pull complete
+2022-11-01T15:22:36.8357942Z 234663a2e3ee: Pull complete
+2022-11-01T15:22:36.9012415Z 74531487bb7b: Pull complete
+2022-11-01T15:22:36.9094455Z Digest: sha256:d4055451e7f42869e64089a60d1abc9e66eccde2910629f0dd666b53a5f230d8
+2022-11-01T15:22:36.9127968Z Status: Downloaded newer image for mysql:latest
+2022-11-01T15:22:36.9154819Z docker.io/library/mysql:latest
+2022-11-01T15:22:36.9298550Z ##[command]/usr/bin/docker create --name e281b5d836644f53b33d06a88663b086_mysqllatest_c6a68e --label 8d5581 --network github_network_7d8483aa88b2460d91b946ac72079065 --network-alias mysql -p 3306 --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 -e "MYSQL_ROOT_PASSWORD=root" -e GITHUB_ACTIONS=true -e CI=true mysql:latest
+2022-11-01T15:22:36.9879151Z cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:36.9911210Z ##[command]/usr/bin/docker start cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:37.4755521Z cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:37.4795933Z ##[command]/usr/bin/docker ps --all --filter id=cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1 --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
+2022-11-01T15:22:37.5113258Z cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1 Up Less than a second (health: starting)
+2022-11-01T15:22:37.5177404Z ##[command]/usr/bin/docker port cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:37.5462051Z 3306/tcp -> 0.0.0.0:49153
+2022-11-01T15:22:37.5464354Z 3306/tcp -> :::49153
+2022-11-01T15:22:37.5587024Z ##[endgroup]
+2022-11-01T15:22:37.5587360Z ##[group]Waiting for all services to be ready
+2022-11-01T15:22:37.5644998Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:37.5931031Z starting
+2022-11-01T15:22:37.5967460Z mysql service is starting, waiting 2 seconds before checking again.
+2022-11-01T15:22:39.5985654Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:39.6392920Z starting
+2022-11-01T15:22:39.6411834Z mysql service is starting, waiting 4 seconds before checking again.
+2022-11-01T15:22:43.7096918Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:43.7721367Z starting
+2022-11-01T15:22:43.7737289Z mysql service is starting, waiting 8 seconds before checking again.
+2022-11-01T15:22:51.9262367Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:22:51.9505260Z starting
+2022-11-01T15:22:51.9522218Z mysql service is starting, waiting 13 seconds before checking again.
+2022-11-01T15:23:05.2771619Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:23:05.3013771Z healthy
+2022-11-01T15:23:05.3024538Z mysql service is healthy.
+2022-11-01T15:23:05.3024986Z ##[endgroup]
+2022-11-01T15:23:05.3498117Z ##[group]Run actions/checkout@v3
+2022-11-01T15:23:05.3498404Z with:
+2022-11-01T15:23:05.3498607Z repository: tgstation/tgstation
+2022-11-01T15:23:05.3499131Z token: ***
+2022-11-01T15:23:05.3499336Z ssh-strict: true
+2022-11-01T15:23:05.3499566Z persist-credentials: true
+2022-11-01T15:23:05.3499930Z clean: true
+2022-11-01T15:23:05.3500134Z fetch-depth: 1
+2022-11-01T15:23:05.3500323Z lfs: false
+2022-11-01T15:23:05.3500668Z submodules: false
+2022-11-01T15:23:05.3500890Z set-safe-directory: true
+2022-11-01T15:23:05.3501110Z ##[endgroup]
+2022-11-01T15:23:05.7431946Z Syncing repository: tgstation/tgstation
+2022-11-01T15:23:05.7434241Z ##[group]Getting Git version info
+2022-11-01T15:23:05.7435150Z Working directory is '/home/runner/work/tgstation/tgstation'
+2022-11-01T15:23:05.7435653Z [command]/usr/bin/git version
+2022-11-01T15:23:05.7647982Z git version 2.38.1
+2022-11-01T15:23:05.7683915Z ##[endgroup]
+2022-11-01T15:23:05.7710794Z Temporarily overriding HOME='/home/runner/work/_temp/a63c17da-7308-4a9e-856a-69236f785151' before making global git config changes
+2022-11-01T15:23:05.7711429Z Adding repository directory to the temporary git global config as a safe directory
+2022-11-01T15:23:05.7718974Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2022-11-01T15:23:05.7791610Z Deleting the contents of '/home/runner/work/tgstation/tgstation'
+2022-11-01T15:23:05.7800753Z ##[group]Initializing the repository
+2022-11-01T15:23:05.7810526Z [command]/usr/bin/git init /home/runner/work/tgstation/tgstation
+2022-11-01T15:23:05.7999555Z hint: Using 'master' as the name for the initial branch. This default branch name
+2022-11-01T15:23:05.8000657Z hint: is subject to change. To configure the initial branch name to use in all
+2022-11-01T15:23:05.8001229Z hint: of your new repositories, which will suppress this warning, call:
+2022-11-01T15:23:05.8001635Z hint:
+2022-11-01T15:23:05.8002546Z hint: git config --global init.defaultBranch
+2022-11-01T15:23:05.8003017Z hint:
+2022-11-01T15:23:05.8003562Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
+2022-11-01T15:23:05.8004498Z hint: 'development'. The just-created branch can be renamed via this command:
+2022-11-01T15:23:05.8006177Z hint:
+2022-11-01T15:23:05.8006532Z hint: git branch -m
+2022-11-01T15:23:05.8016074Z Initialized empty Git repository in /home/runner/work/tgstation/tgstation/.git/
+2022-11-01T15:23:05.8029083Z [command]/usr/bin/git remote add origin https://github.com/tgstation/tgstation
+2022-11-01T15:23:05.8108132Z ##[endgroup]
+2022-11-01T15:23:05.8110681Z ##[group]Disabling automatic garbage collection
+2022-11-01T15:23:05.8113311Z [command]/usr/bin/git config --local gc.auto 0
+2022-11-01T15:23:05.8153161Z ##[endgroup]
+2022-11-01T15:23:05.8153891Z ##[group]Setting up auth
+2022-11-01T15:23:05.8163234Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2022-11-01T15:23:05.8203566Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :
+2022-11-01T15:23:05.8796996Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2022-11-01T15:23:05.8820643Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :
+2022-11-01T15:23:05.9097833Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
+2022-11-01T15:23:05.9154264Z ##[endgroup]
+2022-11-01T15:23:05.9155507Z ##[group]Fetching the repository
+2022-11-01T15:23:05.9167693Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +90d58213531368fd97e9955fe80b75ad69c20f24:refs/remotes/pull/70980/merge
+2022-11-01T15:23:06.8635625Z remote: Enumerating objects: 12567, done.
+2022-11-01T15:23:06.8636451Z remote: Counting objects: 0% (1/12567)
+2022-11-01T15:23:06.8650219Z remote: Counting objects: 1% (126/12567)
+2022-11-01T15:23:06.8660754Z remote: Counting objects: 2% (252/12567)
+2022-11-01T15:23:06.8672560Z remote: Counting objects: 3% (378/12567)
+2022-11-01T15:23:06.8672977Z remote: Counting objects: 4% (503/12567)
+2022-11-01T15:23:06.8673376Z remote: Counting objects: 5% (629/12567)
+2022-11-01T15:23:06.8675482Z remote: Counting objects: 6% (755/12567)
+2022-11-01T15:23:06.8675791Z remote: Counting objects: 7% (880/12567)
+2022-11-01T15:23:06.9160118Z remote: Counting objects: 8% (1006/12567)
+2022-11-01T15:23:06.9160767Z remote: Counting objects: 9% (1132/12567)
+2022-11-01T15:23:06.9161166Z remote: Counting objects: 10% (1257/12567)
+2022-11-01T15:23:06.9161566Z remote: Counting objects: 11% (1383/12567)
+2022-11-01T15:23:06.9161964Z remote: Counting objects: 12% (1509/12567)
+2022-11-01T15:23:06.9162324Z remote: Counting objects: 13% (1634/12567)
+2022-11-01T15:23:06.9162700Z remote: Counting objects: 14% (1760/12567)
+2022-11-01T15:23:06.9163069Z remote: Counting objects: 15% (1886/12567)
+2022-11-01T15:23:06.9163437Z remote: Counting objects: 16% (2011/12567)
+2022-11-01T15:23:06.9163808Z remote: Counting objects: 17% (2137/12567)
+2022-11-01T15:23:06.9164357Z remote: Counting objects: 18% (2263/12567)
+2022-11-01T15:23:06.9165066Z remote: Counting objects: 19% (2388/12567)
+2022-11-01T15:23:06.9165451Z remote: Counting objects: 20% (2514/12567)
+2022-11-01T15:23:06.9165800Z remote: Counting objects: 21% (2640/12567)
+2022-11-01T15:23:06.9166097Z remote: Counting objects: 22% (2765/12567)
+2022-11-01T15:23:06.9166459Z remote: Counting objects: 23% (2891/12567)
+2022-11-01T15:23:06.9166827Z remote: Counting objects: 24% (3017/12567)
+2022-11-01T15:23:06.9167178Z remote: Counting objects: 25% (3142/12567)
+2022-11-01T15:23:06.9167700Z remote: Counting objects: 26% (3268/12567)
+2022-11-01T15:23:06.9168060Z remote: Counting objects: 27% (3394/12567)
+2022-11-01T15:23:06.9168413Z remote: Counting objects: 28% (3519/12567)
+2022-11-01T15:23:06.9168685Z remote: Counting objects: 29% (3645/12567)
+2022-11-01T15:23:06.9169293Z remote: Counting objects: 30% (3771/12567)
+2022-11-01T15:23:06.9169550Z remote: Counting objects: 31% (3896/12567)
+2022-11-01T15:23:06.9169791Z remote: Counting objects: 32% (4022/12567)
+2022-11-01T15:23:06.9170049Z remote: Counting objects: 33% (4148/12567)
+2022-11-01T15:23:06.9170305Z remote: Counting objects: 34% (4273/12567)
+2022-11-01T15:23:06.9170563Z remote: Counting objects: 35% (4399/12567)
+2022-11-01T15:23:06.9170803Z remote: Counting objects: 36% (4525/12567)
+2022-11-01T15:23:06.9171062Z remote: Counting objects: 37% (4650/12567)
+2022-11-01T15:23:06.9171316Z remote: Counting objects: 38% (4776/12567)
+2022-11-01T15:23:06.9171714Z remote: Counting objects: 39% (4902/12567)
+2022-11-01T15:23:06.9171963Z remote: Counting objects: 40% (5027/12567)
+2022-11-01T15:23:06.9172211Z remote: Counting objects: 41% (5153/12567)
+2022-11-01T15:23:06.9172447Z remote: Counting objects: 42% (5279/12567)
+2022-11-01T15:23:06.9172868Z remote: Counting objects: 43% (5404/12567)
+2022-11-01T15:23:06.9173464Z remote: Counting objects: 44% (5530/12567)
+2022-11-01T15:23:06.9173834Z remote: Counting objects: 45% (5656/12567)
+2022-11-01T15:23:06.9174083Z remote: Counting objects: 46% (5781/12567)
+2022-11-01T15:23:06.9174458Z remote: Counting objects: 47% (5907/12567)
+2022-11-01T15:23:06.9174828Z remote: Counting objects: 48% (6033/12567)
+2022-11-01T15:23:06.9175193Z remote: Counting objects: 49% (6158/12567)
+2022-11-01T15:23:06.9175686Z remote: Counting objects: 50% (6284/12567)
+2022-11-01T15:23:06.9176096Z remote: Counting objects: 51% (6410/12567)
+2022-11-01T15:23:06.9176806Z remote: Counting objects: 52% (6535/12567)
+2022-11-01T15:23:06.9177226Z remote: Counting objects: 53% (6661/12567)
+2022-11-01T15:23:06.9383126Z remote: Counting objects: 54% (6787/12567)
+2022-11-01T15:23:06.9383471Z remote: Counting objects: 55% (6912/12567)
+2022-11-01T15:23:06.9383912Z remote: Counting objects: 56% (7038/12567)
+2022-11-01T15:23:06.9384205Z remote: Counting objects: 57% (7164/12567)
+2022-11-01T15:23:06.9384882Z remote: Counting objects: 58% (7289/12567)
+2022-11-01T15:23:06.9385322Z remote: Counting objects: 59% (7415/12567)
+2022-11-01T15:23:06.9385593Z remote: Counting objects: 60% (7541/12567)
+2022-11-01T15:23:06.9386047Z remote: Counting objects: 61% (7666/12567)
+2022-11-01T15:23:06.9386320Z remote: Counting objects: 62% (7792/12567)
+2022-11-01T15:23:06.9386602Z remote: Counting objects: 63% (7918/12567)
+2022-11-01T15:23:06.9387066Z remote: Counting objects: 64% (8043/12567)
+2022-11-01T15:23:06.9387318Z remote: Counting objects: 65% (8169/12567)
+2022-11-01T15:23:06.9387584Z remote: Counting objects: 66% (8295/12567)
+2022-11-01T15:23:06.9387858Z remote: Counting objects: 67% (8420/12567)
+2022-11-01T15:23:06.9388109Z remote: Counting objects: 68% (8546/12567)
+2022-11-01T15:23:06.9388374Z remote: Counting objects: 69% (8672/12567)
+2022-11-01T15:23:06.9388777Z remote: Counting objects: 70% (8797/12567)
+2022-11-01T15:23:06.9389026Z remote: Counting objects: 71% (8923/12567)
+2022-11-01T15:23:06.9389293Z remote: Counting objects: 72% (9049/12567)
+2022-11-01T15:23:06.9389558Z remote: Counting objects: 73% (9174/12567)
+2022-11-01T15:23:06.9389987Z remote: Counting objects: 74% (9300/12567)
+2022-11-01T15:23:06.9390230Z remote: Counting objects: 75% (9426/12567)
+2022-11-01T15:23:06.9390484Z remote: Counting objects: 76% (9551/12567)
+2022-11-01T15:23:06.9390738Z remote: Counting objects: 77% (9677/12567)
+2022-11-01T15:23:06.9390979Z remote: Counting objects: 78% (9803/12567)
+2022-11-01T15:23:06.9391235Z remote: Counting objects: 79% (9928/12567)
+2022-11-01T15:23:06.9391796Z remote: Counting objects: 80% (10054/12567)
+2022-11-01T15:23:06.9392047Z remote: Counting objects: 81% (10180/12567)
+2022-11-01T15:23:06.9392314Z remote: Counting objects: 82% (10305/12567)
+2022-11-01T15:23:06.9392577Z remote: Counting objects: 83% (10431/12567)
+2022-11-01T15:23:06.9392824Z remote: Counting objects: 84% (10557/12567)
+2022-11-01T15:23:06.9393085Z remote: Counting objects: 85% (10682/12567)
+2022-11-01T15:23:06.9394375Z remote: Counting objects: 86% (10808/12567)
+2022-11-01T15:23:06.9394631Z remote: Counting objects: 87% (10934/12567)
+2022-11-01T15:23:06.9394877Z remote: Counting objects: 88% (11059/12567)
+2022-11-01T15:23:06.9395134Z remote: Counting objects: 89% (11185/12567)
+2022-11-01T15:23:06.9395389Z remote: Counting objects: 90% (11311/12567)
+2022-11-01T15:23:06.9395622Z remote: Counting objects: 91% (11436/12567)
+2022-11-01T15:23:06.9395877Z remote: Counting objects: 92% (11562/12567)
+2022-11-01T15:23:06.9396132Z remote: Counting objects: 93% (11688/12567)
+2022-11-01T15:23:06.9396564Z remote: Counting objects: 94% (11813/12567)
+2022-11-01T15:23:06.9396804Z remote: Counting objects: 95% (11939/12567)
+2022-11-01T15:23:06.9397061Z remote: Counting objects: 96% (12065/12567)
+2022-11-01T15:23:06.9397319Z remote: Counting objects: 97% (12190/12567)
+2022-11-01T15:23:06.9397557Z remote: Counting objects: 98% (12316/12567)
+2022-11-01T15:23:06.9397810Z remote: Counting objects: 99% (12442/12567)
+2022-11-01T15:23:06.9398208Z remote: Counting objects: 100% (12567/12567)
+2022-11-01T15:23:06.9398661Z remote: Counting objects: 100% (12567/12567), done.
+2022-11-01T15:23:06.9398965Z remote: Compressing objects: 0% (1/10988)
+2022-11-01T15:23:06.9399257Z remote: Compressing objects: 1% (110/10988)
+2022-11-01T15:23:06.9439997Z remote: Compressing objects: 2% (220/10988)
+2022-11-01T15:23:06.9561627Z remote: Compressing objects: 3% (330/10988)
+2022-11-01T15:23:06.9680955Z remote: Compressing objects: 4% (440/10988)
+2022-11-01T15:23:06.9723040Z remote: Compressing objects: 5% (550/10988)
+2022-11-01T15:23:06.9876931Z remote: Compressing objects: 6% (660/10988)
+2022-11-01T15:23:07.0170815Z remote: Compressing objects: 7% (770/10988)
+2022-11-01T15:23:07.0504059Z remote: Compressing objects: 8% (880/10988)
+2022-11-01T15:23:07.0836116Z remote: Compressing objects: 9% (989/10988)
+2022-11-01T15:23:07.1460729Z remote: Compressing objects: 10% (1099/10988)
+2022-11-01T15:23:07.6608683Z remote: Compressing objects: 11% (1209/10988)
+2022-11-01T15:23:07.7588422Z remote: Compressing objects: 12% (1319/10988)
+2022-11-01T15:23:07.9494647Z remote: Compressing objects: 13% (1429/10988)
+2022-11-01T15:23:07.9527972Z remote: Compressing objects: 13% (1508/10988)
+2022-11-01T15:23:07.9668498Z remote: Compressing objects: 14% (1539/10988)
+2022-11-01T15:23:08.0219248Z remote: Compressing objects: 15% (1649/10988)
+2022-11-01T15:23:08.0283852Z remote: Compressing objects: 16% (1759/10988)
+2022-11-01T15:23:08.0452608Z remote: Compressing objects: 17% (1868/10988)
+2022-11-01T15:23:08.0618448Z remote: Compressing objects: 18% (1978/10988)
+2022-11-01T15:23:08.0889220Z remote: Compressing objects: 19% (2088/10988)
+2022-11-01T15:23:08.1162946Z remote: Compressing objects: 20% (2198/10988)
+2022-11-01T15:23:08.1247220Z remote: Compressing objects: 21% (2308/10988)
+2022-11-01T15:23:08.1520626Z remote: Compressing objects: 22% (2418/10988)
+2022-11-01T15:23:08.2139765Z remote: Compressing objects: 23% (2528/10988)
+2022-11-01T15:23:08.2412924Z remote: Compressing objects: 24% (2638/10988)
+2022-11-01T15:23:08.2597478Z remote: Compressing objects: 25% (2747/10988)
+2022-11-01T15:23:08.2752211Z remote: Compressing objects: 26% (2857/10988)
+2022-11-01T15:23:08.2966161Z remote: Compressing objects: 27% (2967/10988)
+2022-11-01T15:23:08.3926822Z remote: Compressing objects: 28% (3077/10988)
+2022-11-01T15:23:08.3927793Z remote: Compressing objects: 29% (3187/10988)
+2022-11-01T15:23:08.4094739Z remote: Compressing objects: 30% (3297/10988)
+2022-11-01T15:23:08.4338176Z remote: Compressing objects: 31% (3407/10988)
+2022-11-01T15:23:08.4632502Z remote: Compressing objects: 32% (3517/10988)
+2022-11-01T15:23:08.4940329Z remote: Compressing objects: 33% (3627/10988)
+2022-11-01T15:23:08.5404129Z remote: Compressing objects: 34% (3736/10988)
+2022-11-01T15:23:08.5814756Z remote: Compressing objects: 35% (3846/10988)
+2022-11-01T15:23:08.6091092Z remote: Compressing objects: 36% (3956/10988)
+2022-11-01T15:23:08.6446921Z remote: Compressing objects: 37% (4066/10988)
+2022-11-01T15:23:08.6900873Z remote: Compressing objects: 38% (4176/10988)
+2022-11-01T15:23:08.7213081Z remote: Compressing objects: 39% (4286/10988)
+2022-11-01T15:23:08.7502723Z remote: Compressing objects: 40% (4396/10988)
+2022-11-01T15:23:08.7869698Z remote: Compressing objects: 41% (4506/10988)
+2022-11-01T15:23:08.8103626Z remote: Compressing objects: 42% (4615/10988)
+2022-11-01T15:23:08.8451299Z remote: Compressing objects: 43% (4725/10988)
+2022-11-01T15:23:08.8774688Z remote: Compressing objects: 44% (4835/10988)
+2022-11-01T15:23:08.9003331Z remote: Compressing objects: 45% (4945/10988)
+2022-11-01T15:23:08.9070180Z remote: Compressing objects: 45% (5034/10988)
+2022-11-01T15:23:08.9344499Z remote: Compressing objects: 46% (5055/10988)
+2022-11-01T15:23:08.9568190Z remote: Compressing objects: 47% (5165/10988)
+2022-11-01T15:23:08.9805763Z remote: Compressing objects: 48% (5275/10988)
+2022-11-01T15:23:09.0037568Z remote: Compressing objects: 49% (5385/10988)
+2022-11-01T15:23:09.0301310Z remote: Compressing objects: 50% (5494/10988)
+2022-11-01T15:23:09.0582321Z remote: Compressing objects: 51% (5604/10988)
+2022-11-01T15:23:09.0808327Z remote: Compressing objects: 52% (5714/10988)
+2022-11-01T15:23:09.1124129Z remote: Compressing objects: 53% (5824/10988)
+2022-11-01T15:23:09.1387087Z remote: Compressing objects: 54% (5934/10988)
+2022-11-01T15:23:09.1647455Z remote: Compressing objects: 55% (6044/10988)
+2022-11-01T15:23:09.1915056Z remote: Compressing objects: 56% (6154/10988)
+2022-11-01T15:23:09.2255320Z remote: Compressing objects: 57% (6264/10988)
+2022-11-01T15:23:09.2457326Z remote: Compressing objects: 58% (6374/10988)
+2022-11-01T15:23:09.2755910Z remote: Compressing objects: 59% (6483/10988)
+2022-11-01T15:23:09.3017305Z remote: Compressing objects: 60% (6593/10988)
+2022-11-01T15:23:09.3325069Z remote: Compressing objects: 61% (6703/10988)
+2022-11-01T15:23:09.3546803Z remote: Compressing objects: 62% (6813/10988)
+2022-11-01T15:23:09.3801684Z remote: Compressing objects: 63% (6923/10988)
+2022-11-01T15:23:09.4067963Z remote: Compressing objects: 64% (7033/10988)
+2022-11-01T15:23:09.5472387Z remote: Compressing objects: 65% (7143/10988)
+2022-11-01T15:23:09.5473083Z remote: Compressing objects: 66% (7253/10988)
+2022-11-01T15:23:09.5473536Z remote: Compressing objects: 67% (7362/10988)
+2022-11-01T15:23:09.5473940Z remote: Compressing objects: 68% (7472/10988)
+2022-11-01T15:23:09.5474375Z remote: Compressing objects: 69% (7582/10988)
+2022-11-01T15:23:09.5474794Z remote: Compressing objects: 70% (7692/10988)
+2022-11-01T15:23:09.5475212Z remote: Compressing objects: 71% (7802/10988)
+2022-11-01T15:23:09.5475789Z remote: Compressing objects: 72% (7912/10988)
+2022-11-01T15:23:09.5476209Z remote: Compressing objects: 73% (8022/10988)
+2022-11-01T15:23:09.5477532Z remote: Compressing objects: 74% (8132/10988)
+2022-11-01T15:23:09.5478233Z remote: Compressing objects: 75% (8241/10988)
+2022-11-01T15:23:09.5478582Z remote: Compressing objects: 76% (8351/10988)
+2022-11-01T15:23:09.5479163Z remote: Compressing objects: 77% (8461/10988)
+2022-11-01T15:23:09.5479885Z remote: Compressing objects: 78% (8571/10988)
+2022-11-01T15:23:09.5480434Z remote: Compressing objects: 79% (8681/10988)
+2022-11-01T15:23:09.5480899Z remote: Compressing objects: 80% (8791/10988)
+2022-11-01T15:23:09.5481594Z remote: Compressing objects: 81% (8901/10988)
+2022-11-01T15:23:09.5482284Z remote: Compressing objects: 82% (9011/10988)
+2022-11-01T15:23:09.5482865Z remote: Compressing objects: 83% (9121/10988)
+2022-11-01T15:23:09.5483308Z remote: Compressing objects: 84% (9230/10988)
+2022-11-01T15:23:09.5483685Z remote: Compressing objects: 85% (9340/10988)
+2022-11-01T15:23:09.5484385Z remote: Compressing objects: 86% (9450/10988)
+2022-11-01T15:23:09.5485582Z remote: Compressing objects: 87% (9560/10988)
+2022-11-01T15:23:09.5486089Z remote: Compressing objects: 88% (9670/10988)
+2022-11-01T15:23:09.5486597Z remote: Compressing objects: 89% (9780/10988)
+2022-11-01T15:23:09.5487116Z remote: Compressing objects: 90% (9890/10988)
+2022-11-01T15:23:09.5487742Z remote: Compressing objects: 91% (10000/10988)
+2022-11-01T15:23:09.5488235Z remote: Compressing objects: 92% (10109/10988)
+2022-11-01T15:23:09.5488673Z remote: Compressing objects: 93% (10219/10988)
+2022-11-01T15:23:09.5489383Z remote: Compressing objects: 94% (10329/10988)
+2022-11-01T15:23:09.5489745Z remote: Compressing objects: 95% (10439/10988)
+2022-11-01T15:23:09.5490195Z remote: Compressing objects: 96% (10549/10988)
+2022-11-01T15:23:09.5490745Z remote: Compressing objects: 97% (10659/10988)
+2022-11-01T15:23:09.5491127Z remote: Compressing objects: 98% (10769/10988)
+2022-11-01T15:23:09.5491596Z remote: Compressing objects: 99% (10879/10988)
+2022-11-01T15:23:09.5492106Z remote: Compressing objects: 100% (10988/10988)
+2022-11-01T15:23:09.5492683Z remote: Compressing objects: 100% (10988/10988), done.
+2022-11-01T15:23:09.8456233Z Receiving objects: 0% (1/12567)
+2022-11-01T15:23:10.1991946Z Receiving objects: 1% (126/12567)
+2022-11-01T15:23:10.2129001Z Receiving objects: 2% (252/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.3381943Z Receiving objects: 3% (378/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.3419720Z Receiving objects: 4% (503/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.3481272Z Receiving objects: 5% (629/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.3610976Z Receiving objects: 6% (755/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4060459Z Receiving objects: 7% (880/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4152976Z Receiving objects: 8% (1006/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4214294Z Receiving objects: 9% (1132/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4443541Z Receiving objects: 10% (1257/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4585667Z Receiving objects: 11% (1383/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4664474Z Receiving objects: 12% (1509/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4672354Z Receiving objects: 13% (1634/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4765843Z Receiving objects: 14% (1760/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.4973914Z Receiving objects: 15% (1886/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.5317436Z Receiving objects: 16% (2011/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.5620851Z Receiving objects: 17% (2137/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.5694797Z Receiving objects: 17% (2211/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.5937016Z Receiving objects: 18% (2263/12567), 1.64 MiB | 3.13 MiB/s
+2022-11-01T15:23:10.6179150Z Receiving objects: 19% (2388/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.6422936Z Receiving objects: 20% (2514/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.6652610Z Receiving objects: 21% (2640/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.6945718Z Receiving objects: 22% (2765/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.7167238Z Receiving objects: 23% (2891/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.7332899Z Receiving objects: 24% (3017/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.7570968Z Receiving objects: 25% (3142/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.7722439Z Receiving objects: 26% (3268/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.7982867Z Receiving objects: 27% (3394/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.8201011Z Receiving objects: 28% (3519/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.8338369Z Receiving objects: 29% (3645/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.8455222Z Receiving objects: 30% (3771/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.8589882Z Receiving objects: 31% (3896/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.8671253Z Receiving objects: 32% (4022/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.8915567Z Receiving objects: 33% (4148/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.9033131Z Receiving objects: 34% (4273/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:10.9275337Z Receiving objects: 35% (4399/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:11.0474018Z Receiving objects: 36% (4525/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:11.0614229Z Receiving objects: 37% (4650/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:11.0725415Z Receiving objects: 38% (4776/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:11.0818490Z Receiving objects: 39% (4902/12567), 5.60 MiB | 5.45 MiB/s
+2022-11-01T15:23:11.0907264Z Receiving objects: 40% (5027/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.0974088Z Receiving objects: 41% (5153/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.1189127Z Receiving objects: 42% (5279/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.1576689Z Receiving objects: 43% (5404/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.1635112Z Receiving objects: 44% (5530/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.1783797Z Receiving objects: 45% (5656/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.1910308Z Receiving objects: 46% (5781/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.1973985Z Receiving objects: 47% (5907/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.2254839Z Receiving objects: 48% (6033/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.2318962Z Receiving objects: 49% (6158/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.2710865Z Receiving objects: 50% (6284/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.4267228Z Receiving objects: 51% (6410/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:11.5803346Z Receiving objects: 52% (6535/12567), 10.14 MiB | 6.64 MiB/s
+2022-11-01T15:23:12.2068025Z Receiving objects: 52% (6537/12567), 17.98 MiB | 8.87 MiB/s
+2022-11-01T15:23:12.5653011Z Receiving objects: 53% (6661/12567), 26.38 MiB | 10.44 MiB/s
+2022-11-01T15:23:12.6958322Z Receiving objects: 53% (6662/12567), 26.38 MiB | 10.44 MiB/s
+2022-11-01T15:23:12.7498019Z Receiving objects: 54% (6787/12567), 35.32 MiB | 11.67 MiB/s
+2022-11-01T15:23:12.9576078Z Receiving objects: 55% (6912/12567), 35.32 MiB | 11.67 MiB/s
+2022-11-01T15:23:13.0573630Z Receiving objects: 56% (7038/12567), 35.32 MiB | 11.67 MiB/s
+2022-11-01T15:23:13.1975640Z Receiving objects: 57% (7164/12567), 35.32 MiB | 11.67 MiB/s
+2022-11-01T15:23:13.2702208Z Receiving objects: 58% (7289/12567), 44.61 MiB | 12.65 MiB/s
+2022-11-01T15:23:13.3294275Z Receiving objects: 59% (7415/12567), 44.61 MiB | 12.65 MiB/s
+2022-11-01T15:23:13.3822287Z Receiving objects: 60% (7541/12567), 44.61 MiB | 12.65 MiB/s
+2022-11-01T15:23:13.5599681Z Receiving objects: 61% (7666/12567), 44.61 MiB | 12.65 MiB/s
+2022-11-01T15:23:13.5600309Z Receiving objects: 61% (7778/12567), 44.61 MiB | 12.65 MiB/s
+2022-11-01T15:23:13.7119127Z Receiving objects: 62% (7792/12567), 44.61 MiB | 12.65 MiB/s
+2022-11-01T15:23:14.4477813Z Receiving objects: 63% (7918/12567), 52.69 MiB | 13.08 MiB/s
+2022-11-01T15:23:14.5754767Z Receiving objects: 64% (8043/12567), 64.39 MiB | 14.22 MiB/s
+2022-11-01T15:23:15.3567308Z Receiving objects: 64% (8057/12567), 64.39 MiB | 14.22 MiB/s
+2022-11-01T15:23:15.4930170Z Receiving objects: 65% (8169/12567), 85.50 MiB | 17.69 MiB/s
+2022-11-01T15:23:15.5525805Z Receiving objects: 66% (8295/12567), 85.50 MiB | 17.69 MiB/s
+2022-11-01T15:23:15.6305131Z Receiving objects: 66% (8356/12567), 85.50 MiB | 17.69 MiB/s
+2022-11-01T15:23:15.7845146Z Receiving objects: 67% (8420/12567), 96.01 MiB | 18.97 MiB/s
+2022-11-01T15:23:15.8950904Z Receiving objects: 68% (8546/12567), 96.01 MiB | 18.97 MiB/s
+2022-11-01T15:23:16.1051375Z Receiving objects: 69% (8672/12567), 96.01 MiB | 18.97 MiB/s
+2022-11-01T15:23:16.3043168Z Receiving objects: 70% (8797/12567), 96.01 MiB | 18.97 MiB/s
+2022-11-01T15:23:16.6162611Z Receiving objects: 71% (8923/12567), 106.07 MiB | 19.39 MiB/s
+2022-11-01T15:23:16.6815447Z Receiving objects: 71% (9011/12567), 106.07 MiB | 19.39 MiB/s
+2022-11-01T15:23:16.7597143Z Receiving objects: 72% (9049/12567), 114.51 MiB | 19.40 MiB/s
+2022-11-01T15:23:16.7696552Z Receiving objects: 73% (9174/12567), 114.51 MiB | 19.40 MiB/s
+2022-11-01T15:23:16.8381002Z Receiving objects: 74% (9300/12567), 114.51 MiB | 19.40 MiB/s
+2022-11-01T15:23:16.8584430Z Receiving objects: 75% (9426/12567), 114.51 MiB | 19.40 MiB/s
+2022-11-01T15:23:16.9384015Z Receiving objects: 76% (9551/12567), 114.51 MiB | 19.40 MiB/s
+2022-11-01T15:23:17.3179210Z Receiving objects: 77% (9677/12567), 114.51 MiB | 19.40 MiB/s
+2022-11-01T15:23:17.3182197Z Receiving objects: 78% (9803/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.3869883Z Receiving objects: 79% (9928/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.5335850Z Receiving objects: 80% (10054/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.5428620Z Receiving objects: 81% (10180/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.5600130Z Receiving objects: 82% (10305/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.5640100Z Receiving objects: 82% (10382/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.6170093Z Receiving objects: 83% (10431/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.6260507Z Receiving objects: 84% (10557/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.6882844Z Receiving objects: 85% (10682/12567), 122.17 MiB | 19.07 MiB/s
+2022-11-01T15:23:17.6964863Z Receiving objects: 86% (10808/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:17.7033288Z Receiving objects: 87% (10934/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:17.7862769Z Receiving objects: 88% (11059/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:17.9968632Z Receiving objects: 89% (11185/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.0444402Z Receiving objects: 90% (11311/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.0775190Z Receiving objects: 91% (11436/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.0824539Z Receiving objects: 92% (11562/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.0890030Z Receiving objects: 93% (11688/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.0956337Z Receiving objects: 94% (11813/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.1014935Z Receiving objects: 95% (11939/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.1056183Z Receiving objects: 96% (12065/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.1101897Z Receiving objects: 97% (12190/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.1271902Z Receiving objects: 98% (12316/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.1310792Z Receiving objects: 99% (12442/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.1311930Z remote: Total 12567 (delta 1595), reused 7195 (delta 1446), pack-reused 0
+2022-11-01T15:23:18.1338739Z Receiving objects: 100% (12567/12567), 131.07 MiB | 18.99 MiB/s
+2022-11-01T15:23:18.1339954Z Receiving objects: 100% (12567/12567), 139.23 MiB | 16.22 MiB/s, done.
+2022-11-01T15:23:18.1385156Z Resolving deltas: 0% (0/1595)
+2022-11-01T15:23:18.1456938Z Resolving deltas: 1% (16/1595)
+2022-11-01T15:23:18.1468555Z Resolving deltas: 2% (32/1595)
+2022-11-01T15:23:18.1480623Z Resolving deltas: 3% (48/1595)
+2022-11-01T15:23:18.1510723Z Resolving deltas: 4% (64/1595)
+2022-11-01T15:23:18.1526135Z Resolving deltas: 5% (80/1595)
+2022-11-01T15:23:18.1537025Z Resolving deltas: 6% (96/1595)
+2022-11-01T15:23:18.1544963Z Resolving deltas: 7% (112/1595)
+2022-11-01T15:23:18.1556566Z Resolving deltas: 8% (128/1595)
+2022-11-01T15:23:18.1570240Z Resolving deltas: 9% (144/1595)
+2022-11-01T15:23:18.1582264Z Resolving deltas: 10% (160/1595)
+2022-11-01T15:23:18.1691779Z Resolving deltas: 11% (176/1595)
+2022-11-01T15:23:18.1715280Z Resolving deltas: 12% (192/1595)
+2022-11-01T15:23:18.1720797Z Resolving deltas: 13% (208/1595)
+2022-11-01T15:23:18.1728838Z Resolving deltas: 14% (224/1595)
+2022-11-01T15:23:18.1732276Z Resolving deltas: 15% (240/1595)
+2022-11-01T15:23:18.1735362Z Resolving deltas: 16% (256/1595)
+2022-11-01T15:23:18.1738747Z Resolving deltas: 17% (272/1595)
+2022-11-01T15:23:18.1743520Z Resolving deltas: 18% (288/1595)
+2022-11-01T15:23:18.1747596Z Resolving deltas: 19% (304/1595)
+2022-11-01T15:23:18.1751835Z Resolving deltas: 20% (319/1595)
+2022-11-01T15:23:18.1755707Z Resolving deltas: 21% (335/1595)
+2022-11-01T15:23:18.1762459Z Resolving deltas: 22% (351/1595)
+2022-11-01T15:23:18.1786752Z Resolving deltas: 23% (367/1595)
+2022-11-01T15:23:18.1800095Z Resolving deltas: 24% (383/1595)
+2022-11-01T15:23:18.1817527Z Resolving deltas: 25% (399/1595)
+2022-11-01T15:23:18.1845355Z Resolving deltas: 26% (415/1595)
+2022-11-01T15:23:18.1858445Z Resolving deltas: 27% (431/1595)
+2022-11-01T15:23:18.1866810Z Resolving deltas: 28% (447/1595)
+2022-11-01T15:23:18.1967962Z Resolving deltas: 29% (463/1595)
+2022-11-01T15:23:18.2006641Z Resolving deltas: 30% (479/1595)
+2022-11-01T15:23:18.2018922Z Resolving deltas: 31% (495/1595)
+2022-11-01T15:23:18.2033737Z Resolving deltas: 32% (511/1595)
+2022-11-01T15:23:18.2060821Z Resolving deltas: 33% (527/1595)
+2022-11-01T15:23:18.2080072Z Resolving deltas: 34% (543/1595)
+2022-11-01T15:23:18.2108427Z Resolving deltas: 35% (559/1595)
+2022-11-01T15:23:18.2126164Z Resolving deltas: 36% (575/1595)
+2022-11-01T15:23:18.2221258Z Resolving deltas: 37% (591/1595)
+2022-11-01T15:23:18.2238691Z Resolving deltas: 38% (607/1595)
+2022-11-01T15:23:18.2242266Z Resolving deltas: 39% (623/1595)
+2022-11-01T15:23:18.2242686Z Resolving deltas: 40% (638/1595)
+2022-11-01T15:23:18.2243401Z Resolving deltas: 41% (654/1595)
+2022-11-01T15:23:18.2247475Z Resolving deltas: 42% (670/1595)
+2022-11-01T15:23:18.2248012Z Resolving deltas: 43% (686/1595)
+2022-11-01T15:23:18.2250915Z Resolving deltas: 44% (702/1595)
+2022-11-01T15:23:18.2251757Z Resolving deltas: 45% (718/1595)
+2022-11-01T15:23:18.2255808Z Resolving deltas: 46% (734/1595)
+2022-11-01T15:23:18.2256261Z Resolving deltas: 47% (750/1595)
+2022-11-01T15:23:18.2257458Z Resolving deltas: 48% (766/1595)
+2022-11-01T15:23:18.2261205Z Resolving deltas: 49% (782/1595)
+2022-11-01T15:23:18.2261740Z Resolving deltas: 50% (798/1595)
+2022-11-01T15:23:18.2262498Z Resolving deltas: 51% (814/1595)
+2022-11-01T15:23:18.2271025Z Resolving deltas: 52% (830/1595)
+2022-11-01T15:23:18.2280763Z Resolving deltas: 53% (846/1595)
+2022-11-01T15:23:18.2286419Z Resolving deltas: 54% (862/1595)
+2022-11-01T15:23:18.2296969Z Resolving deltas: 55% (878/1595)
+2022-11-01T15:23:18.2303419Z Resolving deltas: 56% (894/1595)
+2022-11-01T15:23:18.2310028Z Resolving deltas: 57% (910/1595)
+2022-11-01T15:23:18.2314981Z Resolving deltas: 58% (926/1595)
+2022-11-01T15:23:18.2323520Z Resolving deltas: 59% (942/1595)
+2022-11-01T15:23:18.2328697Z Resolving deltas: 60% (957/1595)
+2022-11-01T15:23:18.2335792Z Resolving deltas: 61% (973/1595)
+2022-11-01T15:23:18.2342110Z Resolving deltas: 62% (989/1595)
+2022-11-01T15:23:18.2348324Z Resolving deltas: 63% (1005/1595)
+2022-11-01T15:23:18.2354457Z Resolving deltas: 64% (1021/1595)
+2022-11-01T15:23:18.2361497Z Resolving deltas: 65% (1037/1595)
+2022-11-01T15:23:18.2370639Z Resolving deltas: 66% (1053/1595)
+2022-11-01T15:23:18.2380549Z Resolving deltas: 67% (1069/1595)
+2022-11-01T15:23:18.2387136Z Resolving deltas: 68% (1085/1595)
+2022-11-01T15:23:18.2391989Z Resolving deltas: 69% (1101/1595)
+2022-11-01T15:23:18.2398784Z Resolving deltas: 70% (1117/1595)
+2022-11-01T15:23:18.2406442Z Resolving deltas: 71% (1133/1595)
+2022-11-01T15:23:18.2412673Z Resolving deltas: 72% (1149/1595)
+2022-11-01T15:23:18.2422301Z Resolving deltas: 73% (1165/1595)
+2022-11-01T15:23:18.2427825Z Resolving deltas: 74% (1181/1595)
+2022-11-01T15:23:18.2433572Z Resolving deltas: 75% (1197/1595)
+2022-11-01T15:23:18.2438704Z Resolving deltas: 76% (1213/1595)
+2022-11-01T15:23:18.2444857Z Resolving deltas: 77% (1229/1595)
+2022-11-01T15:23:18.2450379Z Resolving deltas: 78% (1245/1595)
+2022-11-01T15:23:18.2458830Z Resolving deltas: 79% (1261/1595)
+2022-11-01T15:23:18.2464822Z Resolving deltas: 80% (1276/1595)
+2022-11-01T15:23:18.2470368Z Resolving deltas: 81% (1292/1595)
+2022-11-01T15:23:18.2477092Z Resolving deltas: 82% (1308/1595)
+2022-11-01T15:23:18.2486290Z Resolving deltas: 83% (1324/1595)
+2022-11-01T15:23:18.2495293Z Resolving deltas: 84% (1340/1595)
+2022-11-01T15:23:18.2502703Z Resolving deltas: 85% (1356/1595)
+2022-11-01T15:23:18.2509757Z Resolving deltas: 86% (1372/1595)
+2022-11-01T15:23:18.2517689Z Resolving deltas: 87% (1388/1595)
+2022-11-01T15:23:18.2526971Z Resolving deltas: 88% (1404/1595)
+2022-11-01T15:23:18.2537951Z Resolving deltas: 89% (1420/1595)
+2022-11-01T15:23:18.2547316Z Resolving deltas: 90% (1436/1595)
+2022-11-01T15:23:18.2561578Z Resolving deltas: 91% (1452/1595)
+2022-11-01T15:23:18.2579990Z Resolving deltas: 92% (1468/1595)
+2022-11-01T15:23:18.2589743Z Resolving deltas: 93% (1484/1595)
+2022-11-01T15:23:18.2595230Z Resolving deltas: 94% (1500/1595)
+2022-11-01T15:23:18.2600818Z Resolving deltas: 95% (1516/1595)
+2022-11-01T15:23:18.2611569Z Resolving deltas: 96% (1532/1595)
+2022-11-01T15:23:18.2621438Z Resolving deltas: 97% (1548/1595)
+2022-11-01T15:23:18.2626207Z Resolving deltas: 98% (1564/1595)
+2022-11-01T15:23:18.2630366Z Resolving deltas: 99% (1580/1595)
+2022-11-01T15:23:18.2685571Z Resolving deltas: 100% (1595/1595)
+2022-11-01T15:23:18.2686158Z Resolving deltas: 100% (1595/1595), done.
+2022-11-01T15:23:18.7231893Z From https://github.com/tgstation/tgstation
+2022-11-01T15:23:18.7239390Z * [new ref] 90d58213531368fd97e9955fe80b75ad69c20f24 -> pull/70980/merge
+2022-11-01T15:23:18.7262520Z ##[endgroup]
+2022-11-01T15:23:18.7263398Z ##[group]Determining the checkout info
+2022-11-01T15:23:18.7264882Z ##[endgroup]
+2022-11-01T15:23:18.7274145Z ##[group]Checking out the ref
+2022-11-01T15:23:18.7275402Z [command]/usr/bin/git checkout --progress --force refs/remotes/pull/70980/merge
+2022-11-01T15:23:19.8646383Z Updating files: 63% (7322/11595)
+2022-11-01T15:23:19.8892263Z Updating files: 64% (7421/11595)
+2022-11-01T15:23:19.9117598Z Updating files: 65% (7537/11595)
+2022-11-01T15:23:19.9395000Z Updating files: 66% (7653/11595)
+2022-11-01T15:23:19.9581108Z Updating files: 67% (7769/11595)
+2022-11-01T15:23:19.9854108Z Updating files: 68% (7885/11595)
+2022-11-01T15:23:20.0092896Z Updating files: 69% (8001/11595)
+2022-11-01T15:23:20.0541265Z Updating files: 70% (8117/11595)
+2022-11-01T15:23:20.0650681Z Updating files: 71% (8233/11595)
+2022-11-01T15:23:20.0764955Z Updating files: 72% (8349/11595)
+2022-11-01T15:23:20.0853895Z Updating files: 73% (8465/11595)
+2022-11-01T15:23:20.0939233Z Updating files: 74% (8581/11595)
+2022-11-01T15:23:20.0992172Z Updating files: 75% (8697/11595)
+2022-11-01T15:23:20.1498757Z Updating files: 76% (8813/11595)
+2022-11-01T15:23:20.1610877Z Updating files: 77% (8929/11595)
+2022-11-01T15:23:20.1643521Z Updating files: 78% (9045/11595)
+2022-11-01T15:23:20.1892978Z Updating files: 79% (9161/11595)
+2022-11-01T15:23:20.1990867Z Updating files: 80% (9276/11595)
+2022-11-01T15:23:20.2065881Z Updating files: 81% (9392/11595)
+2022-11-01T15:23:20.2137892Z Updating files: 82% (9508/11595)
+2022-11-01T15:23:20.2198085Z Updating files: 83% (9624/11595)
+2022-11-01T15:23:20.2257645Z Updating files: 84% (9740/11595)
+2022-11-01T15:23:20.2323160Z Updating files: 85% (9856/11595)
+2022-11-01T15:23:20.2380577Z Updating files: 86% (9972/11595)
+2022-11-01T15:23:20.2444393Z Updating files: 87% (10088/11595)
+2022-11-01T15:23:20.2544182Z Updating files: 88% (10204/11595)
+2022-11-01T15:23:20.2807288Z Updating files: 89% (10320/11595)
+2022-11-01T15:23:20.2939799Z Updating files: 90% (10436/11595)
+2022-11-01T15:23:20.3191983Z Updating files: 91% (10552/11595)
+2022-11-01T15:23:20.3258456Z Updating files: 92% (10668/11595)
+2022-11-01T15:23:20.3340985Z Updating files: 93% (10784/11595)
+2022-11-01T15:23:20.3423637Z Updating files: 94% (10900/11595)
+2022-11-01T15:23:20.3500577Z Updating files: 95% (11016/11595)
+2022-11-01T15:23:20.3558683Z Updating files: 96% (11132/11595)
+2022-11-01T15:23:20.3634870Z Updating files: 97% (11248/11595)
+2022-11-01T15:23:20.3814012Z Updating files: 98% (11364/11595)
+2022-11-01T15:23:20.3892119Z Updating files: 99% (11480/11595)
+2022-11-01T15:23:20.3892548Z Updating files: 100% (11595/11595)
+2022-11-01T15:23:20.3892853Z Updating files: 100% (11595/11595), done.
+2022-11-01T15:23:20.4056043Z Note: switching to 'refs/remotes/pull/70980/merge'.
+2022-11-01T15:23:20.4056307Z
+2022-11-01T15:23:20.4056668Z You are in 'detached HEAD' state. You can look around, make experimental
+2022-11-01T15:23:20.4057485Z changes and commit them, and you can discard any commits you make in this
+2022-11-01T15:23:20.4058470Z state without impacting any branches by switching back to a branch.
+2022-11-01T15:23:20.4058838Z
+2022-11-01T15:23:20.4059084Z If you want to create a new branch to retain commits you create, you may
+2022-11-01T15:23:20.4060410Z do so (now or later) by using -c with the switch command. Example:
+2022-11-01T15:23:20.4060709Z
+2022-11-01T15:23:20.4061092Z git switch -c
+2022-11-01T15:23:20.4061268Z
+2022-11-01T15:23:20.4061433Z Or undo this operation with:
+2022-11-01T15:23:20.4061641Z
+2022-11-01T15:23:20.4061781Z git switch -
+2022-11-01T15:23:20.4061964Z
+2022-11-01T15:23:20.4062222Z Turn off this advice by setting config variable advice.detachedHead to false
+2022-11-01T15:23:20.4062504Z
+2022-11-01T15:23:20.4062736Z HEAD is now at 90d5821 Merge 1cb3ad143b2bd2b6467c31b7f52299c77448f1ee into 6ccb95a4ea337422d5d29cd85f5267e4c867ccff
+2022-11-01T15:23:20.4116386Z ##[endgroup]
+2022-11-01T15:23:20.4158288Z [command]/usr/bin/git log -1 --format='%H'
+2022-11-01T15:23:20.4192267Z '90d58213531368fd97e9955fe80b75ad69c20f24'
+2022-11-01T15:23:20.4605705Z ##[group]Run actions/cache@v3
+2022-11-01T15:23:20.4606069Z with:
+2022-11-01T15:23:20.4606290Z path: ~/BYOND
+2022-11-01T15:23:20.4606834Z key: Linux-byond-
+2022-11-01T15:23:20.4607271Z ##[endgroup]
+2022-11-01T15:23:22.1816608Z Received 0 of 4090426 (0.0%), 0.0 MBs/sec
+2022-11-01T15:23:22.2496035Z Received 4090426 of 4090426 (100.0%), 3.6 MBs/sec
+2022-11-01T15:23:22.2497318Z Cache Size: ~4 MB (4090426 B)
+2022-11-01T15:23:22.2526348Z [command]/usr/bin/tar --use-compress-program unzstd -xf /home/runner/work/_temp/6dd95125-b59e-4597-b8ee-6c3714735e91/cache.tzst -P -C /home/runner/work/tgstation/tgstation
+2022-11-01T15:23:22.3064448Z Cache restored successfully
+2022-11-01T15:23:22.4635256Z Cache restored from key: Linux-byond-
+2022-11-01T15:23:22.4810323Z ##[group]Run sudo systemctl start mysql
+2022-11-01T15:23:22.4810903Z [36;1msudo systemctl start mysql[0m
+2022-11-01T15:23:22.4811432Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci;'[0m
+2022-11-01T15:23:22.4811815Z [36;1mmysql -u root -proot tg_ci < SQL/tgstation_schema.sql[0m
+2022-11-01T15:23:22.4812211Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;'[0m
+2022-11-01T15:23:22.4812696Z [36;1mmysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql[0m
+2022-11-01T15:23:22.4876848Z shell: /usr/bin/bash -e {0}
+2022-11-01T15:23:22.4877477Z ##[endgroup]
+2022-11-01T15:23:27.2625132Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-01T15:23:27.3956584Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-01T15:23:28.2604742Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-01T15:23:28.2716557Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-01T15:23:29.0145539Z ##[group]Run sudo dpkg --add-architecture i386
+2022-11-01T15:23:29.0145924Z [36;1msudo dpkg --add-architecture i386[0m
+2022-11-01T15:23:29.0146204Z [36;1msudo apt update || true[0m
+2022-11-01T15:23:29.0146531Z [36;1msudo apt install -o APT::Immediate-Configure=false libssl1.1:i386[0m
+2022-11-01T15:23:29.0146860Z [36;1mbash tools/ci/install_rust_g.sh[0m
+2022-11-01T15:23:29.0208114Z shell: /usr/bin/bash -e {0}
+2022-11-01T15:23:29.0208371Z ##[endgroup]
+2022-11-01T15:23:29.3467028Z
+2022-11-01T15:23:29.3467957Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
+2022-11-01T15:23:29.3470221Z
+2022-11-01T15:23:29.4665471Z Hit:1 http://azure.archive.ubuntu.com/ubuntu focal InRelease
+2022-11-01T15:23:29.4669512Z Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
+2022-11-01T15:23:29.4687773Z Get:3 http://azure.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
+2022-11-01T15:23:29.4702492Z Get:4 http://azure.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
+2022-11-01T15:23:29.4705529Z Get:5 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease [10.5 kB]
+2022-11-01T15:23:29.7585400Z Get:6 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 Packages [745 kB]
+2022-11-01T15:23:29.7767685Z Get:7 http://azure.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2196 kB]
+2022-11-01T15:23:29.8010173Z Get:8 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [972 kB]
+2022-11-01T15:23:29.8070363Z Hit:9 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal InRelease
+2022-11-01T15:23:29.8211172Z Get:10 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe i386 Packages [697 kB]
+2022-11-01T15:23:29.9292317Z Get:11 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe i386 Packages [13.5 kB]
+2022-11-01T15:23:29.9315932Z Get:12 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [24.0 kB]
+2022-11-01T15:23:29.9324114Z Get:13 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe amd64 c-n-f Metadata [864 B]
+2022-11-01T15:23:30.0626789Z Get:14 https://packages.microsoft.com/ubuntu/20.04/prod focal/main arm64 Packages [45.2 kB]
+2022-11-01T15:23:30.0677343Z Get:15 https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages [204 kB]
+2022-11-01T15:23:30.2127695Z Get:16 http://azure.archive.ubuntu.com/ubuntu focal-security/main amd64 Packages [1821 kB]
+2022-11-01T15:23:30.2296608Z Get:17 http://azure.archive.ubuntu.com/ubuntu focal-security/main amd64 c-n-f Metadata [11.2 kB]
+2022-11-01T15:23:30.2329110Z Get:18 http://azure.archive.ubuntu.com/ubuntu focal-security/universe amd64 Packages [743 kB]
+2022-11-01T15:23:30.2861057Z Get:19 http://azure.archive.ubuntu.com/ubuntu focal-security/universe amd64 c-n-f Metadata [15.3 kB]
+2022-11-01T15:23:30.6239298Z Get:20 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 Packages [15.2 kB]
+2022-11-01T15:23:46.7853764Z Fetched 7851 kB in 2s (4993 kB/s)
+2022-11-01T15:23:48.1966173Z Reading package lists...
+2022-11-01T15:23:48.4655905Z Building dependency tree...
+2022-11-01T15:23:48.4674811Z Reading state information...
+2022-11-01T15:23:48.6158045Z 30 packages can be upgraded. Run 'apt list --upgradable' to see them.
+2022-11-01T15:23:48.6289670Z
+2022-11-01T15:23:48.6290570Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
+2022-11-01T15:23:48.6290875Z
+2022-11-01T15:23:48.7009344Z Reading package lists...
+2022-11-01T15:23:48.9786347Z Building dependency tree...
+2022-11-01T15:23:48.9806498Z Reading state information...
+2022-11-01T15:23:49.1908267Z The following additional packages will be installed:
+2022-11-01T15:23:49.1909169Z gcc-11-base:i386 libc6:i386 libcrypt1:i386 libgcc-s1 libgcc-s1:i386
+2022-11-01T15:23:49.1909925Z libidn2-0:i386 libunistring2:i386
+2022-11-01T15:23:49.1917188Z Suggested packages:
+2022-11-01T15:23:49.1918006Z glibc-doc:i386 locales:i386
+2022-11-01T15:23:49.2785536Z The following NEW packages will be installed:
+2022-11-01T15:23:49.2789401Z gcc-11-base:i386 libc6:i386 libcrypt1:i386 libgcc-s1:i386 libidn2-0:i386
+2022-11-01T15:23:49.2793380Z libssl1.1:i386 libunistring2:i386
+2022-11-01T15:23:49.2799841Z The following packages will be upgraded:
+2022-11-01T15:23:49.2804848Z libgcc-s1
+2022-11-01T15:23:49.3261093Z 1 upgraded, 7 newly installed, 0 to remove and 29 not upgraded.
+2022-11-01T15:23:49.4742625Z Need to get 4528 kB of archives.
+2022-11-01T15:23:49.4743198Z After this operation, 19.3 MB of additional disk space will be used.
+2022-11-01T15:23:49.4744237Z Get:1 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libcrypt1 i386 1:4.4.10-10ubuntu4 [90.9 kB]
+2022-11-01T15:23:49.6579955Z Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 libc6 i386 2.31-0ubuntu9.9 [2580 kB]
+2022-11-01T15:23:49.6658233Z Get:3 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 gcc-11-base i386 11.1.0-1ubuntu1~20.04 [19.0 kB]
+2022-11-01T15:23:50.0902580Z Get:4 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main amd64 libgcc-s1 amd64 11.1.0-1ubuntu1~20.04 [42.1 kB]
+2022-11-01T15:23:50.1227741Z Get:5 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libunistring2 i386 0.9.10-2 [377 kB]
+2022-11-01T15:23:50.2138856Z Get:6 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libidn2-0 i386 2.2.0-2 [51.4 kB]
+2022-11-01T15:23:50.2991668Z Get:7 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 libssl1.1 i386 1.1.1f-1ubuntu2.16 [1318 kB]
+2022-11-01T15:23:50.5116502Z Get:8 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 libgcc-s1 i386 11.1.0-1ubuntu1~20.04 [50.0 kB]
+2022-11-01T15:23:51.2386768Z Preconfiguring packages ...
+2022-11-01T15:23:51.3495462Z Fetched 4528 kB in 1s (3176 kB/s)
+2022-11-01T15:23:51.3919752Z Selecting previously unselected package gcc-11-base:i386.
+2022-11-01T15:23:51.4344862Z (Reading database ...
+2022-11-01T15:23:51.4345195Z (Reading database ... 5%
+2022-11-01T15:23:51.4345492Z (Reading database ... 10%
+2022-11-01T15:23:51.4346277Z (Reading database ... 15%
+2022-11-01T15:23:51.4346554Z (Reading database ... 20%
+2022-11-01T15:23:51.4346817Z (Reading database ... 25%
+2022-11-01T15:23:51.4347410Z (Reading database ... 30%
+2022-11-01T15:23:51.4347706Z (Reading database ... 35%
+2022-11-01T15:23:51.4348099Z (Reading database ... 40%
+2022-11-01T15:23:51.4348378Z (Reading database ... 45%
+2022-11-01T15:23:51.4348637Z (Reading database ... 50%
+2022-11-01T15:23:51.4934309Z (Reading database ... 55%
+2022-11-01T15:23:51.5685431Z (Reading database ... 60%
+2022-11-01T15:23:51.6482633Z (Reading database ... 65%
+2022-11-01T15:23:51.7528420Z (Reading database ... 70%
+2022-11-01T15:23:51.9010214Z (Reading database ... 75%
+2022-11-01T15:23:52.0151477Z (Reading database ... 80%
+2022-11-01T15:23:52.1096967Z (Reading database ... 85%
+2022-11-01T15:23:52.2608875Z (Reading database ... 90%
+2022-11-01T15:23:52.3661328Z (Reading database ... 95%
+2022-11-01T15:23:52.3661629Z (Reading database ... 100%
+2022-11-01T15:23:52.3661963Z (Reading database ... 242126 files and directories currently installed.)
+2022-11-01T15:23:52.3810032Z Preparing to unpack .../0-gcc-11-base_11.1.0-1ubuntu1~20.04_i386.deb ...
+2022-11-01T15:23:52.3842110Z Unpacking gcc-11-base:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-01T15:23:52.6152846Z Preparing to unpack .../1-libgcc-s1_11.1.0-1ubuntu1~20.04_amd64.deb ...
+2022-11-01T15:23:52.7192789Z Unpacking libgcc-s1:amd64 (11.1.0-1ubuntu1~20.04) over (10.3.0-1ubuntu1~20.04) ...
+2022-11-01T15:23:52.7808541Z Selecting previously unselected package libgcc-s1:i386.
+2022-11-01T15:23:52.8066352Z Preparing to unpack .../2-libgcc-s1_11.1.0-1ubuntu1~20.04_i386.deb ...
+2022-11-01T15:23:52.8100949Z Unpacking libgcc-s1:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-01T15:23:52.8534885Z Selecting previously unselected package libcrypt1:i386.
+2022-11-01T15:23:52.8817109Z Preparing to unpack .../3-libcrypt1_1%3a4.4.10-10ubuntu4_i386.deb ...
+2022-11-01T15:23:52.8847883Z Unpacking libcrypt1:i386 (1:4.4.10-10ubuntu4) ...
+2022-11-01T15:23:53.0566375Z Selecting previously unselected package libc6:i386.
+2022-11-01T15:23:53.0861196Z Preparing to unpack .../4-libc6_2.31-0ubuntu9.9_i386.deb ...
+2022-11-01T15:23:53.2571404Z Unpacking libc6:i386 (2.31-0ubuntu9.9) ...
+2022-11-01T15:23:53.7102365Z Replacing files in old package libc6-i386 (2.31-0ubuntu9.9) ...
+2022-11-01T15:23:53.8128077Z Selecting previously unselected package libunistring2:i386.
+2022-11-01T15:23:53.8390204Z Preparing to unpack .../5-libunistring2_0.9.10-2_i386.deb ...
+2022-11-01T15:23:53.8406925Z Unpacking libunistring2:i386 (0.9.10-2) ...
+2022-11-01T15:23:54.3087452Z Selecting previously unselected package libidn2-0:i386.
+2022-11-01T15:23:54.3331996Z Preparing to unpack .../6-libidn2-0_2.2.0-2_i386.deb ...
+2022-11-01T15:23:54.4067995Z Unpacking libidn2-0:i386 (2.2.0-2) ...
+2022-11-01T15:23:55.0668783Z Selecting previously unselected package libssl1.1:i386.
+2022-11-01T15:23:55.0979147Z Preparing to unpack .../7-libssl1.1_1.1.1f-1ubuntu2.16_i386.deb ...
+2022-11-01T15:23:55.1128241Z Unpacking libssl1.1:i386 (1.1.1f-1ubuntu2.16) ...
+2022-11-01T15:23:55.5915523Z Setting up gcc-11-base:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-01T15:23:55.6480293Z Setting up libgcc-s1:amd64 (11.1.0-1ubuntu1~20.04) ...
+2022-11-01T15:23:55.7536432Z Setting up libgcc-s1:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-01T15:23:55.8152741Z Setting up libcrypt1:i386 (1:4.4.10-10ubuntu4) ...
+2022-11-01T15:23:55.9483752Z Setting up libc6:i386 (2.31-0ubuntu9.9) ...
+2022-11-01T15:23:56.2906587Z Setting up libssl1.1:i386 (1.1.1f-1ubuntu2.16) ...
+2022-11-01T15:23:56.4402654Z Setting up libunistring2:i386 (0.9.10-2) ...
+2022-11-01T15:23:56.4473735Z Setting up libidn2-0:i386 (2.2.0-2) ...
+2022-11-01T15:23:56.4556493Z Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
+2022-11-01T15:24:19.5231907Z 2022-11-01 15:24:19 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/127494547/92c6bbfc-0d51-48ea-b586-9cd01c071d25?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221101T152419Z&X-Amz-Expires=300&X-Amz-Signature=096796f299665e0b83404bf48a3be6669d780d8bafabb5a18038d4e1de323277&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=127494547&response-content-disposition=attachment%3B%20filename%3Dlibrust_g.so&response-content-type=application%2Foctet-stream [72809008/72809008] -> "/home/runner/.byond/bin/librust_g.so" [1]
+2022-11-01T15:24:19.5331036Z linux-gate.so.1 (0xf7f93000)
+2022-11-01T15:24:19.5332151Z libssl.so.1.1 => /lib/i386-linux-gnu/libssl.so.1.1 (0xf77c5000)
+2022-11-01T15:24:19.5332758Z libcrypto.so.1.1 => /lib/i386-linux-gnu/libcrypto.so.1.1 (0xf750d000)
+2022-11-01T15:24:19.5335819Z libz.so.1 => /lib32/libz.so.1 (0xf74ef000)
+2022-11-01T15:24:19.5336449Z libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf74d0000)
+2022-11-01T15:24:19.5337053Z libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf74ad000)
+2022-11-01T15:24:19.5338254Z libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf73a8000)
+2022-11-01T15:24:19.5343540Z libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf73a2000)
+2022-11-01T15:24:19.5344153Z libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf71b3000)
+2022-11-01T15:24:19.5344637Z /lib/ld-linux.so.2 (0xf7f95000)
+2022-11-01T15:24:19.5376954Z ##[group]Run bash tools/ci/install_auxlua.sh
+2022-11-01T15:24:19.5377389Z [36;1mbash tools/ci/install_auxlua.sh[0m
+2022-11-01T15:24:19.5438035Z shell: /usr/bin/bash -e {0}
+2022-11-01T15:24:19.5438277Z ##[endgroup]
+2022-11-01T15:24:20.0520918Z 2022-11-01 15:24:20 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/473295481/bb55dc2f-8248-4032-ad66-b80cb61a84f3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221101%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221101T152408Z&X-Amz-Expires=300&X-Amz-Signature=f0ea96a2ae5093c3051eb36ca625d0917a1cc9e11ecef63953f9837499a4b7be&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=473295481&response-content-disposition=attachment%3B%20filename%3Dlibauxlua.so&response-content-type=application%2Foctet-stream [5781068/5781068] -> "/home/runner/.byond/bin/libauxlua.so" [1]
+2022-11-01T15:24:20.0637194Z linux-gate.so.1 (0xf7ed0000)
+2022-11-01T15:24:20.0638001Z libstdc++.so.6 => /lib32/libstdc++.so.6 (0xf7ac9000)
+2022-11-01T15:24:20.0638990Z libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7aaa000)
+2022-11-01T15:24:20.0639537Z libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7a87000)
+2022-11-01T15:24:20.0640086Z libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7982000)
+2022-11-01T15:24:20.0640535Z libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf797c000)
+2022-11-01T15:24:20.0641053Z libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf778d000)
+2022-11-01T15:24:20.0641431Z /lib/ld-linux.so.2 (0xf7ed2000)
+2022-11-01T15:24:20.0687471Z ##[group]Run bash tools/ci/install_byond.sh
+2022-11-01T15:24:20.0691349Z [36;1mbash tools/ci/install_byond.sh[0m
+2022-11-01T15:24:20.0691690Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2022-11-01T15:24:20.0692049Z [36;1mtools/build/build --ci dm -DCIBUILDING -DANSICOLORS[0m
+2022-11-01T15:24:20.0788693Z shell: /usr/bin/bash -e {0}
+2022-11-01T15:24:20.0788944Z ##[endgroup]
+2022-11-01T15:24:20.0904985Z Setting up BYOND.
+2022-11-01T15:24:20.1285049Z % Total % Received % Xferd Average Speed Time Time Time Current
+2022-11-01T15:24:20.1288558Z Dload Upload Total Spent Left Speed
+2022-11-01T15:24:20.1289906Z
+2022-11-01T15:24:20.2648629Z 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
+2022-11-01T15:24:20.2651476Z 100 4021k 100 4021k 0 0 28.8M 0 --:--:-- --:--:-- --:--:-- 28.8M
+2022-11-01T15:24:20.2868719Z Archive: byond.zip
+2022-11-01T15:24:20.2869523Z creating: byond/
+2022-11-01T15:24:20.2872392Z creating: byond/key/
+2022-11-01T15:24:20.2872809Z creating: byond/web/
+2022-11-01T15:24:20.2873278Z inflating: byond/web/child.dms
+2022-11-01T15:24:20.2873868Z inflating: byond/web/button.dms
+2022-11-01T15:24:20.2874291Z inflating: byond/web/input.dms
+2022-11-01T15:24:20.2874708Z inflating: byond/web/text.dms
+2022-11-01T15:24:20.2990682Z inflating: byond/web/webclient.dart.js
+2022-11-01T15:24:20.2991338Z inflating: byond/web/verbmenu.dms
+2022-11-01T15:24:20.2992247Z inflating: byond/web/defaultSkin.dms
+2022-11-01T15:24:20.2994907Z inflating: byond/web/hotbar.dms
+2022-11-01T15:24:20.2995370Z inflating: byond/web/label.dms
+2022-11-01T15:24:20.2997432Z inflating: byond/web/alert.dms
+2022-11-01T15:24:20.3045767Z inflating: byond/web/message.dms
+2022-11-01T15:24:20.3046084Z inflating: byond/web/drag.png
+2022-11-01T15:24:20.3046357Z inflating: byond/web/map.dms
+2022-11-01T15:24:20.3046639Z inflating: byond/web/splashlogo.png
+2022-11-01T15:24:20.3046920Z inflating: byond/web/drop.png
+2022-11-01T15:24:20.3109752Z inflating: byond/web/ext.js
+2022-11-01T15:24:20.3110039Z inflating: byond/web/file.dms
+2022-11-01T15:24:20.3110743Z inflating: byond/web/grid.dms
+2022-11-01T15:24:20.3112568Z inflating: byond/web/bar.dms
+2022-11-01T15:24:20.3116279Z inflating: byond/web/dpad.dms
+2022-11-01T15:24:20.3117768Z inflating: byond/web/output.dms
+2022-11-01T15:24:20.3118380Z inflating: byond/web/tab.dms
+2022-11-01T15:24:20.3121184Z inflating: byond/web/info.dms
+2022-11-01T15:24:20.3125342Z inflating: byond/web/color.dms
+2022-11-01T15:24:20.3127736Z inflating: byond/web/gamepad.dms
+2022-11-01T15:24:20.3129918Z inflating: byond/web/browser.dms
+2022-11-01T15:24:20.3130867Z inflating: byond/web/status.dms
+2022-11-01T15:24:20.3131904Z inflating: byond/web/any.dms
+2022-11-01T15:24:20.3133198Z inflating: byond/web/pane.dms
+2022-11-01T15:24:20.3134980Z inflating: byond/web/pop.dms
+2022-11-01T15:24:20.3136094Z inflating: byond/license.txt
+2022-11-01T15:24:20.3136925Z inflating: byond/legal.txt
+2022-11-01T15:24:20.3138018Z inflating: byond/Makefile
+2022-11-01T15:24:20.3138748Z creating: byond/man/
+2022-11-01T15:24:20.3140374Z creating: byond/man/man6/
+2022-11-01T15:24:20.3140865Z inflating: byond/man/man6/DreamDaemon.6
+2022-11-01T15:24:20.3142127Z inflating: byond/man/man6/DreamMaker.6
+2022-11-01T15:24:20.3149532Z creating: byond/lib/
+2022-11-01T15:24:20.3149763Z creating: byond/host/
+2022-11-01T15:24:20.3150009Z inflating: byond/host/readme.html
+2022-11-01T15:24:20.3150561Z inflating: byond/host/readme-unix.txt
+2022-11-01T15:24:20.3150816Z creating: byond/host/home/
+2022-11-01T15:24:20.3151052Z creating: byond/host/home/root/
+2022-11-01T15:24:20.3151304Z creating: byond/host/home/root/byond/
+2022-11-01T15:24:20.3151781Z creating: byond/host/home/root/byond/tools/
+2022-11-01T15:24:20.3152089Z creating: byond/host/home/root/byond/tools/root/
+2022-11-01T15:24:20.3153050Z inflating: byond/host/home/root/byond/tools/root/root.dmb
+2022-11-01T15:24:20.3154330Z creating: byond/host/shared/
+2022-11-01T15:24:20.3155440Z creating: byond/host/shared/byond/
+2022-11-01T15:24:20.3156763Z creating: byond/host/shared/byond/tools/
+2022-11-01T15:24:20.3157942Z creating: byond/host/shared/byond/tools/ftp/
+2022-11-01T15:24:20.3159544Z inflating: byond/host/shared/byond/tools/ftp/ftp.dmb
+2022-11-01T15:24:20.3159981Z creating: byond/host/shared/byond/tools/admin/
+2022-11-01T15:24:20.3172339Z inflating: byond/host/shared/byond/tools/admin/admin.dmb
+2022-11-01T15:24:20.3172798Z creating: byond/host/shared-web/
+2022-11-01T15:24:20.3173421Z creating: byond/host/shared-web/web/
+2022-11-01T15:24:20.3173784Z creating: byond/host/shared-web/web/tools/
+2022-11-01T15:24:20.3174165Z creating: byond/host/shared-web/web/tools/admin/
+2022-11-01T15:24:20.3176681Z inflating: byond/host/shared-web/web/tools/admin/index.dmb
+2022-11-01T15:24:20.3186829Z inflating: byond/host/host.dmb
+2022-11-01T15:24:20.3187123Z inflating: byond/host/host.start
+2022-11-01T15:24:20.3188445Z inflating: byond/host/hostconf.orig
+2022-11-01T15:24:20.3189903Z inflating: byond/host/hostconf.txt
+2022-11-01T15:24:20.3191949Z inflating: byond/readme.txt
+2022-11-01T15:24:20.3192209Z creating: byond/bin/
+2022-11-01T15:24:20.3193769Z inflating: byond/bin/byondexec
+2022-11-01T15:24:20.3195439Z inflating: byond/bin/DreamDownload
+2022-11-01T15:24:20.3908232Z inflating: byond/bin/libbyond.so
+2022-11-01T15:24:20.4069319Z inflating: byond/bin/libext.so
+2022-11-01T15:24:20.4073220Z inflating: byond/bin/DreamDaemon
+2022-11-01T15:24:20.4080176Z inflating: byond/bin/DreamMaker
+2022-11-01T15:24:20.4080431Z creating: byond/cfg/
+2022-11-01T15:24:20.4080676Z inflating: byond/cfg/release.txt
+2022-11-01T15:24:20.4266638Z ***************************
+2022-11-01T15:24:20.4273089Z Now run the following command:
+2022-11-01T15:24:20.4285743Z
+2022-11-01T15:24:20.4296269Z source /home/runner/BYOND/byond/bin/byondsetup
+2022-11-01T15:24:20.4307061Z
+2022-11-01T15:24:20.4314771Z If it generates errors, your shell is not compatible with 'sh', so you will
+2022-11-01T15:24:20.4321421Z have to edit byondsetup and make it work with your shell. If the script works, you should be able to run DreamDaemon.
+2022-11-01T15:24:20.4332109Z
+2022-11-01T15:24:20.4340024Z IMPORTANT: once you have the script working, you must add the above line
+2022-11-01T15:24:20.4346843Z to your startup script. The name of your startup script depends on the
+2022-11-01T15:24:20.4352983Z shell you use. Typical ones are .profile or .bash_profile.
+2022-11-01T15:24:20.4363091Z
+2022-11-01T15:24:20.4371649Z Once everything is working, you can find out more about the software
+2022-11-01T15:24:20.4381742Z by doing 'man DreamDaemon'. A host server has also been included
+2022-11-01T15:24:20.4389897Z so edit host/hostconf.txt and boot up your world server!
+2022-11-01T15:24:20.4400150Z ***************************
+2022-11-01T15:24:21.3481300Z Using system-wide Node v16.18.0
+2022-11-01T15:24:22.7088337Z :: Juke Build version 0.8.1
+2022-11-01T15:24:23.2208661Z => Starting 'dm'
+2022-11-01T15:24:23.2218632Z :: Using defines: CBT, CIBUILDING, ANSICOLORS
+2022-11-01T15:24:23.6167555Z DM compiler version 514.1588
+2022-11-01T15:24:23.6168274Z loading tgstation.m.dme
+2022-11-01T15:24:34.0461685Z loading interface/skin.dmf
+2022-11-01T15:25:38.2374769Z loading map_files/generic/CentCom.dmm
+2022-11-01T15:25:39.2778196Z saving tgstation.m.dmb (DEBUG mode)
+2022-11-01T15:25:40.4869514Z tgstation.m.dmb - 0 errors, 0 warnings (11/1/22 3:25 pm)
+2022-11-01T15:25:40.4869848Z Total time: 1:17
+2022-11-01T15:25:41.7065548Z => Finished 'dm' in 78.486s
+2022-11-01T15:25:41.7070924Z => Done in 78.995s
+2022-11-01T15:25:41.7168392Z ##[group]Run source $HOME/BYOND/byond/bin/byondsetup
+2022-11-01T15:25:41.7168778Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2022-11-01T15:25:41.7169083Z [36;1mbash tools/ci/run_server.sh tramstation[0m
+2022-11-01T15:25:41.7233910Z shell: /usr/bin/bash -e {0}
+2022-11-01T15:25:41.7234485Z ##[endgroup]
+2022-11-01T15:25:41.7349856Z Testing tramstation
+2022-11-01T15:25:42.0259046Z cp: cannot stat 'tgui/packages/tgfont/dist/*': No such file or directory
+2022-11-01T15:25:42.0443276Z Tue Nov 1 15:25:42 2022
+2022-11-01T15:25:42.0444066Z World opened on network port 53835.
+2022-11-01T15:25:42.0446892Z Welcome BYOND! (5.0 Public Version 514.1588)
+2022-11-01T15:26:04.0921674Z 865 global variables
+2022-11-01T15:26:04.9224562Z World loaded at 15:26:04!
+2022-11-01T15:26:04.9749013Z Running /tg/ revision:
+2022-11-01T15:26:04.9749563Z No commit information
+2022-11-01T15:26:04.9837092Z Loading config file config.txt...
+2022-11-01T15:26:04.9841145Z Loading config file maps.txt...
+2022-11-01T15:26:04.9868634Z Unable to locate admins backup file.
+2022-11-01T15:26:06.0048294Z Initialized Title Screen subsystem within 0 seconds!
+2022-11-01T15:26:06.0049007Z Initialized Server Tasks subsystem within 0 seconds!
+2022-11-01T15:26:06.0049497Z Initialized Input subsystem within 0 seconds!
+2022-11-01T15:26:06.0125643Z Initialized Profiler subsystem within 0 seconds!
+2022-11-01T15:26:06.0126234Z Initialized Database subsystem within 0 seconds!
+2022-11-01T15:26:06.0126723Z Initialized Blackbox subsystem within 0 seconds!
+2022-11-01T15:26:06.0129042Z Initialized Sounds subsystem within 0 seconds!
+2022-11-01T15:26:06.0301324Z Initialized Instruments subsystem within 0.02 seconds!
+2022-11-01T15:26:06.4428754Z Initialized Greyscale subsystem within 0.41 seconds!
+2022-11-01T15:26:06.4429170Z Initialized Vis contents overlays subsystem within 0 seconds!
+2022-11-01T15:26:06.4429549Z Initialized Security Level subsystem within 0 seconds!
+2022-11-01T15:26:06.4465567Z Initialized Station subsystem within 0 seconds!
+2022-11-01T15:26:06.4465936Z Initialized Quirks subsystem within 0 seconds!
+2022-11-01T15:26:06.4599231Z Initialized Reagents subsystem within 0.01 seconds!
+2022-11-01T15:26:06.4603336Z Initialized Events subsystem within 0 seconds!
+2022-11-01T15:26:06.4668892Z Initialized IDs and Access subsystem within 0.01 seconds!
+2022-11-01T15:26:06.4669458Z Initialized Jobs subsystem within 0 seconds!
+2022-11-01T15:26:06.4670198Z Initialized AI movement subsystem within 0 seconds!
+2022-11-01T15:26:06.4693524Z Initialized Ticker subsystem within 0 seconds!
+2022-11-01T15:26:06.4698134Z Initialized AI Controller Ticker subsystem within 0 seconds!
+2022-11-01T15:26:06.4699769Z Initialized AI Behavior Ticker subsystem within 0 seconds!
+2022-11-01T15:26:06.4864335Z Initialized Trading Card Game subsystem within 0.02 seconds!
+2022-11-01T15:26:06.4867314Z Loading Tramstation...
+2022-11-01T15:26:09.0639832Z Loaded Station in 2.6s!
+2022-11-01T15:26:11.3030341Z Loaded Lavaland in 2.1s!
+2022-11-01T15:26:12.3779637Z Ruin loader finished with 0 left to spend.
+2022-11-01T15:26:12.4524433Z Ruin loader finished with 0 left to spend.
+2022-11-01T15:26:12.8605850Z Cave Generator finished in 0.4s!
+2022-11-01T15:26:12.9076303Z Cave Generator finished in 0.1s!
+2022-11-01T15:26:13.9109655Z Initialized Mapping subsystem within 7.42 seconds!
+2022-11-01T15:26:39.1717128Z The BYOND hub reports that port 53835 is not reachable.
+2022-11-01T15:26:42.3867216Z Initialized Early Assets subsystem within 28.47 seconds!
+2022-11-01T15:26:42.4328496Z Initialized Research subsystem within 0.05 seconds!
+2022-11-01T15:26:42.4331134Z Initialized Time Tracking subsystem within 0 seconds!
+2022-11-01T15:26:42.4436988Z Initialized Networks subsystem within 0.01 seconds!
+2022-11-01T15:26:42.4726624Z Initialized Spatial Grid subsystem within 0.03 seconds!
+2022-11-01T15:26:42.4728372Z Initialized Economy subsystem within 0 seconds!
+2022-11-01T15:26:42.4728944Z Initialized Restaurant subsystem within 0 seconds!
+2022-11-01T15:27:25.2172855Z ## NOTICE: morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!
+2022-11-01T15:27:25.7106020Z ## NOTICE: morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!
+2022-11-01T15:27:32.9578334Z Initialized Atoms subsystem within 50.48 seconds!
+2022-11-01T15:27:32.9805933Z Initialized Language subsystem within 0.01 seconds!
+2022-11-01T15:27:33.0740878Z Initialized Machines subsystem within 0.09 seconds!
+2022-11-01T15:27:33.0747270Z Initialized Skills subsystem within 0 seconds!
+2022-11-01T15:27:33.0750239Z Initialized Addiction subsystem within 0 seconds!
+2022-11-01T15:27:33.0763134Z Initialized Blackmarket subsystem within 0 seconds!
+2022-11-01T15:27:33.0772232Z Initialized Disease subsystem within 0 seconds!
+2022-11-01T15:27:33.0772589Z Initialized Fluid subsystem within 0 seconds!
+2022-11-01T15:27:33.0772923Z Initialized Smoke subsystem within 0 seconds!
+2022-11-01T15:27:33.0773294Z Initialized Foam subsystem within 0 seconds!
+2022-11-01T15:27:33.0773619Z Initialized Lag Switch subsystem within 0 seconds!
+2022-11-01T15:27:33.1054121Z Initialized Library Loading subsystem within 0.03 seconds!
+2022-11-01T15:27:33.4024857Z Initialized Lua Scripting subsystem within 0.3 seconds!
+2022-11-01T15:27:33.4027535Z Initialized Night Shift subsystem within 0 seconds!
+2022-11-01T15:27:33.4029596Z Initialized Sun subsystem within 0 seconds!
+2022-11-01T15:27:33.4063599Z Initialized Traitor subsystem within 0 seconds!
+2022-11-01T15:27:33.4335232Z Initialized Wardrobe subsystem within 0.03 seconds!
+2022-11-01T15:27:33.4336023Z Initialized Weather subsystem within 0 seconds!
+2022-11-01T15:27:33.4338457Z Initialized Wiremod Composite Templates subsystem within 0 seconds!
+2022-11-01T15:27:39.6841918Z Initialized Atmospherics subsystem within 6.25 seconds!
+2022-11-01T15:27:39.6858388Z Initialized Persistence subsystem within 0 seconds!
+2022-11-01T15:27:39.6861179Z Initialized Persistent Paintings subsystem within 0 seconds!
+2022-11-01T15:27:39.6864229Z Initialized Vote subsystem within 0 seconds!
+2022-11-01T15:27:53.6977895Z Initialized Assets subsystem within 14.01 seconds!
+2022-11-01T15:27:56.4493673Z Initialized Icon Smoothing subsystem within 2.75 seconds!
+2022-11-01T15:27:56.4505231Z Initialized XKeyScore subsystem within 0 seconds!
+2022-11-01T15:27:56.4524307Z Initialized PRISM subsystem within 0 seconds!
+2022-11-01T15:28:04.6339924Z Initialized Lighting subsystem within 8.18 seconds!
+2022-11-01T15:28:07.7698313Z Initialized Shuttle subsystem within 3.14 seconds!
+2022-11-01T15:28:07.7749093Z Initialized Pathfinder subsystem within 0 seconds!
+2022-11-01T15:28:07.7749434Z Initialized Ban Cache subsystem within 0 seconds!
+2022-11-01T15:28:07.7749744Z Initialized Init Profiler subsystem within 0 seconds!
+2022-11-01T15:28:07.7750061Z Initialized Chat subsystem within 0 seconds!
+2022-11-01T15:28:07.7750369Z Initializations complete within 121.7 seconds!
+2022-11-01T15:28:07.7824332Z Game start took 0s
+2022-11-01T15:28:18.9688166Z ##[group]/datum/unit_test/log_mapping
+2022-11-01T15:28:18.9688840Z
+2022-11-01T15:28:18.9691942Z [1;32mPASS[0m /datum/unit_test/log_mapping 0s
+2022-11-01T15:28:18.9692629Z ##[endgroup]
+2022-11-01T15:28:19.0858950Z ##[group]/datum/unit_test/ablative_hood_hud
+2022-11-01T15:28:19.1163124Z
+2022-11-01T15:28:19.1164826Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud 0.1s
+2022-11-01T15:28:19.1165814Z ##[endgroup]
+2022-11-01T15:28:19.1391399Z ##[group]/datum/unit_test/ablative_hood_hud_with_helmet
+2022-11-01T15:28:19.1679738Z
+2022-11-01T15:28:19.1680798Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud_with_helmet 0s
+2022-11-01T15:28:19.1684214Z ##[endgroup]
+2022-11-01T15:28:19.1915312Z ##[group]/datum/unit_test/achievements
+2022-11-01T15:28:19.2020908Z
+2022-11-01T15:28:19.2021795Z [1;32mPASS[0m /datum/unit_test/achievements 0.1s
+2022-11-01T15:28:19.2022783Z ##[endgroup]
+2022-11-01T15:28:19.2454845Z ##[group]/datum/unit_test/anchored_mobs
+2022-11-01T15:28:19.2456383Z
+2022-11-01T15:28:19.2457685Z [1;32mPASS[0m /datum/unit_test/anchored_mobs 0s
+2022-11-01T15:28:19.2458601Z ##[endgroup]
+2022-11-01T15:28:19.2632595Z ##[group]/datum/unit_test/anonymous_themes
+2022-11-01T15:28:19.4123645Z
+2022-11-01T15:28:19.4125365Z [1;32mPASS[0m /datum/unit_test/anonymous_themes 0.2s
+2022-11-01T15:28:19.4128592Z ##[endgroup]
+2022-11-01T15:28:19.6372545Z ##[group]/datum/unit_test/autowiki
+2022-11-01T15:28:21.1559221Z
+2022-11-01T15:28:21.1560055Z [1;32mPASS[0m /datum/unit_test/autowiki 1.5s
+2022-11-01T15:28:21.1560742Z ##[endgroup]
+2022-11-01T15:28:22.6418059Z ##[group]/datum/unit_test/autowiki_include_template
+2022-11-01T15:28:22.6418298Z
+2022-11-01T15:28:22.6419112Z [1;32mPASS[0m /datum/unit_test/autowiki_include_template 0s
+2022-11-01T15:28:22.6419629Z ##[endgroup]
+2022-11-01T15:28:22.6592281Z ##[group]/datum/unit_test/barsigns_icon
+2022-11-01T15:28:22.6850472Z
+2022-11-01T15:28:22.6851042Z [1;32mPASS[0m /datum/unit_test/barsigns_icon 0s
+2022-11-01T15:28:22.6851783Z ##[endgroup]
+2022-11-01T15:28:22.7025607Z ##[group]/datum/unit_test/barsigns_name
+2022-11-01T15:28:22.7025827Z
+2022-11-01T15:28:22.7026411Z [1;32mPASS[0m /datum/unit_test/barsigns_name 0s
+2022-11-01T15:28:22.7026869Z ##[endgroup]
+2022-11-01T15:28:22.7196300Z ##[group]/datum/unit_test/bespoke_id
+2022-11-01T15:28:22.7196495Z
+2022-11-01T15:28:22.7196933Z [1;32mPASS[0m /datum/unit_test/bespoke_id 0s
+2022-11-01T15:28:22.7197373Z ##[endgroup]
+2022-11-01T15:28:22.7528217Z ##[group]/datum/unit_test/binary_insert
+2022-11-01T15:28:22.7528455Z
+2022-11-01T15:28:22.7528943Z [1;32mPASS[0m /datum/unit_test/binary_insert 0s
+2022-11-01T15:28:22.7529444Z ##[endgroup]
+2022-11-01T15:28:22.7720960Z ##[group]/datum/unit_test/bloody_footprints
+2022-11-01T15:28:22.8157307Z
+2022-11-01T15:28:22.8158188Z [1;32mPASS[0m /datum/unit_test/bloody_footprints 0.1s
+2022-11-01T15:28:22.8158909Z ##[endgroup]
+2022-11-01T15:28:22.9653160Z ##[group]/datum/unit_test/breath_sanity
+2022-11-01T15:28:23.0154449Z
+2022-11-01T15:28:23.0155311Z [1;32mPASS[0m /datum/unit_test/breath_sanity 0.1s
+2022-11-01T15:28:23.0155975Z ##[endgroup]
+2022-11-01T15:28:23.0421572Z ##[group]/datum/unit_test/breath_sanity_plasmamen
+2022-11-01T15:28:23.0966156Z
+2022-11-01T15:28:23.0966990Z [1;32mPASS[0m /datum/unit_test/breath_sanity_plasmamen 0s
+2022-11-01T15:28:23.0967848Z ##[endgroup]
+2022-11-01T15:28:23.1238973Z ##[group]/datum/unit_test/breath_sanity_ashwalker
+2022-11-01T15:28:23.1864867Z
+2022-11-01T15:28:23.1865526Z [1;32mPASS[0m /datum/unit_test/breath_sanity_ashwalker 0s
+2022-11-01T15:28:23.1866107Z ##[endgroup]
+2022-11-01T15:28:23.2143094Z ##[group]/datum/unit_test/cable_powernets
+2022-11-01T15:28:23.2143293Z
+2022-11-01T15:28:23.2143753Z [1;32mPASS[0m /datum/unit_test/cable_powernets 0s
+2022-11-01T15:28:23.2144353Z ##[endgroup]
+2022-11-01T15:28:23.2296359Z ##[group]/datum/unit_test/card_mismatch
+2022-11-01T15:28:23.2339244Z
+2022-11-01T15:28:23.2339785Z [1;32mPASS[0m /datum/unit_test/card_mismatch 0s
+2022-11-01T15:28:23.2340711Z ##[endgroup]
+2022-11-01T15:28:23.3389441Z ##[group]/datum/unit_test/chain_pull_through_space
+2022-11-01T15:28:23.3417372Z
+2022-11-01T15:28:23.3428322Z [1;32mPASS[0m /datum/unit_test/chain_pull_through_space 0s
+2022-11-01T15:28:23.3429414Z ##[endgroup]
+2022-11-01T15:28:23.4797614Z ##[group]/datum/unit_test/chat_filter_sanity
+2022-11-01T15:28:23.4802389Z
+2022-11-01T15:28:23.4803303Z [1;32mPASS[0m /datum/unit_test/chat_filter_sanity 0s
+2022-11-01T15:28:23.4803804Z ##[endgroup]
+2022-11-01T15:28:23.4985708Z ##[group]/datum/unit_test/circuit_component_category
+2022-11-01T15:28:23.4985973Z
+2022-11-01T15:28:23.4986498Z [1;32mPASS[0m /datum/unit_test/circuit_component_category 0s
+2022-11-01T15:28:23.4987054Z ##[endgroup]
+2022-11-01T15:28:23.5170927Z ##[group]/datum/unit_test/closets
+2022-11-01T15:28:25.4385541Z
+2022-11-01T15:28:25.4386681Z [1;32mPASS[0m /datum/unit_test/closets 1.9s
+2022-11-01T15:28:25.4387368Z ##[endgroup]
+2022-11-01T15:28:28.6598884Z ##[group]/datum/unit_test/harm_punch
+2022-11-01T15:28:28.7131885Z
+2022-11-01T15:28:28.7132943Z [1;32mPASS[0m /datum/unit_test/harm_punch 0.1s
+2022-11-01T15:28:28.7134837Z ##[endgroup]
+2022-11-01T15:28:28.7421766Z ##[group]/datum/unit_test/harm_melee
+2022-11-01T15:28:28.7933680Z
+2022-11-01T15:28:28.7934808Z [1;32mPASS[0m /datum/unit_test/harm_melee 0s
+2022-11-01T15:28:28.7935540Z ##[endgroup]
+2022-11-01T15:28:28.8380921Z ##[group]/datum/unit_test/harm_different_damage
+2022-11-01T15:28:28.8975633Z
+2022-11-01T15:28:28.8976869Z [1;32mPASS[0m /datum/unit_test/harm_different_damage 0s
+2022-11-01T15:28:28.8977671Z ##[endgroup]
+2022-11-01T15:28:28.9761803Z ##[group]/datum/unit_test/attack_chain
+2022-11-01T15:28:29.0318227Z
+2022-11-01T15:28:29.0319454Z [1;32mPASS[0m /datum/unit_test/attack_chain 0.1s
+2022-11-01T15:28:29.0320200Z ##[endgroup]
+2022-11-01T15:28:29.0662718Z ##[group]/datum/unit_test/disarm
+2022-11-01T15:28:29.1273517Z
+2022-11-01T15:28:29.1275850Z [1;32mPASS[0m /datum/unit_test/disarm 0.1s
+2022-11-01T15:28:29.1276795Z ##[endgroup]
+2022-11-01T15:28:29.1606515Z ##[group]/datum/unit_test/component_duping
+2022-11-01T15:28:29.1606753Z
+2022-11-01T15:28:29.1607266Z [1;32mPASS[0m /datum/unit_test/component_duping 0s
+2022-11-01T15:28:29.1607745Z ##[endgroup]
+2022-11-01T15:28:29.1774627Z ##[group]/datum/unit_test/confusion_symptom
+2022-11-01T15:28:29.2032018Z
+2022-11-01T15:28:29.2033145Z [1;32mPASS[0m /datum/unit_test/confusion_symptom 0.1s
+2022-11-01T15:28:29.2033987Z ##[endgroup]
+2022-11-01T15:28:29.2246157Z ##[group]/datum/unit_test/connect_loc_basic
+2022-11-01T15:28:29.2248367Z
+2022-11-01T15:28:29.2249487Z [1;32mPASS[0m /datum/unit_test/connect_loc_basic 0s
+2022-11-01T15:28:29.2250109Z ##[endgroup]
+2022-11-01T15:28:29.2416396Z ##[group]/datum/unit_test/connect_loc_change_turf
+2022-11-01T15:28:29.2424538Z
+2022-11-01T15:28:29.2425333Z [1;32mPASS[0m /datum/unit_test/connect_loc_change_turf 0s
+2022-11-01T15:28:29.2425972Z ##[endgroup]
+2022-11-01T15:28:29.2592394Z ##[group]/datum/unit_test/connect_loc_multiple_on_turf
+2022-11-01T15:28:29.2599395Z
+2022-11-01T15:28:29.2599862Z [1;32mPASS[0m /datum/unit_test/connect_loc_multiple_on_turf 0s
+2022-11-01T15:28:29.2600716Z ##[endgroup]
+2022-11-01T15:28:29.2917858Z ##[group]/datum/unit_test/crayon_naming
+2022-11-01T15:28:29.2996631Z
+2022-11-01T15:28:29.2997310Z [1;32mPASS[0m /datum/unit_test/crayon_naming 0s
+2022-11-01T15:28:29.2997930Z ##[endgroup]
+2022-11-01T15:28:29.3177352Z ##[group]/datum/unit_test/dcs_get_id_from_arguments
+2022-11-01T15:28:29.3178559Z
+2022-11-01T15:28:29.3182903Z [1;32mPASS[0m /datum/unit_test/dcs_get_id_from_arguments 0s
+2022-11-01T15:28:29.3183682Z ##[endgroup]
+2022-11-01T15:28:29.3371899Z ##[group]/datum/unit_test/designs
+2022-11-01T15:28:29.3438160Z
+2022-11-01T15:28:29.3438713Z [1;32mPASS[0m /datum/unit_test/designs 0s
+2022-11-01T15:28:29.3439280Z ##[endgroup]
+2022-11-01T15:28:29.3630774Z ##[group]/datum/unit_test/dummy_spawn_species
+2022-11-01T15:28:29.7865710Z
+2022-11-01T15:28:29.7866984Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_species 0.4s
+2022-11-01T15:28:29.7868408Z ##[endgroup]
+2022-11-01T15:28:30.2064941Z ##[group]/datum/unit_test/dummy_spawn_outfit
+2022-11-01T15:28:30.2287943Z Job type /datum/job/ai could not be retrieved from SSjob
+2022-11-01T15:28:30.5729399Z
+2022-11-01T15:28:30.5730637Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_outfit 0.3s
+2022-11-01T15:28:30.5731452Z ##[endgroup]
+2022-11-01T15:28:30.8929561Z ##[group]/datum/unit_test/dynamic_roundstart_ruleset_sanity
+2022-11-01T15:28:30.8930214Z
+2022-11-01T15:28:30.8933249Z [1;32mPASS[0m /datum/unit_test/dynamic_roundstart_ruleset_sanity 0s
+2022-11-01T15:28:30.8933929Z ##[endgroup]
+2022-11-01T15:28:30.9093619Z ##[group]/datum/unit_test/dynamic_unique_antag_flags
+2022-11-01T15:28:30.9094243Z
+2022-11-01T15:28:30.9097412Z [1;32mPASS[0m /datum/unit_test/dynamic_unique_antag_flags 0s
+2022-11-01T15:28:30.9098086Z ##[endgroup]
+2022-11-01T15:28:30.9259102Z ##[group]/datum/unit_test/egg_glands
+2022-11-01T15:28:30.9738261Z
+2022-11-01T15:28:30.9739529Z [1;32mPASS[0m /datum/unit_test/egg_glands 0s
+2022-11-01T15:28:30.9742814Z ##[endgroup]
+2022-11-01T15:28:30.9910488Z ##[group]/datum/unit_test/emoting
+2022-11-01T15:28:31.0191020Z
+2022-11-01T15:28:31.0192873Z [1;32mPASS[0m /datum/unit_test/emoting 0.1s
+2022-11-01T15:28:31.0196009Z ##[endgroup]
+2022-11-01T15:28:31.0470998Z ##[group]/datum/unit_test/food_edibility_check
+2022-11-01T15:28:32.3907505Z
+2022-11-01T15:28:32.3908587Z [1;32mPASS[0m /datum/unit_test/food_edibility_check 1.3s
+2022-11-01T15:28:32.3909262Z ##[endgroup]
+2022-11-01T15:28:33.7158865Z ##[group]/datum/unit_test/atmospheric_gas_transfer
+2022-11-01T15:28:33.7169071Z
+2022-11-01T15:28:33.7171453Z [1;32mPASS[0m /datum/unit_test/atmospheric_gas_transfer 0s
+2022-11-01T15:28:33.7173553Z ##[endgroup]
+2022-11-01T15:28:33.7346695Z ##[group]/datum/unit_test/get_turf_pixel
+2022-11-01T15:28:33.7367134Z
+2022-11-01T15:28:33.7368982Z [1;32mPASS[0m /datum/unit_test/get_turf_pixel 0s
+2022-11-01T15:28:33.7371248Z ##[endgroup]
+2022-11-01T15:28:33.7556559Z ##[group]/datum/unit_test/greyscale_item_icon_states
+2022-11-01T15:28:33.7624830Z
+2022-11-01T15:28:33.7626511Z [1;32mPASS[0m /datum/unit_test/greyscale_item_icon_states 0s
+2022-11-01T15:28:33.7628685Z ##[endgroup]
+2022-11-01T15:28:33.7811590Z ##[group]/datum/unit_test/greyscale_color_count
+2022-11-01T15:28:33.7978824Z
+2022-11-01T15:28:33.7981042Z [1;32mPASS[0m /datum/unit_test/greyscale_color_count 0s
+2022-11-01T15:28:33.7981873Z ##[endgroup]
+2022-11-01T15:28:33.8551069Z ##[group]/datum/unit_test/hallucination_icons
+2022-11-01T15:28:34.1090174Z
+2022-11-01T15:28:34.1096431Z [1;32mPASS[0m /datum/unit_test/hallucination_icons 0.3s
+2022-11-01T15:28:34.1099789Z ##[endgroup]
+2022-11-01T15:28:34.3281283Z ##[group]/datum/unit_test/heretic_knowledge
+2022-11-01T15:28:34.3305016Z
+2022-11-01T15:28:34.3306029Z [1;32mPASS[0m /datum/unit_test/heretic_knowledge 0s
+2022-11-01T15:28:34.3306904Z ##[endgroup]
+2022-11-01T15:28:34.3483924Z ##[group]/datum/unit_test/heretic_main_paths
+2022-11-01T15:28:34.3484902Z
+2022-11-01T15:28:34.3487952Z [1;32mPASS[0m /datum/unit_test/heretic_main_paths 0s
+2022-11-01T15:28:34.3491126Z ##[endgroup]
+2022-11-01T15:28:34.3668321Z ##[group]/datum/unit_test/heretic_rituals
+2022-11-01T15:28:34.4513883Z
+2022-11-01T15:28:34.4515231Z [1;32mPASS[0m /datum/unit_test/heretic_rituals 0.1s
+2022-11-01T15:28:34.4518615Z ##[endgroup]
+2022-11-01T15:28:34.5255676Z ##[group]/datum/unit_test/hanukkah_2123
+2022-11-01T15:28:34.5256380Z
+2022-11-01T15:28:34.5258696Z [1;32mPASS[0m /datum/unit_test/hanukkah_2123 0s
+2022-11-01T15:28:34.5306060Z ##[endgroup]
+2022-11-01T15:28:34.5435626Z ##[group]/datum/unit_test/ramadan_2165
+2022-11-01T15:28:34.5435839Z
+2022-11-01T15:28:34.5436316Z [1;32mPASS[0m /datum/unit_test/ramadan_2165 0s
+2022-11-01T15:28:34.5436790Z ##[endgroup]
+2022-11-01T15:28:34.5758281Z ##[group]/datum/unit_test/thanksgiving_2020
+2022-11-01T15:28:34.5758510Z
+2022-11-01T15:28:34.5759790Z [1;32mPASS[0m /datum/unit_test/thanksgiving_2020 0s
+2022-11-01T15:28:34.5760323Z ##[endgroup]
+2022-11-01T15:28:34.5922636Z ##[group]/datum/unit_test/mother_3683
+2022-11-01T15:28:34.5923203Z
+2022-11-01T15:28:34.5923668Z [1;32mPASS[0m /datum/unit_test/mother_3683 0s
+2022-11-01T15:28:34.5924152Z ##[endgroup]
+2022-11-01T15:28:34.6258731Z ##[group]/datum/unit_test/hello_2020
+2022-11-01T15:28:34.6258967Z
+2022-11-01T15:28:34.6259461Z [1;32mPASS[0m /datum/unit_test/hello_2020 0s
+2022-11-01T15:28:34.6260389Z ##[endgroup]
+2022-11-01T15:28:34.6425516Z ##[group]/datum/unit_test/new_year_1983
+2022-11-01T15:28:34.6425720Z
+2022-11-01T15:28:34.6426174Z [1;32mPASS[0m /datum/unit_test/new_year_1983 0s
+2022-11-01T15:28:34.6426620Z ##[endgroup]
+2022-11-01T15:28:34.6759224Z ##[group]/datum/unit_test/moth_week_2020
+2022-11-01T15:28:34.6792170Z
+2022-11-01T15:28:34.6792723Z [1;32mPASS[0m /datum/unit_test/moth_week_2020 0s
+2022-11-01T15:28:34.6793240Z ##[endgroup]
+2022-11-01T15:28:34.6958289Z ##[group]/datum/unit_test/human_through_recycler
+2022-11-01T15:28:34.7370291Z
+2022-11-01T15:28:34.7371226Z [1;32mPASS[0m /datum/unit_test/human_through_recycler 0.1s
+2022-11-01T15:28:34.7372112Z ##[endgroup]
+2022-11-01T15:28:34.8623820Z ##[group]/datum/unit_test/hydroponics_extractor_storage
+2022-11-01T15:28:34.8996006Z
+2022-11-01T15:28:34.8996940Z [1;32mPASS[0m /datum/unit_test/hydroponics_extractor_storage 0s
+2022-11-01T15:28:34.8997589Z ##[endgroup]
+2022-11-01T15:28:34.9278188Z ##[group]/datum/unit_test/hydroponics_harvest
+2022-11-01T15:28:35.0009791Z
+2022-11-01T15:28:35.0010716Z [1;32mPASS[0m /datum/unit_test/hydroponics_harvest 0.1s
+2022-11-01T15:28:35.0012013Z ##[endgroup]
+2022-11-01T15:28:35.0747162Z ##[group]/datum/unit_test/hydroponics_self_mutation
+2022-11-01T15:28:35.1406271Z
+2022-11-01T15:28:35.1407332Z [1;32mPASS[0m /datum/unit_test/hydroponics_self_mutation 0.1s
+2022-11-01T15:28:35.1408057Z ##[endgroup]
+2022-11-01T15:28:35.2102485Z ##[group]/datum/unit_test/hydroponics_validate_genes
+2022-11-01T15:28:35.2762621Z
+2022-11-01T15:28:35.2763561Z [1;32mPASS[0m /datum/unit_test/hydroponics_validate_genes 0s
+2022-11-01T15:28:35.2764288Z ##[endgroup]
+2022-11-01T15:28:35.3749912Z ##[group]/datum/unit_test/defined_inhand_icon_states
+2022-11-01T15:28:36.6110328Z Notice - Possible inhand icon matches found. It is best to be explicit with inhand sprite values.
+2022-11-01T15:28:36.6111369Z /obj/item/clothing/accessory/pride does not have an inhand_icon_state value - Possible matching sprites for "pride" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-11-01T15:28:36.6112643Z /obj/item/clothing/suit/caution does not have an inhand_icon_state value - Possible matching sprites for "caution" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-11-01T15:28:36.6113827Z /obj/item/clothing/under/suit/sl does not have an inhand_icon_state value - Possible matching sprites for "sl_suit" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-01T15:28:36.6114809Z /obj/item/clothing/head/collectable/paper does not have an inhand_icon_state value - Possible matching sprites for "paper" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2022-11-01T15:28:36.6115778Z /obj/item/clothing/head/mod does not have an inhand_icon_state value - Possible matching sprites for "helmet" found in: 'icons/mob/inhands/clothing/hats_lefthand.dmi' & 'icons/mob/inhands/clothing/hats_righthand.dmi'
+2022-11-01T15:28:36.6117382Z /obj/item/clothing/mask/animal/small/fox does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2022-11-01T15:28:36.6118311Z /obj/item/clothing/mask/animal/small/fox/cursed does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2022-11-01T15:28:36.6119323Z /obj/item/clothing/glasses/hud/health/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudmed" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-11-01T15:28:36.6120787Z /obj/item/clothing/glasses/hud/security/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudsec" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-11-01T15:28:36.6121863Z /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun does not have an inhand_icon_state value - Possible matching sprites for "syringegun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-11-01T15:28:36.6122899Z /obj/item/mecha_parts/mecha_equipment/generator does not have an inhand_icon_state value - Possible matching sprites for "tesla" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-11-01T15:28:36.6124088Z /obj/item/storage/bag/ore does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-11-01T15:28:36.6125547Z /obj/item/storage/bag/ore/cyborg does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-11-01T15:28:36.6126550Z /obj/item/implant/emp does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-01T15:28:36.6127486Z /obj/item/implant/uplink does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6128467Z /obj/item/implant/uplink/precharged does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6129445Z /obj/item/implant/uplink/starting does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6130403Z /obj/item/melee/energy/blade does not have an inhand_icon_state value - Possible matching sprites for "blade" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-01T15:28:36.6131355Z /obj/item/fireaxe does not have an inhand_icon_state value - Possible matching sprites for "fireaxe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-11-01T15:28:36.6132532Z /obj/item/fireaxe/boneaxe does not have an inhand_icon_state value - Possible matching sprites for "bone_axe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-11-01T15:28:36.6133828Z /obj/item/fireaxe/metal_h2_axe does not have an inhand_icon_state value - Possible matching sprites for "metalh2_axe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-11-01T15:28:36.6134950Z /obj/item/reagent_containers/cup/soda_cans/cola does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6135967Z /obj/item/reagent_containers/cup/soda_cans/tonic does not have an inhand_icon_state value - Possible matching sprites for "tonic" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6137013Z /obj/item/reagent_containers/cup/soda_cans/sodawater does not have an inhand_icon_state value - Possible matching sprites for "sodawater" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6138306Z /obj/item/reagent_containers/cup/soda_cans/lemon_lime does not have an inhand_icon_state value - Possible matching sprites for "lemon-lime" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6139346Z /obj/item/reagent_containers/cup/soda_cans/space_up does not have an inhand_icon_state value - Possible matching sprites for "space-up" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6140663Z /obj/item/reagent_containers/cup/soda_cans/starkist does not have an inhand_icon_state value - Possible matching sprites for "starkist" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6142092Z /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind does not have an inhand_icon_state value - Possible matching sprites for "space_mountain_wind" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6143256Z /obj/item/reagent_containers/cup/soda_cans/thirteenloko does not have an inhand_icon_state value - Possible matching sprites for "thirteen_loko" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6144724Z /obj/item/reagent_containers/cup/soda_cans/dr_gibb does not have an inhand_icon_state value - Possible matching sprites for "dr_gibb" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6146202Z /obj/item/reagent_containers/cup/soda_cans/pwr_game does not have an inhand_icon_state value - Possible matching sprites for "purple_can" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6147210Z /obj/item/reagent_containers/cup/glass/coffee does not have an inhand_icon_state value - Possible matching sprites for "coffee" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6148208Z /obj/item/reagent_containers/chem_pack does not have an inhand_icon_state value - Possible matching sprites for "chempack" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-11-01T15:28:36.6149458Z /obj/item/sbeacondrop does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6150700Z /obj/item/sbeacondrop/bomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6152025Z /obj/item/sbeacondrop/emp does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6153053Z /obj/item/sbeacondrop/powersink does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6154086Z /obj/item/sbeacondrop/clownbomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6155452Z /obj/item/stack/medical/bruise_pack does not have an inhand_icon_state value - Possible matching sprites for "brutepack" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6156679Z /obj/item/stack/medical/ointment does not have an inhand_icon_state value - Possible matching sprites for "ointment" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6157638Z /obj/item/minespawner does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6158596Z /obj/item/organ/internal/heart/gland/blood does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-01T15:28:36.6159550Z /obj/item/organ/internal/heart/gland/egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-01T15:28:36.6160683Z /obj/item/organ/internal/heart/gland/quantum does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-01T15:28:36.6161755Z /obj/item/organ/internal/heart/gland/trauma does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-01T15:28:36.6162756Z /obj/item/boxcutter does not have an inhand_icon_state value - Possible matching sprites for "boxcutter" found in: 'icons/mob/inhands/equipment/boxcutter_lefthand.dmi' & 'icons/mob/inhands/equipment/boxcutter_righthand.dmi'
+2022-11-01T15:28:36.6163727Z /obj/item/pushbroom does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-11-01T15:28:36.6164922Z /obj/item/pushbroom/cyborg does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-11-01T15:28:36.6165928Z /obj/item/chainsaw does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+2022-11-01T15:28:36.6166916Z /obj/item/chainsaw/doomslayer does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+2022-11-01T15:28:36.6167902Z /obj/item/toy/talking/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2022-11-01T15:28:36.6169082Z /obj/item/toy/figure/chef does not have an inhand_icon_state value - Possible matching sprites for "chef" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-01T15:28:36.6170034Z /obj/item/toy/figure/clown does not have an inhand_icon_state value - Possible matching sprites for "clown" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-01T15:28:36.6171029Z /obj/item/toy/figure/janitor does not have an inhand_icon_state value - Possible matching sprites for "janitor" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-01T15:28:36.6172150Z /obj/item/food/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-01T15:28:36.6173251Z /obj/item/food/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-01T15:28:36.6174826Z /obj/item/kitchen/fork does not have an inhand_icon_state value - Possible matching sprites for "fork" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-11-01T15:28:36.6175832Z /obj/item/kitchen/spoon does not have an inhand_icon_state value - Possible matching sprites for "spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-11-01T15:28:36.6176836Z /obj/item/kitchen/spoon/plastic does not have an inhand_icon_state value - Possible matching sprites for "plastic_spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-11-01T15:28:36.6178144Z /obj/item/book/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2022-11-01T15:28:36.6179305Z /obj/item/pitchfork does not have an inhand_icon_state value - Possible matching sprites for "pitchfork0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-01T15:28:36.6180738Z /obj/item/construction/rcd does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6181781Z /obj/item/construction/rcd/borg does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6182846Z /obj/item/construction/rcd/loaded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6184070Z /obj/item/construction/rcd/loaded/upgraded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6185254Z /obj/item/construction/rcd/internal does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6186373Z /obj/item/construction/rld does not have an inhand_icon_state value - Possible matching sprites for "rld-5" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6187326Z /obj/item/construction/rld/mini does not have an inhand_icon_state value - Possible matching sprites for "rld-5" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6188731Z /obj/item/rcd_ammo does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6190038Z /obj/item/rcd_ammo/large does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6191075Z /obj/item/godstaff does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-11-01T15:28:36.6192277Z /obj/item/godstaff/red does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-11-01T15:28:36.6193619Z /obj/item/godstaff/blue does not have an inhand_icon_state value - Possible matching sprites for "godstaff-blue" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-11-01T15:28:36.6194578Z /obj/item/pipe_dispenser does not have an inhand_icon_state value - Possible matching sprites for "rpd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6195584Z /obj/item/singularityhammer does not have an inhand_icon_state value - Possible matching sprites for "singularity_hammer0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-11-01T15:28:36.6196678Z /obj/item/mjollnir does not have an inhand_icon_state value - Possible matching sprites for "mjollnir0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-11-01T15:28:36.6198710Z /obj/item/spear does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-01T15:28:36.6199875Z /obj/item/spear/explosive does not have an inhand_icon_state value - Possible matching sprites for "spearbomb0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-01T15:28:36.6202418Z /obj/item/spear/grey_tide does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-01T15:28:36.6203520Z /obj/item/spear/bonespear does not have an inhand_icon_state value - Possible matching sprites for "bone_spear0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-01T15:28:36.6204533Z /obj/item/spear/bamboospear does not have an inhand_icon_state value - Possible matching sprites for "bamboo_spear0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-01T15:28:36.6205666Z /obj/item/trash/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-01T15:28:36.6206576Z /obj/item/trash/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-01T15:28:36.6207473Z /obj/item/trash/can does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6208487Z /obj/item/trash/can/food does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-01T15:28:36.6209479Z /obj/item/highfrequencyblade does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-01T15:28:36.6210481Z /obj/item/highfrequencyblade/wizard does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-01T15:28:36.6211474Z /obj/item/borg/sight/meson does not have an inhand_icon_state value - Possible matching sprites for "meson" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-11-01T15:28:36.6212716Z /obj/item/ammo_casing/magic/hook does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-11-01T15:28:36.6213695Z /obj/item/ammo_casing/magic/hook/bounty does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-11-01T15:28:36.6214670Z /obj/item/harmalarm does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_lefthand.dmi' & 'icons/mob/inhands/items/megaphone_righthand.dmi'
+2022-11-01T15:28:36.6215804Z /obj/item/abductor_machine_beacon does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6216917Z /obj/item/abductor_machine_beacon/chem_dispenser does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6217923Z /obj/item/grown/carbon_rose does not have an inhand_icon_state value - Possible matching sprites for "carbonrose" found in: 'icons/mob/inhands/weapons/plants_righthand.dmi' & 'icons/mob/inhands/weapons/plants_lefthand.dmi'
+2022-11-01T15:28:36.6219079Z /obj/item/paint_palette does not have an inhand_icon_state value - Possible matching sprites for "palette" found in: 'icons/mob/inhands/equipment/palette_righthand.dmi' & 'icons/mob/inhands/equipment/palette_lefthand.dmi'
+2022-11-01T15:28:36.6220238Z /obj/item/surprise_egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-01T15:28:36.6221390Z /obj/item/experi_scanner does not have an inhand_icon_state value - Possible matching sprites for "experiscanner" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6222338Z /obj/item/fishing_hook does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-11-01T15:28:36.6223438Z /obj/item/cursed_katana does not have an inhand_icon_state value - Possible matching sprites for "cursed_katana" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-01T15:28:36.6224409Z /obj/item/guardiancreator/tech does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6225422Z /obj/item/guardiancreator/tech/choose does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6226453Z /obj/item/guardiancreator/tech/choose/traitor does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6227485Z /obj/item/guardiancreator/tech/choose/dextrous does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6228666Z /obj/item/mod/module/welding does not have an inhand_icon_state value - Possible matching sprites for "welding" found in: 'icons/mob/inhands/clothing/masks_lefthand.dmi' & 'icons/mob/inhands/clothing/masks_righthand.dmi'
+2022-11-01T15:28:36.6229814Z /obj/item/mod/module/mister does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2022-11-01T15:28:36.6230969Z /obj/item/mod/module/mister/atmos does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2022-11-01T15:28:36.6232420Z /obj/item/mod/module/jetpack does not have an inhand_icon_state value - Possible matching sprites for "jetpack" found in: 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi' & 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
+2022-11-01T15:28:36.6234473Z /obj/item/mod/module/flashlight does not have an inhand_icon_state value - Possible matching sprites for "flashlight" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-01T15:28:36.6235798Z /obj/item/mod/module/stamp does not have an inhand_icon_state value - Possible matching sprites for "stamp" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2022-11-01T15:28:36.6236873Z /obj/item/mod/module/holster does not have an inhand_icon_state value - Possible matching sprites for "holster" found in: 'icons/mob/inhands/equipment/belt_lefthand.dmi' & 'icons/mob/inhands/equipment/belt_righthand.dmi'
+2022-11-01T15:28:36.6237940Z /obj/item/mod/module/megaphone does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_lefthand.dmi' & 'icons/mob/inhands/items/megaphone_righthand.dmi'
+2022-11-01T15:28:36.6239527Z /obj/item/mod/module/drill does not have an inhand_icon_state value - Possible matching sprites for "drill" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-01T15:28:36.6240615Z /obj/item/mod/module/tem does not have an inhand_icon_state value - Possible matching sprites for "chronogun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-11-01T15:28:36.6241586Z /obj/item/bonesetter does not have an inhand_icon_state value - Possible matching sprites for "bonesetter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6242563Z /obj/item/blood_filter does not have an inhand_icon_state value - Possible matching sprites for "bloodfilter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-01T15:28:36.6243567Z /obj/item/mecha_ammo/flashbang does not have an inhand_icon_state value - Possible matching sprites for "flashbang" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-01T15:28:36.6243984Z
+2022-11-01T15:28:36.6244251Z [1;32mPASS[0m /datum/unit_test/defined_inhand_icon_states 1.3s
+2022-11-01T15:28:36.6245107Z ##[endgroup]
+2022-11-01T15:28:38.3781123Z ##[group]/datum/unit_test/keybinding_init
+2022-11-01T15:28:38.3781642Z
+2022-11-01T15:28:38.3782256Z [1;32mPASS[0m /datum/unit_test/keybinding_init 0s
+2022-11-01T15:28:38.3782848Z ##[endgroup]
+2022-11-01T15:28:38.3952800Z ##[group]/datum/unit_test/knockoff_component
+2022-11-01T15:28:38.4583090Z
+2022-11-01T15:28:38.4584605Z [1;32mPASS[0m /datum/unit_test/knockoff_component 0.1s
+2022-11-01T15:28:38.4585463Z ##[endgroup]
+2022-11-01T15:28:38.5388034Z ##[group]/datum/unit_test/limbsanity
+2022-11-01T15:28:38.6201426Z
+2022-11-01T15:28:38.6202784Z [1;32mPASS[0m /datum/unit_test/limbsanity 0.1s
+2022-11-01T15:28:38.6203543Z ##[endgroup]
+2022-11-01T15:28:38.6375016Z ##[group]/datum/unit_test/load_map_security
+2022-11-01T15:28:38.6378905Z map directory not in whitelist: data/load_map_security_temp for map runtimestation
+2022-11-01T15:28:38.6380282Z
+2022-11-01T15:28:38.6381773Z [1;32mPASS[0m /datum/unit_test/load_map_security 0s
+2022-11-01T15:28:38.6382439Z ##[endgroup]
+2022-11-01T15:28:38.6552883Z ##[group]/datum/unit_test/machine_disassembly
+2022-11-01T15:28:38.6594171Z
+2022-11-01T15:28:38.6595097Z [1;32mPASS[0m /datum/unit_test/machine_disassembly 0s
+2022-11-01T15:28:38.6595719Z ##[endgroup]
+2022-11-01T15:28:38.6872178Z ##[group]/datum/unit_test/mecha_damage
+2022-11-01T15:28:38.7397615Z
+2022-11-01T15:28:38.7398654Z [1;32mPASS[0m /datum/unit_test/mecha_damage 0.1s
+2022-11-01T15:28:38.7399283Z ##[endgroup]
+2022-11-01T15:28:38.7754903Z ##[group]/datum/unit_test/test_human_base
+2022-11-01T15:28:38.8529341Z
+2022-11-01T15:28:38.8530478Z [1;32mPASS[0m /datum/unit_test/test_human_base 0.1s
+2022-11-01T15:28:38.8531256Z ##[endgroup]
+2022-11-01T15:28:38.9752946Z ##[group]/datum/unit_test/test_human_bone
+2022-11-01T15:28:39.0547873Z
+2022-11-01T15:28:39.0550271Z [1;32mPASS[0m /datum/unit_test/test_human_bone 0.1s
+2022-11-01T15:28:39.0551284Z ##[endgroup]
+2022-11-01T15:28:39.1298729Z ##[group]/datum/unit_test/merge_type
+2022-11-01T15:28:39.1300463Z
+2022-11-01T15:28:39.1301413Z [1;32mPASS[0m /datum/unit_test/merge_type 0s
+2022-11-01T15:28:39.1302403Z ##[endgroup]
+2022-11-01T15:28:39.1477365Z ##[group]/datum/unit_test/metabolization
+2022-11-01T15:28:39.3901954Z
+2022-11-01T15:28:39.3903433Z [1;32mPASS[0m /datum/unit_test/metabolization 0.2s
+2022-11-01T15:28:39.3906497Z ##[endgroup]
+2022-11-01T15:28:39.7294447Z ##[group]/datum/unit_test/on_mob_end_metabolize
+2022-11-01T15:28:39.7598821Z
+2022-11-01T15:28:39.7600420Z [1;32mPASS[0m /datum/unit_test/on_mob_end_metabolize 0s
+2022-11-01T15:28:39.7649553Z ##[endgroup]
+2022-11-01T15:28:39.7835943Z ##[group]/datum/unit_test/addictions
+2022-11-01T15:28:39.8761920Z
+2022-11-01T15:28:39.8763025Z [1;32mPASS[0m /datum/unit_test/addictions 0.1s
+2022-11-01T15:28:39.8764090Z ##[endgroup]
+2022-11-01T15:28:39.9657360Z ##[group]/datum/unit_test/actions_moved_on_mind_transfer
+2022-11-01T15:28:39.9971522Z
+2022-11-01T15:28:39.9972744Z [1;32mPASS[0m /datum/unit_test/actions_moved_on_mind_transfer 0s
+2022-11-01T15:28:39.9974074Z ##[endgroup]
+2022-11-01T15:28:40.0547546Z ##[group]/datum/unit_test/mob_faction
+2022-11-01T15:28:44.4337194Z
+2022-11-01T15:28:44.4338995Z [1;32mPASS[0m /datum/unit_test/mob_faction 4.4s
+2022-11-01T15:28:44.4343946Z ##[endgroup]
+2022-11-01T15:28:50.4570438Z ##[group]/datum/unit_test/mob_spawn
+2022-11-01T15:28:50.4788560Z
+2022-11-01T15:28:50.4789841Z [1;32mPASS[0m /datum/unit_test/mob_spawn 0s
+2022-11-01T15:28:50.4791361Z ##[endgroup]
+2022-11-01T15:28:50.6427929Z ##[group]/datum/unit_test/modsuit_checks
+2022-11-01T15:28:50.8774698Z
+2022-11-01T15:28:50.8776366Z [1;32mPASS[0m /datum/unit_test/modsuit_checks 0.2s
+2022-11-01T15:28:50.8777936Z ##[endgroup]
+2022-11-01T15:28:51.1124046Z ##[group]/datum/unit_test/modular_map_loader
+2022-11-01T15:28:51.1141260Z
+2022-11-01T15:28:51.1142098Z [1;32mPASS[0m /datum/unit_test/modular_map_loader 0s
+2022-11-01T15:28:51.1142848Z ##[endgroup]
+2022-11-01T15:28:51.1326741Z ##[group]/datum/unit_test/mouse_bite_cable
+2022-11-01T15:28:51.1380480Z
+2022-11-01T15:28:51.1381073Z [1;32mPASS[0m /datum/unit_test/mouse_bite_cable 0s
+2022-11-01T15:28:51.1381752Z ##[endgroup]
+2022-11-01T15:28:51.1577018Z ##[group]/datum/unit_test/novaflower_burn
+2022-11-01T15:28:51.2169264Z
+2022-11-01T15:28:51.2170162Z [1;32mPASS[0m /datum/unit_test/novaflower_burn 0.1s
+2022-11-01T15:28:51.2170901Z ##[endgroup]
+2022-11-01T15:28:51.2996852Z ##[group]/datum/unit_test/ntnetwork
+2022-11-01T15:28:51.3019053Z
+2022-11-01T15:28:51.3019857Z [1;32mPASS[0m /datum/unit_test/ntnetwork 0.1s
+2022-11-01T15:28:51.3020531Z ##[endgroup]
+2022-11-01T15:28:51.3196087Z ##[group]/datum/unit_test/nuke_cinematic
+2022-11-01T15:28:56.0755977Z
+2022-11-01T15:28:56.0763029Z [1;32mPASS[0m /datum/unit_test/nuke_cinematic 4.7s
+2022-11-01T15:28:56.0764783Z ##[endgroup]
+2022-11-01T15:28:56.3446321Z ##[group]/datum/unit_test/objectives_category
+2022-11-01T15:28:56.3446835Z
+2022-11-01T15:28:56.3447470Z [1;32mPASS[0m /datum/unit_test/objectives_category 0s
+2022-11-01T15:28:56.3448136Z ##[endgroup]
+2022-11-01T15:28:56.3614737Z ##[group]/datum/unit_test/operating_table
+2022-11-01T15:28:56.4176620Z
+2022-11-01T15:28:56.4177598Z [1;32mPASS[0m /datum/unit_test/operating_table 0.1s
+2022-11-01T15:28:56.4178689Z ##[endgroup]
+2022-11-01T15:28:56.4981266Z ##[group]/datum/unit_test/outfit_sanity
+2022-11-01T15:29:06.6657414Z
+2022-11-01T15:29:06.6658439Z [1;32mPASS[0m /datum/unit_test/outfit_sanity 10.2s
+2022-11-01T15:29:06.6659196Z ##[endgroup]
+2022-11-01T15:29:16.7908070Z ##[group]/datum/unit_test/paintings
+2022-11-01T15:29:16.8212273Z
+2022-11-01T15:29:16.8213346Z [1;32mPASS[0m /datum/unit_test/paintings 0.1s
+2022-11-01T15:29:16.8214069Z ##[endgroup]
+2022-11-01T15:29:16.8389425Z ##[group]/datum/unit_test/pills
+2022-11-01T15:29:16.8676028Z
+2022-11-01T15:29:16.8677434Z [1;32mPASS[0m /datum/unit_test/pills 0s
+2022-11-01T15:29:16.8678165Z ##[endgroup]
+2022-11-01T15:29:16.9417567Z ##[group]/datum/unit_test/plane_double_transform
+2022-11-01T15:29:16.9735002Z
+2022-11-01T15:29:16.9735721Z [1;32mPASS[0m /datum/unit_test/plane_double_transform 0s
+2022-11-01T15:29:16.9736359Z ##[endgroup]
+2022-11-01T15:29:17.0062562Z ##[group]/datum/unit_test/plane_dupe_detector
+2022-11-01T15:29:17.0065142Z
+2022-11-01T15:29:17.0067978Z [1;32mPASS[0m /datum/unit_test/plane_dupe_detector 0s
+2022-11-01T15:29:17.0071640Z ##[endgroup]
+2022-11-01T15:29:17.0244509Z ##[group]/datum/unit_test/plantgrowth
+2022-11-01T15:29:17.0776528Z
+2022-11-01T15:29:17.0779718Z [1;32mPASS[0m /datum/unit_test/plantgrowth 0s
+2022-11-01T15:29:17.0781279Z ##[endgroup]
+2022-11-01T15:29:17.0965505Z ##[group]/datum/unit_test/preference_species
+2022-11-01T15:29:17.0966443Z
+2022-11-01T15:29:17.0969864Z [1;32mPASS[0m /datum/unit_test/preference_species 0s
+2022-11-01T15:29:17.0973093Z ##[endgroup]
+2022-11-01T15:29:17.1152354Z ##[group]/datum/unit_test/preferences_implement_everything
+2022-11-01T15:29:23.4577951Z
+2022-11-01T15:29:23.4578850Z [1;32mPASS[0m /datum/unit_test/preferences_implement_everything 6.3s
+2022-11-01T15:29:23.4579521Z ##[endgroup]
+2022-11-01T15:29:29.7830207Z ##[group]/datum/unit_test/preferences_valid_savefile_key
+2022-11-01T15:29:29.7830930Z
+2022-11-01T15:29:29.7833510Z [1;32mPASS[0m /datum/unit_test/preferences_valid_savefile_key 0s
+2022-11-01T15:29:29.7834275Z ##[endgroup]
+2022-11-01T15:29:29.8033816Z ##[group]/datum/unit_test/preferences_valid_main_feature_name
+2022-11-01T15:29:29.8034550Z
+2022-11-01T15:29:29.8035744Z [1;32mPASS[0m /datum/unit_test/preferences_valid_main_feature_name 0s
+2022-11-01T15:29:29.8089387Z ##[endgroup]
+2022-11-01T15:29:29.8234720Z ##[group]/datum/unit_test/projectile_movetypes
+2022-11-01T15:29:29.8234940Z
+2022-11-01T15:29:29.8235533Z [1;32mPASS[0m /datum/unit_test/projectile_movetypes 0s
+2022-11-01T15:29:29.8236221Z ##[endgroup]
+2022-11-01T15:29:29.8415787Z ##[group]/datum/unit_test/gun_go_bang
+2022-11-01T15:29:29.9160628Z
+2022-11-01T15:29:29.9161545Z [1;32mPASS[0m /datum/unit_test/gun_go_bang 0.1s
+2022-11-01T15:29:29.9162229Z ##[endgroup]
+2022-11-01T15:29:30.0035502Z ##[group]/datum/unit_test/quirk_icons
+2022-11-01T15:29:30.0035718Z
+2022-11-01T15:29:30.0036645Z [1;32mPASS[0m /datum/unit_test/quirk_icons 0s
+2022-11-01T15:29:30.0037121Z ##[endgroup]
+2022-11-01T15:29:30.0231538Z ##[group]/datum/unit_test/range_return
+2022-11-01T15:29:30.0231750Z
+2022-11-01T15:29:30.0232212Z [1;32mPASS[0m /datum/unit_test/range_return 0s
+2022-11-01T15:29:30.0232658Z ##[endgroup]
+2022-11-01T15:29:30.0427797Z ##[group]/datum/unit_test/frame_stacking
+2022-11-01T15:29:30.1020458Z
+2022-11-01T15:29:30.1021324Z [1;32mPASS[0m /datum/unit_test/frame_stacking 0.1s
+2022-11-01T15:29:30.1022036Z ##[endgroup]
+2022-11-01T15:29:30.1824738Z ##[group]/datum/unit_test/reagent_id_typos
+2022-11-01T15:29:30.1842378Z
+2022-11-01T15:29:30.1842930Z [1;32mPASS[0m /datum/unit_test/reagent_id_typos 0s
+2022-11-01T15:29:30.1843838Z ##[endgroup]
+2022-11-01T15:29:30.2065945Z ##[group]/datum/unit_test/reagent_mob_expose
+2022-11-01T15:29:30.2431485Z
+2022-11-01T15:29:30.2432396Z [1;32mPASS[0m /datum/unit_test/reagent_mob_expose 0s
+2022-11-01T15:29:30.2433748Z ##[endgroup]
+2022-11-01T15:29:30.2736664Z ##[group]/datum/unit_test/reagent_mob_procs
+2022-11-01T15:29:30.3087817Z
+2022-11-01T15:29:30.3088677Z [1;32mPASS[0m /datum/unit_test/reagent_mob_procs 0.1s
+2022-11-01T15:29:30.3089382Z ##[endgroup]
+2022-11-01T15:29:30.3347974Z ##[group]/datum/unit_test/reagent_names
+2022-11-01T15:29:31.2354819Z
+2022-11-01T15:29:31.2355678Z [1;32mPASS[0m /datum/unit_test/reagent_names 0.9s
+2022-11-01T15:29:31.2356318Z ##[endgroup]
+2022-11-01T15:29:32.1042828Z ##[group]/datum/unit_test/reagent_recipe_collisions
+2022-11-01T15:29:32.5727294Z
+2022-11-01T15:29:32.5728917Z [1;32mPASS[0m /datum/unit_test/reagent_recipe_collisions 0.4s
+2022-11-01T15:29:32.5730155Z ##[endgroup]
+2022-11-01T15:29:32.9927755Z ##[group]/datum/unit_test/reagent_transfer
+2022-11-01T15:29:32.9934109Z
+2022-11-01T15:29:32.9935981Z [1;32mPASS[0m /datum/unit_test/reagent_transfer 0s
+2022-11-01T15:29:32.9936895Z ##[endgroup]
+2022-11-01T15:29:33.0126783Z ##[group]/datum/unit_test/stop_drop_and_roll
+2022-11-01T15:29:33.0390175Z
+2022-11-01T15:29:33.0391562Z [1;32mPASS[0m /datum/unit_test/stop_drop_and_roll 0s
+2022-11-01T15:29:33.0394218Z ##[endgroup]
+2022-11-01T15:29:33.0646804Z ##[group]/datum/unit_test/container_resist
+2022-11-01T15:29:33.1054797Z
+2022-11-01T15:29:33.1056167Z [1;32mPASS[0m /datum/unit_test/container_resist 0.1s
+2022-11-01T15:29:33.1057687Z ##[endgroup]
+2022-11-01T15:29:33.1496944Z ##[group]/datum/unit_test/get_message_mods
+2022-11-01T15:29:33.1778888Z
+2022-11-01T15:29:33.1780246Z [1;32mPASS[0m /datum/unit_test/get_message_mods 0s
+2022-11-01T15:29:33.1781311Z ##[endgroup]
+2022-11-01T15:29:33.2061026Z ##[group]/datum/unit_test/say_signal
+2022-11-01T15:29:33.2078006Z
+2022-11-01T15:29:33.2079823Z [1;32mPASS[0m /datum/unit_test/say_signal 0s
+2022-11-01T15:29:33.2083007Z ##[endgroup]
+2022-11-01T15:29:33.2288010Z ##[group]/datum/unit_test/screenshot_antag_icons
+2022-11-01T15:29:33.2307183Z screenshot_antag_icons_fugitive was put in data/screenshots_new
+2022-11-01T15:29:33.2317601Z screenshot_antag_icons_loneoperative was put in data/screenshots_new
+2022-11-01T15:29:33.2741726Z screenshot_antag_icons_sentiencepotionspawn was put in data/screenshots_new
+2022-11-01T15:29:33.2757069Z screenshot_antag_icons_traitor was put in data/screenshots_new
+2022-11-01T15:29:33.3311410Z screenshot_antag_icons_malfai was put in data/screenshots_new
+2022-11-01T15:29:33.3356755Z screenshot_antag_icons_bloodbrother was put in data/screenshots_new
+2022-11-01T15:29:33.3365772Z screenshot_antag_icons_changeling was put in data/screenshots_new
+2022-11-01T15:29:33.3430251Z screenshot_antag_icons_heretic was put in data/screenshots_new
+2022-11-01T15:29:33.3445326Z screenshot_antag_icons_wizard was put in data/screenshots_new
+2022-11-01T15:29:33.3487169Z screenshot_antag_icons_cultist was put in data/screenshots_new
+2022-11-01T15:29:33.3511130Z screenshot_antag_icons_operative was put in data/screenshots_new
+2022-11-01T15:29:33.3528654Z screenshot_antag_icons_clownoperative was put in data/screenshots_new
+2022-11-01T15:29:33.3549119Z screenshot_antag_icons_headrevolutionary was put in data/screenshots_new
+2022-11-01T15:29:33.3549976Z screenshot_antag_icons_syndicateinfiltrator was put in data/screenshots_new
+2022-11-01T15:29:33.3550439Z screenshot_antag_icons_provocateur was put in data/screenshots_new
+2022-11-01T15:29:33.3557417Z screenshot_antag_icons_hereticsmuggler was put in data/screenshots_new
+2022-11-01T15:29:33.3557858Z screenshot_antag_icons_wizardmidround was put in data/screenshots_new
+2022-11-01T15:29:33.3558296Z screenshot_antag_icons_operativemidround was put in data/screenshots_new
+2022-11-01T15:29:33.4364141Z screenshot_antag_icons_blob was put in data/screenshots_new
+2022-11-01T15:29:33.4501951Z screenshot_antag_icons_xenomorph was put in data/screenshots_new
+2022-11-01T15:29:33.4510297Z screenshot_antag_icons_nightmare was put in data/screenshots_new
+2022-11-01T15:29:33.4593244Z screenshot_antag_icons_spacedragon was put in data/screenshots_new
+2022-11-01T15:29:33.4602657Z screenshot_antag_icons_abductor was put in data/screenshots_new
+2022-11-01T15:29:33.4610909Z screenshot_antag_icons_spaceninja was put in data/screenshots_new
+2022-11-01T15:29:33.4905469Z screenshot_antag_icons_revenant was put in data/screenshots_new
+2022-11-01T15:29:33.4932248Z screenshot_antag_icons_sentientdisease was put in data/screenshots_new
+2022-11-01T15:29:33.4934049Z screenshot_antag_icons_syndicatesleeperagent was put in data/screenshots_new
+2022-11-01T15:29:33.5122130Z screenshot_antag_icons_blobinfection was put in data/screenshots_new
+2022-11-01T15:29:33.5146398Z screenshot_antag_icons_obsessed was put in data/screenshots_new
+2022-11-01T15:29:33.5153740Z screenshot_antag_icons_malfaimidround was put in data/screenshots_new
+2022-11-01T15:29:33.5154025Z
+2022-11-01T15:29:33.5154740Z [1;32mPASS[0m /datum/unit_test/screenshot_antag_icons 0.3s
+2022-11-01T15:29:33.5155554Z ##[endgroup]
+2022-11-01T15:29:33.7840161Z ##[group]/datum/unit_test/screenshot_basic
+2022-11-01T15:29:33.7846135Z screenshot_basic_red was put in data/screenshots_new
+2022-11-01T15:29:33.7850103Z
+2022-11-01T15:29:33.7851242Z [1;32mPASS[0m /datum/unit_test/screenshot_basic 0s
+2022-11-01T15:29:33.7851736Z ##[endgroup]
+2022-11-01T15:29:33.8047719Z ##[group]/datum/unit_test/screenshot_humanoids
+2022-11-01T15:29:34.5128170Z screenshot_humanoids__datum_species_lizard was put in data/screenshots_new
+2022-11-01T15:29:35.3887159Z screenshot_humanoids__datum_species_moth was put in data/screenshots_new
+2022-11-01T15:29:36.0866727Z screenshot_humanoids__datum_species_shadow was put in data/screenshots_new
+2022-11-01T15:29:36.3285479Z screenshot_humanoids__datum_species_shadow_nightmare was put in data/screenshots_new
+2022-11-01T15:29:37.0085075Z screenshot_humanoids__datum_species_abductor was put in data/screenshots_new
+2022-11-01T15:29:37.6062780Z screenshot_humanoids__datum_species_android was put in data/screenshots_new
+2022-11-01T15:29:38.2188199Z screenshot_humanoids__datum_species_dullahan was put in data/screenshots_new
+2022-11-01T15:29:38.8612302Z screenshot_humanoids__datum_species_ethereal was put in data/screenshots_new
+2022-11-01T15:29:39.5803701Z screenshot_humanoids__datum_species_human was put in data/screenshots_new
+2022-11-01T15:29:40.3407635Z screenshot_humanoids__datum_species_human_felinid was put in data/screenshots_new
+2022-11-01T15:29:41.1214653Z screenshot_humanoids__datum_species_human_krokodil_addict was put in data/screenshots_new
+2022-11-01T15:29:41.9521982Z screenshot_humanoids__datum_species_fly was put in data/screenshots_new
+2022-11-01T15:29:42.6006415Z screenshot_humanoids__datum_species_golem was put in data/screenshots_new
+2022-11-01T15:29:43.2088729Z screenshot_humanoids__datum_species_golem_adamantine was put in data/screenshots_new
+2022-11-01T15:29:43.8190470Z screenshot_humanoids__datum_species_golem_plasma was put in data/screenshots_new
+2022-11-01T15:29:44.4370361Z screenshot_humanoids__datum_species_golem_diamond was put in data/screenshots_new
+2022-11-01T15:29:45.0207260Z screenshot_humanoids__datum_species_golem_gold was put in data/screenshots_new
+2022-11-01T15:29:45.6198968Z screenshot_humanoids__datum_species_golem_silver was put in data/screenshots_new
+2022-11-01T15:29:46.2210457Z screenshot_humanoids__datum_species_golem_plasteel was put in data/screenshots_new
+2022-11-01T15:29:46.7870537Z screenshot_humanoids__datum_species_golem_titanium was put in data/screenshots_new
+2022-11-01T15:29:47.3882868Z screenshot_humanoids__datum_species_golem_plastitanium was put in data/screenshots_new
+2022-11-01T15:29:47.9960089Z screenshot_humanoids__datum_species_golem_alloy was put in data/screenshots_new
+2022-11-01T15:29:48.6148861Z screenshot_humanoids__datum_species_golem_wood was put in data/screenshots_new
+2022-11-01T15:29:49.2815897Z screenshot_humanoids__datum_species_golem_uranium was put in data/screenshots_new
+2022-11-01T15:29:49.9589760Z screenshot_humanoids__datum_species_golem_sand was put in data/screenshots_new
+2022-11-01T15:29:50.5992504Z screenshot_humanoids__datum_species_golem_glass was put in data/screenshots_new
+2022-11-01T15:29:51.2503187Z screenshot_humanoids__datum_species_golem_bluespace was put in data/screenshots_new
+2022-11-01T15:29:51.8848719Z screenshot_humanoids__datum_species_golem_bananium was put in data/screenshots_new
+2022-11-01T15:29:52.3852904Z screenshot_humanoids__datum_species_golem_runic was put in data/screenshots_new
+2022-11-01T15:29:53.0469173Z screenshot_humanoids__datum_species_golem_cloth was put in data/screenshots_new
+2022-11-01T15:29:53.6444155Z screenshot_humanoids__datum_species_golem_plastic was put in data/screenshots_new
+2022-11-01T15:29:54.3098057Z screenshot_humanoids__datum_species_golem_bronze was put in data/screenshots_new
+2022-11-01T15:29:54.8535540Z screenshot_humanoids__datum_species_golem_cardboard was put in data/screenshots_new
+2022-11-01T15:29:55.5735108Z screenshot_humanoids__datum_species_golem_leather was put in data/screenshots_new
+2022-11-01T15:29:56.0717640Z screenshot_humanoids__datum_species_golem_durathread was put in data/screenshots_new
+2022-11-01T15:29:56.5432741Z screenshot_humanoids__datum_species_golem_bone was put in data/screenshots_new
+2022-11-01T15:29:57.0369874Z screenshot_humanoids__datum_species_golem_snow was put in data/screenshots_new
+2022-11-01T15:29:57.7216313Z screenshot_humanoids__datum_species_golem_mhydrogen was put in data/screenshots_new
+2022-11-01T15:29:58.4794694Z screenshot_humanoids__datum_species_jelly was put in data/screenshots_new
+2022-11-01T15:29:59.2634596Z screenshot_humanoids__datum_species_jelly_slime was put in data/screenshots_new
+2022-11-01T15:30:00.0372590Z screenshot_humanoids__datum_species_jelly_luminescent was put in data/screenshots_new
+2022-11-01T15:30:00.7908231Z screenshot_humanoids__datum_species_jelly_stargazer was put in data/screenshots_new
+2022-11-01T15:30:01.4923254Z screenshot_humanoids__datum_species_lizard_ashwalker was put in data/screenshots_new
+2022-11-01T15:30:02.2186441Z screenshot_humanoids__datum_species_lizard_silverscale was put in data/screenshots_new
+2022-11-01T15:30:02.4149008Z screenshot_humanoids__datum_species_monkey was put in data/screenshots_new
+2022-11-01T15:30:03.0255568Z screenshot_humanoids__datum_species_mush was put in data/screenshots_new
+2022-11-01T15:30:03.6777755Z screenshot_humanoids__datum_species_plasmaman was put in data/screenshots_new
+2022-11-01T15:30:04.4788826Z screenshot_humanoids__datum_species_pod was put in data/screenshots_new
+2022-11-01T15:30:05.2174595Z screenshot_humanoids__datum_species_skeleton was put in data/screenshots_new
+2022-11-01T15:30:05.9909000Z screenshot_humanoids__datum_species_snail was put in data/screenshots_new
+2022-11-01T15:30:06.7544848Z screenshot_humanoids__datum_species_vampire was put in data/screenshots_new
+2022-11-01T15:30:07.6424794Z screenshot_humanoids__datum_species_zombie was put in data/screenshots_new
+2022-11-01T15:30:08.5972035Z screenshot_humanoids__datum_species_zombie_infectious was put in data/screenshots_new
+2022-11-01T15:30:08.5972336Z
+2022-11-01T15:30:08.5972854Z [1;32mPASS[0m /datum/unit_test/screenshot_humanoids 34.7s
+2022-11-01T15:30:08.5973526Z ##[endgroup]
+2022-11-01T15:30:44.2099567Z ##[group]/datum/unit_test/screenshot_saturnx
+2022-11-01T15:30:44.5011065Z screenshot_saturnx_invisibility was put in data/screenshots_new
+2022-11-01T15:30:44.5011333Z
+2022-11-01T15:30:44.5012180Z [1;32mPASS[0m /datum/unit_test/screenshot_saturnx 0.3s
+2022-11-01T15:30:44.5012769Z ##[endgroup]
+2022-11-01T15:30:44.7785909Z ##[group]/datum/unit_test/security_officer_roundstart_distribution
+2022-11-01T15:30:44.9017426Z
+2022-11-01T15:30:44.9018614Z [1;32mPASS[0m /datum/unit_test/security_officer_roundstart_distribution 0.2s
+2022-11-01T15:30:44.9019313Z ##[endgroup]
+2022-11-01T15:30:45.0427506Z ##[group]/datum/unit_test/security_officer_latejoin_distribution
+2022-11-01T15:30:45.5391742Z
+2022-11-01T15:30:45.5392426Z [1;32mPASS[0m /datum/unit_test/security_officer_latejoin_distribution 0.5s
+2022-11-01T15:30:45.5393125Z ##[endgroup]
+2022-11-01T15:30:46.2210379Z ##[group]/datum/unit_test/security_levels
+2022-11-01T15:30:46.2210589Z
+2022-11-01T15:30:46.2216058Z [1;32mPASS[0m /datum/unit_test/security_levels 0s
+2022-11-01T15:30:46.2216555Z ##[endgroup]
+2022-11-01T15:30:46.2399271Z ##[group]/datum/unit_test/servingtray
+2022-11-01T15:30:46.2779259Z
+2022-11-01T15:30:46.2780125Z [1;32mPASS[0m /datum/unit_test/servingtray 0s
+2022-11-01T15:30:46.2780972Z ##[endgroup]
+2022-11-01T15:30:46.3048093Z ##[group]/datum/unit_test/simple_animal_freeze
+2022-11-01T15:30:46.3059709Z
+2022-11-01T15:30:46.3060267Z [1;32mPASS[0m /datum/unit_test/simple_animal_freeze 0s
+2022-11-01T15:30:46.3060938Z ##[endgroup]
+2022-11-01T15:30:46.3241320Z ##[group]/datum/unit_test/siunit
+2022-11-01T15:30:46.3241508Z
+2022-11-01T15:30:46.3241961Z [1;32mPASS[0m /datum/unit_test/siunit 0s
+2022-11-01T15:30:46.3242362Z ##[endgroup]
+2022-11-01T15:30:46.3753674Z ##[group]/datum/unit_test/slips
+2022-11-01T15:30:46.4300467Z
+2022-11-01T15:30:46.4301480Z [1;32mPASS[0m /datum/unit_test/slips 0.1s
+2022-11-01T15:30:46.4302301Z ##[endgroup]
+2022-11-01T15:30:46.5100922Z ##[group]/datum/unit_test/spawn_humans
+2022-11-01T15:30:51.5880046Z
+2022-11-01T15:30:51.5881071Z [1;32mPASS[0m /datum/unit_test/spawn_humans 5s
+2022-11-01T15:30:51.5881789Z ##[endgroup]
+2022-11-01T15:30:51.6350612Z ##[group]/datum/unit_test/spawn_mobs
+2022-11-01T15:30:51.7210346Z
+2022-11-01T15:30:51.7211375Z [1;32mPASS[0m /datum/unit_test/spawn_mobs 0.1s
+2022-11-01T15:30:51.7212072Z ##[endgroup]
+2022-11-01T15:30:51.8820435Z ##[group]/datum/unit_test/species_change_clothing
+2022-11-01T15:30:51.9839314Z
+2022-11-01T15:30:51.9840163Z [1;32mPASS[0m /datum/unit_test/species_change_clothing 0.1s
+2022-11-01T15:30:51.9840797Z ##[endgroup]
+2022-11-01T15:30:52.0595249Z ##[group]/datum/unit_test/species_change_organs
+2022-11-01T15:30:52.1312087Z
+2022-11-01T15:30:52.1313114Z [1;32mPASS[0m /datum/unit_test/species_change_organs 0.1s
+2022-11-01T15:30:52.1313735Z ##[endgroup]
+2022-11-01T15:30:52.2788548Z ##[group]/datum/unit_test/species_config_sanity
+2022-11-01T15:30:52.2788764Z
+2022-11-01T15:30:52.2789218Z [1;32mPASS[0m /datum/unit_test/species_config_sanity 0s
+2022-11-01T15:30:52.2789672Z ##[endgroup]
+2022-11-01T15:30:52.2965591Z ##[group]/datum/unit_test/species_unique_id
+2022-11-01T15:30:52.2965794Z
+2022-11-01T15:30:52.2966648Z [1;32mPASS[0m /datum/unit_test/species_unique_id 0s
+2022-11-01T15:30:52.2967087Z ##[endgroup]
+2022-11-01T15:30:52.3145296Z ##[group]/datum/unit_test/species_whitelist_check
+2022-11-01T15:30:52.3145500Z
+2022-11-01T15:30:52.3145979Z [1;32mPASS[0m /datum/unit_test/species_whitelist_check 0s
+2022-11-01T15:30:52.3146421Z ##[endgroup]
+2022-11-01T15:30:52.3319686Z ##[group]/datum/unit_test/spell_invocations
+2022-11-01T15:30:52.3320202Z
+2022-11-01T15:30:52.3320653Z [1;32mPASS[0m /datum/unit_test/spell_invocations 0s
+2022-11-01T15:30:52.3321098Z ##[endgroup]
+2022-11-01T15:30:52.3490883Z ##[group]/datum/unit_test/mind_swap_spell
+2022-11-01T15:30:52.4036851Z
+2022-11-01T15:30:52.4037676Z [1;32mPASS[0m /datum/unit_test/mind_swap_spell 0.1s
+2022-11-01T15:30:52.4038275Z ##[endgroup]
+2022-11-01T15:30:52.4828774Z ##[group]/datum/unit_test/spell_names
+2022-11-01T15:30:52.4828988Z
+2022-11-01T15:30:52.4829550Z [1;32mPASS[0m /datum/unit_test/spell_names 0s
+2022-11-01T15:30:52.4829982Z ##[endgroup]
+2022-11-01T15:30:52.5000265Z ##[group]/datum/unit_test/shapeshift_spell_validity
+2022-11-01T15:30:52.5004478Z
+2022-11-01T15:30:52.5005145Z [1;32mPASS[0m /datum/unit_test/shapeshift_spell_validity 0.1s
+2022-11-01T15:30:52.5005621Z ##[endgroup]
+2022-11-01T15:30:52.5165907Z ##[group]/datum/unit_test/shapeshift_spell
+2022-11-01T15:30:52.8039754Z
+2022-11-01T15:30:52.8040573Z [1;32mPASS[0m /datum/unit_test/shapeshift_spell 0.3s
+2022-11-01T15:30:52.8041200Z ##[endgroup]
+2022-11-01T15:30:53.0783548Z ##[group]/datum/unit_test/shapeshift_holoparasites
+2022-11-01T15:30:53.1126288Z
+2022-11-01T15:30:53.1127333Z [1;32mPASS[0m /datum/unit_test/shapeshift_holoparasites 0.1s
+2022-11-01T15:30:53.1128391Z ##[endgroup]
+2022-11-01T15:30:53.1559214Z ##[group]/datum/unit_test/spritesheets
+2022-11-01T15:30:53.1593744Z
+2022-11-01T15:30:53.1596242Z [1;32mPASS[0m /datum/unit_test/spritesheets 0s
+2022-11-01T15:30:53.1599434Z ##[endgroup]
+2022-11-01T15:30:53.1775369Z ##[group]/datum/unit_test/stack_singular_name
+2022-11-01T15:30:53.1777955Z
+2022-11-01T15:30:53.1780282Z [1;32mPASS[0m /datum/unit_test/stack_singular_name 0s
+2022-11-01T15:30:53.1781032Z ##[endgroup]
+2022-11-01T15:30:53.1978111Z ##[group]/datum/unit_test/stomach
+2022-11-01T15:30:53.2306019Z
+2022-11-01T15:30:53.2308397Z [1;32mPASS[0m /datum/unit_test/stomach 0.1s
+2022-11-01T15:30:53.2311132Z ##[endgroup]
+2022-11-01T15:30:53.2563959Z ##[group]/datum/unit_test/strip_menu_ui_status
+2022-11-01T15:30:53.3090477Z
+2022-11-01T15:30:53.3091739Z [1;32mPASS[0m /datum/unit_test/strip_menu_ui_status 0.1s
+2022-11-01T15:30:53.3094850Z ##[endgroup]
+2022-11-01T15:30:53.3492514Z ##[group]/datum/unit_test/subsystem_init
+2022-11-01T15:30:53.3493184Z
+2022-11-01T15:30:53.3495636Z [1;32mPASS[0m /datum/unit_test/subsystem_init 0s
+2022-11-01T15:30:53.3498157Z ##[endgroup]
+2022-11-01T15:30:53.3664175Z ##[group]/datum/unit_test/suit_storage_icons
+2022-11-01T15:30:55.3207063Z 1 - /obj/item/ammo_casing/shotgun using invalid worn_icon_state, "shell"
+2022-11-01T15:30:55.3382821Z 2 - /obj/item/gun/ballistic/shotgun/hook using invalid icon_state, "hookshotgun"
+2022-11-01T15:30:55.3567861Z 3 - /obj/item/gun/ballistic/automatic/surplus using invalid icon_state, "surplus"
+2022-11-01T15:30:55.3745473Z 4 - /obj/item/gun/energy/beam_rifle using invalid icon_state, "esniper"
+2022-11-01T15:30:55.3772721Z 5 - /obj/item/gun/energy/lasercannon using invalid icon_state, "lasercannon"
+2022-11-01T15:30:55.3812025Z 6 - /obj/item/gun/energy/ionrifle using invalid icon_state, "ionrifle"
+2022-11-01T15:30:55.3814794Z 7 - /obj/item/gun/energy/ionrifle/carbine using invalid icon_state, "ioncarbine"
+2022-11-01T15:30:55.3984674Z 8 - /obj/item/tome using invalid icon_state, "tome"
+2022-11-01T15:30:55.4027757Z 9 - /obj/item/melee/sickly_blade/void using invalid icon_state, "void_blade"
+2022-11-01T15:30:55.4043373Z 10 - /obj/item/nullrod/staff using invalid icon_state, "godstaff-red"
+2022-11-01T15:30:55.4048073Z 11 - /obj/item/nullrod/staff/blue using invalid icon_state, "godstaff-blue"
+2022-11-01T15:30:55.4136802Z 12 - /obj/item/nullrod/tribal_knife using invalid icon_state, "crysknife"
+2022-11-01T15:30:55.4148858Z 13 - /obj/item/nullrod/spear using invalid icon_state, "ratvarian_spear"
+2022-11-01T15:30:55.4161026Z 14 - /obj/item/candle using invalid icon_state, "candle1"
+2022-11-01T15:30:55.4710008Z 15 - /obj/item/toy/eightball using invalid icon_state, "eightball"
+2022-11-01T15:30:55.4712397Z 16 - /obj/item/toy/mecha using invalid icon_state, "fivestarstoy"
+2022-11-01T15:30:55.4717528Z 17 - /obj/item/toy/mecha/ripley using invalid icon_state, "ripleytoy"
+2022-11-01T15:30:55.4720640Z 18 - /obj/item/toy/mecha/ripleymkii using invalid icon_state, "ripleymkiitoy"
+2022-11-01T15:30:55.4725923Z 19 - /obj/item/toy/mecha/hauler using invalid icon_state, "haulertoy"
+2022-11-01T15:30:55.4728709Z 20 - /obj/item/toy/mecha/clarke using invalid icon_state, "clarketoy"
+2022-11-01T15:30:55.4732862Z 21 - /obj/item/toy/mecha/odysseus using invalid icon_state, "odysseustoy"
+2022-11-01T15:30:55.4736959Z 22 - /obj/item/toy/mecha/gygax using invalid icon_state, "gygaxtoy"
+2022-11-01T15:30:55.4741521Z 23 - /obj/item/toy/mecha/durand using invalid icon_state, "durandtoy"
+2022-11-01T15:30:55.4745193Z 24 - /obj/item/toy/mecha/savannahivanov using invalid icon_state, "savannahivanovtoy"
+2022-11-01T15:30:55.4748259Z 25 - /obj/item/toy/mecha/phazon using invalid icon_state, "phazontoy"
+2022-11-01T15:30:55.4752835Z 26 - /obj/item/toy/mecha/honk using invalid icon_state, "honktoy"
+2022-11-01T15:30:55.4755743Z 27 - /obj/item/toy/mecha/darkgygax using invalid icon_state, "darkgygaxtoy"
+2022-11-01T15:30:55.4760291Z 28 - /obj/item/toy/mecha/mauler using invalid icon_state, "maulertoy"
+2022-11-01T15:30:55.4763840Z 29 - /obj/item/toy/mecha/darkhonk using invalid icon_state, "darkhonktoy"
+2022-11-01T15:30:55.4768684Z 30 - /obj/item/toy/mecha/deathripley using invalid icon_state, "deathripleytoy"
+2022-11-01T15:30:55.4772115Z 31 - /obj/item/toy/mecha/reticence using invalid icon_state, "reticencetoy"
+2022-11-01T15:30:55.4774925Z 32 - /obj/item/toy/mecha/marauder using invalid icon_state, "maraudertoy"
+2022-11-01T15:30:55.4779221Z 33 - /obj/item/toy/mecha/seraph using invalid icon_state, "seraphtoy"
+2022-11-01T15:30:55.4783197Z 34 - /obj/item/toy/mecha/firefighter using invalid icon_state, "firefightertoy"
+2022-11-01T15:30:55.4786820Z 35 - /obj/item/toy/waterballoon using invalid icon_state, "waterballoon-e"
+2022-11-01T15:30:55.4790265Z 36 - /obj/item/toy/balloon using invalid icon_state, "balloon"
+2022-11-01T15:30:55.4794733Z 37 - /obj/item/toy/balloon/corgi using invalid icon_state, "corgi"
+2022-11-01T15:30:55.4798121Z 38 - /obj/item/toy/balloon/syndicate using invalid icon_state, "syndballoon"
+2022-11-01T15:30:55.4800642Z 39 - /obj/item/toy/balloon/arrest using invalid icon_state, "arrestballoon"
+2022-11-01T15:30:55.4805597Z 40 - /obj/item/toy/captainsaid using invalid icon_state, "captainsaid_off"
+2022-11-01T15:30:55.4810625Z 41 - /obj/item/toy/spinningtoy using invalid icon_state, "singularity_s1"
+2022-11-01T15:30:55.4819042Z 42 - /obj/item/toy/ammo/gun using invalid icon_state, "357OLD-7"
+2022-11-01T15:30:55.4821247Z 43 - /obj/item/toy/sword using invalid icon_state, "e_sword"
+2022-11-01T15:30:55.4826674Z 44 - /obj/item/toy/foamblade using invalid icon_state, "foamblade"
+2022-11-01T15:30:55.4906032Z 45 - /obj/item/toy/windup_toolbox using invalid icon_state, "green"
+2022-11-01T15:30:55.4915446Z 46 - /obj/item/toy/snappop using invalid icon_state, "snappop"
+2022-11-01T15:30:55.4918336Z 47 - /obj/item/toy/talking using invalid icon_state, "owlprize"
+2022-11-01T15:30:55.4923506Z 48 - /obj/item/toy/talking/ai using invalid icon_state, "AI"
+2022-11-01T15:30:55.4927158Z 49 - /obj/item/toy/talking/codex_gigas using invalid icon_state, "demonomicon"
+2022-11-01T15:30:55.4931629Z 50 - /obj/item/toy/talking/griffin using invalid icon_state, "griffinprize"
+2022-11-01T15:30:55.4935255Z 51 - /obj/item/toy/nuke using invalid icon_state, "nuketoyidle"
+2022-11-01T15:30:55.4941687Z 52 - /obj/item/toy/minimeteor using invalid icon_state, "minimeteor"
+2022-11-01T15:30:55.4950575Z 53 - /obj/item/toy/redbutton using invalid icon_state, "bigred"
+2022-11-01T15:30:55.4951244Z 54 - /obj/item/toy/snowball using invalid icon_state, "snowball"
+2022-11-01T15:30:55.4954561Z 55 - /obj/item/toy/beach_ball using invalid icon_state, "ball"
+2022-11-01T15:30:55.4958662Z 56 - /obj/item/toy/beach_ball/baseball using invalid icon_state, "baseball"
+2022-11-01T15:30:55.4963000Z 57 - /obj/item/toy/beach_ball/holoball using invalid icon_state, "basketball"
+2022-11-01T15:30:55.4966965Z 58 - /obj/item/toy/beach_ball/holoball/dodgeball using invalid icon_state, "dodgeball"
+2022-11-01T15:30:55.4977748Z 59 - /obj/item/toy/toy_xeno using invalid icon_state, "toy_xeno"
+2022-11-01T15:30:55.4980250Z 60 - /obj/item/toy/cattoy using invalid icon_state, "toy_mouse"
+2022-11-01T15:30:55.4983618Z 61 - /obj/item/toy/figure using invalid icon_state, "nuketoy"
+2022-11-01T15:30:55.4987315Z 62 - /obj/item/toy/figure/cmo using invalid icon_state, "cmo"
+2022-11-01T15:30:55.4997139Z 63 - /obj/item/toy/figure/assistant using invalid icon_state, "assistant"
+2022-11-01T15:30:55.4997624Z 64 - /obj/item/toy/figure/atmos using invalid icon_state, "atmos"
+2022-11-01T15:30:55.4998070Z 65 - /obj/item/toy/figure/bartender using invalid icon_state, "bartender"
+2022-11-01T15:30:55.5000037Z 66 - /obj/item/toy/figure/borg using invalid icon_state, "borg"
+2022-11-01T15:30:55.5005726Z 67 - /obj/item/toy/figure/botanist using invalid icon_state, "botanist"
+2022-11-01T15:30:55.5009351Z 68 - /obj/item/toy/figure/captain using invalid icon_state, "captain"
+2022-11-01T15:30:55.5013740Z 69 - /obj/item/toy/figure/cargotech using invalid icon_state, "cargotech"
+2022-11-01T15:30:55.5017249Z 70 - /obj/item/toy/figure/ce using invalid icon_state, "ce"
+2022-11-01T15:30:55.5020387Z 71 - /obj/item/toy/figure/chaplain using invalid icon_state, "chaplain"
+2022-11-01T15:30:55.5024141Z 72 - /obj/item/toy/figure/chef using invalid icon_state, "chef"
+2022-11-01T15:30:55.5028293Z 73 - /obj/item/toy/figure/chemist using invalid icon_state, "chemist"
+2022-11-01T15:30:55.5031085Z 74 - /obj/item/toy/figure/clown using invalid icon_state, "clown"
+2022-11-01T15:30:55.5034369Z 75 - /obj/item/toy/figure/ian using invalid icon_state, "ian"
+2022-11-01T15:30:55.5038425Z 76 - /obj/item/toy/figure/detective using invalid icon_state, "detective"
+2022-11-01T15:30:55.5042175Z 77 - /obj/item/toy/figure/dsquad using invalid icon_state, "dsquad"
+2022-11-01T15:30:55.5046297Z 78 - /obj/item/toy/figure/engineer using invalid icon_state, "engineer"
+2022-11-01T15:30:55.5050167Z 79 - /obj/item/toy/figure/geneticist using invalid icon_state, "geneticist"
+2022-11-01T15:30:55.5053342Z 80 - /obj/item/toy/figure/hop using invalid icon_state, "hop"
+2022-11-01T15:30:55.5056872Z 81 - /obj/item/toy/figure/hos using invalid icon_state, "hos"
+2022-11-01T15:30:55.5060399Z 82 - /obj/item/toy/figure/qm using invalid icon_state, "qm"
+2022-11-01T15:30:55.5063872Z 83 - /obj/item/toy/figure/janitor using invalid icon_state, "janitor"
+2022-11-01T15:30:55.5067662Z 84 - /obj/item/toy/figure/lawyer using invalid icon_state, "lawyer"
+2022-11-01T15:30:55.5070895Z 85 - /obj/item/toy/figure/curator using invalid icon_state, "curator"
+2022-11-01T15:30:55.5074298Z 86 - /obj/item/toy/figure/md using invalid icon_state, "md"
+2022-11-01T15:30:55.5077555Z 87 - /obj/item/toy/figure/paramedic using invalid icon_state, "paramedic"
+2022-11-01T15:30:55.5080888Z 88 - /obj/item/toy/figure/psychologist using invalid icon_state, "psychologist"
+2022-11-01T15:30:55.5084180Z 89 - /obj/item/toy/figure/prisoner using invalid icon_state, "prisoner"
+2022-11-01T15:30:55.5087759Z 90 - /obj/item/toy/figure/mime using invalid icon_state, "mime"
+2022-11-01T15:30:55.5091521Z 91 - /obj/item/toy/figure/miner using invalid icon_state, "miner"
+2022-11-01T15:30:55.5094739Z 92 - /obj/item/toy/figure/ninja using invalid icon_state, "ninja"
+2022-11-01T15:30:55.5098467Z 93 - /obj/item/toy/figure/wizard using invalid icon_state, "wizard"
+2022-11-01T15:30:55.5101717Z 94 - /obj/item/toy/figure/rd using invalid icon_state, "rd"
+2022-11-01T15:30:55.5105157Z 95 - /obj/item/toy/figure/roboticist using invalid icon_state, "roboticist"
+2022-11-01T15:30:55.5108497Z 96 - /obj/item/toy/figure/scientist using invalid icon_state, "scientist"
+2022-11-01T15:30:55.5111745Z 97 - /obj/item/toy/figure/syndie using invalid icon_state, "syndie"
+2022-11-01T15:30:55.5115064Z 98 - /obj/item/toy/figure/secofficer using invalid icon_state, "secofficer"
+2022-11-01T15:30:55.5120612Z 99 - /obj/item/toy/figure/virologist using invalid icon_state, "virologist"
+2022-11-01T15:30:55.5123956Z 100 - /obj/item/toy/figure/warden using invalid icon_state, "warden"
+2022-11-01T15:30:55.5128284Z 101 - /obj/item/toy/dummy using invalid icon_state, "puppet"
+2022-11-01T15:30:55.5131152Z 102 - /obj/item/toy/seashell using invalid icon_state, "shell1"
+2022-11-01T15:30:55.5134593Z 103 - /obj/item/toy/brokenradio using invalid icon_state, "broken_radio"
+2022-11-01T15:30:55.5137892Z 104 - /obj/item/toy/braintoy using invalid icon_state, "brain-old"
+2022-11-01T15:30:55.5144558Z 105 - /obj/item/toy/reality_pierce using invalid icon_state, "pierced_illusion"
+2022-11-01T15:30:55.5147190Z 106 - /obj/item/toy/foamfinger using invalid icon_state, "foamfinger"
+2022-11-01T15:30:55.5150535Z 107 - /obj/item/toy/intento using invalid icon_state, "blank"
+2022-11-01T15:30:55.5198041Z 108 - /obj/item/toy/sprayoncan using invalid icon_state, "sprayoncan"
+2022-11-01T15:30:55.5200657Z 109 - /obj/item/toy/xmas_cracker using invalid icon_state, "cracker"
+2022-11-01T15:30:55.5207230Z 110 - /obj/item/cultivator/rake using invalid icon_state, "rake"
+2022-11-01T15:30:55.5214896Z 111 - /obj/item/hatchet/wooden using invalid icon_state, "woodhatchet"
+2022-11-01T15:30:55.5218699Z 112 - /obj/item/hatchet/cutterblade using invalid icon_state, "cutterblade"
+2022-11-01T15:30:55.6152861Z 113 - /obj/item/reagent_containers/hypospray/medipen using invalid worn_icon_state, "medipen"
+2022-11-01T15:30:55.6332977Z 114 - /obj/item/storage/pill_bottle using invalid icon_state, "pill_canister"
+2022-11-01T15:30:55.6344463Z 115 - /obj/item/analyzer/ranged using invalid icon_state, "analyzerranged"
+2022-11-01T15:30:55.6996164Z 116 - /obj/item/organ/internal/monster_core using invalid icon_state, "hivelord_core"
+2022-11-01T15:30:55.6996812Z 117 - /obj/item/organ/internal/monster_core/brimdust_sac using invalid icon_state, "brim_sac"
+2022-11-01T15:30:55.7000924Z 118 - /obj/item/organ/internal/monster_core/regenerative_core/legion using invalid icon_state, "legion_core"
+2022-11-01T15:30:55.7004434Z 119 - /obj/item/organ/internal/monster_core/rush_gland using invalid icon_state, "lobster_gland"
+2022-11-01T15:30:55.7019240Z 120 - /obj/item/spear/bamboospear using invalid icon_state, "bamboo_spear0"
+2022-11-01T15:30:55.7066737Z 121 - /obj/item/abductor/gizmo using invalid icon_state, "gizmo_scan"
+2022-11-01T15:30:55.7071949Z 122 - /obj/item/abductor/silencer using invalid icon_state, "silencer"
+2022-11-01T15:30:55.7074703Z 123 - /obj/item/abductor/mind_device using invalid icon_state, "mind_device_message"
+2022-11-01T15:30:55.7093947Z 124 - /obj/item/claymore/cutlass using invalid worn_icon_state, "cutlass"
+2022-11-01T15:30:55.7100530Z 125 - /obj/item/claymore/highlander/robot using invalid icon_state, "claymore_cyborg"
+2022-11-01T15:30:55.7103494Z 126 - /obj/item/banner using invalid icon_state, "banner"
+2022-11-01T15:30:55.7106179Z 127 - /obj/item/banner/security using invalid icon_state, "banner_security"
+2022-11-01T15:30:55.7109205Z 128 - /obj/item/banner/medical using invalid icon_state, "banner_medical"
+2022-11-01T15:30:55.7112253Z 129 - /obj/item/banner/science using invalid icon_state, "banner_science"
+2022-11-01T15:30:55.7115489Z 130 - /obj/item/banner/cargo using invalid icon_state, "banner_cargo"
+2022-11-01T15:30:55.7118625Z 131 - /obj/item/banner/engineering using invalid icon_state, "banner_engineering"
+2022-11-01T15:30:55.7121768Z 132 - /obj/item/banner/red using invalid icon_state, "banner-red"
+2022-11-01T15:30:55.7125528Z 133 - /obj/item/banner/blue using invalid icon_state, "banner-blue"
+2022-11-01T15:30:55.7173275Z 134 - /obj/item/gun/magic/staff using invalid icon_state, "staff"
+2022-11-01T15:30:55.7176309Z 135 - /obj/item/gun/magic/staff/change using invalid icon_state, "staffofchange"
+2022-11-01T15:30:55.7179814Z 136 - /obj/item/gun/magic/staff/animate using invalid icon_state, "staffofanimation"
+2022-11-01T15:30:55.7183703Z 137 - /obj/item/gun/magic/staff/healing using invalid icon_state, "staffofhealing"
+2022-11-01T15:30:55.7187827Z 138 - /obj/item/gun/magic/staff/chaos using invalid icon_state, "staffofchaos"
+2022-11-01T15:30:55.7191418Z 139 - /obj/item/gun/magic/staff/door using invalid icon_state, "staffofdoor"
+2022-11-01T15:30:55.7194614Z 140 - /obj/item/gun/magic/staff/honk using invalid icon_state, "honker"
+2022-11-01T15:30:55.7201412Z 141 - /obj/item/gun/magic/staff/locker using invalid worn_icon_state, "lockerstaff"
+2022-11-01T15:30:55.7204043Z 142 - /obj/item/gun/magic/staff/flying using invalid worn_icon_state, "flightstaff"
+2022-11-01T15:30:55.7207467Z 143 - /obj/item/gun/magic/staff/babel using invalid worn_icon_state, "babelstaff"
+2022-11-01T15:30:55.7211147Z 144 - /obj/item/gun/magic/staff/necropotence using invalid worn_icon_state, "necrostaff"
+2022-11-01T15:30:55.7215407Z 145 - /obj/item/gun/magic/staff/wipe using invalid worn_icon_state, "wipestaff"
+2022-11-01T15:30:55.7241733Z 146 - /obj/item/melee/energy/sword/pirate using invalid icon_state, "e_cutlass"
+2022-11-01T15:30:55.7244715Z 147 - /obj/item/clothing/glasses/eyepatch using invalid icon_state, "eyepatch"
+2022-11-01T15:30:55.7252484Z 148 - /obj/item/melee/energy/sword/cyborg/saw using invalid icon_state, "esaw"
+2022-11-01T15:30:55.7266561Z 149 - /obj/item/tank/jetpack/improvised using invalid worn_icon_state, "jetpack-improvised"
+2022-11-01T15:30:55.7274060Z 150 - /obj/item/multitool using invalid icon_state, "multitool"
+2022-11-01T15:30:55.7276378Z 151 - /obj/item/multitool/cyborg using invalid icon_state, "multitool_cyborg"
+2022-11-01T15:30:55.7280858Z 152 - /obj/item/multitool/circuit using invalid icon_state, "multitool_circuit"
+2022-11-01T15:30:55.7284308Z 153 - /obj/item/storage/bag/trash using invalid icon_state, "trashbag"
+2022-11-01T15:30:55.7287840Z 154 - /obj/item/storage/bag/trash/bluespace using invalid icon_state, "bluetrashbag"
+2022-11-01T15:30:55.7290759Z 155 - /obj/item/cane using invalid icon_state, "cane"
+2022-11-01T15:30:55.7294298Z 156 - /obj/item/cane/white using invalid icon_state, "cane_white"
+2022-11-01T15:30:55.7297184Z 157 - /obj/item/megaphone/clown using invalid icon_state, "megaphone-clown"
+2022-11-01T15:30:55.7318542Z 158 - /obj/item/food/pie/cream using invalid icon_state, "pie"
+2022-11-01T15:30:55.7334187Z 159 - /obj/item/instrument/bikehorn using invalid icon_state, "bike_horn"
+2022-11-01T15:30:55.7337088Z 160 - /obj/item/reagent_containers/cup/soda_cans/canned_laughter using invalid icon_state, "laughter"
+2022-11-01T15:30:55.7358710Z 161 - /obj/item/grown/bananapeel using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7362056Z 162 - /obj/item/grown/bananapeel/bombanana using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7363000Z 163 - /obj/item/grown/bananapeel/mimanapeel using invalid icon_state, "mimana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7367080Z 164 - /obj/item/grown/bananapeel/bluespace using invalid icon_state, "bluenana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7368175Z 165 - /obj/item/grown/bananapeel/specialpeel using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7369395Z 166 - /obj/item/food/grown/banana using invalid icon_state, "banana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7372848Z 167 - /obj/item/food/grown/banana/bombanana using invalid icon_state, "banana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7373761Z 168 - /obj/item/food/grown/banana/mime using invalid icon_state, "mimana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7377078Z 169 - /obj/item/food/grown/banana/bluespace using invalid icon_state, "bluenana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7377931Z 170 - /obj/item/food/grown/banana/bunch using invalid icon_state, "banana_bunch" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-01T15:30:55.7380762Z 171 - /obj/item/stack/spacecash/c1 using invalid icon_state, "spacecash1"
+2022-11-01T15:30:55.7381375Z 172 - /obj/item/stack/spacecash/c10 using invalid icon_state, "spacecash10"
+2022-11-01T15:30:55.7381845Z 173 - /obj/item/stack/spacecash/c20 using invalid icon_state, "spacecash20"
+2022-11-01T15:30:55.7384576Z 174 - /obj/item/stack/spacecash/c50 using invalid icon_state, "spacecash50"
+2022-11-01T15:30:55.7385391Z 175 - /obj/item/stack/spacecash/c100 using invalid icon_state, "spacecash100"
+2022-11-01T15:30:55.7386850Z 176 - /obj/item/stack/spacecash/c200 using invalid icon_state, "spacecash200"
+2022-11-01T15:30:55.7389337Z 177 - /obj/item/stack/spacecash/c500 using invalid icon_state, "spacecash500"
+2022-11-01T15:30:55.7394435Z 178 - /obj/item/stack/spacecash/c1000 using invalid icon_state, "spacecash1000"
+2022-11-01T15:30:55.7397872Z 179 - /obj/item/stack/spacecash/c10000 using invalid icon_state, "spacecash10000"
+2022-11-01T15:30:55.7401273Z 180 - /obj/item/clothing/mask/facehugger/toy using invalid worn_icon_state, "facehugger"
+2022-11-01T15:30:55.7415134Z 181 - /obj/item/kitchen/fork using invalid icon_state, "fork"
+2022-11-01T15:30:55.7417371Z 182 - /obj/item/kitchen/fork/plastic using invalid icon_state, "plastic_fork"
+2022-11-01T15:30:55.7428215Z 183 - /obj/item/kitchen/spoon using invalid icon_state, "spoon"
+2022-11-01T15:30:55.7429945Z 184 - /obj/item/kitchen/spoon/plastic using invalid icon_state, "plastic_spoon"
+2022-11-01T15:30:55.7442913Z 185 - /obj/item/bonesetter using invalid icon_state, "bonesetter"
+2022-11-01T15:30:55.7446497Z 186 - /obj/item/cautery using invalid icon_state, "cautery"
+2022-11-01T15:30:55.7450823Z 187 - /obj/item/cautery/advanced using invalid icon_state, "e_cautery"
+2022-11-01T15:30:55.7453942Z 188 - /obj/item/hemostat using invalid icon_state, "hemostat"
+2022-11-01T15:30:55.7457254Z 189 - /obj/item/hemostat/supermatter using invalid icon_state, "supermatter_tongs"
+2022-11-01T15:30:55.7459972Z 190 - /obj/item/retractor using invalid icon_state, "retractor"
+2022-11-01T15:30:55.7463122Z 191 - /obj/item/retractor/advanced using invalid icon_state, "adv_retractor"
+2022-11-01T15:30:55.7466265Z 192 - /obj/item/scalpel using invalid icon_state, "scalpel"
+2022-11-01T15:30:55.7469369Z 193 - /obj/item/scalpel/supermatter using invalid icon_state, "supermatter_scalpel"
+2022-11-01T15:30:55.7472302Z 194 - /obj/item/scalpel/advanced using invalid icon_state, "e_scalpel"
+2022-11-01T15:30:55.7475283Z 195 - /obj/item/surgical_drapes using invalid icon_state, "surgical_drapes"
+2022-11-01T15:30:55.7481626Z 196 - /obj/item/stack/medical/bruise_pack using invalid icon_state, "brutepack"
+2022-11-01T15:30:55.7483890Z 197 - /obj/item/stack/medical/gauze using invalid icon_state, "gauze"
+2022-11-01T15:30:55.7488309Z 198 - /obj/item/stack/medical/suture using invalid icon_state, "suture"
+2022-11-01T15:30:55.7491279Z 199 - /obj/item/stack/medical/suture/medicated using invalid icon_state, "suture_purp"
+2022-11-01T15:30:55.7494706Z 200 - /obj/item/stack/medical/ointment using invalid icon_state, "ointment"
+2022-11-01T15:30:55.7498204Z 201 - /obj/item/stack/medical/mesh using invalid icon_state, "regen_mesh"
+2022-11-01T15:30:55.7501745Z 202 - /obj/item/stack/medical/mesh/advanced using invalid icon_state, "aloe_mesh"
+2022-11-01T15:30:55.7505332Z 203 - /obj/item/stack/medical/aloe using invalid icon_state, "aloe_paste"
+2022-11-01T15:30:55.7508511Z 204 - /obj/item/stack/medical/bone_gel using invalid icon_state, "bone-gel"
+2022-11-01T15:30:55.7511537Z 205 - /obj/item/stack/medical/poultice using invalid icon_state, "poultice"
+2022-11-01T15:30:55.7514762Z 206 - /obj/item/assembly/flash/handheld using invalid icon_state, "flash"
+2022-11-01T15:30:55.7518179Z 207 - /obj/item/clothing/mask/cigarette using invalid icon_state, "cigoff"
+2022-11-01T15:30:55.7521263Z 208 - /obj/item/clothing/mask/cigarette/rollie using invalid icon_state, "spliffoff"
+2022-11-01T15:30:55.7525138Z 209 - /obj/item/clothing/mask/cigarette/candy using invalid icon_state, "candyoff"
+2022-11-01T15:30:55.7529005Z 210 - /obj/item/clothing/mask/cigarette/cigar using invalid icon_state, "cigaroff"
+2022-11-01T15:30:55.7532227Z 211 - /obj/item/clothing/mask/cigarette/cigar/cohiba using invalid icon_state, "cigar2off"
+2022-11-01T15:30:55.7535378Z 212 - /obj/item/clothing/mask/cigarette/pipe using invalid icon_state, "pipeoff"
+2022-11-01T15:30:55.7538704Z 213 - /obj/item/clothing/mask/cigarette/pipe/cobpipe using invalid icon_state, "cobpipeoff"
+2022-11-01T15:30:55.7541822Z 214 - /obj/item/disk using invalid icon_state, "datadisk0"
+2022-11-01T15:30:55.7547750Z 215 - /obj/item/disk/holodisk using invalid icon_state, "holodisk"
+2022-11-01T15:30:55.7551232Z 216 - /obj/item/disk/nuclear using invalid icon_state, "nucleardisk"
+2022-11-01T15:30:55.7554426Z 217 - /obj/item/disk/surgery using invalid icon_state, "datadisk1"
+2022-11-01T15:30:55.7558238Z 218 - /obj/item/disk/cargo/bluespace_pod using invalid icon_state, "cargodisk"
+2022-11-01T15:30:55.7561786Z 219 - /obj/item/disk/tech_disk/major using invalid icon_state, "rndmajordisk"
+2022-11-01T15:30:55.7566298Z 220 - /obj/item/melee/powerfist using invalid icon_state, "powerfist"
+2022-11-01T15:30:55.7579366Z 221 - /obj/item/melee/skateboard using invalid icon_state, "skateboard"
+2022-11-01T15:30:55.7581695Z 222 - /obj/item/melee/skateboard/pro using invalid icon_state, "skateboard2"
+2022-11-01T15:30:55.7586449Z 223 - /obj/item/melee/skateboard/hoverboard using invalid icon_state, "hoverboard_red"
+2022-11-01T15:30:55.7589798Z 224 - /obj/item/melee/skateboard/hoverboard/admin using invalid icon_state, "hoverboard_nt"
+2022-11-01T15:30:55.7593858Z 225 - /obj/item/melee/baseball_bat using invalid icon_state, "baseball_bat"
+2022-11-01T15:30:55.7597594Z 226 - /obj/item/melee/baseball_bat/homerun using invalid icon_state, "baseball_bat_home"
+2022-11-01T15:30:55.7600520Z 227 - /obj/item/melee/baseball_bat/ablative using invalid icon_state, "baseball_bat_metal"
+2022-11-01T15:30:55.7604782Z 228 - /obj/item/melee/flyswatter using invalid icon_state, "flyswatter"
+2022-11-01T15:30:55.7611481Z 229 - /obj/item/melee/energy/axe using invalid icon_state, "axe"
+2022-11-01T15:30:55.7613484Z 230 - /obj/item/melee/energy/blade using invalid icon_state, "blade"
+2022-11-01T15:30:55.7618410Z 231 - /obj/item/melee/energy/blade/hardlight using invalid icon_state, "lightblade"
+2022-11-01T15:30:55.7620400Z 232 - /obj/item/melee/synthetic_arm_blade using invalid icon_state, "arm_blade"
+2022-11-01T15:30:55.7624742Z 233 - /obj/item/melee/sabre using invalid icon_state, "sabre"
+2022-11-01T15:30:55.7628282Z 234 - /obj/item/melee/beesword using invalid worn_icon_state, "stinger"
+2022-11-01T15:30:55.7631104Z 235 - /obj/item/melee/supermatter_sword using invalid icon_state, "supermatter_sword"
+2022-11-01T15:30:55.7640059Z 236 - /obj/item/melee/cleric_mace using invalid worn_icon_state, "default_worn"
+2022-11-01T15:30:55.7642519Z 237 - /obj/item/melee/rune_carver using invalid icon_state, "rune_carver"
+2022-11-01T15:30:55.7649015Z 238 - /obj/item/melee/ghost_sword using invalid icon_state, "spectral"
+2022-11-01T15:30:55.7652669Z 239 - /obj/item/reagent_containers/cup/glass/flask using invalid icon_state, "flask"
+2022-11-01T15:30:55.7656181Z 240 - /obj/item/reagent_containers/cup/glass/flask/gold using invalid icon_state, "flask_gold"
+2022-11-01T15:30:55.7659386Z 241 - /obj/item/reagent_containers/cup/glass/flask/det using invalid icon_state, "detflask"
+2022-11-01T15:30:55.7661823Z 242 - /obj/item/stamp using invalid icon_state, "stamp-ok"
+2022-11-01T15:30:55.7665189Z 243 - /obj/item/stamp/qm using invalid icon_state, "stamp-qm"
+2022-11-01T15:30:55.7668223Z 244 - /obj/item/stamp/law using invalid icon_state, "stamp-law"
+2022-11-01T15:30:55.7671146Z 245 - /obj/item/stamp/captain using invalid icon_state, "stamp-cap"
+2022-11-01T15:30:55.7674101Z 246 - /obj/item/stamp/hop using invalid icon_state, "stamp-hop"
+2022-11-01T15:30:55.7677062Z 247 - /obj/item/stamp/hos using invalid icon_state, "stamp-hos"
+2022-11-01T15:30:55.7679998Z 248 - /obj/item/stamp/ce using invalid icon_state, "stamp-ce"
+2022-11-01T15:30:55.7684534Z 249 - /obj/item/stamp/rd using invalid icon_state, "stamp-rd"
+2022-11-01T15:30:55.7688688Z 250 - /obj/item/stamp/cmo using invalid icon_state, "stamp-cmo"
+2022-11-01T15:30:55.7691562Z 251 - /obj/item/stamp/denied using invalid icon_state, "stamp-deny"
+2022-11-01T15:30:55.7694516Z 252 - /obj/item/stamp/void using invalid icon_state, "stamp-void"
+2022-11-01T15:30:55.7697505Z 253 - /obj/item/stamp/clown using invalid icon_state, "stamp-clown"
+2022-11-01T15:30:55.7708237Z 254 - /obj/item/stamp/mime using invalid icon_state, "stamp-mime"
+2022-11-01T15:30:55.7708827Z 255 - /obj/item/stamp/chap using invalid icon_state, "stamp-chap"
+2022-11-01T15:30:55.7709256Z 256 - /obj/item/stamp/centcom using invalid icon_state, "stamp-centcom"
+2022-11-01T15:30:55.7751313Z 257 - /obj/item/stamp/syndicate using invalid icon_state, "stamp-syndicate"
+2022-11-01T15:30:55.7752422Z 258 - /obj/item/storage/lockbox/medal using invalid icon_state, "medalbox+l"
+2022-11-01T15:30:55.7752898Z 259 - /obj/item/crowbar/red/caravan using invalid icon_state, "crowbar_caravan"
+2022-11-01T15:30:55.7757058Z 260 - /obj/item/crowbar/drone using invalid icon_state, "crowbar_cyborg"
+2022-11-01T15:30:55.7784906Z
+2022-11-01T15:30:55.7785304Z [1;32mPASS[0m /datum/unit_test/suit_storage_icons 2.4s
+2022-11-01T15:30:55.7786128Z ##[endgroup]
+2022-11-01T15:30:58.1989647Z ##[group]/datum/unit_test/amputation
+2022-11-01T15:30:58.2542620Z
+2022-11-01T15:30:58.2543982Z [1;32mPASS[0m /datum/unit_test/amputation 0.1s
+2022-11-01T15:30:58.2545007Z ##[endgroup]
+2022-11-01T15:30:58.2861052Z ##[group]/datum/unit_test/brain_surgery
+2022-11-01T15:30:58.3393398Z
+2022-11-01T15:30:58.3395072Z [1;32mPASS[0m /datum/unit_test/brain_surgery 0.1s
+2022-11-01T15:30:58.3396351Z ##[endgroup]
+2022-11-01T15:30:58.3713295Z ##[group]/datum/unit_test/head_transplant
+2022-11-01T15:30:58.4648885Z
+2022-11-01T15:30:58.4650964Z [1;32mPASS[0m /datum/unit_test/head_transplant 0.1s
+2022-11-01T15:30:58.4652113Z ##[endgroup]
+2022-11-01T15:30:58.5529908Z ##[group]/datum/unit_test/multiple_surgeries
+2022-11-01T15:30:58.6322272Z
+2022-11-01T15:30:58.6323733Z [1;32mPASS[0m /datum/unit_test/multiple_surgeries 0.1s
+2022-11-01T15:30:58.6324863Z ##[endgroup]
+2022-11-01T15:30:58.7192842Z ##[group]/datum/unit_test/start_tend_wounds
+2022-11-01T15:30:58.7696686Z
+2022-11-01T15:30:58.7697933Z [1;32mPASS[0m /datum/unit_test/start_tend_wounds 0s
+2022-11-01T15:30:58.7699007Z ##[endgroup]
+2022-11-01T15:30:58.8006481Z ##[group]/datum/unit_test/tend_wounds
+2022-11-01T15:30:58.9098267Z
+2022-11-01T15:30:58.9099817Z [1;32mPASS[0m /datum/unit_test/tend_wounds 0.1s
+2022-11-01T15:30:58.9100900Z ##[endgroup]
+2022-11-01T15:30:59.0574781Z ##[group]/datum/unit_test/auto_teleporter_linking
+2022-11-01T15:30:59.0986969Z
+2022-11-01T15:30:59.0988029Z [1;32mPASS[0m /datum/unit_test/auto_teleporter_linking 0s
+2022-11-01T15:30:59.0989210Z ##[endgroup]
+2022-11-01T15:30:59.1397849Z ##[group]/datum/unit_test/tgui_create_message
+2022-11-01T15:30:59.1398053Z
+2022-11-01T15:30:59.1398515Z [1;32mPASS[0m /datum/unit_test/tgui_create_message 0s
+2022-11-01T15:30:59.1398931Z ##[endgroup]
+2022-11-01T15:30:59.1585159Z ##[group]/datum/unit_test/timer_sanity
+2022-11-01T15:30:59.1585371Z
+2022-11-01T15:30:59.1585837Z [1;32mPASS[0m /datum/unit_test/timer_sanity 0s
+2022-11-01T15:30:59.1586293Z ##[endgroup]
+2022-11-01T15:30:59.1763570Z ##[group]/datum/unit_test/traitor
+2022-11-01T15:31:01.0798012Z
+2022-11-01T15:31:01.0799101Z [1;32mPASS[0m /datum/unit_test/traitor 1.9s
+2022-11-01T15:31:01.0799858Z ##[endgroup]
+2022-11-01T15:31:05.2187120Z ##[group]/datum/unit_test/verify_config_tags
+2022-11-01T15:31:05.2190123Z
+2022-11-01T15:31:05.2191991Z [1;32mPASS[0m /datum/unit_test/verify_config_tags 0s
+2022-11-01T15:31:05.2193777Z ##[endgroup]
+2022-11-01T15:31:05.2366479Z ##[group]/datum/unit_test/wizard_loadout
+2022-11-01T15:31:05.3463154Z
+2022-11-01T15:31:05.3463988Z [1;32mPASS[0m /datum/unit_test/wizard_loadout 0.1s
+2022-11-01T15:31:05.3465519Z ##[endgroup]
+2022-11-01T15:31:05.4918147Z ##[group]/datum/unit_test/find_reference_sanity
+2022-11-01T15:31:05.4922156Z
+2022-11-01T15:31:05.4923183Z [1;32mPASS[0m /datum/unit_test/find_reference_sanity 0s
+2022-11-01T15:31:05.4924120Z ##[endgroup]
+2022-11-01T15:31:05.5122652Z ##[group]/datum/unit_test/find_reference_baseline
+2022-11-01T15:31:05.5126059Z
+2022-11-01T15:31:05.5126875Z [1;32mPASS[0m /datum/unit_test/find_reference_baseline 0s
+2022-11-01T15:31:05.5127655Z ##[endgroup]
+2022-11-01T15:31:05.5361446Z ##[group]/datum/unit_test/find_reference_exotic
+2022-11-01T15:31:05.5367626Z
+2022-11-01T15:31:05.5369228Z [1;32mPASS[0m /datum/unit_test/find_reference_exotic 0s
+2022-11-01T15:31:05.5369940Z ##[endgroup]
+2022-11-01T15:31:05.5551795Z ##[group]/datum/unit_test/find_reference_esoteric
+2022-11-01T15:31:05.5558725Z
+2022-11-01T15:31:05.5559583Z [1;32mPASS[0m /datum/unit_test/find_reference_esoteric 0s
+2022-11-01T15:31:05.5560670Z ##[endgroup]
+2022-11-01T15:31:05.5737466Z ##[group]/datum/unit_test/find_reference_null_key_entry
+2022-11-01T15:31:05.5741407Z
+2022-11-01T15:31:05.5742596Z [1;32mPASS[0m /datum/unit_test/find_reference_null_key_entry 0s
+2022-11-01T15:31:05.5743489Z ##[endgroup]
+2022-11-01T15:31:05.6053804Z ##[group]/datum/unit_test/find_reference_assoc_investigation
+2022-11-01T15:31:05.6057935Z
+2022-11-01T15:31:05.6058863Z [1;32mPASS[0m /datum/unit_test/find_reference_assoc_investigation 0s
+2022-11-01T15:31:05.6060051Z ##[endgroup]
+2022-11-01T15:31:05.6233030Z ##[group]/datum/unit_test/find_reference_static_investigation
+2022-11-01T15:31:05.8520469Z
+2022-11-01T15:31:05.8521954Z [1;32mPASS[0m /datum/unit_test/find_reference_static_investigation 0.2s
+2022-11-01T15:31:05.8523118Z ##[endgroup]
+2022-11-01T15:31:06.0724951Z ##[group]/datum/unit_test/monkey_business
+2022-11-01T15:31:23.2321441Z [15:31:23] Runtime in _forensics.dm,232: Cannot execute null.resolve().
+2022-11-01T15:31:23.2322464Z proc name: check blood (/datum/forensics/proc/check_blood)
+2022-11-01T15:31:23.2323531Z src: /datum/forensics (/datum/forensics)
+2022-11-01T15:31:23.2323854Z call stack:
+2022-11-01T15:31:23.2324155Z /datum/forensics (/datum/forensics): check blood()
+2022-11-01T15:31:23.2325062Z /datum/forensics (/datum/forensics): New(the blood splatter (/obj/effect/decal/cleanable/blood/hitsplatter), null, null, /list (/list), null)
+2022-11-01T15:31:23.2325582Z the blood splatter (/obj/effect/decal/cleanable/blood/hitsplatter): add blood DNA(/list (/list))
+2022-11-01T15:31:23.2326006Z Anthony Hayhurst (461) (/mob/living/carbon/human): spray blood(2, 1)
+2022-11-01T15:31:23.2326395Z Rough Abrasion (/datum/wound/slash/flesh/moderate): wound injury(null, 2)
+2022-11-01T15:31:23.2327172Z Rough Abrasion (/datum/wound/slash/flesh/moderate): apply wound(the monkey left leg (/obj/item/bodypart/l_leg/monkey), 0, null, 0, 2)
+2022-11-01T15:31:23.2327747Z the monkey left leg (/obj/item/bodypart/l_leg/monkey): check wounding(2, 8, 5, 15, 2)
+2022-11-01T15:31:23.2328155Z the monkey left leg (/obj/item/bodypart/l_leg/monkey): receive damage(8, 0, 0, 0, 1, null, 5, 15, 1, 2)
+2022-11-01T15:31:23.2328594Z Monkey (/datum/species/monkey): apply damage(8, "brute", "l_leg", 0, Anthony Hayhurst (461) (/mob/living/carbon/human), 0, 0, 5, 15, 1, 2)
+2022-11-01T15:31:23.2329362Z Monkey (/datum/species/monkey): spec attacked by(the glass shiv (/obj/item/knife/shiv), Abigail Schmidt (295) (/mob/living/carbon/human), the monkey left leg (/obj/item/bodypart/l_leg/monkey), Anthony Hayhurst (461) (/mob/living/carbon/human))
+2022-11-01T15:31:23.2329835Z ...
+2022-11-01T15:31:23.2330578Z Anthony Hayhurst (461) (/mob/living/carbon/human): attackby(the glass shiv (/obj/item/knife/shiv), Abigail Schmidt (295) (/mob/living/carbon/human), null)
+2022-11-01T15:31:23.2331348Z the glass shiv (/obj/item/knife/shiv): melee attack chain(Abigail Schmidt (295) (/mob/living/carbon/human), Anthony Hayhurst (461) (/mob/living/carbon/human), null)
+2022-11-01T15:31:23.2332042Z /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob): monkey attack(/datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry), Anthony Hayhurst (461) (/mob/living/carbon/human), 0.8, 0)
+2022-11-01T15:31:23.2332773Z /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob): perform(0.8, /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry), "BB_monkey_current_attack_targe...")
+2022-11-01T15:31:23.2333442Z /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry): ProcessBehavior(0.8, /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob))
+2022-11-01T15:31:23.2333980Z /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry): process(0.1)
+2022-11-01T15:31:23.2334424Z AI Behavior Ticker (/datum/controller/subsystem/processing/ai_behaviors): fire(0)
+2022-11-01T15:31:23.2334875Z AI Behavior Ticker (/datum/controller/subsystem/processing/ai_behaviors): ignite(0)
+2022-11-01T15:31:23.2335885Z Master (/datum/controller/master): Loop(2)
+2022-11-01T15:31:23.2336391Z Master (/datum/controller/master): StartProcessing(0)
+2022-11-01T15:31:44.6315657Z ##[error][15:31:23] Runtime in _forensics.dm,232: Cannot execute null.resolve().
+ proc name: check blood (/datum/forensics/proc/check_blood)
+ src: /datum/forensics (/datum/forensics)
+ call stack:
+ /datum/forensics (/datum/forensics): check blood()
+ /datum/forensics (/datum/forensics): New(the blood splatter (/obj/effect/decal/cleanable/blood/hitsplatter), null, null, /list (/list), null)
+ the blood splatter (/obj/effect/decal/cleanable/blood/hitsplatter): add blood DNA(/list (/list))
+ Anthony Hayhurst (461) (/mob/living/carbon/human): spray blood(2, 1)
+ Rough Abrasion (/datum/wound/slash/flesh/moderate): wound injury(null, 2)
+ Rough Abrasion (/datum/wound/slash/flesh/moderate): apply wound(the monkey left leg (/obj/item/bodypart/l_leg/monkey), 0, null, 0, 2)
+ the monkey left leg (/obj/item/bodypart/l_leg/monkey): check wounding(2, 8, 5, 15, 2)
+ the monkey left leg (/obj/item/bodypart/l_leg/monkey): receive damage(8, 0, 0, 0, 1, null, 5, 15, 1, 2)
+ Monkey (/datum/species/monkey): apply damage(8, "brute", "l_leg", 0, Anthony Hayhurst (461) (/mob/living/carbon/human), 0, 0, 5, 15, 1, 2)
+ Monkey (/datum/species/monkey): spec attacked by(the glass shiv (/obj/item/knife/shiv), Abigail Schmidt (295) (/mob/living/carbon/human), the monkey left leg (/obj/item/bodypart/l_leg/monkey), Anthony Hayhurst (461) (/mob/living/carbon/human))
+ ...
+ Anthony Hayhurst (461) (/mob/living/carbon/human): attackby(the glass shiv (/obj/item/knife/shiv), Abigail Schmidt (295) (/mob/living/carbon/human), null)
+ the glass shiv (/obj/item/knife/shiv): melee attack chain(Abigail Schmidt (295) (/mob/living/carbon/human), Anthony Hayhurst (461) (/mob/living/carbon/human), null)
+ /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob): monkey attack(/datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry), Anthony Hayhurst (461) (/mob/living/carbon/human), 0.8, 0)
+ /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob): perform(0.8, /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry), "BB_monkey_current_attack_targe...")
+ /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry): ProcessBehavior(0.8, /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob))
+ /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry): process(0.1)
+ AI Behavior Ticker (/datum/controller/subsystem/processing/ai_behaviors): fire(0)
+ AI Behavior Ticker (/datum/controller/subsystem/processing/ai_behaviors): ignite(0)
+ Master (/datum/controller/master): Loop(2)
+ Master (/datum/controller/master): StartProcessing(0)
+2022-11-01T15:31:44.6330863Z ##[error]Monkey Business caused 1 runtimes
+2022-11-01T15:31:44.6331536Z FAILURE #1: [15:31:23] Runtime in _forensics.dm,232: Cannot execute null.resolve().
+2022-11-01T15:31:44.6331910Z proc name: check blood (/datum/forensics/proc/check_blood)
+2022-11-01T15:31:44.6332223Z src: /datum/forensics (/datum/forensics)
+2022-11-01T15:31:44.6332475Z call stack:
+2022-11-01T15:31:44.6332738Z /datum/forensics (/datum/forensics): check blood()
+2022-11-01T15:31:44.6333171Z /datum/forensics (/datum/forensics): New(the blood splatter (/obj/effect/decal/cleanable/blood/hitsplatter), null, null, /list (/list), null)
+2022-11-01T15:31:44.6333653Z the blood splatter (/obj/effect/decal/cleanable/blood/hitsplatter): add blood DNA(/list (/list))
+2022-11-01T15:31:44.6334238Z Anthony Hayhurst (461) (/mob/living/carbon/human): spray blood(2, 1)
+2022-11-01T15:31:44.6334605Z Rough Abrasion (/datum/wound/slash/flesh/moderate): wound injury(null, 2)
+2022-11-01T15:31:44.6335055Z Rough Abrasion (/datum/wound/slash/flesh/moderate): apply wound(the monkey left leg (/obj/item/bodypart/l_leg/monkey), 0, null, 0, 2)
+2022-11-01T15:31:44.6335679Z the monkey left leg (/obj/item/bodypart/l_leg/monkey): check wounding(2, 8, 5, 15, 2)
+2022-11-01T15:31:44.6336429Z the monkey left leg (/obj/item/bodypart/l_leg/monkey): receive damage(8, 0, 0, 0, 1, null, 5, 15, 1, 2)
+2022-11-01T15:31:44.6336913Z Monkey (/datum/species/monkey): apply damage(8, "brute", "l_leg", 0, Anthony Hayhurst (461) (/mob/living/carbon/human), 0, 0, 5, 15, 1, 2)
+2022-11-01T15:31:44.6337727Z Monkey (/datum/species/monkey): spec attacked by(the glass shiv (/obj/item/knife/shiv), Abigail Schmidt (295) (/mob/living/carbon/human), the monkey left leg (/obj/item/bodypart/l_leg/monkey), Anthony Hayhurst (461) (/mob/living/carbon/human))
+2022-11-01T15:31:44.6338196Z ...
+2022-11-01T15:31:44.6338557Z Anthony Hayhurst (461) (/mob/living/carbon/human): attackby(the glass shiv (/obj/item/knife/shiv), Abigail Schmidt (295) (/mob/living/carbon/human), null)
+2022-11-01T15:31:44.6339113Z the glass shiv (/obj/item/knife/shiv): melee attack chain(Abigail Schmidt (295) (/mob/living/carbon/human), Anthony Hayhurst (461) (/mob/living/carbon/human), null)
+2022-11-01T15:31:44.6339859Z /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob): monkey attack(/datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry), Anthony Hayhurst (461) (/mob/living/carbon/human), 0.8, 0)
+2022-11-01T15:31:44.6340560Z /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob): perform(0.8, /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry), "BB_monkey_current_attack_targe...")
+2022-11-01T15:31:44.6341189Z /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry): ProcessBehavior(0.8, /datum/ai_behavior/monkey_atta... (/datum/ai_behavior/monkey_attack_mob))
+2022-11-01T15:31:44.6341689Z /datum/ai_controller/monkey/an... (/datum/ai_controller/monkey/angry): process(0.1)
+2022-11-01T15:31:44.6342103Z AI Behavior Ticker (/datum/controller/subsystem/processing/ai_behaviors): fire(0)
+2022-11-01T15:31:44.6342523Z AI Behavior Ticker (/datum/controller/subsystem/processing/ai_behaviors): ignite(0)
+2022-11-01T15:31:44.6342869Z Master (/datum/controller/master): Loop(2)
+2022-11-01T15:31:44.6343234Z Master (/datum/controller/master): StartProcessing(0) at _forensics.dm:232
+2022-11-01T15:31:44.6345243Z ##[error][1;31mFAIL[0m /datum/unit_test/monkey_business 38.6s
+2022-11-01T15:31:46.9833542Z ##[group]/datum/unit_test/create_and_destroy
+2022-11-01T15:37:15.1785471Z
+2022-11-01T15:37:15.1787041Z [1;32mPASS[0m /datum/unit_test/create_and_destroy 328.2s
+2022-11-01T15:37:15.1788074Z ##[endgroup]
+2022-11-01T15:37:15.2115771Z Shutting down Chat subsystem...
+2022-11-01T15:37:15.2116567Z Shutting down Init Profiler subsystem...
+2022-11-01T15:37:15.2208167Z Shutting down Ban Cache subsystem...
+2022-11-01T15:37:15.2208478Z Shutting down Stat Panels subsystem...
+2022-11-01T15:37:15.2208750Z Shutting down Explosions subsystem...
+2022-11-01T15:37:15.2209680Z Shutting down Pathfinder subsystem...
+2022-11-01T15:37:15.2210086Z Shutting down Minor Mapping subsystem...
+2022-11-01T15:37:15.2210409Z Shutting down Shuttle subsystem...
+2022-11-01T15:37:15.2210690Z Shutting down Lighting subsystem...
+2022-11-01T15:37:15.2210997Z Shutting down XKeyScore subsystem...
+2022-11-01T15:37:15.2211299Z Shutting down PRISM subsystem...
+2022-11-01T15:37:15.2211603Z Shutting down Icon Smoothing subsystem...
+2022-11-01T15:37:15.2211910Z Shutting down Assets subsystem...
+2022-11-01T15:37:15.2212179Z Shutting down Vote subsystem...
+2022-11-01T15:37:15.2212502Z Shutting down Persistent Paintings subsystem...
+2022-11-01T15:37:15.2212991Z Shutting down Persistence subsystem...
+2022-11-01T15:37:15.2213473Z Shutting down Atmospherics subsystem...
+2022-11-01T15:37:15.2213821Z Shutting down Wiremod Composite Templates subsystem...
+2022-11-01T15:37:15.2214138Z Shutting down Wet floors subsystem...
+2022-11-01T15:37:15.2214441Z Shutting down Weather subsystem...
+2022-11-01T15:37:15.2214736Z Shutting down Wardrobe subsystem...
+2022-11-01T15:37:15.2215362Z Shutting down Verb Manager subsystem...
+2022-11-01T15:37:15.2215678Z Shutting down Tram Process subsystem...
+2022-11-01T15:37:15.2215965Z Shutting down Traitor subsystem...
+2022-11-01T15:37:15.2216263Z Shutting down Throwing subsystem...
+2022-11-01T15:37:15.2216556Z Shutting down tgui subsystem...
+2022-11-01T15:37:15.2216873Z Shutting down Supermatter Cascade subsystem...
+2022-11-01T15:37:15.2217334Z Shutting down Sun subsystem...
+2022-11-01T15:37:15.2217957Z Shutting down Speech Controller subsystem...
+2022-11-01T15:37:15.2218246Z Shutting down Space Drift subsystem...
+2022-11-01T15:37:15.2218517Z Shutting down Smoke subsystem...
+2022-11-01T15:37:15.2218784Z Shutting down Singularity subsystem...
+2022-11-01T15:37:15.2219050Z Shutting down Radio subsystem...
+2022-11-01T15:37:15.2219464Z Shutting down Radiation subsystem...
+2022-11-01T15:37:15.2219884Z Shutting down Projectiles subsystem...
+2022-11-01T15:37:15.2220146Z Shutting down Processing subsystem...
+2022-11-01T15:37:15.2220418Z Shutting down Points of Interest subsystem...
+2022-11-01T15:37:15.2220689Z Shutting down Plumbing subsystem...
+2022-11-01T15:37:15.2221061Z Shutting down Ping subsystem...
+2022-11-01T15:37:15.2221313Z Shutting down Parallax subsystem...
+2022-11-01T15:37:15.2221568Z Shutting down pAI subsystem...
+2022-11-01T15:37:15.2221814Z Shutting down Overlay subsystem...
+2022-11-01T15:37:15.5486394Z Shutting down Objects subsystem...
+2022-11-01T15:37:15.5489952Z Shutting down Obj Tab Items subsystem...
+2022-11-01T15:37:15.5493560Z Shutting down NPC Pool subsystem...
+2022-11-01T15:37:15.5496794Z Shutting down Night Shift subsystem...
+2022-11-01T15:37:15.5500936Z Shutting down Movement Loops subsystem...
+2022-11-01T15:37:15.5503981Z Shutting down Movement Handler subsystem...
+2022-11-01T15:37:15.5507931Z Shutting down MouseEntered subsystem...
+2022-11-01T15:37:15.5511418Z Shutting down Mood subsystem...
+2022-11-01T15:37:15.5514382Z Shutting down Mobs subsystem...
+2022-11-01T15:37:15.5517620Z Shutting down Materials subsystem...
+2022-11-01T15:37:15.5520737Z Shutting down Lua Scripting subsystem...
+2022-11-01T15:37:15.5698324Z Shutting down Library Loading subsystem...
+2022-11-01T15:37:15.5702028Z Shutting down Lag Switch subsystem...
+2022-11-01T15:37:15.5705452Z Shutting down Idling NPC Pool subsystem...
+2022-11-01T15:37:15.5708861Z Shutting down Foam subsystem...
+2022-11-01T15:37:15.5711826Z Shutting down Fluid subsystem...
+2022-11-01T15:37:15.5714787Z Shutting down Fire Burning subsystem...
+2022-11-01T15:37:15.5717774Z Shutting down Fast Processing subsystem...
+2022-11-01T15:37:15.5720765Z Shutting down Eigenstates subsystem...
+2022-11-01T15:37:15.5724720Z Shutting down Disease subsystem...
+2022-11-01T15:37:15.5728367Z Shutting down Datum Component System subsystem...
+2022-11-01T15:37:15.5731629Z Shutting down Conveyor Belts subsystem...
+2022-11-01T15:37:15.5735561Z Shutting down Communications subsystem...
+2022-11-01T15:37:15.5741612Z Shutting down Clock Component subsystem...
+2022-11-01T15:37:15.5741985Z Shutting down Circuit Components subsystem...
+2022-11-01T15:37:15.5744678Z Shutting down Blackmarket subsystem...
+2022-11-01T15:37:15.5746962Z Shutting down Basic Avoidance subsystem...
+2022-11-01T15:37:15.5747274Z Shutting down Aura Healing subsystem...
+2022-11-01T15:37:15.5747561Z Shutting down Augury subsystem...
+2022-11-01T15:37:15.5749911Z Shutting down Asset Loading subsystem...
+2022-11-01T15:37:15.5754181Z Shutting down Antag HUDs subsystem...
+2022-11-01T15:37:15.5758062Z Shutting down Ambience subsystem...
+2022-11-01T15:37:15.5761140Z Shutting down Addiction subsystem...
+2022-11-01T15:37:15.5765437Z Shutting down Acid subsystem...
+2022-11-01T15:37:15.5766113Z Shutting down Timer subsystem...
+2022-11-01T15:37:15.5767908Z Shutting down Sound Loops subsystem...
+2022-11-01T15:37:15.5769204Z Shutting down Runechat subsystem...
+2022-11-01T15:37:15.5770456Z Shutting down Skills subsystem...
+2022-11-01T15:37:15.5771990Z Shutting down Machines subsystem...
+2022-11-01T15:37:15.5772983Z Shutting down Language subsystem...
+2022-11-01T15:37:15.5774580Z Shutting down Atoms subsystem...
+2022-11-01T15:37:15.5841490Z Shutting down Restaurant subsystem...
+2022-11-01T15:37:15.5842179Z Shutting down Economy subsystem...
+2022-11-01T15:37:15.5843973Z Shutting down Spatial Grid subsystem...
+2022-11-01T15:37:15.5846087Z Shutting down Networks subsystem...
+2022-11-01T15:37:15.5847879Z Shutting down Time Tracking subsystem...
+2022-11-01T15:37:15.5849604Z Shutting down Research subsystem...
+2022-11-01T15:37:15.5850285Z Shutting down Early Assets subsystem...
+2022-11-01T15:37:15.5850811Z Shutting down Mapping subsystem...
+2022-11-01T15:37:15.5852025Z Shutting down Trading Card Game subsystem...
+2022-11-01T15:37:15.5852482Z Shutting down Ticker subsystem...
+2022-11-01T15:37:15.5872565Z Unable to locate admins backup file.
+2022-11-01T15:37:15.5885253Z Shutting down AI Controller Ticker subsystem...
+2022-11-01T15:37:15.5885786Z Shutting down AI Behavior Ticker subsystem...
+2022-11-01T15:37:15.5886089Z Shutting down AI movement subsystem...
+2022-11-01T15:37:15.5886382Z Shutting down Jobs subsystem...
+2022-11-01T15:37:15.5886664Z Shutting down IDs and Access subsystem...
+2022-11-01T15:37:15.5887205Z Shutting down Events subsystem...
+2022-11-01T15:37:15.5887507Z Shutting down Reagents subsystem...
+2022-11-01T15:37:15.5887770Z Shutting down Quirks subsystem...
+2022-11-01T15:37:15.5888040Z Shutting down Station subsystem...
+2022-11-01T15:37:15.5888322Z Shutting down Achievements subsystem...
+2022-11-01T15:37:15.5888724Z Shutting down Discord subsystem...
+2022-11-01T15:37:15.5889010Z Shutting down Security Level subsystem...
+2022-11-01T15:37:15.5889306Z Shutting down Vis contents overlays subsystem...
+2022-11-01T15:37:15.5889608Z Shutting down Greyscale subsystem...
+2022-11-01T15:37:15.5889894Z Shutting down Instruments subsystem...
+2022-11-01T15:37:15.5890172Z Shutting down Sounds subsystem...
+2022-11-01T15:37:15.5893120Z Shutting down Input subsystem...
+2022-11-01T15:37:15.5893553Z Shutting down Server Tasks subsystem...
+2022-11-01T15:37:15.5893838Z Shutting down Blackbox subsystem...
+2022-11-01T15:37:15.5894135Z Shutting down Database subsystem...
+2022-11-01T15:37:15.5898881Z Shutting down Garbage subsystem...
+2022-11-01T15:37:19.6680958Z Shutting down Title Screen subsystem...
+2022-11-01T15:37:19.6687147Z Shutting down Profiler subsystem...
+2022-11-01T15:37:19.6687404Z Shutdown complete
+2022-11-01T15:37:19.6691132Z Test run failed!
+2022-11-01T15:37:19.6691327Z Total runtimes: 1
+2022-11-01T15:37:19.6691534Z Unit Tests failed!
+2022-11-01T15:37:23.9554639Z cat: ci_test/data/logs/ci/clean_run.lk: No such file or directory
+2022-11-01T15:37:23.9572826Z ##[error]Process completed with exit code 1.
+2022-11-01T15:37:23.9632357Z ##[group]Run actions/upload-artifact@v3
+2022-11-01T15:37:23.9632655Z with:
+2022-11-01T15:37:23.9632880Z name: test_artifacts_tramstation
+2022-11-01T15:37:23.9633150Z path: data/screenshots_new/
+2022-11-01T15:37:23.9633405Z retention-days: 1
+2022-11-01T15:37:23.9633657Z if-no-files-found: warn
+2022-11-01T15:37:23.9633904Z ##[endgroup]
+2022-11-01T15:37:24.0862474Z With the provided path, there will be 85 files uploaded
+2022-11-01T15:37:24.0868892Z Starting artifact upload
+2022-11-01T15:37:24.0869932Z For more detailed logs during the artifact upload process, enable step-debugging: https://docs.github.com/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging#enabling-step-debug-logging
+2022-11-01T15:37:24.0872765Z Artifact name is valid!
+2022-11-01T15:37:24.2152427Z Container for artifact "test_artifacts_tramstation" successfully created. Starting upload of file(s)
+2022-11-01T15:37:31.3325316Z Total size of all the files uploaded is 138917 bytes
+2022-11-01T15:37:31.3326061Z File upload process has finished. Finalizing the artifact upload
+2022-11-01T15:37:31.4289346Z Artifact has been finalized. All files have been successfully uploaded!
+2022-11-01T15:37:31.4291368Z
+2022-11-01T15:37:31.4293992Z The raw size of all the files that were specified for upload is 139272 bytes
+2022-11-01T15:37:31.4298141Z The size of all the files that were uploaded is 138917 bytes. This takes into account any gzip compression used to reduce the upload size, time and storage
+2022-11-01T15:37:31.4301961Z
+2022-11-01T15:37:31.4303707Z Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads
+2022-11-01T15:37:31.4304326Z
+2022-11-01T15:37:31.4305332Z Artifact test_artifacts_tramstation has been successfully uploaded!
+2022-11-01T15:37:31.4451625Z Post job cleanup.
+2022-11-01T15:37:31.5950708Z [command]/usr/bin/git version
+2022-11-01T15:37:31.6017097Z git version 2.38.1
+2022-11-01T15:37:31.6089966Z Temporarily overriding HOME='/home/runner/work/_temp/b4760186-42be-4069-aaa5-837bedeee4b8' before making global git config changes
+2022-11-01T15:37:31.6092488Z Adding repository directory to the temporary git global config as a safe directory
+2022-11-01T15:37:31.6100037Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2022-11-01T15:37:31.6160949Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2022-11-01T15:37:31.6210420Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :
+2022-11-01T15:37:31.6542403Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2022-11-01T15:37:31.6580227Z http.https://github.com/.extraheader
+2022-11-01T15:37:31.6595477Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader
+2022-11-01T15:37:31.6646421Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :
+2022-11-01T15:37:31.7192910Z Print service container logs: e281b5d836644f53b33d06a88663b086_mysqllatest_c6a68e
+2022-11-01T15:37:31.7200768Z ##[command]/usr/bin/docker logs --details cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:37:31.7459373Z 2022-11-01T15:22:37.911886Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-11-01T15:37:31.7460001Z 2022-11-01 15:22:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
+2022-11-01T15:37:31.7461115Z 2022-11-01T15:22:37.912008Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.31) initializing of server in progress as process 79
+2022-11-01T15:37:31.7461587Z 2022-11-01T15:22:37.920633Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-11-01T15:37:31.7462180Z 2022-11-01T15:22:38.395422Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-11-01T15:37:31.7462662Z 2022-11-01T15:22:39.587998Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
+2022-11-01T15:37:31.7463283Z 2022-11-01T15:22:42.870247Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-11-01T15:37:31.7463804Z 2022-11-01T15:22:42.873029Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 128
+2022-11-01T15:37:31.7464196Z 2022-11-01T15:22:42.887863Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-11-01T15:37:31.7464742Z 2022-11-01T15:22:43.221367Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-11-01T15:37:31.7465133Z 2022-11-01T15:22:43.520686Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2022-11-01T15:37:31.7465779Z 2022-11-01T15:22:43.520748Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2022-11-01T15:37:31.7466727Z 2022-11-01T15:22:43.522020Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2022-11-01T15:37:31.7467384Z 2022-11-01T15:22:43.546149Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL.
+2022-11-01T15:37:31.7468097Z 2022-11-01T15:22:43.546223Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
+2022-11-01T15:37:31.7468696Z Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
+2022-11-01T15:37:31.7576656Z Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
+2022-11-01T15:37:31.7577123Z 2022-11-01 15:22:37+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
+2022-11-01T15:37:31.7579077Z Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
+2022-11-01T15:37:31.7579519Z Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
+2022-11-01T15:37:31.7582066Z Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
+2022-11-01T15:37:31.7582539Z 2022-11-01T15:22:46.179932Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.31).
+2022-11-01T15:37:31.7583335Z 2022-11-01T15:22:47.016783Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL.
+2022-11-01T15:37:31.7583954Z 2022-11-01T15:22:47.446654Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-11-01T15:37:31.7584942Z 2022-11-01T15:22:47.448502Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1
+2022-11-01T15:37:31.7585376Z 2022-11-01T15:22:47.455938Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-11-01T15:37:31.7585762Z 2022-11-01T15:22:47.684708Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-11-01T15:37:31.7586149Z 2022-11-01T15:22:47.881879Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2022-11-01T15:37:31.7586624Z 2022-11-01T15:22:47.881923Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2022-11-01T15:37:31.7587101Z 2022-11-01 15:22:37+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
+2022-11-01T15:37:31.7587663Z 2022-11-01T15:22:47.883353Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2022-11-01T15:37:31.7588411Z 2022-11-01T15:22:47.904354Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
+2022-11-01T15:37:31.7588952Z 2022-11-01T15:22:47.904482Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
+2022-11-01T15:37:31.7589414Z 2022-11-01 15:22:37+00:00 [Note] [Entrypoint]: Initializing database files
+2022-11-01T15:37:31.7589752Z 2022-11-01 15:22:42+00:00 [Note] [Entrypoint]: Database files initialized
+2022-11-01T15:37:31.7590084Z 2022-11-01 15:22:42+00:00 [Note] [Entrypoint]: Starting temporary server
+2022-11-01T15:37:31.7590409Z 2022-11-01 15:22:43+00:00 [Note] [Entrypoint]: Temporary server started.
+2022-11-01T15:37:31.7590742Z '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
+2022-11-01T15:37:31.7590984Z
+2022-11-01T15:37:31.7591244Z 2022-11-01 15:22:46+00:00 [Note] [Entrypoint]: Stopping temporary server
+2022-11-01T15:37:31.7591577Z 2022-11-01 15:22:47+00:00 [Note] [Entrypoint]: Temporary server stopped
+2022-11-01T15:37:31.7592516Z
+2022-11-01T15:37:31.7592791Z 2022-11-01 15:22:47+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
+2022-11-01T15:37:31.7593063Z
+2022-11-01T15:37:31.7608136Z Stop and remove container: e281b5d836644f53b33d06a88663b086_mysqllatest_c6a68e
+2022-11-01T15:37:31.7616365Z ##[command]/usr/bin/docker rm --force cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:37:32.0241098Z cd1d0f20f8f882176c274fb882d88cea0d4e9a7b2aebc33f1123c02f7b908aa1
+2022-11-01T15:37:32.0279431Z Remove container network: github_network_7d8483aa88b2460d91b946ac72079065
+2022-11-01T15:37:32.0288111Z ##[command]/usr/bin/docker network rm github_network_7d8483aa88b2460d91b946ac72079065
+2022-11-01T15:37:32.1478643Z github_network_7d8483aa88b2460d91b946ac72079065
+2022-11-01T15:37:32.1688580Z Cleaning up orphan processes
diff --git a/tools/pull_request_hooks/flakyTestPayloads/multiple_failures.txt b/tools/pull_request_hooks/flakyTestPayloads/multiple_failures.txt
new file mode 100644
index 000000000000..a1a52cdb1a3f
--- /dev/null
+++ b/tools/pull_request_hooks/flakyTestPayloads/multiple_failures.txt
@@ -0,0 +1,8 @@
+2022-11-22T05:59:45.2618397Z ##[group]/datum/unit_test/shapeshift_spell
+2022-11-22T05:59:45.4118582Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape Juggernaut. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4119786Z FAILURE #1: Shapeshift spell: Dragon Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.2618397Z ##[endgroup]
+2022-11-22T05:59:45.2618397Z ##[group]/datum/unit_test/more_shapeshift_spell
+2022-11-22T05:59:45.4118582Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape Juggernaut. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4119786Z FAILURE #1: Shapeshift spell: Dragon Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.2618397Z ##[endgroup]
diff --git a/tools/pull_request_hooks/flakyTestPayloads/shapeshift.txt b/tools/pull_request_hooks/flakyTestPayloads/shapeshift.txt
new file mode 100644
index 000000000000..b151f1888e13
--- /dev/null
+++ b/tools/pull_request_hooks/flakyTestPayloads/shapeshift.txt
@@ -0,0 +1,2466 @@
+2022-11-22T05:53:38.0374888Z Requested labels: ubuntu-20.04
+2022-11-22T05:53:38.0374935Z Job defined at: tgstation/tgstation/.github/workflows/run_integration_tests.yml@refs/pull/71181/merge
+2022-11-22T05:53:38.0374956Z Waiting for a runner to pick up this job...
+2022-11-22T05:53:38.4265982Z Job is waiting for a hosted runner to come online.
+2022-11-22T05:53:41.3842133Z Job is about to start running on the hosted runner: GitHub Actions 11 (hosted)
+2022-11-22T05:53:43.5319684Z Current runner version: '2.299.1'
+2022-11-22T05:53:43.5346147Z ##[group]Operating System
+2022-11-22T05:53:43.5346780Z Ubuntu
+2022-11-22T05:53:43.5347041Z 20.04.5
+2022-11-22T05:53:43.5347353Z LTS
+2022-11-22T05:53:43.5347672Z ##[endgroup]
+2022-11-22T05:53:43.5347952Z ##[group]Runner Image
+2022-11-22T05:53:43.5348342Z Image: ubuntu-20.04
+2022-11-22T05:53:43.5348676Z Version: 20221027.1
+2022-11-22T05:53:43.5349164Z Included Software: https://github.com/actions/runner-images/blob/ubuntu20/20221027.1/images/linux/Ubuntu2004-Readme.md
+2022-11-22T05:53:43.5349811Z Image Release: https://github.com/actions/runner-images/releases/tag/ubuntu20%2F20221027.1
+2022-11-22T05:53:43.5350263Z ##[endgroup]
+2022-11-22T05:53:43.5350646Z ##[group]Runner Image Provisioner
+2022-11-22T05:53:43.5350944Z 2.0.91.1
+2022-11-22T05:53:43.5351255Z ##[endgroup]
+2022-11-22T05:53:43.5352178Z ##[group]GITHUB_TOKEN Permissions
+2022-11-22T05:53:43.5352874Z Actions: read
+2022-11-22T05:53:43.5353161Z Checks: read
+2022-11-22T05:53:43.5353647Z Contents: read
+2022-11-22T05:53:43.5353978Z Deployments: read
+2022-11-22T05:53:43.5354356Z Discussions: read
+2022-11-22T05:53:43.5354705Z Issues: read
+2022-11-22T05:53:43.5354973Z Metadata: read
+2022-11-22T05:53:43.5355295Z Packages: read
+2022-11-22T05:53:43.5355637Z Pages: read
+2022-11-22T05:53:43.5356005Z PullRequests: read
+2022-11-22T05:53:43.5356320Z RepositoryProjects: read
+2022-11-22T05:53:43.5356684Z SecurityEvents: read
+2022-11-22T05:53:43.5357015Z Statuses: read
+2022-11-22T05:53:43.5357311Z ##[endgroup]
+2022-11-22T05:53:43.5360971Z Secret source: None
+2022-11-22T05:53:43.5361464Z Prepare workflow directory
+2022-11-22T05:53:43.6494787Z Prepare all required actions
+2022-11-22T05:53:43.6676576Z Getting action download info
+2022-11-22T05:53:43.8661995Z Download action repository 'actions/checkout@v3' (SHA:93ea575cb5d8a053eaa0ac8fa3b40d7e05a33cc8)
+2022-11-22T05:53:44.2330502Z Download action repository 'actions/cache@v3' (SHA:9b0c1fce7a93df8e3bb8926b0d6e9d89e92f20a7)
+2022-11-22T05:53:44.4868016Z Download action repository 'actions/upload-artifact@v3' (SHA:83fd05a356d7e2593de66fc9913b3002723633cb)
+2022-11-22T05:53:44.7641359Z Uses: tgstation/tgstation/.github/workflows/run_integration_tests.yml
+2022-11-22T05:53:44.7643311Z ##[group] Inputs
+2022-11-22T05:53:44.7643604Z map: metastation
+2022-11-22T05:53:44.7643819Z major:
+2022-11-22T05:53:44.7643991Z minor:
+2022-11-22T05:53:44.7644186Z ##[endgroup]
+2022-11-22T05:53:44.7644691Z Complete job name: Integration Tests (metastation) / run_integration_tests
+2022-11-22T05:53:44.8338079Z ##[group]Checking docker version
+2022-11-22T05:53:44.8354483Z ##[command]/usr/bin/docker version --format '{{.Server.APIVersion}}'
+2022-11-22T05:53:45.0506135Z '1.41'
+2022-11-22T05:53:45.0515561Z Docker daemon API version: '1.41'
+2022-11-22T05:53:45.0515967Z ##[command]/usr/bin/docker version --format '{{.Client.APIVersion}}'
+2022-11-22T05:53:45.0778446Z '1.41'
+2022-11-22T05:53:45.0797454Z Docker client API version: '1.41'
+2022-11-22T05:53:45.0803406Z ##[endgroup]
+2022-11-22T05:53:45.0807033Z ##[group]Clean up resources from previous jobs
+2022-11-22T05:53:45.0813032Z ##[command]/usr/bin/docker ps --all --quiet --no-trunc --filter "label=290506"
+2022-11-22T05:53:45.1033571Z ##[command]/usr/bin/docker network prune --force --filter "label=290506"
+2022-11-22T05:53:45.1259718Z ##[endgroup]
+2022-11-22T05:53:45.1260017Z ##[group]Create local container network
+2022-11-22T05:53:45.1270797Z ##[command]/usr/bin/docker network create --label 290506 github_network_7853d588c20f407bba7b04c3e70db729
+2022-11-22T05:53:45.1987626Z 71dabce427017ea3bab6d7ce48f6c7aaee980f9942b9d66f36e69e74f5fd921f
+2022-11-22T05:53:45.2004385Z ##[endgroup]
+2022-11-22T05:53:45.2093406Z ##[group]Starting mysql service container
+2022-11-22T05:53:45.2113754Z ##[command]/usr/bin/docker pull mysql:latest
+2022-11-22T05:53:45.4670300Z latest: Pulling from library/mysql
+2022-11-22T05:53:45.5358977Z 0bb5c0c24818: Pulling fs layer
+2022-11-22T05:53:45.5359400Z cbb3106fbb5a: Pulling fs layer
+2022-11-22T05:53:45.5359691Z 550536ae1d5e: Pulling fs layer
+2022-11-22T05:53:45.5360232Z 33f98928796e: Pulling fs layer
+2022-11-22T05:53:45.5360486Z a341087cff11: Pulling fs layer
+2022-11-22T05:53:45.5360746Z 0e26ac5b33f6: Pulling fs layer
+2022-11-22T05:53:45.5360985Z c883b83a7112: Pulling fs layer
+2022-11-22T05:53:45.5361246Z 873af5c876c6: Pulling fs layer
+2022-11-22T05:53:45.5361483Z 33f98928796e: Waiting
+2022-11-22T05:53:45.5361701Z a341087cff11: Waiting
+2022-11-22T05:53:45.5361926Z 0e26ac5b33f6: Waiting
+2022-11-22T05:53:45.5362161Z c883b83a7112: Waiting
+2022-11-22T05:53:45.5362390Z 8fe8ebd061d5: Pulling fs layer
+2022-11-22T05:53:45.5362660Z 7ac2553cf6b4: Pulling fs layer
+2022-11-22T05:53:45.5362912Z ad655e218e12: Pulling fs layer
+2022-11-22T05:53:45.5363152Z 8fe8ebd061d5: Waiting
+2022-11-22T05:53:45.5363368Z 7ac2553cf6b4: Waiting
+2022-11-22T05:53:45.5363591Z ad655e218e12: Waiting
+2022-11-22T05:53:45.5364183Z 873af5c876c6: Waiting
+2022-11-22T05:53:45.6234256Z cbb3106fbb5a: Download complete
+2022-11-22T05:53:45.6623068Z 550536ae1d5e: Verifying Checksum
+2022-11-22T05:53:45.6623379Z 550536ae1d5e: Download complete
+2022-11-22T05:53:45.7431784Z a341087cff11: Verifying Checksum
+2022-11-22T05:53:45.7432683Z a341087cff11: Download complete
+2022-11-22T05:53:45.8330384Z 0e26ac5b33f6: Verifying Checksum
+2022-11-22T05:53:45.8331535Z 0e26ac5b33f6: Download complete
+2022-11-22T05:53:45.8722359Z 0bb5c0c24818: Verifying Checksum
+2022-11-22T05:53:45.8722993Z 0bb5c0c24818: Download complete
+2022-11-22T05:53:45.8885518Z 33f98928796e: Verifying Checksum
+2022-11-22T05:53:45.8886144Z 33f98928796e: Download complete
+2022-11-22T05:53:45.9620666Z 873af5c876c6: Verifying Checksum
+2022-11-22T05:53:45.9624337Z 873af5c876c6: Download complete
+2022-11-22T05:53:46.0723260Z 7ac2553cf6b4: Verifying Checksum
+2022-11-22T05:53:46.0729266Z 7ac2553cf6b4: Download complete
+2022-11-22T05:53:46.1847787Z ad655e218e12: Verifying Checksum
+2022-11-22T05:53:46.1852352Z ad655e218e12: Download complete
+2022-11-22T05:53:46.4992758Z 8fe8ebd061d5: Verifying Checksum
+2022-11-22T05:53:46.4993194Z 8fe8ebd061d5: Download complete
+2022-11-22T05:53:46.6873819Z c883b83a7112: Verifying Checksum
+2022-11-22T05:53:46.6894121Z c883b83a7112: Download complete
+2022-11-22T05:53:47.4927005Z 0bb5c0c24818: Pull complete
+2022-11-22T05:53:48.3726655Z cbb3106fbb5a: Pull complete
+2022-11-22T05:53:48.4410442Z 550536ae1d5e: Pull complete
+2022-11-22T05:53:48.6472190Z 33f98928796e: Pull complete
+2022-11-22T05:53:48.7065871Z a341087cff11: Pull complete
+2022-11-22T05:53:48.7593552Z 0e26ac5b33f6: Pull complete
+2022-11-22T05:53:50.6234832Z c883b83a7112: Pull complete
+2022-11-22T05:53:50.6783015Z 873af5c876c6: Pull complete
+2022-11-22T05:53:55.9655421Z 8fe8ebd061d5: Pull complete
+2022-11-22T05:53:56.0172449Z 7ac2553cf6b4: Pull complete
+2022-11-22T05:53:56.0721706Z ad655e218e12: Pull complete
+2022-11-22T05:53:56.0770468Z Digest: sha256:96439dd0d8d085cd90c8001be2c9dde07b8a68b472bd20efcbe3df78cff66492
+2022-11-22T05:53:56.0780303Z Status: Downloaded newer image for mysql:latest
+2022-11-22T05:53:56.0800496Z docker.io/library/mysql:latest
+2022-11-22T05:53:56.0907615Z ##[command]/usr/bin/docker create --name 57e9ed27eab042ee8653063f2a3e4b8e_mysqllatest_56fbdc --label 290506 --network github_network_7853d588c20f407bba7b04c3e70db729 --network-alias mysql -p 3306 --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3 -e "MYSQL_ROOT_PASSWORD=root" -e GITHUB_ACTIONS=true -e CI=true mysql:latest
+2022-11-22T05:53:56.1330409Z 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:53:56.1355904Z ##[command]/usr/bin/docker start 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:53:56.5058287Z 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:53:56.5093538Z ##[command]/usr/bin/docker ps --all --filter id=46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df --filter status=running --no-trunc --format "{{.ID}} {{.Status}}"
+2022-11-22T05:53:56.5325566Z 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df Up Less than a second (health: starting)
+2022-11-22T05:53:56.5337249Z ##[command]/usr/bin/docker port 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:53:56.5611482Z 3306/tcp -> 0.0.0.0:49153
+2022-11-22T05:53:56.5612227Z 3306/tcp -> :::49153
+2022-11-22T05:53:56.5704537Z ##[endgroup]
+2022-11-22T05:53:56.5734437Z ##[group]Waiting for all services to be ready
+2022-11-22T05:53:56.5780170Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:53:56.6025583Z starting
+2022-11-22T05:53:56.6049671Z mysql service is starting, waiting 2 seconds before checking again.
+2022-11-22T05:53:58.6031859Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:53:58.6340318Z starting
+2022-11-22T05:53:58.6357312Z mysql service is starting, waiting 3 seconds before checking again.
+2022-11-22T05:54:02.3718080Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:54:02.4089096Z starting
+2022-11-22T05:54:02.4104252Z mysql service is starting, waiting 8 seconds before checking again.
+2022-11-22T05:54:10.5021256Z ##[command]/usr/bin/docker inspect --format="{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}" 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T05:54:10.5229049Z healthy
+2022-11-22T05:54:10.5246329Z mysql service is healthy.
+2022-11-22T05:54:10.5246744Z ##[endgroup]
+2022-11-22T05:54:10.5622212Z ##[group]Run actions/checkout@v3
+2022-11-22T05:54:10.5622478Z with:
+2022-11-22T05:54:10.5622701Z repository: tgstation/tgstation
+2022-11-22T05:54:10.5623165Z token: ***
+2022-11-22T05:54:10.5623358Z ssh-strict: true
+2022-11-22T05:54:10.5623595Z persist-credentials: true
+2022-11-22T05:54:10.5623831Z clean: true
+2022-11-22T05:54:10.5624017Z fetch-depth: 1
+2022-11-22T05:54:10.5624216Z lfs: false
+2022-11-22T05:54:10.5624410Z submodules: false
+2022-11-22T05:54:10.5624622Z set-safe-directory: true
+2022-11-22T05:54:10.5624849Z ##[endgroup]
+2022-11-22T05:54:10.8769664Z Syncing repository: tgstation/tgstation
+2022-11-22T05:54:10.8771464Z ##[group]Getting Git version info
+2022-11-22T05:54:10.8771995Z Working directory is '/home/runner/work/tgstation/tgstation'
+2022-11-22T05:54:10.8772502Z [command]/usr/bin/git version
+2022-11-22T05:54:10.8934189Z git version 2.38.1
+2022-11-22T05:54:10.8936302Z ##[endgroup]
+2022-11-22T05:54:10.8957434Z Temporarily overriding HOME='/home/runner/work/_temp/98913b85-f6f6-46e0-b153-ead562301846' before making global git config changes
+2022-11-22T05:54:10.8957893Z Adding repository directory to the temporary git global config as a safe directory
+2022-11-22T05:54:10.8958437Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2022-11-22T05:54:10.9000496Z Deleting the contents of '/home/runner/work/tgstation/tgstation'
+2022-11-22T05:54:10.9006615Z ##[group]Initializing the repository
+2022-11-22T05:54:10.9011194Z [command]/usr/bin/git init /home/runner/work/tgstation/tgstation
+2022-11-22T05:54:10.9106800Z hint: Using 'master' as the name for the initial branch. This default branch name
+2022-11-22T05:54:10.9107434Z hint: is subject to change. To configure the initial branch name to use in all
+2022-11-22T05:54:10.9108265Z hint: of your new repositories, which will suppress this warning, call:
+2022-11-22T05:54:10.9108574Z hint:
+2022-11-22T05:54:10.9109084Z hint: git config --global init.defaultBranch
+2022-11-22T05:54:10.9109349Z hint:
+2022-11-22T05:54:10.9109712Z hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
+2022-11-22T05:54:10.9110192Z hint: 'development'. The just-created branch can be renamed via this command:
+2022-11-22T05:54:10.9110453Z hint:
+2022-11-22T05:54:10.9110705Z hint: git branch -m
+2022-11-22T05:54:10.9123730Z Initialized empty Git repository in /home/runner/work/tgstation/tgstation/.git/
+2022-11-22T05:54:10.9133692Z [command]/usr/bin/git remote add origin https://github.com/tgstation/tgstation
+2022-11-22T05:54:10.9191164Z ##[endgroup]
+2022-11-22T05:54:10.9191935Z ##[group]Disabling automatic garbage collection
+2022-11-22T05:54:10.9196662Z [command]/usr/bin/git config --local gc.auto 0
+2022-11-22T05:54:10.9229900Z ##[endgroup]
+2022-11-22T05:54:10.9231230Z ##[group]Setting up auth
+2022-11-22T05:54:10.9239946Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2022-11-22T05:54:10.9275132Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :
+2022-11-22T05:54:10.9691507Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2022-11-22T05:54:10.9715174Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :
+2022-11-22T05:54:10.9955394Z [command]/usr/bin/git config --local http.https://github.com/.extraheader AUTHORIZATION: basic ***
+2022-11-22T05:54:10.9987844Z ##[endgroup]
+2022-11-22T05:54:10.9988301Z ##[group]Fetching the repository
+2022-11-22T05:54:10.9999455Z [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --progress --no-recurse-submodules --depth=1 origin +806eced1b6aa2166e665748be44c5c519833b2e2:refs/remotes/pull/71181/merge
+2022-11-22T05:54:11.4745200Z remote: Enumerating objects: 12670, done.
+2022-11-22T05:54:11.4781948Z remote: Counting objects: 0% (1/12670)
+2022-11-22T05:54:11.4788862Z remote: Counting objects: 1% (127/12670)
+2022-11-22T05:54:11.4791723Z remote: Counting objects: 2% (254/12670)
+2022-11-22T05:54:11.4795385Z remote: Counting objects: 3% (381/12670)
+2022-11-22T05:54:11.4798193Z remote: Counting objects: 4% (507/12670)
+2022-11-22T05:54:11.4812287Z remote: Counting objects: 5% (634/12670)
+2022-11-22T05:54:11.4813111Z remote: Counting objects: 6% (761/12670)
+2022-11-22T05:54:11.4816606Z remote: Counting objects: 7% (887/12670)
+2022-11-22T05:54:11.4816922Z remote: Counting objects: 8% (1014/12670)
+2022-11-22T05:54:11.4820085Z remote: Counting objects: 9% (1141/12670)
+2022-11-22T05:54:11.4820719Z remote: Counting objects: 10% (1267/12670)
+2022-11-22T05:54:11.4825610Z remote: Counting objects: 11% (1394/12670)
+2022-11-22T05:54:11.4833209Z remote: Counting objects: 12% (1521/12670)
+2022-11-22T05:54:11.4834855Z remote: Counting objects: 13% (1648/12670)
+2022-11-22T05:54:11.4836592Z remote: Counting objects: 14% (1774/12670)
+2022-11-22T05:54:11.4841147Z remote: Counting objects: 15% (1901/12670)
+2022-11-22T05:54:11.4842686Z remote: Counting objects: 16% (2028/12670)
+2022-11-22T05:54:11.4845844Z remote: Counting objects: 17% (2154/12670)
+2022-11-22T05:54:11.4850655Z remote: Counting objects: 18% (2281/12670)
+2022-11-22T05:54:11.4856457Z remote: Counting objects: 19% (2408/12670)
+2022-11-22T05:54:11.4860749Z remote: Counting objects: 20% (2534/12670)
+2022-11-22T05:54:11.4866335Z remote: Counting objects: 21% (2661/12670)
+2022-11-22T05:54:11.4868281Z remote: Counting objects: 22% (2788/12670)
+2022-11-22T05:54:11.4875422Z remote: Counting objects: 23% (2915/12670)
+2022-11-22T05:54:11.4878698Z remote: Counting objects: 24% (3041/12670)
+2022-11-22T05:54:11.4881887Z remote: Counting objects: 25% (3168/12670)
+2022-11-22T05:54:11.4885601Z remote: Counting objects: 26% (3295/12670)
+2022-11-22T05:54:11.4885891Z remote: Counting objects: 27% (3421/12670)
+2022-11-22T05:54:11.4895978Z remote: Counting objects: 28% (3548/12670)
+2022-11-22T05:54:11.4899479Z remote: Counting objects: 29% (3675/12670)
+2022-11-22T05:54:11.4900702Z remote: Counting objects: 30% (3801/12670)
+2022-11-22T05:54:11.4905007Z remote: Counting objects: 31% (3928/12670)
+2022-11-22T05:54:11.4913601Z remote: Counting objects: 32% (4055/12670)
+2022-11-22T05:54:11.4913882Z remote: Counting objects: 33% (4182/12670)
+2022-11-22T05:54:11.4929604Z remote: Counting objects: 34% (4308/12670)
+2022-11-22T05:54:11.4929903Z remote: Counting objects: 35% (4435/12670)
+2022-11-22T05:54:11.5015998Z remote: Counting objects: 36% (4562/12670)
+2022-11-22T05:54:11.5016343Z remote: Counting objects: 37% (4688/12670)
+2022-11-22T05:54:11.5016621Z remote: Counting objects: 38% (4815/12670)
+2022-11-22T05:54:11.5016894Z remote: Counting objects: 39% (4942/12670)
+2022-11-22T05:54:11.5017152Z remote: Counting objects: 40% (5068/12670)
+2022-11-22T05:54:11.5017647Z remote: Counting objects: 41% (5195/12670)
+2022-11-22T05:54:11.5017996Z remote: Counting objects: 42% (5322/12670)
+2022-11-22T05:54:11.5018305Z remote: Counting objects: 43% (5449/12670)
+2022-11-22T05:54:11.5018644Z remote: Counting objects: 44% (5575/12670)
+2022-11-22T05:54:11.5018982Z remote: Counting objects: 45% (5702/12670)
+2022-11-22T05:54:11.5019303Z remote: Counting objects: 46% (5829/12670)
+2022-11-22T05:54:11.5019637Z remote: Counting objects: 47% (5955/12670)
+2022-11-22T05:54:11.5019982Z remote: Counting objects: 48% (6082/12670)
+2022-11-22T05:54:11.5020319Z remote: Counting objects: 49% (6209/12670)
+2022-11-22T05:54:11.5020778Z remote: Counting objects: 50% (6335/12670)
+2022-11-22T05:54:11.5021186Z remote: Counting objects: 51% (6462/12670)
+2022-11-22T05:54:11.5021532Z remote: Counting objects: 52% (6589/12670)
+2022-11-22T05:54:11.5021820Z remote: Counting objects: 53% (6716/12670)
+2022-11-22T05:54:11.5022178Z remote: Counting objects: 54% (6842/12670)
+2022-11-22T05:54:11.5022546Z remote: Counting objects: 55% (6969/12670)
+2022-11-22T05:54:11.5022845Z remote: Counting objects: 56% (7096/12670)
+2022-11-22T05:54:11.5023177Z remote: Counting objects: 57% (7222/12670)
+2022-11-22T05:54:11.5023513Z remote: Counting objects: 58% (7349/12670)
+2022-11-22T05:54:11.5023845Z remote: Counting objects: 59% (7476/12670)
+2022-11-22T05:54:11.5074038Z remote: Counting objects: 60% (7602/12670)
+2022-11-22T05:54:11.5074496Z remote: Counting objects: 61% (7729/12670)
+2022-11-22T05:54:11.5074840Z remote: Counting objects: 62% (7856/12670)
+2022-11-22T05:54:11.5077738Z remote: Counting objects: 63% (7983/12670)
+2022-11-22T05:54:11.5078154Z remote: Counting objects: 64% (8109/12670)
+2022-11-22T05:54:11.5080069Z remote: Counting objects: 65% (8236/12670)
+2022-11-22T05:54:11.5080464Z remote: Counting objects: 66% (8363/12670)
+2022-11-22T05:54:11.5080767Z remote: Counting objects: 67% (8489/12670)
+2022-11-22T05:54:11.5081113Z remote: Counting objects: 68% (8616/12670)
+2022-11-22T05:54:11.5081547Z remote: Counting objects: 69% (8743/12670)
+2022-11-22T05:54:11.5083609Z remote: Counting objects: 70% (8869/12670)
+2022-11-22T05:54:11.5084045Z remote: Counting objects: 71% (8996/12670)
+2022-11-22T05:54:11.5084412Z remote: Counting objects: 72% (9123/12670)
+2022-11-22T05:54:11.5086279Z remote: Counting objects: 73% (9250/12670)
+2022-11-22T05:54:11.5086641Z remote: Counting objects: 74% (9376/12670)
+2022-11-22T05:54:11.5087027Z remote: Counting objects: 75% (9503/12670)
+2022-11-22T05:54:11.5087358Z remote: Counting objects: 76% (9630/12670)
+2022-11-22T05:54:11.5087661Z remote: Counting objects: 77% (9756/12670)
+2022-11-22T05:54:11.5088036Z remote: Counting objects: 78% (9883/12670)
+2022-11-22T05:54:11.5088378Z remote: Counting objects: 79% (10010/12670)
+2022-11-22T05:54:11.5088856Z remote: Counting objects: 80% (10136/12670)
+2022-11-22T05:54:11.5089215Z remote: Counting objects: 81% (10263/12670)
+2022-11-22T05:54:11.5089563Z remote: Counting objects: 82% (10390/12670)
+2022-11-22T05:54:11.5089941Z remote: Counting objects: 83% (10517/12670)
+2022-11-22T05:54:11.5090397Z remote: Counting objects: 84% (10643/12670)
+2022-11-22T05:54:11.5090737Z remote: Counting objects: 85% (10770/12670)
+2022-11-22T05:54:11.5091087Z remote: Counting objects: 86% (10897/12670)
+2022-11-22T05:54:11.5091375Z remote: Counting objects: 87% (11023/12670)
+2022-11-22T05:54:11.5091895Z remote: Counting objects: 88% (11150/12670)
+2022-11-22T05:54:11.5092268Z remote: Counting objects: 89% (11277/12670)
+2022-11-22T05:54:11.5092621Z remote: Counting objects: 90% (11403/12670)
+2022-11-22T05:54:11.5092910Z remote: Counting objects: 91% (11530/12670)
+2022-11-22T05:54:11.5093293Z remote: Counting objects: 92% (11657/12670)
+2022-11-22T05:54:11.5093629Z remote: Counting objects: 93% (11784/12670)
+2022-11-22T05:54:11.5093976Z remote: Counting objects: 94% (11910/12670)
+2022-11-22T05:54:11.5094262Z remote: Counting objects: 95% (12037/12670)
+2022-11-22T05:54:11.5094599Z remote: Counting objects: 96% (12164/12670)
+2022-11-22T05:54:11.5099944Z remote: Counting objects: 97% (12290/12670)
+2022-11-22T05:54:11.5108887Z remote: Counting objects: 98% (12417/12670)
+2022-11-22T05:54:11.5114474Z remote: Counting objects: 99% (12544/12670)
+2022-11-22T05:54:11.5114975Z remote: Counting objects: 100% (12670/12670)
+2022-11-22T05:54:11.5115371Z remote: Counting objects: 100% (12670/12670), done.
+2022-11-22T05:54:11.5294385Z remote: Compressing objects: 0% (1/11138)
+2022-11-22T05:54:11.5455556Z remote: Compressing objects: 1% (112/11138)
+2022-11-22T05:54:11.5603717Z remote: Compressing objects: 2% (223/11138)
+2022-11-22T05:54:11.5715131Z remote: Compressing objects: 3% (335/11138)
+2022-11-22T05:54:11.5791988Z remote: Compressing objects: 4% (446/11138)
+2022-11-22T05:54:11.5875970Z remote: Compressing objects: 5% (557/11138)
+2022-11-22T05:54:11.5992597Z remote: Compressing objects: 6% (669/11138)
+2022-11-22T05:54:11.6261135Z remote: Compressing objects: 7% (780/11138)
+2022-11-22T05:54:11.6614165Z remote: Compressing objects: 8% (892/11138)
+2022-11-22T05:54:11.6929090Z remote: Compressing objects: 9% (1003/11138)
+2022-11-22T05:54:11.7520585Z remote: Compressing objects: 10% (1114/11138)
+2022-11-22T05:54:11.8656642Z remote: Compressing objects: 11% (1226/11138)
+2022-11-22T05:54:12.3621233Z remote: Compressing objects: 12% (1337/11138)
+2022-11-22T05:54:12.4278664Z remote: Compressing objects: 13% (1448/11138)
+2022-11-22T05:54:12.5681269Z remote: Compressing objects: 14% (1560/11138)
+2022-11-22T05:54:12.5742648Z remote: Compressing objects: 14% (1564/11138)
+2022-11-22T05:54:12.6042588Z remote: Compressing objects: 15% (1671/11138)
+2022-11-22T05:54:12.6277778Z remote: Compressing objects: 16% (1783/11138)
+2022-11-22T05:54:12.6502958Z remote: Compressing objects: 17% (1894/11138)
+2022-11-22T05:54:12.6639889Z remote: Compressing objects: 18% (2005/11138)
+2022-11-22T05:54:12.6825168Z remote: Compressing objects: 19% (2117/11138)
+2022-11-22T05:54:12.7061189Z remote: Compressing objects: 20% (2228/11138)
+2022-11-22T05:54:12.7163241Z remote: Compressing objects: 21% (2339/11138)
+2022-11-22T05:54:12.7229844Z remote: Compressing objects: 22% (2451/11138)
+2022-11-22T05:54:12.7963458Z remote: Compressing objects: 23% (2562/11138)
+2022-11-22T05:54:12.8191300Z remote: Compressing objects: 24% (2674/11138)
+2022-11-22T05:54:12.8429274Z remote: Compressing objects: 25% (2785/11138)
+2022-11-22T05:54:12.8590322Z remote: Compressing objects: 26% (2896/11138)
+2022-11-22T05:54:12.8794121Z remote: Compressing objects: 27% (3008/11138)
+2022-11-22T05:54:12.9360005Z remote: Compressing objects: 28% (3119/11138)
+2022-11-22T05:54:12.9509115Z remote: Compressing objects: 29% (3231/11138)
+2022-11-22T05:54:12.9789410Z remote: Compressing objects: 30% (3342/11138)
+2022-11-22T05:54:13.0109912Z remote: Compressing objects: 31% (3453/11138)
+2022-11-22T05:54:13.0315139Z remote: Compressing objects: 32% (3565/11138)
+2022-11-22T05:54:13.0679208Z remote: Compressing objects: 33% (3676/11138)
+2022-11-22T05:54:13.1106278Z remote: Compressing objects: 34% (3787/11138)
+2022-11-22T05:54:13.1559648Z remote: Compressing objects: 35% (3899/11138)
+2022-11-22T05:54:13.1815080Z remote: Compressing objects: 36% (4010/11138)
+2022-11-22T05:54:13.2032125Z remote: Compressing objects: 37% (4122/11138)
+2022-11-22T05:54:13.2508874Z remote: Compressing objects: 38% (4233/11138)
+2022-11-22T05:54:13.2873404Z remote: Compressing objects: 39% (4344/11138)
+2022-11-22T05:54:13.3141434Z remote: Compressing objects: 40% (4456/11138)
+2022-11-22T05:54:13.3472418Z remote: Compressing objects: 41% (4567/11138)
+2022-11-22T05:54:13.3689876Z remote: Compressing objects: 42% (4678/11138)
+2022-11-22T05:54:13.4026125Z remote: Compressing objects: 43% (4790/11138)
+2022-11-22T05:54:13.4351768Z remote: Compressing objects: 44% (4901/11138)
+2022-11-22T05:54:13.4635455Z remote: Compressing objects: 45% (5013/11138)
+2022-11-22T05:54:13.4913930Z remote: Compressing objects: 46% (5124/11138)
+2022-11-22T05:54:13.5126550Z remote: Compressing objects: 47% (5235/11138)
+2022-11-22T05:54:13.5178454Z remote: Compressing objects: 47% (5330/11138)
+2022-11-22T05:54:13.5387150Z remote: Compressing objects: 48% (5347/11138)
+2022-11-22T05:54:13.5667572Z remote: Compressing objects: 49% (5458/11138)
+2022-11-22T05:54:13.5885095Z remote: Compressing objects: 50% (5569/11138)
+2022-11-22T05:54:13.6141160Z remote: Compressing objects: 51% (5681/11138)
+2022-11-22T05:54:13.6409490Z remote: Compressing objects: 52% (5792/11138)
+2022-11-22T05:54:13.6653623Z remote: Compressing objects: 53% (5904/11138)
+2022-11-22T05:54:13.6948366Z remote: Compressing objects: 54% (6015/11138)
+2022-11-22T05:54:13.7220019Z remote: Compressing objects: 55% (6126/11138)
+2022-11-22T05:54:13.7483195Z remote: Compressing objects: 56% (6238/11138)
+2022-11-22T05:54:13.7731314Z remote: Compressing objects: 57% (6349/11138)
+2022-11-22T05:54:13.8003867Z remote: Compressing objects: 58% (6461/11138)
+2022-11-22T05:54:13.8256482Z remote: Compressing objects: 59% (6572/11138)
+2022-11-22T05:54:13.8642960Z remote: Compressing objects: 60% (6683/11138)
+2022-11-22T05:54:13.8869630Z remote: Compressing objects: 61% (6795/11138)
+2022-11-22T05:54:13.9178442Z remote: Compressing objects: 62% (6906/11138)
+2022-11-22T05:54:13.9401919Z remote: Compressing objects: 63% (7017/11138)
+2022-11-22T05:54:13.9693523Z remote: Compressing objects: 64% (7129/11138)
+2022-11-22T05:54:13.9916641Z remote: Compressing objects: 65% (7240/11138)
+2022-11-22T05:54:14.0243553Z remote: Compressing objects: 66% (7352/11138)
+2022-11-22T05:54:14.0431165Z remote: Compressing objects: 67% (7463/11138)
+2022-11-22T05:54:14.0432887Z remote: Compressing objects: 68% (7574/11138)
+2022-11-22T05:54:14.0475569Z remote: Compressing objects: 69% (7686/11138)
+2022-11-22T05:54:14.0480770Z remote: Compressing objects: 70% (7797/11138)
+2022-11-22T05:54:14.0481393Z remote: Compressing objects: 71% (7908/11138)
+2022-11-22T05:54:14.0481820Z remote: Compressing objects: 72% (8020/11138)
+2022-11-22T05:54:14.0482177Z remote: Compressing objects: 73% (8131/11138)
+2022-11-22T05:54:14.0482859Z remote: Compressing objects: 74% (8243/11138)
+2022-11-22T05:54:14.0488239Z remote: Compressing objects: 75% (8354/11138)
+2022-11-22T05:54:14.0488623Z remote: Compressing objects: 76% (8465/11138)
+2022-11-22T05:54:14.0522233Z remote: Compressing objects: 77% (8577/11138)
+2022-11-22T05:54:14.0522712Z remote: Compressing objects: 78% (8688/11138)
+2022-11-22T05:54:14.0523143Z remote: Compressing objects: 79% (8800/11138)
+2022-11-22T05:54:14.0553594Z remote: Compressing objects: 80% (8911/11138)
+2022-11-22T05:54:14.0592171Z remote: Compressing objects: 81% (9022/11138)
+2022-11-22T05:54:14.0592578Z remote: Compressing objects: 82% (9134/11138)
+2022-11-22T05:54:14.0689423Z remote: Compressing objects: 83% (9245/11138)
+2022-11-22T05:54:14.0774112Z remote: Compressing objects: 84% (9356/11138)
+2022-11-22T05:54:14.0774568Z remote: Compressing objects: 85% (9468/11138)
+2022-11-22T05:54:14.0775008Z remote: Compressing objects: 86% (9579/11138)
+2022-11-22T05:54:14.0775359Z remote: Compressing objects: 87% (9691/11138)
+2022-11-22T05:54:14.0775775Z remote: Compressing objects: 88% (9802/11138)
+2022-11-22T05:54:14.0776226Z remote: Compressing objects: 89% (9913/11138)
+2022-11-22T05:54:14.0778641Z remote: Compressing objects: 90% (10025/11138)
+2022-11-22T05:54:14.0956337Z remote: Compressing objects: 91% (10136/11138)
+2022-11-22T05:54:14.0978087Z remote: Compressing objects: 92% (10247/11138)
+2022-11-22T05:54:14.0990638Z remote: Compressing objects: 93% (10359/11138)
+2022-11-22T05:54:14.1012960Z remote: Compressing objects: 94% (10470/11138)
+2022-11-22T05:54:14.1037619Z remote: Compressing objects: 95% (10582/11138)
+2022-11-22T05:54:14.1050702Z remote: Compressing objects: 96% (10693/11138)
+2022-11-22T05:54:14.1063360Z remote: Compressing objects: 97% (10804/11138)
+2022-11-22T05:54:14.1081312Z remote: Compressing objects: 98% (10916/11138)
+2022-11-22T05:54:14.1113135Z remote: Compressing objects: 99% (11027/11138)
+2022-11-22T05:54:14.1113531Z remote: Compressing objects: 100% (11138/11138)
+2022-11-22T05:54:14.1113923Z remote: Compressing objects: 100% (11138/11138), done.
+2022-11-22T05:54:14.1437731Z Receiving objects: 0% (1/12670)
+2022-11-22T05:54:14.7969071Z Receiving objects: 1% (127/12670)
+2022-11-22T05:54:14.8098924Z Receiving objects: 2% (254/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:14.9436264Z Receiving objects: 3% (381/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:14.9491670Z Receiving objects: 4% (507/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:14.9541674Z Receiving objects: 5% (634/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:14.9697968Z Receiving objects: 6% (761/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:14.9906135Z Receiving objects: 7% (887/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.0124892Z Receiving objects: 8% (1014/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.0247894Z Receiving objects: 9% (1141/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.0464602Z Receiving objects: 10% (1267/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.0642253Z Receiving objects: 11% (1394/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.0749336Z Receiving objects: 12% (1521/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.0761823Z Receiving objects: 13% (1648/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.0886767Z Receiving objects: 14% (1774/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.1085477Z Receiving objects: 15% (1901/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.1165503Z Receiving objects: 16% (2028/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.1466407Z Receiving objects: 16% (2071/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.1775614Z Receiving objects: 17% (2154/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.2046679Z Receiving objects: 18% (2281/12670), 1.64 MiB | 2.91 MiB/s
+2022-11-22T05:54:15.2350074Z Receiving objects: 19% (2408/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.2648667Z Receiving objects: 20% (2534/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.2950136Z Receiving objects: 21% (2661/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.3229118Z Receiving objects: 22% (2788/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.3508301Z Receiving objects: 23% (2915/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.3736900Z Receiving objects: 24% (3041/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.3928328Z Receiving objects: 25% (3168/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.4102878Z Receiving objects: 26% (3295/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.4387561Z Receiving objects: 27% (3421/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.4581868Z Receiving objects: 28% (3548/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.4720691Z Receiving objects: 29% (3675/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.4949914Z Receiving objects: 30% (3801/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.5088093Z Receiving objects: 31% (3928/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.5251105Z Receiving objects: 32% (4055/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.5419154Z Receiving objects: 33% (4182/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.5562173Z Receiving objects: 34% (4308/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.5822789Z Receiving objects: 35% (4435/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.6098583Z Receiving objects: 36% (4562/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.6486705Z Receiving objects: 37% (4688/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.6836221Z Receiving objects: 38% (4815/12670), 5.54 MiB | 5.20 MiB/s
+2022-11-22T05:54:15.7184372Z Receiving objects: 39% (4942/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.7304334Z Receiving objects: 40% (5068/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.7558967Z Receiving objects: 41% (5195/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.7948469Z Receiving objects: 42% (5322/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.8261068Z Receiving objects: 43% (5449/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.8392502Z Receiving objects: 44% (5575/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.8543246Z Receiving objects: 45% (5702/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.8682415Z Receiving objects: 46% (5829/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.8784329Z Receiving objects: 47% (5955/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.8925819Z Receiving objects: 48% (6082/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.9001936Z Receiving objects: 49% (6209/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:15.9514165Z Receiving objects: 50% (6335/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:16.0360562Z Receiving objects: 51% (6462/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:16.1833774Z Receiving objects: 52% (6589/12670), 10.06 MiB | 6.41 MiB/s
+2022-11-22T05:54:16.6045841Z Receiving objects: 52% (6598/12670), 17.71 MiB | 8.56 MiB/s
+2022-11-22T05:54:16.8791679Z Receiving objects: 53% (6716/12670), 17.71 MiB | 8.56 MiB/s
+2022-11-22T05:54:16.9124702Z Receiving objects: 54% (6842/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.0161642Z Receiving objects: 55% (6969/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.0595048Z Receiving objects: 56% (7096/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.0975600Z Receiving objects: 57% (7222/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.1141406Z Receiving objects: 58% (7349/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.1405634Z Receiving objects: 58% (7401/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.1720210Z Receiving objects: 59% (7476/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.2015621Z Receiving objects: 60% (7602/12670), 31.08 MiB | 12.10 MiB/s
+2022-11-22T05:54:17.2421975Z Receiving objects: 61% (7729/12670), 49.89 MiB | 16.26 MiB/s
+2022-11-22T05:54:17.2500420Z Receiving objects: 62% (7856/12670), 49.89 MiB | 16.26 MiB/s
+2022-11-22T05:54:17.5988832Z Receiving objects: 63% (7983/12670), 49.89 MiB | 16.26 MiB/s
+2022-11-22T05:54:17.9560268Z Receiving objects: 64% (8109/12670), 49.89 MiB | 16.26 MiB/s
+2022-11-22T05:54:18.0169362Z Receiving objects: 65% (8236/12670), 74.38 MiB | 20.85 MiB/s
+2022-11-22T05:54:18.0610635Z Receiving objects: 66% (8363/12670), 74.38 MiB | 20.85 MiB/s
+2022-11-22T05:54:18.1142278Z Receiving objects: 67% (8489/12670), 74.38 MiB | 20.85 MiB/s
+2022-11-22T05:54:18.1185495Z Receiving objects: 67% (8604/12670), 74.38 MiB | 20.85 MiB/s
+2022-11-22T05:54:18.1538486Z Receiving objects: 68% (8616/12670), 74.38 MiB | 20.85 MiB/s
+2022-11-22T05:54:18.2062287Z Receiving objects: 69% (8743/12670), 74.38 MiB | 20.85 MiB/s
+2022-11-22T05:54:18.2545599Z Receiving objects: 70% (8869/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.3571596Z Receiving objects: 71% (8996/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.3758401Z Receiving objects: 72% (9123/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.3859281Z Receiving objects: 73% (9250/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.3976873Z Receiving objects: 74% (9376/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.4120242Z Receiving objects: 75% (9503/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.4306434Z Receiving objects: 76% (9630/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.5319302Z Receiving objects: 77% (9756/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.5320722Z Receiving objects: 78% (9883/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.5526871Z Receiving objects: 79% (10010/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.5891167Z Receiving objects: 80% (10136/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.5967265Z Receiving objects: 81% (10263/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.6052595Z Receiving objects: 82% (10390/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.6120029Z Receiving objects: 83% (10517/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.6174493Z Receiving objects: 84% (10643/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.6234676Z Receiving objects: 85% (10770/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.6299547Z Receiving objects: 86% (10897/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.6365696Z Receiving objects: 87% (11023/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.6532983Z Receiving objects: 88% (11150/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.7047669Z Receiving objects: 89% (11277/12670), 104.45 MiB | 25.68 MiB/s
+2022-11-22T05:54:18.7436095Z Receiving objects: 90% (11403/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7478331Z Receiving objects: 91% (11530/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7516826Z Receiving objects: 92% (11657/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7572212Z Receiving objects: 93% (11784/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7627489Z Receiving objects: 94% (11910/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7680868Z Receiving objects: 95% (12037/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7719714Z Receiving objects: 96% (12164/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7750985Z Receiving objects: 97% (12290/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7895759Z Receiving objects: 98% (12417/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7934049Z Receiving objects: 99% (12544/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7934871Z remote: Total 12670 (delta 1563), reused 7049 (delta 1400), pack-reused 0
+2022-11-22T05:54:18.7957233Z Receiving objects: 100% (12670/12670), 135.69 MiB | 29.71 MiB/s
+2022-11-22T05:54:18.7957672Z Receiving objects: 100% (12670/12670), 139.64 MiB | 29.83 MiB/s, done.
+2022-11-22T05:54:18.7991376Z Resolving deltas: 0% (0/1563)
+2022-11-22T05:54:18.8007713Z Resolving deltas: 1% (16/1563)
+2022-11-22T05:54:18.8018232Z Resolving deltas: 2% (32/1563)
+2022-11-22T05:54:18.8025488Z Resolving deltas: 3% (47/1563)
+2022-11-22T05:54:18.8083114Z Resolving deltas: 4% (63/1563)
+2022-11-22T05:54:18.8129512Z Resolving deltas: 5% (79/1563)
+2022-11-22T05:54:18.8137107Z Resolving deltas: 6% (94/1563)
+2022-11-22T05:54:18.8145420Z Resolving deltas: 7% (110/1563)
+2022-11-22T05:54:18.8197932Z Resolving deltas: 8% (126/1563)
+2022-11-22T05:54:18.8224181Z Resolving deltas: 9% (141/1563)
+2022-11-22T05:54:18.8237686Z Resolving deltas: 10% (157/1563)
+2022-11-22T05:54:18.8264690Z Resolving deltas: 11% (172/1563)
+2022-11-22T05:54:18.8270115Z Resolving deltas: 12% (188/1563)
+2022-11-22T05:54:18.8278891Z Resolving deltas: 13% (204/1563)
+2022-11-22T05:54:18.8282387Z Resolving deltas: 14% (219/1563)
+2022-11-22T05:54:18.8286062Z Resolving deltas: 15% (235/1563)
+2022-11-22T05:54:18.8289540Z Resolving deltas: 16% (251/1563)
+2022-11-22T05:54:18.8293460Z Resolving deltas: 17% (266/1563)
+2022-11-22T05:54:18.8296655Z Resolving deltas: 18% (282/1563)
+2022-11-22T05:54:18.8300378Z Resolving deltas: 19% (297/1563)
+2022-11-22T05:54:18.8303678Z Resolving deltas: 20% (313/1563)
+2022-11-22T05:54:18.8306940Z Resolving deltas: 21% (329/1563)
+2022-11-22T05:54:18.8321902Z Resolving deltas: 22% (344/1563)
+2022-11-22T05:54:18.8337564Z Resolving deltas: 23% (360/1563)
+2022-11-22T05:54:18.8351461Z Resolving deltas: 24% (376/1563)
+2022-11-22T05:54:18.8376364Z Resolving deltas: 25% (391/1563)
+2022-11-22T05:54:18.8447413Z Resolving deltas: 26% (407/1563)
+2022-11-22T05:54:18.8455814Z Resolving deltas: 27% (423/1563)
+2022-11-22T05:54:18.8519899Z Resolving deltas: 28% (438/1563)
+2022-11-22T05:54:18.8528664Z Resolving deltas: 29% (454/1563)
+2022-11-22T05:54:18.8546501Z Resolving deltas: 30% (469/1563)
+2022-11-22T05:54:18.8556266Z Resolving deltas: 31% (485/1563)
+2022-11-22T05:54:18.8583895Z Resolving deltas: 32% (501/1563)
+2022-11-22T05:54:18.8597665Z Resolving deltas: 33% (516/1563)
+2022-11-22T05:54:18.8667049Z Resolving deltas: 34% (532/1563)
+2022-11-22T05:54:18.8690494Z Resolving deltas: 35% (548/1563)
+2022-11-22T05:54:18.8719328Z Resolving deltas: 36% (563/1563)
+2022-11-22T05:54:18.8733653Z Resolving deltas: 37% (579/1563)
+2022-11-22T05:54:18.8737567Z Resolving deltas: 38% (594/1563)
+2022-11-22T05:54:18.8741272Z Resolving deltas: 39% (610/1563)
+2022-11-22T05:54:18.8745180Z Resolving deltas: 40% (626/1563)
+2022-11-22T05:54:18.8749043Z Resolving deltas: 41% (641/1563)
+2022-11-22T05:54:18.8752838Z Resolving deltas: 42% (657/1563)
+2022-11-22T05:54:18.8756750Z Resolving deltas: 43% (673/1563)
+2022-11-22T05:54:18.8760570Z Resolving deltas: 44% (688/1563)
+2022-11-22T05:54:18.8764977Z Resolving deltas: 45% (704/1563)
+2022-11-22T05:54:18.8768748Z Resolving deltas: 46% (719/1563)
+2022-11-22T05:54:18.8774098Z Resolving deltas: 47% (735/1563)
+2022-11-22T05:54:18.8775178Z Resolving deltas: 48% (751/1563)
+2022-11-22T05:54:18.8775461Z Resolving deltas: 49% (766/1563)
+2022-11-22T05:54:18.8778107Z Resolving deltas: 50% (782/1563)
+2022-11-22T05:54:18.8783837Z Resolving deltas: 51% (798/1563)
+2022-11-22T05:54:18.8788309Z Resolving deltas: 52% (813/1563)
+2022-11-22T05:54:18.8793942Z Resolving deltas: 53% (829/1563)
+2022-11-22T05:54:18.8800371Z Resolving deltas: 54% (845/1563)
+2022-11-22T05:54:18.8804490Z Resolving deltas: 55% (860/1563)
+2022-11-22T05:54:18.8807918Z Resolving deltas: 56% (876/1563)
+2022-11-22T05:54:18.8811794Z Resolving deltas: 57% (891/1563)
+2022-11-22T05:54:18.8816897Z Resolving deltas: 58% (907/1563)
+2022-11-22T05:54:18.8820531Z Resolving deltas: 59% (923/1563)
+2022-11-22T05:54:18.8826617Z Resolving deltas: 60% (938/1563)
+2022-11-22T05:54:18.8830227Z Resolving deltas: 61% (954/1563)
+2022-11-22T05:54:18.8833639Z Resolving deltas: 62% (970/1563)
+2022-11-22T05:54:18.8837198Z Resolving deltas: 63% (985/1563)
+2022-11-22T05:54:18.8841013Z Resolving deltas: 64% (1001/1563)
+2022-11-22T05:54:18.8847335Z Resolving deltas: 65% (1016/1563)
+2022-11-22T05:54:18.8852046Z Resolving deltas: 66% (1032/1563)
+2022-11-22T05:54:18.8856289Z Resolving deltas: 67% (1048/1563)
+2022-11-22T05:54:18.8861881Z Resolving deltas: 68% (1063/1563)
+2022-11-22T05:54:18.8865510Z Resolving deltas: 69% (1079/1563)
+2022-11-22T05:54:18.8870298Z Resolving deltas: 70% (1095/1563)
+2022-11-22T05:54:18.8873958Z Resolving deltas: 71% (1110/1563)
+2022-11-22T05:54:18.8879331Z Resolving deltas: 72% (1126/1563)
+2022-11-22T05:54:18.8884282Z Resolving deltas: 73% (1141/1563)
+2022-11-22T05:54:18.8887555Z Resolving deltas: 74% (1157/1563)
+2022-11-22T05:54:18.8893031Z Resolving deltas: 75% (1173/1563)
+2022-11-22T05:54:18.8897133Z Resolving deltas: 76% (1188/1563)
+2022-11-22T05:54:18.8902745Z Resolving deltas: 77% (1204/1563)
+2022-11-22T05:54:18.8907760Z Resolving deltas: 78% (1220/1563)
+2022-11-22T05:54:18.8915339Z Resolving deltas: 79% (1235/1563)
+2022-11-22T05:54:18.8919747Z Resolving deltas: 80% (1251/1563)
+2022-11-22T05:54:18.8925282Z Resolving deltas: 81% (1267/1563)
+2022-11-22T05:54:18.8930887Z Resolving deltas: 82% (1282/1563)
+2022-11-22T05:54:18.8939494Z Resolving deltas: 83% (1298/1563)
+2022-11-22T05:54:18.8943800Z Resolving deltas: 84% (1313/1563)
+2022-11-22T05:54:18.8952847Z Resolving deltas: 85% (1329/1563)
+2022-11-22T05:54:18.8957233Z Resolving deltas: 86% (1345/1563)
+2022-11-22T05:54:18.8964897Z Resolving deltas: 87% (1360/1563)
+2022-11-22T05:54:18.8974626Z Resolving deltas: 88% (1376/1563)
+2022-11-22T05:54:18.8981120Z Resolving deltas: 89% (1392/1563)
+2022-11-22T05:54:18.8991169Z Resolving deltas: 90% (1407/1563)
+2022-11-22T05:54:18.9004223Z Resolving deltas: 91% (1423/1563)
+2022-11-22T05:54:18.9017738Z Resolving deltas: 92% (1438/1563)
+2022-11-22T05:54:18.9022799Z Resolving deltas: 93% (1454/1563)
+2022-11-22T05:54:18.9029380Z Resolving deltas: 94% (1470/1563)
+2022-11-22T05:54:18.9033633Z Resolving deltas: 95% (1485/1563)
+2022-11-22T05:54:18.9044646Z Resolving deltas: 96% (1501/1563)
+2022-11-22T05:54:18.9053816Z Resolving deltas: 97% (1517/1563)
+2022-11-22T05:54:18.9057259Z Resolving deltas: 98% (1532/1563)
+2022-11-22T05:54:18.9061864Z Resolving deltas: 99% (1548/1563)
+2022-11-22T05:54:18.9069074Z Resolving deltas: 100% (1563/1563)
+2022-11-22T05:54:18.9069513Z Resolving deltas: 100% (1563/1563), done.
+2022-11-22T05:54:19.3818094Z From https://github.com/tgstation/tgstation
+2022-11-22T05:54:19.3819106Z * [new ref] 806eced1b6aa2166e665748be44c5c519833b2e2 -> pull/71181/merge
+2022-11-22T05:54:19.3843465Z ##[endgroup]
+2022-11-22T05:54:19.3844157Z ##[group]Determining the checkout info
+2022-11-22T05:54:19.3845757Z ##[endgroup]
+2022-11-22T05:54:19.3854920Z ##[group]Checking out the ref
+2022-11-22T05:54:19.3855731Z [command]/usr/bin/git checkout --progress --force refs/remotes/pull/71181/merge
+2022-11-22T05:54:20.4063926Z Updating files: 68% (8032/11696)
+2022-11-22T05:54:20.4275321Z Updating files: 69% (8071/11696)
+2022-11-22T05:54:20.4667553Z Updating files: 70% (8188/11696)
+2022-11-22T05:54:20.4748863Z Updating files: 71% (8305/11696)
+2022-11-22T05:54:20.4839310Z Updating files: 72% (8422/11696)
+2022-11-22T05:54:20.4912300Z Updating files: 73% (8539/11696)
+2022-11-22T05:54:20.4973377Z Updating files: 74% (8656/11696)
+2022-11-22T05:54:20.5018309Z Updating files: 75% (8772/11696)
+2022-11-22T05:54:20.5413696Z Updating files: 76% (8889/11696)
+2022-11-22T05:54:20.5531187Z Updating files: 77% (9006/11696)
+2022-11-22T05:54:20.5555866Z Updating files: 78% (9123/11696)
+2022-11-22T05:54:20.5753360Z Updating files: 79% (9240/11696)
+2022-11-22T05:54:20.5835545Z Updating files: 80% (9357/11696)
+2022-11-22T05:54:20.5898136Z Updating files: 81% (9474/11696)
+2022-11-22T05:54:20.5952825Z Updating files: 82% (9591/11696)
+2022-11-22T05:54:20.5998934Z Updating files: 83% (9708/11696)
+2022-11-22T05:54:20.6049707Z Updating files: 84% (9825/11696)
+2022-11-22T05:54:20.6100460Z Updating files: 85% (9942/11696)
+2022-11-22T05:54:20.6152185Z Updating files: 86% (10059/11696)
+2022-11-22T05:54:20.6202834Z Updating files: 87% (10176/11696)
+2022-11-22T05:54:20.6283782Z Updating files: 88% (10293/11696)
+2022-11-22T05:54:20.6506593Z Updating files: 89% (10410/11696)
+2022-11-22T05:54:20.6736171Z Updating files: 90% (10527/11696)
+2022-11-22T05:54:20.6788889Z Updating files: 91% (10644/11696)
+2022-11-22T05:54:20.6838906Z Updating files: 92% (10761/11696)
+2022-11-22T05:54:20.6898626Z Updating files: 93% (10878/11696)
+2022-11-22T05:54:20.6956323Z Updating files: 94% (10995/11696)
+2022-11-22T05:54:20.7015640Z Updating files: 95% (11112/11696)
+2022-11-22T05:54:20.7064247Z Updating files: 96% (11229/11696)
+2022-11-22T05:54:20.7113161Z Updating files: 97% (11346/11696)
+2022-11-22T05:54:20.7209831Z Updating files: 98% (11463/11696)
+2022-11-22T05:54:20.7272887Z Updating files: 99% (11580/11696)
+2022-11-22T05:54:20.7273303Z Updating files: 100% (11696/11696)
+2022-11-22T05:54:20.7275554Z Updating files: 100% (11696/11696), done.
+2022-11-22T05:54:20.7421345Z Note: switching to 'refs/remotes/pull/71181/merge'.
+2022-11-22T05:54:20.7421551Z
+2022-11-22T05:54:20.7421839Z You are in 'detached HEAD' state. You can look around, make experimental
+2022-11-22T05:54:20.7422215Z changes and commit them, and you can discard any commits you make in this
+2022-11-22T05:54:20.7422574Z state without impacting any branches by switching back to a branch.
+2022-11-22T05:54:20.7422770Z
+2022-11-22T05:54:20.7422934Z If you want to create a new branch to retain commits you create, you may
+2022-11-22T05:54:20.7423364Z do so (now or later) by using -c with the switch command. Example:
+2022-11-22T05:54:20.7423551Z
+2022-11-22T05:54:20.7423727Z git switch -c
+2022-11-22T05:54:20.7423871Z
+2022-11-22T05:54:20.7423975Z Or undo this operation with:
+2022-11-22T05:54:20.7424120Z
+2022-11-22T05:54:20.7424204Z git switch -
+2022-11-22T05:54:20.7424328Z
+2022-11-22T05:54:20.7424684Z Turn off this advice by setting config variable advice.detachedHead to false
+2022-11-22T05:54:20.7424902Z
+2022-11-22T05:54:20.7425103Z HEAD is now at 806eced Merge 417e724a9b957bc5b5f40526ff328526f1efe7f3 into 08a748704bfd2d68598c4c036723717421983145
+2022-11-22T05:54:20.7465533Z ##[endgroup]
+2022-11-22T05:54:20.7511808Z [command]/usr/bin/git log -1 --format='%H'
+2022-11-22T05:54:20.7544816Z '806eced1b6aa2166e665748be44c5c519833b2e2'
+2022-11-22T05:54:20.7875252Z ##[group]Run actions/cache@v3
+2022-11-22T05:54:20.7875497Z with:
+2022-11-22T05:54:20.7875691Z path: ~/BYOND
+2022-11-22T05:54:20.7875891Z key: Linux-byond-
+2022-11-22T05:54:20.7876098Z ##[endgroup]
+2022-11-22T05:54:21.3195522Z Received 4090426 of 4090426 (100.0%), 24.5 MBs/sec
+2022-11-22T05:54:21.3196161Z Cache Size: ~4 MB (4090426 B)
+2022-11-22T05:54:21.3216111Z [command]/usr/bin/tar --use-compress-program unzstd -xf /home/runner/work/_temp/b2d9ae3f-43dc-4494-a10d-0913d9199ba9/cache.tzst -P -C /home/runner/work/tgstation/tgstation
+2022-11-22T05:54:21.3633267Z Cache restored successfully
+2022-11-22T05:54:21.3869456Z Cache restored from key: Linux-byond-
+2022-11-22T05:54:21.4011996Z ##[group]Run sudo systemctl start mysql
+2022-11-22T05:54:21.4012363Z [36;1msudo systemctl start mysql[0m
+2022-11-22T05:54:21.4012678Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci;'[0m
+2022-11-22T05:54:21.4013012Z [36;1mmysql -u root -proot tg_ci < SQL/tgstation_schema.sql[0m
+2022-11-22T05:54:21.4013358Z [36;1mmysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;'[0m
+2022-11-22T05:54:21.4013736Z [36;1mmysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql[0m
+2022-11-22T05:54:21.4068798Z shell: /usr/bin/bash -e {0}
+2022-11-22T05:54:21.4069059Z ##[endgroup]
+2022-11-22T05:54:26.1328031Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-22T05:54:26.1632489Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-22T05:54:26.7713121Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-22T05:54:26.7789364Z mysql: [Warning] Using a password on the command line interface can be insecure.
+2022-11-22T05:54:27.1574220Z ##[group]Run sudo dpkg --add-architecture i386
+2022-11-22T05:54:27.1574565Z [36;1msudo dpkg --add-architecture i386[0m
+2022-11-22T05:54:27.1574835Z [36;1msudo apt update || true[0m
+2022-11-22T05:54:27.1575275Z [36;1msudo apt install -o APT::Immediate-Configure=false libssl1.1:i386[0m
+2022-11-22T05:54:27.1575591Z [36;1mbash tools/ci/install_rust_g.sh[0m
+2022-11-22T05:54:27.1627061Z shell: /usr/bin/bash -e {0}
+2022-11-22T05:54:27.1627322Z ##[endgroup]
+2022-11-22T05:54:27.3375235Z
+2022-11-22T05:54:27.3375988Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
+2022-11-22T05:54:27.3376493Z
+2022-11-22T05:54:27.4285840Z Hit:1 http://azure.archive.ubuntu.com/ubuntu focal InRelease
+2022-11-22T05:54:27.4289676Z Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
+2022-11-22T05:54:27.4297956Z Get:3 http://azure.archive.ubuntu.com/ubuntu focal-backports InRelease [108 kB]
+2022-11-22T05:54:27.4307795Z Get:4 http://azure.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
+2022-11-22T05:54:27.4622061Z Get:5 https://packages.microsoft.com/ubuntu/20.04/prod focal InRelease [10.5 kB]
+2022-11-22T05:54:27.6682767Z Hit:6 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal InRelease
+2022-11-22T05:54:27.6820644Z Get:7 http://azure.archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages [2242 kB]
+2022-11-22T05:54:27.7080253Z Get:8 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 Packages [756 kB]
+2022-11-22T05:54:27.7153659Z Get:9 http://azure.archive.ubuntu.com/ubuntu focal-updates/main Translation-en [391 kB]
+2022-11-22T05:54:27.7199273Z Get:10 http://azure.archive.ubuntu.com/ubuntu focal-updates/main amd64 c-n-f Metadata [16.1 kB]
+2022-11-22T05:54:27.7222773Z Get:11 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted i386 Packages [27.8 kB]
+2022-11-22T05:54:27.7303676Z Get:12 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted amd64 Packages [1424 kB]
+2022-11-22T05:54:27.7515018Z Get:13 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted Translation-en [202 kB]
+2022-11-22T05:54:27.7544674Z Get:14 http://azure.archive.ubuntu.com/ubuntu focal-updates/restricted amd64 c-n-f Metadata [636 B]
+2022-11-22T05:54:27.7574161Z Get:15 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe amd64 Packages [1003 kB]
+2022-11-22T05:54:27.7673252Z Get:16 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe i386 Packages [704 kB]
+2022-11-22T05:54:27.8208601Z Get:17 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe Translation-en [233 kB]
+2022-11-22T05:54:27.8216256Z Get:18 http://azure.archive.ubuntu.com/ubuntu focal-updates/universe amd64 c-n-f Metadata [23.1 kB]
+2022-11-22T05:54:27.8232910Z Get:19 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 Packages [24.4 kB]
+2022-11-22T05:54:27.8249854Z Get:20 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse i386 Packages [8448 B]
+2022-11-22T05:54:27.8266458Z Get:21 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse Translation-en [7316 B]
+2022-11-22T05:54:27.8273359Z Get:22 http://azure.archive.ubuntu.com/ubuntu focal-updates/multiverse amd64 c-n-f Metadata [592 B]
+2022-11-22T05:54:27.8430731Z Get:23 http://azure.archive.ubuntu.com/ubuntu focal-backports/main amd64 Packages [45.7 kB]
+2022-11-22T05:54:27.8448045Z Get:24 http://azure.archive.ubuntu.com/ubuntu focal-backports/main i386 Packages [36.1 kB]
+2022-11-22T05:54:27.8455777Z Get:25 http://azure.archive.ubuntu.com/ubuntu focal-backports/main amd64 c-n-f Metadata [1420 B]
+2022-11-22T05:54:27.8474467Z Get:26 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe amd64 Packages [24.0 kB]
+2022-11-22T05:54:27.8487869Z Get:27 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe i386 Packages [13.5 kB]
+2022-11-22T05:54:27.8504387Z Get:28 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe Translation-en [16.0 kB]
+2022-11-22T05:54:27.8546555Z Get:29 http://azure.archive.ubuntu.com/ubuntu focal-backports/universe amd64 c-n-f Metadata [860 B]
+2022-11-22T05:54:27.9493534Z Get:30 http://azure.archive.ubuntu.com/ubuntu focal-security/main i386 Packages [523 kB]
+2022-11-22T05:54:27.9983671Z Get:31 http://azure.archive.ubuntu.com/ubuntu focal-security/main amd64 Packages [1860 kB]
+2022-11-22T05:54:28.0182794Z Get:32 http://azure.archive.ubuntu.com/ubuntu focal-security/main Translation-en [305 kB]
+2022-11-22T05:54:28.0222410Z Get:33 http://azure.archive.ubuntu.com/ubuntu focal-security/main amd64 c-n-f Metadata [11.2 kB]
+2022-11-22T05:54:28.0233838Z Get:34 http://azure.archive.ubuntu.com/ubuntu focal-security/restricted i386 Packages [26.5 kB]
+2022-11-22T05:54:28.0249393Z Get:35 http://azure.archive.ubuntu.com/ubuntu focal-security/restricted amd64 Packages [1332 kB]
+2022-11-22T05:54:28.0380967Z Get:36 http://azure.archive.ubuntu.com/ubuntu focal-security/restricted Translation-en [188 kB]
+2022-11-22T05:54:28.0408349Z Get:37 http://azure.archive.ubuntu.com/ubuntu focal-security/restricted amd64 c-n-f Metadata [640 B]
+2022-11-22T05:54:28.0444696Z Get:38 http://azure.archive.ubuntu.com/ubuntu focal-security/universe i386 Packages [572 kB]
+2022-11-22T05:54:28.0502119Z Get:39 http://azure.archive.ubuntu.com/ubuntu focal-security/universe amd64 Packages [772 kB]
+2022-11-22T05:54:28.0585971Z Get:40 http://azure.archive.ubuntu.com/ubuntu focal-security/universe Translation-en [148 kB]
+2022-11-22T05:54:28.0636831Z Get:41 http://azure.archive.ubuntu.com/ubuntu focal-security/universe amd64 c-n-f Metadata [16.7 kB]
+2022-11-22T05:54:28.0654711Z Get:42 http://azure.archive.ubuntu.com/ubuntu focal-security/multiverse amd64 Packages [22.2 kB]
+2022-11-22T05:54:28.0669089Z Get:43 http://azure.archive.ubuntu.com/ubuntu focal-security/multiverse i386 Packages [7204 B]
+2022-11-22T05:54:28.0683649Z Get:44 http://azure.archive.ubuntu.com/ubuntu focal-security/multiverse Translation-en [5400 B]
+2022-11-22T05:54:28.1105332Z Get:45 http://azure.archive.ubuntu.com/ubuntu focal-security/multiverse amd64 c-n-f Metadata [516 B]
+2022-11-22T05:54:28.1142074Z Get:46 https://packages.microsoft.com/ubuntu/20.04/prod focal/main armhf Packages [29.1 kB]
+2022-11-22T05:54:28.1209782Z Get:47 https://packages.microsoft.com/ubuntu/20.04/prod focal/main amd64 Packages [212 kB]
+2022-11-22T05:54:28.1419050Z Get:48 https://packages.microsoft.com/ubuntu/20.04/prod focal/main arm64 Packages [46.2 kB]
+2022-11-22T05:54:28.3678597Z Get:49 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 Packages [15.2 kB]
+2022-11-22T05:54:38.6427399Z Fetched 13.6 MB in 2s (5935 kB/s)
+2022-11-22T05:54:39.7808627Z Reading package lists...
+2022-11-22T05:54:40.0112436Z Building dependency tree...
+2022-11-22T05:54:40.0125566Z Reading state information...
+2022-11-22T05:54:40.1053352Z 85 packages can be upgraded. Run 'apt list --upgradable' to see them.
+2022-11-22T05:54:40.1155226Z
+2022-11-22T05:54:40.1156119Z WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
+2022-11-22T05:54:40.1156379Z
+2022-11-22T05:54:40.1697963Z Reading package lists...
+2022-11-22T05:54:40.3785154Z Building dependency tree...
+2022-11-22T05:54:40.3851341Z Reading state information...
+2022-11-22T05:54:40.5578517Z The following additional packages will be installed:
+2022-11-22T05:54:40.5579769Z gcc-11-base:i386 libc6:i386 libcrypt1:i386 libgcc-s1 libgcc-s1:i386
+2022-11-22T05:54:40.5582977Z libidn2-0:i386 libunistring2:i386
+2022-11-22T05:54:40.5590112Z Suggested packages:
+2022-11-22T05:54:40.5590688Z glibc-doc:i386 locales:i386
+2022-11-22T05:54:40.6255739Z The following NEW packages will be installed:
+2022-11-22T05:54:40.6261367Z gcc-11-base:i386 libc6:i386 libcrypt1:i386 libgcc-s1:i386 libidn2-0:i386
+2022-11-22T05:54:40.6266998Z libssl1.1:i386 libunistring2:i386
+2022-11-22T05:54:40.6273154Z The following packages will be upgraded:
+2022-11-22T05:54:40.6279277Z libgcc-s1
+2022-11-22T05:54:40.6671578Z 1 upgraded, 7 newly installed, 0 to remove and 84 not upgraded.
+2022-11-22T05:54:40.7568259Z Need to get 4528 kB of archives.
+2022-11-22T05:54:40.7569656Z After this operation, 19.3 MB of additional disk space will be used.
+2022-11-22T05:54:40.7571172Z Get:1 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libcrypt1 i386 1:4.4.10-10ubuntu4 [90.9 kB]
+2022-11-22T05:54:40.8228146Z Get:2 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 libc6 i386 2.31-0ubuntu9.9 [2580 kB]
+2022-11-22T05:54:40.8872245Z Get:3 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 gcc-11-base i386 11.1.0-1ubuntu1~20.04 [19.0 kB]
+2022-11-22T05:54:40.9288307Z Get:4 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libunistring2 i386 0.9.10-2 [377 kB]
+2022-11-22T05:54:40.9540992Z Get:5 http://azure.archive.ubuntu.com/ubuntu focal/main i386 libidn2-0 i386 2.2.0-2 [51.4 kB]
+2022-11-22T05:54:40.9732163Z Get:6 http://azure.archive.ubuntu.com/ubuntu focal-updates/main i386 libssl1.1 i386 1.1.1f-1ubuntu2.16 [1318 kB]
+2022-11-22T05:54:41.1393577Z Get:7 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main amd64 libgcc-s1 amd64 11.1.0-1ubuntu1~20.04 [42.1 kB]
+2022-11-22T05:54:41.3919926Z Get:8 http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu focal/main i386 libgcc-s1 i386 11.1.0-1ubuntu1~20.04 [50.0 kB]
+2022-11-22T05:54:41.9330770Z Preconfiguring packages ...
+2022-11-22T05:54:42.0223529Z Fetched 4528 kB in 1s (5289 kB/s)
+2022-11-22T05:54:42.0557174Z Selecting previously unselected package gcc-11-base:i386.
+2022-11-22T05:54:42.0854631Z (Reading database ...
+2022-11-22T05:54:42.0856650Z (Reading database ... 5%
+2022-11-22T05:54:42.0857135Z (Reading database ... 10%
+2022-11-22T05:54:42.0857616Z (Reading database ... 15%
+2022-11-22T05:54:42.0858054Z (Reading database ... 20%
+2022-11-22T05:54:42.0858479Z (Reading database ... 25%
+2022-11-22T05:54:42.0858956Z (Reading database ... 30%
+2022-11-22T05:54:42.0859370Z (Reading database ... 35%
+2022-11-22T05:54:42.0861988Z (Reading database ... 40%
+2022-11-22T05:54:42.0862367Z (Reading database ... 45%
+2022-11-22T05:54:42.0868447Z (Reading database ... 50%
+2022-11-22T05:54:42.1200369Z (Reading database ... 55%
+2022-11-22T05:54:42.1600440Z (Reading database ... 60%
+2022-11-22T05:54:42.2011877Z (Reading database ... 65%
+2022-11-22T05:54:42.2691087Z (Reading database ... 70%
+2022-11-22T05:54:42.3704401Z (Reading database ... 75%
+2022-11-22T05:54:42.4279826Z (Reading database ... 80%
+2022-11-22T05:54:42.5026921Z (Reading database ... 85%
+2022-11-22T05:54:42.6241054Z (Reading database ... 90%
+2022-11-22T05:54:42.6851914Z (Reading database ... 95%
+2022-11-22T05:54:42.6852580Z (Reading database ... 100%
+2022-11-22T05:54:42.6853325Z (Reading database ... 242126 files and directories currently installed.)
+2022-11-22T05:54:42.6940933Z Preparing to unpack .../0-gcc-11-base_11.1.0-1ubuntu1~20.04_i386.deb ...
+2022-11-22T05:54:42.7004541Z Unpacking gcc-11-base:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-22T05:54:42.8039338Z Preparing to unpack .../1-libgcc-s1_11.1.0-1ubuntu1~20.04_amd64.deb ...
+2022-11-22T05:54:42.8690745Z Unpacking libgcc-s1:amd64 (11.1.0-1ubuntu1~20.04) over (10.3.0-1ubuntu1~20.04) ...
+2022-11-22T05:54:42.9070629Z Selecting previously unselected package libgcc-s1:i386.
+2022-11-22T05:54:42.9298797Z Preparing to unpack .../2-libgcc-s1_11.1.0-1ubuntu1~20.04_i386.deb ...
+2022-11-22T05:54:42.9315714Z Unpacking libgcc-s1:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-22T05:54:42.9648689Z Selecting previously unselected package libcrypt1:i386.
+2022-11-22T05:54:42.9852885Z Preparing to unpack .../3-libcrypt1_1%3a4.4.10-10ubuntu4_i386.deb ...
+2022-11-22T05:54:42.9856149Z Unpacking libcrypt1:i386 (1:4.4.10-10ubuntu4) ...
+2022-11-22T05:54:43.0771392Z Selecting previously unselected package libc6:i386.
+2022-11-22T05:54:43.1007419Z Preparing to unpack .../4-libc6_2.31-0ubuntu9.9_i386.deb ...
+2022-11-22T05:54:43.2242069Z Unpacking libc6:i386 (2.31-0ubuntu9.9) ...
+2022-11-22T05:54:43.5298133Z Replacing files in old package libc6-i386 (2.31-0ubuntu9.9) ...
+2022-11-22T05:54:43.5688011Z Selecting previously unselected package libunistring2:i386.
+2022-11-22T05:54:43.5908746Z Preparing to unpack .../5-libunistring2_0.9.10-2_i386.deb ...
+2022-11-22T05:54:43.5926527Z Unpacking libunistring2:i386 (0.9.10-2) ...
+2022-11-22T05:54:43.7011902Z Selecting previously unselected package libidn2-0:i386.
+2022-11-22T05:54:43.7250698Z Preparing to unpack .../6-libidn2-0_2.2.0-2_i386.deb ...
+2022-11-22T05:54:43.7260936Z Unpacking libidn2-0:i386 (2.2.0-2) ...
+2022-11-22T05:54:43.8011769Z Selecting previously unselected package libssl1.1:i386.
+2022-11-22T05:54:43.8231978Z Preparing to unpack .../7-libssl1.1_1.1.1f-1ubuntu2.16_i386.deb ...
+2022-11-22T05:54:43.8249767Z Unpacking libssl1.1:i386 (1.1.1f-1ubuntu2.16) ...
+2022-11-22T05:54:43.9966260Z Setting up gcc-11-base:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-22T05:54:44.0023499Z Setting up libgcc-s1:amd64 (11.1.0-1ubuntu1~20.04) ...
+2022-11-22T05:54:44.0074843Z Setting up libgcc-s1:i386 (11.1.0-1ubuntu1~20.04) ...
+2022-11-22T05:54:44.0147311Z Setting up libcrypt1:i386 (1:4.4.10-10ubuntu4) ...
+2022-11-22T05:54:44.0207900Z Setting up libc6:i386 (2.31-0ubuntu9.9) ...
+2022-11-22T05:54:44.2245544Z Setting up libssl1.1:i386 (1.1.1f-1ubuntu2.16) ...
+2022-11-22T05:54:44.3413101Z Setting up libunistring2:i386 (0.9.10-2) ...
+2022-11-22T05:54:44.3480700Z Setting up libidn2-0:i386 (2.2.0-2) ...
+2022-11-22T05:54:44.3526066Z Processing triggers for libc-bin (2.31-0ubuntu9.9) ...
+2022-11-22T05:54:47.9184710Z 2022-11-22 05:54:47 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/127494547/92c6bbfc-0d51-48ea-b586-9cd01c071d25?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221122%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221122T055447Z&X-Amz-Expires=300&X-Amz-Signature=a32f997c627b97bfd5d0adc58e9308d7ad18409d943ce16b7a351e9c3ed708ae&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=127494547&response-content-disposition=attachment%3B%20filename%3Dlibrust_g.so&response-content-type=application%2Foctet-stream [72809008/72809008] -> "/home/runner/.byond/bin/librust_g.so" [1]
+2022-11-22T05:54:47.9588206Z linux-gate.so.1 (0xf7f26000)
+2022-11-22T05:54:47.9589002Z libssl.so.1.1 => /lib/i386-linux-gnu/libssl.so.1.1 (0xf7758000)
+2022-11-22T05:54:47.9589713Z libcrypto.so.1.1 => /lib/i386-linux-gnu/libcrypto.so.1.1 (0xf74a0000)
+2022-11-22T05:54:47.9590427Z libz.so.1 => /lib32/libz.so.1 (0xf7482000)
+2022-11-22T05:54:47.9591034Z libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7463000)
+2022-11-22T05:54:47.9603888Z libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7440000)
+2022-11-22T05:54:47.9604548Z libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf733b000)
+2022-11-22T05:54:47.9605162Z libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7335000)
+2022-11-22T05:54:47.9607450Z libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7146000)
+2022-11-22T05:54:47.9608010Z /lib/ld-linux.so.2 (0xf7f28000)
+2022-11-22T05:54:47.9651599Z ##[group]Run bash tools/ci/install_auxlua.sh
+2022-11-22T05:54:47.9651916Z [36;1mbash tools/ci/install_auxlua.sh[0m
+2022-11-22T05:54:47.9705175Z shell: /usr/bin/bash -e {0}
+2022-11-22T05:54:47.9705424Z ##[endgroup]
+2022-11-22T05:54:48.2148819Z 2022-11-22 05:54:48 URL:https://objects.githubusercontent.com/github-production-release-asset-2e65be/473295481/bb55dc2f-8248-4032-ad66-b80cb61a84f3?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221122%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221122T055448Z&X-Amz-Expires=300&X-Amz-Signature=a48846f5bb1d413d7d97402cc3c1d0f7f80f6a04583d898bce2ff6a0bdfd469a&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=473295481&response-content-disposition=attachment%3B%20filename%3Dlibauxlua.so&response-content-type=application%2Foctet-stream [5781068/5781068] -> "/home/runner/.byond/bin/libauxlua.so" [1]
+2022-11-22T05:54:48.2431263Z linux-gate.so.1 (0xf7ee6000)
+2022-11-22T05:54:48.2431996Z libstdc++.so.6 => /lib32/libstdc++.so.6 (0xf7adf000)
+2022-11-22T05:54:48.2436279Z libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xf7ac0000)
+2022-11-22T05:54:48.2436997Z libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xf7a9d000)
+2022-11-22T05:54:48.2437658Z libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xf7998000)
+2022-11-22T05:54:48.2439621Z libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xf7992000)
+2022-11-22T05:54:48.2440822Z libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf77a3000)
+2022-11-22T05:54:48.2441586Z /lib/ld-linux.so.2 (0xf7ee8000)
+2022-11-22T05:54:48.2494794Z ##[group]Run bash tools/ci/install_byond.sh
+2022-11-22T05:54:48.2495106Z [36;1mbash tools/ci/install_byond.sh[0m
+2022-11-22T05:54:48.2495386Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2022-11-22T05:54:48.2495706Z [36;1mtools/build/build --ci dm -DCIBUILDING -DANSICOLORS[0m
+2022-11-22T05:54:48.2545744Z shell: /usr/bin/bash -e {0}
+2022-11-22T05:54:48.2545971Z ##[endgroup]
+2022-11-22T05:54:48.2653351Z Setting up BYOND.
+2022-11-22T05:54:48.2793431Z % Total % Received % Xferd Average Speed Time Time Time Current
+2022-11-22T05:54:48.2797236Z Dload Upload Total Spent Left Speed
+2022-11-22T05:54:48.2797554Z
+2022-11-22T05:54:48.3941092Z 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
+2022-11-22T05:54:48.3943148Z 100 4021k 100 4021k 0 0 34.1M 0 --:--:-- --:--:-- --:--:-- 34.1M
+2022-11-22T05:54:48.3983451Z Archive: byond.zip
+2022-11-22T05:54:48.3983864Z creating: byond/
+2022-11-22T05:54:48.3984237Z creating: byond/key/
+2022-11-22T05:54:48.3984563Z creating: byond/web/
+2022-11-22T05:54:48.3985833Z inflating: byond/web/child.dms
+2022-11-22T05:54:48.3986928Z inflating: byond/web/button.dms
+2022-11-22T05:54:48.3988496Z inflating: byond/web/input.dms
+2022-11-22T05:54:48.3989251Z inflating: byond/web/text.dms
+2022-11-22T05:54:48.4097340Z inflating: byond/web/webclient.dart.js
+2022-11-22T05:54:48.4098200Z inflating: byond/web/verbmenu.dms
+2022-11-22T05:54:48.4099001Z inflating: byond/web/defaultSkin.dms
+2022-11-22T05:54:48.4100540Z inflating: byond/web/hotbar.dms
+2022-11-22T05:54:48.4101414Z inflating: byond/web/label.dms
+2022-11-22T05:54:48.4102162Z inflating: byond/web/alert.dms
+2022-11-22T05:54:48.4102953Z inflating: byond/web/message.dms
+2022-11-22T05:54:48.4103516Z inflating: byond/web/drag.png
+2022-11-22T05:54:48.4104351Z inflating: byond/web/map.dms
+2022-11-22T05:54:48.4105580Z inflating: byond/web/splashlogo.png
+2022-11-22T05:54:48.4106166Z inflating: byond/web/drop.png
+2022-11-22T05:54:48.4211884Z inflating: byond/web/ext.js
+2022-11-22T05:54:48.4212354Z inflating: byond/web/file.dms
+2022-11-22T05:54:48.4213426Z inflating: byond/web/grid.dms
+2022-11-22T05:54:48.4214990Z inflating: byond/web/bar.dms
+2022-11-22T05:54:48.4218521Z inflating: byond/web/dpad.dms
+2022-11-22T05:54:48.4218793Z inflating: byond/web/output.dms
+2022-11-22T05:54:48.4220119Z inflating: byond/web/tab.dms
+2022-11-22T05:54:48.4221829Z inflating: byond/web/info.dms
+2022-11-22T05:54:48.4223462Z inflating: byond/web/color.dms
+2022-11-22T05:54:48.4224634Z inflating: byond/web/gamepad.dms
+2022-11-22T05:54:48.4226063Z inflating: byond/web/browser.dms
+2022-11-22T05:54:48.4226672Z inflating: byond/web/status.dms
+2022-11-22T05:54:48.4227640Z inflating: byond/web/any.dms
+2022-11-22T05:54:48.4228616Z inflating: byond/web/pane.dms
+2022-11-22T05:54:48.4230037Z inflating: byond/web/pop.dms
+2022-11-22T05:54:48.4231031Z inflating: byond/license.txt
+2022-11-22T05:54:48.4231783Z inflating: byond/legal.txt
+2022-11-22T05:54:48.4232778Z inflating: byond/Makefile
+2022-11-22T05:54:48.4233180Z creating: byond/man/
+2022-11-22T05:54:48.4233524Z creating: byond/man/man6/
+2022-11-22T05:54:48.4234935Z inflating: byond/man/man6/DreamDaemon.6
+2022-11-22T05:54:48.4235672Z inflating: byond/man/man6/DreamMaker.6
+2022-11-22T05:54:48.4235940Z creating: byond/lib/
+2022-11-22T05:54:48.4236255Z creating: byond/host/
+2022-11-22T05:54:48.4237956Z inflating: byond/host/readme.html
+2022-11-22T05:54:48.4238971Z inflating: byond/host/readme-unix.txt
+2022-11-22T05:54:48.4239365Z creating: byond/host/home/
+2022-11-22T05:54:48.4239866Z creating: byond/host/home/root/
+2022-11-22T05:54:48.4240241Z creating: byond/host/home/root/byond/
+2022-11-22T05:54:48.4240880Z creating: byond/host/home/root/byond/tools/
+2022-11-22T05:54:48.4241382Z creating: byond/host/home/root/byond/tools/root/
+2022-11-22T05:54:48.4247309Z inflating: byond/host/home/root/byond/tools/root/root.dmb
+2022-11-22T05:54:48.4247605Z creating: byond/host/shared/
+2022-11-22T05:54:48.4247857Z creating: byond/host/shared/byond/
+2022-11-22T05:54:48.4248438Z creating: byond/host/shared/byond/tools/
+2022-11-22T05:54:48.4248723Z creating: byond/host/shared/byond/tools/ftp/
+2022-11-22T05:54:48.4251228Z inflating: byond/host/shared/byond/tools/ftp/ftp.dmb
+2022-11-22T05:54:48.4251558Z creating: byond/host/shared/byond/tools/admin/
+2022-11-22T05:54:48.4257787Z inflating: byond/host/shared/byond/tools/admin/admin.dmb
+2022-11-22T05:54:48.4258223Z creating: byond/host/shared-web/
+2022-11-22T05:54:48.4258547Z creating: byond/host/shared-web/web/
+2022-11-22T05:54:48.4259004Z creating: byond/host/shared-web/web/tools/
+2022-11-22T05:54:48.4259439Z creating: byond/host/shared-web/web/tools/admin/
+2022-11-22T05:54:48.4265239Z inflating: byond/host/shared-web/web/tools/admin/index.dmb
+2022-11-22T05:54:48.4272736Z inflating: byond/host/host.dmb
+2022-11-22T05:54:48.4273011Z inflating: byond/host/host.start
+2022-11-22T05:54:48.4273659Z inflating: byond/host/hostconf.orig
+2022-11-22T05:54:48.4274617Z inflating: byond/host/hostconf.txt
+2022-11-22T05:54:48.4275402Z inflating: byond/readme.txt
+2022-11-22T05:54:48.4275717Z creating: byond/bin/
+2022-11-22T05:54:48.4276299Z inflating: byond/bin/byondexec
+2022-11-22T05:54:48.4278446Z inflating: byond/bin/DreamDownload
+2022-11-22T05:54:48.4922483Z inflating: byond/bin/libbyond.so
+2022-11-22T05:54:48.5068123Z inflating: byond/bin/libext.so
+2022-11-22T05:54:48.5070046Z inflating: byond/bin/DreamDaemon
+2022-11-22T05:54:48.5074232Z inflating: byond/bin/DreamMaker
+2022-11-22T05:54:48.5074521Z creating: byond/cfg/
+2022-11-22T05:54:48.5074946Z inflating: byond/cfg/release.txt
+2022-11-22T05:54:48.5230052Z ***************************
+2022-11-22T05:54:48.5237614Z Now run the following command:
+2022-11-22T05:54:48.5248736Z
+2022-11-22T05:54:48.5259947Z source /home/runner/BYOND/byond/bin/byondsetup
+2022-11-22T05:54:48.5270619Z
+2022-11-22T05:54:48.5278255Z If it generates errors, your shell is not compatible with 'sh', so you will
+2022-11-22T05:54:48.5285604Z have to edit byondsetup and make it work with your shell. If the script works, you should be able to run DreamDaemon.
+2022-11-22T05:54:48.5297083Z
+2022-11-22T05:54:48.5304283Z IMPORTANT: once you have the script working, you must add the above line
+2022-11-22T05:54:48.5311617Z to your startup script. The name of your startup script depends on the
+2022-11-22T05:54:48.5318799Z shell you use. Typical ones are .profile or .bash_profile.
+2022-11-22T05:54:48.5329607Z
+2022-11-22T05:54:48.5335539Z Once everything is working, you can find out more about the software
+2022-11-22T05:54:48.5340846Z by doing 'man DreamDaemon'. A host server has also been included
+2022-11-22T05:54:48.5345719Z so edit host/hostconf.txt and boot up your world server!
+2022-11-22T05:54:48.5350723Z ***************************
+2022-11-22T05:54:48.6078889Z Using system-wide Node v16.18.0
+2022-11-22T05:54:48.7660550Z :: Juke Build version 0.8.1
+2022-11-22T05:54:49.0224910Z => Starting 'dm'
+2022-11-22T05:54:49.0233013Z :: Using defines: CBT, CIBUILDING, ANSICOLORS
+2022-11-22T05:54:49.2134158Z DM compiler version 514.1588
+2022-11-22T05:54:49.2134485Z loading tgstation.m.dme
+2022-11-22T05:54:57.6255000Z loading interface/skin.dmf
+2022-11-22T05:55:47.8603172Z loading map_files/generic/CentCom.dmm
+2022-11-22T05:55:48.8009123Z saving tgstation.m.dmb (DEBUG mode)
+2022-11-22T05:55:49.8362884Z tgstation.m.dmb - 0 errors, 0 warnings (11/22/22 5:55 am)
+2022-11-22T05:55:49.8414352Z Total time: 1:00
+2022-11-22T05:55:50.7626726Z => Finished 'dm' in 61.74s
+2022-11-22T05:55:50.7630781Z => Done in 61.996s
+2022-11-22T05:55:50.7723825Z ##[group]Run source $HOME/BYOND/byond/bin/byondsetup
+2022-11-22T05:55:50.7724384Z [36;1msource $HOME/BYOND/byond/bin/byondsetup[0m
+2022-11-22T05:55:50.7725050Z [36;1mbash tools/ci/run_server.sh metastation[0m
+2022-11-22T05:55:50.7801355Z shell: /usr/bin/bash -e {0}
+2022-11-22T05:55:50.7801587Z ##[endgroup]
+2022-11-22T05:55:50.7892704Z Testing metastation
+2022-11-22T05:55:51.0035586Z cp: cannot stat 'tgui/packages/tgfont/dist/*': No such file or directory
+2022-11-22T05:55:51.0189960Z Tue Nov 22 05:55:51 2022
+2022-11-22T05:55:51.0190868Z World opened on network port 58409.
+2022-11-22T05:55:51.0191359Z Welcome BYOND! (5.0 Public Version 514.1588)
+2022-11-22T05:56:10.1077799Z 868 global variables
+2022-11-22T05:56:10.7927422Z World loaded at 05:56:10!
+2022-11-22T05:56:10.8379706Z Running /tg/ revision:
+2022-11-22T05:56:10.8380020Z No commit information
+2022-11-22T05:56:10.8454815Z Loading config file config.txt...
+2022-11-22T05:56:10.8458259Z Loading config file maps.txt...
+2022-11-22T05:56:10.8479868Z Unable to locate admins backup file.
+2022-11-22T05:56:11.8631460Z Initialized Title Screen subsystem within 0 seconds!
+2022-11-22T05:56:11.8631891Z Initialized Server Tasks subsystem within 0 seconds!
+2022-11-22T05:56:11.8632565Z Initialized Input subsystem within 0 seconds!
+2022-11-22T05:56:11.8690820Z Initialized Profiler subsystem within 0 seconds!
+2022-11-22T05:56:11.8691168Z Initialized Database subsystem within 0 seconds!
+2022-11-22T05:56:11.8691814Z Initialized Blackbox subsystem within 0 seconds!
+2022-11-22T05:56:11.8692797Z Initialized Sounds subsystem within 0 seconds!
+2022-11-22T05:56:11.8828615Z Initialized Instruments subsystem within 0.01 seconds!
+2022-11-22T05:56:12.2167428Z Initialized Greyscale subsystem within 0.33 seconds!
+2022-11-22T05:56:12.2167879Z Initialized Vis contents overlays subsystem within 0 seconds!
+2022-11-22T05:56:12.2168267Z Initialized Security Level subsystem within 0 seconds!
+2022-11-22T05:56:12.2189261Z Initialized Station subsystem within 0 seconds!
+2022-11-22T05:56:12.2202098Z Initialized Quirks subsystem within 0 seconds!
+2022-11-22T05:56:12.2320897Z Initialized Reagents subsystem within 0.01 seconds!
+2022-11-22T05:56:12.2325541Z Initialized Events subsystem within 0 seconds!
+2022-11-22T05:56:12.2377703Z Initialized IDs and Access subsystem within 0.01 seconds!
+2022-11-22T05:56:12.2378499Z Initialized Jobs subsystem within 0 seconds!
+2022-11-22T05:56:12.2379505Z Initialized AI movement subsystem within 0 seconds!
+2022-11-22T05:56:12.2399099Z Initialized Ticker subsystem within 0 seconds!
+2022-11-22T05:56:12.2401506Z Initialized AI Controller Ticker subsystem within 0 seconds!
+2022-11-22T05:56:12.2402756Z Initialized AI Behavior Ticker subsystem within 0 seconds!
+2022-11-22T05:56:12.2534901Z Initialized Trading Card Game subsystem within 0.01 seconds!
+2022-11-22T05:56:12.2695227Z Loading MetaStation...
+2022-11-22T05:56:13.6007721Z Loaded Station in 1.4s!
+2022-11-22T05:56:14.3263930Z Loaded Lavaland in 0.6s!
+2022-11-22T05:56:15.0849457Z Ruin loader finished with 0 left to spend.
+2022-11-22T05:56:15.1862835Z Ruin loader finished with 0 left to spend.
+2022-11-22T05:56:15.4246125Z Cave Generator finished in 0.3s!
+2022-11-22T05:56:15.4560459Z Cave Generator finished in 0s!
+2022-11-22T05:56:16.0885613Z Initialized Mapping subsystem within 3.83 seconds!
+2022-11-22T05:56:38.2726128Z Initialized Early Assets subsystem within 22.18 seconds!
+2022-11-22T05:56:38.3071167Z Initialized Research subsystem within 0.03 seconds!
+2022-11-22T05:56:38.3073379Z Initialized Time Tracking subsystem within 0 seconds!
+2022-11-22T05:56:38.3169516Z Initialized Networks subsystem within 0.01 seconds!
+2022-11-22T05:56:38.3386821Z Initialized Spatial Grid subsystem within 0.02 seconds!
+2022-11-22T05:56:38.3387426Z Initialized Economy subsystem within 0 seconds!
+2022-11-22T05:56:38.3396301Z Initialized Restaurant subsystem within 0 seconds!
+2022-11-22T05:56:40.9885406Z The BYOND hub reports that port 58409 is not reachable.
+2022-11-22T05:57:05.1172204Z ## NOTICE: morgue_cadaver_disable_nonhumans. There are no valid roundstart nonhuman races enabled. Defaulting to humans only!
+2022-11-22T05:57:06.7858739Z Initialized Atoms subsystem within 28.45 seconds!
+2022-11-22T05:57:06.7975404Z Initialized Language subsystem within 0.01 seconds!
+2022-11-22T05:57:06.8745273Z Initialized Machines subsystem within 0.08 seconds!
+2022-11-22T05:57:06.8746886Z Initialized Skills subsystem within 0 seconds!
+2022-11-22T05:57:06.8748827Z Initialized Addiction subsystem within 0 seconds!
+2022-11-22T05:57:06.8758560Z Initialized Blackmarket subsystem within 0 seconds!
+2022-11-22T05:57:06.8761410Z Initialized Disease subsystem within 0 seconds!
+2022-11-22T05:57:06.8761834Z Initialized Fluid subsystem within 0 seconds!
+2022-11-22T05:57:06.8762760Z Initialized Smoke subsystem within 0 seconds!
+2022-11-22T05:57:06.8763545Z Initialized Foam subsystem within 0 seconds!
+2022-11-22T05:57:06.8764349Z Initialized Lag Switch subsystem within 0 seconds!
+2022-11-22T05:57:06.8940474Z Initialized Library Loading subsystem within 0.02 seconds!
+2022-11-22T05:57:07.2408456Z Initialized Lua Scripting subsystem within 0.35 seconds!
+2022-11-22T05:57:07.2409327Z Initialized Night Shift subsystem within 0 seconds!
+2022-11-22T05:57:07.2410361Z Initialized Sun subsystem within 0 seconds!
+2022-11-22T05:57:07.2435844Z Initialized Traitor subsystem within 0 seconds!
+2022-11-22T05:57:07.2632292Z Initialized Wardrobe subsystem within 0.02 seconds!
+2022-11-22T05:57:07.2633023Z Initialized Weather subsystem within 0 seconds!
+2022-11-22T05:57:07.2633877Z Initialized Wiremod Composite Templates subsystem within 0 seconds!
+2022-11-22T05:57:10.9882289Z Initialized Atmospherics subsystem within 3.72 seconds!
+2022-11-22T05:57:10.9894873Z Initialized Persistence subsystem within 0 seconds!
+2022-11-22T05:57:10.9899148Z Initialized Persistent Paintings subsystem within 0 seconds!
+2022-11-22T05:57:10.9903351Z Initialized Vote subsystem within 0 seconds!
+2022-11-22T05:57:22.4988698Z Initialized Assets subsystem within 11.51 seconds!
+2022-11-22T05:57:24.3487800Z Initialized Icon Smoothing subsystem within 1.85 seconds!
+2022-11-22T05:57:24.3495654Z Initialized XKeyScore subsystem within 0 seconds!
+2022-11-22T05:57:24.3511340Z Initialized PRISM subsystem within 0 seconds!
+2022-11-22T05:57:29.2181327Z Initialized Lighting subsystem within 4.87 seconds!
+2022-11-22T05:57:31.3719906Z Initialized Shuttle subsystem within 2.15 seconds!
+2022-11-22T05:57:31.3720568Z Initialized Pathfinder subsystem within 0 seconds!
+2022-11-22T05:57:31.3728738Z Initialized Ban Cache subsystem within 0 seconds!
+2022-11-22T05:57:31.3729264Z Initialized Init Profiler subsystem within 0 seconds!
+2022-11-22T05:57:31.3729723Z Initialized Chat subsystem within 0 seconds!
+2022-11-22T05:57:31.3730281Z Initializations complete within 79.5 seconds!
+2022-11-22T05:57:31.3830937Z Game start took 0s
+2022-11-22T05:57:42.0634964Z ##[group]/datum/unit_test/log_mapping
+2022-11-22T05:57:42.0635672Z
+2022-11-22T05:57:42.0636846Z [1;32mPASS[0m /datum/unit_test/log_mapping 0s
+2022-11-22T05:57:42.0637417Z ##[endgroup]
+2022-11-22T05:57:42.1282731Z ##[group]/datum/unit_test/ablative_hood_hud
+2022-11-22T05:57:42.1532576Z
+2022-11-22T05:57:42.1533762Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud 0s
+2022-11-22T05:57:42.1534764Z ##[endgroup]
+2022-11-22T05:57:42.1781522Z ##[group]/datum/unit_test/ablative_hood_hud_with_helmet
+2022-11-22T05:57:42.2004168Z
+2022-11-22T05:57:42.2005116Z [1;32mPASS[0m /datum/unit_test/ablative_hood_hud_with_helmet 0.1s
+2022-11-22T05:57:42.2011130Z ##[endgroup]
+2022-11-22T05:57:42.2281431Z ##[group]/datum/unit_test/achievements
+2022-11-22T05:57:42.2391582Z
+2022-11-22T05:57:42.2392386Z [1;32mPASS[0m /datum/unit_test/achievements 0s
+2022-11-22T05:57:42.2393271Z ##[endgroup]
+2022-11-22T05:57:42.2781664Z ##[group]/datum/unit_test/anchored_mobs
+2022-11-22T05:57:42.2783035Z
+2022-11-22T05:57:42.2783769Z [1;32mPASS[0m /datum/unit_test/anchored_mobs 0s
+2022-11-22T05:57:42.2784572Z ##[endgroup]
+2022-11-22T05:57:42.2936672Z ##[group]/datum/unit_test/anonymous_themes
+2022-11-22T05:57:42.4235721Z
+2022-11-22T05:57:42.4237433Z [1;32mPASS[0m /datum/unit_test/anonymous_themes 0.2s
+2022-11-22T05:57:42.4238500Z ##[endgroup]
+2022-11-22T05:57:42.6392895Z ##[group]/datum/unit_test/autowiki
+2022-11-22T05:57:43.8278371Z
+2022-11-22T05:57:43.8280173Z [1;32mPASS[0m /datum/unit_test/autowiki 1.2s
+2022-11-22T05:57:43.8281239Z ##[endgroup]
+2022-11-22T05:57:44.9926595Z ##[group]/datum/unit_test/autowiki_include_template
+2022-11-22T05:57:44.9929132Z
+2022-11-22T05:57:44.9931384Z [1;32mPASS[0m /datum/unit_test/autowiki_include_template 0s
+2022-11-22T05:57:44.9933262Z ##[endgroup]
+2022-11-22T05:57:45.0087357Z ##[group]/datum/unit_test/barsigns_icon
+2022-11-22T05:57:45.0294182Z
+2022-11-22T05:57:45.0295837Z [1;32mPASS[0m /datum/unit_test/barsigns_icon 0s
+2022-11-22T05:57:45.0298739Z ##[endgroup]
+2022-11-22T05:57:45.0940696Z ##[group]/datum/unit_test/barsigns_name
+2022-11-22T05:57:45.0941383Z
+2022-11-22T05:57:45.0944198Z [1;32mPASS[0m /datum/unit_test/barsigns_name 0s
+2022-11-22T05:57:45.0946955Z ##[endgroup]
+2022-11-22T05:57:45.1096461Z ##[group]/datum/unit_test/bespoke_id
+2022-11-22T05:57:45.1096937Z
+2022-11-22T05:57:45.1099174Z [1;32mPASS[0m /datum/unit_test/bespoke_id 0s
+2022-11-22T05:57:45.1100742Z ##[endgroup]
+2022-11-22T05:57:45.1439539Z ##[group]/datum/unit_test/binary_insert
+2022-11-22T05:57:45.1442012Z
+2022-11-22T05:57:45.1443259Z [1;32mPASS[0m /datum/unit_test/binary_insert 0s
+2022-11-22T05:57:45.1444013Z ##[endgroup]
+2022-11-22T05:57:45.1594465Z ##[group]/datum/unit_test/bloody_footprints
+2022-11-22T05:57:45.1861559Z
+2022-11-22T05:57:45.1862509Z [1;32mPASS[0m /datum/unit_test/bloody_footprints 0s
+2022-11-22T05:57:45.1863678Z ##[endgroup]
+2022-11-22T05:57:45.2757269Z ##[group]/datum/unit_test/breath_sanity
+2022-11-22T05:57:45.3154911Z
+2022-11-22T05:57:45.3155918Z [1;32mPASS[0m /datum/unit_test/breath_sanity 0.1s
+2022-11-22T05:57:45.3157085Z ##[endgroup]
+2022-11-22T05:57:45.3851583Z ##[group]/datum/unit_test/breath_sanity_plasmamen
+2022-11-22T05:57:45.4259844Z
+2022-11-22T05:57:45.4260721Z [1;32mPASS[0m /datum/unit_test/breath_sanity_plasmamen 0.1s
+2022-11-22T05:57:45.4261835Z ##[endgroup]
+2022-11-22T05:57:45.4970449Z ##[group]/datum/unit_test/breath_sanity_ashwalker
+2022-11-22T05:57:45.5458718Z
+2022-11-22T05:57:45.5459726Z [1;32mPASS[0m /datum/unit_test/breath_sanity_ashwalker 0.1s
+2022-11-22T05:57:45.5460898Z ##[endgroup]
+2022-11-22T05:57:45.6672536Z ##[group]/datum/unit_test/cable_powernets
+2022-11-22T05:57:45.6673181Z
+2022-11-22T05:57:45.6674204Z [1;32mPASS[0m /datum/unit_test/cable_powernets 0s
+2022-11-22T05:57:45.6674983Z ##[endgroup]
+2022-11-22T05:57:45.6813975Z ##[group]/datum/unit_test/card_mismatch
+2022-11-22T05:57:45.6847490Z
+2022-11-22T05:57:45.6848203Z [1;32mPASS[0m /datum/unit_test/card_mismatch 0s
+2022-11-22T05:57:45.6849278Z ##[endgroup]
+2022-11-22T05:57:45.7667452Z ##[group]/datum/unit_test/chain_pull_through_space
+2022-11-22T05:57:45.7691182Z
+2022-11-22T05:57:45.7692013Z [1;32mPASS[0m /datum/unit_test/chain_pull_through_space 0s
+2022-11-22T05:57:45.7693138Z ##[endgroup]
+2022-11-22T05:57:45.9995429Z ##[group]/datum/unit_test/chat_filter_sanity
+2022-11-22T05:57:46.0000038Z
+2022-11-22T05:57:46.0000532Z [1;32mPASS[0m /datum/unit_test/chat_filter_sanity 0s
+2022-11-22T05:57:46.0001077Z ##[endgroup]
+2022-11-22T05:57:46.0139755Z ##[group]/datum/unit_test/circuit_component_category
+2022-11-22T05:57:46.0139979Z
+2022-11-22T05:57:46.0140376Z [1;32mPASS[0m /datum/unit_test/circuit_component_category 0s
+2022-11-22T05:57:46.0140890Z ##[endgroup]
+2022-11-22T05:57:46.0280886Z ##[group]/datum/unit_test/closets
+2022-11-22T05:57:47.4931763Z
+2022-11-22T05:57:47.4932352Z [1;32mPASS[0m /datum/unit_test/closets 1.4s
+2022-11-22T05:57:47.4932981Z ##[endgroup]
+2022-11-22T05:57:50.1800201Z ##[group]/datum/unit_test/harm_punch
+2022-11-22T05:57:50.2237522Z
+2022-11-22T05:57:50.2238465Z [1;32mPASS[0m /datum/unit_test/harm_punch 0.1s
+2022-11-22T05:57:50.2239270Z ##[endgroup]
+2022-11-22T05:57:50.2470659Z ##[group]/datum/unit_test/harm_melee
+2022-11-22T05:57:50.2990417Z
+2022-11-22T05:57:50.2991838Z [1;32mPASS[0m /datum/unit_test/harm_melee 0s
+2022-11-22T05:57:50.2994899Z ##[endgroup]
+2022-11-22T05:57:50.3439298Z ##[group]/datum/unit_test/harm_different_damage
+2022-11-22T05:57:50.3918437Z
+2022-11-22T05:57:50.3919330Z [1;32mPASS[0m /datum/unit_test/harm_different_damage 0s
+2022-11-22T05:57:50.4008259Z ##[endgroup]
+2022-11-22T05:57:50.4167399Z ##[group]/datum/unit_test/attack_chain
+2022-11-22T05:57:50.4632392Z
+2022-11-22T05:57:50.4633058Z [1;32mPASS[0m /datum/unit_test/attack_chain 0s
+2022-11-22T05:57:50.4633745Z ##[endgroup]
+2022-11-22T05:57:50.4904110Z ##[group]/datum/unit_test/disarm
+2022-11-22T05:57:50.5347143Z
+2022-11-22T05:57:50.5347804Z [1;32mPASS[0m /datum/unit_test/disarm 0.1s
+2022-11-22T05:57:50.5348427Z ##[endgroup]
+2022-11-22T05:57:50.5595669Z ##[group]/datum/unit_test/component_duping
+2022-11-22T05:57:50.5595898Z
+2022-11-22T05:57:50.5596342Z [1;32mPASS[0m /datum/unit_test/component_duping 0s
+2022-11-22T05:57:50.5596852Z ##[endgroup]
+2022-11-22T05:57:50.5739602Z ##[group]/datum/unit_test/confusion_symptom
+2022-11-22T05:57:50.5945849Z
+2022-11-22T05:57:50.5946402Z [1;32mPASS[0m /datum/unit_test/confusion_symptom 0s
+2022-11-22T05:57:50.5947016Z ##[endgroup]
+2022-11-22T05:57:50.6143700Z ##[group]/datum/unit_test/connect_loc_basic
+2022-11-22T05:57:50.6143916Z
+2022-11-22T05:57:50.6144283Z [1;32mPASS[0m /datum/unit_test/connect_loc_basic 0s
+2022-11-22T05:57:50.6144785Z ##[endgroup]
+2022-11-22T05:57:50.6284913Z ##[group]/datum/unit_test/connect_loc_change_turf
+2022-11-22T05:57:50.6292634Z
+2022-11-22T05:57:50.6293007Z [1;32mPASS[0m /datum/unit_test/connect_loc_change_turf 0s
+2022-11-22T05:57:50.6293533Z ##[endgroup]
+2022-11-22T05:57:50.6434958Z ##[group]/datum/unit_test/connect_loc_multiple_on_turf
+2022-11-22T05:57:50.6440347Z
+2022-11-22T05:57:50.6440682Z [1;32mPASS[0m /datum/unit_test/connect_loc_multiple_on_turf 0s
+2022-11-22T05:57:50.6441134Z ##[endgroup]
+2022-11-22T05:57:50.6579913Z ##[group]/datum/unit_test/reagent_container_sanity
+2022-11-22T05:57:50.7818215Z
+2022-11-22T05:57:50.7818993Z [1;32mPASS[0m /datum/unit_test/reagent_container_sanity 0.1s
+2022-11-22T05:57:50.7819687Z ##[endgroup]
+2022-11-22T05:57:51.0092450Z ##[group]/datum/unit_test/crayon_naming
+2022-11-22T05:57:51.0150514Z
+2022-11-22T05:57:51.0151055Z [1;32mPASS[0m /datum/unit_test/crayon_naming 0s
+2022-11-22T05:57:51.0151629Z ##[endgroup]
+2022-11-22T05:57:51.0291644Z ##[group]/datum/unit_test/dcs_get_id_from_arguments
+2022-11-22T05:57:51.0295148Z
+2022-11-22T05:57:51.0295468Z [1;32mPASS[0m /datum/unit_test/dcs_get_id_from_arguments 0s
+2022-11-22T05:57:51.0295906Z ##[endgroup]
+2022-11-22T05:57:51.0436006Z ##[group]/datum/unit_test/designs
+2022-11-22T05:57:51.0482298Z
+2022-11-22T05:57:51.0482663Z [1;32mPASS[0m /datum/unit_test/designs 0s
+2022-11-22T05:57:51.0483175Z ##[endgroup]
+2022-11-22T05:57:51.0620982Z ##[group]/datum/unit_test/dummy_spawn_species
+2022-11-22T05:57:51.4128167Z
+2022-11-22T05:57:51.4128925Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_species 0.4s
+2022-11-22T05:57:51.4129626Z ##[endgroup]
+2022-11-22T05:57:51.7309194Z ##[group]/datum/unit_test/dummy_spawn_outfit
+2022-11-22T05:57:51.7520497Z Job type /datum/job/ai could not be retrieved from SSjob
+2022-11-22T05:57:52.0337175Z
+2022-11-22T05:57:52.0338303Z [1;32mPASS[0m /datum/unit_test/dummy_spawn_outfit 0.3s
+2022-11-22T05:57:52.0339259Z ##[endgroup]
+2022-11-22T05:57:52.3010961Z ##[group]/datum/unit_test/dynamic_roundstart_ruleset_sanity
+2022-11-22T05:57:52.3011803Z
+2022-11-22T05:57:52.3012594Z [1;32mPASS[0m /datum/unit_test/dynamic_roundstart_ruleset_sanity 0s
+2022-11-22T05:57:52.3013299Z ##[endgroup]
+2022-11-22T05:57:52.3164698Z ##[group]/datum/unit_test/dynamic_unique_antag_flags
+2022-11-22T05:57:52.3165134Z
+2022-11-22T05:57:52.3165719Z [1;32mPASS[0m /datum/unit_test/dynamic_unique_antag_flags 0s
+2022-11-22T05:57:52.3166684Z ##[endgroup]
+2022-11-22T05:57:52.3307956Z ##[group]/datum/unit_test/egg_glands
+2022-11-22T05:57:52.3727674Z
+2022-11-22T05:57:52.3728398Z [1;32mPASS[0m /datum/unit_test/egg_glands 0s
+2022-11-22T05:57:52.3729449Z ##[endgroup]
+2022-11-22T05:57:52.3876533Z ##[group]/datum/unit_test/emoting
+2022-11-22T05:57:52.4097216Z
+2022-11-22T05:57:52.4097697Z [1;32mPASS[0m /datum/unit_test/emoting 0.1s
+2022-11-22T05:57:52.4098176Z ##[endgroup]
+2022-11-22T05:57:52.7391670Z ##[group]/datum/unit_test/food_edibility_check
+2022-11-22T05:57:53.8611412Z
+2022-11-22T05:57:53.8612472Z [1;32mPASS[0m /datum/unit_test/food_edibility_check 1.1s
+2022-11-22T05:57:53.8613293Z ##[endgroup]
+2022-11-22T05:57:54.9307669Z ##[group]/datum/unit_test/atmospheric_gas_transfer
+2022-11-22T05:57:54.9314807Z
+2022-11-22T05:57:54.9315632Z [1;32mPASS[0m /datum/unit_test/atmospheric_gas_transfer 0s
+2022-11-22T05:57:54.9316476Z ##[endgroup]
+2022-11-22T05:57:54.9470739Z ##[group]/datum/unit_test/get_turf_pixel
+2022-11-22T05:57:54.9485851Z
+2022-11-22T05:57:54.9486504Z [1;32mPASS[0m /datum/unit_test/get_turf_pixel 0s
+2022-11-22T05:57:54.9487302Z ##[endgroup]
+2022-11-22T05:57:54.9638937Z ##[group]/datum/unit_test/greyscale_item_icon_states
+2022-11-22T05:57:54.9698181Z
+2022-11-22T05:57:54.9698921Z [1;32mPASS[0m /datum/unit_test/greyscale_item_icon_states 0s
+2022-11-22T05:57:54.9699816Z ##[endgroup]
+2022-11-22T05:57:54.9841288Z ##[group]/datum/unit_test/greyscale_color_count
+2022-11-22T05:57:54.9971884Z
+2022-11-22T05:57:54.9972668Z [1;32mPASS[0m /datum/unit_test/greyscale_color_count 0s
+2022-11-22T05:57:54.9973372Z ##[endgroup]
+2022-11-22T05:57:55.0566622Z ##[group]/datum/unit_test/hallucination_icons
+2022-11-22T05:57:55.2636405Z
+2022-11-22T05:57:55.2637180Z [1;32mPASS[0m /datum/unit_test/hallucination_icons 0.2s
+2022-11-22T05:57:55.2637869Z ##[endgroup]
+2022-11-22T05:57:55.4281623Z ##[group]/datum/unit_test/heretic_knowledge
+2022-11-22T05:57:55.4312752Z
+2022-11-22T05:57:55.4313343Z [1;32mPASS[0m /datum/unit_test/heretic_knowledge 0s
+2022-11-22T05:57:55.4313933Z ##[endgroup]
+2022-11-22T05:57:55.4464795Z ##[group]/datum/unit_test/heretic_main_paths
+2022-11-22T05:57:55.4465364Z
+2022-11-22T05:57:55.4465818Z [1;32mPASS[0m /datum/unit_test/heretic_main_paths 0s
+2022-11-22T05:57:55.4466260Z ##[endgroup]
+2022-11-22T05:57:55.4606916Z ##[group]/datum/unit_test/heretic_rituals
+2022-11-22T05:57:55.5247753Z
+2022-11-22T05:57:55.5248512Z [1;32mPASS[0m /datum/unit_test/heretic_rituals 0.1s
+2022-11-22T05:57:55.5249184Z ##[endgroup]
+2022-11-22T05:57:55.5940368Z ##[group]/datum/unit_test/hanukkah_2123
+2022-11-22T05:57:55.5940592Z
+2022-11-22T05:57:55.5941492Z [1;32mPASS[0m /datum/unit_test/hanukkah_2123 0s
+2022-11-22T05:57:55.5942009Z ##[endgroup]
+2022-11-22T05:57:55.6091512Z ##[group]/datum/unit_test/ramadan_2165
+2022-11-22T05:57:55.6091717Z
+2022-11-22T05:57:55.6092048Z [1;32mPASS[0m /datum/unit_test/ramadan_2165 0s
+2022-11-22T05:57:55.6092523Z ##[endgroup]
+2022-11-22T05:57:55.6442352Z ##[group]/datum/unit_test/thanksgiving_2020
+2022-11-22T05:57:55.6442890Z
+2022-11-22T05:57:55.6443757Z [1;32mPASS[0m /datum/unit_test/thanksgiving_2020 0s
+2022-11-22T05:57:55.6444979Z ##[endgroup]
+2022-11-22T05:57:55.6598675Z ##[group]/datum/unit_test/mother_3683
+2022-11-22T05:57:55.6598889Z
+2022-11-22T05:57:55.6599297Z [1;32mPASS[0m /datum/unit_test/mother_3683 0s
+2022-11-22T05:57:55.6599751Z ##[endgroup]
+2022-11-22T05:57:55.6738486Z ##[group]/datum/unit_test/hello_2020
+2022-11-22T05:57:55.6738688Z
+2022-11-22T05:57:55.6739014Z [1;32mPASS[0m /datum/unit_test/hello_2020 0s
+2022-11-22T05:57:55.6739488Z ##[endgroup]
+2022-11-22T05:57:55.6878688Z ##[group]/datum/unit_test/new_year_1983
+2022-11-22T05:57:55.6878886Z
+2022-11-22T05:57:55.6879201Z [1;32mPASS[0m /datum/unit_test/new_year_1983 0s
+2022-11-22T05:57:55.6879685Z ##[endgroup]
+2022-11-22T05:57:55.7020176Z ##[group]/datum/unit_test/moth_week_2020
+2022-11-22T05:57:55.7046044Z
+2022-11-22T05:57:55.7046466Z [1;32mPASS[0m /datum/unit_test/moth_week_2020 0s
+2022-11-22T05:57:55.7047027Z ##[endgroup]
+2022-11-22T05:57:55.7187159Z ##[group]/datum/unit_test/human_through_recycler
+2022-11-22T05:57:55.7514671Z
+2022-11-22T05:57:55.7515299Z [1;32mPASS[0m /datum/unit_test/human_through_recycler 0s
+2022-11-22T05:57:55.7516283Z ##[endgroup]
+2022-11-22T05:57:55.7919867Z ##[group]/datum/unit_test/hydroponics_extractor_storage
+2022-11-22T05:57:55.8186193Z
+2022-11-22T05:57:55.8186944Z [1;32mPASS[0m /datum/unit_test/hydroponics_extractor_storage 0.1s
+2022-11-22T05:57:55.8187599Z ##[endgroup]
+2022-11-22T05:57:55.8398289Z ##[group]/datum/unit_test/hydroponics_harvest
+2022-11-22T05:57:55.8939596Z
+2022-11-22T05:57:55.8940352Z [1;32mPASS[0m /datum/unit_test/hydroponics_harvest 0s
+2022-11-22T05:57:55.8941013Z ##[endgroup]
+2022-11-22T05:57:56.0137178Z ##[group]/datum/unit_test/hydroponics_self_mutation
+2022-11-22T05:57:56.0571748Z
+2022-11-22T05:57:56.0572297Z [1;32mPASS[0m /datum/unit_test/hydroponics_self_mutation 0s
+2022-11-22T05:57:56.0572944Z ##[endgroup]
+2022-11-22T05:57:56.0712557Z ##[group]/datum/unit_test/hydroponics_validate_genes
+2022-11-22T05:57:56.1145858Z
+2022-11-22T05:57:56.1146632Z [1;32mPASS[0m /datum/unit_test/hydroponics_validate_genes 0.1s
+2022-11-22T05:57:56.1147317Z ##[endgroup]
+2022-11-22T05:57:56.1288831Z ##[group]/datum/unit_test/defined_inhand_icon_states
+2022-11-22T05:57:56.9990761Z Notice - Possible inhand icon matches found. It is best to be explicit with inhand sprite values.
+2022-11-22T05:57:56.9991785Z /obj/item/clothing/accessory/pride does not have an inhand_icon_state value - Possible matching sprites for "pride" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-11-22T05:57:56.9992933Z /obj/item/clothing/suit/caution does not have an inhand_icon_state value - Possible matching sprites for "caution" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-11-22T05:57:56.9994021Z /obj/item/clothing/under/suit/sl does not have an inhand_icon_state value - Possible matching sprites for "sl_suit" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-22T05:57:56.9995081Z /obj/item/clothing/head/collectable/paper does not have an inhand_icon_state value - Possible matching sprites for "paper" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2022-11-22T05:57:56.9996131Z /obj/item/clothing/head/mod does not have an inhand_icon_state value - Possible matching sprites for "helmet" found in: 'icons/mob/inhands/clothing/hats_lefthand.dmi' & 'icons/mob/inhands/clothing/hats_righthand.dmi'
+2022-11-22T05:57:56.9997136Z /obj/item/clothing/mask/animal/small/fox does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2022-11-22T05:57:56.9998121Z /obj/item/clothing/mask/animal/small/fox/cursed does not have an inhand_icon_state value - Possible matching sprites for "fox" found in: 'icons/mob/inhands/pets_held_rh.dmi' & 'icons/mob/inhands/pets_held_lh.dmi'
+2022-11-22T05:57:56.9999214Z /obj/item/clothing/glasses/hud/health/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudmed" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-11-22T05:57:57.0000419Z /obj/item/clothing/glasses/hud/security/sunglasses does not have an inhand_icon_state value - Possible matching sprites for "sunhudsec" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-11-22T05:57:57.0001582Z /obj/item/mecha_parts/mecha_equipment/medical/syringe_gun does not have an inhand_icon_state value - Possible matching sprites for "syringegun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-11-22T05:57:57.0002710Z /obj/item/mecha_parts/mecha_equipment/generator does not have an inhand_icon_state value - Possible matching sprites for "tesla" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-11-22T05:57:57.0004089Z /obj/item/storage/bag/ore does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-11-22T05:57:57.0005300Z /obj/item/storage/bag/ore/cyborg does not have an inhand_icon_state value - Possible matching sprites for "satchel" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-11-22T05:57:57.0006371Z /obj/item/implant/emp does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-22T05:57:57.0007395Z /obj/item/implant/uplink does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0008445Z /obj/item/implant/uplink/precharged does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0009494Z /obj/item/implant/uplink/starting does not have an inhand_icon_state value - Possible matching sprites for "radio" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0010726Z /obj/item/melee/energy/blade does not have an inhand_icon_state value - Possible matching sprites for "blade" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-22T05:57:57.0011749Z /obj/item/fireaxe does not have an inhand_icon_state value - Possible matching sprites for "fireaxe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-11-22T05:57:57.0012773Z /obj/item/fireaxe/boneaxe does not have an inhand_icon_state value - Possible matching sprites for "bone_axe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-11-22T05:57:57.0013837Z /obj/item/fireaxe/metal_h2_axe does not have an inhand_icon_state value - Possible matching sprites for "metalh2_axe0" found in: 'icons/mob/inhands/weapons/axes_righthand.dmi' & 'icons/mob/inhands/weapons/axes_lefthand.dmi'
+2022-11-22T05:57:57.0014905Z /obj/item/reagent_containers/cup/soda_cans/cola does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0016006Z /obj/item/reagent_containers/cup/soda_cans/tonic does not have an inhand_icon_state value - Possible matching sprites for "tonic" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0017128Z /obj/item/reagent_containers/cup/soda_cans/sodawater does not have an inhand_icon_state value - Possible matching sprites for "sodawater" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0018271Z /obj/item/reagent_containers/cup/soda_cans/lemon_lime does not have an inhand_icon_state value - Possible matching sprites for "lemon-lime" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0019407Z /obj/item/reagent_containers/cup/soda_cans/space_up does not have an inhand_icon_state value - Possible matching sprites for "space-up" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0020513Z /obj/item/reagent_containers/cup/soda_cans/starkist does not have an inhand_icon_state value - Possible matching sprites for "starkist" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0021776Z /obj/item/reagent_containers/cup/soda_cans/space_mountain_wind does not have an inhand_icon_state value - Possible matching sprites for "space_mountain_wind" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0023030Z /obj/item/reagent_containers/cup/soda_cans/thirteenloko does not have an inhand_icon_state value - Possible matching sprites for "thirteen_loko" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0024156Z /obj/item/reagent_containers/cup/soda_cans/dr_gibb does not have an inhand_icon_state value - Possible matching sprites for "dr_gibb" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0025284Z /obj/item/reagent_containers/cup/soda_cans/pwr_game does not have an inhand_icon_state value - Possible matching sprites for "purple_can" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0026401Z /obj/item/reagent_containers/cup/glass/coffee does not have an inhand_icon_state value - Possible matching sprites for "coffee" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0027532Z /obj/item/reagent_containers/chem_pack does not have an inhand_icon_state value - Possible matching sprites for "chempack" found in: 'icons/mob/inhands/equipment/backpack_lefthand.dmi' & 'icons/mob/inhands/equipment/backpack_righthand.dmi'
+2022-11-22T05:57:57.0028593Z /obj/item/sbeacondrop does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0029625Z /obj/item/sbeacondrop/bomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0030654Z /obj/item/sbeacondrop/emp does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0031702Z /obj/item/sbeacondrop/powersink does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0032748Z /obj/item/sbeacondrop/clownbomb does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0033834Z /obj/item/stack/medical/bruise_pack does not have an inhand_icon_state value - Possible matching sprites for "brutepack" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0034933Z /obj/item/stack/medical/ointment does not have an inhand_icon_state value - Possible matching sprites for "ointment" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0035979Z /obj/item/minespawner does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0037019Z /obj/item/organ/internal/heart/gland/blood does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-22T05:57:57.0038119Z /obj/item/organ/internal/heart/gland/egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-22T05:57:57.0039221Z /obj/item/organ/internal/heart/gland/quantum does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-22T05:57:57.0040406Z /obj/item/organ/internal/heart/gland/trauma does not have an inhand_icon_state value - Possible matching sprites for "emp" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-22T05:57:57.0041502Z /obj/item/boxcutter does not have an inhand_icon_state value - Possible matching sprites for "boxcutter" found in: 'icons/mob/inhands/equipment/boxcutter_lefthand.dmi' & 'icons/mob/inhands/equipment/boxcutter_righthand.dmi'
+2022-11-22T05:57:57.0042546Z /obj/item/pushbroom does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-11-22T05:57:57.0043620Z /obj/item/pushbroom/cyborg does not have an inhand_icon_state value - Possible matching sprites for "broom0" found in: 'icons/mob/inhands/equipment/custodial_lefthand.dmi' & 'icons/mob/inhands/equipment/custodial_righthand.dmi'
+2022-11-22T05:57:57.0044677Z /obj/item/chainsaw does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+2022-11-22T05:57:57.0045751Z /obj/item/chainsaw/doomslayer does not have an inhand_icon_state value - Possible matching sprites for "chainsaw_off" found in: 'icons/mob/inhands/weapons/chainsaw_lefthand.dmi' & 'icons/mob/inhands/weapons/chainsaw_righthand.dmi'
+2022-11-22T05:57:57.0047360Z /obj/item/toy/talking/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2022-11-22T05:57:57.0048399Z /obj/item/toy/figure/chef does not have an inhand_icon_state value - Possible matching sprites for "chef" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-22T05:57:57.0049430Z /obj/item/toy/figure/clown does not have an inhand_icon_state value - Possible matching sprites for "clown" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-22T05:57:57.0050554Z /obj/item/toy/figure/janitor does not have an inhand_icon_state value - Possible matching sprites for "janitor" found in: 'icons/mob/inhands/clothing/suits_righthand.dmi' & 'icons/mob/inhands/clothing/suits_lefthand.dmi'
+2022-11-22T05:57:57.0051561Z /obj/item/food/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-22T05:57:57.0052539Z /obj/item/food/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-22T05:57:57.0053552Z /obj/item/kitchen/fork does not have an inhand_icon_state value - Possible matching sprites for "fork" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-11-22T05:57:57.0054597Z /obj/item/kitchen/spoon does not have an inhand_icon_state value - Possible matching sprites for "spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-11-22T05:57:57.0055672Z /obj/item/kitchen/spoon/plastic does not have an inhand_icon_state value - Possible matching sprites for "plastic_spoon" found in: 'icons/mob/inhands/equipment/kitchen_lefthand.dmi' & 'icons/mob/inhands/equipment/kitchen_righthand.dmi'
+2022-11-22T05:57:57.0056849Z /obj/item/book/codex_gigas does not have an inhand_icon_state value - Possible matching sprites for "demonomicon" found in: 'icons/mob/inhands/items/books_righthand.dmi' & 'icons/mob/inhands/items/books_lefthand.dmi'
+2022-11-22T05:57:57.0057975Z /obj/item/pitchfork does not have an inhand_icon_state value - Possible matching sprites for "pitchfork0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-22T05:57:57.0059026Z /obj/item/construction/rcd does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0060072Z /obj/item/construction/rcd/borg does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0061125Z /obj/item/construction/rcd/loaded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0062218Z /obj/item/construction/rcd/loaded/upgraded does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0063307Z /obj/item/construction/rcd/internal does not have an inhand_icon_state value - Possible matching sprites for "rcd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0064355Z /obj/item/construction/rld does not have an inhand_icon_state value - Possible matching sprites for "rld-5" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0065418Z /obj/item/construction/rld/mini does not have an inhand_icon_state value - Possible matching sprites for "rld-5" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0066456Z /obj/item/rcd_ammo does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0067491Z /obj/item/rcd_ammo/large does not have an inhand_icon_state value - Possible matching sprites for "rcdammo" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0068534Z /obj/item/godstaff does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-11-22T05:57:57.0069585Z /obj/item/godstaff/red does not have an inhand_icon_state value - Possible matching sprites for "godstaff-red" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-11-22T05:57:57.0070654Z /obj/item/godstaff/blue does not have an inhand_icon_state value - Possible matching sprites for "godstaff-blue" found in: 'icons/mob/inhands/weapons/staves_lefthand.dmi' & 'icons/mob/inhands/weapons/staves_righthand.dmi'
+2022-11-22T05:57:57.0071702Z /obj/item/pipe_dispenser does not have an inhand_icon_state value - Possible matching sprites for "rpd" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0073144Z /obj/item/singularityhammer does not have an inhand_icon_state value - Possible matching sprites for "singularity_hammer0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-11-22T05:57:57.0074330Z /obj/item/mjollnir does not have an inhand_icon_state value - Possible matching sprites for "mjollnir0" found in: 'icons/mob/inhands/weapons/hammers_lefthand.dmi' & 'icons/mob/inhands/weapons/hammers_righthand.dmi'
+2022-11-22T05:57:57.0075441Z /obj/item/spear does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-22T05:57:57.0076509Z /obj/item/spear/explosive does not have an inhand_icon_state value - Possible matching sprites for "spearbomb0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-22T05:57:57.0077599Z /obj/item/spear/grey_tide does not have an inhand_icon_state value - Possible matching sprites for "spearglass0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-22T05:57:57.0078680Z /obj/item/spear/bonespear does not have an inhand_icon_state value - Possible matching sprites for "bone_spear0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-22T05:57:57.0079765Z /obj/item/spear/bamboospear does not have an inhand_icon_state value - Possible matching sprites for "bamboo_spear0" found in: 'icons/mob/inhands/weapons/polearms_righthand.dmi' & 'icons/mob/inhands/weapons/polearms_lefthand.dmi'
+2022-11-22T05:57:57.0080775Z /obj/item/trash/candy does not have an inhand_icon_state value - Possible matching sprites for "candy" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-22T05:57:57.0082023Z /obj/item/trash/chips does not have an inhand_icon_state value - Possible matching sprites for "chips" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-22T05:57:57.0083017Z /obj/item/trash/can does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0084019Z /obj/item/trash/can/food does not have an inhand_icon_state value - Possible matching sprites for "cola" found in: 'icons/mob/inhands/items/drinks_righthand.dmi' & 'icons/mob/inhands/items/drinks_lefthand.dmi'
+2022-11-22T05:57:57.0085071Z /obj/item/highfrequencyblade does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-22T05:57:57.0086187Z /obj/item/highfrequencyblade/wizard does not have an inhand_icon_state value - Possible matching sprites for "hfrequency0" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-22T05:57:57.0087262Z /obj/item/borg/sight/meson does not have an inhand_icon_state value - Possible matching sprites for "meson" found in: 'icons/mob/inhands/clothing/glasses_righthand.dmi' & 'icons/mob/inhands/clothing/glasses_lefthand.dmi'
+2022-11-22T05:57:57.0088347Z /obj/item/ammo_casing/magic/hook does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-11-22T05:57:57.0089259Z /obj/item/ammo_casing/magic/hook/bounty does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-11-22T05:57:57.0090243Z /obj/item/harmalarm does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_lefthand.dmi' & 'icons/mob/inhands/items/megaphone_righthand.dmi'
+2022-11-22T05:57:57.0091252Z /obj/item/crowbar/mechremoval does not have an inhand_icon_state value - Possible matching sprites for "mechremoval0" found in: 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0092194Z /obj/item/abductor_machine_beacon does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0093224Z /obj/item/abductor_machine_beacon/chem_dispenser does not have an inhand_icon_state value - Possible matching sprites for "beacon" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0094166Z /obj/item/grown/carbon_rose does not have an inhand_icon_state value - Possible matching sprites for "carbonrose" found in: 'icons/mob/inhands/weapons/plants_righthand.dmi' & 'icons/mob/inhands/weapons/plants_lefthand.dmi'
+2022-11-22T05:57:57.0095086Z /obj/item/paint_palette does not have an inhand_icon_state value - Possible matching sprites for "palette" found in: 'icons/mob/inhands/equipment/palette_righthand.dmi' & 'icons/mob/inhands/equipment/palette_lefthand.dmi'
+2022-11-22T05:57:57.0095973Z /obj/item/surprise_egg does not have an inhand_icon_state value - Possible matching sprites for "egg" found in: 'icons/mob/inhands/items/food_lefthand.dmi' & 'icons/mob/inhands/items/food_righthand.dmi'
+2022-11-22T05:57:57.0096871Z /obj/item/experi_scanner does not have an inhand_icon_state value - Possible matching sprites for "experiscanner" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0097746Z /obj/item/fishing_hook does not have an inhand_icon_state value - Possible matching sprites for "hook" found in: 'icons/mob/inhands/weapons/melee_righthand.dmi' & 'icons/mob/inhands/weapons/melee_lefthand.dmi'
+2022-11-22T05:57:57.0098649Z /obj/item/cursed_katana does not have an inhand_icon_state value - Possible matching sprites for "cursed_katana" found in: 'icons/mob/inhands/weapons/swords_lefthand.dmi' & 'icons/mob/inhands/weapons/swords_righthand.dmi'
+2022-11-22T05:57:57.0099593Z /obj/item/guardiancreator/tech does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0100605Z /obj/item/guardiancreator/tech/choose does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0101605Z /obj/item/guardiancreator/tech/choose/traitor does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0102626Z /obj/item/guardiancreator/tech/choose/dextrous does not have an inhand_icon_state value - Possible matching sprites for "combat_hypo" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0103578Z /obj/item/mod/module/welding does not have an inhand_icon_state value - Possible matching sprites for "welding" found in: 'icons/mob/inhands/clothing/masks_lefthand.dmi' & 'icons/mob/inhands/clothing/masks_righthand.dmi'
+2022-11-22T05:57:57.0104491Z /obj/item/mod/module/mister does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2022-11-22T05:57:57.0105414Z /obj/item/mod/module/mister/atmos does not have an inhand_icon_state value - Possible matching sprites for "mister" found in: 'icons/mob/inhands/equipment/mister_righthand.dmi' & 'icons/mob/inhands/equipment/mister_lefthand.dmi'
+2022-11-22T05:57:57.0106415Z /obj/item/mod/module/jetpack does not have an inhand_icon_state value - Possible matching sprites for "jetpack" found in: 'icons/mob/inhands/equipment/jetpacks_lefthand.dmi' & 'icons/mob/inhands/equipment/jetpacks_righthand.dmi'
+2022-11-22T05:57:57.0107402Z /obj/item/mod/module/flashlight does not have an inhand_icon_state value - Possible matching sprites for "flashlight" found in: 'icons/mob/inhands/items/devices_lefthand.dmi' & 'icons/mob/inhands/items/devices_righthand.dmi'
+2022-11-22T05:57:57.0108273Z /obj/item/mod/module/stamp does not have an inhand_icon_state value - Possible matching sprites for "stamp" found in: 'icons/mob/inhands/items_lefthand.dmi' & 'icons/mob/inhands/items_righthand.dmi'
+2022-11-22T05:57:57.0109157Z /obj/item/mod/module/holster does not have an inhand_icon_state value - Possible matching sprites for "holster" found in: 'icons/mob/inhands/equipment/belt_lefthand.dmi' & 'icons/mob/inhands/equipment/belt_righthand.dmi'
+2022-11-22T05:57:57.0110093Z /obj/item/mod/module/megaphone does not have an inhand_icon_state value - Possible matching sprites for "megaphone" found in: 'icons/mob/inhands/items/megaphone_lefthand.dmi' & 'icons/mob/inhands/items/megaphone_righthand.dmi'
+2022-11-22T05:57:57.0111228Z /obj/item/mod/module/drill does not have an inhand_icon_state value - Possible matching sprites for "drill" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi' & 'icons/mob/inhands/equipment/tools_righthand.dmi' & 'icons/mob/inhands/equipment/tools_lefthand.dmi'
+2022-11-22T05:57:57.0112255Z /obj/item/mod/module/tem does not have an inhand_icon_state value - Possible matching sprites for "chronogun" found in: 'icons/mob/inhands/weapons/guns_righthand.dmi' & 'icons/mob/inhands/weapons/guns_lefthand.dmi'
+2022-11-22T05:57:57.0113170Z /obj/item/bonesetter does not have an inhand_icon_state value - Possible matching sprites for "bonesetter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0114103Z /obj/item/blood_filter does not have an inhand_icon_state value - Possible matching sprites for "bloodfilter" found in: 'icons/mob/inhands/equipment/medical_lefthand.dmi' & 'icons/mob/inhands/equipment/medical_righthand.dmi'
+2022-11-22T05:57:57.0115057Z /obj/item/mecha_ammo/flashbang does not have an inhand_icon_state value - Possible matching sprites for "flashbang" found in: 'icons/mob/inhands/equipment/security_righthand.dmi' & 'icons/mob/inhands/equipment/security_lefthand.dmi'
+2022-11-22T05:57:57.0115440Z
+2022-11-22T05:57:57.0115677Z [1;32mPASS[0m /datum/unit_test/defined_inhand_icon_states 0.8s
+2022-11-22T05:57:57.0116249Z ##[endgroup]
+2022-11-22T05:57:57.8132217Z ##[group]/datum/unit_test/json_savefiles
+2022-11-22T05:57:57.8161427Z
+2022-11-22T05:57:57.8163650Z [1;32mPASS[0m /datum/unit_test/json_savefiles 0s
+2022-11-22T05:57:57.8165166Z ##[endgroup]
+2022-11-22T05:57:57.8317025Z ##[group]/datum/unit_test/keybinding_init
+2022-11-22T05:57:57.8317555Z
+2022-11-22T05:57:57.8318129Z [1;32mPASS[0m /datum/unit_test/keybinding_init 0s
+2022-11-22T05:57:57.8318715Z ##[endgroup]
+2022-11-22T05:57:57.8457921Z ##[group]/datum/unit_test/key_prefixes
+2022-11-22T05:57:57.8458449Z
+2022-11-22T05:57:57.8459042Z [1;32mPASS[0m /datum/unit_test/key_prefixes 0s
+2022-11-22T05:57:57.8462361Z ##[endgroup]
+2022-11-22T05:57:57.8599650Z ##[group]/datum/unit_test/knockoff_component
+2022-11-22T05:57:57.9089397Z
+2022-11-22T05:57:57.9090717Z [1;32mPASS[0m /datum/unit_test/knockoff_component 0.1s
+2022-11-22T05:57:57.9091840Z ##[endgroup]
+2022-11-22T05:57:57.9827579Z ##[group]/datum/unit_test/limbsanity
+2022-11-22T05:57:58.0484756Z
+2022-11-22T05:57:58.0485892Z [1;32mPASS[0m /datum/unit_test/limbsanity 0.1s
+2022-11-22T05:57:58.0486834Z ##[endgroup]
+2022-11-22T05:57:58.0629221Z ##[group]/datum/unit_test/load_map_security
+2022-11-22T05:57:58.0631540Z map directory not in whitelist: data/load_map_security_temp for map runtimestation
+2022-11-22T05:57:58.0632494Z
+2022-11-22T05:57:58.0634849Z [1;32mPASS[0m /datum/unit_test/load_map_security 0s
+2022-11-22T05:57:58.0635457Z ##[endgroup]
+2022-11-22T05:57:58.0781973Z ##[group]/datum/unit_test/machine_disassembly
+2022-11-22T05:57:58.0810119Z
+2022-11-22T05:57:58.0811067Z [1;32mPASS[0m /datum/unit_test/machine_disassembly 0s
+2022-11-22T05:57:58.0813933Z ##[endgroup]
+2022-11-22T05:57:58.1127230Z ##[group]/datum/unit_test/mecha_damage
+2022-11-22T05:57:58.1567386Z
+2022-11-22T05:57:58.1568502Z [1;32mPASS[0m /datum/unit_test/mecha_damage 0s
+2022-11-22T05:57:58.1569451Z ##[endgroup]
+2022-11-22T05:57:58.1825660Z ##[group]/datum/unit_test/test_human_base
+2022-11-22T05:57:58.2244474Z
+2022-11-22T05:57:58.2245632Z [1;32mPASS[0m /datum/unit_test/test_human_base 0.1s
+2022-11-22T05:57:58.2246699Z ##[endgroup]
+2022-11-22T05:57:58.2704857Z ##[group]/datum/unit_test/test_human_bone
+2022-11-22T05:57:58.3113306Z
+2022-11-22T05:57:58.3114010Z [1;32mPASS[0m /datum/unit_test/test_human_bone 0.1s
+2022-11-22T05:57:58.3114667Z ##[endgroup]
+2022-11-22T05:57:58.3301107Z ##[group]/datum/unit_test/merge_type
+2022-11-22T05:57:58.3302955Z
+2022-11-22T05:57:58.3303622Z [1;32mPASS[0m /datum/unit_test/merge_type 0s
+2022-11-22T05:57:58.3304293Z ##[endgroup]
+2022-11-22T05:57:58.3450988Z ##[group]/datum/unit_test/metabolization
+2022-11-22T05:57:58.5454349Z
+2022-11-22T05:57:58.5455483Z [1;32mPASS[0m /datum/unit_test/metabolization 0.2s
+2022-11-22T05:57:58.5456119Z ##[endgroup]
+2022-11-22T05:57:58.7181588Z ##[group]/datum/unit_test/on_mob_end_metabolize
+2022-11-22T05:57:58.7436989Z
+2022-11-22T05:57:58.7438144Z [1;32mPASS[0m /datum/unit_test/on_mob_end_metabolize 0s
+2022-11-22T05:57:58.7438781Z ##[endgroup]
+2022-11-22T05:57:58.7634355Z ##[group]/datum/unit_test/addictions
+2022-11-22T05:57:58.8327697Z
+2022-11-22T05:57:58.8328724Z [1;32mPASS[0m /datum/unit_test/addictions 0.1s
+2022-11-22T05:57:58.8329396Z ##[endgroup]
+2022-11-22T05:57:58.9646352Z ##[group]/datum/unit_test/actions_moved_on_mind_transfer
+2022-11-22T05:57:58.9894685Z
+2022-11-22T05:57:58.9895899Z [1;32mPASS[0m /datum/unit_test/actions_moved_on_mind_transfer 0s
+2022-11-22T05:57:58.9899018Z ##[endgroup]
+2022-11-22T05:57:59.0145385Z ##[group]/datum/unit_test/mob_faction
+2022-11-22T05:58:02.3668071Z
+2022-11-22T05:58:02.3669027Z [1;32mPASS[0m /datum/unit_test/mob_faction 3.3s
+2022-11-22T05:58:02.3669939Z ##[endgroup]
+2022-11-22T05:58:07.7854295Z ##[group]/datum/unit_test/mob_spawn
+2022-11-22T05:58:07.7991138Z
+2022-11-22T05:58:07.7991742Z [1;32mPASS[0m /datum/unit_test/mob_spawn 0s
+2022-11-22T05:58:07.7992334Z ##[endgroup]
+2022-11-22T05:58:07.9421769Z ##[group]/datum/unit_test/modsuit_checks
+2022-11-22T05:58:08.1300462Z
+2022-11-22T05:58:08.1301703Z [1;32mPASS[0m /datum/unit_test/modsuit_checks 0.2s
+2022-11-22T05:58:08.1302808Z ##[endgroup]
+2022-11-22T05:58:08.2981112Z ##[group]/datum/unit_test/modular_map_loader
+2022-11-22T05:58:08.2993538Z
+2022-11-22T05:58:08.2994017Z [1;32mPASS[0m /datum/unit_test/modular_map_loader 0s
+2022-11-22T05:58:08.2994490Z ##[endgroup]
+2022-11-22T05:58:08.3152720Z ##[group]/datum/unit_test/mouse_bite_cable
+2022-11-22T05:58:08.3194795Z
+2022-11-22T05:58:08.3195300Z [1;32mPASS[0m /datum/unit_test/mouse_bite_cable 0s
+2022-11-22T05:58:08.3195915Z ##[endgroup]
+2022-11-22T05:58:08.3481029Z ##[group]/datum/unit_test/novaflower_burn
+2022-11-22T05:58:08.3949558Z
+2022-11-22T05:58:08.3950307Z [1;32mPASS[0m /datum/unit_test/novaflower_burn 0s
+2022-11-22T05:58:08.3950994Z ##[endgroup]
+2022-11-22T05:58:08.4260753Z ##[group]/datum/unit_test/ntnetwork
+2022-11-22T05:58:08.4260950Z
+2022-11-22T05:58:08.4261366Z [1;32mPASS[0m /datum/unit_test/ntnetwork 0s
+2022-11-22T05:58:08.4261791Z ##[endgroup]
+2022-11-22T05:58:08.4438911Z ##[group]/datum/unit_test/nuke_cinematic
+2022-11-22T05:58:12.2927681Z
+2022-11-22T05:58:12.2928809Z [1;32mPASS[0m /datum/unit_test/nuke_cinematic 3.8s
+2022-11-22T05:58:12.2929427Z ##[endgroup]
+2022-11-22T05:58:12.5093172Z ##[group]/datum/unit_test/objectives_category
+2022-11-22T05:58:12.5093989Z
+2022-11-22T05:58:12.5095122Z [1;32mPASS[0m /datum/unit_test/objectives_category 0s
+2022-11-22T05:58:12.5096774Z ##[endgroup]
+2022-11-22T05:58:12.5256872Z ##[group]/datum/unit_test/orderable_item_descriptions
+2022-11-22T05:58:12.5771407Z
+2022-11-22T05:58:12.5772577Z [1;32mPASS[0m /datum/unit_test/orderable_item_descriptions 0s
+2022-11-22T05:58:12.5773724Z ##[endgroup]
+2022-11-22T05:58:12.5931358Z ##[group]/datum/unit_test/operating_table
+2022-11-22T05:58:12.6369527Z
+2022-11-22T05:58:12.6370760Z [1;32mPASS[0m /datum/unit_test/operating_table 0.1s
+2022-11-22T05:58:12.6371649Z ##[endgroup]
+2022-11-22T05:58:12.6652645Z ##[group]/datum/unit_test/outfit_sanity
+2022-11-22T05:58:20.4025368Z
+2022-11-22T05:58:20.4026450Z [1;32mPASS[0m /datum/unit_test/outfit_sanity 7.8s
+2022-11-22T05:58:20.4027358Z ##[endgroup]
+2022-11-22T05:58:28.1332042Z ##[group]/datum/unit_test/paintings
+2022-11-22T05:58:28.1602466Z
+2022-11-22T05:58:28.1603414Z [1;32mPASS[0m /datum/unit_test/paintings 0s
+2022-11-22T05:58:28.1604319Z ##[endgroup]
+2022-11-22T05:58:28.1760460Z ##[group]/datum/unit_test/pills
+2022-11-22T05:58:28.1992533Z
+2022-11-22T05:58:28.1993343Z [1;32mPASS[0m /datum/unit_test/pills 0s
+2022-11-22T05:58:28.1994038Z ##[endgroup]
+2022-11-22T05:58:28.2194261Z ##[group]/datum/unit_test/plane_double_transform
+2022-11-22T05:58:28.2430543Z
+2022-11-22T05:58:28.2431815Z [1;32mPASS[0m /datum/unit_test/plane_double_transform 0s
+2022-11-22T05:58:28.2434784Z ##[endgroup]
+2022-11-22T05:58:28.2932472Z ##[group]/datum/unit_test/plane_dupe_detector
+2022-11-22T05:58:28.2933160Z
+2022-11-22T05:58:28.2935921Z [1;32mPASS[0m /datum/unit_test/plane_dupe_detector 0s
+2022-11-22T05:58:28.2938654Z ##[endgroup]
+2022-11-22T05:58:28.3090410Z ##[group]/datum/unit_test/plantgrowth
+2022-11-22T05:58:28.3481022Z
+2022-11-22T05:58:28.3482119Z [1;32mPASS[0m /datum/unit_test/plantgrowth 0s
+2022-11-22T05:58:28.3483278Z ##[endgroup]
+2022-11-22T05:58:28.3644306Z ##[group]/datum/unit_test/preference_species
+2022-11-22T05:58:28.3644848Z
+2022-11-22T05:58:28.3645467Z [1;32mPASS[0m /datum/unit_test/preference_species 0s
+2022-11-22T05:58:28.3648326Z ##[endgroup]
+2022-11-22T05:58:28.3800065Z ##[group]/datum/unit_test/preferences_implement_everything
+2022-11-22T05:58:33.0443739Z
+2022-11-22T05:58:33.0446214Z [1;32mPASS[0m /datum/unit_test/preferences_implement_everything 4.7s
+2022-11-22T05:58:33.0447293Z ##[endgroup]
+2022-11-22T05:58:37.7153022Z ##[group]/datum/unit_test/preferences_valid_savefile_key
+2022-11-22T05:58:37.7155101Z
+2022-11-22T05:58:37.7157164Z [1;32mPASS[0m /datum/unit_test/preferences_valid_savefile_key 0s
+2022-11-22T05:58:37.7158100Z ##[endgroup]
+2022-11-22T05:58:37.7323713Z ##[group]/datum/unit_test/preferences_valid_main_feature_name
+2022-11-22T05:58:37.7329320Z
+2022-11-22T05:58:37.7330388Z [1;32mPASS[0m /datum/unit_test/preferences_valid_main_feature_name 0s
+2022-11-22T05:58:37.7330952Z ##[endgroup]
+2022-11-22T05:58:37.7489830Z ##[group]/datum/unit_test/projectile_movetypes
+2022-11-22T05:58:37.7490689Z
+2022-11-22T05:58:37.7491455Z [1;32mPASS[0m /datum/unit_test/projectile_movetypes 0s
+2022-11-22T05:58:37.7491963Z ##[endgroup]
+2022-11-22T05:58:37.7649766Z ##[group]/datum/unit_test/gun_go_bang
+2022-11-22T05:58:37.8209519Z
+2022-11-22T05:58:37.8210665Z [1;32mPASS[0m /datum/unit_test/gun_go_bang 0.1s
+2022-11-22T05:58:37.8211545Z ##[endgroup]
+2022-11-22T05:58:37.8502284Z ##[group]/datum/unit_test/quirk_icons
+2022-11-22T05:58:37.8502850Z
+2022-11-22T05:58:37.8503567Z [1;32mPASS[0m /datum/unit_test/quirk_icons 0s
+2022-11-22T05:58:37.8504117Z ##[endgroup]
+2022-11-22T05:58:37.8657773Z ##[group]/datum/unit_test/range_return
+2022-11-22T05:58:37.8658306Z
+2022-11-22T05:58:37.8658926Z [1;32mPASS[0m /datum/unit_test/range_return 0s
+2022-11-22T05:58:37.8659408Z ##[endgroup]
+2022-11-22T05:58:37.8813805Z ##[group]/datum/unit_test/frame_stacking
+2022-11-22T05:58:37.9259992Z
+2022-11-22T05:58:37.9261883Z [1;32mPASS[0m /datum/unit_test/frame_stacking 0.1s
+2022-11-22T05:58:37.9264250Z ##[endgroup]
+2022-11-22T05:58:37.9487864Z ##[group]/datum/unit_test/reagent_id_typos
+2022-11-22T05:58:37.9501045Z
+2022-11-22T05:58:37.9502744Z [1;32mPASS[0m /datum/unit_test/reagent_id_typos 0s
+2022-11-22T05:58:37.9504577Z ##[endgroup]
+2022-11-22T05:58:37.9652919Z ##[group]/datum/unit_test/reagent_mob_expose
+2022-11-22T05:58:37.9929781Z
+2022-11-22T05:58:37.9930884Z [1;32mPASS[0m /datum/unit_test/reagent_mob_expose 0s
+2022-11-22T05:58:37.9932053Z ##[endgroup]
+2022-11-22T05:58:38.0197685Z ##[group]/datum/unit_test/reagent_mob_procs
+2022-11-22T05:58:38.0416951Z
+2022-11-22T05:58:38.0417978Z [1;32mPASS[0m /datum/unit_test/reagent_mob_procs 0s
+2022-11-22T05:58:38.0420890Z ##[endgroup]
+2022-11-22T05:58:38.0622397Z ##[group]/datum/unit_test/reagent_names
+2022-11-22T05:58:38.8276671Z
+2022-11-22T05:58:38.8277981Z [1;32mPASS[0m /datum/unit_test/reagent_names 0.8s
+2022-11-22T05:58:38.8278989Z ##[endgroup]
+2022-11-22T05:58:39.5940322Z ##[group]/datum/unit_test/reagent_recipe_collisions
+2022-11-22T05:58:39.9910847Z
+2022-11-22T05:58:39.9911887Z [1;32mPASS[0m /datum/unit_test/reagent_recipe_collisions 0.4s
+2022-11-22T05:58:39.9912840Z ##[endgroup]
+2022-11-22T05:58:40.3577765Z ##[group]/datum/unit_test/reagent_transfer
+2022-11-22T05:58:40.3582341Z
+2022-11-22T05:58:40.3583185Z [1;32mPASS[0m /datum/unit_test/reagent_transfer 0s
+2022-11-22T05:58:40.3584011Z ##[endgroup]
+2022-11-22T05:58:40.3745578Z ##[group]/datum/unit_test/stop_drop_and_roll
+2022-11-22T05:58:40.3962558Z
+2022-11-22T05:58:40.3963493Z [1;32mPASS[0m /datum/unit_test/stop_drop_and_roll 0s
+2022-11-22T05:58:40.3965748Z ##[endgroup]
+2022-11-22T05:58:40.4169199Z ##[group]/datum/unit_test/container_resist
+2022-11-22T05:58:40.4450945Z
+2022-11-22T05:58:40.4452010Z [1;32mPASS[0m /datum/unit_test/container_resist 0s
+2022-11-22T05:58:40.4452942Z ##[endgroup]
+2022-11-22T05:58:40.4681974Z ##[group]/datum/unit_test/get_message_mods
+2022-11-22T05:58:40.4890976Z
+2022-11-22T05:58:40.4891902Z [1;32mPASS[0m /datum/unit_test/get_message_mods 0s
+2022-11-22T05:58:40.4938745Z ##[endgroup]
+2022-11-22T05:58:40.5092622Z ##[group]/datum/unit_test/say_signal
+2022-11-22T05:58:40.5109636Z
+2022-11-22T05:58:40.5110057Z [1;32mPASS[0m /datum/unit_test/say_signal 0s
+2022-11-22T05:58:40.5110529Z ##[endgroup]
+2022-11-22T05:58:40.5273081Z ##[group]/datum/unit_test/screenshot_antag_icons
+2022-11-22T05:58:40.5292264Z screenshot_antag_icons_fugitive was put in data/screenshots_new
+2022-11-22T05:58:40.5297917Z screenshot_antag_icons_loneoperative was put in data/screenshots_new
+2022-11-22T05:58:40.5648778Z screenshot_antag_icons_sentiencepotionspawn was put in data/screenshots_new
+2022-11-22T05:58:40.5657229Z screenshot_antag_icons_traitor was put in data/screenshots_new
+2022-11-22T05:58:40.6056549Z screenshot_antag_icons_malfai was put in data/screenshots_new
+2022-11-22T05:58:40.6093403Z screenshot_antag_icons_bloodbrother was put in data/screenshots_new
+2022-11-22T05:58:40.6099494Z screenshot_antag_icons_changeling was put in data/screenshots_new
+2022-11-22T05:58:40.6141861Z screenshot_antag_icons_heretic was put in data/screenshots_new
+2022-11-22T05:58:40.6152817Z screenshot_antag_icons_wizard was put in data/screenshots_new
+2022-11-22T05:58:40.6187229Z screenshot_antag_icons_cultist was put in data/screenshots_new
+2022-11-22T05:58:40.6199509Z screenshot_antag_icons_operative was put in data/screenshots_new
+2022-11-22T05:58:40.6212847Z screenshot_antag_icons_clownoperative was put in data/screenshots_new
+2022-11-22T05:58:40.6234689Z screenshot_antag_icons_headrevolutionary was put in data/screenshots_new
+2022-11-22T05:58:40.6235113Z screenshot_antag_icons_syndicateinfiltrator was put in data/screenshots_new
+2022-11-22T05:58:40.6235503Z screenshot_antag_icons_provocateur was put in data/screenshots_new
+2022-11-22T05:58:40.6235874Z screenshot_antag_icons_hereticsmuggler was put in data/screenshots_new
+2022-11-22T05:58:40.6236247Z screenshot_antag_icons_wizardmidround was put in data/screenshots_new
+2022-11-22T05:58:40.6236614Z screenshot_antag_icons_operativemidround was put in data/screenshots_new
+2022-11-22T05:58:40.6888373Z screenshot_antag_icons_blob was put in data/screenshots_new
+2022-11-22T05:58:40.6981477Z screenshot_antag_icons_xenomorph was put in data/screenshots_new
+2022-11-22T05:58:40.6987596Z screenshot_antag_icons_nightmare was put in data/screenshots_new
+2022-11-22T05:58:40.7057997Z screenshot_antag_icons_spacedragon was put in data/screenshots_new
+2022-11-22T05:58:40.7064121Z screenshot_antag_icons_abductor was put in data/screenshots_new
+2022-11-22T05:58:40.7069837Z screenshot_antag_icons_spaceninja was put in data/screenshots_new
+2022-11-22T05:58:40.7301887Z screenshot_antag_icons_revenant was put in data/screenshots_new
+2022-11-22T05:58:40.7320268Z screenshot_antag_icons_sentientdisease was put in data/screenshots_new
+2022-11-22T05:58:40.7321448Z screenshot_antag_icons_syndicatesleeperagent was put in data/screenshots_new
+2022-11-22T05:58:40.7464714Z screenshot_antag_icons_blobinfection was put in data/screenshots_new
+2022-11-22T05:58:40.7484344Z screenshot_antag_icons_obsessed was put in data/screenshots_new
+2022-11-22T05:58:40.7485272Z screenshot_antag_icons_malfaimidround was put in data/screenshots_new
+2022-11-22T05:58:40.7485491Z
+2022-11-22T05:58:40.7486250Z [1;32mPASS[0m /datum/unit_test/screenshot_antag_icons 0.2s
+2022-11-22T05:58:40.7487461Z ##[endgroup]
+2022-11-22T05:58:40.9148897Z ##[group]/datum/unit_test/screenshot_basic
+2022-11-22T05:58:40.9152865Z screenshot_basic_red was put in data/screenshots_new
+2022-11-22T05:58:40.9153089Z
+2022-11-22T05:58:40.9153840Z [1;32mPASS[0m /datum/unit_test/screenshot_basic 0s
+2022-11-22T05:58:40.9154358Z ##[endgroup]
+2022-11-22T05:58:40.9323137Z ##[group]/datum/unit_test/screenshot_humanoids
+2022-11-22T05:58:41.4860399Z screenshot_humanoids__datum_species_lizard was put in data/screenshots_new
+2022-11-22T05:58:42.1812125Z screenshot_humanoids__datum_species_moth was put in data/screenshots_new
+2022-11-22T05:58:42.7396430Z screenshot_humanoids__datum_species_shadow was put in data/screenshots_new
+2022-11-22T05:58:42.9412448Z screenshot_humanoids__datum_species_shadow_nightmare was put in data/screenshots_new
+2022-11-22T05:58:43.4856493Z screenshot_humanoids__datum_species_abductor was put in data/screenshots_new
+2022-11-22T05:58:43.9790579Z screenshot_humanoids__datum_species_android was put in data/screenshots_new
+2022-11-22T05:58:44.4705884Z screenshot_humanoids__datum_species_dullahan was put in data/screenshots_new
+2022-11-22T05:58:44.9659470Z screenshot_humanoids__datum_species_ethereal was put in data/screenshots_new
+2022-11-22T05:58:45.5314689Z screenshot_humanoids__datum_species_human was put in data/screenshots_new
+2022-11-22T05:58:46.1537771Z screenshot_humanoids__datum_species_human_felinid was put in data/screenshots_new
+2022-11-22T05:58:46.8079860Z screenshot_humanoids__datum_species_human_krokodil_addict was put in data/screenshots_new
+2022-11-22T05:58:47.4445783Z screenshot_humanoids__datum_species_fly was put in data/screenshots_new
+2022-11-22T05:58:47.9686077Z screenshot_humanoids__datum_species_golem was put in data/screenshots_new
+2022-11-22T05:58:48.4853290Z screenshot_humanoids__datum_species_golem_adamantine was put in data/screenshots_new
+2022-11-22T05:58:49.0233415Z screenshot_humanoids__datum_species_golem_plasma was put in data/screenshots_new
+2022-11-22T05:58:49.5402611Z screenshot_humanoids__datum_species_golem_diamond was put in data/screenshots_new
+2022-11-22T05:58:50.0619605Z screenshot_humanoids__datum_species_golem_gold was put in data/screenshots_new
+2022-11-22T05:58:50.5960700Z screenshot_humanoids__datum_species_golem_silver was put in data/screenshots_new
+2022-11-22T05:58:51.1268001Z screenshot_humanoids__datum_species_golem_plasteel was put in data/screenshots_new
+2022-11-22T05:58:51.6041410Z screenshot_humanoids__datum_species_golem_titanium was put in data/screenshots_new
+2022-11-22T05:58:52.1421369Z screenshot_humanoids__datum_species_golem_plastitanium was put in data/screenshots_new
+2022-11-22T05:58:52.6646881Z screenshot_humanoids__datum_species_golem_alloy was put in data/screenshots_new
+2022-11-22T05:58:53.1822437Z screenshot_humanoids__datum_species_golem_wood was put in data/screenshots_new
+2022-11-22T05:58:53.7093546Z screenshot_humanoids__datum_species_golem_uranium was put in data/screenshots_new
+2022-11-22T05:58:54.2289778Z screenshot_humanoids__datum_species_golem_sand was put in data/screenshots_new
+2022-11-22T05:58:54.7551132Z screenshot_humanoids__datum_species_golem_glass was put in data/screenshots_new
+2022-11-22T05:58:55.2923350Z screenshot_humanoids__datum_species_golem_bluespace was put in data/screenshots_new
+2022-11-22T05:58:55.8209063Z screenshot_humanoids__datum_species_golem_bananium was put in data/screenshots_new
+2022-11-22T05:58:56.2556562Z screenshot_humanoids__datum_species_golem_runic was put in data/screenshots_new
+2022-11-22T05:58:56.8660417Z screenshot_humanoids__datum_species_golem_cloth was put in data/screenshots_new
+2022-11-22T05:58:57.3592195Z screenshot_humanoids__datum_species_golem_plastic was put in data/screenshots_new
+2022-11-22T05:58:57.9036879Z screenshot_humanoids__datum_species_golem_bronze was put in data/screenshots_new
+2022-11-22T05:58:58.3538566Z screenshot_humanoids__datum_species_golem_cardboard was put in data/screenshots_new
+2022-11-22T05:58:58.9038125Z screenshot_humanoids__datum_species_golem_leather was put in data/screenshots_new
+2022-11-22T05:58:59.3259282Z screenshot_humanoids__datum_species_golem_durathread was put in data/screenshots_new
+2022-11-22T05:58:59.7415514Z screenshot_humanoids__datum_species_golem_bone was put in data/screenshots_new
+2022-11-22T05:59:00.1624246Z screenshot_humanoids__datum_species_golem_snow was put in data/screenshots_new
+2022-11-22T05:59:00.7017097Z screenshot_humanoids__datum_species_golem_mhydrogen was put in data/screenshots_new
+2022-11-22T05:59:01.2962128Z screenshot_humanoids__datum_species_jelly was put in data/screenshots_new
+2022-11-22T05:59:01.8914644Z screenshot_humanoids__datum_species_jelly_slime was put in data/screenshots_new
+2022-11-22T05:59:02.4944760Z screenshot_humanoids__datum_species_jelly_luminescent was put in data/screenshots_new
+2022-11-22T05:59:03.1051896Z screenshot_humanoids__datum_species_jelly_stargazer was put in data/screenshots_new
+2022-11-22T05:59:03.6316289Z screenshot_humanoids__datum_species_lizard_ashwalker was put in data/screenshots_new
+2022-11-22T05:59:04.1732683Z screenshot_humanoids__datum_species_lizard_silverscale was put in data/screenshots_new
+2022-11-22T05:59:04.3219378Z screenshot_humanoids__datum_species_monkey was put in data/screenshots_new
+2022-11-22T05:59:04.7808061Z screenshot_humanoids__datum_species_mush was put in data/screenshots_new
+2022-11-22T05:59:05.2791916Z screenshot_humanoids__datum_species_plasmaman was put in data/screenshots_new
+2022-11-22T05:59:05.8726674Z screenshot_humanoids__datum_species_pod was put in data/screenshots_new
+2022-11-22T05:59:06.4421620Z screenshot_humanoids__datum_species_skeleton was put in data/screenshots_new
+2022-11-22T05:59:07.0386329Z screenshot_humanoids__datum_species_snail was put in data/screenshots_new
+2022-11-22T05:59:07.6272099Z screenshot_humanoids__datum_species_vampire was put in data/screenshots_new
+2022-11-22T05:59:08.2909176Z screenshot_humanoids__datum_species_zombie was put in data/screenshots_new
+2022-11-22T05:59:09.0366652Z screenshot_humanoids__datum_species_zombie_infectious was put in data/screenshots_new
+2022-11-22T05:59:09.0367022Z
+2022-11-22T05:59:09.0367523Z [1;32mPASS[0m /datum/unit_test/screenshot_humanoids 28.1s
+2022-11-22T05:59:09.0368166Z ##[endgroup]
+2022-11-22T05:59:37.6866607Z ##[group]/datum/unit_test/screenshot_saturnx
+2022-11-22T05:59:37.9124865Z screenshot_saturnx_invisibility was put in data/screenshots_new
+2022-11-22T05:59:37.9125745Z
+2022-11-22T05:59:37.9127093Z [1;32mPASS[0m /datum/unit_test/screenshot_saturnx 0.3s
+2022-11-22T05:59:37.9127697Z ##[endgroup]
+2022-11-22T05:59:38.0853482Z ##[group]/datum/unit_test/security_officer_roundstart_distribution
+2022-11-22T05:59:38.2014087Z
+2022-11-22T05:59:38.2015341Z [1;32mPASS[0m /datum/unit_test/security_officer_roundstart_distribution 0.2s
+2022-11-22T05:59:38.2015989Z ##[endgroup]
+2022-11-22T05:59:38.3357446Z ##[group]/datum/unit_test/security_officer_latejoin_distribution
+2022-11-22T05:59:38.7057220Z
+2022-11-22T05:59:38.7058863Z [1;32mPASS[0m /datum/unit_test/security_officer_latejoin_distribution 0.4s
+2022-11-22T05:59:38.7060729Z ##[endgroup]
+2022-11-22T05:59:39.2017954Z ##[group]/datum/unit_test/security_levels
+2022-11-22T05:59:39.2018640Z
+2022-11-22T05:59:39.2021443Z [1;32mPASS[0m /datum/unit_test/security_levels 0s
+2022-11-22T05:59:39.2024185Z ##[endgroup]
+2022-11-22T05:59:39.2192675Z ##[group]/datum/unit_test/servingtray
+2022-11-22T05:59:39.2471606Z
+2022-11-22T05:59:39.2472412Z [1;32mPASS[0m /datum/unit_test/servingtray 0s
+2022-11-22T05:59:39.2475270Z ##[endgroup]
+2022-11-22T05:59:39.2694155Z ##[group]/datum/unit_test/simple_animal_freeze
+2022-11-22T05:59:39.2703215Z
+2022-11-22T05:59:39.2703882Z [1;32mPASS[0m /datum/unit_test/simple_animal_freeze 0s
+2022-11-22T05:59:39.2704730Z ##[endgroup]
+2022-11-22T05:59:39.2859664Z ##[group]/datum/unit_test/siunit
+2022-11-22T05:59:39.2860192Z
+2022-11-22T05:59:39.2905239Z [1;32mPASS[0m /datum/unit_test/siunit 0s
+2022-11-22T05:59:39.2905758Z ##[endgroup]
+2022-11-22T05:59:39.3380495Z ##[group]/datum/unit_test/slips
+2022-11-22T05:59:39.3816463Z
+2022-11-22T05:59:39.3817092Z [1;32mPASS[0m /datum/unit_test/slips 0s
+2022-11-22T05:59:39.3817715Z ##[endgroup]
+2022-11-22T05:59:39.4069986Z ##[group]/datum/unit_test/spawn_humans
+2022-11-22T05:59:44.4570883Z
+2022-11-22T05:59:44.4573502Z [1;32mPASS[0m /datum/unit_test/spawn_humans 5s
+2022-11-22T05:59:44.4574683Z ##[endgroup]
+2022-11-22T05:59:44.4963535Z ##[group]/datum/unit_test/spawn_mobs
+2022-11-22T05:59:44.5574109Z
+2022-11-22T05:59:44.5575293Z [1;32mPASS[0m /datum/unit_test/spawn_mobs 0.1s
+2022-11-22T05:59:44.5575900Z ##[endgroup]
+2022-11-22T05:59:44.6565999Z ##[group]/datum/unit_test/species_change_clothing
+2022-11-22T05:59:44.7330373Z
+2022-11-22T05:59:44.7331058Z [1;32mPASS[0m /datum/unit_test/species_change_clothing 0.1s
+2022-11-22T05:59:44.7331700Z ##[endgroup]
+2022-11-22T05:59:44.7549387Z ##[group]/datum/unit_test/species_change_organs
+2022-11-22T05:59:44.8048767Z
+2022-11-22T05:59:44.8049950Z [1;32mPASS[0m /datum/unit_test/species_change_organs 0.1s
+2022-11-22T05:59:44.8051289Z ##[endgroup]
+2022-11-22T05:59:44.8279792Z ##[group]/datum/unit_test/species_config_sanity
+2022-11-22T05:59:44.8280594Z
+2022-11-22T05:59:44.8283317Z [1;32mPASS[0m /datum/unit_test/species_config_sanity 0s
+2022-11-22T05:59:44.8284090Z ##[endgroup]
+2022-11-22T05:59:44.8437473Z ##[group]/datum/unit_test/species_unique_id
+2022-11-22T05:59:44.8438066Z
+2022-11-22T05:59:44.8438608Z [1;32mPASS[0m /datum/unit_test/species_unique_id 0s
+2022-11-22T05:59:44.8439291Z ##[endgroup]
+2022-11-22T05:59:44.8779329Z ##[group]/datum/unit_test/species_whitelist_check
+2022-11-22T05:59:44.8779795Z
+2022-11-22T05:59:44.8782619Z [1;32mPASS[0m /datum/unit_test/species_whitelist_check 0s
+2022-11-22T05:59:44.8783319Z ##[endgroup]
+2022-11-22T05:59:44.8936699Z ##[group]/datum/unit_test/spell_invocations
+2022-11-22T05:59:44.8937279Z
+2022-11-22T05:59:44.8939987Z [1;32mPASS[0m /datum/unit_test/spell_invocations 0s
+2022-11-22T05:59:44.8940786Z ##[endgroup]
+2022-11-22T05:59:45.0281600Z ##[group]/datum/unit_test/mind_swap_spell
+2022-11-22T05:59:45.0736031Z
+2022-11-22T05:59:45.0737123Z [1;32mPASS[0m /datum/unit_test/mind_swap_spell 0s
+2022-11-22T05:59:45.0738202Z ##[endgroup]
+2022-11-22T05:59:45.2297228Z ##[group]/datum/unit_test/spell_names
+2022-11-22T05:59:45.2298287Z
+2022-11-22T05:59:45.2299157Z [1;32mPASS[0m /datum/unit_test/spell_names 0s
+2022-11-22T05:59:45.2299995Z ##[endgroup]
+2022-11-22T05:59:45.2458199Z ##[group]/datum/unit_test/shapeshift_spell_validity
+2022-11-22T05:59:45.2460243Z
+2022-11-22T05:59:45.2460928Z [1;32mPASS[0m /datum/unit_test/shapeshift_spell_validity 0s
+2022-11-22T05:59:45.2461604Z ##[endgroup]
+2022-11-22T05:59:45.2618397Z ##[group]/datum/unit_test/shapeshift_spell
+2022-11-22T05:59:45.4081241Z ##[error]Shapeshift spell: Dragon Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4091958Z ##[error]Shapeshift spell: Dragon Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4093892Z ##[error]Shapeshift spell: Polar Bear Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4095548Z ##[error]Shapeshift spell: Polar Bear Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4097222Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape mouse. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4098881Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape corgi. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4100589Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape chaos magicarp. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4102710Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape ED-209 Security Robot. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4104442Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape viper spider. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4106168Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape Juggernaut. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4107958Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape mouse. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4110135Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape corgi. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4112154Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape chaos magicarp. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4114456Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape ED-209 Security Robot. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4116528Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape viper spider. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4118582Z ##[error]Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape Juggernaut. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron).
+2022-11-22T05:59:45.4119786Z FAILURE #1: Shapeshift spell: Dragon Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4120672Z FAILURE #2: Shapeshift spell: Dragon Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4121597Z FAILURE #3: Shapeshift spell: Polar Bear Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4122479Z FAILURE #4: Shapeshift spell: Polar Bear Form failed to transform the dummy into the shape . (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4123517Z FAILURE #5: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape mouse. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4124518Z FAILURE #6: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape corgi. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4125489Z FAILURE #7: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape chaos magicarp. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4126570Z FAILURE #8: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape ED-209 Security Robot. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4127396Z FAILURE #9: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape viper spider. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4128221Z FAILURE #10: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape Juggernaut. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4129047Z FAILURE #11: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape mouse. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4129842Z FAILURE #12: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape corgi. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4130862Z FAILURE #13: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape chaos magicarp. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4131926Z FAILURE #14: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape ED-209 Security Robot. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4132782Z FAILURE #15: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape viper spider. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4133589Z FAILURE #16: Shapeshift spell: Wild Shapeshift failed to transform the dummy into the shape Juggernaut. (Pablo Pfeifer was located within the floor, which is a /turf/open/floor/iron). at code/modules/unit_tests/spell_shapeshift.dm:65
+2022-11-22T05:59:45.4134297Z ##[endgroup]
+2022-11-22T05:59:45.4135321Z ##[error][1;31mFAIL[0m /datum/unit_test/shapeshift_spell 0.2s
+2022-11-22T05:59:45.5762391Z ##[group]/datum/unit_test/shapeshift_holoparasites
+2022-11-22T05:59:45.6070063Z
+2022-11-22T05:59:45.6070794Z [1;32mPASS[0m /datum/unit_test/shapeshift_holoparasites 0.1s
+2022-11-22T05:59:45.6071835Z ##[endgroup]
+2022-11-22T05:59:45.6299960Z ##[group]/datum/unit_test/spritesheets
+2022-11-22T05:59:45.6328891Z
+2022-11-22T05:59:45.6329636Z [1;32mPASS[0m /datum/unit_test/spritesheets 0s
+2022-11-22T05:59:45.6330450Z ##[endgroup]
+2022-11-22T05:59:45.6504395Z ##[group]/datum/unit_test/stack_singular_name
+2022-11-22T05:59:45.6504677Z
+2022-11-22T05:59:45.6505199Z [1;32mPASS[0m /datum/unit_test/stack_singular_name 0s
+2022-11-22T05:59:45.6506428Z ##[endgroup]
+2022-11-22T05:59:45.6810947Z ##[group]/datum/unit_test/station_traits
+2022-11-22T05:59:45.6811136Z
+2022-11-22T05:59:45.6811839Z [1;32mPASS[0m /datum/unit_test/station_traits 0s
+2022-11-22T05:59:45.6812628Z ##[endgroup]
+2022-11-22T05:59:45.6968300Z ##[group]/datum/unit_test/stomach
+2022-11-22T05:59:45.7241514Z
+2022-11-22T05:59:45.7242199Z [1;32mPASS[0m /datum/unit_test/stomach 0.1s
+2022-11-22T05:59:45.7242846Z ##[endgroup]
+2022-11-22T05:59:45.7453036Z ##[group]/datum/unit_test/strip_menu_ui_status
+2022-11-22T05:59:45.7868616Z
+2022-11-22T05:59:45.7869391Z [1;32mPASS[0m /datum/unit_test/strip_menu_ui_status 0s
+2022-11-22T05:59:45.7870070Z ##[endgroup]
+2022-11-22T05:59:45.8340124Z ##[group]/datum/unit_test/subsystem_init
+2022-11-22T05:59:45.8340353Z
+2022-11-22T05:59:45.8340796Z [1;32mPASS[0m /datum/unit_test/subsystem_init 0s
+2022-11-22T05:59:45.8341746Z ##[endgroup]
+2022-11-22T05:59:45.8497480Z ##[group]/datum/unit_test/suit_storage_icons
+2022-11-22T05:59:47.2782798Z 1 - /obj/item/ammo_casing/shotgun using invalid worn_icon_state, "shell"
+2022-11-22T05:59:47.2904416Z 2 - /obj/item/gun/ballistic/shotgun/hook using invalid icon_state, "hookshotgun"
+2022-11-22T05:59:47.3032597Z 3 - /obj/item/gun/ballistic/automatic/surplus using invalid icon_state, "surplus"
+2022-11-22T05:59:47.3160623Z 4 - /obj/item/gun/energy/beam_rifle using invalid icon_state, "esniper"
+2022-11-22T05:59:47.3179488Z 5 - /obj/item/gun/energy/lasercannon using invalid icon_state, "lasercannon"
+2022-11-22T05:59:47.3204942Z 6 - /obj/item/gun/energy/ionrifle using invalid icon_state, "ionrifle"
+2022-11-22T05:59:47.3205749Z 7 - /obj/item/gun/energy/ionrifle/carbine using invalid icon_state, "ioncarbine"
+2022-11-22T05:59:47.3333663Z 8 - /obj/item/tome using invalid icon_state, "tome"
+2022-11-22T05:59:47.3367736Z 9 - /obj/item/melee/sickly_blade/void using invalid icon_state, "void_blade"
+2022-11-22T05:59:47.3379696Z 10 - /obj/item/nullrod/staff using invalid icon_state, "godstaff-red"
+2022-11-22T05:59:47.3382004Z 11 - /obj/item/nullrod/staff/blue using invalid icon_state, "godstaff-blue"
+2022-11-22T05:59:47.3455165Z 12 - /obj/item/nullrod/tribal_knife using invalid icon_state, "crysknife"
+2022-11-22T05:59:47.3462398Z 13 - /obj/item/nullrod/spear using invalid icon_state, "ratvarian_spear"
+2022-11-22T05:59:47.3471005Z 14 - /obj/item/candle using invalid icon_state, "candle1"
+2022-11-22T05:59:47.3818626Z 15 - /obj/item/toy/eightball using invalid icon_state, "eightball"
+2022-11-22T05:59:47.3819882Z 16 - /obj/item/toy/mecha using invalid icon_state, "fivestarstoy"
+2022-11-22T05:59:47.3822376Z 17 - /obj/item/toy/mecha/ripley using invalid icon_state, "ripleytoy"
+2022-11-22T05:59:47.3824854Z 18 - /obj/item/toy/mecha/ripleymkii using invalid icon_state, "ripleymkiitoy"
+2022-11-22T05:59:47.3827367Z 19 - /obj/item/toy/mecha/hauler using invalid icon_state, "haulertoy"
+2022-11-22T05:59:47.3829817Z 20 - /obj/item/toy/mecha/clarke using invalid icon_state, "clarketoy"
+2022-11-22T05:59:47.3832329Z 21 - /obj/item/toy/mecha/odysseus using invalid icon_state, "odysseustoy"
+2022-11-22T05:59:47.3834765Z 22 - /obj/item/toy/mecha/gygax using invalid icon_state, "gygaxtoy"
+2022-11-22T05:59:47.3837259Z 23 - /obj/item/toy/mecha/durand using invalid icon_state, "durandtoy"
+2022-11-22T05:59:47.3839922Z 24 - /obj/item/toy/mecha/savannahivanov using invalid icon_state, "savannahivanovtoy"
+2022-11-22T05:59:47.3842813Z 25 - /obj/item/toy/mecha/phazon using invalid icon_state, "phazontoy"
+2022-11-22T05:59:47.3845150Z 26 - /obj/item/toy/mecha/honk using invalid icon_state, "honktoy"
+2022-11-22T05:59:47.3847669Z 27 - /obj/item/toy/mecha/darkgygax using invalid icon_state, "darkgygaxtoy"
+2022-11-22T05:59:47.3850308Z 28 - /obj/item/toy/mecha/mauler using invalid icon_state, "maulertoy"
+2022-11-22T05:59:47.3852869Z 29 - /obj/item/toy/mecha/darkhonk using invalid icon_state, "darkhonktoy"
+2022-11-22T05:59:47.3855423Z 30 - /obj/item/toy/mecha/deathripley using invalid icon_state, "deathripleytoy"
+2022-11-22T05:59:47.3857917Z 31 - /obj/item/toy/mecha/reticence using invalid icon_state, "reticencetoy"
+2022-11-22T05:59:47.3860420Z 32 - /obj/item/toy/mecha/marauder using invalid icon_state, "maraudertoy"
+2022-11-22T05:59:47.3863149Z 33 - /obj/item/toy/mecha/seraph using invalid icon_state, "seraphtoy"
+2022-11-22T05:59:47.3865478Z 34 - /obj/item/toy/mecha/firefighter using invalid icon_state, "firefightertoy"
+2022-11-22T05:59:47.3867946Z 35 - /obj/item/toy/waterballoon using invalid icon_state, "waterballoon-e"
+2022-11-22T05:59:47.3870341Z 36 - /obj/item/toy/balloon using invalid icon_state, "balloon"
+2022-11-22T05:59:47.3872883Z 37 - /obj/item/toy/balloon/corgi using invalid icon_state, "corgi"
+2022-11-22T05:59:47.3875334Z 38 - /obj/item/toy/balloon/syndicate using invalid icon_state, "syndballoon"
+2022-11-22T05:59:47.3877875Z 39 - /obj/item/toy/balloon/arrest using invalid icon_state, "arrestballoon"
+2022-11-22T05:59:47.3881362Z 40 - /obj/item/toy/captainsaid using invalid icon_state, "captainsaid_off"
+2022-11-22T05:59:47.3882960Z 41 - /obj/item/toy/spinningtoy using invalid icon_state, "singularity_s1"
+2022-11-22T05:59:47.3887746Z 42 - /obj/item/toy/ammo/gun using invalid icon_state, "357OLD-7"
+2022-11-22T05:59:47.3890028Z 43 - /obj/item/toy/sword using invalid icon_state, "e_sword"
+2022-11-22T05:59:47.3892708Z 44 - /obj/item/toy/foamblade using invalid icon_state, "foamblade"
+2022-11-22T05:59:47.3895134Z 45 - /obj/item/toy/windup_toolbox using invalid icon_state, "green"
+2022-11-22T05:59:47.3899921Z 46 - /obj/item/toy/snappop using invalid icon_state, "snappop"
+2022-11-22T05:59:47.3902685Z 47 - /obj/item/toy/talking using invalid icon_state, "owlprize"
+2022-11-22T05:59:47.3904842Z 48 - /obj/item/toy/talking/ai using invalid icon_state, "AI"
+2022-11-22T05:59:47.3907306Z 49 - /obj/item/toy/talking/codex_gigas using invalid icon_state, "demonomicon"
+2022-11-22T05:59:47.3909825Z 50 - /obj/item/toy/talking/griffin using invalid icon_state, "griffinprize"
+2022-11-22T05:59:47.3912295Z 51 - /obj/item/toy/nuke using invalid icon_state, "nuketoyidle"
+2022-11-22T05:59:47.3914956Z 52 - /obj/item/toy/minimeteor using invalid icon_state, "minimeteor"
+2022-11-22T05:59:47.3917314Z 53 - /obj/item/toy/redbutton using invalid icon_state, "bigred"
+2022-11-22T05:59:47.3919850Z 54 - /obj/item/toy/snowball using invalid icon_state, "snowball"
+2022-11-22T05:59:47.3922324Z 55 - /obj/item/toy/beach_ball using invalid icon_state, "ball"
+2022-11-22T05:59:47.3924942Z 56 - /obj/item/toy/beach_ball/baseball using invalid icon_state, "baseball"
+2022-11-22T05:59:47.3927403Z 57 - /obj/item/toy/beach_ball/holoball using invalid icon_state, "basketball"
+2022-11-22T05:59:47.3930060Z 58 - /obj/item/toy/beach_ball/holoball/dodgeball using invalid icon_state, "dodgeball"
+2022-11-22T05:59:47.3937167Z 59 - /obj/item/toy/toy_xeno using invalid icon_state, "toy_xeno"
+2022-11-22T05:59:47.3939549Z 60 - /obj/item/toy/cattoy using invalid icon_state, "toy_mouse"
+2022-11-22T05:59:47.3942078Z 61 - /obj/item/toy/figure using invalid icon_state, "nuketoy"
+2022-11-22T05:59:47.3944589Z 62 - /obj/item/toy/figure/cmo using invalid icon_state, "cmo"
+2022-11-22T05:59:47.3947155Z 63 - /obj/item/toy/figure/assistant using invalid icon_state, "assistant"
+2022-11-22T05:59:47.3949638Z 64 - /obj/item/toy/figure/atmos using invalid icon_state, "atmos"
+2022-11-22T05:59:47.3952141Z 65 - /obj/item/toy/figure/bartender using invalid icon_state, "bartender"
+2022-11-22T05:59:47.3954628Z 66 - /obj/item/toy/figure/borg using invalid icon_state, "borg"
+2022-11-22T05:59:47.3957148Z 67 - /obj/item/toy/figure/botanist using invalid icon_state, "botanist"
+2022-11-22T05:59:47.3959629Z 68 - /obj/item/toy/figure/captain using invalid icon_state, "captain"
+2022-11-22T05:59:47.3962149Z 69 - /obj/item/toy/figure/cargotech using invalid icon_state, "cargotech"
+2022-11-22T05:59:47.3964605Z 70 - /obj/item/toy/figure/ce using invalid icon_state, "ce"
+2022-11-22T05:59:47.3967148Z 71 - /obj/item/toy/figure/chaplain using invalid icon_state, "chaplain"
+2022-11-22T05:59:47.3969647Z 72 - /obj/item/toy/figure/chef using invalid icon_state, "chef"
+2022-11-22T05:59:47.3972328Z 73 - /obj/item/toy/figure/chemist using invalid icon_state, "chemist"
+2022-11-22T05:59:47.3975052Z 74 - /obj/item/toy/figure/clown using invalid icon_state, "clown"
+2022-11-22T05:59:47.3977375Z 75 - /obj/item/toy/figure/ian using invalid icon_state, "ian"
+2022-11-22T05:59:47.3979914Z 76 - /obj/item/toy/figure/detective using invalid icon_state, "detective"
+2022-11-22T05:59:47.3982376Z 77 - /obj/item/toy/figure/dsquad using invalid icon_state, "dsquad"
+2022-11-22T05:59:47.3984915Z 78 - /obj/item/toy/figure/engineer using invalid icon_state, "engineer"
+2022-11-22T05:59:47.3987388Z 79 - /obj/item/toy/figure/geneticist using invalid icon_state, "geneticist"
+2022-11-22T05:59:47.3989933Z 80 - /obj/item/toy/figure/hop using invalid icon_state, "hop"
+2022-11-22T05:59:47.3992345Z 81 - /obj/item/toy/figure/hos using invalid icon_state, "hos"
+2022-11-22T05:59:47.3994832Z 82 - /obj/item/toy/figure/qm using invalid icon_state, "qm"
+2022-11-22T05:59:47.3997314Z 83 - /obj/item/toy/figure/janitor using invalid icon_state, "janitor"
+2022-11-22T05:59:47.3999822Z 84 - /obj/item/toy/figure/lawyer using invalid icon_state, "lawyer"
+2022-11-22T05:59:47.4002303Z 85 - /obj/item/toy/figure/curator using invalid icon_state, "curator"
+2022-11-22T05:59:47.4004824Z 86 - /obj/item/toy/figure/md using invalid icon_state, "md"
+2022-11-22T05:59:47.4007316Z 87 - /obj/item/toy/figure/paramedic using invalid icon_state, "paramedic"
+2022-11-22T05:59:47.4009871Z 88 - /obj/item/toy/figure/psychologist using invalid icon_state, "psychologist"
+2022-11-22T05:59:47.4012455Z 89 - /obj/item/toy/figure/prisoner using invalid icon_state, "prisoner"
+2022-11-22T05:59:47.4015072Z 90 - /obj/item/toy/figure/mime using invalid icon_state, "mime"
+2022-11-22T05:59:47.4017416Z 91 - /obj/item/toy/figure/miner using invalid icon_state, "miner"
+2022-11-22T05:59:47.4019976Z 92 - /obj/item/toy/figure/ninja using invalid icon_state, "ninja"
+2022-11-22T05:59:47.4022438Z 93 - /obj/item/toy/figure/wizard using invalid icon_state, "wizard"
+2022-11-22T05:59:47.4024907Z 94 - /obj/item/toy/figure/rd using invalid icon_state, "rd"
+2022-11-22T05:59:47.4027464Z 95 - /obj/item/toy/figure/roboticist using invalid icon_state, "roboticist"
+2022-11-22T05:59:47.4029958Z 96 - /obj/item/toy/figure/scientist using invalid icon_state, "scientist"
+2022-11-22T05:59:47.4032492Z 97 - /obj/item/toy/figure/syndie using invalid icon_state, "syndie"
+2022-11-22T05:59:47.4035062Z 98 - /obj/item/toy/figure/secofficer using invalid icon_state, "secofficer"
+2022-11-22T05:59:47.4037516Z 99 - /obj/item/toy/figure/virologist using invalid icon_state, "virologist"
+2022-11-22T05:59:47.4040034Z 100 - /obj/item/toy/figure/warden using invalid icon_state, "warden"
+2022-11-22T05:59:47.4042570Z 101 - /obj/item/toy/dummy using invalid icon_state, "puppet"
+2022-11-22T05:59:47.4045132Z 102 - /obj/item/toy/seashell using invalid icon_state, "shell1"
+2022-11-22T05:59:47.4047654Z 103 - /obj/item/toy/brokenradio using invalid icon_state, "broken_radio"
+2022-11-22T05:59:47.4050253Z 104 - /obj/item/toy/braintoy using invalid icon_state, "brain-old"
+2022-11-22T05:59:47.4055251Z 105 - /obj/item/toy/reality_pierce using invalid icon_state, "pierced_illusion"
+2022-11-22T05:59:47.4057520Z 106 - /obj/item/toy/foamfinger using invalid icon_state, "foamfinger"
+2022-11-22T05:59:47.4060004Z 107 - /obj/item/toy/intento using invalid icon_state, "blank"
+2022-11-22T05:59:47.4092596Z 108 - /obj/item/toy/sprayoncan using invalid icon_state, "sprayoncan"
+2022-11-22T05:59:47.4093827Z 109 - /obj/item/toy/xmas_cracker using invalid icon_state, "cracker"
+2022-11-22T05:59:47.4098242Z 110 - /obj/item/cultivator/rake using invalid icon_state, "rake"
+2022-11-22T05:59:47.4104109Z 111 - /obj/item/hatchet/wooden using invalid icon_state, "woodhatchet"
+2022-11-22T05:59:47.4106239Z 112 - /obj/item/hatchet/cutterblade using invalid icon_state, "cutterblade"
+2022-11-22T05:59:47.4792952Z 113 - /obj/item/reagent_containers/hypospray/medipen using invalid worn_icon_state, "medipen"
+2022-11-22T05:59:47.4928931Z 114 - /obj/item/storage/pill_bottle using invalid icon_state, "pill_canister"
+2022-11-22T05:59:47.4937506Z 115 - /obj/item/analyzer/ranged using invalid icon_state, "analyzerranged"
+2022-11-22T05:59:47.5463999Z 116 - /obj/item/organ/internal/monster_core using invalid icon_state, "hivelord_core"
+2022-11-22T05:59:47.5466585Z 117 - /obj/item/organ/internal/monster_core/brimdust_sac using invalid icon_state, "brim_sac"
+2022-11-22T05:59:47.5467229Z 118 - /obj/item/organ/internal/monster_core/regenerative_core/legion using invalid icon_state, "legion_core"
+2022-11-22T05:59:47.5469256Z 119 - /obj/item/organ/internal/monster_core/rush_gland using invalid icon_state, "lobster_gland"
+2022-11-22T05:59:47.5479181Z 120 - /obj/item/spear/bamboospear using invalid icon_state, "bamboo_spear0"
+2022-11-22T05:59:47.5517467Z 121 - /obj/item/abductor/gizmo using invalid icon_state, "gizmo_scan"
+2022-11-22T05:59:47.5518755Z 122 - /obj/item/abductor/silencer using invalid icon_state, "silencer"
+2022-11-22T05:59:47.5521102Z 123 - /obj/item/abductor/mind_device using invalid icon_state, "mind_device_message"
+2022-11-22T05:59:47.5536484Z 124 - /obj/item/claymore/cutlass using invalid worn_icon_state, "cutlass"
+2022-11-22T05:59:47.5540915Z 125 - /obj/item/claymore/highlander/robot using invalid icon_state, "claymore_cyborg"
+2022-11-22T05:59:47.5543262Z 126 - /obj/item/banner using invalid icon_state, "banner"
+2022-11-22T05:59:47.5545809Z 127 - /obj/item/banner/security using invalid icon_state, "banner_security"
+2022-11-22T05:59:47.5548315Z 128 - /obj/item/banner/medical using invalid icon_state, "banner_medical"
+2022-11-22T05:59:47.5550843Z 129 - /obj/item/banner/science using invalid icon_state, "banner_science"
+2022-11-22T05:59:47.5553341Z 130 - /obj/item/banner/cargo using invalid icon_state, "banner_cargo"
+2022-11-22T05:59:47.5555871Z 131 - /obj/item/banner/engineering using invalid icon_state, "banner_engineering"
+2022-11-22T05:59:47.5558379Z 132 - /obj/item/banner/red using invalid icon_state, "banner-red"
+2022-11-22T05:59:47.5560854Z 133 - /obj/item/banner/blue using invalid icon_state, "banner-blue"
+2022-11-22T05:59:47.5597308Z 134 - /obj/item/gun/magic/staff using invalid icon_state, "staff"
+2022-11-22T05:59:47.5598624Z 135 - /obj/item/gun/magic/staff/change using invalid icon_state, "staffofchange"
+2022-11-22T05:59:47.5601122Z 136 - /obj/item/gun/magic/staff/animate using invalid icon_state, "staffofanimation"
+2022-11-22T05:59:47.5603650Z 137 - /obj/item/gun/magic/staff/healing using invalid icon_state, "staffofhealing"
+2022-11-22T05:59:47.5606162Z 138 - /obj/item/gun/magic/staff/chaos using invalid icon_state, "staffofchaos"
+2022-11-22T05:59:47.5608674Z 139 - /obj/item/gun/magic/staff/door using invalid icon_state, "staffofdoor"
+2022-11-22T05:59:47.5611329Z 140 - /obj/item/gun/magic/staff/honk using invalid icon_state, "honker"
+2022-11-22T05:59:47.5616211Z 141 - /obj/item/gun/magic/staff/locker using invalid worn_icon_state, "lockerstaff"
+2022-11-22T05:59:47.5618590Z 142 - /obj/item/gun/magic/staff/flying using invalid worn_icon_state, "flightstaff"
+2022-11-22T05:59:47.5621083Z 143 - /obj/item/gun/magic/staff/babel using invalid worn_icon_state, "babelstaff"
+2022-11-22T05:59:47.5623626Z 144 - /obj/item/gun/magic/staff/necropotence using invalid worn_icon_state, "necrostaff"
+2022-11-22T05:59:47.5626131Z 145 - /obj/item/gun/magic/staff/wipe using invalid worn_icon_state, "wipestaff"
+2022-11-22T05:59:47.5643345Z 146 - /obj/item/melee/energy/sword/pirate using invalid icon_state, "e_cutlass"
+2022-11-22T05:59:47.5645538Z 147 - /obj/item/clothing/glasses/eyepatch using invalid icon_state, "eyepatch"
+2022-11-22T05:59:47.5650375Z 148 - /obj/item/melee/energy/sword/cyborg/saw using invalid icon_state, "esaw"
+2022-11-22T05:59:47.5661667Z 149 - /obj/item/tank/jetpack/improvised using invalid worn_icon_state, "jetpack-improvised"
+2022-11-22T05:59:47.5667402Z 150 - /obj/item/multitool using invalid icon_state, "multitool"
+2022-11-22T05:59:47.5669936Z 151 - /obj/item/multitool/cyborg using invalid icon_state, "multitool_cyborg"
+2022-11-22T05:59:47.5672485Z 152 - /obj/item/multitool/circuit using invalid icon_state, "multitool_circuit"
+2022-11-22T05:59:47.5675177Z 153 - /obj/item/pillow using invalid icon_state, "pillow_1_t"
+2022-11-22T05:59:47.5677618Z 154 - /obj/item/pillow/clown using invalid icon_state, "pillow_5_t"
+2022-11-22T05:59:47.5680084Z 155 - /obj/item/pillow/mime using invalid icon_state, "pillow_6_t"
+2022-11-22T05:59:47.5682788Z 156 - /obj/item/storage/bag/trash using invalid icon_state, "trashbag"
+2022-11-22T05:59:47.5685228Z 157 - /obj/item/storage/bag/trash/bluespace using invalid icon_state, "bluetrashbag"
+2022-11-22T05:59:47.5687673Z 158 - /obj/item/cane using invalid icon_state, "cane"
+2022-11-22T05:59:47.5690323Z 159 - /obj/item/cane/white using invalid icon_state, "cane_white"
+2022-11-22T05:59:47.5692922Z 160 - /obj/item/megaphone/clown using invalid icon_state, "megaphone-clown"
+2022-11-22T05:59:47.5711035Z 161 - /obj/item/food/pie/cream using invalid icon_state, "pie"
+2022-11-22T05:59:47.5722637Z 162 - /obj/item/instrument/bikehorn using invalid icon_state, "bike_horn"
+2022-11-22T05:59:47.5724979Z 163 - /obj/item/reagent_containers/cup/soda_cans/canned_laughter using invalid icon_state, "laughter"
+2022-11-22T05:59:47.5740550Z 164 - /obj/item/grown/bananapeel using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5741267Z 165 - /obj/item/grown/bananapeel/bombanana using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5741975Z 166 - /obj/item/grown/bananapeel/mimanapeel using invalid icon_state, "mimana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5742678Z 167 - /obj/item/grown/bananapeel/bluespace using invalid icon_state, "bluenana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5743387Z 168 - /obj/item/grown/bananapeel/specialpeel using invalid icon_state, "banana_peel" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5744054Z 169 - /obj/item/food/grown/banana using invalid icon_state, "banana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5744727Z 170 - /obj/item/food/grown/banana/bombanana using invalid icon_state, "banana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5745395Z 171 - /obj/item/food/grown/banana/mime using invalid icon_state, "mimana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5746068Z 172 - /obj/item/food/grown/banana/bluespace using invalid icon_state, "bluenana" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5746753Z 173 - /obj/item/food/grown/banana/bunch using invalid icon_state, "banana_bunch" in worn_icon override file, 'icons/mob/clothing/head/hydroponics.dmi'
+2022-11-22T05:59:47.5748235Z 174 - /obj/item/stack/spacecash/c1 using invalid icon_state, "spacecash1"
+2022-11-22T05:59:47.5749552Z 175 - /obj/item/stack/spacecash/c10 using invalid icon_state, "spacecash10"
+2022-11-22T05:59:47.5750858Z 176 - /obj/item/stack/spacecash/c20 using invalid icon_state, "spacecash20"
+2022-11-22T05:59:47.5752155Z 177 - /obj/item/stack/spacecash/c50 using invalid icon_state, "spacecash50"
+2022-11-22T05:59:47.5754575Z 178 - /obj/item/stack/spacecash/c100 using invalid icon_state, "spacecash100"
+2022-11-22T05:59:47.5758018Z 179 - /obj/item/stack/spacecash/c200 using invalid icon_state, "spacecash200"
+2022-11-22T05:59:47.5759981Z 180 - /obj/item/stack/spacecash/c500 using invalid icon_state, "spacecash500"
+2022-11-22T05:59:47.5763153Z 181 - /obj/item/stack/spacecash/c1000 using invalid icon_state, "spacecash1000"
+2022-11-22T05:59:47.5765191Z 182 - /obj/item/stack/spacecash/c10000 using invalid icon_state, "spacecash10000"
+2022-11-22T05:59:47.5768449Z 183 - /obj/item/clothing/mask/facehugger/toy using invalid worn_icon_state, "facehugger"
+2022-11-22T05:59:47.5777399Z 184 - /obj/item/kitchen/fork using invalid icon_state, "fork"
+2022-11-22T05:59:47.5779609Z 185 - /obj/item/kitchen/fork/plastic using invalid icon_state, "plastic_fork"
+2022-11-22T05:59:47.5786931Z 186 - /obj/item/kitchen/spoon using invalid icon_state, "spoon"
+2022-11-22T05:59:47.5788816Z 187 - /obj/item/kitchen/spoon/plastic using invalid icon_state, "plastic_spoon"
+2022-11-22T05:59:47.5796132Z 188 - /obj/item/bonesetter using invalid icon_state, "bonesetter"
+2022-11-22T05:59:47.5798117Z 189 - /obj/item/cautery using invalid icon_state, "cautery"
+2022-11-22T05:59:47.5801358Z 190 - /obj/item/cautery/advanced using invalid icon_state, "e_cautery"
+2022-11-22T05:59:47.5803355Z 191 - /obj/item/hemostat using invalid icon_state, "hemostat"
+2022-11-22T05:59:47.5806562Z 192 - /obj/item/hemostat/supermatter using invalid icon_state, "supermatter_tongs"
+2022-11-22T05:59:47.5808614Z 193 - /obj/item/retractor using invalid icon_state, "retractor"
+2022-11-22T05:59:47.5811999Z 194 - /obj/item/retractor/advanced using invalid icon_state, "adv_retractor"
+2022-11-22T05:59:47.5814490Z 195 - /obj/item/scalpel using invalid icon_state, "scalpel"
+2022-11-22T05:59:47.5817072Z 196 - /obj/item/scalpel/supermatter using invalid icon_state, "supermatter_scalpel"
+2022-11-22T05:59:47.5820120Z 197 - /obj/item/scalpel/advanced using invalid icon_state, "e_scalpel"
+2022-11-22T05:59:47.5822112Z 198 - /obj/item/surgical_drapes using invalid icon_state, "surgical_drapes"
+2022-11-22T05:59:47.5826686Z 199 - /obj/item/stack/medical/bruise_pack using invalid icon_state, "brutepack"
+2022-11-22T05:59:47.5829169Z 200 - /obj/item/stack/medical/gauze using invalid icon_state, "gauze"
+2022-11-22T05:59:47.5831713Z 201 - /obj/item/stack/medical/suture using invalid icon_state, "suture"
+2022-11-22T05:59:47.5834293Z 202 - /obj/item/stack/medical/suture/medicated using invalid icon_state, "suture_purp"
+2022-11-22T05:59:47.5836945Z 203 - /obj/item/stack/medical/ointment using invalid icon_state, "ointment"
+2022-11-22T05:59:47.5839365Z 204 - /obj/item/stack/medical/mesh using invalid icon_state, "regen_mesh"
+2022-11-22T05:59:47.5841890Z 205 - /obj/item/stack/medical/mesh/advanced using invalid icon_state, "aloe_mesh"
+2022-11-22T05:59:47.5844397Z 206 - /obj/item/stack/medical/aloe using invalid icon_state, "aloe_paste"
+2022-11-22T05:59:47.5846906Z 207 - /obj/item/stack/medical/bone_gel using invalid icon_state, "bone-gel"
+2022-11-22T05:59:47.5849452Z 208 - /obj/item/stack/medical/poultice using invalid icon_state, "poultice"
+2022-11-22T05:59:47.5852140Z 209 - /obj/item/assembly/flash/handheld using invalid icon_state, "flash"
+2022-11-22T05:59:47.5854699Z 210 - /obj/item/clothing/mask/cigarette using invalid icon_state, "cigoff"
+2022-11-22T05:59:47.5857377Z 211 - /obj/item/clothing/mask/cigarette/rollie using invalid icon_state, "spliffoff"
+2022-11-22T05:59:47.5859944Z 212 - /obj/item/clothing/mask/cigarette/candy using invalid icon_state, "candyoff"
+2022-11-22T05:59:47.5862552Z 213 - /obj/item/clothing/mask/cigarette/cigar using invalid icon_state, "cigaroff"
+2022-11-22T05:59:47.5865143Z 214 - /obj/item/clothing/mask/cigarette/cigar/cohiba using invalid icon_state, "cigar2off"
+2022-11-22T05:59:47.5867644Z 215 - /obj/item/clothing/mask/cigarette/pipe using invalid icon_state, "pipeoff"
+2022-11-22T05:59:47.5870191Z 216 - /obj/item/clothing/mask/cigarette/pipe/cobpipe using invalid icon_state, "cobpipeoff"
+2022-11-22T05:59:47.5872621Z 217 - /obj/item/disk using invalid icon_state, "datadisk0"
+2022-11-22T05:59:47.5875148Z 218 - /obj/item/disk/holodisk using invalid icon_state, "holodisk"
+2022-11-22T05:59:47.5877898Z 219 - /obj/item/disk/nuclear using invalid icon_state, "nucleardisk"
+2022-11-22T05:59:47.5880496Z 220 - /obj/item/disk/surgery using invalid icon_state, "datadisk1"
+2022-11-22T05:59:47.5883119Z 221 - /obj/item/disk/cargo/bluespace_pod using invalid icon_state, "cargodisk"
+2022-11-22T05:59:47.5885955Z 222 - /obj/item/disk/tech_disk/major using invalid icon_state, "rndmajordisk"
+2022-11-22T05:59:47.5888500Z 223 - /obj/item/melee/powerfist using invalid icon_state, "powerfist"
+2022-11-22T05:59:47.5897706Z 224 - /obj/item/melee/skateboard using invalid icon_state, "skateboard"
+2022-11-22T05:59:47.5899984Z 225 - /obj/item/melee/skateboard/pro using invalid icon_state, "skateboard2"
+2022-11-22T05:59:47.5902460Z 226 - /obj/item/melee/skateboard/hoverboard using invalid icon_state, "hoverboard_red"
+2022-11-22T05:59:47.5904690Z 227 - /obj/item/melee/skateboard/hoverboard/admin using invalid icon_state, "hoverboard_nt"
+2022-11-22T05:59:47.5907845Z 228 - /obj/item/melee/baseball_bat using invalid icon_state, "baseball_bat"
+2022-11-22T05:59:47.5910306Z 229 - /obj/item/melee/baseball_bat/homerun using invalid icon_state, "baseball_bat_home"
+2022-11-22T05:59:47.5912836Z 230 - /obj/item/melee/baseball_bat/ablative using invalid icon_state, "baseball_bat_metal"
+2022-11-22T05:59:47.5915302Z 231 - /obj/item/melee/flyswatter using invalid icon_state, "flyswatter"
+2022-11-22T05:59:47.5919886Z 232 - /obj/item/melee/energy/axe using invalid icon_state, "axe"
+2022-11-22T05:59:47.5922388Z 233 - /obj/item/melee/energy/blade using invalid icon_state, "blade"
+2022-11-22T05:59:47.5924922Z 234 - /obj/item/melee/energy/blade/hardlight using invalid icon_state, "lightblade"
+2022-11-22T05:59:47.5927400Z 235 - /obj/item/melee/synthetic_arm_blade using invalid icon_state, "arm_blade"
+2022-11-22T05:59:47.5929855Z 236 - /obj/item/melee/sabre using invalid icon_state, "sabre"
+2022-11-22T05:59:47.5932585Z 237 - /obj/item/melee/beesword using invalid worn_icon_state, "stinger"
+2022-11-22T05:59:47.5935177Z 238 - /obj/item/melee/supermatter_sword using invalid icon_state, "supermatter_sword"
+2022-11-22T05:59:47.5941969Z 239 - /obj/item/melee/cleric_mace using invalid worn_icon_state, "default_worn"
+2022-11-22T05:59:47.5944403Z 240 - /obj/item/melee/rune_carver using invalid icon_state, "rune_carver"
+2022-11-22T05:59:47.5946893Z 241 - /obj/item/melee/ghost_sword using invalid icon_state, "spectral"
+2022-11-22T05:59:47.5949437Z 242 - /obj/item/reagent_containers/cup/glass/flask using invalid icon_state, "flask"
+2022-11-22T05:59:47.5951947Z 243 - /obj/item/reagent_containers/cup/glass/flask/gold using invalid icon_state, "flask_gold"
+2022-11-22T05:59:47.5954470Z 244 - /obj/item/reagent_containers/cup/glass/flask/det using invalid icon_state, "detflask"
+2022-11-22T05:59:47.5956926Z 245 - /obj/item/stamp using invalid icon_state, "stamp-ok"
+2022-11-22T05:59:47.5959499Z 246 - /obj/item/stamp/qm using invalid icon_state, "stamp-qm"
+2022-11-22T05:59:47.5962007Z 247 - /obj/item/stamp/law using invalid icon_state, "stamp-law"
+2022-11-22T05:59:47.5964537Z 248 - /obj/item/stamp/captain using invalid icon_state, "stamp-cap"
+2022-11-22T05:59:47.5967023Z 249 - /obj/item/stamp/hop using invalid icon_state, "stamp-hop"
+2022-11-22T05:59:47.5969512Z 250 - /obj/item/stamp/hos using invalid icon_state, "stamp-hos"
+2022-11-22T05:59:47.5972211Z 251 - /obj/item/stamp/ce using invalid icon_state, "stamp-ce"
+2022-11-22T05:59:47.5974735Z 252 - /obj/item/stamp/rd using invalid icon_state, "stamp-rd"
+2022-11-22T05:59:47.5977316Z 253 - /obj/item/stamp/cmo using invalid icon_state, "stamp-cmo"
+2022-11-22T05:59:47.5979863Z 254 - /obj/item/stamp/denied using invalid icon_state, "stamp-deny"
+2022-11-22T05:59:47.5982340Z 255 - /obj/item/stamp/void using invalid icon_state, "stamp-void"
+2022-11-22T05:59:47.5984839Z 256 - /obj/item/stamp/clown using invalid icon_state, "stamp-clown"
+2022-11-22T05:59:47.5987328Z 257 - /obj/item/stamp/mime using invalid icon_state, "stamp-mime"
+2022-11-22T05:59:47.5989790Z 258 - /obj/item/stamp/chap using invalid icon_state, "stamp-chap"
+2022-11-22T05:59:47.5992332Z 259 - /obj/item/stamp/centcom using invalid icon_state, "stamp-centcom"
+2022-11-22T05:59:47.5994835Z 260 - /obj/item/stamp/syndicate using invalid icon_state, "stamp-syndicate"
+2022-11-22T05:59:47.5999537Z 261 - /obj/item/storage/lockbox/medal using invalid icon_state, "medalbox+l"
+2022-11-22T05:59:47.6006307Z 262 - /obj/item/crowbar/red/caravan using invalid icon_state, "crowbar_caravan"
+2022-11-22T05:59:47.6026916Z 263 - /obj/item/crowbar/mechremoval using invalid icon_state, "mechremoval0"
+2022-11-22T05:59:47.6027464Z 264 - /obj/item/crowbar/drone using invalid icon_state, "crowbar_cyborg"
+2022-11-22T05:59:47.6045435Z
+2022-11-22T05:59:47.6045723Z [1;32mPASS[0m /datum/unit_test/suit_storage_icons 1.8s
+2022-11-22T05:59:47.6046285Z ##[endgroup]
+2022-11-22T05:59:49.3705818Z ##[group]/datum/unit_test/amputation
+2022-11-22T05:59:49.4134911Z
+2022-11-22T05:59:49.4135822Z [1;32mPASS[0m /datum/unit_test/amputation 0.1s
+2022-11-22T05:59:49.4136599Z ##[endgroup]
+2022-11-22T05:59:49.4382113Z ##[group]/datum/unit_test/brain_surgery
+2022-11-22T05:59:49.4804850Z
+2022-11-22T05:59:49.4805763Z [1;32mPASS[0m /datum/unit_test/brain_surgery 0s
+2022-11-22T05:59:49.4806504Z ##[endgroup]
+2022-11-22T05:59:49.5219202Z ##[group]/datum/unit_test/head_transplant
+2022-11-22T05:59:49.5928104Z
+2022-11-22T05:59:49.5929815Z [1;32mPASS[0m /datum/unit_test/head_transplant 0s
+2022-11-22T05:59:49.5933029Z ##[endgroup]
+2022-11-22T05:59:49.6712586Z ##[group]/datum/unit_test/multiple_surgeries
+2022-11-22T05:59:49.7356777Z
+2022-11-22T05:59:49.7357986Z [1;32mPASS[0m /datum/unit_test/multiple_surgeries 0.1s
+2022-11-22T05:59:49.7359539Z ##[endgroup]
+2022-11-22T05:59:49.7649974Z ##[group]/datum/unit_test/start_tend_wounds
+2022-11-22T05:59:49.8066946Z
+2022-11-22T05:59:49.8067917Z [1;32mPASS[0m /datum/unit_test/start_tend_wounds 0.1s
+2022-11-22T05:59:49.8068876Z ##[endgroup]
+2022-11-22T05:59:49.8487591Z ##[group]/datum/unit_test/tend_wounds
+2022-11-22T05:59:49.9400599Z
+2022-11-22T05:59:49.9401319Z [1;32mPASS[0m /datum/unit_test/tend_wounds 0.1s
+2022-11-22T05:59:49.9402005Z ##[endgroup]
+2022-11-22T05:59:50.0310912Z ##[group]/datum/unit_test/auto_teleporter_linking
+2022-11-22T05:59:50.0641967Z
+2022-11-22T05:59:50.0643714Z [1;32mPASS[0m /datum/unit_test/auto_teleporter_linking 0s
+2022-11-22T05:59:50.0647032Z ##[endgroup]
+2022-11-22T05:59:50.0823643Z ##[group]/datum/unit_test/tgui_create_message
+2022-11-22T05:59:50.0824184Z
+2022-11-22T05:59:50.0826702Z [1;32mPASS[0m /datum/unit_test/tgui_create_message 0s
+2022-11-22T05:59:50.0827332Z ##[endgroup]
+2022-11-22T05:59:50.0980740Z ##[group]/datum/unit_test/timer_sanity
+2022-11-22T05:59:50.0981184Z
+2022-11-22T05:59:50.0983576Z [1;32mPASS[0m /datum/unit_test/timer_sanity 0s
+2022-11-22T05:59:50.0984274Z ##[endgroup]
+2022-11-22T05:59:50.1136569Z ##[group]/datum/unit_test/traitor
+2022-11-22T05:59:51.5476276Z
+2022-11-22T05:59:51.5477028Z [1;32mPASS[0m /datum/unit_test/traitor 1.4s
+2022-11-22T05:59:51.5477682Z ##[endgroup]
+2022-11-22T05:59:53.7711821Z ##[group]/datum/unit_test/verify_config_tags
+2022-11-22T05:59:53.7714663Z
+2022-11-22T05:59:53.7716722Z [1;32mPASS[0m /datum/unit_test/verify_config_tags 0s
+2022-11-22T05:59:53.7718585Z ##[endgroup]
+2022-11-22T05:59:53.7880948Z ##[group]/datum/unit_test/verify_emoji_names
+2022-11-22T05:59:53.7883956Z
+2022-11-22T05:59:53.7885900Z [1;32mPASS[0m /datum/unit_test/verify_emoji_names 0s
+2022-11-22T05:59:53.7886813Z ##[endgroup]
+2022-11-22T05:59:53.8042437Z ##[group]/datum/unit_test/wizard_loadout
+2022-11-22T05:59:53.8966549Z
+2022-11-22T05:59:53.8967690Z [1;32mPASS[0m /datum/unit_test/wizard_loadout 0s
+2022-11-22T05:59:53.8971302Z ##[endgroup]
+2022-11-22T05:59:54.0341360Z ##[group]/datum/unit_test/find_reference_sanity
+2022-11-22T05:59:54.0343250Z
+2022-11-22T05:59:54.0344168Z [1;32mPASS[0m /datum/unit_test/find_reference_sanity 0s
+2022-11-22T05:59:54.0344973Z ##[endgroup]
+2022-11-22T05:59:54.0508234Z ##[group]/datum/unit_test/find_reference_baseline
+2022-11-22T05:59:54.0509845Z
+2022-11-22T05:59:54.0510616Z [1;32mPASS[0m /datum/unit_test/find_reference_baseline 0s
+2022-11-22T05:59:54.0511376Z ##[endgroup]
+2022-11-22T05:59:54.0666075Z ##[group]/datum/unit_test/find_reference_exotic
+2022-11-22T05:59:54.0667801Z
+2022-11-22T05:59:54.0668446Z [1;32mPASS[0m /datum/unit_test/find_reference_exotic 0s
+2022-11-22T05:59:54.0669104Z ##[endgroup]
+2022-11-22T05:59:54.0824375Z ##[group]/datum/unit_test/find_reference_esoteric
+2022-11-22T05:59:54.0827948Z
+2022-11-22T05:59:54.0828897Z [1;32mPASS[0m /datum/unit_test/find_reference_esoteric 0s
+2022-11-22T05:59:54.0831682Z ##[endgroup]
+2022-11-22T05:59:54.0985304Z ##[group]/datum/unit_test/find_reference_null_key_entry
+2022-11-22T05:59:54.0986412Z
+2022-11-22T05:59:54.0989135Z [1;32mPASS[0m /datum/unit_test/find_reference_null_key_entry 0s
+2022-11-22T05:59:54.0989794Z ##[endgroup]
+2022-11-22T05:59:54.1142690Z ##[group]/datum/unit_test/find_reference_assoc_investigation
+2022-11-22T05:59:54.1144882Z
+2022-11-22T05:59:54.1145600Z [1;32mPASS[0m /datum/unit_test/find_reference_assoc_investigation 0s
+2022-11-22T05:59:54.1146288Z ##[endgroup]
+2022-11-22T05:59:54.1488133Z ##[group]/datum/unit_test/find_reference_static_investigation
+2022-11-22T05:59:54.3399002Z
+2022-11-22T05:59:54.3403994Z [1;32mPASS[0m /datum/unit_test/find_reference_static_investigation 0.2s
+2022-11-22T05:59:54.3407766Z ##[endgroup]
+2022-11-22T05:59:54.5076371Z ##[group]/datum/unit_test/area_contents
+2022-11-22T05:59:55.8000804Z
+2022-11-22T05:59:55.8001526Z [1;32mPASS[0m /datum/unit_test/area_contents 1.2s
+2022-11-22T05:59:55.8002197Z ##[endgroup]
+2022-11-22T05:59:57.0666199Z ##[group]/datum/unit_test/mapload_space_verification
+2022-11-22T05:59:57.6160655Z
+2022-11-22T05:59:57.6161803Z [1;32mPASS[0m /datum/unit_test/mapload_space_verification 0.6s
+2022-11-22T05:59:57.6162718Z ##[endgroup]
+2022-11-22T05:59:58.1323397Z ##[group]/datum/unit_test/monkey_business
+2022-11-22T06:00:35.7184860Z
+2022-11-22T06:00:35.7185899Z [1;32mPASS[0m /datum/unit_test/monkey_business 37.6s
+2022-11-22T06:00:35.7186595Z ##[endgroup]
+2022-11-22T06:00:37.5877549Z ##[group]/datum/unit_test/create_and_destroy
+2022-11-22T06:05:59.0302461Z
+2022-11-22T06:05:59.0303736Z [1;32mPASS[0m /datum/unit_test/create_and_destroy 321.5s
+2022-11-22T06:05:59.0304705Z ##[endgroup]
+2022-11-22T06:05:59.0560174Z Shutting down Chat subsystem...
+2022-11-22T06:05:59.0560975Z Shutting down Init Profiler subsystem...
+2022-11-22T06:05:59.0561903Z Shutting down Ban Cache subsystem...
+2022-11-22T06:05:59.0562231Z Shutting down Stat Panels subsystem...
+2022-11-22T06:05:59.0562518Z Shutting down Explosions subsystem...
+2022-11-22T06:05:59.0562810Z Shutting down Pathfinder subsystem...
+2022-11-22T06:05:59.0563088Z Shutting down Minor Mapping subsystem...
+2022-11-22T06:05:59.0563534Z Shutting down Shuttle subsystem...
+2022-11-22T06:05:59.0565078Z Shutting down Lighting subsystem...
+2022-11-22T06:05:59.0566480Z Shutting down XKeyScore subsystem...
+2022-11-22T06:05:59.0567870Z Shutting down PRISM subsystem...
+2022-11-22T06:05:59.0569247Z Shutting down Icon Smoothing subsystem...
+2022-11-22T06:05:59.0570863Z Shutting down Assets subsystem...
+2022-11-22T06:05:59.0572220Z Shutting down Vote subsystem...
+2022-11-22T06:05:59.0573617Z Shutting down Persistent Paintings subsystem...
+2022-11-22T06:05:59.0575023Z Shutting down Persistence subsystem...
+2022-11-22T06:05:59.0576420Z Shutting down Atmospherics subsystem...
+2022-11-22T06:05:59.0577826Z Shutting down Wiremod Composite Templates subsystem...
+2022-11-22T06:05:59.0579235Z Shutting down Wet floors subsystem...
+2022-11-22T06:05:59.0580595Z Shutting down Weather subsystem...
+2022-11-22T06:05:59.0581983Z Shutting down Wardrobe subsystem...
+2022-11-22T06:05:59.0583357Z Shutting down Verb Manager subsystem...
+2022-11-22T06:05:59.0584713Z Shutting down Tram Process subsystem...
+2022-11-22T06:05:59.0586074Z Shutting down Traitor subsystem...
+2022-11-22T06:05:59.0587442Z Shutting down Throwing subsystem...
+2022-11-22T06:05:59.0588806Z Shutting down tgui subsystem...
+2022-11-22T06:05:59.0590275Z Shutting down Supermatter Cascade subsystem...
+2022-11-22T06:05:59.0591689Z Shutting down Sun subsystem...
+2022-11-22T06:05:59.0593206Z Shutting down Speech Controller subsystem...
+2022-11-22T06:05:59.0594635Z Shutting down Space Drift subsystem...
+2022-11-22T06:05:59.0596040Z Shutting down Smoke subsystem...
+2022-11-22T06:05:59.0597460Z Shutting down Singularity subsystem...
+2022-11-22T06:05:59.0598856Z Shutting down Radio subsystem...
+2022-11-22T06:05:59.0600239Z Shutting down Radiation subsystem...
+2022-11-22T06:05:59.0601840Z Shutting down Projectiles subsystem...
+2022-11-22T06:05:59.0603292Z Shutting down Processing subsystem...
+2022-11-22T06:05:59.0604868Z Shutting down Points of Interest subsystem...
+2022-11-22T06:05:59.0606290Z Shutting down Plumbing subsystem...
+2022-11-22T06:05:59.0607708Z Shutting down Ping subsystem...
+2022-11-22T06:05:59.0609094Z Shutting down Parallax subsystem...
+2022-11-22T06:05:59.0611351Z Shutting down pAI subsystem...
+2022-11-22T06:05:59.0611677Z Shutting down Overlay subsystem...
+2022-11-22T06:05:59.3302992Z Shutting down Objects subsystem...
+2022-11-22T06:05:59.3303354Z Shutting down Obj Tab Items subsystem...
+2022-11-22T06:05:59.3303683Z Shutting down NPC Pool subsystem...
+2022-11-22T06:05:59.3303994Z Shutting down Night Shift subsystem...
+2022-11-22T06:05:59.3304320Z Shutting down Movement Loops subsystem...
+2022-11-22T06:05:59.3304653Z Shutting down Movement Handler subsystem...
+2022-11-22T06:05:59.3304967Z Shutting down MouseEntered subsystem...
+2022-11-22T06:05:59.3305289Z Shutting down Mood subsystem...
+2022-11-22T06:05:59.3305578Z Shutting down Mobs subsystem...
+2022-11-22T06:05:59.3305883Z Shutting down Materials subsystem...
+2022-11-22T06:05:59.3306202Z Shutting down Lua Scripting subsystem...
+2022-11-22T06:05:59.3460713Z Shutting down Library Loading subsystem...
+2022-11-22T06:05:59.3461033Z Shutting down Lag Switch subsystem...
+2022-11-22T06:05:59.3461327Z Shutting down Idling NPC Pool subsystem...
+2022-11-22T06:05:59.3461603Z Shutting down Foam subsystem...
+2022-11-22T06:05:59.3461857Z Shutting down Fluid subsystem...
+2022-11-22T06:05:59.3462121Z Shutting down Fire Burning subsystem...
+2022-11-22T06:05:59.3462392Z Shutting down Fast Processing subsystem...
+2022-11-22T06:05:59.3462673Z Shutting down Eigenstates subsystem...
+2022-11-22T06:05:59.3462939Z Shutting down Disease subsystem...
+2022-11-22T06:05:59.3463226Z Shutting down Datum Component System subsystem...
+2022-11-22T06:05:59.3463522Z Shutting down Conveyor Belts subsystem...
+2022-11-22T06:05:59.3463807Z Shutting down Communications subsystem...
+2022-11-22T06:05:59.3464096Z Shutting down Clock Component subsystem...
+2022-11-22T06:05:59.3464398Z Shutting down Circuit Components subsystem...
+2022-11-22T06:05:59.3464683Z Shutting down Blackmarket subsystem...
+2022-11-22T06:05:59.3464965Z Shutting down Basic Avoidance subsystem...
+2022-11-22T06:05:59.3465243Z Shutting down Aura Healing subsystem...
+2022-11-22T06:05:59.3465499Z Shutting down Augury subsystem...
+2022-11-22T06:05:59.3465766Z Shutting down Asset Loading subsystem...
+2022-11-22T06:05:59.3466047Z Shutting down Area Contents subsystem...
+2022-11-22T06:05:59.3466317Z Shutting down Antag HUDs subsystem...
+2022-11-22T06:05:59.3466583Z Shutting down Ambience subsystem...
+2022-11-22T06:05:59.3466879Z Shutting down Addiction subsystem...
+2022-11-22T06:05:59.3467142Z Shutting down Acid subsystem...
+2022-11-22T06:05:59.3467393Z Shutting down Timer subsystem...
+2022-11-22T06:05:59.3467655Z Shutting down Sound Loops subsystem...
+2022-11-22T06:05:59.3467925Z Shutting down Runechat subsystem...
+2022-11-22T06:05:59.3468169Z Shutting down Skills subsystem...
+2022-11-22T06:05:59.3468430Z Shutting down Machines subsystem...
+2022-11-22T06:05:59.3468688Z Shutting down Language subsystem...
+2022-11-22T06:05:59.3468945Z Shutting down Atoms subsystem...
+2022-11-22T06:05:59.3498456Z Shutting down Restaurant subsystem...
+2022-11-22T06:05:59.3498741Z Shutting down Economy subsystem...
+2022-11-22T06:05:59.3499019Z Shutting down Spatial Grid subsystem...
+2022-11-22T06:05:59.3499293Z Shutting down Networks subsystem...
+2022-11-22T06:05:59.3499567Z Shutting down Time Tracking subsystem...
+2022-11-22T06:05:59.3499837Z Shutting down Research subsystem...
+2022-11-22T06:05:59.3500105Z Shutting down Early Assets subsystem...
+2022-11-22T06:05:59.3500360Z Shutting down Mapping subsystem...
+2022-11-22T06:05:59.3500639Z Shutting down Trading Card Game subsystem...
+2022-11-22T06:05:59.3500911Z Shutting down Ticker subsystem...
+2022-11-22T06:05:59.3510965Z Unable to locate admins backup file.
+2022-11-22T06:05:59.3520958Z Shutting down AI Controller Ticker subsystem...
+2022-11-22T06:05:59.3521311Z Shutting down AI Behavior Ticker subsystem...
+2022-11-22T06:05:59.3521671Z Shutting down AI movement subsystem...
+2022-11-22T06:05:59.3521947Z Shutting down Jobs subsystem...
+2022-11-22T06:05:59.3522221Z Shutting down IDs and Access subsystem...
+2022-11-22T06:05:59.3522494Z Shutting down Events subsystem...
+2022-11-22T06:05:59.3522763Z Shutting down Reagents subsystem...
+2022-11-22T06:05:59.3523011Z Shutting down Quirks subsystem...
+2022-11-22T06:05:59.3523274Z Shutting down Station subsystem...
+2022-11-22T06:05:59.3523543Z Shutting down Achievements subsystem...
+2022-11-22T06:05:59.3523814Z Shutting down Discord subsystem...
+2022-11-22T06:05:59.3524084Z Shutting down Security Level subsystem...
+2022-11-22T06:05:59.3524367Z Shutting down Vis contents overlays subsystem...
+2022-11-22T06:05:59.3524654Z Shutting down Greyscale subsystem...
+2022-11-22T06:05:59.3524926Z Shutting down Instruments subsystem...
+2022-11-22T06:05:59.3525192Z Shutting down Sounds subsystem...
+2022-11-22T06:05:59.3525449Z Shutting down Input subsystem...
+2022-11-22T06:05:59.3525704Z Shutting down Server Tasks subsystem...
+2022-11-22T06:05:59.3525973Z Shutting down Blackbox subsystem...
+2022-11-22T06:05:59.3532540Z Shutting down Database subsystem...
+2022-11-22T06:05:59.3536259Z Shutting down Garbage subsystem...
+2022-11-22T06:06:02.5929884Z Shutting down Title Screen subsystem...
+2022-11-22T06:06:02.5938646Z Shutting down Profiler subsystem...
+2022-11-22T06:06:02.5938959Z Shutdown complete
+2022-11-22T06:06:02.5939212Z Test run failed!
+2022-11-22T06:06:02.5939464Z Unit Tests failed!
+2022-11-22T06:06:05.8501499Z cat: ci_test/data/logs/ci/clean_run.lk: No such file or directory
+2022-11-22T06:06:05.8510694Z ##[error]Process completed with exit code 1.
+2022-11-22T06:06:05.8571091Z ##[group]Run actions/upload-artifact@v3
+2022-11-22T06:06:05.8571371Z with:
+2022-11-22T06:06:05.8571578Z name: test_artifacts_metastation
+2022-11-22T06:06:05.8571829Z path: data/screenshots_new/
+2022-11-22T06:06:05.8572069Z retention-days: 1
+2022-11-22T06:06:05.8572302Z if-no-files-found: warn
+2022-11-22T06:06:05.8572537Z ##[endgroup]
+2022-11-22T06:06:05.9542976Z With the provided path, there will be 85 files uploaded
+2022-11-22T06:06:05.9547799Z Starting artifact upload
+2022-11-22T06:06:05.9548728Z For more detailed logs during the artifact upload process, enable step-debugging: https://docs.github.com/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging#enabling-step-debug-logging
+2022-11-22T06:06:05.9549251Z Artifact name is valid!
+2022-11-22T06:06:06.0022749Z Container for artifact "test_artifacts_metastation" successfully created. Starting upload of file(s)
+2022-11-22T06:06:09.2441638Z Total size of all the files uploaded is 138917 bytes
+2022-11-22T06:06:09.2447148Z File upload process has finished. Finalizing the artifact upload
+2022-11-22T06:06:09.2805430Z Artifact has been finalized. All files have been successfully uploaded!
+2022-11-22T06:06:09.2806662Z
+2022-11-22T06:06:09.2807159Z The raw size of all the files that were specified for upload is 139272 bytes
+2022-11-22T06:06:09.2807708Z The size of all the files that were uploaded is 138917 bytes. This takes into account any gzip compression used to reduce the upload size, time and storage
+2022-11-22T06:06:09.2808041Z
+2022-11-22T06:06:09.2808979Z Note: The size of downloaded zips can differ significantly from the reported size. For more information see: https://github.com/actions/upload-artifact#zipped-artifact-downloads
+2022-11-22T06:06:09.2809397Z
+2022-11-22T06:06:09.2812047Z Artifact test_artifacts_metastation has been successfully uploaded!
+2022-11-22T06:06:09.2918500Z Post job cleanup.
+2022-11-22T06:06:09.4177546Z [command]/usr/bin/git version
+2022-11-22T06:06:09.4226862Z git version 2.38.1
+2022-11-22T06:06:09.4272386Z Temporarily overriding HOME='/home/runner/work/_temp/3651e392-e3ad-4441-afa8-7ee48fcb17c5' before making global git config changes
+2022-11-22T06:06:09.4273477Z Adding repository directory to the temporary git global config as a safe directory
+2022-11-22T06:06:09.4278058Z [command]/usr/bin/git config --global --add safe.directory /home/runner/work/tgstation/tgstation
+2022-11-22T06:06:09.4318612Z [command]/usr/bin/git config --local --name-only --get-regexp core\.sshCommand
+2022-11-22T06:06:09.4355928Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'core\.sshCommand' && git config --local --unset-all 'core.sshCommand' || :
+2022-11-22T06:06:09.4604637Z [command]/usr/bin/git config --local --name-only --get-regexp http\.https\:\/\/github\.com\/\.extraheader
+2022-11-22T06:06:09.4633829Z http.https://github.com/.extraheader
+2022-11-22T06:06:09.4644074Z [command]/usr/bin/git config --local --unset-all http.https://github.com/.extraheader
+2022-11-22T06:06:09.4679820Z [command]/usr/bin/git submodule foreach --recursive git config --local --name-only --get-regexp 'http\.https\:\/\/github\.com\/\.extraheader' && git config --local --unset-all 'http.https://github.com/.extraheader' || :
+2022-11-22T06:06:09.5065985Z Print service container logs: 57e9ed27eab042ee8653063f2a3e4b8e_mysqllatest_56fbdc
+2022-11-22T06:06:09.5071674Z ##[command]/usr/bin/docker logs --details 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T06:06:09.5286568Z 2022-11-22T05:53:56.868118Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-11-22T06:06:09.5287137Z 2022-11-22 05:53:56+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
+2022-11-22T06:06:09.5287504Z 2022-11-22 05:53:56+00:00 [Note] [Entrypoint]: Switching to dedicated user 'mysql'
+2022-11-22T06:06:09.5287896Z 2022-11-22 05:53:56+00:00 [Note] [Entrypoint]: Entrypoint script for MySQL Server 8.0.31-1.el8 started.
+2022-11-22T06:06:09.5288258Z 2022-11-22 05:53:56+00:00 [Note] [Entrypoint]: Initializing database files
+2022-11-22T06:06:09.5289019Z 2022-11-22T05:53:56.868208Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.31) initializing of server in progress as process 81
+2022-11-22T06:06:09.5289439Z 2022-11-22 05:54:00+00:00 [Note] [Entrypoint]: Database files initialized
+2022-11-22T06:06:09.5289930Z 2022-11-22T05:53:56.874552Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-11-22T06:06:09.5290557Z 2022-11-22 05:54:00+00:00 [Note] [Entrypoint]: Starting temporary server
+2022-11-22T06:06:09.5291047Z 2022-11-22T05:53:57.197629Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-11-22T06:06:09.5291408Z 2022-11-22 05:54:00+00:00 [Note] [Entrypoint]: Temporary server started.
+2022-11-22T06:06:09.5291988Z 2022-11-22T05:53:58.200181Z 6 [Warning] [MY-010453] [Server] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.
+2022-11-22T06:06:09.5292452Z '/var/lib/mysql/mysql.sock' -> '/var/run/mysqld/mysqld.sock'
+2022-11-22T06:06:09.5293070Z 2022-11-22T05:54:00.332994Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-11-22T06:06:09.5293480Z
+2022-11-22T06:06:09.5293901Z 2022-11-22T05:54:00.334950Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 130
+2022-11-22T06:06:09.5294357Z 2022-11-22 05:54:02+00:00 [Note] [Entrypoint]: Stopping temporary server
+2022-11-22T06:06:09.5294846Z 2022-11-22T05:54:00.346343Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-11-22T06:06:09.5295201Z 2022-11-22 05:54:03+00:00 [Note] [Entrypoint]: Temporary server stopped
+2022-11-22T06:06:09.5295682Z 2022-11-22T05:54:00.487954Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-11-22T06:06:09.5295962Z
+2022-11-22T06:06:09.5296368Z 2022-11-22T05:54:00.674850Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2022-11-22T06:06:09.5296761Z 2022-11-22 05:54:03+00:00 [Note] [Entrypoint]: MySQL init process done. Ready for start up.
+2022-11-22T06:06:09.5297625Z 2022-11-22T05:54:00.674889Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2022-11-22T06:06:09.5297989Z
+2022-11-22T06:06:09.5298506Z 2022-11-22T05:54:00.677758Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2022-11-22T06:06:09.5299158Z 2022-11-22T05:54:00.693697Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: /var/run/mysqld/mysqlx.sock
+2022-11-22T06:06:09.5299767Z 2022-11-22T05:54:00.694297Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 0 MySQL Community Server - GPL.
+2022-11-22T06:06:09.5300346Z Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it.
+2022-11-22T06:06:09.5300968Z Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it.
+2022-11-22T06:06:09.5301453Z Warning: Unable to load '/usr/share/zoneinfo/tzdata.zi' as time zone. Skipping it.
+2022-11-22T06:06:09.5301932Z Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
+2022-11-22T06:06:09.5302399Z Warning: Unable to load '/usr/share/zoneinfo/zone1970.tab' as time zone. Skipping it.
+2022-11-22T06:06:09.5302918Z 2022-11-22T05:54:02.435269Z 10 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.31).
+2022-11-22T06:06:09.5303480Z 2022-11-22T05:54:03.189926Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.31) MySQL Community Server - GPL.
+2022-11-22T06:06:09.5304121Z 2022-11-22T05:54:03.676610Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
+2022-11-22T06:06:09.5304722Z 2022-11-22T05:54:03.678566Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.31) starting as process 1
+2022-11-22T06:06:09.5305204Z 2022-11-22T05:54:03.685173Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
+2022-11-22T06:06:09.5305655Z 2022-11-22T05:54:03.828263Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
+2022-11-22T06:06:09.5306116Z 2022-11-22T05:54:03.993458Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
+2022-11-22T06:06:09.5306666Z 2022-11-22T05:54:03.993495Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
+2022-11-22T06:06:09.5307354Z 2022-11-22T05:54:03.994531Z 0 [Warning] [MY-011810] [Server] Insecure configuration for --pid-file: Location '/var/run/mysqld' in the path is accessible to all OS users. Consider choosing a different directory.
+2022-11-22T06:06:09.5308031Z 2022-11-22T05:54:04.011801Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
+2022-11-22T06:06:09.5308675Z 2022-11-22T05:54:04.011928Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.31' socket: '/var/run/mysqld/mysqld.sock' port: 3306 MySQL Community Server - GPL.
+2022-11-22T06:06:09.5341028Z Stop and remove container: 57e9ed27eab042ee8653063f2a3e4b8e_mysqllatest_56fbdc
+2022-11-22T06:06:09.5349945Z ##[command]/usr/bin/docker rm --force 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T06:06:09.7815354Z 46227faa62763969a068baae79fb2a9335a09ba7482aae30a49c8fed2bf356df
+2022-11-22T06:06:09.7841366Z Remove container network: github_network_7853d588c20f407bba7b04c3e70db729
+2022-11-22T06:06:09.7846737Z ##[command]/usr/bin/docker network rm github_network_7853d588c20f407bba7b04c3e70db729
+2022-11-22T06:06:09.8812686Z github_network_7853d588c20f407bba7b04c3e70db729
+2022-11-22T06:06:09.8962630Z Cleaning up orphan processes
diff --git a/tools/pull_request_hooks/package.json b/tools/pull_request_hooks/package.json
new file mode 100644
index 000000000000..bedb411a9124
--- /dev/null
+++ b/tools/pull_request_hooks/package.json
@@ -0,0 +1,3 @@
+{
+ "type": "module"
+}
diff --git a/tools/pull_request_hooks/rerunFlakyTests.js b/tools/pull_request_hooks/rerunFlakyTests.js
new file mode 100644
index 000000000000..d3085a67260b
--- /dev/null
+++ b/tools/pull_request_hooks/rerunFlakyTests.js
@@ -0,0 +1,298 @@
+const LABEL = "🤖 Flaky Test Report";
+const TITLE_BOT_HEADER = "title: ";
+
+// Only check jobs that start with these.
+// Helps make sure we don't restart something like screenshot tests or linters, which are not known to be flaky.
+const CONSIDERED_JOBS = [
+ "Integration Tests",
+];
+
+async function getFailedJobsForRun(github, context, workflowRunId, runAttempt) {
+ const jobs = await github.paginate(
+ github.rest.actions.listJobsForWorkflowRunAttempt,
+ {
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ run_id: workflowRunId,
+ attempt_number: runAttempt
+ },
+ response => {
+ return response.data;
+ });
+
+ return jobs
+ .filter((job) => job.conclusion === "failure");
+}
+
+export async function rerunFlakyTests({ github, context }) {
+ const failingJobs = await getFailedJobsForRun(
+ github,
+ context,
+ context.payload.workflow_run.id,
+ context.payload.workflow_run.run_attempt
+ );
+
+ const filteredFailingJobs = failingJobs.filter((job) => {
+ console.log(`Failing job: ${job.name}`)
+ return CONSIDERED_JOBS.some((title) => job.name.startsWith(title));
+ });
+ if (filteredFailingJobs.length === 0) {
+ console.log("Failing jobs are NOT designated flaky. Not rerunning.");
+ return;
+ }
+
+ console.log(`Rerunning job: ${filteredFailingJobs[0].name}`);
+
+ github.rest.actions.reRunWorkflowFailedJobs({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ run_id: context.payload.workflow_run.id,
+ });
+}
+
+// Tries its best to extract a useful error title and message for the given log
+export function extractDetails(log) {
+ // Strip off timestamp
+ const lines = log.split(/^[0-9.:T\-]*?Z /gm);
+
+ const failureRegex = /^\t?FAILURE #(?[0-9]+): (?.+)/;
+ const groupRegex = /^##\[group\](?.+)/;
+
+ const failures = [];
+ let lastGroup = "root";
+ let loggingFailure;
+
+ const newFailure = (failureMatch) => {
+ const { headline } = failureMatch.groups;
+
+ loggingFailure = {
+ headline,
+ group: lastGroup.replace("/datum/unit_test/", ""),
+ details: [],
+ };
+ };
+
+ for (const line of lines) {
+ const groupMatch = line.match(groupRegex);
+ if (groupMatch) {
+ lastGroup = groupMatch.groups.group.trim();
+ continue;
+ }
+
+ const failureMatch = line.match(failureRegex);
+
+ if (loggingFailure === undefined) {
+ if (!failureMatch) {
+ continue;
+ }
+
+ newFailure(failureMatch);
+ } else if (failureMatch || line.startsWith("##")) {
+ failures.push(loggingFailure);
+ loggingFailure = undefined;
+
+ if (failureMatch) {
+ newFailure(failureMatch);
+ }
+ } else {
+ loggingFailure.details.push(line.trim());
+ }
+ }
+
+ // We had no logged failures, there's not really anything we can do here
+ if (failures.length === 0) {
+ return {
+ title: "Flaky test failure with no obvious source",
+ failures,
+ };
+ }
+
+ // We *could* create multiple failures for multiple groups.
+ // This would be important if we had multiple flaky tests at the same time.
+ // I'm choosing not to because it complicates this logic a bit, has the ability to go terribly wrong,
+ // and also because there's something funny to me about that increasing the urgency of fixing
+ // flaky tests. If it becomes a serious issue though, I would not mind this being fixed.
+ const uniqueGroups = new Set(failures.map((failure) => failure.group));
+
+ if (uniqueGroups.size > 1) {
+ return {
+ title: `Multiple flaky test failures in ${Array.from(uniqueGroups)
+ .sort()
+ .join(", ")}`,
+ failures,
+ };
+ }
+
+ const failGroup = failures[0].group;
+
+ if (failures.length > 1) {
+ return {
+ title: `Multiple errors in flaky test ${failGroup}`,
+ failures,
+ };
+ }
+
+ const failure = failures[0];
+
+ // Common patterns where we can always get a detailed title
+ const runtimeMatch = failure.headline.match(/Runtime in .+?: (?.+)/);
+ if (runtimeMatch) {
+ const runtime = runtimeMatch.groups.error.trim();
+
+ const invalidTimerMatch = runtime.match(/^Invalid timer:.+object:(?