Advertisement
Guest User

Untitled

a guest
Nov 25th, 2017
134
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 40.55 KB | None | 0 0
  1. GLOBAL_LIST_EMPTY(sacrificed) //a mixed list of minds and mobs
  2. GLOBAL_LIST(rune_types) //Every rune that can be drawn by tomes
  3. GLOBAL_LIST_EMPTY(teleport_runes)
  4. GLOBAL_LIST_EMPTY(wall_runes)
  5. /*
  6.  
  7. This file contains runes.
  8. Runes are used by the cult to cause many different effects and are paramount to their success.
  9. They are drawn with an arcane tome in blood, and are distinguishable to cultists and normal crew by examining.
  10. Fake runes can be drawn in crayon to fool people.
  11. Runes can either be invoked by one's self or with many different cultists. Each rune has a specific incantation that the cultists will say when invoking it.
  12.  
  13. To draw a rune, use an arcane tome.
  14.  
  15. */
  16.  
  17. /obj/effect/rune
  18. name = "rune"
  19. var/cultist_name = "basic rune"
  20. desc = "An odd collection of symbols drawn in what seems to be blood."
  21. var/cultist_desc = "a basic rune with no function." //This is shown to cultists who examine the rune in order to determine its true purpose.
  22. anchored = TRUE
  23. icon = 'icons/obj/rune.dmi'
  24. icon_state = "1"
  25. resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
  26. layer = LOW_OBJ_LAYER
  27. color = RUNE_COLOR_RED
  28.  
  29. var/invocation = "Aiy ele-mayo!" //This is said by cultists when the rune is invoked.
  30. var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it.
  31. var/req_cultists_text //if we have a description override for required cultists to invoke
  32. var/rune_in_use = FALSE // Used for some runes, this is for when you want a rune to not be usable when in use.
  33. var/scribe_delay = 50 //how long the rune takes to create
  34. var/scribe_damage = 0.1 //how much damage you take doing it
  35.  
  36. var/allow_excess_invokers = FALSE //if we allow excess invokers when being invoked
  37. var/invoke_damage = 0 //how much damage invokers take when invoking it
  38. var/construct_invoke = TRUE //if constructs can invoke it
  39.  
  40. var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
  41. var/keyword //The actual keyword for the rune
  42.  
  43. /obj/effect/rune/Initialize(mapload, set_keyword)
  44. . = ..()
  45. if(set_keyword)
  46. keyword = set_keyword
  47.  
  48. /obj/effect/rune/examine(mob/user)
  49. ..()
  50. if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
  51. to_chat(user, "<b>Name:</b> [cultist_name]")
  52. to_chat(user, "<b>Effects:</b> [capitalize(cultist_desc)]")
  53. to_chat(user, "<b>Required Acolytes:</b> [req_cultists_text ? "[req_cultists_text]":"[req_cultists]"]")
  54. if(req_keyword && keyword)
  55. to_chat(user, "<b>Keyword:</b> [keyword]")
  56.  
  57. /obj/effect/rune/attackby(obj/I, mob/user, params)
  58. if(istype(I, /obj/item/tome) && iscultist(user))
  59. to_chat(user, "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>")
  60. qdel(src)
  61. else if(istype(I, /obj/item/nullrod))
  62. user.say("BEGONE FOUL MAGIKS!!")
  63. to_chat(user, "<span class='danger'>You disrupt the magic of [src] with [I].</span>")
  64. qdel(src)
  65.  
  66. /obj/effect/rune/attack_hand(mob/living/user)
  67. if(!iscultist(user))
  68. to_chat(user, "<span class='warning'>You aren't able to understand the words of [src].</span>")
  69. return
  70. var/list/invokers = can_invoke(user)
  71. if(invokers.len >= req_cultists)
  72. invoke(invokers)
  73. else
  74. fail_invoke()
  75.  
  76. /obj/effect/rune/attack_animal(mob/living/simple_animal/M)
  77. if(istype(M, /mob/living/simple_animal/shade) || istype(M, /mob/living/simple_animal/hostile/construct))
  78. if(construct_invoke || !iscultist(M)) //if you're not a cult construct we want the normal fail message
  79. attack_hand(M)
  80. else
  81. to_chat(M, "<span class='warning'>You are unable to invoke the rune!</span>")
  82.  
  83. /obj/effect/rune/proc/talismanhide() //for talisman of revealing/hiding
  84. visible_message("<span class='danger'>[src] fades away.</span>")
  85. invisibility = INVISIBILITY_OBSERVER
  86. alpha = 100 //To help ghosts distinguish hidden runes
  87.  
  88. /obj/effect/rune/proc/talismanreveal() //for talisman of revealing/hiding
  89. invisibility = 0
  90. visible_message("<span class='danger'>[src] suddenly appears!</span>")
  91. alpha = initial(alpha)
  92.  
  93. /*
  94.  
  95. There are a few different procs each rune runs through when a cultist activates it.
  96. can_invoke() is called when a cultist activates the rune with an empty hand. If there are multiple cultists, this rune determines if the required amount is nearby.
  97. invoke() is the rune's actual effects.
  98. fail_invoke() is called when the rune fails, via not enough people around or otherwise. Typically this just has a generic 'fizzle' effect.
  99. structure_check() searches for nearby cultist structures required for the invocation. Proper structures are pylons, forges, archives, and altars.
  100.  
  101. */
  102.  
  103. /obj/effect/rune/proc/can_invoke(var/mob/living/user=null)
  104. //This proc determines if the rune can be invoked at the time. If there are multiple required cultists, it will find all nearby cultists.
  105. var/list/invokers = list() //people eligible to invoke the rune
  106. var/list/chanters = list() //people who will actually chant the rune when passed to invoke()
  107. if(user)
  108. chanters += user
  109. invokers += user
  110. if(req_cultists > 1 || allow_excess_invokers)
  111. for(var/mob/living/L in range(1, src))
  112. if(iscultist(L))
  113. if(L == user)
  114. continue
  115. if(ishuman(L))
  116. var/mob/living/carbon/human/H = L
  117. if((H.disabilities & MUTE) || H.silent)
  118. continue
  119. if(L.stat)
  120. continue
  121. invokers += L
  122. if(invokers.len >= req_cultists)
  123. invokers -= user
  124. if(allow_excess_invokers)
  125. chanters += invokers
  126. else
  127. shuffle_inplace(invokers)
  128. for(var/i in 1 to req_cultists)
  129. var/L = pick_n_take(invokers)
  130. if(L)
  131. chanters += L
  132. return chanters
  133.  
  134. /obj/effect/rune/proc/invoke(var/list/invokers)
  135. //This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here.
  136. for(var/M in invokers)
  137. var/mob/living/L = M
  138. if(invocation)
  139. L.say(invocation, language = /datum/language/common, ignore_spam = TRUE)
  140. if(invoke_damage)
  141. L.apply_damage(invoke_damage, BRUTE)
  142. to_chat(L, "<span class='cultitalic'>[src] saps your strength!</span>")
  143. do_invoke_glow()
  144.  
  145. /obj/effect/rune/proc/do_invoke_glow()
  146. set waitfor = FALSE
  147. var/oldtransform = transform
  148. animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out
  149. sleep(5)
  150. animate(src, transform = oldtransform, alpha = 255, time = 0)
  151.  
  152. /obj/effect/rune/proc/fail_invoke()
  153. //This proc contains the effects of a rune if it is not invoked correctly, through either invalid wording or not enough cultists. By default, it's just a basic fizzle.
  154. visible_message("<span class='warning'>The markings pulse with a small flash of red light, then fall dark.</span>")
  155. var/oldcolor = color
  156. color = rgb(255, 0, 0)
  157. animate(src, color = oldcolor, time = 5)
  158. addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
  159.  
  160. //Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user.
  161. /obj/effect/rune/malformed
  162. cultist_name = "malformed rune"
  163. cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this."
  164. invocation = "Ra'sha yoka!"
  165. invoke_damage = 30
  166.  
  167. /obj/effect/rune/malformed/Initialize(mapload, set_keyword)
  168. . = ..()
  169. icon_state = "[rand(1,7)]"
  170. color = rgb(rand(0,255), rand(0,255), rand(0,255))
  171.  
  172. /obj/effect/rune/malformed/invoke(var/list/invokers)
  173. ..()
  174. qdel(src)
  175.  
  176. /mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
  177. var/obj/item/nullrod/N = locate() in src
  178. if(N && !GLOB.ratvar_awakens) //If Nar-Sie or Ratvar are alive, null rods won't protect you
  179. return N
  180. return 0
  181.  
  182. /mob/proc/bible_check() //The bible, if held, might protect against certain things
  183. var/obj/item/storage/book/bible/B = locate() in src
  184. if(is_holding(B))
  185. return B
  186. return 0
  187.  
  188. //Rite of Binding: A paper on top of the rune to a talisman.
  189. /obj/effect/rune/imbue
  190. cultist_name = "Create Talisman"
  191. cultist_desc = "transforms paper into powerful magic talismans."
  192. invocation = "H'drak v'loso, mir'kanas verbot!"
  193. icon_state = "3"
  194. color = RUNE_COLOR_TALISMAN
  195.  
  196. /obj/effect/rune/imbue/invoke(var/list/invokers)
  197. var/mob/living/user = invokers[1] //the first invoker is always the user
  198. var/list/papers_on_rune = checkpapers()
  199. var/entered_talisman_name
  200. var/obj/item/paper/talisman/talisman_type
  201. var/list/possible_talismans = list()
  202. if(!papers_on_rune.len)
  203. to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
  204. fail_invoke()
  205. log_game("Talisman Creation rune failed - no blank papers on rune")
  206. return
  207. if(rune_in_use)
  208. to_chat(user, "<span class='cultitalic'>[src] can only support one ritual at a time!</span>")
  209. fail_invoke()
  210. log_game("Talisman Creation rune failed - already in use")
  211. return
  212.  
  213. for(var/I in subtypesof(/obj/item/paper/talisman) - /obj/item/paper/talisman/malformed - /obj/item/paper/talisman/supply - /obj/item/paper/talisman/supply/weak - /obj/item/paper/talisman/summon_tome)
  214. var/obj/item/paper/talisman/J = I
  215. var/talisman_cult_name = initial(J.cultist_name)
  216. if(talisman_cult_name)
  217. possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name
  218. entered_talisman_name = input(user, "Choose a talisman to imbue.", "Talisman Choices") as null|anything in possible_talismans
  219. talisman_type = possible_talismans[entered_talisman_name]
  220. if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated() || rune_in_use || !talisman_type)
  221. return
  222. papers_on_rune = checkpapers()
  223. if(!papers_on_rune.len)
  224. to_chat(user, "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>")
  225. fail_invoke()
  226. log_game("Talisman Creation rune failed - no blank papers on rune")
  227. return
  228. var/obj/item/paper/paper_to_imbue = papers_on_rune[1]
  229. ..()
  230. visible_message("<span class='warning'>Dark power begins to channel into the paper!</span>")
  231. rune_in_use = TRUE
  232. if(do_after(user, initial(talisman_type.creation_time), target = paper_to_imbue))
  233. new talisman_type(get_turf(src))
  234. visible_message("<span class='warning'>[src] glows with power, and bloody images form themselves on [paper_to_imbue].</span>")
  235. qdel(paper_to_imbue)
  236. rune_in_use = FALSE
  237.  
  238. /obj/effect/rune/imbue/proc/checkpapers()
  239. . = list()
  240. for(var/obj/item/paper/P in get_turf(src))
  241. if(!P.info && !istype(P, /obj/item/paper/talisman))
  242. . |= P
  243.  
  244. /obj/effect/rune/teleport
  245. cultist_name = "Teleport"
  246. cultist_desc = "warps everything above it to another chosen teleport rune."
  247. invocation = "Sas'so c'arta forbici!"
  248. icon_state = "2"
  249. color = RUNE_COLOR_TELEPORT
  250. req_keyword = TRUE
  251. var/listkey
  252.  
  253. /obj/effect/dummy/tele_in
  254. name = "teleport_in"
  255. icon = 'icons/effects/cult_effects.dmi'
  256. icon_state = "cultin2"
  257. proc/end_effect()
  258. del src
  259.  
  260. /obj/effect/dummy/tele_out
  261. name = "teleport_out"
  262. icon = 'icons/effects/cult_effects.dmi'
  263. icon_state = "cultout2"
  264. proc/end_effect()
  265. del src
  266.  
  267.  
  268. /obj/effect/rune/teleport/Initialize(mapload, set_keyword)
  269. . = ..()
  270. var/area/A = get_area(src)
  271. var/locname = initial(A.name)
  272. listkey = set_keyword ? "[set_keyword] [locname]":"[locname]"
  273. GLOB.teleport_runes += src
  274.  
  275. /obj/effect/rune/teleport/Destroy()
  276. GLOB.teleport_runes -= src
  277. return ..()
  278.  
  279. /obj/effect/rune/teleport/invoke(var/list/invokers)
  280. var/mob/living/user = invokers[1] //the first invoker is always the user
  281. var/list/potential_runes = list()
  282. var/list/teleportnames = list()
  283. for(var/R in GLOB.teleport_runes)
  284. var/obj/effect/rune/teleport/T = R
  285. if(T != src && (T.z <= ZLEVEL_SPACEMAX))
  286. potential_runes[avoid_assoc_duplicate_keys(T.listkey, teleportnames)] = T
  287.  
  288. if(!potential_runes.len)
  289. to_chat(user, "<span class='warning'>There are no valid runes to teleport to!</span>")
  290. log_game("Teleport rune failed - no other teleport runes")
  291. fail_invoke()
  292. return
  293.  
  294. if(user.z > ZLEVEL_SPACEMAX)
  295. to_chat(user, "<span class='cultitalic'>You are not in the right dimension!</span>")
  296. log_game("Teleport rune failed - user in away mission")
  297. fail_invoke()
  298. return
  299.  
  300. var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked
  301. var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to?
  302. if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated() || !actual_selected_rune)
  303. fail_invoke()
  304. return
  305.  
  306. var/turf/T = get_turf(src)
  307. var/turf/target = get_turf(actual_selected_rune)
  308.  
  309. if(is_blocked_turf(target, TRUE))
  310. to_chat(user, "<span class='warning'>The target rune is blocked. Attempting to teleport to it would be massively unwise.</span>")
  311. fail_invoke()
  312. return
  313. var/movedsomething = FALSE
  314. var/moveuserlater = FALSE
  315. for(var/atom/movable/A in T)
  316. if(A == user)
  317. moveuserlater = TRUE
  318. movedsomething = TRUE
  319. continue
  320. if(!A.anchored)
  321. movedsomething = TRUE
  322. A.forceMove(target)
  323. usr.invisibility = 100
  324. usr.canmove = 0
  325. new /obj/effect/dummy/tele_out(target)
  326. new /obj/effect/dummy/tele_in(T)
  327. sleep(10)
  328. usr.invisibility = 0
  329. usr.canmove = 1
  330. var/obj/effect/dummy/tele_in/I = new(T)
  331. var/obj/effect/dummy/tele_in/ID = new(T)
  332. var/obj/effect/dummy/tele_out/O = new(target)
  333. var/obj/effect/dummy/tele_out/OD = new(target)
  334. I.end_effect()
  335. O.end_effect()
  336. ID.end_effect()
  337. OD.end_effect()
  338.  
  339.  
  340.  
  341. if(movedsomething)
  342. ..()
  343. visible_message("<span class='warning'>There is a sharp crack of inrushing air, and everything above the rune disappears!</span>", null, "<i>You hear a sharp crack.</i>")
  344. to_chat(user, "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>")
  345. if(moveuserlater)
  346. user.forceMove(target)
  347. target.visible_message("<span class='warning'>There is a boom of outrushing air as something appears above the rune!</span>", null, "<i>You hear a boom.</i>")
  348. else
  349. fail_invoke()
  350.  
  351.  
  352. //Rite of Offering: Converts or sacrifices a target.
  353. /obj/effect/rune/convert
  354. cultist_name = "Offer"
  355. cultist_desc = "offers a noncultist above it to Nar-Sie, either converting them or sacrificing them."
  356. req_cultists_text = "2 for conversion, 3 for living sacrifices and sacrifice targets."
  357. invocation = "Mah'weyh pleggh at e'ntrath!"
  358. icon_state = "3"
  359. color = RUNE_COLOR_OFFER
  360. req_cultists = 1
  361. allow_excess_invokers = TRUE
  362. rune_in_use = FALSE
  363.  
  364. /obj/effect/rune/convert/do_invoke_glow()
  365. return
  366.  
  367. /obj/effect/rune/convert/invoke(var/list/invokers)
  368. if(rune_in_use)
  369. return
  370. var/list/myriad_targets = list()
  371. var/turf/T = get_turf(src)
  372. for(var/mob/living/M in T)
  373. if(!iscultist(M))
  374. myriad_targets |= M
  375. if(!myriad_targets.len)
  376. fail_invoke()
  377. log_game("Offer rune failed - no eligible targets")
  378. return
  379. rune_in_use = TRUE
  380. visible_message("<span class='warning'>[src] pulses blood red!</span>")
  381. var/oldcolor = color
  382. color = RUNE_COLOR_DARKRED
  383. var/mob/living/L = pick(myriad_targets)
  384. var/is_clock = is_servant_of_ratvar(L)
  385. var/is_convertable = is_convertable_to_cult(L)
  386. if(L.stat != DEAD && (is_clock || is_convertable))
  387. invocation = "Mah'weyh pleggh at e'ntrath!"
  388. ..()
  389. if(is_clock)
  390. L.visible_message("<span class='warning'>[L]'s eyes glow a defiant yellow!</span>", \
  391. "<span class='cultlarge'>\"Stop resisting. You <i>will</i> be mi-\"</span>\n\
  392. <span class='large_brass'>\"Give up and you will feel pain unlike anything you've ever felt!\"</span>")
  393. L.Knockdown(80)
  394. else if(is_convertable)
  395. do_convert(L, invokers)
  396. else
  397. invocation = "Barhah hra zar'garis!"
  398. ..()
  399. do_sacrifice(L, invokers)
  400. animate(src, color = oldcolor, time = 5)
  401. addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 5)
  402. rune_in_use = FALSE
  403.  
  404. /obj/effect/rune/convert/proc/do_convert(mob/living/convertee, list/invokers)
  405. if(invokers.len < 2)
  406. for(var/M in invokers)
  407. to_chat(M, "<span class='warning'>You need more invokers to convert [convertee]!</span>")
  408. log_game("Offer rune failed - tried conversion with one invoker")
  409. return 0
  410. if(convertee.null_rod_check())
  411. for(var/M in invokers)
  412. to_chat(M, "<span class='warning'>Something is shielding [convertee]'s mind!</span>")
  413. log_game("Offer rune failed - convertee had null rod")
  414. return 0
  415. var/brutedamage = convertee.getBruteLoss()
  416. var/burndamage = convertee.getFireLoss()
  417. if(brutedamage || burndamage)
  418. convertee.adjustBruteLoss(-(brutedamage * 0.75))
  419. convertee.adjustFireLoss(-(burndamage * 0.75))
  420. convertee.visible_message("<span class='warning'>[convertee] writhes in pain \
  421. [brutedamage || burndamage ? "even as [convertee.p_their()] wounds heal and close" : "as the markings below [convertee.p_them()] glow a bloody red"]!</span>", \
  422. "<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
  423. SSticker.mode.add_cultist(convertee.mind, 1)
  424. new /obj/item/tome(get_turf(src))
  425. convertee.mind.special_role = "Cultist"
  426. to_chat(convertee, "<span class='cultitalic'><b>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 \
  427. and something evil takes root.</b></span>")
  428. to_chat(convertee, "<span class='cultitalic'><b>Assist your new compatriots in their dark dealings. Your goal is theirs, and theirs is yours. You serve the Geometer above all else. Bring it back.\
  429. </b></span>")
  430. return 1
  431.  
  432. /obj/effect/rune/convert/proc/do_sacrifice(mob/living/sacrificial, list/invokers)
  433. var/big_sac = FALSE
  434. if((((ishuman(sacrificial) || iscyborg(sacrificial)) && sacrificial.stat != DEAD) || is_sacrifice_target(sacrificial.mind)) && invokers.len < 3)
  435. for(var/M in invokers)
  436. to_chat(M, "<span class='cultitalic'>[sacrificial] is too greatly linked to the world! You need three acolytes!</span>")
  437. log_game("Offer rune failed - not enough acolytes and target is living or sac target")
  438. return FALSE
  439. if(sacrificial.mind)
  440. GLOB.sacrificed += sacrificial.mind
  441. if(is_sacrifice_target(sacrificial.mind))
  442. GLOB.sac_complete = TRUE
  443. big_sac = TRUE
  444. else
  445. GLOB.sacrificed += sacrificial
  446.  
  447. new /obj/effect/temp_visual/cult/sac(get_turf(src))
  448. for(var/M in invokers)
  449. if(big_sac)
  450. to_chat(M, "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>")
  451. else
  452. if(ishuman(sacrificial) || iscyborg(sacrificial))
  453. to_chat(M, "<span class='cultlarge'>\"I accept this sacrifice.\"</span>")
  454. else
  455. to_chat(M, "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>")
  456.  
  457. var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
  458. if(sacrificial.mind)
  459. stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
  460. stone.transfer_soul("FORCE", sacrificial, usr)
  461. stone.invisibility = 0
  462.  
  463. if(sacrificial)
  464. if(iscyborg(sacrificial))
  465. playsound(sacrificial, 'sound/magic/disable_tech.ogg', 100, 1)
  466. sacrificial.dust() //To prevent the MMI from remaining
  467. else
  468. playsound(sacrificial, 'sound/magic/disintegrate.ogg', 100, 1)
  469. sacrificial.gib()
  470. return TRUE
  471.  
  472. //Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
  473. /obj/effect/rune/narsie
  474. cultist_name = "Summon Nar-Sie"
  475. cultist_desc = "tears apart dimensional barriers, calling forth the Geometer. Requires 9 invokers."
  476. invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!"
  477. req_cultists = 9
  478. icon = 'icons/effects/96x96.dmi'
  479. color = RUNE_COLOR_DARKRED
  480. icon_state = "rune_large"
  481. pixel_x = -32 //So the big ol' 96x96 sprite shows up right
  482. pixel_y = -32
  483. scribe_delay = 500 //how long the rune takes to create
  484. scribe_damage = 40.1 //how much damage you take doing it
  485. var/used = FALSE
  486.  
  487. /obj/effect/rune/narsie/Initialize(mapload, set_keyword)
  488. . = ..()
  489. GLOB.poi_list |= src
  490.  
  491. /obj/effect/rune/narsie/Destroy()
  492. GLOB.poi_list -= src
  493. . = ..()
  494.  
  495. /obj/effect/rune/narsie/talismanhide() //can't hide this, and you wouldn't want to
  496. return
  497.  
  498. /obj/effect/rune/narsie/invoke(var/list/invokers)
  499. if(used)
  500. return
  501. if(!(z in GLOB.station_z_levels))
  502. return
  503.  
  504. if(locate(/obj/singularity/narsie) in GLOB.poi_list)
  505. for(var/M in invokers)
  506. to_chat(M, "<span class='warning'>Nar-Sie is already on this plane!</span>")
  507. log_game("Summon Nar-Sie rune failed - already summoned")
  508. return
  509. //BEGIN THE SUMMONING
  510. used = TRUE
  511. ..()
  512. sound_to_playing_players('sound/effects/dimensional_rend.ogg')
  513. var/turf/T = get_turf(src)
  514. sleep(40)
  515. if(src)
  516. color = RUNE_COLOR_RED
  517. SSticker.mode.eldergod = FALSE
  518. new /obj/singularity/narsie/large/cult(T) //Causes Nar-Sie to spawn even if the rune has been removed
  519.  
  520. /obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
  521. if((istype(I, /obj/item/tome) && iscultist(user)))
  522. user.visible_message("<span class='warning'>[user.name] begins erasing [src]...</span>", "<span class='notice'>You begin erasing [src]...</span>")
  523. if(do_after(user, 50, target = src)) //Prevents accidental erasures.
  524. log_game("Summon Narsie rune erased by [user.mind.key] (ckey) with a tome")
  525. message_admins("[key_name_admin(user)] erased a Narsie rune with a tome")
  526. ..()
  527. else
  528. if(istype(I, /obj/item/nullrod)) //Begone foul magiks. You cannot hinder me.
  529. log_game("Summon Narsie rune erased by [user.mind.key] (ckey) using a null rod")
  530. message_admins("[key_name_admin(user)] erased a Narsie rune with a null rod")
  531. ..()
  532.  
  533. //Rite of Resurrection: Requires the corpse of a cultist and that there have been less revives than the number of people GLOB.sacrificed
  534. /obj/effect/rune/raise_dead
  535. cultist_name = "Resurrect Cultist"
  536. cultist_desc = "requires the corpse of a cultist placed upon the rune. Provided there have been sufficient sacrifices, they will be revived."
  537. invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!" //Depends on the name of the user - see below
  538. icon_state = "1"
  539. color = RUNE_COLOR_MEDIUMRED
  540. var/static/revives_used = 0
  541.  
  542. /obj/effect/rune/raise_dead/examine(mob/user)
  543. ..()
  544. if(iscultist(user) || user.stat == DEAD)
  545. var/revive_number = LAZYLEN(GLOB.sacrificed) - revives_used
  546. to_chat(user, "<b>Revives Remaining:</b> [revive_number]")
  547.  
  548. /obj/effect/rune/raise_dead/invoke(var/list/invokers)
  549. var/turf/T = get_turf(src)
  550. var/mob/living/mob_to_revive
  551. var/list/potential_revive_mobs = list()
  552. var/mob/living/user = invokers[1]
  553. if(rune_in_use)
  554. return
  555. rune_in_use = TRUE
  556. for(var/mob/living/M in T.contents)
  557. if(iscultist(M) && M.stat == DEAD)
  558. potential_revive_mobs |= M
  559. if(!potential_revive_mobs.len)
  560. to_chat(user, "<span class='cultitalic'>There are no dead cultists on the rune!</span>")
  561. log_game("Raise Dead rune failed - no corpses to revive")
  562. fail_invoke()
  563. rune_in_use = FALSE
  564. return
  565. if(LAZYLEN(GLOB.sacrificed) <= revives_used)
  566. to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
  567. fail_invoke()
  568. rune_in_use = FALSE
  569. return
  570. if(potential_revive_mobs.len > 1)
  571. mob_to_revive = input(user, "Choose a cultist to revive.", "Cultist to Revive") as null|anything in potential_revive_mobs
  572. else
  573. mob_to_revive = potential_revive_mobs[1]
  574. if(QDELETED(src) || !validness_checks(mob_to_revive, user))
  575. rune_in_use = FALSE
  576. return
  577. if(user.name == "Herbert West")
  578. invocation = "To life, to life, I bring them!"
  579. else
  580. invocation = initial(invocation)
  581. ..()
  582. revives_used++
  583. mob_to_revive.revive(1, 1) //This does remove disabilities and such, but the rune might actually see some use because of it!
  584. mob_to_revive.grab_ghost()
  585. to_chat(mob_to_revive, "<span class='cultlarge'>\"PASNAR SAVRAE YAM'TOTH. Arise.\"</span>")
  586. mob_to_revive.visible_message("<span class='warning'>[mob_to_revive] draws in a huge breath, red light shining from [mob_to_revive.p_their()] eyes.</span>", \
  587. "<span class='cultlarge'>You awaken suddenly from the void. You're alive!</span>")
  588. rune_in_use = FALSE
  589.  
  590. /obj/effect/rune/raise_dead/proc/validness_checks(mob/living/target_mob, mob/living/user)
  591. var/turf/T = get_turf(src)
  592. if(QDELETED(user))
  593. return FALSE
  594. if(!Adjacent(user) || user.incapacitated())
  595. return FALSE
  596. if(QDELETED(target_mob))
  597. fail_invoke()
  598. return FALSE
  599. if(!(target_mob in T.contents))
  600. to_chat(user, "<span class='cultitalic'>The cultist to revive has been moved!</span>")
  601. fail_invoke()
  602. log_game("Raise Dead rune failed - revival target moved")
  603. return FALSE
  604. var/mob/dead/observer/ghost = target_mob.get_ghost(TRUE)
  605. if(!ghost && (!target_mob.mind || !target_mob.mind.active))
  606. to_chat(user, "<span class='cultitalic'>The corpse to revive has no spirit!</span>")
  607. fail_invoke()
  608. log_game("Raise Dead rune failed - revival target has no ghost")
  609. return FALSE
  610. if(!GLOB.sacrificed.len || GLOB.sacrificed.len <= revives_used)
  611. to_chat(user, "<span class='warning'>You have sacrificed too few people to revive a cultist!</span>")
  612. fail_invoke()
  613. log_game("Raise Dead rune failed - too few sacrificed")
  614. return FALSE
  615. return TRUE
  616.  
  617. /obj/effect/rune/raise_dead/fail_invoke()
  618. ..()
  619. for(var/mob/living/M in range(1,src))
  620. if(iscultist(M) && M.stat == DEAD)
  621. M.visible_message("<span class='warning'>[M] twitches.</span>")
  622.  
  623.  
  624. //Rite of Disruption: Emits an EMP blast.
  625. /obj/effect/rune/emp
  626. cultist_name = "Electromagnetic Disruption"
  627. cultist_desc = "emits a large electromagnetic pulse, increasing in size for each cultist invoking it, hindering electronics and disabling silicons."
  628. invocation = "Ta'gh fara'qha fel d'amar det!"
  629. icon_state = "5"
  630. allow_excess_invokers = TRUE
  631. color = RUNE_COLOR_EMP
  632.  
  633. /obj/effect/rune/emp/invoke(var/list/invokers)
  634. var/turf/E = get_turf(src)
  635. ..()
  636. visible_message("<span class='warning'>[src] glows blue for a moment before vanishing.</span>")
  637. switch(invokers.len)
  638. if(1 to 2)
  639. playsound(E, 'sound/items/welder2.ogg', 25, 1)
  640. for(var/M in invokers)
  641. to_chat(M, "<span class='warning'>You feel a minute vibration pass through you...</span>")
  642. if(3 to 6)
  643. playsound(E, 'sound/magic/disable_tech.ogg', 50, 1)
  644. for(var/M in invokers)
  645. to_chat(M, "<span class='danger'>Your hair stands on end as a shockwave emanates from the rune!</span>")
  646. if(7 to INFINITY)
  647. playsound(E, 'sound/magic/disable_tech.ogg', 100, 1)
  648. for(var/M in invokers)
  649. var/mob/living/L = M
  650. to_chat(L, "<span class='userdanger'>You chant in unison and a colossal burst of energy knocks you backward!</span>")
  651. L.Knockdown(40)
  652. qdel(src) //delete before pulsing because it's a delay reee
  653. empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters
  654.  
  655. //Rite of Spirit Sight: Separates one's spirit from their body. They will take damage while it is active.
  656. /obj/effect/rune/spirit
  657. cultist_name = "Spirit Sight"
  658. cultist_desc = "severs the link between one's spirit and body. This effect is taxing and one's physical body will take damage while this is active."
  659. invocation = "Fwe'sh mah erl nyag r'ya!"
  660. icon_state = "7"
  661. color = RUNE_COLOR_DARKRED
  662. rune_in_use = FALSE //One at a time, please!
  663. construct_invoke = FALSE
  664. var/mob/living/affecting = null
  665.  
  666. /obj/effect/rune/spirit/Destroy()
  667. affecting = null
  668. return ..()
  669.  
  670. /obj/effect/rune/spirit/examine(mob/user)
  671. ..()
  672. if(affecting)
  673. to_chat(user, "<span class='cultitalic'>A translucent field encases [affecting] above the rune!</span>")
  674.  
  675. /obj/effect/rune/spirit/can_invoke(mob/living/user)
  676. if(rune_in_use)
  677. to_chat(user, "<span class='cultitalic'>[src] cannot support more than one body!</span>")
  678. log_game("Spirit Sight rune failed - more than one user")
  679. return list()
  680. var/turf/T = get_turf(src)
  681. if(!(user in T))
  682. to_chat(user, "<span class='cultitalic'>You must be standing on top of [src]!</span>")
  683. log_game("Spirit Sight rune failed - user not standing on rune")
  684. return list()
  685. return ..()
  686.  
  687. /obj/effect/rune/spirit/invoke(var/list/invokers)
  688. var/mob/living/user = invokers[1]
  689. ..()
  690. var/turf/T = get_turf(src)
  691. rune_in_use = TRUE
  692. affecting = user
  693. affecting.add_atom_colour(RUNE_COLOR_DARKRED, ADMIN_COLOUR_PRIORITY)
  694. affecting.visible_message("<span class='warning'>[affecting] freezes statue-still, glowing an unearthly red.</span>", \
  695. "<span class='cult'>You see what lies beyond. All is revealed. While this is a wondrous experience, your physical form will waste away in this state. Hurry...</span>")
  696. affecting.ghostize(1)
  697. while(!QDELETED(affecting))
  698. affecting.apply_damage(0.1, BRUTE)
  699. if(!(affecting in T))
  700. user.visible_message("<span class='warning'>A spectral tendril wraps around [affecting] and pulls [affecting.p_them()] back to the rune!</span>")
  701. Beam(affecting, icon_state="drainbeam", time=2)
  702. affecting.forceMove(get_turf(src)) //NO ESCAPE :^)
  703. if(affecting.key)
  704. affecting.visible_message("<span class='warning'>[affecting] slowly relaxes, the glow around [affecting.p_them()] dimming.</span>", \
  705. "<span class='danger'>You are re-united with your physical form. [src] releases its hold over you.</span>")
  706. affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
  707. affecting.Knockdown(60)
  708. break
  709. if(affecting.stat == UNCONSCIOUS)
  710. if(prob(1))
  711. var/mob/dead/observer/G = affecting.get_ghost()
  712. to_chat(G, "<span class='cultitalic'>You feel the link between you and your body weakening... you must hurry!</span>")
  713. else if(affecting.stat == DEAD)
  714. affecting.remove_atom_colour(ADMIN_COLOUR_PRIORITY, RUNE_COLOR_DARKRED)
  715. var/mob/dead/observer/G = affecting.get_ghost()
  716. to_chat(G, "<span class='cultitalic'><b>You suddenly feel your physical form pass on. [src]'s exertion has killed you!</b></span>")
  717. break
  718. sleep(1)
  719. affecting = null
  720. rune_in_use = FALSE
  721.  
  722. //Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
  723. /obj/effect/rune/wall
  724. cultist_name = "Form Barrier"
  725. cultist_desc = "when invoked, makes a temporary invisible wall to block passage. Can be invoked again to reverse this."
  726. invocation = "Khari'd! Eske'te tannin!"
  727. icon_state = "1"
  728. color = RUNE_COLOR_MEDIUMRED
  729. CanAtmosPass = ATMOS_PASS_DENSITY
  730. var/density_timer
  731. var/recharging = FALSE
  732.  
  733. /obj/effect/rune/wall/Initialize(mapload, set_keyword)
  734. . = ..()
  735. GLOB.wall_runes += src
  736.  
  737. /obj/effect/rune/wall/examine(mob/user)
  738. ..()
  739. if(density)
  740. to_chat(user, "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>")
  741.  
  742. /obj/effect/rune/wall/Destroy()
  743. density = FALSE
  744. GLOB.wall_runes -= src
  745. air_update_turf(1)
  746. return ..()
  747.  
  748. /obj/effect/rune/wall/BlockSuperconductivity()
  749. return density
  750.  
  751. /obj/effect/rune/wall/invoke(var/list/invokers)
  752. if(recharging)
  753. return
  754. var/mob/living/user = invokers[1]
  755. ..()
  756. density = !density
  757. update_state()
  758. if(density)
  759. spread_density()
  760. var/carbon_user = iscarbon(user)
  761. user.visible_message("<span class='warning'>[user] [carbon_user ? "places [user.p_their()] hands on":"stares intently at"] [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
  762. "<span class='cultitalic'>You channel [carbon_user ? "your life ":""]energy into [src], [density ? "temporarily preventing" : "allowing"] passage above it.</span>")
  763. if(carbon_user)
  764. var/mob/living/carbon/C = user
  765. C.apply_damage(2, BRUTE, pick("l_arm", "r_arm"))
  766.  
  767. /obj/effect/rune/wall/proc/spread_density()
  768. for(var/R in GLOB.wall_runes)
  769. var/obj/effect/rune/wall/W = R
  770. if(W.z == z && get_dist(src, W) <= 2 && !W.density && !W.recharging)
  771. W.density = TRUE
  772. W.update_state()
  773. W.spread_density()
  774. density_timer = addtimer(CALLBACK(src, .proc/lose_density), 900, TIMER_STOPPABLE)
  775.  
  776. /obj/effect/rune/wall/proc/lose_density()
  777. if(density)
  778. recharging = TRUE
  779. density = FALSE
  780. update_state()
  781. var/oldcolor = color
  782. add_atom_colour("#696969", FIXED_COLOUR_PRIORITY)
  783. animate(src, color = oldcolor, time = 50, easing = EASE_IN)
  784. addtimer(CALLBACK(src, .proc/recharge), 50)
  785.  
  786. /obj/effect/rune/wall/proc/recharge()
  787. recharging = FALSE
  788. add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY)
  789.  
  790. /obj/effect/rune/wall/proc/update_state()
  791. deltimer(density_timer)
  792. air_update_turf(1)
  793. if(density)
  794. var/mutable_appearance/shimmer = mutable_appearance('icons/effects/effects.dmi', "barriershimmer", ABOVE_MOB_LAYER)
  795. shimmer.appearance_flags |= RESET_COLOR
  796. shimmer.alpha = 60
  797. shimmer.color = "#701414"
  798. add_overlay(shimmer)
  799. add_atom_colour(RUNE_COLOR_RED, FIXED_COLOUR_PRIORITY)
  800. else
  801. cut_overlays()
  802. add_atom_colour(RUNE_COLOR_MEDIUMRED, FIXED_COLOUR_PRIORITY)
  803.  
  804. //Rite of Joined Souls: Summons a single cultist.
  805. /obj/effect/rune/summon
  806. cultist_name = "Summon Cultist"
  807. cultist_desc = "summons a single cultist to the rune. Requires 2 invokers."
  808. invocation = "N'ath reth sh'yro eth d'rekkathnor!"
  809. req_cultists = 2
  810. invoke_damage = 10
  811. icon_state = "5"
  812. color = RUNE_COLOR_SUMMON
  813.  
  814. /obj/effect/rune/summon/invoke(var/list/invokers)
  815. var/mob/living/user = invokers[1]
  816. var/list/cultists = list()
  817. for(var/datum/mind/M in SSticker.mode.cult)
  818. if(!(M.current in invokers) && M.current && M.current.stat != DEAD)
  819. cultists |= M.current
  820. var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in cultists
  821. if(!Adjacent(user) || !src || QDELETED(src) || user.incapacitated())
  822. return
  823. if(!cultist_to_summon)
  824. to_chat(user, "<span class='cultitalic'>You require a summoning target!</span>")
  825. fail_invoke()
  826. log_game("Summon Cultist rune failed - no target")
  827. return
  828. if(cultist_to_summon.stat == DEAD)
  829. to_chat(user, "<span class='cultitalic'>[cultist_to_summon] has died!</span>")
  830. fail_invoke()
  831. log_game("Summon Cultist rune failed - target died")
  832. return
  833. if(!iscultist(cultist_to_summon))
  834. to_chat(user, "<span class='cultitalic'>[cultist_to_summon] is not a follower of the Geometer!</span>")
  835. fail_invoke()
  836. log_game("Summon Cultist rune failed - target was deconverted")
  837. return
  838. if(cultist_to_summon.z > ZLEVEL_SPACEMAX)
  839. to_chat(user, "<span class='cultitalic'>[cultist_to_summon] is not in our dimension!</span>")
  840. fail_invoke()
  841. log_game("Summon Cultist rune failed - target in away mission")
  842. return
  843. cultist_to_summon.visible_message("<span class='warning'>[cultist_to_summon] suddenly disappears in a flash of red light!</span>", \
  844. "<span class='cultitalic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
  845. ..()
  846. visible_message("<span class='warning'>A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!</span>")
  847. cultist_to_summon.forceMove(get_turf(src))
  848. qdel(src)
  849.  
  850. //Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
  851. /obj/effect/rune/blood_boil
  852. cultist_name = "Boil Blood"
  853. cultist_desc = "boils the blood of non-believers who can see the rune, rapidly dealing extreme amounts of damage. Requires 3 invokers."
  854. invocation = "Dedo ol'btoh!"
  855. icon_state = "4"
  856. color = RUNE_COLOR_MEDIUMRED
  857. light_color = LIGHT_COLOR_LAVA
  858. req_cultists = 3
  859. invoke_damage = 10
  860. construct_invoke = FALSE
  861. var/tick_damage = 25
  862. rune_in_use = FALSE
  863.  
  864. /obj/effect/rune/blood_boil/do_invoke_glow()
  865. return
  866.  
  867. /obj/effect/rune/blood_boil/invoke(var/list/invokers)
  868. if(rune_in_use)
  869. return
  870. ..()
  871. rune_in_use = TRUE
  872. var/turf/T = get_turf(src)
  873. visible_message("<span class='warning'>[src] turns a bright, glowing orange!</span>")
  874. color = "#FC9B54"
  875. set_light(6, 1, color)
  876. for(var/mob/living/L in viewers(T))
  877. if(!iscultist(L) && L.blood_volume)
  878. var/obj/item/nullrod/N = L.null_rod_check()
  879. if(N)
  880. to_chat(L, "<span class='userdanger'>\The [N] suddenly burns hotly before returning to normal!</span>")
  881. continue
  882. to_chat(L, "<span class='cultlarge'>Your blood boils in your veins!</span>")
  883. if(is_servant_of_ratvar(L))
  884. to_chat(L, "<span class='userdanger'>You feel an unholy darkness dimming the Justiciar's light!</span>")
  885. animate(src, color = "#FCB56D", time = 4)
  886. sleep(4)
  887. if(QDELETED(src))
  888. return
  889. do_area_burn(T, 0.5)
  890. animate(src, color = "#FFDF80", time = 5)
  891. sleep(5)
  892. if(QDELETED(src))
  893. return
  894. do_area_burn(T, 1)
  895. animate(src, color = "#FFFDF4", time = 6)
  896. sleep(6)
  897. if(QDELETED(src))
  898. return
  899. do_area_burn(T, 1.5)
  900. new /obj/effect/hotspot(T)
  901. qdel(src)
  902.  
  903. /obj/effect/rune/blood_boil/proc/do_area_burn(turf/T, multiplier)
  904. set_light(6, 1, color)
  905. for(var/mob/living/L in viewers(T))
  906. if(!iscultist(L) && L.blood_volume)
  907. var/obj/item/nullrod/N = L.null_rod_check()
  908. if(N)
  909. continue
  910. L.take_overall_damage(tick_damage*multiplier, tick_damage*multiplier)
  911. if(is_servant_of_ratvar(L))
  912. L.adjustStaminaLoss(tick_damage*0.5)
  913.  
  914. //Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
  915. /obj/effect/rune/manifest
  916. cultist_name = "Manifest Spirit"
  917. cultist_desc = "manifests a spirit as a servant of the Geometer. The invoker must not move from atop the rune, and will take damage for each summoned spirit."
  918. invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
  919. icon_state = "6"
  920. invoke_damage = 10
  921. construct_invoke = FALSE
  922. color = RUNE_COLOR_MEDIUMRED
  923. var/ghost_limit = 5
  924. var/ghosts = 0
  925.  
  926. /obj/effect/rune/manifest/Initialize()
  927. . = ..()
  928. notify_ghosts("Manifest rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src)
  929.  
  930. /obj/effect/rune/manifest/can_invoke(mob/living/user)
  931. if(!(user in get_turf(src)))
  932. to_chat(user, "<span class='cultitalic'>You must be standing on [src]!</span>")
  933. fail_invoke()
  934. log_game("Manifest rune failed - user not standing on rune")
  935. return list()
  936. if(user.has_status_effect(STATUS_EFFECT_SUMMONEDGHOST))
  937. to_chat(user, "<span class='cultitalic'>Ghosts can't summon more ghosts!</span>")
  938. fail_invoke()
  939. log_game("Manifest rune failed - user is a ghost")
  940. return list()
  941. if(ghosts >= ghost_limit)
  942. to_chat(user, "<span class='cultitalic'>You are sustaining too many ghosts to summon more!</span>")
  943. fail_invoke()
  944. log_game("Manifest rune failed - too many summoned ghosts")
  945. return list()
  946. var/list/ghosts_on_rune = list()
  947. for(var/mob/dead/observer/O in get_turf(src))
  948. if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
  949. ghosts_on_rune += O
  950. if(!ghosts_on_rune.len)
  951. to_chat(user, "<span class='cultitalic'>There are no spirits near [src]!</span>")
  952. fail_invoke()
  953. log_game("Manifest rune failed - no nearby ghosts")
  954. return list()
  955. return ..()
  956.  
  957. /obj/effect/rune/manifest/invoke(var/list/invokers)
  958. var/mob/living/user = invokers[1]
  959. var/list/ghosts_on_rune = list()
  960. for(var/mob/dead/observer/O in get_turf(src))
  961. if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
  962. ghosts_on_rune += O
  963. var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune)
  964. var/mob/living/carbon/human/cult_ghost/new_human = new(get_turf(src))
  965. new_human.real_name = ghost_to_spawn.real_name
  966. new_human.alpha = 150 //Makes them translucent
  967. new_human.equipOutfit(/datum/outfit/ghost_cultist) //give them armor
  968. new_human.apply_status_effect(STATUS_EFFECT_SUMMONEDGHOST) //ghosts can't summon more ghosts
  969. ..()
  970. ghosts++
  971. playsound(src, 'sound/magic/exit_blood.ogg', 50, 1)
  972. visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a [new_human.gender == FEMALE ? "wo":""]man.</span>")
  973. to_chat(user, "<span class='cultitalic'>Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...</span>")
  974. var/turf/T = get_turf(src)
  975. var/obj/structure/emergency_shield/invoker/N = new(T)
  976.  
  977. new_human.key = ghost_to_spawn.key
  978. SSticker.mode.add_cultist(new_human.mind, 0)
  979. to_chat(new_human, "<span class='cultitalic'><b>You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs.</b></span>")
  980.  
  981. while(!QDELETED(src) && !QDELETED(user) && !QDELETED(new_human) && (user in T))
  982. if(user.stat || new_human.InCritical())
  983. break
  984. user.apply_damage(0.1, BRUTE)
  985. sleep(1)
  986.  
  987. qdel(N)
  988. ghosts--
  989. if(new_human)
  990. new_human.visible_message("<span class='warning'>[new_human] suddenly dissolves into bones and ashes.</span>", \
  991. "<span class='cultlarge'>Your link to the world fades. Your form breaks apart.</span>")
  992. for(var/obj/I in new_human)
  993. new_human.dropItemToGround(I, TRUE)
  994. new_human.dust()
  995.  
  996. /mob/living/carbon/human/cult_ghost/spill_organs(no_brain, no_organs, no_bodyparts) //cult ghosts never drop a brain
  997. no_brain = TRUE
  998. . = ..()
  999.  
  1000. /mob/living/carbon/human/cult_ghost/getorganszone(zone, subzones = 0)
  1001. . = ..()
  1002. for(var/obj/item/organ/brain/B in .) //they're not that smart, really
  1003. . -= B
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement