diff --git a/aurorastation.dme b/aurorastation.dme
index 1cce664522f..aed48dfd152 100644
--- a/aurorastation.dme
+++ b/aurorastation.dme
@@ -478,6 +478,7 @@
#include "code\game\machinery\floodlight.dm"
#include "code\game\machinery\floor_light.dm"
#include "code\game\machinery\floorlayer.dm"
+#include "code\game\machinery\from_beyond.dm"
#include "code\game\machinery\hologram.dm"
#include "code\game\machinery\holosign.dm"
#include "code\game\machinery\igniter.dm"
diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm
index 8ade101cd0a..d78e04dc703 100644
--- a/code/game/antagonist/station/cultist.dm
+++ b/code/game/antagonist/station/cultist.dm
@@ -32,12 +32,11 @@ var/datum/antagonist/cultist/cult
initial_spawn_req = 4
initial_spawn_target = 6
antaghud_indicator = "hudcultist"
-
+
faction = "cult"
var/allow_narsie = 1
var/datum/mind/sacrifice_target
- var/list/startwords = list("blood","join","self","hell")
var/list/allwords = list("travel","self","see","hell","blood","join","tech","destroy", "other", "hide")
var/list/sacrificed = list()
var/list/harvested = list()
@@ -83,28 +82,6 @@ var/datum/antagonist/cultist/cult
if(S && istype(S))
T.loc = S
-/datum/antagonist/cultist/greet(var/datum/mind/player)
- if(!..())
- return 0
- grant_runeword(player.current)
-
-/datum/antagonist/cultist/proc/grant_runeword(mob/living/carbon/human/cult_mob, var/word)
-
- if (!word)
- if(startwords.len > 0)
- word=pick(startwords)
- startwords -= word
- else
- word = pick(allwords)
-
- // Ensure runes are randomized.
- if(!cultwords["travel"])
- runerandom()
-
- var/wordexp = "[cultwords[word]] is [word]..."
- cult_mob << "You remember one thing from the dark teachings of your master... [wordexp]"
- cult_mob.mind.store_memory("You remember that [wordexp]", 0, 0)
-
/datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted)
if(!..())
return 0
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 24754015fb2..9a9025665e1 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -1,6 +1,6 @@
/obj/item/weapon/melee/cultblade
- name = "cult blade"
- desc = "An arcane weapon wielded by the followers of Nar-Sie"
+ name = "eldritch blade"
+ desc = "A sword humming with unholy energy. It glows with a dim red light."
icon_state = "cultblade"
item_state = "cultblade"
w_class = 4
@@ -45,12 +45,19 @@
user << "An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to be rid of this blade quickly."
user.make_dizzy(120)
+/obj/item/weapon/melee/cultblade/attackby(var/obj/item/I, var/mob/user)
+ ..()
+ if(istype(I, /obj/item/weapon/nullrod))
+ to_chat(user, "You cleanse \the [src] of taint, restoring the blade to its original state.")
+ var/obj/item/weapon/material/sword/blade = new(get_turf(src))
+ blade.force = 15
+ qdel(src)
/obj/item/clothing/head/culthood
- name = "cult hood"
+ name = "hood"
icon_state = "culthood"
- desc = "A hood worn by the followers of Nar-Sie."
- flags_inv = HIDEFACE
+ desc = "A torn, dust-caked hood."
+ flags_inv = HIDEFACE|HIDEEARS|HIDEEYES
body_parts_covered = HEAD|EYES
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
cold_protection = HEAD
@@ -71,8 +78,8 @@
icon_state = "cult_hoodalt"
/obj/item/clothing/suit/cultrobes
- name = "cult robes"
- desc = "A set of armored robes worn by the followers of Nar-Sie"
+ name = "robes"
+ desc = "A ragged, dusty set of robes."
icon_state = "cultrobes"
item_state = "cultrobes"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
@@ -90,7 +97,7 @@
/obj/item/clothing/suit/cultrobes/magusred
name = "magus robes"
- desc = "A set of armored robes worn by the followers of Nar-Sie"
+ desc = "A set of armored robes worn by the followers of Nar-Sie."
icon_state = "magusred"
item_state = "magusred"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
@@ -98,7 +105,7 @@
/obj/item/clothing/head/helmet/space/cult
name = "cult helmet"
- desc = "A space worthy helmet used by the followers of Nar-Sie"
+ desc = "A bulky helmet, bristling with spikes. It looks space proof."
icon_state = "cult_helmet"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
siemens_coefficient = 0
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index bb2ac88f39e..1a00dd1d150 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -448,6 +448,9 @@
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if (istype(source, /obj/item))
var/obj/item/I = source
+ if(istype(I, /obj/item/weapon/nullrod))
+ shatter()
+ return
if (I.damtype != BRUTE)
user << "You swing at the pylon to no effect."
return
@@ -636,48 +639,11 @@
new thing(src.loc)
qdel(src)
-/obj/effect/gateway/active/Crossed(var/atom/A)
- if(!istype(A, /mob/living))
- return
-
- var/mob/living/M = A
-
- if(M.stat != DEAD)
- if(M.transforming)
- return
- if(M.has_brain_worms())
- return //Borer stuff - RR
-
- if(iscult(M)) return
- if(!ishuman(M) && !isrobot(M)) return
-
- M.transforming = 1
- M.canmove = 0
- M.icon = null
- M.overlays.len = 0
- M.invisibility = 101
-
- if(istype(M, /mob/living/silicon/robot))
- var/mob/living/silicon/robot/Robot = M
- if(Robot.mmi)
- qdel(Robot.mmi)
- else
- for(var/obj/item/W in M)
- if(istype(W, /obj/item/weapon/implant))
- qdel(W)
- continue
- W.layer = initial(W.layer)
- W.loc = M.loc
- W.dropped(M)
-
- var/mob/living/new_mob = new /mob/living/simple_animal/corgi(A.loc)
- new_mob.a_intent = I_HURT
- if(M.mind)
- M.mind.transfer_to(new_mob)
- else
- new_mob.key = M.key
-
- new_mob << "Your form morphs into that of a corgi." //Because we don't have cluwnes
+/obj/effect/gateway/attackby(var/obj/item/I, var/mob/user)
+ ..()
+ if(istype(I, /obj/item/weapon/nullrod))
+ to_chat(user, "You touch \the [src] with \the [I], closing the path to the otherworld.")
+ qdel(src)
/obj/effect/testtrans
icon = 'icons/obj/cult.dmi'
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 9f042070666..ff641420316 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -65,117 +65,117 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
// self other technology - Communication rune //was other hear blood
// join hide technology - stun rune. Rune color: bright pink.
- New()
- ..()
- blood_image = image(loc = src)
- blood_image.override = 1
- for(var/mob/living/silicon/ai/AI in player_list)
- if(AI.client)
- AI.client.images += blood_image
- rune_list.Add(src)
- Destroy()
- for(var/mob/living/silicon/ai/AI in player_list)
- if(AI.client)
- AI.client.images -= blood_image
- qdel(blood_image)
- blood_image = null
- rune_list.Remove(src)
- return ..()
+/obj/effect/rune/Initialize()
+ . = ..()
+ blood_image = image(loc = src)
+ blood_image.override = 1
+ for(var/mob/living/silicon/ai/AI in player_list)
+ if(AI.client)
+ AI.client.images += blood_image
+ rune_list += src
- examine(mob/user)
- ..()
- if(iscultist(user))
- user << "This spell circle reads: [word1] [word2] [word3]."
+/obj/effect/rune/Destroy()
+ for(var/mob/living/silicon/ai/AI in player_list)
+ if(AI.client)
+ AI.client.images -= blood_image
+ qdel(blood_image)
+ blood_image = null
+ rune_list -= src
+ return ..()
+
+/obj/effect/rune/examine(mob/user)
+ ..()
+ if(iscultist(user))
+ user << "This spell circle reads: [word1] [word2] [word3]."
- attackby(I as obj, user as mob)
- if(istype(I, /obj/item/weapon/book/tome) && iscultist(user))
- user << "You retrace your steps, carefully undoing the lines of the rune."
- qdel(src)
- return
- else if(istype(I, /obj/item/weapon/nullrod))
- user << "You disrupt the vile magic with the deadening field of the null rod!"
- qdel(src)
- return
+/obj/effect/rune/attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/book/tome) && iscultist(user))
+ user << "You retrace your steps, carefully undoing the lines of the rune."
+ qdel(src)
+ return
+ else if(istype(I, /obj/item/weapon/nullrod))
+ user << "You disrupt the vile magic with the deadening field of \the [I]!"
+ qdel(src)
+ return
+ return
+
+
+/obj/effect/rune/attack_hand(var/mob/living/user)
+ if(!iscultist(user))
+ user << "You can't mouth the arcane scratchings without fumbling over them."
+ return
+ if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
+ user << "You are unable to speak the words of the rune."
+ return
+ if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
+ return fizzle(user)
+ //if(!src.visibility)
+ //src.visibility=1
+ if(word1 == cultwords["travel"] && word2 == cultwords["self"])
+ return teleport(user,src.word3)
+ if(word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"])
+ return tomesummon(user)
+ if(word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"])
+ return armor(user)
+ if(word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"])
+ return convert(user)
+ if(word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"])
+ return tearreality(user)
+ if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"])
+ return emp(user, src.loc,3)
+ if(word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"])
+ return drain(user)
+ if(word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"])
+ return seer(user)
+ if(word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"])
+ return raise(user)
+ if(word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"])
+ return obscure(user, 4)
+ if(word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"])
+ return ajourney(user)
+ if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["travel"])
+ return manifest(user)
+ if(word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"])
+ return talisman(user)
+ if(word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"])
+ return sacrifice(user)
+ if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"])
+ return revealrunes(user, src)
+ if(word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"])
+ return wall(user)
+ if(word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"])
+ return freedom(user)
+ if(word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"])
+ return cultsummon(user)
+ if(word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"])
+ return deafen(user)
+ if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"])
+ return blind(user)
+ if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"])
+ return bloodboil(user)
+ if(word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"])
+ return communicate(user)
+ if(word1 == cultwords["travel"] && word2 == cultwords["other"])
+ return itemport(user, src.word3)
+ if(word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"])
+ return runestun(user)
+ else
+ return fizzle(user)
+
+
+/obj/effect/rune/proc/fizzle(var/mob/living/user)
+ if(istype(src,/obj/effect/rune))
+ user.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
+ else
+ user.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
+ for (var/mob/V in viewers(src))
+ V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2)
return
-
- attack_hand(mob/living/user as mob)
- if(!iscultist(user))
- user << "You can't mouth the arcane scratchings without fumbling over them."
- return
- if(istype(user.wear_mask, /obj/item/clothing/mask/muzzle))
- user << "You are unable to speak the words of the rune."
- return
- if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
- return fizzle()
-// if(!src.visibility)
-// src.visibility=1
- if(word1 == cultwords["travel"] && word2 == cultwords["self"])
- return teleport(src.word3)
- if(word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"])
- return tomesummon()
- if(word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"])
- return armor()
- if(word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"])
- return convert()
- if(word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"])
- return tearreality()
- if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"])
- return emp(src.loc,3)
- if(word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"])
- return drain()
- if(word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"])
- return seer()
- if(word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"])
- return raise()
- if(word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"])
- return obscure(4)
- if(word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"])
- return ajourney()
- if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["travel"])
- return manifest()
- if(word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"])
- return talisman()
- if(word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"])
- return sacrifice()
- if(word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"])
- return revealrunes(src)
- if(word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"])
- return wall()
- if(word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"])
- return freedom()
- if(word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"])
- return cultsummon()
- if(word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"])
- return deafen()
- if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"])
- return blind()
- if(word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"])
- return bloodboil()
- if(word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"])
- return communicate()
- if(word1 == cultwords["travel"] && word2 == cultwords["other"])
- return itemport(src.word3)
- if(word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"])
- return runestun()
- else
- return fizzle()
-
-
- proc
- fizzle()
- if(istype(src,/obj/effect/rune))
- usr.say(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
- else
- usr.whisper(pick("Hakkrutju gopoenjim.", "Nherasai pivroiashan.", "Firjji prhiv mazenhor.", "Tanah eh wakantahe.", "Obliyae na oraie.", "Miyf hon vnor'c.", "Wakabai hij fen juswix."))
- for (var/mob/V in viewers(src))
- V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2)
- return
-
- check_icon()
- icon = get_uristrune_cult(word1, word2, word3)
+/obj/effect/rune/proc/check_icon()
+ icon = get_uristrune_cult(word1, word2, word3)
/obj/item/weapon/book/tome
name = "arcane tome"
@@ -185,7 +185,6 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
throw_range = 5
w_class = 2.0
unique = 1
- var/notedat = ""
var/tomedat = ""
var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri")
@@ -286,230 +285,156 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa","
"}
- Topic(href,href_list[])
- if (src.loc == usr)
- var/number = text2num(href_list["number"])
- if (usr.stat|| usr.restrained())
- return
- switch(href_list["action"])
- if("clear")
- words[words[number]] = words[number]
- if("change")
- words[words[number]] = input("Enter the translation for [words[number]]", "Word notes") in engwords
- for (var/w in words)
- if ((words[w] == words[words[number]]) && (w != words[number]))
- words[w] = w
- notedat = {"
-
Word translation notes
- [words[1]] is [words[words[1]]] Clear
- [words[2]] is [words[words[2]]] Clear
- [words[3]] is [words[words[3]]] Clear
- [words[4]] is [words[words[4]]] Clear
- [words[5]] is [words[words[5]]] Clear
- [words[6]] is [words[words[6]]] Clear
- [words[7]] is [words[words[7]]] Clear
- [words[8]] is [words[words[8]]] Clear
- [words[9]] is [words[words[9]]] Clear
- [words[10]] is [words[words[10]]] Clear
- "}
- usr << browse("[notedat]", "window=notes")
-// call(/obj/item/weapon/book/tome/proc/edit_notes)()
+/obj/item/weapon/book/tome/Initialize()
+ . = ..()
+ if(!cultwords["travel"])
+ runerandom()
+ for(var/V in cultwords)
+ words[cultwords[V]] = V
+
+
+
+/obj/item/weapon/book/tome/attack(mob/living/M as mob, mob/living/user as mob)
+
+ M.attack_log += text("\[[time_stamp()]\] Has had the [name] used on them by [user.name] ([user.ckey])")
+ user.attack_log += text("\[[time_stamp()]\] Used [name] on [M.name] ([M.ckey])")
+ msg_admin_attack("[key_name_admin(user)] used [name] on [M.name] ([M.ckey]) (JMP)",ckey=key_name(user),ckey_target=key_name(M))
+
+ if(istype(M,/mob/dead))
+ var/mob/dead/D = M
+ D.manifest(user)
+ return
+ if(!istype(M))
+ return
+ if(!iscultist(user))
+ return ..()
+ if(iscultist(M))
+ return
+ user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
+ M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit
+ for(var/mob/O in viewers(M, null))
+ O.show_message("\The [user] beats \the [M] with \the [src]!", 1)
+ M << "You feel searing heat inside!"
+
+
+/obj/item/weapon/book/tome/attack_self(mob/living/user as mob)
+
+ if(!user.canmove || user.stat || user.restrained())
+ return
+
+ if(!cultwords["travel"])
+ runerandom()
+ if(iscultist(user))
+ var/C = 0
+ for(var/obj/effect/rune/N in rune_list)
+ C++
+ if (!istype(user.loc,/turf))
+ user << "You do not have enough space to write a proper rune."
+ return
+
+ if (C>=26 + runedec + cult.current_antagonists.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist
+ alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
+ return
else
- usr << browse(null, "window=notes")
- return
-
-
-// proc/edit_notes() FUCK IT. Cant get it to work properly. - K0000
-// world << "its been called! [usr]"
-// notedat = {"
-//
Word translation notes
-// [words[1]] is [words[words[1]]] Clear
-// [words[2]] is [words[words[2]]] Clear
-// [words[3]] is [words[words[3]]] Clear
-// [words[4]] is [words[words[4]]] Clear
-// [words[5]] is [words[words[5]]] Clear
-// [words[6]] is [words[words[6]]] Clear
-// [words[7]] is [words[words[7]]] Clear
-// [words[8]] is [words[words[8]]] Clear
-// [words[9]] is [words[words[9]]] Clear
-// [words[10]] is [words[words[10]]] Clear
-// "}
-// usr << "whatev"
-// usr << browse(null, "window=tank")
-
- attack(mob/living/M as mob, mob/living/user as mob)
-
- M.attack_log += text("\[[time_stamp()]\] Has had the [name] used on them by [user.name] ([user.ckey])")
- user.attack_log += text("\[[time_stamp()]\] Used [name] on [M.name] ([M.ckey])")
- msg_admin_attack("[key_name_admin(user)] used [name] on [M.name] ([M.ckey]) (JMP)",ckey=key_name(user),ckey_target=key_name(M))
-
- if(istype(M,/mob/dead))
- var/mob/dead/D = M
- D.manifest(user)
- return
- if(!istype(M))
- return
- if(!iscultist(user))
- return ..()
- if(iscultist(M))
- return
- user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
- M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit
- for(var/mob/O in viewers(M, null))
- O.show_message("\The [user] beats \the [M] with \the [src]!", 1)
- M << "You feel searing heat inside!"
-
-
- attack_self(mob/living/user as mob)
- usr = user
- if(!usr.canmove || usr.stat || usr.restrained())
- return
-
- if(!cultwords["travel"])
- runerandom()
- if(iscultist(user))
- var/C = 0
- for(var/obj/effect/rune/N in world)
- C++
- if (!istype(user.loc,/turf))
- user << "You do not have enough space to write a proper rune."
- return
-
- if (C>=26 + runedec + cult.current_antagonists.len) //including the useless rune at the secret room, shouldn't count against the limit of 25 runes - Urist
- alert("The cloth of reality can't take that much of a strain. Remove some runes first!")
- return
- else
- switch(alert("You open the tome",,"Read it","Scribe a rune", "Notes")) //Fuck the "Cancel" option. Rewrite the whole tome interface yourself if you want it to work better. And input() is just ugly. - K0000
- if("Cancel")
+ switch(alert("You open the tome",,"Read it","Scribe a rune", "Cancel"))
+ if("Cancel")
+ return
+ if("Read it")
+ if(user.get_active_hand() != src)
return
- if("Read it")
- if(usr.get_active_hand() != src)
- return
- user << browse("[tomedat]", "window=Arcane Tome")
- return
- if("Notes")
- if(usr.get_active_hand() != src)
- return
- notedat = {"
-
Word translation notes
- [words[1]] is [words[words[1]]] Clear
- [words[2]] is [words[words[2]]] Clear
- [words[3]] is [words[words[3]]] Clear
- [words[4]] is [words[words[4]]] Clear
- [words[5]] is [words[words[5]]] Clear
- [words[6]] is [words[words[6]]] Clear
- [words[7]] is [words[words[7]]] Clear
- [words[8]] is [words[words[8]]] Clear
- [words[9]] is [words[words[9]]] Clear
- [words[10]] is [words[words[10]]] Clear
- "}
-// call(/obj/item/weapon/book/tome/proc/edit_notes)()
- user << browse("[notedat]", "window=notes")
- return
- if(usr.get_active_hand() != src)
- return
+ user << browse("[tomedat]", "window=Arcane Tome")
+ return
- var/list/dictionary = list (
- "convert" = list("join","blood","self"),
- "wall" = list("destroy","travel","self"),
- "blood boil" = list("destroy","see","blood"),
- "blood drain" = list("travel","blood","self"),
- "raise dead" = list("blood","join","hell"),
- "summon narsie" = list("hell","join","self"),
- "communicate" = list("self","other","technology"),
- "emp" = list("destroy","see","technology"),
- "manifest" = list("blood","see","travel"),
- "summon tome" = list("see","blood","hell"),
- "see invisible" = list("see","hell","join"),
- "hide" = list("hide","see","blood"),
- "reveal" = list("blood","see","hide"),
- "astral journey" = list("hell","travel","self"),
- "imbue" = list("hell","technology","join"),
- "sacrifice" = list("hell","blood","join"),
- "summon cultist" = list("join","other","self"),
- "free cultist" = list("travel","technology","other"),
- "deafen" = list("hide","other","see"),
- "blind" = list("destroy","see","other"),
- "stun" = list("join","hide","technology"),
- "armor" = list("hell","destroy","other"),
- "teleport" = list("travel","self"),
- "teleport other" = list("travel","other")
+ if(user.get_active_hand() != src)
+ return
+
+ var/list/static/dictionary = list (
+ "convert" = list("join","blood","self"),
+ "wall" = list("destroy","travel","self"),
+ "blood boil" = list("destroy","see","blood"),
+ "blood drain" = list("travel","blood","self"),
+ "raise dead" = list("blood","join","hell"),
+ "summon narsie" = list("hell","join","self"),
+ "communicate" = list("self","other","technology"),
+ "emp" = list("destroy","see","technology"),
+ "manifest" = list("blood","see","travel"),
+ "summon tome" = list("see","blood","hell"),
+ "see invisible" = list("see","hell","join"),
+ "hide" = list("hide","see","blood"),
+ "reveal" = list("blood","see","hide"),
+ "astral journey" = list("hell","travel","self"),
+ "imbue" = list("hell","technology","join"),
+ "sacrifice" = list("hell","blood","join"),
+ "summon cultist" = list("join","other","self"),
+ "free cultist" = list("travel","technology","other"),
+ "deafen" = list("hide","other","see"),
+ "blind" = list("destroy","see","other"),
+ "stun" = list("join","hide","technology"),
+ "armor" = list("hell","destroy","other"),
+ "teleport" = list("travel","self"),
+ "teleport other" = list("travel","other")
)
- var/list/english = list()
+ var/list/english = list()
- var/list/scribewords = list("none")
+ var/list/scribewords = list("none")
- for (var/entry in words)
- if (words[entry] != entry)
- english += list(words[entry] = entry)
+ for (var/entry in words)
+ if (words[entry] != entry)
+ english += list(words[entry] = entry)
- for (var/entry in dictionary)
- var/list/required = dictionary[entry]
- if (length(english&required) == required.len)
- scribewords += entry
+ for (var/entry in dictionary)
+ var/list/required = dictionary[entry]
+ if (length(english&required) == required.len)
+ scribewords += entry
- var/chosen_rune = null
+ var/chosen_rune = null
- if(usr)
- chosen_rune = input ("Choose a rune to scribe.") in scribewords
- if (!chosen_rune)
- return
- if (chosen_rune == "none")
- user << "You decide against scribing a rune, perhaps you should take this time to study your notes."
- return
- if (chosen_rune == "teleport")
- dictionary[chosen_rune] += input ("Choose a destination word") in english
- if (chosen_rune == "teleport other")
- dictionary[chosen_rune] += input ("Choose a destination word") in english
-
- if(usr.get_active_hand() != src)
+ if(user)
+ chosen_rune = input ("Choose a rune to scribe.") in scribewords
+ if (!chosen_rune)
return
+ if (chosen_rune == "none")
+ user << "You decide against scribing a rune, perhaps you should take this time to study your notes."
+ return
+ if (chosen_rune == "teleport")
+ dictionary[chosen_rune] += input ("Choose a destination word") in english
+ if (chosen_rune == "teleport other")
+ dictionary[chosen_rune] += input ("Choose a destination word") in english
- for (var/mob/V in viewers(src))
- V.show_message("\The [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2)
- user << "You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
- user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
- if(do_after(user, 50))
- var/area/A = get_area(user)
- log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].")
- if(usr.get_active_hand() != src)
- return
- var/mob/living/carbon/human/H = user
- var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
- user << "You finish drawing the arcane markings of the Geometer."
- var/list/required = dictionary[chosen_rune]
- R.word1 = english[required[1]]
- R.word2 = english[required[2]]
- R.word3 = english[required[3]]
- R.check_icon()
- R.blood_DNA = list()
- R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
- return
- else
- user << "The book seems full of illegible scribbles. Is this a joke?"
+ if(user.get_active_hand() != src)
return
- attackby(obj/item/weapon/book/tome/T as obj, mob/living/user as mob)
- if(istype(T, /obj/item/weapon/book/tome)) // sanity check to prevent a runtime error
- switch(alert("Copy the runes from your tome?",,"Copy", "Cancel"))
- if("cancel")
- return
- // var/list/nearby = viewers(1,src) //- Fuck this as well. No clue why this doesnt work. -K0000
- // if (T.loc != user)
- // return
- // for(var/mob/M in nearby)
- // if(M == user)
- for(var/entry in words)
- words[entry] = T.words[entry]
- user << "You copy the translation notes from your tome."
+ for (var/mob/V in viewers(src))
+ V.show_message("\The [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "You hear chanting.", 2)
+ user << "You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world."
+ user.take_overall_damage((rand(9)+1)/10) // 0.1 to 1.0 damage
+ if(do_after(user, 50))
+ var/area/A = get_area(user)
+ log_and_message_admins("created \an [chosen_rune] rune at \the [A.name] - [user.loc.x]-[user.loc.y]-[user.loc.z].")
+ if(user.get_active_hand() != src)
+ return
+ var/mob/living/carbon/human/H = user
+ var/obj/effect/rune/R = new /obj/effect/rune(user.loc)
+ user << "You finish drawing the arcane markings of the Geometer."
+ var/list/required = dictionary[chosen_rune]
+ R.word1 = english[required[1]]
+ R.word2 = english[required[2]]
+ R.word3 = english[required[3]]
+ R.check_icon()
+ R.blood_DNA = list()
+ R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
+ return
+ else
+ user << "The book seems full of illegible scribbles. Is this a joke?"
+ return
-
- examine(mob/user)
- if(!iscultist(user))
- user << "An old, dusty tome with frayed edges and a sinister looking cover."
- else
- user << "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though."
+/obj/item/weapon/book/tome/examine(mob/user)
+ ..(user)
+ if(!iscultist(user))
+ desc = "An old, dusty tome with frayed edges and a sinister looking cover."
+ else
+ desc = "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though."
/obj/item/weapon/book/tome/cultify()
return
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index c25de54ec15..da5d589f8f4 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -1,1144 +1,1122 @@
-var/list/sacrificed = list()
-
-/obj/effect/rune/cultify()
- return
-
-/obj/effect/rune
-
-/*
- * Use as a general guideline for this and related files:
- * * ... - when something non-trivial or an error happens, so something similar to "Sparks come out of the machine!"
- * * ... - when something that is fit for 'warning' happens but there is some damage or pain as well.
- * * ... - when there is a private message to the cultists. This guideline is very arbitrary but there has to be some consistency!
- */
-
-
-/////////////////////////////////////////FIRST RUNE
- proc
- teleport(var/key)
- var/mob/living/user = usr
- var/allrunesloc[]
- allrunesloc = new/list()
- var/index = 0
- // var/tempnum = 0
- for(var/obj/effect/rune/R in world)
- if(R == src)
- continue
- if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && isPlayerLevel(R.z))
- index++
- allrunesloc.len = index
- allrunesloc[index] = R.loc
- if(index >= 5)
- user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric."
- if (istype(user, /mob/living))
- user.take_overall_damage(5, 0)
- qdel(src)
- if(allrunesloc && index != 0)
- if(istype(src,/obj/effect/rune))
- user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting
- else
- user.whisper("Sas[pick("'","`")]so c'arta forbici!")
- user.visible_message("[user] disappears in a flash of red light!", \
- "You feel as your body gets dragged through the dimension of Nar-Sie!", \
- "You hear a sickening crunch and sloshing of viscera.")
- user.loc = allrunesloc[rand(1,index)]
- return
- if(istype(src,/obj/effect/rune))
- return fizzle() //Use friggin manuals, Dorf, your list was of zero length.
- else
- call(/obj/effect/rune/proc/fizzle)()
- return
-
-
- itemport(var/key)
-// var/allrunesloc[]
-// allrunesloc = new/list()
-// var/index = 0
- // var/tempnum = 0
- var/culcount = 0
- var/runecount = 0
- var/obj/effect/rune/IP = null
- var/mob/living/user = usr
- for(var/obj/effect/rune/R in world)
- if(R == src)
- continue
- if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key)
- IP = R
- runecount++
- if(runecount >= 2)
- user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric."
- if (istype(user, /mob/living))
- user.take_overall_damage(5, 0)
- qdel(src)
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- culcount++
- if(culcount>=3)
- user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
- user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \
- "You feel air moving from the rune - like as it was swapped with somewhere else.", \
- "You smell ozone.")
- for(var/obj/O in src.loc)
- if(!O.anchored)
- O.loc = IP.loc
- for(var/mob/M in src.loc)
- M.loc = IP.loc
- return
-
- return fizzle()
-
-
-/////////////////////////////////////////SECOND RUNE
-
- tomesummon()
- if(istype(src,/obj/effect/rune))
- usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
- else
- usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
- usr.visible_message("Rune disappears with a flash of red light, and in its place now a book lies.", \
- "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \
- "You hear a pop and smell ozone.")
- if(istype(src,/obj/effect/rune))
- new /obj/item/weapon/book/tome(src.loc)
- else
- new /obj/item/weapon/book/tome(usr.loc)
- qdel(src)
- return
-
-
-
-/////////////////////////////////////////THIRD RUNE
-
- convert()
- var/mob/attacker = usr
- var/mob/living/carbon/target = null
- for(var/mob/living/carbon/M in src.loc)
- if(!iscultist(M) && M.stat < DEAD && !(M in converting))
- target = M
- break
-
- if(!target) //didn't find any new targets
- if(!converting.len)
- fizzle()
- else
- usr << "You sense that the power of the dark one is already working away at them."
- return
-
- usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
-
- converting |= target
- var/list/waiting_for_input = list(target = 0) //need to box this up in order to be able to reset it again from inside spawn, apparently
- var/initial_message = 0
- while(target in converting)
- if(target.loc != src.loc || target.stat == DEAD)
- converting -= target
- if(target.getFireLoss() < 100)
- target.hallucination = min(target.hallucination, 500)
- return 0
-
- target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects
- // Resist messages go!
- if(initial_message) //don't do this stuff right away, only if they resist or hesitate.
- admin_attack_log(attacker, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on")
- switch(target.getFireLoss())
- if(0 to 25)
- target << "Your blood boils as you force yourself to resist the corruption invading every corner of your mind."
- if(25 to 45)
- target << "Your blood boils and your body burns as the corruption further forces itself into your body and mind."
- if(45 to 75)
- target << "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble."
- target.apply_effect(rand(1,10), STUTTER)
- if(75 to 100)
- target << "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance."
- //broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky
- //hallucination is reduced when the step off as well, provided they haven't hit the last stage...
- target.hallucination += 5000
- target.apply_effect(10, STUTTER)
- target.adjustBrainLoss(1)
- if(100 to INFINITY)
- target << "Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing."
- target.hallucination += 5000
- target.apply_effect(15, STUTTER)
- target.adjustBrainLoss(rand(1,5))
-
- initial_message = 1
- if (target.species && (target.species.flags & NO_PAIN))
- target.visible_message("The markings below [target] glow a bloody red.")
- else
- target.visible_message("[target] writhes in pain as the markings below \him glow a bloody red.", "AAAAAAHHHH!", "You hear an anguished scream.")
-
- if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate
- waiting_for_input[target] = 1
-
- if(!cult.can_become_antag(target.mind) || jobban_isbanned(target, "cultist"))//putting jobban check here because is_convertable uses mind as argument
- //waiting_for_input ensures this is only shown once, so they basically auto-resist from here on out. They still need to find a way to get off the freaking rune if they don't want to burn to death, though.
- target << "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 in the festering wound left behind something sinister takes root."
- target << "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs."
-
- else spawn()
- var/choice = alert(target,"Do you want to join the cult?","Submit to Nar'Sie","Resist","Submit")
- waiting_for_input[target] = 0
- if(choice == "Submit") //choosing 'Resist' does nothing of course.
- cult.add_antagonist(target.mind)
- converting -= target
- target.hallucination = 0 //sudden clarity
-
- sleep(100) //proc once every 10 seconds
- return 1
-
-/////////////////////////////////////////FOURTH RUNE
-
- tearreality()
- if(!cult.allow_narsie)
- return fizzle()
-
- var/list/cultists = new()
- for(var/mob/M in range(1,src))
- if(iscultist(M) && !M.stat)
- M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
- cultists += 1
- if(cultists.len >= 9)
- log_and_message_admins_many(cultists, "summoned Nar-sie.")
- new /obj/singularity/narsie/large(src.loc)
-
- // Can't summon a singular entity twice.
- cult.allow_narsie = 0
- return
- else
- return fizzle()
-
-/////////////////////////////////////////FIFTH RUNE
-
- emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist
- log_and_message_admins("activated an EMP rune.")
- if(istype(src,/obj/effect/rune))
- usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
- else
- usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
- playsound(U, 'sound/items/Welder2.ogg', 25, 1)
- var/turf/T = get_turf(U)
- if(T)
- T.hotspot_expose(700,125)
- var/rune = src // detaching the proc - in theory
- empulse(U, (range_red - 2), range_red)
- qdel(rune)
- return
-
-/////////////////////////////////////////SIXTH RUNE
-
- drain()
- var/drain = 0
- for(var/obj/effect/rune/R in world)
- if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
- for(var/mob/living/carbon/D in R.loc)
- if(D.stat!=2)
- admin_attack_log(usr, D, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on")
- var/bdrain = rand(1,25)
- D << "You feel weakened."
- D.take_overall_damage(bdrain, 0)
- drain += bdrain
- if(!drain)
- return fizzle()
- usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
- usr.visible_message("Blood flows from the rune into [usr]!", \
- "The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \
- "You hear a liquid flowing.")
- var/mob/living/user = usr
- if(user.bhunger)
- user.bhunger = max(user.bhunger-2*drain,0)
- if(drain>=50)
- user.visible_message("[user]'s eyes give off eerie red glow!", \
- "...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \
- "You hear a heartbeat.")
- user.bhunger += drain
- src = user
- spawn()
- for (,user.bhunger>0,user.bhunger--)
- sleep(50)
- user.take_overall_damage(3, 0)
- return
- user.heal_organ_damage(drain%5, 0)
- drain-=drain%5
- for (,drain>0,drain-=5)
- sleep(2)
- user.heal_organ_damage(5, 0)
- return
-
-
-
-
-
-
-/////////////////////////////////////////SEVENTH RUNE
-
- seer()
- if(usr.loc==src.loc)
- if(usr.seer==1)
- usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.")
- usr << "The world beyond fades from your vision."
- usr.see_invisible = SEE_INVISIBLE_LIVING
- usr.seer = 0
- else if(usr.see_invisible!=SEE_INVISIBLE_LIVING)
- usr << "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
- usr.see_invisible = SEE_INVISIBLE_CULT
- usr.seer = 0
- else
- usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
- usr << "The world beyond opens to your eyes."
- usr.see_invisible = SEE_INVISIBLE_CULT
- usr.seer = 1
- return
- return fizzle()
-
-/////////////////////////////////////////EIGHTH RUNE
-
- raise()
- var/mob/living/carbon/human/corpse_to_raise
- var/mob/living/carbon/human/body_to_sacrifice
-
- var/is_sacrifice_target = 0
- for(var/mob/living/carbon/human/M in src.loc)
- if(M.stat == DEAD)
- if(cult && M.mind == cult.sacrifice_target)
- is_sacrifice_target = 1
- else
- corpse_to_raise = M
- if(M.key)
- M.ghostize(1) //kick them out of their body
- break
- if(!corpse_to_raise)
- if(is_sacrifice_target)
- usr << "The Geometer of blood wants this mortal for himself."
- return fizzle()
-
-
- is_sacrifice_target = 0
- find_sacrifice:
- for(var/obj/effect/rune/R in world)
- if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"])
- for(var/mob/living/carbon/human/N in R.loc)
- if(cult && N.mind && N.mind == cult.sacrifice_target)
- is_sacrifice_target = 1
- else
- if(N.stat!= DEAD)
- body_to_sacrifice = N
- break find_sacrifice
-
- if(!body_to_sacrifice)
- if (is_sacrifice_target)
- usr << "The Geometer of Blood wants that corpse for himself."
- else
- usr << "The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
- return fizzle()
-
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
-
- if(!ghost)
- usr << "You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
- return fizzle()
-
- corpse_to_raise.revive()
-
- corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
- //This means, should that player leave the body, the original may re-enter
- usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
- corpse_to_raise.visible_message("[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
- "Life... I'm alive again...", \
- "You hear a faint, slightly familiar whisper.")
- body_to_sacrifice.visible_message("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from \his remains!", \
- "You feel as your blood boils, tearing you apart.", \
- "You hear a thousand voices, all crying in pain.")
- body_to_sacrifice.gib()
-
-// if(ticker.mode.name == "cult")
-// ticker.mode:add_cultist(corpse_to_raise.mind)
-// else
-// ticker.mode.cult |= corpse_to_raise.mind
-
- corpse_to_raise << "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 in the festering wound left behind something sinister takes root."
- corpse_to_raise << "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."
- return
-
-
-
-
-
-/////////////////////////////////////////NINETH RUNE
-
- obscure(var/rad)
- var/S=0
- for(var/obj/effect/rune/R in orange(rad,src))
- if(R!=src)
- R.invisibility=INVISIBILITY_OBSERVER
- S=1
- if(S)
- if(istype(src,/obj/effect/rune))
- usr.say("Kla[pick("'","`")]atu barada nikt'o!")
- for (var/mob/V in viewers(src))
- V.show_message("The rune turns into gray dust, veiling the surrounding runes.", 3)
- qdel(src)
- else
- usr.whisper("Kla[pick("'","`")]atu barada nikt'o!")
- usr << "Your talisman turns into gray dust, veiling the surrounding runes."
- for (var/mob/V in orange(1,src))
- if(V!=usr)
- V.show_message("Dust emanates from [usr]'s hands for a moment.", 3)
-
- return
- if(istype(src,/obj/effect/rune))
- return fizzle()
- else
- call(/obj/effect/rune/proc/fizzle)()
- return
-
-/////////////////////////////////////////TENTH RUNE
-
- ajourney() //some bits copypastaed from admin tools - Urist
- if(usr.loc==src.loc)
- var/mob/living/carbon/human/L = usr
- usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
- usr.visible_message("[usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
- "The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
- "You hear only complete silence for a moment.")
- announce_ghost_joinleave(usr.ghostize(1), 1, "You feel that they had to use some [pick("dark", "black", "blood", "forgotten", "forbidden")] magic to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place!")
- L.ajourn = 1
- while(L)
- if(L.key)
- L.ajourn=0
- return
- else
- L.take_organ_damage(10, 0)
- sleep(100)
- return fizzle()
-
-
-
-
-/////////////////////////////////////////ELEVENTH RUNE
-
- manifest()
- var/obj/effect/rune/this_rune = src
- src = null
- if(usr.loc!=this_rune.loc)
- return this_rune.fizzle()
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in this_rune.loc)
- if(!O.client) continue
- if(!O.MayRespawn()) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
- if(!ghost)
- return this_rune.fizzle()
- if(jobban_isbanned(ghost, "cultist"))
- return this_rune.fizzle()
-
- usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!")
- var/mob/living/carbon/human/dummy/D = new(this_rune.loc)
- usr.visible_message("A shape forms in the center of the rune. A shape of... a man.", \
- "A shape forms in the center of the rune. A shape of... a man.", \
- "You hear liquid flowing.")
- D.real_name = "Unknown"
- var/chose_name = 0
- for(var/obj/item/weapon/paper/P in this_rune.loc)
- if(P.info)
- D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) )
- chose_name = 1
- break
- D.universal_speak = 1
- D.status_flags &= ~GODMODE
- D.s_tone = 35
- D.b_eyes = 200
- D.r_eyes = 200
- D.g_eyes = 200
- D.update_eyes()
- D.underwear = 0
- D.key = ghost.key
- cult.add_antagonist(D.mind)
-
- if(!chose_name)
- D.real_name = pick("Anguished", "Blasphemous", "Corrupt", "Cruel", "Depraved", "Despicable", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Malevolent", "Malignant", "Malicious", "Pained", "Profane", "Profligate", "Relentless", "Resentful", "Restless", "Spiteful", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged")
- D.real_name += " "
- D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith")
-
- log_and_message_admins("used a manifest rune.")
- var/mob/living/user = usr
- while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
- user.take_organ_damage(1, 0)
- sleep(30)
- if(D)
- D.visible_message("[D] slowly dissipates into dust and bones.", \
- "You feel pain, as bonds formed between your soul and this homunculus break.", \
- "You hear faint rustle.")
- D.dust()
- return
-
-
-
-
-
-/////////////////////////////////////////TWELFTH RUNE
-
- talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm
- var/obj/item/weapon/paper/newtalisman
- var/unsuitable_newtalisman = 0
- for(var/obj/item/weapon/paper/P in src.loc)
- if(!P.info)
- newtalisman = P
- break
- else
- unsuitable_newtalisman = 1
- if (!newtalisman)
- if (unsuitable_newtalisman)
- usr << "The blank is tainted. It is unsuitable."
- return fizzle()
-
- var/obj/effect/rune/imbued_from
- var/obj/item/weapon/paper/talisman/T
- for(var/obj/effect/rune/R in orange(1,src))
- if(R==src)
- continue
- if(R.word1==cultwords["travel"] && R.word2==cultwords["self"]) //teleport
- T = new(src.loc)
- T.imbue = "[R.word3]"
- T.info = "[R.word3]"
- imbued_from = R
- break
- if(R.word1==cultwords["see"] && R.word2==cultwords["blood"] && R.word3==cultwords["hell"]) //tome
- T = new(src.loc)
- T.imbue = "newtome"
- imbued_from = R
- break
- if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["technology"]) //emp
- T = new(src.loc)
- T.imbue = "emp"
- imbued_from = R
- break
- if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["destroy"]) //conceal
- T = new(src.loc)
- T.imbue = "conceal"
- imbued_from = R
- break
- if(R.word1==cultwords["hell"] && R.word2==cultwords["destroy"] && R.word3==cultwords["other"]) //armor
- T = new(src.loc)
- T.imbue = "armor"
- imbued_from = R
- break
- if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["hide"]) //reveal
- T = new(src.loc)
- T.imbue = "revealrunes"
- imbued_from = R
- break
- if(R.word1==cultwords["hide"] && R.word2==cultwords["other"] && R.word3==cultwords["see"]) //deafen
- T = new(src.loc)
- T.imbue = "deafen"
- imbued_from = R
- break
- if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["other"]) //blind
- T = new(src.loc)
- T.imbue = "blind"
- imbued_from = R
- break
- if(R.word1==cultwords["self"] && R.word2==cultwords["other"] && R.word3==cultwords["technology"]) //communicat
- T = new(src.loc)
- T.imbue = "communicate"
- imbued_from = R
- break
- if(R.word1==cultwords["join"] && R.word2==cultwords["hide"] && R.word3==cultwords["technology"]) //communicat
- T = new(src.loc)
- T.imbue = "runestun"
- imbued_from = R
- break
- if (imbued_from)
- for (var/mob/V in viewers(src))
- V.show_message("The runes turn into dust, which then forms into an arcane image on the paper.", 3)
- usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!")
- qdel(imbued_from)
- qdel(newtalisman)
- else
- return fizzle()
-
-/////////////////////////////////////////THIRTEENTH RUNE
-
- mend()
- var/mob/living/user = usr
- src = null
- user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!")
- user.take_overall_damage(200, 0)
- runedec+=10
- user.visible_message("\The [user] keels over dead, \his blood glowing blue as it escapes \his body and dissipates into thin air.", \
- "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \
- "You hear faint rustle.")
- for(,user.stat==2)
- sleep(600)
- if (!user)
- return
- runedec-=10
- return
-
-
-/////////////////////////////////////////FOURTEETH RUNE
-
- // returns 0 if the rune is not used. returns 1 if the rune is used.
- communicate()
- . = 1 // Default output is 1. If the rune is deleted it will return 1
- var/input = input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")//sanitize() below, say() and whisper() have their own
- if(!input)
- if (istype(src))
- fizzle()
- return 0
- else
- return 0
-
- if(istype(src,/obj/effect/rune))
- usr.say("O bidai nabora se[pick("'","`")]sma!")
- usr.say("[input]")
- else
- usr.whisper("O bidai nabora se[pick("'","`")]sma!")
- usr.whisper("[input]")
-
- input = sanitize(input)
- log_and_message_admins("used a communicate rune to say '[input]'")
- for(var/datum/mind/H in cult.current_antagonists)
- if (H.current)
- H.current << "[input]"
- qdel(src)
- return 1
-
-/////////////////////////////////////////FIFTEENTH RUNE
-
- sacrifice()
- var/list/mob/living/carbon/human/cultsinrange = list()
- var/list/mob/living/carbon/human/victims = list()
- for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice
- if(ishuman(V))
- if(!(iscultist(V)))
- victims += V//Checks for cult status and mob type
- for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
- if(istype(I,/obj/item/organ/brain))
- var/obj/item/organ/brain/B = I
- victims += B.brainmob
- else if(istype(I,/obj/item/device/mmi))
- var/obj/item/device/mmi/B = I
- victims += B.brainmob
- else if(istype(I,/obj/item/weapon/aicard))
- for(var/mob/living/silicon/ai/A in I)
- victims += A
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- cultsinrange += C
- C.say("Barhah hra zar[pick("'","`")]garis!")
-
- for(var/mob/H in victims)
-
- var/worth = 0
- if(istype(H,/mob/living/carbon/human))
- var/mob/living/carbon/human/lamb = H
- if(lamb.species.rarity_value > 3)
- worth = 1
-
- if (SSticker.mode.name == "Cult")
- if(H.mind == cult.sacrifice_target)
- if(cultsinrange.len >= 3)
- sacrificed += H.mind
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- usr << "The Geometer of Blood accepts this sacrifice, your objective is now complete."
- else
- usr << "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
- else
- if(cultsinrange.len >= 3)
- if(H.stat !=2)
- if(prob(80) || worth)
- usr << "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice."
- cult.grant_runeword(usr)
- else
- usr << "The Geometer of Blood accepts this sacrifice."
- usr << "However, this soul was not enough to gain His favor."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(prob(40) || worth)
- usr << "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice."
- cult.grant_runeword(usr)
- else
- usr << "The Geometer of Blood accepts this sacrifice."
- usr << "However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(H.stat !=2)
- usr << "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
- else
- if(prob(40))
-
- usr << "The Geometer of Blood accepts this sacrifice."
- cult.grant_runeword(usr)
- else
- usr << "The Geometer of Blood accepts this sacrifice."
- usr << "However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(cultsinrange.len >= 3)
- if(H.stat !=2)
- if(prob(80))
- usr << "The Geometer of Blood accepts this sacrifice."
- cult.grant_runeword(usr)
- else
- usr << "The Geometer of Blood accepts this sacrifice."
- usr << "However, this soul was not enough to gain His favor."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(prob(40))
- usr << "The Geometer of Blood accepts this sacrifice."
- cult.grant_runeword(usr)
- else
- usr << "The Geometer of Blood accepts this sacrifice."
- usr << "However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(H.stat !=2)
- usr << "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
- else
- if(prob(40))
- usr << "The Geometer of Blood accepts this sacrifice."
- cult.grant_runeword(usr)
- else
- usr << "The Geometer of Blood accepts this sacrifice."
- usr << "However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
-
-/////////////////////////////////////////SIXTEENTH RUNE
-
- revealrunes(var/obj/W as obj)
- var/go=0
- var/rad
- var/S=0
- if(istype(W,/obj/effect/rune))
- rad = 6
- go = 1
- if (istype(W,/obj/item/weapon/paper/talisman))
- rad = 4
- go = 1
- if (istype(W,/obj/item/weapon/nullrod))
- rad = 1
- go = 1
- if(go)
- for(var/obj/effect/rune/R in orange(rad,src))
- if(R!=src)
- R:visibility=15
- S=1
- if(S)
- if(istype(W,/obj/item/weapon/nullrod))
- usr << "Arcane markings suddenly glow from underneath a thin layer of dust!"
- return
- if(istype(W,/obj/effect/rune))
- usr.say("Nikt[pick("'","`")]o barada kla'atu!")
- for (var/mob/V in viewers(src))
- V.show_message("The rune turns into red dust, reveaing the surrounding runes.", 3)
- qdel(src)
- return
- if(istype(W,/obj/item/weapon/paper/talisman))
- usr.whisper("Nikt[pick("'","`")]o barada kla'atu!")
- usr << "Your talisman turns into red dust, revealing the surrounding runes."
- for (var/mob/V in orange(1,usr.loc))
- if(V!=usr)
- V.show_message("Red dust emanates from [usr]'s hands for a moment.", 3)
- return
- return
- if(istype(W,/obj/effect/rune))
- return fizzle()
- if(istype(W,/obj/item/weapon/paper/talisman))
- call(/obj/effect/rune/proc/fizzle)()
- return
-
-/////////////////////////////////////////SEVENTEENTH RUNE
-
- wall()
- usr.say("Khari[pick("'","`")]d! Eske'te tannin!")
- src.density = !src.density
- var/mob/living/user = usr
- user.take_organ_damage(2, 0)
- if(src.density)
- usr << "Your blood flows into the rune, and you feel that the very space over the rune thickens."
- else
- usr << "Your blood flows into the rune, and you feel as the rune releases its grasp on space."
- return
-
-/////////////////////////////////////////EIGHTTEENTH RUNE
-
- freedom()
- var/mob/living/user = usr
- var/list/mob/living/carbon/cultists = new
- for(var/datum/mind/H in cult.current_antagonists)
- if (istype(H.current,/mob/living/carbon))
- cultists+=H.current
- var/list/mob/living/carbon/users = new
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- users+=C
- var/dam = round(15 / users.len)
- if(users.len>=3)
- var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
- if(!cultist)
- return fizzle()
- if (cultist == user) //just to be sure.
- return
- if(!(cultist.buckled || \
- cultist.handcuffed || \
- istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \
- (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
- (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
- (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
- ))
- user << "The [cultist] is already free."
- return
- cultist.buckled = null
- if (cultist.handcuffed)
- cultist.drop_from_inventory(cultist.handcuffed)
- if (cultist.legcuffed)
- cultist.drop_from_inventory(cultist.legcuffed)
- if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle))
- cultist.drop_from_inventory(cultist.wear_mask)
- if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded)
- cultist.loc:welded = 0
- if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked)
- cultist.loc:locked = 0
- if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked)
- cultist.loc:locked = 0
- for(var/mob/living/carbon/C in users)
- user.take_overall_damage(dam, 0)
- C.say("Khari[pick("'","`")]d! Gual'te nikka!")
- qdel(src)
- return fizzle()
-
-/////////////////////////////////////////NINETEENTH RUNE
-
- cultsummon()
- var/mob/living/user = usr
- var/list/mob/living/carbon/cultists = new
- for(var/datum/mind/H in cult.current_antagonists)
- if (istype(H.current,/mob/living/carbon))
- cultists+=H.current
- var/list/mob/living/carbon/users = new
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- users += C
- if(users.len>=3)
- var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
- if(!cultist)
- return fizzle()
- if (cultist == user) //just to be sure.
- return
- if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
- user << "You cannot summon \the [cultist], for \his shackles of blood are strong."
- return fizzle()
- cultist.loc = src.loc
- cultist.lying = 1
- cultist.regenerate_icons()
-
- var/dam = round(25 / (users.len/2)) //More people around the rune less damage everyone takes. Minimum is 3 cultists
-
- for(var/mob/living/carbon/human/C in users)
- if(iscultist(C) && !C.stat)
- C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!")
- C.take_overall_damage(dam, 0)
- if(users.len <= 4) // You did the minimum, this is going to hurt more and we're going to stun you.
- C.apply_effect(rand(3,6), STUN)
- C.apply_effect(1, WEAKEN)
- user.visible_message("Rune disappears with a flash of red light, and in its place now a body lies.", \
- "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
- "You hear a pop and smell ozone.")
- qdel(src)
- return fizzle()
-
-/////////////////////////////////////////TWENTIETH RUNES
-
- deafen()
- if(istype(src,/obj/effect/rune))
- var/list/affected = new()
- for(var/mob/living/carbon/C in range(7,src))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.ear_deaf += 50
- C.show_message("The world around you suddenly becomes quiet.", 3)
- affected += C
- if(prob(1))
- C.sdisabilities |= DEAF
- if(affected.len)
- usr.say("Sti[pick("'","`")] kaliedir!")
- usr << "The world becomes quiet as the deafening rune dissipates into fine dust."
- admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
- qdel(src)
- else
- return fizzle()
- else
- var/list/affected = new()
- for(var/mob/living/carbon/C in range(7,usr))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.ear_deaf += 30
- //talismans is weaker.
- C.show_message("The world around you suddenly becomes quiet.", 3)
- affected += C
- if(affected.len)
- usr.whisper("Sti[pick("'","`")] kaliedir!")
- usr << "Your talisman turns into gray dust, deafening everyone around."
- admin_attacker_log_many_victims(usr, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
- for (var/mob/V in orange(1,src))
- if(!(iscultist(V)))
- V.show_message("Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
- return
-
- blind()
- if(istype(src,/obj/effect/rune))
- var/list/affected = new()
- for(var/mob/living/carbon/C in viewers(src))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.eye_blurry += 50
- C.eye_blind += 20
- if(prob(5))
- C.disabilities |= NEARSIGHTED
- if(prob(10))
- C.sdisabilities |= BLIND
- C.show_message("Suddenly you see a red flash that blinds you.", 3)
- affected += C
- if(affected.len)
- usr.say("Sti[pick("'","`")] kaliesin!")
- usr << "The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
- admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
- qdel(src)
- else
- return fizzle()
- else
- var/list/affected = new()
- for(var/mob/living/carbon/C in view(2,usr))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.eye_blurry += 30
- C.eye_blind += 10
- //talismans is weaker.
- affected += C
- C.show_message("You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
- if(affected.len)
- usr.whisper("Sti[pick("'","`")] kaliesin!")
- usr << "Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
- admin_attacker_log_many_victims(usr, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
- return
-
-
- bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy.
-/*
- var/list/mob/living/carbon/cultists = new
- for(var/datum/mind/H in ticker.mode.cult)
- if (istype(H.current,/mob/living/carbon))
- cultists+=H.current
-*/
- var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood.
- var/list/victims = new
-// var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood.
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- cultists+=C
- if(cultists.len>=3)
- for(var/mob/living/carbon/M in viewers(usr))
- if(iscultist(M))
- continue
- var/obj/item/weapon/nullrod/N = locate() in M
- if(N)
- continue
- M.take_overall_damage(51,51)
- M << "Your blood boils!"
- victims += M
- if(prob(5))
- spawn(5)
- M.gib()
- for(var/obj/effect/rune/R in view(src))
- if(prob(10))
- explosion(R.loc, -1, 0, 1, 5)
- for(var/mob/living/carbon/human/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- C.say("Dedo ol[pick("'","`")]btoh!")
- C.take_overall_damage(15, 0)
- admin_attacker_log_many_victims(usr, victims, "Used a blood boil rune.", "Was the victim of a blood boil rune.", "used a blood boil rune on")
- log_and_message_admins_many(cultists - usr, "assisted activating a blood boil rune.")
- qdel(src)
- else
- return fizzle()
- return
-
-// WIP rune, I'll wait for Rastaf0 to add limited blood.
-
- burningblood()
- var/culcount = 0
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- culcount++
- if(culcount >= 5)
- for(var/obj/effect/rune/R in world)
- if(R.blood_DNA == src.blood_DNA)
- for(var/mob/living/M in orange(2,R))
- M.take_overall_damage(0,15)
- if (R.invisibility>M.see_invisible)
- M << "Aargh it burns!"
- else
- M << "Rune suddenly ignites, burning you!"
- var/turf/T = get_turf(R)
- T.hotspot_expose(700,125)
- for(var/obj/effect/decal/cleanable/blood/B in world)
- if(B.blood_DNA == src.blood_DNA)
- for(var/mob/living/M in orange(1,B))
- M.take_overall_damage(0,5)
- M << "Blood suddenly ignites, burning you!"
- var/turf/T = get_turf(B)
- T.hotspot_expose(700,125)
- qdel(B)
- qdel(src)
-
-////////// Rune 24 (counting burningblood, which kinda doesnt work yet.)
-
- runestun(var/mob/living/T as mob)
- if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
- usr.say("Fuu ma[pick("'","`")]jin!")
- for(var/mob/living/L in viewers(src))
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- flick("e_flash", C.flash)
- if(C.stuttering < 1 && (!(HULK in C.mutations)))
- C.stuttering = 1
- C.Weaken(1)
- C.Stun(1)
- C.show_message("The rune explodes in a bright flash.", 3)
- admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
-
- else if(issilicon(L))
- var/mob/living/silicon/S = L
- S.Weaken(5)
- S.show_message("BZZZT... The rune has exploded in a bright flash.", 3)
- admin_attack_log(usr, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
- qdel(src)
- else ///When invoked as talisman, stun and mute the target mob.
- usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
- var/obj/item/weapon/nullrod/N = locate() in T
- if(N)
- for(var/mob/O in viewers(T, null))
- O.show_message(text("[] invokes a talisman at [], but they are unaffected!", usr, T), 1)
- else
- for(var/mob/O in viewers(T, null))
- O.show_message(text("[] invokes a talisman at []", usr, T), 1)
-
- if(issilicon(T))
- T.Weaken(15)
- admin_attack_log(usr, T, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
- else if(iscarbon(T))
- var/mob/living/carbon/C = T
- flick("e_flash", C.flash)
- if (!(HULK in C.mutations))
- C.silent += 15
- C.Weaken(25)
- C.Stun(25)
- admin_attack_log(usr, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
- return
-
-/////////////////////////////////////////TWENTY-FIFTH RUNE
-
- armor()
- var/mob/living/carbon/human/user = usr
- if(istype(src,/obj/effect/rune))
- usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
- else
- usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
- usr.visible_message("The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \
- "You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.")
-
- if(istype(usr, /mob/living/simple_animal/construct))
- var/mob/living/simple_animal/construct/C = user
- var/construct_class
- if(narsie_cometh)
- construct_class = alert(C, "Please choose which type of construct you wish to become.",,"Juggernaut","Wraith","Harvester")
- else
- construct_class = alert(C, "Please choose which type of construct you wish to become.",,"Juggernaut","Wraith","Artificer")
- switch(construct_class)
- if("Juggernaut")
- var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(C.loc))
- Z.key = C.key
- if(iscultist(C))
- cult.add_antagonist(Z.mind)
- C.death()
- Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."
- Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- Z.cancel_camera()
- if("Wraith")
- var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(C.loc))
- Z.key = C.key
- if(iscultist(C))
- cult.add_antagonist(Z.mind)
- C.death()
- Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."
- Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- Z.cancel_camera()
- if("Artificer")
- var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(C.loc))
- Z.key = C.key
- if(iscultist(C))
- cult.add_antagonist(Z.mind)
- C.death()
- Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"
- Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- Z.cancel_camera()
- if("Harvester")
- var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/harvester (get_turf(C.loc))
- Z.key = C.key
- if(iscultist(C))
- cult.add_antagonist(Z.mind)
- C.death()
- Z << "You are playing a Harvester. You are gifted with the ability to open doors with your mind, to draw runes at will, and to teleport back to Nar'Sie. Seek out all non-believers and bring them to the Geometer."
- Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- Z.cancel_camera()
- else
- user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
- user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
- user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes)
- user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
- //the above update their overlay icons cache but do not call update_icons()
- //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache
- user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor
-
- qdel(src)
- return
+var/list/sacrificed = list()
+
+/obj/effect/rune/cultify()
+ return
+
+/obj/effect/rune
+
+/*
+ * Use as a general guideline for this and related files:
+ * * ... - when something non-trivial or an error happens, so something similar to "Sparks come out of the machine!"
+ * * ... - when something that is fit for 'warning' happens but there is some damage or pain as well.
+ * * ... - when there is a private message to the cultists. This guideline is very arbitrary but there has to be some consistency!
+ */
+
+
+/////////////////////////////////////////FIRST RUNE
+/obj/effect/rune/proc/teleport(var/mob/living/user, var/key)
+ var/allrunesloc[]
+ allrunesloc = new/list()
+ var/index = 0
+// var/tempnum = 0
+ for(var/obj/effect/rune/R in rune_list)
+ if(R == src)
+ continue
+ if(R.word1 == cultwords["travel"] && R.word2 == cultwords["self"] && R.word3 == key && isPlayerLevel(R.z))
+ index++
+ allrunesloc.len = index
+ allrunesloc[index] = R.loc
+ if(index >= 5)
+ user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric."
+ if (istype(user, /mob/living))
+ user.take_overall_damage(5, 0)
+ qdel(src)
+ if(allrunesloc && index != 0)
+ if(istype(src,/obj/effect/rune))
+ user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting
+ else
+ user.whisper("Sas[pick("'","`")]so c'arta forbici!")
+ user.visible_message("[user] disappears in a flash of red light!", \
+ "You feel as your body gets dragged through the dimension of Nar-Sie!", \
+ "You hear a sickening crunch and sloshing of viscera.")
+ user.loc = allrunesloc[rand(1,index)]
+ return
+ if(istype(src,/obj/effect/rune))
+ return fizzle(user) //Use friggin manuals, Dorf, your list was of zero length.
+ else
+ call(/obj/effect/rune/proc/fizzle)(user)
+ return
+
+
+/obj/effect/rune/proc/itemport(var/mob/living/user, var/key)
+// var/allrunesloc[]
+// allrunesloc = new/list()
+// var/index = 0
+// var/tempnum = 0
+ var/culcount = 0
+ var/runecount = 0
+ var/obj/effect/rune/IP = null
+ for(var/obj/effect/rune/R in rune_list)
+ if(R == src)
+ continue
+ if(R.word1 == cultwords["travel"] && R.word2 == cultwords["other"] && R.word3 == key)
+ IP = R
+ runecount++
+ if(runecount >= 2)
+ user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric."
+ if (istype(user, /mob/living))
+ user.take_overall_damage(5, 0)
+ qdel(src)
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ culcount++
+ if(culcount>=3)
+ user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
+ user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \
+ "You feel air moving from the rune - like as it was swapped with somewhere else.", \
+ "You smell ozone.")
+ for(var/obj/O in src.loc)
+ if(!O.anchored)
+ O.loc = IP.loc
+ for(var/mob/M in src.loc)
+ M.loc = IP.loc
+ return
+
+ return fizzle(user)
+
+
+/////////////////////////////////////////SECOND RUNE
+
+/obj/effect/rune/proc/tomesummon(var/mob/living/user)
+ if(istype(src,/obj/effect/rune))
+ user.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
+ else
+ user.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
+ user.visible_message("Rune disappears with a flash of red light, and in its place now a book lies.", \
+ "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \
+ "You hear a pop and smell ozone.")
+ if(istype(src,/obj/effect/rune))
+ new /obj/item/weapon/book/tome(src.loc)
+ else
+ new /obj/item/weapon/book/tome(user.loc)
+ qdel(src)
+ return
+
+
+
+/////////////////////////////////////////THIRD RUNE
+
+/obj/effect/rune/proc/convert(var/mob/living/user)
+ var/mob/attacker = user
+ var/mob/living/carbon/target = null
+ for(var/mob/living/carbon/M in src.loc)
+ if(!iscultist(M) && M.stat < DEAD && !(M in converting))
+ target = M
+ break
+
+ if(!target) //didn't find any new targets
+ if(!converting.len)
+ fizzle()
+ else
+ user << "You sense that the power of the dark one is already working away at them."
+ return
+
+ user.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
+
+ converting |= target
+ var/list/waiting_for_input = list(target = 0) //need to box this up in order to be able to reset it again from inside spawn, apparently
+ var/initial_message = 0
+ while(target in converting)
+ if(target.loc != src.loc || target.stat == DEAD)
+ converting -= target
+ if(target.getFireLoss() < 100)
+ target.hallucination = min(target.hallucination, 500)
+ return 0
+
+ target.take_overall_damage(0, rand(5, 20)) // You dirty resister cannot handle the damage to your mind. Easily. - even cultists who accept right away should experience some effects
+ // Resist messages go!
+ if(initial_message) //don't do this stuff right away, only if they resist or hesitate.
+ admin_attack_log(attacker, target, "Used a convert rune", "Was subjected to a convert rune", "used a convert rune on")
+ switch(target.getFireLoss())
+ if(0 to 25)
+ target << "Your blood boils as you force yourself to resist the corruption invading every corner of your mind."
+ if(25 to 45)
+ target << "Your blood boils and your body burns as the corruption further forces itself into your body and mind."
+ if(45 to 75)
+ target << "You begin to hallucinate images of a dark and incomprehensible being and your entire body feels like its engulfed in flame as your mental defenses crumble."
+ target.apply_effect(rand(1,10), STUTTER)
+ if(75 to 100)
+ target << "Your mind turns to ash as the burning flames engulf your very soul and images of an unspeakable horror begin to bombard the last remnants of mental resistance."
+ //broken mind - 5000 may seem like a lot I wanted the effect to really stand out for maxiumum losing-your-mind-spooky
+ //hallucination is reduced when the step off as well, provided they haven't hit the last stage...
+ target.hallucination += 5000
+ target.apply_effect(10, STUTTER)
+ target.adjustBrainLoss(1)
+ if(100 to INFINITY)
+ target << "Your entire broken soul and being is engulfed in corruption and flames as your mind shatters away into nothing."
+ target.hallucination += 5000
+ target.apply_effect(15, STUTTER)
+ target.adjustBrainLoss(rand(1,5))
+
+ initial_message = 1
+ if (target.species && (target.species.flags & NO_PAIN))
+ target.visible_message("The markings below [target] glow a bloody red.")
+ else
+ target.visible_message("[target] writhes in pain as the markings below \him glow a bloody red.", "AAAAAAHHHH!", "You hear an anguished scream.")
+
+ if(!waiting_for_input[target]) //so we don't spam them with dialogs if they hesitate
+ waiting_for_input[target] = 1
+
+ if(!cult.can_become_antag(target.mind) || jobban_isbanned(target, "cultist"))//putting jobban check here because is_convertable uses mind as argument
+ //waiting_for_input ensures this is only shown once, so they basically auto-resist from here on out. They still need to find a way to get off the freaking rune if they don't want to burn to death, though.
+ target << "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 in the festering wound left behind something sinister takes root."
+ target << "And you were able to force it out of your mind. You now know the truth, there's something horrible out there, stop it and its minions at all costs."
+
+ else spawn()
+ var/choice = alert(target,"Do you want to join the cult?","Submit to Nar'Sie","Resist","Submit")
+ waiting_for_input[target] = 0
+ if(choice == "Submit") //choosing 'Resist' does nothing of course.
+ cult.add_antagonist(target.mind)
+ converting -= target
+ target.hallucination = 0 //sudden clarity
+
+ sleep(100) //proc once every 10 seconds
+ return 1
+
+/////////////////////////////////////////FOURTH RUNE
+
+/obj/effect/rune/proc/tearreality(var/mob/living/user)
+ if(!cult.allow_narsie)
+ return fizzle()
+
+ var/list/cultists = new()
+ for(var/mob/M in range(1,src))
+ if(iscultist(M) && !M.stat)
+ M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
+ if(istype(M, /mob/living/carbon/human/apparition))
+ continue
+ cultists.Add(M)
+ if(cultists.len >= 9)
+ log_and_message_admins_many(cultists, "summoned Nar-sie.")
+ new /obj/singularity/narsie/large(src.loc)
+
+ // Can't summon a singular entity twice.
+ cult.allow_narsie = 0
+ return
+ else
+ return fizzle(user)
+
+/////////////////////////////////////////FIFTH RUNE
+
+/obj/effect/rune/proc/emp(var/mob/living/user, var/U, var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist
+ log_and_message_admins("activated an EMP rune.")
+ if(istype(src,/obj/effect/rune))
+ user.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
+ else
+ user.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
+ playsound(U, 'sound/items/Welder2.ogg', 25, 1)
+ var/turf/T = get_turf(U)
+ if(T)
+ T.hotspot_expose(700,125)
+ var/rune = src // detaching the proc - in theory
+ empulse(U, (range_red - 2), range_red)
+ qdel(rune)
+ return
+
+/////////////////////////////////////////SIXTH RUNE
+
+/obj/effect/rune/proc/drain(var/mob/living/user)
+ var/drain = 0
+ for(var/obj/effect/rune/R in rune_list)
+ if(R.word1==cultwords["travel"] && R.word2==cultwords["blood"] && R.word3==cultwords["self"])
+ for(var/mob/living/carbon/D in R.loc)
+ if(D.stat!=2)
+ admin_attack_log(user, D, "Used a blood drain rune.", "Was victim of a blood drain rune.", "used a blood drain rune on")
+ var/bdrain = rand(1,25)
+ D << "You feel weakened."
+ D.take_overall_damage(bdrain, 0)
+ drain += bdrain
+ if(!drain)
+ return fizzle(user)
+ user.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
+ user.visible_message("Blood flows from the rune into [user]!", \
+ "The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \
+ "You hear a liquid flowing.")
+
+ if(user.bhunger)
+ user.bhunger = max(user.bhunger-2*drain,0)
+ if(drain>=50)
+ user.visible_message("[user]'s eyes give off eerie red glow!", \
+ "...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \
+ "You hear a heartbeat.")
+ user.bhunger += drain
+ src = user
+ spawn()
+ for (,user.bhunger>0,user.bhunger--)
+ sleep(50)
+ user.take_overall_damage(3, 0)
+ return
+ user.heal_organ_damage(drain%5, 0)
+ drain-=drain%5
+ for (,drain>0,drain-=5)
+ sleep(2)
+ user.heal_organ_damage(5, 0)
+ return
+
+
+
+/////////////////////////////////////////SEVENTH RUNE
+
+/obj/effect/rune/proc/seer(var/mob/living/user)
+ if(user.loc==src.loc)
+ if(user.seer==1)
+ user.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium viortia.")
+ user << "The world beyond fades from your vision."
+ user.see_invisible = SEE_INVISIBLE_LIVING
+ user.seer = 0
+ else if(user.see_invisible!=SEE_INVISIBLE_LIVING)
+ user << "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
+ user.see_invisible = SEE_INVISIBLE_CULT
+ user.seer = 0
+ else
+ user.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
+ user << "The world beyond opens to your eyes."
+ user.see_invisible = SEE_INVISIBLE_CULT
+ user.seer = 1
+ return
+ return fizzle(user)
+
+/////////////////////////////////////////EIGHTH RUNE
+
+/obj/effect/rune/proc/raise(var/mob/living/user)
+ var/mob/living/carbon/human/corpse_to_raise
+ var/mob/living/carbon/human/body_to_sacrifice
+
+ var/is_sacrifice_target = 0
+ for(var/mob/living/carbon/human/M in src.loc)
+ if(M.stat == DEAD)
+ if(cult && M.mind == cult.sacrifice_target)
+ is_sacrifice_target = 1
+ else
+ corpse_to_raise = M
+ if(M.key)
+ M.ghostize(1) //kick them out of their body
+ break
+ if(!corpse_to_raise)
+ if(is_sacrifice_target)
+ user << "The Geometer of blood wants this mortal for himself."
+ return fizzle(user)
+
+
+ is_sacrifice_target = 0
+ find_sacrifice:
+ for(var/obj/effect/rune/R in rune_list)
+ if(R.word1==cultwords["blood"] && R.word2==cultwords["join"] && R.word3==cultwords["hell"])
+ for(var/mob/living/carbon/human/N in R.loc)
+ if(cult && N.mind && N.mind == cult.sacrifice_target)
+ is_sacrifice_target = 1
+ else
+ if(N.stat!= DEAD)
+ body_to_sacrifice = N
+ break find_sacrifice
+
+ if(!body_to_sacrifice)
+ if (is_sacrifice_target)
+ user << "The Geometer of Blood wants that corpse for himself."
+ else
+ user << "The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
+ return fizzle()
+
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+
+ if(!ghost)
+ user << "You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
+ return fizzle(user)
+
+ corpse_to_raise.revive()
+
+ corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed)
+ //This means, should that player leave the body, the original may re-enter
+ user.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
+ corpse_to_raise.visible_message("[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
+ "Life... I'm alive again...", \
+ "You hear a faint, slightly familiar whisper.")
+ body_to_sacrifice.visible_message("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from \his remains!", \
+ "You feel as your blood boils, tearing you apart.", \
+ "You hear a thousand voices, all crying in pain.")
+ body_to_sacrifice.gib()
+
+// if(ticker.mode.name == "cult")
+// ticker.mode:add_cultist(corpse_to_raise.mind)
+// else
+// ticker.mode.cult |= corpse_to_raise.mind
+
+ corpse_to_raise << "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 in the festering wound left behind something sinister takes root."
+ corpse_to_raise << "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."
+ return
+
+
+
+
+
+/////////////////////////////////////////NINETH RUNE
+
+/obj/effect/rune/proc/obscure(var/mob/living/user, var/rad)
+ var/S=0
+ for(var/obj/effect/rune/R in orange(rad,src))
+ if(R!=src)
+ R.invisibility=INVISIBILITY_OBSERVER
+ S=1
+ if(S)
+ if(istype(src,/obj/effect/rune))
+ user.say("Kla[pick("'","`")]atu barada nikt'o!")
+ for (var/mob/V in viewers(src))
+ V.show_message("The rune turns into gray dust, veiling the surrounding runes.", 3)
+ qdel(src)
+ else
+ user.whisper("Kla[pick("'","`")]atu barada nikt'o!")
+ user << "Your talisman turns into gray dust, veiling the surrounding runes."
+ for (var/mob/V in orange(1,src))
+ if(V!=user)
+ V.show_message("Dust emanates from [user]'s hands for a moment.", 3)
+
+ return
+ if(istype(src,/obj/effect/rune))
+ return fizzle(user)
+ else
+ call(/obj/effect/rune/proc/fizzle)(user)
+ return
+
+/////////////////////////////////////////TENTH RUNE
+
+/obj/effect/rune/proc/ajourney(var/mob/living/user) //some bits copypastaed from admin tools - Urist
+ if(user.loc==src.loc)
+ var/mob/living/carbon/human/L = user
+ user.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
+ user.visible_message("[user]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
+ "The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
+ "You hear only complete silence for a moment.")
+ announce_ghost_joinleave(user.ghostize(1), 1, "You feel that they had to use some [pick("dark", "black", "blood", "forgotten", "forbidden")] magic to [pick("invade","disturb","disrupt","infest","taint","spoil","blight")] this place!")
+ L.ajourn = 1
+ while(L)
+ if(L.key)
+ L.ajourn=0
+ return
+ else
+ L.take_organ_damage(10, 0)
+ sleep(100)
+ return fizzle(user)
+
+
+
+
+/////////////////////////////////////////ELEVENTH RUNE
+
+/obj/effect/rune/proc/manifest(var/mob/living/user)
+ var/obj/effect/rune/this_rune = src
+ src = null
+ if(user.loc!=this_rune.loc)
+ return this_rune.fizzle()
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in this_rune.loc)
+ if(!O.client) continue
+ if(!O.MayRespawn()) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+ if(!ghost)
+ return this_rune.fizzle()
+ if(jobban_isbanned(ghost, "cultist"))
+ return this_rune.fizzle()
+
+ user.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!")
+ var/mob/living/carbon/human/apparition/D = new(this_rune.loc)
+ user.visible_message("A shape forms in the center of the rune. A shape of... a man.", \
+ "A shape forms in the center of the rune. A shape of... a man.", \
+ "You hear liquid flowing.")
+ D.real_name = "Unknown"
+ var/chose_name = 0
+ for(var/obj/item/weapon/paper/P in this_rune.loc)
+ if(P.info)
+ D.real_name = copytext(P.info, findtext(P.info,">")+1, findtext(P.info,"<",2) )
+ chose_name = 1
+ break
+ D.universal_speak = 1
+ D.underwear = 0
+ D.key = ghost.key
+ cult.add_antagonist(D.mind)
+
+ if(!chose_name)
+ D.real_name = pick("Anguished", "Blasphemous", "Corrupt", "Cruel", "Depraved", "Despicable", "Disturbed", "Exacerbated", "Foul", "Hateful", "Inexorable", "Implacable", "Impure", "Malevolent", "Malignant", "Malicious", "Pained", "Profane", "Profligate", "Relentless", "Resentful", "Restless", "Spiteful", "Tormented", "Unclean", "Unforgiving", "Vengeful", "Vindictive", "Wicked", "Wronged")
+ D.real_name += " "
+ D.real_name += pick("Apparition", "Aptrgangr", "Dis", "Draugr", "Dybbuk", "Eidolon", "Fetch", "Fylgja", "Ghast", "Ghost", "Gjenganger", "Haint", "Phantom", "Phantasm", "Poltergeist", "Revenant", "Shade", "Shadow", "Soul", "Spectre", "Spirit", "Spook", "Visitant", "Wraith")
+
+ log_and_message_admins("used a manifest rune.")
+
+ while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
+ user.take_organ_damage(1, 0)
+ sleep(30)
+ if(D)
+ D.visible_message("[D] slowly dissipates into dust and bones.", \
+ "You feel pain, as bonds formed between your soul and this homunculus break.", \
+ "You hear faint rustle.")
+ D.dust()
+ return
+
+
+
+/////////////////////////////////////////TWELFTH RUNE
+
+/obj/effect/rune/proc/talisman(var/mob/living/user)//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm
+ var/obj/item/weapon/paper/newtalisman
+ var/unsuitable_newtalisman = 0
+ for(var/obj/item/weapon/paper/P in src.loc)
+ if(!P.info)
+ newtalisman = P
+ break
+ else
+ unsuitable_newtalisman = 1
+ if (!newtalisman)
+ if (unsuitable_newtalisman)
+ user << "The blank is tainted. It is unsuitable."
+ return fizzle()
+
+ var/obj/effect/rune/imbued_from
+ var/obj/item/weapon/paper/talisman/T
+ for(var/obj/effect/rune/R in orange(1,src))
+ if(R==src)
+ continue
+ if(R.word1==cultwords["travel"] && R.word2==cultwords["self"]) //teleport
+ T = new(src.loc)
+ T.imbue = "[R.word3]"
+ T.info = "[R.word3]"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["see"] && R.word2==cultwords["blood"] && R.word3==cultwords["hell"]) //tome
+ T = new(src.loc)
+ T.imbue = "newtome"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["technology"]) //emp
+ T = new(src.loc)
+ T.imbue = "emp"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["destroy"]) //conceal
+ T = new(src.loc)
+ T.imbue = "conceal"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["hell"] && R.word2==cultwords["destroy"] && R.word3==cultwords["other"]) //armor
+ T = new(src.loc)
+ T.imbue = "armor"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["blood"] && R.word2==cultwords["see"] && R.word3==cultwords["hide"]) //reveal
+ T = new(src.loc)
+ T.imbue = "revealrunes"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["hide"] && R.word2==cultwords["other"] && R.word3==cultwords["see"]) //deafen
+ T = new(src.loc)
+ T.imbue = "deafen"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["destroy"] && R.word2==cultwords["see"] && R.word3==cultwords["other"]) //blind
+ T = new(src.loc)
+ T.imbue = "blind"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["self"] && R.word2==cultwords["other"] && R.word3==cultwords["technology"]) //communicat
+ T = new(src.loc)
+ T.imbue = "communicate"
+ imbued_from = R
+ break
+ if(R.word1==cultwords["join"] && R.word2==cultwords["hide"] && R.word3==cultwords["technology"]) //communicat
+ T = new(src.loc)
+ T.imbue = "runestun"
+ imbued_from = R
+ break
+ if (imbued_from)
+ for (var/mob/V in viewers(src))
+ V.show_message("The runes turn into dust, which then forms into an arcane image on the paper.", 3)
+ user.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!")
+ qdel(imbued_from)
+ qdel(newtalisman)
+ else
+ return fizzle(user)
+
+/////////////////////////////////////////THIRTEENTH RUNE
+
+/obj/effect/rune/proc/mend(var/mob/living/user)
+ src = null
+ user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!")
+ user.take_overall_damage(200, 0)
+ runedec+=10
+ user.visible_message("\The [user] keels over dead, \his blood glowing blue as it escapes \his body and dissipates into thin air.", \
+ "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \
+ "You hear faint rustle.")
+ for(,user.stat==2)
+ sleep(600)
+ if (!user)
+ return
+ runedec-=10
+ return
+
+
+/////////////////////////////////////////FOURTEETH RUNE
+
+// returns 0 if the rune is not used. returns 1 if the rune is used.
+/obj/effect/rune/proc/communicate(var/mob/living/user)
+ . = 1 // Default output is 1. If the rune is deleted it will return 1
+ var/input = input(user, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "")//sanitize() below, say() and whisper() have their own
+ if(!input)
+ if (istype(src))
+ fizzle()
+ return 0
+ else
+ return 0
+
+ if(istype(src,/obj/effect/rune))
+ user.say("O bidai nabora se[pick("'","`")]sma!")
+ user.say("[input]")
+ else
+ user.whisper("O bidai nabora se[pick("'","`")]sma!")
+ user.whisper("[input]")
+
+ input = sanitize(input)
+ log_and_message_admins("used a communicate rune to say '[input]'")
+ for(var/datum/mind/H in cult.current_antagonists)
+ if (H.current)
+ H.current << "[input]"
+ qdel(src)
+ return 1
+
+/////////////////////////////////////////FIFTEENTH RUNE
+
+/obj/effect/rune/proc/sacrifice(var/mob/living/user)
+ var/list/mob/living/carbon/human/cultsinrange = list()
+ var/list/mob/living/carbon/human/victims = list()
+ for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice
+ if(ishuman(V))
+ if(!(iscultist(V)))
+ victims += V//Checks for cult status and mob type
+ for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
+ if(istype(I,/obj/item/organ/brain))
+ var/obj/item/organ/brain/B = I
+ victims += B.brainmob
+ else if(istype(I,/obj/item/device/mmi))
+ var/obj/item/device/mmi/B = I
+ victims += B.brainmob
+ else if(istype(I,/obj/item/weapon/aicard))
+ for(var/mob/living/silicon/ai/A in I)
+ victims += A
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ cultsinrange += C
+ C.say("Barhah hra zar[pick("'","`")]garis!")
+
+ for(var/mob/H in victims)
+
+ var/worth = 0
+ if(istype(H,/mob/living/carbon/human))
+ var/mob/living/carbon/human/lamb = H
+ if(lamb.species.rarity_value > 3)
+ worth = 1
+
+ if (SSticker.mode.name == "Cult")
+ if(H.mind == cult.sacrifice_target)
+ if(cultsinrange.len >= 3)
+ sacrificed += H.mind
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ user << "The Geometer of Blood accepts this sacrifice, your objective is now complete."
+ else
+ user << "Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
+ else
+ if(cultsinrange.len >= 3)
+ if(H.stat !=2)
+ if(prob(80) || worth)
+ user << "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice."
+ else
+ user << "The Geometer of Blood accepts this sacrifice."
+ user << "However, this soul was not enough to gain His favor."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(prob(40) || worth)
+ user << "The Geometer of Blood accepts this [worth ? "exotic " : ""]sacrifice."
+ else
+ user << "The Geometer of Blood accepts this sacrifice."
+ user << "However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(H.stat !=2)
+ user << "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
+ else
+ if(prob(40))
+
+ user << "The Geometer of Blood accepts this sacrifice."
+ else
+ user << "The Geometer of Blood accepts this sacrifice."
+ user << "However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(cultsinrange.len >= 3)
+ if(H.stat !=2)
+ if(prob(80))
+ user << "The Geometer of Blood accepts this sacrifice."
+ else
+ user << "The Geometer of Blood accepts this sacrifice."
+ user << "However, this soul was not enough to gain His favor."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(prob(40))
+ user << "The Geometer of Blood accepts this sacrifice."
+ else
+ user << "The Geometer of Blood accepts this sacrifice."
+ user << "However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(H.stat !=2)
+ user << "The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
+ else
+ if(prob(40))
+ user << "The Geometer of Blood accepts this sacrifice."
+ else
+ user << "The Geometer of Blood accepts this sacrifice."
+ user << "However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+
+/////////////////////////////////////////SIXTEENTH RUNE
+
+/obj/effect/rune/proc/revealrunes(var/mob/living/user, var/obj/W as obj)
+ var/go=0
+ var/rad
+ var/S=0
+ if(istype(W,/obj/effect/rune))
+ rad = 6
+ go = 1
+ if (istype(W,/obj/item/weapon/paper/talisman))
+ rad = 4
+ go = 1
+ if (istype(W,/obj/item/weapon/nullrod))
+ rad = 1
+ go = 1
+ if(go)
+ for(var/obj/effect/rune/R in orange(rad,src))
+ if(R!=src)
+ R:visibility=15
+ S=1
+ if(S)
+ if(istype(W,/obj/item/weapon/nullrod))
+ user << "Arcane markings suddenly glow from underneath a thin layer of dust!"
+ return
+ if(istype(W,/obj/effect/rune))
+ user.say("Nikt[pick("'","`")]o barada kla'atu!")
+ for (var/mob/V in viewers(src))
+ V.show_message("The rune turns into red dust, reveaing the surrounding runes.", 3)
+ qdel(src)
+ return
+ if(istype(W,/obj/item/weapon/paper/talisman))
+ user.whisper("Nikt[pick("'","`")]o barada kla'atu!")
+ user << "Your talisman turns into red dust, revealing the surrounding runes."
+ for (var/mob/V in orange(1,user.loc))
+ if(V!=user)
+ V.show_message("Red dust emanates from [user]'s hands for a moment.", 3)
+ return
+ return
+ if(istype(W,/obj/effect/rune))
+ return fizzle(user)
+ if(istype(W,/obj/item/weapon/paper/talisman))
+ call(/obj/effect/rune/proc/fizzle)(user)
+ return
+
+/////////////////////////////////////////SEVENTEENTH RUNE
+
+/obj/effect/rune/proc/wall(var/mob/living/user)
+ user.say("Khari[pick("'","`")]d! Eske'te tannin!")
+ src.density = !src.density
+ user.take_organ_damage(2, 0)
+ if(src.density)
+ user << "Your blood flows into the rune, and you feel that the very space over the rune thickens."
+ else
+ user << "Your blood flows into the rune, and you feel as the rune releases its grasp on space."
+ return
+
+/////////////////////////////////////////EIGHTTEENTH RUNE
+
+/obj/effect/rune/proc/freedom(var/mob/living/user)
+ var/list/mob/living/carbon/cultists = new
+ for(var/datum/mind/H in cult.current_antagonists)
+ if (istype(H.current,/mob/living/carbon))
+ cultists+=H.current
+ var/list/mob/living/carbon/users = new
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ users+=C
+ var/dam = round(15 / users.len)
+ if(users.len>=3)
+ var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
+ if(!cultist)
+ return fizzle()
+ if (cultist == user) //just to be sure.
+ return
+ if(!(cultist.buckled || \
+ cultist.handcuffed || \
+ istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \
+ (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
+ (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
+ (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
+ ))
+ user << "The [cultist] is already free."
+ return
+ cultist.buckled = null
+ if (cultist.handcuffed)
+ cultist.drop_from_inventory(cultist.handcuffed)
+ if (cultist.legcuffed)
+ cultist.drop_from_inventory(cultist.legcuffed)
+ if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle))
+ cultist.drop_from_inventory(cultist.wear_mask)
+ if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded)
+ cultist.loc:welded = 0
+ if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked)
+ cultist.loc:locked = 0
+ if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked)
+ cultist.loc:locked = 0
+ for(var/mob/living/carbon/C in users)
+ user.take_overall_damage(dam, 0)
+ C.say("Khari[pick("'","`")]d! Gual'te nikka!")
+ qdel(src)
+ return fizzle(user)
+
+/////////////////////////////////////////NINETEENTH RUNE
+
+/obj/effect/rune/proc/cultsummon(var/mob/living/user)
+ var/list/mob/living/carbon/cultists = new
+ for(var/datum/mind/H in cult.current_antagonists)
+ if (istype(H.current,/mob/living/carbon))
+ cultists+=H.current
+ var/list/mob/living/carbon/users = new
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ users += C
+ if(users.len>=3)
+ var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
+ if(!cultist)
+ return fizzle()
+ if (cultist == user) //just to be sure.
+ return
+ if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
+ user << "You cannot summon \the [cultist], for \his shackles of blood are strong."
+ return fizzle()
+ cultist.loc = src.loc
+ cultist.lying = 1
+ cultist.regenerate_icons()
+
+ var/dam = round(25 / (users.len/2)) //More people around the rune less damage everyone takes. Minimum is 3 cultists
+
+ for(var/mob/living/carbon/human/C in users)
+ if(iscultist(C) && !C.stat)
+ C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!")
+ C.take_overall_damage(dam, 0)
+ if(users.len <= 4) // You did the minimum, this is going to hurt more and we're going to stun you.
+ C.apply_effect(rand(3,6), STUN)
+ C.apply_effect(1, WEAKEN)
+ user.visible_message("Rune disappears with a flash of red light, and in its place now a body lies.", \
+ "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
+ "You hear a pop and smell ozone.")
+ qdel(src)
+ return fizzle(user)
+
+/////////////////////////////////////////TWENTIETH RUNES
+
+/obj/effect/rune/proc/deafen(var/mob/living/user)
+ if(istype(src,/obj/effect/rune))
+ var/list/affected = new()
+ for(var/mob/living/carbon/C in range(7,src))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.ear_deaf += 50
+ C.show_message("The world around you suddenly becomes quiet.", 3)
+ affected += C
+ if(prob(1))
+ C.sdisabilities |= DEAF
+ if(affected.len)
+ user.say("Sti[pick("'","`")] kaliedir!")
+ user << "The world becomes quiet as the deafening rune dissipates into fine dust."
+ admin_attacker_log_many_victims(user, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
+ qdel(src)
+ else
+ return fizzle()
+ else
+ var/list/affected = new()
+ for(var/mob/living/carbon/C in range(7,user))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.ear_deaf += 30
+ //talismans is weaker.
+ C.show_message("The world around you suddenly becomes quiet.", 3)
+ affected += C
+ if(affected.len)
+ user.whisper("Sti[pick("'","`")] kaliedir!")
+ user << "Your talisman turns into gray dust, deafening everyone around."
+ admin_attacker_log_many_victims(user, affected, "Used a deafen rune.", "Was victim of a deafen rune.", "used a deafen rune on")
+ for (var/mob/V in orange(1,src))
+ if(!(iscultist(V)))
+ V.show_message("Dust flows from [user]'s hands for a moment, and the world suddenly becomes quiet..", 3)
+ return
+
+/obj/effect/rune/proc/blind(var/mob/living/user)
+ if(istype(src,/obj/effect/rune))
+ var/list/affected = new()
+ for(var/mob/living/carbon/C in viewers(src))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.eye_blurry += 50
+ C.eye_blind += 20
+ if(prob(5))
+ C.disabilities |= NEARSIGHTED
+ if(prob(10))
+ C.sdisabilities |= BLIND
+ C.show_message("Suddenly you see a red flash that blinds you.", 3)
+ affected += C
+ if(affected.len)
+ user.say("Sti[pick("'","`")] kaliesin!")
+ user << "The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
+ admin_attacker_log_many_victims(user, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
+ qdel(src)
+ else
+ return fizzle(user)
+ else
+ var/list/affected = new()
+ for(var/mob/living/carbon/C in view(2,user))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.eye_blurry += 30
+ C.eye_blind += 10
+ //talismans is weaker.
+ affected += C
+ C.show_message("You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
+ if(affected.len)
+ user.whisper("Sti[pick("'","`")] kaliesin!")
+ user << "Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
+ admin_attacker_log_many_victims(user, affected, "Used a blindness rune.", "Was victim of a blindness rune.", "used a blindness rune on")
+ return
+
+
+/obj/effect/rune/proc/bloodboil(var/mob/living/user) //cultists need at least one DANGEROUS rune. Even if they're all stealthy.
+/*
+ var/list/mob/living/carbon/cultists = new
+ for(var/datum/mind/H in ticker.mode.cult)
+ if (istype(H.current,/mob/living/carbon))
+ cultists+=H.current
+*/
+ var/list/cultists = new //also, wording for it is old wording for obscure rune, which is now hide-see-blood.
+ var/list/victims = new
+// var/list/cultboil = list(cultists-user) //and for this words are destroy-see-blood.
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ cultists+=C
+ if(cultists.len>=3)
+ for(var/mob/living/carbon/M in viewers(user))
+ if(iscultist(M))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in M
+ if(N)
+ continue
+ M.take_overall_damage(51,51)
+ M << "Your blood boils!"
+ victims += M
+ if(prob(5))
+ spawn(5)
+ M.gib()
+ for(var/obj/effect/rune/R in view(src))
+ if(prob(10))
+ explosion(R.loc, -1, 0, 1, 5)
+ for(var/mob/living/carbon/human/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ C.say("Dedo ol[pick("'","`")]btoh!")
+ C.take_overall_damage(15, 0)
+ admin_attacker_log_many_victims(user, victims, "Used a blood boil rune.", "Was the victim of a blood boil rune.", "used a blood boil rune on")
+ log_and_message_admins_many(cultists - user, "assisted activating a blood boil rune.")
+ qdel(src)
+ else
+ return fizzle(user)
+ return
+
+// WIP rune, I'll wait for Rastaf0 to add limited blood.
+
+/obj/effect/rune/proc/burningblood(var/mob/living/user)
+ var/culcount = 0
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ culcount++
+ if(culcount >= 5)
+ for(var/obj/effect/rune/R in rune_list)
+ if(R.blood_DNA == src.blood_DNA)
+ for(var/mob/living/M in orange(2,R))
+ M.take_overall_damage(0,15)
+ if (R.invisibility>M.see_invisible)
+ M << "Aargh it burns!"
+ else
+ M << "Rune suddenly ignites, burning you!"
+ var/turf/T = get_turf(R)
+ T.hotspot_expose(700,125)
+ for(var/obj/effect/decal/cleanable/blood/B in world)
+ if(B.blood_DNA == src.blood_DNA)
+ for(var/mob/living/M in orange(1,B))
+ M.take_overall_damage(0,5)
+ M << "Blood suddenly ignites, burning you!"
+ var/turf/T = get_turf(B)
+ T.hotspot_expose(700,125)
+ qdel(B)
+ qdel(src)
+
+////////// Rune 24 (counting burningblood, which kinda doesnt work yet.)
+
+/obj/effect/rune/proc/runestun(var/mob/living/user, var/mob/living/T as mob)
+ if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
+ user.say("Fuu ma[pick("'","`")]jin!")
+ for(var/mob/living/L in viewers(src))
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ flick("e_flash", C.flash)
+ if(C.stuttering < 1 && (!(HULK in C.mutations)))
+ C.stuttering = 1
+ C.Weaken(1)
+ C.Stun(1)
+ C.show_message("The rune explodes in a bright flash.", 3)
+ admin_attack_log(user, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
+
+ else if(issilicon(L))
+ var/mob/living/silicon/S = L
+ S.Weaken(5)
+ S.show_message("BZZZT... The rune has exploded in a bright flash.", 3)
+ admin_attack_log(user, S, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
+ qdel(src)
+ else ///When invoked as talisman, stun and mute the target mob.
+ user.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
+ var/obj/item/weapon/nullrod/N = locate() in T
+ if(N)
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("[] invokes a talisman at [], but they are unaffected!", user, T), 1)
+ else
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("[] invokes a talisman at []", user, T), 1)
+
+ if(issilicon(T))
+ T.Weaken(15)
+ admin_attack_log(user, T, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
+ else if(iscarbon(T))
+ var/mob/living/carbon/C = T
+ flick("e_flash", C.flash)
+ if (!(HULK in C.mutations))
+ C.silent += 15
+ C.Weaken(25)
+ C.Stun(25)
+ admin_attack_log(user, C, "Used a stun rune.", "Was victim of a stun rune.", "used a stun rune on")
+ return
+
+/////////////////////////////////////////TWENTY-FIFTH RUNE
+
+/obj/effect/rune/proc/armor(var/mob/living/user)
+
+ if(istype(src,/obj/effect/rune))
+ user.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
+ else
+ user.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
+ user.visible_message("The rune disappears with a flash of red light, and a set of armor appears on [user]...", \
+ "You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.")
+
+ if(istype(user, /mob/living/simple_animal/construct))
+ var/mob/living/simple_animal/construct/C = user
+ var/construct_class
+ if(narsie_cometh)
+ construct_class = alert(C, "Please choose which type of construct you wish to become.",,"Juggernaut","Wraith","Harvester")
+ else
+ construct_class = alert(C, "Please choose which type of construct you wish to become.",,"Juggernaut","Wraith","Artificer")
+ switch(construct_class)
+ if("Juggernaut")
+ var/mob/living/simple_animal/construct/armoured/Z = new /mob/living/simple_animal/construct/armoured (get_turf(C.loc))
+ Z.key = C.key
+ if(iscultist(C))
+ cult.add_antagonist(Z.mind)
+ C.death()
+ Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.cancel_camera()
+ if("Wraith")
+ var/mob/living/simple_animal/construct/wraith/Z = new /mob/living/simple_animal/construct/wraith (get_turf(C.loc))
+ Z.key = C.key
+ if(iscultist(C))
+ cult.add_antagonist(Z.mind)
+ C.death()
+ Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.cancel_camera()
+ if("Artificer")
+ var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/builder (get_turf(C.loc))
+ Z.key = C.key
+ if(iscultist(C))
+ cult.add_antagonist(Z.mind)
+ C.death()
+ Z << "You are playing an Artificer. You are incredibly weak and fragile, but you are able to construct fortifications, repair allied constructs (by clicking on them), and even create new constructs"
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.cancel_camera()
+ if("Harvester")
+ var/mob/living/simple_animal/construct/builder/Z = new /mob/living/simple_animal/construct/harvester (get_turf(C.loc))
+ Z.key = C.key
+ if(iscultist(C))
+ cult.add_antagonist(Z.mind)
+ C.death()
+ Z << "You are playing a Harvester. You are gifted with the ability to open doors with your mind, to draw runes at will, and to teleport back to Nar'Sie. Seek out all non-believers and bring them to the Geometer."
+ Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ Z.cancel_camera()
+ else
+ user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head)
+ user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit)
+ user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes)
+ user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ //the above update their overlay icons cache but do not call update_icons()
+ //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache
+ user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor
+
+ qdel(src)
+ return
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 1580d0b7111..cc78995e7a1 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -4,113 +4,113 @@
var/uses = 0
info = "
