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