From 69d4cb45cbde9a3a5031b5f1cad40adcdb1a09b9 Mon Sep 17 00:00:00 2001
From: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Date: Wed, 7 Jan 2026 13:54:47 +0000
Subject: [PATCH] Two more admin smites (#18991)
* Two more admin smites
Added two more admin player effects:
- Wet Surrounding Surfaces: Gives you the option of making a ring of water, lube or any reagent of your choice appear around the character instantly.
- Give Quest: Make a quest appear for the character, can either be personalised or a randomly generated simple one. Includes a warning that it isn't an excuse to misbehave.
* Fixes things
---
code/modules/admin/player_effects.dm | 42 +++++++++
code/modules/admin/random_quest.dm | 87 +++++++++++++++++++
.../PlayerEffectsTabs/ControlAdmin.tsx | 3 +
.../PlayerEffectsTabs/ControlSmites.tsx | 3 +
vorestation.dme | 1 +
5 files changed, 136 insertions(+)
create mode 100644 code/modules/admin/random_quest.dm
diff --git a/code/modules/admin/player_effects.dm b/code/modules/admin/player_effects.dm
index 5d46b4f2872..57b7a4940cc 100644
--- a/code/modules/admin/player_effects.dm
+++ b/code/modules/admin/player_effects.dm
@@ -325,6 +325,34 @@
target.overlay_fullscreen("scrolls", /atom/movable/screen/fullscreen/scrolls, 1)
addtimer(CALLBACK(target, TYPE_PROC_REF(/mob, clear_fullscreen), "scrolls"), 20 SECONDS)
+ if("wet_floors")
+ var/chem
+ var/reagent_choice = tgui_alert(user, "Which reagent do you want to place on the floors around them?", "Reagent", list("Water", "Space Lube", "Other", "Cancel"))
+ if(!reagent_choice || (reagent_choice == "Cancel"))
+ return
+ if(reagent_choice == "Water")
+ chem = REAGENT_ID_WATER
+ if(reagent_choice == "Space Lube")
+ chem = REAGENT_ID_LUBE
+ if(reagent_choice == "Other")
+ var/list/chem_list = typesof(/datum/reagent)
+ var/datum/reagent/chemical = tgui_input_list(user, "Which chemical would you like to use?", "Chemicals", chem_list)
+ if(!chemical)
+ return
+ chem = chemical.id
+
+ if(!target)
+ return //Check target still exists after choices were made
+ var/turf/target_turf = get_turf(target)
+ for(var/turf/simulated/floor/surroundings in orange(1,target))
+ if(target_turf == surroundings) //Don't put it directly on our turf, just neighbouring ones
+ continue
+ var/datum/reagents/our_chem = new /datum/reagents(30) //Create some reagents, move them over, and clean up the datum afterwards
+ our_chem.add_reagent(chem, 30)
+ our_chem.trans_to_turf(surroundings,30)
+ our_chem.Destroy()
+
+
////////MEDICAL//////////////
if("health_scan")
@@ -803,6 +831,20 @@
else if(!target.cloaked)
target.cloak()
+ if("give_quest")
+ if(!target)
+ return
+ var/admin_quest = tgui_alert(user, "Do you want to give a random quest or a personalised one?", "Quest!", list("Random", "Personalised", "Cancel"))
+ if(!admin_quest || (admin_quest == "Cancel"))
+ return
+ if(admin_quest == "Personalised")
+ var/specific_quest = tgui_input_text(user, "What is their quest?", "Quest!!!")
+ if(!specific_quest)
+ return
+ target.quest_from_above(specific_quest)
+ else
+ target.quest_from_above()
+
////////FIXES//////////////
diff --git a/code/modules/admin/random_quest.dm b/code/modules/admin/random_quest.dm
new file mode 100644
index 00000000000..5fd0fb42ab9
--- /dev/null
+++ b/code/modules/admin/random_quest.dm
@@ -0,0 +1,87 @@
+/mob/proc/quest_from_above(var/specific_quest)
+ var/list/quests = list("Search",
+ "Collect",
+ "Drink",
+ "Eat",
+ "Visit",
+ "Clean",
+ "Wear",
+ "Pet")
+ var/list/searchables = list("Trash Piles",
+ "Lockers",
+ "Backpacks",
+ "Trash Cans and Disposal Units",
+ "Co-worker's Pockets")
+ var/list/collectables = list("Rare Coins",
+ "Figurines",
+ "Protein Shakes",
+ "Non-Lethal Weapons",
+ "Sunglasses",
+ "Mega Nukies",
+ "Kinky Toys",
+ "Plushies")
+ var/list/locations = list("Redgate Locations",
+ "High Security Areas",
+ "Medbay Rooms",
+ "Security Rooms",
+ "Maintenance Rooms",
+ "Command Rooms",
+ "Engineering Rooms",
+ "Deep Space Locations",
+ "Research Rooms")
+ var/list/pets = list("Mice",
+ "Mothroaches",
+ "Canines",
+ "Plushies",
+ "Felines",
+ "Lizards",
+ "Co-workers")
+ var/complete_quest
+ if(!specific_quest)
+ var/chosen_one = pick(quests)
+ var/chosen_two
+ var/number_of_times
+ switch(chosen_one)
+ if("Search")
+ chosen_two = pick(searchables)
+ number_of_times = rand(4,10)
+ complete_quest = "[chosen_one] [number_of_times] [chosen_two]!"
+ if("Collect")
+ chosen_two = pick(collectables)
+ number_of_times = rand(3,10)
+ complete_quest = "[chosen_one] [number_of_times] [chosen_two]!"
+ if("Drink")
+ var/list/drink_list = typesof(/obj/item/reagent_containers/food/drinks)
+ var/obj/item/reagent_containers/food/drinks/pick_drink = pick(drink_list)
+ chosen_two = pick_drink.name
+ number_of_times = rand(2,6)
+ complete_quest = "[chosen_one] [number_of_times] [chosen_two]s!"
+ if("Eat")
+ var/list/snack_list = typesof(/obj/item/reagent_containers/food/snacks)
+ var/obj/item/reagent_containers/food/snacks/pick_snack = pick(snack_list)
+ chosen_two = pick_snack.name
+ number_of_times = rand(2,6)
+ complete_quest = "[chosen_one] [number_of_times] [chosen_two]s!"
+ if("Visit","Clean")
+ chosen_two = pick(locations)
+ number_of_times = rand(2,8)
+ complete_quest = "[chosen_one] [number_of_times] [chosen_two]!"
+ if("Wear")
+ var/clothing_options = typesof(/obj/item/clothing)
+ var/obj/item/clothing/clothing_one = pick(clothing_options)
+ var/obj/item/clothing/clothing_two = pick(clothing_options)
+ var/obj/item/clothing/clothing_three = pick(clothing_options)
+ complete_quest = "[chosen_one] as many of the following as you can find: [clothing_one.name], [clothing_two.name] and [clothing_three.name]!"
+ if("Pet")
+ chosen_two = pick(pets)
+ number_of_times = rand(2,5)
+ complete_quest = "[chosen_one] [number_of_times] [chosen_two]!"
+ else
+ complete_quest = specific_quest
+
+ to_chat(src, span_notice(span_huge("You have been granted a quest from above!")))
+ to_chat(src, span_notice("From somewhere deep inside yourself, a quest has been conjured. You feel a compulsion to complete the following activity:"))
+ to_chat(src, span_boldnotice("[complete_quest]"))
+ to_chat(src, span_notice(span_small("Please note that this is just a bit of fun, you should not use this an excuse to break rules or cause major disruptions for other players.")))
+
+ log_and_message_admins("[src.ckey] playing as [src.name] has been given the quest: [complete_quest]")
diff --git a/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlAdmin.tsx b/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlAdmin.tsx
index 35e327b8cbe..732de994758 100644
--- a/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlAdmin.tsx
+++ b/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlAdmin.tsx
@@ -45,6 +45,9 @@ export const ControlAdmin = (props) => {
+
);
};
diff --git a/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlSmites.tsx b/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlSmites.tsx
index 01c9bf5e98e..8a79b9751a6 100644
--- a/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlSmites.tsx
+++ b/tgui/packages/tgui/interfaces/PlayerEffects/PlayerEffectsTabs/ControlSmites.tsx
@@ -72,6 +72,9 @@ export const ControlSmites = (props) => {
+
);
};
diff --git a/vorestation.dme b/vorestation.dme
index 42e5655500e..18477acc640 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2188,6 +2188,7 @@
#include "code\modules\admin\player_effects.dm"
#include "code\modules\admin\player_notes.dm"
#include "code\modules\admin\player_panel.dm"
+#include "code\modules\admin\random_quest.dm"
#include "code\modules\admin\tag.dm"
#include "code\modules\admin\topic.dm"
#include "code\modules\admin\ToRban.dm"