diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 0b968d3112c..54e5b3138a8 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -47,6 +47,7 @@
var/list/datum/objective/objectives = list()
var/list/datum/objective/special_verbs = list()
+ var/list/cult_words = list()
var/list/spell_list = list() // Wizard mode & "Give Spell" badmin button.
var/datum/faction/faction //associated faction
@@ -145,7 +146,12 @@
if(src in ticker.mode.cult)
ticker.mode.cult -= src
ticker.mode.update_cult_icons_removed(src)
+ var/datum/game_mode/cult/cult = ticker.mode
+ if(istype(cult))
+ cult.memorize_cult_objectives(src)
special_role = null
+ remove_objectives()
+ remove_antag_equip()
/datum/mind/proc/remove_rev()
if(src in ticker.mode.revolutionaries)
@@ -319,8 +325,11 @@
text = "[text]: "
if (src in ticker.mode.cult)
text += "loyal|employee|CULTIST"
- text += "
Equip"
-
+ text += "
Give tome|amulet."
+/*
+ if (objectives.len==0)
+ text += "
Objectives are empty! Set to sacrifice and escape or summon."
+*/
else if(isloyal(current))
text += "LOYAL|employee|cultist"
else
@@ -973,9 +982,14 @@
ticker.mode.add_cultist(src)
message_admins("[key_name_admin(usr)] has cult'ed [current].")
log_admin("[key_name(usr)] has cult'ed [current].")
- if("equip")
+ if("tome")
+ if (!ticker.mode.equip_cultist(current,1))
+ usr << "Spawning tome failed!"
+
+ if("amulet")
if (!ticker.mode.equip_cultist(current))
- usr << "equip_cultist() failed! [current]'s starting equipment will be incomplete."
+ usr << "Spawning amulet failed!"
+
else if (href_list["wizard"])
switch(href_list["wizard"])
@@ -1344,8 +1358,20 @@
special_role = "Cultist"
current << "You catch a glimpse of the Realm of Nar-Sie, The Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of Nar-Sie."
current << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back."
- current << "Your objective is to summon Nar-Sie by building and defending a suitable shell for the Geometer. Adequate supplies can be procured through human sacrifices."
- ticker.mode.equip_cultist(current)
+ var/datum/game_mode/cult/cult = ticker.mode
+
+ if (istype(cult))
+ cult.memorize_cult_objectives(src)
+ else
+ var/explanation = "Summon Nar-Sie via the use of the appropriate rune (Hell join self). It will only work if nine cultists stand on and around it."
+ current << "Objective #1: [explanation]"
+ current.memory += "Objective #1: [explanation]
"
+ current << "The convert rune is join blood self"
+ current.memory += "The convert rune is join blood self
"
+
+ var/mob/living/carbon/human/H = current
+ if (!ticker.mode.equip_cultist(current))
+ H << "Spawning an amulet from your Master failed."
/datum/mind/proc/make_Rev()
if (ticker.mode.head_revolutionaries.len>0)
@@ -1683,5 +1709,4 @@
/mob/living/simple_animal/hostile/construct/mind_initialize()
..()
mind.assigned_role = "[initial(name)]"
- mind.special_role = "Cultist"
-
+ mind.special_role = "Cultist"
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 7166ef3eea8..a6d756ce40f 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -2,11 +2,28 @@
/datum/game_mode
var/list/datum/mind/cult = list()
+ var/list/cult_objectives = list()
/proc/iscultist(mob/living/M)
return istype(M) && M.mind && ticker && ticker.mode && (M.mind in ticker.mode.cult)
-/proc/cultist_commune(mob/living/user, say = 0, message)
+/proc/is_sacrifice_target(datum/mind/mind)
+ if(ticker.mode.name == "cult")
+ var/datum/game_mode/cult/cult_mode = ticker.mode
+ if(mind == cult_mode.sacrifice_target)
+ return 1
+ return 0
+
+/proc/is_convertable_to_cult(datum/mind/mind)
+ if(!istype(mind)) return 0
+ if(istype(mind.current, /mob/living/carbon/human) && (mind.assigned_role in list("Captain", "Chaplain"))) return 0
+ if(isloyal(mind.current))
+ return 0
+ if (ticker.mode.name == "cult") //redundant?
+ if(is_sacrifice_target(mind)) return 0
+ return 1
+
+/proc/cultist_commune(mob/living/user, clear = 0, say = 0, message)
if(!message)
return
if(say)
@@ -20,12 +37,18 @@
user.say(message)
else
user.whisper(message)
- var/my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]"
+ var/my_message = "Error, message null. You should probably report this."
for(var/mob/M in mob_list)
- if(iscultist(M))
- M << my_message
- if(M in dead_mob_list)
- M << "(F) [my_message]"
+ if(iscultist(M) || (M in dead_mob_list))
+ if(clear || !ishuman(user))
+ my_message = "[(ishuman(user) ? "Acolyte" : "Construct")] [user]: [message]"
+ else //Emergency comms
+ my_message = "Acolyte ???: [message]"
+ if(M in dead_mob_list)
+ M << "(F) [my_message]"
+ else
+ M << my_message
+
log_say("[user.real_name]/[user.key] : [message]")
@@ -36,22 +59,29 @@
antag_flag = ROLE_CULTIST
restricted_jobs = list("Chaplain","AI", "Cyborg", "Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel")
protected_jobs = list()
- required_players = 10
- required_enemies = 2
- recommended_enemies = 2
+ required_players = 35
+ required_enemies = 4
+ recommended_enemies = 4
enemy_minimum_age = 14
- var/eldergod = 0
- var/orbs_needed = 3
- var/obj/structure/constructshell/large/large_shell_reference = null
- var/attempts_left = 3
+ var/finished = 0
+ var/eldergod = 1 //for the summon god objective
+
+ var/acolytes_needed = 10 //for the survive objective
+ var/acolytes_survived = 0
+
+ var/datum/mind/sacrifice_target = null//The target to be sacrificed
+
/datum/game_mode/cult/announce()
world << "The current game mode is - Cult!"
- world << "Some crewmembers are attempting to start a cult!
\nCultists - summon the elder god. Sacrifice crewmembers and turn them into constructs. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Deal with the cultists and any constructs that they might summon."
+ world << "Some crewmembers are attempting to start a cult!
\nCultists - complete your objectives at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.
\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith."
/datum/game_mode/cult/pre_setup()
+ cult_objectives += "sacrifice"
+ cult_objectives += "eldergod"
+
if(config.protect_roles_from_antagonist)
restricted_jobs += protected_jobs
@@ -59,8 +89,8 @@
restricted_jobs += "Assistant"
//cult scaling goes here
- recommended_enemies = 1 + round(num_players()/8)
- orbs_needed = recommended_enemies
+ recommended_enemies = 3 + round(num_players()/30)
+
for(var/cultists_number = 1 to recommended_enemies)
if(!antag_candidates.len)
@@ -75,20 +105,43 @@
return (cult.len>=required_enemies)
+/datum/game_mode/cult/proc/memorize_cult_objectives(datum/mind/cult_mind)
+ for(var/obj_count = 1,obj_count <= cult_objectives.len,obj_count++)
+ var/explanation
+ switch(cult_objectives[obj_count])
+ if("survive")
+ explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
+ if("sacrifice")
+ if(sacrifice_target)
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Sacrifice rune and three acolytes to do so."
+ else
+ explanation = "Free objective."
+ if("eldergod")
+ explanation = "Summon Nar-Sie via the rune 'Call Forth The Geometer'. It will only work if nine acolytes stand on and around it."
+ cult_mind.current << "Objective #[obj_count]: [explanation]"
+ cult_mind.memory += "Objective #[obj_count]: [explanation]
"
/datum/game_mode/cult/post_setup()
modePlayer += cult
+ if("sacrifice" in cult_objectives)
+ var/list/possible_targets = get_unconvertables()
+ if(!possible_targets.len)
+ message_admins("Cult Sacrifice: Could not find unconvertable target, checking for convertable target.")
+ for(var/mob/living/carbon/human/player in player_list)
+ if(player.mind && !(player.mind in cult))
+ possible_targets += player.mind
+ if(possible_targets.len > 0)
+ sacrifice_target = pick(possible_targets)
+ if(!sacrifice_target)
+ message_admins("Cult Sacrifice: ERROR - Null target chosen!")
+ else
+ message_admins("Cult Sacrifice: Could not find unconvertable or convertable target. WELP!")
for(var/datum/mind/cult_mind in cult)
equip_cultist(cult_mind.current)
update_cult_icons_added(cult_mind)
cult_mind.current << "You are a member of the cult!"
memorize_cult_objectives(cult_mind)
..()
-
-
-/datum/game_mode/cult/proc/memorize_cult_objectives(datum/mind/cult_mind)
- cult_mind.current << "Your objective is to summon Nar-Sie by building and defending a suitable shell for the Geometer. Adequate supplies can be procured through human sacrifices."
-
-/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob)
+/datum/game_mode/proc/equip_cultist(mob/living/carbon/human/mob,tome = 0)
if(!istype(mob))
return
mob.cult_add_comm()
@@ -97,9 +150,10 @@
mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself."
mob.dna.remove_mutation(CLOWNMUT)
- . += cult_give_item(/obj/item/weapon/tome, mob)
- . += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
- . += cult_give_item(/obj/item/weapon/melee/cultblade/dagger, mob)
+ if(tome)
+ . += cult_give_item(/obj/item/weapon/tome, mob)
+ else
+ . += cult_give_item(/obj/item/weapon/paper/talisman/supply, mob)
mob << "These will help you start the cult on this station. Use them well, and remember - you are not the only one."
/datum/game_mode/proc/cult_give_item(obj/item/item_path, mob/living/carbon/human/mob)
@@ -110,6 +164,7 @@
"left hand" = slot_l_hand,
"right hand" = slot_r_hand,
)
+
var/T = new item_path(mob)
var/item_name = initial(item_path.name)
var/where = mob.equip_in_one_of_slots(T, slots)
@@ -126,14 +181,15 @@
return 1
/datum/game_mode/proc/add_cultist(datum/mind/cult_mind) //BASE
- if (!istype(cult_mind) || (cult_mind in cult))
+ if (!istype(cult_mind))
return 0
- cult_mind.current.Paralyse(5)
- cult += cult_mind
- cult_mind.current.faction |= "cult"
- cult_mind.current.cult_add_comm()
- update_cult_icons_added(cult_mind)
- cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!"
+ if(!(cult_mind in cult) && is_convertable_to_cult(cult_mind))
+ cult_mind.current.Paralyse(5)
+ cult += cult_mind
+ cult_mind.current.faction |= "cult"
+ cult_mind.current.cult_add_comm()
+ update_cult_icons_added(cult_mind)
+ cult_mind.current.attack_log += "\[[time_stamp()]\] Has been converted to the cult!"
if(jobban_isbanned(cult_mind.current, ROLE_CULTIST))
replace_jobbaned_player(cult_mind.current, ROLE_CULTIST, ROLE_CULTIST)
return 1
@@ -168,14 +224,81 @@
var/datum/atom_hud/antag/culthud = huds[ANTAG_HUD_CULT]
culthud.leave_hud(cult_mind.current)
set_antag_hud(cult_mind.current, null)
+/datum/game_mode/cult/proc/get_unconvertables()
+ var/list/ucs = list()
+ for(var/mob/living/carbon/human/player in player_list)
+ if(player.mind && !is_convertable_to_cult(player.mind))
+ ucs += player.mind
+ return ucs
+/datum/game_mode/cult/proc/check_cult_victory()
+ var/cult_fail = 0
+ if(cult_objectives.Find("survive"))
+ cult_fail += check_survive() //the proc returns 1 if there are not enough cultists on the shuttle, 0 otherwise
+ if(cult_objectives.Find("eldergod"))
+ cult_fail += eldergod //1 by default, 0 if the elder god has been summoned at least once
+ if(cult_objectives.Find("sacrifice"))
+ if(sacrifice_target && !sacrificed.Find(sacrifice_target)) //if the target has been sacrificed, ignore this step. otherwise, add 1 to cult_fail
+ cult_fail++
+ return cult_fail //if any objectives aren't met, failure
+
+
+/datum/game_mode/cult/proc/check_survive()
+ var/acolytes_survived = 0
+ for(var/datum/mind/cult_mind in cult)
+ if (cult_mind.current && cult_mind.current.stat != DEAD)
+ if(cult_mind.current.onCentcom() || cult_mind.current.onSyndieBase())
+ acolytes_survived++
+ if(acolytes_survived>=acolytes_needed)
+ return 0
+ else
+ return 1
+
/datum/game_mode/cult/declare_completion()
- if(eldergod)
+
+ if(!check_cult_victory())
feedback_set_details("round_end_result","win - cult win")
- world << "The cult wins! It has succeeded in serving its dark master!"
+ feedback_set("round_end_result",acolytes_survived)
+ world << "The cult has succeeded! Nar-sie has snuffed out another torch in the void!"
else
feedback_set_details("round_end_result","loss - staff stopped the cult")
- world << "The staff managed to stop the cult!"
+ feedback_set("round_end_result",acolytes_survived)
+ world << "The staff managed to stop the cult! Dark words and heresy are no match for Nanotrasen's finest!"
+
+ var/text = ""
+
+ if(cult_objectives.len)
+ text += "
The cultists' objectives were:"
+ for(var/obj_count=1, obj_count <= cult_objectives.len, obj_count++)
+ var/explanation
+ switch(cult_objectives[obj_count])
+ if("survive")
+ if(!check_survive())
+ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Success!"
+ feedback_add_details("cult_objective","cult_survive|SUCCESS|[acolytes_needed]")
+ else
+ explanation = "Make sure at least [acolytes_needed] acolytes escape on the shuttle. ([acolytes_survived] escaped) Fail."
+ feedback_add_details("cult_objective","cult_survive|FAIL|[acolytes_needed]")
+ if("sacrifice")
+ if(sacrifice_target)
+ if(sacrifice_target in sacrificed)
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Success!"
+ feedback_add_details("cult_objective","cult_sacrifice|SUCCESS")
+ else if(sacrifice_target && sacrifice_target.current)
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail."
+ feedback_add_details("cult_objective","cult_sacrifice|FAIL")
+ else
+ explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. Fail (Gibbed)."
+ feedback_add_details("cult_objective","cult_sacrifice|FAIL|GIBBED")
+ if("eldergod")
+ if(!eldergod)
+ explanation = "Summon Nar-Sie. Success!"
+ feedback_add_details("cult_objective","cult_narsie|SUCCESS")
+ else
+ explanation = "Summon Nar-Sie. Fail."
+ feedback_add_details("cult_objective","cult_narsie|FAIL")
+ text += "
Objective #[obj_count]: [explanation]"
+ world << text
..()
return 1
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 1824d7a2280..5b27efc1420 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -9,7 +9,7 @@
force = 30
throwforce = 10
hitsound = 'sound/weapons/bladeslice.ogg'
- attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
@@ -124,67 +124,3 @@
w_class = 3
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/internals/)
armor = list(melee = 70, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
-
-/obj/item/summoning_orb
- name = "summoning orb"
- desc = "A mysterious orb that glows eerily. You could swear that it just moved on its own."
- icon = 'icons/obj/cult.dmi'
- icon_state = "summoning_orb"
- w_class = 1
-
-/obj/item/summoning_orb/afterattack(atom/target, mob/user, proximity_flag)
- if(!iscultist(user))
- return ..()
- if(proximity_flag && isliving(target) && iscultist(target))
- var/mob/living/L = target
- if(L.stat == DEAD)
- user << "You shouldn't waste that."
- return ..()
- target << "You feel the Geometer's essence violating your insides."
- target << "It feels... good."
- target.reagents.add_reagent("unholywater", 15)
- qdel(src)
- ..()
-
-/obj/item/summoning_orb/attack_self(mob/user)
- if(!iscultist(user))
- return ..()
- if(ticker.mode.name != "cult")
- return
- var/turf/T = get_turf(user)
- if(T.z != ZLEVEL_STATION)
- user << "You shouldn't do this here. Go back."
- return
- var/datum/game_mode/cult/cult = ticker.mode
- if(!cult.attempts_left)
- user << "You attempt to call out to the Geometer, but there is no answer..."
- return
- if(cult.eldergod)
- user << "The Geometer has already started manifesting in [initial(A.name)]. You can no longer move Her shell."
- return
- switch(alert(user,"The Geometer's shell has already been manifested. Do you wish to summon it to your location?","Summoning Large Shell","Yes","No"))
- if("Yes")
- S.visible_message("The shell suddenly vanishes.")
- S.loc = user.loc
- else
- switch(alert(user,"Are you sure you wish to summon the large construct shell? [cult.attempts_left] attempts left!","Summoning Large Shell","Yes","No"))
- if("Yes")
- cult.attempts_left--
- place_down_large_shell(user)
- qdel(src)
-
-/obj/item/summoning_orb/proc/place_down_large_shell(mob/user)
- if(!(ticker.mode.name == "cult"))
- user << "You attempt to call out to the Geometer for Her shell, but you fail..."
- return
- var/datum/game_mode/cult/cult = ticker.mode
- if(cult.attempts_left <= 0)
- user << "The Geometer is no longer interested in you."
- var/A = new /obj/structure/constructshell/large(get_turf(src))
- cult.large_shell_reference = A
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index a1c9e0b5373..d0df29a0c6e 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -1,172 +1,3 @@
-/obj/structure/constructshell/large
- name = "large empty shell"
- icon = 'icons/obj/cult_large.dmi'
- icon_state = "shell_narsie_grey"
- desc = "An oversized construct shell, fit for an elder god. Only a lunatic would even dream of such a crazed contraption."
- pixel_x = -16
- pixel_y = -16
- density = 1
- layer = 4.5
- anchored = 0
- var/maxhealth = 200
- var/health = 200
- var/image/black_overlay = null
- var/orbs = 0
- var/orbs_needed = 1
- var/time_to_win = 1800 //3 minutes
- var/timer_id = null
-
-/obj/structure/constructshell/large/New()
- ..()
- if(ticker.mode.name == "cult")
- var/datum/game_mode/cult/cult = ticker.mode
- orbs_needed = cult.orbs_needed
- if(cult.eldergod || (cult.large_shell_reference && cult.large_shell_reference != src))
- qdel(src)
- return
- else
- qdel(src)
- return
- black_overlay = image('icons/obj/cult_large.dmi', "shell_narsie_black")
- SSshuttle.emergencyNoEscape = 1
-
-/obj/structure/constructshell/large/Destroy()
- var/go_to_red = 1
- if(ticker.mode.name == "cult")
- var/datum/game_mode/cult/cult = ticker.mode
- cult.large_shell_reference = null
- if(cult.eldergod)
- go_to_red = 0
- black_overlay = null
- if(timer_id)
- deltimer(timer_id)
- if(go_to_red)
- priority_announce("The extra-dimensional flow has ceased. All personnel should return to their routine activities.","Central Command Higher Dimensions Affairs")
- if(get_security_level() == "delta")
- set_security_level("red")
- SSshuttle.emergencyNoEscape = 0
- if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
- SSshuttle.emergency.mode = SHUTTLE_DOCKED
- SSshuttle.emergency.timer = world.time
- ..()
-
-/obj/structure/constructshell/large/examine(mob/user)
- ..()
- user << "You see a number of round holes on the surface of the shell. They number [orbs_needed], and [orbs ? orbs : "none"] of them [orbs > 1 ? "are" : "is"] filled."
-
-/obj/structure/constructshell/large/update_icon()
- var/new_alpha = round((orbs/orbs_needed)*255)
- if(new_alpha)
- overlays -= black_overlay
- black_overlay.alpha = new_alpha
- overlays += black_overlay
-
-/obj/structure/constructshell/large/attackby(obj/item/O, mob/user, params)
- if(istype(O, /obj/item/summoning_orb) && (orbs < orbs_needed))
- if(!iscultist(user))
- return
- var/turf/T = get_turf(user)
- if(T.z != ZLEVEL_STATION)
- user << "You shouldn't do this here. Go back."
- return
- visible_message("\The [src] glows.")
- orbs++
- qdel(O)
- update_icon()
- if(orbs >= orbs_needed)
- start_takeover()
- return
-
- if( (O.flags&NOBLUDGEON) || !O.force )
- return
- add_fingerprint(user)
- user.changeNext_move(CLICK_CD_MELEE)
- user.do_attack_animation(src)
- playsound(src, 'sound/weapons/smash.ogg', 50, 1)
- visible_message("[user] has hit \the [src] with [O].")
- if(O.damtype == BURN || O.damtype == BRUTE)
- damaged(O.force)
-
-//this stuff is mostly copy-pasted from gang dominators, with some changes
-/obj/structure/constructshell/large/proc/start_takeover()
- anchored = 1
- overlays -= black_overlay
- icon_state = "shell_narsie_active"
- flick("shell_narsie_activation", src)
- set_security_level("delta")
- var/area/A = get_area(src)
- var/locname = initial(A.name)
- priority_announce("Figments from an eldritch god have begun pouring into [locname] from an unknown dimension. Eliminate its vessel before it reaches a critical point.","Central Command Higher Dimensions Affairs")
- timer_id = addtimer(src, "summon_narnar", time_to_win)
-
-/obj/structure/constructshell/large/proc/damaged(damage)
- health -= damage
- if(health <= 0)
- new /obj/item/stack/sheet/plasteel(get_turf(src))
- qdel(src)
-
-/obj/structure/constructshell/large/bullet_act(obj/item/projectile/P)
- if(P.damage)
- playsound(src, 'sound/effects/bang.ogg', 50, 1)
- visible_message("[src] was hit by [P].")
- damaged(P.damage)
-
-/obj/structure/constructshell/large/attack_alien(mob/living/user)
- user.do_attack_animation(src)
- playsound(src, 'sound/effects/bang.ogg', 50, 1)
- user.visible_message("[user] smashes against [src] with its claws.",\
- "You smash against [src] with your claws.")
- damaged(15)
-
-/obj/structure/constructshell/large/attack_animal(mob/living/user)
- if(!isanimal(user))
- return
- var/mob/living/simple_animal/M = user
- M.do_attack_animation(src)
- if(M.melee_damage_upper <= 0)
- return
- damaged(M.melee_damage_upper)
-
-/obj/structure/constructshell/large/mech_melee_attack(obj/mecha/M)
- if(M.damtype == "brute")
- playsound(src, 'sound/effects/bang.ogg', 50, 1)
- visible_message("[M.name] has hit [src].")
- damaged(M.force)
-
-/obj/structure/constructshell/large/attack_hulk(mob/user)
- playsound(src, 'sound/effects/bang.ogg', 50, 1)
- user.visible_message("[user] smashes [src].",\
- "You punch [src].")
- damaged(5)
-
-/obj/structure/constructshell/large/ex_act()
- return //nope
-
-/obj/structure/constructshell/large/singularity_pull()
- return //nope
-
-/obj/structure/constructshell/large/singularity_act(current_size, obj/singularity/S)
- var/atom/target = get_edge_target_turf(src, get_dir(src, S))
- S.throw_at(target, 5, 1) //aaand nope
-
-/obj/structure/constructshell/large/proc/summon_narnar()
- if(ticker.mode.name != "cult")
- visible_message("\The [src] glows brightly once, then falls dark. It looks strangely dull and lifeless...")
- log_game("Summon Nar-Sie rune failed - gametype is not cult")
- return
- var/datum/game_mode/cult/cult_mode = ticker.mode
- if(cult_mode.eldergod)
- return //this should never happen, so we don't need any special fluff
- world << 'sound/effects/dimensional_rend.ogg'
- world << "Rip... Rrrip... RRRRRRRRRR--"
- var/turf/target_turf = get_turf(src)
- spawn(40)
- new /obj/singularity/narsie/large(target_turf) //Causes Nar-Sie to spawn even if the rune has been removed
- cult_mode.eldergod = 1
- if(src)
- qdel(src)
-
-
/obj/structure/cult
density = 1
anchored = 1
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index a4a81e5d9f5..7dcc65c72e2 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -9,7 +9,7 @@ This file contains the arcane tome files as well as innate cultist emergency com
/mob/living/proc/cult_innate_comm()
set category = "Cultist"
- set name = "Communion"
+ set name = "Imperfect Communion"
if(!iscultist(usr) || usr.incapacitated())
return
@@ -21,7 +21,24 @@ This file contains the arcane tome files as well as innate cultist emergency com
if(!iscultist(usr) || usr.incapacitated())
return //we do this again because input() sleeps
- cultist_commune(usr, 0, input)
+ if(ishuman(usr) || ismonkey(usr)) //Damage only applies to humans and monkeys, to allow constructs to communicate
+ usr.visible_message("[usr] starts clawing at \his arms with \his fingernails!", "You begin slicing open your arms with your fingernails!")
+ apply_damage(10,BRUTE, "l_arm")
+ apply_damage(10,BRUTE, "r_arm")
+ sleep(50)
+ if(usr.incapacitated())
+ return //Hard to drawn intrinsic symbols when you're bleeding out in your cell.
+ var/turf/location = loc
+ if(istype(location, /turf/simulated)) // tearing your arms apart is going to spill a bit of blood, in fact thats the idea
+ location.add_blood(usr) // TO-DO change this to a badly drawn rune
+ apply_damage(10,BRUTE, "l_arm") // does a metric fuck ton of damage because this meant to be an emergency method of communication.
+ apply_damage(10,BRUTE, "r_arm")
+ if(usr.incapacitated())
+ return
+ usr.visible_message("[usr] paints strange symbols with their own blood.", "You paint a messy rune with your own blood.")
+ sleep(20)
+
+ cultist_commune(usr, 0, 1, input)
return
@@ -32,13 +49,6 @@ This file contains the arcane tome files as well as innate cultist emergency com
throw_speed = 2
throw_range = 5
w_class = 2
- var/list/known_runes = null
-
-/obj/item/weapon/tome/New()
- ..()
- known_runes = shuffle(subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
- var/known_amount = round((known_runes.len)/2)
- known_runes.Cut(known_amount)
/obj/item/weapon/tome/examine(mob/user)
..()
@@ -79,20 +89,25 @@ This file contains the arcane tome files as well as innate cultist emergency com
open_tome(user)
/obj/item/weapon/tome/proc/open_tome(mob/user)
- var/choice = alert(user,"You open the tome...",,"Scribe Rune","Read Tome")
+ var/choice = alert(user,"You open the tome...",,"Commune","Scribe Rune","Read Tome")
switch(choice)
if("Read Tome")
read_tome(user)
if("Scribe Rune")
scribe_rune(user)
+ if("Commune")
+ var/input = stripped_input(usr, "Please enter a message to tell to the other acolytes.", "Voice of Blood", "")
+ if(!input)
+ return
+ cultist_commune(user, 1, 0, input)
/obj/item/weapon/tome/proc/read_tome(mob/user)
var/text = ""
text += "
Archives of the Dark One
"
text += "As a member of the cult, your goals are almost or entirely impossible to complete without special aid from the Geometer's plane. The primary method of doing this are runes. These \
scribings, drawn in blood, are concentrated nodes of the magic within Nar-Sie's realm and will allow the performance of many tasks to aid you and the rest of the cult in your objectives. Runes \
- have many different names, and almost all of them are known as Rites. Each follower of the Geometer is only able to use a subset of these, thus you must go forth and meet your fellow followers. \
- A small description of each rune can be found below.
A rune's name and effects can be revealed by examining the rune.
"
+ have many different names, and almost all of them are known as Rites. The only rune that is not a Rite is the Ritual of Dimensional Rending, which can only be performed with nine cultists and calls \
+ forth the avatar of the Geometer herself (so long as she consents).
A rune's name and effects can be revealed by examining the rune.
"
text += "Teleport
The Rite of Translocation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, the rune will \
search for other Rites of Translocation with the same keyword. Assuming one is found, the user will be instantaneously transported to the location of the other rune. If more than two runes are scribed \
@@ -101,6 +116,13 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "Teleport Other
The Rite of Forced Translocation, like the Rite of Translocation, works by teleporting the person on the rune to one of the \
same keyword. However, this rune will only work on people other than the user, allowing the user to send any living creature somewhere else.
"
+ text += "Summon Tome
The Rite of Knowledge is a simplistic rune. When invoked, it will summon a single arcane tome to the rune's location before vanishing. \
+
"
+
+ text += "Convert
The Rite of Enlightment is paramount to the success of the cult. It will allow you to convert normal crew members into cultists. \
+ To do this, simply place the crew member upon the rune and invoke it. This rune requires two acolytes to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
+ be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.
"
+
text += "Sacrifice
The Rite of Tribute is used to offer sacrifice to the Geometer. Simply place any living creature upon the rune and invoke it (this will not \
target cultists!). If this creature has a mind, a soul shard will be created and the creature's soul transported to it. This rune is required if the cult's objectives include the sacrifice of a crew \
member.
"
@@ -110,7 +132,14 @@ This file contains the arcane tome files as well as innate cultist emergency com
within a few seconds, they will be brought back to life, healed of all ailments.
"
text += "Veil Runes
The Rite of Obscurity is a rite that will cause all nearby runes to become invisible. The runes will still be considered by other rites \
- (such as the Rite of Translocation) but will be unusuable directly. Use the same rite once more to reveal these runes once more.
"
+ (such as the Rite of Translocation) but will be unusuable directly.(such as the Rite of Translocation) but will be unusuable directly. Use the same rite once more to reveal these runes once more.
"
+
+ text += "Reveal Runes
The Rite of True Sight is the foil of the Rite of Obscurity. It will turn all invisible runes visible once more, in addition to causing \
+ all spirits nearby to become visible.
"
+
+ text += "Disguise Runes
Many crewmen enjoy drawing runes in crayon that resemble spell circles in order to play pranks on their fellow crewmen. The Rite of \
+ False Truths takes advantage of this very joke. When invoked, all nearby runes will appear dull, precisely resembling those drawn in crayon. They still cannot be cleaned by conventional means, so \
+ anyone trying to clean up the rune may become suspicious as it does not respond.
"
text += "Electromagnetic Disruption
Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption may allow you to gain the upper \
hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location.
"
@@ -127,8 +156,8 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "Debilitate
The Rite of the Shadowed Mind is simple. When invoked, it will cause all non-cultists that can see its rune to become deaf, blind and mute for a \
considerable amount of time.
"
- text += "Stun
Though the Rite of Blazing Light is weak when invoked normally, merely disorienting and disabling nearby non-cultists, non-cultists that step on the rune \
- will be stunned without expending its power. However, the disorientation caused by this rune is quite brief, and when invoked directly, it will not remain for further invocation.
"
+ text += "Stun
Though the Rite of Blazing Light is weak when invoked normally, using it in conjuction with the Rite of Binding makes it much more powerful. \
+ This rune will cause any non-cultists that can see the rune to become disoriented, disabling them for a short time.
"
text += "Summon Cultist
The Rite of Joined Souls requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \
any location. This will deal a moderate amount of damage to all invokers.
"
@@ -147,9 +176,6 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "Blood Boil
The Rite of Boiling Blood may be considered one of the most dangerous rites composed by the cult of Nar-Sie. When invoked, it will do a \
massive amount of damage to all non-cultist viewers, but it will also emit an explosion upon invocation. Use with caution
"
- text += "Immolate
The Rite of the Cleansing Flame is a weaker offensive rite, fit to be used by a lone cultist. When its rune is invoked, it will set any non-cultists \
- that can see it on fire. However, it will also burn its user.
"
-
text += "Time Stop
The Rite of Dimensional Corruption is a versatile rite that can be very strong when protecting our cult from the enemies of the Geometer. \
As it is invoked, it will rend and reshape reality around itself, stopping time for all those who don't follow the teachings of the Geometer. However, it requires more than one ritual soul as a \
catalyst, and its power is bound to overflow and hurt its casters.
"
@@ -159,6 +185,10 @@ This file contains the arcane tome files as well as innate cultist emergency com
to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, the spirits will dissipate, dropping their items to the ground. You may manifest \
multiple spirits with one rune, but you will rapidly take damage in doing so.
"
+ text += "Call Forth The Geometer
There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \
+ comparison to other runes, is very large, requiring a 3x3 space of empty tiles to create. To invoke the rune, nine cultists must stand on the rune, so that all of them are within its circle. Then, \
+ simply invoke it. A brief tearing will be heard as the barrier between dimensions is torn open, and the avatar will come forth.
"
+
text += "While runes are excellent for many tasks, they lack portability. The advent of talismans has, to a degree, solved this inconvenience. Simply put, a talisman is a piece of paper with a \
rune inlaid within it. The words of the rune can be whispered in order to invoke its effects, although usually to a lesser extent. To create a talisman, simply use a Rite of Binding as described above. \
Unless stated otherwise, talismans are invoked by activating them in your hand. A list of valid rites, as well as the effects of their talisman form, can be found below.
"
@@ -166,11 +196,17 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "Talisman of Teleportation
The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \
disappear.
"
- text += "Talismans of Veiling
This talisman functions identically to its rune counterpart.It will disappear after one use.
"
+ text += "Talisman of Tome Summoning
This talisman functions nearly identically to the rune. The talisman will attempt to place the tome in your hand \
+ instead of on the ground, though this is the only advantage it has over the rune. It can be used once, then disappears.
"
+
+ text += "Talismans of Veiling, Revealing, and Disguising
These talismans all function identically to their rune counterparts, but with less range. In addition, \
+ the Talisman of True Sight will not reveal spirits. They will disappear after one use.
"
text += "Talisman of Electromagnetic Pulse
This talisman functions like the Rite of Disruption. It disappears after one use.
"
- text += "Talisman of Immolation
This talisman functions exactly like the Rite of Cleansing Flame. It can only be used once.
"
+ text += "Talisman of Stunning
Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \
+ talisman functions differently from others. Rather than simply reading the words, the target must be attacked directly with the talisman. The talisman will then knock down the target for a long \
+ duration in addition to inhibiting their speech. Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead."
var/datum/browser/popup = new(user, "tome", "", 800, 600)
popup.set_content(text)
@@ -182,10 +218,10 @@ This file contains the arcane tome files as well as innate cultist emergency com
var/rune_to_scribe
var/entered_rune_name
var/list/possible_runes = list()
- for(var/T in known_runes)
+ for(var/T in subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
var/obj/effect/rune/R = T
if(initial(R.cultist_name))
- possible_runes += initial(R.cultist_name) //This is to allow the menu to let cultists select runes by name rather than by object path. I don't know a better way to do this
+ possible_runes.Add(initial(R.cultist_name)) //This is to allow the menu to let cultists select runes by name rather than by object path. I don't know a better way to do this
if(!possible_runes.len)
return
entered_rune_name = input(user, "Choose a rite to scribe.", "Sigils of Power") as null|anything in possible_runes
@@ -210,6 +246,13 @@ This file contains the arcane tome files as well as innate cultist emergency com
if(iscarbon(user))
var/mob/living/carbon/C = user
C.apply_damage(0.1, BRUTE, pick("l_arm", "r_arm"))
+ if("Call Forth The Geometer" == entered_rune_name)
+ C.apply_damage(40, BRUTE, pick("l_arm", "r_arm"))
+ var/area/A = get_area(src)
+ var/locname = initial(A.name)
+ priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual before it reaches a critical point.","Central Command Higher Dimensionsal Affairs")
+ if(!do_after(user, 500, target = get_turf(user)))
+ return
if(!do_after(user, 50, target = get_turf(user)))
return
user.visible_message("[user] creates a strange circle in their own blood.", \
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index d12f9e16923..9d195b54115 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -1,3 +1,6 @@
+/var/list/sacrificed = list()
+var/list/non_revealed_runes = (subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed)
+
/*
This file contains runes.
@@ -50,6 +53,7 @@ To draw a rune, use an arcane tome.
qdel(src)
return
else if(istype(I, /obj/item/weapon/nullrod))
+ user.say("BEGONE FOUL MAGIKS!!")
user << "You disrupt the magic of [src] with [I]."
qdel(src)
return
@@ -259,6 +263,59 @@ var/list/teleport_other_runes = list()
"Your vision blurs, and you suddenly appear somewhere else.")
target.forceMove(get_turf(selected_rune))
+//Rite of Knowledge: Creates an arcane tome at the rune's location and destroys the rune.
+/obj/effect/rune/summon_tome
+ cultist_name = "Summon Tome"
+ cultist_desc = "Pulls an arcane tome from the archives of the Geometer."
+ invocation = "N'ath reth sh'yro eth d'raggathnor!"
+ icon_state = "5"
+ color = rgb(0, 0, 255)
+
+
+/obj/effect/rune/summon_tome/invoke(mob/living/user)
+ visible_message("A frayed tome materializes on the surface of [src], which dissolves into nothing.")
+ new /obj/item/weapon/tome(get_turf(src))
+ qdel(src)
+
+
+//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby.
+/obj/effect/rune/convert
+ cultist_name = "Convert"
+ cultist_desc = "Converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew."
+ invocation = "Mah'weyh pleggh at e'ntrath!"
+ icon_state = "3"
+ color = rgb(255, 0, 0)
+ req_cultists = 2
+
+/obj/effect/rune/convert/invoke(mob/living/user)
+ var/list/convertees = list()
+ var/turf/T = get_turf(src)
+ for(var/mob/living/M in T.contents)
+ if(!iscultist(M) && !isloyal(M))
+ convertees.Add(M)
+ if(!convertees.len)
+ fail_invoke()
+ log_game("Convert rune failed - no eligible convertees")
+ return
+ var/mob/living/new_cultist = pick(convertees)
+ if(!is_convertable_to_cult(new_cultist.mind) || new_cultist.null_rod_check())
+ user << "Something is shielding [new_cultist]'s mind!"
+ fail_invoke()
+ log_game("Convert rune failed - convertee could not be converted")
+ if(is_sacrifice_target(new_cultist.mind))
+ for(var/mob/living/M in orange(1,src))
+ if(iscultist(M))
+ M << "\"I desire this one for myself. SACRIFICE THEM!\""
+ return
+ new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \
+ "AAAAAAAAAAAAAA-")
+ ticker.mode.add_cultist(new_cultist.mind)
+ new_cultist.mind.special_role = "Cultist"
+ new_cultist << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \
+ and something evil takes root."
+ new_cultist << "Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
+ "
+
//Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body.
/obj/effect/rune/sacrifice
cultist_name = "Sacrifice"
@@ -298,14 +355,14 @@ var/list/teleport_other_runes = list()
fail_invoke()
rune_in_use = 0
return
- if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD)) //Requires two people to sacrifice living targets
+ if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets
var/cultists_nearby = 1
for(var/mob/living/M in range(1,src))
if(iscultist(M) && M != user)
cultists_nearby++
M.say(invocation)
- if(cultists_nearby < 2)
- user << "[offering] is too greatly linked to the world! You need more acolytes!"
+ if(cultists_nearby < 3)
+ user << "[offering] is too greatly linked to the world! You need three acolytes!"
fail_invoke()
log_game("Sacrifice rune failed - not enough acolytes and target is living")
rune_in_use = 0
@@ -317,17 +374,29 @@ var/list/teleport_other_runes = list()
sac(offering)
/obj/effect/rune/sacrifice/proc/sac(mob/living/T)
+ var/sacrifice_fulfilled
if(T)
+ if(istype(T, /mob/living/simple_animal/pet/dog))
+ for(var/mob/living/carbon/C in range(3,src))
+ if(iscultist(C))
+ C << "\"Even I have standards, such as they are!\""
+ if(C.reagents)
+ C.reagents.add_reagent("hell_water", 2)
+ if(T.mind)
+ sacrificed.Add(T.mind)
+ if(is_sacrifice_target(T.mind))
+ sacrifice_fulfilled = 1
PoolOrNew(/obj/effect/overlay/temp/cult/sac, src.loc)
for(var/mob/living/M in range(3,src))
if(iscultist(M))
- if(ishuman(T) || isrobot(T))
- M << "\"I accept this sacrifice.\""
+ if(sacrifice_fulfilled)
+ M << "\"Yes! This is the one I desire! You have done well.\""
else
- M << "\"I accept this meager sacrifice.\""
+ if(ishuman(T) || isrobot(T))
+ M << "\"I accept this sacrifice.\""
+ else
+ M << "\"I accept this meager sacrifice.\""
if(T.mind)
- if(ishuman(T) || isrobot(T))
- new /obj/item/summoning_orb(get_turf(src))
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
if(!stone.transfer_soul("FORCE", T, usr)) //If it cannot be added
@@ -345,6 +414,77 @@ var/list/teleport_other_runes = list()
T.gib()
rune_in_use = 0
+//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
+/obj/effect/rune/narsie
+ cultist_name = "Call Forth The Geometer"
+ cultist_desc = "Tears apart dimensional barriers, calling forth the avatar of the Geometer."
+ invocation = null
+ req_cultists = 9
+ icon = 'icons/effects/96x96.dmi'
+ icon_state = "rune_large"
+ pixel_x = -32 //So the big ol' 96x96 sprite shows up right
+ pixel_y = -32
+ var/used
+
+/obj/effect/rune/narsie/invoke(mob/living/user)
+ if(used)
+ return
+ if(ticker.mode.name == "cult")
+ var/datum/game_mode/cult/cult_mode = ticker.mode
+ if(!("eldergod" in cult_mode.cult_objectives))
+ message_admins("[usr.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong")
+ for(var/mob/living/M in range(1,src))
+ if(iscultist(M))
+ M << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\""
+ if(M.reagents)
+ M.reagents.add_reagent("hell_water", 10)
+ M.Weaken(5)
+ fail_invoke()
+ log_game("Summon Nar-Sie rune failed - improper objective")
+ return
+ else
+ if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
+ for(var/mob/living/M in orange(1,src))
+ if(iscultist(M))
+ M << "The sacrifice is not complete. The portal lacks the power to open!"
+ fail_invoke()
+ log_game("Summon Nar-Sie rune failed - sacrifice not complete")
+ return
+ if(!cult_mode.eldergod)
+ for(var/mob/living/M in orange(1,src))
+ if(iscultist(M))
+ M << "The avatar of Nar-Sie is already on this plane!"
+ log_game("Summon Nar-Sie rune failed - already summoned")
+ return
+ //BEGIN THE SUMMONING
+ used = 1
+ for(var/mob/living/M in range(1,src))
+ if(iscultist(M))
+ M.say("TOK-LYR RQA-NAP G'OLT-ULOFT!!")
+ world << 'sound/effects/dimensional_rend.ogg'
+ world << "The veil... is... TORN!!!--"
+ sleep(40)
+ new /obj/singularity/narsie/large(get_turf(user)) //Causes Nar-Sie to spawn even if the rune has been removed
+ cult_mode.eldergod = 0
+ else
+ fail_invoke()
+ log_game("Summon Nar-Sie rune failed - gametype is not cult")
+ return
+
+/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
+ if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
+ user.visible_message("[user.name] begins erasing the [src]...", "You begin erasing the [src]...")
+ if(do_after(user, 50, target = src)) //Prevents accidental erasures.
+ log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome")
+ message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
+ ..()
+ return
+ else
+ if(istype(I, /obj/item/weapon/nullrod)) //Begone foul magiks. You cannot hinder me.
+ log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
+ message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
+ ..()
+ return
//Rite of Resurrection: Requires two corpses. Revives one and gibs the other.
/obj/effect/rune/raise_dead
@@ -414,8 +554,8 @@ var/list/teleport_other_runes = list()
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20)
sleep(20)
if(!mob_to_sacrifice || !in_range(mob_to_sacrifice, src))
+ mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones")
return
- mob_to_sacrifice.visible_message("[mob_to_sacrifice] disintegrates into a pile of bones[mob_to_revive ? ", the glowing tendril sinking into [mob_to_revive]'s body":""].")
mob_to_sacrifice.dust()
if(!mob_to_revive || mob_to_revive.stat != DEAD)
visible_message("The glowing tendril snaps against the rune with a shocking crack.")
@@ -437,7 +577,7 @@ var/list/teleport_other_runes = list()
//Rite of Obscurity: Turns all runes within a 3-tile radius invisible or reveals them again.
/obj/effect/rune/hide_runes
cultist_name = "Veil Runes"
- cultist_desc = "Turns nearby runes invisible. They can be revealed by using this rune again."
+ cultist_desc = "Turns nearby runes invisible. They can be revealed by using the Reveal Rune."
invocation = "Kla'atu barada nikt'o!"
icon_state = "1"
color = rgb(0,0,255)
@@ -445,15 +585,45 @@ var/list/teleport_other_runes = list()
/obj/effect/rune/hide_runes/invoke(mob/living/user)
visible_message("[src] darkens to black and vanishes.")
for(var/obj/effect/rune/R in orange(3,src))
- if(R.invisibility == INVISIBILITY_OBSERVER)
- R.invisibility = 0
- R.alpha = initial(R.alpha)
- else
- R.visible_message("[R] fades away.")
- R.invisibility = INVISIBILITY_OBSERVER
- R.alpha = 100 //To help ghosts distinguish hidden runes
+ R.visible_message("[R] fades away.")
+ R.invisibility = INVISIBILITY_OBSERVER
+ R.alpha = 100 //To help ghosts distinguish hidden runes
+ for(var/mob/dead/observer/O in orange(3,src))
+ if(!O.invisibility)
+ O << "You suddenly feel as if you've vanished..."
+ O.invisibility = INVISIBILITY_OBSERVER
qdel(src)
+//Rite of True Sight: Turns ghosts and obscured runes visible
+/obj/effect/rune/true_sight
+ cultist_name = "Reveal Runes"
+ cultist_desc = "Reveals all invisible objects nearby, from spirits to runes."
+ invocation = "Nikt'o barada kla'atu!"
+ icon_state = "4"
+ color = rgb(255, 255, 255)
+
+/obj/effect/rune/true_sight/invoke()
+ visible_message("[src] explodes in a flash of blinding light!")
+ for(var/mob/dead/observer/O in orange(3,src))
+ O << "You suddenly feel very obvious..."
+ O.invisibility = 0
+ for(var/obj/effect/rune/R in orange(3,src))
+ R.invisibility = 0
+ R.alpha = initial(R.alpha)
+ qdel(src)
+
+ //Rite of False Truths: Makes runes appear like crayon ones
+/obj/effect/rune/make_runes_fake
+ cultist_name = "Disguise Runes"
+ cultist_desc = "Causes all nearby runes (including itself) to resemble those drawn in crayon."
+ invocation = "By'o isit!"
+ icon_state = "4"
+ color = rgb(0, 150, 0)
+
+/obj/effect/rune/make_runes_fake/invoke(mob/living/user)
+ visible_message("[src] flares brightly, then slowly dulls and appears mundane.")
+ for(var/obj/effect/rune/R in range(3,src))
+ R.desc = "A rune drawn in crayon."
//Rite of Disruption: Emits an EMP blast.
/obj/effect/rune/emp
@@ -575,7 +745,7 @@ var/list/teleport_other_runes = list()
visible_message("[src] emits a blinding red flash!")
for(var/mob/living/carbon/C in viewers(src))
if(!iscultist(C) && !C.null_rod_check())
- C << "You feel oily shadows cover your senses."
+ C << "A dark fog blankets your senses!"
C.adjustEarDamage(0,50)
C.flash_eyes(1, 1)
C.adjust_blurriness(50)
@@ -586,7 +756,7 @@ var/list/teleport_other_runes = list()
//Rite of Disorientation: Stuns and mutes all non-cultists nearby for a brief time
/obj/effect/rune/stun
cultist_name = "Stun"
- cultist_desc = "Stuns and mutes all nearby non-followers for a brief time."
+ cultist_desc = "Stuns all nearby non-followers for a brief time."
invocation = "Fuu ma'jin!"
icon_state = "2"
color = rgb(100, 0, 100)
@@ -594,29 +764,18 @@ var/list/teleport_other_runes = list()
/obj/effect/rune/stun/invoke(mob/living/user)
visible_message("[src] explodes in a bright flash!")
for(var/mob/living/M in viewers(src))
- stun_he(M)
+ if(!iscultist(M) && !M.null_rod_check())
+ M << "You are disoriented by [src]!"
+ M.Weaken(3)
+ M.Stun(3)
+ M.flash_eyes(1,1)
qdel(src)
-
-/obj/effect/rune/stun/Crossed(atom/movable/AM)
- ..()
- if(isliving(AM))
- stun_he(AM)
-
-/obj/effect/rune/stun/proc/stun_he(mob/living/M)
- if(!iscultist(M) && !M.null_rod_check())
- M << "You are disoriented by [src]!"
- M.Weaken(3)
- M.Stun(3)
- M.flash_eyes(1,1)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- C.silent += 3
-
//Rite of Joined Souls: Summons a single cultist.
/obj/effect/rune/summon
cultist_name = "Summon Cultist"
cultist_desc = "Summons a single cultist to the rune."
invocation = "N'ath reth sh'yro eth d'rekkathnor!"
+ req_cultists = 2
icon_state = "5"
color = rgb(0, 255, 0)
@@ -699,8 +858,7 @@ var/list/teleport_other_runes = list()
visible_message("[picked_rune] crumbles to dust, and bloody images form themselves on [paper_to_imbue].")
qdel(paper_to_imbue)
qdel(picked_rune)
-
-
+ qdel(src)
//Rite of Fabrication: Creates a construct shell out of 5 metal sheets.
/obj/effect/rune/construct_shell
cultist_name = "Fabricate Shell"
@@ -781,11 +939,11 @@ var/list/teleport_other_runes = list()
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
/obj/effect/rune/blood_boil
cultist_name = "Boil Blood"
- cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage."
+ cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 chanters."
invocation = "Dedo ol'btoh!"
icon_state = "4"
color = rgb(255, 0, 0)
- req_cultists = 2
+ req_cultists = 3
/obj/effect/rune/blood_boil/invoke(mob/living/user)
visible_message("[src] briefly bubbles before exploding!")
@@ -805,27 +963,6 @@ var/list/teleport_other_runes = list()
qdel(src)
-//Rite of the Cleansing Flame: Sets all non-cultists on fire.
-/obj/effect/rune/flame
- cultist_name = "Immolate"
- cultist_desc = "Sets any non-believers who can see the rune on fire."
- invocation = "Dedo va'batoh!"
- icon_state = "2"
- color = rgb(255, 0, 0)
-
-/obj/effect/rune/flame/invoke(mob/living/user)
- visible_message("[src] burns away, scorching the floor below!")
- for(var/mob/living/carbon/C in viewers(src))
- if(!iscultist(C) && !C.null_rod_check())
- C << "You feel your skin crisp as you burst into flames!"
- C.fire_act()
- user.apply_damage(15, BURN, pick("l_arm", "r_arm"))
- user << "[src] burns your arms!"
- var/turf/simulated/T = get_turf(src)
- T.burn_tile()
- qdel(src)
-
-
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
/obj/effect/rune/manifest
cultist_name = "Manifest Spirit"
@@ -842,7 +979,7 @@ var/list/teleport_other_runes = list()
return
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in get_turf(src))
- if(O.client)
+ if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
ghosts_on_rune.Add(O)
if(!ghosts_on_rune.len)
user << "There are no spirits near [src]!"
@@ -875,11 +1012,11 @@ var/list/teleport_other_runes = list()
//Rite of Dimensional Corruption: Stops time around the rune for all non-cultists.
/obj/effect/rune/timestop
cultist_name = "Time Stop"
- cultist_desc = "Stops time around the rune for all non-cultists."
+ cultist_desc = "Stops time around the rune for all non-cultists. Requires 3 chanters."
invocation = "T'ak ot'marzah oahr'du!"
icon_state = "2"
color = rgb(0, 0, 255)
- req_cultists = 2
+ req_cultists = 3
/obj/effect/rune/timestop/invoke(mob/living/user)
visible_message("[src] flares up for a moment, and then disappears into itself!")
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index f42d4aca999..be761c693e6 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -70,11 +70,12 @@ Rite of Disorientation
var/dat = "There are [uses] bloody runes on the parchment.
"
dat += "Please choose the chant to be imbued into the fabric of reality.
"
dat += "
"
+ dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon an arcane tome.
"
dat += "Sas'so c'arta forbici! - Allows you to move to a Rite of Dislocation with the keyword of \"veri\".
"
dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
"
- dat += "Kla'atu barada nikt'o! - Allows you to conceal nearby runes, or reveal previously concealed runes.
"
- dat += "Dedo va'batoh! - Allows you to set nearby non-believers on fire.
"
- dat += "Barhah hra zar'garis! - A sacrifice rune appears under your feet, ready to be invoked in the name of Nar-sie.
"
+ dat += "Kla'atu barada nikt'o! - Allows you to conceal nearby runes.
"
+ dat += "Nikt'o barada kla'atu! - Allows you to reveal nearby runes.
"
+ dat += "Fuu ma'jin! - Allows you to stun a person by attacking them with the talisman.
"
dat += "Kal'om neth! - Summons a soul stone, used to capure the spirits of dead or dying humans.
"
dat += "Daa'ig osk! - Summons a construct shell for use with captured souls. It is too large to carry on your person.
"
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
@@ -84,37 +85,45 @@ Rite of Disorientation
return 1
/obj/item/weapon/paper/talisman/supply/Topic(href, href_list)
- if(!src || usr.stat || usr.restrained() || !in_range(src, usr))
+ if(src)
+ if(usr.stat || usr.restrained() || !in_range(src, usr))
+ return
+ if(href_list["rune"])
+ switch(href_list["rune"])
+ if("newtome")
+ var/obj/item/weapon/paper/talisman/summon_tome/T = new(usr)
+ usr.put_in_hands(T)
+ if("teleport")
+ var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
+ T.keyword = "veri"
+ usr.put_in_hands(T)
+ if("emp")
+ var/obj/item/weapon/paper/talisman/emp/T = new(usr)
+ usr.put_in_hands(T)
+ if("conceal")
+ var/obj/item/weapon/paper/talisman/hide_runes/T = new(usr)
+ usr.put_in_hands(T)
+ if("reveal")
+ var/obj/item/weapon/paper/talisman/true_sight/T = new(usr)
+ usr.put_in_hands(T)
+ if("runestun")
+ var/obj/item/weapon/paper/talisman/stun/T = new(usr)
+ usr.put_in_hands(T)
+ if("soulstone")
+ var/obj/item/device/soulstone/T = new(usr)
+ usr.put_in_hands(T)
+ if("construct")
+ new /obj/structure/constructshell(get_turf(usr))
+ src.uses--
+ if(src.uses <= 0)
+ if(iscarbon(usr))
+ var/mob/living/carbon/C = usr
+ C.drop_item()
+ visible_message("[src] crumbles to dust.")
+ qdel(src)
+ return
+ else
return
- if(href_list["rune"])
- switch(href_list["rune"])
- if("teleport")
- var/obj/item/weapon/paper/talisman/teleport/T = new(usr)
- T.keyword = "veri"
- usr.put_in_hands(T)
- if("emp")
- var/obj/item/weapon/paper/talisman/emp/T = new(usr)
- usr.put_in_hands(T)
- if("conceal")
- var/obj/item/weapon/paper/talisman/hide_runes/T = new(usr)
- usr.put_in_hands(T)
- if("flame")
- var/obj/item/weapon/paper/talisman/flame/T = new(usr)
- usr.put_in_hands(T)
- if("sacrune")
- new /obj/effect/rune/sacrifice(get_turf(usr))
- if("soulstone")
- var/obj/item/device/soulstone/T = new(usr)
- usr.put_in_hands(T)
- if("construct")
- new /obj/structure/constructshell(get_turf(usr))
- src.uses--
- if(src.uses <= 0)
- if(iscarbon(usr))
- var/mob/living/carbon/C = usr
- C.drop_item()
- visible_message("[src] crumbles to dust.")
- qdel(src)
//Rite of Translocation: Same as rune
/obj/item/weapon/paper/talisman/teleport
@@ -151,26 +160,64 @@ Rite of Disorientation
if(iscultist(user) && keyword)
user << "Keyword: [keyword]"
+//Rite of Knowledge: Same as rune, but has two uses
+/obj/item/weapon/paper/talisman/summon_tome
+ cultist_name = "Talisman of Tome Summoning"
+ cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of the Geometer."
+ invocation = "N'ath reth sh'yro eth d'raggathnor!"
+ health_cost = 1
+
+/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user)
+ user.visible_message("[user]'s hand glows red for a moment.", \
+ "You speak the words of the talisman!")
+ var/obj/item/weapon/tome/T = new(get_turf(user))
+ if(user.put_in_hands(T))
+ user.visible_message("A tome appears in [user]'s hand!", \
+ "An arcane tome materializes in your free hand.")
+ else
+ user.visible_message("A tome appears at [user]'s feet!", \
+ "An arcane tome materialzies at your feet.")
//Talisman of Obscurity: Same as rune
/obj/item/weapon/paper/talisman/hide_runes
cultist_name = "Talisman of Veiling"
- cultist_desc = "A talisman that will make all runes within a small radius invisible, or make invisible runes visible again."
+ cultist_desc = "A talisman that will make all runes within a small radius invisible."
invocation = "Kla'atu barada nikt'o!"
health_cost = 1
/obj/item/weapon/paper/talisman/hide_runes/invoke(mob/living/user)
user.visible_message("Dust flows from [user]'s hand.", \
"You speak the words of the talisman, veiling nearby runes.")
- for(var/obj/effect/rune/R in orange(3,src))
- if(R.invisibility == INVISIBILITY_OBSERVER)
- R.invisibility = 0
- R.alpha = initial(R.alpha)
- else
- R.visible_message("[R] fades away.")
- R.invisibility = INVISIBILITY_OBSERVER
- R.alpha = 100 //To help ghosts distinguish hidden runes
+ for(var/obj/effect/rune/R in orange(3,user))
+ R.visible_message("[R] fades away.")
+ R.invisibility = INVISIBILITY_OBSERVER
+//Rite of True Sight: Same as rune, but doesn't work on ghosts
+/obj/item/weapon/paper/talisman/true_sight
+ cultist_name = "Talisman of Revealing"
+ cultist_desc = "A talisman that reveals nearby invisible runes."
+ invocation = "Nikt'o barada kla'atu!"
+ health_cost = 1
+
+/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user)
+ user.visible_message("A flash of light shines from [user]'s hand!", \
+ "You speak the words of the talisman, revealing nearby runes.")
+ for(var/obj/effect/rune/R in orange(3,user))
+ R.invisibility = 0
+
+
+//Rite of False Truths: Same as rune
+/obj/item/weapon/paper/talisman/make_runes_fake
+ cultist_name = "Talisman of Disguising"
+ cultist_desc = "A talisman that will make nearby runes appear fake."
+ invocation = "By'o nar'nar!"
+ health_cost = 3
+
+/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user)
+ user.visible_message("Dust flows from [user]s hand.", \
+ "You speak the words of the talisman, making nearby runes appear fake.")
+ for(var/obj/effect/rune/R in orange(3,user))
+ R.desc = "A rune drawn in crayon."
//Rite of Disruption: Same as rune
/obj/item/weapon/paper/talisman/emp
@@ -184,22 +231,12 @@ Rite of Disorientation
"You speak the words of the talisman, emitting an EMP blast.")
empulse(src, 4, 8)
-
-//Rite of the Cleansing Flame: Same as rune
-/obj/item/weapon/paper/talisman/flame
- cultist_name = "Talisman of Immolation"
- cultist_desc = "A talisman that sets any non-believers who can see you on fire."
- invocation = "Dedo va'batoh!"
- health_cost = 10
-
-/obj/item/weapon/paper/talisman/flame/invoke(mob/living/user)
- user.visible_message("\The [src] in [user]'s hand suddenly burns away in a red flash!", \
- "You speak the words of the talisman, setting your enemies on fire.")
- for(var/mob/living/carbon/C in viewers(user))
- if(!iscultist(C) && !C.null_rod_check())
- C << "You feel your skin crisp as you burst into flames!"
- C.fire_act()
-
+//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
+/obj/item/weapon/paper/talisman/stun
+ cultist_name = "Talisman of Stunning"
+ cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly."
+ invocation = "Fuu ma'jin!"
+ health_cost = 15
//Rite of Arming: Equips cultist armor on the user, where available
/obj/item/weapon/paper/talisman/armor
@@ -208,6 +245,39 @@ Rite of Disorientation
invocation = "N'ath reth sh'yro eth draggathnor!"
health_cost = 3
+/obj/item/weapon/paper/talisman/stun/attack_self(mob/living/user)
+ if(iscultist(user))
+ user << "To use this talisman, attack the target directly."
+ else
+ user << "There are indecipherable images scrawled on the paper in what looks to be... blood?"
+
+/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user)
+ if(iscultist(user))
+ user.whisper(invocation)
+ user.visible_message("[user] holds up [src], which explodes in a flash of red light!", \
+ "You stun [target] with the talisman!")
+ var/obj/item/weapon/nullrod/N = locate() in target
+ if(N)
+ target.visible_message("[target]'s holy weapon absorbs the talisman's light!", \
+ "Your holy weapon absorbs the blinding light!")
+ else
+ target.Weaken(9)
+ target.Stun(9)
+ target.flash_eyes(1,1)
+ if(issilicon(target))
+ var/mob/living/silicon/S = target
+ S.emp_act(1)
+ if(iscarbon(target))
+ var/mob/living/carbon/C = target
+ C.silent += 4
+ C.stuttering += 15
+ C.cultslurring += 15
+ C.Jitter(15)
+ user.drop_item()
+ qdel(src)
+ return
+ ..()
+
/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user)
user.visible_message("Otherworldly armor suddenly appears on [user]!", \
"You speak the words of the talisman, arming yourself!")
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 4dcfa1db23e..161e329fa57 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -124,6 +124,12 @@
if("VICTIM")
var/mob/living/carbon/human/T = target
+ if(ticker.mode.name == "cult" && T.mind == ticker.mode:sacrifice_target)
+ if(iscultist(user))
+ user << "The Geometer of blood wants this mortal sacrificed with the rune."
+ else
+ user << "The soul stone doesn't work for no apparent reason."
+ return 0
if(imprinted != "empty")
user << "Capture failed!: The soul stone has already been imprinted with [imprinted]'s mind!"
else
@@ -137,8 +143,6 @@
if(contents.len)
user << "Capture failed!: The soul stone is full! Use or free an existing soul to make room."
else
- if(iscultist(user))
- new /obj/item/summoning_orb(get_turf(T))
for(var/obj/item/W in T)
T.unEquip(W)
init_shade(src, T, user, vic = 1)
@@ -204,7 +208,7 @@
if(stoner && iswizard(stoner))
newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
else if(stoner && iscultist(stoner))
- newstruct << "You are still bound to serve the cult, follow their orders and help them summon the Geometer at all costs."
+ newstruct << "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs."
else newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
newstruct.cancel_camera()
@@ -266,4 +270,4 @@
T.unEquip(W)
init_shade(C, T, U)
qdel(T)
- return 1
+ return 1
\ No newline at end of file
diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm
index aabbbf8f3f0..3ea77f65259 100644
--- a/code/modules/admin/verbs/one_click_antag.dm
+++ b/code/modules/admin/verbs/one_click_antag.dm
@@ -194,7 +194,7 @@
candidates += applicant
if(candidates.len)
- var/numCultists = min(candidates.len, 5)
+ var/numCultists = min(candidates.len, 4)
for(var/i = 0, i=1)
+ newletter=copytext(phrase,(leng-counter)+1,(leng-counter)+2)
+ if(rand(1,2)==2)
+ if(lowertext(newletter)=="o")
+ newletter="u"
+ if(lowertext(newletter)=="s")
+ newletter="ch"
+ if(lowertext(newletter)=="a")
+ newletter="ah"
+ if(lowertext(newletter)=="u")
+ newletter="oo"
+ if(lowertext(newletter)=="c")
+ newletter=" NAR "
+ if(lowertext(newletter)=="t")
+ newletter=" SIE "
+ if(rand(1,4)==4)
+ if(newletter==" ")
+ newletter=" GLORY "
+ if(newletter=="H")
+ newletter=" HAIL "
+
+ switch(rand(1,10))
+ if(1)
+ newletter="'"
+ if(2)
+ newletter+="agn"
+ if(3)
+ newletter="fth"
+ if(4)
+ newletter="nglu"
+ newphrase+="[newletter]";counter-=1
+ return newphrase
+
+
/proc/stutter(n)
var/te = html_decode(n)
var/t = ""//placed before the message. Not really sure what it's for.
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 25c5eb7a6b3..c64dca71bef 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -53,6 +53,10 @@
var/datum/asset/assets = get_asset_datum(/datum/asset/simple/paper)
assets.send(user)
+ if(istype(src, /obj/item/weapon/paper/talisman)) //Talismans cannot be read
+ if(!iscultist(user) && !user.stat)
+ user << "There are indecipherable images scrawled on the paper in what looks to be... blood?"
+ return
if(in_range(user, src) || isobserver(user))
if( !(ishuman(user) || isobserver(user) || issilicon(user)) )
user << browse("[name][stars(info)]
[stamps]", "window=[name]")
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index cac735daf98..ec8a0c00487 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -184,11 +184,14 @@
M.stuttering = 1
M.stuttering += 4
M.Dizzy(5)
+ if(iscultist(M) && prob(5))
+ M.say(pick("Av'te Nar'sie","Pa'lid Mors","INO INO ORA ANA","SAT ANA!","Daim'niodeis Arc'iai Le'eones","R'ge Na'sie","Diabo us Vo'iscum","Eld' Mon Nobis"))
if(data >= 75 && prob(33)) // 30 units, 135 seconds
if (!M.confused)
M.confused = 1
M.confused += 3
- if((is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
+ if(iscultist(M) || (is_handofgod_cultist(M) && !is_handofgod_prophet(M)))
+ ticker.mode.remove_cultist(M.mind)
ticker.mode.remove_hog_follower(M.mind)
holder.remove_reagent(src.id, src.volume) // maybe this is a little too perfect and a max() cap on the statuses would be better??
M.jitteriness = 0