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
This commit is contained in:
DeityLink
2018-02-14 15:32:52 +01:00
committed by MadmanMartian
parent 477c8faedd
commit f601a02423
54 changed files with 1868 additions and 239 deletions

View File

@@ -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

View File

@@ -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)))

View File

@@ -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")

View File

@@ -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//
///////////////////////////////////////// /////////////////////////////////////////

View File

@@ -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)

View File

@@ -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)

View 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

View File

@@ -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)

View 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)

View 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>")

View 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
*/

View 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>")

View 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"

View File

@@ -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

View 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))

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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")

View File

@@ -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)

View File

@@ -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

View File

@@ -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()

View File

@@ -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

View File

@@ -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")

View File

@@ -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)

View File

@@ -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,

View File

@@ -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)

View File

@@ -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

View File

@@ -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
*/

View File

@@ -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

View File

@@ -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)

View File

@@ -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))

View File

@@ -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]

View File

@@ -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()

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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.

View File

@@ -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>")

View File

@@ -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)

View File

@@ -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
*/

View File

@@ -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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 443 KiB

After

Width:  |  Height:  |  Size: 448 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -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"