"
- for(var/mob/living/carbon/human/H in mob_list)
- if(H.ckey)
- if(H.dna && H.dna.uni_identity)
- dat += "
[H]
[md5(H.dna.uni_identity)]
"
- else if(H.dna && !H.dna.uni_identity)
- dat += "
[H]
H.dna.uni_identity = null
"
- else if(!H.dna)
- dat += "
[H]
H.dna = null
"
- dat += "
"
-
- var/datum/browser/popup = new(user, "fingerprints", "Fingerprints", 440, 410)
- popup.set_content(dat)
- popup.open()
diff --git a/code/modules/admin/secrets/admin_secrets/move_shuttle.dm b/code/modules/admin/secrets/admin_secrets/move_shuttle.dm
deleted file mode 100644
index 6417c519b8..0000000000
--- a/code/modules/admin/secrets/admin_secrets/move_shuttle.dm
+++ /dev/null
@@ -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)
diff --git a/code/modules/admin/secrets/admin_secrets/prison_warp.dm b/code/modules/admin/secrets/admin_secrets/prison_warp.dm
deleted file mode 100644
index 233f852e93..0000000000
--- a/code/modules/admin/secrets/admin_secrets/prison_warp.dm
+++ /dev/null
@@ -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
diff --git a/code/modules/admin/secrets/admin_secrets/show_ai_laws.dm b/code/modules/admin/secrets/admin_secrets/show_ai_laws.dm
deleted file mode 100644
index c9e7cec5df..0000000000
--- a/code/modules/admin/secrets/admin_secrets/show_ai_laws.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/admin_secrets/show_crew_manifest.dm b/code/modules/admin/secrets/admin_secrets/show_crew_manifest.dm
deleted file mode 100644
index b3ac22031c..0000000000
--- a/code/modules/admin/secrets/admin_secrets/show_crew_manifest.dm
+++ /dev/null
@@ -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 += "
Crew Manifest
"
- dat += GLOB.data_core.get_manifest()
-
- var/datum/browser/popup = new(user, "manifest", "Manifest", 370, 420)
- popup.set_content(dat)
- popup.open()
diff --git a/code/modules/admin/secrets/admin_secrets/show_game_mode.dm b/code/modules/admin/secrets/admin_secrets/show_game_mode.dm
deleted file mode 100644
index a323266f5c..0000000000
--- a/code/modules/admin/secrets/admin_secrets/show_game_mode.dm
+++ /dev/null
@@ -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")
diff --git a/code/modules/admin/secrets/admin_secrets/show_law_changes.dm b/code/modules/admin/secrets/admin_secrets/show_law_changes.dm
deleted file mode 100644
index f72d796f4b..0000000000
--- a/code/modules/admin/secrets/admin_secrets/show_law_changes.dm
+++ /dev/null
@@ -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.") + ""
- for(var/sig in GLOB.lawchanges)
- dat += "[sig] "
-
- var/datum/browser/popup = new(user, "lawchanges", "Lawcahnges", 800, 500)
- popup.set_content(dat)
- popup.open()
diff --git a/code/modules/admin/secrets/admin_secrets/show_signalers.dm b/code/modules/admin/secrets/admin_secrets/show_signalers.dm
deleted file mode 100644
index e6663d6f62..0000000000
--- a/code/modules/admin/secrets/admin_secrets/show_signalers.dm
+++ /dev/null
@@ -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.") + ""
- for(var/sig in GLOB.lastsignalers)
- dat += "[sig] "
-
- var/datum/browser/popup = new(user, "lastsignalers", "Last Signallers", 800, 500)
- popup.set_content(dat)
- popup.open()
diff --git a/code/modules/admin/secrets/admin_secrets/traitors_and_objectives.dm b/code/modules/admin/secrets/admin_secrets/traitors_and_objectives.dm
deleted file mode 100644
index bcfd9cd7b9..0000000000
--- a/code/modules/admin/secrets/admin_secrets/traitors_and_objectives.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/final_solutions/summon_narsie.dm b/code/modules/admin/secrets/final_solutions/summon_narsie.dm
deleted file mode 100644
index 738c56e674..0000000000
--- a/code/modules/admin/secrets/final_solutions/summon_narsie.dm
+++ /dev/null
@@ -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)
diff --git a/code/modules/admin/secrets/final_solutions/supermatter_cascade.dm b/code/modules/admin/secrets/final_solutions/supermatter_cascade.dm
deleted file mode 100644
index b764077179..0000000000
--- a/code/modules/admin/secrets/final_solutions/supermatter_cascade.dm
+++ /dev/null
@@ -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)]")
diff --git a/code/modules/admin/secrets/fun_secrets/break_all_lights.dm b/code/modules/admin/secrets/fun_secrets/break_all_lights.dm
deleted file mode 100644
index 2256d4f716..0000000000
--- a/code/modules/admin/secrets/fun_secrets/break_all_lights.dm
+++ /dev/null
@@ -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)
diff --git a/code/modules/admin/secrets/fun_secrets/break_some_lights.dm b/code/modules/admin/secrets/fun_secrets/break_some_lights.dm
deleted file mode 100644
index 70b9eaf806..0000000000
--- a/code/modules/admin/secrets/fun_secrets/break_some_lights.dm
+++ /dev/null
@@ -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)
diff --git a/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm b/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm
deleted file mode 100644
index 67fe250d27..0000000000
--- a/code/modules/admin/secrets/fun_secrets/fix_all_lights.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/ghost_mode.dm b/code/modules/admin/secrets/fun_secrets/ghost_mode.dm
deleted file mode 100644
index a135a4ed39..0000000000
--- a/code/modules/admin/secrets/fun_secrets/ghost_mode.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/only_one.dm b/code/modules/admin/secrets/fun_secrets/only_one.dm
deleted file mode 100644
index c065187c3f..0000000000
--- a/code/modules/admin/secrets/fun_secrets/only_one.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/paintball_mode.dm b/code/modules/admin/secrets/fun_secrets/paintball_mode.dm
deleted file mode 100644
index d17d648ea9..0000000000
--- a/code/modules/admin/secrets/fun_secrets/paintball_mode.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/power_all_smes.dm b/code/modules/admin/secrets/fun_secrets/power_all_smes.dm
deleted file mode 100644
index 2320bcf2cb..0000000000
--- a/code/modules/admin/secrets/fun_secrets/power_all_smes.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/power_failure_begin.dm b/code/modules/admin/secrets/fun_secrets/power_failure_begin.dm
deleted file mode 100644
index a5d424bcbe..0000000000
--- a/code/modules/admin/secrets/fun_secrets/power_failure_begin.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/power_failure_end.dm b/code/modules/admin/secrets/fun_secrets/power_failure_end.dm
deleted file mode 100644
index 1830928e42..0000000000
--- a/code/modules/admin/secrets/fun_secrets/power_failure_end.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/remove_all_clothing.dm b/code/modules/admin/secrets/fun_secrets/remove_all_clothing.dm
deleted file mode 100644
index ef0e40a33a..0000000000
--- a/code/modules/admin/secrets/fun_secrets/remove_all_clothing.dm
+++ /dev/null
@@ -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)
diff --git a/code/modules/admin/secrets/fun_secrets/remove_internal_clothing.dm b/code/modules/admin/secrets/fun_secrets/remove_internal_clothing.dm
deleted file mode 100644
index 9de30a0a5a..0000000000
--- a/code/modules/admin/secrets/fun_secrets/remove_internal_clothing.dm
+++ /dev/null
@@ -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)
diff --git a/code/modules/admin/secrets/fun_secrets/send_strike_team.dm b/code/modules/admin/secrets/fun_secrets/send_strike_team.dm
deleted file mode 100644
index 9aee563d22..0000000000
--- a/code/modules/admin/secrets/fun_secrets/send_strike_team.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm b/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm
deleted file mode 100644
index 3511669707..0000000000
--- a/code/modules/admin/secrets/fun_secrets/toggle_bomb_cap.dm
+++ /dev/null
@@ -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]")
diff --git a/code/modules/admin/secrets/fun_secrets/triple_ai_mode.dm b/code/modules/admin/secrets/fun_secrets/triple_ai_mode.dm
deleted file mode 100644
index d6819530a4..0000000000
--- a/code/modules/admin/secrets/fun_secrets/triple_ai_mode.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/turn_humans_into_corgies.dm b/code/modules/admin/secrets/fun_secrets/turn_humans_into_corgies.dm
deleted file mode 100644
index c82a07c96a..0000000000
--- a/code/modules/admin/secrets/fun_secrets/turn_humans_into_corgies.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/fun_secrets/turn_humans_into_monkeys.dm b/code/modules/admin/secrets/fun_secrets/turn_humans_into_monkeys.dm
deleted file mode 100644
index 88e5bd9022..0000000000
--- a/code/modules/admin/secrets/fun_secrets/turn_humans_into_monkeys.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/random_events/gravity.dm b/code/modules/admin/secrets/random_events/gravity.dm
deleted file mode 100644
index 428402ca96..0000000000
--- a/code/modules/admin/secrets/random_events/gravity.dm
+++ /dev/null
@@ -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.")
diff --git a/code/modules/admin/secrets/random_events/gravity_vr.dm b/code/modules/admin/secrets/random_events/gravity_vr.dm
deleted file mode 100644
index de6e6172bc..0000000000
--- a/code/modules/admin/secrets/random_events/gravity_vr.dm
+++ /dev/null
@@ -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")
diff --git a/code/modules/admin/secrets/random_events/trigger_cordical_borer_infestation.dm b/code/modules/admin/secrets/random_events/trigger_cordical_borer_infestation.dm
deleted file mode 100644
index d7e09d845e..0000000000
--- a/code/modules/admin/secrets/random_events/trigger_cordical_borer_infestation.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm b/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm
deleted file mode 100644
index a8af34137a..0000000000
--- a/code/modules/admin/secrets/random_events/trigger_xenomorph_infestation.dm
+++ /dev/null
@@ -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()
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 2498de6641..102ea86368 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -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.
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2.dm b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
index 17e755836e..b41d6c1cc0 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2.dm
@@ -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]\"."
diff --git a/code/modules/admin/verbs/buildmode.dm b/code/modules/admin/verbs/buildmode.dm
index 25b47e8363..f9b1a408d0 100644
--- a/code/modules/admin/verbs/buildmode.dm
+++ b/code/modules/admin/verbs/buildmode.dm
@@ -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"))
diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm
index e91909312d..a90ff5152b 100644
--- a/code/modules/admin/verbs/debug.dm
+++ b/code/modules/admin/verbs/debug.dm
@@ -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!
diff --git a/code/modules/admin/verbs/entity_narrate.dm b/code/modules/admin/verbs/entity_narrate.dm
index d33082ee5e..9014c532b7 100644
--- a/code/modules/admin/verbs/entity_narrate.dm
+++ b/code/modules/admin/verbs/entity_narrate.dm
@@ -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]")
diff --git a/code/modules/admin/verbs/fps.dm b/code/modules/admin/verbs/fps.dm
index b997c863fe..e97bc166fc 100644
--- a/code/modules/admin/verbs/fps.dm
+++ b/code/modules/admin/verbs/fps.dm
@@ -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)
diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm
index ad29bb8ca3..fec8c53874 100644
--- a/code/modules/admin/verbs/getlogs.dm
+++ b/code/modules/admin/verbs/getlogs.dm
@@ -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("
"), list2params(list("window" = "viewfile.[path]")))
if ("Open")
src << run(file(path))
if ("Download")
diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm
index d4391200a3..72b66d36a5 100644
--- a/code/modules/admin/verbs/grief_fixers.dm
+++ b/code/modules/admin/verbs/grief_fixers.dm
@@ -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."))
diff --git a/code/modules/admin/verbs/list_exposer.dm b/code/modules/admin/verbs/list_exposer.dm
new file mode 100644
index 0000000000..81376d16eb
--- /dev/null
+++ b/code/modules/admin/verbs/list_exposer.dm
@@ -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 = "Bombing List"
+ for(var/entry in GLOB.bombers)
+ data += "[entry] "
+ 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 = "Showing last [length(GLOB.lastsignalers)] signalers."
+ for(var/entry in GLOB.lastsignalers)
+ data += "[entry] "
+ 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 = "Showing last [length(GLOB.lawchanges)] law changes."
+ for(var/entry in GLOB.lawchanges)
+ data += "[entry] "
+
+ var/datum/browser/browser = new(usr, "lawchanges", "Law Changes", 800, 500)
+ browser.set_content(data)
+ browser.open()
+
+/datum/admins/proc/list_dna()
+ var/data = "Showing DNA from blood."
+ data += "
Name
DNA
Blood Type
"
+ for(var/entry in mob_list)
+ var/mob/living/carbon/human/subject = entry
+ if(subject.ckey)
+ data += "
"
+ for(var/entry in mob_list)
+ var/mob/living/carbon/human/subject = entry
+ if(subject.ckey)
+ data += "
[subject]
[md5(subject.dna?.uni_identity)]
"
+ data += "
"
+
+ 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 += "
Crew Manifest
"
+ 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 += "AI [key_name(subject, usr)]'s laws:"
+ else if(isrobot(subject))
+ var/mob/living/silicon/robot/borg = subject
+ message += "CYBORG [key_name(subject, usr)] [borg.connected_ai?"(Slaved to: [key_name(borg.connected_ai)])":"(Independent)"]: laws:"
+ else if (ispAI(subject))
+ message += "pAI [key_name(subject, usr)]'s laws:"
+ else
+ message += "SOMETHING SILICON [key_name(subject, usr)]'s laws:"
+
+ message += " "
+
+ 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), " ")
+
+ to_chat(usr, message, confidential = TRUE)
+
+ if(!law_bound_entities)
+ to_chat(usr, "No law bound entities located", confidential = TRUE)
+ */
diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm
index 91b813e17e..cc46b0ab37 100644
--- a/code/modules/admin/verbs/mapping.dm
+++ b/code/modules/admin/verbs/mapping.dm
@@ -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
diff --git a/code/modules/admin/verbs/possess.dm b/code/modules/admin/verbs/possess.dm
index 0ce3fd727e..62542ba4b0 100644
--- a/code/modules/admin/verbs/possess.dm
+++ b/code/modules/admin/verbs/possess.dm
@@ -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!
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index 7d57cd453d..a0b4ff6eff 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -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))
diff --git a/code/modules/admin/verbs/randomverbs_vr.dm b/code/modules/admin/verbs/randomverbs_vr.dm
index 5cab940f6f..62dfe63d6e 100644
--- a/code/modules/admin/verbs/randomverbs_vr.dm
+++ b/code/modules/admin/verbs/randomverbs_vr.dm
@@ -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] ")), 1)
+ log_admin("ZNarrate: [key_name(user)] : [msg]")
+ message_admins(span_blue(span_bold(" ZNarrate: [key_name_admin(user)] : [msg] ")), 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)
diff --git a/code/modules/admin/verbs/resize.dm b/code/modules/admin/verbs/resize.dm
index 24e18a19f7..f9c42f00e4 100644
--- a/code/modules/admin/verbs/resize.dm
+++ b/code/modules/admin/verbs/resize.dm
@@ -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")
diff --git a/code/modules/admin/verbs/secrets.dm b/code/modules/admin/verbs/secrets.dm
new file mode 100644
index 0000000000..c48aaecb42
--- /dev/null
+++ b/code/modules/admin/verbs/secrets.dm
@@ -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 += "
[l]
"
+ 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")
+ dat += ""
+ 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()] "
+ 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
diff --git a/tgui/packages/tgui/interfaces/Secrets/Tabs/DebuggingTab.tsx b/tgui/packages/tgui/interfaces/Secrets/Tabs/DebuggingTab.tsx
new file mode 100644
index 0000000000..26819b8133
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Secrets/Tabs/DebuggingTab.tsx
@@ -0,0 +1,45 @@
+import { useBackend } from 'tgui/backend';
+import { Button, Stack } from 'tgui-core/components';
+
+import { lineHeightDebug } from '../constants';
+
+export const DebuggingTab = (props) => {
+ const { act } = useBackend();
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Secrets/Tabs/FunForYouTab.tsx b/tgui/packages/tgui/interfaces/Secrets/Tabs/FunForYouTab.tsx
new file mode 100644
index 0000000000..1ede23ee98
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Secrets/Tabs/FunForYouTab.tsx
@@ -0,0 +1,250 @@
+import { useBackend } from 'tgui/backend';
+import { Button, NoticeBox, Stack } from 'tgui-core/components';
+
+export const FunForYouTab = (props) => {
+ const { act } = useBackend();
+ return (
+
+
+
+
+ {/*
+
+
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+
+
+
+
+ {/*
+
+
+
+ */}
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+
+
+ */}
+ Your admin button here, coder!
+
+
+
+ {/*
+
+ */}
+
+
+
+
+
+
+ {/*
+
+
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+
+
+
+
+ {/*
+
+
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+
+
+ {/*
+
+
+
+
+
+
+
+
+
+
+
+
+ */}
+
+
+
+
+
+
+
+
+
+ Your admin button here, coder!
+
+
+
+
+ Your admin button here, coder!
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Secrets/Tabs/FunTab.tsx b/tgui/packages/tgui/interfaces/Secrets/Tabs/FunTab.tsx
new file mode 100644
index 0000000000..0513456dc8
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Secrets/Tabs/FunTab.tsx
@@ -0,0 +1,353 @@
+import { useBackend } from 'tgui/backend';
+import { Button, NoticeBox, Stack } from 'tgui-core/components';
+
+import { buttonWidthNormal, lineHeightNormal } from '../constants';
+
+export const FunTab = (props) => {
+ const { act } = useBackend();
+ return (
+
+
+
+
+ {/*
+
+ */}
+
+
+
+ {/*
+
+ */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+ */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+
+
+
+ {/*
+
+ */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Secrets/Tabs/HelpfulTab.tsx b/tgui/packages/tgui/interfaces/Secrets/Tabs/HelpfulTab.tsx
new file mode 100644
index 0000000000..cf58e4c90e
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Secrets/Tabs/HelpfulTab.tsx
@@ -0,0 +1,290 @@
+import { useBackend } from 'tgui/backend';
+import { Button, NoticeBox, Stack } from 'tgui-core/components';
+
+import { buttonWidthNormal, lineHeightNormal } from '../constants';
+
+export const HelpfulTab = (props) => {
+ const { act } = useBackend();
+ return (
+
+
+
+
+
+ Your admin button here, coder!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/*
+
+ */}
+
+ Your admin button here, coder!
+
+
+
+ {/*
+
+ */}
+
+
+
+
+
+
+
+
+
+ {/*
+
+
+
+
+
+
+ */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Secrets/constants.ts b/tgui/packages/tgui/interfaces/Secrets/constants.ts
new file mode 100644
index 0000000000..6da30dbfce
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Secrets/constants.ts
@@ -0,0 +1,35 @@
+import { DebuggingTab } from './Tabs/DebuggingTab';
+import { FunForYouTab } from './Tabs/FunForYouTab';
+import { FunTab } from './Tabs/FunTab';
+import { HelpfulTab } from './Tabs/HelpfulTab';
+
+export const TAB2NAME = [
+ {
+ title: 'Debugging',
+ blurb: 'Where useless shit goes to die',
+ gauge: 5,
+ component: () => DebuggingTab,
+ },
+ {
+ title: 'Helpful',
+ blurb: 'Where fuckwits put logging',
+ gauge: 25,
+ component: () => HelpfulTab,
+ },
+ {
+ title: 'Fun',
+ blurb: 'How I ran an """event"""',
+ gauge: 75,
+ component: () => FunTab,
+ },
+ {
+ title: 'Only Fun For You',
+ blurb: 'How I spent my last day adminning',
+ gauge: 95,
+ component: () => FunForYouTab,
+ },
+];
+
+export const lineHeightNormal = 2.79;
+export const buttonWidthNormal = 12.9;
+export const lineHeightDebug = 6.09;
diff --git a/tgui/packages/tgui/interfaces/Secrets/index.tsx b/tgui/packages/tgui/interfaces/Secrets/index.tsx
new file mode 100644
index 0000000000..701af468c9
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Secrets/index.tsx
@@ -0,0 +1,167 @@
+import { useState } from 'react';
+import { useBackend } from 'tgui/backend';
+import { Window } from 'tgui/layouts';
+import {
+ Button,
+ LabeledControls,
+ NoticeBox,
+ RoundGauge,
+ Section,
+ Stack,
+} from 'tgui-core/components';
+import { toFixed } from 'tgui-core/math';
+
+import { TAB2NAME } from './constants';
+import type { Data } from './types';
+
+export const Secrets = (props) => {
+ const { act, data } = useBackend();
+ const { is_debugger, is_funmin } = data;
+ const [tabIndex, setTabIndex] = useState(2);
+ const TabComponent = TAB2NAME[tabIndex - 1].component();
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ }
+ >
+
+
+
+ "The first rule of adminbuse is: you don't talk
+ about the adminbuse."
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ toFixed(value) + '%'}
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/tgui/packages/tgui/interfaces/Secrets/types.ts b/tgui/packages/tgui/interfaces/Secrets/types.ts
new file mode 100644
index 0000000000..e592983456
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/Secrets/types.ts
@@ -0,0 +1,3 @@
+import type { BooleanLike } from 'tgui-core/react';
+
+export type Data = { is_debugger: BooleanLike; is_funmin: BooleanLike };
diff --git a/vorestation.dme b/vorestation.dme
index dcbd891d9f..202b126688 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -84,6 +84,7 @@
#include "code\__defines\holder.dm"
#include "code\__defines\holomap.dm"
#include "code\__defines\hoses.dm"
+#include "code\__defines\html_assistant.dm"
#include "code\__defines\hud.dm"
#include "code\__defines\implant.dm"
#include "code\__defines\input.dm"
@@ -377,6 +378,7 @@
#include "code\ATMOSPHERICS\pipes\tank_vr.dm"
#include "code\ATMOSPHERICS\pipes\universal.dm"
#include "code\ATMOSPHERICS\pipes\vent.dm"
+#include "code\controllers\admin.dm"
#include "code\controllers\autotransfer.dm"
#include "code\controllers\communications.dm"
#include "code\controllers\controller.dm"
@@ -388,7 +390,6 @@
#include "code\controllers\master.dm"
#include "code\controllers\master_controller.dm"
#include "code\controllers\subsystem.dm"
-#include "code\controllers\verbs.dm"
#include "code\controllers\configuration\config_entry.dm"
#include "code\controllers\configuration\configuration.dm"
#include "code\controllers\configuration\legacy.dm"
@@ -2012,7 +2013,6 @@
#include "code\modules\admin\admin_investigate.dm"
#include "code\modules\admin\admin_memo.dm"
#include "code\modules\admin\admin_ranks.dm"
-#include "code\modules\admin\admin_secrets.dm"
#include "code\modules\admin\admin_tools.dm"
#include "code\modules\admin\admin_verb_lists_vr.dm"
#include "code\modules\admin\admin_verbs.dm"
@@ -2037,43 +2037,6 @@
#include "code\modules\admin\ToRban.dm"
#include "code\modules\admin\callproc\callproc.dm"
#include "code\modules\admin\DB ban\functions.dm"
-#include "code\modules\admin\secrets\admin_secrets\admin_logs.dm"
-#include "code\modules\admin\secrets\admin_secrets\alter_narsie.dm"
-#include "code\modules\admin\secrets\admin_secrets\bombing_list.dm"
-#include "code\modules\admin\secrets\admin_secrets\jump_shuttle.dm"
-#include "code\modules\admin\secrets\admin_secrets\launch_shuttle.dm"
-#include "code\modules\admin\secrets\admin_secrets\launch_shuttle_forced.dm"
-#include "code\modules\admin\secrets\admin_secrets\list_dna.dm"
-#include "code\modules\admin\secrets\admin_secrets\list_fingerprints.dm"
-#include "code\modules\admin\secrets\admin_secrets\move_shuttle.dm"
-#include "code\modules\admin\secrets\admin_secrets\prison_warp.dm"
-#include "code\modules\admin\secrets\admin_secrets\show_ai_laws.dm"
-#include "code\modules\admin\secrets\admin_secrets\show_crew_manifest.dm"
-#include "code\modules\admin\secrets\admin_secrets\show_game_mode.dm"
-#include "code\modules\admin\secrets\admin_secrets\show_law_changes.dm"
-#include "code\modules\admin\secrets\admin_secrets\show_signalers.dm"
-#include "code\modules\admin\secrets\admin_secrets\traitors_and_objectives.dm"
-#include "code\modules\admin\secrets\final_solutions\summon_narsie.dm"
-#include "code\modules\admin\secrets\final_solutions\supermatter_cascade.dm"
-#include "code\modules\admin\secrets\fun_secrets\break_all_lights.dm"
-#include "code\modules\admin\secrets\fun_secrets\break_some_lights.dm"
-#include "code\modules\admin\secrets\fun_secrets\fix_all_lights.dm"
-#include "code\modules\admin\secrets\fun_secrets\ghost_mode.dm"
-#include "code\modules\admin\secrets\fun_secrets\only_one.dm"
-#include "code\modules\admin\secrets\fun_secrets\paintball_mode.dm"
-#include "code\modules\admin\secrets\fun_secrets\power_all_smes.dm"
-#include "code\modules\admin\secrets\fun_secrets\power_failure_begin.dm"
-#include "code\modules\admin\secrets\fun_secrets\power_failure_end.dm"
-#include "code\modules\admin\secrets\fun_secrets\remove_all_clothing.dm"
-#include "code\modules\admin\secrets\fun_secrets\remove_internal_clothing.dm"
-#include "code\modules\admin\secrets\fun_secrets\send_strike_team.dm"
-#include "code\modules\admin\secrets\fun_secrets\toggle_bomb_cap.dm"
-#include "code\modules\admin\secrets\fun_secrets\triple_ai_mode.dm"
-#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_corgies.dm"
-#include "code\modules\admin\secrets\fun_secrets\turn_humans_into_monkeys.dm"
-#include "code\modules\admin\secrets\random_events\gravity.dm"
-#include "code\modules\admin\secrets\random_events\trigger_cordical_borer_infestation.dm"
-#include "code\modules\admin\secrets\random_events\trigger_xenomorph_infestation.dm"
#include "code\modules\admin\verb_datums\_admin_verb_datum.dm"
#include "code\modules\admin\verbs\admin_ch.dm"
#include "code\modules\admin\verbs\adminjump.dm"
@@ -2090,7 +2053,6 @@
#include "code\modules\admin\verbs\deadsay.dm"
#include "code\modules\admin\verbs\debug.dm"
#include "code\modules\admin\verbs\debug_ch.dm"
-#include "code\modules\admin\verbs\debug_vr.dm"
#include "code\modules\admin\verbs\diagnostics.dm"
#include "code\modules\admin\verbs\dice.dm"
#include "code\modules\admin\verbs\entity_narrate.dm"
@@ -2100,6 +2062,7 @@
#include "code\modules\admin\verbs\getlogs.dm"
#include "code\modules\admin\verbs\grief_fixers.dm"
#include "code\modules\admin\verbs\lightning_strike.dm"
+#include "code\modules\admin\verbs\list_exposer.dm"
#include "code\modules\admin\verbs\map_template_loadverb.dm"
#include "code\modules\admin\verbs\mapping.dm"
#include "code\modules\admin\verbs\panicbunker.dm"
@@ -2109,6 +2072,7 @@
#include "code\modules\admin\verbs\randomverbs.dm"
#include "code\modules\admin\verbs\randomverbs_vr.dm"
#include "code\modules\admin\verbs\resize.dm"
+#include "code\modules\admin\verbs\secrets.dm"
#include "code\modules\admin\verbs\smite.dm"
#include "code\modules\admin\verbs\special_verbs.dm"
#include "code\modules\admin\verbs\striketeam.dm"