[MIRROR] Icebox Wendigo Buff + Crusher Trophies (#3863)
* Icebox Wendigo Buff + Crusher Trophies (#56258) Co-authored-by: Jonathan Church <jchurch093@ gmail.com> Co-authored-by: s <wesoda24@ gmail.com> Co-authored-by: spookydonut <github@ spooksoftware.com> Co-authored-by: Rohesie <rohesie@ gmail.com> * Icebox Wendigo Buff + Crusher Trophies Co-authored-by: Whoneedspacee <yougotreallyowned@gmail.com> Co-authored-by: Jonathan Church <jchurch093@ gmail.com> Co-authored-by: s <wesoda24@ gmail.com> Co-authored-by: spookydonut <github@ spooksoftware.com> Co-authored-by: Rohesie <rohesie@ gmail.com>
@@ -837,6 +837,13 @@
|
||||
/obj/item/stack/sheet/animalhide/ashdrake = 5)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/godslayer
|
||||
name = "Godslayer Armour"
|
||||
result = /obj/item/clothing/suit/hooded/cloak/godslayer
|
||||
time = 60
|
||||
reqs = list(/obj/item/ice_energy_crystal = 1, /obj/item/wendigo_skull = 1, /obj/item/clockwork_alloy = 1)
|
||||
category = CAT_PRIMAL
|
||||
|
||||
/datum/crafting_recipe/firebrand
|
||||
name = "Firebrand"
|
||||
result = /obj/item/match/firebrand
|
||||
|
||||
@@ -510,3 +510,24 @@
|
||||
to_chat(owner, "<span class='notice'>Your bloodlust seeps back into the bog of your subconscious and you regain self control.</span>")
|
||||
owner.log_message("exited a blood frenzy", LOG_ATTACK)
|
||||
QDEL_NULL(chainsaw)
|
||||
|
||||
/datum/status_effect/speed_boost
|
||||
id = "speed_boost"
|
||||
duration = 2 SECONDS
|
||||
status_type = STATUS_EFFECT_REPLACE
|
||||
|
||||
/datum/status_effect/speed_boost/on_creation(mob/living/new_owner, set_duration)
|
||||
if(isnum(set_duration))
|
||||
duration = set_duration
|
||||
. = ..()
|
||||
|
||||
/datum/status_effect/speed_boost/on_apply()
|
||||
owner.add_movespeed_modifier(/datum/movespeed_modifier/status_speed_boost, update = TRUE)
|
||||
return ..()
|
||||
|
||||
/datum/status_effect/speed_boost/on_remove()
|
||||
owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_speed_boost, update = TRUE)
|
||||
|
||||
/datum/movespeed_modifier/status_speed_boost
|
||||
multiplicative_slowdown = -1
|
||||
|
||||
|
||||
@@ -94,6 +94,66 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/godslayer
|
||||
name = "godslayer armour"
|
||||
icon_state = "godslayer"
|
||||
desc = "A suit of armour fashioned from the remnants of a knight's armor, and parts of a wendigo."
|
||||
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear)
|
||||
armor = list("melee" = 50, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 50, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL
|
||||
hoodtype = /obj/item/clothing/head/hooded/cloakhood/godslayer
|
||||
cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
|
||||
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF | FREEZE_PROOF
|
||||
transparent_protection = HIDEGLOVES|HIDESUITSTORAGE|HIDEJUMPSUIT|HIDESHOES
|
||||
/// Amount to heal when the effect is triggered
|
||||
var/heal_amount = 500
|
||||
/// Time until the effect can take place again
|
||||
var/effect_cooldown_time = 10 MINUTES
|
||||
/// Current cooldown for the effect
|
||||
COOLDOWN_DECLARE(effect_cooldown)
|
||||
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
|
||||
|
||||
/obj/item/clothing/head/hooded/cloakhood/godslayer
|
||||
name = "godslayer helm"
|
||||
icon_state = "godslayer"
|
||||
desc = "The horns and skull of a wendigo, held together by the remaining icey energy of a demonic miner."
|
||||
armor = list("melee" = 50, "bullet" = 25, "laser" = 25, "energy" = 25, "bomb" = 50, "bio" = 50, "rad" = 100, "fire" = 100, "acid" = 100)
|
||||
clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT
|
||||
cold_protection = HEAD
|
||||
min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT
|
||||
heat_protection = HEAD
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
flash_protect = FLASH_PROTECTION_WELDER
|
||||
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH | PEPPERPROOF
|
||||
resistance_flags = FIRE_PROOF | ACID_PROOF | FREEZE_PROOF
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/godslayer/examine(mob/user)
|
||||
. = ..()
|
||||
if(loc == user && !COOLDOWN_FINISHED(src, effect_cooldown))
|
||||
. += "You feel like the revival effect will be able to occur again in [COOLDOWN_TIMELEFT(src, effect_cooldown) / 10] seconds."
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/godslayer/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(slot & ITEM_SLOT_OCLOTHING)
|
||||
RegisterSignal(user, COMSIG_MOB_STATCHANGE, .proc/resurrect)
|
||||
return
|
||||
UnregisterSignal(user, COMSIG_MOB_STATCHANGE, .proc/resurrect)
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/godslayer/dropped(mob/user)
|
||||
..()
|
||||
UnregisterSignal(user, COMSIG_MOB_STATCHANGE, .proc/resurrect)
|
||||
|
||||
/obj/item/clothing/suit/hooded/cloak/godslayer/proc/resurrect(mob/living/carbon/user, new_stat)
|
||||
if(new_stat > CONSCIOUS && new_stat < DEAD && COOLDOWN_FINISHED(src, effect_cooldown))
|
||||
user.heal_ordered_damage(heal_amount, damage_heal_order)
|
||||
user.visible_message("<span class='notice'>[user] suddenly revives, as their armor swirls with demonic energy!</span>", "<span class='notice'>You suddenly feel invigorated!</span>")
|
||||
playsound(user.loc, 'sound/magic/clockwork/ratvar_attack.ogg', 50)
|
||||
COOLDOWN_START(src, effect_cooldown, effect_cooldown_time)
|
||||
|
||||
/obj/item/clothing/neck/cloak/skill_reward
|
||||
var/associated_skill_path = /datum/skill
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE
|
||||
|
||||
@@ -0,0 +1,51 @@
|
||||
/*
|
||||
|
||||
Difficulty: Very Easy
|
||||
Was planned to be something more but due to the content freeze it unfortunately cannot be
|
||||
I'd rather there be something than the clockwork ruin be entirely empty though so here is a basic mob
|
||||
|
||||
*/
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/clockwork_defender
|
||||
name = "the clockwork defender"
|
||||
desc = "A traitorous clockwork knight who lived on, despite its creators destruction."
|
||||
health = 300
|
||||
maxHealth = 300
|
||||
icon_state = "clockwork_defender"
|
||||
icon_living = "clockwork_defender"
|
||||
icon = 'icons/mob/icemoon/icemoon_monsters.dmi'
|
||||
attack_verb_continuous = "slashes"
|
||||
attack_verb_simple = "slash"
|
||||
attack_sound = 'sound/weapons/bladeslice.ogg'
|
||||
weather_immunities = list("snow")
|
||||
speak_emote = list("roars")
|
||||
armour_penetration = 40
|
||||
melee_damage_lower = 20
|
||||
melee_damage_upper = 20
|
||||
vision_range = 9
|
||||
aggro_vision_range = 9
|
||||
speed = 5
|
||||
move_to_delay = 5
|
||||
rapid_melee = 2 // every second
|
||||
melee_queue_distance = 20
|
||||
ranged = TRUE
|
||||
gps_name = "Clockwork Signal"
|
||||
loot = list(/obj/item/clockwork_alloy)
|
||||
crusher_loot = list(/obj/item/clockwork_alloy)
|
||||
wander = FALSE
|
||||
del_on_death = TRUE
|
||||
deathmessage = "falls, quickly decaying into centuries old dust."
|
||||
deathsound = "bodyfall"
|
||||
footstep_type = FOOTSTEP_MOB_HEAVY
|
||||
attack_action_types = list()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/clockwork_defender/OpenFire()
|
||||
return
|
||||
|
||||
/obj/item/clockwork_alloy
|
||||
name = "clockwork alloy"
|
||||
desc = "The remains of the strongest clockwork knight."
|
||||
icon = 'icons/obj/ice_moon/artifacts.dmi'
|
||||
icon_state = "clockwork_alloy"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throwforce = 0
|
||||
@@ -31,8 +31,8 @@ Difficulty: Extremely Hard
|
||||
move_to_delay = 20
|
||||
gps_name = "Bloodchilling Signal"
|
||||
ranged = TRUE
|
||||
crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman)
|
||||
loot = list(/obj/effect/decal/remains/plasma)
|
||||
crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman, /obj/item/ice_energy_crystal)
|
||||
loot = list(/obj/effect/decal/remains/plasma, /obj/item/ice_energy_crystal)
|
||||
wander = FALSE
|
||||
del_on_death = TRUE
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
@@ -421,6 +421,14 @@ Difficulty: Extremely Hard
|
||||
owner.cut_overlay(cube)
|
||||
UnregisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE)
|
||||
|
||||
/obj/item/ice_energy_crystal
|
||||
name = "ice energy crystal"
|
||||
desc = "Remnants of the demonic frost miners ice energy."
|
||||
icon = 'icons/obj/ice_moon/artifacts.dmi'
|
||||
icon_state = "ice_crystal"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throwforce = 0
|
||||
|
||||
/obj/structure/frost_miner_prism
|
||||
name = "frost miner light prism"
|
||||
desc = "A magical crystal enhanced by a demonic presence."
|
||||
|
||||
@@ -1,3 +1,11 @@
|
||||
#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
|
||||
|
||||
/*
|
||||
|
||||
Difficulty: Hard
|
||||
@@ -23,18 +31,18 @@ Difficulty: Hard
|
||||
melee_damage_upper = 40
|
||||
vision_range = 9
|
||||
aggro_vision_range = 18 // man-eating for a reason
|
||||
speed = 8
|
||||
move_to_delay = 8
|
||||
rapid_melee = 16 // every 1/8 second
|
||||
melee_queue_distance = 20 // as far as possible really, need this because of charging and teleports
|
||||
speed = 6
|
||||
move_to_delay = 6
|
||||
rapid_melee = 8 // every 1/4 second
|
||||
melee_queue_distance = 18 // as far as possible really, need this because of charging and teleports
|
||||
ranged = TRUE
|
||||
pixel_x = -16
|
||||
base_pixel_x = -16
|
||||
gps_name = "Berserk Signal"
|
||||
loot = list()
|
||||
butcher_results = list()
|
||||
guaranteed_butcher_results = list(/obj/item/wendigo_blood = 1)
|
||||
crusher_loot = list(/obj/item/crusher_trophy/demon_claws)
|
||||
guaranteed_butcher_results = list(/obj/item/wendigo_blood = 1, /obj/item/wendigo_skull = 1)
|
||||
crusher_loot = list(/obj/item/crusher_trophy/wendigo_horn)
|
||||
wander = FALSE
|
||||
del_on_death = FALSE
|
||||
blood_volume = BLOOD_VOLUME_NORMAL
|
||||
@@ -46,7 +54,7 @@ Difficulty: Hard
|
||||
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/disorienting_scream)
|
||||
/datum/action/innate/megafauna_attack/shockwave_scream)
|
||||
/// Saves the turf the megafauna was created at (spawns exit portal here)
|
||||
var/turf/starting
|
||||
/// Range for wendigo stomping when it moves
|
||||
@@ -55,8 +63,10 @@ Difficulty: Hard
|
||||
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
|
||||
/// Stores the last scream time so it doesn't spam it
|
||||
var/last_scream = 0
|
||||
COOLDOWN_DECLARE(scream_cooldown)
|
||||
|
||||
/datum/action/innate/megafauna_attack/heavy_stomp
|
||||
name = "Heavy Stomp"
|
||||
@@ -72,8 +82,8 @@ Difficulty: Hard
|
||||
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/disorienting_scream
|
||||
name = "Disorienting Scream"
|
||||
/datum/action/innate/megafauna_attack/shockwave_scream
|
||||
name = "Shockwave Scream"
|
||||
icon_icon = 'icons/turf/walls/wall.dmi'
|
||||
button_icon_state = "wall-0"
|
||||
chosen_message = "<span class='colossus'>You are now screeching, disorienting targets around you.</span>"
|
||||
@@ -84,11 +94,10 @@ Difficulty: Hard
|
||||
starting = get_turf(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/wendigo/OpenFire()
|
||||
SetRecoveryTime(0, 100)
|
||||
if(health <= maxHealth*0.5)
|
||||
stomp_range = 2
|
||||
speed = 6
|
||||
move_to_delay = 6
|
||||
SetRecoveryTime(10 SECONDS)
|
||||
if(WENDIGO_ENRAGED)
|
||||
speed = 4
|
||||
move_to_delay = 4
|
||||
else
|
||||
stomp_range = initial(stomp_range)
|
||||
speed = initial(speed)
|
||||
@@ -99,12 +108,12 @@ Difficulty: Hard
|
||||
if(1)
|
||||
heavy_stomp()
|
||||
if(2)
|
||||
teleport()
|
||||
try_teleport()
|
||||
if(3)
|
||||
disorienting_scream()
|
||||
shockwave_scream()
|
||||
return
|
||||
|
||||
if(world.time > last_scream + 60)
|
||||
if(COOLDOWN_FINISHED(src, scream_cooldown))
|
||||
chosen_attack = rand(1, 3)
|
||||
else
|
||||
chosen_attack = rand(1, 2)
|
||||
@@ -112,17 +121,10 @@ Difficulty: Hard
|
||||
if(1)
|
||||
heavy_stomp()
|
||||
if(2)
|
||||
teleport()
|
||||
try_teleport()
|
||||
if(3)
|
||||
disorienting_scream()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/wendigo/Life(delta_time = SSMOBS_DT, times_fired)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
if(target || get_dist(src, starting) < 12)
|
||||
return
|
||||
do_teleport(src, starting, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
|
||||
do_teleport(src, starting, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
|
||||
shockwave_scream()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/wendigo/Move(atom/newloc, direct)
|
||||
if(!can_move)
|
||||
@@ -134,62 +136,128 @@ Difficulty: Hard
|
||||
. = ..()
|
||||
stored_move_dirs &= ~direct
|
||||
if(!stored_move_dirs)
|
||||
INVOKE_ASYNC(src, .proc/ground_slam, stomp_range, 1)
|
||||
INVOKE_ASYNC(GLOBAL_PROC, .proc/wendigo_slam, src, stomp_range, 1, 8)
|
||||
|
||||
/// Slams the ground around the wendigo throwing back enemies caught nearby
|
||||
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/ground_slam(range, delay)
|
||||
var/turf/orgin = get_turf(src)
|
||||
/// Slams the ground around the source throwing back enemies caught nearby, delay is for the radius increase
|
||||
/proc/wendigo_slam(atom/source, range, delay, throw_range)
|
||||
var/turf/orgin = get_turf(source)
|
||||
var/list/all_turfs = RANGE_TURFS(range, orgin)
|
||||
for(var/i = 0 to range)
|
||||
for(var/turf/T in all_turfs)
|
||||
if(get_dist(orgin, T) > i)
|
||||
playsound(orgin,'sound/effects/bamf.ogg', 600, TRUE, 10)
|
||||
for(var/turf/stomp_turf in all_turfs)
|
||||
if(get_dist(orgin, stomp_turf) > i)
|
||||
continue
|
||||
playsound(T,'sound/effects/bamf.ogg', 600, TRUE, 10)
|
||||
new /obj/effect/temp_visual/small_smoke/halfsecond(T)
|
||||
for(var/mob/living/L in T)
|
||||
if(L == src || L.throwing)
|
||||
new /obj/effect/temp_visual/small_smoke/halfsecond(stomp_turf)
|
||||
for(var/mob/living/L in stomp_turf)
|
||||
if(L == source || L.throwing)
|
||||
continue
|
||||
to_chat(L, "<span class='userdanger'>[src]'s ground slam shockwave sends you flying!</span>")
|
||||
var/turf/thrownat = get_ranged_target_turf_direct(src, L, 8, rand(-10, 10))
|
||||
L.throw_at(thrownat, 8, 2, src, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE)
|
||||
to_chat(L, "<span class='userdanger'>[source]'s ground slam shockwave sends you flying!</span>")
|
||||
var/turf/thrownat = get_ranged_target_turf_direct(source, L, throw_range, rand(-10, 10))
|
||||
L.throw_at(thrownat, 8, 2, null, TRUE, force = MOVE_FORCE_OVERPOWERING, gentle = TRUE)
|
||||
L.apply_damage(20, BRUTE, wound_bonus=CANT_WOUND)
|
||||
shake_camera(L, 2, 1)
|
||||
all_turfs -= T
|
||||
all_turfs -= stomp_turf
|
||||
sleep(delay)
|
||||
|
||||
/// Larger but slower ground stomp
|
||||
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/heavy_stomp()
|
||||
can_move = FALSE
|
||||
ground_slam(5, 2)
|
||||
SetRecoveryTime(0, 0)
|
||||
wendigo_slam(src, 5, 3 - WENDIGO_ENRAGED, 8)
|
||||
SetRecoveryTime(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/teleport()
|
||||
var/list/possible_ends = list()
|
||||
for(var/turf/T in view(4, target.loc) - view(3, target.loc))
|
||||
if(isclosedturf(T))
|
||||
continue
|
||||
possible_ends |= T
|
||||
if (LAZYLEN(possible_ends))
|
||||
var/turf/end = pick(possible_ends)
|
||||
do_teleport(src, end, 0, channel=TELEPORT_CHANNEL_BLUESPACE, forced = TRUE)
|
||||
SetRecoveryTime(20, 0)
|
||||
/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/wendigo_shockwave/shockwave = new /obj/projectile/wendigo_shockwave(loc)
|
||||
shockwave.speed = 8
|
||||
shockwave.preparePixelProjectile(endloc, startloc, null, spread)
|
||||
shockwave.firer = src
|
||||
if(target)
|
||||
shockwave.original = target
|
||||
shockwave.fire()
|
||||
SetRecoveryTime(0 SECONDS)
|
||||
|
||||
/// Applies dizziness to all nearby enemies that can hear the scream and animates the wendigo shaking up and down
|
||||
/mob/living/simple_animal/hostile/megafauna/wendigo/proc/disorienting_scream()
|
||||
/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
|
||||
last_scream = world.time
|
||||
playsound(src, 'sound/magic/demon_dies.ogg', 600, FALSE, 10)
|
||||
animate(src, pixel_z = rand(5, 15), time = 1, loop = 6)
|
||||
COOLDOWN_START(src, scream_cooldown, scream_cooldown_time)
|
||||
SLEEP_CHECK_DEATH(5)
|
||||
playsound(loc, 'sound/magic/demon_dies.ogg', 600, FALSE, 10)
|
||||
animate(src, pixel_z = rand(5, 15), time = 1, loop = 20)
|
||||
animate(pixel_z = 0, time = 1)
|
||||
for(var/mob/living/L in get_hearers_in_view(7, src) - src)
|
||||
L.Dizzy(6)
|
||||
to_chat(L, "<span class='danger'>[src] screams loudly!</span>")
|
||||
SetRecoveryTime(30, 0)
|
||||
SLEEP_CHECK_DEATH(12)
|
||||
for(var/mob/living/dizzy_target in get_hearers_in_view(7, src) - src)
|
||||
dizzy_target.Dizzy(6)
|
||||
to_chat(dizzy_target, "<span class='danger'>The wendigo screams loudly!</span>")
|
||||
SLEEP_CHECK_DEATH(1 SECONDS)
|
||||
spiral_attack()
|
||||
SetRecoveryTime(3 SECONDS)
|
||||
SLEEP_CHECK_DEATH(3 SECONDS)
|
||||
can_move = TRUE
|
||||
teleport()
|
||||
|
||||
/// 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/wendigo_shockwave/shockwave = new /obj/projectile/wendigo_shockwave(loc)
|
||||
shockwave.firer = src
|
||||
shockwave.speed = 3 - WENDIGO_ENRAGED
|
||||
shockwave.fire(angle)
|
||||
SLEEP_CHECK_DEATH(6 - WENDIGO_ENRAGED * 2)
|
||||
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/wendigo_shockwave/shockwave = new /obj/projectile/wendigo_shockwave(loc)
|
||||
shockwave.firer = src
|
||||
shockwave.damage = 15
|
||||
shockwave.fire(angle)
|
||||
SLEEP_CHECK_DEATH(1)
|
||||
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/wendigo_shockwave/shockwave = new /obj/projectile/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)
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/wendigo/death(gibbed, list/force_grant)
|
||||
if(health > 0)
|
||||
@@ -200,6 +268,28 @@ Difficulty: Hard
|
||||
exit.set_light(20, 1, COLOR_SOFT_RED)
|
||||
return ..()
|
||||
|
||||
/obj/projectile/wendigo_shockwave
|
||||
name ="wendigo shockwave"
|
||||
icon_state= "chronobolt"
|
||||
damage = 25
|
||||
armour_penetration = 100
|
||||
speed = 2
|
||||
eyeblur = 5
|
||||
damage_type = BRUTE
|
||||
pass_flags = PASSTABLE
|
||||
/// If wave movement is enabled
|
||||
var/wave_movement = FALSE
|
||||
/// Amount the angle changes every pixel move
|
||||
var/wave_speed = 15
|
||||
/// Amount of movements this projectile has made
|
||||
var/pixel_moves = 0
|
||||
|
||||
/obj/projectile/wendigo_shockwave/pixel_move(trajectory_multiplier, hitscanning = FALSE)
|
||||
. = ..()
|
||||
if(wave_movement)
|
||||
pixel_moves++
|
||||
set_angle(original_angle + pixel_moves * wave_speed)
|
||||
|
||||
/obj/item/wendigo_blood
|
||||
name = "bottle of wendigo blood"
|
||||
desc = "You're not actually going to drink this, are you?"
|
||||
@@ -209,13 +299,13 @@ Difficulty: Hard
|
||||
/obj/item/wendigo_blood/attack_self(mob/living/user)
|
||||
if(!ishuman(user))
|
||||
return
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H.mind)
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
if(!human_user.mind)
|
||||
return
|
||||
to_chat(H, "<span class='danger'>Power courses through you! You can now shift your form at will.</span>")
|
||||
var/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear/P = new
|
||||
H.mind.AddSpell(P)
|
||||
playsound(H.loc,'sound/items/drink.ogg', rand(10,50), TRUE)
|
||||
to_chat(human_user, "<span class='danger'>Power courses through you! You can now shift your form at will.</span>")
|
||||
var/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear/transformation_spell = new
|
||||
human_user.mind.AddSpell(transformation_spell)
|
||||
playsound(human_user.loc, 'sound/items/drink.ogg', rand(10,50), TRUE)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/shapeshift/polar_bear
|
||||
@@ -224,3 +314,37 @@ Difficulty: Hard
|
||||
invocation = "RAAAAAAAAWR!"
|
||||
convert_damage = FALSE
|
||||
shapeshift_type = /mob/living/simple_animal/hostile/asteroid/polarbear/lesser
|
||||
|
||||
/obj/item/crusher_trophy/wendigo_horn
|
||||
name = "wendigo horn"
|
||||
desc = "A horn from the head of an unstoppable beast."
|
||||
icon_state = "wendigo_horn"
|
||||
denied_type = /obj/item/crusher_trophy/wendigo_horn
|
||||
|
||||
/obj/item/crusher_trophy/wendigo_horn/effect_desc()
|
||||
return "melee hits inflict twice as much damage"
|
||||
|
||||
/obj/item/crusher_trophy/wendigo_horn/add_to(obj/item/kinetic_crusher/crusher, mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
crusher.AddComponent(/datum/component/two_handed, force_wielded=40)
|
||||
|
||||
/obj/item/crusher_trophy/wendigo_horn/remove_from(obj/item/kinetic_crusher/crusher, mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
crusher.AddComponent(/datum/component/two_handed, force_wielded=20)
|
||||
|
||||
/obj/item/wendigo_skull
|
||||
name = "wendigo skull"
|
||||
desc = "A skull of a massive hulking beast."
|
||||
icon = 'icons/obj/ice_moon/artifacts.dmi'
|
||||
icon_state = "wendigo_skull"
|
||||
w_class = WEIGHT_CLASS_TINY
|
||||
throwforce = 0
|
||||
|
||||
#undef WENDIGO_CIRCLE_SHOTCOUNT
|
||||
#undef WENDIGO_CIRCLE_REPEATCOUNT
|
||||
#undef WENDIGO_SPIRAL_SHOTCOUNT
|
||||
#undef WENDIGO_WAVE_SHOTCOUNT
|
||||
#undef WENDIGO_WAVE_REPEATCOUNT
|
||||
#undef WENDIGO_SHOTGUN_SHOTCOUNT
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
projectilesound = 'sound/weapons/pierce.ogg'
|
||||
ranged = TRUE
|
||||
ranged_message = "manifests ice"
|
||||
ranged_cooldown_time = 3 SECONDS
|
||||
ranged_cooldown_time = 1.5 SECONDS
|
||||
minimum_distance = 3
|
||||
retreat_distance = 3
|
||||
maxHealth = 150
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
friendly_verb_continuous = "growls at"
|
||||
friendly_verb_simple = "growl at"
|
||||
speak_emote = list("growls")
|
||||
speed = 8
|
||||
speed = 3
|
||||
move_to_delay = 8
|
||||
maxHealth = 300
|
||||
health = 300
|
||||
@@ -28,6 +28,7 @@
|
||||
butcher_results = list(/obj/item/food/meat/slab/bear = 3, /obj/item/stack/sheet/bone = 2)
|
||||
guaranteed_butcher_results = list(/obj/item/stack/sheet/animalhide/goliath_hide/polar_bear_hide = 1)
|
||||
loot = list()
|
||||
crusher_loot = /obj/item/crusher_trophy/bear_paw
|
||||
stat_attack = HARD_CRIT
|
||||
robust_searching = TRUE
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
@@ -61,3 +62,20 @@
|
||||
name = "magic polar bear"
|
||||
desc = "It seems sentient somehow."
|
||||
faction = list("neutral")
|
||||
|
||||
/obj/item/crusher_trophy/bear_paw
|
||||
name = "polar bear paw"
|
||||
desc = "It's a polar bear paw."
|
||||
icon_state = "bear_paw"
|
||||
denied_type = /obj/item/crusher_trophy/bear_paw
|
||||
|
||||
/obj/item/crusher_trophy/bear_paw/effect_desc()
|
||||
return "mark detonation to attack twice if you are below half your life"
|
||||
|
||||
/obj/item/crusher_trophy/bear_paw/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
if(user.health / user.maxHealth > 0.5)
|
||||
return
|
||||
var/obj/item/I = user.get_active_held_item()
|
||||
if(!I)
|
||||
return
|
||||
I.melee_attack_chain(user, target, null)
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
pull_force = MOVE_FORCE_WEAK
|
||||
butcher_results = list(/obj/item/food/meat/slab = 2, /obj/item/stack/sheet/sinew/wolf = 2, /obj/item/stack/sheet/bone = 2)
|
||||
loot = list()
|
||||
crusher_loot = /obj/item/crusher_trophy/wolf_ear
|
||||
stat_attack = HARD_CRIT
|
||||
robust_searching = TRUE
|
||||
footstep_type = FOOTSTEP_MOB_CLAW
|
||||
@@ -57,3 +58,15 @@
|
||||
return
|
||||
adjustHealth(-0.0125 * maxHealth * delta_time)
|
||||
retreat_message_said = FALSE
|
||||
|
||||
/obj/item/crusher_trophy/wolf_ear
|
||||
name = "wolf ear"
|
||||
desc = "It's a wolf ear."
|
||||
icon_state = "wolf_ear"
|
||||
denied_type = /obj/item/crusher_trophy/wolf_ear
|
||||
|
||||
/obj/item/crusher_trophy/wolf_ear/effect_desc()
|
||||
return "mark detonation to gain a slight speed boost temporarily"
|
||||
|
||||
/obj/item/crusher_trophy/wolf_ear/on_mark_detonation(mob/living/target, mob/living/user)
|
||||
user.apply_status_effect(/datum/status_effect/speed_boost, 1 SECONDS)
|
||||
|
||||
|
Before Width: | Height: | Size: 226 KiB After Width: | Height: | Size: 221 KiB |
|
Before Width: | Height: | Size: 423 KiB After Width: | Height: | Size: 411 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 149 KiB After Width: | Height: | Size: 149 KiB |
|
Before Width: | Height: | Size: 731 B After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
@@ -2681,6 +2681,7 @@
|
||||
#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\clockwork_knight.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\demonic_frost_miner.dm"
|
||||
#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm"
|
||||
|
||||