diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 560d8f66872..957a6e9a53e 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -442,17 +442,12 @@ denied_type = /obj/item/crusher_trophy/vortex_talisman /obj/item/crusher_trophy/vortex_talisman/effect_desc() - return "mark detonation to create a barrier you can pass" + return "mark detonation to create a homing hierophant chaser" /obj/item/crusher_trophy/vortex_talisman/on_mark_detonation(mob/living/target, mob/living/user) - var/turf/T = get_turf(user) - new /obj/effect/temp_visual/hierophant/wall/crusher(T, user) //a wall only you can pass! - var/turf/otherT = get_step(T, turn(user.dir, 90)) - if(otherT) - new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) - otherT = get_step(T, turn(user.dir, -90)) - if(otherT) - new /obj/effect/temp_visual/hierophant/wall/crusher(otherT, user) + var/obj/effect/temp_visual/hierophant/chaser/chaser = new(get_turf(user), user, target, 3, TRUE) + chaser.monster_damage_boost = FALSE // Weaker due to no cooldown + chaser.damage = 20 //But also stronger due to AI / mining mob resistance /obj/effect/temp_visual/hierophant/wall/crusher duration = 75 diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index ead9c4df0d1..261b007ffa6 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -1,3 +1,7 @@ +#define RANDOM_SHOTS "Wrath" +#define BLAST "Retribution" +#define DIR_SHOTS "Lament" + /* COLOSSUS @@ -42,6 +46,7 @@ Difficulty: Very Hard ranged = TRUE pixel_x = -32 del_on_death = TRUE + universal_speak = TRUE internal_type = /obj/item/gps/internal/colossus medal_type = BOSS_MEDAL_COLOSSUS score_type = COLOSSUS_SCORE @@ -53,6 +58,8 @@ Difficulty: Very Hard /datum/action/innate/megafauna_attack/aoe_attack, /datum/action/innate/megafauna_attack/shotgun, /datum/action/innate/megafauna_attack/alternating_cardinals) + /// Have we used our final attack yet? + var/final_available = TRUE /datum/action/innate/megafauna_attack/spiral_attack name = "Spiral Shots" @@ -82,6 +89,10 @@ Difficulty: Very Hard chosen_message = "You are now firing in alternating cardinal directions." chosen_attack_num = 4 +/mob/living/simple_animal/hostile/megafauna/colossus/say(message, bubble_type, list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null, filterproof = null) + . = ..(("[uppertext(message)]"), sanitize = FALSE, ignore_speech_problems = TRUE, ignore_atmospherics = TRUE) + + /mob/living/simple_animal/hostile/megafauna/colossus/OpenFire() anger_modifier = clamp(((maxHealth - health)/50),0,20) ranged_cooldown = world.time + 120 @@ -100,7 +111,7 @@ Difficulty: Very Hard if(enrage(target)) if(move_to_delay == initial(move_to_delay)) - visible_message("\"You can't dodge.\"") + say("You can't dodge") ranged_cooldown = world.time + 30 telegraph() dir_shots(GLOB.alldirs) @@ -109,7 +120,10 @@ Difficulty: Very Hard else move_to_delay = initial(move_to_delay) - if(prob(20+anger_modifier)) //Major attack + if(health <= maxHealth / 10 && final_available) //One time use final attack + final_available = FALSE + final_attack() + else if(prob(20 + anger_modifier)) //Major attack select_spiral_attack() else if(prob(20)) random_shots() @@ -127,6 +141,8 @@ Difficulty: Very Hard /mob/living/simple_animal/hostile/megafauna/colossus/proc/alternating_dir_shots() ranged_cooldown = world.time + 40 + telegraph(DIR_SHOTS) + SLEEP_CHECK_DEATH(1.5 SECONDS) dir_shots(GLOB.diagonals) SLEEP_CHECK_DEATH(10) dir_shots(GLOB.cardinal) @@ -136,20 +152,22 @@ Difficulty: Very Hard dir_shots(GLOB.cardinal) /mob/living/simple_animal/hostile/megafauna/colossus/proc/select_spiral_attack() - telegraph() if(health < maxHealth/3) return double_spiral() - visible_message("\"Judgement.\"") + say("Judgement.") + telegraph() + SLEEP_CHECK_DEATH(1.5 SECONDS) return spiral_shoot() /mob/living/simple_animal/hostile/megafauna/colossus/proc/double_spiral() - visible_message("\"Die.\"") - - SLEEP_CHECK_DEATH(10) + say("Die.") + telegraph() + SLEEP_CHECK_DEATH(2.5 SECONDS) INVOKE_ASYNC(src, .proc/spiral_shoot, FALSE) INVOKE_ASYNC(src, .proc/spiral_shoot, TRUE) /mob/living/simple_animal/hostile/megafauna/colossus/proc/spiral_shoot(negative = pick(TRUE, FALSE), counter_start = 8) + icon_state = "eva_attack" var/turf/start_turf = get_step(src, pick(GLOB.alldirs)) var/counter = counter_start for(var/i in 1 to 80) @@ -164,6 +182,7 @@ Difficulty: Very Hard shoot_projectile(start_turf, counter * 22.5) playsound(get_turf(src), 'sound/magic/clockwork/invoke_general.ogg', 20, TRUE) SLEEP_CHECK_DEATH(1) + icon_state = initial(icon_state) /mob/living/simple_animal/hostile/megafauna/colossus/proc/shoot_projectile(turf/marker, set_angle) if(!isnum(set_angle) && (!marker || marker == loc)) @@ -177,16 +196,22 @@ Difficulty: Very Hard P.original = target P.fire(set_angle) -/mob/living/simple_animal/hostile/megafauna/colossus/proc/random_shots() +/mob/living/simple_animal/hostile/megafauna/colossus/proc/random_shots(do_sleep = TRUE) ranged_cooldown = world.time + 30 + if(do_sleep) + telegraph(RANDOM_SHOTS) + SLEEP_CHECK_DEATH(1.5 SECONDS) var/turf/U = get_turf(src) playsound(U, 'sound/magic/clockwork/invoke_general.ogg', 300, TRUE, 5) for(var/T in RANGE_TURFS(12, U) - U) if(prob(5)) shoot_projectile(T) -/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast(set_angle) +/mob/living/simple_animal/hostile/megafauna/colossus/proc/blast(set_angle, do_sleep = TRUE) ranged_cooldown = world.time + 20 + if(do_sleep) + telegraph(BLAST) + SLEEP_CHECK_DEATH(1.5 SECONDS) var/turf/target_turf = get_turf(target) playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 200, TRUE, 2) newtonian_move(get_dir(target_turf, src)) @@ -205,12 +230,49 @@ Difficulty: Very Hard var/turf/E = get_step(src, d) shoot_projectile(E) -/mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph() +/mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph(mode) for(var/mob/M in range(10, src)) M.flash_screen_color("#C80000", 1) shake_camera(M, 4, 3) playsound(src, 'sound/magic/narsie_attack.ogg', 200, TRUE) + if(mode) + say("[mode]") +/mob/living/simple_animal/hostile/megafauna/colossus/proc/final_attack() + icon_state = "eva_attack" + say("PERISH MORTAL!") + telegraph() + ranged_cooldown = world.time + 20 SECONDS // Yeah let us NOT have people get triple attacked + SLEEP_CHECK_DEATH(2.5 SECONDS) //run + + var/finale_counter = 10 + for(var/i in 1 to 20) + if(finale_counter > 4) + telegraph() + blast(do_sleep = FALSE) + + if(finale_counter > 1) + finale_counter-- + + var/turf/start_turf = get_turf(src) + for(var/turf/target_turf in RANGE_TURFS(12, start_turf)) + if(prob(min(finale_counter, 2)) && target_turf != get_turf(src)) + shoot_projectile(target_turf) + + SLEEP_CHECK_DEATH(finale_counter + 0.2 SECONDS) //Doubled from TG, this was insane + + for(var/i in 1 to 3) + telegraph() + random_shots(do_sleep = FALSE) + finale_counter += 6 + SLEEP_CHECK_DEATH(finale_counter) + + for(var/i in 1 to 3) + telegraph() + dir_shots() + SLEEP_CHECK_DEATH(1 SECONDS) + icon_state = initial(icon_state) + ranged_cooldown = world.time + 4 SECONDS /mob/living/simple_animal/hostile/megafauna/colossus/devour(mob/living/L) visible_message("[src] disintegrates [L]!") @@ -273,3 +335,7 @@ Difficulty: Very Hard gpstag = "Angelic Signal" desc = "Get in the fucking robot." invisibility = 100 + +#undef RANDOM_SHOTS +#undef BLAST +#undef DIR_SHOTS diff --git a/icons/mob/lavaland/96x96megafauna.dmi b/icons/mob/lavaland/96x96megafauna.dmi index 250c36671d8..9bd0d7d331f 100644 Binary files a/icons/mob/lavaland/96x96megafauna.dmi and b/icons/mob/lavaland/96x96megafauna.dmi differ