diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index 6b619838ded..62f0ba655ee 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -75,7 +75,7 @@
/datum/game_mode/cult/announce()
world << "The current game mode is - Cult!"
- world << "Some crewmembers are attempting to start a cult!
\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.
\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."
+ world << "Some crewmembers are attempting to start a cult!
\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.
\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."
/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 << "Objective #[obj_count]: [explanation]"
cult_mind.memory += "Objective #[obj_count]: [explanation]
"
/datum/game_mode/cult/post_setup()
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 8b8b70de1b9..680317bb768 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -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"
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 3002178f3f7..0f3498015c9 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -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 << "The scriptures of the Geometer. Allows the scribing of runes and access to the knowledge archives of the cult of Nar-Sie."
+ user << "Striking another cultist with it will purge holy water from them."
+ user << "Striking a noncultist, however, will sear their flesh."
/obj/item/weapon/tome/attack(mob/living/M, mob/living/user)
- if(istype(M,/mob/dead/observer))
- M.invisibility = 0
- user.visible_message("[user] strikes the air with [src], and a ghost appears!", \
- "You drag the ghost to your plane of reality!")
- 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 += "
Archives of the Dark One
"
text += "A rune's name and effects can be revealed by examining the rune.<
"
- text += "Imbue Talisman
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.
"
+ text += "Create Talisman
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.
"
- text += "Teleport
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 += "Teleport
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.
"
- text += "Convert
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.
"
+ text += "Convert
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.
\
+ Successful conversions will produce a tome for the new cultist.
"
- text += "Sacrifice
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.
"
+ text += "Sacrifice
This rune 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 soulstone will be created and the creature's soul transported to it. Sacrificing the dead can be done alone, but sacrificing living crew or your cult's target will require 3 cultists. \
+ Soulstones used on construct shells will move that soul into a powerful construct of your choice.
"
- text += "Raise Dead
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 += "Raise Dead
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.
"
- text += "Electromagnetic Disruption
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 += "Electromagnetic Disruption
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.
"
- text += "Astral Communion
The Rune of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \
+ text += "Astral Communion
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.
"
- text += "Form Barrier
While simple, the Barrier Rune serves an important purpose in defense and hindering passage. When invoked, the \
+ text += "Form Barrier
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.
"
- text += "Summon Cultist
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.
"
+ text += "Summon Cultist
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.
"
- text += "Blood Boil
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.
"
+ text += "Blood Boil
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.
"
- text += "Manifest Spirit
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 += "Manifest Spirit
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.
"
- text += "Summon Nar-Sie
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.
"
+ text += "Summon Nar-Sie
This rune is necessary to achieve your goals. 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.
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.
"
- text += "Talisman of Teleportation
The talisman form of the Rite of Translocation will transport the invoker to a randomly chosen rune of the same keyword, then \
- disappear.
"
+ text += "Talisman of Teleportation
The talisman form of the Teleport rune will transport the invoker to a selected Teleport rune once.
"
- text += "Talisman of Construction
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.
"
+ text += "Talisman of Construction
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.
"
- text += "Talisman of Tome Summoning
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.
"
+ text += "Talisman of Tome Summoning
This talisman will produce a single tome at your feet.
"
- text += "Talismans of Veiling and Disguising
These talismans will hide, reveal, or disguise (as crayon drawings) all nearby runes.
"
+ text += "Talisman of Veiling/Revealing
This talisman will hide runes on its first use, and on the second, will reveal runes.
"
- text += "Talisman of Electromagnetic Pulse
This talisman will EMP the target and anything else nearby. It disappears after one use.
"
+ text += "Talisman of Disguising
This talisman will permanently disguise all nearby runes as crayon runes.
"
- text += "Talisman of Stunning
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.
"
+ text += "Talisman of Electromagnetic Pulse
This talisman will EMP anything else nearby. It disappears after one use.
"
+
+ text += "Talisman of Stunning
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.
"
text += "Talisman of Armaments
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.
"
+ be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.
"
text += "Talisman of Horrors
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.
"
text += "Talisman of Shackling
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.
"
-
+
text += "In addition to these runes, the cult has a small selection of equipment and constructs.
"
text += "Equipment:
"
- text += "Cult Blade
Cult blades are a sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Rite and Talisman of Arming.
"
+ text += "Cult Blade
Cult blades are sharp weapons that, notably, cannot be used by noncultists. These blades are produced by the Talisman of Arming.
"
- text += "Cult Robes
Cult robes are heavily armored robes. These robes are produced by the Rite and Talisman of Arming.
"
+ text += "Cult Bola
Cult bolas are strong bolas, useful for snaring targets. These bolas are produced by the Talisman of Arming.
"
+
+ text += "Cult Robes
Cult robes are heavily armored robes. These robes are produced by the Talisman of Arming.
"
text += "Soulstone
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. \
-
The soul within can also be released as a Shade.
"
+
The soul within can also be released as a Shade by using it in-hand.
"
text += "Construct Shell
A construct shell is useless on its own, but placing a filled soulstone within it allows you to produce your choice of a Wraith, a Juggernaut, or an Artificer. \
Each construct has uses, detailed below in Constructs. Construct shells can be produced via the starter talisman or the Rite of Fabrication.
"
@@ -240,14 +235,14 @@ This file contains the arcane tome files as well as innate cultist emergency com
text += "Artificer
The Artificer is a weak and fragile construct, able to heal other constructs, produce more soulstones and construct shells, \
construct fortifying cult walls and flooring, and finally, it can release a few indiscriminate stunning missiles.
"
- text += "Harvester
If you see one, know that you have done all you can and your life is void.
"
-
+ text += "Harvester
If you see one, know that you have done all you can and your life is void.
"
+
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 << "There is already a rune here."
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("[user] cuts open their arm and begins writing in their own blood!", \
"You slice open your arm and begin drawing a sigil of the Geometer.")
- 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 << "There is already a rune here."
+ return
user.visible_message("[user] creates a strange circle in their own blood.", \
"You finish drawing the arcane markings of the Geometer.")
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 << "The [lowertext(initial(rune_to_scribe.cultist_name))] rune [initial(rune_to_scribe.cultist_desc)]"
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index da4d25943c1..467d63431b5 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -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 << "Name: [cultist_name]"
- user << "Effects: [cultist_desc]"
+ user << "Effects: [capitalize(cultist_desc)]"
user << "Required Acolytes: [req_cultists]"
if(req_keyword && keyword)
user << "Keyword: [keyword]"
/obj/effect/rune/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/tome) && iscultist(user))
- user << "You carefully erase [src]."
+ user << "You carefully erase the [lowertext(cultist_name)] rune."
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 << "You aren't able to understand the words of [src]."
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("[src] fades away.")
+ 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("[src] suddenly appears!")
+ 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("The markings pulse with a small flash of red light, then fall dark.")
-
-/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 << "You feel your life force draining. The Geometer is displeased."
- user.apply_damage(30, BRUTE)
+/obj/effect/rune/malformed/invoke(var/list/invokers)
+ ..()
+ for(var/M in invokers)
+ var/mob/living/L = M
+ L << "You feel your life force draining. The Geometer is displeased."
+ 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 << "There must be a blank paper on top of [src]!"
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 << "[src] can only support one ritual at a time!"
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("Dark power begins to channel into the paper!.")
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("There is a sharp crack of inrushing air, and everything above the rune disappears!")
- user << "You[user.loc == UT ? " send everything above the rune away":"r vision blurs, and you suddenly appear somewhere else"]."
+ user << "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"]."
+ 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 << "Something is shielding [new_cultist]'s mind!"
+ for(var/M in invokers)
+ M << "Something is shielding [new_cultist]'s mind!"
+ if(is_sacrifice_target(new_cultist.mind))
+ M << "\"I desire this one for myself. SACRIFICE THEM!\""
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 << "\"I desire this one for myself. SACRIFICE THEM!\""
return
+ ..()
new_cultist.visible_message("[new_cultist] writhes in pain as the markings below them glow a bloody red!", \
"AAAAAAAAAAAAAA-")
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 << "[offering] is too greatly linked to the world! You need three acolytes!"
+ if(invokers.len < 3)
+ for(var/M in invokers)
+ M << "[offering] is too greatly linked to the world! You need three acolytes!"
fail_invoke()
log_game("Sacrifice rune failed - not enough acolytes and target is living")
rune_in_use = 0
return
visible_message("[src] pulses blood red!")
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 << "\"Even I have standards, such as they are!\""
- if(C.reagents)
- C.reagents.add_reagent("hell_water", 2)
+ for(var/M in invokers)
+ var/mob/living/L = M
+ L << "\"Even I have standards, such as they are!\""
+ 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 << "\"Yes! This is the one I desire! You have done well.\""
+ for(var/M in invokers)
+ if(sacrifice_fulfilled)
+ M << "\"Yes! This is the one I desire! You have done well.\""
+ else
+ if(ishuman(T) || isrobot(T))
+ M << "\"I accept this sacrifice.\""
else
- if(ishuman(T) || isrobot(T))
- M << "\"I accept this sacrifice.\""
- else
- M << "\"I accept this meager sacrifice.\""
+ M << "\"I accept this meager sacrifice.\""
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 << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\""
- 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 << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\""
+ 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 << "The sacrifice is not complete. The portal lacks the power to open!"
+ for(var/M in invokers)
+ M << "The sacrifice is not complete. The portal lacks the power to open!"
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 << "The avatar of Nar-Sie is already on this plane!"
- log_game("Summon Nar-Sie rune failed - already summoned")
- return
+ for(var/M in invokers)
+ M << "Nar-Sie is already on this plane!"
+ 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 << "The veil... is... TORN!!!--"
+ 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 << "Nar-Sie does not respond!"
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 << "There are no eligible sacrifices nearby!"
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 << "There is no eligible revival target on the rune!"
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 << "The sacrificial target has been moved!"
@@ -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("[mob_to_sacrifice]'s body rises into the air, connected to [mob_to_revive] by a glowing tendril!")
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("[M] twitches.")
@@ -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("[src] glows blue for a moment before vanishing.")
- for(var/mob/living/carbon/C in range(1,src))
- switch(emp_strength)
- if(1 to 2)
- C << "You feel a minute vibration pass through you..."
- playsound(E, 'sound/items/Welder2.ogg', 25, 1)
- if(3 to 6)
- C << "Your hair stands on end as a shockwave eminates from the rune!"
- playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1)
- if(7 to INFINITY)
- C << "You chant in unison and a colossal burst of energy knocks you backward!"
- 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 << "You feel a minute vibration pass through you..."
+ if(3 to 6)
+ playsound(E, 'sound/magic/Disable_Tech.ogg', 50, 1)
+ for(var/M in invokers)
+ M << "Your hair stands on end as a shockwave eminates from the rune!"
+ if(7 to INFINITY)
+ playsound(E, 'sound/magic/Disable_Tech.ogg', 100, 1)
+ for(var/M in invokers)
+ var/mob/living/L = M
+ L << "You chant in unison and a colossal burst of energy knocks you backward!"
+ 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 << "A translucent field encases [user] above the rune!"
-/obj/effect/rune/astral/invoke(mob/living/user)
+/obj/effect/rune/astral/can_invoke(mob/living/user)
if(rune_in_use)
user << "[src] cannot support more than one body!"
- 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 << "You must be standing on top of [src]!"
- 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 << "There is a barely perceptible shimmering of the air above [src]."
-/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("[user] places their hands on [src], and [density ? "the air above it begins to shimmer" : "the shimmer above it fades"].", \
"You channel your life energy into [src], [density ? "preventing" : "allowing"] passage above it.")
@@ -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("[cultist_to_summon] suddenly disappears in a flash of red light!", \
"Overwhelming vertigo consumes you as you are hurled through the air!")
+ ..()
visible_message("A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!")
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("[src] briefly bubbles before exploding!")
for(var/mob/living/carbon/C in viewers(src))
if(!iscultist(C))
@@ -769,10 +783,10 @@ var/list/teleport_runes = list()
C << "Your blood boils in your veins!"
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 << "[src] saps your strength!"
+ for(var/M in invokers)
+ var/mob/living/L = M
+ L.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
+ L << "[src] saps your strength!"
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 << "You must be standing on [src]!"
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 << "There are no spirits near [src]!"
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("A cloud of red mist forms above [src], and from within steps... a man.")
user << "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..."
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("[src] flares up for a moment, and then disappears into itself!")
- 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 << "[src] temporarily stops your heart from beating!"
- 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
- ..()
-*/
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index d2a3d80b61b..0125bec86da 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -55,13 +55,13 @@
var/dat = "There are [uses] bloody runes on the parchment.
"
dat += "Please choose the chant to be imbued into the fabric of reality.
"
dat += "
"
- dat += "N'ath reth sh'yro eth d'raggathnor! - Allows you to summon an arcane tome.
"
+ dat += "N'ath reth sh'yro eth d'raggathnor! - Summons an arcane tome, used to scribe runes and communicate with other cultists.
"
dat += "Sas'so c'arta forbici! - Allows you to move to a selected teleportation rune.
"
dat += "Ta'gh fara'qha fel d'amar det! - Allows you to destroy technology in a short range.
"
dat += "Fuu ma'jin! - Allows you to stun a person by attacking them with the talisman.
"
- dat += "Kal'om neth! - Summons a soul stone, used to capure the spirits of dead or dying humans.
"
- dat += "Daa'ig osk! - Summons a construct shell for use with captured souls. It is too large to carry on your person.
"
dat += "Kla'atu barada nikt'o! - Two use talisman, first use makes all nearby runes invisible, second use reveals nearby hidden runes.
"
+ dat += "Kal'om neth! - Summons a soul stone, used to capure the spirits of dead or dying humans.
"
+ dat += "Daa'ig osk! - Summons a construct shell for use with soulstone-captured souls. It is too large to carry on your person.
"
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("[R] fades away.")
- R.invisibility = INVISIBILITY_OBSERVER
- R.alpha = 100 //To help ghosts distinguish hidden runes
+ R.talismanhide()
else
user.visible_message("A flash of light shines from [user]'s hand!", \
"You speak the words of the talisman, revealing nearby runes.")
for(var/obj/effect/rune/R in range(3,user))
- R.invisibility = 0
- R.visible_message("[R] suddenly appears!")
- 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 @@
"You speak the words of the talisman, emitting an EMP blast.")
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("You disturb [target] with visons of the end!")
+ user << "You disturb [target] with visons of the end!"
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 << "This talisman will only work on a stack of metal sheets!"
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 << "The talisman requires at least 25 sheets of metal!"
-
-/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("Your [src] shatter in a discharge of dark magic!", \
- "[user]'s [src] shatters in a discharge of dark magic!")
- 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 << "There are indecipherable images scrawled on the paper in what looks to be... blood?"
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("This talisman's magic does not affect the dead!")
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("[user] begins restraining [C] with dark magic!", \
- "[user] begins shaping an dark magic around your wrists!")
+ "[user] begins shaping a dark magic around your wrists!")
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 << "You shackle [C]."
add_logs(user, C, "handcuffed")
uses--
+ else
+ user << "[C] is already bound."
else
user << "You fail to shackle [C]."
+ else
+ user << "[C] is already bound."
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("[user]'s [src] shatter in a discharge of dark magic!", \
+ "Your [src] shatters in a discharge of dark magic!")
+ qdel(src)
diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm
index 72b678155e3..3e22560254c 100644
--- a/code/game/gamemodes/wizard/soulstone.dm
+++ b/code/game/gamemodes/wizard/soulstone.dm
@@ -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 << "An overwhelming feeling of dread comes over you as you pick up the soulstone. It would be wise to be rid of this quickly."
user.Dizzy(120)
+/obj/item/device/soulstone/examine(mob/user)
+ ..()
+ if(usability || iscultist(user) || iswizard(user) || user.stat == DEAD)
+ user << "A soulstone, used to capture souls, either from unconscious or sleeping humans or from freed shades."
+ user << "The captured soul can be placed into a construct shell to produce a construct, or released from the stone as a shade."
+
//////////////////////////////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 << "You shouldn't do that."
+ user << "\"Come now, do not capture your fellow's soul.\""
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 << "Your body is wracked with debilitating pain!"
return
- user.set_machine(src)
- var/dat = "Soul Stone
"
for(var/mob/living/simple_animal/shade/A in src)
- dat += "Captured Soul: [A.name]
"
- dat += {"Summon Shade"}
- dat += "
"
- dat += {"Close"}
- 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 << "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."
- else if(iscultist(U))
- A << "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."
-
- 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 << "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."
+ else if(iscultist(user))
+ A << "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."
///////////////////////////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 << "A construct shell, used to house bound souls from a soulstone."
+ user << "Placing a soulstone with a soul into this shell allows you to produce your choice of the following:"
+ user << "An Artificer, which can produce more shells and soulstones, as well as fortifications."
+ user << "A Wraith, which does high damage and can jaunt through walls, though it is quite fragile."
+ user << "A Juggernaut, which is very hard to kill and can produce temporary walls, but is slow."
+
/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 << "Capture failed!: 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 << "The Geometer of blood wants this mortal sacrificed with the rune."
+ user << "\"This soul is mine. SACRIFICE THEM!\""
else
- user << "The soul stone doesn't work for no apparent reason."
+ user << "The soulstone doesn't work for no apparent reason."
return 0
- if(imprinted != "empty")
- user << "Capture failed!: The soul stone has already been imprinted with [imprinted]'s mind!"
+ if(contents.len)
+ user << "Capture failed!: The soulstone is full! Free an existing soul to make room."
else
- if (T.stat == 0)
- user << "Capture failed!: Kill or maim the victim first!"
- else
+ if(T.stat != CONSCIOUS)
if(T.client == null)
user << "Capture failed!: 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 << "Capture failed!: 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 << "Capture failed!: Kill or maim the victim first!"
+
if("SHADE")
var/mob/living/simple_animal/shade/T = target
- if (T.stat == DEAD)
- user << "Capture failed!: The shade has already been banished!"
+ if(contents.len)
+ user << "Capture failed!: The soulstone is full! Free an existing soul to make room."
else
- if(contents.len)
- user << "Capture failed!: The soul stone is full! Use or free an existing soul to make room."
- else
- if(T.name != imprinted)
- user << "Capture failed!: 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 << "Capture successful!: [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 << "Your soul has been captured by the soulstone. Its arcane energies are reknitting your ethereal form."
+ if(user != T)
+ user << "Capture successful!: [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 << "Creation failed!: 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 << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
- else if(stoner && iscultist(stoner))
- newstruct << "You are still bound to serve the cult, follow their orders and help them complete their goals at all costs."
- else newstruct << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs."
+ if(iscultist(stoner))
+ newstruct << "You are still bound to serve the cult and [stoner], follow their orders and help them complete their goals at all costs."
+ else
+ newstruct << "You are still bound to serve your creator, [stoner], follow their orders and help them complete their goals at all costs."
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 << "Capture successful!: [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 << "The ghost has fled beyond your grasp."
+ U << "There were no spirits willing to become a shade."
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
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 6dda0088be5..db34b967615 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -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