mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 21:18:37 +01:00
[MIRROR] Wendigo Mob Abilities (#27872)
* Wendigo Mob Abilities (#83325) ## About The Pull Request Converts wendigo's abilities into mob abilities, behavior should be almost identical to how it was before. Also gave megafauna the same night vision as normal lavaland mobs since controlling them and being unable to see was difficult while testing. Wendigo's scream and slam were made into global procs so they could be used across these abilities, but if there's a better way to do that I'm open to it. ## Why It's Good For The Game More refactoring to make way for converting these all to basic megafauna. ## Changelog 🆑 refactor: Wendigos abilities have been changed into actions that can be added to any mob. /🆑 * Wendigo Mob Abilities --------- Co-authored-by: Whoneedspacee <yougotreallyowned@gmail.com>
This commit is contained in:
co-authored by
Whoneedspacee
parent
a53e0459a6
commit
e229fa010f
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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 = "<span class='colossus'>You are now stomping the ground around you.</span>"
|
||||
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 = "<span class='colossus'>You are now teleporting at the target you click on.</span>"
|
||||
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 = "<span class='colossus'>You are now screeching, disorienting targets around you.</span>"
|
||||
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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user