diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index ff92b67978..688c921a73 100644
--- a/code/datums/status_effects/gas.dm
+++ b/code/datums/status_effects/gas.dm
@@ -4,6 +4,7 @@
status_type = STATUS_EFFECT_UNIQUE
alert_type = /obj/screen/alert/status_effect/freon
var/icon/cube
+ var/can_melt = TRUE
/obj/screen/alert/status_effect/freon
name = "Frozen Solid"
@@ -20,7 +21,7 @@
/datum/status_effect/freon/tick()
owner.update_canmove()
- if(owner && owner.bodytemperature >= 310.055)
+ if(can_melt && owner.bodytemperature >= 310.055)
qdel(src)
/datum/status_effect/freon/on_remove()
@@ -29,3 +30,7 @@
owner.cut_overlay(cube)
owner.bodytemperature += 100
owner.update_canmove()
+
+/datum/status_effect/freon/watcher
+ duration = 8
+ can_melt = FALSE
diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm
index c6dd8cb2eb..57c64d2350 100644
--- a/code/game/turfs/simulated/floor/plating/asteroid.dm
+++ b/code/game/turfs/simulated/floor/plating/asteroid.dm
@@ -131,9 +131,9 @@
has_data = TRUE
/turf/open/floor/plating/asteroid/airless/cave/volcanic
- mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
- /mob/living/simple_animal/hostile/asteroid/basilisk/watcher = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \
- /mob/living/simple_animal/hostile/asteroid/hivelord/legion = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \
+ mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /mob/living/simple_animal/hostile/spawner/lavaland/goliath = 3, \
+ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /mob/living/simple_animal/hostile/spawner/lavaland = 2, \
+ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /mob/living/simple_animal/hostile/spawner/lavaland/legion = 3, \
SPAWN_MEGAFAUNA = 6, /mob/living/simple_animal/hostile/asteroid/goldgrub = 10)
data_having_type = /turf/open/floor/plating/asteroid/airless/cave/volcanic/has_data
diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm
index 372956ce2f..89e9d6fd10 100644
--- a/code/modules/mining/equipment/kinetic_crusher.dm
+++ b/code/modules/mining/equipment/kinetic_crusher.dm
@@ -231,6 +231,31 @@
else
H.ranged_cooldown_time = bonus_value + world.time
+//magmawing watcher
+/obj/item/crusher_trophy/blaster_tubes/magma_wing
+ name = "magmawing watcher wing"
+ desc = "A still-searing wing from a magmawing watcher. Suitable as a trophy for a kinetic crusher."
+ icon_state = "magma_wing"
+ gender = NEUTER
+ bonus_value = 5
+
+/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc()
+ return "mark detonation to make the next destabilizer shot deal [bonus_value] damage"
+
+/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
+ if(deadly_shot)
+ marker.name = "heated [marker.name]"
+ marker.icon_state = "lava"
+ marker.damage = bonus_value
+ marker.nodamage = FALSE
+ deadly_shot = FALSE
+
+//icewing watcher
+/obj/item/crusher_trophy/watcher_wing/ice_wing
+ name = "icewing watcher wing"
+ desc = "A carefully preserved frozen wing from an icewing watcher. Suitable as a trophy for a kinetic crusher."
+ icon_state = "ice_wing"
+
//legion
/obj/item/crusher_trophy/legion_skull
name = "legion skull"
@@ -281,7 +306,7 @@
playsound(L, 'sound/magic/fireball.ogg', 20, 1)
new /obj/effect/temp_visual/fire(L.loc)
addtimer(CALLBACK(src, .proc/pushback, L, user), 1) //no free backstabs, we push AFTER module stuff is done
- L.adjustBruteLoss(bonus_value)
+ L.adjustFireLoss(bonus_value, forced = TRUE)
/obj/item/crusher_trophy/tail_spike/proc/pushback(mob/living/target, mob/living/user)
if(!QDELETED(target) && !QDELETED(user) && (!target.anchored || ismegafauna(target))) //megafauna will always be pushed
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 29022da42d..5e6d489185 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -571,10 +571,10 @@
var/obj/C = loc
C.container_resist(src)
- else if(has_status_effect(/datum/status_effect/freon))
+ else if(IsFrozen())
to_chat(src, "You start breaking out of the ice cube!")
if(do_mob(src, src, 40))
- if(has_status_effect(/datum/status_effect/freon))
+ if(IsFrozen())
to_chat(src, "You break out of the ice cube!")
remove_status_effect(/datum/status_effect/freon)
update_canmove()
@@ -974,7 +974,7 @@
fall()
else if(ko || move_and_fall || (!has_legs && !ignore_legs) || chokehold)
fall(forced = 1)
- canmove = !(ko || resting || has_status_effect(STATUS_EFFECT_STUN) || has_status_effect(/datum/status_effect/freon) || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms))
+ canmove = !(ko || resting || IsStun() || IsFrozen() || chokehold || buckled || (!has_legs && !ignore_legs && !has_arms))
density = !lying
if(lying)
if(layer == initial(layer)) //to avoid special cases like hiding larvas.
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index 14b8056af6..b883720ace 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -85,35 +85,70 @@
loot = list()
butcher_results = list(/obj/item/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1)
-/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/make_shiny()
- if(prob(75))
- name = "magmawing watcher"
- real_name = name
- desc = "When raised very close to lava, some watchers adapt to the extreme heat and change coloration. Such watchers are known as magmawings and use intense heat as their tool for hunting and defense."
- icon_state = "watcher_magmawing"
- icon_living = "watcher_magmawing"
- icon_aggro = "watcher_magmawing"
- icon_dead = "watcher_magmawing_dead"
- maxHealth = 215 //Compensate for the lack of slowdown on projectiles with a bit of extra health
- health = 215
- projectiletype = /obj/item/projectile/temp/basilisk/magmawing
- else
- name = "icewing watcher"
- real_name = name
- desc = "Very rarely, some watchers will eke out an existence far from heat sources. In the absence of warmth, their wings will become papery and turn to an icy blue; these watchers are fragile but much quicker to fire their trademark freezing blasts."
- icon_state = "watcher_icewing"
- icon_living = "watcher_icewing"
- icon_aggro = "watcher_icewing"
- icon_dead = "watcher_icewing_dead"
- maxHealth = 150
- health = 150
- ranged_cooldown_time = 20
- butcher_results = list(/obj/item/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable
+/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize()
+ . = ..()
+ if(prob(1))
+ if(prob(75))
+ new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing(loc)
+ else
+ new /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing(loc)
+ return INITIALIZE_HINT_QDEL
+
+/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/magmawing
+ name = "magmawing watcher"
+ desc = "When raised very close to lava, some watchers adapt to the extreme heat and use lava as both a weapon and wings."
+ icon_state = "watcher_magmawing"
+ icon_living = "watcher_magmawing"
+ icon_aggro = "watcher_magmawing"
+ icon_dead = "watcher_magmawing_dead"
+ maxHealth = 215 //Compensate for the lack of slowdown on projectiles with a bit of extra health
+ health = 215
+ light_range = 3
+ light_power = 2.5
+ light_color = LIGHT_COLOR_LAVA
+ projectiletype = /obj/item/projectile/temp/basilisk/magmawing
+ crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
+ crusher_drop_mod = 60
+
+/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/icewing
+ name = "icewing watcher"
+ desc = "Very rarely, some watchers will eke out an existence far from heat sources. In the absence of warmth, they become icy and fragile but fire much stronger freezing blasts."
+ icon_state = "watcher_icewing"
+ icon_living = "watcher_icewing"
+ icon_aggro = "watcher_icewing"
+ icon_dead = "watcher_icewing_dead"
+ maxHealth = 170
+ health = 170
+ projectiletype = /obj/item/projectile/temp/basilisk/icewing
+ butcher_results = list(/obj/item/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) //No sinew; the wings are too fragile to be usable
+ crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
+ crusher_drop_mod = 30
/obj/item/projectile/temp/basilisk/magmawing
name = "scorching blast"
- icon_state = "gaussstrong"
+ icon_state = "lava"
+ damage = 5
+ damage_type = BURN
+ nodamage = FALSE
temperature = 500 //Heats you up!
+/obj/item/projectile/temp/basilisk/magmawing/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(.)
+ var/mob/living/L = target
+ L.adjust_fire_stacks(0.1)
+ L.IgniteMob()
+
+/obj/item/projectile/temp/basilisk/icewing
+ damage = 5
+ damage_type = BURN
+ nodamage = FALSE
+
+/obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
+ . = ..()
+ if(.)
+ var/mob/living/L = target
+ L.apply_status_effect(/datum/status_effect/freon/watcher)
+
/mob/living/simple_animal/hostile/asteroid/basilisk/watcher/tendril
fromtendril = TRUE
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
index 598b6c8ff0..12388807ba 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goliath.dm
@@ -31,10 +31,9 @@
var/pre_attack = 0
var/pre_attack_icon = "Goliath_preattack"
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide)
- butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
/mob/living/simple_animal/hostile/asteroid/goliath/Life()
- ..()
+ . = ..()
handle_preattack()
/mob/living/simple_animal/hostile/asteroid/goliath/proc/handle_preattack()
@@ -58,8 +57,8 @@
if(!isturf(tturf))
return
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
- visible_message("The [src.name] digs its tentacles under [target.name]!")
- new /obj/effect/goliath_tentacle/original(tturf)
+ visible_message("[src] digs its tentacles under [target]!")
+ new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src)
ranged_cooldown = world.time + ranged_cooldown_time
icon_state = icon_aggro
pre_attack = 0
@@ -87,62 +86,106 @@
throw_message = "does nothing to the tough hide of the"
pre_attack_icon = "goliath2"
crusher_loot = /obj/item/crusher_trophy/goliath_tentacle
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/animalhide/goliath_hide = 1, /obj/item/stack/sheet/bone = 2)
loot = list()
stat_attack = UNCONSCIOUS
robust_searching = 1
-/mob/living/simple_animal/hostile/asteroid/goliath/make_shiny()
- name = "precursor goliath"
- real_name = name
- desc = "Due to their stone hide, goliaths are biologically immortal, although future generations evolved to look much different. This goliath is likely a very early ancestor to many others here, and at least several centuries old."
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/random/Initialize()
+ . = ..()
+ if(prob(1))
+ new /mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient(loc)
+ return INITIALIZE_HINT_QDEL
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient
+ name = "ancient goliath"
+ desc = "Goliaths are biologically immortal, and rare specimens have survived for centuries. This one is clearly ancient, and its tentacles constantly churn the earth around it."
icon_state = "Goliath"
icon_living = "Goliath"
icon_aggro = "Goliath_alert"
icon_dead = "Goliath_dead"
+ maxHealth = 400
+ health = 400
+ speed = 4
pre_attack_icon = "Goliath_preattack"
throw_message = "does nothing to the rocky hide of the"
loot = list(/obj/item/stack/sheet/animalhide/goliath_hide) //A throwback to the asteroid days
+ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/goliath = 2, /obj/item/stack/sheet/bone = 2)
+ crusher_drop_mod = 30
+ wander = FALSE
+ var/list/cached_tentacle_turfs
+ var/turf/last_location
+ var/tentacle_recheck_cooldown = 100
+
+/mob/living/simple_animal/hostile/asteroid/goliath/beast/ancient/Life()
+ . = ..()
+ if(isturf(loc))
+ if(!LAZYLEN(cached_tentacle_turfs) || loc != last_location || tentacle_recheck_cooldown <= world.time)
+ LAZYCLEARLIST(cached_tentacle_turfs)
+ last_location = loc
+ tentacle_recheck_cooldown = world.time + initial(tentacle_recheck_cooldown)
+ for(var/turf/open/T in orange(4, loc))
+ LAZYADD(cached_tentacle_turfs, T)
+ for(var/t in cached_tentacle_turfs)
+ if(isopenturf(t))
+ if(prob(10))
+ new /obj/effect/temp_visual/goliath_tentacle(t, src)
+ else
+ cached_tentacle_turfs -= t
/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril
fromtendril = TRUE
-/mob/living/simple_animal/hostile/asteroid/goliath/beast/tendril/make_shiny()
- return //Precursor goliaths don't come from tendrils!
-
//tentacles
-/obj/effect/goliath_tentacle
- name = "Goliath tentacle"
+/obj/effect/temp_visual/goliath_tentacle
+ name = "goliath tentacle"
icon = 'icons/mob/lavaland/lavaland_monsters.dmi'
- icon_state = "Goliath_tentacle"
- var/latched = FALSE
- anchored = TRUE
+ icon_state = "Goliath_tentacle_spawn"
+ layer = BELOW_MOB_LAYER
+ var/mob/living/spawner
-/obj/effect/goliath_tentacle/Initialize()
+/obj/effect/temp_visual/goliath_tentacle/Initialize(mapload, mob/living/new_spawner)
. = ..()
+ if(locate(/obj/effect/temp_visual/goliath_tentacle) in loc)
+ return INITIALIZE_HINT_QDEL
+ if(!QDELETED(new_spawner))
+ spawner = new_spawner
if(ismineralturf(loc))
var/turf/closed/mineral/M = loc
M.gets_drilled()
- addtimer(CALLBACK(src, .proc/Trip), 10)
+ deltimer(timerid)
+ timerid = addtimer(CALLBACK(src, .proc/tripanim), 7, TIMER_STOPPABLE)
-/obj/effect/goliath_tentacle/original/Initialize()
+/obj/effect/temp_visual/goliath_tentacle/original/Initialize(mapload, new_spawner)
. = ..()
- for(var/obj/effect/goliath_tentacle/original/O in loc)//No more GG NO RE from 2+ goliaths simultaneously tentacling you
- if(O != src)
- qdel(src)
var/list/directions = GLOB.cardinals.Copy()
for(var/i in 1 to 3)
var/spawndir = pick_n_take(directions)
- var/turf/T = get_step(src,spawndir)
+ var/turf/T = get_step(src, spawndir)
if(T)
- new /obj/effect/goliath_tentacle(T)
+ new /obj/effect/temp_visual/goliath_tentacle(T, spawner)
-/obj/effect/goliath_tentacle/proc/Trip()
- for(var/mob/living/M in src.loc)
- visible_message("The [src.name] grabs hold of [M.name]!")
- M.Stun(100)
- M.adjustBruteLoss(rand(10,15))
+/obj/effect/temp_visual/goliath_tentacle/proc/tripanim()
+ icon_state = "Goliath_tentacle_wiggle"
+ deltimer(timerid)
+ timerid = addtimer(CALLBACK(src, .proc/trip), 3, TIMER_STOPPABLE)
+
+/obj/effect/temp_visual/goliath_tentacle/proc/trip()
+ var/latched = FALSE
+ for(var/mob/living/L in loc)
+ if((!QDELETED(spawner) && spawner.faction_check_mob(L)) || L.stat == DEAD)
+ continue
+ visible_message("[src] grabs hold of [L]!")
+ L.Stun(100)
+ L.adjustBruteLoss(rand(10,15))
latched = TRUE
if(!latched)
- qdel(src)
+ retract()
else
- QDEL_IN(src, 50)
+ deltimer(timerid)
+ timerid = addtimer(CALLBACK(src, .proc/retract), 10, TIMER_STOPPABLE)
+
+/obj/effect/temp_visual/goliath_tentacle/proc/retract()
+ icon_state = "Goliath_tentacle_retract"
+ deltimer(timerid)
+ timerid = QDEL_IN(src, 7)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 81e675106e..100327ea72 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -110,13 +110,18 @@
del_on_death = 1
stat_attack = UNCONSCIOUS
robust_searching = 1
- shiny_chance = 5
+ var/dwarf_mob = FALSE
var/mob/living/carbon/human/stored_mob
-/mob/living/simple_animal/hostile/asteroid/hivelord/legion/make_shiny()
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion/random/Initialize()
+ . = ..()
+ if(prob(5))
+ new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(loc)
+ return INITIALIZE_HINT_QDEL
+
+/mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf
name = "dwarf legion"
- real_name = name
- desc = "On the rare occasion that a human with dwarfism falls to a legion, they can become infested like any other."
+ desc = "You can still see what was once a rather small human under the shifting mass of corruption."
icon_state = "dwarf_legion"
icon_living = "dwarf_legion"
icon_aggro = "dwarf_legion"
@@ -124,6 +129,8 @@
maxHealth = 60
health = 60
speed = 2 //faster!
+ crusher_drop_mod = 20
+ dwarf_mob = TRUE
/mob/living/simple_animal/hostile/asteroid/hivelord/legion/death(gibbed)
visible_message("The skulls on [src] wail in anger as they flee from their dying host!")
@@ -134,6 +141,8 @@
stored_mob = null
else if(fromtendril)
new /obj/effect/mob_spawn/human/corpse/charredskeleton(T)
+ else if(dwarf_mob)
+ new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf(T)
else
new /obj/effect/mob_spawn/human/corpse/damaged/legioninfested(T)
..(gibbed)
@@ -177,14 +186,16 @@
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/proc/infest(mob/living/carbon/human/H)
visible_message("[name] burrows into the flesh of [H]!")
- var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L = new(H.loc)
+ var/mob/living/simple_animal/hostile/asteroid/hivelord/legion/L
+ if(H.dna.check_mutation(DWARFISM)) //dwarf legions aren't just fluff!
+ L = new /mob/living/simple_animal/hostile/asteroid/hivelord/legion/dwarf(H.loc)
+ else
+ L = new(H.loc)
visible_message("[L] staggers to their feet!")
H.death()
H.adjustBruteLoss(1000)
L.stored_mob = H
H.forceMove(L)
- if(H.dna.check_mutation(DWARFISM))
- L.make_shiny() //dwarf legions aren't just fluff!
qdel(src)
//Advanced Legion is slightly tougher to kill and can raise corpses (revive other legions)
@@ -251,6 +262,10 @@
//Legion infested mobs
+/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/dwarf/equip(mob/living/carbon/human/H)
+ . = ..()
+ H.dna.add_mutation(DWARFISM)
+
/obj/effect/mob_spawn/human/corpse/damaged/legioninfested/Initialize()
var/type = pickweight(list("Miner" = 66, "Ashwalker" = 10, "Golem" = 10,"Clown" = 10, pick(list("Shadow", "YeOlde","Operative", "Cultist")) = 4))
switch(type)
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
index 3fd48c18f5..0ea88aedcf 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm
@@ -20,17 +20,11 @@
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
mob_size = MOB_SIZE_LARGE
var/icon_aggro = null
- var/shiny = FALSE //If this mob is a much rarer version of its normal self
- var/shiny_chance = 1 //If this chance passes, the mob will somehow be different from normal ones
+ var/crusher_drop_mod = 5
/mob/living/simple_animal/hostile/asteroid/Initialize(mapload)
. = ..()
apply_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
- if(prob(shiny_chance))
- shiny = TRUE
- make_shiny()
-
-/mob/living/simple_animal/hostile/asteroid/proc/make_shiny() //Override this on a per-mob basis
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()
@@ -64,7 +58,7 @@
/mob/living/simple_animal/hostile/asteroid/death(gibbed)
SSblackbox.add_details("mobs_killed_mining","[src.type]")
var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING)
- if(C && crusher_loot && prob(((C.total_damage/maxHealth)) * 5) + shiny) //on average, you'll need to kill 20 creatures before getting the item
+ if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 20 creatures before getting the item
spawn_crusher_loot()
..(gibbed)
diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm
index a7af1daef8..3d50f03e17 100644
--- a/code/modules/mob/living/status_procs.dm
+++ b/code/modules/mob/living/status_procs.dm
@@ -99,6 +99,11 @@
K = apply_status_effect(STATUS_EFFECT_KNOCKDOWN, amount, updating)
return K
+///////////////////////////////// FROZEN /////////////////////////////////////
+
+/mob/living/proc/IsFrozen()
+ return has_status_effect(/datum/status_effect/freon)
+
///////////////////////////////////// STUN ABSORPTION /////////////////////////////////////
/mob/living/proc/add_stun_absorption(key, duration, priority, message, self_message, examine_message)
diff --git a/icons/mob/lavaland/lavaland_monsters.dmi b/icons/mob/lavaland/lavaland_monsters.dmi
index 7d70ce4202..f072421196 100644
Binary files a/icons/mob/lavaland/lavaland_monsters.dmi and b/icons/mob/lavaland/lavaland_monsters.dmi differ
diff --git a/icons/mob/lavaland/watcher.dmi b/icons/mob/lavaland/watcher.dmi
index 6897ca4e98..df4bbb6182 100644
Binary files a/icons/mob/lavaland/watcher.dmi and b/icons/mob/lavaland/watcher.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index 9b7ed4a35f..ce3030b6c5 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index def7a71bd3..74f9df85a7 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ