diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm
index ff92b67978c..688c921a731 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 c6dd8cb2ebd..57c64d23506 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 372956ce2fd..89e9d6fd102 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 7e4ade3e06d..96665d4c29f 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -568,10 +568,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()
@@ -967,7 +967,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 f95820f87ff..db7c8f6aadb 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
@@ -80,35 +80,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 598b6c8ff05..12388807baf 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 81e675106ee..100327ea72a 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 3fd48c18f5b..0ea88aedcf6 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 a7af1daef8b..3d50f03e173 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 7d70ce42024..f072421196d 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 6897ca4e988..df4bbb61820 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 9b7ed4a35f6..ce3030b6c5e 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 def7a71bd37..74f9df85a72 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ