diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm
index b38b2666863..b492e91ece5 100644
--- a/code/__DEFINES/status_effects.dm
+++ b/code/__DEFINES/status_effects.dm
@@ -49,7 +49,7 @@
//#define STATUS_EFFECT_HISWRATH /datum/status_effect/his_wrath //His Wrath.
-//#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
+#define STATUS_EFFECT_SUMMONEDGHOST /datum/status_effect/cultghost //is a cult ghost and can't use manifest runes
//#define STATUS_EFFECT_CRUSHERMARK /datum/status_effect/crusher_mark //if struck with a proto-kinetic crusher, takes a ton of damage
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 4ef8fe93626..00592b7812d 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -121,10 +121,10 @@
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30)
/obj/item/clothing/suit/space/cult
- name = "cult armour"
+ name = "cult armor"
icon_state = "cult_armour"
item_state = "cult_armour"
- desc = "A bulky suit of armour, bristling with spikes. It looks space proof."
+ desc = "A bulky suit of armor, bristling with spikes. It looks space proof."
w_class = WEIGHT_CLASS_NORMAL
allowed = list(/obj/item/weapon/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank)
slowdown = 1
@@ -343,7 +343,6 @@
else
to_chat(C, "The veil cannot be torn here!")
-
/obj/item/clothing/suit/space/eva/plasmaman/cultist
name = "plasmaman cultist armor"
icon_state = "plasmaman_cult"
@@ -358,3 +357,42 @@
base_state = "plasmamanCult_helmet"
desc = "A helmet designed by cultists. It glows menacingly with unearthly flames."
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30)
+
+/obj/item/weapon/melee/cultblade/ghost
+ name = "eldritch sword"
+ force = 15
+ flags = NODROP
+
+/obj/item/weapon/melee/cultblade/ghost/dropped(mob/living/carbon/human/user)
+ ..()
+ qdel(src)
+
+/obj/item/clothing/head/culthood/alt/ghost
+ flags = NODROP
+
+/obj/item/clothing/head/culthood/alt/ghost/dropped(mob/living/carbon/human/user)
+ ..()
+ qdel(src)
+
+/obj/item/clothing/suit/cultrobes/alt/ghost
+ flags = NODROP
+
+/obj/item/clothing/suit/cultrobes/alt/ghost/dropped(mob/living/carbon/human/user)
+ ..()
+ qdel(src)
+
+/obj/item/clothing/shoes/cult/ghost
+ flags = NODROP
+
+/obj/item/clothing/shoes/cult/ghost/dropped(mob/living/carbon/human/user)
+ ..()
+ qdel(src)
+
+/datum/outfit/ghost_cultist
+ name = "Cultist Ghost"
+
+ uniform = /obj/item/clothing/under/color/black
+ suit = /obj/item/clothing/suit/cultrobes/alt/ghost
+ shoes = /obj/item/clothing/shoes/cult/ghost
+ head = /obj/item/clothing/head/culthood/alt/ghost
+ r_hand = /obj/item/weapon/melee/cultblade/ghost
\ No newline at end of file
diff --git a/code/game/gamemodes/cult/cult_objectives.dm b/code/game/gamemodes/cult/cult_objectives.dm
index 69b6de0c73e..d489387ad76 100644
--- a/code/game/gamemodes/cult/cult_objectives.dm
+++ b/code/game/gamemodes/cult/cult_objectives.dm
@@ -21,10 +21,10 @@
if("convert")
explanation = "We must increase our influence before we can summon [ticker.mode.cultdat.entity_name], Convert [convert_target] crew members. Take it slowly to avoid raising suspicions."
if("bloodspill")
- spilltarget = 70 + rand(0,player_list.len * 3)
+ spilltarget = 100 + rand(0,player_list.len * 3)
explanation = "We must prepare this place for [ticker.mode.cultdat.entity_title1]'s coming. Spill blood and gibs over [spilltarget] floor tiles."
if("sacrifice")
- explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for his blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
+ explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for their blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
for(var/datum/mind/cult_mind in cult)
to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
@@ -47,7 +47,7 @@
message_admins("Picking a new Cult objective.")
var/new_objective = "eldergod"
//the idea here is that if the cult performs well, the should get more objectives before they can summon Nar-Sie.
- if(cult.len >= 4)//if there are less than 4 remaining cultists, they get a free pass to the summon objective.
+ if(cult.len >= 4) //if there are less than 4 remaining cultists, they get a free pass to the summon objective.
if(current_objective <= prenarsie_objectives)
var/list/unconvertables = get_unconvertables()
if(unconvertables.len <= (cult.len * 2))//if cultists are getting radically outnumbered, they get a free pass to the summon objective.
@@ -81,12 +81,13 @@
spilltarget = 100 + rand(0,player_list.len * 3)
explanation = "We must prepare this place for [ticker.mode.cultdat.entity_title1]'s coming. Spread blood and gibs over [spilltarget] of the Station's floor tiles."
if("sacrifice")
- explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for his blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
+ explanation = "We need to sacrifice [sacrifice_target.name], the [sacrifice_target.assigned_role], for their blood is the key that will lead our master to this realm. You will need 3 cultists around a Sacrifice rune to perform the ritual."
for(var/datum/mind/cult_mind in cult)
- to_chat(cult_mind.current, "You and your acolytes have completed your task, but this place requires yet more preparation!")
- to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
- cult_mind.memory += "Objective #[current_objective]: [explanation]
"
+ if(cult_mind)
+ to_chat(cult_mind.current, "You and your acolytes have completed your task, but this place requires yet more preparation!")
+ to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
+ cult_mind.memory += "Objective #[current_objective]: [explanation]
"
message_admins("New Cult Objective: [new_objective]")
log_admin("New Cult Objective: [new_objective]")
@@ -95,12 +96,13 @@
/datum/game_mode/cult/proc/gtfo_phase()//YOU HAD ONE JOB
var/explanation
- objectives +="survive"
+ objectives += "survive"
explanation = "Our knowledge must live on. Make sure at least [acolytes_needed] acolytes escape on the shuttle to spread their work on an another station."
for(var/datum/mind/cult_mind in cult)
- to_chat(cult_mind.current, "You and your acolytes suddenly feel the urge to do your best, but survive!")
- to_chat(cult_mind.current, "Objective Survive: [explanation]")
- cult_mind.memory += "Objective Survive: [explanation]
"
+ if(cult_mind)
+ to_chat(cult_mind.current, "You and your acolytes suddenly feel the urge to do your best, but survive!")
+ to_chat(cult_mind.current, "Objective Survive: [explanation]")
+ cult_mind.memory += "Objective Survive: [explanation]
"
/datum/game_mode/cult/proc/second_phase()
@@ -115,9 +117,10 @@
explanation = "Bring the Slaughter via the rune 'Bring forth the slaughter'. The veil is weak enough in [english_list(summon_spots)] for the ritual to begin."
for(var/datum/mind/cult_mind in cult)
- to_chat(cult_mind.current, "You and your acolytes have succeeded in preparing the station for the ultimate ritual!")
- to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
- cult_mind.memory += "Objective #[current_objective]: [explanation]
"
+ if(cult_mind)
+ to_chat(cult_mind.current, "You and your acolytes have succeeded in preparing the station for the ultimate ritual!")
+ to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
+ cult_mind.memory += "Objective #[current_objective]: [explanation]
"
/datum/game_mode/cult/proc/third_phase()
current_objective++
@@ -132,15 +135,16 @@
switch(last_objective)
if("harvest")
- explanation = "[ticker.mode.cultdat.entity_title1] hungers for his first meal of this never-ending day. Offer him [harvest_target] humans in sacrifice."
+ explanation = "[ticker.mode.cultdat.entity_title1] hungers for their first meal of this never-ending day. Offer them [harvest_target] humans in sacrifice."
if("hijack")
- explanation = "[ticker.mode.cultdat.entity_name] wishes for his troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it."
+ explanation = "[ticker.mode.cultdat.entity_name] wishes for their troops to start the assault on Centcom immediately. Hijack the escape shuttle and don't let a single non-cultist board it."
if("massacre")
explanation = "[ticker.mode.cultdat.entity_name] wants to watch you as you massacre the remaining humans on the station (until less than [massacre_target] humans are left alive)."
for(var/datum/mind/cult_mind in cult)
- to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
- cult_mind.memory += "Objective #[current_objective]: [explanation]
"
+ if(cult_mind)
+ to_chat(cult_mind.current, "Objective #[current_objective]: [explanation]")
+ cult_mind.memory += "Objective #[current_objective]: [explanation]
"
message_admins("Last Cult Objective: [last_objective]")
log_admin("Last Cult Objective: [last_objective]")
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 55d2a51de61..72535d9d1e5 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -109,6 +109,7 @@
target cultists!). If this creature has a mind, a soulstone will be created and the creature's soul transported to it. Sacrificing the dead can be done alone, but sacrificing living crew or your cult's target will require 3 cultists. \
Soulstones used on construct shells will move that soul into a powerful construct of your choice.
"
+
text += "Rite of Resurrection
This rune requires two corpses. To perform the ritual, place the corpse you wish to revive onto \
the rune and the offering body adjacent to it. When the rune is invoked, the body to be sacrificed will turn to dust, the life force flowing into the revival target. Assuming the target is not moved \
within a few seconds, they will be brought back to life, healed of all ailments.
"
@@ -293,7 +294,7 @@
var/mob/living/carbon/human/H = user
var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
var/obj/item/organ/external/affecting = H.get_organ(ran_zone(dam_zone))
- user.visible_message("[user] cuts open their \The [affecting] and begins writing in their own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].")
+ user.visible_message("[user] cuts open their [affecting] and begins writing in their own blood!", "You slice open your [affecting] and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].")
user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE , affecting)
if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user)))
for(var/V in shields)
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index 3649a2fb88f..9b94627d664 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -36,6 +36,8 @@ To draw a rune, use an arcane tome.
var/req_keyword = 0 //If the rune requires a keyword - go figure amirite
var/keyword //The actual keyword for the rune
+ var/invoke_damage = 0 //how much damage invokers take when invoking it
+
/obj/effect/rune/New(loc, set_keyword)
..()
@@ -118,6 +120,8 @@ structure_check() searches for nearby cultist structures required for the invoca
//This proc determines if the rune can be invoked at the time. If there are multiple required cultists, it will find all nearby cultists.
var/list/invokers = list() //people eligible to invoke the rune
var/list/chanters = list() //people who will actually chant the rune when passed to invoke()
+ if(invisibility == INVISIBILITY_OBSERVER)//hidden rune
+ return
if(user)
chanters |= user
invokers |= user
@@ -146,11 +150,14 @@ structure_check() searches for nearby cultist structures required for the invoca
/obj/effect/rune/proc/invoke(var/list/invokers)
//This proc contains the effects of the rune as well as things that happen afterwards. If you want it to spawn an object and then delete itself, have both here.
- if(invocation)
- for(var/M in invokers)
- var/mob/living/L = M
+ for(var/M in invokers)
+ var/mob/living/L = M
+ if(invocation)
L.say(invocation)
L.changeNext_move(CLICK_CD_MELEE)//THIS IS WHY WE CAN'T HAVE NICE THINGS
+ if(invoke_damage)
+ L.apply_damage(invoke_damage, BRUTE)
+ to_chat(L, "[src] saps your strength!")
do_invoke_glow()
/obj/effect/rune/proc/burn_invokers(var/list/mobstoburn)
@@ -181,13 +188,13 @@ structure_check() searches for nearby cultist structures required for the invoca
cultist_name = "malformed rune"
cultist_desc = "a senseless rune written in gibberish. No good can come from invoking this."
invocation = "Ra'sha yoka!"
+ invoke_damage = 30
/obj/effect/rune/malformed/invoke(var/list/invokers)
..()
for(var/M in invokers)
var/mob/living/L = M
- to_chat(M, "You feel your life force draining. [ticker.mode.cultdat.entity_title3] is displeased.")
- L.apply_damage(30, BRUTE)
+ to_chat(L, "You feel your life force draining. [ticker.mode.cultdat.entity_title3] is displeased.")
qdel(src)
/mob/proc/null_rod_check() //The null rod, if equipped, will protect the holder from the effects of most runes
@@ -252,6 +259,7 @@ var/list/teleport_runes = list()
icon_state = "2"
req_keyword = 1
var/listkey
+ invoke_damage = 6 //but theres some checks for z-level
/obj/effect/rune/teleport/New(loc, set_keyword)
..()
@@ -316,6 +324,12 @@ var/list/teleport_runes = list()
to_chat(user, "You[moveuserlater ? "r vision blurs, and you suddenly appear somewhere else":" send everything above the rune away"].")
if(moveuserlater)
user.forceMove(get_turf(actual_selected_rune))
+ var/mob/living/carbon/human/H = user
+ if(user.z != T.z)
+ H.bleed(5)
+ user.apply_damage(5, BRUTE)
+ else
+ H.bleed(rand(5,10))
else
fail_invoke()
@@ -458,6 +472,8 @@ var/list/teleport_runes = list()
T.gib()
rune_in_use = 0
+
+
//Ritual of Dimensional Rending: Calls forth the avatar of Nar-Sie upon the station.
/obj/effect/rune/narsie
cultist_name = "Tear Reality (God)"
@@ -806,6 +822,7 @@ var/list/teleport_runes = list()
cultist_desc = "when invoked, makes an invisible wall to block passage. Can be invoked again to reverse this."
invocation = "Khari'd! Eske'te tannin!"
icon_state = "1"
+ invoke_damage = 2
/obj/effect/rune/wall/examine(mob/user)
..()
@@ -831,6 +848,8 @@ var/list/teleport_runes = list()
req_cultists = 2
allow_excess_invokers = 1
icon_state = "5"
+ invoke_damage = 5
+ var/summontime = 0
/obj/effect/rune/summon/invoke(var/list/invokers)
var/mob/living/user = invokers[1]
@@ -856,13 +875,24 @@ var/list/teleport_runes = list()
fail_invoke()
log_game("Summon Cultist rune failed - target in away mission")
return
- cultist_to_summon.visible_message("[cultist_to_summon] suddenly disappears in a flash of red light!", \
- "Overwhelming vertigo consumes you as you are hurled through the air!")
+ if((cultist_to_summon.reagents.has_reagent("holywater") || cultist_to_summon.restrained()) && invokers < 3)
+ to_chat(user, "The summoning of [cultist_to_summon] is being blocked somehow! You need 3 chanters to counter it!")
+ fail_invoke()
+ new /obj/effect/temp_visual/cult/sparks(get_turf(cultist_to_summon)) //observer warning
+ log_game("Summon Cultist rune failed - holywater in target")
+ return
+
..()
- visible_message("A foggy shape materializes atop [src] and solidifes into [cultist_to_summon]!")
- user.apply_damage(10, BRUTE, "head")
- cultist_to_summon.forceMove(get_turf(src))
- qdel(src)
+ if(cultist_to_summon.reagents.has_reagent("holywater") || cultist_to_summon.restrained())
+ summontime = 20
+
+ if(do_after(user, summontime, target = loc))
+ cultist_to_summon.visible_message("[cultist_to_summon] suddenly disappears in a flash of red light!", \
+ "Overwhelming vertigo consumes you as you are hurled through the air!")
+ visible_message("A foggy shape materializes atop [src] and solidifies into [cultist_to_summon]!")
+
+ cultist_to_summon.forceMove(get_turf(src))
+ qdel(src)
//Rite of Boiling Blood: Deals extremely high amounts of damage to non-cultists nearby
/obj/effect/rune/blood_boil
@@ -872,6 +902,7 @@ var/list/teleport_runes = list()
icon_state = "4"
construct_invoke = 0
req_cultists = 3
+ invoke_damage = 15
/obj/effect/rune/blood_boil/do_invoke_glow()
return
@@ -889,10 +920,6 @@ var/list/teleport_runes = list()
to_chat(C, "Your blood boils in your veins!")
C.take_overall_damage(45,45)
C.Stun(7)
- for(var/M in invokers)
- var/mob/living/L = M
- L.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
- to_chat(L,"[src] saps your strength!")
qdel(src)
explosion(T, -1, 0, 1, 5)
@@ -942,6 +969,9 @@ var/list/teleport_runes = list()
construct_invoke = 0
color = rgb(200, 0, 0)
var/list/summoned_guys = list()
+ var/ghost_limit = 5
+ var/ghosts = 0
+ invoke_damage = 10
/obj/effect/rune/manifest/New(loc)
..()
@@ -950,11 +980,21 @@ var/list/teleport_runes = list()
notify_ghosts("Manifest rune created in [get_area(src)].", 'sound/effects/ghost2.ogg', source = src)
/obj/effect/rune/manifest/can_invoke(mob/living/user)
+ if(ghosts >= ghost_limit)
+ to_chat(user, "You are sustaining too many ghosts to summon more!")
+ fail_invoke()
+ log_game("Manifest rune failed - too many summoned ghosts")
+ return list()
if(!(user in get_turf(src)))
to_chat(user,"You must be standing on [src]!")
fail_invoke()
log_game("Manifest rune failed - user not standing on rune")
return list()
+ if(user.has_status_effect(STATUS_EFFECT_SUMMONEDGHOST))
+ to_chat(user, "Ghosts can't summon more ghosts!")
+ fail_invoke()
+ log_game("Manifest rune failed - user is a ghost")
+ return list()
var/list/ghosts_on_rune = list()
for(var/mob/dead/observer/O in get_turf(src))
if(O.client && !jobban_isbanned(O, ROLE_CULTIST) && !jobban_isbanned(O, ROLE_SYNDICATE))
@@ -976,8 +1016,12 @@ var/list/teleport_runes = list()
var/mob/living/carbon/human/new_human = new(get_turf(src))
new_human.real_name = ghost_to_spawn.real_name
new_human.alpha = 150 //Makes them translucent
+ new_human.equipOutfit(/datum/outfit/ghost_cultist) //give them armor
+ new_human.apply_status_effect(STATUS_EFFECT_SUMMONEDGHOST) //ghosts can't summon more ghosts
new_human.color = "grey" //heh..cult greytide...litterly...
..()
+
+ playsound(src, 'sound/misc/exit_blood.ogg', 50, 1)
visible_message("A cloud of red mist forms above [src], and from within steps... a man.")
to_chat(user, "Your blood begins flowing into [src]. You must remain in place and conscious to maintain the forms of those summoned. This will hurt you slowly but surely...")
var/obj/machinery/shield/N = new(get_turf(src))
@@ -989,6 +1033,7 @@ var/list/teleport_runes = list()
new_human.key = ghost_to_spawn.key
ticker.mode.add_cultist(new_human.mind, 0)
summoned_guys |= new_human
+ ghosts++
to_chat(new_human, "You are a servant of [ticker.mode.cultdat.entity_title3]. You have been made semi-corporeal by the cult of [ticker.mode.cultdat.entity_name], and you are to serve them at all costs.")
while(user in get_turf(src))
@@ -1004,6 +1049,7 @@ var/list/teleport_runes = list()
for(var/obj/I in new_human)
new_human.unEquip(I)
summoned_guys -= new_human
+ ghosts--
new_human.dust()
/obj/effect/rune/manifest/Destroy()
diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm
index f94063a5a10..2bee4ef63b2 100644
--- a/code/modules/mob/living/simple_animal/constructs.dm
+++ b/code/modules/mob/living/simple_animal/constructs.dm
@@ -181,7 +181,7 @@
/mob/living/simple_animal/hostile/construct/builder
name = "Artificer"
real_name = "Artificer"
- desc = "A bulbous construct dedicated to building and maintaining The Cult of Nar-Sie's armies"
+ desc = "A bulbous construct dedicated to building and maintaining Cult armies."
icon = 'icons/mob/mob.dmi'
icon_state = "artificer"
icon_living = "artificer"
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index 008e7ae9ad2..8d887bb1e43 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index 92b77524bc4..95d9b07dd0d 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ