From e229fa010f9f81d6f188ca2a940f0e2d11dfb5a5 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Tue, 28 May 2024 05:11:31 +0200 Subject: [PATCH] [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 :cl: refactor: Wendigos abilities have been changed into actions that can be added to any mob. /:cl: * Wendigo Mob Abilities --------- Co-authored-by: Whoneedspacee --- code/datums/actions/cooldown_action.dm | 3 + code/datums/actions/mobs/ground_slam.dm | 32 +++ code/datums/actions/mobs/projectileattack.dm | 86 ++++++ code/datums/actions/mobs/teleport.dm | 25 ++ .../hostile/megafauna/_megafauna.dm | 4 + .../hostile/megafauna/wendigo.dm | 244 ++++++------------ tgstation.dme | 2 + 7 files changed, 232 insertions(+), 164 deletions(-) create mode 100644 code/datums/actions/mobs/ground_slam.dm create mode 100644 code/datums/actions/mobs/teleport.dm 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"