Files
PollardTheDragon aad47daacc Adds retaliation to some space mobs (#30841)
* Adds retaliation to some space mobs

* Tweaks mob mech damage, makes basic mobs handle mechs consistently.

* Revert "Tweaks mob mech damage, makes basic mobs handle mechs consistently."

This reverts commit 1e1fa43937.

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
2025-11-19 19:41:45 +00:00

209 lines
8.1 KiB
Plaintext

/mob/living/basic/drakehound_breacher
name = "Drakehound Breacher"
desc = "A unathi raider with a viscious streak."
icon = 'icons/mob/simple_human.dmi'
icon_state = "drakehound"
icon_living = "drakehound"
icon_dead = "drakehound_dead" // Does not actually exist. del_on_death.
mob_biotypes = MOB_ORGANIC | MOB_HUMANOID
response_help_continuous = "pushes the"
response_help_continuous = "push the"
response_harm_continuous = "slashes"
response_harm_simple = "slash"
speed = 0
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 30
melee_damage_upper = 30
melee_attack_cooldown_min = 1.5 SECONDS
melee_attack_cooldown_max = 2.5 SECONDS
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
minimum_survivable_temperature = 0
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
speak_emote = list("hisses")
ai_controller = /datum/ai_controller/basic_controller/simple/drakehound
loot = list(
/obj/effect/mob_spawn/human/corpse/drakehound,
/obj/effect/decal/cleanable/blood/innards,
/obj/effect/decal/cleanable/blood,
/obj/effect/gibspawner/generic,
/obj/effect/gibspawner/generic)
basic_mob_flags = DEL_ON_DEATH
faction = list("pirate")
sentience_type = SENTIENCE_OTHER
step_type = FOOTSTEP_MOB_SHOE
/mob/living/basic/drakehound_breacher/Initialize(mapload)
. = ..()
AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(retaliate_callback)))
add_language("Sinta'unathi")
set_default_language(GLOB.all_languages["Sinta'unathi"])
AddElement(/datum/element/ai_retaliate)
AddComponent(/datum/component/aggro_emote, aggro_sound = 'sound/effects/unathihiss.ogg', emote_chance = 100)
if(prob(50))
loot = list(
/obj/item/salvage/loot/pirate,
/obj/effect/mob_spawn/human/corpse/drakehound,
/obj/effect/decal/cleanable/blood/innards,
/obj/effect/decal/cleanable/blood,
/obj/effect/gibspawner/generic,
/obj/effect/gibspawner/generic)
/mob/living/basic/drakehound_breacher/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return TRUE
/mob/living/basic/drakehound_breacher/proc/retaliate_callback(mob/living/attacker)
if(!istype(attacker))
return
if(attacker.ai_controller) // Don't chain retaliates.
var/list/shitlist = attacker.ai_controller.blackboard[BB_BASIC_MOB_RETALIATE_LIST]
if(src in shitlist)
return
for(var/mob/living/basic/drakehound_breacher/harbinger in oview(src, 5))
if(harbinger == attacker) // Do not commit suicide attacking yourself
continue
if(harbinger.faction_check_mob(attacker, FALSE)) // Don't attack your friends.
continue
harbinger.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker)
/mob/living/basic/drakehound_breacher/ranged
name = "Drakehound Raider"
desc = "A unathi raider with a shotgun."
icon_state = "drakehound_raider"
icon_living = "drakehound_raider"
melee_damage_lower = 15
melee_damage_upper = 25
ai_controller = /datum/ai_controller/basic_controller/simple/drakehound_ranged
is_ranged = TRUE
ranged_cooldown = 1.5 SECONDS
casing_type = /obj/item/ammo_casing/shotgun/rubbershot
projectile_sound = 'sound/weapons/gunshots/gunshot_shotgun.ogg'
/mob/living/basic/drakehound_breacher/ranged/Initialize(mapload)
. = ..()
RegisterSignal(src, COMSIG_BASICMOB_POST_ATTACK_RANGED, PROC_REF(rack_shotgun))
/mob/living/basic/drakehound_breacher/ranged/proc/rack_shotgun()
sleep(0.5 SECONDS)
playsound(src, 'sound/weapons/gun_interactions/shotgunpump.ogg', 60, TRUE)
var/datum/component/ranged_attacks/comp = GetComponent(/datum/component/ranged_attacks)
comp.casing_type = pick(/obj/item/ammo_casing/shotgun/rubbershot, /obj/item/ammo_casing/shotgun/laserslug, /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath)
/mob/living/basic/drakehound_breacher/ranged/captain
name = "Drakehound Captain"
desc = "The leader of a band of drakehounds. Wields a large shotgun with devastating effectiveness, and a very large sword for those who get too close."
icon_state = "drakehound_captain"
icon_living = "drakehound_captain"
melee_damage_lower = 25
melee_damage_upper = 40
maxHealth = 250
health = 250
speed = 0.5 // Bigger and badder, slightly slower
ai_controller = /datum/ai_controller/basic_controller/simple/drakehound_skirmish
ranged_cooldown = 2 SECONDS
ranged_burst_count = 3
ranged_burst_interval = 0.5 SECONDS
casing_type = /obj/item/ammo_casing/shotgun/buckshot
attack_sound = 'sound/weapons/swordhitheavy.ogg'
/mob/living/basic/drakehound_breacher/ranged/captain/Initialize(mapload)
. = ..()
loot = list(
/obj/effect/mob_spawn/human/corpse/drakehound,
/obj/item/salvage/loot/pirate,
/obj/item/salvage/loot/pirate,
/obj/item/salvage/loot/pirate,
/obj/item/gun/projectile/shotgun/automatic/dual_tube,
/obj/effect/decal/cleanable/blood/innards,
/obj/effect/decal/cleanable/blood,
/obj/effect/gibspawner/generic,
/obj/effect/gibspawner/generic)
/mob/living/basic/drakehound_breacher/ranged/captain/rack_shotgun()
var/datum/component/ranged_attacks/comp = GetComponent(/datum/component/ranged_attacks)
comp.casing_type = pick(/obj/item/ammo_casing/shotgun/buckshot, /obj/item/ammo_casing/shotgun/incendiary/dragonsbreath, /obj/item/ammo_casing/shotgun/lasershot)
/mob/living/basic/drakehound_breacher/ranged/captain/melee_attack(atom/target, list/modifiers, ignore_cooldown)
if(!ishuman(target))
return ..()
var/mob/living/L = target
var/attack_type = pick("disarm", "grab", "harm")
switch(attack_type)
if("disarm")
playsound(get_turf(src), 'sound/weapons/sonic_jackhammer.ogg', 50, TRUE, -1)
var/atom/throw_target = get_edge_target_turf(L, src.dir, TRUE)
L.throw_at(throw_target, 4, 1)
return ..()
if("grab")
L.KnockDown(4 SECONDS)
return ..()
if("harm")
return ..()
/datum/ai_controller/basic_controller/simple/drakehound
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
)
ai_movement = /datum/ai_movement/jps
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/drakehound,
/datum/ai_planning_subtree/target_retaliate/check_faction,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
/datum/ai_controller/basic_controller/simple/drakehound_ranged
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_RANGED_SKIRMISH_MIN_DISTANCE = 2,
BB_RANGED_SKIRMISH_MAX_DISTANCE = 4
)
ai_movement = /datum/ai_movement/jps
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/drakehound,
/datum/ai_planning_subtree/target_retaliate,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
/datum/ai_planning_subtree/maintain_distance,
/datum/ai_planning_subtree/ranged_skirmish/drakehound,
/datum/ai_planning_subtree/attack_obstacle_in_path,
)
/datum/ai_controller/basic_controller/simple/drakehound_skirmish
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
)
ai_movement = /datum/ai_movement/jps
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/drakehound,
/datum/ai_planning_subtree/target_retaliate,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/ranged_skirmish/drakehound,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
/datum/ai_planning_subtree/random_speech/drakehound
speech_chance = 10
speak = list(
"I'll send you back to the pits!",
"Finally, some action!",
"You're gonna be quick work!",
"Oh, now you fucked up!",
"Maybe don't board the clearly dangerous looking ship?",
"Heart Smash is better, you don't know good music.",
"We wouldn't be stuck here if we just zigged when we zagged.",
"Well, atleast I'm away from my brother!",
"Got any smokes?")
/datum/ai_planning_subtree/ranged_skirmish/drakehound
min_range = 0
max_range = 5
attack_behavior = /datum/ai_behavior/ranged_skirmish/avoid_friendly