From 20b33bcb1ff7c58937b4d1ea4fea5a4c25f62325 Mon Sep 17 00:00:00 2001 From: FalseIncarnate Date: Wed, 10 Aug 2016 06:39:13 -0400 Subject: [PATCH] WOLOLO New traitor chaplain items: Missionary Robe and Missionary Staff. They look like ordinary chaplain hoodies, but the Missionary Robes actually are armored and can be linked to a single Missionary Staff to recharge "faith" while wearing the robes. The Missionary Staff looks like either the red or blue godstaff nullrods, and is also a nullrod (can't be reskinned). However, the true power comes when linked to a set of Missionary Robes, charging the staff with "faith" that can be used to perform ranged conversions on individual targets within sight of the missionary. Conversions mimic the effects of a mindslave implant, except that it only last for 10 minutes before the victim returns to normal. The victim is specifically told when they deconvert that they forget their actions and master. Conversion is able to overcome loyalty implants sometimes, but if successful it will take longer than normal to recharge. Likewise, the more "educated" crew members (psychiatrist and librarian) are more resistant to conversion, though much less so than the loyalty implanted crew (these resistances do not stack). Civilians, on the other hand, have a chance to only use half the "faith" of a normal conversion, meaning you can attempt another conversion much sooner. Crew that is already mindslaved (whether by a staff or implant) cannot be converted, as they are already mentally dominated, so this can also potentially help you make a new traitor friend if you play your cards right. Successfully converting a crew member mindslaves them to you for 10 minutes, and recolors their worn jumpsuit to match the color of your staff (red or blue, chosen randomly when the staff is spawned). Failure to convert a target expends 25-75 "faith" (based on circumstances), while a successful conversion typically uses 100 "faith" but can use more or less in special cases. As long as you wear the Missionary Robes and keep your Missionary Staff close by, the "faith" recharges passively and will notify you when you are able to attempt another conversion. Times, chances, and values are subject to change. TODO: Upon conversion, play "WOLOLO" to the missionary and new zealot, to inform them both of the good news. Also, testing. --- .../objects/items/weapons/holy_weapons.dm | 144 ++++++++++++++++++ code/modules/clothing/suits/miscellaneous.dm | 43 ++++++ 2 files changed, 187 insertions(+) diff --git a/code/game/objects/items/weapons/holy_weapons.dm b/code/game/objects/items/weapons/holy_weapons.dm index ada15a3b108..76ec5cf8597 100644 --- a/code/game/objects/items/weapons/holy_weapons.dm +++ b/code/game/objects/items/weapons/holy_weapons.dm @@ -445,5 +445,149 @@ if(prob(10)) to_chat(M, "Being in the presence of [holder]'s [src] is interfering with your powers!") +/obj/item/weapon/nullrod/missionary_staff + reskinned = TRUE + icon_state = "godstaff-red" + item_state = "godstaff-red" + name = "holy staff" + desc = "It has a mysterious, protective aura." + description_antag = "This seemingly standard holy staff is actually a disguised neurotransmitter capable of inducing blind zealotry in its victims. It must be allowed to recharge in the presence of a linked set of missionary robes." + w_class = 5 + force = 5 + slot_flags = SLOT_BACK + block_chance = 50 + var/team_color = "red" + var/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/robes = null //the robes linked with this staff + var/faith = 99 //a conversion requires 100 faith to attempt. faith recharges over time while you are wearing missionary robes that have been linked to the staff. +/obj/item/weapon/nullrod/missionary_staff/New() + team_color = pick("red", "blue") + icon_state = "godstaff-[team_color]" + item_state = "godstaff-[team_color]" + name = "[team_color] holy staff" + +/obj/item/weapon/nullrod/missionary_staff/Destroy() + if(robes) //delink on destruction + robes.linked_staff = null + robes = null + ..() + +/obj/item/weapon/nullrod/missionary_staff/attack_self(mob/user) + if(robes) //as long as it is linked, sec can't try to meta by stealing your staff and seeing if they get the link error message + return + if(!ishuman(user)) //prevents the horror (runtimes) of missionary xenos and other non-human mobs that might be able to activate the item + return + var/mob/living/carbon/human/missionary = user + if(missionary.wear_suit && istype(missionary.wear_suit, /obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe)) + if(robes.linked_staff) + to_chat(missionary, "These robes are already linked with a staff and cannot support another. Connection refused.") + return + robes = missionary.wear_suit + robes.linked_staff = src + to_chat(missionary, "Link established. Faith generators initialized. Go spread the word.") + faith = 100 //full charge when a fresh link is made (can't be delinked without destroying the robes so this shouldn't be an exploitable thing) + else + to_chat(missionary, "You must be wearing the missionary robes you wish to link with this staff.") + +/obj/item/weapon/nullrod/missionary_staff/afterattack(mob/living/carbon/human/target, mob/living/carbon/human/missionary, flag, params) + if(!istype(target) || !istype(missionary)) //ishuman checks effectively + return + if(target == missionary) //you can't convert yourself, that would raise too many questions about your own dedication to the cause + return + if(!robes) //staff must be linked to convert + to_chat(missionary, "You must link your staff to a set of missionary robes before attempting conversions.") + return + if(!missionary.wear_suit || missionary.wear_suit != robes) //must be wearing the robes to convert + return + if(faith < 100) + to_chat(missionary, "You don't have enough faith to attempt a conversion right now.") + return + to_chat(missionary, "You concentrate on [target] and begin the conversion ritual...") + if(!target.mind) //no mind means no conversion, but also means no faith lost. + to_chat(missionary, "You halt the conversion as you realize [target] is mindless! Best to save your faith for someone more worthwhile.") + return + if(do_after(missionary, 40)) //4 seconds to temporarily convert, roughly 1 second faster than a vampire's enthrall ability + if(faith < 100) //to stop people from trying to exploit the do_after system to multi-convert, we check again if you have enough faith when it completes + to_chat(missionary, "You don't have enough faith to complete the conversion on [target]!") + return + if(missionary in viewers(target)) //missionary must maintain line of sight to target, but the target doesn't necessary need to be able to see the missionary + do_convert(target, missionary) + return + else + to_chat(missionary, "You lost sight of the target before they could be converted!") + faith -= 25 //they escaped, so you only lost a little faith (to prevent spamming) + return + else //the do_after failed, probably because you moved or dropped the staff + to_chat(missionary, "Your concentration was broken!") + +/obj/item/weapon/nullrod/missionary_staff/proc/do_convert(mob/living/carbon/human/target, mob/living/carbon/human/missionary) + if(!target || !missionary) + return + if(ismindslave(target)) //mindslaves override the staff because the staff is just a temporary mindslave + to_chat(missionary, "Your faith is strong, but their mind is already slaved to someone else's ideals. Perhaps an inquisition would reveal more...") + faith -= 25 //same faith cost as losing sight of them mid-conversion, but did you just find someone who can lead you to a fellow traitor? + if(isloyal(target)) + if(prob(20)) //loyalty implants typically overpower this, but you CAN get lucky and convert still (20% chance of success) + faith -= 125 //yes, this puts it negative. it's gonna take longer to recharge if you manage to convert a one of these people to balance the new power you gained through them + to_chat(missionary, "Through sheer willpower, you overcome their closed mind and rally [target] to your cause! You may need a bit longer than usual before your faith is fully recharged...") + else //80% chance to fail + faith -= 75 + to_chat(missionary, "Your faith is strong, but their mind remains closed to your ideals. Your resolve helps you retain a bit of faith though.") + return + else if(target.mind.assigned_role == "Psychiatrist" || target.mind.assigned_role == "Librarian") //fancy book lernin helps counter religion (day 0 job love, what madness!) + if(prob(35)) //35% chance to fail + to_chat(missionary, "This one is well trained in matters of the mind... They will not be swayed as easily as you thought...") + faith -=50 //lose half your faith to the book-readers + return + else if(target.mind.assigned_role == "Civilian") + if(prob(55)) //55% chance to take LESS faith than normal, because civies are stupid and easily manipulated + to_chat(missionary, "Your message seems to resound well with [target]; converting them was much easier than expected.") + faith -= 50 + else //45% chance to take the normal 100 faith cost + faith -= 100 + else //everyone else takes 100 faith cost because they are normal + to_chat(missionary, "You successfully convert [target] to your cause. The following grows because of your faith!") + faith -= 100 + //if you made it this far: congratulations! you are now a religious zealot! + var/list/implanters + var/ref = "\ref[missionary.mind]" + if(!(missionary.mind in ticker.mode:implanter)) + ticker.mode:implanter[ref] = list() + implanters = ticker.mode:implanter[ref] + implanters.Add(target.mind) + ticker.mode.implanted.Add(target.mind) + ticker.mode.implanted[target.mind] = missionary.mind + //ticker.mode:implanter[missionary.mind] += target.mind + ticker.mode:implanter[ref] = implanters + ticker.mode.traitors += target.mind + target.mind.special_role = "traitor" + to_chat(target, "You're now a loyal zealot of [missionary.name]! You now must lay down your life to protect them and assist in their goals at any cost.") + var/datum/objective/protect/mindslave/MS = new + MS.owner = target.mind + MS.target = missionary:mind + MS.explanation_text = "Obey every order from and protect [missionary:real_name], the [missionary:mind:assigned_role=="MODE" ? (missionary:mind:special_role) : (missionary:mind:assigned_role)]." + target.mind.objectives += MS + for(var/datum/objective/objective in target.mind.objectives) + to_chat(target, "Objective #1: [objective.explanation_text]") + + ticker.mode.update_traitor_icons_added(missionary.mind) + ticker.mode.update_traitor_icons_added(target.mind)//handles datahuds/observerhuds + + if(missionary.mind.som)//do not add if not a traitor..and you just picked up an implanter in the hall... + var/datum/mindslaves/slaved = missionary.mind.som + target.mind.som = slaved + slaved.serv += target + slaved.add_serv_hud(missionary.mind, "master") //handles master servent icons + slaved.add_serv_hud(target.mind, "mindslave") + + if(target.w_uniform) + target.w_uniform.color = team_color + target.update_inv_w_uniform(0,0) + + log_admin("[ckey(missionary.key)] has converted [ckey(target.key)] as a zealot.") + spawn(6000) //10 minutes of zealotry before you return to normal + ticker.mode.remove_traitor_mind(target.mind) + to_chat(target, "You seem to have forgotten the events of the past 10 minutes or so, and your head aches a bit as if someone beat it savagely with a stick.") + to_chat(target, "This means you don't remember who you were working for or what you were doing.") + log_admin("[ckey(target.key)] has deconverted and is no a zealot of [ckey(missionary.key)].") \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index ef89720e0e3..57f90f56a02 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -878,3 +878,46 @@ user.reagents.add_reagent("syndicate_nanites", 15) else processing_objects.Remove(src) + +//Syndicate Chaplain Robe (WOLOLO!) +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe + description_antag = "This robe is made of reinforced fibers, granting it superior protection and also wirelessly generates power for the neurotransmitter in the linked missionary staff while being worn." + armor = list(melee = 10, bullet = 10, laser = 5, energy = 5, bomb = 0, bio = 0, rad = 15) + var/obj/item/weapon/nullrod/missionary_staff/linked_staff = null + +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/Destroy() + if(linked_staff) //delink on destruction + linked_staff.robes = null + linked_staff = null + ..() + +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/equipped(mob/living/carbon/human/H, slot) + if(!istype(H) || slot != slot_wear_suit) + if(src in processing_objects) + processing_objects -= src + return + else + processing_objects |= src + +/obj/item/clothing/suit/hooded/chaplain_hoodie/missionary_robe/process() + if(!linked_staff) //if we don't have a linked staff, the rest of this is useless + return + + var/mob/living/carbon/human/H = loc + + if(!istype(H)) //if we somehow try to process while not on a human, remove ourselves from processing and return + processing_objects -= src + return + + if(linked_staff.faith >= 100) //if the linked staff is fully recharged, do nothing + return + + if(!linked_staff in range(3, get_turf(src))) //staff won't charge at range (to prevent it from being handed off / stolen and used) + if(prob(10)) //10% chance per process should avoid being too spammy, can tweak if it ends up still being too frequent. + to_chat(H, "Your staff is unable to charge at this range. Get closer!") + return + + linked_staff.faith += 5 + if(linked_staff.faith >= 100) //if this charge puts the staff at or above full, notify the wearer + to_chat(H, "Faith renewed; ready to convert new followers.") + return \ No newline at end of file