mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-15 01:54:52 +01:00
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:
@@ -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()
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
@@ -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
|
||||
..()
|
||||
*/
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user