Robust Cult changes

* Robust Cult changes

* just cache the turf ffs

* if you see something say nothing and drink to forget

* if you see something, say nothing and drink to forget

* messagefix

* if you see something say nothing, and drink to forget

* if you see something say nothing and drink to forget

* if you see something say nothing and drink to forget

* if you see something say nothing, and drink to forget
This commit is contained in:
Joan Lung
2016-05-01 22:37:02 -04:00
committed by KorPhaeron
parent cdc411863d
commit 3eeb0cb8e9
7 changed files with 412 additions and 474 deletions
+3 -3
View File
@@ -75,7 +75,7 @@
/datum/game_mode/cult/announce()
world << "<B>The current game mode is - Cult!</B>"
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - complete your objectives at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith.</B>"
world << "<B>Some crewmembers are attempting to start a cult!<BR>\nCultists - sacrifice your target and summon Nar-Sie at all costs. Convert crewmembers to your cause by using the convert rune, or sacrifice them and turn them into constructs. Remember - there is no you, there is only the cult.<BR>\nPersonnel - Do not let the cult succeed in its mission. Forced consumption of holy water will convert a cultist back to a Nanotrasen-sanctioned faith.</B>"
/datum/game_mode/cult/pre_setup()
@@ -113,11 +113,11 @@
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
if("sacrifice")
if(sacrifice_target)
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role]. You will need the Sacrifice rune and three acolytes to do so."
explanation = "Sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role] via invoking a Sacrifice rune with them on it and three acolytes around it."
else
explanation = "Free objective."
if("eldergod")
explanation = "Summon Nar-Sie via the rune 'Call Forth The Geometer'. It will only work if nine acolytes stand on and around it."
explanation = "Summon Nar-Sie by invoking the rune 'Summon Nar-Sie' with nine acolytes around and on it. You must do this after sacrificing your target."
cult_mind.current << "<B>Objective #[obj_count]</B>: [explanation]"
cult_mind.memory += "<B>Objective #[obj_count]</B>: [explanation]<BR>"
/datum/game_mode/cult/post_setup()
+9 -1
View File
@@ -12,7 +12,6 @@
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "rended")
/obj/item/weapon/melee/cultblade/attack(mob/living/target, mob/living/carbon/human/user)
if(!iscultist(user))
user.Weaken(5)
@@ -49,6 +48,15 @@
var/mob/living/carbon/human/H = target
H.drip(50)
/obj/item/weapon/restraints/legcuffs/bola/cult
name = "nar'sian bola"
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
icon_state = "bola_cult"
breakouttime = 45
weaken = 1
/obj/item/clothing/head/culthood
name = "ancient cultist hood"
icon_state = "culthood"
+72 -82
View File
@@ -7,7 +7,7 @@ This file contains the arcane tome files as well as innate cultist emergency com
/mob/proc/cult_add_comm() //why the fuck does this have its own proc? not removing it because it might be used somewhere but...
verbs += /mob/living/proc/cult_help
verbs += /mob/living/proc/cult_innate_comm
/mob/living/proc/cult_help()
set category = "Cultist"
@@ -44,7 +44,7 @@ This file contains the arcane tome files as well as innate cultist emergency com
/mob/living/proc/cult_innate_comm()
set category = "Cultist"
set name = "Imperfect Communion"
set name = "Emergency Communion"
if(!iscultist(usr) || usr.incapacitated())
return
@@ -90,16 +90,12 @@ This file contains the arcane tome files as well as innate cultist emergency com
/obj/item/weapon/tome/examine(mob/user)
..()
if(iscultist(user))
user << "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie."
if(iscultist(user) || user.stat == DEAD)
user << "<span class='cult'>The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie.</span>"
user << "<span class='cult'>Striking another cultist with it will purge holy water from them.</span>"
user << "<span class='cult'>Striking a noncultist, however, will sear their flesh.</span>"
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
if(istype(M,/mob/dead/observer))
M.invisibility = 0
user.visible_message("<span class='warning'>[user] strikes the air with [src], and a ghost appears!</span>", \
"<span class='cult'>You drag the ghost to your plane of reality!</span>")
add_logs(user, M, "smacked", src)
return
if(!istype(M))
return
if(!iscultist(user))
@@ -144,87 +140,86 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "<center><font color='red' size=3><b><i>Archives of the Dark One</i></b></font></center><br><br><br>"
text += "A rune's name and effects can be revealed by examining the rune.<<br><br>"
text += "<font color='red'><b>Imbue Talisman</b></font><br>The Rune of Talisman Creation is one of the most important. It is the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \
invoking it and choosing which talisman you desire, the paper will be converted into a talisman.<br><br>"
text += "<font color='red'><b>Create Talisman</b></font><br>This rune is one of the most important runes the cult has, being the only way to create new talismans. A blank sheet of paper must be on top of the rune. After \
invoking it and choosing which talisman you desire, the paper will be converted, after some delay into a talisman.<br><br>"
text += "<font color='red'><b>Teleport</b></font><br>The Rune of Teleportation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, search for other Rites of Translocation. \
text += "<font color='red'><b>Teleport</b></font><br>This rune is unique in that it requires a keyword before the scribing can begin. When invoked, it will find any other Teleport runes; \
If any are found, the user can choose which rune to send to. Upon activation, the rune teleports everything above it to the selected rune.<br><br>"
text += "<font color='red'><b>Convert</b></font><br>The Rune of Conversion is important to the success of the cult. It will allow you to convert normal crew members into cultists. \
To do this, simply place the crew member upon the rune and invoke it. This rune requires two acolytes to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.<br><br>"
text += "<font color='red'><b>Convert</b></font><br>This rune is critical to the success of the cult. It will allow you to convert normal crew members into cultists. \
To do this, simply place the crew member upon the rune and invoke it. This rune requires two invokers to use. If the target to be converted is loyalty-implanted or a certain assignment, they will \
be unable to be converted. People the Geometer wishes sacrificed will also be ineligible for conversion, and anyone with a shielding presence like the null rod will not be converted.<br> \
Successful conversions will produce a tome for the new cultist.<br><br>"
text += "<font color='red'><b>Sacrifice</b></font><br>The Rune of Sacrifice is necessary to achieve your goals. Simply place any dead creature upon the rune and invoke it (this will not \
target cultists!). If this creature has a mind, a soul shard will be created and the creature's soul transported to it. This rune is required if the cult's objectives include the sacrifice of a crew \
member. Sacrificing the dead can be done alone, but sacrificing living crew or your cult's target will require 3 cultists. Soul shards used on construct shells will move that soul into a \
powerful construct of your choice.<br><br>"
text += "<font color='red'><b>Sacrifice</b></font><br><b>This rune is necessary to achieve your goals.</b> Simply place any dead creature upon the rune and invoke it (this will not \
target cultists!). If this creature has a mind, a soulstone will be created and the creature's soul transported to it. Sacrificing the dead can be done alone, but sacrificing living crew <b>or your cult's target</b> will require 3 cultists. \
Soulstones used on construct shells will move that soul into a powerful construct of your choice.<br><br>"
text += "<font color='red'><b>Raise Dead</b></font><br>The Rune of Resurrection is a delicate rite that requires two corpses. To perform the ritual, place the corpse you wish to revive onto \
text += "<font color='red'><b>Raise Dead</b></font><br>This rune requires two corpses. To perform the ritual, place the corpse you wish to revive onto \
the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to dust, the life force flowing into the revival target. Assuming the target is not moved \
within a few seconds, they will be brought back to life, healed of all ailments.<br><br>"
text += "<font color='red'><b>Electromagnetic Disruption</b></font><br>Robotic lifeforms have time and time again been the downfall of fledgling cults. The Rite of Disruption may allow you to gain the upper \
text += "<font color='red'><b>Electromagnetic Disruption</b></font><br>Robotic lifeforms have time and time again been the downfall of fledgling cults. This rune may allow you to gain the upper \
hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location. The size of the EMP will grow significantly for each additional adjacent cultist when the \
rune is activated.<br><br>"
text += "<font color='red'><b>Astral Communion</b></font><br>The Rune of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \
text += "<font color='red'><b>Astral Communion</b></font><br>This rune is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \
user's spirit will be ripped from their body. In this state, the user's physical body will be locked in place to the rune itself - any attempts to move it will result in the rune pulling it back. \
The body will also take constant damage while in this form, and may even die. The user's spirit will contain their consciousness, and will allow them to freely wander the station as a ghost. This may \
also be used to commune with the dead.<br><br>"
text += "<font color='red'><b>Form Barrier</b></font><br>While simple, the Barrier Rune serves an important purpose in defense and hindering passage. When invoked, the \
text += "<font color='red'><b>Form Barrier</b></font><br>While simple, this rune serves an important purpose in defense and hindering passage. When invoked, the \
rune will draw a small amount of life force from the user and make the space above the rune completely dense, rendering it impassable to all but the most complex means. The rune may be invoked again to \
undo this effect and allow passage again.<br><br>"
text += "<font color='red'><b>Summon Cultist</b></font><br>The Rune of Summoning requires two acolytes to use. When invoked, it will allow the user to summon a single cultist to the rune from \
any location. This will deal a moderate amount of damage to all invokers. Absolutely crucial for rescuing your brothers from security.<br><br>"
text += "<font color='red'><b>Summon Cultist</b></font><br>This rune allows the cult to free other cultists with ease. When invoked, it will allow the user to summon a single cultist to the rune from \
any location. It requires two invokers, and will damage each invoker slightly.<br><br>"
text += "<font color='red'><b>Blood Boil</b></font><br>The Rune of Boiling Blood may be considered one of the most dangerous rites composed by the cult of Nar-Sie. When invoked, it will do a \
massive amount of damage to all non-cultist viewers, but it will also emit an explosion upon invocation. It requires three invokers.<br><br>"
text += "<font color='red'><b>Blood Boil</b></font><br>When invoked, this rune will do a massive amount of damage to all non-cultist viewers, but it will also emit a small explosion upon invocation. \
It requires three invokers.<br><br>"
text += "<font color='red'><b>Manifest Spirit</b></font><br>If you wish to bring a spirit back from the dead with a wish for vengeance and desire to serve, the Rite of Spectral \
Manifestation can do just that. When invoked, any spirits above the rune will be brought to life as a human wearing nothing that seeks only to serve you and the Geometer. However, the spirit's link \
to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, the spirits will dissipate, dropping their items to the ground. You may manifest \
text += "<font color='red'><b>Manifest Spirit</b></font><br>This rune allows you to summon spirits as humanoid fighters. When invoked, a spirit above the rune will be brought to life as a human, wearing nothing, that seeks only to serve you and the Geometer. \
However, the spirit's link to reality is fragile - you must remain on top of the rune, and you will slowly take damage. Upon stepping off the rune, all summoned spirits will dissipate, dropping their items to the ground. You may manifest \
multiple spirits with one rune, but you will rapidly take damage in doing so.<br><br>"
text += "<font color='red'><b><i>Summon Nar-Sie</i></b></font><br>There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \
comparison to other runes, is very large, requiring a 3x3 space of empty tiles to create. To invoke the rune, nine cultists must stand on the rune, so that all of them are within its circle. Then, \
simply invoke it. A brief tearing will be heard as the barrier between dimensions is torn open, and the avatar will come forth.<br><br><br>"
text += "<font color='red'><b><i>Summon Nar-Sie</i></b></font><br><b>This rune is necessary to achieve your goals.</b> On attempting to scribe it, it will produce shields around you and alert everyone you are attempting to scribe it; it takes a very long time to scribe, \
and does massive damage to the one attempting to scribe it.<br>Invoking it requires 9 invokers and the sacrifice of a specific crewmember, and once invoked, will summon the Geometer, Nar-Sie herself. \
This will complete your objectives.<br><br><br>"
text += "<font color='red'><b>Talisman of Teleportation</b></font><br>The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \
disappear.<br><br>"
text += "<font color='red'><b>Talisman of Teleportation</b></font><br>The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.<br><br>"
text += "<font color='red'><b>Talisman of Construction</b></font><br>The Rune of Fabrication is the main way of creating construct shells. To use it, one must place fifteen sheets of metal on top of the rune \
and invoke it. The sheets will them be twisted into a construct shell, ready to recieve a soul to occupy it.<br><br>"
text += "<font color='red'><b>Talisman of Construction</b></font><br>This talisman is the main way of creating construct shells. To use it, one must strike 30 sheets of metal with the talisman. The sheets will then be twisted into a construct shell, ready to recieve a soul to occupy it.<br><br>"
text += "<font color='red'><b>Talisman of Tome Summoning</b></font><br>This talisman functions nearly identically to the rune. The talisman will attempt to place the tome in your hand \
instead of on the ground, though this is the only advantage it has over the rune. It can be used once, then disappears.<br><br>"
text += "<font color='red'><b>Talisman of Tome Summoning</b></font><br>This talisman will produce a single tome at your feet.<br><br>"
text += "<font color='red'><b>Talismans of Veiling and Disguising</b></font><br>These talismans will hide, reveal, or disguise (as crayon drawings) all nearby runes.<br><br>"
text += "<font color='red'><b>Talisman of Veiling/Revealing</b></font><br>This talisman will hide runes on its first use, and on the second, will reveal runes.<br><br>"
text += "<font color='red'><b>Talisman of Electromagnetic Pulse</b></font><br>This talisman will EMP the target and anything else nearby. It disappears after one use.<br><br>"
text += "<font color='red'><b>Talisman of Disguising</b></font><br>This talisman will permanently disguise all nearby runes as crayon runes.<br><br>"
text += "<font color='red'><b>Talisman of Stunning</b></font><br>Without this talisman, the cult would have no way of easily acquiring targets to convert. Commonly called \"stunpapers\", this \
talisman functions differently from others. Rather than simply reading the words, the target must be attacked directly with the talisman. The talisman will then knock down the target for a long \
duration in addition to inhibiting their speech. Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.<br><br>"
text += "<font color='red'><b>Talisman of Electromagnetic Pulse</b></font><br>This talisman will EMP anything else nearby. It disappears after one use.<br><br>"
text += "<font color='red'><b>Talisman of Stunning</b></font><br>Attacking a target will knock them down for a long duration in addition to inhibiting their speech. \
Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.<br><br>"
text += "<font color='red'><b>Talisman of Armaments</b></font><br>The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola, and a pair of boots. Any items that cannot \
be equipped will not be summoned.<br><br>"
be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.<br><br>"
text += "<font color='red'><b>Talisman of Horrors</b></font><br>The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.<br><br>"
text += "<font color='red'><b>Talisman of Shackling</b></font><br>The Talisman of Shackling must be applied directly to the victim, it has 4 uses and cuffs victims with magic shackles that disappear when removed.<br><br>"
text += "In addition to these runes, the cult has a small selection of equipment and constructs.<br><br>"
text += "<font color='red'><b>Equipment:</b></font><br><br>"
text += "<font color='red'><b>Cult Blade</b></font><br>Cult blades are a sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Rite and Talisman of Arming.<br><br>"
text += "<font color='red'><b>Cult Blade</b></font><br>Cult blades are sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Talisman of Arming.<br><br>"
text += "<font color='red'><b>Cult Robes</b></font><br>Cult robes are heavily armored robes. These robes are produced by the Rite and Talisman of Arming.<br><br>"
text += "<font color='red'><b>Cult Bola</b></font><br>Cult bolas are strong bolas, useful for snaring targets. These bolas are produced by the Talisman of Arming.<br><br>"
text += "<font color='red'><b>Cult Robes</b></font><br>Cult robes are heavily armored robes. These robes are produced by the Talisman of Arming.<br><br>"
text += "<font color='red'><b>Soulstone</b></font><br>A soulstone is a simple piece of magic, produced either via the starter talisman or by sacrificing humans. Using it on an unconscious or dead human, or on a Shade, will trap their soul in the stone, allowing its use in construct shells. \
<br>The soul within can also be released as a Shade.<br><br>"
<br>The soul within can also be released as a Shade by using it in-hand.<br><br>"
text += "<font color='red'><b>Construct Shell</b></font><br>A construct shell is useless on its own, but placing a filled soulstone within it allows you to produce your choice of a <b>Wraith</b>, a <b>Juggernaut</b>, or an <b>Artificer</b>. \
<br>Each construct has uses, detailed below in Constructs. Construct shells can be produced via the starter talisman or the Rite of Fabrication.<br><br>"
@@ -240,14 +235,14 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "<font color='red'><b>Artificer</b></font><br>The Artificer is a weak and fragile construct, able to heal other constructs, produce more <font color='red'><b>soulstones</b></font> and <font color='red'><b>construct shells</b></font>, \
construct fortifying cult walls and flooring, and finally, it can release a few indiscriminate stunning missiles.<br><br>"
text += "<font color='red'><b>Harvester</b></font><br>If you see one, know that you have done all you can and your life is void.<br><br>"
text += "<font color='red'><b>Harvester</b></font><br>If you see one, know that you have done all you can and your life is void.<br><br>"
var/datum/browser/popup = new(user, "tome", "", 800, 600)
popup.set_content(text)
popup.open()
return 1
/obj/item/weapon/tome/proc/scribe_rune(mob/user)
/obj/item/weapon/tome/proc/scribe_rune(mob/living/user)
var/turf/Turf = get_turf(user)
var/chosen_keyword
var/obj/effect/rune/rune_to_scribe
@@ -278,50 +273,45 @@ This file contains the arcane tome files as well as innate cultist emergency com
break
if(!rune_to_scribe)
return
var/turf/Thenewturfyouwalkedto = get_turf(user) //we may have moved. adjust as needed...
if(locate(/obj/effect/rune) in Thenewturfyouwalkedto)
Turf = get_turf(user) //we may have moved. adjust as needed...
if(locate(/obj/effect/rune) in Turf)
user << "<span class='cult'>There is already a rune here.</span>"
return
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
return
if(ispath(rune_to_scribe, /obj/effect/rune/narsie))
var/confirm_final = alert(usr, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
if(confirm_final == "No")
usr << "On second thought, we should prepare further for the final battle..."
return
var/area/A = get_area(src)
var/locname = initial(A.name)
priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
for(var/B in spiral_range_turfs(1, user, 1))
var/turf/T = B
var/obj/machinery/shield/N = new(T)
N.name = "Rune-Scriber's Shield"
N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual"
N.icon_state = "shield-red"
N.health = 60
shields |= N
user.visible_message("<span class='warning'>[user] cuts open their arm and begins writing in their own blood!</span>", \
"<span class='cult'>You slice open your arm and begin drawing a sigil of the Geometer.</span>")
if(iscarbon(user))
var/mob/living/carbon/C = user
C.apply_damage(0.1, BRUTE, pick("l_arm", "r_arm"))
if("Summon Nar-Sie" == entered_rune_name)
var/confirm_final = alert(usr, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
if(confirm_final == "No")
usr << "On second thought, we should prepare further for the final battle..."
return
C.apply_damage(40, BRUTE, pick("l_arm", "r_arm"))
var/area/A = get_area(src)
var/locname = initial(A.name)
priority_announce("Figments from an eldritch god are being summoned by [user] into [locname] from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
for(var/turf/B in orange (1, user))
var/obj/machinery/shield/N = new(B)
N.name = "Rune-Scriber's Shield"
N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual"
N.icon_state = "shield-red"
N.health = 60
shields |= N
if(!do_after(user, 400, target = get_turf(user)))
for(var/V in shields)
var/obj/machinery/shield/S = V
if(S && !qdeleted(S))
qdel(S)
return
if(!do_after(user, 50, target = get_turf(user)))
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
if(!do_after(user, initial(rune_to_scribe.scribe_delay), target = get_turf(user)))
for(var/V in shields)
var/obj/machinery/shield/S = V
if(S && !qdeleted(S))
qdel(S)
return
if(locate(/obj/effect/rune) in Turf)
user << "<span class='cult'>There is already a rune here.</span>"
return
user.visible_message("<span class='warning'>[user] creates a strange circle in their own blood.</span>", \
"<span class='cult'>You finish drawing the arcane markings of the Geometer.</span>")
for(var/V in shields)
var/obj/machinery/shield/S = V
if(S && !qdeleted(S))
qdel(S)
new rune_to_scribe(Thenewturfyouwalkedto, chosen_keyword)
new rune_to_scribe(Turf, chosen_keyword)
user << "<span class='cult'>The [lowertext(initial(rune_to_scribe.cultist_name))] rune [initial(rune_to_scribe.cultist_desc)]</span>"
+218 -240
View File
@@ -17,7 +17,7 @@ To draw a rune, use an arcane tome.
name = "rune"
var/cultist_name = "basic rune"
desc = "An odd collection of symbols drawn in what seems to be blood."
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.
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.
anchored = 1
icon = 'icons/obj/rune.dmi'
icon_state = "1"
@@ -30,14 +30,14 @@ To draw a rune, use an arcane tome.
var/req_cultists = 1 //The amount of cultists required around the rune to invoke it. If only 1, any cultist can invoke it.
var/rune_in_use = 0 // Used for some runes, this is for when you want a rune to not be usable when in use.
var/req_pylons = 0
var/req_forges = 0
var/req_archives = 0
var/req_altars = 0
var/scribe_delay = 50 //how long the rune takes to create
var/scribe_damage = 0.1 //how much damage you take doing it
var/allow_excess_invokers = 0 //if we allow excess invokers when being invoked
var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
var/keyword //The actual keyword for the rune
/obj/effect/rune/New(loc, set_keyword)
..()
if(set_keyword)
@@ -47,14 +47,14 @@ To draw a rune, use an arcane tome.
..()
if(iscultist(user) || user.stat == DEAD) //If they're a cultist or a ghost, tell them the effects
user << "<b>Name:</b> [cultist_name]"
user << "<b>Effects:</b> [cultist_desc]"
user << "<b>Effects:</b> [capitalize(cultist_desc)]"
user << "<b>Required Acolytes:</b> [req_cultists]"
if(req_keyword && keyword)
user << "<b>Keyword:</b> [keyword]"
/obj/effect/rune/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
user << "<span class='notice'>You carefully erase [src].</span>"
user << "<span class='notice'>You carefully erase the [lowertext(cultist_name)] rune.</span>"
qdel(src)
return
else if(istype(I, /obj/item/weapon/nullrod))
@@ -68,14 +68,22 @@ To draw a rune, use an arcane tome.
if(!iscultist(user))
user << "<span class='warning'>You aren't able to understand the words of [src].</span>"
return
if(can_invoke(user))
invoke(user)
var/oldtransform = transform
animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out
animate(transform = oldtransform, alpha = 255, time = 0)
var/list/invokers = can_invoke(user)
if(invokers.len >= req_cultists)
invoke(invokers)
else
fail_invoke(user)
/obj/effect/rune/proc/talismanhide() //for talisman of revealing/hiding
visible_message("<span class='danger'>[src] fades away.</span>")
invisibility = INVISIBILITY_OBSERVER
alpha = 100 //To help ghosts distinguish hidden runes
/obj/effect/rune/proc/talismanreveal() //for talisman of revealing/hiding
invisibility = 0
visible_message("<span class='danger'>[src] suddenly appears!</span>")
alpha = initial(alpha)
/*
There are a few different procs each rune runs through when a cultist activates it.
@@ -88,64 +96,55 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/proc/can_invoke(var/mob/living/user)
//This proc determines if the rune can be invoked at the time. If there are multiple required cultists, it will find all nearby cultists.
if(!structure_check(req_pylons, req_forges, req_archives, req_altars))
return 0
if(!keyword && req_keyword)
return 0
if(req_cultists <= 1)
if(invocation)
user.say(invocation)
return 1
else
var/cultists_in_range = 0
var/list/invokers = list() //people eligible to invoke the rune
var/list/chanters = list() //people who will actually chant the rune when passed to invoke()
chanters |= user
invokers |= user
if(req_cultists > 1 || allow_excess_invokers)
for(var/mob/living/L in range(1, src))
if(iscultist(L))
var/mob/living/carbon/human/H = L
if(!istype(H))
if(istype(L, /mob/living/simple_animal/hostile/construct))
if(invocation)
L.say(invocation)
cultists_in_range++
if(L == user)
continue
if(L.stat || (H.disabilities & MUTE) || H.silent)
if(ishuman(L))
var/mob/living/carbon/human/H = L
if((H.disabilities & MUTE) || H.silent)
continue
if(L.stat)
continue
if(invocation)
L.say(invocation)
cultists_in_range++
if(cultists_in_range >= req_cultists)
return 1
else
return 0
invokers |= L
if(invokers.len >= req_cultists)
if(allow_excess_invokers)
chanters |= invokers
else
invokers -= user
shuffle(invokers)
for(var/i in 0 to req_cultists)
var/L = pick_n_take(invokers)
chanters |= L
return chanters
/obj/effect/rune/proc/invoke(var/mob/living/user)
/obj/effect/rune/proc/invoke(var/list/invokers)
//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.
if(invocation)
for(var/M in invokers)
var/mob/living/L = M
L.say(invocation)
var/oldtransform = transform
spawn(0) //animate is a delay, we want to avoid being delayed
animate(src, transform = matrix()*2, alpha = 0, time = 5) //fade out
animate(transform = oldtransform, alpha = 255, time = 0)
/obj/effect/rune/proc/fail_invoke(var/mob/living/user)
//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.
visible_message("<span class='warning'>The markings pulse with a small flash of red light, then fall dark.</span>")
/obj/effect/rune/proc/structure_check(var/rpylons, var/rforges, var/rarchives, var/raltars)
var/pylons = 0
var/forges = 0
var/archives = 0
var/altars = 0
for(var/obj/structure/cult/pylon in orange(3,src))
pylons++
for(var/obj/structure/cult/forge in orange(3,src))
forges++
for(var/obj/structure/cult/tome in orange(3,src))
archives++
for(var/obj/structure/cult/talisman in orange(3,src))
altars++
if(pylons >= rpylons && forges >= rforges && archives >= rarchives && altars >= raltars)
return 1
return 0
spawn(0) //animate is a delay, we want to avoid being delayed
animate(src, color = rgb(255, 0, 0), time = 0)
animate(src, color = initial(color), time = 5)
//Malformed Rune: This forms if a rune is not drawn correctly. Invoking it does nothing but hurt the user.
/obj/effect/rune/malformed
cultist_name = "malformed rune"
cultist_desc = "A senseless rune written in gibberish. No good can come from invoking this."
cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this."
invocation = "Ra'sha yoka!"
/obj/effect/rune/malformed/New()
@@ -153,9 +152,12 @@ structure_check() searches for nearby cultist structures required for the invoca
icon_state = "[rand(1,6)]"
color = rgb(rand(0,255), rand(0,255), rand(0,255))
/obj/effect/rune/malformed/invoke(mob/living/user)
user << "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>"
user.apply_damage(30, BRUTE)
/obj/effect/rune/malformed/invoke(var/list/invokers)
..()
for(var/M in invokers)
var/mob/living/L = M
L << "<span class='cultitalic'><b>You feel your life force draining. The Geometer is displeased.</b></span>"
L.apply_damage(30, BRUTE)
qdel(src)
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
@@ -164,15 +166,16 @@ structure_check() searches for nearby cultist structures required for the invoca
return N
return 0
//Rite of Binding: Turns a nearby rune and a paper on top of the rune to a talisman, if both are valid.
//Rite of Binding: A paper on top of the rune to a talisman.
/obj/effect/rune/imbue
cultist_name = "Create Talisman"
cultist_desc = "Transforms paper into powerful magic talismans."
invocation = null //no talisman made, no invocation.
cultist_desc = "transforms paper into powerful magic talismans."
invocation = "H'drak v'loso, mir'kanas verbot!"
icon_state = "3"
color = rgb(0, 0, 255)
/obj/effect/rune/imbue/invoke(mob/living/user)
/obj/effect/rune/imbue/invoke(var/list/invokers)
var/mob/living/user = invokers[1] //the first invoker is always the user
var/turf/T = get_turf(src)
var/list/papers_on_rune = list()
var/entered_talisman_name
@@ -184,12 +187,12 @@ structure_check() searches for nearby cultist structures required for the invoca
if(!papers_on_rune.len)
user << "<span class='cultitalic'>There must be a blank paper on top of [src]!</span>"
fail_invoke()
log_game("Talisman Imbue rune failed - no blank papers on rune")
log_game("Talisman Creation rune failed - no blank papers on rune")
return
if(rune_in_use)
user << "<span class='cultitalic'>[src] can only support one ritual at a time!</span>"
fail_invoke()
log_game("Talisman Imbue rune failed - more than one user")
log_game("Talisman Creation rune failed - already in use")
return
var/obj/item/weapon/paper/paper_to_imbue = pick(papers_on_rune)
for(var/I in subtypesof(/obj/item/weapon/paper/talisman) - /obj/item/weapon/paper/talisman/malformed - /obj/item/weapon/paper/talisman/supply)
@@ -198,10 +201,10 @@ structure_check() searches for nearby cultist structures required for the invoca
if(talisman_cult_name)
possible_talismans[talisman_cult_name] = J //This is to allow the menu to let cultists select talismans by name
entered_talisman_name = input(user, "Choose a talisman to imbue.", "Talisman Choices") as null|anything in possible_talismans
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
return
talisman_type = possible_talismans[entered_talisman_name]
user.say("H'drak v'loso, mir'kanas verbot!")
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use || !talisman_type)
return
..()
visible_message("<span class='warning'>Dark power begins to channel into the paper!.</span>")
rune_in_use = 1
if(!do_after(user, 100, target = get_turf(user)))
@@ -215,7 +218,7 @@ structure_check() searches for nearby cultist structures required for the invoca
var/list/teleport_runes = list()
/obj/effect/rune/teleport
cultist_name = "Teleport"
cultist_desc = "Warps everything above it to another chosen teleport rune."
cultist_desc = "warps everything above it to another chosen teleport rune."
invocation = "Sas'so c'arta forbici!"
icon_state = "2"
color = "#551A8B"
@@ -233,7 +236,8 @@ var/list/teleport_runes = list()
teleport_runes -= src
return ..()
/obj/effect/rune/teleport/invoke(mob/living/user)
/obj/effect/rune/teleport/invoke(var/list/invokers)
var/mob/living/user = invokers[1] //the first invoker is always the user
var/list/potential_runes = list()
var/list/teleportnames = list()
var/list/duplicaterunecount = list()
@@ -268,15 +272,22 @@ var/list/teleport_runes = list()
return
var/turf/T = get_turf(src)
var/turf/UT = get_turf(user)
var/movedsomething = 0
var/moveuserlater = 0
for(var/atom/movable/A in T)
if(A == user)
moveuserlater = 1
movedsomething = 1
continue
if(!A.anchored)
movedsomething = 1
A.forceMove(get_turf(actual_selected_rune))
if(movedsomething)
..()
visible_message("<span class='warning'>There is a sharp crack of inrushing air, and everything above the rune disappears!</span>")
user << "<span class='cult'>You[user.loc == UT ? " send everything above the rune away":"r vision blurs, and you suddenly appear somewhere else"].</span>"
user << "<span class='cult'>You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].</span>"
if(moveuserlater)
user.forceMove(get_turf(actual_selected_rune))
else
fail_invoke()
@@ -284,13 +295,13 @@ var/list/teleport_runes = list()
//Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby.
/obj/effect/rune/convert
cultist_name = "Convert"
cultist_desc = "Converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew."
cultist_desc = "converts a normal crewmember on top of it to the cult. Does not work on loyalty-implanted crew."
invocation = "Mah'weyh pleggh at e'ntrath!"
icon_state = "3"
color = rgb(255, 0, 0)
color = rgb(200, 0, 0)
req_cultists = 2
/obj/effect/rune/convert/invoke(mob/living/user)
/obj/effect/rune/convert/invoke(var/list/invokers)
var/list/convertees = list()
var/turf/T = get_turf(src)
for(var/mob/living/M in T.contents)
@@ -302,14 +313,14 @@ var/list/teleport_runes = list()
return
var/mob/living/new_cultist = pick(convertees)
if(!is_convertable_to_cult(new_cultist.mind) || new_cultist.null_rod_check())
user << "<span class='warning'>Something is shielding [new_cultist]'s mind!</span>"
for(var/M in invokers)
M << "<span class='warning'>Something is shielding [new_cultist]'s mind!</span>"
if(is_sacrifice_target(new_cultist.mind))
M << "<span class='cultlarge'>\"I desire this one for myself. <i>SACRIFICE THEM!</i>\"</span>"
fail_invoke()
log_game("Convert rune failed - convertee could not be converted")
if(is_sacrifice_target(new_cultist.mind))
for(var/mob/living/M in orange(1,src))
if(iscultist(M))
M << "<span class='cultlarge'>\"I desire this one for myself. <i>SACRIFICE THEM!</i>\"</span>"
return
..()
new_cultist.visible_message("<span class='warning'>[new_cultist] writhes in pain as the markings below them glow a bloody red!</span>", \
"<span class='cultlarge'><i>AAAAAAAAAAAAAA-</i></span>")
ticker.mode.add_cultist(new_cultist.mind)
@@ -323,8 +334,9 @@ var/list/teleport_runes = list()
//Rite of Tribute: Sacrifices a crew member to Nar-Sie. Places them into a soul shard if they're in their body.
/obj/effect/rune/sacrifice
cultist_name = "Sacrifice"
cultist_desc = "Sacrifices a crew member to the Geometer. May place them into a soul shard if their spirit remains in their body."
cultist_desc = "sacrifices a crew member to the Geometer. May place them into a soul shard if their spirit remains in their body."
icon_state = "3"
allow_excess_invokers = 1
invocation = "Barhah hra zar'garis!"
color = rgb(255, 255, 255)
rune_in_use = 0
@@ -333,13 +345,17 @@ var/list/teleport_runes = list()
..()
icon_state = "[rand(1,6)]"
/obj/effect/rune/sacrifice/invoke(mob/living/user)
/obj/effect/rune/sacrifice/invoke(var/list/invokers)
if(rune_in_use)
return
rune_in_use = 1
var/mob/living/user = invokers[1] //the first invoker is always the user
var/turf/T = get_turf(src)
var/list/possible_targets = list()
for(var/mob/living/M in T.contents)
if(M.mind)
if(M.mind in sacrificed)
continue
if(!iscultist(M))
possible_targets.Add(M)
var/mob/offering
@@ -360,46 +376,41 @@ var/list/teleport_runes = list()
rune_in_use = 0
return*/
if(((ishuman(offering) || isrobot(offering)) && offering.stat != DEAD) || is_sacrifice_target(offering.mind)) //Requires three people to sacrifice living targets
var/cultists_nearby = 1
for(var/mob/living/M in range(1,src))
if(iscultist(M) && M != user)
cultists_nearby++
M.say(invocation)
if(cultists_nearby < 3)
user << "<span class='cultitalic'>[offering] is too greatly linked to the world! You need three acolytes!</span>"
if(invokers.len < 3)
for(var/M in invokers)
M << "<span class='cultitalic'>[offering] is too greatly linked to the world! You need three acolytes!</span>"
fail_invoke()
log_game("Sacrifice rune failed - not enough acolytes and target is living")
rune_in_use = 0
return
visible_message("<span class='warning'>[src] pulses blood red!</span>")
color = rgb(126, 23, 23)
spawn(5)
color = initial(color)
sac(offering)
..()
sac(invokers, offering)
color = initial(color)
/obj/effect/rune/sacrifice/proc/sac(mob/living/T)
/obj/effect/rune/sacrifice/proc/sac(var/list/invokers, mob/living/T)
var/sacrifice_fulfilled
if(T)
if(istype(T, /mob/living/simple_animal/pet/dog))
for(var/mob/living/carbon/C in range(3,src))
if(iscultist(C))
C << "<span class='cultlarge'>\"Even I have standards, such as they are!\"</span>"
if(C.reagents)
C.reagents.add_reagent("hell_water", 2)
for(var/M in invokers)
var/mob/living/L = M
L << "<span class='cultlarge'>\"Even I have standards, such as they are!\"</span>"
if(L.reagents)
L.reagents.add_reagent("hell_water", 2)
if(T.mind)
sacrificed.Add(T.mind)
if(is_sacrifice_target(T.mind))
sacrifice_fulfilled = 1
PoolOrNew(/obj/effect/overlay/temp/cult/sac, src.loc)
for(var/mob/living/M in range(3,src))
if(iscultist(M))
if(sacrifice_fulfilled)
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
for(var/M in invokers)
if(sacrifice_fulfilled)
M << "<span class='cultlarge'>\"Yes! This is the one I desire! You have done well.\"</span>"
else
if(ishuman(T) || isrobot(T))
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
else
if(ishuman(T) || isrobot(T))
M << "<span class='cultlarge'>\"I accept this sacrifice.\"</span>"
else
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
M << "<span class='cultlarge'>\"I accept this meager sacrifice.\"</span>"
if(T.mind)
var/obj/item/device/soulstone/stone = new /obj/item/device/soulstone(get_turf(src))
stone.invisibility = INVISIBILITY_MAXIMUM //so it's not picked up during transfer_soul()
@@ -421,60 +432,67 @@ var/list/teleport_runes = list()
//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
/obj/effect/rune/narsie
cultist_name = "Summon Nar-Sie"
cultist_desc = "Tears apart dimensional barriers, calling forth the avatar of the Geometer."
invocation = null
cultist_desc = "tears apart dimensional barriers, calling forth the Geometer. Requires 9 invokers."
invocation = "TOK-LYR RQA-NAP G'OLT-ULOFT!!"
req_cultists = 9
icon = 'icons/effects/96x96.dmi'
color = rgb(125,23,23)
icon_state = "rune_large"
pixel_x = -32 //So the big ol' 96x96 sprite shows up right
pixel_y = -32
mouse_opacity = 1 //we're huge and easy to click
scribe_delay = 450 //how long the rune takes to create
scribe_damage = 40.1 //how much damage you take doing it
var/used
/obj/effect/rune/narsie/invoke(mob/living/user)
/obj/effect/rune/narsie/talismanhide() //can't hide this, and you wouldn't want to
return
/obj/effect/rune/narsie/invoke(var/list/invokers)
if(used)
return
var/mob/living/user = invokers[1]
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
if(!("eldergod" in cult_mode.cult_objectives))
message_admins("[usr.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong")
for(var/mob/living/M in range(1,src))
if(iscultist(M))
M << "<span class='cultlarge'><i>\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"</i></span>"
if(M.reagents)
M.reagents.add_reagent("hell_water", 10)
M.Weaken(7)
M.Stun(7)
message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong")
for(var/M in invokers)
var/mob/living/L = M
L << "<span class='cultlarge'><i>\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"</i></span>"
if(L.reagents)
L.reagents.add_reagent("hell_water", 10)
L.Weaken(7)
L.Stun(7)
fail_invoke()
log_game("Summon Nar-Sie rune failed - improper objective")
return
else
if(cult_mode.sacrifice_target && !(cult_mode.sacrifice_target in sacrificed))
for(var/mob/living/M in orange(1,src))
if(iscultist(M))
M << "<span class='warning'>The sacrifice is not complete. The portal lacks the power to open!</span>"
for(var/M in invokers)
M << "<span class='warning'>The sacrifice is not complete. The portal lacks the power to open!</span>"
fail_invoke()
log_game("Summon Nar-Sie rune failed - sacrifice not complete")
return
if(!cult_mode.eldergod)
for(var/mob/living/M in orange(1,src))
if(iscultist(M))
M << "<span class='warning'>The avatar of Nar-Sie is already on this plane!</span>"
log_game("Summon Nar-Sie rune failed - already summoned")
return
for(var/M in invokers)
M << "<span class='warning'>Nar-Sie is already on this plane!</span>"
log_game("Summon Nar-Sie rune failed - already summoned")
return
//BEGIN THE SUMMONING
used = 1
for(var/mob/living/M in range(1,src))
if(iscultist(M))
M.say("TOK-LYR RQA-NAP G'OLT-ULOFT!!")
color = rgb(255, 0, 0)
..()
world << 'sound/effects/dimensional_rend.ogg'
world << "<span class='cultitalic'><b>The veil... <span class='big'>is...</span> <span class='reallybig'>TORN!!!--</span></b></span>"
var/turf/T = get_turf(src)
sleep(40)
new /obj/singularity/narsie/large(get_turf(user)) //Causes Nar-Sie to spawn even if the rune has been removed
new /obj/singularity/narsie/large(T) //Causes Nar-Sie to spawn even if the rune has been removed
cult_mode.eldergod = 0
else
for(var/M in invokers)
M << "<span class='warning'>Nar-Sie does not respond!</span>"
fail_invoke()
log_game("Summon Nar-Sie rune failed - gametype is not cult")
return
/obj/effect/rune/narsie/attackby(obj/I, mob/user, params) //Since the narsie rune takes a long time to make, add logging to removal.
if((istype(I, /obj/item/weapon/tome) && iscultist(user)))
@@ -494,46 +512,39 @@ var/list/teleport_runes = list()
//Rite of Resurrection: Requires two corpses. Revives one and gibs the other.
/obj/effect/rune/raise_dead
cultist_name = "Raise Dead"
cultist_desc = "Requires two corpses. One on the rune and one adjacent to the rune. The one placed upon the rune is brought to life, the other is turned to ash."
cultist_desc = "requires two corpses, one on the rune and one adjacent to the rune. The one on the rune is brought to life, the other is turned to ash."
invocation = null //Depends on the name of the user - see below
icon_state = "1"
color = rgb(255, 0, 0)
color = rgb(200, 0, 0)
/obj/effect/rune/raise_dead/invoke(mob/living/user)
/obj/effect/rune/raise_dead/invoke(var/list/invokers)
var/turf/T = get_turf(src)
var/mob/living/mob_to_sacrifice
var/mob/living/mob_to_revive
var/list/potential_sacrifice_mobs = list()
var/list/potential_revive_mobs = list()
var/mob/living/user = invokers[1]
if(rune_in_use)
return
for(var/mob/living/M in orange(1,src))
if(!(M in T.contents) && M.stat == DEAD)
if(M.stat == DEAD)
potential_sacrifice_mobs.Add(M)
if(!potential_sacrifice_mobs.len)
user << "<span class='cultitalic'>There are no eligible sacrifices nearby!</span>"
log_game("Raise Dead rune failed - no catalyst corpse")
return
mob_to_sacrifice = input(user, "Choose a corpse to sacrifice.", "Corpse to Sacrifice") as null|anything in potential_sacrifice_mobs
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !mob_to_revive || !mob_to_sacrifice)
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !mob_to_revive || !mob_to_sacrifice || rune_in_use)
return
for(var/mob/living/M in T.contents)
if(M.stat == DEAD)
potential_revive_mobs.Add(M)
if(rune_in_use)
return
if(!potential_revive_mobs.len)
user << "<span class='cultitalic'>There is no eligible revival target on the rune!</span>"
log_game("Raise Dead rune failed - no corpse to revived")
return
mob_to_revive = input(user, "Choose a corpse to revive.", "Corpse to Revive") as null|anything in potential_revive_mobs
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
return
revive(mob_to_revive, mob_to_sacrifice, user, T)
//Begin revival
/obj/effect/rune/raise_dead/proc/revive(mob/living/mob_to_revive, mob/living/mob_to_sacrifice, mob/living/user, turf/T)
if(rune_in_use)
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || rune_in_use)
return
if(!in_range(mob_to_sacrifice,src))
user << "<span class='cultitalic'>The sacrificial target has been moved!</span>"
@@ -555,6 +566,7 @@ var/list/teleport_runes = list()
user.say("To life, to life, I bring them!")
else
user.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!")
..()
mob_to_sacrifice.visible_message("<span class='warning'><b>[mob_to_sacrifice]'s body rises into the air, connected to [mob_to_revive] by a glowing tendril!</span>")
mob_to_revive.Beam(mob_to_sacrifice,icon_state="sendbeam",icon='icons/effects/effects.dmi',time=20)
sleep(20)
@@ -574,7 +586,8 @@ var/list/teleport_runes = list()
/obj/effect/rune/raise_dead/fail_invoke()
for(var/mob/living/M in orange(1,src))
..()
for(var/mob/living/M in range(1,src))
if(M.stat == DEAD)
M.visible_message("<span class='warning'>[M] twitches.</span>")
@@ -582,46 +595,38 @@ var/list/teleport_runes = list()
//Rite of Disruption: Emits an EMP blast.
/obj/effect/rune/emp
cultist_name = "Electromagnetic Disruption"
cultist_desc = "Emits a large electromagnetic pulse, hindering electronics and disabling silicons."
cultist_desc = "emits a large electromagnetic pulse, increasing in size for each cultist invoking it, hindering electronics and disabling silicons."
invocation = "Ta'gh fara'qha fel d'amar det!"
icon_state = "5"
allow_excess_invokers = 1
color = rgb(77, 148, 255)
/obj/effect/rune/emp/invoke(mob/living/user)
/obj/effect/rune/emp/invoke(var/list/invokers)
var/turf/E = get_turf(src)
var/emp_strength = 0
for(var/mob/living/L in range(1, src))
if(iscultist(L))
var/mob/living/carbon/human/H = L
if(!istype(H))
if(istype(L, /mob/living/simple_animal/hostile/construct))
if(invocation)
L.say(invocation)
emp_strength++
continue
if(L.stat || (H.disabilities & MUTE) || H.silent)
continue
emp_strength++
..()
visible_message("<span class='warning'>[src] glows blue for a moment before vanishing.</span>")
for(var/mob/living/carbon/C in range(1,src))
switch(emp_strength)
if(1 to 2)
C << "<span class='warning'>You feel a minute vibration pass through you...</span>"
playsound(E, 'sound/items/Welder2.ogg', 25, 1)
if(3 to 6)
C << "<span class='danger'>Your hair stands on end as a shockwave eminates from the rune!</span>"
playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1)
if(7 to INFINITY)
C << "<span class=userdanger'>You chant in unison and a colossal burst of energy knocks you backward!</span>"
playsound(E, 'sound/magic/Disable_Tech.ogg', 100, 1)
C.Weaken(2)
switch(invokers.len)
if(1 to 2)
playsound(E, 'sound/items/Welder2.ogg', 25, 1)
for(var/M in invokers)
M << "<span class='warning'>You feel a minute vibration pass through you...</span>"
if(3 to 6)
playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1)
for(var/M in invokers)
M << "<span class='danger'>Your hair stands on end as a shockwave eminates from the rune!</span>"
if(7 to INFINITY)
playsound(E, 'sound/magic/Disable_Tech.ogg', 100, 1)
for(var/M in invokers)
var/mob/living/L = M
L << "<span class=userdanger'>You chant in unison and a colossal burst of energy knocks you backward!</span>"
L.Weaken(2)
qdel(src) //delete before pulsing because it's a delay reee
empulse(E, 9*emp_strength, 12*emp_strength) // Scales now, from a single room to most of the station depending on # of chanters
empulse(E, 9*invokers.len, 12*invokers.len) // Scales now, from a single room to most of the station depending on # of chanters
//Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active.
/obj/effect/rune/astral
cultist_name = "Astral Communion"
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."
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."
invocation = "Fwe'sh mah erl nyag r'ya!"
icon_state = "6"
color = rgb(126, 23, 23)
@@ -633,18 +638,22 @@ var/list/teleport_runes = list()
if(affecting)
user << "<span class='cultitalic'>A translucent field encases [user] above the rune!</span>"
/obj/effect/rune/astral/invoke(mob/living/user)
/obj/effect/rune/astral/can_invoke(mob/living/user)
if(rune_in_use)
user << "<span class='cultitalic'>[src] cannot support more than one body!</span>"
fail_invoke()
log_game("Astral Communion rune failed - more than one user")
return
return list()
var/turf/T = get_turf(src)
if(!user in T.contents)
user << "<span class='cultitalic'>You must be standing on top of [src]!</span>"
fail_invoke()
log_game("Astral Communion rune failed - user not standing on rune")
return
return list()
return ..()
/obj/effect/rune/astral/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
..()
var/turf/T = get_turf(src)
rune_in_use = 1
affecting = user
user.color = "#7e1717"
@@ -690,7 +699,7 @@ var/list/teleport_runes = list()
//Rite of the Corporeal Shield: When invoked, becomes solid and cannot be passed. Invoke again to undo.
/obj/effect/rune/wall
cultist_name = "Form Barrier"
cultist_desc = "When invoked, makes an invisible wall to block passage. Can be invoked again to reverse this."
cultist_desc = "when invoked, makes an invisible wall to block passage. Can be invoked again to reverse this."
invocation = "Khari'd! Eske'te tannin!"
icon_state = "1"
color = rgb(255, 0, 0)
@@ -700,7 +709,9 @@ var/list/teleport_runes = list()
if(density)
user << "<span class='cultitalic'>There is a barely perceptible shimmering of the air above [src].</span>"
/obj/effect/rune/wall/invoke(mob/living/user)
/obj/effect/rune/wall/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
..()
density = !density
user.visible_message("<span class='warning'>[user] places their hands on [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].</span>", \
"<span class='cultitalic'>You channel your life energy into [src], [density ? "preventing" : "allowing"] passage above it.</span>")
@@ -712,17 +723,20 @@ var/list/teleport_runes = list()
//Rite of Joined Souls: Summons a single cultist.
/obj/effect/rune/summon
cultist_name = "Summon Cultist"
cultist_desc = "Summons a single cultist to the rune."
cultist_desc = "summons a single cultist to the rune. Requires 2 invokers."
invocation = "N'ath reth sh'yro eth d'rekkathnor!"
req_cultists = 2
allow_excess_invokers = 1
icon_state = "5"
color = rgb(0, 255, 0)
/obj/effect/rune/summon/invoke(mob/living/user)
/obj/effect/rune/summon/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
var/list/cultists = list()
for(var/datum/mind/M in ticker.mode.cult)
cultists.Add(M.current)
var/mob/living/cultist_to_summon = input("Who do you wish to call to [src]?", "Followers of the Geometer") as null|anything in (cultists - user)
if(!(M.current in invokers))
cultists |= M.current
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
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
return
if(!cultist_to_summon)
@@ -740,10 +754,9 @@ var/list/teleport_runes = list()
fail_invoke()
log_game("Summon Cultist rune failed - target in away mission")
return
if(cultist_to_summon.buckled)
cultist_to_summon.buckled.unbuckle_mob(cultist_to_summon,force=1)
cultist_to_summon.visible_message("<span class='warning'>[cultist_to_summon] suddenly disappears in a flash of red light!</span>", \
"<span class='cultitalic'><b>Overwhelming vertigo consumes you as you are hurled through the air!</b></span>")
..()
visible_message("<span class='warning'>A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!</span>")
user.apply_damage(10, BRUTE, "head")
cultist_to_summon.forceMove(get_turf(src))
@@ -752,13 +765,14 @@ var/list/teleport_runes = list()
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
/obj/effect/rune/blood_boil
cultist_name = "Boil Blood"
cultist_desc = "Boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 chanters."
cultist_desc = "boils the blood of non-believers who can see the rune, dealing extreme amounts of damage. Requires 3 invokers."
invocation = "Dedo ol'btoh!"
icon_state = "4"
color = rgb(255, 0, 0)
color = rgb(200, 0, 0)
req_cultists = 3
/obj/effect/rune/blood_boil/invoke(mob/living/user)
/obj/effect/rune/blood_boil/invoke(var/list/invokers)
..()
visible_message("<span class='warning'>[src] briefly bubbles before exploding!</span>")
for(var/mob/living/carbon/C in viewers(src))
if(!iscultist(C))
@@ -769,10 +783,10 @@ var/list/teleport_runes = list()
C << "<span class='cultlarge'>Your blood boils in your veins!</span>"
C.take_overall_damage(45,45)
C.Stun(7)
for(var/mob/living/carbon/M in range(1,src))
if(iscultist(M))
M.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
M << "<span class='cultitalic'>[src] saps your strength!</span>"
for(var/M in invokers)
var/mob/living/L = M
L.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
L << "<span class='cultitalic'>[src] saps your strength!</span>"
explosion(get_turf(src), -1, 0, 1, 5)
qdel(src)
@@ -780,10 +794,10 @@ var/list/teleport_runes = list()
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
/obj/effect/rune/manifest
cultist_name = "Manifest Spirit"
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."
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."
invocation = "Gal'h'rfikk harfrandid mud'gib!" //how the fuck do you pronounce this
icon_state = "6"
color = rgb(255, 0, 0)
color = rgb(200, 0, 0)
/obj/effect/rune/manifest/New(loc)
..()
@@ -794,7 +808,7 @@ var/list/teleport_runes = list()
user << "<span class='cultitalic'>You must be standing on [src]!</span>"
fail_invoke()
log_game("Manifest rune failed - user not standing on rune")
return 0
return list()
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in get_turf(src))
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
@@ -803,10 +817,11 @@ var/list/teleport_runes = list()
user << "<span class='cultitalic'>There are no spirits near [src]!</span>"
fail_invoke()
log_game("Manifest rune failed - no nearby ghosts")
return 0
return list()
return ..()
/obj/effect/rune/manifest/invoke(mob/living/user)
/obj/effect/rune/manifest/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in get_turf(src))
if(O.client && !jobban_isbanned(O, ROLE_CULTIST))
@@ -815,6 +830,7 @@ var/list/teleport_runes = list()
var/mob/living/carbon/human/new_human = new(get_turf(src))
new_human.real_name = ghost_to_spawn.real_name
new_human.alpha = 150 //Makes them translucent
..()
visible_message("<span class='warning'>A cloud of red mist forms above [src], and from within steps... a man.</span>")
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>"
var/obj/machinery/shield/N = new(get_turf(src))
@@ -830,8 +846,8 @@ var/list/teleport_runes = list()
while(user in get_turf(src))
if(user.stat)
break
user.apply_damage(1, BRUTE)
sleep(30)
user.apply_damage(0.1, BRUTE)
sleep(3)
qdel(N)
if(new_human)
@@ -840,41 +856,3 @@ var/list/teleport_runes = list()
for(var/obj/I in new_human)
new_human.unEquip(I)
new_human.dust()
/*
//Rite of Dimensional Corruption: Stops time around the rune for all non-cultists.
/obj/effect/rune/timestop
cultist_name = "Time Stop"
cultist_desc = "Stops time around the rune for all non-cultists. Requires 3 chanters."
invocation = "T'ak ot'marzah oahr'du!"
icon_state = "2"
color = rgb(0, 0, 255)
req_cultists = 3
/obj/effect/rune/timestop/invoke(mob/living/user)
visible_message("<span class='warning'>[src] flares up for a moment, and then disappears into itself!</span>")
new /obj/effect/timestop/cult(get_turf(src))
for(var/mob/living/carbon/M in range(1,src))
if(iscultist(M))
M.apply_damage(20, BRUTE, "chest")
M << "<span class='cultitalic'>[src] temporarily stops your heart from beating!</span>"
qdel(src)
/obj/effect/timestop/cult
name = "Dimensional Corruption"
desc = "Something not from this world has corrupted the spacetime continuum in this exact spot."
icon = 'icons/effects/96x96.dmi'
icon_state = "rune_large"
pixel_x = -32
pixel_y = -32
duration = 50
alpha = 0
color = rgb(255, 0, 0)
/obj/effect/timestop/cult/timestop()
animate(src, alpha = 255, time = 5, loop = -1)
SpinAnimation(speed = 5)
for(var/mob/living/M in player_list)
if(iscultist(M) || M.null_rod_check())
immune |= M
..()
*/
+36 -41
View File
@@ -55,13 +55,13 @@
var/dat = "<B>There are [uses] bloody runes on the parchment.</B><BR>"
dat += "Please choose the chant to be imbued into the fabric of reality.<BR>"
dat += "<HR>"
dat += "<A href='?src=\ref[src];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Allows you to summon an arcane tome.<BR>"
dat += "<A href='?src=\ref[src];rune=newtome'>N'ath reth sh'yro eth d'raggathnor!</A> - Summons an arcane tome, used to scribe runes and communicate with other cultists.<BR>"
dat += "<A href='?src=\ref[src];rune=teleport'>Sas'so c'arta forbici!</A> - Allows you to move to a selected teleportation rune.<BR>"
dat += "<A href='?src=\ref[src];rune=emp'>Ta'gh fara'qha fel d'amar det!</A> - Allows you to destroy technology in a short range.<BR>"
dat += "<A href='?src=\ref[src];rune=runestun'>Fuu ma'jin!</A> - Allows you to stun a person by attacking them with the talisman.<BR>"
dat += "<A href='?src=\ref[src];rune=soulstone'>Kal'om neth!</A> - Summons a soul stone, used to capure the spirits of dead or dying humans.<BR>"
dat += "<A href='?src=\ref[src];rune=construct'>Daa'ig osk!</A> - Summons a construct shell for use with captured souls. It is too large to carry on your person.<BR>"
dat += "<A href='?src=\ref[src];rune=veiling'>Kla'atu barada nikt'o!</A> - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.<BR>"
dat += "<A href='?src=\ref[src];rune=soulstone'>Kal'om neth!</A> - Summons a soul stone, used to capure the spirits of dead or dying humans.<BR>"
dat += "<A href='?src=\ref[src];rune=construct'>Daa'ig osk!</A> - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.<BR>"
var/datum/browser/popup = new(user, "talisman", "", 400, 400)
popup.set_content(dat)
popup.open()
@@ -176,16 +176,12 @@
invocation = "Nikt'o barada kla'atu!"
revealing = TRUE
for(var/obj/effect/rune/R in range(3,user))
R.visible_message("<span class='danger'>[R] fades away.</span>")
R.invisibility = INVISIBILITY_OBSERVER
R.alpha = 100 //To help ghosts distinguish hidden runes
R.talismanhide()
else
user.visible_message("<span class='warning'>A flash of light shines from [user]'s hand!</span>", \
"<span class='cultitalic'>You speak the words of the talisman, revealing nearby runes.</span>")
for(var/obj/effect/rune/R in range(3,user))
R.invisibility = 0
R.visible_message("<span class='danger'>[R] suddenly appears!</span>")
R.alpha = initial(R.alpha)
R.talismanreveal()
//Rite of False Truths: Same as rune
/obj/item/weapon/paper/talisman/make_runes_fake
@@ -201,6 +197,7 @@
for(var/obj/effect/rune/R in orange(6,user))
R.desc = "A rune drawn in crayon."
//Rite of Disruption: Weaker than rune
/obj/item/weapon/paper/talisman/emp
cultist_name = "Talisman of Electromagnetic Pulse"
@@ -215,6 +212,7 @@
"<span class='cultitalic'>You speak the words of the talisman, emitting an EMP blast.</span>")
empulse(src, 4, 8)
//Rite of Disorientation: Stuns and inhibit speech on a single target for quite some time
/obj/item/weapon/paper/talisman/stun
cultist_name = "Talisman of Stunning"
@@ -259,6 +257,7 @@
return
..()
//Rite of Arming: Equips cultist armor on the user, where available
/obj/item/weapon/paper/talisman/armor
cultist_name = "Talisman of Arming"
@@ -286,6 +285,7 @@
return
..()
//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations
/obj/item/weapon/paper/talisman/horror
cultist_name = "Talisman of Horrors"
@@ -295,12 +295,13 @@
/obj/item/weapon/paper/talisman/horror/attack(mob/living/target, mob/living/user)
if(iscultist(user))
user.visible_message("<span class='cultitalic'>You disturb [target] with visons of the end!</span>")
user << "<span class='cultitalic'>You disturb [target] with visons of the end!</span>"
if(iscarbon(target))
var/mob/living/carbon/H = target
H.reagents.add_reagent("mindbreaker", 25)
qdel(src)
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets.
/obj/item/weapon/paper/talisman/construction
cultist_name = "Talisman of Construction"
@@ -319,7 +320,7 @@
if(iscultist(user))
user << "<span class='cultitalic'>This talisman will only work on a stack of metal sheets!</span>"
log_game("Construct talisman failed - not a valid target")
/obj/item/weapon/paper/talisman/construction/afterattack(obj/item/stack/sheet/metal/target, mob/user, proximity_flag, click_parameters)
..()
if(proximity_flag && istype(target) && iscultist(user))
@@ -330,23 +331,7 @@
qdel(src)
else
user << "<span class='warning'>The talisman requires at least 25 sheets of metal!</span>"
/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling
name = "cult shackles"
desc = "shackles that bind the wrists with sinister magic."
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
origin_tech = "materials=2;magnets=5"
/obj/item/weapon/restraints/handcuffs/energy/cult/used
desc = "magical remnants"
/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user)
user.visible_message("<span class='danger'>Your [src] shatter in a discharge of dark magic!</span>", \
"<span class='userdanger'>[user]'s [src] shatters in a discharge of dark magic!</span>")
var/datum/effect_system/spark_spread/S = new
S.set_up(4,0,user.loc)
S.start()
qdel(src)
//Talisman of Shackling: Applies special cuffs directly from the talisman
/obj/item/weapon/paper/talisman/shackle
@@ -365,26 +350,21 @@
user << "<span class='danger'>There are indecipherable images scrawled on the paper in what looks to be... <i>blood?</i></span>"
return 0
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/target, mob/living/user)
if(iscultist(user))
if(isrobot(target))
..()
return
if(!isliving(target))
/obj/item/weapon/paper/talisman/shackle/attack(mob/living/carbon/target, mob/living/user)
if(iscultist(user) && istype(target))
if(target.stat == DEAD)
user.visible_message("<span class='cultitalic'>This talisman's magic does not affect the dead!</span>")
return
var/mob/living/L = target
if(ishuman(L))
CuffAttack(L,user)
/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/L,mob/living/user)
if(!iscarbon(L))
CuffAttack(target, user)
return
var/mob/living/carbon/C = L
..()
/obj/item/weapon/paper/talisman/shackle/proc/CuffAttack(mob/living/carbon/C, mob/living/user)
if(!C.handcuffed)
invoke(user, 1)
playsound(loc, 'sound/weapons/cablecuff.ogg', 30, 1, -2)
C.visible_message("<span class='danger'>[user] begins restraining [C] with dark magic!</span>", \
"<span class='userdanger'>[user] begins shaping an dark magic around your wrists!</span>")
"<span class='userdanger'>[user] begins shaping a dark magic around your wrists!</span>")
if(do_mob(user, C, 30))
if(!C.handcuffed)
C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C)
@@ -392,9 +372,24 @@
user << "<span class='notice'>You shackle [C].</span>"
add_logs(user, C, "handcuffed")
uses--
else
user << "<span class='warning'>[C] is already bound.</span>"
else
user << "<span class='warning'>You fail to shackle [C].</span>"
else
user << "<span class='warning'>[C] is already bound.</span>"
if(uses <= 0)
user.drop_item()
qdel(src)
return
/obj/item/weapon/restraints/handcuffs/energy/cult //For the talisman of shackling
name = "cult shackles"
desc = "Shackles that bind the wrists with sinister magic."
trashtype = /obj/item/weapon/restraints/handcuffs/energy/used
origin_tech = "materials=2;magnets=5"
/obj/item/weapon/restraints/handcuffs/energy/cult/used/dropped(mob/user)
user.visible_message("<span class='danger'>[user]'s [src] shatter in a discharge of dark magic!</span>", \
"<span class='userdanger'>Your [src] shatters in a discharge of dark magic!</span>")
qdel(src)
+74 -100
View File
@@ -7,7 +7,6 @@
w_class = 1
slot_flags = SLOT_BELT
origin_tech = "bluespace=4;materials=4"
var/imprinted = "empty"
var/usability = 0
/obj/item/device/soulstone/anybody
@@ -19,6 +18,12 @@
user << "<span class='danger'>An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly.</span>"
user.Dizzy(120)
/obj/item/device/soulstone/examine(mob/user)
..()
if(usability || iscultist(user) || iswizard(user) || user.stat == DEAD)
user << "<span class='cult'>A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades.</span>"
user << "<span class='cult'>The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade.</span>"
//////////////////////////////Capturing////////////////////////////////////////////////////////
/obj/item/device/soulstone/attack(mob/living/carbon/human/M, mob/user)
@@ -28,10 +33,8 @@
return
if(!istype(M, /mob/living/carbon/human))//If target is not a human.
return ..()
if(istype(M, /mob/living/carbon/human/dummy))
return ..()
if(iscultist(M))
user << "<span class='cultlarge'>You shouldn't do that.</span>"
user << "<span class='cultlarge'>\"Come now, do not capture your fellow's soul.\"</span>"
return
add_logs(user, M, "captured [M.name]'s soul", src)
@@ -41,53 +44,23 @@
///////////////////Options for using captured souls///////////////////////////////////////
/obj/item/device/soulstone/attack_self(mob/user)
if (!in_range(src, user))
if(!in_range(src, user))
return
if(!iscultist(user) && !iswizard(user) && !usability)
user.Paralyse(5)
user << "<span class='userdanger'>Your body is wracked with debilitating pain!</span>"
return
user.set_machine(src)
var/dat = "<TT><B>Soul Stone</B><BR>"
for(var/mob/living/simple_animal/shade/A in src)
dat += "Captured Soul: [A.name]<br>"
dat += {"<A href='byond://?src=\ref[src];choice=Summon'>Summon Shade</A>"}
dat += "<br>"
dat += {"<a href='byond://?src=\ref[src];choice=Close'>Close</a>"}
user << browse(dat, "window=aicard")
onclose(user, "aicard")
return
/obj/item/device/soulstone/Topic(href, href_list)
var/mob/U = usr
if (!in_range(src, U)||U.machine!=src)
U << browse(null, "window=aicard")
U.unset_machine()
return
add_fingerprint(U)
U.set_machine(src)
switch(href_list["choice"])//Now we switch based on choice.
if ("Close")
U << browse(null, "window=aicard")
U.unset_machine()
return
if ("Summon")
for(var/mob/living/simple_animal/shade/A in src)
A.status_flags &= ~GODMODE
A.canmove = 1
A.loc = U.loc
A.cancel_camera()
src.icon_state = "soulstone"
if(iswizard(U) || usability)
A << "<b>You have been released from your prison, but you are still bound to [U.real_name]'s will. Help them succeed in their goals at all costs.</b>"
else if(iscultist(U))
A << "<b>You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.</b>"
attack_self(U)
A.status_flags &= ~GODMODE
A.canmove = 1
A.forceMove(get_turf(user))
A.cancel_camera()
icon_state = "soulstone"
name = initial(name)
if(iswizard(user) || usability)
A << "<b>You have been released from your prison, but you are still bound to [user.real_name]'s will. Help them succeed in their goals at all costs.</b>"
else if(iscultist(user))
A << "<b>You have been released from your prison, but you are still bound to the cult's will. Help them succeed in their goals at all costs.</b>"
///////////////////////////Transferring to constructs/////////////////////////////////////////////////////
/obj/structure/constructshell
@@ -96,6 +69,15 @@
icon_state = "construct"
desc = "A wicked machine used by those skilled in magical arts. It is inactive."
/obj/structure/constructshell/examine(mob/user)
..()
if(iscultist(user) || iswizard(user) || user.stat == DEAD)
user << "<span class='cult'>A construct shell, used to house bound souls from a soulstone.</span>"
user << "<span class='cult'>Placing a soulstone with a soul into this shell allows you to produce your choice of the following:</span>"
user << "<span class='cult'>An <b>Artificer</b>, which can produce <b>more shells and soulstones</b>, as well as fortifications.</span>"
user << "<span class='cult'>A <b>Wraith</b>, which does high damage and can jaunt through walls, though it is quite fragile.</span>"
user << "<span class='cult'>A <b>Juggernaut</b>, which is very hard to kill and can produce temporary walls, but is slow.</span>"
/obj/structure/constructshell/attackby(obj/item/O, mob/user, params)
if(istype(O, /obj/item/device/soulstone))
var/obj/item/device/soulstone/SS = O
@@ -121,56 +103,50 @@
if(T.client != null)
for(var/obj/item/W in T)
T.unEquip(W)
init_shade(src, T, user)
init_shade(T, user)
return 1
else
user << "<span class='userdanger'>Capture failed!</span>: The soul has already fled its mortal frame. You attempt to bring it back..."
return getCultGhost(src,T,user)
return getCultGhost(T,user)
if("VICTIM")
var/mob/living/carbon/human/T = target
if(ticker.mode.name == "cult" && T.mind == ticker.mode:sacrifice_target)
if(iscultist(user))
user << "<span class='danger'>The Geometer of blood wants this mortal sacrificed with the rune.</span>"
user << "<span class='cult'><b>\"This soul is mine.</b></span> <span class='cultlarge'>SACRIFICE THEM!\"</span>"
else
user << "<span class='danger'>The soul stone doesn't work for no apparent reason.</span>"
user << "<span class='danger'>The soulstone doesn't work for no apparent reason.</span>"
return 0
if(imprinted != "empty")
user << "<span class='userdanger'>Capture failed!</span>: The soul stone has already been imprinted with [imprinted]'s mind!"
if(contents.len)
user << "<span class='userdanger'>Capture failed!</span>: The soulstone is full! Free an existing soul to make room."
else
if (T.stat == 0)
user << "<span class='userdanger'>Capture failed!</span>: Kill or maim the victim first!"
else
if(T.stat != CONSCIOUS)
if(T.client == null)
user << "<span class='userdanger'>Capture failed!</span>: The soul has already fled its mortal frame. You attempt to bring it back..."
getCultGhost(src,T,user)
getCultGhost(T,user)
else
if(contents.len)
user << "<span class='userdanger'>Capture failed!</span>: The soul stone is full! Use or free an existing soul to make room."
else
for(var/obj/item/W in T)
T.unEquip(W)
init_shade(src, T, user, vic = 1)
qdel(T)
for(var/obj/item/W in T)
T.unEquip(W)
init_shade(T, user, vic = 1)
qdel(T)
else
user << "<span class='userdanger'>Capture failed!</span>: Kill or maim the victim first!"
if("SHADE")
var/mob/living/simple_animal/shade/T = target
if (T.stat == DEAD)
user << "<span class='userdanger'>Capture failed!</span>: The shade has already been banished!"
if(contents.len)
user << "<span class='userdanger'>Capture failed!</span>: The soulstone is full! Free an existing soul to make room."
else
if(contents.len)
user << "<span class='userdanger'>Capture failed!</span>: The soul stone is full! Use or free an existing soul to make room."
else
if(T.name != imprinted)
user << "<span class='userdanger'>Capture failed!</span>: The soul stone has already been imprinted with [imprinted]'s mind!"
else
T.loc = src //put shade in stone
T.status_flags |= GODMODE
T.canmove = 0
T.health = T.maxHealth
icon_state = "soulstone2"
T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form"
if(user != T)
user << "<span class='info'><b>Capture successful!</b>:</span> [T.real_name]'s has been recaptured and stored within the soul stone."
T.loc = src //put shade in stone
T.status_flags |= GODMODE
T.canmove = 0
T.health = T.maxHealth
icon_state = "soulstone2"
name = "soulstone: Shade of [T.real_name]"
T << "<span class='notice'>Your soul has been captured by the soulstone. Its arcane energies are reknitting your ethereal form.</span>"
if(user != T)
user << "<span class='info'><b>Capture successful!</b>:</span> [T.real_name]'s soul has been captured and stored within the soulstone."
if("CONSTRUCT")
var/obj/structure/constructshell/T = target
var/mob/living/simple_animal/shade/A = locate() in src
@@ -193,6 +169,7 @@
makeNewConstruct(/mob/living/simple_animal/hostile/construct/builder/noncult, A, user, 0, T.loc)
qdel(T)
user.drop_item()
qdel(src)
else
user << "<span class='userdanger'>Creation failed!</span>: The soul stone is empty! Go kill someone!"
@@ -203,22 +180,22 @@
var/mob/living/simple_animal/hostile/construct/newstruct = new ctype((loc_override) ? (loc_override) : (get_turf(target)))
newstruct.faction |= "\ref[stoner]"
newstruct.key = target.key
if(stoner && iscultist(stoner) || cultoverride)
if(ticker.mode.name == "cult")
ticker.mode:add_cultist(newstruct.mind)
else
ticker.mode.cult+=newstruct.mind
ticker.mode.update_cult_icons_added(newstruct.mind)
if(newstruct.mind)
if(stoner && iscultist(stoner) || cultoverride)
if(ticker.mode.name == "cult")
ticker.mode:add_cultist(newstruct.mind)
else
ticker.mode.cult += newstruct.mind
ticker.mode.update_cult_icons_added(newstruct.mind)
newstruct << newstruct.playstyle_string
if(stoner && iswizard(stoner))
newstruct << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
else if(stoner && iscultist(stoner))
newstruct << "<B>You are still bound to serve the cult, follow their orders and help them complete their goals at all costs.</B>"
else newstruct << "<B>You are still bound to serve your creator, follow their orders and help them complete their goals at all costs.</B>"
if(iscultist(stoner))
newstruct << "<b>You are still bound to serve the cult and [stoner], follow their orders and help them complete their goals at all costs.</b>"
else
newstruct << "<b>You are still bound to serve your creator, [stoner], follow their orders and help them complete their goals at all costs.</b>"
newstruct.cancel_camera()
/obj/item/device/soulstone/proc/init_shade(obj/item/device/soulstone/C, mob/living/carbon/human/T, mob/U, vic = 0)
/obj/item/device/soulstone/proc/init_shade(mob/living/carbon/human/T, mob/U, vic = 0)
new /obj/effect/decal/remains/human(T.loc) //Spawns a skeleton
T.invisibility = INVISIBILITY_ABSTRACT
var/atom/movable/overlay/animation = new /atom/movable/overlay( T.loc )
@@ -227,8 +204,7 @@
animation.master = T
flick("dust-h", animation)
qdel(animation)
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade( T.loc )
S.loc = C //put shade in stone
var/mob/living/simple_animal/shade/S = new /mob/living/simple_animal/shade(src)
S.status_flags |= GODMODE //So they won't die inside the stone somehow
S.canmove = 0//Can't move out of the soul stone
S.name = "Shade of [T.real_name]"
@@ -239,19 +215,17 @@
if(U && iscultist(U))
ticker.mode.add_cultist(S.mind,2)
S.cancel_camera()
C.icon_state = "soulstone2"
C.name = "Soul Stone: [S.real_name]"
name = "soulstone: Shade of [T.real_name]"
icon_state = "soulstone2"
if(U && (iswizard(U) || usability))
S << "Your soul has been captured! You are now bound to [U.real_name]'s will. Help them succeed in their goals at all costs."
else if(U && iscultist(U))
S << "Your soul has been captured! You are now bound to the cult's will. Help them succeed in their goals at all costs."
C.imprinted = "[S.name]"
if(vic && U)
U << "<span class='info'><b>Capture successful!</b>:</span> [T.real_name]'s soul has been ripped from their body and stored within the soul stone."
U << "The soulstone has been imprinted with [S.real_name]'s mind, it will no longer react to other souls."
/obj/item/device/soulstone/proc/getCultGhost(obj/item/device/soulstone/C, mob/living/carbon/human/T, mob/U)
/obj/item/device/soulstone/proc/getCultGhost(mob/living/carbon/human/T, mob/U)
var/mob/dead/observer/chosen_ghost
for(var/mob/dead/observer/ghost in player_list) //We put them back in their body
@@ -266,13 +240,13 @@
if(!T)
return 0
if(!chosen_ghost)
U << "<span class='danger'>The ghost has fled beyond your grasp.</span>"
U << "<span class='danger'>There were no spirits willing to become a shade.</span>"
return 0
if(C.contents.len) //If they used the soulstone on someone else in the meantime
if(contents.len) //If they used the soulstone on someone else in the meantime
return 0
T.ckey = chosen_ghost.ckey
for(var/obj/item/W in T)
T.unEquip(W)
init_shade(C, T, U)
init_shade(T, U)
qdel(T)
return 1
@@ -329,10 +329,3 @@
icon_state = "bola_r"
breakouttime = 70
weaken = 1
/obj/item/weapon/restraints/legcuffs/bola/cult //cult variant, comes with armament talisman
name = "nar'sian bola"
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
icon_state = "bola_cult"
breakouttime = 45
weaken = 1