From cbc45b3b26b8fc0cf1251c50b77199fa7b738775 Mon Sep 17 00:00:00 2001 From: Alberyk Date: Wed, 2 Aug 2017 13:40:03 -0300 Subject: [PATCH] Cult improvements (#3143) -removes the need for word research -allows nullrods to shatter pylons on hit, to disable forcewalls, close gateways, and turn cult swords in less powerful claymores -allows ghosts to flicks lights if the round is spooky enough -renames some cult items -converts ritual.dm and rune.dm into proper pathing and remove some in world from it -adds a machine that allows people around it to see ghosts, with some side effects -manifested ghosts don't count for nar'sie summoning anymore -manifested ghosts do not use the dummy type anymore, they are their own species with a similar behavior -visible ghosts can now whisper to people and move small objects around -fixes #3145 --- aurorastation.dme | 1 + code/game/antagonist/station/cultist.dm | 25 +- code/game/gamemodes/cult/cult_items.dm | 25 +- code/game/gamemodes/cult/cult_structures.dm | 50 +- code/game/gamemodes/cult/ritual.dm | 555 ++-- code/game/gamemodes/cult/runes.dm | 2266 ++++++++--------- code/game/gamemodes/cult/talisman.dm | 196 +- code/game/machinery/from_beyond.dm | 97 + code/modules/clothing/shoes/miscellaneous.dm | 2 +- code/modules/mob/dead/observer/observer.dm | 65 +- .../carbon/human/species/outsider/skeleton.dm | 41 + .../simple_animal/constructs/soulstone.dm | 4 +- code/modules/power/lighting.dm | 7 +- code/modules/projectiles/projectile/change.dm | 6 +- .../spells/aoe_turf/conjure/forcewall.dm | 10 +- html/changelogs/alberyk-PR-3143.yml | 9 + icons/mob/human_races/r_manifested.dmi | Bin 0 -> 2323 bytes 17 files changed, 1719 insertions(+), 1640 deletions(-) create mode 100644 code/game/machinery/from_beyond.dm create mode 100644 html/changelogs/alberyk-PR-3143.yml create mode 100644 icons/mob/human_races/r_manifested.dmi 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 = "


" - attack_self(mob/living/user as mob) - if(iscultist(user)) - var/delete = 1 - // who the hell thought this was a good idea :( - switch(imbue) - if("newtome") - call(/obj/effect/rune/proc/tomesummon)() - if("armor") - call(/obj/effect/rune/proc/armor)() - if("emp") - call(/obj/effect/rune/proc/emp)(usr.loc,3) - if("conceal") - call(/obj/effect/rune/proc/obscure)(2) - if("revealrunes") - call(/obj/effect/rune/proc/revealrunes)(src) - if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") - call(/obj/effect/rune/proc/teleport)(imbue) - if("communicate") - //If the user cancels the talisman this var will be set to 0 - delete = call(/obj/effect/rune/proc/communicate)() - if("deafen") - call(/obj/effect/rune/proc/deafen)() - if("blind") - call(/obj/effect/rune/proc/blind)() - if("runestun") - user << "To use this talisman, attack your target directly." - return - if("supply") - supply() - user.take_organ_damage(5, 0) - if(src && src.imbue!="supply" && src.imbue!="runestun") - if(delete) - qdel(src) - return - else - user << "You see strange symbols on the paper. Are they supposed to mean something?" - return - - - attack(mob/living/carbon/T as mob, mob/living/user as mob) - if(iscultist(user)) - if(imbue == "runestun") - user.take_organ_damage(5, 0) - call(/obj/effect/rune/proc/runestun)(T) +/obj/item/weapon/paper/talisman/attack_self(mob/living/user as mob) + if(iscultist(user)) + var/delete = 1 + // who the hell thought this was a good idea :( + switch(imbue) + if("newtome") + call(/obj/effect/rune/proc/tomesummon)(user) + if("armor") + call(/obj/effect/rune/proc/armor)(user) + if("emp") + call(/obj/effect/rune/proc/emp)(user, user.loc,3) + if("conceal") + call(/obj/effect/rune/proc/obscure)(user, 2) + if("revealrunes") + call(/obj/effect/rune/proc/revealrunes)(src) + if("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") + call(/obj/effect/rune/proc/teleport)(user, imbue) + if("communicate") + //If the user cancels the talisman this var will be set to 0 + delete = call(/obj/effect/rune/proc/communicate)(user) + if("deafen") + call(/obj/effect/rune/proc/deafen)(user) + if("blind") + call(/obj/effect/rune/proc/blind)(user) + if("runestun") + user << "To use this talisman, attack your target directly." + return + if("supply") + supply() + user.take_organ_damage(5, 0) + if(src && src.imbue!="supply" && src.imbue!="runestun") + if(delete) qdel(src) - else - ..() ///If its some other talisman, use the generic attack code, is this supposed to work this way? - else - ..() + return + else + user << "You see strange symbols on the paper. Are they supposed to mean something?" + return - proc/supply(var/key) - if (!src.uses) +/obj/item/weapon/paper/talisman/attack(mob/living/carbon/T as mob, mob/living/user as mob) + if(iscultist(user)) + if(imbue == "runestun") + user.take_organ_damage(5, 0) + call(/obj/effect/rune/proc/runestun)(T) qdel(src) - return + else + ..() ///If its some other talisman, use the generic attack code, is this supposed to work this way? + else + ..() - var/dat = "There are [src.uses] bloody runes on the parchment.
" - dat += "Please choose the chant to be imbued into the fabric of reality.
" - dat += "
" - dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon a new arcane tome.
" - dat += "Sas'so c'arta forbici! - Allows you to move to a rune with the same last word.
" - dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
" - dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
" - dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
" - dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
" - dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade
" - dat += "Kal om neth - Summons a soul stone
" - dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
" - usr << browse(dat, "window=id_com;size=350x200") + +/obj/item/weapon/paper/talisman/proc/supply(var/key) + if (!src.uses) + qdel(src) return + var/dat = "There are [src.uses] bloody runes on the parchment.
" + dat += "Please choose the chant to be imbued into the fabric of reality.
" + dat += "
" + dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon a new arcane tome.
" + dat += "Sas'so c'arta forbici! - Allows you to move to a rune with the same last word.
" + dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
" + dat += "Kla'atu barada nikt'o! - Allows you to conceal the runes you placed on the floor.
" + dat += "O bidai nabora se'sma! - Allows you to coordinate with others of your cult.
" + dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
" + dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade
" + dat += "Kal om neth - Summons a soul stone
" + dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
" + usr << browse(dat, "window=id_com;size=350x200") + return - Topic(href, href_list) - if(!src) return - if (usr.stat || usr.restrained() || !in_range(src, usr)) return - if (href_list["rune"]) - switch(href_list["rune"]) - if("newtome") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "newtome" - if("teleport") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]" - T.info = "[T.imbue]" - if("emp") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "emp" - if("conceal") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "conceal" - if("communicate") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "communicate" - if("runestun") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "runestun" - if("armor") - var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) - T.imbue = "armor" - if("soulstone") - new /obj/item/device/soulstone(get_turf(usr)) - if("construct") - new /obj/structure/constructshell/cult(get_turf(usr)) - src.uses-- - supply() - return +/obj/item/weapon/paper/talisman/Topic(href, href_list) + if(!src) return + if (usr.stat || usr.restrained() || !in_range(src, usr)) return + + if (href_list["rune"]) + switch(href_list["rune"]) + if("newtome") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "newtome" + if("teleport") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "[pick("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri", "orkan", "allaq")]" + T.info = "[T.imbue]" + if("emp") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "emp" + if("conceal") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "conceal" + if("communicate") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "communicate" + if("runestun") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "runestun" + if("armor") + var/obj/item/weapon/paper/talisman/T = new /obj/item/weapon/paper/talisman(get_turf(usr)) + T.imbue = "armor" + if("soulstone") + new /obj/item/device/soulstone(get_turf(usr)) + if("construct") + new /obj/structure/constructshell/cult(get_turf(usr)) + src.uses-- + supply() + return /obj/item/weapon/paper/talisman/supply diff --git a/code/game/machinery/from_beyond.dm b/code/game/machinery/from_beyond.dm new file mode 100644 index 00000000000..dbbb6a3e9c5 --- /dev/null +++ b/code/game/machinery/from_beyond.dm @@ -0,0 +1,97 @@ +/obj/machinery/from_beyond + name = "resonance wave emissor" + desc = "We see things only as we are constructed to see them." + icon = 'icons/obj/xenoarchaeology.dmi' + icon_state = "ano60" //TODO: get unique sprites for this + + anchored = 0 + density = 1 + + use_power = 1 + + active_power_usage = 1 KILOWATTS + active_power_usage = 10 KILOWATTS + + var/active = FALSE + var/static/list/whispers = list( + "You hear something behind you.", + "Endless eyes gaze upon you from above.", + "All is gone.", + "The light is slowly dying.", + "This world is not yours, who are you?!", + "Blasphemous whispers invade your thoughts.", + "You hear a nasty ripping noise, as if flesh is being torn apart.", + "All hope is lost.", + "The abyss stares back at you.", + "The rats, the rats in the walls!", + "The air is filled with poisonous whispers and cruel truths.", + "The stars are gone, all is void now.", + "He comes...", + "The end is near.", + "You are all alone.", + "You feel like a stranger in a strange land.", + "The world crumbles under your feet.", + "You see worlds that no other living men have seen.", + "There is no escape..." + ) + +/obj/machinery/from_beyond/attack_hand(var/mob/living/carbon/human/user as mob) + + if(!active) + src.visible_message("[user] switches \the [src] on.") + user << "The world beyond opens to your eyes." + active = TRUE + + else + src.visible_message("[user] switches \the [src] off.") + user << "The world beyond vanishes before your eyes." + active = FALSE + + update_icon() + +/obj/machinery/from_beyond/update_icon() + if(!(stat & NOPOWER)) + icon_state = "ano60" + + if(active) + icon_state = "ano61" + + else + icon_state = "ano60" + +/obj/machinery/from_beyond/machinery_process() + ..() + if(active) + + if(prob(25)) + for(var/obj/machinery/light/P in view(7, src)) + P.flicker(1) + + for(var/mob/living/carbon/human/L in view(7, src)) + L.see_invisible = SEE_INVISIBLE_CULT + if(prob(15)) + var/message = pick(whispers) + L << "[message]" + L.hallucination += 50 + L.adjustBrainLoss(5) + + if(prob(15)) + src.visible_message("\The [src] hums ominously.") + + if(prob(5)) + src.visible_message("\The [src] crackles with energy!") + playsound(src, 'sound/magic/lightningbolt.ogg', 40, 1) + + if(prob(1)) + L << "Reality feels less stable..." + src.visible_message("\The [src] screeches loudly!") + playsound(src, 'sound/magic/Summon_Karp.ogg', 40, 1) + new /obj/effect/gateway/active/rift(src.loc) + + +/obj/effect/gateway/active/rift + name = "interdimensional rift" + icon = 'icons/obj/wizard.dmi' + icon_state = "rift" + light_range= 5 + light_color="#E260F4" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 5640a17161f..9defcc1bb0f 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -75,7 +75,7 @@ /obj/item/clothing/shoes/cult name = "boots" - desc = "A pair of boots worn by the followers of Nar-Sie." + desc = "A ragged, dusty pair of boots." icon_state = "cult" item_state = "cult" force = 5 diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 0f45435cc85..a6f892754eb 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -1,6 +1,10 @@ var/global/list/image/ghost_darkness_images = list() //this is a list of images for things ghosts should still be able to see when they toggle darkness var/global/list/image/ghost_sightless_images = list() //this is a list of images for things ghosts should still be able to see even without ghost sight +/mob/dead + var/is_manifest = 0 + var/ghost_cooldown = 0 + /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -702,10 +706,12 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return 1 /mob/dead/proc/manifest(mob/user) - var/is_manifest = 0 + is_manifest = 0 if(!is_manifest) is_manifest = 1 verbs += /mob/dead/proc/toggle_visibility + verbs += /mob/dead/proc/ghost_whisper + verbs += /mob/dead/proc/move_item if(src.invisibility != 0) user.visible_message( \ @@ -719,6 +725,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp "You get the feeling that the ghost can't become any more visible." \ ) + /mob/dead/proc/toggle_icon(var/icon) if(!client) return @@ -754,6 +761,62 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp // Give the ghost a cult icon which should be visible only to itself toggle_icon("cult") +/mob/dead/proc/ghost_whisper() + set category = "Ghost" + set name = "Spectral Whisper" + + if(is_manifest) //Only able to whisper if it's hit with a tome. + var/list/options = list() + for(var/mob/living/Ms in view(src)) + options += Ms + var/mob/living/M = input(src, "Select who to whisper to:", "Whisper to?", null) as null|mob in options + if(!M) + return 0 + var/msg = sanitize(input(src, "Message:", "Spectral Whisper") as text|null) + if(msg) + log_say("SpectralWhisper: [key_name(usr)]->[M.key] : [msg]") + M << " You hear a strange, unidentifiable voice in your head... [msg]" + src << " You said: '[msg]' to [M]." + else + return + return 1 + else + src << "You have not been pulled past the veil!" + +/mob/dead/proc/move_item() + set category = "Ghost" + set name = "Move item" + set desc = "Move a small item to where you are." + + if(ghost_cooldown > world.time) + return + + if(!is_manifest) + return + + var/turf/T = get_turf(src) + + var/list/obj/item/choices = list() + for(var/obj/item/I in range(1)) + if(I.w_class <= 2) + choices += I + + if(!choices.len) + to_chat(src, "There are no suitable items nearby.") + return + + var/obj/item/choice = input(src, "What item would you like to pull?") as null|anything in choices + if(!choice || !(choice in range(1)) || choice.w_class > 2) + return + + if(!is_manifest) + return + + if(step_to(choice, T)) + choice.visible_message("\The [choice] suddenly moves!") + + ghost_cooldown = world.time + 500 + /mob/dead/observer/verb/toggle_anonsay() set category = "Ghost" set name = "Toggle Anonymous Chat" diff --git a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm index ce79c3f7afe..086dc8e37dc 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/skeleton.dm @@ -39,6 +39,8 @@ blood_color = "#CCCCCC" flesh_color = "#AAAAAA" + remains_type = /obj/effect/decal/cleanable/ash + death_message = "collapses, their bones clattering in a symphony of demise." death_sound = 'sound/effects/falling_bones.ogg' @@ -66,3 +68,42 @@ stamina_recovery = 1 sprint_speed_factor = 0.3 exhaust_threshold = 0 //No oxyloss, so zero threshold + +/mob/living/carbon/human/apparition/Initialize(mapload) + . = ..(mapload, "Apparition") + +/datum/species/apparition + name = "Apparition" + name_plural = "apparitions" + bodytype = "Apparition" + icobase = 'icons/mob/human_races/r_manifested.dmi' + deform = 'icons/mob/human_races/r_manifested.dmi' + + default_language = "Ceti Basic" + language = "Cult" + name_language = "Cult" + has_organ = list() + + virus_immune = 1 + + rarity_value = 10 + blurb = "Apparitions are vengeful spirits, they are given temporary bodies to fulfill the wicked \ + desires of their masters. A common sight among the ranks of the geometer of blood." + + remains_type = /obj/effect/decal/cleanable/ash + + flesh_color = "#551A8B" + + flags = NO_BLOOD | NO_SCAN | NO_SLIP | NO_POISON | NO_PAIN | NO_BREATHE | NO_MINOR_CUT + spawn_flags = IS_RESTRICTED + + stamina = 500 //Tireless automatons + stamina_recovery = 1 + sprint_speed_factor = 0.3 + exhaust_threshold = 0 //No oxyloss, so zero threshold + +/datum/species/apparition/handle_death(var/mob/living/carbon/human/H) + set waitfor = 0 + sleep(1) + new /obj/effect/decal/cleanable/ash(H.loc) + qdel(H) diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 6ae4fa34f50..0e3b2179fcc 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -17,7 +17,7 @@ /obj/item/device/soulstone/attack(mob/living/carbon/human/M as mob, mob/user as mob) if(!istype(M, /mob/living/carbon/human))//If target is not a human. return ..() - if(istype(M, /mob/living/carbon/human/dummy)) + if(istype(M, /mob/living/carbon/human/apparition)) return..() if(M.has_brain_worms()) //Borer stuff - RR @@ -119,7 +119,7 @@ var/obj/effect/decal/remains/remains = T.species.remains_type //spawns a skeleton based on the species remain type new remains(T.loc) - + T.invisibility = 101 var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc ) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 974f760612c..649b78de121 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -424,7 +424,7 @@ set waitfor = FALSE if (flickering || !on || status != LIGHT_OK) return - + flickering = TRUE var/offset = 1 var/thecallback = CALLBACK(src, .proc/handle_flicker) @@ -540,6 +540,11 @@ status = LIGHT_EMPTY update() +/obj/machinery/light/attack_ghost(mob/user) + if(round_is_spooky()) + flicker(rand(2,5)) + else return ..() + // break the light and make sparks if was on /obj/machinery/light/proc/broken(var/skip_sound_and_sparks = 0) diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index c643e94dcc4..d310bb7b23c 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -16,6 +16,10 @@ if(M.has_brain_worms()) return //Borer stuff - RR + if(istype(M, /mob/living/carbon/human/apparition)) + visible_message("\The [src] doesn't seem to affect [M] in any way.") + return + if(istype(M, /mob/living/silicon/robot)) var/mob/living/silicon/robot/Robot = M if(Robot.mmi) @@ -94,4 +98,4 @@ return else M << "Your form morphs into that of \a [lowertext(randomize)]." - return \ No newline at end of file + return diff --git a/code/modules/spells/aoe_turf/conjure/forcewall.dm b/code/modules/spells/aoe_turf/conjure/forcewall.dm index 1d724c3817f..55f2ddf57b0 100644 --- a/code/modules/spells/aoe_turf/conjure/forcewall.dm +++ b/code/modules/spells/aoe_turf/conjure/forcewall.dm @@ -9,7 +9,7 @@ range = 0 cast_sound = null cast_sound = 'sound/magic/ForceWall.ogg' - + hud_state = "wiz_shield" /spell/aoe_turf/conjure/forcewall/mime @@ -28,7 +28,7 @@ /obj/effect/forcefield desc = "A space wizard's magic wall." - name = "FORCEWALL" + name = "forcewall" icon = 'icons/effects/effects.dmi' icon_state = "m_shield" anchored = 1.0 @@ -43,6 +43,12 @@ Proj.on_hit(M,M.bullet_act(Proj, def_zone)) return +/obj/effect/forcefield/attackby(var/obj/item/I, var/mob/user) + ..() + if(istype(I, /obj/item/weapon/nullrod)) + to_chat(user, "\the [src] dissipates at the touch of the \the [I].") + qdel(src) + /obj/effect/forcefield/mime icon_state = "empty" name = "invisible wall" diff --git a/html/changelogs/alberyk-PR-3143.yml b/html/changelogs/alberyk-PR-3143.yml new file mode 100644 index 00000000000..478f648fcff --- /dev/null +++ b/html/changelogs/alberyk-PR-3143.yml @@ -0,0 +1,9 @@ +author: Alberyk + +delete-after: True + +changes: + - rscdel: "Removed cult word research, cultists can use their runes without having to find out the meanings." + - rscadd: "Ghosts have more influence upon the material plane during cult rounds." + - tweak: "Manifested ghosts can't be used to summon Nar'sie anymore." + - tweak: "The null is more powerful against the forces of the paranormal now." diff --git a/icons/mob/human_races/r_manifested.dmi b/icons/mob/human_races/r_manifested.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d70d40727c5fadabb27fad1c246fbbda80c6b072 GIT binary patch literal 2323 zcmZXUdpHy98^=fUDk>|apF>8&YB?1NWy|JNa#+eDgiNY;OG7102d8SzWO9~L88)ZQ zY0MnLMv5GI6XlS^>wMVhw|f72f4}Ftp69;q`?>D#{dw-|x}P{F2b&!-$}#`|V27P8 z3Jm~AfW;fIb&EIxS#W=xVO~v_{?QN~(lqVf6jScm6HPw~u78b3%l-<(Y z+|<~_Y^Y_>UlnFmRZuG{sMVDf4RqRvo-Xd&*7{mHy{3v@U0GRL#A;$zSJD{tnzmLp ztASou%c!rbtz*zznwyx74Xoy-R(4BGRRy!QvW?wBqZD_wu~4>_ZO!$j$B(r()m4`k z`v3qb0Dv0{#eA#2>80c~8@Wcp`@Ki7I1 zuQ@axDvC|1EndRux0+|FPEH1;Y7R~#KWC!gylM z0>^X0k^6giOm{uLmI+R#3PdUDA7`1FyC7bXSx(WJXFa!ZC~|V8o$X~+ zP-DlN2W&=O1`MAs>GH|4(AgSvF~49u4rtbAvEU*ZXpGL2$5CB1?uE$jz$z;*1%-SC zYL+^Hip^eQoyl>)&>^ASM;+PA)-tHKRXQpsZHD1LH)&76TNN0PyOuxSeC;6@WM0v% zvH{j++JZ|T`6~6KzX$+DUOwv3Gm?voE8b6&3MiG0Wf^R4em$`iKX}9D7)YKUwQdzF&1%vQi+S z@{oZ2f<~cq`@xCqJ{8T{W~B1Jcz!z=-S->#^vB-&_kughuk5s28-31J&#>y!K9DxfKlQ!)9$h3aY)yBMWGaQ4^eV*c@*?p!Cm1tGyyw65%B zjYMc7;~dCV^`tJa_Ts(&t(cMcCB|epVlvxbMB?9}$;e*T6sjsuit?>s3cN5_SglrL z+_LUf{kZlRgsf7B_BNMxsbqo4!uk=yt!r1)9Kq+FjhItelnZo(?v!Gz`-Qx8jo#N% zZp-{*gJ3J)sU~w8Rf0AxJ!^1pZhroOFMmhH7md1W#T05_k1w%8Oy zyQ2=p!;eL@&mpHtuFm9aZ@nnCL^syo(tm_K-UFAt5HicEICNs)C!1ThAzCD`&R;%y z$M26XOeqxy#%IgwxfBP@r4jt>^BnU5xtfwz<7FrFdeq@DQfRAI^OFdxA_8l}_YJ7y zl%$7wJJ;j1M$T59)MP%3w+?7l7~dPflE z-;jQEG=~Tc6JibtC4sNqaIl@X=EX_$EpIns*z2+&+g*105X`QmNEstuoK6_yMMdLeu4>(!_lk8}}gLD1C$e?!NZ5 z59>oKf&3`uL-_1FS5EilHTna^BhT<-i}+|VtWyzQhtN_vIyQfPS>Vkag@?(>mREFN zw>$yy&lsA6y7Fg*Du+1<)}6NmAysv#66wj7!yGjn7D(WZ$wyuq~Gf3 zbwpmh@Y#xN>JYIa;@)8%zPdbvJHuoE`}ihG5`2??CQWtdwALp6XqjVy$okGiD}cJl zsu|HZ3$GA1ORm{6#9YzMxO|!)c0xp3x~Wey{Sf`wtyr z^v=+#3s`|q#m*=`1NU`>lPe$GSH|0!X{o`SFvVta|HNqg>VBkgN|5mU>JoELp5rPX zeqh00=O>>sF{OS=2|B^2$acU}gM