Files
RoxyandGitHub cea1234d12 Add qdel for mook bard guitar (#93692)
## About The Pull Request

QDEL_NULL for the mook bard's `held_guitar`

## Why It's Good For The Game

Some kind of hard delete waiting to happen

## Changelog

N/A
2025-10-31 22:18:27 +01:00

297 lines
9.2 KiB
Plaintext

//Fragile but highly aggressive wanderers that pose a large threat in numbers.
//They'll attempt to leap at their target from afar using their hatchets.
/mob/living/basic/mining/mook
name = "wanderer"
desc = "This unhealthy looking primitive seems to be talented at administering health care."
icon = 'icons/mob/simple/jungle/mook.dmi'
icon_state = "mook"
icon_living = "mook"
icon_dead = "mook_dead"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_MINING
gender = FEMALE
maxHealth = 150
faction = list(FACTION_MINING, FACTION_NEUTRAL)
health = 150
move_resist = MOVE_FORCE_VERY_STRONG
melee_damage_lower = 8
melee_damage_upper = 8
attack_sound = 'sound/items/weapons/rapierhit.ogg'
attack_vis_effect = ATTACK_EFFECT_SLASH
death_sound = 'sound/mobs/non-humanoids/mook/mook_death.ogg'
ai_controller = /datum/ai_controller/basic_controller/mook/support
speed = 5
pixel_x = -16
base_pixel_x = -16
pixel_z = -16
base_pixel_z = -16
///the state of combat we are in
var/attack_state = MOOK_ATTACK_NEUTRAL
///are we a healer?
var/is_healer = TRUE
///the ore we are holding if any
var/obj/held_ore
///overlay for neutral stance
var/mutable_appearance/neutral_stance
///overlay for attacking stance
var/mutable_appearance/attack_stance
///overlay when we hold an ore
var/mutable_appearance/ore_overlay
///commands we obey
var/list/pet_commands = list(
/datum/pet_command/idle,
/datum/pet_command/free,
/datum/pet_command/attack,
/datum/pet_command/fetch,
)
/mob/living/basic/mining/mook/Initialize(mapload)
. = ..()
AddElement(\
/datum/element/change_force_on_death,\
move_resist = MOVE_RESIST_DEFAULT,\
)
AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(attack_intruder)))
grant_actions_by_list(get_innate_abilities())
ore_overlay = mutable_appearance(icon, "mook_ore_overlay")
AddComponent(/datum/component/ai_listen_to_weather)
AddElement(/datum/element/wall_tearer, allow_reinforced = FALSE)
RegisterSignal(src, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(drop_ore))
if(is_healer)
grant_healer_abilities()
AddComponent(/datum/component/obeys_commands, pet_commands)
/// Returns a list of actions and blackboard keys to pass into `grant_actions_by_list`.
/mob/living/basic/mining/mook/proc/get_innate_abilities()
var/static/list/innate_abilities = list(
/datum/action/cooldown/mob_cooldown/mook_ability/mook_jump = BB_MOOK_JUMP_ABILITY,
)
return innate_abilities
/mob/living/basic/mining/mook/proc/grant_healer_abilities()
AddComponent(\
/datum/component/healing_touch,\
heal_brute = melee_damage_upper,\
heal_burn = melee_damage_upper,\
heal_time = 0,\
valid_targets_typecache = typecacheof(list(/mob/living/basic/mining/mook)),\
)
/mob/living/basic/mining/mook/Entered(atom/movable/mover)
if(istype(mover, /obj/item/stack/ore))
held_ore = mover
update_appearance(UPDATE_OVERLAYS)
return ..()
/mob/living/basic/mining/mook/Exited(atom/movable/mover)
. = ..()
if(held_ore != mover)
return
held_ore = null
update_appearance(UPDATE_OVERLAYS)
/mob/living/basic/mining/mook/early_melee_attack(atom/target, list/modifiers, ignore_cooldown)
. = ..()
if(!.)
return FALSE
return attack_sequence(target)
/mob/living/basic/mining/mook/proc/attack_sequence(atom/target)
if(istype(target, /obj/item/stack/ore) && isnull(held_ore))
var/obj/item/ore_target = target
ore_target.forceMove(src)
return FALSE
if(istype(target, /obj/structure/ore_container/material_stand))
if(held_ore)
held_ore.forceMove(target)
return FALSE
if(istype(target, /obj/structure/bonfire))
var/obj/structure/bonfire/fire_target = target
if(!fire_target.burning)
fire_target.start_burning()
return FALSE
/mob/living/basic/mining/mook/proc/change_combatant_state(state)
attack_state = state
update_appearance()
/mob/living/basic/mining/mook/Destroy()
QDEL_NULL(held_ore)
return ..()
/mob/living/basic/mining/mook/update_icon_state()
. = ..()
if(stat == DEAD)
return
switch(attack_state)
if(MOOK_ATTACK_NEUTRAL)
icon_state = "mook"
if(MOOK_ATTACK_WARMUP)
icon_state = "mook_warmup"
if(MOOK_ATTACK_ACTIVE)
icon_state = "mook_leap"
if(MOOK_ATTACK_STRIKE)
icon_state = "mook_strike"
/mob/living/basic/mining/mook/update_overlays()
. = ..()
if(stat == DEAD)
return
if(attack_state != MOOK_ATTACK_NEUTRAL || isnull(held_ore))
return
. += ore_overlay
/mob/living/basic/mining/mook/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, gentle = FALSE, quickstart = TRUE, throw_type_path = /datum/thrownthing)
change_combatant_state(state = MOOK_ATTACK_ACTIVE)
return ..()
/mob/living/basic/mining/mook/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
change_combatant_state(state = MOOK_ATTACK_NEUTRAL)
/mob/living/basic/mining/mook/CanAllowThrough(atom/movable/mover, border_dir)
. = ..()
if(.)
return TRUE
if(!istype(mover, /mob/living/basic/mining/mook))
return FALSE
var/mob/living/basic/mining/mook/mook_moover = mover
if(mook_moover.attack_state == MOOK_ATTACK_ACTIVE)
return TRUE
/mob/living/basic/mining/mook/proc/drop_ore(mob/living/user)
SIGNAL_HANDLER
if(isnull(held_ore))
return
dropItemToGround(held_ore)
return COMSIG_KB_ACTIVATED
/mob/living/basic/mining/mook/death()
desc = "A deceased primitive. Upon closer inspection, it was suffering from severe cellular degeneration and its garments are machine made..." //Can you guess the twist
return ..()
/mob/living/basic/mining/mook/proc/attack_intruder(mob/living/intruder)
if(istype(intruder, /mob/living/basic/mining/mook))
return
for(var/mob/living/basic/mining/mook/villager in oview(src, 9))
villager.ai_controller?.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, intruder)
/mob/living/basic/mining/mook/worker
desc = "This unhealthy looking primitive is wielding a rudimentary hatchet, swinging it with wild abandon. One isn't much of a threat, but in numbers they can quickly overwhelm a superior opponent."
gender = MALE
melee_damage_lower = 15
melee_damage_upper = 15
ai_controller = /datum/ai_controller/basic_controller/mook
is_healer = FALSE
/mob/living/basic/mining/mook/worker/Initialize(mapload)
. = ..()
neutral_stance = mutable_appearance(icon, "mook_axe_overlay")
attack_stance = mutable_appearance(icon, "axe_strike_overlay")
update_appearance()
/mob/living/basic/mining/mook/worker/get_innate_abilities()
var/static/list/worker_innate_abilites = null
if(isnull(worker_innate_abilites))
worker_innate_abilites = list()
worker_innate_abilites += ..()
worker_innate_abilites += list(
/datum/action/cooldown/mob_cooldown/mook_ability/mook_leap = BB_MOOK_LEAP_ABILITY,
)
return worker_innate_abilites
/mob/living/basic/mining/mook/worker/attack_sequence(atom/target)
. = ..()
if(. & COMPONENT_HOSTILE_NO_ATTACK)
return
if(attack_state == MOOK_ATTACK_STRIKE)
return COMPONENT_HOSTILE_NO_ATTACK
change_combatant_state(state = MOOK_ATTACK_STRIKE)
addtimer(CALLBACK(src, PROC_REF(change_combatant_state), MOOK_ATTACK_NEUTRAL), 0.3 SECONDS)
/mob/living/basic/mining/mook/worker/update_overlays()
. = ..()
if(stat == DEAD)
return
switch(attack_state)
if(MOOK_ATTACK_STRIKE)
. += attack_stance
if(MOOK_ATTACK_NEUTRAL)
. += neutral_stance
/mob/living/basic/mining/mook/worker/bard
desc = "It's holding a guitar?"
melee_damage_lower = 10
melee_damage_upper = 10
gender = MALE
attack_sound = 'sound/items/weapons/stringsmash.ogg'
death_sound = 'sound/mobs/non-humanoids/mook/mook_death.ogg'
ai_controller = /datum/ai_controller/basic_controller/mook/bard
///our guitar
var/obj/item/instrument/guitar/held_guitar
/mob/living/basic/mining/mook/worker/bard/Initialize(mapload)
. = ..()
neutral_stance = mutable_appearance(icon, "bard_overlay")
attack_stance = mutable_appearance(icon, "bard_strike")
held_guitar = new(src)
ai_controller.set_blackboard_key(BB_SONG_INSTRUMENT, held_guitar)
update_appearance()
/mob/living/basic/mining/mook/worker/bard/Destroy(force)
QDEL_NULL(held_guitar)
. = ..()
/mob/living/basic/mining/mook/worker/tribal_chief
name = "tribal chief"
desc = "Acknowledge him!"
gender = MALE
melee_damage_lower = 20
melee_damage_upper = 20
ai_controller = /datum/ai_controller/basic_controller/mook/tribal_chief
///overlay in our neutral state
var/static/mutable_appearance/chief_neutral = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief")
///overlay in our striking state
var/static/mutable_appearance/chief_strike = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief_strike")
///overlay in our active state
var/static/mutable_appearance/chief_active = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief_leap")
///overlay in our warmup state
var/static/mutable_appearance/chief_warmup = mutable_appearance('icons/mob/simple/jungle/mook.dmi', "mook_chief_warmup")
/mob/living/basic/mining/mook/worker/tribal_chief/Initialize(mapload)
. = ..()
update_appearance()
/mob/living/basic/mining/mook/worker/tribal_chief/update_overlays()
. = ..()
if(stat == DEAD)
return
switch(attack_state)
if(MOOK_ATTACK_NEUTRAL)
. += chief_neutral
if(MOOK_ATTACK_WARMUP)
. += chief_warmup
if(MOOK_ATTACK_ACTIVE)
. += chief_active
if(MOOK_ATTACK_STRIKE)
. += chief_strike