Cult 3.0 : Faction Code + Tracing Runes & Paying in Blood + Communication Rune (#17432)
* on the first day I drew my blood * on the second day I learned their names * on the third day we built an altar * on the fourth day we communed with him * on the fifth day I fixed some issues pointed out by DamianQ * and then some * and then some more * ok that's all for now
@@ -1,7 +1,6 @@
|
|||||||
// Faction IDs
|
// Faction IDs
|
||||||
|
|
||||||
#define CULT "cult"
|
#define BLOODCULT "Cult of Nar-Sie"
|
||||||
#define CULT_NARSIE "Cult of Nar-sie"
|
|
||||||
#define CHANGELING "changeling"
|
#define CHANGELING "changeling"
|
||||||
#define SYNDICATE "syndicate"
|
#define SYNDICATE "syndicate"
|
||||||
#define NUKE_OP "nuclear operative"
|
#define NUKE_OP "nuclear operative"
|
||||||
@@ -18,10 +17,20 @@
|
|||||||
// Role IDs
|
// Role IDs
|
||||||
|
|
||||||
#define CULTIST "cultist"
|
#define CULTIST "cultist"
|
||||||
#define HEADCULTIST "head cultist"
|
|
||||||
#define HEADREV "Head Revolutionary"
|
#define HEADREV "Head Revolutionary"
|
||||||
#define WIZAPP "Wizards Apprentice"
|
#define WIZAPP "Wizards Apprentice"
|
||||||
#define MADMONKEY "Monkey Madness"
|
#define MADMONKEY "Monkey Madness"
|
||||||
#define WISHGRANTERAVATAR "avatar of the Wish Granter"
|
#define WISHGRANTERAVATAR "avatar of the Wish Granter"
|
||||||
#define HIGHLANDER "highlander"
|
#define HIGHLANDER "highlander"
|
||||||
//Changeling, nuke op, traitor, wizard, vampire, rev, all the same as above
|
//Changeling, nuke op, traitor, wizard, vampire, rev, all the same as above
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define CULT_PROLOGUE 0
|
||||||
|
#define CULT_ACT_I 1
|
||||||
|
#define CULT_ACT_II 2
|
||||||
|
#define CULT_ACT_III 3
|
||||||
|
#define CULT_ACT_IV 4
|
||||||
|
#define CULT_EPILOGUE 5
|
||||||
|
|
||||||
|
#define CULT_COST_RUNE 1
|
||||||
@@ -193,12 +193,8 @@
|
|||||||
|
|
||||||
#define isthrall(H) (H.mind ? H.mind.GetRole(THRALL) : FALSE)
|
#define isthrall(H) (H.mind ? H.mind.GetRole(THRALL) : FALSE)
|
||||||
|
|
||||||
#define iscult(H) (H.mind && (iscultist(H) || isculthead(H)))
|
|
||||||
|
|
||||||
#define iscultist(H) (H.mind && H.mind.GetRole(CULTIST))
|
#define iscultist(H) (H.mind && H.mind.GetRole(CULTIST))
|
||||||
|
|
||||||
#define isculthead(H) (H.mind && H.mind.GetRole(HEADCULTIST))
|
|
||||||
|
|
||||||
#define ischangeling(H) (H.mind && H.mind.GetRole(CHANGELING))
|
#define ischangeling(H) (H.mind && H.mind.GetRole(CHANGELING))
|
||||||
|
|
||||||
#define isrev(H) (H.mind && (H.mind.GetRole(REV) || isrevhead(H)))
|
#define isrev(H) (H.mind && (H.mind.GetRole(REV) || isrevhead(H)))
|
||||||
|
|||||||
@@ -1025,14 +1025,6 @@
|
|||||||
return global.narsie_list;
|
return global.narsie_list;
|
||||||
if("mr_clean_targets")
|
if("mr_clean_targets")
|
||||||
return global.mr_clean_targets;
|
return global.mr_clean_targets;
|
||||||
if("cultwords")
|
|
||||||
return global.cultwords;
|
|
||||||
if("runedec")
|
|
||||||
return global.runedec;
|
|
||||||
if("engwords")
|
|
||||||
return global.engwords;
|
|
||||||
if("rnwords")
|
|
||||||
return global.rnwords;
|
|
||||||
if("rune_list")
|
if("rune_list")
|
||||||
return global.rune_list;
|
return global.rune_list;
|
||||||
if("halloween_spawns")
|
if("halloween_spawns")
|
||||||
@@ -1187,8 +1179,6 @@
|
|||||||
return global.message_delay;
|
return global.message_delay;
|
||||||
if("telecomms_list")
|
if("telecomms_list")
|
||||||
return global.telecomms_list;
|
return global.telecomms_list;
|
||||||
if("word_to_uristrune_table")
|
|
||||||
return global.word_to_uristrune_table;
|
|
||||||
if("uristrune_cache")
|
if("uristrune_cache")
|
||||||
return global.uristrune_cache;
|
return global.uristrune_cache;
|
||||||
if("explosion_shake_message_cooldown")
|
if("explosion_shake_message_cooldown")
|
||||||
@@ -2902,12 +2892,6 @@
|
|||||||
global.mr_clean_targets=newval
|
global.mr_clean_targets=newval
|
||||||
if("cultwords")
|
if("cultwords")
|
||||||
global.cultwords=newval
|
global.cultwords=newval
|
||||||
if("runedec")
|
|
||||||
global.runedec=newval
|
|
||||||
if("engwords")
|
|
||||||
global.engwords=newval
|
|
||||||
if("rnwords")
|
|
||||||
global.rnwords=newval
|
|
||||||
if("rune_list")
|
if("rune_list")
|
||||||
global.rune_list=newval
|
global.rune_list=newval
|
||||||
if("halloween_spawns")
|
if("halloween_spawns")
|
||||||
@@ -3062,8 +3046,6 @@
|
|||||||
global.message_delay=newval
|
global.message_delay=newval
|
||||||
if("telecomms_list")
|
if("telecomms_list")
|
||||||
global.telecomms_list=newval
|
global.telecomms_list=newval
|
||||||
if("word_to_uristrune_table")
|
|
||||||
global.word_to_uristrune_table=newval
|
|
||||||
if("uristrune_cache")
|
if("uristrune_cache")
|
||||||
global.uristrune_cache=newval
|
global.uristrune_cache=newval
|
||||||
if("explosion_shake_message_cooldown")
|
if("explosion_shake_message_cooldown")
|
||||||
|
|||||||
@@ -191,6 +191,15 @@
|
|||||||
|
|
||||||
screen_loc = ui_alien_master
|
screen_loc = ui_alien_master
|
||||||
|
|
||||||
|
/obj/abstract/screen/movable/spell_master/bloodcult
|
||||||
|
name = "Blood Magic"
|
||||||
|
icon_state = "cult_spell_ready"
|
||||||
|
|
||||||
|
open_state = "cult_open"
|
||||||
|
closed_state = "cult_closed"
|
||||||
|
|
||||||
|
screen_loc = ui_alien_master
|
||||||
|
|
||||||
//////////////ACTUAL SPELLS//////////////
|
//////////////ACTUAL SPELLS//////////////
|
||||||
//This is what you click to cast things//
|
//This is what you click to cast things//
|
||||||
/////////////////////////////////////////
|
/////////////////////////////////////////
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
if(targetarea && targetarea.anti_ethereal && !isAdminGhost(usr))
|
if(targetarea && targetarea.anti_ethereal && !isAdminGhost(usr))
|
||||||
to_chat(usr, "<span class='sinister'>A dark forcefield prevents you from entering the area.<span>")
|
to_chat(usr, "<span class='sinister'>A dark forcefield prevents you from entering the area.<span>")
|
||||||
else
|
else
|
||||||
if(targetloc.holy && ((src.invisibility == 0) || iscult(src)))
|
if(targetloc.holy && ((src.invisibility == 0) || iscultist(src)))
|
||||||
to_chat(usr, "<span class='warning'>These are sacred grounds, you cannot go there!</span>")
|
to_chat(usr, "<span class='warning'>These are sacred grounds, you cannot go there!</span>")
|
||||||
else
|
else
|
||||||
forceEnter(targetloc)
|
forceEnter(targetloc)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
/datum/gamemode/cult
|
/datum/gamemode/cult
|
||||||
name = "Cult"
|
name = "Cult"
|
||||||
factions_allowed = list(/datum/faction/cult)
|
factions_allowed = list(/datum/faction/bloodcult)
|
||||||
344
code/datums/gamemode/factions/bloodcult/bloodcult.dm
Normal file
@@ -0,0 +1,344 @@
|
|||||||
|
//CULT 3.0 BY DEITY LINK (2018)
|
||||||
|
//BASED ON THE ORIGINAL GAME MODE BY URIST MCDORF
|
||||||
|
|
||||||
|
/datum/faction/bloodcult
|
||||||
|
name = "Cult of Nar-Sie"
|
||||||
|
ID = BLOODCULT
|
||||||
|
initial_role = CULTIST
|
||||||
|
late_role = CULTIST
|
||||||
|
desc = "A group of shady blood-obsessed individuals whose souls are devoted to Nar-Sie, the Geometer of Blood.\
|
||||||
|
From his teachings, they were granted the ability to perform blood magic rituals allowing them to fight and grow their ranks, and given the goal of pushing his agenda.\
|
||||||
|
Nar-Sie's goal is to tear open a breach through reality so he can pull the station into his realm and feast on the crew's blood and souls."
|
||||||
|
roletype = /datum/role/cultist
|
||||||
|
var/list/bloody_floors = list()//to replace later on
|
||||||
|
|
||||||
|
/datum/faction/bloodcult/GetObjectivesMenuHeader()
|
||||||
|
var/icon/logo = icon('icons/mob/mob.dmi', "cult-logo")
|
||||||
|
var/header = {"<BR><img src='data:image/png;base64,[icon2base64(logo)]'> <FONT size = 2><B>Cult of Nar-Sie</B></FONT> <img src='data:image/png;base64,[icon2base64(logo)]'>"}
|
||||||
|
return header
|
||||||
|
|
||||||
|
/datum/faction/bloodcult/AdminPanelEntry()
|
||||||
|
var/list/dat = ..()
|
||||||
|
dat += "<a href='?_src_=holder;cult_mindspeak=\ref[src]'>Voice of Nar-Sie</a>"
|
||||||
|
return dat
|
||||||
|
|
||||||
|
/datum/faction/bloodcult/HandleNewMind(var/datum/mind/M)
|
||||||
|
..()
|
||||||
|
M.special_role = "Cultist"
|
||||||
|
|
||||||
|
/datum/faction/bloodcult/OnPostSetup()
|
||||||
|
..()
|
||||||
|
initialize_cultwords()
|
||||||
|
|
||||||
|
//to recode later on
|
||||||
|
/datum/faction/bloodcult/proc/is_sacrifice_target(var/datum/mind/M)
|
||||||
|
/*
|
||||||
|
for(var/datum/objective/target/sacrifice/S in GetObjectives())
|
||||||
|
if(S.target == M)
|
||||||
|
return TRUE
|
||||||
|
*/
|
||||||
|
return FALSE
|
||||||
|
/proc/is_convertable_to_cult(datum/mind/mind)
|
||||||
|
if(!istype(mind))
|
||||||
|
return 0
|
||||||
|
if(ishuman(mind.current) && (mind.assigned_role == "Chaplain"))
|
||||||
|
return 0
|
||||||
|
for(var/obj/item/weapon/implant/loyalty/L in mind.current)
|
||||||
|
if(L.imp_in == mind.current)//Checks to see if the person contains an implant, then checks that the implant is actually inside of them
|
||||||
|
return 0
|
||||||
|
return 1
|
||||||
|
|
||||||
|
//When cultists need to pay in blood to use their spells, they have a few options at their disposal:
|
||||||
|
// * If their hands are bloody, they can use the few units of blood on them.
|
||||||
|
// * If there is a blood splatter on the ground that still has a certain amount of fresh blood in it, they can use that?
|
||||||
|
// * If they are grabbing another person, they can stab their nails in their vessels to draw some blood from them
|
||||||
|
// * If they are standing above a bleeding person, they can dip their fingers into their wounds.
|
||||||
|
// * If they are holding a container that has blood in it (such as a beaker or a blood pack), they can pour/squeeze blood from them
|
||||||
|
// * If they are standing above a container that has blood in it, they can dip their fingers into them
|
||||||
|
// * Finally if there are no alternative blood sources, you can always use your own blood.
|
||||||
|
//TODO: include warnings when victims or the user go pale from excessive blood payment.
|
||||||
|
|
||||||
|
/proc/get_available_blood(var/mob/user, var/amount_needed = 0)
|
||||||
|
var/data = list(
|
||||||
|
"bleeder" = null,
|
||||||
|
"bleeder_amount" = 0,
|
||||||
|
"grabbed" = null,
|
||||||
|
"grabbed_amount" = 0,
|
||||||
|
"hands" = null,
|
||||||
|
"hands_amount" = 0,
|
||||||
|
"held" = null,
|
||||||
|
"held_amount" = 0,
|
||||||
|
"held_lid" = 0,
|
||||||
|
"splatter" = null,
|
||||||
|
"splatter_amount" = 0,
|
||||||
|
"bloodpack" = null,
|
||||||
|
"bloodpack_amount" = 0,
|
||||||
|
"bloodpack_noholes" = 0,
|
||||||
|
"container" = null,
|
||||||
|
"container_amount" = 0,
|
||||||
|
"container_lid" = 0,
|
||||||
|
"user" = null,
|
||||||
|
"user_amount" = 0,
|
||||||
|
"result" = "",
|
||||||
|
)
|
||||||
|
var/turf/T = get_turf(user)
|
||||||
|
var/amount_gathered = 0
|
||||||
|
|
||||||
|
//Is there blood on our hands?
|
||||||
|
var/mob/living/carbon/human/H_user = user
|
||||||
|
if (istype (H_user) && H_user.bloody_hands)
|
||||||
|
data["hands"] = H_user
|
||||||
|
var/blood_gathered = min(amount_needed,H_user.bloody_hands)
|
||||||
|
data["hands_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "hands"
|
||||||
|
return data
|
||||||
|
|
||||||
|
//Is there a fresh blood splatter on the turf?
|
||||||
|
for (var/obj/effect/decal/cleanable/blood/B in T)
|
||||||
|
var/blood_volume = B.amount
|
||||||
|
if (blood_volume && B.counts_as_blood)
|
||||||
|
data["splatter"] = B
|
||||||
|
var/blood_gathered = min(amount_needed-amount_gathered,blood_volume)
|
||||||
|
data["splatter_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "splatter"
|
||||||
|
return data
|
||||||
|
|
||||||
|
//Is the cultist currently grabbing a bleeding mob/corpse that still has blood in it?
|
||||||
|
var/obj/item/weapon/grab/Grab = locate() in user
|
||||||
|
if (Grab)
|
||||||
|
if(ishuman(Grab.affecting))
|
||||||
|
var/mob/living/carbon/human/H = Grab.affecting
|
||||||
|
for(var/datum/organ/external/org in H.organs)
|
||||||
|
if(org.status & ORGAN_BLEEDING)
|
||||||
|
var/blood_volume = round(H.vessel.get_reagent_amount(BLOOD))
|
||||||
|
var/blood_gathered = min(amount_needed-amount_gathered,blood_volume)
|
||||||
|
data["grabbed"] = H
|
||||||
|
data["grabbed_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "grabbed"
|
||||||
|
return data
|
||||||
|
|
||||||
|
//Is there a bleeding mob/corpse on the turf that still has blood in it?
|
||||||
|
for (var/mob/living/carbon/human/H in T)
|
||||||
|
if(user != H)
|
||||||
|
for(var/datum/organ/external/org in H.organs)
|
||||||
|
if(org.status & ORGAN_BLEEDING)
|
||||||
|
var/blood_volume = round(H.vessel.get_reagent_amount(BLOOD))
|
||||||
|
var/blood_gathered = min(amount_needed-amount_gathered,blood_volume)
|
||||||
|
data["bleeder"] = H
|
||||||
|
data["bleeder_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
break
|
||||||
|
if (data["bleeder"])
|
||||||
|
break
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "bleeder"
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
var/obj/item/weapon/reagent_containers/glass/G_held = H_user.get_active_hand()
|
||||||
|
if (!istype(G_held) || !round(G_held.reagents.get_reagent_amount(BLOOD)))
|
||||||
|
G_held = H_user.get_inactive_hand()
|
||||||
|
|
||||||
|
if (istype(G_held))
|
||||||
|
var/blood_volume = round(G_held.reagents.get_reagent_amount(BLOOD))
|
||||||
|
if (blood_volume)
|
||||||
|
data["held"] = G_held
|
||||||
|
if (G_held.is_open_container())
|
||||||
|
var/blood_gathered = min(amount_needed-amount_gathered,blood_volume)
|
||||||
|
data["held_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
else
|
||||||
|
data["held_lid"] = 1
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "held"
|
||||||
|
return data
|
||||||
|
|
||||||
|
var/obj/item/weapon/reagent_containers/blood/blood_pack = H_user.get_active_hand()
|
||||||
|
if (!istype(blood_pack) || !round(blood_pack.reagents.get_reagent_amount(BLOOD)))
|
||||||
|
blood_pack = H_user.get_inactive_hand()
|
||||||
|
|
||||||
|
if (istype(blood_pack))
|
||||||
|
var/blood_volume = round(blood_pack.reagents.get_reagent_amount(BLOOD))
|
||||||
|
if (blood_volume)
|
||||||
|
data["bloodpack"] = blood_pack
|
||||||
|
if (blood_pack.holes)
|
||||||
|
var/blood_gathered = min(amount_needed-amount_gathered,blood_volume)
|
||||||
|
data["bloodpack_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
else
|
||||||
|
data["bloodpack_noholes"] = 1
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "bloodpack"
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
//Is there a reagent container on the turf that has blood in it?
|
||||||
|
for (var/obj/item/weapon/reagent_containers/glass/G in T)
|
||||||
|
var/blood_volume = round(G.reagents.get_reagent_amount(BLOOD))
|
||||||
|
if (blood_volume)
|
||||||
|
data["container"] = G
|
||||||
|
if (G.is_open_container())
|
||||||
|
var/blood_gathered = min(amount_needed-amount_gathered,blood_volume)
|
||||||
|
data["container_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
break
|
||||||
|
else
|
||||||
|
data["container_lid"] = 1
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "container"
|
||||||
|
return data
|
||||||
|
|
||||||
|
//Does the user have blood? (the user can pay in blood without having to bleed first)
|
||||||
|
var/mob/living/carbon/human/H = user
|
||||||
|
if (istype (H))
|
||||||
|
var/blood_volume = round(H.vessel.get_reagent_amount(BLOOD))
|
||||||
|
var/blood_gathered = min(amount_needed-amount_gathered,blood_volume)
|
||||||
|
data["user"] = H
|
||||||
|
data["user_amount"] = blood_gathered
|
||||||
|
amount_gathered += blood_gathered
|
||||||
|
|
||||||
|
if (amount_gathered >= amount_needed)
|
||||||
|
data["result"] = "user"
|
||||||
|
return data
|
||||||
|
|
||||||
|
data["result"] = "failure"
|
||||||
|
return data
|
||||||
|
|
||||||
|
|
||||||
|
/proc/use_available_blood(var/mob/user, var/amount_needed = 0,var/previous_result = "")
|
||||||
|
//Getting nearby blood sources
|
||||||
|
var/list/data = get_available_blood(user, amount_needed)
|
||||||
|
|
||||||
|
var/datum/reagent/blood/blood
|
||||||
|
|
||||||
|
//Flavour text and blood data transfer
|
||||||
|
switch (data["result"])
|
||||||
|
if ("hands")
|
||||||
|
var/mob/living/carbon/human/H = user
|
||||||
|
blood = new()
|
||||||
|
blood.data["blood_colour"] = H.hand_blood_color
|
||||||
|
blood.data["blood_DNA"] = H.blood_DNA
|
||||||
|
if (previous_result != "user")
|
||||||
|
user.visible_message("<span class='warning'>The blood on \the [user]'s hands drips onto the floor!</span>",
|
||||||
|
"<span class='rose'>You let the blood smeared on your hands join the pool of your summoning.</span>",
|
||||||
|
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||||
|
if ("splatter")
|
||||||
|
var/obj/effect/decal/cleanable/blood/B = data["splatter"]
|
||||||
|
blood = new()
|
||||||
|
blood.data["blood_colour"] = B.basecolor
|
||||||
|
blood.data["blood_DNA"] = B.blood_DNA
|
||||||
|
blood.data["virus2"] = B.virus2
|
||||||
|
if (previous_result != "user")
|
||||||
|
user.visible_message("<span class='warning'>The blood on the floor bellow \the [user] starts moving!</span>",
|
||||||
|
"<span class='rose'>You redirect the flow of blood inside the splatters on the floor toward the pool of your summoning.</span>",
|
||||||
|
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||||
|
if ("grabbed")
|
||||||
|
var/mob/living/carbon/human/H = data["grabbed"]
|
||||||
|
blood = get_blood(H.vessel)
|
||||||
|
if (previous_result != "user")
|
||||||
|
user.visible_message("<span class='warning'>\The [user] stabs their nails inside \the [data["grabbed"]], drawing blood from them!</span>",
|
||||||
|
"<span class='rose'>You stab your nails inside \the [data["grabbed"]] to draw some blood from them.</span>",
|
||||||
|
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||||
|
if ("bleeder")
|
||||||
|
var/mob/living/carbon/human/H = data["bleeder"]
|
||||||
|
blood = get_blood(H.vessel)
|
||||||
|
if (previous_result != "user")
|
||||||
|
user.visible_message("<span class='warning'>\The [user] dips their fingers inside \the [data["bleeder"]]'s wounds!</span>",
|
||||||
|
"<span class='rose'>You dip your fingers inside \the [data["bleeder"]]'s wounds to draw some blood from them.</span>",
|
||||||
|
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||||
|
if ("held")
|
||||||
|
var/obj/item/weapon/reagent_containers/glass/G = data["held"]
|
||||||
|
blood = locate() in G.reagents.reagent_list
|
||||||
|
if (previous_result != "user")
|
||||||
|
user.visible_message("<span class='warning'>\The [user] tips \the [data["held"]], pouring blood!</span>",
|
||||||
|
"<span class='rose'>You tip \the [data["held"]] to pour the blood contained inside.</span>",
|
||||||
|
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||||
|
if ("bloodpack")
|
||||||
|
var/obj/item/weapon/reagent_containers/blood/B = data["bloodpack"]
|
||||||
|
blood = locate() in B.reagents.reagent_list
|
||||||
|
if (previous_result != "user")
|
||||||
|
user.visible_message("<span class='warning'>\The [user] squeezes \the [data["bloodpack"]], pouring blood!</span>",
|
||||||
|
"<span class='rose'>You squeeze \the [data["bloodpack"]] to pour the blood contained inside.</span>",
|
||||||
|
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||||
|
if ("container")
|
||||||
|
var/obj/item/weapon/reagent_containers/glass/G = data["container"]
|
||||||
|
blood = locate() in G.reagents.reagent_list
|
||||||
|
if (previous_result != "user")
|
||||||
|
user.visible_message("<span class='warning'>\The [user] dips their fingers inside \the [data["container"]], covering them in blood!</span>",
|
||||||
|
"<span class='rose'>You dip your fingers inside \the [data["container"]], covering them in blood.</span>",
|
||||||
|
"<span class='warning'>You hear a liquid flowing.</span>")
|
||||||
|
if ("user")
|
||||||
|
if (data["bloodpack_noholes"])
|
||||||
|
to_chat(user, "<span class='warning'>You must puncture \the [data["bloodpack"]] before you can squeeze blood from it!</span>")
|
||||||
|
else if (data["held_lid"])
|
||||||
|
to_chat(user, "<span class='warning'>Remove \the [data["held"]]'s lid first!</span>")
|
||||||
|
else if (data["container_lid"])
|
||||||
|
to_chat(user, "<span class='warning'>Remove \the [data["held"]]'s lid first!</span>")
|
||||||
|
var/mob/living/carbon/human/H = user
|
||||||
|
blood = get_blood(H.vessel)
|
||||||
|
if (previous_result != "user")
|
||||||
|
if(istype(H))
|
||||||
|
var/obj/item/weapon/W = H.get_active_hand()
|
||||||
|
if (W && W.sharpness_flags & SHARP_BLADE)
|
||||||
|
to_chat(user, "<span class='rose'>You slice open your finger with \the [W] to let a bit of blood flow.</span>")
|
||||||
|
else
|
||||||
|
var/obj/item/weapon/W2 = H.get_inactive_hand()
|
||||||
|
if (W2 && W2.sharpness_flags & SHARP_BLADE)
|
||||||
|
to_chat(user, "<span class='rose'>You slice open your finger with \the [W] to let a bit of blood flow.</span>")
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='rose'>You bite your finger and let the blood pearl up.</span>")
|
||||||
|
if ("failure")
|
||||||
|
if (data["bloodpack_noholes"])
|
||||||
|
to_chat(user, "<span class='danger'>You must puncture \the [data["bloodpack"]] before you can squeeze blood from it!</span>")
|
||||||
|
else if (data["held_lid"])
|
||||||
|
to_chat(user, "<span class='danger'>Remove \the [data["held"]]'s lid first!</span>")
|
||||||
|
else if (data["container_lid"])
|
||||||
|
to_chat(user, "<span class='danger'>Remove \the [data["held"]]'s lid first!</span>")
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='danger'>There is no blood available. Not even in your own body!</span>")
|
||||||
|
|
||||||
|
//Blood is only consumed if there is enough of it
|
||||||
|
if (!data["failure"])
|
||||||
|
if (data["hands"])
|
||||||
|
var/mob/living/carbon/human/H = user
|
||||||
|
H.bloody_hands = max(0, H.bloody_hands - data["hands_amount"])
|
||||||
|
if (!H.bloody_hands)
|
||||||
|
H.clean_blood()
|
||||||
|
H.update_inv_gloves()
|
||||||
|
if (data["splatter"])
|
||||||
|
var/obj/effect/decal/cleanable/blood/B = data["splatter"]
|
||||||
|
B.amount = max(0 , B.amount - data["splatter_amount"])
|
||||||
|
if (data["grabbed"])
|
||||||
|
var/mob/living/carbon/human/H = data["grabbed"]
|
||||||
|
H.vessel.remove_reagent(BLOOD, data["grabbed_amount"])
|
||||||
|
H.take_overall_damage(data["grabbed_amount"] ? 0.1 : 0)
|
||||||
|
if (data["bleeder"])
|
||||||
|
var/mob/living/carbon/human/H = data["bleeder"]
|
||||||
|
H.vessel.remove_reagent(BLOOD, data["bleeder_amount"])
|
||||||
|
H.take_overall_damage(data["bleeder_amount"] ? 0.1 : 0)
|
||||||
|
if (data["held"])
|
||||||
|
var/obj/item/weapon/reagent_containers/glass/G = data["held"]
|
||||||
|
G.reagents.remove_reagent(BLOOD, data["held_amount"])
|
||||||
|
if (data["container"])
|
||||||
|
var/obj/item/weapon/reagent_containers/glass/G = data["container"]
|
||||||
|
G.reagents.remove_reagent(BLOOD, data["container_amount"])
|
||||||
|
if (data["user"])
|
||||||
|
var/mob/living/carbon/human/H = user
|
||||||
|
H.vessel.remove_reagent(BLOOD, data["user_amount"])
|
||||||
|
H.take_overall_damage(data["user_amount"] ? 0.1 : 0)
|
||||||
|
|
||||||
|
data["blood"] = blood
|
||||||
|
return data
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
//Machinery that isn't replaced with cult structures by cultify()
|
||||||
|
/obj/machinery/camera/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/power/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/light_switch/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/firealarm/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/alarm/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/atm/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/hologram/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/status_display/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/newscaster/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/media/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/door_control/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/access_button/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/embedded_controller/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/navbeacon/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/gateway/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/space_heater/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/crema_switch/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/portable_atmospherics/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/pos/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/requests_console/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/computer/security/telescreen/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/conveyor_switch/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/conveyor/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/vending/wallmed1/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/flasher/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/flasher_button/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/cell_charger/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/meter/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/keycard_auth/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/airlock_sensor/cultify()
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/machinery/turretid/cultify()
|
||||||
|
qdel(src)
|
||||||
153
code/datums/gamemode/factions/bloodcult/bloodcult_items.dm
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
|
||||||
|
/obj/item/weapon/tome
|
||||||
|
name = "arcane tome"
|
||||||
|
desc = "An old, dusty tome with frayed edges and a sinister looking cover."
|
||||||
|
icon = 'icons/obj/cult.dmi'
|
||||||
|
icon_state ="tome"
|
||||||
|
throw_speed = 1
|
||||||
|
throw_range = 5
|
||||||
|
w_class = W_CLASS_SMALL
|
||||||
|
flags = FPRINT
|
||||||
|
|
||||||
|
/obj/item/weapon/paper/talisman
|
||||||
|
icon_state = "paper_talisman"
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/cultblade
|
||||||
|
name = "cult blade"
|
||||||
|
desc = "An arcane weapon wielded by the followers of Nar-Sie."
|
||||||
|
inhand_states = list("left_hand" = 'icons/mob/in-hand/left/swords_axes.dmi', "right_hand" = 'icons/mob/in-hand/right/swords_axes.dmi')
|
||||||
|
icon_state = "cultblade"
|
||||||
|
item_state = "cultblade"
|
||||||
|
flags = FPRINT
|
||||||
|
w_class = W_CLASS_LARGE
|
||||||
|
force = 30
|
||||||
|
throwforce = 10
|
||||||
|
sharpness = 1.35
|
||||||
|
sharpness_flags = SHARP_TIP | SHARP_BLADE
|
||||||
|
attack_verb = list("attacks", "slashes", "stabs", "slices", "tears", "rips", "dices", "cuts")
|
||||||
|
var/checkcult = 1
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/cultblade/nocult
|
||||||
|
checkcult = 0
|
||||||
|
force = 15
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/cultblade/cultify()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/cultblade/attack(mob/living/target as mob, mob/living/carbon/human/user as mob)
|
||||||
|
if(!checkcult || iscultist(user))
|
||||||
|
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
|
||||||
|
return ..()
|
||||||
|
else
|
||||||
|
user.Paralyse(5)
|
||||||
|
to_chat(user, "<span class='warning'>An unexplicable force powerfully repels the sword from [target]!</span>")
|
||||||
|
var/datum/organ/external/affecting = user.get_active_hand_organ()
|
||||||
|
if(affecting && affecting.take_damage(rand(force/2, force))) //random amount of damage between half of the blade's force and the full force of the blade.
|
||||||
|
user.UpdateDamageIcon()
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/weapon/melee/cultblade/pickup(mob/living/user as mob)
|
||||||
|
if(checkcult && !iscultist(user))
|
||||||
|
to_chat(user, "<span class='warning'>An overwhelming feeling of dread comes over you as you pick up the cultist's sword. It would be wise to rid yourself of this blade quickly.</span>")
|
||||||
|
user.Dizzy(120)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/clothing/head/culthood
|
||||||
|
name = "cult hood"
|
||||||
|
icon_state = "culthood"
|
||||||
|
desc = "A hood worn by the followers of Nar-Sie."
|
||||||
|
flags = FPRINT
|
||||||
|
armor = list(melee = 30, bullet = 10, laser = 5,energy = 5, bomb = 0, bio = 0, rad = 0)
|
||||||
|
body_parts_covered = EARS|HEAD
|
||||||
|
siemens_coefficient = 0
|
||||||
|
heat_conductivity = SPACESUIT_HEAT_CONDUCTIVITY
|
||||||
|
|
||||||
|
/obj/item/clothing/head/culthood/cultify()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/clothing/head/culthood/alt
|
||||||
|
icon_state = "cult_hoodalt"
|
||||||
|
item_state = "cult_hoodalt"
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/cultrobes/alt
|
||||||
|
icon_state = "cultrobesalt"
|
||||||
|
item_state = "cultrobesalt"
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/cultrobes
|
||||||
|
name = "cult robes"
|
||||||
|
desc = "A set of armored robes worn by the followers of Nar-Sie."
|
||||||
|
icon_state = "cultrobes"
|
||||||
|
item_state = "cultrobes"
|
||||||
|
flags = FPRINT
|
||||||
|
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||||
|
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||||
|
siemens_coefficient = 0
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/cultrobes/cultify()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/item/clothing/head/magus
|
||||||
|
name = "magus helm"
|
||||||
|
icon_state = "magus"
|
||||||
|
item_state = "magus"
|
||||||
|
desc = "A helm worn by the followers of Nar-Sie."
|
||||||
|
flags = FPRINT
|
||||||
|
body_parts_covered = FULL_HEAD|BEARD
|
||||||
|
armor = list(melee = 30, bullet = 30, laser = 30,energy = 20, bomb = 0, bio = 0, rad = 0)
|
||||||
|
siemens_coefficient = 0
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/magusred
|
||||||
|
name = "magus robes"
|
||||||
|
desc = "A set of armored robes worn by the followers of Nar-Sie."
|
||||||
|
icon_state = "magusred"
|
||||||
|
item_state = "magusred"
|
||||||
|
flags = FPRINT
|
||||||
|
body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS
|
||||||
|
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade)
|
||||||
|
armor = list(melee = 50, bullet = 30, laser = 50,energy = 20, bomb = 25, bio = 10, rad = 0)
|
||||||
|
siemens_coefficient = 0
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/clothing/head/helmet/space/cult
|
||||||
|
name = "cult helmet"
|
||||||
|
desc = "A space worthy helmet used by the followers of Nar-Sie"
|
||||||
|
icon_state = "cult_helmet"
|
||||||
|
item_state = "cult_helmet"
|
||||||
|
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||||
|
siemens_coefficient = 0
|
||||||
|
|
||||||
|
/obj/item/clothing/suit/space/cult
|
||||||
|
name = "cult armor"
|
||||||
|
icon_state = "cult_armour"
|
||||||
|
item_state = "cult_armour"
|
||||||
|
desc = "A bulky suit of armor bristling with spikes. It looks space proof."
|
||||||
|
w_class = W_CLASS_MEDIUM
|
||||||
|
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_nitrogen)
|
||||||
|
slowdown = NO_SLOWDOWN
|
||||||
|
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
|
||||||
|
siemens_coefficient = 0
|
||||||
|
|
||||||
|
|
||||||
|
/obj/item/weapon/bloodcult_pamphlet
|
||||||
|
name = "cult of Nar-Sie pamphlet"
|
||||||
|
desc = "Looks like a page torn from a tome. One glimpse at it surely can't hurt you."
|
||||||
|
icon = 'icons/obj/cult.dmi'
|
||||||
|
icon_state ="pamphlet"
|
||||||
|
throwforce = 0
|
||||||
|
w_class = W_CLASS_TINY
|
||||||
|
w_type = RECYK_WOOD
|
||||||
|
throw_range = 1
|
||||||
|
throw_speed = 1
|
||||||
|
layer = ABOVE_DOOR_LAYER
|
||||||
|
pressure_resistance = 1
|
||||||
|
attack_verb = list("slaps")
|
||||||
|
autoignition_temperature = AUTOIGNITION_PAPER
|
||||||
|
fire_fuel = 1
|
||||||
|
|
||||||
|
/obj/item/weapon/bloodcult_pamphlet/attack_self(var/mob/user)
|
||||||
|
initialize_cultwords()
|
||||||
|
var/datum/faction/bloodcult/cult = find_active_faction(BLOODCULT)
|
||||||
|
if (cult)
|
||||||
|
cult.HandleRecruitedMind(user.mind)
|
||||||
|
user.add_spell(new /spell/trace_rune, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
|
||||||
|
user.add_spell(new /spell/erase_rune, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
|
||||||
425
code/datums/gamemode/factions/bloodcult/bloodcult_runes.dm
Normal file
@@ -0,0 +1,425 @@
|
|||||||
|
//RUNE OBJECT
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//RUNE ACTIVATION TYPES
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//NULLROD CHECK
|
||||||
|
|
||||||
|
|
||||||
|
var/list/rune_list = list()//all runes currently in the world
|
||||||
|
var/list/uristrune_cache = list()//icon cache, so the whole blending process is only done once per rune.
|
||||||
|
|
||||||
|
|
||||||
|
/obj/effect/rune
|
||||||
|
desc = "A strange collection of symbols drawn in blood."
|
||||||
|
anchored = 1
|
||||||
|
icon = 'icons/effects/uristrunes.dmi'
|
||||||
|
icon_state = ""
|
||||||
|
layer = RUNE_LAYER
|
||||||
|
plane = ABOVE_TURF_PLANE
|
||||||
|
|
||||||
|
var/animated = 0
|
||||||
|
|
||||||
|
//A rune is made of up to 3 words
|
||||||
|
var/datum/cultword/word1
|
||||||
|
var/datum/cultword/word2
|
||||||
|
var/datum/cultword/word3
|
||||||
|
|
||||||
|
//An image we'll show to the AI instead of the rune
|
||||||
|
var/image/blood_image
|
||||||
|
|
||||||
|
//When a rune is created, we see if there's any data to copy from the blood used (colour, DNA, viruses) for all 3 words
|
||||||
|
var/datum/reagent/blood/blood1
|
||||||
|
var/datum/reagent/blood/blood2
|
||||||
|
var/datum/reagent/blood/blood3
|
||||||
|
var/list/datum/disease2/disease/virus2 = list()
|
||||||
|
|
||||||
|
//Used when a nullrod is preventing a rune's activation
|
||||||
|
var/nullblock = 0
|
||||||
|
|
||||||
|
|
||||||
|
var/datum/rune_spell/active_spell = null
|
||||||
|
|
||||||
|
/obj/effect/rune/New()
|
||||||
|
..()
|
||||||
|
blood_image = image(src)
|
||||||
|
|
||||||
|
//AI cannot see runes, instead they see blood splatters.
|
||||||
|
for(var/mob/living/silicon/ai/AI in player_list)
|
||||||
|
if(AI.client)
|
||||||
|
AI.client.images += blood_image
|
||||||
|
|
||||||
|
rune_list.Add(src)
|
||||||
|
|
||||||
|
/obj/effect/rune/Destroy()
|
||||||
|
|
||||||
|
for(var/mob/living/silicon/ai/AI in player_list)
|
||||||
|
if (AI.client)
|
||||||
|
AI.client.images -= blood_image
|
||||||
|
qdel(blood_image)
|
||||||
|
blood_image = null
|
||||||
|
|
||||||
|
word1 = null
|
||||||
|
word2 = null
|
||||||
|
word3 = null
|
||||||
|
|
||||||
|
blood1 = null
|
||||||
|
blood2 = null
|
||||||
|
blood3 = null
|
||||||
|
|
||||||
|
if (active_spell)
|
||||||
|
active_spell.abort()
|
||||||
|
active_spell = null
|
||||||
|
|
||||||
|
rune_list.Remove(src)
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/effect/rune/examine(var/mob/user)
|
||||||
|
..()
|
||||||
|
var/datum/rune_spell/rune_name = get_rune_spell(null, null, "examine", word1,word2,word3)
|
||||||
|
|
||||||
|
//cultists can read the words, and be informed if it calls a spell
|
||||||
|
if (iscultist(user))
|
||||||
|
to_chat(user, "<span class='info'>It reads: <i>[word1.rune] [word2.rune] [word3.rune]</i>.[rune_name ? " That's \a <b>[initial(rune_name.name)]</b> rune." : "It doesn't match any rune spells."]</span>")
|
||||||
|
if (rune_name)
|
||||||
|
if (initial(rune_name.Act_restriction) <= 1000)//TODO: SET TO CURRENT CULT FACTION ACT
|
||||||
|
to_chat(user, initial(rune_name.desc))
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='danger'>The veil is still too thick for you to draw power from this rune.</span>")
|
||||||
|
|
||||||
|
//so do observers
|
||||||
|
else if (isobserver(user))
|
||||||
|
to_chat(user, "<span class='info'>[rune_name ? "That's \a <b>[initial(rune_name.name)]</b> rune." : "It doesn't match any rune spell."]</span>")
|
||||||
|
|
||||||
|
//"cult" chaplains can read the words, but not understand the meaning (though they can always check it up). Also has a chance to trigger a taunt from Nar-Sie.
|
||||||
|
else if(istype(user, /mob/living/carbon/human) && (user.mind.assigned_role == "Chaplain"))
|
||||||
|
var/list/cult_blood_chaplain = list("cult", "narsie", "nar'sie", "narnar", "nar-sie")
|
||||||
|
var/list/cult_clock_chaplain = list("ratvar", "clockwork", "ratvarism")
|
||||||
|
if (religion_name in cult_blood_chaplain)
|
||||||
|
to_chat(user, "<span class='info'>It reads: <i>[word1.rune] [word2.rune] [word3.rune]</i>. What spell was that already?...</span>")
|
||||||
|
if (prob(5))
|
||||||
|
spawn(50)
|
||||||
|
to_chat(user, "<span class='game say'><span class='danger'>???-???</span> murmurs, <span class='sinister'>[pick(\
|
||||||
|
"Your toys won't get you much further",\
|
||||||
|
"Bitter that you weren't chosen?",\
|
||||||
|
"I dig your style, but I crave for your blood.",\
|
||||||
|
"Shall we gamble then? Obviously blood is the only acceptable bargaining chip")].</span></span>")
|
||||||
|
|
||||||
|
//RIP Velard
|
||||||
|
else if (religion_name in cult_clock_chaplain)
|
||||||
|
to_chat(user, "<span class='info'>It reads a bunch of stupid shit.</span>")
|
||||||
|
if (prob(5))
|
||||||
|
spawn(50)
|
||||||
|
to_chat(user, "<span class='game say'><span class='danger'>???-???</span> murmurs, <span class='sinister'>[pick(\
|
||||||
|
"Oh just fuck off",)].</span></span>")
|
||||||
|
|
||||||
|
/obj/effect/rune/cultify()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/effect/rune/ex_act(var/severity)
|
||||||
|
switch (severity)
|
||||||
|
if (1)
|
||||||
|
qdel(src)
|
||||||
|
if (2)
|
||||||
|
if (prob(15))
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/effect/rune/emp_act()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/effect/rune/blob_act()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/effect/rune/update_icon()
|
||||||
|
var/datum/rune_spell/spell = get_rune_spell(null, null, "examine", word1, word2, word3)
|
||||||
|
|
||||||
|
if(spell && initial(spell.Act_restriction) <= 1000)//TODO: SET TO CURRENT CULT FACTION ACT
|
||||||
|
animated = 1
|
||||||
|
else
|
||||||
|
animated = 0
|
||||||
|
|
||||||
|
var/lookup = ""
|
||||||
|
if (word1)
|
||||||
|
lookup += "[word1.icon_state]-[animated]-[blood1.data["blood_colour"]]-"
|
||||||
|
if (word2)
|
||||||
|
lookup += "[word2.icon_state]-[animated]-[blood2.data["blood_colour"]]-"
|
||||||
|
if (word3)
|
||||||
|
lookup += "[word3.icon_state]-[animated]-[blood3.data["blood_colour"]]"
|
||||||
|
|
||||||
|
if (lookup in uristrune_cache)
|
||||||
|
icon = uristrune_cache[lookup]
|
||||||
|
else
|
||||||
|
var/icon/I1 = icon('icons/effects/uristrunes.dmi', "")
|
||||||
|
if (word1)
|
||||||
|
I1 = make_uristword(word1,blood1,animated)
|
||||||
|
var/icon/I2 = icon('icons/effects/uristrunes.dmi', "")
|
||||||
|
if (word2)
|
||||||
|
I2 = make_uristword(word2,blood2,animated)
|
||||||
|
var/icon/I3 = icon('icons/effects/uristrunes.dmi', "")
|
||||||
|
if (word3)
|
||||||
|
I3 = make_uristword(word3,blood3,animated)
|
||||||
|
|
||||||
|
var/icon/I = icon('icons/effects/uristrunes.dmi', "")
|
||||||
|
I.Blend(I1, ICON_OVERLAY)
|
||||||
|
I.Blend(I2, ICON_OVERLAY)
|
||||||
|
I.Blend(I3, ICON_OVERLAY)
|
||||||
|
icon = I
|
||||||
|
|
||||||
|
if(animated)
|
||||||
|
idle_pulse()
|
||||||
|
else
|
||||||
|
animate(src)
|
||||||
|
|
||||||
|
/obj/effect/rune/proc/idle_pulse()
|
||||||
|
//This masterpiece of a color matrix stack produces a nice animation no matter which color was the blood used for the rune.
|
||||||
|
animate(src, color = list(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0), time = 10, loop = -1)//1
|
||||||
|
animate(color = list(1.125,0.06,0,0,0,1.125,0.06,0,0.06,0,1.125,0,0,0,0,1,0,0,0,0), time = 2)//2
|
||||||
|
animate(color = list(1.25,0.12,0,0,0,1.25,0.12,0,0.12,0,1.25,0,0,0,0,1,0,0,0,0), time = 2)//3
|
||||||
|
animate(color = list(1.375,0.19,0,0,0,1.375,0.19,0,0.19,0,1.375,0,0,0,0,1,0,0,0,0), time = 1.5)//4
|
||||||
|
animate(color = list(1.5,0.27,0,0,0,1.5,0.27,0,0.27,0,1.5,0,0,0,0,1,0,0,0,0), time = 1.5)//5
|
||||||
|
animate(color = list(1.625,0.35,0.06,0,0.06,1.625,0.35,0,0.35,0.06,1.625,0,0,0,0,1,0,0,0,0), time = 1)//6
|
||||||
|
animate(color = list(1.75,0.45,0.12,0,0.12,1.75,0.45,0,0.45,0.12,1.75,0,0,0,0,1,0,0,0,0), time = 1)//7
|
||||||
|
animate(color = list(1.875,0.56,0.19,0,0.19,1.875,0.56,0,0.56,0.19,1.875,0,0,0,0,1,0,0,0,0), time = 1)//8
|
||||||
|
animate(color = list(2,0.67,0.27,0,0.27,2,0.67,0,0.67,0.27,2,0,0,0,0,1,0,0,0,0), time = 5)//9
|
||||||
|
animate(color = list(1.875,0.56,0.19,0,0.19,1.875,0.56,0,0.56,0.19,1.875,0,0,0,0,1,0,0,0,0), time = 1)//8
|
||||||
|
animate(color = list(1.75,0.45,0.12,0,0.12,1.75,0.45,0,0.45,0.12,1.75,0,0,0,0,1,0,0,0,0), time = 1)//7
|
||||||
|
animate(color = list(1.625,0.35,0.06,0,0.06,1.625,0.35,0,0.35,0.06,1.625,0,0,0,0,1,0,0,0,0), time = 1)//6
|
||||||
|
animate(color = list(1.5,0.27,0,0,0,1.5,0.27,0,0.27,0,1.5,0,0,0,0,1,0,0,0,0), time = 1)//5
|
||||||
|
animate(color = list(1.375,0.19,0,0,0,1.375,0.19,0,0.19,0,1.375,0,0,0,0,1,0,0,0,0), time = 1)//4
|
||||||
|
animate(color = list(1.25,0.12,0,0,0,1.25,0.12,0,0.12,0,1.25,0,0,0,0,1,0,0,0,0), time = 1)//3
|
||||||
|
animate(color = list(1.125,0.06,0,0,0,1.125,0.06,0,0.06,0,1.125,0,0,0,0,1,0,0,0,0), time = 1)//2
|
||||||
|
|
||||||
|
|
||||||
|
/obj/effect/rune/proc/one_pulse()
|
||||||
|
animate(src, color = list(1.625,0.35,0.06,0,0.06,1.625,0.35,0,0.35,0.06,1.625,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
animate(color = list(2,0.67,0.27,0,0.27,2,0.67,0,0.67,0.27,2,0,0,0,0,1,0,0,0,0), time = 2)
|
||||||
|
animate(color = list(1.875,0.56,0.19,0,0.19,1.875,0.56,0,0.56,0.19,1.875,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
animate(color = list(1.75,0.45,0.12,0,0.12,1.75,0.45,0,0.45,0.12,1.75,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
animate(color = list(1.625,0.35,0.06,0,0.06,1.625,0.35,0,0.35,0.06,1.625,0,0,0,0,1,0,0,0,0), time = 0.75)
|
||||||
|
animate(color = list(1.5,0.27,0,0,0,1.5,0.27,0,0.27,0,1.5,0,0,0,0,1,0,0,0,0), time = 0.75)
|
||||||
|
animate(color = list(1.375,0.19,0,0,0,1.375,0.19,0,0.19,0,1.375,0,0,0,0,1,0,0,0,0), time = 0.5)
|
||||||
|
animate(color = list(1.25,0.12,0,0,0,1.25,0.12,0,0.12,0,1.25,0,0,0,0,1,0,0,0,0), time = 0.5)
|
||||||
|
animate(color = list(1.125,0.06,0,0,0,1.125,0.06,0,0.06,0,1.125,0,0,0,0,1,0,0,0,0), time = 0.25)
|
||||||
|
animate(color = list(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
|
||||||
|
spawn (10)
|
||||||
|
if(animated)
|
||||||
|
idle_pulse()
|
||||||
|
else
|
||||||
|
animate(src)
|
||||||
|
|
||||||
|
/obj/effect/rune/proc/quick_pulse()
|
||||||
|
animate(src, color = list(2,0.67,0.27,0,0.27,2,0.67,0,0.67,0.27,2,0,0,0,0,1,0,0,0,0), time = 5, loop = -1)
|
||||||
|
animate(color = list(1.875,0.56,0.19,0,0.19,1.875,0.56,0,0.56,0.19,1.875,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
animate(color = list(1.75,0.45,0.12,0,0.12,1.75,0.45,0,0.45,0.12,1.75,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
animate(color = list(1.625,0.35,0.06,0,0.06,1.625,0.35,0,0.35,0.06,1.625,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
animate(color = list(1.75,0.45,0.12,0,0.12,1.75,0.45,0,0.45,0.12,1.75,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
animate(color = list(1.875,0.56,0.19,0,0.19,1.875,0.56,0,0.56,0.19,1.875,0,0,0,0,1,0,0,0,0), time = 1)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/effect/rune/proc/make_uristword(var/datum/cultword/word, var/datum/reagent/blood/blood, var/animated)
|
||||||
|
var/icon/I = icon('icons/effects/uristrunes.dmi', "")
|
||||||
|
var/lookupword = "[word.icon_state]-[animated]-[blood.data["blood_colour"]]"
|
||||||
|
if(lookupword in uristrune_cache)
|
||||||
|
I = uristrune_cache[lookupword]
|
||||||
|
else
|
||||||
|
I.Blend(icon('icons/effects/uristrunes.dmi', word.icon_state), ICON_OVERLAY)
|
||||||
|
var/finalblood = blood.data["blood_colour"]
|
||||||
|
var/list/blood_hsl = rgb2hsl(GetRedPart(finalblood),GetGreenPart(finalblood),GetBluePart(finalblood))
|
||||||
|
if(blood_hsl.len)
|
||||||
|
var/list/blood_rgb = hsl2rgb(blood_hsl[1],blood_hsl[2],50)//producing a color that is neither too bright nor too dark
|
||||||
|
if(blood_rgb.len)
|
||||||
|
finalblood = rgb(blood_rgb[1],blood_rgb[2],blood_rgb[3])
|
||||||
|
|
||||||
|
var/bc1 = finalblood
|
||||||
|
var/bc2 = finalblood
|
||||||
|
bc1 += "C8"
|
||||||
|
bc2 += "64"
|
||||||
|
|
||||||
|
I.SwapColor(rgb(0, 0, 0, 100), bc1)
|
||||||
|
I.SwapColor(rgb(0, 0, 0, 50), bc1)
|
||||||
|
|
||||||
|
for(var/x = 1, x <= WORLD_ICON_SIZE, x++)
|
||||||
|
for(var/y = 1, y <= WORLD_ICON_SIZE, y++)
|
||||||
|
var/p = I.GetPixel(x, y)
|
||||||
|
|
||||||
|
if(p == null)
|
||||||
|
var/n = I.GetPixel(x, y + 1)
|
||||||
|
var/s = I.GetPixel(x, y - 1)
|
||||||
|
var/e = I.GetPixel(x + 1, y)
|
||||||
|
var/w = I.GetPixel(x - 1, y)
|
||||||
|
|
||||||
|
if(n == "#000000" || s == "#000000" || e == "#000000" || w == "#000000")
|
||||||
|
I.DrawBox(bc1, x, y)
|
||||||
|
|
||||||
|
else
|
||||||
|
var/ne = I.GetPixel(x + 1, y + 1)
|
||||||
|
var/se = I.GetPixel(x + 1, y - 1)
|
||||||
|
var/nw = I.GetPixel(x - 1, y + 1)
|
||||||
|
var/sw = I.GetPixel(x - 1, y - 1)
|
||||||
|
|
||||||
|
if(ne == "#000000" || se == "#000000" || nw == "#000000" || sw == "#000000")
|
||||||
|
I.DrawBox(bc2, x, y)
|
||||||
|
|
||||||
|
I.MapColors(0.5,0,0,0,0.5,0,0,0,0.5)//we'll darken that color a bit
|
||||||
|
return I
|
||||||
|
|
||||||
|
|
||||||
|
/obj/effect/rune/attackby(obj/I, mob/user)
|
||||||
|
if(istype(I, /obj/item/weapon/nullrod))
|
||||||
|
to_chat(user, "<span class='notice'>You disrupt the vile magic with the deadening field of \the [I]!</span>")
|
||||||
|
qdel(src)
|
||||||
|
return
|
||||||
|
return
|
||||||
|
|
||||||
|
/proc/write_rune_word(var/turf/T,var/datum/reagent/blood/source,var/word = null)
|
||||||
|
if (!word)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
//Is there already a rune on the turf? if yes, let's try adding a word to it.
|
||||||
|
var/obj/effect/rune/rune = locate() in T
|
||||||
|
if (!rune)
|
||||||
|
rune = new/obj/effect/rune(T)
|
||||||
|
|
||||||
|
if (rune.word1 && rune.word2 && rune.word3)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
//Let's add a word at the end of the pile. This way each world could technically have its own color.
|
||||||
|
if (!rune.word1)
|
||||||
|
rune.word1 = word
|
||||||
|
rune.blood1 = new()
|
||||||
|
if (source.data["blood_colour"])
|
||||||
|
rune.blood1.data["blood_colour"] = source.data["blood_colour"]
|
||||||
|
else
|
||||||
|
rune.blood1.data["blood_colour"] = DEFAULT_BLOOD
|
||||||
|
if (source.data["blood_type"])
|
||||||
|
rune.blood1.data["blood_DNA"] = source.data["blood_type"]
|
||||||
|
else
|
||||||
|
rune.blood1.data["blood_DNA"] = "O+"
|
||||||
|
if (source.data["virus2"])
|
||||||
|
rune.blood1.data["virus2"] = virus_copylist(source.data["virus2"])
|
||||||
|
|
||||||
|
else if (!rune.word2)
|
||||||
|
rune.word2 = word
|
||||||
|
rune.blood2 = new()
|
||||||
|
if (source.data["blood_colour"])
|
||||||
|
rune.blood2.data["blood_colour"] = source.data["blood_colour"]
|
||||||
|
else
|
||||||
|
rune.blood1.data["blood_colour"] = DEFAULT_BLOOD
|
||||||
|
if (source.data["blood_type"])
|
||||||
|
rune.blood2.data["blood_DNA"] = source.data["blood_type"]
|
||||||
|
else
|
||||||
|
rune.blood2.data["blood_DNA"] = "O+"
|
||||||
|
if (source.data["virus2"])
|
||||||
|
rune.blood2.data["virus2"] = virus_copylist(source.data["virus2"])
|
||||||
|
|
||||||
|
else if (!rune.word3)
|
||||||
|
rune.word3 = word
|
||||||
|
rune.blood3 = new()
|
||||||
|
if (source.data["blood_colour"])
|
||||||
|
rune.blood3.data["blood_colour"] = source.data["blood_colour"]
|
||||||
|
else
|
||||||
|
rune.blood1.data["blood_colour"] = DEFAULT_BLOOD
|
||||||
|
if (source.data["blood_type"])
|
||||||
|
rune.blood3.data["blood_DNA"] = source.data["blood_type"]
|
||||||
|
else
|
||||||
|
rune.blood3.data["blood_DNA"] = "O+"
|
||||||
|
if (source.data["virus2"])
|
||||||
|
rune.blood3.data["virus2"] = virus_copylist(source.data["virus2"])
|
||||||
|
|
||||||
|
//think twice before touching runes made with contaminated blood
|
||||||
|
if (rune.blood3)
|
||||||
|
rune.virus2 = rune.blood1.data["virus2"] | rune.blood2.data["virus2"] | rune.blood3.data["virus2"]
|
||||||
|
rune.update_icon()
|
||||||
|
return 1//That rune now has 3 words, that's a wrap.
|
||||||
|
else if (rune.blood2)
|
||||||
|
rune.virus2 = rune.blood1.data["virus2"] | rune.blood2.data["virus2"]
|
||||||
|
else if (rune.blood1)
|
||||||
|
rune.virus2 = rune.blood1.data["virus2"]
|
||||||
|
|
||||||
|
rune.update_icon()
|
||||||
|
return 2//There's room for more words on this rune, let's immediately prompt the player to write another one.
|
||||||
|
|
||||||
|
/proc/erase_rune_word(var/turf/T)
|
||||||
|
var/obj/effect/rune/rune = locate() in T
|
||||||
|
if (!rune)
|
||||||
|
return null
|
||||||
|
|
||||||
|
var/word_erased
|
||||||
|
|
||||||
|
if (rune.word3)
|
||||||
|
word_erased = rune.word3.rune
|
||||||
|
rune.word3 = null
|
||||||
|
rune.blood3 = null
|
||||||
|
rune.update_icon()
|
||||||
|
if (rune.active_spell)
|
||||||
|
rune.active_spell.abort()
|
||||||
|
rune.active_spell = null
|
||||||
|
else if (rune.word2)
|
||||||
|
word_erased = rune.word2.rune
|
||||||
|
rune.word2 = null
|
||||||
|
rune.blood2 = null
|
||||||
|
rune.update_icon()
|
||||||
|
else if (rune.word1)
|
||||||
|
word_erased = rune.word1.rune
|
||||||
|
rune.word1 = null
|
||||||
|
rune.blood1 = null
|
||||||
|
qdel(rune)
|
||||||
|
else
|
||||||
|
message_admins("Error! Trying to erase a word from a rune with no words!")
|
||||||
|
qdel(rune)
|
||||||
|
return null
|
||||||
|
return word_erased
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/obj/effect/rune/attack_animal(var/mob/living/simple_animal/user)
|
||||||
|
if(istype(user, /mob/living/simple_animal/construct/harvester))
|
||||||
|
trigger(user)
|
||||||
|
|
||||||
|
/obj/effect/rune/attack_paw(var/mob/living/user)
|
||||||
|
if(ismonkey(user))
|
||||||
|
trigger(user)
|
||||||
|
|
||||||
|
/obj/effect/rune/attack_hand(var/mob/living/user)
|
||||||
|
trigger(user)
|
||||||
|
|
||||||
|
/obj/effect/rune/proc/trigger(var/mob/living/user)
|
||||||
|
if (active_spell)//for now. gotta add a mid_cast() proc.
|
||||||
|
return
|
||||||
|
|
||||||
|
user.delayNextAttack(5)
|
||||||
|
if(!iscultist(user))
|
||||||
|
to_chat(user, "<span class='danger'>You can't mouth the arcane scratchings without fumbling over them.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(iscarbon(user))
|
||||||
|
var/mob/living/carbon/C = user
|
||||||
|
if (C.muted())
|
||||||
|
to_chat(user, "<span class='danger'>You find yourself unable to focus your mind on the arcane words of the rune.</span>")
|
||||||
|
return
|
||||||
|
|
||||||
|
if(user.is_wearing_item(/obj/item/clothing/mask/muzzle, slot_wear_mask))
|
||||||
|
to_chat(user, "<span class='danger'>You are unable to speak the words of the rune because of \the [user.wear_mask].</span>")//TODO; SILENT CASTING ALLOWS MUZZLED CAST
|
||||||
|
return
|
||||||
|
|
||||||
|
if(!word1 || !word2 || !word3 || prob(user.getBrainLoss()))
|
||||||
|
return fizzle(user)
|
||||||
|
|
||||||
|
active_spell = get_rune_spell(user, src, "ritual" , word1, word2, word3)
|
||||||
|
|
||||||
|
if (!active_spell)
|
||||||
|
return fizzle(user)
|
||||||
|
|
||||||
|
|
||||||
|
/obj/effect/rune/proc/fizzle(var/mob/living/user)
|
||||||
|
user.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"))
|
||||||
|
one_pulse()
|
||||||
|
visible_message("<span class='warning'>The markings pulse with a small burst of light, then fall dark.</span>",\
|
||||||
|
"<span class='warning'>The markings pulse with a small burst of light, then fall dark.</span>",\
|
||||||
|
"<span class='warning'>You hear a faint fizzle.</span>")
|
||||||
472
code/datums/gamemode/factions/bloodcult/bloodcult_runespells.dm
Normal file
@@ -0,0 +1,472 @@
|
|||||||
|
//THE SPELLS PROC'D BY THE RUNES
|
||||||
|
|
||||||
|
/datum/rune_spell
|
||||||
|
var/name = "default name"
|
||||||
|
var/desc = "default description"
|
||||||
|
var/Act_restriction = CULT_PROLOGUE
|
||||||
|
var/obj/spell_holder = null
|
||||||
|
var/mob/activator = null
|
||||||
|
var/datum/cultword/word1 = null
|
||||||
|
var/datum/cultword/word2 = null
|
||||||
|
var/datum/cultword/word3 = null
|
||||||
|
var/teleporter = 0//teleporter runes only need the first two words to be valid
|
||||||
|
var/invocation = "Lo'Rem Ip'Sum"
|
||||||
|
|
||||||
|
/datum/rune_spell/New(var/mob/user, var/obj/holder, var/use = "ritual")
|
||||||
|
spell_holder = holder
|
||||||
|
activator = user
|
||||||
|
|
||||||
|
switch (use)
|
||||||
|
if ("ritual")
|
||||||
|
cast()
|
||||||
|
|
||||||
|
/datum/rune_spell/Destroy()
|
||||||
|
if (spell_holder)
|
||||||
|
if (istype(spell_holder, /obj/effect/rune))
|
||||||
|
var/obj/effect/rune/rune_holder = spell_holder
|
||||||
|
rune_holder.active_spell = null
|
||||||
|
spell_holder = null
|
||||||
|
word1 = null
|
||||||
|
word2 = null
|
||||||
|
word3 = null
|
||||||
|
activator = null
|
||||||
|
..()
|
||||||
|
|
||||||
|
/datum/rune_spell/proc/cast()
|
||||||
|
var/mob/living/user = activator
|
||||||
|
if (user)
|
||||||
|
user.say(invocation)
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/datum/rune_spell/proc/abort(var/cause = "erased")
|
||||||
|
switch (cause)
|
||||||
|
if ("erased")
|
||||||
|
if (istype (spell_holder,/obj/effect/rune))
|
||||||
|
spell_holder.visible_message("<span class='warning'>The rune's destruction ended the ritual.</span>")
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
|
||||||
|
//Called whenever a rune gets activated or examined
|
||||||
|
/proc/get_rune_spell(var/mob/user, var/obj/spell_holder, var/use = "ritual", var/datum/cultword/word1, var/datum/cultword/word2, var/datum/cultword/word3)
|
||||||
|
if (!word1 || !word2 || !word3)
|
||||||
|
return
|
||||||
|
|
||||||
|
for(var/subtype in subtypesof(/datum/rune_spell))
|
||||||
|
var/datum/rune_spell/instance = subtype
|
||||||
|
if (initial(instance.teleporter) && word1.type == initial(instance.word1) && word2.type == initial(instance.word2))
|
||||||
|
switch (use)
|
||||||
|
if ("ritual")
|
||||||
|
return new subtype(user, spell_holder, use, word3)
|
||||||
|
if ("examine")
|
||||||
|
return instance
|
||||||
|
else if (word1.type == initial(instance.word1) && word2.type == initial(instance.word2) && word3.type == initial(instance.word3))
|
||||||
|
switch (use)
|
||||||
|
if ("ritual")
|
||||||
|
return new subtype(user, spell_holder, use)
|
||||||
|
if ("examine")
|
||||||
|
return instance
|
||||||
|
return new subtype(user, spell_holder, use)
|
||||||
|
return null
|
||||||
|
|
||||||
|
//RUNE I
|
||||||
|
/datum/rune_spell/raisestructure
|
||||||
|
name = "Raise Structure"
|
||||||
|
desc = "Drag-in eldritch structures from the realm of Nar-Sie."
|
||||||
|
Act_restriction = CULT_PROLOGUE
|
||||||
|
|
||||||
|
/datum/rune_spell/raisestructure/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/blood
|
||||||
|
word2 = /datum/cultword/technology
|
||||||
|
word3 = /datum/cultword/join
|
||||||
|
|
||||||
|
//RUNE II
|
||||||
|
/datum/rune_spell/communication
|
||||||
|
name = "Communication"
|
||||||
|
desc = "Speak so that every cultists may hear your voice."
|
||||||
|
Act_restriction = CULT_PROLOGUE
|
||||||
|
invocation = "O bidai nabora se'sma!"
|
||||||
|
var/obj/effect/cult_ritual/cult_communication/comms = null
|
||||||
|
var/destroying_self = 0
|
||||||
|
|
||||||
|
/datum/rune_spell/communication/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/self
|
||||||
|
word2 = /datum/cultword/other
|
||||||
|
word3 = /datum/cultword/technology
|
||||||
|
|
||||||
|
/datum/rune_spell/communication/cast()
|
||||||
|
var/mob/living/user = activator
|
||||||
|
if (user)
|
||||||
|
user.say(invocation)
|
||||||
|
if (user.loc != spell_holder.loc)
|
||||||
|
abort("too far")
|
||||||
|
else
|
||||||
|
comms = new /obj/effect/cult_ritual/cult_communication(spell_holder.loc,user,src)
|
||||||
|
|
||||||
|
/datum/rune_spell/communication/abort(var/cause = "erased")
|
||||||
|
switch (cause)
|
||||||
|
if ("too far")
|
||||||
|
spell_holder.visible_message("<span class='warning'>The [name] ritual requires you to stand on top of the rune.</span>")
|
||||||
|
if ("moved away")
|
||||||
|
spell_holder.visible_message("<span class='warning'>The ritual ends as you move away from the rune.</span>")
|
||||||
|
..()
|
||||||
|
|
||||||
|
|
||||||
|
/datum/rune_spell/communication/Destroy()
|
||||||
|
if (destroying_self)
|
||||||
|
return
|
||||||
|
destroying_self = 1
|
||||||
|
qdel(comms)
|
||||||
|
comms = null
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/cult_communication
|
||||||
|
anchored = 1
|
||||||
|
icon = 'icons/effects/effects.dmi'
|
||||||
|
icon_state = "rune_communication"
|
||||||
|
pixel_y = 8
|
||||||
|
alpha = 200
|
||||||
|
layer = ABOVE_OBJ_LAYER
|
||||||
|
plane = OBJ_PLANE
|
||||||
|
mouse_opacity = 0
|
||||||
|
flags = HEAR|PROXMOVE
|
||||||
|
var/mob/living/caster = null
|
||||||
|
var/datum/rune_spell/communication/source = null
|
||||||
|
var/ending = ""
|
||||||
|
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/cult_communication/New(var/turf/loc, var/mob/living/user, var/datum/rune_spell/communication/runespell)
|
||||||
|
..()
|
||||||
|
caster = user
|
||||||
|
source = runespell
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/cult_communication/Destroy()
|
||||||
|
caster = null
|
||||||
|
source.abort(ending)
|
||||||
|
source = null
|
||||||
|
..()
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/cult_communication/Hear(var/datum/speech/speech, var/rendered_message="")
|
||||||
|
if(speech.speaker && speech.speaker.loc == loc)//&& iscultist DUH
|
||||||
|
var/speaker_name = speech.speaker.name
|
||||||
|
if (ishuman(speech.speaker))
|
||||||
|
var/mob/living/carbon/human/H = speech.speaker
|
||||||
|
speaker_name = H.real_name
|
||||||
|
rendered_message = speech.render_message()
|
||||||
|
for(var/mob/living/L in player_list)//&& iscultist DUH
|
||||||
|
to_chat(L, "<span class='game say'><b>[speaker_name]</b>'s voice echoes in your head, <B><span class='sinister'>[rendered_message]</span></B></span>")
|
||||||
|
for(var/mob/dead/observer/O in player_list)
|
||||||
|
to_chat(O, "<span class='game say'><b>[speaker_name]</b> communicates, <span class='sinister'>[rendered_message]</span></span>")
|
||||||
|
log_cultspeak("[key_name(speech.speaker)] Cult Communicate Rune: [rendered_message]")
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/cult_communication/HasProximity(var/atom/movable/AM)
|
||||||
|
if (!caster || caster.loc != loc)
|
||||||
|
qdel(src)
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/cultify()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/ex_act(var/severity)
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/emp_act()
|
||||||
|
return
|
||||||
|
|
||||||
|
/obj/effect/cult_ritual/blob_act()
|
||||||
|
return
|
||||||
|
|
||||||
|
|
||||||
|
//RUNE III
|
||||||
|
/datum/rune_spell/summontome
|
||||||
|
name = "Summon Tome"
|
||||||
|
desc = "Bring forth an arcane tome filled with Nar-Sie's knowledge."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "N'ath reth sh'yro eth d'raggathnor!"
|
||||||
|
|
||||||
|
/datum/rune_spell/summontome/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/see
|
||||||
|
word2 = /datum/cultword/blood
|
||||||
|
word3 = /datum/cultword/hell
|
||||||
|
//RUNE IV
|
||||||
|
/datum/rune_spell/conjuretalisman
|
||||||
|
name = "Conjure Talisman"
|
||||||
|
desc = "Can turn some runes into talismans."
|
||||||
|
invocation = "H'drak v'loso, mir'kanas verbot!"
|
||||||
|
|
||||||
|
/datum/rune_spell/conjuretalisman/New()
|
||||||
|
..()
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
word1 = /datum/cultword/hell
|
||||||
|
word2 = /datum/cultword/technology
|
||||||
|
word3 = /datum/cultword/join
|
||||||
|
|
||||||
|
//RUNE V
|
||||||
|
/datum/rune_spell/conversion
|
||||||
|
name = "Conversion"
|
||||||
|
desc = "Open the eyes of the unbelievers."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "Mah'weyh pleggh at e'ntrath!"
|
||||||
|
|
||||||
|
/datum/rune_spell/conversion/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/join
|
||||||
|
word2 = /datum/cultword/blood
|
||||||
|
word3 = /datum/cultword/self
|
||||||
|
|
||||||
|
//RUNE VI
|
||||||
|
/datum/rune_spell/stun
|
||||||
|
name = "Stun"
|
||||||
|
desc = "Overwhelm your victim's senses with pure energy so they become catatonic for a moment."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "Fuu ma'jin!"
|
||||||
|
|
||||||
|
/datum/rune_spell/stun/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/join
|
||||||
|
word2 = /datum/cultword/hide
|
||||||
|
word3 = /datum/cultword/technology
|
||||||
|
|
||||||
|
//RUNE VII
|
||||||
|
/datum/rune_spell/blind
|
||||||
|
name = "Blind"
|
||||||
|
desc = "Get the edge over nearby enemies by removing their senses."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "Sti' kaliesin!"
|
||||||
|
|
||||||
|
/datum/rune_spell/blind/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/destroy
|
||||||
|
word2 = /datum/cultword/see
|
||||||
|
word3 = /datum/cultword/other
|
||||||
|
|
||||||
|
//RUNE VIII
|
||||||
|
/datum/rune_spell/mute
|
||||||
|
name = "Mute"
|
||||||
|
desc = "Silence and deafen nearby enemies."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "Sti' kaliedir!"
|
||||||
|
|
||||||
|
/datum/rune_spell/mute/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/hide
|
||||||
|
word2 = /datum/cultword/other
|
||||||
|
word3 = /datum/cultword/see
|
||||||
|
|
||||||
|
//RUNE IX
|
||||||
|
/datum/rune_spell/hide
|
||||||
|
name = "Hide"
|
||||||
|
desc = "Hide runes, blood stains, corpses, structures, and other compromising items."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "Kla'atu barada nikt'o!"
|
||||||
|
|
||||||
|
/datum/rune_spell/hide/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/hide
|
||||||
|
word2 = /datum/cultword/see
|
||||||
|
word3 = /datum/cultword/blood
|
||||||
|
|
||||||
|
//RUNE X
|
||||||
|
/datum/rune_spell/reveal
|
||||||
|
name = "Reveal"
|
||||||
|
desc = "Reveal what you have previously hidden."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "Nikt'o barada kla'atu!"
|
||||||
|
|
||||||
|
/datum/rune_spell/reveal/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/blood
|
||||||
|
word2 = /datum/cultword/see
|
||||||
|
word3 = /datum/cultword/hide
|
||||||
|
|
||||||
|
//RUNE XI
|
||||||
|
/datum/rune_spell/seer
|
||||||
|
name = "Seer"
|
||||||
|
desc = "See the invisible, the dead, hear their voice."
|
||||||
|
Act_restriction = CULT_ACT_I
|
||||||
|
invocation = "Rash'tla sektath mal'zua. Zasan therium viortia."
|
||||||
|
|
||||||
|
/datum/rune_spell/seer/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/see
|
||||||
|
word2 = /datum/cultword/hell
|
||||||
|
word3 = /datum/cultword/join
|
||||||
|
|
||||||
|
//RUNE XII
|
||||||
|
/datum/rune_spell/summonrobes
|
||||||
|
name = "Summon Robes"
|
||||||
|
desc = "Wear the robes of those who follow Nar-Sie."
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
invocation = "Sa tatha najin"
|
||||||
|
|
||||||
|
/datum/rune_spell/summonrobes/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/hell
|
||||||
|
word2 = /datum/cultword/destroy
|
||||||
|
word3 = /datum/cultword/other
|
||||||
|
|
||||||
|
//RUNE XIII
|
||||||
|
/datum/rune_spell/door
|
||||||
|
name = "Door"
|
||||||
|
desc = "More obstacles for your enemies to overcome."
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
invocation = "Khari'd! Eske'te tannin!"
|
||||||
|
|
||||||
|
/datum/rune_spell/door/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/destroy
|
||||||
|
word2 = /datum/cultword/travel
|
||||||
|
word3 = /datum/cultword/self
|
||||||
|
|
||||||
|
//RUNE XIV
|
||||||
|
/datum/rune_spell/fervor
|
||||||
|
name = "Fervor"
|
||||||
|
desc = "Inspire nearby cultists to purge their stuns and raise their movement speed."
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
invocation = "Khari'd! Gual'te nikka!"
|
||||||
|
|
||||||
|
/datum/rune_spell/fervor/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/travel
|
||||||
|
word2 = /datum/cultword/technology
|
||||||
|
word3 = /datum/cultword/other
|
||||||
|
|
||||||
|
//RUNE XV
|
||||||
|
/datum/rune_spell/summoncultist
|
||||||
|
name = "Summon Cultist"
|
||||||
|
desc = "Bring forth one of your fellow believers, no matter how far they are, as long as their heart beats"
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
invocation = "N'ath reth sh'yro eth d'rekkathnor!"
|
||||||
|
|
||||||
|
/datum/rune_spell/summoncultist/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/join
|
||||||
|
word2 = /datum/cultword/other
|
||||||
|
word3 = /datum/cultword/self
|
||||||
|
|
||||||
|
//RUNE XVI
|
||||||
|
/datum/rune_spell/portalentrance
|
||||||
|
name = "Portal Entrance"
|
||||||
|
desc = "Take a shortcut through the veil between this world and the other one."
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
invocation = "Sas'so c'arta forbici!"
|
||||||
|
|
||||||
|
/datum/rune_spell/portalentrance/New(var/mob/user, var/obj/holder, var/datum/cultword/w3)
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/travel
|
||||||
|
word2 = /datum/cultword/self
|
||||||
|
teleporter = 1
|
||||||
|
if (w3)
|
||||||
|
word3 = w3.type
|
||||||
|
|
||||||
|
//RUNE XVII
|
||||||
|
/datum/rune_spell/portalexit
|
||||||
|
name = "Portal Exit"
|
||||||
|
desc = "We hope you enjoyed your flight with Air Nar-Sie"//might change it later or not.
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
|
||||||
|
/datum/rune_spell/portalexit/New(var/mob/user, var/obj/holder, var/datum/cultword/w3)
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/travel
|
||||||
|
word2 = /datum/cultword/other
|
||||||
|
teleporter = 1
|
||||||
|
if (w3)
|
||||||
|
word3 = w3.type
|
||||||
|
|
||||||
|
//RUNE XVIII
|
||||||
|
/datum/rune_spell/pulse
|
||||||
|
name = "Pulse"
|
||||||
|
desc = "Scramble the circuits of nearby devices"
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
invocation = "Ta'gh fara'qha fel d'amar det!"
|
||||||
|
|
||||||
|
/datum/rune_spell/pulse/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/destroy
|
||||||
|
word2 = /datum/cultword/see
|
||||||
|
word3 = /datum/cultword/technology
|
||||||
|
|
||||||
|
//RUNE XIX
|
||||||
|
/datum/rune_spell/astraljourney
|
||||||
|
name = "Astral Journey"
|
||||||
|
desc = "Leave your body so you can converse with the dead and observe your targets."
|
||||||
|
Act_restriction = CULT_ACT_II
|
||||||
|
invocation = "Fwe'sh mah erl nyag r'ya!"
|
||||||
|
|
||||||
|
/datum/rune_spell/astraljourney/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/hell
|
||||||
|
word2 = /datum/cultword/travel
|
||||||
|
word3 = /datum/cultword/self
|
||||||
|
|
||||||
|
//RUNE XX
|
||||||
|
/datum/rune_spell/resurrect
|
||||||
|
name = "Resurrect"
|
||||||
|
desc = "Create a strong body for your fallen allies to inhabit."
|
||||||
|
Act_restriction = CULT_ACT_III
|
||||||
|
invocation = "Pasnar val'keriam usinar. Savrae ines amutan. Yam'toth remium il'tarat!"
|
||||||
|
|
||||||
|
/datum/rune_spell/resurrect/New()
|
||||||
|
..()
|
||||||
|
word1 = /datum/cultword/blood
|
||||||
|
word2 = /datum/cultword/join
|
||||||
|
word3 = /datum/cultword/hell
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
if((word1 == cultwords["travel"] && word2 == cultwords["self"]))
|
||||||
|
return "Travel Self"
|
||||||
|
else if((word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"]))
|
||||||
|
return "Convert"
|
||||||
|
else if((word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"]))
|
||||||
|
return "Tear Reality"
|
||||||
|
else if((word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"]))
|
||||||
|
return "Summon Tome"
|
||||||
|
else if((word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"]))
|
||||||
|
return "Armor"
|
||||||
|
else if((word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"]))
|
||||||
|
return "EMP"
|
||||||
|
else if((word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"]))
|
||||||
|
return "Drain"
|
||||||
|
else if((word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"]))
|
||||||
|
return "See Invisible"
|
||||||
|
else if((word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"]))
|
||||||
|
return "Raise Dead"
|
||||||
|
else if((word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"]))
|
||||||
|
return "Hide Runes"
|
||||||
|
else if((word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"]))
|
||||||
|
return "Astral Journey"
|
||||||
|
else if((word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"]))
|
||||||
|
return "Imbue Talisman"
|
||||||
|
else if((word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"]))
|
||||||
|
return "Sacrifice"
|
||||||
|
else if((word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"]))
|
||||||
|
return "Reveal Runes"
|
||||||
|
else if((word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"]))
|
||||||
|
return "Wall"
|
||||||
|
else if((word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"]))
|
||||||
|
return "Free Cultist"
|
||||||
|
else if((word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"]))
|
||||||
|
return "Summon Cultist"
|
||||||
|
else if((word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"]))
|
||||||
|
return "Deafen"
|
||||||
|
else if((word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"]))
|
||||||
|
return "Blind"
|
||||||
|
else if((word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"]))
|
||||||
|
return "Blood Boil"
|
||||||
|
else if((word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"]))
|
||||||
|
return "Communicate"
|
||||||
|
else if((word1 == cultwords["travel"] && word2 == cultwords["other"]))
|
||||||
|
return "Travel Other"
|
||||||
|
else if((word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"]))
|
||||||
|
return "Stun"
|
||||||
|
else
|
||||||
|
return null
|
||||||
|
*/
|
||||||
112
code/datums/gamemode/factions/bloodcult/bloodcult_spells.dm
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
|
||||||
|
//SPELL I
|
||||||
|
/spell/trace_rune
|
||||||
|
name = "Trace Rune"
|
||||||
|
desc = "Use available blood to write down words. Three words form a rune."
|
||||||
|
panel = "Cult"
|
||||||
|
hud_state = "cult_word"
|
||||||
|
override_base = "cult"
|
||||||
|
|
||||||
|
invocation_type = SpI_NONE
|
||||||
|
charge_type = Sp_RECHARGE
|
||||||
|
charge_max = 0
|
||||||
|
range = 0
|
||||||
|
spell_flags = null
|
||||||
|
insufficient_holder_msg = "<span class='warning'>You cannot write another word just yet.</span>"
|
||||||
|
still_recharging_msg = "<span class='warning'>You cannot write another word just yet.</span>"
|
||||||
|
|
||||||
|
cast_delay = 15
|
||||||
|
|
||||||
|
var/list/data = list()
|
||||||
|
var/datum/cultword/word = null
|
||||||
|
var/obj/effect/rune/rune = null
|
||||||
|
|
||||||
|
/spell/trace_rune/choose_targets(var/mob/user = usr)
|
||||||
|
return list(user)
|
||||||
|
|
||||||
|
|
||||||
|
/spell/trace_rune/before_channel(mob/user)
|
||||||
|
var/mob/living/carbon/C = user
|
||||||
|
var/muted = C.muted()
|
||||||
|
if (muted)
|
||||||
|
to_chat(user,"<span class='danger'>You find yourself unable to focus your mind on the words of Nar-Sie.</span>")
|
||||||
|
return muted
|
||||||
|
|
||||||
|
|
||||||
|
/spell/trace_rune/spell_do_after(var/mob/user, var/delay, var/numticks = 3)
|
||||||
|
|
||||||
|
if(block)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
block = 1
|
||||||
|
|
||||||
|
if(!istype(user.loc, /turf))
|
||||||
|
to_chat(user, "<span class='warning'>You do not have enough space to write a proper rune.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
var/turf/T = user.loc
|
||||||
|
|
||||||
|
rune = locate() in T
|
||||||
|
if (rune && rune.word1 && rune.word2 && rune.word3)
|
||||||
|
to_chat(user, "<span class='warning'>You cannot add more than 3 words to a rune.</span>")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
word = input(user,"Choose a word to add to the rune.", "Trace Rune", null) as null|anything in cultwords
|
||||||
|
|
||||||
|
if (!word)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
data = use_available_blood(user, CULT_COST_RUNE)
|
||||||
|
if (data["result"] == "failure")
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if (rune)
|
||||||
|
user.visible_message("<span class='warning'>\The [user] chants and paints more symbols on the floor.</span>",\
|
||||||
|
"<span class='warning'>You add another word to the rune.</span>",\
|
||||||
|
"<span class='warning'>You hear chanting.</span>")
|
||||||
|
else
|
||||||
|
user.visible_message("<span class='warning'>\The [user] begins to chant and paint symbols on the floor.</span>",\
|
||||||
|
"<span class='warning'>You begin drawing a rune on the floor.</span>",\
|
||||||
|
"<span class='warning'>You hear some chanting.</span>")
|
||||||
|
|
||||||
|
var/datum/cultword/r_word = cultwords[word]
|
||||||
|
user.whisper("...[r_word.rune]...")
|
||||||
|
|
||||||
|
return ..()
|
||||||
|
|
||||||
|
/spell/trace_rune/cast(var/list/targets, var/mob/living/carbon/user)
|
||||||
|
..()
|
||||||
|
if (rune && rune.word1 && rune.word2 && rune.word3)
|
||||||
|
to_chat(user, "<span class='warning'>You cannot add more than 3 words to a rune.</span>")
|
||||||
|
return
|
||||||
|
if (write_rune_word(get_turf(user) ,data["blood"] ,word = cultwords[word]) > 1)
|
||||||
|
perform(user)//imediately try writing another word
|
||||||
|
|
||||||
|
//SPELL II
|
||||||
|
/spell/erase_rune
|
||||||
|
name = "Erase Rune"
|
||||||
|
desc = "Remove the last word written of the rune you're standing above."
|
||||||
|
panel = "Cult"
|
||||||
|
hud_state = "cult_erase"
|
||||||
|
override_base = "cult"
|
||||||
|
|
||||||
|
invocation_type = SpI_NONE
|
||||||
|
charge_type = Sp_RECHARGE
|
||||||
|
charge_max = 0
|
||||||
|
range = 0
|
||||||
|
spell_flags = null
|
||||||
|
insufficient_holder_msg = ""
|
||||||
|
still_recharging_msg = ""
|
||||||
|
|
||||||
|
cast_delay = 0
|
||||||
|
|
||||||
|
/spell/erase_rune/choose_targets(var/mob/user = usr)
|
||||||
|
return list(user)
|
||||||
|
|
||||||
|
/spell/erase_rune/cast(var/list/targets, var/mob/living/carbon/user)
|
||||||
|
..()
|
||||||
|
var/removed_word = erase_rune_word(get_turf(user))
|
||||||
|
if (removed_word)
|
||||||
|
to_chat(user, "<span class='notice'>You retrace your steps, carefully undoing the lines of the [removed_word] rune.</span>")
|
||||||
|
else
|
||||||
|
to_chat(user, "<span class='warning'>There aren't any rune words left to erase.</span>")
|
||||||
85
code/datums/gamemode/factions/bloodcult/bloodcult_words.dm
Normal file
@@ -0,0 +1,85 @@
|
|||||||
|
|
||||||
|
var/cultwords_initialized = 0
|
||||||
|
var/list/cultwords = list()//datums go in here
|
||||||
|
var/list/cultwords_english = list("travel", "blood", "join", "hell", "destroy", "technology", "self", "see", "other", "hide")
|
||||||
|
var/list/cultwords_rune = list("ire","ego","nahlizet","certum","veri","jatkaa","mgar","balaq", "karazet", "geeri")
|
||||||
|
var/list/cultwords_icons = list("rune-1","rune-2","rune-4","rune-8","rune-16","rune-32","rune-64","rune-128", "rune-256", "rune-512")
|
||||||
|
|
||||||
|
/datum/cultword
|
||||||
|
var/english = "word"//don't change those
|
||||||
|
var/rune = "zek'kon"
|
||||||
|
var/icon = 'icons/effects/uristrunes.dmi'
|
||||||
|
var/icon_state = ""
|
||||||
|
|
||||||
|
/proc/initialize_cultwords()
|
||||||
|
if (cultwords_initialized)
|
||||||
|
return
|
||||||
|
for(var/subtype in subtypesof(/datum/cultword))
|
||||||
|
var/datum/cultword/new_word = new subtype()
|
||||||
|
cultwords[new_word.english] = new_word
|
||||||
|
cultwords_initialized = 1
|
||||||
|
|
||||||
|
//for now we're not calling it anywhere, but should we want to randomize words again later, that's what that proc is for.
|
||||||
|
/proc/randomize_cultwords()
|
||||||
|
var/list/available_rnwords = cultwords_rune
|
||||||
|
var/list/available_icons = cultwords_icons
|
||||||
|
for(var/datum/cultword/cultword in cultwords)
|
||||||
|
var/picked_rnword = pick(available_rnwords)
|
||||||
|
var/picked_icon = pick(available_icons)
|
||||||
|
cultword.rune = picked_rnword
|
||||||
|
cultword.icon_state = picked_icon
|
||||||
|
available_rnwords.Remove(picked_rnword)
|
||||||
|
available_icons.Remove(picked_icon)
|
||||||
|
|
||||||
|
for (var/obj/effect/rune/rune in rune_list)
|
||||||
|
rune.update_icon()
|
||||||
|
|
||||||
|
/datum/cultword/travel
|
||||||
|
english = "travel"
|
||||||
|
rune = "ire"
|
||||||
|
icon_state = "rune-1"
|
||||||
|
|
||||||
|
/datum/cultword/blood
|
||||||
|
english = "blood"
|
||||||
|
rune = "ego"
|
||||||
|
icon_state = "rune-2"
|
||||||
|
|
||||||
|
/datum/cultword/join
|
||||||
|
english = "join"
|
||||||
|
rune = "nahlizet"
|
||||||
|
icon_state = "rune-4"
|
||||||
|
|
||||||
|
/datum/cultword/hell
|
||||||
|
english = "hell"
|
||||||
|
rune = "certum"
|
||||||
|
icon_state = "rune-8"
|
||||||
|
|
||||||
|
/datum/cultword/destroy
|
||||||
|
english = "destroy"
|
||||||
|
rune = "veri"
|
||||||
|
icon_state = "rune-16"
|
||||||
|
|
||||||
|
/datum/cultword/technology
|
||||||
|
english = "technology"
|
||||||
|
rune = "jatkaa"
|
||||||
|
icon_state = "rune-32"
|
||||||
|
|
||||||
|
/datum/cultword/self
|
||||||
|
english = "self"
|
||||||
|
rune = "mgar"
|
||||||
|
icon_state = "rune-64"
|
||||||
|
|
||||||
|
/datum/cultword/see
|
||||||
|
english = "see"
|
||||||
|
rune = "balaq"
|
||||||
|
icon_state = "rune-128"
|
||||||
|
|
||||||
|
/datum/cultword/other
|
||||||
|
english = "other"
|
||||||
|
rune = "karazet"
|
||||||
|
icon_state = "rune-256"
|
||||||
|
|
||||||
|
/datum/cultword/hide
|
||||||
|
english = "hide"
|
||||||
|
rune = "geeri"
|
||||||
|
icon_state = "rune-512"
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
@name: String: Name of the faction
|
@name: String: Name of the faction
|
||||||
@ID: List(String): Identifying strings for shorthand finding this faction.
|
@ID: List(String): Identifying strings for shorthand finding this faction.
|
||||||
@desc: String: Description of the faction, their intentions, how they do things, etc. Something for lorewriters to use.
|
@desc: String: Description of the faction, their intentions, how they do things, etc. Something for lorewriters to use.
|
||||||
@initial_role: String(DEFINE): On initial setup via gamemode or faction creation, set the new minds role ID to this. HEADCULTIST for example
|
@initial_role: String(DEFINE): On initial setup via gamemode or faction creation, set the new minds role ID to this.
|
||||||
@late_role: String(DEFINE): On later recruitment, set the new minds role ID to this. TRAITOR for example
|
@late_role: String(DEFINE): On later recruitment, set the new minds role ID to this. TRAITOR for example
|
||||||
@required_pref: String(DEFINE): What preference is required to be recruited to this faction.
|
@required_pref: String(DEFINE): What preference is required to be recruited to this faction.
|
||||||
@restricted_species: list(String): Only species on this list can be part of this faction
|
@restricted_species: list(String): Only species on this list can be part of this faction
|
||||||
@@ -251,7 +251,7 @@
|
|||||||
return header
|
return header
|
||||||
|
|
||||||
/datum/faction/strike_team
|
/datum/faction/strike_team
|
||||||
name = "Strike Team 6"
|
name = "Custom Strike Team"//obviously this name is a placeholder getting replaced by the admin setting up the squad
|
||||||
required_pref = ROLE_STRIKE
|
required_pref = ROLE_STRIKE
|
||||||
ID = CUSTOMSQUAD
|
ID = CUSTOMSQUAD
|
||||||
|
|
||||||
@@ -264,5 +264,5 @@
|
|||||||
ID = DEATHSQUAD
|
ID = DEATHSQUAD
|
||||||
|
|
||||||
/datum/faction/strike_team/syndiesquad
|
/datum/faction/strike_team/syndiesquad
|
||||||
name = "Syndicate Deep-strike squad"
|
name = "Syndicate Deep-Strike squad"
|
||||||
ID = SYNDIESQUAD
|
ID = SYNDIESQUAD
|
||||||
|
|||||||
29
code/datums/gamemode/role/cultist.dm
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
/datum/role/cultist
|
||||||
|
name = "Cultist"
|
||||||
|
protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Chaplain", "Head of Personnel", "Internal Affairs Agent")
|
||||||
|
|
||||||
|
/datum/role/cultist/OnPostSetup()
|
||||||
|
. = ..()
|
||||||
|
if(!.)
|
||||||
|
return
|
||||||
|
|
||||||
|
antag.current.add_spell(new /spell/trace_rune, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
|
||||||
|
antag.current.add_spell(new /spell/erase_rune, "cult_spell_ready", /obj/abstract/screen/movable/spell_master/bloodcult)
|
||||||
|
|
||||||
|
/datum/role/cultist/Greet()
|
||||||
|
to_chat(antag.current, {"<span class='sinister'><font size=3>You are a cultist of <span class='danger'><font size=3>Nar-Sie</font></span>!</font><br>
|
||||||
|
I, the Geometer of Blood want you to thin the veil between reality and his realm<br>
|
||||||
|
so I can pull this place onto my plane of existence.<br>
|
||||||
|
You've managed to get a job here, and the time has come to put our plan into motion.<br>
|
||||||
|
However the veil is currently so thick that I can barely bestow any power to you.<br>
|
||||||
|
Other cultists made their way into the crew. Talk to them. <span class='danger'>Self Other Technology</span>!<br>
|
||||||
|
Meet up with them. Raise an altar in my name. <span class='danger'>Blood Technology Join</span>!<br>
|
||||||
|
</span>"})
|
||||||
|
|
||||||
|
/datum/role/cultist/RoleTopic(href, href_list)
|
||||||
|
|
||||||
|
if(!ismob(usr))
|
||||||
|
return
|
||||||
|
|
||||||
|
/mob/living/carbon/proc/muted()
|
||||||
|
return (iscultist(src) && reagents && reagents.has_reagent(HOLYWATER))
|
||||||
@@ -384,11 +384,11 @@
|
|||||||
AppendObjective(/datum/objective/hijack)
|
AppendObjective(/datum/objective/hijack)
|
||||||
return
|
return
|
||||||
|
|
||||||
/datum/role/cult/narsie
|
/datum/role/bloodcult
|
||||||
name = "cultist of Nar-Sie"
|
name = "cultist of Nar-Sie"
|
||||||
special_role = "cultist of Nar-Sie"
|
special_role = "cultist of Nar-Sie"
|
||||||
|
|
||||||
/datum/role/cult/narsie/AdminPanelEntry()
|
/datum/role/bloodcult/AdminPanelEntry()
|
||||||
var/list/dat = ..()
|
var/list/dat = ..()
|
||||||
dat += "<a href='?_src_=holder;cult_privatespeak=\ref[antag.current]'>Send message from Nar-Sie.</a>"
|
dat += "<a href='?_src_=holder;cult_privatespeak=\ref[antag.current]'>Send message from Nar-Sie.</a>"
|
||||||
return dat
|
return dat
|
||||||
|
|||||||
@@ -724,12 +724,12 @@
|
|||||||
H.equip_or_collect(new /obj/item/clothing/head/syndicatefake(H), slot_head)
|
H.equip_or_collect(new /obj/item/clothing/head/syndicatefake(H), slot_head)
|
||||||
|
|
||||||
/datum/religion/cult
|
/datum/religion/cult
|
||||||
name = "The Cult of Nar'Sie"
|
name = "The Cult of Nar-Sie"
|
||||||
deity_name = "Nar'Sie"
|
deity_name = "Nar-Sie"
|
||||||
bible_name = "The Arcane Tome"
|
bible_name = "The Arcane Tome"
|
||||||
male_adept = "Cultist"
|
male_adept = "Cultist"
|
||||||
female_adept = "Cultist"
|
female_adept = "Cultist"
|
||||||
keys = list("cult", "narsie", "nar'sie", "narnar")
|
keys = list("cult", "narsie", "nar'sie", "narnar", "nar-sie")
|
||||||
|
|
||||||
/datum/religion/changeling
|
/datum/religion/changeling
|
||||||
name = "The Religion" // A la "The Thing"
|
name = "The Religion" // A la "The Thing"
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ var/global/list/narsie_list = list()
|
|||||||
if(emergency_shuttle.endtime > world.timeofday + 1800 && emergency_shuttle.location != 1 && !emergency_shuttle.departed)
|
if(emergency_shuttle.endtime > world.timeofday + 1800 && emergency_shuttle.location != 1 && !emergency_shuttle.departed)
|
||||||
emergency_shuttle.settimeleft(180)
|
emergency_shuttle.settimeleft(180)
|
||||||
|
|
||||||
if(narnar)
|
//if(narnar)
|
||||||
SetUniversalState(/datum/universal_state/hell)
|
//SetUniversalState(/datum/universal_state/hell)
|
||||||
narsie_cometh = 1
|
narsie_cometh = 1
|
||||||
|
|
||||||
/* //For animating narsie manually, doesn't work well
|
/* //For animating narsie manually, doesn't work well
|
||||||
@@ -313,7 +313,7 @@ var/global/list/narsie_list = list()
|
|||||||
|
|
||||||
/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
|
/obj/machinery/singularity/narsie/proc/pickcultist() //Narsie rewards his cultists with being devoured first, then picks a ghost to follow. --NEO
|
||||||
var/list/cultists = list()
|
var/list/cultists = list()
|
||||||
var/datum/faction/cult = find_active_faction(CULT_NARSIE)
|
var/datum/faction/cult = find_active_faction(BLOODCULT)
|
||||||
for(var/datum/mind/cult_nh_mind in cult.members)
|
for(var/datum/mind/cult_nh_mind in cult.members)
|
||||||
if(!cult_nh_mind.current)
|
if(!cult_nh_mind.current)
|
||||||
continue
|
continue
|
||||||
|
|||||||
@@ -45,35 +45,6 @@ var/global/list/rune_list = list() // HOLY FUCK WHY ARE WE LOOPING THROUGH THE W
|
|||||||
var/summoning = 0
|
var/summoning = 0
|
||||||
var/list/summonturfs = list()
|
var/list/summonturfs = list()
|
||||||
|
|
||||||
// Places these combos are mentioned: this file - twice in the rune code, once in imbued tome, once in tome's HTML runes.dm - in the imbue rune code. If you change a combination - dont forget to change it everywhere.
|
|
||||||
|
|
||||||
// travel self [word] - Teleport to random [rune with word destination matching]
|
|
||||||
// travel other [word] - Portal to rune with word destination matching - kinda doesnt work. At least the icon. No idea why.
|
|
||||||
// see blood Hell - Create a new tome
|
|
||||||
// join blood self - Incorporate person over the rune into the group
|
|
||||||
// Hell join self - Summon TERROR
|
|
||||||
// destroy see technology - EMP rune
|
|
||||||
// travel blood self - Drain blood
|
|
||||||
// see Hell join - See invisible
|
|
||||||
// blood join Hell - Raise dead
|
|
||||||
|
|
||||||
// hide see blood - Hide nearby runes
|
|
||||||
// blood see hide - Reveal nearby runes - The point of this rune is that its reversed obscure rune. So you always know the words to reveal the rune once oyu have obscured it.
|
|
||||||
|
|
||||||
// Hell travel self - Leave your body and ghost around
|
|
||||||
// blood see travel - Manifest a ghost into a mortal body
|
|
||||||
// Hell tech join - Imbue a rune into a talisman
|
|
||||||
// Hell blood join - Sacrifice rune
|
|
||||||
// destroy travel self - Wall rune
|
|
||||||
// join other self - Summon cultist rune
|
|
||||||
// travel technology other - Freeing rune // other blood travel was freedom join other
|
|
||||||
|
|
||||||
// hide other see - Deafening rune // was destroy see hear
|
|
||||||
// destroy see other - Blinding rune
|
|
||||||
// destroy see blood - BLOOD BOIL
|
|
||||||
|
|
||||||
// self other technology - Communication rune //was other hear blood
|
|
||||||
// join hide technology - stun rune. Rune color: bright pink.
|
|
||||||
/obj/effect/rune/New()
|
/obj/effect/rune/New()
|
||||||
..()
|
..()
|
||||||
blood_image = image(loc = src)
|
blood_image = image(loc = src)
|
||||||
@@ -512,6 +483,7 @@ var/global/list/rune_list = list() // HOLY FUCK WHY ARE WE LOOPING THROUGH THE W
|
|||||||
R.check_icon(H)
|
R.check_icon(H)
|
||||||
R.blood_DNA = list()
|
R.blood_DNA = list()
|
||||||
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||||
|
R.blood_color = H.species.blood_color
|
||||||
return
|
return
|
||||||
else
|
else
|
||||||
to_chat(user, "The book seems full of illegible scribbles. Is this a joke?")
|
to_chat(user, "The book seems full of illegible scribbles. Is this a joke?")
|
||||||
@@ -555,6 +527,7 @@ var/global/list/rune_list = list() // HOLY FUCK WHY ARE WE LOOPING THROUGH THE W
|
|||||||
var/mob/living/carbon/human/H = user
|
var/mob/living/carbon/human/H = user
|
||||||
R.blood_DNA = list()
|
R.blood_DNA = list()
|
||||||
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
|
||||||
|
R.blood_color = H.species.blood_color
|
||||||
switch(r)
|
switch(r)
|
||||||
if("teleport")
|
if("teleport")
|
||||||
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")
|
||||||
|
|||||||
@@ -315,7 +315,7 @@
|
|||||||
return
|
return
|
||||||
|
|
||||||
var/mob/living/T = target
|
var/mob/living/T = target
|
||||||
for(var/datum/faction/cult/C in ticker.mode.factions)
|
for(var/datum/faction/bloodcult/C in ticker.mode.factions)
|
||||||
if(C.is_sacrifice_target(T.mind))
|
if(C.is_sacrifice_target(T.mind))
|
||||||
to_chat(U, "<span class='warning'>The soul stone is unable to rip this soul. Such a powerful soul, it must be coveted by some powerful being.</span>")
|
to_chat(U, "<span class='warning'>The soul stone is unable to rip this soul. Such a powerful soul, it must be coveted by some powerful being.</span>")
|
||||||
return
|
return
|
||||||
@@ -375,7 +375,7 @@
|
|||||||
Z.cancel_camera()
|
Z.cancel_camera()
|
||||||
deleteafter = 1
|
deleteafter = 1
|
||||||
if(iscultist(U))
|
if(iscultist(U))
|
||||||
var/datum/faction/cult/cult_round = find_active_faction(CULT_NARSIE)
|
var/datum/faction/bloodcult/cult_round = find_active_faction(BLOODCULT)
|
||||||
if(cult_round)
|
if(cult_round)
|
||||||
cult_round.HandleRecruitedMind(Z.mind)
|
cult_round.HandleRecruitedMind(Z.mind)
|
||||||
|
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
dat += "<TT><B>Acula-class Blood Donation Bot v1.0</B></TT><BR><BR>"
|
dat += "<TT><B>Acula-class Blood Donation Bot v1.0</B></TT><BR><BR>"
|
||||||
if(ishuman(user))
|
if(ishuman(user))
|
||||||
var/mob/living/carbon/human/H = user
|
var/mob/living/carbon/human/H = user
|
||||||
var/datum/reagent/blood/B = H.get_blood(H.vessel)
|
var/datum/reagent/blood/B = get_blood(H.vessel)
|
||||||
if(B && B.data && B.data["virus2"])
|
if(B && B.data && B.data["virus2"])
|
||||||
dat += "WARNING: Viral agent detected. Ineligible for blood donation.<BR>"
|
dat += "WARNING: Viral agent detected. Ineligible for blood donation.<BR>"
|
||||||
else if(!B)
|
else if(!B)
|
||||||
@@ -219,7 +219,7 @@
|
|||||||
return
|
return
|
||||||
//look for our last used bag and see if it's still valid.
|
//look for our last used bag and see if it's still valid.
|
||||||
var/obj/item/weapon/reagent_containers/blood/B = null
|
var/obj/item/weapon/reagent_containers/blood/B = null
|
||||||
var/datum/reagent/blood/target_blood = H.get_blood(H.vessel)
|
var/datum/reagent/blood/target_blood = get_blood(H.vessel)
|
||||||
if(last_bag && !last_bag.reagents.is_full() && last_bag.blood_type == target_blood.data["blood_type"])
|
if(last_bag && !last_bag.reagents.is_full() && last_bag.blood_type == target_blood.data["blood_type"])
|
||||||
B = last_bag
|
B = last_bag
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -1,51 +1,8 @@
|
|||||||
|
|
||||||
var/list/word_to_uristrune_table = null
|
|
||||||
|
|
||||||
/proc/word_to_uristrune_bit(word)
|
|
||||||
if(word_to_uristrune_table == null)
|
|
||||||
word_to_uristrune_table = list()
|
|
||||||
|
|
||||||
var/bit = 1
|
|
||||||
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "mgar", "balaq", "karazet", "geeri")
|
|
||||||
|
|
||||||
while(length(words))
|
|
||||||
var/w = pick(words)
|
|
||||||
|
|
||||||
word_to_uristrune_table[w] = bit
|
|
||||||
|
|
||||||
words -= w
|
|
||||||
bit <<= 1
|
|
||||||
|
|
||||||
return word_to_uristrune_table[word]
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/obj/effect/rune/proc/get_uristrune_cult(word1, word2, word3,var/mob/living/M = null)
|
/obj/effect/rune/proc/get_uristrune_cult(word1, word2, word3,var/mob/living/M = null)
|
||||||
var/animated
|
var/animated
|
||||||
|
|
||||||
if((word1 == cultwords["travel"] && word2 == cultwords["self"]) \
|
if(get_uristrune_name(word1, word2, word3))
|
||||||
|| (word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"]) \
|
|
||||||
|| (word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"]) \
|
|
||||||
|| (word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"]) \
|
|
||||||
|| (word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"]) \
|
|
||||||
|| (word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"]) \
|
|
||||||
|| (word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"]) \
|
|
||||||
|| (word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"]) \
|
|
||||||
|| (word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"]) \
|
|
||||||
|| (word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"]) \
|
|
||||||
|| (word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"]) \
|
|
||||||
|| (word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"]) \
|
|
||||||
|| (word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"]) \
|
|
||||||
|| (word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"]) \
|
|
||||||
|| (word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"]) \
|
|
||||||
|| (word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"]) \
|
|
||||||
|| (word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"]) \
|
|
||||||
|| (word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"]) \
|
|
||||||
|| (word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"]) \
|
|
||||||
|| (word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"]) \
|
|
||||||
|| (word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"]) \
|
|
||||||
|| (word1 == cultwords["travel"] && word2 == cultwords["other"]) \
|
|
||||||
|| (word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"]) )
|
|
||||||
animated = 1
|
animated = 1
|
||||||
else
|
else
|
||||||
animated = 0
|
animated = 0
|
||||||
@@ -60,55 +17,7 @@ var/list/word_to_uristrune_table = null
|
|||||||
else
|
else
|
||||||
return get_uristrune(bits, animated)
|
return get_uristrune(bits, animated)
|
||||||
|
|
||||||
/proc/get_uristrune_name(word1, word2, word3)
|
|
||||||
if((word1 == cultwords["travel"] && word2 == cultwords["self"]))
|
|
||||||
return "Travel Self"
|
|
||||||
else if((word1 == cultwords["join"] && word2 == cultwords["blood"] && word3 == cultwords["self"]))
|
|
||||||
return "Convert"
|
|
||||||
else if((word1 == cultwords["hell"] && word2 == cultwords["join"] && word3 == cultwords["self"]))
|
|
||||||
return "Tear Reality"
|
|
||||||
else if((word1 == cultwords["see"] && word2 == cultwords["blood"] && word3 == cultwords["hell"]))
|
|
||||||
return "Summon Tome"
|
|
||||||
else if((word1 == cultwords["hell"] && word2 == cultwords["destroy"] && word3 == cultwords["other"]))
|
|
||||||
return "Armor"
|
|
||||||
else if((word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["technology"]))
|
|
||||||
return "EMP"
|
|
||||||
else if((word1 == cultwords["travel"] && word2 == cultwords["blood"] && word3 == cultwords["self"]))
|
|
||||||
return "Drain"
|
|
||||||
else if((word1 == cultwords["see"] && word2 == cultwords["hell"] && word3 == cultwords["join"]))
|
|
||||||
return "See Invisible"
|
|
||||||
else if((word1 == cultwords["blood"] && word2 == cultwords["join"] && word3 == cultwords["hell"]))
|
|
||||||
return "Raise Dead"
|
|
||||||
else if((word1 == cultwords["hide"] && word2 == cultwords["see"] && word3 == cultwords["blood"]))
|
|
||||||
return "Hide Runes"
|
|
||||||
else if((word1 == cultwords["hell"] && word2 == cultwords["travel"] && word3 == cultwords["self"]))
|
|
||||||
return "Astral Journey"
|
|
||||||
else if((word1 == cultwords["hell"] && word2 == cultwords["technology"] && word3 == cultwords["join"]))
|
|
||||||
return "Imbue Talisman"
|
|
||||||
else if((word1 == cultwords["hell"] && word2 == cultwords["blood"] && word3 == cultwords["join"]))
|
|
||||||
return "Sacrifice"
|
|
||||||
else if((word1 == cultwords["blood"] && word2 == cultwords["see"] && word3 == cultwords["hide"]))
|
|
||||||
return "Reveal Runes"
|
|
||||||
else if((word1 == cultwords["destroy"] && word2 == cultwords["travel"] && word3 == cultwords["self"]))
|
|
||||||
return "Wall"
|
|
||||||
else if((word1 == cultwords["travel"] && word2 == cultwords["technology"] && word3 == cultwords["other"]))
|
|
||||||
return "Free Cultist"
|
|
||||||
else if((word1 == cultwords["join"] && word2 == cultwords["other"] && word3 == cultwords["self"]))
|
|
||||||
return "Summon Cultist"
|
|
||||||
else if((word1 == cultwords["hide"] && word2 == cultwords["other"] && word3 == cultwords["see"]))
|
|
||||||
return "Deafen"
|
|
||||||
else if((word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["other"]))
|
|
||||||
return "Blind"
|
|
||||||
else if((word1 == cultwords["destroy"] && word2 == cultwords["see"] && word3 == cultwords["blood"]))
|
|
||||||
return "Blood Boil"
|
|
||||||
else if((word1 == cultwords["self"] && word2 == cultwords["other"] && word3 == cultwords["technology"]))
|
|
||||||
return "Communicate"
|
|
||||||
else if((word1 == cultwords["travel"] && word2 == cultwords["other"]))
|
|
||||||
return "Travel Other"
|
|
||||||
else if((word1 == cultwords["join"] && word2 == cultwords["hide"] && word3 == cultwords["technology"]))
|
|
||||||
return "Stun"
|
|
||||||
else
|
|
||||||
return null
|
|
||||||
|
|
||||||
var/list/uristrune_cache = list()
|
var/list/uristrune_cache = list()
|
||||||
|
|
||||||
|
|||||||
@@ -35,7 +35,7 @@
|
|||||||
D.holder = null
|
D.holder = null
|
||||||
|
|
||||||
if(counts_as_blood)
|
if(counts_as_blood)
|
||||||
var/datum/faction/cult/narsie/blood_cult = find_active_faction(CULT_NARSIE)
|
var/datum/faction/bloodcult/blood_cult = find_active_faction(BLOODCULT)
|
||||||
if(blood_cult)
|
if(blood_cult)
|
||||||
var/turf/T = get_turf(src)
|
var/turf/T = get_turf(src)
|
||||||
if(T && (T.z == map.zMainStation))
|
if(T && (T.z == map.zMainStation))
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
if(counts_as_blood)
|
if(counts_as_blood)
|
||||||
var/datum/faction/cult/narsie/blood_cult = find_active_faction(CULT_NARSIE)
|
var/datum/faction/bloodcult/blood_cult = find_active_faction(BLOODCULT)
|
||||||
if(blood_cult)
|
if(blood_cult)
|
||||||
var/turf/T = get_turf(src)
|
var/turf/T = get_turf(src)
|
||||||
if(T && (T.z == map.zMainStation))//F I V E T I L E S
|
if(T && (T.z == map.zMainStation))//F I V E T I L E S
|
||||||
|
|||||||
@@ -67,7 +67,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
..() //Whack their shit regardless. It's an obsidian rod, it breaks skulls
|
..() //Whack their shit regardless. It's an obsidian rod, it breaks skulls
|
||||||
|
/*
|
||||||
/obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob, prox_flag, params)
|
/obj/item/weapon/nullrod/afterattack(atom/A, mob/user as mob, prox_flag, params)
|
||||||
if(!prox_flag)
|
if(!prox_flag)
|
||||||
return
|
return
|
||||||
@@ -75,7 +75,7 @@
|
|||||||
if(istype(A, /turf/simulated/floor))
|
if(istype(A, /turf/simulated/floor))
|
||||||
to_chat(user, "<span class='notice'>You hit the floor with the [src].</span>")
|
to_chat(user, "<span class='notice'>You hit the floor with the [src].</span>")
|
||||||
call(/obj/effect/rune/proc/revealrunes)(src)
|
call(/obj/effect/rune/proc/revealrunes)(src)
|
||||||
|
*/
|
||||||
/obj/item/weapon/nullrod/pickup(mob/living/user as mob)
|
/obj/item/weapon/nullrod/pickup(mob/living/user as mob)
|
||||||
if(user.mind)
|
if(user.mind)
|
||||||
if(user.mind.assigned_role == "Chaplain")
|
if(user.mind.assigned_role == "Chaplain")
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
user.IgniteMob()
|
user.IgniteMob()
|
||||||
user.emote("scream",,, 1)
|
user.emote("scream",,, 1)
|
||||||
V.smitecounter += 50 //Once we are extinguished, we will be quite vulnerable regardless
|
V.smitecounter += 50 //Once we are extinguished, we will be quite vulnerable regardless
|
||||||
else if(iscult(user)) //Cultist trying to use it
|
else if(iscultist(user)) //Cultist trying to use it
|
||||||
to_chat(user, "<span class='danger'>[my_rel.deity_name] channels through \the [src] and sets you ablaze for your blasphemy!</span>")
|
to_chat(user, "<span class='danger'>[my_rel.deity_name] channels through \the [src] and sets you ablaze for your blasphemy!</span>")
|
||||||
user.fire_stacks += 5
|
user.fire_stacks += 5
|
||||||
user.IgniteMob()
|
user.IgniteMob()
|
||||||
@@ -114,19 +114,9 @@
|
|||||||
V.nullified = max(5, V.nullified + 2)
|
V.nullified = max(5, V.nullified + 2)
|
||||||
V.smitecounter += 10 //Better get out of here quickly before the problem shows. Ten hits and you are literal toast
|
V.smitecounter += 10 //Better get out of here quickly before the problem shows. Ten hits and you are literal toast
|
||||||
return 1 //Don't heal the mob
|
return 1 //Don't heal the mob
|
||||||
|
|
||||||
if(iscult(H) && isChaplain(user)) //The user is a Cultist. We are thus deconverting him
|
|
||||||
if(prob(20))
|
|
||||||
to_chat(H, "<span class='notice'>The power of [my_rel.deity_name] suddenly clears your mind of heresy. Your allegiance to Nar'Sie wanes!</span>")
|
|
||||||
to_chat(user, "<span class='notice'>You see [H]'s eyes become clear. Nar'Sie no longer controls his mind, [my_rel.deity_name] saved \him!</span>")
|
|
||||||
add_attacklogs(user, H, "de-converted from the Cult of Nar'Sie!")
|
|
||||||
ticker.mode.remove_cultist(H.mind) // TODO rolefix
|
|
||||||
else //We aren't deconverting him this time, give the Cultist a fair warning
|
|
||||||
to_chat(H, "<span class='warning'>The power of [my_rel.deity_name] is overwhelming you. Your mind feverishly questions Nar'Sie's teachings!</span>")
|
|
||||||
return 1 //Don't heal the mob
|
|
||||||
var/datum/role/thrall/T = isthrall(H)
|
var/datum/role/thrall/T = isthrall(H)
|
||||||
if(T && isChaplain(user))
|
if(T && isChaplain(user))
|
||||||
ticker.mode.remove_thrall(H.mind) // TODO rolefix
|
//ticker.mode.remove_thrall(H.mind) // TODO rolefix
|
||||||
H.visible_message("<span class='big danger'>[H] suddenly becomes calm and collected again, \his eyes clear up.</span>",
|
H.visible_message("<span class='big danger'>[H] suddenly becomes calm and collected again, \his eyes clear up.</span>",
|
||||||
"<span class='big notice'>Your blood cools down and you are inhabited by a sensation of untold calmness.</span>")
|
"<span class='big notice'>Your blood cools down and you are inhabited by a sensation of untold calmness.</span>")
|
||||||
return 1 //That's it, game over
|
return 1 //That's it, game over
|
||||||
@@ -172,13 +162,12 @@
|
|||||||
if(ishuman(user)) //We are checking for antagonists, only humans can be antagonists
|
if(ishuman(user)) //We are checking for antagonists, only humans can be antagonists
|
||||||
var/mob/living/carbon/human/H = user
|
var/mob/living/carbon/human/H = user
|
||||||
var/datum/role/vampire/V = isvampire(H)
|
var/datum/role/vampire/V = isvampire(H)
|
||||||
var/datum/role/cult/C = iscult(H)
|
var/datum/role/cultist/C = iscultist(H)
|
||||||
if(V && (!(VAMP_UNDYING in V.powers))) //We are a Vampire, we aren't very smart
|
if(V && (!(VAMP_UNDYING in V.powers))) //We are a Vampire, we aren't very smart
|
||||||
to_chat(H, "<span class ='danger'>[my_rel.deity_name]'s power channels through \the [src]. You feel extremely uneasy as you grab it!</span>")
|
to_chat(H, "<span class ='danger'>[my_rel.deity_name]'s power channels through \the [src]. You feel extremely uneasy as you grab it!</span>")
|
||||||
V.smitecounter += 10
|
V.smitecounter += 10
|
||||||
if(C) //We are a Cultist, we aren't very smart either, but at least there will be no consequences for us
|
if(C) //We are a Cultist, we aren't very smart either, but at least there will be no consequences for us
|
||||||
var/datum/faction/cult/cult = find_active_faction_by_member(C)
|
to_chat(H, "<span class ='danger'>[my_rel.deity_name]'s power channels through \the [src]. You feel uneasy as you grab it, but Nar-Sie protects you from its influence!</span>")
|
||||||
to_chat(H, "<span class ='danger'>[my_rel.deity_name]'s power channels through \the [src]. You feel uneasy as you grab it, but [cult.deity_name] protects you from its influence!</span>")
|
|
||||||
|
|
||||||
/obj/item/weapon/storage/bible/proc/isReligiousLeader(var/mob/living/user)
|
/obj/item/weapon/storage/bible/proc/isReligiousLeader(var/mob/living/user)
|
||||||
return (user.mind && user.mind == my_rel.religiousLeader)
|
return (user.mind && user.mind == my_rel.religiousLeader)
|
||||||
|
|||||||
@@ -51,7 +51,6 @@ var/list/admin_verbs_admin = list(
|
|||||||
/client/proc/cmd_admin_local_narrate, /*send text locally to all players in view, similar to direct narrate*/
|
/client/proc/cmd_admin_local_narrate, /*send text locally to all players in view, similar to direct narrate*/
|
||||||
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
|
/client/proc/cmd_admin_world_narrate, /*sends text to all players with no padding*/
|
||||||
/client/proc/cmd_admin_create_centcom_report,
|
/client/proc/cmd_admin_create_centcom_report,
|
||||||
/client/proc/check_words, /*displays cult-words*/
|
|
||||||
/client/proc/check_ai_laws, /*shows AI and borg laws*/
|
/client/proc/check_ai_laws, /*shows AI and borg laws*/
|
||||||
/client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
|
/client/proc/admin_memo, /*admin memo system. show/delete/write. +SERVER needed to delete admin memos of others*/
|
||||||
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
|
/client/proc/dsay, /*talk in deadchat using our ckey/fakekey*/
|
||||||
@@ -227,7 +226,6 @@ var/list/admin_verbs_hideable = list(
|
|||||||
/client/proc/admin_cancel_shuttle,
|
/client/proc/admin_cancel_shuttle,
|
||||||
/client/proc/cmd_admin_direct_narrate,
|
/client/proc/cmd_admin_direct_narrate,
|
||||||
/client/proc/cmd_admin_world_narrate,
|
/client/proc/cmd_admin_world_narrate,
|
||||||
/client/proc/check_words,
|
|
||||||
/client/proc/play_local_sound,
|
/client/proc/play_local_sound,
|
||||||
/client/proc/play_sound,
|
/client/proc/play_sound,
|
||||||
/client/proc/object_talk,
|
/client/proc/object_talk,
|
||||||
|
|||||||
@@ -1192,7 +1192,7 @@ client/proc/check_convertables()
|
|||||||
set category = "Debug"
|
set category = "Debug"
|
||||||
if(!holder || !ticker || !ticker.mode)
|
if(!holder || !ticker || !ticker.mode)
|
||||||
return
|
return
|
||||||
var/datum/faction/cult = find_active_faction(CULT)
|
var/datum/faction/cult = find_active_faction(BLOODCULT)
|
||||||
var/dat = ""
|
var/dat = ""
|
||||||
for(var/mob/M in player_list)
|
for(var/mob/M in player_list)
|
||||||
if(!M.mind)
|
if(!M.mind)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
var/datum/role/vampire/V = isvampire(H)
|
var/datum/role/vampire/V = isvampire(H)
|
||||||
if(!V) //They are not already a vampire
|
if(!V) //They are not already a vampire
|
||||||
to_chat(H, "<span class='danger'>The mask's stone spikes pierce your skull and enter your brain!</span>")
|
to_chat(H, "<span class='danger'>The mask's stone spikes pierce your skull and enter your brain!</span>")
|
||||||
M.make_new_vampire() // TODO rolefix
|
//M.make_new_vampire() // TODO rolefix
|
||||||
log_admin("[H] has become a vampire using a stone mask.")
|
log_admin("[H] has become a vampire using a stone mask.")
|
||||||
spawn(10) //Unlocking their abilities produces a lot of text, I want to give them a chance to see that they have objectives
|
spawn(10) //Unlocking their abilities produces a lot of text, I want to give them a chance to see that they have objectives
|
||||||
V.blood_total = blood_to_give
|
V.blood_total = blood_to_give
|
||||||
|
|||||||
@@ -332,8 +332,8 @@
|
|||||||
to_chat(user, "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>")
|
to_chat(user, "<span class='notice'>You carve out the pages from [title]! You didn't want to read it anyway.</span>")
|
||||||
carved = 1
|
carved = 1
|
||||||
return
|
return
|
||||||
|
/*
|
||||||
else if(istype(W, /obj/item/weapon/paper/talisman))
|
else if(istype(W, /obj/item/weapon/paper/talisman))// TODO rolefix
|
||||||
var/obj/item/weapon/paper/talisman/talisman = W
|
var/obj/item/weapon/paper/talisman/talisman = W
|
||||||
if(runestun)
|
if(runestun)
|
||||||
to_chat(user, "<span class='notice'>There is already a talisman between the pages.</span>")
|
to_chat(user, "<span class='notice'>There is already a talisman between the pages.</span>")
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
to_chat(user, "<span class='notice'>You slide the talisman between the pages.</span>")
|
to_chat(user, "<span class='notice'>You slide the talisman between the pages.</span>")
|
||||||
qdel(talisman)
|
qdel(talisman)
|
||||||
runestun = 1
|
runestun = 1
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -408,9 +408,6 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
if(!(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"])) //astral journeying rune
|
if(!(R && R.word1 == cultwords["hell"] && R.word2 == cultwords["travel"] && R.word3 == cultwords["self"])) //astral journeying rune
|
||||||
to_chat(usr, "<span class='warning'>The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.</span>")
|
to_chat(usr, "<span class='warning'>The astral cord that ties your body and your spirit has been severed. You are likely to wander the realm beyond until your body is finally dead and thus reunited with you.</span>")
|
||||||
return
|
return
|
||||||
if(mind && mind.current && mind.current.ajourn)
|
|
||||||
mind.current.ajourn.ajourn = null
|
|
||||||
mind.current.ajourn = null
|
|
||||||
completely_untransmogrify()
|
completely_untransmogrify()
|
||||||
mind.current.key = key
|
mind.current.key = key
|
||||||
mind.isScrying = 0
|
mind.isScrying = 0
|
||||||
@@ -502,7 +499,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
var/list/L = list()
|
var/list/L = list()
|
||||||
var/holyblock = 0
|
var/holyblock = 0
|
||||||
|
|
||||||
if((usr.invisibility == 0) || iscult(usr))
|
if((usr.invisibility == 0) || iscultist(usr))
|
||||||
for(var/turf/T in get_area_turfs(thearea.type))
|
for(var/turf/T in get_area_turfs(thearea.type))
|
||||||
if(!T.holy)
|
if(!T.holy)
|
||||||
L+=T
|
L+=T
|
||||||
@@ -548,7 +545,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
if(targetarea && targetarea.anti_ethereal && !isAdminGhost(usr))
|
if(targetarea && targetarea.anti_ethereal && !isAdminGhost(usr))
|
||||||
to_chat(usr, "<span class='sinister'>You can sense a sinister force surrounding that mob, your spooky body itself refuses to follow it.</span>")
|
to_chat(usr, "<span class='sinister'>You can sense a sinister force surrounding that mob, your spooky body itself refuses to follow it.</span>")
|
||||||
return
|
return
|
||||||
if(targetloc && targetloc.holy && (!invisibility || iscult(src)))
|
if(targetloc && targetloc.holy && (!invisibility || iscultist(src)))
|
||||||
to_chat(usr, "<span class='warning'>You cannot follow a mob standing on holy grounds!</span>")
|
to_chat(usr, "<span class='warning'>You cannot follow a mob standing on holy grounds!</span>")
|
||||||
return
|
return
|
||||||
if(target != src)
|
if(target != src)
|
||||||
@@ -590,7 +587,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
if(targetarea && targetarea.anti_ethereal && !isAdminGhost(usr))
|
if(targetarea && targetarea.anti_ethereal && !isAdminGhost(usr))
|
||||||
to_chat(usr, "<span class='sinister'>You can sense a sinister force surrounding that mob, your spooky body itself refuses to jump to it.</span>")
|
to_chat(usr, "<span class='sinister'>You can sense a sinister force surrounding that mob, your spooky body itself refuses to jump to it.</span>")
|
||||||
return
|
return
|
||||||
if(targetloc && targetloc.holy && ((src.invisibility == 0) || iscult(src)))
|
if(targetloc && targetloc.holy && ((src.invisibility == 0) || iscultist(src)))
|
||||||
to_chat(usr, "<span class='warning'>The mob that you are trying to follow is standing on holy grounds, you cannot reach him!</span>")
|
to_chat(usr, "<span class='warning'>The mob that you are trying to follow is standing on holy grounds, you cannot reach him!</span>")
|
||||||
return
|
return
|
||||||
var/mob/M = dest[target] //Destination mob
|
var/mob/M = dest[target] //Destination mob
|
||||||
@@ -757,7 +754,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
|||||||
return 0 //something is terribly wrong
|
return 0 //something is terribly wrong
|
||||||
|
|
||||||
var/ghosts_can_write
|
var/ghosts_can_write
|
||||||
var/datum/faction/C = find_active_faction(CULT_NARSIE)
|
var/datum/faction/C = find_active_faction(BLOODCULT)
|
||||||
if(C && C.members.len > config.cult_ghostwriter_req_cultists)
|
if(C && C.members.len > config.cult_ghostwriter_req_cultists)
|
||||||
ghosts_can_write = 1
|
ghosts_can_write = 1
|
||||||
|
|
||||||
|
|||||||
@@ -44,9 +44,9 @@
|
|||||||
|
|
||||||
/mob/living/carbon/human/Destroy()
|
/mob/living/carbon/human/Destroy()
|
||||||
if(mind && species && (species.name == "Manifested"))
|
if(mind && species && (species.name == "Manifested"))
|
||||||
var/datum/role/cult = mind.GetRole(CULTIST)
|
var/datum/role/cultist = mind.GetRole(CULTIST)
|
||||||
if(cult)//manifested ghosts are removed from the cult once their bodies are destroyed
|
if(cultist)//manifested ghosts are removed from the cult once their bodies are destroyed
|
||||||
cult.RemoveFromRole(mind)
|
cultist.RemoveFromRole(mind)
|
||||||
|
|
||||||
if(species)
|
if(species)
|
||||||
qdel(species)
|
qdel(species)
|
||||||
|
|||||||
@@ -722,7 +722,7 @@
|
|||||||
|
|
||||||
var/obj/item/weapon/storage/bible/B = locate(/obj/item/weapon/storage/bible) in src.loc
|
var/obj/item/weapon/storage/bible/B = locate(/obj/item/weapon/storage/bible) in src.loc
|
||||||
if(B)
|
if(B)
|
||||||
if(iscult(src))
|
if(iscultist(src))
|
||||||
to_chat(src, "<span class='sinister'>Nar-Sie shields you from [B.my_rel.deity_name]'s wrath!</span>")
|
to_chat(src, "<span class='sinister'>Nar-Sie shields you from [B.my_rel.deity_name]'s wrath!</span>")
|
||||||
else
|
else
|
||||||
if(istype(src.head, /obj/item/clothing/head/fedora))
|
if(istype(src.head, /obj/item/clothing/head/fedora))
|
||||||
|
|||||||
@@ -46,6 +46,10 @@
|
|||||||
temp_message[H] = "HONK"
|
temp_message[H] = "HONK"
|
||||||
pick_list -= H //Make sure that you dont HONK the same word twice
|
pick_list -= H //Make sure that you dont HONK the same word twice
|
||||||
speech.message = jointext(temp_message, " ")
|
speech.message = jointext(temp_message, " ")
|
||||||
|
if(iscultist(src))
|
||||||
|
var/obj/effect/cult_ritual/cult_communication/comms = locate() in loc
|
||||||
|
if (comms && comms.caster == src)
|
||||||
|
speech.language = all_languages[LANGUAGE_CULT]
|
||||||
if(virus2.len)
|
if(virus2.len)
|
||||||
for(var/ID in virus2)
|
for(var/ID in virus2)
|
||||||
var/datum/disease2/disease/V = virus2[ID]
|
var/datum/disease2/disease/V = virus2[ID]
|
||||||
|
|||||||
@@ -160,9 +160,6 @@
|
|||||||
G.invisibility = 0
|
G.invisibility = 0
|
||||||
to_chat(G, "<span class='sinister'>You feel relieved as what's left of your soul finally escapes its prison of flesh.</span>")
|
to_chat(G, "<span class='sinister'>You feel relieved as what's left of your soul finally escapes its prison of flesh.</span>")
|
||||||
|
|
||||||
if(ticker.rune_controller)
|
|
||||||
ticker.rune_controller.harvested++
|
|
||||||
|
|
||||||
else
|
else
|
||||||
dust()
|
dust()
|
||||||
|
|
||||||
|
|||||||
@@ -423,7 +423,7 @@ var/list/department_radio_keys = list(
|
|||||||
|
|
||||||
if(setting == 0) //overridden for constructs
|
if(setting == 0) //overridden for constructs
|
||||||
return
|
return
|
||||||
var/datum/faction/cult = find_active_faction(CULT_NARSIE)
|
var/datum/faction/cult = find_active_faction(BLOODCULT)
|
||||||
if(setting == 1)
|
if(setting == 1)
|
||||||
if(mind in cult.members && universal_cult_chat == 1)
|
if(mind in cult.members && universal_cult_chat == 1)
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -42,8 +42,8 @@
|
|||||||
/mob/living/simple_animal/construct/construct_chat_check(setting)
|
/mob/living/simple_animal/construct/construct_chat_check(setting)
|
||||||
if(!mind)
|
if(!mind)
|
||||||
return
|
return
|
||||||
var/datum/faction/cult = find_active_faction(CULT_NARSIE)
|
var/datum/faction/bloodcult = find_active_faction(BLOODCULT)
|
||||||
if(mind in cult.members)
|
if(mind in bloodcult.members)
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/mob/living/simple_animal/construct/handle_inherent_channels(var/datum/speech/speech, var/message_mode)
|
/mob/living/simple_animal/construct/handle_inherent_channels(var/datum/speech/speech, var/message_mode)
|
||||||
|
|||||||
@@ -443,7 +443,7 @@
|
|||||||
if(A && A.anti_ethereal && !isAdminGhost(mob))
|
if(A && A.anti_ethereal && !isAdminGhost(mob))
|
||||||
to_chat(mob, "<span class='sinister'>A dark forcefield prevents you from entering the area.</span>")
|
to_chat(mob, "<span class='sinister'>A dark forcefield prevents you from entering the area.</span>")
|
||||||
else
|
else
|
||||||
var/datum/faction/cult = find_active_faction(CULT)
|
var/datum/faction/cult = find_active_faction(BLOODCULT)
|
||||||
if((T && T.holy) && isobserver(mob) && ((mob.invisibility == 0) || mob.mind in cult.members))
|
if((T && T.holy) && isobserver(mob) && ((mob.invisibility == 0) || mob.mind in cult.members))
|
||||||
to_chat(mob, "<span class='warning'>You cannot get past holy grounds while you are in this plane of existence!</span>")
|
to_chat(mob, "<span class='warning'>You cannot get past holy grounds while you are in this plane of existence!</span>")
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -286,7 +286,7 @@ var/const/BLOOD_VOLUME_SURVIVE = 122
|
|||||||
..()
|
..()
|
||||||
|
|
||||||
//Gets human's own blood.
|
//Gets human's own blood.
|
||||||
/mob/living/carbon/proc/get_blood(datum/reagents/container)
|
proc/get_blood(datum/reagents/container)
|
||||||
var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood
|
var/datum/reagent/blood/res = locate() in container.reagent_list //Grab some blood
|
||||||
if(res) // Make sure there's some blood at all
|
if(res) // Make sure there's some blood at all
|
||||||
if(res.data["donor"] != src) //If it's not theirs, then we look for theirs
|
if(res.data["donor"] != src) //If it's not theirs, then we look for theirs
|
||||||
@@ -326,7 +326,7 @@ proc/blood_splatter(var/target,var/datum/reagent/blood/source,var/large)
|
|||||||
|
|
||||||
if(istype(source,/mob/living/carbon/human))
|
if(istype(source,/mob/living/carbon/human))
|
||||||
var/mob/living/carbon/human/M = source
|
var/mob/living/carbon/human/M = source
|
||||||
var/datum/reagent/blood/is_there_blood = M.get_blood(M.vessel)
|
var/datum/reagent/blood/is_there_blood = get_blood(M.vessel)
|
||||||
if(!is_there_blood)
|
if(!is_there_blood)
|
||||||
return //If there is no blood in the mob's blood vessel, there's no reason to make any sort of splatter.
|
return //If there is no blood in the mob's blood vessel, there's no reason to make any sort of splatter.
|
||||||
|
|
||||||
|
|||||||
@@ -87,6 +87,7 @@
|
|||||||
..()
|
..()
|
||||||
if(amount)
|
if(amount)
|
||||||
to_chat(user, "<span class='info'>There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin.</span>")
|
to_chat(user, "<span class='info'>There " + (amount > 1 ? "are [amount] papers" : "is one paper") + " in the bin.</span>")
|
||||||
|
/*
|
||||||
if(papers.len > 0)
|
if(papers.len > 0)
|
||||||
var/obj/item/weapon/paper/P = papers[papers.len]
|
var/obj/item/weapon/paper/P = papers[papers.len]
|
||||||
if(istype(P,/obj/item/weapon/paper/talisman))
|
if(istype(P,/obj/item/weapon/paper/talisman))
|
||||||
@@ -121,6 +122,7 @@
|
|||||||
to_chat(user, "<span class='info'>The paper on top has some bloody markings on it.</span>")
|
to_chat(user, "<span class='info'>The paper on top has some bloody markings on it.</span>")
|
||||||
else if(P.info)
|
else if(P.info)
|
||||||
to_chat(user, "<span class='info'>You notice some writings on the top paper. <a HREF='?src=\ref[user];lookitem=\ref[P]'>Take a closer look.</a></span>")
|
to_chat(user, "<span class='info'>You notice some writings on the top paper. <a HREF='?src=\ref[user];lookitem=\ref[P]'>Take a closer look.</a></span>")
|
||||||
|
*/
|
||||||
else
|
else
|
||||||
to_chat(user, "<span class='info'>There are no papers in the bin.</span>")
|
to_chat(user, "<span class='info'>There are no papers in the bin.</span>")
|
||||||
|
|
||||||
|
|||||||
@@ -912,13 +912,16 @@
|
|||||||
|
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
if(iscult(H))
|
if (iscultist(H))
|
||||||
if(prob(10)) //1/10 chance of removing cultist status, so 50 units on average to uncult (half a holy water bottle)
|
H.Dizzy(6)
|
||||||
ticker.mode.remove_cultist(H.mind)
|
H.Jitter(12)
|
||||||
H.visible_message("<span class='notice'>[H] suddenly becomes calm and collected again, his eyes clear up.</span>",
|
if (prob(20))
|
||||||
"<span class='notice'>Your blood cools down and you are inhabited by a sensation of untold calmness.</span>")
|
H.Knockdown(1)
|
||||||
else //Warn the Cultist that it is fucking him up
|
else if (prob(30))
|
||||||
to_chat(H, "<span class='danger'>A freezing liquid permeates your bloodstream. Your arcane knowledge is becoming obscure again.</span>")
|
H.confused = 2
|
||||||
|
H.eye_blurry = max(H.eye_blurry, 3)
|
||||||
|
|
||||||
|
/*
|
||||||
//Vampires react to this like acid, and it massively spikes their smitecounter. And they are guaranteed to have adverse effects.
|
//Vampires react to this like acid, and it massively spikes their smitecounter. And they are guaranteed to have adverse effects.
|
||||||
var/datum/role/vampire/V = isvampire(H)
|
var/datum/role/vampire/V = isvampire(H)
|
||||||
if(V)
|
if(V)
|
||||||
@@ -933,15 +936,25 @@
|
|||||||
// ticker.mode.remove_thrall(H.mind)
|
// ticker.mode.remove_thrall(H.mind)
|
||||||
// H.visible_message("<span class='notice'>[H] suddenly becomes calm and collected again, \his eyes clear up.</span>",
|
// H.visible_message("<span class='notice'>[H] suddenly becomes calm and collected again, \his eyes clear up.</span>",
|
||||||
// "<span class='notice'>Your blood cools down and you are inhabited by a sensation of untold calmness.</span>")
|
// "<span class='notice'>Your blood cools down and you are inhabited by a sensation of untold calmness.</span>")
|
||||||
|
*/
|
||||||
|
|
||||||
/datum/reagent/holywater/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume)//Splashing people with water can help put them out!
|
/datum/reagent/holywater/reaction_mob(var/mob/living/M, var/method = TOUCH, var/volume)//Splashing people with water can help put them out!
|
||||||
|
|
||||||
if(..())
|
if(..())
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
//Vampires react to this like acid, and it massively spikes their smitecounter. And they are guaranteed to have adverse effects.
|
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
var/mob/living/carbon/human/H = M
|
var/mob/living/carbon/human/H = M
|
||||||
|
if (iscultist(H))
|
||||||
|
H.Dizzy(12)
|
||||||
|
H.Jitter(24)
|
||||||
|
H.Knockdown(3)
|
||||||
|
H.confused = 3
|
||||||
|
H.eye_blurry = max(H.eye_blurry, 6)
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
//Vampires react to this like acid, and it massively spikes their smitecounter. And they are guaranteed to have adverse effects.
|
||||||
var/datum/role/vampire/V = isvampire(H)
|
var/datum/role/vampire/V = isvampire(H)
|
||||||
if(V)
|
if(V)
|
||||||
if(!(VAMP_UNDYING in V.powers))
|
if(!(VAMP_UNDYING in V.powers))
|
||||||
@@ -981,7 +994,8 @@
|
|||||||
else
|
else
|
||||||
if(H.acidable())
|
if(H.acidable())
|
||||||
H.take_organ_damage(min(15, volume * 2))
|
H.take_organ_damage(min(15, volume * 2))
|
||||||
V.smitecounter += 5
|
H.mind.vampire.smitecounter += 5
|
||||||
|
*/
|
||||||
|
|
||||||
/datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume)
|
/datum/reagent/holywater/reaction_turf(var/turf/simulated/T, var/volume)
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
/spell/rune_write/choose_targets(mob/user = usr)
|
/spell/rune_write/choose_targets(mob/user = usr)
|
||||||
return list(user)
|
return list(user)
|
||||||
|
|
||||||
/spell/rune_write/cast(null, mob/user = usr)
|
/spell/rune_write/cast(null, mob/user = usr)/*
|
||||||
if(!cultwords["travel"])
|
if(!cultwords["travel"])
|
||||||
runerandom()
|
runerandom()
|
||||||
var/list/runes = list("Teleport", "Teleport Other", "Spawn a Tome", "Change Construct Type", "Convert", "EMP", "Drain Blood", "See Invisible", "Resurrect", "Hide Runes", "Reveal Runes", "Astral Journey", "Manifest a Ghost", "Imbue Talisman", "Sacrifice", "Wall", "Free Cultist", "Summon Cultist", "Deafen", "Blind", "BloodBoil", "Communicate", "Stun")
|
var/list/runes = list("Teleport", "Teleport Other", "Spawn a Tome", "Change Construct Type", "Convert", "EMP", "Drain Blood", "See Invisible", "Resurrect", "Hide Runes", "Reveal Runes", "Astral Journey", "Manifest a Ghost", "Imbue Talisman", "Sacrifice", "Wall", "Free Cultist", "Summon Cultist", "Deafen", "Blind", "BloodBoil", "Communicate", "Stun")
|
||||||
@@ -172,3 +172,4 @@
|
|||||||
else
|
else
|
||||||
to_chat(user, "<span class='warning'>You do not have enough space to write a proper rune.</span>")
|
to_chat(user, "<span class='warning'>You do not have enough space to write a proper rune.</span>")
|
||||||
return
|
return
|
||||||
|
*/
|
||||||
@@ -89,6 +89,7 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
|
|||||||
var/gradual_casting = FALSE //equals TRUE while a Sp_GRADUAL spell is actively being cast
|
var/gradual_casting = FALSE //equals TRUE while a Sp_GRADUAL spell is actively being cast
|
||||||
|
|
||||||
var/list/holiday_required = list() // The holiday this spell is restricted to ! Leave empty if none.
|
var/list/holiday_required = list() // The holiday this spell is restricted to ! Leave empty if none.
|
||||||
|
var/block = 0//prevents some spells from being spamed
|
||||||
|
|
||||||
///////////////////////
|
///////////////////////
|
||||||
///SETUP AND PROCESS///
|
///SETUP AND PROCESS///
|
||||||
@@ -149,7 +150,9 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
|
|||||||
if(!cast_check(skipcharge, user))
|
if(!cast_check(skipcharge, user))
|
||||||
return
|
return
|
||||||
if(cast_delay && !spell_do_after(user, cast_delay))
|
if(cast_delay && !spell_do_after(user, cast_delay))
|
||||||
|
block = 0
|
||||||
return
|
return
|
||||||
|
block = 0
|
||||||
if(before_target(user))
|
if(before_target(user))
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -507,18 +510,48 @@ var/list/spells = typesof(/spell) //needed for the badmin verb for now
|
|||||||
if(!user || isnull(user))
|
if(!user || isnull(user))
|
||||||
return 0
|
return 0
|
||||||
if(numticks == 0)
|
if(numticks == 0)
|
||||||
return 1
|
return 0
|
||||||
|
|
||||||
var/delayfraction = round(delay/numticks)
|
var/delayfraction = round(delay/numticks)
|
||||||
var/Location = user.loc
|
|
||||||
var/originalstat = user.stat
|
var/originalstat = user.stat
|
||||||
|
|
||||||
for(var/i = 0, i<numticks, i++)
|
var/Location = user.loc
|
||||||
|
var/image/progbar
|
||||||
|
if(user && user.client && user.client.prefs.progress_bars)
|
||||||
|
if(!progbar)
|
||||||
|
progbar = image("icon" = 'icons/effects/doafter_icon.dmi', "loc" = user, "icon_state" = "prog_bar_0")
|
||||||
|
progbar.pixel_z = WORLD_ICON_SIZE
|
||||||
|
progbar.plane = HUD_PLANE
|
||||||
|
progbar.layer = HUD_ABOVE_ITEM_LAYER
|
||||||
|
progbar.appearance_flags = RESET_COLOR
|
||||||
|
|
||||||
|
for (var/i = 1 to numticks)
|
||||||
|
if(user && user.client && user.client.prefs.progress_bars)
|
||||||
|
if(!progbar)
|
||||||
|
progbar = image("icon" = 'icons/effects/doafter_icon.dmi', "loc" = user, "icon_state" = "prog_bar_0")
|
||||||
|
progbar.pixel_z = WORLD_ICON_SIZE
|
||||||
|
progbar.plane = HUD_PLANE
|
||||||
|
progbar.layer = HUD_ABOVE_ITEM_LAYER
|
||||||
|
progbar.appearance_flags = RESET_COLOR
|
||||||
|
progbar.icon_state = "prog_bar_[round(((i / numticks) * 100), 10)]"
|
||||||
|
user.client.images |= progbar
|
||||||
|
|
||||||
sleep(delayfraction)
|
sleep(delayfraction)
|
||||||
|
|
||||||
|
|
||||||
if(!user || (!(spell_flags & (STATALLOWED|GHOSTCAST)) && user.stat != originalstat) || !(user.loc == Location))
|
if(!user || (!(spell_flags & (STATALLOWED|GHOSTCAST)) && user.stat != originalstat) || !(user.loc == Location))
|
||||||
|
if(progbar)
|
||||||
|
progbar.icon_state = "prog_bar_stopped"
|
||||||
|
spawn(2)
|
||||||
|
if(user && user.client)
|
||||||
|
user.client.images -= progbar
|
||||||
|
if(progbar)
|
||||||
|
progbar.loc = null
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
if(user && user.client)
|
||||||
|
user.client.images -= progbar
|
||||||
|
if(progbar)
|
||||||
|
progbar.loc = null
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
//UPGRADES
|
//UPGRADES
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 443 KiB After Width: | Height: | Size: 448 KiB |
|
Before Width: | Height: | Size: 678 B After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 15 KiB |
@@ -279,12 +279,23 @@
|
|||||||
#include "code\datums\gamemode\traitor.dm"
|
#include "code\datums\gamemode\traitor.dm"
|
||||||
#include "code\datums\gamemode\vampire_gamemode.dm"
|
#include "code\datums\gamemode\vampire_gamemode.dm"
|
||||||
#include "code\datums\gamemode\wizard.dm"
|
#include "code\datums\gamemode\wizard.dm"
|
||||||
#include "code\datums\gamemode\factions\cult.dm"
|
|
||||||
#include "code\datums\gamemode\factions\faction.dm"
|
#include "code\datums\gamemode\factions\faction.dm"
|
||||||
#include "code\datums\gamemode\factions\malf.dm"
|
#include "code\datums\gamemode\factions\malf.dm"
|
||||||
#include "code\datums\gamemode\factions\vampire_faction.dm"
|
#include "code\datums\gamemode\factions\vampire_faction.dm"
|
||||||
#include "code\datums\gamemode\objectives\acquire_blood.dm"
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_buildings.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_cultify_exceptions.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_hell_rising.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_items.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_mobs_and_constructs.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_narsie.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_runes.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_runespells.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_spells.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_tattoos.dm"
|
||||||
|
#include "code\datums\gamemode\factions\bloodcult\bloodcult_words.dm"
|
||||||
#include "code\datums\gamemode\objectives\absorb.dm"
|
#include "code\datums\gamemode\objectives\absorb.dm"
|
||||||
|
#include "code\datums\gamemode\objectives\acquire_blood.dm"
|
||||||
#include "code\datums\gamemode\objectives\block.dm"
|
#include "code\datums\gamemode\objectives\block.dm"
|
||||||
#include "code\datums\gamemode\objectives\die.dm"
|
#include "code\datums\gamemode\objectives\die.dm"
|
||||||
#include "code\datums\gamemode\objectives\escape.dm"
|
#include "code\datums\gamemode\objectives\escape.dm"
|
||||||
@@ -300,7 +311,6 @@
|
|||||||
#include "code\datums\gamemode\objectives\target\debrain.dm"
|
#include "code\datums\gamemode\objectives\target\debrain.dm"
|
||||||
#include "code\datums\gamemode\objectives\target\harm.dm"
|
#include "code\datums\gamemode\objectives\target\harm.dm"
|
||||||
#include "code\datums\gamemode\objectives\target\protection.dm"
|
#include "code\datums\gamemode\objectives\target\protection.dm"
|
||||||
#include "code\datums\gamemode\objectives\target\sacrifice.dm"
|
|
||||||
#include "code\datums\gamemode\objectives\target\target.dm"
|
#include "code\datums\gamemode\objectives\target\target.dm"
|
||||||
#include "code\datums\gamemode\objectives\target\nanotrasen\brig.dm"
|
#include "code\datums\gamemode\objectives\target\nanotrasen\brig.dm"
|
||||||
#include "code\datums\gamemode\objectives\target\nanotrasen\demote.dm"
|
#include "code\datums\gamemode\objectives\target\nanotrasen\demote.dm"
|
||||||
@@ -308,6 +318,7 @@
|
|||||||
#include "code\datums\gamemode\objectives\target\syndicate\brig.dm"
|
#include "code\datums\gamemode\objectives\target\syndicate\brig.dm"
|
||||||
#include "code\datums\gamemode\objectives\target\syndicate\steal.dm"
|
#include "code\datums\gamemode\objectives\target\syndicate\steal.dm"
|
||||||
#include "code\datums\gamemode\role\changeling.dm"
|
#include "code\datums\gamemode\role\changeling.dm"
|
||||||
|
#include "code\datums\gamemode\role\cultist.dm"
|
||||||
#include "code\datums\gamemode\role\role.dm"
|
#include "code\datums\gamemode\role\role.dm"
|
||||||
#include "code\datums\gamemode\role\vampire_role.dm"
|
#include "code\datums\gamemode\role\vampire_role.dm"
|
||||||
#include "code\datums\helper_datums\butchering.dm"
|
#include "code\datums\helper_datums\butchering.dm"
|
||||||
@@ -395,15 +406,8 @@
|
|||||||
#include "code\game\gamemodes\blob\blobs\shield.dm"
|
#include "code\game\gamemodes\blob\blobs\shield.dm"
|
||||||
#include "code\game\gamemodes\changeling\changeling_powers.dm"
|
#include "code\game\gamemodes\changeling\changeling_powers.dm"
|
||||||
#include "code\game\gamemodes\changeling\horror.dm"
|
#include "code\game\gamemodes\changeling\horror.dm"
|
||||||
#include "code\game\gamemodes\cult\cult_items.dm"
|
|
||||||
#include "code\game\gamemodes\cult\cult_structures.dm"
|
#include "code\game\gamemodes\cult\cult_structures.dm"
|
||||||
#include "code\game\gamemodes\cult\hell_universe.dm"
|
|
||||||
#include "code\game\gamemodes\cult\narsie.dm"
|
#include "code\game\gamemodes\cult\narsie.dm"
|
||||||
#include "code\game\gamemodes\cult\ritual.dm"
|
|
||||||
#include "code\game\gamemodes\cult\rune_controller.dm"
|
|
||||||
#include "code\game\gamemodes\cult\runes.dm"
|
|
||||||
#include "code\game\gamemodes\cult\talisman.dm"
|
|
||||||
#include "code\game\gamemodes\cult\trash_machinery.dm"
|
|
||||||
#include "code\game\gamemodes\endgame\endgame.dm"
|
#include "code\game\gamemodes\endgame\endgame.dm"
|
||||||
#include "code\game\gamemodes\endgame\halloween\gravestone.dm"
|
#include "code\game\gamemodes\endgame\halloween\gravestone.dm"
|
||||||
#include "code\game\gamemodes\endgame\halloween\halloween.dm"
|
#include "code\game\gamemodes\endgame\halloween\halloween.dm"
|
||||||
@@ -609,7 +613,6 @@
|
|||||||
#include "code\game\machinery\telecomms\telecomunications.dm"
|
#include "code\game\machinery\telecomms\telecomunications.dm"
|
||||||
#include "code\game\machinery\telecomms\telemonitor.dm"
|
#include "code\game\machinery\telecomms\telemonitor.dm"
|
||||||
#include "code\game\machinery\telecomms\traffic_control.dm"
|
#include "code\game\machinery\telecomms\traffic_control.dm"
|
||||||
#include "code\game\magic\Uristrunes.dm"
|
|
||||||
#include "code\game\mecha\mech_bay.dm"
|
#include "code\game\mecha\mech_bay.dm"
|
||||||
#include "code\game\mecha\mech_fabricator.dm"
|
#include "code\game\mecha\mech_fabricator.dm"
|
||||||
#include "code\game\mecha\mecha.dm"
|
#include "code\game\mecha\mecha.dm"
|
||||||
|
|||||||