Files

112 lines
4.3 KiB
Plaintext

/// A floating eyeball which keeps its distance and sometimes make you look away.
/mob/living/basic/mining/watcher
name = "watcher"
desc = "A levitating, monocular creature held aloft by wing-like veins. A sharp spine of crystal protrudes from its body."
icon = 'icons/mob/simple/lavaland/lavaland_monsters_wide.dmi'
icon_state = "watcher"
icon_living = "watcher"
icon_dead = "watcher_dead"
health_doll_icon = "watcher"
pixel_x = -12
base_pixel_x = -12
speak_emote = list("chimes")
speed = 3
maxHealth = 160
health = 160
melee_damage_lower = 15
melee_damage_upper = 15
attack_sound = 'sound/items/weapons/bladeslice.ogg'
attack_verb_continuous = "buffets"
attack_verb_simple = "buffet"
crusher_loot = /obj/item/crusher_trophy/watcher_wing
ai_controller = /datum/ai_controller/basic_controller/watcher
butcher_results = list(
/obj/item/stack/sheet/bone = 1,
/obj/item/stack/ore/diamond = 2,
/obj/item/stack/sheet/sinew = 2,
)
/// How often can we shoot?
var/ranged_cooldown = 3 SECONDS
/// What kind of beams we got?
var/projectile_type = /obj/projectile/temp/watcher
/// Icon state for our eye overlay
var/eye_glow = "watcher_glow"
/// Sound to play when we shoot
var/shoot_sound = 'sound/items/weapons/pierce.ogg'
/// Typepath of our gaze ability
var/gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze
// We attract and eat these things for some reason
var/list/wanted_objects = list(
/obj/item/stack/sheet/mineral/diamond,
/obj/item/stack/ore/diamond,
/obj/item/pen/survival,
)
/mob/living/basic/mining/watcher/Initialize(mapload)
. = ..()
AddElement(/datum/element/ai_retaliate)
AddElement(/datum/element/simple_flying)
AddElement(/datum/element/content_barfer)
AddComponent(/datum/component/ai_target_timer)
AddComponent(/datum/component/basic_ranged_ready_overlay, overlay_state = eye_glow)
AddComponent(\
/datum/component/ranged_attacks,\
cooldown_time = ranged_cooldown,\
projectile_type = projectile_type,\
projectile_sound = shoot_sound,\
)
AddComponent(\
/datum/component/magnet,\
attracted_typecache = wanted_objects,\
on_contact = CALLBACK(src, PROC_REF(consume)),\
)
update_appearance(UPDATE_OVERLAYS)
var/datum/action/cooldown/mob_cooldown/watcher_gaze/gaze = new gaze_attack(src)
gaze.Grant(src)
ai_controller.set_blackboard_key(BB_GENERIC_ACTION, gaze)
AddComponent(/datum/component/revenge_ability, gaze, targeting = GET_TARGETING_STRATEGY(ai_controller.blackboard[BB_TARGETING_STRATEGY]))
/mob/living/basic/mining/watcher/update_overlays()
. = ..()
if (stat == DEAD)
return
. += emissive_appearance(icon, "watcher_emissive", src, effect_type = EMISSIVE_NO_BLOOM)
. += emissive_appearance(icon, "watcher_emissive_bloom", src)
/// I love eating diamonds yum
/mob/living/basic/mining/watcher/proc/consume(atom/movable/thing)
visible_message(span_warning("[thing] seems to vanish into [src]'s body!"))
thing.forceMove(src)
/// More durable, burning projectiles
/mob/living/basic/mining/watcher/magmawing
name = "magmawing watcher"
desc = "Presented with extreme temperatures, adaptive watchers absorb heat through their circulatory wings and repurpose it as a weapon."
icon_state = "watcher_magmawing"
icon_living = "watcher_magmawing"
icon_dead = "watcher_magmawing_dead"
eye_glow = "fire_glow"
maxHealth = 175 //Compensate for the lack of slowdown on projectiles with a bit of extra health
health = 175
projectile_type = /obj/projectile/temp/watcher/magma_wing
gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/fire
crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
crusher_drop_chance = 100 // There's only going to be one of these per round throw them a bone
/// Less durable, freezing projectiles
/mob/living/basic/mining/watcher/icewing
name = "icewing watcher"
desc = "Watchers which fail to absorb enough heat during their development become fragile, but share their internal chill with their enemies."
icon_state = "watcher_icewing"
icon_living = "watcher_icewing"
icon_dead = "watcher_icewing_dead"
eye_glow = "ice_glow"
maxHealth = 130
health = 130
projectile_type = /obj/projectile/temp/watcher/ice_wing
gaze_attack = /datum/action/cooldown/mob_cooldown/watcher_gaze/ice
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1)
crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
crusher_drop_chance = 100