diff --git a/code/datums/actions/cooldown_action.dm b/code/datums/actions/cooldown_action.dm
index 18fe9f22e80..1c290c5f224 100644
--- a/code/datums/actions/cooldown_action.dm
+++ b/code/datums/actions/cooldown_action.dm
@@ -171,6 +171,9 @@
next_use_time = world.time + override_cooldown_time
else
next_use_time = world.time + cooldown_time
+ // Don't start a cooldown if we have a cooldown time of 0 seconds
+ if(next_use_time == world.time)
+ return
build_all_button_icons(UPDATE_BUTTON_STATUS)
START_PROCESSING(SSfastprocess, src)
diff --git a/code/datums/actions/mobs/ground_slam.dm b/code/datums/actions/mobs/ground_slam.dm
new file mode 100644
index 00000000000..e00799196b5
--- /dev/null
+++ b/code/datums/actions/mobs/ground_slam.dm
@@ -0,0 +1,32 @@
+/datum/action/cooldown/mob_cooldown/ground_slam
+ name = "Ground Slam"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Slams the ground sending out a shockwave around you."
+ cooldown_time = 10 SECONDS
+ /// The range of the slam
+ var/range = 5
+ /// The delay before the shockwave expands it's range
+ var/delay = 3
+ /// How far hit targets are thrown
+ var/throw_range = 8
+ /// Whether the target can move or not while the slam is occurring
+ var/can_move = FALSE
+
+/datum/action/cooldown/mob_cooldown/ground_slam/Activate(atom/target_atom)
+ disable_cooldown_actions()
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE)
+ do_slam(target_atom)
+ UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
+ StartCooldown()
+ enable_cooldown_actions()
+ return TRUE
+
+/// Slams the ground around the source throwing back enemies caught nearby, delay is for the radius increase
+/datum/action/cooldown/mob_cooldown/ground_slam/proc/do_slam(atom/target)
+ wendigo_slam(owner, range, delay, throw_range)
+
+/datum/action/cooldown/mob_cooldown/ground_slam/proc/on_move(atom/source, atom/new_loc)
+ SIGNAL_HANDLER
+ if(!can_move)
+ return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
diff --git a/code/datums/actions/mobs/projectileattack.dm b/code/datums/actions/mobs/projectileattack.dm
index be7eff89633..d8f8e6bdf64 100644
--- a/code/datums/actions/mobs/projectileattack.dm
+++ b/code/datums/actions/mobs/projectileattack.dm
@@ -16,14 +16,23 @@
var/default_projectile_spread = 0
/// The multiplier to the projectiles speed (a value of 2 makes it twice as slow, 0.5 makes it twice as fast)
var/projectile_speed_multiplier = 1
+ /// Whether the target can move or not while the attack is occurring
+ var/can_move = TRUE
/datum/action/cooldown/mob_cooldown/projectile_attack/Activate(atom/target_atom)
disable_cooldown_actions()
+ RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(on_move), override = TRUE)
attack_sequence(owner, target_atom)
+ UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
StartCooldown()
enable_cooldown_actions()
return TRUE
+/datum/action/cooldown/mob_cooldown/projectile_attack/proc/on_move(atom/source, atom/new_loc)
+ SIGNAL_HANDLER
+ if(!can_move)
+ return COMPONENT_MOVABLE_BLOCK_PRE_MOVE
+
/datum/action/cooldown/mob_cooldown/projectile_attack/proc/attack_sequence(mob/living/firer, atom/target)
shoot_projectile(firer, target, null, firer, rand(-default_projectile_spread, default_projectile_spread), null)
@@ -151,6 +160,25 @@
SLEEP_CHECK_DEATH(1.5 SECONDS, owner)
return ..()
+/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/spiral
+ can_move = FALSE
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo/create_spiral_attack(mob/living/firer, atom/target, negative = pick(TRUE, FALSE))
+ wendigo_scream(firer)
+ var/shots_spiral = 40
+ var/angle_to_target = get_angle(firer, target)
+ var/spiral_direction = pick(-1, 1)
+ for(var/shot in 1 to shots_spiral)
+ var/shots_per_tick = 5 - enraged * 3
+ var/angle_change = (5 + enraged * shot / 6) * spiral_direction
+ for(var/count in 1 to shots_per_tick)
+ var/angle = angle_to_target + shot * angle_change + count * 360 / shots_per_tick
+ shoot_projectile(firer, target, angle, firer, null, null)
+ SLEEP_CHECK_DEATH(1, firer)
+ SLEEP_CHECK_DEATH(3 SECONDS, firer)
+
/datum/action/cooldown/mob_cooldown/projectile_attack/random_aoe
name = "All Directions"
button_icon = 'icons/effects/effects.dmi'
@@ -192,6 +220,13 @@
shoot_projectile(firer, target, null, firer, spread, null)
+/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/wendigo
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave
+ shot_angles = list(-20, -10, 0, 10, 20)
+ projectile_speed_multiplier = 4
+
+
/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/colossus
cooldown_time = 0.5 SECONDS
@@ -327,3 +362,54 @@
colossus.telegraph()
colossus.dir_shots.attack_sequence(firer, target)
SLEEP_CHECK_DEATH(1 SECONDS, firer)
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle
+ name = "Alternating Shots"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Fires projectiles around you in an alternating fashion."
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave
+ can_move = FALSE
+ var/enraged = FALSE
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle/attack_sequence(mob/living/firer, atom/target)
+ wendigo_scream(firer)
+ if(enraged)
+ projectile_speed_multiplier = 1
+ else
+ projectile_speed_multiplier = 1.5
+ var/shots_per = 24
+ for(var/shoot_times in 1 to 8)
+ var/offset = shoot_times % 2
+ for(var/shot in 1 to shots_per)
+ var/angle = shot * 360 / shots_per + (offset * 360 / shots_per) * 0.5
+ shoot_projectile(firer, target, angle, firer, null, null)
+ SLEEP_CHECK_DEATH(6 - enraged * 2, firer)
+ SLEEP_CHECK_DEATH(3 SECONDS, firer)
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/wave
+ name = "Wave Shots"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Fires projectiles around you in a circular wave."
+ cooldown_time = 10 SECONDS
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave
+ can_move = FALSE
+
+/datum/action/cooldown/mob_cooldown/projectile_attack/wave/attack_sequence(mob/living/firer, atom/target)
+ wendigo_scream(firer)
+ var/shots_per = 7
+ var/difference = 360 / shots_per
+ var/wave_direction = pick(-1, 1)
+ switch(wave_direction)
+ if(-1)
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave/alternate
+ if(1)
+ projectile_type = /obj/projectile/colossus/wendigo_shockwave/wave
+ for(var/shoot_times in 1 to 32)
+ for(var/shot in 1 to shots_per)
+ var/angle = shot * difference + shoot_times * 5 * wave_direction * -1
+ shoot_projectile(firer, target, angle, firer, null, null)
+ SLEEP_CHECK_DEATH(2, firer)
+ SLEEP_CHECK_DEATH(3 SECONDS, firer)
diff --git a/code/datums/actions/mobs/teleport.dm b/code/datums/actions/mobs/teleport.dm
new file mode 100644
index 00000000000..7b7ffddf30b
--- /dev/null
+++ b/code/datums/actions/mobs/teleport.dm
@@ -0,0 +1,25 @@
+/datum/action/cooldown/mob_cooldown/teleport
+ name = "Teleport"
+ button_icon = 'icons/mob/actions/actions_items.dmi'
+ button_icon_state = "sniper_zoom"
+ desc = "Allows you to teleport a certain distance away from a position in a random direction."
+ cooldown_time = 10 SECONDS
+ /// The distance from the target
+ var/radius = 6
+
+/datum/action/cooldown/mob_cooldown/teleport/Activate(atom/target_atom)
+ disable_cooldown_actions()
+ teleport_to(target_atom)
+ StartCooldown()
+ enable_cooldown_actions()
+ return TRUE
+
+/// Handles randomly teleporting the owner around the target in view
+/datum/action/cooldown/mob_cooldown/teleport/proc/teleport_to(atom/teleport_target)
+ var/list/possible_ends = view(radius, teleport_target.loc) - view(radius - 1, teleport_target.loc)
+ for(var/turf/closed/cant_teleport_turf in possible_ends)
+ possible_ends -= cant_teleport_turf
+ if(!possible_ends.len)
+ return
+ var/turf/end = pick(possible_ends)
+ do_teleport(owner, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
index 90c242a693b..16f4cbc9779 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/_megafauna.dm
@@ -20,6 +20,10 @@
maxbodytemp = INFINITY
vision_range = 5
aggro_vision_range = 18
+ // Pale purple, should be red enough to see stuff on lavaland
+ lighting_cutoff_red = 25
+ lighting_cutoff_green = 15
+ lighting_cutoff_blue = 35
move_force = MOVE_FORCE_OVERPOWERING
move_resist = MOVE_FORCE_OVERPOWERING
pull_force = MOVE_FORCE_OVERPOWERING
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
index e5ca8d0cbdf..d2773597fa1 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/wendigo.dm
@@ -1,10 +1,4 @@
#define WENDIGO_ENRAGED (health <= maxHealth*0.5)
-#define WENDIGO_CIRCLE_SHOTCOUNT 24
-#define WENDIGO_CIRCLE_REPEATCOUNT 8
-#define WENDIGO_SPIRAL_SHOTCOUNT 40
-#define WENDIGO_WAVE_SHOTCOUNT 7
-#define WENDIGO_WAVE_REPEATCOUNT 32
-#define WENDIGO_SHOTGUN_SHOTCOUNT 5
/*
@@ -51,9 +45,6 @@ Difficulty: Hard
death_message = "falls to the ground in a bloody heap, shaking the arena."
death_sound = 'sound/effects/gravhit.ogg'
footstep_type = FOOTSTEP_MOB_HEAVY
- attack_action_types = list(/datum/action/innate/megafauna_attack/heavy_stomp,
- /datum/action/innate/megafauna_attack/teleport,
- /datum/action/innate/megafauna_attack/shockwave_scream)
summon_line = "GwaHOOOOOOOOOOOOOOOOOOOOO"
/// Saves the turf the megafauna was created at (spawns exit portal here)
var/turf/starting
@@ -61,37 +52,38 @@ Difficulty: Hard
var/stomp_range = 1
/// Stores directions the mob is moving, then calls that a move has fully ended when these directions are removed in moved
var/stored_move_dirs = 0
- /// If the wendigo is allowed to move
- var/can_move = TRUE
/// Time before the wendigo can scream again
var/scream_cooldown_time = 10 SECONDS
+ /// Teleport Ability
+ var/datum/action/cooldown/mob_cooldown/teleport/teleport
+ /// Shotgun Ability
+ var/datum/action/cooldown/mob_cooldown/projectile_attack/shotgun_blast/wendigo/shotgun_blast
+ /// Ground Slam Ability
+ var/datum/action/cooldown/mob_cooldown/ground_slam/ground_slam
+ /// Alternating Projectiles Ability
+ var/datum/action/cooldown/mob_cooldown/projectile_attack/alternating_circle/alternating_circle
+ /// Spiral Projectiles Ability
+ var/datum/action/cooldown/mob_cooldown/projectile_attack/spiral_shots/wendigo/spiral
+ /// Wave Projectiles Ability
+ var/datum/action/cooldown/mob_cooldown/projectile_attack/wave/wave
/// Stores the last scream time so it doesn't spam it
COOLDOWN_DECLARE(scream_cooldown)
/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT)
-
-/datum/action/innate/megafauna_attack/heavy_stomp
- name = "Heavy Stomp"
- button_icon = 'icons/mob/actions/actions_items.dmi'
- button_icon_state = "sniper_zoom"
- chosen_message = "You are now stomping the ground around you."
- chosen_attack_num = 1
-
-/datum/action/innate/megafauna_attack/teleport
- name = "Teleport"
- button_icon = 'icons/effects/bubblegum.dmi'
- button_icon_state = "smack ya one"
- chosen_message = "You are now teleporting at the target you click on."
- chosen_attack_num = 2
-
-/datum/action/innate/megafauna_attack/shockwave_scream
- name = "Shockwave Scream"
- button_icon = 'icons/mob/actions/actions_animal.dmi'
- button_icon_state = "expand"
- chosen_message = "You are now screeching, disorienting targets around you."
- chosen_attack_num = 3
+ teleport = new(src)
+ shotgun_blast = new(src)
+ ground_slam = new(src)
+ alternating_circle = new(src)
+ spiral = new(src)
+ wave = new(src)
+ teleport.Grant(src)
+ shotgun_blast.Grant(src)
+ ground_slam.Grant(src)
+ alternating_circle.Grant(src)
+ spiral.Grant(src)
+ wave.Grant(src)
/mob/living/simple_animal/hostile/megafauna/wendigo/Initialize(mapload)
. = ..()
@@ -108,13 +100,6 @@ Difficulty: Hard
move_to_delay = initial(move_to_delay)
if(client)
- switch(chosen_attack)
- if(1)
- heavy_stomp()
- if(2)
- try_teleport()
- if(3)
- shockwave_scream()
return
var/mob/living/living_target = target
@@ -127,28 +112,54 @@ Difficulty: Hard
chosen_attack = rand(1, 2)
switch(chosen_attack)
if(1)
- heavy_stomp()
+ ground_slam.Activate(target)
if(2)
- try_teleport()
+ teleport.Activate(target)
+ if(WENDIGO_ENRAGED)
+ shotgun_blast.Activate(target)
if(3)
do_teleport(src, starting, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
- shockwave_scream()
+ var/shockwave_attack
+ if(WENDIGO_ENRAGED)
+ shockwave_attack = rand(1, 3)
+ else
+ shockwave_attack = rand(1, 2)
+ switch(shockwave_attack)
+ if(1)
+ alternating_circle.enraged = WENDIGO_ENRAGED
+ alternating_circle.Activate(target)
+ if(2)
+ spiral.enraged = WENDIGO_ENRAGED
+ spiral.Activate(target)
+ if(3)
+ wave.Activate(target)
+ update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 3 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 3 SECONDS))
/mob/living/simple_animal/hostile/megafauna/wendigo/Move(atom/newloc, direct)
- if(!can_move)
- return
stored_move_dirs |= direct
- return ..()
+ . = ..()
+ // Remove after anyways in case the movement was prevented
+ stored_move_dirs &= ~direct
/mob/living/simple_animal/hostile/megafauna/wendigo/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change = TRUE)
. = ..()
stored_move_dirs &= ~movement_dir
if(!stored_move_dirs)
- INVOKE_ASYNC(src, PROC_REF(wendigo_slam), stomp_range, 1, 8)
+ INVOKE_ASYNC(GLOBAL_PROC, GLOBAL_PROC_REF(wendigo_slam), src, stomp_range, 1, 8)
-/// Slams the ground around the source throwing back enemies caught nearby, delay is for the radius increase
-/mob/living/simple_animal/hostile/megafauna/wendigo/proc/wendigo_slam(range, delay, throw_range)
- var/turf/origin = get_turf(src)
+/proc/wendigo_scream(mob/owner)
+ SLEEP_CHECK_DEATH(5, owner)
+ playsound(owner.loc, 'sound/magic/demon_dies.ogg', 600, FALSE, 10)
+ var/pixel_shift = rand(5, 15)
+ animate(owner, pixel_z = pixel_shift, time = 1, loop = 20, flags = ANIMATION_RELATIVE)
+ animate(pixel_z = -pixel_shift, time = 1, flags = ANIMATION_RELATIVE)
+ for(var/mob/living/dizzy_target in get_hearers_in_view(7, owner) - owner)
+ dizzy_target.set_dizzy_if_lower(12 SECONDS)
+ to_chat(dizzy_target, span_danger("[owner] screams loudly!"))
+ SLEEP_CHECK_DEATH(1 SECONDS, owner)
+
+/proc/wendigo_slam(mob/owner, range, delay, throw_range)
+ var/turf/origin = get_turf(owner)
if(!origin)
return
var/list/all_turfs = RANGE_TURFS(range, origin)
@@ -158,117 +169,16 @@ Difficulty: Hard
if(get_dist(origin, stomp_turf) > sound_range)
continue
new /obj/effect/temp_visual/small_smoke/halfsecond(stomp_turf)
- for(var/mob/living/target in stomp_turf)
- if(target == src || target.throwing)
+ for(var/mob/living/hit_mob in stomp_turf)
+ if(hit_mob == owner || hit_mob.throwing)
continue
- to_chat(target, span_userdanger("[src]'s ground slam shockwave sends you flying!"))
- var/turf/thrownat = get_ranged_target_turf_direct(src, target, throw_range, rand(-10, 10))
- target.throw_at(thrownat, 8, 2, null, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE)
- target.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND)
- shake_camera(target, 2, 1)
+ to_chat(hit_mob, span_userdanger("[owner]'s ground slam shockwave sends you flying!"))
+ var/turf/thrownat = get_ranged_target_turf_direct(owner, hit_mob, throw_range, rand(-10, 10))
+ hit_mob.throw_at(thrownat, 8, 2, null, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE)
+ hit_mob.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND)
+ shake_camera(hit_mob, 2, 1)
all_turfs -= stomp_turf
- sleep(delay)
-
-/// Larger but slower ground stomp
-/mob/living/simple_animal/hostile/megafauna/wendigo/proc/heavy_stomp()
- can_move = FALSE
- wendigo_slam(5, 3 - WENDIGO_ENRAGED, 8)
- update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 0 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 0 SECONDS))
- can_move = TRUE
-
-/// Teleports to a location 4 turfs away from the enemy in view
-/mob/living/simple_animal/hostile/megafauna/wendigo/proc/try_teleport()
- teleport(6)
- if(WENDIGO_ENRAGED)
- playsound(loc, 'sound/magic/clockwork/invoke_general.ogg', 100, TRUE)
- for(var/shots in 1 to WENDIGO_SHOTGUN_SHOTCOUNT)
- var/spread = shots * 10 - 30
- var/turf/startloc = get_step(get_turf(src), get_dir(src, target))
- var/turf/endloc = get_turf(target)
- if(!endloc)
- break
- var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc)
- shockwave.speed = 8
- shockwave.preparePixelProjectile(endloc, startloc, null, spread)
- shockwave.firer = src
- if(target)
- shockwave.original = target
- shockwave.fire()
- update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 0 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 0 SECONDS))
-
-/mob/living/simple_animal/hostile/megafauna/wendigo/proc/teleport(range = 6)
- var/list/possible_ends = view(range, target.loc) - view(range - 1, target.loc)
- for(var/turf/closed/cant_teleport_turf in possible_ends)
- possible_ends -= cant_teleport_turf
- if(!possible_ends.len)
- return
- var/turf/end = pick(possible_ends)
- do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
-
-/// Applies dizziness to all nearby enemies that can hear the scream and animates the wendigo shaking up and down as shockwave projectiles shoot outward
-/mob/living/simple_animal/hostile/megafauna/wendigo/proc/shockwave_scream()
- can_move = FALSE
- COOLDOWN_START(src, scream_cooldown, scream_cooldown_time)
- SLEEP_CHECK_DEATH(5, src)
- playsound(loc, 'sound/magic/demon_dies.ogg', 600, FALSE, 10)
- var/pixel_shift = rand(5, 15)
- animate(src, pixel_z = pixel_shift, time = 1, loop = 20, flags = ANIMATION_RELATIVE)
- animate(pixel_z = -pixel_shift, time = 1, flags = ANIMATION_RELATIVE)
- for(var/mob/living/dizzy_target in get_hearers_in_view(7, src) - src)
- dizzy_target.set_dizzy_if_lower(12 SECONDS)
- to_chat(dizzy_target, span_danger("The wendigo screams loudly!"))
- SLEEP_CHECK_DEATH(1 SECONDS, src)
- spiral_attack()
- update_cooldowns(list(COOLDOWN_UPDATE_SET_MELEE = 3 SECONDS, COOLDOWN_UPDATE_SET_RANGED = 3 SECONDS))
- SLEEP_CHECK_DEATH(3 SECONDS, src)
- can_move = TRUE
-
-/// Shoots shockwave projectiles in a random preset pattern
-/mob/living/simple_animal/hostile/megafauna/wendigo/proc/spiral_attack()
- var/list/choices = list("Alternating Circle", "Spiral")
- if(WENDIGO_ENRAGED)
- choices += "Wave"
- var/spiral_type = pick(choices)
- switch(spiral_type)
- if("Alternating Circle")
- var/shots_per = WENDIGO_CIRCLE_SHOTCOUNT
- for(var/shoot_times in 1 to WENDIGO_CIRCLE_REPEATCOUNT)
- var/offset = shoot_times % 2
- for(var/shot in 1 to shots_per)
- var/angle = shot * 360 / shots_per + (offset * 360 / shots_per) * 0.5
- var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc)
- shockwave.firer = src
- shockwave.speed = 3 - WENDIGO_ENRAGED
- shockwave.fire(angle)
- SLEEP_CHECK_DEATH(6 - WENDIGO_ENRAGED * 2, src)
- if("Spiral")
- var/shots_spiral = WENDIGO_SPIRAL_SHOTCOUNT
- var/angle_to_target = get_angle(src, target)
- var/spiral_direction = pick(-1, 1)
- for(var/shot in 1 to shots_spiral)
- var/shots_per_tick = 5 - WENDIGO_ENRAGED * 3
- var/angle_change = (5 + WENDIGO_ENRAGED * shot / 6) * spiral_direction
- for(var/count in 1 to shots_per_tick)
- var/angle = angle_to_target + shot * angle_change + count * 360 / shots_per_tick
- var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc)
- shockwave.firer = src
- shockwave.damage = 15
- shockwave.fire(angle)
- SLEEP_CHECK_DEATH(1, src)
- if("Wave")
- var/shots_per = WENDIGO_WAVE_SHOTCOUNT
- var/difference = 360 / shots_per
- var/wave_direction = pick(-1, 1)
- for(var/shoot_times in 1 to WENDIGO_WAVE_REPEATCOUNT)
- for(var/shot in 1 to shots_per)
- var/angle = shot * difference + shoot_times * 5 * wave_direction * -1
- var/obj/projectile/colossus/wendigo_shockwave/shockwave = new /obj/projectile/colossus/wendigo_shockwave(loc)
- shockwave.firer = src
- shockwave.wave_movement = TRUE
- shockwave.speed = 8
- shockwave.wave_speed = 10 * wave_direction
- shockwave.fire(angle)
- SLEEP_CHECK_DEATH(2, src)
+ SLEEP_CHECK_DEATH(delay, owner)
/mob/living/simple_animal/hostile/megafauna/wendigo/death(gibbed, list/force_grant)
if(health > 0)
@@ -285,6 +195,7 @@ Difficulty: Hard
/obj/projectile/colossus/wendigo_shockwave
name = "wendigo shockwave"
+ speed = 2
/// If wave movement is enabled
var/wave_movement = FALSE
/// Amount the angle changes every pixel move
@@ -292,6 +203,17 @@ Difficulty: Hard
/// Amount of movements this projectile has made
var/pixel_moves = 0
+/obj/projectile/colossus/wendigo_shockwave/spiral
+ damage = 15
+
+/obj/projectile/colossus/wendigo_shockwave/wave
+ speed = 8
+ wave_movement = TRUE
+ wave_speed = 10
+
+/obj/projectile/colossus/wendigo_shockwave/wave/alternate
+ wave_speed = -10
+
/obj/projectile/colossus/wendigo_shockwave/pixel_move(trajectory_multiplier, hitscanning = FALSE)
. = ..()
if(wave_movement)
@@ -348,9 +270,3 @@ Difficulty: Hard
throwforce = 0
#undef WENDIGO_ENRAGED
-#undef WENDIGO_CIRCLE_SHOTCOUNT
-#undef WENDIGO_CIRCLE_REPEATCOUNT
-#undef WENDIGO_SPIRAL_SHOTCOUNT
-#undef WENDIGO_WAVE_SHOTCOUNT
-#undef WENDIGO_WAVE_REPEATCOUNT
-#undef WENDIGO_SHOTGUN_SHOTCOUNT
diff --git a/tgstation.dme b/tgstation.dme
index d85b34113c5..c1e1210976b 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -947,6 +947,7 @@
#include "code\datums\actions\mobs\dash.dm"
#include "code\datums\actions\mobs\defensive_mode.dm"
#include "code\datums\actions\mobs\fire_breath.dm"
+#include "code\datums\actions\mobs\ground_slam.dm"
#include "code\datums\actions\mobs\lava_swoop.dm"
#include "code\datums\actions\mobs\meteors.dm"
#include "code\datums\actions\mobs\mobcooldown.dm"
@@ -955,6 +956,7 @@
#include "code\datums\actions\mobs\projectileattack.dm"
#include "code\datums\actions\mobs\sign_language.dm"
#include "code\datums\actions\mobs\sneak.dm"
+#include "code\datums\actions\mobs\teleport.dm"
#include "code\datums\actions\mobs\transform_weapon.dm"
#include "code\datums\actions\mobs\sequences\dash_attack.dm"
#include "code\datums\actions\mobs\sequences\projectile.dm"