diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index 8e7be007d12..4f07d54ee01 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -96,6 +96,7 @@
#define NUTRITION_LEVEL_FED 350
#define NUTRITION_LEVEL_HUNGRY 250
#define NUTRITION_LEVEL_STARVING 150
+#define NUTRITION_LEVEL_CURSED 0
//Blood levels
#define BLOOD_VOLUME_NORMAL 560
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index 5c11c42930a..40c38ac0627 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -1173,3 +1173,39 @@
suit = /obj/item/clothing/suit/wizrobe/marisa
shoes = /obj/item/clothing/shoes/sandal/marisa
head = /obj/item/clothing/head/wizard/marisa
+
+
+/datum/outfit/admin/dark_priest
+ name = "Dark Priest"
+
+ uniform = /obj/item/clothing/under/color/black
+ suit = /obj/item/clothing/suit/hooded/chaplain_hoodie
+ back = /obj/item/weapon/storage/backpack
+ head = /obj/item/clothing/head/chaplain_hood
+ gloves = /obj/item/clothing/gloves/color/black
+ shoes = /obj/item/clothing/shoes/black
+ l_ear = /obj/item/device/radio/headset/syndicate
+ id = /obj/item/weapon/card/id/syndicate
+ r_hand = /obj/item/weapon/nullrod/armblade
+ backpack_contents = list(
+ /obj/item/weapon/storage/box/survival = 1,
+ /obj/item/device/flashlight = 1,
+ )
+
+/datum/outfit/admin/dark_priest/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ . = ..()
+ if(visualsOnly)
+ return
+ var/obj/item/weapon/card/id/I = H.wear_id
+ if(istype(I))
+ apply_to_card(I, H, get_all_accesses(), "Dark Priest", "syndie")
+ var/obj/item/weapon/nullrod/armblade/B = H.r_hand
+ if(istype(B))
+ B.force = 20
+ B.name = "blessing of the reaper"
+ B.desc = "Sometimes, someone's just gotta die."
+ var/obj/item/device/radio/headset/R = H.l_ear
+ if(istype(R))
+ R.flags |= NODROP
+ var/obj/item/weapon/implant/dust/D = new /obj/item/weapon/implant/dust(H)
+ D.implant(H)
\ No newline at end of file
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 6853baf0755..d7de6dd6844 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -101,7 +101,9 @@ var/global/nologevent = 0
[check_rights(R_ADMIN,0) ? "Traitor panel | " : "" ]
Narrate to |
- Subtle message
+ Subtle message |
+ Bless |
+ Smite
"}
if(M.client)
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index 605c4acd1f3..61b86a9ebe4 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -1790,9 +1790,15 @@
H = M
ptypes += "Brain Damage"
ptypes += "Honk Tumor"
+ ptypes += "Hallucinate"
+ ptypes += "Cold"
+ ptypes += "Hunger"
ptypes += "Cluwne"
ptypes += "Mutagen Cookie"
ptypes += "Hellwater Cookie"
+ ptypes += "Assassin"
+ ptypes += "Priest"
+ ptypes += "Lynch"
var/punishment = input(owner, "How would you like to smite [M]?", "Its good to be baaaad...", "") as null|anything in ptypes
if(!(punishment in ptypes))
return
@@ -1820,6 +1826,15 @@
to_chat(H, "Life seems funnier, somehow.")
organ.insert(H)
logmsg = "a honk tumor."
+ if("Hallucinate")
+ H.Hallucinate(1000)
+ logmsg = "hallucinations."
+ if("Hunger")
+ H.nutrition = NUTRITION_LEVEL_CURSED
+ logmsg = "starvation."
+ if("Cold")
+ H.reagents.add_reagent("frostoil", 40)
+ H.reagents.add_reagent("ice", 40)
if("Cluwne")
H.makeCluwne()
logmsg = "cluwned."
@@ -1828,6 +1843,7 @@
evilcookie.reagents.add_reagent("mutagen", 10)
evilcookie.desc = "It has a faint green glow."
evilcookie.bitesize = 100
+ evilcookie.flags = NODROP
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a mutagen cookie."
@@ -1836,9 +1852,92 @@
evilcookie.reagents.add_reagent("hell_water", 25)
evilcookie.desc = "Sulphur-flavored."
evilcookie.bitesize = 100
+ evilcookie.flags = NODROP
H.drop_l_hand()
H.equip_to_slot_or_del(evilcookie, slot_l_hand)
logmsg = "a hellwater cookie."
+ if("Priest")
+ logmsg = "priest."
+ H.mutations |= NOCLONE
+ message_admins("[key_name_admin(owner)] is sending a dark priest to assassinate [key_name_admin(M)]...")
+ var/list/candidates = pollCandidates("Do you want to play as a murderous dark priest?")
+ if(!candidates.len)
+ to_chat(usr, "ERROR: Could not create priest. No valid candidates.")
+ return
+ var/mob/C = pick(candidates)
+ var/key_of_priest = C.key
+ if(!key_of_priest)
+ to_chat(usr, "ERROR: Could not create priest. Could not pick key.")
+ return
+ var/datum/mind/priest_mind = new /datum/mind(key_of_priest)
+ priest_mind.active = 1
+ var/mob/living/carbon/human/priest_mob = new /mob/living/carbon/human(pick(latejoin))
+ priest_mind.transfer_to(priest_mob)
+ var/datum/outfit/admin/dark_priest/O = new /datum/outfit/admin/dark_priest
+ priest_mob.equipOutfit(O, FALSE)
+ var/obj/item/weapon/pinpointer/advpinpointer/N = new /obj/item/weapon/pinpointer/advpinpointer(priest_mob)
+ priest_mob.equip_to_slot_or_del(N, slot_r_store)
+ N.active = 1
+ N.mode = 2
+ N.target = H
+ N.point_at(N.target)
+ N.flags |= NODROP
+ var/datum/objective/assassinate/kill_objective = new
+ kill_objective.owner = priest_mind
+ kill_objective.target = H.mind
+ kill_objective.explanation_text = "Murder [H.real_name], the [H.mind.assigned_role], in the name of the dark gods."
+ priest_mind.objectives += kill_objective
+ ticker.mode.traitors |= priest_mob.mind
+ to_chat(priest_mob, "ATTENTION: You are now a dark priest!")
+ to_chat(priest_mob, "Goal: MURDER [H.real_name], currently in [get_area(H.loc)], in the name of the dark gods. ");
+ to_chat(priest_mob, "The gods will prevent their revival.");
+ priest_mob.mind.special_role = SPECIAL_ROLE_TRAITOR
+ var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
+ tatorhud.join_hud(priest_mob)
+ ticker.mode.set_antag_hud(priest_mob, "hudsyndicate")
+ if("Assassin")
+ logmsg = "assassin."
+ var/list/possible_traitors = list()
+ for(var/mob/living/player in living_mob_list)
+ if(player.client && player.mind && !player.mind.special_role && player.stat != DEAD && player != H)
+ if(ishuman(player))
+ if(player.client && (ROLE_TRAITOR in player.client.prefs.be_special) && !jobban_isbanned(player, ROLE_TRAITOR) && !jobban_isbanned(player, "Syndicate"))
+ possible_traitors += player.mind
+ for(var/datum/mind/player in possible_traitors)
+ if(player.current)
+ if(ismindshielded(player.current))
+ possible_traitors -= player
+ if(possible_traitors.len)
+ var/datum/mind/newtraitormind = pick(possible_traitors)
+ var/mob/living/newtraitor = newtraitormind.current
+ var/datum/objective/assassinate/kill_objective = new
+ kill_objective.owner = newtraitormind
+ kill_objective.target = H.mind
+ kill_objective.explanation_text = "Assassinate [H.real_name], the [H.mind.assigned_role]."
+ newtraitormind.objectives += kill_objective
+ ticker.mode.equip_traitor(newtraitor)
+ ticker.mode.traitors |= newtraitor.mind
+ to_chat(newtraitor, "ATTENTION: It is time to pay your debt to the Syndicate...")
+ to_chat(newtraitor, "You are now a traitor.")
+ to_chat(newtraitor, "Goal: KILL [H.real_name], currently in [get_area(H.loc)]");
+ newtraitor.mind.special_role = SPECIAL_ROLE_TRAITOR
+ var/datum/atom_hud/antag/tatorhud = huds[ANTAG_HUD_TRAITOR]
+ tatorhud.join_hud(newtraitor)
+ ticker.mode.set_antag_hud(newtraitor, "hudsyndicate")
+ else
+ to_chat(usr, "ERROR: Failed to create a traitor.")
+ return
+ if("Lynch")
+ logmsg = "lynch."
+ for(var/datum/mind/crew in ticker.minds)
+ if(!crew.current)
+ continue
+ if(!isliving(crew.current))
+ continue
+ if(crew == H.mind)
+ continue
+ to_chat(crew.current, "
The gods have given you a task: find [H.real_name], located in [get_area(H.loc)], and slay them!");
+ to_chat(crew.current, "Do not harm anyone other than [H.real_name] while carrying out this task.
");
if("Gib")
logmsg = "gibbed."
M.gib(FALSE)