From 31b7f9a074732314caa692ffb346d53b9b5ca462 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sat, 17 Jun 2017 16:54:43 -0500 Subject: [PATCH] The Hierophant is a little less chaotic and murdery on average --- .../hostile/megafauna/hierophant.dm | 95 +++++++++---------- 1 file changed, 47 insertions(+), 48 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 9675ac25b1..6336c118f4 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -7,23 +7,25 @@ The Hierophant spawns in its arena, which makes fighting it challenging but not The text this boss speaks is ROT4, use ROT22 to decode -The Hierophant's attacks are as follows, and INTENSIFY at a random chance based on Hierophant's health; -- Creates a cardinal or diagonal blast(Cross Blast) under its target, exploding after a short time. - INTENSITY EFFECT: Creates one of the cross blast types under itself instead of under the target. - INTENSITY EFFECT: The created Cross Blast fires in all directions if below half health. -- If no chasers exist, creates a chaser that will seek its target, leaving a trail of blasts. - INTENSITY EFFECT: Creates a second, slower chaser. -- Creates an expanding AoE burst. -- INTENSE ATTACKS: +The Hierophant's attacks are as follows; +- These attacks happen at a random, increasing chance: If target is at least 2 tiles away; Blinks to the target after a very brief delay, damaging everything near the start and end points. As above, but does so multiple times if below half health. - Rapidly creates Cross Blasts under a target. - If chasers are off cooldown, creates four high-speed chasers. -- IF TARGET WAS STRUCK IN MELEE: Creates a 3x3 square of blasts under the target. + Rapidly creates cardinal and diagonal Cross Blasts under a target. + If chasers are off cooldown, creates 4 chasers. -- IF TARGET IS OUTSIDE THE ARENA: Creates an arena around the target for 10 seconds, blinking to it if Hierophant is not in the arena. +- IF TARGET IS OUTSIDE THE ARENA: Creates an arena around the target for 10 seconds, blinking to the target if not in the created arena. The arena has a 20 second cooldown, giving people a small window to get the fuck out. +- If no chasers exist, creates a chaser that will seek its target, leaving a trail of blasts. + Is more likely to create a second, slower, chaser if hurt. +- If the target is at least 2 tiles away, may Blink to the target after a very brief delay, damaging everything near the start and end points. +- Creates a cardinal or diagonal blast(Cross Blast) under its target, exploding after a short time. + If below half health, the created Cross Blast may fire in all directions. +- Creates an expanding AoE burst. + +- IF TARGET WAS STRUCK IN MELEE: Creates a 3x3 square of blasts under the target. + Cross Blasts and the AoE burst gain additional range as Hierophant loses health, while Chasers gain additional speed. When Hierophant dies, it stops trying to murder you and shrinks into a small form, which, while much weaker, is still quite effective. @@ -178,17 +180,18 @@ Difficulty: Hard /mob/living/simple_animal/hostile/megafauna/hierophant/OpenFire() calculate_rage() - var/target_is_slow = FALSE + if(blinking) + return + + var/target_slowness = 0 if(isliving(target)) var/mob/living/L = target if(!blinking && L.stat == DEAD && get_dist(src, L) > 2) blink(L) return - if(L.movement_delay() > 1.5) - target_is_slow = TRUE - chaser_speed = max(1, (3 - anger_modifier * 0.04) + target_is_slow * 0.5) - if(blinking) - return + target_slowness += L.movement_delay() + target_slowness = max(target_slowness, 1) + chaser_speed = max(1, (3 - anger_modifier * 0.04) + ((target_slowness - 1) * 0.5)) arena_trap(target) ranged_cooldown = world.time + max(5, ranged_cooldown_time - anger_modifier * 0.75) //scale cooldown lower with high anger. @@ -210,18 +213,19 @@ Difficulty: Hard var/blink_counter = 1 + round(anger_modifier * 0.08) switch(pick(possibilities)) if("blink_spam") //blink either once or multiple times. - if(health < maxHealth * 0.5 && !target_is_slow && blink_counter > 1) + if(health < maxHealth * 0.5 && blink_counter > 1) visible_message("\"Mx ampp rsx iwgeti.\"") var/oldcolor = color animate(src, color = "#660099", time = 6) - while(health && target && blink_counter) + sleep(6) + while(health && !QDELETED(target) && blink_counter) if(loc == target.loc || loc == target) //we're on the same tile as them after about a second we can stop now break blink_counter-- blinking = FALSE blink(target) blinking = TRUE - sleep(5) + sleep(4 + target_slowness) animate(src, color = oldcolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) sleep(8) @@ -233,15 +237,14 @@ Difficulty: Hard blinking = TRUE var/oldcolor = color animate(src, color = "#660099", time = 6) - while(health && target && cross_counter) + sleep(6) + while(health && !QDELETED(target) && cross_counter) cross_counter-- - var/delay = 7 if(prob(60)) INVOKE_ASYNC(src, .proc/cardinal_blasts, target) else INVOKE_ASYNC(src, .proc/diagonal_blasts, target) - delay = 5 //this one isn't so mean, so do the next one faster(if there is one) - sleep(delay) + sleep(6 + target_slowness) animate(src, color = oldcolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) sleep(8) @@ -250,19 +253,22 @@ Difficulty: Hard visible_message("\"Mx gerrsx lmhi.\"") blinking = TRUE var/oldcolor = color - animate(src, color = "#660099", time = 10) + animate(src, color = "#660099", time = 6) + sleep(6) var/list/targets = ListTargets() var/list/cardinal_copy = GLOB.cardinal.Copy() while(health && targets.len && cardinal_copy.len) var/mob/living/pickedtarget = pick(targets) - if(targets.len > 4) + if(targets.len >= cardinal_copy.len) pickedtarget = pick_n_take(targets) if(!istype(pickedtarget) || pickedtarget.stat == DEAD) pickedtarget = target + if(QDELETED(pickedtarget) || (istype(pickedtarget) && pickedtarget.stat == DEAD)) + break //main target is dead and we're out of living targets, cancel out var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, pickedtarget, chaser_speed, FALSE) C.moving = 3 C.moving_dir = pick_n_take(cardinal_copy) - sleep(10) + sleep(8 + target_slowness) chaser_cooldown = world.time + initial(chaser_cooldown) animate(src, color = oldcolor, time = 8) addtimer(CALLBACK(src, /atom/proc/update_atom_colour), 8) @@ -270,31 +276,24 @@ Difficulty: Hard blinking = FALSE return - if(prob(10 + (anger_modifier * 0.5)) && get_dist(src, target) > 2) - blink(target) - - else if(prob(70 - anger_modifier)) //a cross blast of some type - if(prob(anger_modifier)) //at us? - if(prob(anger_modifier * 2) && health < maxHealth * 0.5) //we're super angry do it at all dirs - INVOKE_ASYNC(src, .proc/alldir_blasts, src) - else if(prob(60)) - INVOKE_ASYNC(src, .proc/cardinal_blasts, src) - else - INVOKE_ASYNC(src, .proc/diagonal_blasts, src) - else //at them? - if(prob(anger_modifier * 2) && health < maxHealth * 0.5 && !target_is_slow) //we're super angry do it at all dirs - INVOKE_ASYNC(src, .proc/alldir_blasts, target) - else if(prob(60)) - INVOKE_ASYNC(src, .proc/cardinal_blasts, target) - else - INVOKE_ASYNC(src, .proc/diagonal_blasts, target) - else if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some! + if(chaser_cooldown < world.time) //if chasers are off cooldown, fire some! var/obj/effect/temp_visual/hierophant/chaser/C = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed, FALSE) chaser_cooldown = world.time + initial(chaser_cooldown) if((prob(anger_modifier) || target.Adjacent(src)) && target != src) - var/obj/effect/temp_visual/hierophant/chaser/OC = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, max(1.5, 5 - anger_modifier * 0.07), FALSE) + var/obj/effect/temp_visual/hierophant/chaser/OC = new /obj/effect/temp_visual/hierophant/chaser(loc, src, target, chaser_speed * 1.5, FALSE) OC.moving = 4 OC.moving_dir = pick(GLOB.cardinal - C.moving_dir) + + else if(prob(10 + (anger_modifier * 0.5)) && get_dist(src, target) > 2) + blink(target) + + else if(prob(70 - anger_modifier)) //a cross blast of some type + if(prob(anger_modifier * (2 / target_slowness)) && health < maxHealth * 0.5) //we're super angry do it at all dirs + INVOKE_ASYNC(src, .proc/alldir_blasts, target) + else if(prob(60)) + INVOKE_ASYNC(src, .proc/cardinal_blasts, target) + else + INVOKE_ASYNC(src, .proc/diagonal_blasts, target) else //just release a burst of power INVOKE_ASYNC(src, .proc/burst, get_turf(src))