mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-29 06:57:42 +01:00
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:
@@ -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."}))
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user