diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index 3e31c0f573b..6afb86104b6 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -19,6 +19,26 @@ if(mind.current == ticker.mode.sacrifice_target) return 0 return 1 +/proc/cultist_commune(var/mob/living/user, var/clear = 0, var/say = 0, var/message) + if(!message) + return + if(say) + user.say("O bidai nabora se[pick("'","`")]sma!") + else + user.whisper("O bidai nabora se[pick("'","`")]sma!") + sleep(10) + if(say) + user.say(message) + else + user.whisper(message) + for(var/mob/M in mob_list) + if(iscultist(M) || (M in dead_mob_list)) + if(clear) + M << "Acolyte [user]: [message]" + else + M << "Acolyte ???: [message]" + + /datum/game_mode/cult name = "cult" diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index ac159322699..18a63e3ed4f 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -42,28 +42,23 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return if(ishuman(usr) || ismonkey(usr)) //Damage only applies to humans and monkeys, to allow constructs to communicate - usr.visible_message("[usr.name] starts clawing at his arms like a mad man!", "You start clawing at his arms like a mad man!") - apply_damage(25,BRUTE, "l_arm") - apply_damage(25,BRUTE, "r_arm") + usr.visible_message("[usr.name] starts clawing at \his arms with \his fingernails!", "You begin slicing open your arms with your fingers!") + apply_damage(10,BRUTE, "l_arm") + apply_damage(10,BRUTE, "r_arm") sleep(50) if(usr.incapacitated()) return //Hard to drawn intrinsic symbols when you're bleeding out in your cell. var/turf/location = loc if(istype(location, /turf/simulated)) // tearing your arms apart is going to spill a bit of blood, in fact thats the idea location.add_blood(usr) // TO-DO change this to a badly drawn rune - apply_damage(15,BRUTE, "l_arm") // does a metric fuck ton of damage because this meant to be an emergency method of communication. - apply_damage(15,BRUTE, "r_arm") + apply_damage(10,BRUTE, "l_arm") // does a metric fuck ton of damage because this meant to be an emergency method of communication. + apply_damage(10,BRUTE, "r_arm") if(usr.incapacitated()) return - usr.visible_message("[usr.name] paints strange symbols with their own blood.", "You paint strange symbols with your own blood.") + usr.visible_message("[usr.name] paints strange symbols with their own blood.", "You paint a messy rune with your own blood.") sleep(20) - usr.say("O bidai nabora se[pick("'","`")]sma!") - sleep(10) - usr.say("[input]") - for(var/mob/M in mob_list) - if((M.mind && (M.mind in ticker.mode.cult)) || (M in dead_mob_list)) - M << "[input]" + cultist_commune(usr, 0, 1, input) return @@ -186,8 +181,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return emp(src.loc,3) if(word1 == wordtravel && word2 == wordblood && word3 == wordself) return drain() - if(word1 == wordsee && word2 == wordhell && word3 == wordjoin) - return seer() if(word1 == wordblood && word2 == wordjoin && word3 == wordhell) return raise() if(word1 == wordhide && word2 == wordsee && word3 == wordblood) @@ -518,7 +511,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", return M.take_organ_damage(0,rand(5,20)) //really lucky - 5 hits for a crit M.visible_message("[user] beats [M] with the arcane tome!", \ - "You feel searing heat inside!") + "[user] beats you with the tome, and you feel a searing heat inside you!") /obj/item/weapon/tome/attack_self(mob/living/user as mob) @@ -544,11 +537,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") if(!input) return - usr.whisper("O bidai nabora se[pick("'","`")]sma!") - usr.whisper("[input]") - for(var/datum/mind/H in ticker.mode.cult) - if (H.current) - H.current << "[input]" + cultist_commune(user, 1, 0, input) return if("Notes") if(usr.get_active_hand() != src) @@ -690,7 +679,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", var/r if (!istype(user.loc,/turf)) user << "You do not have enough space to write a proper rune." - var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "seer", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun", "summon shell") + var/list/runes = list("teleport", "itemport", "tome", "armor", "convert", "tear in reality", "emp", "drain", "raise", "obscure", "reveal", "astral journey", "manifest", "imbue talisman", "sacrifice", "wall", "freedom", "cultsummon", "deafen", "blind", "bloodboil", "communicate", "stun", "summon shell") r = input("Choose a rune to scribe", "Rune Scribing") in runes //not cancellable. var/obj/effect/rune/R = new /obj/effect/rune if(istype(user, /mob/living/carbon/human)) @@ -754,12 +743,6 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", R.word3=wordself R.loc = user.loc R.check_icon() - if("seer") - R.word1=wordsee - R.word2=wordhell - R.word3=wordjoin - R.loc = user.loc - R.check_icon() if("raise") R.word1=wordblood R.word2=wordjoin diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 340aa519ba5..a4b36d9acb0 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -1,7 +1,11 @@ var/list/sacrificed = list() /obj/effect/rune -/////////////////////////////////////////FIRST RUNE + + +///Teleport: Teleports the user to a random teleport rune with the same rune. Can be imbued into a talisman. + + /obj/effect/rune/proc/teleport(var/key) var/mob/living/user = usr var/allrunesloc[] @@ -37,6 +41,7 @@ var/list/sacrificed = list() return +//Subtype of teleport, teleports any items and mobs on top of the rune rather than the user themselves /obj/effect/rune/proc/itemport(var/key) // var/allrunesloc[] // allrunesloc = new/list() @@ -76,7 +81,9 @@ var/list/sacrificed = list() return fizzle(user) -/////////////////////////////////////////SECOND RUNE + +///Summon Tome: Summons a completely untranslated tome. + /obj/effect/rune/proc/tomesummon() if(istype(src,/obj/effect/rune)) @@ -94,8 +101,8 @@ var/list/sacrificed = list() return +///Convert: The primary method of gaining new followers. Requires three cultists, doesn't work on loyalty implanted people, captains, or chaplains. -/////////////////////////////////////////THIRD RUNE /obj/effect/rune/proc/convert() var/list/mob/living/cultsinrange = list() @@ -117,22 +124,6 @@ var/list/sacrificed = list() M.mind.special_role = "Cultist" M << "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 in the festering wound left behind something sinister takes root." M << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." -/*//convert no longer gives words - //picking which word to use - if(usr.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything - var/convert_word - for(var/i=1, i<=3, i++) - convert_word = pick(ticker.mode.grantwords) - if(convert_word in usr.mind.cult_words) - if(i==3) convert_word = null //NOTE: If max loops is changed ensure this condition is changed to match /Mal - else - break - if(!convert_word) - usr << "\red This Convert was unworthy of knowledge of the other side!" - else - usr << "\red The Geometer of Blood is pleased to see his followers grow in numbers." - ticker.mode.grant_runeword(usr, convert_word) - return 1 */ else M << "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 in the festering wound left behind something sinister takes root." M << "And not a single fuck was given, exterminate the cult at all costs." @@ -147,8 +138,8 @@ var/list/sacrificed = list() return fizzle() +///Summon Nar-Sie: Summons the avatar of Nar-Sie to wreak havoc on the station. Will turn walls and floors to cult version and make anyone it touches into a harvester. -/////////////////////////////////////////FOURTH RUNE /obj/effect/rune/proc/tearreality() var/list/mob/living/carbon/human/cultist_count = list() @@ -189,7 +180,9 @@ var/list/sacrificed = list() else return fizzle() -/////////////////////////////////////////FIFTH RUNE + +///EMP: Lets out a large EMP blast + /obj/effect/rune/proc/emp(var/U,var/range_red) //range_red - var which determines by which number to reduce the default emp range, U is the source loc, needed because of talisman emps which are held in hand at the moment of using and that apparently messes things up -- Urist if(istype(src,/obj/effect/rune)) @@ -204,7 +197,7 @@ var/list/sacrificed = list() empulse(U, (range_red - 2), range_red) qdel(rune) -/////////////////////////////////////////SIXTH RUNE +///Blood Drain: Deals 1-25 damage to someone on top of it and heals an equivalent amount of brute damage to the user. Can be stacked. Too much blood drain = blood hunger that must be sated. /obj/effect/rune/proc/drain() var/drain = 0 @@ -244,32 +237,9 @@ var/list/sacrificed = list() return +///Raise Dead: Requires two corpses. Brings one to life and gibs the other. - - -/////////////////////////////////////////SEVENTH RUNE - -/obj/effect/rune/proc/seer() - if(usr.loc==src.loc) - usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!") - var/mob/living/carbon/human/user = usr - if(user.see_invisible!=25 || (istype(user) && user.glasses)) //check for non humans - user << "The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision." - else - user << "The world beyond opens to your eyes." - var/see_temp = user.see_invisible - user.see_invisible = SEE_INVISIBLE_OBSERVER - user.seer = 1 - while(user.loc==src.loc) - sleep(30) - user.seer = 0 - user.see_invisible = see_temp - return - return fizzle() - -/////////////////////////////////////////EIGHTH RUNE - /obj/effect/rune/proc/raise() var/mob/living/carbon/human/corpse_to_raise var/mob/living/carbon/human/body_to_sacrifice @@ -328,40 +298,31 @@ var/list/sacrificed = list() corpse_to_raise.SetStunned(0) corpse_to_raise.SetWeakened(0) corpse_to_raise.radiation = 0 -// corpse_to_raise.buckled = null -// if(corpse_to_raise.handcuffed) -// qdel(corpse_to_raise.handcuffed) -// corpse_to_raise.update_inv_handcuffed(0) corpse_to_raise.stat = CONSCIOUS corpse_to_raise.updatehealth() corpse_to_raise.update_damage_overlays(0) corpse_to_raise.key = ghost.key //the corpse will keep its old mind! but a new player takes ownership of it (they are essentially possessed) //This means, should that player leave the body, the original may re-enter - usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") + if(usr.real_name == "Herbert West") + usr.say("To life, to life, I bring them!") + else + usr.say("Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!") corpse_to_raise.visible_message("[corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \ "Life... I'm alive again...", \ "You hear a faint, slightly familiar whisper.") body_to_sacrifice.visible_message("[body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \ - "You feel as your blood boils, tearing you apart.", \ + "You feel a horrible sensation of being torn apart, and--", \ "You hear a thousand voices, all crying in pain.") body_to_sacrifice.gib() - -// if(ticker.mode.name == "cult") -// ticker.mode:add_cultist(corpse_to_raise.mind) -// else -// ticker.mode.cult |= corpse_to_raise.mind - corpse_to_raise << "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 in the festering wound left behind something sinister takes root." corpse_to_raise << "Assist your new compatriots in their dark dealings. Their goal is yours, and yours is theirs. You serve the Dark One above all else. Bring It back." return +///Veil: Makes all surrounding runes invisible. They cannot be used directly but still used indirectly (i.e. teleport...) - -/////////////////////////////////////////NINETH RUNE - /obj/effect/rune/proc/obscure(var/rad) var/S=0 for(var/obj/effect/rune/R in orange(rad,src)) @@ -388,7 +349,9 @@ var/list/sacrificed = list() call(/obj/effect/rune/proc/fizzle)() return -/////////////////////////////////////////TENTH RUNE + +///Astral Journey: Lets a player explore around as a ghost but does 10 brute damage for every tick they are like that. If they are moved from the rune they cannot return. + /obj/effect/rune/proc/ajourney() //some bits copypastaed from admin tools - Urist if(usr.loc==src.loc) @@ -409,10 +372,9 @@ var/list/sacrificed = list() return fizzle() +///Manifest: User must be standing on rune. When invoked, makes a culted human spawn. The user takes damage depending on how many humans there are. If the user moves, all manifested humans are killed. -/////////////////////////////////////////ELEVENTH RUNE - /obj/effect/rune/proc/manifest() var/obj/effect/rune/this_rune = src src = null @@ -458,11 +420,9 @@ var/list/sacrificed = list() return +///Imbue Talisman: Put a compatible rune near this one and a paper on top of the imbue rune. Activate, and the compatible rune will be imbued into the paper. - -/////////////////////////////////////////TWELFTH RUNE - /obj/effect/rune/proc/talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm var/obj/item/weapon/paper/newtalisman var/unsuitable_newtalisman = 0 @@ -542,52 +502,24 @@ var/list/sacrificed = list() else return fizzle() -/////////////////////////////////////////THIRTEENTH RUNE -/obj/effect/rune/proc/mend() - var/mob/living/user = usr - src = null - user.say("Uhrast ka'hfa heldsagen ver[pick("'","`")]lot!") - user.take_overall_damage(200, 0) - runedec+=10 - user.visible_message("[user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \ - "In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \ - "You hear faint rustle.") - for(,user.stat==2) - sleep(600) - if (!user) - return - runedec-=10 - return +///Communicate: Static communication rune. Somewhat pointless with free communications with tomes. -/////////////////////////////////////////FOURTEETH RUNE - - // returns 0 if the rune is not used. returns 1 if the rune is used. /obj/effect/rune/proc/communicate() - . = 1 // Default output is 1. If the rune is deleted it will return 1 - var/input = stripped_input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") + var/input = stripped_input(usr, "Please enter a message to tell to the other acolytes.", "Voice of Blood", "") if(!input) - if (istype(src)) + if(istype(src)) fizzle() return 0 else return 0 - if(istype(src,/obj/effect/rune)) - usr.say("O bidai nabora se[pick("'","`")]sma!") - else - usr.whisper("O bidai nabora se[pick("'","`")]sma!") - - if(istype(src,/obj/effect/rune)) - usr.say("[input]") - else - usr.whisper("[input]") - for(var/mob/M in mob_list) - if((M.mind && (M.mind in ticker.mode.cult)) || (M in dead_mob_list)) - M << "[input]" + cultist_commune(usr , 1, 1, input) return 1 -/////////////////////////////////////////FIFTEENTH RUNE + +///Sacrifice: Gibs a target as an offering. Gives tome words as a reward and if the target has a mind, spawns a soul shard with their shade contained within. + /obj/effect/rune/proc/sacrifice() var/list/mob/living/carbon/human/cultsinrange = list() @@ -705,21 +637,6 @@ var/list/sacrificed = list() stone_or_gib(M) for(var/mob/victim in src.loc) //TO-DO: Move the shite above into the mob's own sac_act - see /mob/living/simple_animal/pet/corgi/sac_act for an example victim.sac_act(src, victim) //Sacrifice procs are now seperate per mob, this allows us to allow sacrifice on as many mob types as we want without making an already clunky system worse -/* for(var/mob/living/carbon/alien/A) - for(var/mob/K in cultsinrange) - K.say("Barhah hra zar'garis!") - A.dust() /// A.gib() doesnt work for some reason, and dust() leaves that skull and bones thingy which we dont really need. - if (ticker.mode.name == "cult") - if(prob(75)) - usr << "\red The Geometer of Blood accepts your exotic sacrifice." - sac_grant_word() - else - usr << "\red The Geometer of Blood accepts your exotic sacrifice." - usr << "\red However, this alien is not enough to gain His favor." - else - usr << "\red The Geometer of Blood accepts your exotic sacrifice." - return - return fizzle() */ /obj/effect/rune/proc/sac_grant_word(var/mob/living/C) //The proc that which chooses a word rewarded for a successful sacrifice, sacrifices always give a currently unknown word if the normal checks pass if(C.mind.cult_words.len != ticker.mode.allwords.len) // No point running if they already know everything @@ -739,7 +656,8 @@ var/list/sacrificed = list() T.gib() -/////////////////////////////////////////SIXTEENTH RUNE +///Reveal: Reverses the Veil rune's effect, revealing all hidden runes. + /obj/effect/rune/proc/revealrunes(var/obj/W as obj) var/go=0 @@ -783,7 +701,9 @@ var/list/sacrificed = list() call(/obj/effect/rune/proc/fizzle)() return -/////////////////////////////////////////SEVENTEENTH RUNE + +///Wall: Makes the rune dense and uncrossable. You can invoke it again to make it normal again. Deals 2 brute damage when used. + /obj/effect/rune/proc/wall() usr.say("Khari[pick("'","`")]d! Eske'te tannin!") @@ -796,9 +716,11 @@ var/list/sacrificed = list() usr << "Your blood flows into the rune, and you feel as the rune releases its grasp on space." return -/////////////////////////////////////////EIGHTTEENTH RUNE -/obj/effect/rune/proc/freedom() +///Free Cultist: If the cultist is not walking free, makes it so. + + +/obj/effect/rune/proc/freedom() //MURICA ;_;7 var/mob/living/user = usr var/list/mob/living/cultists = new for(var/datum/mind/H in ticker.mode.cult) @@ -847,7 +769,9 @@ var/list/sacrificed = list() qdel(src) return fizzle(user) -/////////////////////////////////////////NINETEENTH RUNE + +///Summon Cultist: Requires 3 cultists, summons a cultist to the rune's location and does 25 brute to all users. + /obj/effect/rune/proc/cultsummon() var/mob/living/user = usr @@ -881,7 +805,9 @@ var/list/sacrificed = list() qdel(src) return fizzle(user) -/////////////////////////////////////////TWENTIETH RUNES + +///Deafen: Makes all nearby non-cultists deaf. + /obj/effect/rune/proc/deafen() if(istype(src,/obj/effect/rune)) @@ -923,6 +849,10 @@ var/list/sacrificed = list() V.show_message("Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3) return + +///Blind: Makes all non-cultists nearby blind. Combine with Deafen to make the entire shuttle go into a panic and laugh as they bumble around. + + /obj/effect/rune/proc/blind() if(istype(src,/obj/effect/rune)) var/affected = 0 @@ -965,15 +895,11 @@ var/list/sacrificed = list() return +///Blood Boil: Every non-cultist nearby will take 51 burn and 51 brute damage. 5% chance for them to gib as well. Users will take 15 brute. 10% chance for the rune to blow up. + + /obj/effect/rune/proc/bloodboil() //cultists need at least one DANGEROUS rune. Even if they're all stealthy. -/* - var/list/mob/living/carbon/cultists = new - for(var/datum/mind/H in ticker.mode.cult) - if (istype(H.current,/mob/living/carbon)) - cultists+=H.current -*/ - var/culcount = 0 //also, wording for it is old wording for obscure rune, which is now hide-see-blood. -// var/list/cultboil = list(cultists-usr) //and for this words are destroy-see-blood. + var/culcount = 0 for(var/mob/living/carbon/C in orange(1,src)) if(iscultist(C) && !C.stat) culcount++ @@ -1001,35 +927,9 @@ var/list/sacrificed = list() return fizzle() return -// WIP rune, I'll wait for Rastaf0 to add limited blood. -/obj/effect/rune/proc/burningblood() - var/culcount = 0 - for(var/mob/living/carbon/C in orange(1,src)) - if(iscultist(C) && !C.stat) - culcount++ - if(culcount >= 5) - for(var/obj/effect/rune/R in world) - if(R.blood_DNA == src.blood_DNA) - for(var/mob/living/M in orange(2,R)) - M.take_overall_damage(0,15) - if (R.invisibility>M.see_invisible) - M << "Aargh it burns!" - else - M << "Rune suddenly ignites, burning you!" - var/turf/T = get_turf(R) - T.hotspot_expose(700,125) - for(var/obj/effect/decal/cleanable/blood/B in world) - if(B.blood_DNA == src.blood_DNA) - for(var/mob/living/M in orange(1,B)) - M.take_overall_damage(0,5) - M << "Blood suddenly ignites, burning you!" - var/turf/T = get_turf(B) - T.hotspot_expose(700,125) - qdel(B) - qdel(src) +///Stun: Everyone nearby would be stunned for a -very- short time. If used in a talisman, it stuns and mutes a single target. -////////// Rune 24 (counting burningblood, which kinda doesnt work yet.) /obj/effect/rune/proc/runestun(var/mob/living/T as mob) if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around. @@ -1047,7 +947,7 @@ var/list/sacrificed = list() else if(issilicon(L)) var/mob/living/silicon/S = L S.Weaken(5) - S.show_message("BZZZT... The rune has exploded in a bright flash.", 3) + S.show_message("!@(%* BZZZZZT !@(%!)$", 3) qdel(src) else ///When invoked as talisman, stun and mute the target mob. usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!") @@ -1070,7 +970,9 @@ var/list/sacrificed = list() C.Stun(10) return -/////////////////////////////////////////TWENTY-FIFTH RUNE + +///Armor: The user will be armed with cultist garb, a trophy rack, and a high-damage sword. If items are in these slots, they will not be equipped and simply deleted. + /obj/effect/rune/proc/armor() var/mob/living/carbon/human/user = usr @@ -1091,6 +993,10 @@ var/list/sacrificed = list() qdel(src) + +///Summon Shell: Summons a construct shell if there's four plasteel sheets on top of the rune + + /obj/effect/rune/proc/summon_shell() // Summons a construct shell for(var/obj/item/stack/sheet/plasteel/PS in src.loc) //I could probably combine the amounts but I'm too lazy to compensate for others' lazyness if(PS.amount >= 4) // may need increasing?