[MIRROR] More admin verb conversion & Secrets panel overhaul (#11124)

Co-authored-by: Selis <12716288+ItsSelis@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-06-28 19:34:54 -07:00
committed by GitHub
parent 873fa555c2
commit a3028dcb9e
72 changed files with 1949 additions and 1132 deletions

View File

@@ -600,6 +600,7 @@ GLOBAL_VAR_INIT(floorIsLava, 0)
popup.set_content(dat)
popup.open()
/*
/datum/admins/proc/Secrets(var/datum/admin_secret_category/active_category = null)
if(!check_rights(0)) return
@@ -626,6 +627,7 @@ GLOBAL_VAR_INIT(floorIsLava, 0)
popup.set_content(dat)
popup.open()
return
*/
/////////////////////////////////////////////////////////////////////////////////////////////////admins2.dm merge
//i.e. buttons/verbs
@@ -1299,27 +1301,6 @@ var/datum/announcement/minor/admin_min_announcer = new
message_admins(span_blue("[key_name_admin(usr)] toggled guests game entering [CONFIG_GET(flag/guests_allowed)?"":"dis"]allowed."), 1)
feedback_add_details("admin_verb","TGU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/admins/proc/output_ai_laws()
var/ai_number = 0
for(var/mob/living/silicon/S in mob_list)
ai_number++
if(isAI(S))
to_chat(usr, span_bold("AI [key_name(S, usr)]'s laws:"))
else if(isrobot(S))
var/mob/living/silicon/robot/R = S
to_chat(usr, span_bold("CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"]: laws:"))
else if (ispAI(S))
to_chat(usr, span_bold("pAI [key_name(S, usr)]'s laws:"))
else
to_chat(usr, span_bold("SOMETHING SILICON [key_name(S, usr)]'s laws:"))
if (S.laws == null)
to_chat(usr, "[key_name(S, usr)]'s laws are null?? Contact a coder.")
else
S.laws.show_laws(usr)
if(!ai_number)
to_chat(usr, span_bold("No AIs located")) //Just so you know the thing is actually working and not just ignoring you.
/client/proc/update_mob_sprite(mob/living/carbon/human/H as mob)
set category = "Admin.Game"
set name = "Update Mob Sprite"

View File

@@ -1,113 +0,0 @@
var/datum/admin_secrets/admin_secrets = new()
/datum/admin_secrets
var/list/datum/admin_secret_category/categories
var/list/datum/admin_secret_item/items
/datum/admin_secrets/New()
..()
categories = init_subtypes(/datum/admin_secret_category)
items = list()
var/list/category_assoc = list()
for(var/datum/admin_secret_category/category in categories)
category_assoc[category.type] = category
for(var/item_type in subtypesof(/datum/admin_secret_item))
var/datum/admin_secret_item/secret_item = item_type
if(!initial(secret_item.name))
continue
var/datum/admin_secret_item/item = new item_type()
var/datum/admin_secret_category/category = category_assoc[item.category]
dd_insertObjectList(category.items, item)
items += item
//
// Secret Item Category - Each subtype is a category for organizing secret commands.
//
/datum/admin_secret_category
var/name = ""
var/desc = ""
var/list/datum/admin_secret_item/items = list()
/datum/admin_secret_category/proc/can_view(var/mob/user)
for(var/datum/admin_secret_item/item in items)
if(item.can_view(user))
return 1
return 0
//
// Secret Item Datum - Each subtype is a command on the secrets panel.
// Override execute() with the implementation of the command.
//
/datum/admin_secret_item
var/name = ""
var/category = null
var/log = 1
var/feedback = 1
var/permissions = R_HOST
var/warn_before_use = 0
/datum/admin_secret_item/dd_SortValue()
return "[name]"
/datum/admin_secret_item/proc/name()
return name
/datum/admin_secret_item/proc/can_view(var/mob/user)
return check_rights_for(user.client, permissions)
/datum/admin_secret_item/proc/can_execute(var/mob/user)
if(can_view(user))
if(!warn_before_use || tgui_alert(user, "Execute the command '[name]'?", name, list("No","Yes")) == "Yes")
return 1
return 0
/datum/admin_secret_item/proc/execute(var/mob/user)
if(!can_execute(user))
return 0
if(log)
log_and_message_admins("used secret '[name]'", user)
if(feedback)
feedback_inc("admin_secrets_used",1)
feedback_add_details("admin_secrets_used","[name]")
return 1
/*************************
* Pre-defined categories *
*************************/
/datum/admin_secret_category/admin_secrets
name = "Admin Secrets"
/datum/admin_secret_category/random_events
name = "'Random' Events"
/datum/admin_secret_category/fun_secrets
name = "Fun Secrets"
/datum/admin_secret_category/final_solutions
name = "Final Solutions"
desc = "(Warning, these will end the round!)"
/*************************
* Pre-defined base items *
*************************/
/datum/admin_secret_item/admin_secret
category = /datum/admin_secret_category/admin_secrets
log = 0
permissions = R_ADMIN //VOREStation Edit
/datum/admin_secret_item/random_event
category = /datum/admin_secret_category/random_events
permissions = R_FUN //VOREStation Edit
warn_before_use = 1
/datum/admin_secret_item/fun_secret
category = /datum/admin_secret_category/fun_secrets
permissions = R_FUN //VOREStation Edit
warn_before_use = 1
/datum/admin_secret_item/final_solution
category = /datum/admin_secret_category/final_solutions
permissions = R_FUN|R_SERVER|R_ADMIN //VOREStation Edit

View File

@@ -105,7 +105,6 @@ var/list/admin_verbs_admin = list(
/client/proc/toggle_attack_logs,
/datum/admins/proc/paralyze_mob,
/client/proc/fixatmos,
/datum/admins/proc/quick_nif, //VOREStation Add,
/datum/admins/proc/quick_authentic_nif, //CHOMPStation add
/datum/admins/proc/sendFax,
/client/proc/despawn_player,
@@ -376,7 +375,6 @@ var/list/admin_verbs_mod = list(
/client/proc/getserverlog, //allows us to fetch server logs (GLOB.diary) for other days,
/datum/admins/proc/view_persistent_data,
/datum/admins/proc/view_txt_log, //shows the server log (diary) for today,
/datum/admins/proc/quick_nif, //CHOMPEdit
/datum/admins/proc/quick_authentic_nif, //CHOMPEdit
/client/proc/admin_teleport, //CHOMPEdit
/datum/admins/proc/view_atk_log //shows the server combat-log, doesn't do anything presently,

View File

@@ -31,11 +31,9 @@ var/list/admin_verbs_admin = list(
/client/proc/cmd_admin_check_player_logs, //checks a player's attack logs,
/client/proc/cmd_admin_check_dialogue_logs, //checks a player's dialogue logs,
/datum/admins/proc/access_news_network, //allows access of newscasters,
/client/proc/getserverlog, //allows us to fetch server logs (diary) for other days,
/client/proc/jumptocoord, //we ghost and jump to a coordinate,
/client/proc/Getmob, //teleports a mob to our location,
/client/proc/Getkey, //teleports a mob with a certain ckey to our location,
// /client/proc/sendmob, //sends a mob somewhere, -Removed due to it needing two sorting procs to work, which were executed every time an admin right-clicked. ~Errorage,
/client/proc/Jump,
/client/proc/jumptokey, //allows us to jump to the location of a mob with a certain ckey,
/client/proc/jumptomob, //allows us to jump to a specific mob,
@@ -44,7 +42,6 @@ var/list/admin_verbs_admin = list(
/client/proc/admin_cancel_shuttle, //allows us to cancel the emergency shuttle, sending it back to CentCom,
/client/proc/cmd_admin_direct_narrate, //send text directly to a player with no padding. Useful for narratives and fluff-text,
/client/proc/cmd_admin_world_narrate, //sends text to all players with no padding,
/client/proc/cmd_admin_z_narrate, //VOREStation Add,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/check_words, //displays cult-words,
/client/proc/check_ai_laws, //shows AI and borg laws,
@@ -54,9 +51,7 @@ var/list/admin_verbs_admin = list(
/client/proc/check_antagonists,
/client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others,
/client/proc/dsay, //talk in deadchat using our ckey/fakekey,
// /client/proc/toggle_hear_deadcast, //toggles whether we hear deadchat,
/client/proc/investigate_show, //various admintools for investigation. Such as a singulo grief-log,
/client/proc/secrets,
/datum/admins/proc/toggleooc, //toggles ooc on/off for everyone,
/datum/admins/proc/togglelooc, //toggles looc on/off for everyone,
/datum/admins/proc/toggleoocdead, //toggles ooc on/off for everyone who is dead,
@@ -87,8 +82,6 @@ var/list/admin_verbs_admin = list(
/client/proc/view_chemical_reaction_logs,
/client/proc/makepAI,
/datum/admins/proc/paralyze_mob,
/client/proc/fixatmos,
/datum/admins/proc/quick_nif, //VOREStation Add,
/datum/admins/proc/quick_authentic_nif, //CHOMPStation add
/datum/admins/proc/set_uplink, //VOREStation Add,
/datum/admins/proc/sendFax,
@@ -130,14 +123,9 @@ var/list/admin_verbs_fun = list(
// /client/proc/smite, //Replaced by player_effects
/client/proc/player_effects,
/client/proc/admin_lightning_strike,
/client/proc/resize, //VOREStation Add,
/client/proc/tgui_admin_lists, //CHOMPStation Add
/client/proc/cmd_admin_droppod_deploy,
/client/proc/adminorbit, //VOREStation Add
/client/proc/add_mob_for_narration, //VOREStation Add
/client/proc/remove_mob_for_narration, //VOREStation Add
/client/proc/narrate_mob, //VOREStation Add
/client/proc/narrate_mob_args, //VOREStation Add
/client/proc/getPlayerStatus, //VORESTation Add
/client/proc/manage_event_triggers,
/client/proc/fake_pdaconvos
@@ -152,7 +140,6 @@ var/list/admin_verbs_spawn = list(
/datum/admins/proc/spawn_atom, //allows us to spawn instances,
/datum/admins/proc/spawn_mail,
/client/proc/cmd_admin_droppod_spawn,
/client/proc/respawn_character,
/client/proc/spawn_character_mob, //VOREStation Add,
/client/proc/spawn_chemdisp_cartridge,
/client/proc/map_template_load,
@@ -204,8 +191,6 @@ var/list/admin_verbs_debug = list(
/client/proc/ZASSettings,
/client/proc/cmd_debug_make_powernets,
/client/proc/kill_airgroup,
/client/proc/debug_controller,
/client/proc/debug_antagonist_template,
/client/proc/cmd_debug_mob_lists,
/client/proc/cmd_debug_using_map,
/client/proc/cmd_admin_delete,
@@ -217,7 +202,6 @@ var/list/admin_verbs_debug = list(
/client/proc/air_report,
/client/proc/reload_admins,
/client/proc/reload_eventMs,
/client/proc/restart_controller,
/datum/admins/proc/restart,
/client/proc/print_random_map,
/client/proc/create_random_map,
@@ -228,7 +212,6 @@ var/list/admin_verbs_debug = list(
/client/proc/enable_debug_verbs,
/client/proc/callproc,
/client/proc/callproc_datum,
/client/proc/SDQL2_query,
/client/proc/Jump,
/client/proc/jumptomob,
/client/proc/jumptocoord,
@@ -255,7 +238,6 @@ var/list/admin_verbs_debug = list(
/datum/admins/proc/view_feedback,
/client/proc/stop_sounds,
/client/proc/spawn_reagent,
/datum/admins/proc/quick_nif, //CHOMPStation Add,
/datum/admins/proc/quick_authentic_nif, //CHOMPStation add
/client/proc/reload_jobwhitelist, //ChompADD
/client/proc/reload_alienwhitelist, //ChompADD
@@ -265,15 +247,6 @@ var/list/admin_verbs_debug = list(
var/list/admin_verbs_paranoid_debug = list(
/client/proc/callproc,
/client/proc/callproc_datum,
/client/proc/debug_controller
)
var/list/admin_verbs_possess = list(
/proc/possess,
/proc/release
)
var/list/admin_verbs_rejuv = list(
/client/proc/respawn_character
)
//verbs which can be hidden - needs work
@@ -294,7 +267,6 @@ var/list/admin_verbs_hideable = list(
/client/proc/admin_cancel_shuttle,
/client/proc/cmd_admin_direct_narrate,
/client/proc/cmd_admin_world_narrate,
/client/proc/cmd_admin_z_narrate, //VOREStation Add,
/client/proc/check_words,
/client/proc/play_local_sound,
/client/proc/play_sound,
@@ -326,7 +298,6 @@ var/list/admin_verbs_hideable = list(
/datum/admins/proc/adrev,
/datum/admins/proc/adspawn,
/datum/admins/proc/adjump,
/client/proc/restart_controller,
/client/proc/cmd_admin_list_open_jobs,
/client/proc/callproc,
/client/proc/callproc_datum,
@@ -335,7 +306,6 @@ var/list/admin_verbs_hideable = list(
/client/proc/kill_air,
/client/proc/cmd_debug_make_powernets,
/client/proc/kill_airgroup,
/client/proc/debug_controller,
/client/proc/startSinglo,
/client/proc/simple_DPS,
/client/proc/cmd_debug_mob_lists,
@@ -346,8 +316,6 @@ var/list/admin_verbs_hideable = list(
/client/proc/air_report,
/client/proc/enable_debug_verbs,
/client/proc/roll_dices,
/proc/possess,
/proc/release,
/datum/admins/proc/set_uplink, //VOREStation Add,
/datum/admins/proc/set_tcrystals,
/client/proc/stop_sounds
@@ -376,13 +344,10 @@ var/list/admin_verbs_mod = list(
/client/proc/cmd_admin_subtle_message, //send an message to somebody as a 'voice in their head',
/datum/admins/proc/paralyze_mob,
/client/proc/cmd_admin_direct_narrate,
/client/proc/cmd_admin_z_narrate, //VOREStation Add,
/client/proc/allow_character_respawn, // Allows a ghost to respawn ,
/datum/admins/proc/sendFax,
/client/proc/getserverlog, //allows us to fetch server logs (GLOB.diary) for other days,
/datum/admins/proc/view_persistent_data,
/client/proc/start_vote,
/datum/admins/proc/quick_nif, //CHOMPStation Add,
/client/proc/reload_jobwhitelist, //ChompADD
/client/proc/reload_alienwhitelist //ChompADD
)
@@ -408,12 +373,8 @@ var/list/admin_verbs_event_manager = list(
/client/proc/aooc,
/datum/admins/proc/paralyze_mob,
/client/proc/cmd_admin_direct_narrate,
/client/proc/cmd_admin_z_narrate, //VOREStation Add,
/client/proc/allow_character_respawn,
/datum/admins/proc/sendFax,
/client/proc/respawn_character,
/proc/possess,
/proc/release,
/datum/admins/proc/change_weather,
/datum/admins/proc/change_time,
/client/proc/cmd_regenerate_asset_cache,
@@ -442,8 +403,6 @@ var/list/admin_verbs_event_manager = list(
/datum/admins/proc/PlayerNotes,
/client/proc/callproc,
/client/proc/callproc_datum,
/client/proc/debug_controller,
// /client/proc/show_gm_status, // VOREStation Edit - We don't use SSgame_master yet.
/datum/admins/proc/change_weather,
/datum/admins/proc/change_time,
/client/proc/cmd_regenerate_asset_cache,
@@ -483,7 +442,6 @@ var/list/admin_verbs_event_manager = list(
/client/proc/admin_cancel_shuttle, //allows us to cancel the emergency shuttle, sending it back to CentCom,
/client/proc/cmd_admin_direct_narrate, //send text directly to a player with no padding. Useful for narratives and fluff-text,
/client/proc/cmd_admin_world_narrate, //sends text to all players with no padding,
/client/proc/cmd_admin_z_narrate, //VOREStation Add,
/client/proc/cmd_admin_create_centcom_report,
/client/proc/check_words, //displays cult-words,
/client/proc/check_ai_laws, //shows AI and borg laws,
@@ -493,7 +451,6 @@ var/list/admin_verbs_event_manager = list(
/client/proc/check_antagonists,
/client/proc/admin_memo, //admin memo system. show/delete/write. +SERVER needed to delete admin memos of others,
/client/proc/dsay, //talk in deadchat using our ckey/fakekey,
/client/proc/secrets,
/datum/admins/proc/show_player_info,
/client/proc/free_slot, //frees slot for chosen job,
/client/proc/cmd_admin_change_custom_event,
@@ -511,7 +468,6 @@ var/list/admin_verbs_event_manager = list(
/client/proc/change_security_level,
/client/proc/makepAI,
/datum/admins/proc/paralyze_mob,
/client/proc/fixatmos,
/datum/admins/proc/sendFax,
/client/proc/despawn_player,
/datum/admins/proc/view_feedback,
@@ -535,7 +491,6 @@ var/list/admin_verbs_event_manager = list(
/client/proc/hide_motion_tracker_feedback,
/client/proc/modify_event_collector,
/client/proc/induce_malfunction,
/datum/admins/proc/quick_nif, //CHOMPStation Add,
/datum/admins/proc/quick_authentic_nif, //CHOMPStation add
/client/proc/reload_jobwhitelist, //ChompADD
/client/proc/reload_alienwhitelist //ChompADD

View File

@@ -10,9 +10,7 @@
add_verb(src, admin_verbs_debug)
if(CONFIG_GET(flag/debugparanoid) && !(rights & R_ADMIN))
remove_verb(src, admin_verbs_paranoid_debug) //Right now it's just callproc but we can easily add others later on.
if(rights & R_POSSESS) add_verb(src, admin_verbs_possess)
if(rights & R_STEALTH) add_verb(src, /client/proc/stealth)
if(rights & R_REJUVINATE) add_verb(src, admin_verbs_rejuv)
if(rights & R_SOUNDS) add_verb(src, admin_verbs_sounds)
if(rights & R_SPAWN) add_verb(src, admin_verbs_spawn)
if(rights & R_MOD) add_verb(src, admin_verbs_mod)
@@ -29,9 +27,7 @@
admin_verbs_fun,
admin_verbs_server,
admin_verbs_debug,
admin_verbs_possess,
/client/proc/stealth,
admin_verbs_rejuv,
admin_verbs_sounds,
admin_verbs_spawn,
debug_verbs
@@ -143,6 +139,21 @@
to_chat(mob, span_filter_system(span_boldnotice("Invisimin on. You are now as invisible as a ghost.")))
mob.alpha = max(mob.alpha - 100, 0)
ADMIN_VERB(list_bombers, R_ADMIN, "List Bombers", "Look at all bombs and their likely culprit.", ADMIN_CATEGORY_GAME)
user.holder.list_bombers()
//BLACKBOX_LOG_ADMIN_VERB("List Bombers")
ADMIN_VERB(list_signalers, R_ADMIN, "List Signalers", "View all signalers.", ADMIN_CATEGORY_GAME)
user.holder.list_signalers()
//BLACKBOX_LOG_ADMIN_VERB("List Signalers")
ADMIN_VERB(list_law_changes, R_ADMIN, "List Law Changes", "View all AI law changes.", ADMIN_CATEGORY_DEBUG)
user.holder.list_law_changes()
//BLACKBOX_LOG_ADMIN_VERB("List Law Changes")
ADMIN_VERB(show_manifest, R_ADMIN, "Show Manifest", "View the shift's Manifest.", ADMIN_CATEGORY_DEBUG)
user.holder.show_manifest()
//BLACKBOX_LOG_ADMIN_VERB("Show Manifest")
/client/proc/player_panel()
set name = "Player Panel"
@@ -187,14 +198,6 @@ ADMIN_VERB(game_panel, R_ADMIN|R_SERVER|R_FUN, "Game Panel", "Look at the state
user.holder.Game()
feedback_add_details("admin_verb","GP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/secrets()
set name = "Secrets"
set category = "Admin.Secrets"
if(check_rights(R_HOLDER))
holder.Secrets()
feedback_add_details("admin_verb","S") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/findStealthKey(txt)
if(txt)
for(var/P in GLOB.stealthminID)
@@ -540,7 +543,7 @@ ADMIN_VERB(deadmin, R_NONE, "DeAdmin", "Shed your admin powers.", ADMIN_CATEGORY
log_admin("[key_name(usr)] gave [key_name(T)] the spell [S].")
message_admins(span_blue("[key_name_admin(usr)] gave [key_name(T)] the spell [S]."), 1)
ADMIN_VERB(debugstatpanel, R_DEBUG, "Debug Stat Panel", "Allows to debug the statpanel", "Debug.Misc")
ADMIN_VERB(debug_statpanel, R_DEBUG, "Debug Stat Panel", "Toggles local debug of the stat panel", "Debug.Misc")
user.stat_panel.send_message("create_debug")
/client/proc/spawn_reagent()

View File

@@ -681,7 +681,7 @@
log_and_message_admins("Quick NIF'd [Tar.real_name] with a [input_NIF].", user)
if("resize")
user.client.resize(target)
SSadmin_verbs.dynamic_invoke_verb(user.client, /datum/admin_verb/resize, target)
if("teleport")
var/where = tgui_alert(user, "Where to teleport?", "Where?", list("To Me", "To Mob", "To Area", "Cancel"))

View File

@@ -1,44 +0,0 @@
/datum/admin_secret_item/admin_secret/admin_logs
name = "Admin Logs"
/datum/admin_secret_item/admin_secret/admin_logs/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat = span_bold("Admin Log<HR>")
for(var/l in GLOB.admin_log)
dat += "<li>[l]</li>"
if(!GLOB.admin_log.len)
dat += "No-one has done anything this round!"
var/datum/browser/popup = new(user, "adminlogs", "[src]", 550, 650, src)
popup.set_content(jointext(dat,null))
popup.open()
onclose(user, "adminlogs")
/datum/admin_secret_item/admin_secret/round_logs
name = "Round Dialogue Logs"
/datum/admin_secret_item/admin_secret/round_logs/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat = span_bold("Dialogue Log<HR>")
dat += "<fieldset style='border: 2px solid white; display: inline'>"
for(var/l in GLOB.round_text_log)
dat += "<li>[l]</li>"
dat += "</fieldset>"
if(!GLOB.round_text_log)
dat += "No-one has said anything this round! (How odd?)"
var/datum/browser/popup = new(user, "dialoguelogs", "[src]", 550, 650, src)
popup.set_content(jointext(dat,null))
popup.open()
onclose(user, "dialoguelogs")

View File

@@ -1,14 +0,0 @@
/datum/admin_secret_item/admin_secret/alter_narise
name = "Alter Nar-Sie"
/datum/admin_secret_item/admin_secret/alter_narise/execute(var/mob/user)
. = ..()
if(!.)
return
var/choice = tgui_alert(user, "How do you wish for Nar-Sie to interact with its surroundings?","NarChoice",list("CultStation13", "Nar-Singulo"))
if(choice == "CultStation13")
log_and_message_admins("has set narsie's behaviour to \"CultStation13\".", user)
narsie_behaviour = choice
if(choice == "Nar-Singulo")
log_and_message_admins("has set narsie's behaviour to \"Nar-Singulo\".", user)
narsie_behaviour = choice

View File

@@ -1,15 +0,0 @@
/datum/admin_secret_item/admin_secret/bombing_list
name = "Bombing List"
/datum/admin_secret_item/admin_secret/bombing_list/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat = span_bold("Bombing List")
for(var/l in GLOB.bombers)
dat += text("[l]<BR>")
var/datum/browser/popup = new(user, "bombers", "Bombers")
popup.set_content(dat)
popup.open()

View File

@@ -1,39 +0,0 @@
/datum/admin_secret_item/admin_secret/jump_shuttle
name = "Jump a Shuttle"
/datum/admin_secret_item/admin_secret/jump_shuttle/can_execute(var/mob/user)
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/jump_shuttle/execute(var/mob/user)
. = ..()
if(!.)
return
var/shuttle_tag = tgui_input_list(user, "Which shuttle do you want to jump?", "Shuttle Choice", SSshuttles.shuttles)
if (!shuttle_tag) return
var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag]
var/list/area_choices = return_areas()
var/origin_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!origin_area) return
var/destination_area = tgui_input_list(user, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!destination_area) return
var/long_jump = tgui_alert(user, "Is there a transition area for this jump?","Transition?", list("Yes","No"))
if(!long_jump)
return
if (long_jump == "Yes")
var/transition_area = tgui_input_list(user, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!transition_area) return
var/move_duration = tgui_input_number(user, "How many seconds will this jump take?")
S.long_jump(area_choices[origin_area], area_choices[destination_area], area_choices[transition_area], move_duration)
message_admins(span_notice("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle"), 1)
log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle")
else
S.short_jump(area_choices[origin_area], area_choices[destination_area])
message_admins(span_notice("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle"), 1)
log_admin("[key_name_admin(user)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle")

View File

@@ -1,26 +0,0 @@
/datum/admin_secret_item/admin_secret/launch_shuttle
name = "Launch a Shuttle"
/datum/admin_secret_item/admin_secret/launch_shuttle/can_execute(var/mob/user)
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/launch_shuttle/execute(var/mob/user)
. = ..()
if(!.)
return
var/list/valid_shuttles = list()
for (var/shuttle_tag in SSshuttles.shuttles)
if (istype(SSshuttles.shuttles[shuttle_tag], /datum/shuttle/autodock))
valid_shuttles += shuttle_tag
var/shuttle_tag = tgui_input_list(user, "Which shuttle do you want to launch?", "Shuttle Choice", valid_shuttles)
if (!shuttle_tag)
return
var/datum/shuttle/autodock/S = SSshuttles.shuttles[shuttle_tag]
if (S.can_launch())
S.launch(user)
log_and_message_admins("launched the [shuttle_tag] shuttle", user)
else
tgui_alert_async(user, "The [shuttle_tag] shuttle cannot be launched at this time. It's probably busy.")

View File

@@ -1,26 +0,0 @@
/datum/admin_secret_item/admin_secret/launch_shuttle_forced
name = "Launch a Shuttle (Forced)"
/datum/admin_secret_item/admin_secret/launch_shuttle_forced/can_execute(var/mob/user)
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/launch_shuttle_forced/execute(var/mob/user)
. = ..()
if(!.)
return
var/list/valid_shuttles = list()
for (var/shuttle_tag in SSshuttles.shuttles)
if (istype(SSshuttles.shuttles[shuttle_tag], /datum/shuttle/autodock))
valid_shuttles += shuttle_tag
var/shuttle_tag = tgui_input_list(user, "Which shuttle's launch do you want to force?", "Shuttle Choice", valid_shuttles)
if (!shuttle_tag)
return
var/datum/shuttle/autodock/S = SSshuttles.shuttles[shuttle_tag]
if (S.can_force())
S.force_launch(user)
log_and_message_admins("forced the [shuttle_tag] shuttle", user)
else
tgui_alert_async(user, "The [shuttle_tag] shuttle launch cannot be forced at this time. It's busy, or hasn't been launched yet.")

View File

@@ -1,17 +0,0 @@
/datum/admin_secret_item/admin_secret/list_dna
name = "List DNA (Blood)"
/datum/admin_secret_item/admin_secret/list_dna/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat = span_bold("Showing DNA from blood.") + "<HR>"
dat += "<table cellspacing=5><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"
for(var/mob/living/carbon/human/H in mob_list)
if(H.dna && H.ckey)
dat += "<tr><td>[H]</td><td>[H.dna.unique_enzymes]</td><td>[H.dna ? H.dna.b_type : DEFAULT_BLOOD_TYPE]</td></tr>"
dat += "</table>"
var/datum/browser/popup = new(user, "DNA", "DNA", 440, 410)
popup.set_content(dat)
popup.open()

View File

@@ -1,22 +0,0 @@
/datum/admin_secret_item/admin_secret/list_fingerprints
name = "List Fingerprints"
/datum/admin_secret_item/admin_secret/list_fingerprints/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat = span_bold("Showing Fingerprints.") + "<HR>"
dat += "<table cellspacing=5><tr><th>Name</th><th>Fingerprints</th></tr>"
for(var/mob/living/carbon/human/H in mob_list)
if(H.ckey)
if(H.dna && H.dna.uni_identity)
dat += "<tr><td>[H]</td><td>[md5(H.dna.uni_identity)]</td></tr>"
else if(H.dna && !H.dna.uni_identity)
dat += "<tr><td>[H]</td><td>H.dna.uni_identity = null</td></tr>"
else if(!H.dna)
dat += "<tr><td>[H]</td><td>H.dna = null</td></tr>"
dat += "</table>"
var/datum/browser/popup = new(user, "fingerprints", "Fingerprints", 440, 410)
popup.set_content(dat)
popup.open()

View File

@@ -1,27 +0,0 @@
/datum/admin_secret_item/admin_secret/move_shuttle
name = "Move a Shuttle"
/datum/admin_secret_item/admin_secret/move_shuttle/can_execute(var/mob/user)
if(!SSshuttles) return 0
return ..()
/datum/admin_secret_item/admin_secret/move_shuttle/execute(var/mob/user)
. = ..()
if(!.)
return
var/confirm = tgui_alert(user, "This command directly moves a shuttle from one area to another. DO NOT USE THIS UNLESS YOU ARE DEBUGGING A SHUTTLE AND YOU KNOW WHAT YOU ARE DOING.", "Are you sure?", list("Ok", "Cancel"))
if (confirm != "Ok")
return
var/shuttle_tag = tgui_input_list(user, "Which shuttle do you want to jump?", "Shuttle Choice", SSshuttles.shuttles)
if (!shuttle_tag) return
var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag]
var/destination_tag = tgui_input_list(user, "Which landmark do you want to jump to? (IF YOU GET THIS WRONG THINGS WILL BREAK)", "Landmark Choice", SSshuttles.registered_shuttle_landmarks)
if (!destination_tag) return
var/destination_location = SSshuttles.get_landmark(destination_tag)
if (!destination_location) return
S.attempt_move(destination_location)
log_and_message_admins("moved the [shuttle_tag] shuttle", user)

View File

@@ -1,38 +0,0 @@
/datum/admin_secret_item/admin_secret/prison_warp
name = "Prison Warp"
/datum/admin_secret_item/admin_secret/prison_warp/can_execute(var/mob/user)
if(!ticker) return 0
return ..()
/datum/admin_secret_item/admin_secret/prison_warp/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/mob/living/carbon/human/H in mob_list)
var/turf/T = get_turf(H)
var/security = 0
if((T in using_map.admin_levels) || GLOB.prisonwarped.Find(H))
//don't warp them if they aren't ready or are already there
continue
H.Paralyse(5)
if(H.wear_id)
var/obj/item/card/id/id = H.get_idcard()
for(var/A in id.GetAccess())
if(A == access_security)
security++
if(!security)
//strip their stuff before they teleport into a cell :downs:
for(var/obj/item/W in H)
if(istype(W, /obj/item/organ/external))
continue
//don't strip organs
H.drop_from_inventory(W)
//teleport person to cell
H.loc = pick(GLOB.prisonwarp)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
else
//teleport security person
H.loc = pick(GLOB.prisonsecuritywarp)
GLOB.prisonwarped += H

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/admin_secret/show_ai_laws
name = "Show AI laws"
/datum/admin_secret_item/admin_secret/show_ai_laws/execute(var/mob/user)
. = ..()
if(.)
user.client.holder.output_ai_laws()

View File

@@ -1,14 +0,0 @@
/datum/admin_secret_item/admin_secret/show_crew_manifest
name = "Show Crew Manifest"
/datum/admin_secret_item/admin_secret/show_crew_manifest/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat
dat += "<h4>Crew Manifest</h4>"
dat += GLOB.data_core.get_manifest()
var/datum/browser/popup = new(user, "manifest", "Manifest", 370, 420)
popup.set_content(dat)
popup.open()

View File

@@ -1,14 +0,0 @@
/datum/admin_secret_item/admin_secret/show_game_mode
name = "Show Game Mode"
/datum/admin_secret_item/admin_secret/show_game_mode/can_execute(var/mob/user)
if(!ticker)
return 0
return ..()
/datum/admin_secret_item/admin_secret/show_game_mode/execute(var/mob/user)
. = ..()
if(!.)
return
if (ticker.mode) tgui_alert_async(usr, "The game mode is [ticker.mode.name]")
else tgui_alert_async(usr, "For some reason there's a ticker, but not a game mode")

View File

@@ -1,18 +0,0 @@
/datum/admin_secret_item/admin_secret/show_law_changes
name = "Show law changes"
/datum/admin_secret_item/admin_secret/show_law_changes/name()
return "Show Last [length(GLOB.lawchanges)] Law change\s"
/datum/admin_secret_item/admin_secret/show_law_changes/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat = span_bold("Showing last [length(GLOB.lawchanges)] law changes.") + "<HR>"
for(var/sig in GLOB.lawchanges)
dat += "[sig]<BR>"
var/datum/browser/popup = new(user, "lawchanges", "Lawcahnges", 800, 500)
popup.set_content(dat)
popup.open()

View File

@@ -1,18 +0,0 @@
/datum/admin_secret_item/admin_secret/show_signalers
name = "Show Last Signalers"
/datum/admin_secret_item/admin_secret/show_signalers/name()
return "Show Last [length(GLOB.lastsignalers)] Signaler\s"
/datum/admin_secret_item/admin_secret/show_signalers/execute(var/mob/user)
. = ..()
if(!.)
return
var/dat = span_bold("Showing last [length(GLOB.lastsignalers)] signalers.") + "<HR>"
for(var/sig in GLOB.lastsignalers)
dat += "[sig]<BR>"
var/datum/browser/popup = new(user, "lastsignalers", "Last Signallers", 800, 500)
popup.set_content(dat)
popup.open()

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/admin_secret/traitors_and_objectives
name = "Show current traitors and objectives"
/datum/admin_secret_item/admin_secret/traitors_and_objectives/execute(var/mob/user)
. = ..()
if(.)
user.client.holder.check_antagonists()

View File

@@ -1,11 +0,0 @@
/datum/admin_secret_item/final_solution/summon_narsie
name = "Summon Nar-Sie"
/datum/admin_secret_item/final_solution/summon_narsie/execute(var/mob/user)
. = ..()
if(!.)
return
var/choice = tgui_alert(user, "You sure you want to end the round and summon Nar-Sie at your location? Misuse of this could result in removal of flags or hilarity.","WARNING!",list("PRAISE SATAN", "Cancel"))
if(choice == "PRAISE SATAN")
new /obj/singularity/narsie/large(get_turf(user))
log_and_message_admins("has summoned Nar-Sie and brought about a new realm of suffering.", user)

View File

@@ -1,13 +0,0 @@
/datum/admin_secret_item/final_solution/supermatter_cascade
name = "Supermatter Cascade"
/datum/admin_secret_item/final_solution/supermatter_cascade/execute(var/mob/user)
. = ..()
if(!.)
return
var/choice = tgui_alert(user, "You sure you want to destroy the universe and create a large explosion at your location? Misuse of this could result in removal of flags or hilarity.","WARNING!", list("NO TIME TO EXPLAIN", "Cancel"))
if(choice == "NO TIME TO EXPLAIN")
explosion(get_turf(user), 8, 16, 24, 32, 1)
new /turf/unsimulated/wall/supermatter(get_turf(user))
SetUniversalState(/datum/universal_state/supermatter_cascade)
message_admins("[key_name_admin(user)] has managed to destroy the universe with a supermatter cascade. Good job, [key_name_admin(user)]")

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/fun_secret/break_all_lights
name = "Break All Lights"
/datum/admin_secret_item/fun_secret/break_all_lights/execute(var/mob/user)
. = ..()
if(.)
lightsout(0,0)

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/fun_secret/break_some_lights
name = "Break Some Lights"
/datum/admin_secret_item/fun_secret/break_some_lights/execute(var/mob/user)
. = ..()
if(.)
lightsout(1,2)

View File

@@ -1,10 +0,0 @@
/datum/admin_secret_item/fun_secret/fix_all_lights
name = "Fix All Lights"
/datum/admin_secret_item/fun_secret/fix_all_lights/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/obj/machinery/light/L in GLOB.machines)
L.fix()

View File

@@ -1,48 +0,0 @@
/datum/admin_secret_item/fun_secret/ghost_mode
name = "Ghost Mode"
var/list/affected_mobs
/datum/admin_secret_item/fun_secret/ghost_mode/New()
..()
affected_mobs = list()
/datum/admin_secret_item/fun_secret/ghost_mode/execute(var/mob/user)
. = ..()
if(!.)
return
var/list/affected_areas = list()
for(var/mob/M in living_mob_list)
if(M.stat == CONSCIOUS && !(M in affected_mobs))
affected_mobs |= M
switch(rand(1,4))
if(1)
M.show_message(span_notice("You shudder as if cold..."), 1)
if(2)
M.show_message(span_notice("You feel something gliding across your back..."), 1)
if(3)
M.show_message(span_notice("Your eyes twitch, you feel like something you can't see is here..."), 1)
if(4)
M.show_message(span_notice("You notice something moving out of the corner of your eye, but nothing is there..."), 1)
for(var/obj/W in orange(5,M))
if(prob(25) && !W.anchored)
step_rand(W)
var/area/A = get_area(M)
if(A.requires_power && !A.always_unpowered && A.power_light && (A.z in using_map.player_levels))
affected_areas |= get_area(M)
affected_mobs |= user
for(var/area/AffectedArea in affected_areas)
AffectedArea.power_light = 0
AffectedArea.power_change()
spawn(rand(25,50))
AffectedArea.power_light = 1
AffectedArea.power_change()
sleep(100)
for(var/mob/M in affected_mobs)
M.show_message(span_notice("The chilling wind suddenly stops..."), 1)
affected_mobs.Cut()
affected_areas.Cut()

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/fun_secret/only_one
name = "There Can Be Only One"
/datum/admin_secret_item/fun_secret/only_one/execute(var/mob/user)
. = ..()
if(.)
only_one()

View File

@@ -1,14 +0,0 @@
/datum/admin_secret_item/fun_secret/paintbal_mode
name = "Paintball Mode"
/datum/admin_secret_item/fun_secret/paintbal_mode/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/species in GLOB.all_species)
var/datum/species/S = GLOB.all_species[species]
S.blood_color = "rainbow"
for(var/obj/effect/decal/cleanable/blood/B in world)
B.basecolor = "rainbow"
B.update_icon()

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/fun_secret/power_all_smes
name = "Power All SMES"
/datum/admin_secret_item/fun_secret/power_all_smes/execute(var/mob/user)
. = ..()
if(.)
power_restore_quick()

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/fun_secret/power_failure_begin
name = "Power Failure Begin"
/datum/admin_secret_item/fun_secret/power_failure_begin/execute(var/mob/user)
. = ..()
if(.)
power_failure()

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/fun_secret/power_failure_end
name = "Power Failure End"
/datum/admin_secret_item/fun_secret/power_failure_end/execute(var/mob/user)
. = ..()
if(.)
power_restore()

View File

@@ -1,10 +0,0 @@
/datum/admin_secret_item/fun_secret/remove_all_clothing
name = "Remove ALL Clothing"
/datum/admin_secret_item/fun_secret/remove_all_clothing/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/obj/item/clothing/O in world)
qdel(O)

View File

@@ -1,10 +0,0 @@
/datum/admin_secret_item/fun_secret/remove_internal_clothing
name = "Remove 'Internal' Clothing"
/datum/admin_secret_item/fun_secret/remove_internal_clothing/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/obj/item/clothing/under/O in world)
qdel(O)

View File

@@ -1,11 +0,0 @@
/datum/admin_secret_item/fun_secret/send_strike_team
name = "Send Strike Team"
/datum/admin_secret_item/fun_secret/send_strike_team/can_execute(var/mob/user)
if(!ticker) return 0
return ..()
/datum/admin_secret_item/fun_secret/send_strike_team/execute(var/mob/user)
. = ..()
if(.)
return user.client.strike_team()

View File

@@ -1,21 +0,0 @@
/datum/admin_secret_item/fun_secret/toggle_bomb_cap
name = "Toggle Bomb Cap"
permissions = R_SERVER
/datum/admin_secret_item/fun_secret/toggle_bomb_cap/execute(var/mob/user)
. = ..()
if(!.)
return
switch(GLOB.max_explosion_range)
if(14) GLOB.max_explosion_range = 16
if(16) GLOB.max_explosion_range = 20
if(20) GLOB.max_explosion_range = 28
if(28) GLOB.max_explosion_range = 56
if(56) GLOB.max_explosion_range = 128
if(128) GLOB.max_explosion_range = 14
var/range_dev = GLOB.max_explosion_range *0.25
var/range_high = GLOB.max_explosion_range *0.5
var/range_low = GLOB.max_explosion_range
message_admins(span_danger("[key_name_admin(user)] changed the bomb cap to [range_dev], [range_high], [range_low]"), 1)
log_admin("[key_name_admin(user)] changed the bomb cap to [GLOB.max_explosion_range]")

View File

@@ -1,13 +0,0 @@
/datum/admin_secret_item/fun_secret/triple_ai_mode
name = "Triple AI Mode"
/datum/admin_secret_item/fun_secret/triple_ai_mode/can_execute(var/mob/user)
if(ticker && ticker.current_state > GAME_STATE_PREGAME)
return 0
return ..()
/datum/admin_secret_item/admin_secret/triple_ai_mode/execute(var/mob/user)
. = ..()
if(.)
user.client.triple_ai()

View File

@@ -1,11 +0,0 @@
/datum/admin_secret_item/fun_secret/turn_humans_into_corgies
name = "Turn All Humans Into Corgies"
/datum/admin_secret_item/fun_secret/turn_humans_into_corgies/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/mob/living/carbon/human/H in mob_list)
spawn(0)
H.corgize()

View File

@@ -1,11 +0,0 @@
/datum/admin_secret_item/fun_secret/turn_humans_into_monkeys
name = "Turn All Humans Into Monkeys"
/datum/admin_secret_item/fun_secret/turn_humans_into_monkeys/execute(var/mob/user)
. = ..()
if(!.)
return
for(var/mob/living/carbon/human/H in mob_list)
spawn(0)
H.monkeyize()

View File

@@ -1,31 +0,0 @@
/**********
* Gravity *
**********/
/datum/admin_secret_item/random_event/gravity
name = "Toggle Station Artificial Gravity"
/datum/admin_secret_item/random_event/gravity/can_execute(var/mob/user)
if(!(ticker && ticker.mode))
return 0
return ..()
/datum/admin_secret_item/random_event/gravity/execute(var/mob/user)
. = ..()
if(!.)
return
GLOB.gravity_is_on = !GLOB.gravity_is_on
for(var/area/A in world)
A.gravitychange(GLOB.gravity_is_on)
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","Grav")
if(GLOB.gravity_is_on)
log_admin("[key_name(user)] toggled gravity on.", 1)
message_admins(span_notice("[key_name_admin(user)] toggled gravity on."), 1)
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
else
log_admin("[key_name(user)] toggled gravity off.", 1)
message_admins(span_notice("[key_name_admin(usr)] toggled gravity off."), 1)
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")

View File

@@ -1,34 +0,0 @@
/**********
* Gravity *
**********/
/datum/admin_secret_item/random_event/gravity
name = "Toggle Station Artificial Gravity"
/datum/admin_secret_item/random_event/gravity/can_execute(var/mob/user)
if(!(ticker && ticker.mode))
return 0
return ..()
/datum/admin_secret_item/random_event/gravity/execute(var/mob/user)
. = ..()
if(!.)
return
GLOB.gravity_is_on = !GLOB.gravity_is_on
for(var/obj/machinery/gravity_generator/main/GG in GLOB.machines)
if(GG.z in using_map.station_levels)
GG.breaker = GLOB.gravity_is_on
GG.set_power()
GG.charge_count = GLOB.gravity_is_on ? 90 : 10
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","Grav")
if(GLOB.gravity_is_on)
log_admin("[key_name(user)] toggled gravity on.", 1)
message_admins(span_notice("[key_name_admin(user)] toggled gravity on."), 1)
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
else
log_admin("[key_name(user)] toggled gravity off.", 1)
message_admins(span_notice("[key_name_admin(usr)] toggled gravity off."), 1)
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled. Please wait for the system to reinitialize, or contact your engineering department.", "Gravity Failure")

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/random_event/trigger_cordical_borer_infestation
name = "Trigger a Cortical Borer infestation"
/datum/admin_secret_item/random_event/trigger_cordical_borer_infestation/execute(var/mob/user)
. = ..()
if(.)
return borers.attempt_random_spawn()

View File

@@ -1,7 +0,0 @@
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation
name = "Trigger a Xenomorph Infestation"
/datum/admin_secret_item/random_event/trigger_xenomorph_infestation/execute(var/mob/user)
. = ..()
if(.)
return xenomorphs.attempt_random_spawn()

View File

@@ -1726,13 +1726,13 @@
log_and_message_admins("created [number] [english_list(paths)]")
return
else if(href_list["admin_secrets_panel"])
var/datum/admin_secret_category/AC = locate(href_list["admin_secrets_panel"]) in admin_secrets.categories
src.Secrets(AC)
//else if(href_list["admin_secrets_panel"])
//var/datum/admin_secret_category/AC = locate(href_list["admin_secrets_panel"]) in admin_secrets.categories
//src.Secrets(AC)
else if(href_list["admin_secrets"])
var/datum/admin_secret_item/item = locate(href_list["admin_secrets"]) in admin_secrets.items
item.execute(usr)
//else if(href_list["admin_secrets"])
//var/datum/admin_secret_item/item = locate(href_list["admin_secrets"]) in admin_secrets.items
//item.execute(usr)
else if(href_list["ac_view_wanted"]) //Admin newscaster Topic() stuff be here
src.admincaster_screen = 18 //The ac_ prefix before the hrefs stands for AdminCaster.

View File

@@ -187,16 +187,15 @@ Example: USING PROCCALL = BLOCKING, SELECT = FORCE_NULLS, PRIORITY = HIGH SELECT
state = SDQL2_STATE_ERROR;\
CRASH("SDQL2 fatal error");};
/client/proc/SDQL2_query(query_text as message)
set category = "Debug.Misc"
if(!check_rights(R_DEBUG)) //Shouldn't happen... but just to be safe.
message_admins(span_danger("ERROR: Non-admin [key_name(usr)] attempted to execute a SDQL query!"))
log_admin("Non-admin [key_name(usr)] attempted to execute a SDQL query!")
return FALSE
var/list/results = world.SDQL2_query(query_text, key_name_admin(usr), "[key_name(usr)]")
ADMIN_VERB(sdql2_query, R_DEBUG, "SDQL2 Query", "Run a SDQL2 query.", ADMIN_CATEGORY_DEBUG, query_text as message)
var/prompt = tgui_alert(user, "Run SDQL2 Query?", "SDQL2", list("Yes", "Cancel"))
if (prompt != "Yes")
return
var/list/results = world.SDQL2_query(query_text, key_name_admin(user), "[key_name(user)]")
if(length(results) == 3)
for(var/I in 1 to 3)
to_chat(usr, results[I])
to_chat(user, span_admin(results[I]), confidential = TRUE)
//SSblackbox.record_feedback("nested tally", "SDQL query", 1, list(user.ckey, query_text))
/world/proc/SDQL2_query(query_text, log_entry1, log_entry2)
var/query_log = "executed SDQL query(s): \"[query_text]\"."

View File

@@ -583,7 +583,7 @@ CHOMP Remove end */
AI.wander = FALSE
if(pa.Find("alt") && isatom(object))
to_chat(user, span_notice("Adding [object] to Entity Narrate List!"))
user.client.add_mob_for_narration(object)
SSadmin_verbs.dynamic_invoke_verb(user.client, /datum/admin_verb/add_mob_for_narration, object)
if(pa.Find("right"))

View File

@@ -737,3 +737,47 @@
set desc = "Reloads the dmis from the test folder and creates the test datums."
SSrobot_sprites.reload_test_sprites()
ADMIN_VERB(quick_nif, R_ADMIN, "Quick NIF", "Spawns a NIF into someone in quick-implant mode.", "Fun.Add Nif")
var/input_NIF
var/mob/living/carbon/human/H = tgui_input_list(user, "Pick a mob with a player","Quick NIF", player_list)
if(!H)
return
if(!istype(H))
to_chat(user, span_warning("That mob type ([H.type]) doesn't support NIFs, sorry."))
return
if(!H.get_organ(BP_HEAD))
to_chat(user, span_warning("Target is unsuitable."))
return
if(H.nif)
to_chat(user, span_warning("Target already has a NIF."))
return
if(H.species.flags & NO_DNA)
var/obj/item/nif/S = /obj/item/nif/bioadap
input_NIF = initial(S.name)
new /obj/item/nif/bioadap(H)
else
var/list/NIF_types = typesof(/obj/item/nif)
var/list/NIFs = list()
for(var/NIF_type in NIF_types)
var/obj/item/nif/S = NIF_type
NIFs[capitalize(initial(S.name))] = NIF_type
var/list/show_NIFs = sortList(NIFs) // the list that will be shown to the user to pick from
input_NIF = tgui_input_list(user, "Pick the NIF type","Quick NIF", show_NIFs)
var/chosen_NIF = NIFs[capitalize(input_NIF)]
if(chosen_NIF)
new chosen_NIF(H)
else
new /obj/item/nif(H)
log_and_message_admins("Quick NIF'd [H.real_name] with a [input_NIF].", user)
feedback_add_details("admin_verb","QNIF") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!

View File

@@ -24,75 +24,63 @@
//Appears as a right click verb on any obj and mob within view range.
//when not right clicking we get a list to pick from in aforementioned view range.
/client/proc/add_mob_for_narration(E as obj|mob|turf in orange(world.view))
set name = "Narrate Entity (Add ref)"
set desc = "Saves a reference of target mob to be called when narrating."
set category = "Fun.Narrate"
if(!check_rights(R_FUN)) return
ADMIN_VERB(add_mob_for_narration, R_FUN, "Narrate Entity (Add ref)", "Saves a reference of target mob to be called when narrating.", "Fun.Narrate", E as obj|mob|turf in orange(world.view))
//Making sure we got the list datum on our client.
if(!entity_narrate_holder)
entity_narrate_holder = new /datum/entity_narrate()
if(!istype(entity_narrate_holder, /datum/entity_narrate))
if(!user.entity_narrate_holder)
user.entity_narrate_holder = new /datum/entity_narrate()
if(!istype(user.entity_narrate_holder, /datum/entity_narrate))
return
var/datum/entity_narrate/holder = entity_narrate_holder
var/datum/entity_narrate/holder = user.entity_narrate_holder
//Since we extended to include all atoms, we're shutting things down with a guard clause for ghosts
if(istype(E, /mob/observer))
to_chat(usr, span_notice("Ghosts shouldn't be narrated! If you want a ghost, make it a subtype of mob/living!"))
to_chat(user, span_notice("Ghosts shouldn't be narrated! If you want a ghost, make it a subtype of mob/living!"))
return
//We require a static mob/living type to check for .client and also later on, to use the unique .say mechanics for stuttering and language
if(isliving(E))
var/mob/living/L = E
if(L.client)
to_chat(usr, span_notice("[L.name] is a player. All attempts to speak through them \
to_chat(user, span_notice("[L.name] is a player. All attempts to speak through them \
gets logged in case of abuse."))
log_and_message_admins("has added [L.ckey]'s mob to their entity narrate list", usr)
log_and_message_admins("has added [L.ckey]'s mob to their entity narrate list", user)
return
var/unique_name = sanitize(tgui_input_text(usr, "Please give the entity a unique name to track internally. \
var/unique_name = sanitize(tgui_input_text(user, "Please give the entity a unique name to track internally. \
This doesn't override how it appears in game", "tracker", L.name))
if(unique_name in holder.entity_names)
to_chat(usr, span_notice("[unique_name] is not unique! Pick another!"))
add_mob_for_narration(L) //Recursively calling ourselves until cancelled or a unique name is given.
to_chat(user, span_notice("[unique_name] is not unique! Pick another!"))
SSadmin_verbs.dynamic_invoke_verb(user, /datum/admin_verb/add_mob_for_narration, L) //Recursively calling ourselves until cancelled or a unique name is given.
return
holder.entity_names += unique_name
holder.entity_refs[unique_name] = WEAKREF(L)
log_and_message_admins("added [L.name] for their personal list to narrate", usr) //Logging here to avoid spam, while still safeguarding abuse
log_and_message_admins("added [L.name] for their personal list to narrate", user) //Logging here to avoid spam, while still safeguarding abuse
//Covering functionality for turfs and objs. We need static type to access the name var
else if(istype(E, /atom))
var/atom/A = E
var/unique_name = sanitize(tgui_input_text(usr, "Please give the entity a unique name to track internally. \
var/unique_name = sanitize(tgui_input_text(user, "Please give the entity a unique name to track internally. \
This doesn't override how it appears in game", "tracker", A.name))
if(unique_name in holder.entity_names)
to_chat(usr, span_notice("[unique_name] is not unique! Pick another!"))
add_mob_for_narration(A)
to_chat(user, span_notice("[unique_name] is not unique! Pick another!"))
SSadmin_verbs.dynamic_invoke_verb(user, /datum/admin_verb/add_mob_for_narration, A)
return
holder.entity_names += unique_name
holder.entity_refs[unique_name] = WEAKREF(A)
log_and_message_admins("added [A.name] for their personal list to narrate", usr) //Logging here to avoid spam, while still safeguarding abuse
log_and_message_admins("added [A.name] for their personal list to narrate", user) //Logging here to avoid spam, while still safeguarding abuse
//Proc for keeping our ref list relevant, deleting mobs that are no longer relevant for our event
/client/proc/remove_mob_for_narration()
set name = "Narrate Entity (Remove ref)"
set desc = "Remove mobs you're no longer narrating from your list for easier work."
set category = "Fun.Narrate"
if(!check_rights(R_FUN)) return
if(!entity_narrate_holder)
entity_narrate_holder = new /datum/entity_narrate()
to_chat(usr, "No references were added yet! First add references!")
ADMIN_VERB(remove_mob_for_narration, R_FUN, "Narrate Entity (Remove ref)", "Remove mobs you're no longer narrating from your list for easier work.", "Fun.Narrate")
if(!user.entity_narrate_holder)
user.entity_narrate_holder = new /datum/entity_narrate()
to_chat(user, "No references were added yet! First add references!")
return
if(!istype(entity_narrate_holder, /datum/entity_narrate))
if(!istype(user.entity_narrate_holder, /datum/entity_narrate))
return
var/datum/entity_narrate/holder = entity_narrate_holder
var/datum/entity_narrate/holder = user.entity_narrate_holder
var/options = holder.entity_names + "Clear All"
var/removekey = tgui_input_list(usr, "Choose which entity to remove", "remove reference", options, null)
var/removekey = tgui_input_list(user, "Choose which entity to remove", "remove reference", options, null)
if(removekey == "Clear All")
if(tgui_alert(usr, "Do you really want to clear your entity list?", "confirm", list("Yes", "No")) != "Yes")
if(tgui_alert(user, "Do you really want to clear your entity list?", "confirm", list("Yes", "No")) != "Yes")
return
holder.entity_names = list()
holder.entity_refs = list()
@@ -104,78 +92,63 @@
//For now brings up a list of all entities on our reference list and gives us the option to choose what we wanna do
//using TGUI/Byond list/alert inputs
//Does not actually interact with the game world, it passes user input to narrate_mob_args(name, mode, message) after sanitizing
/client/proc/narrate_mob()
set name = "Narrate Entity (Interface)"
set desc = "Send either a visible or audiable message through your chosen entities using an interface"
set category = "Fun.Narrate"
if(!check_rights(R_FUN)) return
if(!entity_narrate_holder)
entity_narrate_holder = new /datum/entity_narrate()
to_chat(usr, "No references were added yet! First add references!")
ADMIN_VERB(narrate_mob, R_FUN, "Narrate Entity (Interface)", "Send either a visible or audiable message through your chosen entities using an interface.", "Fun.Narrate")
if(!user.entity_narrate_holder)
user.entity_narrate_holder = new /datum/entity_narrate()
to_chat(user, "No references were added yet! First add references!")
return
if(!istype(entity_narrate_holder, /datum/entity_narrate))
if(!istype(user.entity_narrate_holder, /datum/entity_narrate))
return
var/datum/entity_narrate/holder = entity_narrate_holder
var/datum/entity_narrate/holder = user.entity_narrate_holder
//Obtaining and sanitizing arguments for the actual proc
var/choices = holder.entity_names + "Open TGUI"
var/which_entity = tgui_input_list(usr, "Choose which mob to narrate", "Narrate mob", choices, null)
var/which_entity = tgui_input_list(user, "Choose which mob to narrate", "Narrate mob", choices, null)
if(!which_entity) return
if(which_entity == "Open TGUI")
holder.tgui_interact(usr)
holder.tgui_interact(user)
else
var/mode = tgui_alert(usr, "Speak or emote?", "mode", list("Speak", "Emote", "Cancel"))
var/mode = tgui_alert(user, "Speak or emote?", "mode", list("Speak", "Emote", "Cancel"))
if(!mode || mode == "Cancel") return
var/message = tgui_input_text(usr, "Input what you want [which_entity] to [mode]", "narrate",
var/message = tgui_input_text(user, "Input what you want [which_entity] to [mode]", "narrate",
null, multiline = TRUE, prevent_enter = TRUE)
if(message)
narrate_mob_args(which_entity, mode, message)
SSadmin_verbs.dynamic_invoke_verb(user, /datum/admin_verb/narrate_mob_args, which_entity, mode, message)
//The actual logic of the verb. Called by narrate_mob() when used.
/client/proc/narrate_mob_args(name as text, mode as text, message as text)
set name = "Narrate Entity"
set desc = "Narrate entities using positional arguments. Name should be as saved in ref list, mode should be Speak or Emote, follow with message"
set category = "Fun.Narrate"
if(!check_rights(R_FUN)) return
if(!entity_narrate_holder)
entity_narrate_holder = new /datum/entity_narrate()
to_chat(usr, "No references were added yet! First add references!")
ADMIN_VERB(narrate_mob_args, R_FUN, "Narrate Entity", "Narrate entities using positional arguments. Name should be as saved in ref list, mode should be Speak or Emote, follow with message.", "Fun.Narrate", name as text, mode as text, message as text)
if(!user.entity_narrate_holder)
user.entity_narrate_holder = new /datum/entity_narrate()
to_chat(user, "No references were added yet! First add references!")
return
if(!istype(entity_narrate_holder, /datum/entity_narrate))
if(!istype(user.entity_narrate_holder, /datum/entity_narrate))
return
var/datum/entity_narrate/holder = entity_narrate_holder
var/datum/entity_narrate/holder = user.entity_narrate_holder
//Sanitizing args
name = sanitize(name)
mode = sanitize(mode)
if(!(mode in list("Speak", "Emote")))
to_chat(usr, span_notice("Valid modes are 'Speak' and 'Emote'."))
to_chat(user, span_notice("Valid modes are 'Speak' and 'Emote'."))
return
if(!holder.entity_refs[name])
to_chat(usr, span_notice("[name] not in saved references!"))
to_chat(user, span_notice("[name] not in saved references!"))
//Separate definition for mob/living and /obj due to .say() code allowing us to engage with languages, stuttering etc
//We also need this so we can check for .client
var/datum/weakref/wref = holder.entity_refs[name]
var/selection = wref.resolve()
if(!selection)
to_chat(usr, span_notice("[name] has invalid reference, deleting"))
to_chat(user, span_notice("[name] has invalid reference, deleting"))
holder.entity_names -= name
holder.entity_refs -= name
if(isliving(selection))
var/mob/living/our_entity = selection
if(our_entity.client) //Making sure we can't speak for players
log_and_message_admins("used entity-narrate to speak through [our_entity.ckey]'s mob", usr)
log_and_message_admins("used entity-narrate to speak through [our_entity.ckey]'s mob", user)
if(!message)
message = tgui_input_text(usr, "Input what you want [our_entity] to [mode]", "narrate", null) //say/emote sanitize already
message = tgui_input_text(user, "Input what you want [our_entity] to [mode]", "narrate", null) //say/emote sanitize already
if(message && mode == "Speak")
our_entity.say(message)
else if(message && mode == "Emote")
@@ -184,11 +157,11 @@
return
//This does cost us some code duplication, but I think it's worth it.
//furthermore, objs/turfs require the usr to specify the verb when speaking, otherwise it looks like an emote.
//furthermore, objs/turfs require the user to specify the verb when speaking, otherwise it looks like an emote.
else if(istype(selection, /atom))
var/atom/our_entity = selection
if(!message)
message = tgui_input_text(usr, "Input what you want [our_entity] to [mode]", "narrate", null)
message = tgui_input_text(user, "Input what you want [our_entity] to [mode]", "narrate", null)
message = encode_html_emphasis(sanitize(message))
if(message && mode == "Speak")
our_entity.audible_message(span_bold("[our_entity.name]") + " [message]")

View File

@@ -1,23 +1,20 @@
//Merged Doohl's and the existing ticklag as they both had good elements about them ~
//Replaces the old Ticklag verb, fps is easier to understand
/client/proc/set_server_fps()
set category = "Debug.Server"
set name = "Set Server FPS"
set desc = "Sets game speed in frames-per-second. Can potentially break the game"
ADMIN_VERB_VISIBILITY(set_server_fps, ADMIN_VERB_VISIBLITY_FLAG_MAPPING_DEBUG)
ADMIN_VERB(set_server_fps, R_DEBUG, "Set Server FPS", "Sets game speed in frames-per-second. Can potentially break the game", ADMIN_CATEGORY_DEBUG)
var/cfg_fps = CONFIG_GET(number/fps)
var/new_fps = round(input(user, "Sets game frames-per-second. Can potentially break the game (default: [cfg_fps])","FPS", world.fps) as num|null)
if(!check_rights(R_DEBUG))
return
var/new_fps = round(tgui_input_number(usr, "Sets game frames-per-second. Can potentially break the game (default: [CONFIG_GET(number/fps)])", "FPS", world.fps), round(CONFIG_GET(number/fps) * 1.5))
if(new_fps <= 0)
to_chat(src, span_danger("Error: set_server_fps(): Invalid world.fps value. No changes made."))
to_chat(user, span_danger("Error: set_server_fps(): Invalid world.fps value. No changes made."), confidential = TRUE)
return
if(new_fps > CONFIG_GET(number/fps) * 1.5)
if(tgui_alert(src, "You are setting fps to a high value:\n\t[new_fps] frames-per-second\n\tconfig.fps = [CONFIG_GET(number/fps)]", "Warning!", list("Confirm", "ABORT-ABORT-ABORT")) != "Confirm")
if(new_fps > cfg_fps * 1.5)
if(tgui_alert(user, "You are setting fps to a high value:\n\t[new_fps] frames-per-second\n\tconfig.fps = [cfg_fps]","Warning!",list("Confirm","ABORT-ABORT-ABORT")) != "Confirm")
return
var/msg = "[key_name(src)] has modified world.fps to [new_fps]"
var/msg = "[key_name(user)] has modified world.fps to [new_fps]"
log_admin(msg, 0)
message_admins(msg, 0)
world.change_fps(new_fps)
//SSblackbox.record_feedback("nested tally", "admin_toggle", 1, list("Set Server FPS", "[new_fps]")) // If you are copy-pasting this, ensure the 4th parameter is unique to the new proc!
feedback_add_details("admin_verb", "SETFPS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
CONFIG_SET(number/fps, new_fps)
world.change_fps(new_fps)

View File

@@ -1,20 +1,11 @@
//This proc allows download of past server logs saved within the data/logs/ folder.
//It works similarly to show-server-log.
/client/proc/getserverlog()
set name = "Get Server Logs"
set desc = "Fetch logfiles from data/logs"
set category = "Admin.Logs"
browseserverlogs()
ADMIN_VERB(get_server_logs, R_ADMIN, "Get Server Logs", "View or retrieve logfiles.", ADMIN_CATEGORY_MAIN)
user.browseserverlogs()
ADMIN_VERB(get_current_logs, R_ADMIN, "Get Current Logs", "View or retrieve logfiles for the current round.", ADMIN_CATEGORY_MAIN)
user.browseserverlogs(current=TRUE)
/client/proc/browseserverlogs(current=FALSE, runtimes=FALSE)
var/log_choice = BROWSE_ROOT_ALL_LOGS
if(current)
log_choice = BROWSE_ROOT_CURRENT_LOGS
else if (runtimes)
log_choice = BROWSE_ROOT_RUNTIME_LOGS
var/path = browse_files(log_choice)
feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/browseserverlogs(current=FALSE)
var/path = browse_files(current ? BROWSE_ROOT_CURRENT_LOGS : BROWSE_ROOT_ALL_LOGS)
if(!path)
return
@@ -22,9 +13,11 @@
return
message_admins("[key_name_admin(src)] accessed file: [path]")
switch(tgui_alert(src,"View (in game), Open (in your system's text editor), or Download?", path, list("View", "Open", "Download")))
feedback_add_details("admin_verb","VTL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
switch(tgui_alert(usr,"View (in game), Open (in your system's text editor), or Download?", path, list("View", "Open", "Download")))
if ("View")
src << browse("<html><pre style='word-wrap: break-word;'>[html_encode(file2text(file(path)))]</pre></html>", list2params(list("window" = "viewfile.[path]")))
src << browse(HTML_SKELETON("<pre style='word-wrap: break-word;'>[html_encode(file2text(file(path)))]</pre>"), list2params(list("window" = "viewfile.[path]")))
if ("Open")
src << run(file(path))
if ("Download")

View File

@@ -1,15 +1,10 @@
/client/proc/fixatmos()
set category = "Admin.Game"
set name = "Fix Atmospherics Grief"
if(!check_rights(R_ADMIN|R_DEBUG|R_EVENT)) return
if(tgui_alert(usr, "WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the station is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", list("No", "Yes")) != "Yes")
ADMIN_VERB(fix_atmos, (R_ADMIN|R_DEBUG|R_EVENT), "Fix Atmospherics Grief", "View or retrieve logfiles for the current round.", ADMIN_CATEGORY_GAME)
if(tgui_alert(user, "WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the station is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", list("No", "Yes")) != "Yes")
return
feedback_add_details("admin_verb","FA")
log_and_message_admins("Full atmosphere reset initiated by [usr].")
log_and_message_admins("Full atmosphere reset initiated by [user].")
to_world(span_danger("Initiating restart of atmosphere. The server may lag a bit."))
sleep(10)
var/current_time = world.timeofday
@@ -17,7 +12,7 @@
// Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes.
for(var/obj/machinery/power/supermatter/S in GLOB.machines)
S.power = 0
to_chat(usr, "\[1/5\] - Supermatter depowered")
to_chat(user, "\[1/5\] - Supermatter depowered")
// Remove all gases from all pipenets
for(var/datum/pipe_network/PN in SSmachines.networks)
@@ -25,13 +20,13 @@
G.gas = list()
G.update_values()
to_chat(usr, "\[2/5\] - All pipenets purged of gas.")
to_chat(user, "\[2/5\] - All pipenets purged of gas.")
// Delete all zones.
for(var/zone/Z in world)
Z.c_invalidate()
to_chat(usr, "\[3/5\] - All ZAS Zones removed.")
to_chat(user, "\[3/5\] - All ZAS Zones removed.")
var/list/unsorted_overlays = list()
for(var/id in GLOB.gas_data.tile_overlay)
@@ -43,9 +38,9 @@
T.vis_contents.Remove(unsorted_overlays)
T.zone = null
to_chat(usr, "\[4/5\] - All turfs reset to roundstart values.")
to_chat(user, "\[4/5\] - All turfs reset to roundstart values.")
SSair.RebootZAS()
to_chat(usr, "\[5/5\] - ZAS Rebooted")
to_chat(user, "\[5/5\] - ZAS Rebooted")
to_world(span_danger("Atmosphere restart completed in " + span_bold("[(world.timeofday - current_time)/10]") + " seconds."))

View File

@@ -0,0 +1,121 @@
// All the procs that admins can use to view something like a global list in a cleaner manner than just View Variables are contained in this file.
/datum/admins/proc/list_bombers()
if(!SSticker.HasRoundStarted())
tgui_alert(usr, "The game hasn't started yet!")
return
var/data = "<b>Bombing List</b><hr>"
for(var/entry in GLOB.bombers)
data += "[entry]<br>"
usr << browse(data, "window=bombers;size=800x500")
/datum/admins/proc/list_signalers()
if(!SSticker.HasRoundStarted())
tgui_alert(usr, "The game hasn't started yet!")
return
var/data = "<b>Showing last [length(GLOB.lastsignalers)] signalers.</b><hr>"
for(var/entry in GLOB.lastsignalers)
data += "[entry]<BR>"
usr << browse(data, "window=lastsignalers;size=800x500")
/datum/admins/proc/list_law_changes()
if(!SSticker.HasRoundStarted())
tgui_alert(usr, "The game hasn't started yet!")
return
var/data = "<b>Showing last [length(GLOB.lawchanges)] law changes.</b><hr>"
for(var/entry in GLOB.lawchanges)
data += "[entry]<BR>"
var/datum/browser/browser = new(usr, "lawchanges", "Law Changes", 800, 500)
browser.set_content(data)
browser.open()
/datum/admins/proc/list_dna()
var/data = "<b>Showing DNA from blood.</b><hr>"
data += "<table cellspacing=5 border=1><tr><th>Name</th><th>DNA</th><th>Blood Type</th></tr>"
for(var/entry in mob_list)
var/mob/living/carbon/human/subject = entry
if(subject.ckey)
data += "<tr><td>[subject]</td><td>[subject.dna?.unique_enzymes]</td><td>[subject.dna ? subject.dna.b_type : DEFAULT_BLOOD_TYPE]</td></tr>"
data += "</table>"
var/datum/browser/browser = new(usr, "DNA", "DNA Log", 440, 410)
browser.set_content(data)
browser.open()
/datum/admins/proc/list_fingerprints() //kid named fingerprints
var/data = "<b>Showing Fingerprints.</b><hr>"
data += "<table cellspacing=5 border=1><tr><th>Name</th><th>Fingerprints</th></tr>"
for(var/entry in mob_list)
var/mob/living/carbon/human/subject = entry
if(subject.ckey)
data += "<tr><td>[subject]</td><td>[md5(subject.dna?.uni_identity)]</td></tr>"
data += "</table>"
var/datum/browser/browser = new(usr, "fingerprints", "Fingerprint Log", 440, 410)
browser.set_content(data)
browser.open()
/datum/admins/proc/show_manifest()
if(!SSticker.HasRoundStarted())
tgui_alert(usr, "The game hasn't started yet!")
return
//GLOB.manifest.ui_interact(usr)
var/dat
dat += "<h4>Crew Manifest</h4>"
dat += GLOB.data_core.get_manifest()
var/datum/browser/popup = new(usr, "manifest", "Manifest", 370, 420)
popup.set_content(dat)
popup.open()
/datum/admins/proc/output_ai_laws()
var/ai_number = 0
for(var/mob/living/silicon/S in mob_list)
ai_number++
if(isAI(S))
to_chat(usr, span_bold("AI [key_name(S, usr)]'s laws:"))
else if(isrobot(S))
var/mob/living/silicon/robot/R = S
to_chat(usr, span_bold("CYBORG [key_name(S, usr)] [R.connected_ai?"(Slaved to: [R.connected_ai])":"(Independent)"]: laws:"))
else if (ispAI(S))
to_chat(usr, span_bold("pAI [key_name(S, usr)]'s laws:"))
else
to_chat(usr, span_bold("SOMETHING SILICON [key_name(S, usr)]'s laws:"))
if (S.laws == null)
to_chat(usr, "[key_name(S, usr)]'s laws are null?? Contact a coder.")
else
S.laws.show_laws(usr)
if(!ai_number)
to_chat(usr, span_bold("No AIs located")) //Just so you know the thing is actually working and not just ignoring you.
/* This part would require an update of the ai laws datum, but is replacing the above if implemented
var/law_bound_entities = 0
for(var/mob/living/silicon/subject as anything in mob_list)
law_bound_entities++
var/message = ""
if(isAI(subject))
message += "<b>AI [key_name(subject, usr)]'s laws:</b>"
else if(isrobot(subject))
var/mob/living/silicon/robot/borg = subject
message += "<b>CYBORG [key_name(subject, usr)] [borg.connected_ai?"(Slaved to: [key_name(borg.connected_ai)])":"(Independent)"]: laws:</b>"
else if (ispAI(subject))
message += "<b>pAI [key_name(subject, usr)]'s laws:</b>"
else
message += "<b>SOMETHING SILICON [key_name(subject, usr)]'s laws:</b>"
message += "<br>"
if (!subject.laws)
message += "[key_name(subject, usr)]'s laws are null?? Contact a coder."
else
message += jointext(subject.laws.get_law_list(include_zeroth = TRUE), "<br>")
to_chat(usr, message, confidential = TRUE)
if(!law_bound_entities)
to_chat(usr, "<b>No law bound entities located</b>", confidential = TRUE)
*/

View File

@@ -141,7 +141,6 @@ var/list/debug_verbs = list (
,/client/proc/cmd_assume_direct_control
,/client/proc/jump_to_dead_group
,/client/proc/startSinglo
,/client/proc/set_server_fps
,/client/proc/cmd_admin_grantfullaccess
,/client/proc/kaboom
,/client/proc/cmd_admin_areatest

View File

@@ -1,52 +1,37 @@
/proc/possess(obj/O as obj in world)
set name = "Possess Obj"
set category = "Object"
ADMIN_VERB_AND_CONTEXT_MENU(possess, R_POSSESS, "Possess Obj", "Possess an object.", ADMIN_CATEGORY_OBJECT, obj/O as obj in world)
if(istype(O,/obj/singularity))
if(CONFIG_GET(flag/forbid_singulo_possession))
to_chat(usr, "It is forbidden to possess singularities.")
to_chat(user, "It is forbidden to possess singularities.")
return
var/turf/T = get_turf(O)
if(T)
log_admin("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])")
message_admins("[key_name(usr)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])", 1)
log_admin("[key_name(user)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])")
message_admins("[key_name(user)] has possessed [O] ([O.type]) at ([T.x], [T.y], [T.z])", 1)
else
log_admin("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location")
message_admins("[key_name(usr)] has possessed [O] ([O.type]) at an unknown location", 1)
log_admin("[key_name(user)] has possessed [O] ([O.type]) at an unknown location")
message_admins("[key_name(user)] has possessed [O] ([O.type]) at an unknown location", 1)
if(!usr.control_object) //If you're not already possessing something...
usr.name_archive = usr.real_name
if(!user.mob.control_object) //If you're not already possessing something...
user.mob.name_archive = user.mob.real_name
usr.loc = O
usr.real_name = O.name
usr.name = O.name
usr.client.eye = O
usr.control_object = O
user.mob.loc = O
user.mob.real_name = O.name
user.mob.name = O.name
user.eye = O
user.mob.control_object = O
feedback_add_details("admin_verb","PO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/release(obj/O as obj in world)
set name = "Release Obj"
set category = "Object"
//usr.loc = get_turf(usr)
if(usr.control_object && usr.name_archive) //if you have a name archived and if you are actually relassing an object
usr.real_name = usr.name_archive
usr.name = usr.real_name
if(ishuman(usr))
var/mob/living/carbon/human/H = usr
ADMIN_VERB(release, R_POSSESS, "Release Object", "Stop possessing an object.", ADMIN_CATEGORY_OBJECT, obj/O as obj in world)
if(user.mob.control_object && user.mob.name_archive) //if you have a name archived and if you are actually relassing an object
user.mob.real_name = user.mob.name_archive
user.mob.name = user.mob.real_name
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.name = H.get_visible_name()
usr.loc = O.loc // Appear where the object you were controlling is -- TLE
usr.client.eye = usr
usr.control_object = null
user.mob.loc = O.loc // Appear where the object you were controlling is -- TLE
user.eye = user
user.mob.control_object = null
feedback_add_details("admin_verb","RO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/proc/givetestverbs(mob/M as mob in mob_list)
set desc = "Give this guy possess/release verbs"
set category = "Debug"
set name = "Give Possessing Verbs"
add_verb(M, /proc/possess)
add_verb(M, /proc/release)
feedback_add_details("admin_verb","GPV") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!

View File

@@ -384,19 +384,12 @@ If a guy was gibbed and you want to revive him, this is a good way to do so.
Works kind of like entering the game with a new character. Character receives a new mind if they didn't have one.
Traitors and the like can also be revived with the previous role mostly intact.
/N */
/client/proc/respawn_character()
set category = "Fun.Event Kit"
set name = "Spawn Character"
set desc = "(Re)Spawn a client's loaded character."
if(!holder)
return
var/client/picked_client = tgui_input_list(src, "Please specify which client's character to spawn.", "Client", GLOB.clients)
ADMIN_VERB(respawn_character, (R_ADMIN|R_REJUVINATE), "Spawn Character", "(Re)Spawn a client's loaded character.", "Fun.Event Kit")
var/client/picked_client = tgui_input_list(user, "Please specify which client's character to spawn.", "Client", GLOB.clients)
if(!picked_client)
return
respawn_character_proper(picked_client)
user.respawn_character_proper(picked_client)
/client/proc/respawn_character_proper(client/picked_client)
if(!istype(picked_client))

View File

@@ -85,14 +85,7 @@
return new_mob
/client/proc/cmd_admin_z_narrate() // Allows administrators to fluff events a little easier -- TLE
set category = "Fun.Narrate"
set name = "Z Narrate"
set desc = "Narrates to your Z level."
if (!holder)
return
ADMIN_VERB(cmd_admin_z_narrate, (R_ADMIN|R_MOD|R_EVENT), "Z Narrate", "Narrates to your Z level.", "Fun.Narrate") // Allows administrators to fluff events a little easier -- TLE
var/msg = tgui_input_text(usr, "Message:", text("Enter the text you wish to appear to everyone:"))
if (!msg)
@@ -104,14 +97,14 @@
if (!msg)
return
var/pos_z = get_z(src.mob)
var/pos_z = get_z(user.mob)
if (!pos_z)
return
for(var/mob/M in player_list)
if(M.z == pos_z)
to_chat(M, msg)
log_admin("ZNarrate: [key_name(usr)] : [msg]")
message_admins(span_blue(span_bold(" ZNarrate: [key_name_admin(usr)] : [msg]<BR>")), 1)
log_admin("ZNarrate: [key_name(user)] : [msg]")
message_admins(span_blue(span_bold(" ZNarrate: [key_name_admin(user)] : [msg]<BR>")), 1)
feedback_add_details("admin_verb","GLNA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/toggle_vantag_hud(var/mob/target as mob)

View File

@@ -1,11 +1,6 @@
/client/proc/resize(var/mob/living/L in mob_list)
set name = "Resize"
set desc = "Resizes any living mob without any restrictions on size."
set category = "Fun.Event Kit"
if(!check_rights(R_ADMIN|R_FUN|R_VAREDIT))
return
do_resize(L) //CHOMPEdit
ADMIN_VERB(resize, (R_ADMIN|R_FUN|R_VAREDIT), "Resize", "Resizes any living mob without any restrictions on size.", "Fun.Event Kit", mob/living/L in mob_list)
user.do_resize(L) //CHOMPEdit
/client/proc/do_resize(var/mob/living/L) //CHOMPEdit
var/size_multiplier = tgui_input_number(usr, "Input size multiplier.", "Resize", 1, round_value=FALSE)
@@ -17,11 +12,11 @@
var/very_big = is_extreme_size(size_multiplier)
if(very_big && can_be_big) // made an extreme size in an area that allows it, don't assume adminbuse
to_chat(src,span_warning("[L] will lose this size upon moving into an area where this size is not allowed."))
to_chat(src, span_warning("[L] will lose this size upon moving into an area where this size is not allowed.")) //CHOMPEdit
else if(very_big) // made an extreme size in an area that doesn't allow it, assume adminbuse
to_chat(src,span_warning("[L] will retain this normally unallowed size outside this area."))
to_chat(src, span_warning("[L] will retain this normally unallowed size outside this area.")) //CHOMPEdit
L.resize(size_multiplier, animate = TRUE, uncapped = TRUE, ignore_prefs = TRUE)
log_and_message_admins("has changed [key_name(L)]'s size multiplier to [size_multiplier].")
log_and_message_admins("has changed [key_name(L)]'s size multiplier to [size_multiplier].", src) //CHOMPEdit
feedback_add_details("admin_verb","RESIZE")

View File

@@ -0,0 +1,442 @@
ADMIN_VERB(secrets, R_HOLDER, "Secrets", "Abuse harder than you ever have before with this handy dandy semi-misc stuff menu.", "Admin.Secrets")
var/datum/secrets_menu/tgui = new(user)
tgui.tgui_interact(user.mob)
//BLACKBOX_LOG_ADMIN_VERB("Secrets Panel")
feedback_add_details("admin_verb","S") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/datum/secrets_menu
var/client/holder //client of whoever is using this datum
var/is_debugger = FALSE
var/is_funmin = FALSE
/datum/secrets_menu/New(user)//user can either be a client or a mob due to byondcode(tm)
if (istype(user, /client))
var/client/user_client = user
holder = user_client //if its a client, assign it to holder
else
var/mob/user_mob = user
holder = user_mob.client //if its a mob, assign the mob's client to holder
is_debugger = check_rights(R_DEBUG)
is_funmin = check_rights(R_FUN)
/datum/secrets_menu/tgui_state(mob/user)
return GLOB.tgui_admin_state// TGUI_ADMIN_STATE(R_NONE)
/datum/secrets_menu/tgui_close()
qdel(src)
/datum/secrets_menu/tgui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "Secrets")
ui.open()
/datum/secrets_menu/tgui_data(mob/user)
var/list/data = list()
data["is_debugger"] = is_debugger
data["is_funmin"] = is_funmin
return data
#define HIGHLANDER_DELAY_TEXT "40 seconds (crush the hope of a normal shift)"
/datum/secrets_menu/tgui_act(action, list/params, datum/tgui/ui, datum/tgui_state/state)
. = ..()
if(.)
return
if((action != "admin_log" || action != "show_admins") && !check_rights(R_ADMIN))
return
switch(action)
//Generic Buttons anyone can use.
if("admin_log")
var/dat
for(var/l in GLOB.admin_log)
dat += "<li>[l]</li>"
if(!GLOB.admin_log.len)
dat += "No-one has done anything this round!"
var/datum/browser/browser = new(holder, "admin_log", "Admin Logs", 600, 500)
browser.set_content(dat)
browser.open()
if("dialog_log")
var/dat = span_bold("Dialog Log<HR>")
dat += "<fieldset style='border: 2px solid white; display: inline'>"
for(var/l in GLOB.round_text_log)
dat += "<li>[l]</li>"
dat += "</fieldset>"
if(!GLOB.round_text_log)
dat += "No-one has said anything this round! (How odd?)"
var/datum/browser/browser = new(holder, "dialog_logs", "[src]", 550, 650, src)
browser.set_content(jointext(dat,null))
browser.open()
if("show_admins")
var/dat
if(GLOB.admin_datums)
for(var/ckey in GLOB.admin_datums)
var/datum/admins/D = GLOB.admin_datums[ckey]
dat += "[ckey] - [D.rank_names()]<br>"
var/datum/browser/browser = new(holder, "showadmins", "Current admins", 600, 500)
browser.set_content(dat)
browser.open()
if("show_traitors_and_objectives") // Not implemented in the UI
holder.holder.check_antagonists()
if("show_game_mode")
if (ticker.mode) tgui_alert_async(holder, "The game mode is [ticker.mode.name]")
else tgui_alert_async(holder, "For some reason there's a ticker, but not a game mode")
//Buttons for debug.
//tbd
//Buttons for helpful stuff. This is where people land in the tgui
if("list_bombers")
holder.holder.list_bombers()
if("list_signalers")
holder.holder.list_signalers()
if("list_lawchanges")
holder.holder.list_law_changes()
if("showailaws")
holder.holder.list_law_changes()
if("manifest")
holder.holder.show_manifest()
if("dna")
holder.holder.list_dna()
if("fingerprints")
holder.holder.list_fingerprints()
if("prison_warp")
for(var/mob/living/carbon/human/H in mob_list)
var/turf/T = get_turf(H)
var/security = 0
if((T in using_map.admin_levels) || GLOB.prisonwarped.Find(H))
//don't warp them if they aren't ready or are already there
continue
H.Paralyse(5)
if(H.wear_id)
var/obj/item/card/id/id = H.get_idcard()
for(var/A in id.GetAccess())
if(A == access_security)
security++
if(!security)
//strip their stuff before they teleport into a cell :downs:
for(var/obj/item/W in H)
if(istype(W, /obj/item/organ/external))
continue
//don't strip organs
H.drop_from_inventory(W)
//teleport person to cell
H.loc = pick(GLOB.prisonwarp)
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/prison(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/orange(H), slot_shoes)
else
//teleport security person
H.loc = pick(GLOB.prisonsecuritywarp)
GLOB.prisonwarped += H
if("night_shift_set")
var/val = tgui_alert(holder, "What do you want to set night shift to? This will override the automatic system until set to automatic again.", "Night Shift", list("On", "Off", "Automatic"))
switch(val)
if("Automatic")
if(CONFIG_GET(flag/enable_night_shifts))
SSnightshift.can_fire = TRUE
SSnightshift.fire()
else
SSnightshift.update_nightshift(active = FALSE, announce = TRUE, forced = TRUE)
if("On")
SSnightshift.can_fire = FALSE
SSnightshift.update_nightshift(active = TRUE, announce = TRUE, forced = TRUE)
if("Off")
SSnightshift.can_fire = FALSE
SSnightshift.update_nightshift(active = FALSE, announce = TRUE, forced = TRUE)
if("trigger_xenomorph_infestation")
xenomorphs.attempt_random_spawn()
if("trigger_cortical_borer_infestation")
borers.attempt_random_spawn()
if("jump_shuttle")
var/shuttle_tag = tgui_input_list(holder, "Which shuttle do you want to jump?", "Shuttle Choice", SSshuttles.shuttles)
if (!shuttle_tag) return
var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag]
var/list/area_choices = return_areas()
var/origin_area = tgui_input_list(holder, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!origin_area) return
var/destination_area = tgui_input_list(holder, "Which area is the shuttle at now? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!destination_area) return
var/long_jump = tgui_alert(holder, "Is there a transition area for this jump?","Transition?", list("Yes","No"))
if(!long_jump)
return
if (long_jump == "Yes")
var/transition_area = tgui_input_list(holder, "Which area is the transition area? (MAKE SURE THIS IS CORRECT OR THINGS WILL BREAK)", "Area Choice", area_choices)
if (!transition_area) return
var/move_duration = tgui_input_number(holder, "How many seconds will this jump take?")
S.long_jump(area_choices[origin_area], area_choices[destination_area], area_choices[transition_area], move_duration)
message_admins(span_notice("[key_name_admin(holder)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle"), 1)
log_admin("[key_name_admin(holder)] has initiated a jump from [origin_area] to [destination_area] lasting [move_duration] seconds for the [shuttle_tag] shuttle")
else
S.short_jump(area_choices[origin_area], area_choices[destination_area])
message_admins(span_notice("[key_name_admin(holder)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle"), 1)
log_admin("[key_name_admin(holder)] has initiated a jump from [origin_area] to [destination_area] for the [shuttle_tag] shuttle")
if("launch_shuttle_forced")
var/list/valid_shuttles = list()
for (var/shuttle_tag in SSshuttles.shuttles)
if (istype(SSshuttles.shuttles[shuttle_tag], /datum/shuttle/autodock))
valid_shuttles += shuttle_tag
var/shuttle_tag = tgui_input_list(holder, "Which shuttle's launch do you want to force?", "Shuttle Choice", valid_shuttles)
if (!shuttle_tag)
return
var/datum/shuttle/autodock/S = SSshuttles.shuttles[shuttle_tag]
if (S.can_force())
S.force_launch(holder)
log_and_message_admins("forced the [shuttle_tag] shuttle", holder)
else
tgui_alert_async(holder, "The [shuttle_tag] shuttle launch cannot be forced at this time. It's busy, or hasn't been launched yet.")
if("launch_shuttle")
var/list/valid_shuttles = list()
for (var/shuttle_tag in SSshuttles.shuttles)
if (istype(SSshuttles.shuttles[shuttle_tag], /datum/shuttle/autodock))
valid_shuttles += shuttle_tag
var/shuttle_tag = tgui_input_list(holder, "Which shuttle do you want to launch?", "Shuttle Choice", valid_shuttles)
if (!shuttle_tag)
return
var/datum/shuttle/autodock/S = SSshuttles.shuttles[shuttle_tag]
if (S.can_launch())
S.launch(holder)
log_and_message_admins("launched the [shuttle_tag] shuttle", holder)
else
tgui_alert_async(holder, "The [shuttle_tag] shuttle cannot be launched at this time. It's probably busy.")
if("move_shuttle")
var/confirm = tgui_alert(holder, "This command directly moves a shuttle from one area to another. DO NOT USE THIS UNLESS YOU ARE DEBUGGING A SHUTTLE AND YOU KNOW WHAT YOU ARE DOING.", "Are you sure?", list("Ok", "Cancel"))
if (confirm != "Ok")
return
var/shuttle_tag = tgui_input_list(holder, "Which shuttle do you want to jump?", "Shuttle Choice", SSshuttles.shuttles)
if (!shuttle_tag) return
var/datum/shuttle/S = SSshuttles.shuttles[shuttle_tag]
var/destination_tag = tgui_input_list(holder, "Which landmark do you want to jump to? (IF YOU GET THIS WRONG THINGS WILL BREAK)", "Landmark Choice", SSshuttles.registered_shuttle_landmarks)
if (!destination_tag) return
var/destination_location = SSshuttles.get_landmark(destination_tag)
if (!destination_location) return
S.attempt_move(destination_location)
log_and_message_admins("moved the [shuttle_tag] shuttle", holder)
//!fun! buttons.
if("ghost_mode")
var/list/affected_mobs = list()
var/list/affected_areas = list()
for(var/mob/M in living_mob_list)
if(M.stat == CONSCIOUS && !(M in affected_mobs))
affected_mobs |= M
switch(rand(1,4))
if(1)
M.show_message(span_notice("You shudder as if cold..."), 1)
if(2)
M.show_message(span_notice("You feel something gliding across your back..."), 1)
if(3)
M.show_message(span_notice("Your eyes twitch, you feel like something you can't see is here..."), 1)
if(4)
M.show_message(span_notice("You notice something moving out of the corner of your eye, but nothing is there..."), 1)
for(var/obj/W in orange(5,M))
if(prob(25) && !W.anchored)
step_rand(W)
var/area/A = get_area(M)
if(A.requires_power && !A.always_unpowered && A.power_light && (A.z in using_map.player_levels))
affected_areas |= get_area(M)
affected_mobs |= holder
for(var/area/AffectedArea in affected_areas)
AffectedArea.power_light = 0
AffectedArea.power_change()
spawn(rand(25,50))
AffectedArea.power_light = 1
AffectedArea.power_change()
sleep(100)
for(var/mob/M in affected_mobs)
M.show_message(span_notice("The chilling wind suddenly stops..."), 1)
affected_mobs.Cut()
affected_areas.Cut()
if("paintball_mode")
for(var/species in GLOB.all_species)
var/datum/species/S = GLOB.all_species[species]
S.blood_color = "rainbow"
for(var/obj/effect/decal/cleanable/blood/B in world)
B.basecolor = "rainbow"
B.update_icon()
if("power")
if(!is_funmin)
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Power All APCs"))
log_admin("[key_name(holder)] made all areas powered")
message_admins(span_adminnotice("[key_name_admin(holder)] made all areas powered"))
power_restore()
if("unpower")
if(!is_funmin)
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Depower All APCs"))
log_admin("[key_name(holder)] made all areas unpowered")
message_admins(span_adminnotice("[key_name_admin(holder)] made all areas unpowered"))
power_failure()
if("quickpower")
if(!is_funmin)
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Power All SMESs"))
log_admin("[key_name(holder)] made all SMESs powered")
message_admins(span_adminnotice("[key_name_admin(holder)] made all SMESs powered"))
power_restore_quick()
if("gravity")
GLOB.gravity_is_on = !GLOB.gravity_is_on
for(var/area/A in world)
A.gravitychange(GLOB.gravity_is_on)
feedback_inc("admin_secrets_fun_used",1)
feedback_add_details("admin_secrets_fun_used","Grav")
if(GLOB.gravity_is_on)
log_admin("[key_name(holder)] toggled gravity on.", 1)
message_admins(span_notice("[key_name_admin(holder)] toggled gravity on."), 1)
command_announcement.Announce("Gravity generators are again functioning within normal parameters. Sorry for any inconvenience.")
else
log_admin("[key_name(holder)] toggled gravity off.", 1)
message_admins(span_notice("[key_name_admin(holder)] toggled gravity off."), 1)
command_announcement.Announce("Feedback surge detected in mass-distributions systems. Artificial gravity has been disabled whilst the system reinitializes. Further failures may result in a gravitational collapse and formation of blackholes. Have a nice day.")
if("tripleAI")
if(!is_funmin)
return
holder.triple_ai()
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Triple AI"))
if("onlyone")
if(!is_funmin)
return
var/response = tgui_alert(usr,"Delay by 40 seconds?", "There can, in fact, only be one", list("Instant!", HIGHLANDER_DELAY_TEXT))
switch(response)
if("Instant!")
holder.only_one()
if(HIGHLANDER_DELAY_TEXT)
holder.only_one_delayed()
else
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("There Can Be Only One"))
if("blackout")
if(!is_funmin)
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Break All Lights"))
message_admins("[key_name_admin(holder)] broke all lights")
//for(var/obj/machinery/light/L as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light))
// L.break_light_tube()
// CHECK_TICK
lightsout(0,0)
if("partial_blackout")
if(!is_funmin)
return
message_admins("[key_name_admin(holder)] broke some lights")
lightsout(1,2)
if("whiteout")
if(!is_funmin)
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Fix All Lights"))
message_admins("[key_name_admin(holder)] fixed all lights")
//for(var/obj/machinery/light/L as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/light))
for(var/obj/machinery/light/L in GLOB.machines)
L.fix()
CHECK_TICK
if("changebombcap")
if(!is_funmin)
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Bomb Cap"))
//var/newBombCap = input(holder,"What would you like the new bomb cap to be. (entered as the light damage range (the 3rd number in common (1,2,3) notation)) Must be above 4)", "New Bomb Cap", GLOB.MAX_EX_LIGHT_RANGE) as num|null
//if (!CONFIG_SET(number/bombcap, newBombCap))
// return
var/new_cap = tgui_input_list(holder, "Select the max explosion range", "Change Bomb Cap", list(14, 16, 20, 28, 56, 128))
if(new_cap)
GLOB.max_explosion_range = new_cap
var/range_dev = GLOB.max_explosion_range *0.25
var/range_high = GLOB.max_explosion_range *0.5
var/range_low = GLOB.max_explosion_range
message_admins(span_danger("[key_name_admin(holder)] changed the bomb cap to [range_dev], [range_high], [range_low]"))
log_admin("[key_name_admin(holder)] changed the bomb cap to [GLOB.max_explosion_range]")
//message_admins(span_boldannounce("[key_name_admin(holder)] changed the bomb cap to [GLOB.MAX_EX_DEVESTATION_RANGE], [GLOB.MAX_EX_HEAVY_RANGE], [GLOB.MAX_EX_LIGHT_RANGE]"))
//log_admin("[key_name(holder)] changed the bomb cap to [GLOB.MAX_EX_DEVESTATION_RANGE], [GLOB.MAX_EX_HEAVY_RANGE], [GLOB.MAX_EX_LIGHT_RANGE]")
if("alter_narsie")
var/choice = tgui_alert(holder, "How do you wish for Nar-Sie to interact with its surroundings?","NarChoice",list("CultStation13", "Nar-Singulo"))
if(choice == "CultStation13")
log_and_message_admins("has set narsie's behaviour to \"CultStation13\".", holder)
narsie_behaviour = choice
if(choice == "Nar-Singulo")
log_and_message_admins("has set narsie's behaviour to \"Nar-Singulo\".", holder)
narsie_behaviour = choice
if("remove_all_clothing")
for(var/obj/item/clothing/O in world)
qdel(O)
if("remove_internal_clothing")
for(var/obj/item/clothing/under/O in world)
qdel(O)
if("send_strike_team")
holder.strike_team()
//buttons that are fun for exactly you and nobody else.
if("corgie")
for(var/mob/living/carbon/human/H in mob_list)
spawn(0)
H.corgize()
if("monkey")
if(!is_funmin)
return
//SSblackbox.record_feedback("nested tally", "admin_secrets_fun_used", 1, list("Monkeyize All Humans"))
message_admins("[key_name_admin(holder)] made everyone into monkeys.")
log_admin("[key_name_admin(holder)] made everyone into monkeys.")
for(var/i in mob_list)
var/mob/living/carbon/human/H = i
INVOKE_ASYNC(H, TYPE_PROC_REF(/mob/living/carbon/human, monkeyize))
if("supermatter_cascade")
var/choice = tgui_alert(holder, "You sure you want to destroy the universe and create a large explosion at your location? Misuse of this could result in removal of flags or hilarity.","WARNING!", list("NO TIME TO EXPLAIN", "Cancel"))
if(choice == "NO TIME TO EXPLAIN")
explosion(get_turf(holder), 8, 16, 24, 32, 1)
new /turf/unsimulated/wall/supermatter(get_turf(holder))
SetUniversalState(/datum/universal_state/supermatter_cascade)
message_admins("[key_name_admin(holder)] has managed to destroy the universe with a supermatter cascade. Good job, [key_name_admin(holder)]")
if("summon_narsie")
var/choice = tgui_alert(holder, "You sure you want to end the round and summon Nar-Sie at your location? Misuse of this could result in removal of flags or hilarity.","WARNING!",list("PRAISE SATAN", "Cancel"))
if(choice == "PRAISE SATAN")
new /obj/singularity/narsie/large(get_turf(holder))
log_and_message_admins("has summoned Nar-Sie and brought about a new realm of suffering.", holder)
if(holder)
log_admin("[key_name(holder)] used secret: [action].")
#undef HIGHLANDER_DELAY_TEXT