diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm index dba06851d30..6649e72bd42 100644 --- a/code/datums/actions/mobs/projectileattack.dm +++ b/code/datums/actions/mobs/projectileattack.dm @@ -27,7 +27,7 @@ default_projectile_spread = spread /datum/action/cooldown/mob_cooldown/projectile_attack/Activate(atom/target_atom) - StartCooldown(100) + StartCooldown(10 SECONDS) attack_sequence(owner, target_atom) StartCooldown() @@ -142,6 +142,13 @@ playsound(get_turf(firer), projectile_sound, 20, TRUE) SLEEP_CHECK_DEATH(0.1 SECONDS, firer) +/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/colossus + cooldown_time = 1.5 SECONDS + +/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/colossus/Activate(atom/target_atom) + SLEEP_CHECK_DEATH(1.5 SECONDS, owner) + return ..() + /datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe name = "All Directions" icon_icon = 'icons/effects/effects.dmi' @@ -157,6 +164,13 @@ for(var/i in 1 to 32) shoot_projectile(firer, target, rand(0, 360), firer, null, null) +/datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/colossus + cooldown_time = 1.5 SECONDS + +/datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/colossus/Activate(atom/target_atom) + SLEEP_CHECK_DEATH(1.5 SECONDS, owner) + return ..() + /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast name = "Shotgun Fire" icon_icon = 'icons/obj/guns/ballistic.dmi' @@ -180,6 +194,14 @@ for(var/spread in chosen_angles) shoot_projectile(firer, target, null, firer, spread, null) + +/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/colossus + cooldown_time = 0.5 SECONDS + +/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/colossus/Activate(atom/target_atom) + SLEEP_CHECK_DEATH(1.5 SECONDS, owner) + return ..() + /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/pattern name = "Alternating Shotgun Fire" desc = "Fires projectiles in an alternating shotgun pattern." @@ -235,6 +257,13 @@ SLEEP_CHECK_DEATH(1 SECONDS, firer) fire_in_directions(firer, target, GLOB.cardinals) +/datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating/colossus + cooldown_time = 2.5 SECONDS + +/datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating/colossus/Activate(atom/target_atom) + SLEEP_CHECK_DEATH(1.5 SECONDS, owner) + return ..() + /datum/action/cooldown/mob_cooldown/projectile_attack/kinetic_accelerator name = "Fire Kinetic Accelerator" icon_icon = 'icons/obj/guns/energy.dmi' @@ -250,3 +279,49 @@ owner.visible_message(span_danger("[owner] fires the proto-kinetic accelerator!")) owner.face_atom(target_atom) new /obj/effect/temp_visual/dir_setting/firing_effect(owner.loc, owner.dir) + +/datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final + name = "Titan's Finale" + desc = "A single-use ability that shoots a large amount of projectiles around you." + cooldown_time = 2.5 SECONDS + +/datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final/Activate(atom/target_atom) + StartCooldown(30 SECONDS) + attack_sequence(owner, target_atom) + StartCooldown() + Remove(owner) + +/datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final/attack_sequence(mob/living/firer, atom/target) + var/mob/living/simple_animal/hostile/megafauna/colossus/colossus + if(istype(firer, /mob/living/simple_animal/hostile/megafauna/colossus)) + colossus = firer + colossus.say("Perish.", spans = list("colossus", "yell")) + + var/finale_counter = 10 + for(var/i in 1 to 20) + if(finale_counter > 4 && colossus) + colossus.telegraph() + colossus.shotgun_blast.attack_sequence(firer, target) + + if(finale_counter > 1) + finale_counter -= 1 + + var/turf/start_turf = get_turf(firer) + for(var/turf/target_turf in RANGE_TURFS(12, start_turf)) + if(prob(min(finale_counter, 2)) && target_turf != get_turf(firer)) + shoot_projectile(firer, target_turf, null, firer, null, null) + + SLEEP_CHECK_DEATH(finale_counter + 1, firer) + + for(var/i in 1 to 3) + if(colossus) + colossus.telegraph() + colossus.random_shots.attack_sequence(firer, target) + finale_counter += 6 + SLEEP_CHECK_DEATH(finale_counter, firer) + + for(var/i in 1 to 3) + if(colossus) + colossus.telegraph() + colossus.dir_shots.attack_sequence(firer, target) + SLEEP_CHECK_DEATH(1 SECONDS, firer) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 594c9d9964d..43c04f8db73 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -449,17 +449,10 @@ 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) - -/obj/effect/temp_visual/hierophant/wall/crusher - duration = 75 + if(isliving(target)) + var/obj/effect/temp_visual/hierophant/chaser/chaser = new(get_turf(user), user, target, 3, TRUE) + chaser.monster_damage_boost = FALSE // Weaker cuz no cooldown + log_combat(user, target, "fired a chaser at", src) 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 494e046b865..8d77efc2a55 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -1,4 +1,4 @@ -#define COLOSSUS_ENRAGED (health < maxHealth/3) +#define COLOSSUS_ENRAGED (health <= maxHealth / 3) /** * COLOSSUS @@ -57,25 +57,31 @@ deathsound = 'sound/magic/demon_dies.ogg' small_sprite_type = /datum/action/small_sprite/megafauna/colossus /// Spiral shots ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/spiral_shots + var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/colossus/spiral_shots /// Random shots ablity - var/datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/random_shots + var/datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/colossus/random_shots /// Shotgun blast ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/shotgun_blast + var/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/colossus/shotgun_blast /// Directional shots ability - var/datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating/dir_shots + var/datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating/colossus/dir_shots + /// Final attack ability + var/datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final/colossus_final + /// Have we used DIE yet? + var/final_availible = TRUE /mob/living/simple_animal/hostile/megafauna/colossus/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT) //we don't want this guy to float, messes up his animations. - spiral_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots() - random_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe() - shotgun_blast = new /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast() - dir_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating() + spiral_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/colossus() + random_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe/colossus() + shotgun_blast = new /datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/colossus() + dir_shots = new /datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/alternating/colossus() + colossus_final = new /datum/action/cooldown/mob_cooldown/projectile_attack/colossus_final() spiral_shots.Grant(src) random_shots.Grant(src) shotgun_blast.Grant(src) dir_shots.Grant(src) + colossus_final.Grant(src) RegisterSignal(src, COMSIG_ABILITY_STARTED, .proc/start_attack) RegisterSignal(src, COMSIG_ABILITY_FINISHED, .proc/finished_attack) AddElement(/datum/element/projectile_shield) @@ -89,7 +95,7 @@ return ..() /mob/living/simple_animal/hostile/megafauna/colossus/OpenFire() - anger_modifier = clamp(((maxHealth - health)/50),0,20) + anger_modifier = clamp(((maxHealth - health) / 40), 0, 20) if(client) return @@ -97,7 +103,7 @@ if(enrage(target)) if(move_to_delay == initial(move_to_delay)) visible_message(span_colossus("\"You can't dodge.\"")) - ranged_cooldown = world.time + 30 + ranged_cooldown = world.time + 3 SECONDS telegraph() dir_shots.fire_in_directions(src, target, GLOB.alldirs) move_to_delay = 3 @@ -105,21 +111,24 @@ else move_to_delay = initial(move_to_delay) - if(prob(20+anger_modifier)) //Major attack + if(health <= maxHealth / 10 && !final_availible) + final_availible = FALSE + colossus_final.Trigger(target = target) + else if(prob(20 + anger_modifier)) //Major attack spiral_shots.Trigger(target = target) else if(prob(20)) random_shots.Trigger(target = target) else - if(prob(70)) + if(prob(60 + anger_modifier)) shotgun_blast.Trigger(target = target) else dir_shots.Trigger(target = target) /mob/living/simple_animal/hostile/megafauna/colossus/proc/telegraph() - for(var/mob/M in range(10,src)) - if(M.client) - flash_color(M.client, "#C80000", 1) - shake_camera(M, 4, 3) + for(var/mob/viewer as anything in viewers(10, src)) + if(viewer.client) + flash_color(viewer.client, "#C80000", 1) + shake_camera(viewer, 4, 3) playsound(src, 'sound/magic/clockwork/narsie_attack.ogg', 200, TRUE) /mob/living/simple_animal/hostile/megafauna/colossus/proc/start_attack(mob/living/owner, datum/action/cooldown/activated) @@ -128,25 +137,31 @@ spiral_shots.enraged = COLOSSUS_ENRAGED telegraph() icon_state = "eva_attack" - visible_message(COLOSSUS_ENRAGED ? span_colossus("\"Die.\"") : span_colossus("\"Judgement.\"")) + INVOKE_ASYNC(src, /atom/movable.proc/say, "Judgement.", null, list("colossus", "yell")) + else if(activated == random_shots) + INVOKE_ASYNC(src, /atom/movable.proc/say, "Wrath.", null, list("colossus", "yell")) + else if(activated == shotgun_blast) + INVOKE_ASYNC(src, /atom/movable.proc/say, "Retribution.", null, list("colossus", "yell")) + else if(activated == dir_shots) + INVOKE_ASYNC(src, /atom/movable.proc/say, "Lament.", null, list("colossus", "yell")) /mob/living/simple_animal/hostile/megafauna/colossus/proc/finished_attack(mob/living/owner, datum/action/cooldown/finished) SIGNAL_HANDLER if(finished == spiral_shots) icon_state = initial(icon_state) -/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.mind) - if(istype(H.mind.martial_art, /datum/martial_art/the_sleeping_carp)) +/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/victim) + if(ishuman(victim)) + var/mob/living/carbon/human/human_victim = victim + if(human_victim.mind) + if(istype(human_victim.mind.martial_art, /datum/martial_art/the_sleeping_carp)) . = TRUE - if (is_species(H, /datum/species/golem/sand)) + if (is_species(human_victim, /datum/species/golem/sand)) . = TRUE -/mob/living/simple_animal/hostile/megafauna/colossus/devour(mob/living/L) - visible_message(span_colossus("[src] disintegrates [L]!")) - L.dust() +/mob/living/simple_animal/hostile/megafauna/colossus/devour(mob/living/victim) + visible_message(span_colossus("[src] disintegrates [victim]!")) + victim.dust() /obj/effect/temp_visual/at_shield name = "anti-toolbox field"