The Hierophant is a little less chaotic and murdery on average

This commit is contained in:
CitadelStationBot
2017-06-17 16:54:43 -05:00
parent 00a4b5ce8c
commit 31b7f9a074
@@ -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("<span class='hierophant'>\"Mx ampp rsx iwgeti.\"</span>")
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("<span class='hierophant'>\"Mx gerrsx lmhi.\"</span>")
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))