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)