diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 7ba0a4c788f..3002178f3f7 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -5,7 +5,42 @@ 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" + set name = "How to Play Cult" + var/text = "" + text += "
Tenets of the Dark One



" + + text += "I. SECRECY
Your cult is a SECRET organization. Your success DEPENDS on keeping your cult's members and locations SECRET for as long as possible. This means that your tome should be hidden \ + in your bag and never brought out in public. You should never create runes where other crew might find them, and you should avoid using talismans or other cult magic with witnesses around.

" + + text += "II. TOME
You start with a unique talisman in your bag. This supply talisman can be used 3 times, and creates starter equipment for your cult. The most critical of the talisman's functions is \ + the power to create a tome. This tome is your most important item and summoning one (in secret) is your FIRST PRIORITY. It lets you talk to fellow cultists and create runes, which in turn is essential to growing the cult's power.

" + + text += "III. RUNES
Runes are powerful sources of cult magic. Your tome will allow you to draw runes with your blood. Those runes, when hit with an empty hand, will attempt to \ + trigger the rune's magic. Runes are essential for the cult to convert new members, create powerful minions, or call upon incredibly powerful magic. Some runes require more than one cultist to use.

" + + text += "IV. TALISMANS
Talismans are a mobile source of cult magic that are NECESSARY to achieve success as a cult. Your starting talisman can produce certain talismans, but you will need \ + to use the -create talisman- rune (with ordinary paper on top) to get more talismans. Talismans are EXTREMELY powerful, therefore creating more talismans in a HIDDEN location should be one of your TOP PRIORITIES.

" + + text += "V. GROW THE CULT
There are certain basic strategies that all cultists should master. STUN talismans are the foundation of a successful cult. If you intend to convert the stunned person \ + you should use cuffs or a talisman of shackling on them and remove their headset before they recover (it takes about 10 seconds to recover). If you intend to sacrifice the victim, striking them quickly and repeatedly with your tome \ + will knock them out before they can recover. Sacrificed victims will their soul behind in a shard, these shards can be used on construct shells to make powerful servants for the cult. Remember you need TWO cultists standing near a \ + conversion rune to convert someone. Your construct minions cannot trigger most runes, but they will count as cultists in helping you trigger more powerful runes like conversion or blood boil.

" + + text += "VI. VICTORY
You have two ultimate goals as a cultist, sacrifice your target, and summon Nar-Sie. Sacrificing the target involves killing that individual and then placing \ + their corpse on a sacrifice rune and triggering that rune with THREE cultists. Do NOT lose the target's corpse! Only once the target is sacrificed can Nar-Sie be summoned. Summoning Nar-Sie will take nearly one minute \ + just to draw the massive rune needed. Do not create the rune until your cult is ready, the crew will receive the NAME and LOCATION of anyone who attempts to create the Nar-Sie rune. Once the Nar-Sie rune is drawn \ + you must gathered 9 cultists (or constructs) over the rune and then click it to bring the Dark One into this world!

" + + var/datum/browser/popup = new(usr, "mind", "", 800, 600) + popup.set_content(text) + popup.open() + return 1 /mob/living/proc/cult_innate_comm() set category = "Cultist" @@ -13,7 +48,11 @@ This file contains the arcane tome files as well as innate cultist emergency com if(!iscultist(usr) || usr.incapacitated()) return - + if(!istype(usr, /mob/living/simple_animal)) + var/confirm_desperation = alert(usr, "This is a LAST RESORT; you should use a tome to communicate if possible. This ritual will inflict serious injury on you!", "Is this what you want?", "Yes", "No") + if(confirm_desperation == "No") + usr << "On second thought, maybe I should summon a tome." + return var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") if(!input) return @@ -41,7 +80,6 @@ This file contains the arcane tome files as well as innate cultist emergency com cultist_commune(usr, 0, 1, input) return - /obj/item/weapon/tome name = "arcane tome" desc = "An old, dusty tome with frayed edges and a sinister-looking cover." @@ -89,9 +127,9 @@ This file contains the arcane tome files as well as innate cultist emergency com open_tome(user) /obj/item/weapon/tome/proc/open_tome(mob/user) - var/choice = alert(user,"You open the tome...",,"Commune","Scribe Rune","Read Tome") + var/choice = alert(user,"You open the tome...",,"Commune","Scribe Rune","More Information") switch(choice) - if("Read Tome") + if("More Information") read_tome(user) if("Scribe Rune") scribe_rune(user) @@ -104,120 +142,121 @@ This file contains the arcane tome files as well as innate cultist emergency com /obj/item/weapon/tome/proc/read_tome(mob/user) var/text = "" text += "
Archives of the Dark One



" - text += "As a member of the cult, your goals are almost or entirely impossible to complete without special aid from the Geometer's plane. The primary method of doing this are runes. These \ - scribings, drawn in blood, are concentrated nodes of the magic within Nar-Sie's realm and will allow the performance of many tasks to aid you and the rest of the cult in your objectives. Runes \ - have many different names, and almost all of them are known as Rites. The only rune that is not a Rite is the Ritual of Dimensional Rending, which can only be performed with nine cultists and calls \ - forth the avatar of the Geometer herself (so long as she consents).

A rune's name and effects can be revealed by examining the rune.


" + text += "A rune's name and effects can be revealed by examining the rune.<

" - text += "Teleport
The Rite of Translocation is a unique rite in that it requires a keyword before the scribing can begin. When invoked, the rune will \ - search for other Rites of Translocation with the same keyword. Assuming one is found, the user will be instantaneously transported to the location of the other rune. If more than two runes are scribed \ - with the same keyword, it will choose randomly between all eligible runes and send the invoker to one of them.

" + 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 += "Teleport Other
The Rite of Forced Translocation, like the Rite of Translocation, works by teleporting the person on the rune to one of the \ - same keyword. However, this rune will only work on people other than the user, allowing the user to send any living creature somewhere else.

" + 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. \ + 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 += "Summon Tome
The Rite of Knowledge is a simplistic rune. When invoked, it will summon a single arcane tome to the rune's location before vanishing. \ -

" - - text += "Convert
The Rite of Enlightment is paramount to the success of the cult. It will allow you to convert normal crew members into cultists. \ + 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 += "Sacrifice
The Rite of Tribute is used to offer sacrifice to the Geometer. Simply place any living creature upon the rune and invoke it (this will not \ + 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.

" + 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 += "Raise Dead
The Rite 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
The Rune of Resurrection is a delicate rite that 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 += "Veil Runes
The Rite of Obscurity is a rite that will cause all nearby runes to become invisible. The runes will still be considered by other rites \ - (such as the Rite of Translocation) but will be unusuable directly.(such as the Rite of Translocation) but will be unusuable directly. Use the same rite once more to reveal these runes once more.

" - - text += "Reveal Runes
The Rite of True Sight is the foil of the Rite of Obscurity. It will turn all invisible runes visible once more, in addition to causing \ - all spirits nearby to become visible.

" - - text += "Disguise Runes
Many crewmen enjoy drawing runes in crayon that resemble spell circles in order to play pranks on their fellow crewmen. The Rite of \ - False Truths takes advantage of this very joke. When invoked, all nearby runes will appear dull, precisely resembling those drawn in crayon. They still cannot be cleaned by conventional means, so \ - anyone trying to clean up the rune may become suspicious as it does not respond.

" - 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 \ - hand against these pests. By using the rune, a large electromagnetic pulse will be emitted from the rune's location.

" + 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 Rite of Astral Communion is perhaps the most ingenious rune that is usable by a single person. Upon invoking the rune, the \ + 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 \ 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 Shield
While simple, the Rite of the Corporeal Shield serves an important purpose in defense and hindering passage. When invoked, the \ + text += "Form Barrier
While simple, the Barrier 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 += "Debilitate
The Rite of the Shadowed Mind is simple. When invoked, it will cause all non-cultists that can see its rune to become deaf, blind and mute for a \ - considerable amount of time.

" + 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 += "Stun
Though the Rite of Blazing Light is weak when invoked normally, using it in conjuction with the Rite of Binding makes it much more powerful. \ - This rune will cause any non-cultists that can see the rune to become disoriented, disabling them for a short time.

" - - text += "Summon Cultist
The Rite of Joined Souls 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.

" - - text += "Imbue Talisman
The Rite of Binding is the only way to create talismans. A blank sheet of paper must be on top of the rune, with a valid rune nearby. After \ - invoking it, the paper will be converted into a talisman, and the rune inlaid upon it.

" - - text += "Fabricate Shell
The Rite of Fabrication is the main way of creating construct shells. To use it, one must place five sheets of plasteel 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 += "Summon Armaments
The Rite of Arming will equip the user with armored robes, a backpack, an eldrich longsword, and a pair of boots. Any items that cannot \ - be equipped will not be summoned.

" - - text += "Drain Life
The Rite of Leeching will drain the life of any non-cultist above the rune and heal the invoker for the same amount.

" - - text += "Blood Boil
The Rite 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. Use with caution

" - - text += "Time Stop
The Rite of Dimensional Corruption is a versatile rite that can be very strong when protecting our cult from the enemies of the Geometer. \ - As it is invoked, it will rend and reshape reality around itself, stopping time for all those who don't follow the teachings of the Geometer. However, it requires more than one ritual soul as a \ - catalyst, and its power is bound to overflow and hurt its casters.

" + 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 += "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 \ multiple spirits with one rune, but you will rapidly take damage in doing so.

" - text += "Call Forth The Geometer
There is only one way to summon the avatar of Nar-Sie, and that is the Ritual of Dimensional Rending. This ritual, in \ + 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 += "While runes are excellent for many tasks, they lack portability. The advent of talismans has, to a degree, solved this inconvenience. Simply put, a talisman is a piece of paper with a \ - rune inlaid within it. The words of the rune can be whispered in order to invoke its effects, although usually to a lesser extent. To create a talisman, simply use a Rite of Binding as described above. \ - Unless stated otherwise, talismans are invoked by activating them in your hand. A list of valid rites, as well as the effects of their talisman form, can be found below.


" - 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 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 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 += "Talismans of Veiling, Revealing, and Disguising
These talismans all function identically to their rune counterparts, but with less range. In addition, \ - the Talisman of True Sight will not reveal spirits. They will disappear after one use.

" + text += "Talismans of Veiling and Disguising
These talismans will hide, reveal, or disguise (as crayon drawings) all nearby runes.

" - text += "Talisman of Electromagnetic Pulse
This talisman functions like the Rite of Disruption. It disappears after one use.

" + text += "Talisman of Electromagnetic Pulse
This talisman will EMP the target and anything else nearby. It disappears after one use.

" 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." + 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.

" + + 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 Robes
Cult robes are heavily armored robes. These robes are produced by the Rite and 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.

" + + 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.

" + + text += "Constructs:

" + + text += "Shade
While technically not a construct, the Shade is produced when released from a soulstone. It is quite fragile and has weak melee attacks, but is fully healed when recaptured by a soulstone.

" + + text += "Wraith
The Wraith is a fast, lethal melee attacker which can jaunt through walls. However, it is only slightly more durable than a shade.

" + + text += "Juggernaut
The Juggernaut is a slow, but durable, melee attacker which can produce temporary forcewalls. It will also reflect most lethal energy weapons.

" + + 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.

" + 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) + var/turf/Turf = get_turf(user) var/chosen_keyword - var/rune_to_scribe + var/obj/effect/rune/rune_to_scribe var/entered_rune_name var/list/possible_runes = list() + var/list/shields = list() + if(locate(/obj/effect/rune) in Turf) + user << "There is already a rune here." + return for(var/T in subtypesof(/obj/effect/rune) - /obj/effect/rune/malformed) var/obj/effect/rune/R = T if(initial(R.cultist_name)) @@ -239,6 +278,10 @@ 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) + user << "There is already a rune here." + return if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) return user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \ @@ -246,17 +289,39 @@ This file contains the arcane tome files as well as innate cultist emergency com if(iscarbon(user)) var/mob/living/carbon/C = user C.apply_damage(0.1, BRUTE, pick("l_arm", "r_arm")) - if("Call Forth The Geometer" == entered_rune_name) + 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 before it reaches a critical point.","Central Command Higher Dimensionsal Affairs") - if(!do_after(user, 500, target = get_turf(user))) + 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))) + for(var/V in shields) + var/obj/machinery/shield/S = V + if(S && !qdeleted(S)) + qdel(S) return user.visible_message("[user] creates a strange circle in their own blood.", \ "You finish drawing the arcane markings of the Geometer.") - var/obj/effect/rune/R = new rune_to_scribe(get_turf(user)) - if(chosen_keyword) - R.keyword = chosen_keyword + for(var/V in shields) + var/obj/machinery/shield/S = V + if(S && !qdeleted(S)) + qdel(S) + new rune_to_scribe(Thenewturfyouwalkedto, 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 2904f067736..da4d25943c1 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -37,6 +37,11 @@ To draw a rune, use an arcane tome. 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) + keyword = set_keyword /obj/effect/rune/examine(mob/user) ..() @@ -159,123 +164,121 @@ 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. +/obj/effect/rune/imbue + cultist_name = "Create Talisman" + cultist_desc = "Transforms paper into powerful magic talismans." + invocation = null //no talisman made, no invocation. + icon_state = "3" + color = rgb(0, 0, 255) + +/obj/effect/rune/imbue/invoke(mob/living/user) + var/turf/T = get_turf(src) + var/list/papers_on_rune = list() + var/entered_talisman_name + var/obj/item/weapon/paper/talisman/talisman_type + var/list/possible_talismans = list() + for(var/obj/item/weapon/paper/P in T) + if(!P.info) + papers_on_rune.Add(P) + 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") + 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") + 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) + var/obj/item/weapon/paper/talisman/J = I + var/talisman_cult_name = initial(J.cultist_name) + 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!") + visible_message("Dark power begins to channel into the paper!.") + rune_in_use = 1 + if(!do_after(user, 100, target = get_turf(user))) + rune_in_use = 0 + return + new talisman_type(get_turf(src)) + visible_message("[src] glows with power, and bloody images form themselves on [paper_to_imbue].") + qdel(paper_to_imbue) + rune_in_use = 0 + var/list/teleport_runes = list() -//Rite of Translocation: Warps the user to a random teleport rune with the same keyword. /obj/effect/rune/teleport cultist_name = "Teleport" - cultist_desc = "Warps the user to a random rune of the same keyword." + cultist_desc = "Warps everything above it to another chosen teleport rune." invocation = "Sas'so c'arta forbici!" icon_state = "2" - color = rgb(0, 0, 255) + color = "#551A8B" req_keyword = 1 + var/listkey -/obj/effect/rune/teleport/New() +/obj/effect/rune/teleport/New(loc, set_keyword) ..() - teleport_runes.Add(src) + var/area/A = get_area(src) + var/locname = initial(A.name) + listkey = set_keyword ? "[set_keyword] [locname]":"[locname]" + teleport_runes += src /obj/effect/rune/teleport/Destroy() - teleport_runes.Remove(src) - ..() + teleport_runes -= src + return ..() /obj/effect/rune/teleport/invoke(mob/living/user) var/list/potential_runes = list() - for(var/obj/effect/rune/teleport/T in teleport_runes) - if(T.keyword == src.keyword && T != src && (T.z <= ZLEVEL_SPACEMAX)) - potential_runes.Add(T) + var/list/teleportnames = list() + var/list/duplicaterunecount = list() + for(var/R in teleport_runes) + var/obj/effect/rune/teleport/T = R + var/resultkey = T.listkey + if(resultkey in teleportnames) + duplicaterunecount[resultkey]++ + resultkey = "[resultkey] ([duplicaterunecount[resultkey]])" + else + teleportnames.Add(resultkey) + duplicaterunecount[resultkey] = 1 + if(T != src && (T.z <= ZLEVEL_SPACEMAX)) + potential_runes[resultkey] = T if(!potential_runes.len) - user << "There are no runes with the same keyword!" + user << "There are no valid runes to teleport to!" + log_game("Teleport rune failed - no other teleport runes") fail_invoke() - log_game("Teleport rune failed - no candidates with matching keyword") return if(user.z > ZLEVEL_SPACEMAX) user << "You are not in the right dimension!" - fail_invoke() log_game("Teleport rune failed - user in away mission") - return - - var/obj/effect/rune/selected_rune = pick(potential_runes) - user.visible_message("[user] vanishes in a flash of red light!", \ - "Your vision blurs, and you suddenly appear somewhere else.") - user.forceMove(get_turf(selected_rune)) - - -var/list/teleport_other_runes = list() -//Rite of Forced Translocation: Warps the target to a random teleport rune with the same keyword. -/obj/effect/rune/teleport_other - cultist_name = "Teleport Other" - cultist_desc = "Warps the target to a random rune of the same keyword." - invocation = "Sas'so c'arta forbica!" - icon_state = "1" - color = rgb(200, 0, 0) - req_keyword = 1 - -/obj/effect/rune/teleport_other/New() - ..() - teleport_other_runes.Add(src) - -/obj/effect/rune/teleport_other/Destroy() - teleport_other_runes.Remove(src) - ..() - -/obj/effect/rune/teleport_other/invoke(mob/living/user) - var/list/potential_runes = list() - for(var/obj/effect/rune/teleport_other/T in teleport_other_runes) - if(T.keyword == src.keyword && T != src && (T.z <= ZLEVEL_SPACEMAX)) - potential_runes.Add(T) - - if(!potential_runes.len) - user << "There are no runes with the same keyword!" fail_invoke() - log_game("Teleport Other rune failed - no candidates with matching keyword") return - if(user.z > ZLEVEL_SPACEMAX) - user << "You are not in the right dimension!" + var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked + var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !actual_selected_rune) fail_invoke() - log_game("Teleport rune failed - user in away mission") return - var/obj/effect/rune/selected_rune = pick(potential_runes) - var/mob/living/target - - var/list/targets = list() - for(var/mob/living/L in get_turf(src)) - if(L != user) - targets.Add(L) - if(!targets.len) - user << "There are no targets standing on the rune!" - fail_invoke() - log_game("Teleport Other rune failed - no targets on rune") - return - if(targets.len > 1) - target = input(user, "Choose a person to teleport.", "Rite of Forced Translocation") as null|anything in targets - user - if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated()) - return - if(!target) - fail_invoke() - return + var/turf/T = get_turf(src) + var/turf/UT = get_turf(user) + var/movedsomething = 0 + for(var/atom/movable/A in T) + 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"]." else - target = targets[targets.len] - - target.visible_message("[target] vanishes in a flash of red light!", \ - "Your vision blurs, and you suddenly appear somewhere else.") - target.forceMove(get_turf(selected_rune)) - -//Rite of Knowledge: Creates an arcane tome at the rune's location and destroys the rune. -/obj/effect/rune/summon_tome - cultist_name = "Summon Tome" - cultist_desc = "Pulls an arcane tome from the archives of the Geometer." - invocation = "N'ath reth sh'yro eth d'raggathnor!" - icon_state = "5" - color = rgb(0, 0, 255) - - -/obj/effect/rune/summon_tome/invoke(mob/living/user) - visible_message("A frayed tome materializes on the surface of [src], which dissolves into nothing.") - new /obj/item/weapon/tome(get_turf(src)) - qdel(src) + fail_invoke() //Rite of Enlightenment: Converts a normal crewmember to the cult. Faster for every cultist nearby. @@ -310,6 +313,7 @@ var/list/teleport_other_runes = list() 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) + new /obj/item/weapon/tome(get_turf(src)) new_cultist.mind.special_role = "Cultist" new_cultist << "Your blood pulses. Your head throbs. The world goes red. All at once you are aware of a horrible, horrible, truth. The veil of reality has been ripped away \ and something evil takes root." @@ -416,7 +420,7 @@ var/list/teleport_other_runes = list() //Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station. /obj/effect/rune/narsie - cultist_name = "Call Forth The Geometer" + cultist_name = "Summon Nar-Sie" cultist_desc = "Tears apart dimensional barriers, calling forth the avatar of the Geometer." invocation = null req_cultists = 9 @@ -438,7 +442,8 @@ var/list/teleport_other_runes = list() M << "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"" if(M.reagents) M.reagents.add_reagent("hell_water", 10) - M.Weaken(5) + M.Weaken(7) + M.Stun(7) fail_invoke() log_game("Summon Nar-Sie rune failed - improper objective") return @@ -489,7 +494,7 @@ var/list/teleport_other_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. 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 placed upon 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) @@ -510,7 +515,7 @@ var/list/teleport_other_runes = list() 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()) + if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated() || !mob_to_revive || !mob_to_sacrifice) return for(var/mob/living/M in T.contents) if(M.stat == DEAD) @@ -574,73 +579,44 @@ var/list/teleport_other_runes = list() M.visible_message("[M] twitches.") -//Rite of Obscurity: Turns all runes within a 3-tile radius invisible or reveals them again. -/obj/effect/rune/hide_runes - cultist_name = "Veil Runes" - cultist_desc = "Turns nearby runes invisible. They can be revealed by using the Reveal Rune." - invocation = "Kla'atu barada nikt'o!" - icon_state = "1" - color = rgb(0,0,255) - -/obj/effect/rune/hide_runes/invoke(mob/living/user) - visible_message("[src] darkens to black and vanishes.") - for(var/obj/effect/rune/R in orange(3,src)) - R.visible_message("[R] fades away.") - R.invisibility = INVISIBILITY_OBSERVER - R.alpha = 100 //To help ghosts distinguish hidden runes - for(var/mob/dead/observer/O in orange(3,src)) - if(!O.invisibility) - O << "You suddenly feel as if you've vanished..." - O.invisibility = INVISIBILITY_OBSERVER - qdel(src) - -//Rite of True Sight: Turns ghosts and obscured runes visible -/obj/effect/rune/true_sight - cultist_name = "Reveal Runes" - cultist_desc = "Reveals all invisible objects nearby, from spirits to runes." - invocation = "Nikt'o barada kla'atu!" - icon_state = "4" - color = rgb(255, 255, 255) - -/obj/effect/rune/true_sight/invoke() - visible_message("[src] explodes in a flash of blinding light!") - for(var/mob/dead/observer/O in orange(3,src)) - O << "You suddenly feel very obvious..." - O.invisibility = 0 - for(var/obj/effect/rune/R in orange(3,src)) - R.invisibility = 0 - R.alpha = initial(R.alpha) - qdel(src) - - //Rite of False Truths: Makes runes appear like crayon ones -/obj/effect/rune/make_runes_fake - cultist_name = "Disguise Runes" - cultist_desc = "Causes all nearby runes (including itself) to resemble those drawn in crayon." - invocation = "By'o isit!" - icon_state = "4" - color = rgb(0, 150, 0) - -/obj/effect/rune/make_runes_fake/invoke(mob/living/user) - visible_message("[src] flares brightly, then slowly dulls and appears mundane.") - for(var/obj/effect/rune/R in range(3,src)) - R.desc = "A rune drawn in crayon." - //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." invocation = "Ta'gh fara'qha fel d'amar det!" icon_state = "5" - color = rgb(255, 0, 0) + color = rgb(77, 148, 255) /obj/effect/rune/emp/invoke(mob/living/user) + 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 orange(1,src)) - C << "You feel a minute vibration pass through you!" - playsound(get_turf(src), 'sound/items/Welder2.ogg', 25, 1) - empulse(src, 4, 8) //A bit less than an EMP grenade - qdel(src) - + 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) + 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 //Rite of Astral Communion: Separates one's spirit from their body. They will take damage while it is active. /obj/effect/rune/astral @@ -713,8 +689,8 @@ var/list/teleport_other_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 Shield" - cultist_desc = "When invoked, makes the rune block passage. Can be invoked again to reverse this." + cultist_name = "Form Barrier" + 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) @@ -733,43 +709,6 @@ var/list/teleport_other_runes = list() C.apply_damage(2, BRUTE, pick("l_arm", "r_arm")) -//Rite of the Shadowed Mind: Deafens, blinds and mutes all non-cultists nearby. -/obj/effect/rune/deafen - cultist_name = "Debilitate" - cultist_desc = "Causes all non-followers nearby to lose their hearing, sight and voice." - invocation = "Sti kaliedir!" - color = rgb(0, 255, 0) - icon_state = "4" - -/obj/effect/rune/deafen/invoke(mob/living/user) - visible_message("[src] emits a blinding red flash!") - for(var/mob/living/carbon/C in viewers(src)) - if(!iscultist(C) && !C.null_rod_check()) - C << "A dark fog blankets your senses!" - C.adjustEarDamage(0,50) - C.flash_eyes(1, 1) - C.adjust_blurriness(50) - C.adjust_blindness(20) - C.silent += 10 - qdel(src) - -//Rite of Disorientation: Stuns and mutes all non-cultists nearby for a brief time -/obj/effect/rune/stun - cultist_name = "Stun" - cultist_desc = "Stuns all nearby non-followers for a brief time." - invocation = "Fuu ma'jin!" - icon_state = "2" - color = rgb(100, 0, 100) - -/obj/effect/rune/stun/invoke(mob/living/user) - visible_message("[src] explodes in a bright flash!") - for(var/mob/living/M in viewers(src)) - if(!iscultist(M) && !M.null_rod_check()) - M << "You are disoriented by [src]!" - M.Weaken(3) - M.Stun(3) - M.flash_eyes(1,1) - qdel(src) //Rite of Joined Souls: Summons a single cultist. /obj/effect/rune/summon cultist_name = "Summon Cultist" @@ -807,135 +746,9 @@ var/list/teleport_other_runes = list() "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.loc = get_turf(src) + cultist_to_summon.forceMove(get_turf(src)) qdel(src) - -//Rite of Binding: Turns a nearby rune and a paper on top of the rune to a talisman, if both are valid. -/obj/effect/rune/imbue - cultist_name = "Bind Talisman" - cultist_desc = "Transforms papers and valid runes into talismans." - invocation = null //no talisman made, no invocation. - icon_state = "3" - color = rgb(0, 0, 255) - -/obj/effect/rune/imbue/invoke(mob/living/user) - var/turf/T = get_turf(src) - var/list/papers_on_rune = list() - for(var/obj/item/weapon/paper/P in T) - if(!P.info) - papers_on_rune.Add(P) - 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") - return - var/obj/item/weapon/paper/paper_to_imbue = pick(papers_on_rune) - var/list/nearby_runes = list() - for(var/obj/effect/rune/R in orange(1,src)) - nearby_runes.Add(R) - if(!nearby_runes.len) - user << "There are no runes near [src]!" - fail_invoke() - log_game("Talisman Imbue rune failed - no nearby runes") - return - var/obj/effect/rune/picked_rune = pick(nearby_runes) - var/list/split_rune_type = splittext("[picked_rune.type]", "/") - var/imbue_type = split_rune_type[split_rune_type.len] - var/talisman_type = text2path("/obj/item/weapon/paper/talisman/[imbue_type]") - if(ispath(talisman_type)) - user.say("H'drak v'loso, mir'kanas verbot!") - var/obj/item/weapon/paper/talisman/TA = new talisman_type(get_turf(src)) - if(istype(picked_rune, /obj/effect/rune/teleport)) - var/obj/effect/rune/teleport/TR = picked_rune - var/obj/item/weapon/paper/talisman/teleport/TT = TA - TT.keyword = TR.keyword - else - user << "The chosen rune was not a valid target!" - fail_invoke() - log_game("Talisman Imbue rune failed - chosen rune invalid") - return - visible_message("[picked_rune] crumbles to dust, and bloody images form themselves on [paper_to_imbue].") - qdel(paper_to_imbue) - qdel(picked_rune) - qdel(src) -//Rite of Fabrication: Creates a construct shell out of 5 metal sheets. -/obj/effect/rune/construct_shell - cultist_name = "Fabricate Shell" - cultist_desc = "Turns five plasteel sheets into an empty construct shell, suitable for containing a soul shard." - invocation = null //see below; doesn't say the invocation unless there's enough sheets. - icon_state = "5" - color = rgb(150, 150, 150) - -/obj/effect/rune/construct_shell/invoke(mob/living/user) - var/turf/T = get_turf(src) - for(var/obj/item/stack/sheet/S in T) - if(istype(S, /obj/item/stack/sheet/plasteel)) - var/obj/item/stack/sheet/plasteel/M = S - if(M.amount >= 5) - user.say("Ethra p'ni dedol!") - new /obj/structure/constructshell(T) - M.visible_message("[M] bends and twists into a humanoid shell!") - M.amount -= 5 - if(M.amount <= 0) - qdel(M) - qdel(src) - return - else - user << "There must be at least five sheets of plasteel on [src]!" - fail_invoke() - log_game("Construct Shell rune failed - not enough plasteel sheets") - return - - -//Rite of Arming: Creates cult robes, a trophy rack, and a cult sword on the rune. -/obj/effect/rune/armor - cultist_name = "Summon Armaments" - cultist_desc = "Equips the user with robes, shoes, a backpack, and a longsword. Items that cannot be equipped will not be summoned." - invocation = "N'ath reth sh'yro eth draggathnor!" - icon_state = "4" - color = rgb(255, 0, 0) - -/obj/effect/rune/armor/invoke(mob/living/user) - visible_message("With the sound of clanging metal, [src] crumbles to dust!") - user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) - user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) - user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes) - user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back) - user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) - qdel(src) - - -//Rite of Leeching: Deals brute damage to the target and heals the same amount to the invoker. -/obj/effect/rune/leeching - cultist_name = "Drain Life" - cultist_desc = "Drains the life of the target on the rune, restoring it to the user." - invocation = null //see below; doesn't say the invocation if it has no targets. - icon_state = "2" - color = rgb(255, 0, 0) - -/obj/effect/rune/leeching/invoke(mob/living/user) - var/turf/T = get_turf(src) - var/list/potential_targets = list() - for(var/mob/living/carbon/M in T) - if(M.stat != DEAD && M != user) - potential_targets.Add(M) - if(!potential_targets.len) - user << "There must be a valid target on the rune!" - fail_invoke() - log_game("Leeching rune failed - no valid targets") - return - var/mob/living/carbon/target = pick(potential_targets) - var/drained_amount = rand(5,25) - user.say("Yu'gular faras desdae. Umathar uf'kal thenar!") - target.apply_damage(drained_amount, BRUTE, "chest") - user.adjustBruteLoss(-drained_amount) - user.Beam(target,icon_state="drainbeam",icon='icons/effects/effects.dmi',time=3) - target << "You feel extremely weak." - user.visible_message("Blood flows from the rune into [user]!", \ - "[target]'s blood flows into you, healing your wounds and revitalizing your spirit.") - - //Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby /obj/effect/rune/blood_boil cultist_name = "Boil Blood" @@ -954,7 +767,8 @@ var/list/teleport_other_runes = list() C << "\The [N] suddenly burns hotly before returning to normal!" continue C << "Your blood boils in your veins!" - C.take_overall_damage(51,51) + 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")) @@ -971,27 +785,44 @@ var/list/teleport_other_runes = list() icon_state = "6" color = rgb(255, 0, 0) -/obj/effect/rune/manifest/invoke(mob/living/user) +/obj/effect/rune/manifest/New(loc) + ..() + notify_ghosts("Manifest rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src) + +/obj/effect/rune/manifest/can_invoke(mob/living/user) if(!(user in get_turf(src))) user << "You must be standing on [src]!" fail_invoke() log_game("Manifest rune failed - user not standing on rune") - return + return 0 var/list/ghosts_on_rune = list() for(var/mob/dead/observer/O in get_turf(src)) if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) - ghosts_on_rune.Add(O) + ghosts_on_rune |= O if(!ghosts_on_rune.len) user << "There are no spirits near [src]!" fail_invoke() log_game("Manifest rune failed - no nearby ghosts") - return + return 0 + return ..() + +/obj/effect/rune/manifest/invoke(mob/living/user) + var/list/ghosts_on_rune = list() + for(var/mob/dead/observer/O in get_turf(src)) + if(O.client && !jobban_isbanned(O, ROLE_CULTIST)) + ghosts_on_rune |= O var/mob/dead/observer/ghost_to_spawn = pick(ghosts_on_rune) 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)) + N.name = "Invoker's Shield" + N.desc = "A weak shield summoned by cultists to protect them while they carry out delicate rituals" + N.color = "red" + N.health = 20 + N.mouse_opacity = 0 new_human.key = ghost_to_spawn.key ticker.mode.add_cultist(new_human.mind) new_human << "You are a servant of the Geometer. You have been made semi-corporeal by the cult of Nar-Sie, and you are to serve them at all costs." @@ -1002,13 +833,14 @@ var/list/teleport_other_runes = list() user.apply_damage(1, BRUTE) sleep(30) + qdel(N) if(new_human) new_human.visible_message("[new_human] suddenly dissolves into bones and ashes.", \ "Your link to the world fades. Your form breaks apart.") 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" @@ -1045,3 +877,4 @@ var/list/teleport_other_runes = 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 022a4869d40..d2a3d80b61b 100644 --- a/code/game/gamemodes/cult/talisman.dm +++ b/code/game/gamemodes/cult/talisman.dm @@ -1,19 +1,3 @@ -/* - -Talismans are portable versions of runes that resemble blank sheets of paper. They may have different effects than their parent runes and are created by using a Rite of Binding with a paper on top and -a compatible rune somewhere nearby. A list of compatible runes can found below. - -Basic Runes: -Rite of Translocation -Rite of Knowledge -Rite of Obscurity -Rite of True Sight -Rite of False Truths -Rite of Disruption -Rite of Disorientation - -*/ - /obj/item/weapon/paper/talisman var/cultist_name = "talisman" var/cultist_desc = "A basic talisman. It serves no purpose." @@ -33,18 +17,20 @@ Rite of Disorientation if(!iscultist(user)) user << "There are indecipherable images scrawled on the paper in what looks to be... blood?" return - if(invocation) - user.whisper(invocation) - src.invoke(user) - uses-- + if(invoke(user)) + uses-- if(uses <= 0) user.drop_item() qdel(src) -/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user) - if(health_cost && iscarbon(user)) - var/mob/living/carbon/C = user - C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm")) +/obj/item/weapon/paper/talisman/proc/invoke(mob/living/user, successfuluse = 1) + . = successfuluse + if(successfuluse) //if the calling whatever says we succeed, do the fancy stuff + if(invocation) + user.whisper(invocation) + if(health_cost && iscarbon(user)) + var/mob/living/carbon/C = user + C.apply_damage(health_cost, BRUTE, pick("l_arm", "r_arm")) //Malformed Talisman: If something goes wrong. /obj/item/weapon/paper/talisman/malformed @@ -52,13 +38,12 @@ Rite of Disorientation cultist_desc = "A talisman with gibberish scrawlings. No good can come from invoking this." invocation = "Ra'sha yoka!" -/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user) +/obj/item/weapon/paper/talisman/malformed/invoke(mob/living/user, successfuluse = 1) user << "You feel a pain in your head. The Geometer is displeased." if(iscarbon(user)) var/mob/living/carbon/C = user C.apply_damage(10, BRUTE, "head") - //Supply Talisman: Has a few unique effects. Granted only to starter cultists. /obj/item/weapon/paper/talisman/supply cultist_name = "Supply Talisman" @@ -66,23 +51,21 @@ Rite of Disorientation invocation = null uses = 3 -/obj/item/weapon/paper/talisman/supply/invoke(mob/living/user) +/obj/item/weapon/paper/talisman/supply/invoke(mob/living/user, successfuluse = 1) 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 += "Sas'so c'arta forbici! - Allows you to move to a Rite of Dislocation with the keyword of \"veri\".
" + 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 += "Kla'atu barada nikt'o! - Allows you to conceal nearby runes.
" - dat += "Nikt'o barada kla'atu! - Allows you to reveal nearby runes.
" 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.
" var/datum/browser/popup = new(user, "talisman", "", 400, 400) popup.set_content(dat) popup.open() - uses++ //To prevent uses being consumed just by opening it - return 1 + return 0 /obj/item/weapon/paper/talisman/supply/Topic(href, href_list) if(src) @@ -91,21 +74,14 @@ Rite of Disorientation if(href_list["rune"]) switch(href_list["rune"]) if("newtome") - var/obj/item/weapon/paper/talisman/summon_tome/T = new(usr) + var/obj/item/weapon/tome/T = new(usr) usr.put_in_hands(T) if("teleport") var/obj/item/weapon/paper/talisman/teleport/T = new(usr) - T.keyword = "veri" usr.put_in_hands(T) if("emp") var/obj/item/weapon/paper/talisman/emp/T = new(usr) usr.put_in_hands(T) - if("conceal") - var/obj/item/weapon/paper/talisman/hide_runes/T = new(usr) - usr.put_in_hands(T) - if("reveal") - var/obj/item/weapon/paper/talisman/true_sight/T = new(usr) - usr.put_in_hands(T) if("runestun") var/obj/item/weapon/paper/talisman/stun/T = new(usr) usr.put_in_hands(T) @@ -114,6 +90,9 @@ Rite of Disorientation usr.put_in_hands(T) if("construct") new /obj/structure/constructshell(get_turf(usr)) + if("veiling") + var/obj/item/weapon/paper/talisman/true_sight/T = new(usr) + usr.put_in_hands(T) src.uses-- if(src.uses <= 0) if(iscarbon(usr)) @@ -121,112 +100,117 @@ Rite of Disorientation C.drop_item() visible_message("[src] crumbles to dust.") qdel(src) - return - else - return //Rite of Translocation: Same as rune /obj/item/weapon/paper/talisman/teleport cultist_name = "Talisman of Teleportation" cultist_desc = "A single-use talisman that will teleport a user to a random rune of the same keyword." + color = "#551A8B" // purple invocation = "Sas'so c'arta forbici!" health_cost = 5 - var/keyword = "ire" -/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user) - var/list/possible_runes = list() - for(var/obj/effect/rune/teleport/R in teleport_runes) - if(R.keyword == src.keyword) - possible_runes.Add(R) - if(!possible_runes.len) - user << "There are no Teleport runes with the same keyword!" - log_game("Teleportation talisman failed - no teleport runes of the same keyword") - uses++ //To prevent deletion - return - var/chosen_rune = pick(possible_runes) +/obj/item/weapon/paper/talisman/teleport/invoke(mob/living/user, successfuluse = 1) + var/list/potential_runes = list() + var/list/teleportnames = list() + var/list/duplicaterunecount = list() + for(var/R in teleport_runes) + var/obj/effect/rune/teleport/T = R + var/resultkey = T.listkey + if(resultkey in teleportnames) + duplicaterunecount[resultkey]++ + resultkey = "[resultkey] ([duplicaterunecount[resultkey]])" + else + teleportnames.Add(resultkey) + duplicaterunecount[resultkey] = 1 + potential_runes[resultkey] = T + + if(!potential_runes.len) + user << "There are no valid runes to teleport to!" + log_game("Teleport talisman failed - no other teleport runes") + return ..(user, 0) + + if(user.z > ZLEVEL_SPACEMAX) + user << "You are not in the right dimension!" + log_game("Teleport talisman failed - user in away mission") + return ..(user, 0) + + var/input_rune_key = input(user, "Choose a rune to teleport to.", "Rune to Teleport to") as null|anything in potential_runes //we know what key they picked + var/obj/effect/rune/teleport/actual_selected_rune = potential_runes[input_rune_key] //what rune does that key correspond to? + if(!actual_selected_rune) + return ..(user, 0) user.visible_message("Dust flows from [user]'s hand, and they disappear in a flash of red light!", \ "You speak the words of the talisman and find yourself somewhere else!") - if(user.buckled) - user.buckled.unbuckle_mob(user,force=1) - user.loc = get_turf(chosen_rune) + user.forceMove(get_turf(actual_selected_rune)) + return ..() -/obj/item/weapon/paper/talisman/teleport/New() - ..() - spawn(1) //To give the keyword time to change from the imbue rune - info += keyword -/obj/item/weapon/paper/talisman/teleport/examine(mob/user) - ..() - if(iscultist(user) && keyword) - user << "Keyword: [keyword]" - -//Rite of Knowledge: Same as rune, but has two uses /obj/item/weapon/paper/talisman/summon_tome cultist_name = "Talisman of Tome Summoning" cultist_desc = "A one-use talisman that will call an untranslated tome from the archives of the Geometer." + color = "#512727" // red-black invocation = "N'ath reth sh'yro eth d'raggathnor!" health_cost = 1 -/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user) +/obj/item/weapon/paper/talisman/summon_tome/invoke(mob/living/user, successfuluse = 1) + . = ..() user.visible_message("[user]'s hand glows red for a moment.", \ "You speak the words of the talisman!") - var/obj/item/weapon/tome/T = new(get_turf(user)) - if(user.put_in_hands(T)) - user.visible_message("A tome appears in [user]'s hand!", \ - "An arcane tome materializes in your free hand.") - else - user.visible_message("A tome appears at [user]'s feet!", \ - "An arcane tome materialzies at your feet.") + new /obj/item/weapon/tome(get_turf(user)) + user.visible_message("A tome appears at [user]'s feet!", \ + "An arcane tome materializes at your feet.") -//Talisman of Obscurity: Same as rune -/obj/item/weapon/paper/talisman/hide_runes +/obj/item/weapon/paper/talisman/true_sight cultist_name = "Talisman of Veiling" - cultist_desc = "A talisman that will make all runes within a small radius invisible." + cultist_desc = "A multi-use talisman that hides nearby runes. On its second use, will reveal nearby runes." + color = "#9c9c9c" // grey invocation = "Kla'atu barada nikt'o!" health_cost = 1 + uses = 2 + var/revealing = FALSE //if it reveals or not -/obj/item/weapon/paper/talisman/hide_runes/invoke(mob/living/user) - user.visible_message("Dust flows from [user]'s hand.", \ - "You speak the words of the talisman, veiling nearby runes.") - for(var/obj/effect/rune/R in orange(3,user)) - R.visible_message("[R] fades away.") - R.invisibility = INVISIBILITY_OBSERVER - -//Rite of True Sight: Same as rune, but doesn't work on ghosts -/obj/item/weapon/paper/talisman/true_sight - cultist_name = "Talisman of Revealing" - cultist_desc = "A talisman that reveals nearby invisible runes." - invocation = "Nikt'o barada kla'atu!" - health_cost = 1 - -/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user) - 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 orange(3,user)) - R.invisibility = 0 - +/obj/item/weapon/paper/talisman/true_sight/invoke(mob/living/user, successfuluse = 1) + . = ..() + if(!revealing) + user.visible_message("Thin grey dust falls from [user]'s hand!", \ + "You speak the words of the talisman, hiding nearby runes.") + 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 + 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) //Rite of False Truths: Same as rune /obj/item/weapon/paper/talisman/make_runes_fake cultist_name = "Talisman of Disguising" cultist_desc = "A talisman that will make nearby runes appear fake." + color = "#ff80d5" // honk invocation = "By'o nar'nar!" - health_cost = 3 -/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user) +/obj/item/weapon/paper/talisman/make_runes_fake/invoke(mob/living/user, successfuluse = 1) + . = ..() user.visible_message("Dust flows from [user]s hand.", \ "You speak the words of the talisman, making nearby runes appear fake.") - for(var/obj/effect/rune/R in orange(3,user)) + for(var/obj/effect/rune/R in orange(6,user)) R.desc = "A rune drawn in crayon." -//Rite of Disruption: Same as rune +//Rite of Disruption: Weaker than rune /obj/item/weapon/paper/talisman/emp cultist_name = "Talisman of Electromagnetic Pulse" cultist_desc = "A talisman that will cause a moderately-sized electromagnetic pulse." + color = "#4d94ff" // light blue invocation = "Ta'gh fara'qha fel d'amar det!" health_cost = 5 -/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user) +/obj/item/weapon/paper/talisman/emp/invoke(mob/living/user, successfuluse = 1) + . = ..() user.visible_message("[user]'s hand flashes a bright blue!", \ "You speak the words of the talisman, emitting an EMP blast.") empulse(src, 4, 8) @@ -235,25 +219,22 @@ Rite of Disorientation /obj/item/weapon/paper/talisman/stun cultist_name = "Talisman of Stunning" cultist_desc = "A talisman that will stun and inhibit speech on a single target. To use, attack target directly." + color = "#ff0000" // red invocation = "Fuu ma'jin!" - health_cost = 15 + health_cost = 10 -//Rite of Arming: Equips cultist armor on the user, where available -/obj/item/weapon/paper/talisman/armor - cultist_name = "Talisman of Arming" - cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to." - invocation = "N'ath reth sh'yro eth draggathnor!" - health_cost = 3 - -/obj/item/weapon/paper/talisman/stun/attack_self(mob/living/user) +/obj/item/weapon/paper/talisman/stun/invoke(mob/living/user, successfuluse = 0) + if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff + return ..() if(iscultist(user)) user << "To use this talisman, attack the target directly." else user << "There are indecipherable images scrawled on the paper in what looks to be... blood?" + return 0 -/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user) +/obj/item/weapon/paper/talisman/stun/attack(mob/living/target, mob/living/user, successfuluse = 1) if(iscultist(user)) - user.whisper(invocation) + invoke(user, 1) user.visible_message("[user] holds up [src], which explodes in a flash of red light!", \ "You stun [target] with the talisman!") var/obj/item/weapon/nullrod/N = locate() in target @@ -261,15 +242,15 @@ Rite of Disorientation target.visible_message("[target]'s holy weapon absorbs the talisman's light!", \ "Your holy weapon absorbs the blinding light!") else - target.Weaken(9) - target.Stun(9) + target.Weaken(10) + target.Stun(10) target.flash_eyes(1,1) if(issilicon(target)) var/mob/living/silicon/S = target S.emp_act(1) if(iscarbon(target)) var/mob/living/carbon/C = target - C.silent += 4 + C.silent += 5 C.stuttering += 15 C.cultslurring += 15 C.Jitter(15) @@ -278,11 +259,142 @@ Rite of Disorientation return ..() -/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user) +//Rite of Arming: Equips cultist armor on the user, where available +/obj/item/weapon/paper/talisman/armor + cultist_name = "Talisman of Arming" + cultist_desc = "A talisman that will equip the invoker with cultist equipment if there is a slot to equip it to." + color = "#33cc33" // green + invocation = "N'ath reth sh'yro eth draggathnor!" + +/obj/item/weapon/paper/talisman/armor/invoke(mob/living/user, successfuluse = 1) + . = ..() user.visible_message("Otherworldly armor suddenly appears on [user]!", \ "You speak the words of the talisman, arming yourself!") user.equip_to_slot_or_del(new /obj/item/clothing/head/culthood/alt(user), slot_head) user.equip_to_slot_or_del(new /obj/item/clothing/suit/cultrobes/alt(user), slot_wear_suit) user.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult/alt(user), slot_shoes) user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back) + user.drop_item() user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) + user.put_in_hands(new /obj/item/weapon/restraints/legcuffs/bola/cult(user)) + +/obj/item/weapon/paper/talisman/armor/attack(mob/living/target, mob/living/user) + if(iscultist(user) && iscultist(target)) + user.drop_item() + invoke(target) + qdel(src) + return + ..() + +//Talisman of Horrors: Breaks the mind of the victim with nightmarish hallucinations +/obj/item/weapon/paper/talisman/horror + cultist_name = "Talisman of Horrors" + cultist_desc = "A talisman that will break the mind of the victim with nightmarish hallucinations." + color = "#ffb366" // light orange + invocation = "Lo'Nab Na'Dm!" + +/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!") + 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" + cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell" + invocation = "Ethra p'ni dedol!" + color = "#000000" // black + +/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user) + if(iscultist(user)) + user << "To use this talisman, place it upon a stack of metal sheets." + else + user << "There are indecipherable images scrawled on the paper in what looks to be... blood?" + + +/obj/item/weapon/paper/talisman/construction/attack(obj/M,mob/living/user) + 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)) + var/turf/T = get_turf(target) + if(target.use(25)) + new /obj/structure/constructshell(T) + user << "The talisman clings to the metal and twists it into a construct shell!" + 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 + cultist_name = "Talisman of Shackling" + cultist_desc = "Use this talisman on a victim to handcuff them with dark bindings." + invocation = "In'totum Lig'abis!" + color = "#B27300" // burnt-orange + uses = 4 + +/obj/item/weapon/paper/talisman/shackle/invoke(mob/living/user, successfuluse = 0) + if(successfuluse) //if we're forced to be successful(we normally aren't) then do the normal stuff + return ..() + if(iscultist(user)) + user << "To use this talisman, attack the target directly." + else + 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)) + 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)) + return + var/mob/living/carbon/C = L + if(!C.handcuffed) + 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!") + if(do_mob(user, C, 30)) + if(!C.handcuffed) + C.handcuffed = new /obj/item/weapon/restraints/handcuffs/energy/cult/used(C) + C.update_handcuffed() + user << "You shackle [C]." + add_logs(user, C, "handcuffed") + uses-- + else + user << "You fail to shackle [C]." + if(uses <= 0) + user.drop_item() + qdel(src) + return diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 09e306ed31a..cfb2133686b 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -99,11 +99,14 @@ /obj/structure/constructshell/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/device/soulstone)) var/obj/item/device/soulstone/SS = O + if(!iscultist(user) && !iswizard(user) && !SS.usability) + user << "An overwhelming feeling of dread comes over you as you attempt to place the soulstone into the shell. It would be wise to be rid of this quickly." + user.Dizzy(120) + return SS.transfer_soul("CONSTRUCT",src,user) else return ..() - ////////////////////////////Proc for moving soul in and out off stone////////////////////////////////////// @@ -272,4 +275,4 @@ T.unEquip(W) init_shade(C, T, U) qdel(T) - return 1 \ No newline at end of file + return 1 diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index 5b30ada2d0e..d4d6b8ea72b 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -16,6 +16,7 @@ //8 = blood, running var/gibs_ready = 0 var/obj/crayon + var/obj/paper /obj/machinery/washing_machine/AltClick(mob/user) if(!user.canUseTopic(src)) @@ -44,15 +45,27 @@ for(var/obj/item/clothing/suit/hooded/ian_costume/IC in contents) new /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi(src) qdel(IC) - + + for(var/obj/item/weapon/paper/P in contents) + if(crayon) + var/dye_color + if(istype(crayon,/obj/item/toy/crayon)) + var/obj/item/toy/crayon/CR = crayon + dye_color = CR.paint_color + if(dye_color) + P.color = dye_color + qdel(crayon) + crayon = null + if(crayon) var/wash_color if(istype(crayon,/obj/item/toy/crayon)) var/obj/item/toy/crayon/CR = crayon - wash_color = CR.colourName + wash_color = CR.paint_color else if(istype(crayon,/obj/item/weapon/stamp)) var/obj/item/weapon/stamp/ST = crayon wash_color = ST.item_color + if(wash_color) var/new_jumpsuit_icon_state = "" @@ -196,6 +209,7 @@ state = 3 else ..() + else if(istype(W,/obj/item/stack/sheet/hairlesshide) || \ istype(W,/obj/item/clothing/under) || \ istype(W,/obj/item/clothing/mask) || \ @@ -203,7 +217,8 @@ istype(W,/obj/item/clothing/gloves) || \ istype(W,/obj/item/clothing/shoes) || \ istype(W,/obj/item/clothing/suit) || \ - istype(W,/obj/item/weapon/bedsheet)) + istype(W,/obj/item/weapon/bedsheet) || \ + istype(W,/obj/item/weapon/paper)) //YES, it's hardcoded... saves a var/can_be_washed for every single clothing item. if ( istype(W,/obj/item/clothing/suit/space ) ) diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm index fb853902287..9392ec2ac59 100644 --- a/code/game/objects/items/weapons/handcuffs.dm +++ b/code/game/objects/items/weapons/handcuffs.dm @@ -320,4 +320,11 @@ desc = "A strong bola, made with a long steel chain. It looks heavy, enough so that it could trip somebody." icon_state = "bola_r" breakouttime = 70 - weaken = 1 \ No newline at end of file + 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 diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 71ae1dddede..c8215595f2b 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -127,7 +127,7 @@ if(rand(1,2)==2) if(lowertext(newletter)=="o") newletter="u" - if(lowertext(newletter)=="s") + if(lowertext(newletter)=="t") newletter="ch" if(lowertext(newletter)=="a") newletter="ah" @@ -135,15 +135,15 @@ newletter="oo" if(lowertext(newletter)=="c") newletter=" NAR " - if(lowertext(newletter)=="t") + if(lowertext(newletter)=="s") newletter=" SIE " if(rand(1,4)==4) if(newletter==" ") - newletter=" GLORY " + newletter=" no hope... " if(newletter=="H") - newletter=" HAIL " + newletter=" IT COMES... " - switch(rand(1,10)) + switch(rand(1,15)) if(1) newletter="'" if(2) @@ -152,6 +152,8 @@ newletter="fth" if(4) newletter="nglu" + if(5) + newletter="glor" newphrase+="[newletter]";counter-=1 return newphrase diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index bec65f20859..1c5ef052c3f 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ