diff --git a/code/game/magic/ritual.dm b/code/game/magic/ritual.dm index e8430c28011..115ab33cb76 100644 --- a/code/game/magic/ritual.dm +++ b/code/game/magic/ritual.dm @@ -17,13 +17,14 @@ var/list/cultists = list() // nahlizet - see // certum - Hell // veri - blood -// jatkaa - join +// jatkaa - join <- eh, I just used good-soounding combos. Could change that later // ire ego [word] - Teleport to [rune with word destination matching] (works in pairs) // nahlizet veri certum - Create a new tome // jatkaa veri ego - Incorporate person over the rune into the group // certum jatkaa ego - Summon TERROR +// nahlizet ire certum - EMP rune examine() set src in usr @@ -34,15 +35,26 @@ var/list/cultists = list() ..() return - + attackby(I as obj, user as mob) + if(istype(I, /obj/item/weapon/tome) && cultists.Find(user)) + user << "You retrace your steps, carefully undoing the lines of the rune." + del(src) + return + else if(istype(I, /obj/item/weapon/storage/bible) && usr.mind && (usr.mind.assigned_role == "Chaplain")) + user << "\blue You banish the vile magic with the blessing of God!" + del(src) + return + return attack_hand(mob/user as mob) if(!cultists.Find(user)) user << "You can't mouth the arcane scratchings without fumbling over them." return - if(!word1 || !word2 || !word3) + if(!word1 || !word2 || !word3 || prob(usr.brainloss)) return fizzle() + if(word1 == "ire" && word2 == "ego") + usr.say("Sas'so c'arta forbici!") for(var/obj/rune/R in world) if(R == src) continue @@ -53,16 +65,19 @@ var/list/cultists = list() return return fizzle() if(word1 == "nahlizet" && word2 == "veri" && word3 == "certum") + usr.say("N'ath reth sh'yro eth d'raggathnor!") for (var/mob/V in viewers(src)) V.show_message("\red There's a flash of red light. The rune disappears, and in its place a book lies", 3, "\red You hear a pop and smell ozone.", 2) new /obj/item/weapon/tome(src.loc) del(src) - /* + +/* + if(word1 == "ire" && word2 == "certum" && word3 == "jatkaa") var/list/temprunes = list() var/list/runes = list() for(var/obj/rune/R in world) if(istype(R, /obj/rune)) - if(R.word1 == "nahlizet" && R.word2 == "veri" && R.word3 == "certum") + if(R.word1 == "ire" && R.word2 == "certum" && R.word3 == "jatkaa") runes.Add(R) var/atom/a = get_turf_loc(R) temprunes.Add(a.loc) @@ -71,14 +86,14 @@ var/list/cultists = list() return fizzle() var/selection_position = temprunes.Find(chosen) var/obj/rune/chosenrune = runes[selection_position] -// user.client.eye = chosenrune + user.client.eye = chosenrune user:current = chosenrune user.reset_view(chosenrune) - +*/ return - */ if(word1 == "jatkaa" && word2 == "veri" && word3 == "ego") - for(var/mob/M in src.loc) + usr.say("Mah'weyh pleggh at e'ntrath!") + for(var/mob/living/carbon/human/M in src.loc) if(cultists.Find(M)) return fizzle() else @@ -89,6 +104,7 @@ var/list/cultists = list() 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." return if(word1 == "certum" && word2 == "jatkaa" && word3 == "ego") + usr.say("Tok-lyr rqa'nap g'lt-ulotf!") var/cultist_count = 0 for(var/mob/M in orange(1,src)) if(cultists.Find(M)) @@ -104,9 +120,198 @@ var/list/cultists = list() return else return fizzle() + if(word1 == "nahlizet" && word2 == "ire" && word3 == "certum") + usr.say("ta'gh fara'qha fel d'amar det!") + playsound(src.loc, 'Welder2.ogg', 25, 1) + var/turf/T = get_turf(src) + if(T) + T.hotspot_expose(700,125) + + var/rune = src // detaching the proc - in theory + src = null + + var/obj/overlay/pulse = new/obj/overlay ( T ) + pulse.icon = 'effects.dmi' + pulse.icon_state = "emppulse" + pulse.name = "emp pulse" + pulse.anchored = 1 + spawn(20) + del(pulse) + + for(var/obj/item/weapon/W in range(world.view-1, T)) + + if (istype(W, /obj/item/assembly/m_i_ptank) || istype(W, /obj/item/assembly/r_i_ptank) || istype(W, /obj/item/assembly/t_i_ptank)) + + var/fuckthis + if(istype(W:part1,/obj/item/weapon/tank/plasma)) + fuckthis = W:part1 + fuckthis:ignite() + if(istype(W:part2,/obj/item/weapon/tank/plasma)) + fuckthis = W:part2 + fuckthis:ignite() + if(istype(W:part3,/obj/item/weapon/tank/plasma)) + fuckthis = W:part3 + fuckthis:ignite() + + + for(var/mob/living/M in viewers(world.view-1, T)) + + if(!istype(M, /mob/living)) continue + + if (istype(M, /mob/living/silicon)) + M.fireloss += 25 + flick("noise", M:flash) + M << "\red *BZZZT*" + M << "\red Warning: Electromagnetic pulse detected." + if(istype(M, /mob/living/silicon/ai)) + if (prob(30)) + switch(pick(1,2,3)) //Add Random laws. + if(1) + M:cancel_camera() + if(2) + M:lockdown() + if(3) + M:ai_call_shuttle() + continue + + + M << "\red Your equipment malfunctions." //Yeah, i realise that this WILL + //show if theyre not carrying anything + //that is affected. lazy. + if (locate(/obj/item/weapon/cloaking_device, M)) + for(var/obj/item/weapon/cloaking_device/S in M) + S.active = 0 + S.icon_state = "shield0" + + if (locate(/obj/item/weapon/gun/energy, M)) + for(var/obj/item/weapon/gun/energy/G in M) + G.charges = 0 + G.update_icon() + + if ((istype(M, /mob/living/carbon/human)) && (istype(M:glasses, /obj/item/clothing/glasses/thermal))) + M << "\red Your thermals malfunction." + M.eye_blind = 3 + M.eye_blurry = 5 + M.disabilities |= 1 + spawn(100) + M.disabilities &= ~1 + + if (locate(/obj/item/device/radio, M)) + for(var/obj/item/device/radio/R in M) //Add something for the intercoms. + R.broadcasting = 0 + R.listening = 0 + + if (locate(/obj/item/device/flash, M)) + for(var/obj/item/device/flash/F in M) //Add something for the intercoms. + F.attack_self() + + if (locate(/obj/item/weapon/baton, M)) + for(var/obj/item/weapon/baton/B in M) //Add something for the intercoms. + B.charges = 0 + + if(locate(/obj/item/clothing/under/chameleon, M)) + for(var/obj/item/clothing/under/chameleon/C in M) //Add something for the intercoms. + M << "\red Your jumpsuit malfunctions" + C.name = "psychedelic" + C.desc = "Groovy!" + C.icon_state = "psyche" + C.color = "psyche" + spawn(200) + C.name = "Black Jumpsuit" + C.icon_state = "bl_suit" + C.color = "black" + C.desc = null + + M << "\red BZZZT" + + + for(var/obj/machinery/A in range(world.view-1, T)) + A.use_power(7500) + + var/obj/overlay/pulse2 = new/obj/overlay ( A.loc ) + pulse2.icon = 'effects.dmi' + pulse2.icon_state = "empdisable" + pulse2.name = "emp sparks" + pulse2.anchored = 1 + pulse2.dir = pick(cardinal) + + spawn(10) + del(pulse2) + + if(istype(A, /obj/machinery/turret)) + A:enabled = 0 + A:lasers = 0 + A:power_change() + + if(istype(A, /obj/machinery/computer) && prob(20)) + A:set_broken() + + if(istype(A, /obj/machinery/firealarm) && prob(50)) + A:alarm() + + if(istype(A, /obj/machinery/power/smes)) + A:online = 0 + A:charging = 0 + A:output = 0 + A:charge -= 1e6 + if (A:charge < 0) + A:charge = 0 + spawn(100) + A:output = initial(A:output) + A:charging = initial(A:charging) + A:online = initial(A:online) + + if(istype(A, /obj/machinery/door)) + if(prob(20) && (istype(A,/obj/machinery/door/airlock) || istype(A,/obj/machinery/door/window)) ) + A:open() + if(prob(40)) + if(A:secondsElectrified != 0) continue + A:secondsElectrified = -1 + spawn(300) + A:secondsElectrified = 0 + + if(istype(A, /obj/machinery/power/apc)) + if(A:cell) + A:cell:charge -= 1000 + if (A:cell:charge < 0) + A:cell:charge = 0 + A:lighting = 0 + A:equipment = 0 + A:environ = 0 + spawn(600) + A:equipment = 3 + A:environ = 3 + + if(istype(A, /obj/machinery/camera)) + A.icon_state = "cameraemp" + A:network = null //Not the best way but it will do. I think. + spawn(900) + A:network = initial(A:network) + A:icon_state = initial(A:icon_state) + for(var/mob/living/silicon/ai/O in world) + if (O.current == A) + O.cancel_camera() + O << "Your connection to the camera has been lost." + for(var/mob/O in world) + if (istype(O.machine, /obj/machinery/computer/security)) + var/obj/machinery/computer/security/S = O.machine + if (S.current == A) + O.machine = null + S.current = null + O.reset_view(null) + O << "The screen bursts into static." + + if(istype(A, /obj/machinery/clonepod)) + A:malfunction() + del(rune) + return + else + return fizzle() + proc fizzle() + usr.say(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP")) for (var/mob/V in viewers(src)) V.show_message("\red The markings pulse with a small burst of light, then fall dark.", 3, "\red You hear a faint fizzle.", 2) return @@ -115,13 +320,17 @@ var/list/cultists = list() if(word1 == "ire" && word2 == "ego") icon_state = "2" return - if(word1 == "nahlizet" && word2 == "veri" && word3 == "certum") + if(word1 == "jatkaa" && word2 == "veri" && word3 == "ego") icon_state = "3" return if(word1 == "certum" && word2 == "jatkaa" && word3 == "ego") icon_state = "3" src.icon += rgb(100, 0 , 150) return + if(word1 == "nahlizet" && word2 == "ire" && word3 == "certum") + icon_state = "2" + src.icon += rgb(0, 50 , 0) + return icon_state = "1" @@ -135,26 +344,43 @@ var/list/cultists = list() attack_self(mob/user as mob) if(cultists.Find(user)) - var/choice = input("Scribe a rune on the ground here?", "Rune Scribing") in list("Yes", "No") - if(choice == "No") - return + var/C = 0 + for(var/obj/rune/N in world) + C++ + if (C>=25) + switch(alert("The cloth of reality can't take that much of a strain. By creating another rune, you risk locally tearing reality apart, which would prove fatal to you. Do you still wish to scribe the rune?",,"Yes","No")) + if("Yes") + if(prob(C*5-100)) + usr.emote("scream") + user << "\red A tear momentarily appears in reality. Before it closes, you catch a glimpse of that which lies beyond. That proves to be too much for your mind." + usr.gib(1) + return + if("No") + return + else + if(alert("Scribe a rune?",,"Yes","No")=="No") + return + var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa") var/w1 var/w2 var/w3 - var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa") if(usr) w1 = input("Write your first rune:", "Rune Scribing") in words if(usr) w2 = input("Write your second rune:", "Rune Scribing") in words if(usr) w3 = input("Write your third rune:", "Rune Scribing") in words - var/obj/rune/R = new /obj/rune(user.loc) - R.word1 = w1 - R.word2 = w2 - R.word3 = w3 - R.check_icon() for (var/mob/V in viewers(src)) - V.show_message("\red [user] slices open a finger and paints symbols on the floor.", 3, "\red You hear someone drawing on a surface.", 2) + V.show_message("\red [user] slices open a finger and begins to chant and paint symbols on the floor.", 3, "\red You hear chanting.", 2) + user << "\red You slice open one of your fingers and begin drawing a rune on the floor whilst chanting the ritual that binds your life essence with the dark arcane energies flowing through the surrounding world." + user.bruteloss += 1 + if(do_after(user, 50)) + var/obj/rune/R = new /obj/rune(user.loc) + user << "\red You finish drawing the arcane markings of the Geometer." + R.word1 = w1 + R.word2 = w2 + R.word3 = w3 + R.check_icon() return else user << "The book seems full of illegible scribbles. Is this a joke?" @@ -162,7 +388,10 @@ var/list/cultists = list() examine() set src in usr - usr << "An old, dusty tome with frayed edges and a sinister looking cover." + if(!cultists.Find(usr)) + usr << "An old, dusty tome with frayed edges and a sinister looking cover." + else + usr << "The scriptures of Nar-Sie, The One Who Sees, The Geometer of Blood. Contains the details of every ritual his followers could think of. Most of these are useless, though." /obj/item/weapon/paperscrap diff --git a/code/game/objects/items/weapons/misc.dm b/code/game/objects/items/weapons/misc.dm index e63bc6cd836..0a44e44ae58 100644 --- a/code/game/objects/items/weapons/misc.dm +++ b/code/game/objects/items/weapons/misc.dm @@ -78,6 +78,9 @@ DNA INJECTOR for(var/mob/O in viewers(M, null)) O.show_message(text("\red [] has been injected with [] by [].", M, src, user), 1) //Foreach goto(192) + if (!istype(M, /mob/living/carbon/human) || !istype(M, /mob/living/carbon/monkey)) + user << "\red Apparently it didn't work." + return inject(M) user.show_message(text("\red You inject [M]")) return \ No newline at end of file