diff --git a/code/defines/procs/helper_text.dm b/code/defines/procs/helper_text.dm
index d5379b9dae..2ea37cf854 100644
--- a/code/defines/procs/helper_text.dm
+++ b/code/defines/procs/helper_text.dm
@@ -1,12 +1,24 @@
/*
* Holds procs designed to help with filtering text
* Contains groups:
+ * SQL sanitization
* Text sanitization
* Text searches
* Text modification
* Misc
*/
+
+/*
+ * SQL sanitization
+ */
+
+// Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts.
+/proc/sanitizeSQL(var/t as text)
+ var/sanitized_text = dd_replacetext(t, "'", "\\'")
+ sanitized_text = dd_replacetext(sanitized_text, "\"", "\\\"")
+ return sanitized_text
+
/*
* Text sanitization
*/
diff --git a/code/game/magic/cultist/ritual.dm b/code/game/gamemodes/cult/ritual.dm
similarity index 100%
rename from code/game/magic/cultist/ritual.dm
rename to code/game/gamemodes/cult/ritual.dm
diff --git a/code/game/magic/cultist/runes.dm b/code/game/gamemodes/cult/runes.dm
similarity index 97%
rename from code/game/magic/cultist/runes.dm
rename to code/game/gamemodes/cult/runes.dm
index aa468cbba2..ecac0e026e 100644
--- a/code/game/magic/cultist/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -1,1038 +1,1038 @@
-var/list/sacrificed = list()
-
-/obj/effect/rune
-/////////////////////////////////////////FIRST RUNE
- proc
- teleport(var/key)
- var/mob/living/user = usr
- var/allrunesloc[]
- allrunesloc = new/list()
- var/index = 0
- // var/tempnum = 0
- for(var/obj/effect/rune/R in world)
- if(R == src)
- continue
- if(R.word1 == wordtravel && R.word2 == wordself && R.word3 == key && R.z != 2)
- index++
- allrunesloc.len = index
- allrunesloc[index] = R.loc
- if(index >= 5)
- user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
- if (istype(user, /mob/living))
- user.take_overall_damage(5, 0)
- del(src)
- if(allrunesloc && index != 0)
- if(istype(src,/obj/effect/rune))
- user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting
- else
- user.whisper("Sas[pick("'","`")]so c'arta forbici!")
- user.visible_message("\red [user] disappears in a flash of red light!", \
- "\red You feel as your body gets dragged through the dimension of Nar-Sie!", \
- "\red You hear a sickening crunch and sloshing of viscera.")
- user.loc = allrunesloc[rand(1,index)]
- return
- if(istype(src,/obj/effect/rune))
- return fizzle() //Use friggin manuals, Dorf, your list was of zero length.
- else
- call(/obj/effect/rune/proc/fizzle)()
- return
-
-
- itemport(var/key)
-// var/allrunesloc[]
-// allrunesloc = new/list()
-// var/index = 0
- // var/tempnum = 0
- var/culcount = 0
- var/runecount = 0
- var/obj/effect/rune/IP = null
- var/mob/living/user = usr
- for(var/obj/effect/rune/R in world)
- if(R == src)
- continue
- if(R.word1 == wordtravel && R.word2 == wordother && R.word3 == key)
- IP = R
- runecount++
- if(runecount >= 2)
- user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
- if (istype(user, /mob/living))
- user.take_overall_damage(5, 0)
- del(src)
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- culcount++
- if(culcount>=3)
- user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
- user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
- "\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
- "\red You smell ozone.")
- for(var/obj/O in src.loc)
- if(!O.anchored)
- O.loc = IP.loc
- for(var/mob/M in src.loc)
- M.loc = IP.loc
- return
-
- return fizzle()
-
-
-/////////////////////////////////////////SECOND RUNE
-
- tomesummon()
- if(istype(src,/obj/effect/rune))
- usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
- else
- usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
- usr.visible_message("\red Rune disappears with a flash of red light, and in its place now a book lies.", \
- "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \
- "\red You hear a pop and smell ozone.")
- if(istype(src,/obj/effect/rune))
- new /obj/item/weapon/tome(src.loc)
- else
- new /obj/item/weapon/tome(usr.loc)
- del(src)
- return
-
-
-
-/////////////////////////////////////////THIRD RUNE
-
- convert()
- for(var/mob/living/carbon/M in src.loc)
- if(iscultist(M))
- continue
- if(M.stat==2)
- continue
- usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
- M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
- "\red AAAAAAHHHH!.", \
- "\red You hear an anguished scream.")
- if(is_convertable_to_cult(M.mind))
- ticker.mode.add_cultist(M.mind)
- 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."
- 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."
- return 0
-
- return fizzle()
-
-
-
-/////////////////////////////////////////FOURTH RUNE
-
- tearreality()
- var/cultist_count = 0
- for(var/mob/M in range(1,src))
- if(iscultist(M) && !M.stat)
- M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
- cultist_count += 1
- if(cultist_count >= 9)
- new /obj/machinery/singularity/narsie(src.loc)
- if(ticker.mode.name == "cult")
- ticker.mode:eldergod = 0
- return
- else
- return fizzle()
-
-/////////////////////////////////////////FIFTH RUNE
-
- 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))
- usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
- else
- usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
- playsound(U, 'sound/items/Welder2.ogg', 25, 1)
- var/turf/T = get_turf(U)
- if(T)
- T.hotspot_expose(700,125)
- var/rune = src // detaching the proc - in theory
- empulse(U, (range_red - 2), range_red)
- del(rune)
- return
-
-/////////////////////////////////////////SIXTH RUNE
-
- drain()
- var/drain = 0
- for(var/obj/effect/rune/R in world)
- if(R.word1==wordtravel && R.word2==wordblood && R.word3==wordself)
- for(var/mob/living/carbon/D in R.loc)
- if(D.stat!=2)
- var/bdrain = rand(1,25)
- D << "\red You feel weakened."
- D.take_overall_damage(bdrain, 0)
- drain += bdrain
- if(!drain)
- return fizzle()
- usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
- usr.visible_message("\red Blood flows from the rune into [usr]!", \
- "\red The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \
- "\red You hear a liquid flowing.")
- var/mob/living/user = usr
- if(user.bhunger)
- user.bhunger = max(user.bhunger-2*drain,0)
- if(drain>=50)
- user.visible_message("\red [user]'s eyes give off eerie red glow!", \
- "\red ...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \
- "\red You hear a heartbeat.")
- user.bhunger += drain
- src = user
- spawn()
- for (,user.bhunger>0,user.bhunger--)
- sleep(50)
- user.take_overall_damage(3, 0)
- return
- user.heal_organ_damage(drain%5, 0)
- drain-=drain%5
- for (,drain>0,drain-=5)
- sleep(2)
- user.heal_organ_damage(5, 0)
- return
-
-
-
-
-
-
-/////////////////////////////////////////SEVENTH RUNE
-
- seer()
- if(usr.loc==src.loc)
- usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
- if(usr.see_invisible!=0 && usr.see_invisible!=15)
- usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
- else
- usr << "\red The world beyond opens to your eyes."
- usr.see_invisible = SEE_INVISIBLE_OBSERVER
- usr.seer = 1
- return
- return fizzle()
-
-/////////////////////////////////////////EIGHTH RUNE
-
- raise()
- var/mob/living/carbon/human/corpse_to_raise
- var/mob/living/carbon/human/body_to_sacrifice
-
- var/is_sacrifice_target = 0
- for(var/mob/living/carbon/human/M in src.loc)
- if(M.stat == DEAD)
- if(ticker.mode.name == "cult" && M.mind == ticker.mode:sacrifice_target)
- is_sacrifice_target = 1
- else
- corpse_to_raise = M
- if(M.key)
- M.ghostize(1) //kick them out of their body
- break
- if(!corpse_to_raise)
- if(is_sacrifice_target)
- usr << "\red The Geometer of blood wants this mortal for himself."
- return fizzle()
-
-
- is_sacrifice_target = 0
- find_sacrifice:
- for(var/obj/effect/rune/R in world)
- if(R.word1==wordblood && R.word2==wordjoin && R.word3==wordhell)
- for(var/mob/living/carbon/human/N in R.loc)
- if(ticker.mode.name == "cult" && N.mind && N.mind == ticker.mode:sacrifice_target)
- is_sacrifice_target = 1
- else
- if(N.stat!= DEAD)
- body_to_sacrifice = N
- break find_sacrifice
-
- if(!body_to_sacrifice)
- if (is_sacrifice_target)
- usr << "\red The Geometer of blood wants that corpse for himself."
- else
- usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
- return fizzle()
-
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
-
- if(!ghost)
- usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
- return fizzle()
-
- for(var/datum/organ/external/affecting in corpse_to_raise.organs)
- affecting.heal_damage(1000, 1000)
- corpse_to_raise.setToxLoss(0)
- corpse_to_raise.setOxyLoss(0)
- corpse_to_raise.SetParalysis(0)
- 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)
-// del(corpse_to_raise.handcuffed)
-// corpse_to_raise.update_inv_handcuffed(0)
- corpse_to_raise.stat = CONSCIOUS
- corpse_to_raise.updatehealth()
- corpse_to_raise.UpdateDamageIcon()
-
- 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!")
- corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
- "\red Life... I'm alive again...", \
- "\red You hear a faint, slightly familiar whisper.")
- body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \
- "\red You feel as your blood boils, tearing you apart.", \
- "\red 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
-
-
-
-
-
-/////////////////////////////////////////NINETH RUNE
-
- obscure(var/rad)
- var/S=0
- for(var/obj/effect/rune/R in orange(rad,src))
- if(R!=src)
- R:visibility=0
- S=1
- if(S)
- if(istype(src,/obj/effect/rune))
- usr.say("Kla[pick("'","`")]atu barada nikt'o!")
- for (var/mob/V in viewers(src))
- V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3)
- del(src)
- else
- usr.whisper("Kla[pick("'","`")]atu barada nikt'o!")
- usr << "\red Your talisman turns into gray dust, veiling the surrounding runes."
- for (var/mob/V in orange(1,src))
- if(V!=usr)
- V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3)
-
- return
- if(istype(src,/obj/effect/rune))
- return fizzle()
- else
- call(/obj/effect/rune/proc/fizzle)()
- return
-
-/////////////////////////////////////////TENTH RUNE
-
- ajourney() //some bits copypastaed from admin tools - Urist
- if(usr.loc==src.loc)
- var/mob/living/carbon/human/L = usr
- usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
- usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
- "\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
- "\red You hear only complete silence for a moment.")
- usr.ghostize(1)
- L.ajourn = 1
- while(L)
- if(L.key)
- L.ajourn=0
- return
- else
- L.take_organ_damage(10, 0)
- sleep(100)
- return fizzle()
-
-
-
-
-/////////////////////////////////////////ELEVENTH RUNE
-
- manifest()
- var/obj/effect/rune/this_rune = src
- src = null
- if(usr.loc!=this_rune.loc)
- return this_rune.fizzle()
- var/mob/dead/observer/ghost
- for(var/mob/dead/observer/O in this_rune.loc)
- if(!O.client) continue
- if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
- ghost = O
- break
- if(!ghost)
- return this_rune.fizzle()
-
- usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!")
- var/mob/living/carbon/human/dummy/D = new(this_rune.loc)
- usr.visible_message("\red A shape forms in the center of the rune. A shape of... a man.", \
- "\red A shape forms in the center of the rune. A shape of... a man.", \
- "\red You hear liquid flowing.")
- D.real_name = "Unknown"
- for(var/obj/item/weapon/paper/P in this_rune.loc)
- if(length(P.name)<=24)
- D.real_name = P.name
- break
- D.universal_speak = 1
- D.nodamage = 0
-
- D.key = ghost.key
-
- if(ticker.mode.name == "cult")
- ticker.mode:add_cultist(D.mind)
- else
- ticker.mode.cult+=D.mind
-
- D << "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."
- D << "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."
-
- var/mob/living/user = usr
- while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
- user.take_organ_damage(1, 0)
- sleep(30)
- if(D)
- D.visible_message("\red [D] slowly dissipates into dust and bones.", \
- "\red You feel pain, as bonds formed between your soul and this homunculus break.", \
- "\red You hear faint rustle.")
- D.dust()
- return
-
-
-
-
-
-/////////////////////////////////////////TWELFTH RUNE
-
- talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm
- var/obj/item/weapon/paper/newtalisman
- var/unsuitable_newtalisman = 0
- for(var/obj/item/weapon/paper/P in src.loc)
- if(!P.info)
- newtalisman = P
- break
- else
- unsuitable_newtalisman = 1
- if (!newtalisman)
- if (unsuitable_newtalisman)
- usr << "\red The blank is tainted. It is unsuitable."
- return fizzle()
-
- var/obj/effect/rune/imbued_from
- var/obj/item/weapon/paper/talisman/T
- for(var/obj/effect/rune/R in orange(1,src))
- if(R==src)
- continue
- if(R.word1==wordtravel && R.word2==wordself) //teleport
- T = new(src.loc)
- T.imbue = "[R.word3]"
- T.info = "[R.word3]"
- imbued_from = R
- break
- if(R.word1==wordsee && R.word2==wordblood && R.word3==wordhell) //tome
- T = new(src.loc)
- T.imbue = "newtome"
- imbued_from = R
- break
- if(R.word1==worddestr && R.word2==wordsee && R.word3==wordtech) //emp
- T = new(src.loc)
- T.imbue = "emp"
- imbued_from = R
- break
- if(R.word1==wordblood && R.word2==wordsee && R.word3==worddestr) //conceal
- T = new(src.loc)
- T.imbue = "conceal"
- imbued_from = R
- break
- if(R.word1==wordhell && R.word2==worddestr && R.word3==wordother) //armor
- T = new(src.loc)
- T.imbue = "armor"
- imbued_from = R
- break
- if(R.word1==wordblood && R.word2==wordsee && R.word3==wordhide) //reveal
- T = new(src.loc)
- T.imbue = "revealrunes"
- imbued_from = R
- break
- if(R.word1==wordhide && R.word2==wordother && R.word3==wordsee) //deafen
- T = new(src.loc)
- T.imbue = "deafen"
- imbued_from = R
- break
- if(R.word1==worddestr && R.word2==wordsee && R.word3==wordother) //blind
- T = new(src.loc)
- T.imbue = "blind"
- imbued_from = R
- break
- if(R.word1==wordself && R.word2==wordother && R.word3==wordtech) //communicat
- T = new(src.loc)
- T.imbue = "communicate"
- imbued_from = R
- break
- if(R.word1==wordjoin && R.word2==wordhide && R.word3==wordtech) //communicat
- T = new(src.loc)
- T.imbue = "runestun"
- imbued_from = R
- break
- if (imbued_from)
- for (var/mob/V in viewers(src))
- V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3)
- usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!")
- del(imbued_from)
- del(newtalisman)
- else
- return fizzle()
-
-/////////////////////////////////////////THIRTEENTH RUNE
-
- 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("\red [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \
- "\red In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \
- "\red You hear faint rustle.")
- for(,user.stat==2)
- sleep(600)
- if (!user)
- return
- runedec-=10
- return
-
-
-/////////////////////////////////////////FOURTEETH RUNE
-
- // returns 0 if the rune is not used. returns 1 if the rune is used.
- communicate()
- . = 1 // Default output is 1. If the rune is deleted it will return 1
- var/input = copytext(sanitize(input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") as text|null),1,MAX_MESSAGE_LEN)
- if(!input)
- 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!")
- var/input_s = sanitize(input)
- if(istype(src,/obj/effect/rune))
- usr.say("[input]")
- else
- usr.whisper("[input]")
- for(var/datum/mind/H in ticker.mode.cult)
- if (H.current)
- H.current << "\red \b [input_s]"
- del(src)
- return 1
-
-/////////////////////////////////////////FIFTEENTH RUNE
-
- sacrifice()
- var/list/mob/living/carbon/human/cultsinrange = list()
- var/list/mob/living/carbon/human/victims = list()
- for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice
- if(ishuman(V))
- if(!(iscultist(V)))
- victims += V//Checks for cult status and mob type
- for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
- if(istype(I,/obj/item/brain))
- var/obj/item/brain/B = I
- victims += B.brainmob
- else if(istype(I,/obj/item/device/mmi))
- var/obj/item/device/mmi/B = I
- victims += B.brainmob
- else if(istype(I,/obj/item/device/aicard))
- for(var/mob/living/silicon/ai/A in I)
- victims += A
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- cultsinrange += C
- C.say("Barhah hra zar[pick("'","`")]garis!")
- for(var/mob/H in victims)
- if (ticker.mode.name == "cult")
- if(H.mind == ticker.mode:sacrifice_target)
- if(cultsinrange.len >= 3)
- sacrificed += H.mind
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
- else
- usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
- else
- if(cultsinrange.len >= 3)
- if(H.stat !=2)
- if(prob(80))
- usr << "\red The Geometer of Blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, this soul was not enough to gain His favor."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(H.stat !=2)
- usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(cultsinrange.len >= 3)
- if(H.stat !=2)
- if(prob(80))
- usr << "\red The Geometer of Blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, this soul was not enough to gain His favor."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- else
- if(H.stat !=2)
- usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
- else
- if(prob(40))
- usr << "\red The Geometer of blood accepts this sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere dead body is not enough to satisfy Him."
- if(isrobot(H))
- H.dust()//To prevent the MMI from remaining
- else
- H.gib()
- for(var/mob/living/carbon/monkey/M in src.loc)
- if (ticker.mode.name == "cult")
- if(M.mind == ticker.mode:sacrifice_target)
- if(cultsinrange.len >= 3)
- sacrificed += M.mind
- usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
- else
- usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
- continue
- else
- if(prob(20))
- usr << "\red The Geometer of Blood accepts your meager sacrifice."
- ticker.mode:grant_runeword(usr)
- else
- usr << "\red The Geometer of blood accepts this sacrifice."
- usr << "\red However, a mere monkey is not enough to satisfy Him."
- else
- usr << "\red The Geometer of Blood accepts your meager sacrifice."
- if(prob(20))
- ticker.mode.grant_runeword(usr)
- M.gib()
-/* 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."
- ticker.mode:grant_runeword(usr)
- 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() */
-
-/////////////////////////////////////////SIXTEENTH RUNE
-
- revealrunes(var/obj/W as obj)
- var/go=0
- var/rad
- var/S=0
- if(istype(W,/obj/effect/rune))
- rad = 6
- go = 1
- if (istype(W,/obj/item/weapon/paper/talisman))
- rad = 4
- go = 1
- if (istype(W,/obj/item/weapon/nullrod))
- rad = 1
- go = 1
- if(go)
- for(var/obj/effect/rune/R in orange(rad,src))
- if(R!=src)
- R:visibility=15
- S=1
- if(S)
- if(istype(W,/obj/item/weapon/nullrod))
- usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!"
- return
- if(istype(W,/obj/effect/rune))
- usr.say("Nikt[pick("'","`")]o barada kla'atu!")
- for (var/mob/V in viewers(src))
- V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3)
- del(src)
- return
- if(istype(W,/obj/item/weapon/paper/talisman))
- usr.whisper("Nikt[pick("'","`")]o barada kla'atu!")
- usr << "\red Your talisman turns into red dust, revealing the surrounding runes."
- for (var/mob/V in orange(1,usr.loc))
- if(V!=usr)
- V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3)
- return
- return
- if(istype(W,/obj/effect/rune))
- return fizzle()
- if(istype(W,/obj/item/weapon/paper/talisman))
- call(/obj/effect/rune/proc/fizzle)()
- return
-
-/////////////////////////////////////////SEVENTEENTH RUNE
-
- wall()
- usr.say("Khari[pick("'","`")]d! Eske'te tannin!")
- src.density = !src.density
- var/mob/living/user = usr
- user.take_organ_damage(2, 0)
- if(src.density)
- usr << "\red Your blood flows into the rune, and you feel that the very space over the rune thickens."
- else
- usr << "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space."
- return
-
-/////////////////////////////////////////EIGHTTEENTH RUNE
-
- freedom()
- var/mob/living/user = usr
- 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/list/mob/living/carbon/users = new
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- users+=C
- if(users.len>=3)
- var/mob/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
- if(!cultist)
- return fizzle()
- if (cultist == user) //just to be sure.
- return
- if(!(cultist.buckled || \
- cultist.handcuffed || \
- istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \
- (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
- (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
- (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
- ))
- user << "\red The [cultist] is already free."
- return
- cultist.buckled = null
- if (cultist.handcuffed)
- cultist.handcuffed.loc = cultist.loc
- cultist.handcuffed = null
- cultist.update_inv_handcuffed()
- if (cultist.legcuffed)
- cultist.legcuffed.loc = cultist.loc
- cultist.legcuffed = null
- cultist.update_inv_legcuffed()
- if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle))
- cultist.u_equip(cultist.wear_mask)
- if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded)
- cultist.loc:welded = 0
- if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked)
- cultist.loc:locked = 0
- if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked)
- cultist.loc:locked = 0
- for(var/mob/living/carbon/C in users)
- user.take_overall_damage(15, 0)
- C.say("Khari[pick("'","`")]d! Gual'te nikka!")
- del(src)
- return fizzle()
-
-/////////////////////////////////////////NINETEENTH RUNE
-
- cultsummon()
- var/mob/living/user = usr
- 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/list/mob/living/carbon/users = new
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- users+=C
- if(users.len>=3)
- var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
- if(!cultist)
- return fizzle()
- if (cultist == user) //just to be sure.
- return
- if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
- user << "\red You cannot summon the [cultist], for his shackles of blood are strong"
- return fizzle()
- cultist.loc = src.loc
- cultist.lying = 1
- cultist.regenerate_icons()
- for(var/mob/living/carbon/human/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!")
- C.take_overall_damage(25, 0)
- user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \
- "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
- "\red You hear a pop and smell ozone.")
- del(src)
- return fizzle()
-
-/////////////////////////////////////////TWENTIETH RUNES
-
- deafen()
- if(istype(src,/obj/effect/rune))
- var/affected = 0
- for(var/mob/living/carbon/C in range(7,src))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.ear_deaf += 50
- C.show_message("\red The world around you suddenly becomes quiet.", 3)
- affected++
- if(prob(1))
- C.sdisabilities |= DEAF
- if(affected)
- usr.say("Sti[pick("'","`")] kaliedir!")
- usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust."
- del(src)
- else
- return fizzle()
- else
- var/affected = 0
- for(var/mob/living/carbon/C in range(7,usr))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.ear_deaf += 30
- //talismans is weaker.
- C.show_message("\red The world around you suddenly becomes quiet.", 3)
- affected++
- if(affected)
- usr.whisper("Sti[pick("'","`")] kaliedir!")
- usr << "\red Your talisman turns into gray dust, deafening everyone around."
- for (var/mob/V in orange(1,src))
- if(!(iscultist(V)))
- V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
- return
-
- blind()
- if(istype(src,/obj/effect/rune))
- var/affected = 0
- for(var/mob/living/carbon/C in viewers(src))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.eye_blurry += 50
- C.eye_blind += 20
- if(prob(5))
- C.disabilities |= NEARSIGHTED
- if(prob(10))
- C.sdisabilities |= BLIND
- C.show_message("\red Suddenly you see red flash that blinds you.", 3)
- affected++
- if(affected)
- usr.say("Sti[pick("'","`")] kaliesin!")
- usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
- del(src)
- else
- return fizzle()
- else
- var/affected = 0
- for(var/mob/living/carbon/C in view(2,usr))
- if (iscultist(C))
- continue
- var/obj/item/weapon/nullrod/N = locate() in C
- if(N)
- continue
- C.eye_blurry += 30
- C.eye_blind += 10
- //talismans is weaker.
- affected++
- C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
- if(affected)
- usr.whisper("Sti[pick("'","`")] kaliesin!")
- usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
- return
-
-
- 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.
- for(var/mob/living/carbon/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- culcount++
- if(culcount>=3)
- for(var/mob/living/carbon/M in viewers(usr))
- if(iscultist(M))
- continue
- var/obj/item/weapon/nullrod/N = locate() in M
- if(N)
- continue
- M.take_overall_damage(51,51)
- M << "\red Your blood boils!"
- if(prob(5))
- spawn(5)
- M.gib()
- for(var/obj/effect/rune/R in view(src))
- if(prob(10))
- explosion(R.loc, -1, 0, 1, 5)
- for(var/mob/living/carbon/human/C in orange(1,src))
- if(iscultist(C) && !C.stat)
- C.say("Dedo ol[pick("'","`")]btoh!")
- C.take_overall_damage(15, 0)
- del(src)
- else
- return fizzle()
- return
-
-// WIP rune, I'll wait for Rastaf0 to add limited blood.
-
- 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 << "\red Aargh it burns!"
- else
- M << "\red 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 << "\red Blood suddenly ignites, burning you!"
- var/turf/T = get_turf(B)
- T.hotspot_expose(700,125)
- del(B)
- del(src)
-
-////////// Rune 24 (counting burningblood, which kinda doesnt work yet.)
-
- runestun(var/mob/living/T as mob)
- if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
- usr.say("Fuu ma[pick("'","`")]jin!")
- for(var/mob/living/L in viewers(src))
-
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- flick("e_flash", C.flash)
- if(C.stuttering < 1 && (!(HULK in C.mutations)))
- C.stuttering = 1
- C.Weaken(1)
- C.Stun(1)
- C.show_message("\red The rune explodes in a bright flash.", 3)
-
- else if(issilicon(L))
- var/mob/living/silicon/S = L
- S.Weaken(5)
- S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3)
- del(src)
- else ///When invoked as talisman, stun and mute the target mob.
- usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
- var/obj/item/weapon/nullrod/N = locate() in T
- if(N)
- for(var/mob/O in viewers(T, null))
- O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1)
- else
- for(var/mob/O in viewers(T, null))
- O.show_message(text("\red [] invokes a talisman at []", usr, T), 1)
-
- if(issilicon(T))
- T.Weaken(15)
-
- else if(iscarbon(T))
- var/mob/living/carbon/C = T
- flick("e_flash", C.flash)
- if (!(HULK in C.mutations))
- C.silent += 15
- C.Weaken(25)
- C.Stun(25)
- return
-
-/////////////////////////////////////////TWENTY-FIFTH RUNE
-
- armor()
- var/mob/living/carbon/human/user = usr
- if(istype(src,/obj/effect/rune))
- usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
- else
- usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
- usr.visible_message("\red The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \
- "\red You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.")
-
- 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(user), slot_shoes)
- user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
- //the above update their overlay icons cache but do not call update_icons()
- //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache
- user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor
-
- del(src)
- return
+var/list/sacrificed = list()
+
+/obj/effect/rune
+/////////////////////////////////////////FIRST RUNE
+ proc
+ teleport(var/key)
+ var/mob/living/user = usr
+ var/allrunesloc[]
+ allrunesloc = new/list()
+ var/index = 0
+ // var/tempnum = 0
+ for(var/obj/effect/rune/R in world)
+ if(R == src)
+ continue
+ if(R.word1 == wordtravel && R.word2 == wordself && R.word3 == key && R.z != 2)
+ index++
+ allrunesloc.len = index
+ allrunesloc[index] = R.loc
+ if(index >= 5)
+ user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
+ if (istype(user, /mob/living))
+ user.take_overall_damage(5, 0)
+ del(src)
+ if(allrunesloc && index != 0)
+ if(istype(src,/obj/effect/rune))
+ user.say("Sas[pick("'","`")]so c'arta forbici!")//Only you can stop auto-muting
+ else
+ user.whisper("Sas[pick("'","`")]so c'arta forbici!")
+ user.visible_message("\red [user] disappears in a flash of red light!", \
+ "\red You feel as your body gets dragged through the dimension of Nar-Sie!", \
+ "\red You hear a sickening crunch and sloshing of viscera.")
+ user.loc = allrunesloc[rand(1,index)]
+ return
+ if(istype(src,/obj/effect/rune))
+ return fizzle() //Use friggin manuals, Dorf, your list was of zero length.
+ else
+ call(/obj/effect/rune/proc/fizzle)()
+ return
+
+
+ itemport(var/key)
+// var/allrunesloc[]
+// allrunesloc = new/list()
+// var/index = 0
+ // var/tempnum = 0
+ var/culcount = 0
+ var/runecount = 0
+ var/obj/effect/rune/IP = null
+ var/mob/living/user = usr
+ for(var/obj/effect/rune/R in world)
+ if(R == src)
+ continue
+ if(R.word1 == wordtravel && R.word2 == wordother && R.word3 == key)
+ IP = R
+ runecount++
+ if(runecount >= 2)
+ user << "\red You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric"
+ if (istype(user, /mob/living))
+ user.take_overall_damage(5, 0)
+ del(src)
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ culcount++
+ if(culcount>=3)
+ user.say("Sas[pick("'","`")]so c'arta forbici tarem!")
+ user.visible_message("\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
+ "\red You feel air moving from the rune - like as it was swapped with somewhere else.", \
+ "\red You smell ozone.")
+ for(var/obj/O in src.loc)
+ if(!O.anchored)
+ O.loc = IP.loc
+ for(var/mob/M in src.loc)
+ M.loc = IP.loc
+ return
+
+ return fizzle()
+
+
+/////////////////////////////////////////SECOND RUNE
+
+ tomesummon()
+ if(istype(src,/obj/effect/rune))
+ usr.say("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
+ else
+ usr.whisper("N[pick("'","`")]ath reth sh'yro eth d'raggathnor!")
+ usr.visible_message("\red Rune disappears with a flash of red light, and in its place now a book lies.", \
+ "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a book.", \
+ "\red You hear a pop and smell ozone.")
+ if(istype(src,/obj/effect/rune))
+ new /obj/item/weapon/tome(src.loc)
+ else
+ new /obj/item/weapon/tome(usr.loc)
+ del(src)
+ return
+
+
+
+/////////////////////////////////////////THIRD RUNE
+
+ convert()
+ for(var/mob/living/carbon/M in src.loc)
+ if(iscultist(M))
+ continue
+ if(M.stat==2)
+ continue
+ usr.say("Mah[pick("'","`")]weyh pleggh at e'ntrath!")
+ M.visible_message("\red [M] writhes in pain as the markings below him glow a bloody red.", \
+ "\red AAAAAAHHHH!.", \
+ "\red You hear an anguished scream.")
+ if(is_convertable_to_cult(M.mind))
+ ticker.mode.add_cultist(M.mind)
+ 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."
+ 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."
+ return 0
+
+ return fizzle()
+
+
+
+/////////////////////////////////////////FOURTH RUNE
+
+ tearreality()
+ var/cultist_count = 0
+ for(var/mob/M in range(1,src))
+ if(iscultist(M) && !M.stat)
+ M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!")
+ cultist_count += 1
+ if(cultist_count >= 9)
+ new /obj/machinery/singularity/narsie(src.loc)
+ if(ticker.mode.name == "cult")
+ ticker.mode:eldergod = 0
+ return
+ else
+ return fizzle()
+
+/////////////////////////////////////////FIFTH RUNE
+
+ 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))
+ usr.say("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
+ else
+ usr.whisper("Ta'gh fara[pick("'","`")]qha fel d'amar det!")
+ playsound(U, 'sound/items/Welder2.ogg', 25, 1)
+ var/turf/T = get_turf(U)
+ if(T)
+ T.hotspot_expose(700,125)
+ var/rune = src // detaching the proc - in theory
+ empulse(U, (range_red - 2), range_red)
+ del(rune)
+ return
+
+/////////////////////////////////////////SIXTH RUNE
+
+ drain()
+ var/drain = 0
+ for(var/obj/effect/rune/R in world)
+ if(R.word1==wordtravel && R.word2==wordblood && R.word3==wordself)
+ for(var/mob/living/carbon/D in R.loc)
+ if(D.stat!=2)
+ var/bdrain = rand(1,25)
+ D << "\red You feel weakened."
+ D.take_overall_damage(bdrain, 0)
+ drain += bdrain
+ if(!drain)
+ return fizzle()
+ usr.say ("Yu[pick("'","`")]gular faras desdae. Havas mithum javara. Umathar uf'kal thenar!")
+ usr.visible_message("\red Blood flows from the rune into [usr]!", \
+ "\red The blood starts flowing from the rune and into your frail mortal body. You feel... empowered.", \
+ "\red You hear a liquid flowing.")
+ var/mob/living/user = usr
+ if(user.bhunger)
+ user.bhunger = max(user.bhunger-2*drain,0)
+ if(drain>=50)
+ user.visible_message("\red [user]'s eyes give off eerie red glow!", \
+ "\red ...but it wasn't nearly enough. You crave, crave for more. The hunger consumes you from within.", \
+ "\red You hear a heartbeat.")
+ user.bhunger += drain
+ src = user
+ spawn()
+ for (,user.bhunger>0,user.bhunger--)
+ sleep(50)
+ user.take_overall_damage(3, 0)
+ return
+ user.heal_organ_damage(drain%5, 0)
+ drain-=drain%5
+ for (,drain>0,drain-=5)
+ sleep(2)
+ user.heal_organ_damage(5, 0)
+ return
+
+
+
+
+
+
+/////////////////////////////////////////SEVENTH RUNE
+
+ seer()
+ if(usr.loc==src.loc)
+ usr.say("Rash'tla sektath mal[pick("'","`")]zua. Zasan therium vivira. Itonis al'ra matum!")
+ if(usr.see_invisible!=0 && usr.see_invisible!=15)
+ usr << "\red The world beyond flashes your eyes but disappears quickly, as if something is disrupting your vision."
+ else
+ usr << "\red The world beyond opens to your eyes."
+ usr.see_invisible = SEE_INVISIBLE_OBSERVER
+ usr.seer = 1
+ return
+ return fizzle()
+
+/////////////////////////////////////////EIGHTH RUNE
+
+ raise()
+ var/mob/living/carbon/human/corpse_to_raise
+ var/mob/living/carbon/human/body_to_sacrifice
+
+ var/is_sacrifice_target = 0
+ for(var/mob/living/carbon/human/M in src.loc)
+ if(M.stat == DEAD)
+ if(ticker.mode.name == "cult" && M.mind == ticker.mode:sacrifice_target)
+ is_sacrifice_target = 1
+ else
+ corpse_to_raise = M
+ if(M.key)
+ M.ghostize(1) //kick them out of their body
+ break
+ if(!corpse_to_raise)
+ if(is_sacrifice_target)
+ usr << "\red The Geometer of blood wants this mortal for himself."
+ return fizzle()
+
+
+ is_sacrifice_target = 0
+ find_sacrifice:
+ for(var/obj/effect/rune/R in world)
+ if(R.word1==wordblood && R.word2==wordjoin && R.word3==wordhell)
+ for(var/mob/living/carbon/human/N in R.loc)
+ if(ticker.mode.name == "cult" && N.mind && N.mind == ticker.mode:sacrifice_target)
+ is_sacrifice_target = 1
+ else
+ if(N.stat!= DEAD)
+ body_to_sacrifice = N
+ break find_sacrifice
+
+ if(!body_to_sacrifice)
+ if (is_sacrifice_target)
+ usr << "\red The Geometer of blood wants that corpse for himself."
+ else
+ usr << "\red The sacrifical corpse is not dead. You must free it from this world of illusions before it may be used."
+ return fizzle()
+
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+
+ if(!ghost)
+ usr << "\red You require a restless spirit which clings to this world. Beckon their prescence with the sacred chants of Nar-Sie."
+ return fizzle()
+
+ for(var/datum/organ/external/affecting in corpse_to_raise.organs)
+ affecting.heal_damage(1000, 1000)
+ corpse_to_raise.setToxLoss(0)
+ corpse_to_raise.setOxyLoss(0)
+ corpse_to_raise.SetParalysis(0)
+ 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)
+// del(corpse_to_raise.handcuffed)
+// corpse_to_raise.update_inv_handcuffed(0)
+ corpse_to_raise.stat = CONSCIOUS
+ corpse_to_raise.updatehealth()
+ corpse_to_raise.UpdateDamageIcon()
+
+ 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!")
+ corpse_to_raise.visible_message("\red [corpse_to_raise]'s eyes glow with a faint red as he stands up, slowly starting to breathe again.", \
+ "\red Life... I'm alive again...", \
+ "\red You hear a faint, slightly familiar whisper.")
+ body_to_sacrifice.visible_message("\red [body_to_sacrifice] is torn apart, a black smoke swiftly dissipating from his remains!", \
+ "\red You feel as your blood boils, tearing you apart.", \
+ "\red 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
+
+
+
+
+
+/////////////////////////////////////////NINETH RUNE
+
+ obscure(var/rad)
+ var/S=0
+ for(var/obj/effect/rune/R in orange(rad,src))
+ if(R!=src)
+ R:visibility=0
+ S=1
+ if(S)
+ if(istype(src,/obj/effect/rune))
+ usr.say("Kla[pick("'","`")]atu barada nikt'o!")
+ for (var/mob/V in viewers(src))
+ V.show_message("\red The rune turns into gray dust, veiling the surrounding runes.", 3)
+ del(src)
+ else
+ usr.whisper("Kla[pick("'","`")]atu barada nikt'o!")
+ usr << "\red Your talisman turns into gray dust, veiling the surrounding runes."
+ for (var/mob/V in orange(1,src))
+ if(V!=usr)
+ V.show_message("\red Dust emanates from [usr]'s hands for a moment.", 3)
+
+ return
+ if(istype(src,/obj/effect/rune))
+ return fizzle()
+ else
+ call(/obj/effect/rune/proc/fizzle)()
+ return
+
+/////////////////////////////////////////TENTH RUNE
+
+ ajourney() //some bits copypastaed from admin tools - Urist
+ if(usr.loc==src.loc)
+ var/mob/living/carbon/human/L = usr
+ usr.say("Fwe[pick("'","`")]sh mah erl nyag r'ya!")
+ usr.visible_message("\red [usr]'s eyes glow blue as \he freezes in place, absolutely motionless.", \
+ "\red The shadow that is your spirit separates itself from your body. You are now in the realm beyond. While this is a great sight, being here strains your mind and body. Hurry...", \
+ "\red You hear only complete silence for a moment.")
+ usr.ghostize(1)
+ L.ajourn = 1
+ while(L)
+ if(L.key)
+ L.ajourn=0
+ return
+ else
+ L.take_organ_damage(10, 0)
+ sleep(100)
+ return fizzle()
+
+
+
+
+/////////////////////////////////////////ELEVENTH RUNE
+
+ manifest()
+ var/obj/effect/rune/this_rune = src
+ src = null
+ if(usr.loc!=this_rune.loc)
+ return this_rune.fizzle()
+ var/mob/dead/observer/ghost
+ for(var/mob/dead/observer/O in this_rune.loc)
+ if(!O.client) continue
+ if(O.mind && O.mind.current && O.mind.current.stat != DEAD) continue
+ ghost = O
+ break
+ if(!ghost)
+ return this_rune.fizzle()
+
+ usr.say("Gal'h'rfikk harfrandid mud[pick("'","`")]gib!")
+ var/mob/living/carbon/human/dummy/D = new(this_rune.loc)
+ usr.visible_message("\red A shape forms in the center of the rune. A shape of... a man.", \
+ "\red A shape forms in the center of the rune. A shape of... a man.", \
+ "\red You hear liquid flowing.")
+ D.real_name = "Unknown"
+ for(var/obj/item/weapon/paper/P in this_rune.loc)
+ if(length(P.name)<=24)
+ D.real_name = P.name
+ break
+ D.universal_speak = 1
+ D.nodamage = 0
+
+ D.key = ghost.key
+
+ if(ticker.mode.name == "cult")
+ ticker.mode:add_cultist(D.mind)
+ else
+ ticker.mode.cult+=D.mind
+
+ D << "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."
+ D << "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."
+
+ var/mob/living/user = usr
+ while(this_rune && user && user.stat==CONSCIOUS && user.client && user.loc==this_rune.loc)
+ user.take_organ_damage(1, 0)
+ sleep(30)
+ if(D)
+ D.visible_message("\red [D] slowly dissipates into dust and bones.", \
+ "\red You feel pain, as bonds formed between your soul and this homunculus break.", \
+ "\red You hear faint rustle.")
+ D.dust()
+ return
+
+
+
+
+
+/////////////////////////////////////////TWELFTH RUNE
+
+ talisman()//only hide, emp, teleport, deafen, blind and tome runes can be imbued atm
+ var/obj/item/weapon/paper/newtalisman
+ var/unsuitable_newtalisman = 0
+ for(var/obj/item/weapon/paper/P in src.loc)
+ if(!P.info)
+ newtalisman = P
+ break
+ else
+ unsuitable_newtalisman = 1
+ if (!newtalisman)
+ if (unsuitable_newtalisman)
+ usr << "\red The blank is tainted. It is unsuitable."
+ return fizzle()
+
+ var/obj/effect/rune/imbued_from
+ var/obj/item/weapon/paper/talisman/T
+ for(var/obj/effect/rune/R in orange(1,src))
+ if(R==src)
+ continue
+ if(R.word1==wordtravel && R.word2==wordself) //teleport
+ T = new(src.loc)
+ T.imbue = "[R.word3]"
+ T.info = "[R.word3]"
+ imbued_from = R
+ break
+ if(R.word1==wordsee && R.word2==wordblood && R.word3==wordhell) //tome
+ T = new(src.loc)
+ T.imbue = "newtome"
+ imbued_from = R
+ break
+ if(R.word1==worddestr && R.word2==wordsee && R.word3==wordtech) //emp
+ T = new(src.loc)
+ T.imbue = "emp"
+ imbued_from = R
+ break
+ if(R.word1==wordblood && R.word2==wordsee && R.word3==worddestr) //conceal
+ T = new(src.loc)
+ T.imbue = "conceal"
+ imbued_from = R
+ break
+ if(R.word1==wordhell && R.word2==worddestr && R.word3==wordother) //armor
+ T = new(src.loc)
+ T.imbue = "armor"
+ imbued_from = R
+ break
+ if(R.word1==wordblood && R.word2==wordsee && R.word3==wordhide) //reveal
+ T = new(src.loc)
+ T.imbue = "revealrunes"
+ imbued_from = R
+ break
+ if(R.word1==wordhide && R.word2==wordother && R.word3==wordsee) //deafen
+ T = new(src.loc)
+ T.imbue = "deafen"
+ imbued_from = R
+ break
+ if(R.word1==worddestr && R.word2==wordsee && R.word3==wordother) //blind
+ T = new(src.loc)
+ T.imbue = "blind"
+ imbued_from = R
+ break
+ if(R.word1==wordself && R.word2==wordother && R.word3==wordtech) //communicat
+ T = new(src.loc)
+ T.imbue = "communicate"
+ imbued_from = R
+ break
+ if(R.word1==wordjoin && R.word2==wordhide && R.word3==wordtech) //communicat
+ T = new(src.loc)
+ T.imbue = "runestun"
+ imbued_from = R
+ break
+ if (imbued_from)
+ for (var/mob/V in viewers(src))
+ V.show_message("\red The runes turn into dust, which then forms into an arcane image on the paper.", 3)
+ usr.say("H'drak v[pick("'","`")]loso, mir'kanas verbot!")
+ del(imbued_from)
+ del(newtalisman)
+ else
+ return fizzle()
+
+/////////////////////////////////////////THIRTEENTH RUNE
+
+ 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("\red [user] keels over dead, his blood glowing blue as it escapes his body and dissipates into thin air.", \
+ "\red In the last moment of your humble life, you feel an immense pain as fabric of reality mends... with your blood.", \
+ "\red You hear faint rustle.")
+ for(,user.stat==2)
+ sleep(600)
+ if (!user)
+ return
+ runedec-=10
+ return
+
+
+/////////////////////////////////////////FOURTEETH RUNE
+
+ // returns 0 if the rune is not used. returns 1 if the rune is used.
+ communicate()
+ . = 1 // Default output is 1. If the rune is deleted it will return 1
+ var/input = copytext(sanitize(input(usr, "Please choose a message to tell to the other acolytes.", "Voice of Blood", "") as text|null),1,MAX_MESSAGE_LEN)
+ if(!input)
+ 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!")
+ var/input_s = sanitize(input)
+ if(istype(src,/obj/effect/rune))
+ usr.say("[input]")
+ else
+ usr.whisper("[input]")
+ for(var/datum/mind/H in ticker.mode.cult)
+ if (H.current)
+ H.current << "\red \b [input_s]"
+ del(src)
+ return 1
+
+/////////////////////////////////////////FIFTEENTH RUNE
+
+ sacrifice()
+ var/list/mob/living/carbon/human/cultsinrange = list()
+ var/list/mob/living/carbon/human/victims = list()
+ for(var/mob/living/carbon/human/V in src.loc)//Checks for non-cultist humans to sacrifice
+ if(ishuman(V))
+ if(!(iscultist(V)))
+ victims += V//Checks for cult status and mob type
+ for(var/obj/item/I in src.loc)//Checks for MMIs/brains/Intellicards
+ if(istype(I,/obj/item/brain))
+ var/obj/item/brain/B = I
+ victims += B.brainmob
+ else if(istype(I,/obj/item/device/mmi))
+ var/obj/item/device/mmi/B = I
+ victims += B.brainmob
+ else if(istype(I,/obj/item/device/aicard))
+ for(var/mob/living/silicon/ai/A in I)
+ victims += A
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ cultsinrange += C
+ C.say("Barhah hra zar[pick("'","`")]garis!")
+ for(var/mob/H in victims)
+ if (ticker.mode.name == "cult")
+ if(H.mind == ticker.mode:sacrifice_target)
+ if(cultsinrange.len >= 3)
+ sacrificed += H.mind
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
+ else
+ usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
+ else
+ if(cultsinrange.len >= 3)
+ if(H.stat !=2)
+ if(prob(80))
+ usr << "\red The Geometer of Blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, this soul was not enough to gain His favor."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(H.stat !=2)
+ usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(cultsinrange.len >= 3)
+ if(H.stat !=2)
+ if(prob(80))
+ usr << "\red The Geometer of Blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, this soul was not enough to gain His favor."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ else
+ if(H.stat !=2)
+ usr << "\red The victim is still alive, you will need more cultists chanting for the sacrifice to succeed."
+ else
+ if(prob(40))
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere dead body is not enough to satisfy Him."
+ if(isrobot(H))
+ H.dust()//To prevent the MMI from remaining
+ else
+ H.gib()
+ for(var/mob/living/carbon/monkey/M in src.loc)
+ if (ticker.mode.name == "cult")
+ if(M.mind == ticker.mode:sacrifice_target)
+ if(cultsinrange.len >= 3)
+ sacrificed += M.mind
+ usr << "\red The Geometer of Blood accepts this sacrifice, your objective is now complete."
+ else
+ usr << "\red Your target's earthly bonds are too strong. You need more cultists to succeed in this ritual."
+ continue
+ else
+ if(prob(20))
+ usr << "\red The Geometer of Blood accepts your meager sacrifice."
+ ticker.mode:grant_runeword(usr)
+ else
+ usr << "\red The Geometer of blood accepts this sacrifice."
+ usr << "\red However, a mere monkey is not enough to satisfy Him."
+ else
+ usr << "\red The Geometer of Blood accepts your meager sacrifice."
+ if(prob(20))
+ ticker.mode.grant_runeword(usr)
+ M.gib()
+/* 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."
+ ticker.mode:grant_runeword(usr)
+ 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() */
+
+/////////////////////////////////////////SIXTEENTH RUNE
+
+ revealrunes(var/obj/W as obj)
+ var/go=0
+ var/rad
+ var/S=0
+ if(istype(W,/obj/effect/rune))
+ rad = 6
+ go = 1
+ if (istype(W,/obj/item/weapon/paper/talisman))
+ rad = 4
+ go = 1
+ if (istype(W,/obj/item/weapon/nullrod))
+ rad = 1
+ go = 1
+ if(go)
+ for(var/obj/effect/rune/R in orange(rad,src))
+ if(R!=src)
+ R:visibility=15
+ S=1
+ if(S)
+ if(istype(W,/obj/item/weapon/nullrod))
+ usr << "\red Arcane markings suddenly glow from underneath a thin layer of dust!"
+ return
+ if(istype(W,/obj/effect/rune))
+ usr.say("Nikt[pick("'","`")]o barada kla'atu!")
+ for (var/mob/V in viewers(src))
+ V.show_message("\red The rune turns into red dust, reveaing the surrounding runes.", 3)
+ del(src)
+ return
+ if(istype(W,/obj/item/weapon/paper/talisman))
+ usr.whisper("Nikt[pick("'","`")]o barada kla'atu!")
+ usr << "\red Your talisman turns into red dust, revealing the surrounding runes."
+ for (var/mob/V in orange(1,usr.loc))
+ if(V!=usr)
+ V.show_message("\red Red dust emanates from [usr]'s hands for a moment.", 3)
+ return
+ return
+ if(istype(W,/obj/effect/rune))
+ return fizzle()
+ if(istype(W,/obj/item/weapon/paper/talisman))
+ call(/obj/effect/rune/proc/fizzle)()
+ return
+
+/////////////////////////////////////////SEVENTEENTH RUNE
+
+ wall()
+ usr.say("Khari[pick("'","`")]d! Eske'te tannin!")
+ src.density = !src.density
+ var/mob/living/user = usr
+ user.take_organ_damage(2, 0)
+ if(src.density)
+ usr << "\red Your blood flows into the rune, and you feel that the very space over the rune thickens."
+ else
+ usr << "\red Your blood flows into the rune, and you feel as the rune releases its grasp on space."
+ return
+
+/////////////////////////////////////////EIGHTTEENTH RUNE
+
+ freedom()
+ var/mob/living/user = usr
+ 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/list/mob/living/carbon/users = new
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ users+=C
+ if(users.len>=3)
+ var/mob/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users)
+ if(!cultist)
+ return fizzle()
+ if (cultist == user) //just to be sure.
+ return
+ if(!(cultist.buckled || \
+ cultist.handcuffed || \
+ istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle) || \
+ (istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded) || \
+ (istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked) || \
+ (istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked) \
+ ))
+ user << "\red The [cultist] is already free."
+ return
+ cultist.buckled = null
+ if (cultist.handcuffed)
+ cultist.handcuffed.loc = cultist.loc
+ cultist.handcuffed = null
+ cultist.update_inv_handcuffed()
+ if (cultist.legcuffed)
+ cultist.legcuffed.loc = cultist.loc
+ cultist.legcuffed = null
+ cultist.update_inv_legcuffed()
+ if (istype(cultist.wear_mask, /obj/item/clothing/mask/muzzle))
+ cultist.u_equip(cultist.wear_mask)
+ if(istype(cultist.loc, /obj/structure/closet)&&cultist.loc:welded)
+ cultist.loc:welded = 0
+ if(istype(cultist.loc, /obj/structure/closet/secure_closet)&&cultist.loc:locked)
+ cultist.loc:locked = 0
+ if(istype(cultist.loc, /obj/machinery/dna_scannernew)&&cultist.loc:locked)
+ cultist.loc:locked = 0
+ for(var/mob/living/carbon/C in users)
+ user.take_overall_damage(15, 0)
+ C.say("Khari[pick("'","`")]d! Gual'te nikka!")
+ del(src)
+ return fizzle()
+
+/////////////////////////////////////////NINETEENTH RUNE
+
+ cultsummon()
+ var/mob/living/user = usr
+ 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/list/mob/living/carbon/users = new
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ users+=C
+ if(users.len>=3)
+ var/mob/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user)
+ if(!cultist)
+ return fizzle()
+ if (cultist == user) //just to be sure.
+ return
+ if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet)))
+ user << "\red You cannot summon the [cultist], for his shackles of blood are strong"
+ return fizzle()
+ cultist.loc = src.loc
+ cultist.lying = 1
+ cultist.regenerate_icons()
+ for(var/mob/living/carbon/human/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ C.say("N'ath reth sh'yro eth d[pick("'","`")]rekkathnor!")
+ C.take_overall_damage(25, 0)
+ user.visible_message("\red Rune disappears with a flash of red light, and in its place now a body lies.", \
+ "\red You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \
+ "\red You hear a pop and smell ozone.")
+ del(src)
+ return fizzle()
+
+/////////////////////////////////////////TWENTIETH RUNES
+
+ deafen()
+ if(istype(src,/obj/effect/rune))
+ var/affected = 0
+ for(var/mob/living/carbon/C in range(7,src))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.ear_deaf += 50
+ C.show_message("\red The world around you suddenly becomes quiet.", 3)
+ affected++
+ if(prob(1))
+ C.sdisabilities |= DEAF
+ if(affected)
+ usr.say("Sti[pick("'","`")] kaliedir!")
+ usr << "\red The world becomes quiet as the deafening rune dissipates into fine dust."
+ del(src)
+ else
+ return fizzle()
+ else
+ var/affected = 0
+ for(var/mob/living/carbon/C in range(7,usr))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.ear_deaf += 30
+ //talismans is weaker.
+ C.show_message("\red The world around you suddenly becomes quiet.", 3)
+ affected++
+ if(affected)
+ usr.whisper("Sti[pick("'","`")] kaliedir!")
+ usr << "\red Your talisman turns into gray dust, deafening everyone around."
+ for (var/mob/V in orange(1,src))
+ if(!(iscultist(V)))
+ V.show_message("\red Dust flows from [usr]'s hands for a moment, and the world suddenly becomes quiet..", 3)
+ return
+
+ blind()
+ if(istype(src,/obj/effect/rune))
+ var/affected = 0
+ for(var/mob/living/carbon/C in viewers(src))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.eye_blurry += 50
+ C.eye_blind += 20
+ if(prob(5))
+ C.disabilities |= NEARSIGHTED
+ if(prob(10))
+ C.sdisabilities |= BLIND
+ C.show_message("\red Suddenly you see red flash that blinds you.", 3)
+ affected++
+ if(affected)
+ usr.say("Sti[pick("'","`")] kaliesin!")
+ usr << "\red The rune flashes, blinding those who not follow the Nar-Sie, and dissipates into fine dust."
+ del(src)
+ else
+ return fizzle()
+ else
+ var/affected = 0
+ for(var/mob/living/carbon/C in view(2,usr))
+ if (iscultist(C))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in C
+ if(N)
+ continue
+ C.eye_blurry += 30
+ C.eye_blind += 10
+ //talismans is weaker.
+ affected++
+ C.show_message("\red You feel a sharp pain in your eyes, and the world disappears into darkness..", 3)
+ if(affected)
+ usr.whisper("Sti[pick("'","`")] kaliesin!")
+ usr << "\red Your talisman turns into gray dust, blinding those who not follow the Nar-Sie."
+ return
+
+
+ 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.
+ for(var/mob/living/carbon/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ culcount++
+ if(culcount>=3)
+ for(var/mob/living/carbon/M in viewers(usr))
+ if(iscultist(M))
+ continue
+ var/obj/item/weapon/nullrod/N = locate() in M
+ if(N)
+ continue
+ M.take_overall_damage(51,51)
+ M << "\red Your blood boils!"
+ if(prob(5))
+ spawn(5)
+ M.gib()
+ for(var/obj/effect/rune/R in view(src))
+ if(prob(10))
+ explosion(R.loc, -1, 0, 1, 5)
+ for(var/mob/living/carbon/human/C in orange(1,src))
+ if(iscultist(C) && !C.stat)
+ C.say("Dedo ol[pick("'","`")]btoh!")
+ C.take_overall_damage(15, 0)
+ del(src)
+ else
+ return fizzle()
+ return
+
+// WIP rune, I'll wait for Rastaf0 to add limited blood.
+
+ 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 << "\red Aargh it burns!"
+ else
+ M << "\red 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 << "\red Blood suddenly ignites, burning you!"
+ var/turf/T = get_turf(B)
+ T.hotspot_expose(700,125)
+ del(B)
+ del(src)
+
+////////// Rune 24 (counting burningblood, which kinda doesnt work yet.)
+
+ runestun(var/mob/living/T as mob)
+ if(istype(src,/obj/effect/rune)) ///When invoked as rune, flash and stun everyone around.
+ usr.say("Fuu ma[pick("'","`")]jin!")
+ for(var/mob/living/L in viewers(src))
+
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ flick("e_flash", C.flash)
+ if(C.stuttering < 1 && (!(HULK in C.mutations)))
+ C.stuttering = 1
+ C.Weaken(1)
+ C.Stun(1)
+ C.show_message("\red The rune explodes in a bright flash.", 3)
+
+ else if(issilicon(L))
+ var/mob/living/silicon/S = L
+ S.Weaken(5)
+ S.show_message("\red BZZZT... The rune has exploded in a bright flash.", 3)
+ del(src)
+ else ///When invoked as talisman, stun and mute the target mob.
+ usr.say("Dream sign ''Evil sealing talisman'[pick("'","`")]!")
+ var/obj/item/weapon/nullrod/N = locate() in T
+ if(N)
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1)
+ else
+ for(var/mob/O in viewers(T, null))
+ O.show_message(text("\red [] invokes a talisman at []", usr, T), 1)
+
+ if(issilicon(T))
+ T.Weaken(15)
+
+ else if(iscarbon(T))
+ var/mob/living/carbon/C = T
+ flick("e_flash", C.flash)
+ if (!(HULK in C.mutations))
+ C.silent += 15
+ C.Weaken(25)
+ C.Stun(25)
+ return
+
+/////////////////////////////////////////TWENTY-FIFTH RUNE
+
+ armor()
+ var/mob/living/carbon/human/user = usr
+ if(istype(src,/obj/effect/rune))
+ usr.say("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
+ else
+ usr.whisper("N'ath reth sh'yro eth d[pick("'","`")]raggathnor!")
+ usr.visible_message("\red The rune disappears with a flash of red light, and a set of armor appears on [usr]...", \
+ "\red You are blinded by the flash of red light! After you're able to see again, you see that you are now wearing a set of armor.")
+
+ 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(user), slot_shoes)
+ user.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ //the above update their overlay icons cache but do not call update_icons()
+ //the below calls update_icons() at the end, which will update overlay icons by using the (now updated) cache
+ user.put_in_hands(new /obj/item/weapon/melee/cultblade(user)) //put in hands or on floor
+
+ del(src)
+ return
diff --git a/code/game/magic/cultist/talisman.dm b/code/game/gamemodes/cult/talisman.dm
similarity index 100%
rename from code/game/magic/cultist/talisman.dm
rename to code/game/gamemodes/cult/talisman.dm
diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm
index 2b5d3d0bd3..ca07a4c98b 100644
--- a/code/game/machinery/ai_slipper.dm
+++ b/code/game/machinery/ai_slipper.dm
@@ -23,7 +23,6 @@
icon_state = "motion0"
stat |= NOPOWER
-
/obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses)
src.disabled = disabled
src.uses = uses
diff --git a/code/game/magic/musician.dm b/code/game/objects/structures/musician.dm
similarity index 100%
rename from code/game/magic/musician.dm
rename to code/game/objects/structures/musician.dm
diff --git a/code/game/turf.dm b/code/game/turfs/turf.dm
similarity index 100%
rename from code/game/turf.dm
rename to code/game/turfs/turf.dm
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
new file mode 100644
index 0000000000..0f6fd0f119
--- /dev/null
+++ b/code/modules/library/lib_items.dm
@@ -0,0 +1,236 @@
+/* Library Items
+ *
+ * Contains:
+ * Bookcase
+ * Book
+ * Barcode Scanner
+ */
+
+
+/*
+ * Bookcase
+ */
+
+/obj/structure/bookcase
+ name = "bookcase"
+ icon = 'icons/obj/library.dmi'
+ icon_state = "book-0"
+ anchored = 1
+ density = 1
+ opacity = 1
+
+/obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/weapon/book))
+ user.drop_item()
+ O.loc = src
+ update_icon()
+ else if(istype(O, /obj/item/weapon/pen))
+ var/newname = copytext(sanitize(input("What would you like to title this bookshelf?") as text|null),1,MAX_MESSAGE_LEN)
+ if(!newname)
+ return
+ else
+ name = ("bookcase ([sanitize(newname)])")
+ else
+ ..()
+
+/obj/structure/bookcase/attack_hand(var/mob/user as mob)
+ if(contents.len)
+ var/obj/item/weapon/book/choice = input("Which book would you like to remove from the shelf?") in contents as obj|null
+ if(choice)
+ if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
+ return
+ if(ishuman(user))
+ if(!user.get_active_hand())
+ user.put_in_hands(choice)
+ else
+ choice.loc = get_turf(src)
+ update_icon()
+
+/obj/structure/bookcase/ex_act(severity)
+ switch(severity)
+ if(1.0)
+ for(var/obj/item/weapon/book/b in contents)
+ del(b)
+ del(src)
+ return
+ if(2.0)
+ for(var/obj/item/weapon/book/b in contents)
+ if (prob(50)) b.loc = (get_turf(src))
+ else del(b)
+ del(src)
+ return
+ if(3.0)
+ if (prob(50))
+ for(var/obj/item/weapon/book/b in contents)
+ b.loc = (get_turf(src))
+ del(src)
+ return
+ else
+ return
+
+/obj/structure/bookcase/update_icon()
+ if(contents.len < 5)
+ icon_state = "book-[contents.len]"
+ else
+ icon_state = "book-5"
+
+
+/obj/structure/bookcase/manuals/medical
+ name = "Medical Manuals bookcase"
+
+ New()
+ ..()
+ new /obj/item/weapon/book/manual/medical_cloning(src)
+ update_icon()
+
+
+/obj/structure/bookcase/manuals/engineering
+ name = "Engineering Manuals bookcase"
+
+ New()
+ ..()
+ new /obj/item/weapon/book/manual/engineering_construction(src)
+ new /obj/item/weapon/book/manual/engineering_particle_accelerator(src)
+ new /obj/item/weapon/book/manual/engineering_hacking(src)
+ new /obj/item/weapon/book/manual/engineering_guide(src)
+ new /obj/item/weapon/book/manual/engineering_singularity_safety(src)
+ new /obj/item/weapon/book/manual/robotics_cyborgs(src)
+ update_icon()
+
+/obj/structure/bookcase/manuals/research_and_development
+ name = "R&D Manuals bookcase"
+
+ New()
+ ..()
+ new /obj/item/weapon/book/manual/research_and_development(src)
+ update_icon()
+
+
+/*
+ * Book
+ */
+/obj/item/weapon/book
+ name = "book"
+ icon = 'icons/obj/library.dmi'
+ icon_state ="book"
+ throw_speed = 1
+ throw_range = 5
+ w_class = 1.0
+ flags = FPRINT | TABLEPASS
+ attack_verb = list("bashed", "whacked", "educated")
+ var/dat // Actual page content
+ var/due_date = 0 // Game time in 1/10th seconds
+ var/author // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
+ var/unique = 0 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified
+ var/title // The real name of the book.
+
+/obj/item/weapon/book/attack_self(var/mob/user as mob)
+ if(src.dat)
+ user << browse("Penned by [author].
" + "[dat]", "window=book")
+ user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.")
+ onclose(user, "book")
+ else
+ user << "This book is completely blank!"
+
+/obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/pen))
+ if(unique)
+ user << "These pages don't seem to take the ink well. Looks like you can't modify it."
+ return
+ var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
+ switch(choice)
+ if("Title")
+ var/newtitle = copytext(reject_bad_text(input("Write a new title:") as text|null),1,MAX_MESSAGE_LEN)
+ if(!newtitle)
+ usr << "The title is invalid."
+ return
+ else
+ src.name = newtitle
+ src.title = newtitle
+ if("Contents")
+ var/content = strip_html(input("Write your book's contents (HTML NOT allowed):"),8192) as message|null
+ if(!content)
+ usr << "The content is invalid."
+ return
+ else
+ src.dat += content
+ if("Author")
+ var/newauthor = copytext(sanitize(input("Write the author's name:") as text|null),1,MAX_NAME_LEN)
+ if(!newauthor)
+ usr << "The name is invalid."
+ return
+ else
+ src.author = newauthor
+ else
+ return
+ else if(istype(W, /obj/item/weapon/barcodescanner))
+ var/obj/item/weapon/barcodescanner/scanner = W
+ if(!scanner.computer)
+ user << "[W]'s screen flashes: 'No associated computer found!'"
+ else
+ switch(scanner.mode)
+ if(0)
+ scanner.book = src
+ user << "[W]'s screen flashes: 'Book stored in buffer.'"
+ if(1)
+ scanner.book = src
+ scanner.computer.buffer_book = src.name
+ user << "[W]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'"
+ if(2)
+ scanner.book = src
+ for(var/datum/borrowbook/b in scanner.computer.checkouts)
+ if(b.bookname == src.name)
+ scanner.computer.checkouts.Remove(b)
+ user << "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'"
+ return
+ user << "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'"
+ if(3)
+ scanner.book = src
+ for(var/obj/item/weapon/book in scanner.computer.inventory)
+ if(book == src)
+ user << "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'"
+ return
+ scanner.computer.inventory.Add(src)
+ user << "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
+ else
+ ..()
+
+
+/*
+ * Barcode Scanner
+ */
+/obj/item/weapon/barcodescanner
+ name = "barcode scanner"
+ icon = 'icons/obj/library.dmi'
+ icon_state ="scanner"
+ throw_speed = 1
+ throw_range = 5
+ w_class = 1.0
+ flags = FPRINT | TABLEPASS
+ var/obj/machinery/librarycomp/computer // Associated computer - Modes 1 to 3 use this
+ var/obj/item/weapon/book/book // Currently scanned book
+ var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
+
+ attack_self(mob/user as mob)
+ mode += 1
+ if(mode > 3)
+ mode = 0
+ user << "[src] Status Display:"
+ var/modedesc
+ switch(mode)
+ if(0)
+ modedesc = "Scan book to local buffer."
+ if(1)
+ modedesc = "Scan book to local buffer and set associated computer buffer to match."
+ if(2)
+ modedesc = "Scan book to local buffer, attempt to check in scanned book."
+ if(3)
+ modedesc = "Scan book to local buffer, attempt to add book to general inventory."
+ else
+ modedesc = "ERROR"
+ user << " - Mode [mode] : [modedesc]"
+ if(src.computer)
+ user << "Computer has been associated with this unit."
+ else
+ user << "No associated computer found. Only local scans will function properly."
+ user << "\n"
\ No newline at end of file
diff --git a/code/game/magic/library.dm b/code/modules/library/lib_machines.dm
similarity index 61%
rename from code/game/magic/library.dm
rename to code/modules/library/lib_machines.dm
index 46bf1c0506..6b6901e56a 100644
--- a/code/game/magic/library.dm
+++ b/code/modules/library/lib_machines.dm
@@ -1,330 +1,25 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
-
-//*******************************
-//
-// Library SQL Configuration
-//
-//*******************************
-
-// Deprecated! See global.dm for new SQL config vars -- TLE
-/*
-#define SQL_ADDRESS ""
-#define SQL_DB ""
-#define SQL_PORT "3306"
-#define SQL_LOGIN ""
-#define SQL_PASS ""
-*/
-
-//*******************************
-// Requires Dantom.DB library ( http://www.byond.com/developer/Dantom/DB )
-
+/* Library Machines
+ *
+ * Contains:
+ * Borrowbook datum
+ * Library Public Computer
+ * Library Computer
+ * Library Scanner
+ * Book Binder
+ */
/*
- The Library
- ------------
- A place for the crew to go, relax, and enjoy a good book.
- Aspiring authors can even self publish and, if they're lucky
- convince the on-staff Librarian to submit it to the Archives
- to be chronicled in history forever - some say even persisting
- through alternate dimensions.
-
-
- Written by TLE for /tg/station 13
- Feel free to use this as you like. Some credit would be cool.
- Check us out at http://nanotrasen.com/ if you're so inclined.
-*/
-
-// CONTAINS:
-
-// Objects:
-// - bookcase
-// - book
-// - barcode scanner
-// Machinery:
-// - library computer
-// - visitor's computer
-// - book binder
-// - book scanner
-// Datum:
-// - borrowbook
-
-
-// Ideas for the future
-// ---------------------
-// - Visitor's computer should be able to search the current in-round library inventory (that the Librarian has stocked and checked in)
-// -- Give computer other features like an Instant Messenger application, or the ability to edit, save, and print documents.
-// - Admin interface directly tied to the Archive DB. Right now there's no way to delete uploaded books in-game.
-// -- If this gets implemented, allow Librarians to "tag" or "suggest" books to be deleted. The DB ID of the tagged books gets saved to a text file (or another table in the DB maybe?).
-// The admin interface would automatically take these IDs and SELECT them all from the DB to be displayed along with a Delete link to drop the row from the table.
-// - When the game sets up and the round begins, have it automatically pick random books from the DB to populate the library with. Even if the Librarian is a useless fuck there are at least a few books around.
-// - Allow books to be "hollowed out" like the Chaplain's Bible, allowing you to store one pocket-sized item inside.
-// - Make books/book cases burn when exposed to flame.
-// - Make book binder hackable.
-// - Books shouldn't print straight from the library computer. Make it synch with a machine like the book binder to print instead. This should consume some sort of resource.
-
-
-// Run all strings to be used in an SQL query through this proc first to properly escape out injection attempts.
-/proc/sanitizeSQL(var/t as text)
- var/sanitized_text = dd_replacetext(t, "'", "\\'")
- sanitized_text = dd_replacetext(sanitized_text, "\"", "\\\"")
- return sanitized_text
-
-
-
-/obj/structure/bookcase
- name = "bookcase"
- icon = 'icons/obj/library.dmi'
- icon_state = "book-0"
- anchored = 1
- density = 1
- opacity = 1
-
-/obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob)
- if(istype(O, /obj/item/weapon/book))
- user.drop_item()
- O.loc = src
- update_icon()
- else if(istype(O, /obj/item/weapon/pen))
- var/newname = copytext(sanitize(input("What would you like to title this bookshelf?") as text|null),1,MAX_MESSAGE_LEN)
- if(!newname)
- return
- else
- name = ("bookcase ([sanitize(newname)])")
- else
- ..()
-
-/obj/structure/bookcase/attack_hand(var/mob/user as mob)
- if(contents.len)
- var/obj/item/weapon/book/choice = input("Which book would you like to remove from the shelf?") in contents as obj|null
- if(choice)
- if(!usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr))
- return
- if(ishuman(user))
- if(!user.get_active_hand())
- user.put_in_hands(choice)
- else
- choice.loc = get_turf(src)
- update_icon()
-
-/obj/structure/bookcase/ex_act(severity)
- switch(severity)
- if(1.0)
- for(var/obj/item/weapon/book/b in contents)
- del(b)
- del(src)
- return
- if(2.0)
- for(var/obj/item/weapon/book/b in contents)
- if (prob(50)) b.loc = (get_turf(src))
- else del(b)
- del(src)
- return
- if(3.0)
- if (prob(50))
- for(var/obj/item/weapon/book/b in contents)
- b.loc = (get_turf(src))
- del(src)
- return
- else
- return
-
-/obj/structure/bookcase/update_icon()
- if(contents.len < 5)
- icon_state = "book-[contents.len]"
- else
- icon_state = "book-5"
-
-
-/obj/structure/bookcase/manuals/medical
- name = "Medical Manuals bookcase"
-
- New()
- ..()
- new /obj/item/weapon/book/manual/medical_cloning(src)
- update_icon()
-
-
-/obj/structure/bookcase/manuals/engineering
- name = "Engineering Manuals bookcase"
-
- New()
- ..()
- new /obj/item/weapon/book/manual/engineering_construction(src)
- new /obj/item/weapon/book/manual/engineering_particle_accelerator(src)
- new /obj/item/weapon/book/manual/engineering_hacking(src)
- new /obj/item/weapon/book/manual/engineering_guide(src)
- new /obj/item/weapon/book/manual/engineering_singularity_safety(src)
- new /obj/item/weapon/book/manual/robotics_cyborgs(src)
- update_icon()
-
-/obj/structure/bookcase/manuals/research_and_development
- name = "R&D Manuals bookcase"
-
- New()
- ..()
- new /obj/item/weapon/book/manual/research_and_development(src)
- update_icon()
-
-
-
-
-
-
-/obj/item/weapon/book
- name = "book"
- icon = 'icons/obj/library.dmi'
- icon_state ="book"
- throw_speed = 1
- throw_range = 5
- w_class = 1.0
- flags = FPRINT | TABLEPASS
- attack_verb = list("bashed", "whacked", "educated")
- var/dat // Actual page content
- var/due_date = 0 // Game time in 1/10th seconds
- var/author // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
- var/unique = 0 // 0 - Normal book, 1 - Should not be treated as normal book, unable to be copied, unable to be modified
- var/title // The real name of the book.
-
-/obj/item/weapon/book/attack_self(var/mob/user as mob)
- if(src.dat)
- user << browse("Penned by [author].
" + "[dat]", "window=book")
- user.visible_message("[user] opens a book titled \"[src.title]\" and begins reading intently.")
- onclose(user, "book")
- else
- user << "This book is completely blank!"
-
-/obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob)
- if(istype(W, /obj/item/weapon/pen))
- if(unique)
- user << "These pages don't seem to take the ink well. Looks like you can't modify it."
- return
- var/choice = input("What would you like to change?") in list("Title", "Contents", "Author", "Cancel")
- switch(choice)
- if("Title")
- var/newtitle = copytext(reject_bad_text(input("Write a new title:") as text|null),1,MAX_MESSAGE_LEN)
- if(!newtitle)
- usr << "The title is invalid."
- return
- else
- src.name = newtitle
- src.title = newtitle
- if("Contents")
- var/content = strip_html(input("Write your book's contents (HTML NOT allowed):"),8192) as message|null
- if(!content)
- usr << "The content is invalid."
- return
- else
- src.dat += content
- if("Author")
- var/newauthor = copytext(sanitize(input("Write the author's name:") as text|null),1,MAX_NAME_LEN)
- if(!newauthor)
- usr << "The name is invalid."
- return
- else
- src.author = newauthor
- else
- return
- else if(istype(W, /obj/item/weapon/barcodescanner))
- var/obj/item/weapon/barcodescanner/scanner = W
- if(!scanner.computer)
- user << "[W]'s screen flashes: 'No associated computer found!'"
- else
- switch(scanner.mode)
- if(0)
- scanner.book = src
- user << "[W]'s screen flashes: 'Book stored in buffer.'"
- if(1)
- scanner.book = src
- scanner.computer.buffer_book = src.name
- user << "[W]'s screen flashes: 'Book stored in buffer. Book title stored in associated computer buffer.'"
- if(2)
- scanner.book = src
- for(var/datum/borrowbook/b in scanner.computer.checkouts)
- if(b.bookname == src.name)
- scanner.computer.checkouts.Remove(b)
- user << "[W]'s screen flashes: 'Book stored in buffer. Book has been checked in.'"
- return
- user << "[W]'s screen flashes: 'Book stored in buffer. No active check-out record found for current title.'"
- if(3)
- scanner.book = src
- for(var/obj/item/weapon/book in scanner.computer.inventory)
- if(book == src)
- user << "[W]'s screen flashes: 'Book stored in buffer. Title already present in inventory, aborting to avoid duplicate entry.'"
- return
- scanner.computer.inventory.Add(src)
- user << "[W]'s screen flashes: 'Book stored in buffer. Title added to general inventory.'"
- else
- ..()
-
-
-
-
-
-
-
-
-
-
-
-
-/obj/item/weapon/barcodescanner
- name = "barcode scanner"
- icon = 'icons/obj/library.dmi'
- icon_state ="scanner"
- throw_speed = 1
- throw_range = 5
- w_class = 1.0
- flags = FPRINT | TABLEPASS
- var/obj/machinery/librarycomp/computer // Associated computer - Modes 1 to 3 use this
- var/obj/item/weapon/book/book // Currently scanned book
- var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory
-
- attack_self(mob/user as mob)
- mode += 1
- if(mode > 3)
- mode = 0
- user << "[src] Status Display:"
- var/modedesc
- switch(mode)
- if(0)
- modedesc = "Scan book to local buffer."
- if(1)
- modedesc = "Scan book to local buffer and set associated computer buffer to match."
- if(2)
- modedesc = "Scan book to local buffer, attempt to check in scanned book."
- if(3)
- modedesc = "Scan book to local buffer, attempt to add book to general inventory."
- else
- modedesc = "ERROR"
- user << " - Mode [mode] : [modedesc]"
- if(src.computer)
- user << "Computer has been associated with this unit."
- else
- user << "No associated computer found. Only local scans will function properly."
- user << "\n"
-
-
-
-
-
-
-
-
-
-
+ * Borrowbook datum
+ */
datum/borrowbook // Datum used to keep track of who has borrowed what when and for how long.
var/bookname
var/mobname
var/getdate
var/duedate
-
-
-
-
-
-
-
+/*
+ * Library Public Computer
+ */
/obj/machinery/librarypubliccomp
name = "visitor computer"
icon = 'icons/obj/library.dmi'
@@ -337,7 +32,6 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f
var/author
var/SQLquery
-
/obj/machinery/librarypubliccomp/attack_hand(var/mob/user as mob)
usr.machine = src
var/dat = "