Merge remote-tracking branch 'tgstation/master' into upstream-feb12-2026

# Conflicts:
#	.github/CODEOWNERS
#	.github/workflows/compile_changelogs.yml
#	.github/workflows/stale.yml
#	SQL/database_changelog.md
#	_maps/map_files/CatwalkStation/CatwalkStation_2023.dmm
#	code/__DEFINES/atom_hud.dm
#	code/__DEFINES/inventory.dm
#	code/__DEFINES/mobs.dm
#	code/__DEFINES/species_clothing_paths.dm
#	code/__DEFINES/subsystems.dm
#	code/__DEFINES/surgery.dm
#	code/__HELPERS/global_lists.dm
#	code/_globalvars/lists/maintenance_loot.dm
#	code/_globalvars/traits/_traits.dm
#	code/controllers/subsystem/minor_mapping.dm
#	code/controllers/subsystem/processing/quirks.dm
#	code/controllers/subsystem/shuttle.dm
#	code/datums/components/palette.dm
#	code/datums/components/surgery_initiator.dm
#	code/datums/diseases/advance/advance.dm
#	code/datums/hud.dm
#	code/datums/mood.dm
#	code/datums/mutations/chameleon.dm
#	code/datums/quirks/negative_quirks/nyctophobia.dm
#	code/datums/status_effects/debuffs/debuffs.dm
#	code/datums/status_effects/debuffs/drunk.dm
#	code/datums/status_effects/debuffs/slime/slime_leech.dm
#	code/datums/weather/weather.dm
#	code/game/data_huds.dm
#	code/game/objects/items.dm
#	code/game/objects/items/devices/scanners/health_analyzer.dm
#	code/game/objects/items/frog_statue.dm
#	code/game/objects/items/rcd/RLD.dm
#	code/game/objects/items/robot/items/hypo.dm
#	code/game/objects/items/stacks/medical.dm
#	code/game/objects/items/stacks/wrap.dm
#	code/game/objects/items/storage/garment.dm
#	code/game/objects/items/tools/medical/defib.dm
#	code/game/objects/items/weaponry.dm
#	code/game/objects/items/weaponry/melee/misc.dm
#	code/game/objects/structures/crates_lockers/closets/secure/security.dm
#	code/game/objects/structures/curtains.dm
#	code/game/objects/structures/dresser.dm
#	code/game/objects/structures/girders.dm
#	code/game/objects/structures/maintenance.dm
#	code/game/objects/structures/mirror.dm
#	code/modules/admin/greyscale_modify_menu.dm
#	code/modules/admin/verbs/light_debug.dm
#	code/modules/antagonists/ashwalker/ashwalker.dm
#	code/modules/antagonists/heretic/knowledge/starting_lore.dm
#	code/modules/antagonists/ninja/ninjaDrainAct.dm
#	code/modules/art/paintings.dm
#	code/modules/client/preferences.dm
#	code/modules/client/verbs/ooc.dm
#	code/modules/clothing/head/wig.dm
#	code/modules/events/disease_outbreak.dm
#	code/modules/holodeck/holo_effect.dm
#	code/modules/jobs/job_types/head_of_security.dm
#	code/modules/jobs/job_types/security_officer.dm
#	code/modules/library/skill_learning/generic_skillchips/point.dm
#	code/modules/mining/lavaland/ash_flora.dm
#	code/modules/mining/lavaland/mining_loot/megafauna/ash_drake.dm
#	code/modules/mob/dead/new_player/new_player.dm
#	code/modules/mob/living/basic/guardian/guardian.dm
#	code/modules/mob/living/basic/space_fauna/space_dragon/space_dragon.dm
#	code/modules/mob/living/carbon/carbon.dm
#	code/modules/mob/living/carbon/human/human.dm
#	code/modules/mob/living/carbon/human/human_defines.dm
#	code/modules/mob/living/carbon/life.dm
#	code/modules/mob/living/living.dm
#	code/modules/mob/living/living_defines.dm
#	code/modules/mob/mob.dm
#	code/modules/mob_spawn/ghost_roles/mining_roles.dm
#	code/modules/mod/mod_control.dm
#	code/modules/mod/modules/modules_general.dm
#	code/modules/modular_computers/computers/item/computer_ui.dm
#	code/modules/paperwork/paper.dm
#	code/modules/paperwork/paperbin.dm
#	code/modules/power/lighting/light.dm
#	code/modules/projectiles/guns/energy/kinetic_accelerator.dm
#	code/modules/projectiles/projectile.dm
#	code/modules/reagents/chemistry/reagents/drinks/alcohol_reagents.dm
#	code/modules/reagents/chemistry/reagents/food_reagents.dm
#	code/modules/reagents/chemistry/reagents/other_reagents.dm
#	code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm
#	code/modules/research/xenobiology/crossbreeding/_clothing.dm
#	code/modules/research/xenobiology/crossbreeding/prismatic.dm
#	code/modules/surgery/advanced/brainwashing.dm
#	code/modules/surgery/advanced/lobotomy.dm
#	code/modules/surgery/amputation.dm
#	code/modules/surgery/blood_filter.dm
#	code/modules/surgery/bodyparts/_bodyparts.dm
#	code/modules/surgery/brain_surgery.dm
#	code/modules/surgery/cavity_implant.dm
#	code/modules/surgery/coronary_bypass.dm
#	code/modules/surgery/gastrectomy.dm
#	code/modules/surgery/healing.dm
#	code/modules/surgery/limb_augmentation.dm
#	code/modules/surgery/organ_manipulation.dm
#	code/modules/surgery/revival.dm
#	code/modules/surgery/sleeper_protocol.dm
#	code/modules/surgery/surgery_helpers.dm
#	code/modules/surgery/surgery_step.dm
#	code/modules/unit_tests/_unit_tests.dm
#	code/modules/unit_tests/designs.dm
#	code/modules/unit_tests/icon_state_worn.dm
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_cultist.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_headrevolutionary.png
#	code/modules/unit_tests/screenshots/screenshot_antag_icons_provocateur.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body.png
#	code/modules/unit_tests/screenshots/screenshot_husk_body_missing_limbs.png
#	icons/map_icons/clothing/head/_head.dmi
#	icons/map_icons/clothing/shoes.dmi
#	icons/map_icons/items/_item.dmi
#	icons/mob/huds/hud.dmi
#	icons/mob/inhands/64x64_lefthand.dmi
#	icons/mob/inhands/64x64_righthand.dmi
#	icons/obj/machines/computer.dmi
#	tgui/packages/tgui/interfaces/OperatingComputer.jsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/MainPage.tsx
#	tgui/packages/tgui/interfaces/PreferencesMenu/types.ts
#	tgui/packages/tgui/interfaces/SurgeryInitiator.tsx
#	tools/icon_cutter/check.py
This commit is contained in:
nevimer
2026-02-12 23:50:09 -05:00
2374 changed files with 81136 additions and 52767 deletions
+2 -2
View File
@@ -25,7 +25,7 @@
else if(response.status_code != 200)
dat += "<br>Failed to connect to CentCom. Status code: [response.status_code]"
else
if(response.body == "[]")
if(response.body == "\[]")
dat += "<center><b>0 bans detected for [ckey]</b></center>"
else
bans = json_decode(response.body)
@@ -83,7 +83,7 @@
var/list/bans
var/total_permabans
if(response.body == "[]")
if(response.body == "\[]")
return
bans = json_decode(response.body)
//Ignore bans from non-whitelisted sources, if a whitelist exists
+1 -2
View File
@@ -166,13 +166,12 @@
if("pick_color")
var/group = params["color_index"]
//BUBBERSTATION EDIT START: TGUI COLOR PICKER
var/new_color = tgui_color_picker(
usr,
"Choose color for greyscale color group [group]:",
"Greyscale Modification Menu",
split_colors[group]
) //BUBBERSTATION EDIT END: TGUI COLOR PICKER
)
if(new_color)
split_colors[group] = new_color
queue_refresh()
+3 -3
View File
@@ -28,13 +28,13 @@ GLOBAL_LIST_INIT(permission_action_types, list(
output += {"
<a href='byond://?_src_=holder;[HrefToken()];editrightsbrowser=1'>\
[action == PERMISSIONS_PAGE_PERMISSIONS ? "<b>\[Permissions\]</b": "\[Permissions\]"]
[action == PERMISSIONS_PAGE_PERMISSIONS ? "<b>\[Permissions\]</b>": "\[Permissions\]"]
</a>
[new_line]<a href='byond://?_src_=holder;[HrefToken()];editrightsbrowserranks=1'>
[action == PERMISSIONS_PAGE_RANKS ? "<b>\[Ranks\]</b": "\[Ranks\]"]
[action == PERMISSIONS_PAGE_RANKS ? "<b>\[Ranks\]</b>": "\[Ranks\]"]
</a>
[new_line]<a href='byond://?_src_=holder;[HrefToken()];editrightsbrowserlogging=1;editrightslogpage=0'>
[action == PERMISSIONS_PAGE_LOGGING ? "<b>\[Logging\]</b": "\[Logging\]"]
[action == PERMISSIONS_PAGE_LOGGING ? "<b>\[Logging\]</b>": "\[Logging\]"]
</a>
[new_line]<a href='byond://?_src_=holder;[HrefToken()];editrightsbrowserhousekeep=1'>
[action == PERMISSIONS_PAGE_HOUSEKEEPING ? "<b>\[Housekeeping\]</b>": "\[Housekeeping\]"]
+2 -2
View File
@@ -106,11 +106,11 @@
return
switch(SSshuttle.emergency.mode)
if(SHUTTLE_CALL)
SSshuttle.emergency.cancel()
SSshuttle.cancel_evac(usr) // note that this does provide logging/feedback of its own but it's better for backcompatibility to retain the following logging lines
log_admin("[key_name(usr)] sent the Emergency Shuttle back.")
message_admins(span_adminnotice("[key_name_admin(usr)] sent the Emergency Shuttle back."))
else
SSshuttle.emergency.cancel()
SSshuttle.emergency.request()
log_admin("[key_name(usr)] called the Emergency Shuttle.")
message_admins(span_adminnotice("[key_name_admin(usr)] called the Emergency Shuttle to the station."))
+4 -1
View File
@@ -58,9 +58,12 @@ ADMIN_VERB(cmd_admin_check_player_exp, R_ADMIN, "Player Playtime", "View player
if(!message)
return
if(!SSshuttle.centcom_recall(usr, SSshuttle.emergency.timer, message)) // feedback handled within
return
message_admins("[key_name_admin(usr)] triggered a CentCom recall, with the admiral message of: [message]")
usr.log_message("triggered a CentCom recall, with the message of: [message]", LOG_GAME)
SSshuttle.centcom_recall(SSshuttle.emergency.timer, message)
/datum/admins/proc/cmd_show_exp_panel(client/client_to_check)
if(!check_rights(R_ADMIN))
+70
View File
@@ -179,6 +179,76 @@ ADMIN_VERB_ONLY_CONTEXT_MENU(show_player_panel, R_ADMIN, "Show Player Panel", mo
user << browse(body, "window=adminplayeropts-[REF(player)];size=550x540")
BLACKBOX_LOG_ADMIN_VERB("Player Panel")
ADMIN_VERB_ONLY_CONTEXT_MENU(show_occupants_player_panel, R_ADMIN, "Show Occupants PP", obj/target in world)
var/list/options = list()
// Vehicles
if(istype(target, /obj/vehicle))
var/obj/vehicle/target_vehicle = target
if(istype(target_vehicle.occupants, /list) && target_vehicle.occupants.len)
for(var/mob/mob_occupant in target_vehicle.occupants)
options["[mob_occupant.name] ([mob_occupant.tag])[target_vehicle.is_driver(mob_occupant) ? " (Driver)" : ""]"] = "\ref[mob_occupant]"
// Searching for mobs in exosuit equipment (e.g. seccage, sleepers)
for(var/obj/item/mecha_parts/mecha_equipment/obj_contents in target.contents)
for(var/mob/mob_in_equipment in obj_contents.contents)
options["[mob_in_equipment.name] ([mob_in_equipment.tag])"] = "\ref[mob_in_equipment]"
// Closets, crates, bodybags, coffins, etc.
else if(istype(target, /obj/structure/closet))
for(var/mob/mob_occupant in target.contents)
options["[mob_occupant.name] ([mob_occupant.tag])"] = "\ref[mob_occupant]"
// Searching for mobs in bodybags placed inside closet
for(var/obj/structure/closet/obj_contents in target.contents)
for(var/mob/mob_in_bodybag in obj_contents.contents)
options["[mob_in_bodybag.name] ([mob_in_bodybag.tag])"] = "\ref[mob_in_bodybag]"
// That's basically the same for folded bodybags (e.g. bluespace bodybags with mobs inside)
for(var/obj/item/bodybag/obj_contents_folded in target.contents)
for(var/mob/mob_in_bodybag_folded in obj_contents_folded.contents)
options["[mob_in_bodybag_folded.name] ([mob_in_bodybag_folded.tag])"] = "\ref[mob_in_bodybag_folded]"
// Folded bodybags (e.g. bluespace bodybags with mobs inside)
else if(istype(target, /obj/item/bodybag))
for(var/mob/mob_occupant in target.contents)
options["[mob_occupant.name] ([mob_occupant.tag])"] = "\ref[mob_occupant]"
// Body containers (morgue trays, crematoriums)
else if(istype(target, /obj/structure/bodycontainer))
for(var/mob/mob_occupant in target.contents)
options["[mob_occupant.name] ([mob_occupant.tag])"] = "\ref[mob_occupant]"
// Searching for mobs in bodybags placed inside body container
for(var/obj/structure/closet/obj_contents in target.contents)
for(var/mob/mob_in_bodybag in obj_contents.contents)
options["[mob_in_bodybag.name] ([mob_in_bodybag.tag])"] = "\ref[mob_in_bodybag]"
// That's basically the same for folded bodybags (e.g. bluespace bodybags with mobs inside)
for(var/obj/item/bodybag/obj_contents_folded in target.contents)
for(var/mob/mob_in_bodybag_folded in obj_contents_folded.contents)
options["[mob_in_bodybag_folded.name] ([mob_in_bodybag_folded.tag])"] = "\ref[mob_in_bodybag_folded]"
// Machinery
else if(istype(target, /obj/machinery))
for(var/mob/mob_occupant in target.contents)
options["[mob_occupant.name] ([mob_occupant.tag])"] = "\ref[mob_occupant]"
else
tgui_alert(user,"Unsupported object type! Supported types: /obj/vehicle; /obj/structure/closet; /obj/structure/bodycontainer; /obj/machinery; /obj/item/bodybag.")
return
if(!options.len)
tgui_alert(user, "No occupants found!")
return
var/choice
if(options.len == 1)
choice = options[1]
else
choice = tgui_input_list(user, "Select mob", "Player Panel", options)
if(choice)
var/mob/selected_mob = locate(options[choice])
if(selected_mob)
SSadmin_verbs.dynamic_invoke_verb(user, /datum/admin_verb/show_player_panel, selected_mob)
return
/client/proc/cmd_admin_godmode(mob/mob in GLOB.mob_list)
set category = "Admin.Game"
set name = "Godmode"
+3 -3
View File
@@ -360,9 +360,9 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
// send2chat(new /datum/tgs_message_conent("[initiator_ckey] | [message_content]"), "ahelp", TRUE)
var/list/headers = list()
headers["Content-Type"] = "application/json"
var/datum/http_request/request = new()
var/datum/http_request/request = new
request.prepare(RUSTG_HTTP_METHOD_POST, webhook, json_encode(webhook_info), headers, "tmp/response.json")
request.begin_async()
request.fire_and_forget()
/datum/admin_help/Destroy()
RemoveActive()
@@ -724,7 +724,7 @@ GLOBAL_DATUM_INIT(ahelp_tickets, /datum/admin_help_tickets, new)
dat += "CLOSED</b>"
else
dat += "UNKNOWN</b>"
dat += "\n[FOURSPACES]<A href='byond://?_src_=holder;[HrefToken(forceGlobal = TRUE)];player_ticket_panel=1'>Refresh</A>"
dat += "\n[FOURSPACES]<A href='byond://?_src_=usr;player_ticket_panel=1'>Refresh</A>"
dat += "<br><br>Opened at: [gameTimestamp("hh:mm:ss", opened_at)] (Approx [DisplayTimeText(world.time - opened_at)] ago)"
if(closed_at)
dat += "<br>Closed at: [gameTimestamp("hh:mm:ss", closed_at)] (Approx [DisplayTimeText(world.time - closed_at)] ago)"
+5 -3
View File
@@ -51,10 +51,12 @@ ADMIN_VERB(cancel_shuttle, R_ADMIN, "Cancel Shuttle", "Recall the shuttle, regar
if(EMERGENCY_AT_LEAST_DOCKED)
return
if(tgui_alert(user, "You sure?", "Confirm", list("Yes", "No")) != "Yes")
if(tgui_alert(user, "You sure?", "Confirm Shuttle Cancellation", list("Yes", "No")) != "Yes")
return
SSshuttle.admin_emergency_no_recall = FALSE
SSshuttle.emergency.cancel()
if(!SSshuttle.cancel_evac(user.mob)) // handles the case where the shuttle is set to unrecallable by another admin or the code
return
BLACKBOX_LOG_ADMIN_VERB("Cancel Shuttle")
log_admin("[key_name(user)] admin-recalled the emergency shuttle.")
message_admins(span_adminnotice("[key_name_admin(user)] admin-recalled the emergency shuttle."))
+7 -7
View File
@@ -28,9 +28,9 @@ ADMIN_VERB(run_weather, R_ADMIN|R_FUN, "Run Weather", "Triggers specific weather
return
var/list/area_choices = list()
if(!length(area_choices))
for(var/area/area_type as anything in typesof(/area))
area_choices[initial(area_type.type)] = area_type
for(var/area/area_instance as anything in GLOB.areas)
area_choices[area_instance.type] ||= list()
area_choices[area_instance.type] |= area_instance
var/area/area_choice = tgui_input_list(user, "Select an area for weather to target", "Target Area", area_choices)
if(!area_choice)
@@ -72,10 +72,10 @@ ADMIN_VERB(run_weather, R_ADMIN|R_FUN, "Run Weather", "Triggers specific weather
thunder_value = GLOB.thunder_chance_options[thunder_choice]
var/list/weather_data = list(
area = area_choice,
weather_flags = weather_bitflags,
thunder_chance = thunder_value,
reagent = reagent_choice,
WEATHER_FORCED_AREAS = area_choice,
WEATHER_FORCED_FLAGS = weather_bitflags,
WEATHER_FORCED_THUNDER = thunder_value,
WEATHER_FORCED_REAGENT = reagent_choice,
)
SSweather.run_weather(weather_choice, z_level, weather_data)
+3 -3
View File
@@ -9,7 +9,7 @@ ADMIN_VERB(atmos_debug, R_DEBUG, "Check Plumbing", "Verifies the integrity of th
//Pipes
for(var/obj/machinery/atmospherics/pipe/pipe as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/atmospherics/pipe))
if(istype(pipe, /obj/machinery/atmospherics/pipe/smart) || istype(pipe, /obj/machinery/atmospherics/pipe/layer_manifold))
if(istype(pipe, /obj/machinery/atmospherics/pipe/smart) || istype(pipe, /obj/machinery/atmospherics/pipe/layer_manifold) || istype(pipe, /obj/machinery/atmospherics/pipe/multiz))
continue
if(pipe.z && (!pipe.nodes || !pipe.nodes.len || (null in pipe.nodes)))
to_chat(user, "Unconnected [pipe.name] located at [ADMIN_VERBOSEJMP(pipe)]", confidential = TRUE)
@@ -29,12 +29,12 @@ ADMIN_VERB(power_debug, R_DEBUG, "Check Power", "Verifies the integrity of the p
if (!PN.nodes || !PN.nodes.len)
if(PN.cables && (PN.cables.len > 1))
var/obj/structure/cable/C = PN.cables[1]
results += "Powernet with no nodes! (number [PN.number]) - example cable at [ADMIN_VERBOSEJMP(C)]"
results += "Powernet with no nodes! Example cable at [ADMIN_VERBOSEJMP(C)]"
if (!PN.cables || (PN.cables.len < 10))
if(PN.cables && (PN.cables.len > 1))
var/obj/structure/cable/C = PN.cables[1]
results += "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [ADMIN_VERBOSEJMP(C)]"
results += "Powernet with fewer than 10 cables! Example cable at [ADMIN_VERBOSEJMP(C)]"
for(var/turf/T in world.contents)
var/cable_layers //cache all cable layers (which are bitflags) present
+1 -1
View File
@@ -126,7 +126,7 @@
var/list/spawn_points = GLOB.emergencyresponseteamspawn
var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for [span_notice(ertemplate.polldesc)]?", check_jobban = "deathsquad", alert_pic = /obj/item/card/id/advanced/centcom/ert, role_name_text = "emergency response team")
var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for [span_notice(ertemplate.polldesc)]?", check_jobban = "deathsquad", alert_pic = /obj/item/card/id/advanced/centcom/ert/commander, role_name_text = "emergency response team")
if(!length(candidates))
message_admins("[key_name_admin(owner)] tried to create a CentCom response team but [owner.p_they()] didn't find any candidates.")
+1 -1
View File
@@ -256,7 +256,7 @@ GLOBAL_LIST_EMPTY(light_debugged_atoms)
if("set_on")
parent.set_light(l_on = params["value"])
if("change_color")
var/chosen_color = tgui_color_picker(ui.user, "Pick new color", "[parent]", parent.light_color) // BUBBERSTATION EDIT: TGUI COLOR PICKER
var/chosen_color = tgui_color_picker(ui.user, "Pick new color", "[parent]", parent.light_color)
if(chosen_color)
parent.set_light(l_color = chosen_color)
if("set_power")
+1 -1
View File
@@ -56,7 +56,7 @@ ADMIN_VERB(map_export, R_DEBUG, "Map Export", "Select a part of the map by coord
// Save resources in silo
/obj/machinery/ore_silo/on_object_saved()
var/data
var/datum/component/material_container/material_holder = GetComponent(/datum/component/material_container)
var/datum/material_container/material_holder = materials
for(var/each in material_holder.materials)
var/amount = material_holder.materials[each] / 100
var/datum/material/material_datum = each
+1 -1
View File
@@ -236,7 +236,7 @@ ADMIN_VERB(debug_z_levels, R_DEBUG, "Debug Z-Levels", "Displays a list of all z-
var/list/messages = list()
var/list/z_list = SSmapping.z_list
messages += "\n<b>World</b>: [world.maxx] x [world.maxy] x [world.maxz]\n"
messages += "<b>World</b>: [world.maxx] x [world.maxy] x [world.maxz]\n"
var/list/linked_levels = list()
var/min_x = INFINITY
+6 -1
View File
@@ -140,7 +140,12 @@ GLOBAL_VAR_INIT(web_sound_cooldown, 0)
if(credit)
to_chat_message += span_notice("<br>[credit]")
to_chat(world, fieldset_block("Now Playing: [span_bold(music_extra_data["title"])] by [span_bold(music_extra_data["artist"])]", jointext(to_chat_message, ""), "boxed_message"))
var/list/recipients = list()
for(var/client/client as anything in GLOB.clients)
if(client.prefs.read_preference(/datum/preference/numeric/volume/sound_midi) > 0)
recipients += client
recipients |= user.client
to_chat(recipients, fieldset_block("Now Playing: [span_bold(music_extra_data["title"])] by [span_bold(music_extra_data["artist"])]", jointext(to_chat_message, ""), "boxed_message"))
SSblackbox.record_feedback("nested tally", "played_url", 1, list("[user.ckey]", "[input]"))
log_admin("[key_name(user)] played web sound: [input]")
+15 -11
View File
@@ -349,16 +349,6 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
airlock.req_one_access = list()
message_admins("[key_name_admin(holder)] activated Egalitarian Station mode")
priority_announce("CentCom airlock control override activated. Please take this time to get acquainted with your coworkers.", null, SSstation.announcer.get_rand_report_sound())
if("ancap")
if(!is_funmin)
return
SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Anarcho-capitalist Station"))
SSeconomy.full_ancap = !SSeconomy.full_ancap
message_admins("[key_name_admin(holder)] toggled Anarcho-capitalist mode")
if(SSeconomy.full_ancap)
priority_announce("The NAP is now in full effect.", null, SSstation.announcer.get_rand_report_sound())
else
priority_announce("The NAP has been revoked.", null, SSstation.announcer.get_rand_report_sound())
if("send_shuttle_back")
if (!is_funmin)
return
@@ -637,7 +627,7 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
if(teamsize <= 0)
return FALSE
candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a [span_notice("Nanotrasen emergency response drone")]?", check_jobban = ROLE_DRONE, alert_pic = /mob/living/basic/drone/classic, role_name_text = "nanotrasen emergency response drone")
candidates = SSpolling.poll_ghost_candidates("Do you wish to be considered for a [span_notice("Nanotrasen emergency response drone")]?", check_jobban = ROLE_DRONE, alert_pic = /mob/living/basic/drone/classic, role_name_text = "Nanotrasen emergency response drone")
if(length(candidates) == 0)
return FALSE
@@ -687,6 +677,20 @@ ADMIN_VERB(secrets, R_NONE, "Secrets", "Abuse harder than you ever have before w
message_admins("[key_name_admin(holder)] healed everyone.")
log_admin("[key_name(holder)] healed everyone.")
if("cascade")
if(!is_funmin)
return
message_admins("[key_name_admin(holder)] started a resonance cascade! You're supposed to be a scientist! Use your common sense!")
for(var/obj/machinery/power/supermatter_crystal/S in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/power/supermatter_crystal))
if(!S.is_main_engine)
continue
S.explosion_point = 0
S.set_delam(SM_DELAM_PRIO_IN_GAME, /datum/sm_delam/cascade)
S.external_damage_immediate += 200
S.count_down()
return
return
if(holder)
log_admin("[key_name(holder)] used secret: [action].")
#undef THUNDERDOME_TEMPLATE_FILE
@@ -126,6 +126,7 @@
else if(islist(potential_container))
var/list/potential_cache = potential_container
var/is_alist = istype(potential_cache, /alist)
for(var/element_in_list in potential_cache)
//Check normal sublists
if(islist(element_in_list))
@@ -162,7 +163,7 @@
log_reftracker("All references to [type] [text_ref(src)] found, exiting.")
return
if(!isnum(element_in_list) && !is_special_list)
if((!isnum(element_in_list) || is_alist) && !is_special_list)
// This exists to catch an error that throws when we access a special list
// is_special_list is a hint, it can be wrong
try