Adds 4 New Asteroid Ruins (#30557)

* Pirate Ruin, Drakehound Ruin, Drakehound Mobs, Vox Mobs

* Vox ruin

* Adjusted vox ruin

* Adjusts mob AI

* Skullakin Mine, Minor Adjustments to Drakehounds

* Removes some koi, minor atmos adjustments

* Adds vox salvage

* Solars and small adjustments

* Linters

* Config fix

* Linters

* Map lints

* Address Code Review

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
This commit is contained in:
PollardTheDragon
2025-11-07 16:39:08 +00:00
committed by GitHub
parent 9051e9b915
commit 932a81e0b9
20 changed files with 12719 additions and 1 deletions
@@ -0,0 +1,45 @@
/area/ruin/drakehound_mine/arrivals
name = "Drakehound Asteroid Mine Arrivals"
icon_state = "entry"
/area/ruin/drakehound_mine/bar
name = "Drakehound Asteroid Mine Bar"
icon_state = "bar"
/area/ruin/drakehound_mine/bridge
name = "Drakehound Asteroid Mine Bridge"
icon_state = "bridge"
/area/ruin/drakehound_mine/hallway_south
name = "Drakehound Asteroid Mine Aft Hallway"
icon_state = "hall_space"
/area/ruin/drakehound_mine/hallway_north
name = "Drakehound Asteroid Mine Fore Hallway"
icon_state = "hall_space"
/area/ruin/drakehound_mine/mechbay
name = "Drakehound Asteroid Mine Mechbay"
icon_state = "mechbay"
/area/ruin/drakehound_mine/ship
name = "Drakehound Asteroid Mine Ship"
requires_power = FALSE
/area/ruin/drakehound_mine/solars
name = "Drakehound Asteroid Mine Solars"
icon_state = "general_solars"
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
ambientsounds = ENGINEERING_SOUNDS
sound_environment = SOUND_AREA_SPACE
// MARK: LORE CONSOLES
/obj/machinery/computer/loreconsole/drakehound_mine
entries = list(
new/datum/lore_console_entry(
"Foreman's Log",
{"I can't believe we were able to snag these rocks at the price they were. They're just filled with minerals!
Spike says the rocks are pretty strong too. This little outpost will be our first foray into riches! We're gonna make it big, I tell you!"}))
@@ -0,0 +1,166 @@
/area/ruin/skullakin_mine/arrivals
name = "Skullakin Asteroid Mine Arrivals"
icon_state = "entry"
/area/ruin/skullakin_mine/cafeteria
name = "Skullakin Asteroid Mine Cafeteria"
icon_state = "bar"
/area/ruin/skullakin_mine/overseer
name = "Skullakin Asteroid Mine Overseer's Office"
icon_state = "bridge"
/area/ruin/skullakin_mine/mission_control
name = "Skullakin Asteroid Mine Mission Control"
icon_state = "hall_space"
/area/ruin/skullakin_mine/temple
name = "Skullakin Asteroid Mine Temple"
icon_state = "chapel"
/area/ruin/skullakin_mine/mining
name = "Skullakin Asteroid Mine Mining Foyer"
icon_state = "mining"
/area/ruin/skullakin_mine/solars
name = "Skullakin Asteroid Mine Solars"
icon_state = "general_solars"
requires_power = FALSE
valid_territory = FALSE
dynamic_lighting = DYNAMIC_LIGHTING_IFSTARLIGHT
ambientsounds = ENGINEERING_SOUNDS
sound_environment = SOUND_AREA_SPACE
/obj/machinery/computer/loreconsole/skullakin_mine/security_checkpoint
name = "Security Checkpoint Console"
entries = list(
new/datum/lore_console_entry(
"Recent Arrivals",
{"## INCOMING PERSONNEL
**Alkkus-Vittari** - Crucible Excavation-Acolyte, Temporary Stay.
**Viltaskk-Akka** - Crucible Excavation-Acolyte, Temporary Stay.
**Tikka-Muttal** - Crucible Excavation-Neophyte, Temporary Stay, Apprentice To Viltaskk.
**Altus-Paskko** - Clergy Medical-Acolyte
**Makkath-Gurtask** - Crucible Lord-Foreman, Temporary Stay
**Askkith-Mortaa** - Low-Inquisitor, Temporary Stay
**Baskka-Tillk** - Low-Inquisitor, Temporary Stay (Me!!!)
## OUTGOING PERSONNEL
**Eskka-Mortiss** - High-Inquisitor
**Tavvikk-Ckall** - Crucible Grand-Foreman"}),
new/datum/lore_console_entry(
"Security Notes",
{"Alkkus got into a fight with Tikka again. We aren't sure what provoked them, but Alkkus calmed down \
after temporary admonition. Askkith is upset it didn't escalate, but I'm just glad no weapons were drawn. \
Tikka had to report to Altus for a checkup, suffering a few bruises to the side of their head. Even still, \
Tikka chose to forgive Alkkus. I can't stand him, Alkkus has been nothing but trouble from the moment they got here."}))
/obj/machinery/computer/loreconsole/skullakin_mine/monitoring_station
name = "Sensor Monitoring Station"
entries = list(
new/datum/lore_console_entry(
"Scanning Station",
{"## LOGGED OBJECTS
**Demonic Vessel** - A haphazardly repaired space vessel passed by, nearby naval vessels were notified but the abominations didn't seem to notice us.
**Collective Vessel** - Crucible combat vessel stopped to refuel, they were supposedly looking for the reported demonic vessel, but they seem long gone by now.
**Large Asteroid** - Missed us by a wide margin, was thoroughly scanned and had no materials worth excavating.
**Resonance Spike** - Makkath stated they felt a strange psionic energy reading. We assume a group of souls passed by, but the scanners aren't picking \
it up anymore. I decided to log it anyways in case anything comes of it.
**Unmarked Vessel** - A black vessel passed by, we aren't sure who it belongs to but it looks to be a stealth vessel of some kind, we planned to hail it, \
but Lord Makkath told us to keep quiet.
**Unknown Debris** - Plasteel debris was seen floating off, we aren't sure where it came from, but it seemed logical to put here."}),
new/datum/lore_console_entry(
"Operator's Notes",
{"This feels strange. We're in Nanotrasen space, but we haven't seen a single corporate vessel in weeks. It's lonely, it doesn't feel right being so far away \
from the Accoriums. The Lord has been doing well to keep morale up though, he's not the best at preaching, but I can tell everyone appreciates the gesture. \
Though, I spent time talking with Tikka - poor kid doesn't feel like she belongs. They wouldn't stop crying when I tended to her bruises the other day, Skkula forbid we all get along."}))
/obj/machinery/computer/loreconsole/skullakin_mine/overseer_console
name = "Overseer's Console"
entries = list(
new/datum/lore_console_entry(
"Overseer Console",
{"## LORD-FOREMAN MAKKATH'S NOTES
We dug into a divot recently, my hopes weren't high but the scanner is showing a potential deposit of ichor! Praise be and Skkula, we were due some good news. \
Hopefully once I tell the disciples I'll finally see some smiles around here, I can't stand seeing everyone so upset.
I'll tell Tavvikk when deep-drilling operations are underway, we still need to make sure the ground is stable enough so we don't depressurize anything. Despite \
the presence of ichor, much of the asteroid is disappointingly hollow, but we take what Skkula bestows us.
In other news, Viltaskk has talked to me about promoting Tikka to an Acolyte. I personally believe it is much too soon, they can barely hold a pickaxe, and I \
watched them get sent flying after firing a kinetic accelerator. But, it may help with their outlook on things, I still think it was cruel to make them leave Ossya.
Askkith and Baskka pulled Alkkus aside again, for a 'routine checkup' they said, one that conveniently did not include Altus. I feared the worst, but Alkkus left, \
unscathed. Nobody wanted to tell me what happen, but Alkkus apologized to Tikka and offered to show her how to fire a kinetic accelerator without ending up on the \
other side of the room, I never saw the Neophyte so happy.
I think things are finally looking up."}))
/obj/machinery/computer/loreconsole/skullakin_mine/mission_control
name = "Mission Control"
entries = list(
new/datum/lore_console_entry(
"Mission Control",
{"## RECENT CONVERSATIONS
**Grand-Foreman**: Status report, immediately.
**Lord-Foreman**: Forgive me, Tavvikk, madame. I was meaning to contact you after deep-drilling procedures.
**Grand-Foreman**: So you found something? Ichor I hope, for your sake that is.
**Lord-Foreman**: We are detecting an ichoric presence, yes madame. We know our efforts have been mostly fruitless until now.
**Grand-Foreman**: You are the only excavation outpost that has yet to come up with anything meaningful, but this comes as a pleasant surprise. Do you require further assistance?
**Lord-Foreman**: We shouldn't, I trust my team. We're about to start the deep-drill, we'll keep you updated.
**Grand-Foreman**: Then Skkula guide you, kindred. I expect a message soon.
**Grand-Foreman**: Kkatisk! Attention! How are the operations, you have been silent for much too long.
**Grand-Foreman**: Makkath, you are ordered to report. Failure to do so will result in punishment.
**Grand-Foreman**: Lord-Foreman Makkath-Gurtask? Please come in.
**Grand-Foreman**: Corporate vessels are in the vicinity, we are unable to send a team to investigate, forgive us kindred. May Skkula guide your path."}))
/obj/machinery/computer/loreconsole/skullakin_mine/hidden_survivor
name = "Tikka's Computer"
entries = list(
new/datum/lore_console_entry(
"Log 1",
{"I'm so scared, my vision is blurry and I won't stop shaking. Lord Makkath let me start up the drill, and it was working for a moment, \
but it fell through the ground and these things came crawling out. I couldn't move, I woke up something angry and impure, Viltaskk \
grabbed me and ran. We all tried to slow them down by spinning traps, but there were just too many. Sir Viltaskk threw me in here \
and told me he'd come back, that felt like hours ago.
I heard Alkkus screaming and cursing, the Lord-Foreman shouted after him before he ran off. I keep hearing heavy footsteps all \
around me, I want to go home. Askkith and Baskka were screaming down the hall, the Cycler rounds were deafening, but now I miss \
them. I don't know where Altus went, maybe he's still alive?
Hopefully Makkath called for help, I know he'll get us out of this."}),
new/datum/lore_console_entry(
"Log 2",
{"I thought about walking outside and accepting fate today, everything is dead quiet, but I still hear growling and stomping. I can't \
stop crying. Hakk-eh, why me? Did I do something wrong? I'm starving and have nothing to eat, but I'm too scared to leave. I want Altus, \
I want Viltaskk, I wasn't made for this. Please, anybody, demons or constructs, I don't want to die here."}),
new/datum/lore_console_entry(
"Log 3",
{"Everythingg is fadingc. It's getbting hardd to bbreathe. I haardly havve the strength ttyo cry anymotrre. Skkula, pleaase help p, I'm sccared. \
I just want tto gop hoome, pplease. Is thhis a cruuel jjoke, oor wass this ffate? Please gguide me, I ddon't want to makke this jjourney alone. \
Aare they waiting for me, did they rreach you? Skkula? It's so ccold. Helpp."}))
+6
View File
@@ -698,6 +698,12 @@
id_job = "Scientist"
outfit = /datum/outfit/job/scientist
/obj/effect/mob_spawn/human/corpse/random_species/miner
name = "Shaft Miner"
mob_name = "Shaft Miner"
id_job = "Shaft Miner"
outfit = /datum/outfit/job/mining/equipped/less
/obj/effect/mob_spawn/human/corpse/skeleton
name = "skeletal remains"
mob_name = "skeleton"
@@ -37,6 +37,7 @@
/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"])
AddComponent(/datum/component/aggro_emote, aggro_sound = 'sound/effects/unathihiss.ogg', emote_chance = 100)
@@ -52,18 +53,141 @@
/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,
/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(
@@ -76,3 +200,8 @@
"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
@@ -0,0 +1,162 @@
/mob/living/basic/vox_miner
name = "Vox Miner"
desc = "A vox primalis wearing a strange suit and wielding a plasma cutter."
icon = 'icons/mob/simple_human.dmi'
icon_state = "vox_miner"
icon_living = "vox_miner"
icon_dead = "vox_miner" // 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 = "claws"
response_harm_simple = "claw"
speak_emote = "screeches"
speed = 0
harm_intent_damage = 5
obj_damage = 45
melee_damage_lower = 15
melee_damage_upper = 20
melee_attack_cooldown_min = 1.5 SECONDS
melee_attack_cooldown_max = 2.5 SECONDS
attack_verb_continuous = "claws"
attack_verb_simple = "claw"
attack_sound = 'sound/weapons/slice.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("screeches")
ai_controller = /datum/ai_controller/basic_controller/simple/vox_miner
loot = list(
/obj/effect/mob_spawn/human/corpse/vox_miner,
/obj/effect/decal/cleanable/blood/innards/vox,
/obj/effect/decal/cleanable/blood/vox,
/obj/effect/gibspawner/vox)
basic_mob_flags = DEL_ON_DEATH
faction = list("vox_raider")
sentience_type = SENTIENCE_OTHER
step_type = FOOTSTEP_MOB_SHOE
is_ranged = TRUE
projectile_type = /obj/item/projectile/plasma/adv
projectile_sound = 'sound/weapons/laser.ogg'
ranged_cooldown = 1.75 SECONDS
/mob/living/basic/vox_miner/Initialize(mapload)
. = ..()
AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(retaliate_callback)))
add_language("Vox-pidgin")
set_default_language(GLOB.all_languages["Vox-pidgin"])
AddComponent(/datum/component/aggro_emote, aggro_sound = 'sound/voice/shriek1.ogg', emote_chance = 100)
if(prob(50))
loot.Add(/obj/item/salvage/loot/vox)
if(prob(25))
loot.Add(/obj/item/gun/energy/plasmacutter)
/mob/living/basic/vox_miner/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/vox_miner/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/vox_miner/foreman
name = "Vox Foreman"
desc = "A vox primalis wearing a strange suit and wielding a spikethrower. You could swear it wasn't there a second ago..."
health = 125
maxHealth = 125
icon_state = "vox_foreman"
icon_living = "vox_foreman"
ai_controller = /datum/ai_controller/basic_controller/simple/vox_foreman
projectile_type = /obj/item/projectile/bullet/spike
projectile_sound = 'sound/weapons/bladeslice.ogg'
ranged_burst_count = 2
ranged_burst_interval = 0.5 SECONDS
ranged_cooldown = 2.5 SECONDS
loot = list(
/obj/item/salvage/loot/vox,
/obj/item/salvage/loot/vox,
/obj/item/salvage/loot/pirate,
/obj/item/salvage/ruin/pirate,
/obj/effect/mob_spawn/human/corpse/vox_miner,
/obj/effect/decal/cleanable/blood/innards/vox,
/obj/effect/decal/cleanable/blood/vox,
/obj/effect/gibspawner/vox)
/mob/living/basic/vox_miner/foreman/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/vox_miner/harbinger in oview(src, 28)) // They call for help over a long range - take out the support first.
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)
/datum/ai_controller/basic_controller/simple/vox_miner
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,
BB_AGGRO_RANGE = 4,
)
ai_movement = /datum/ai_movement/jps
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/vox_miner,
/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/vox_miner,
/datum/ai_planning_subtree/attack_obstacle_in_path,
)
/datum/ai_controller/basic_controller/simple/vox_foreman
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
BB_TARGET_MINIMUM_STAT = UNCONSCIOUS,
BB_RANGED_SKIRMISH_MIN_DISTANCE = 3,
BB_RANGED_SKIRMISH_MAX_DISTANCE = 6,
BB_AGGRO_RANGE = 5,
)
ai_movement = /datum/ai_movement/jps
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/vox_miner,
/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/vox_miner/foreman,
/datum/ai_planning_subtree/attack_obstacle_in_path,
)
/datum/ai_planning_subtree/random_speech/vox_miner
speech_chance = 8
speak = list(
"Just another day.",
"You think I'm going to get extra rations for this?",
"Did you hear the latest choir chants?",
"I think I heard something...",
"By the Auralis!",
"For the Auralis!",
"For the Ark!",
"Stars guide my aim!")
sound = list('sound/effects/voxfcaw.ogg', 'sound/effects/voxrcaw.ogg', 'sound/effects/voxrustle.ogg', 'sound/voice/shriek1.ogg')
/datum/ai_planning_subtree/ranged_skirmish/vox_miner
min_range = 1
max_range = 4
attack_behavior = /datum/ai_behavior/ranged_skirmish/avoid_friendly
/datum/ai_planning_subtree/ranged_skirmish/vox_miner/foreman
max_range = 9
@@ -153,6 +153,22 @@
gloves = /obj/item/clothing/gloves/color/black
shoes = /obj/item/clothing/shoes/jackboots
/obj/effect/mob_spawn/human/corpse/vox_miner
name = "Vox Miner"
mob_name = "Vox Miner"
mob_species = /datum/species/vox
outfit = /datum/outfit/vox_miner
/datum/outfit/vox_miner
name = "Vox Miner"
uniform = /obj/item/clothing/under/vox/vox_casual
gloves = /obj/item/clothing/gloves/color/black
shoes = /obj/item/clothing/shoes/workboots
mask = /obj/item/clothing/mask/breath/vox/respirator
l_pocket = /obj/item/tank/internals/emergency_oxygen/double/vox
back = /obj/item/storage/backpack/explorer
box = /obj/item/storage/box/survival_vox
/obj/effect/mob_spawn/human/corpse/soviet
name = "Soviet"
mob_name = "Soviet"