diff --git a/code/datums/spells/construct_spells.dm b/code/datums/spells/construct_spells.dm
index 0aed526f5d6..0f3492ceb50 100644
--- a/code/datums/spells/construct_spells.dm
+++ b/code/datums/spells/construct_spells.dm
@@ -2,11 +2,14 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/construct/lesser
charge_max = 1800
+ action_icon_state = "lesserconstruct"
+ action_background_icon_state = "bg_cult"
/obj/effect/proc_holder/spell/aoe_turf/conjure/floor
name = "Floor Construction"
desc = "This spell constructs a cult floor"
-
+ action_icon_state = "floorconstruct"
+ action_background_icon_state = "bg_cult"
school = "conjuration"
charge_max = 20
clothes_req = 0
@@ -19,7 +22,8 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/wall
name = "Lesser Construction"
desc = "This spell constructs a cult wall"
-
+ action_icon_state = "lesserconstruct"
+ action_background_icon_state = "bg_cult"
school = "conjuration"
charge_max = 100
clothes_req = 0
@@ -47,7 +51,8 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/soulstone
name = "Summon Soulstone"
desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space"
-
+ action_icon_state = "summonsoulstone"
+ action_background_icon_state = "bg_cult"
school = "conjuration"
charge_max = 3000
clothes_req = 0
@@ -60,7 +65,8 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/pylon
name = "Cult Pylon"
desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source."
-
+ action_icon_state = "summonsoulstone"
+ action_background_icon_state = "bg_cult"
school = "conjuration"
charge_max = 200
clothes_req = 0
@@ -74,7 +80,8 @@
/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall
name = "Shield"
desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire"
-
+ action_icon_state = "cultforcewall"
+ action_background_icon_state = "bg_cult"
school = "transmutation"
charge_max = 300
clothes_req = 0
@@ -94,7 +101,8 @@
/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift
name = "Phase Shift"
desc = "This spell allows you to pass through walls"
-
+ action_icon_state = "phaseshift"
+ action_background_icon_state = "bg_cult"
school = "transmutation"
charge_max = 200
clothes_req = 0
@@ -110,7 +118,7 @@
/obj/effect/proc_holder/spell/targeted/projectile/magic_missile/lesser
name = "Lesser Magic Missile"
desc = "This spell fires several, slow moving, magic projectiles at nearby targets."
-
+ action_background_icon_state = "bg_cult"
school = "evocation"
charge_max = 400
clothes_req = 0
@@ -122,7 +130,8 @@
/obj/effect/proc_holder/spell/targeted/smoke/disable
name = "Paralysing Smoke"
desc = "This spell spawns a cloud of paralysing smoke."
-
+ action_icon_state = "parasmoke"
+ action_background_icon_state = "bg_cult"
school = "conjuration"
charge_max = 200
clothes_req = 0
diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm
index b626942d063..e4007c74987 100644
--- a/code/game/gamemodes/cult/cult.dm
+++ b/code/game/gamemodes/cult/cult.dm
@@ -21,6 +21,12 @@ var/global/list/all_cults = list()
var/mob/living/carbon/human/H = mind.current
if(isloyal(H))
return 0
+ if(issilicon(mind.current))
+ return 0 //can't convert machines, that's ratvar's thing
+ if(isguardian(mind.current))
+ var/mob/living/simple_animal/hostile/guardian/G = mind.current
+ if(!iscultist(G.summoner))
+ return 0 //can't convert it unless the owner is converted
return 1
/proc/is_sacrifice_target(datum/mind/mind)
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index eba530d045e..c81d30ff3cd 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -6,6 +6,7 @@
w_class = 4
force = 30
throwforce = 10
+ sharp = 1
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
@@ -51,6 +52,7 @@
name = "runed bola"
desc = "A strong bola, bound with dark magic. Throw it to trip and slow your victim."
icon_state = "bola_cult"
+ item_state = "bola_cult"
breakouttime = 45
/obj/item/clothing/head/culthood
@@ -140,6 +142,8 @@
/obj/item/weapon/whetstone/cult
name = "eldritch whetstone"
desc = "A block, empowered by dark magic. Sharp weapons will be enhanced when used on the stone."
+ icon = 'icons/obj/cult.dmi'
+ icon_state = "cultstone"
used = 0
increment = 5
max = 40
@@ -247,14 +251,14 @@
if(uses <= 0)
icon_state ="shifter_drained"
playsound(mobloc, "sparks", 50, 1)
- new /obj/effect/overlay/temp/cult/phase/out(list(mobloc, C.dir))
+ new /obj/effect/overlay/temp/cult/phase/out(mobloc)
var/atom/movable/pulled = handle_teleport_grab(destination, C)
C.forceMove(destination)
if(pulled)
C.start_pulling(pulled) //forcemove resets pulls, so we need to re-pull
- new /obj/effect/overlay/temp/cult/phase(list(destination, C.dir))
+ new /obj/effect/overlay/temp/cult/phase(destination)
playsound(destination, 'sound/effects/phasein.ogg', 25, 1)
playsound(destination, "sparks", 50, 1)
diff --git a/code/game/gamemodes/cult/cult_structures.dm b/code/game/gamemodes/cult/cult_structures.dm
index 5edef92cced..26503e6ba72 100644
--- a/code/game/gamemodes/cult/cult_structures.dm
+++ b/code/game/gamemodes/cult/cult_structures.dm
@@ -55,6 +55,18 @@
..()
if(iscultist(user) && cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].")
+ to_chat(user, "\The [src] is [anchored ? "":"not "]secured to the floor.")
+
+/obj/structure/cult/attackby(obj/I, mob/user, params)
+ if(istype(I, /obj/item/weapon/tome) && iscultist(user))
+ anchored = !anchored
+ to_chat(user, "You [anchored ? "":"un"]secure \the [src] [anchored ? "to":"from"] the floor.")
+ if(!anchored)
+ icon_state = "[initial(icon_state)]_off"
+ else
+ icon_state = initial(icon_state)
+ else
+ return ..()
/obj/structure/cult/proc/getETA()
var/time = (cooldowntime - world.time)/600
@@ -76,6 +88,9 @@
if(!iscultist(user))
to_chat(user, "You're pretty sure you know exactly what this is used for and you can't seem to touch it.")
return
+ if(!anchored)
+ to_chat(user, "You need to anchor [src] to the floor with a tome first.")
+ return
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].")
return
@@ -125,6 +140,9 @@
if(!iscultist(user))
to_chat(user, "The heat radiating from [src] pushes you back.")
return
+ if(!anchored)
+ to_chat(user, "You need to anchor [src] to the floor with a tome first.")
+ return
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].")
return
@@ -152,20 +170,16 @@
icon_state = "pylon"
light_range = 5
light_color = "#3e0000"
- var/heal_delay = 50
- var/last_shot = 0
- var/list/corruption = list()
health = 50 //Very fragile
death_message = "The pylon's crystal vibrates and glows fiercely before violently shattering!"
death_sound = 'sound/effects/pylon_shatter.ogg'
+ var/heal_delay = 25
+ var/last_heal = 0
+ var/corrupt_delay = 50
+ var/last_corrupt = 0
/obj/structure/cult/cultpylon/New()
processing_objects |= src
- corruption += get_turf(src)
- for(var/i in 1 to 5)
- for(var/t in corruption)
- var/turf/T = t
- corruption |= T.GetAtmosAdjacentTurfs()
..()
/obj/structure/cult/cultpylon/Destroy()
@@ -173,25 +187,35 @@
return ..()
/obj/structure/cult/cultpylon/process()
- if((last_shot + heal_delay) <= world.time)
- last_shot = world.time
+ if(!anchored)
+ return
+ if(last_heal <= world.time)
+ last_heal = world.time + heal_delay
for(var/mob/living/L in range(5, src))
- if(iscultist(L))
- var/mob/living/carbon/human/H = L
- if(istype(H))
- L.adjustBruteLoss(-1, 0)
- L.adjustFireLoss(-1, 0)
- L.updatehealth()
- if(istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct))
- var/mob/living/simple_animal/M = L
- if(M.health < M.maxHealth)
- M.adjustBruteLoss(-2)//WAS adjust health...runtimes..
- if(corruption.len)
- var/turf/T = pick_n_take(corruption)
- corruption -= T
- if(istype(T, /turf/simulated/floor/engine/cult) || istype(T, /turf/space))
- return
+ if(iscultist(L) || istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct))
+ if(L.health != L.maxHealth)
+ new /obj/effect/overlay/temp/heal(get_turf(src), "#960000")
+ if(ishuman(L))
+ L.adjustBruteLoss(-1, 0)
+ L.adjustFireLoss(-1, 0)
+ L.updatehealth()
+ if(istype(L, /mob/living/simple_animal/shade) || istype(L, /mob/living/simple_animal/hostile/construct))
+ var/mob/living/simple_animal/M = L
+ if(M.health < M.maxHealth)
+ M.adjustHealth(-1)
+ //CHECK_TICK
+ if(last_corrupt <= world.time)
+ var/list/validturfs = list()
+ for(var/T in circleviewturfs(src, 5))
+ if(istype(T, /turf/simulated/floor/engine/cult) || istype(T, /turf/space) || istype(T, /turf/simulated/wall))
+ continue
+ validturfs |= T
+ var/turf/T = safepick(validturfs)
+ if(T)
T.ChangeTurf(/turf/simulated/floor/engine/cult)
+ last_corrupt = world.time + corrupt_delay
+ else
+ last_corrupt = world.time + corrupt_delay*2
/obj/structure/cult/culttome
@@ -206,6 +230,9 @@
if(!iscultist(user))
to_chat(user, "All of these books seem to be gibberish.")
return
+ if(!anchored)
+ to_chat(user, "You need to anchor [src] to the floor with a tome first.")
+ return
if(cooldowntime > world.time)
to_chat(user, "The magic in [src] is weak, it will be ready to use again in [getETA()].")
return
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 400ca922f22..a40c68a815c 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -20,6 +20,7 @@
throw_range = 5
w_class = 2
var/scribereduct = 0
+ var/canbypass = 0 //ADMINBUS
/obj/item/weapon/tome/accursed
name = "accursed tome"
@@ -30,6 +31,7 @@
name = "imbued arcane tome"
desc = "An arcane tome granted by the Geometer itself."
scribereduct = 50
+ canbypass = 1
/obj/item/weapon/tome/examine(mob/user)
..()
@@ -219,23 +221,39 @@
return
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
return
- if(ispath(rune_to_scribe, /obj/effect/rune/narsie))//may need to change this - Fethas
- var/confirm_final = alert(usr, "This is the FINAL step to summon [ticker.mode.cultdat.entity_name], it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for [ticker.mode.cultdat.entity_name]!", "No")
- if(confirm_final == "No")
- to_chat(usr, "On second thought, we should prepare further for the final battle...")
- return
- command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
- for(var/B in spiral_range_turfs(1, user, 1))
- var/turf/T = B
- var/obj/machinery/shield/N = new(T)
- N.name = "Rune-Scriber's Shield"
- N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual"
- N.icon_state = "shield-red"
- N.health = 60
- shields |= N
- user.visible_message("[user] cuts open their arm and begins writing in their own blood!", \
- "You slice open your arm and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].")
- user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick("l_arm", "r_arm"))
+ if(ispath(rune_to_scribe, /obj/effect/rune/narsie) || ispath(rune_to_scribe, /obj/effect/rune/slaughter))//may need to change this - Fethas
+
+ if(ticker.mode.name == "cult")
+ var/datum/game_mode/cult/cult_mode = ticker.mode
+ if(!("eldergod" in cult_mode.objectives))
+ to_chat(user, "[cult_mode.cultdat.entity_name]'s power does not wish to be unleashed!")
+ return
+ else if(!cult_mode.narsie_condition_cleared)
+ to_chat(user, "There is still more to do before unleashing [cult_mode.cultdat.entity_name] power!")
+ return
+ else if(!cult_mode.eldergod)
+ to_chat(user, "\"I am already here. There is no need to try to summon me now.\"")
+ return
+ else if(cult_mode.demons_summoned)
+ to_chat(user, "\"We am already here. There is no need to try to summon us now.\"")
+ return
+ var/confirm_final = alert(user, "This is the FINAL step to summon Nar-Sie, it is a long, painful ritual and the crew will be alerted to your presence", "Are you prepared for the final battle?", "My life for Nar-Sie!", "No")
+ if(confirm_final == "No")
+ user << "You decide to prepare further before scribing the rune."
+ return
+ command_announcement.Announce("Figments from an eldritch god are being summoned somwhere on the station from an unknown dimension. Disrupt the ritual at all costs!","Central Command Higher Dimensionsal Affairs", 'sound/AI/spanomalies.ogg')
+ for(var/B in spiral_range_turfs(1, user, 1))
+ var/turf/T = B
+ var/obj/machinery/shield/N = new(T)
+ N.name = "Rune-Scriber's Shield"
+ N.desc = "A potent shield summoned by cultists to protect them while they prepare the final ritual"
+ N.icon_state = "shield-red"
+ N.health = 60
+ shields |= N
+ var/dam_zone = pick("head", "chest", "groin", "l_arm", "l_hand", "r_arm", "r_hand", "l_leg", "l_foot", "r_leg", "r_foot")
+ user.visible_message("[user] cuts open their [dam_zone] and begins writing in their own blood!", \
+ "You slice open your [dam_zone] and begin drawing a sigil of [ticker.mode.cultdat.entity_title3].")
+ user.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, dam_zone)
if(!do_after(user, initial(rune_to_scribe.scribe_delay)-scribereduct, target = get_turf(user)))
for(var/V in shields)
var/obj/machinery/shield/S = V
@@ -251,8 +269,9 @@
var/obj/machinery/shield/S = V
if(S && !qdeleted(S))
qdel(S)
- new rune_to_scribe(Turf, chosen_keyword)
- rune_to_scribe.blood_DNA = list()
- rune_to_scribe.blood_DNA[user.dna.unique_enzymes] = user.dna.b_type
- rune_to_scribe.add_hiddenprint(user)
+ var/obj/effect/rune/R = new rune_to_scribe(Turf, chosen_keyword)
+ var/mob/living/carbon/human/H = user
+ R.blood_DNA = list()
+ R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
+ R.add_hiddenprint(H)
to_chat(user, "The [lowertext(initial(rune_to_scribe.cultist_name))] rune [initial(rune_to_scribe.cultist_desc)]")
diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm
index ea585b875ea..bf481ed55dd 100644
--- a/code/game/gamemodes/cult/runes.dm
+++ b/code/game/gamemodes/cult/runes.dm
@@ -463,19 +463,7 @@ var/list/teleport_runes = list()
var/mob/living/user = invokers[1]
if(ticker.mode.name == "cult")
var/datum/game_mode/cult/cult_mode = ticker.mode
- if(!("eldergod" in cult_mode.objectives))
- message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie when the objective was wrong")
- for(var/M in invokers)
- var/mob/living/L = M
- to_chat(L, "\"YOUR SOUL BURNS WITH YOUR ARROGANCE!!!\"")
- if(L.reagents)
- L.reagents.add_reagent("hell_water", 10)
- L.Weaken(7)
- L.Stun(7)
- fail_invoke()
- log_game("Summon Nar-Sie rune failed - improper objective")
- return
- else if(user.z != ZLEVEL_STATION)
+ if(user.z != ZLEVEL_STATION)
message_admins("[user.real_name]([user.ckey]) tried to summon Nar-Sie off station")
for(var/M in invokers)
var/mob/living/L = M
@@ -528,6 +516,7 @@ var/list/teleport_runes = list()
req_cultists = 9
color = rgb(125,23,23)
scribe_delay = 450
+ scribe_damage = 40.1 //how much damage you take doing it
icon = 'icons/effects/96x96.dmi'
icon_state = "rune_large"
pixel_x = -32
@@ -572,7 +561,7 @@ var/list/teleport_runes = list()
fail_invoke()
log_game("Summon Demons rune failed - improper objective")
return
- else if(user.z != ZLEVEL_STATION)
+ if(user.z != ZLEVEL_STATION)
message_admins("[user.real_name]([user.ckey]) tried to summon demons off station")
for(var/M in invokers)
var/mob/living/L = M
@@ -626,7 +615,7 @@ var/list/teleport_runes = list()
if(rune_in_use)
return
for(var/mob/living/M in orange(1,src))
- if(M.stat == DEAD)
+ if(M.stat == DEAD && !iscultist(M))
potential_sacrifice_mobs.Add(M)
if(!potential_sacrifice_mobs.len)
to_chat(user, "There are no eligible sacrifices nearby!")
@@ -829,7 +818,7 @@ var/list/teleport_runes = list()
var/mob/living/user = invokers[1]
var/list/cultists = list()
for(var/datum/mind/M in ticker.mode.cult)
- if(!(M.current in invokers))
+ if(!(M.current in invokers) && M.current.stat != DEAD)
cultists |= M.current
var/mob/living/cultist_to_summon = input(user, "Who do you wish to call to [src]?", "Followers of [ticker.mode.cultdat.entity_title3]") as null|anything in cultists
if(!Adjacent(user) || !src || qdeleted(src) || user.incapacitated())
@@ -867,8 +856,9 @@ var/list/teleport_runes = list()
/obj/effect/rune/blood_boil/invoke(var/list/invokers)
..()
+ var/turf/T = get_turf(src)
visible_message("[src] briefly bubbles before exploding!")
- for(var/mob/living/carbon/C in viewers(src))
+ for(var/mob/living/carbon/C in viewers(T))
if(!iscultist(C))
var/obj/item/weapon/nullrod/N = C.null_rod_check()
if(N)
@@ -881,8 +871,8 @@ var/list/teleport_runes = list()
var/mob/living/L = M
L.apply_damage(15, BRUTE, pick("l_arm", "r_arm"))
to_chat(L,"[src] saps your strength!")
- explosion(get_turf(src), -1, 0, 1, 5)
qdel(src)
+ explosion(T, -1, 0, 1, 5)
//Rite of Spectral Manifestation: Summons a ghost on top of the rune as a cultist human with no items. User must stand on the rune at all times, and takes damage for each summoned ghost.
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 12b2502ba6e..a51404ffae7 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -299,7 +299,7 @@
//Talisman of Fabrication: Creates a construct shell out of 25 metal sheets.
/obj/item/weapon/paper/talisman/construction
cultist_name = "Talisman of Construction"
- cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell"
+ cultist_desc = "Use this talisman on at least twenty-five metal sheets to create an empty construct shell or on plasteel to make runed metal"
invocation = "Ethra p'ni dedol!"
/obj/item/weapon/paper/talisman/construction/attack_self(mob/living/user)
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index d9b7c5d16d1..94d862a7c9d 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -115,6 +115,18 @@
/obj/effect/overlay/temp/cult/phase/out
icon_state = "cultout"
+/obj/effect/overlay/temp/heal //color is white by default, set to whatever is needed
+ name = "healing glow"
+ icon_state = "heal"
+ duration = 15
+
+/obj/effect/overlay/temp/heal/New(loc, colour)
+ ..()
+ pixel_x = rand(-12, 12)
+ pixel_y = rand(-9, 0)
+ if(colour)
+ color = colour
+
/obj/effect/overlay/temp/cult/sac
name = "maw of Nar-Sie"
icon_state = "sacconsume"
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index d73c0dc10af..c8e746cafda 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/obj/cult.dmi b/icons/obj/cult.dmi
index ec88118c123..6901e1c25a2 100644
Binary files a/icons/obj/cult.dmi and b/icons/obj/cult.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index c35817db609..c51a531b2f8 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ