From 03b83205eb870f666698c6baae84fec8af77e141 Mon Sep 17 00:00:00 2001 From: Athena148 <140056159+Athena148@users.noreply.github.com> Date: Sun, 6 Oct 2024 18:02:19 -0400 Subject: [PATCH] The Void Horrors, Xenomorph Expansion (#6787) ## About The Pull Request Expands upon the Xenomorph Rehaul project, beautifying the code, separating it into its own category and sub-categories. Also adds a few new Xenomorphs and re balances some of the older ones. ## Why It's Good For The Game Beautifies and cleans Xenomorph code, adds a few new gimmick xenomorphs as well. ## Changelog :cl: add: Burster, Sprinter, Berserker and Inferno qol: Made Xenomorph code prettier and easier to add/remove from balance: Re balances some older Xenomorphs imageadd: Adds sprites for the Burster, Sprinter, Berserker and Inferno Xenomorphs /:cl: --- citadel.dme | 4 +- code/__HELPERS/global_lists.dm | 10 +- code/game/objects/mob_spawner.dm | 38 +- .../structures/crates_lockers/largecrate.dm | 8 +- code/modules/awaymissions/loot_vr.dm | 2 +- code/modules/events/xenoinfestation.dm | 10 +- .../simple_mob/subtypes/animal/space/alien.dm | 695 ------------------ .../subtypes/animal/xenomorph/xenomorph.dm | 407 ++++++++++ .../animal/xenomorph/xenomorph_abilities.dm | 413 +++++++++++ .../animal/xenomorph/xenomorph_catalogue.dm | 74 ++ code/modules/rogueminer_vr/asteroid.dm | 4 +- .../xenoarcheaology/artifacts/autocloner.dm | 2 +- icons/mob/biomorphs/berserker.dmi | Bin 0 -> 6192 bytes icons/mob/biomorphs/burster.dmi | Bin 0 -> 3745 bytes icons/mob/biomorphs/inferno.dmi | Bin 0 -> 10199 bytes icons/mob/biomorphs/sprinter.dmi | Bin 0 -> 8485 bytes maps/away_missions/140x140/zoo.dmm | 112 +-- .../archive/stationCollision.dmm | 27 +- .../submaps/level_specific/class_d/cave2D.dmm | 70 +- .../level_specific/class_d/vault4D.dmm | 42 +- .../level_specific/class_d/vault5D.dmm | 13 +- .../debrisfield_vr/new_escapepod_xeno.dmm | 31 +- .../level_specific/virgo2/CrashedSmuggler.dmm | 22 +- .../submaps/mountains/crashed_ufo_frigate.dmm | 25 +- maps/submaps/mountains/vault3.dmm | 10 +- maps/submaps/mountains/vault4.dmm | 22 +- maps/submaps/mountains/vault5.dmm | 11 +- 27 files changed, 1071 insertions(+), 981 deletions(-) delete mode 100644 code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm create mode 100644 code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph.dm create mode 100644 code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_abilities.dm create mode 100644 code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_catalogue.dm create mode 100644 icons/mob/biomorphs/berserker.dmi create mode 100644 icons/mob/biomorphs/burster.dmi create mode 100644 icons/mob/biomorphs/inferno.dmi create mode 100644 icons/mob/biomorphs/sprinter.dmi diff --git a/citadel.dme b/citadel.dme index 9dc2ba4f56e..a00bfbd6af2 100644 --- a/citadel.dme +++ b/citadel.dme @@ -3880,7 +3880,6 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\savik.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\shantak.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\sif\sif.dm" -#include "code\modules\mob\living\simple_mob\subtypes\animal\space\alien.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bats.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\bear.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\carp.dm" @@ -3893,6 +3892,9 @@ #include "code\modules\mob\living\simple_mob\subtypes\animal\space\space.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\space_vr.dm" #include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\xenomorph\xenomorph.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\xenomorph\xenomorph_abilities.dm" +#include "code\modules\mob\living\simple_mob\subtypes\animal\xenomorph\xenomorph_catalogue.dm" #include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm" #include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm" #include "code\modules\mob\living\simple_mob\subtypes\horror\bradley.dm" diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm index f46a7c608f4..3c8145928ce 100644 --- a/code/__HELPERS/global_lists.dm +++ b/code/__HELPERS/global_lists.dm @@ -740,11 +740,11 @@ var/global/list/xenobio_gold_mobs_hostile = list( /mob/living/simple_mob/animal/sif/savik, /mob/living/simple_mob/animal/sif/shantak, // /mob/living/simple_mob/animal/sif/siffet, - /mob/living/simple_mob/animal/space/alien/warrior, - /mob/living/simple_mob/animal/space/alien/drone, - /mob/living/simple_mob/animal/space/alien/basic_spitter, - /mob/living/simple_mob/animal/space/alien/adv_spitter, - /mob/living/simple_mob/animal/space/alien/vanguard, + /mob/living/simple_mob/animal/space/xenomorph/warrior, + /mob/living/simple_mob/animal/space/xenomorph/drone, + /mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter, + /mob/living/simple_mob/animal/space/xenomorph/acid_spitter, + /mob/living/simple_mob/animal/space/xenomorph/vanguard, /mob/living/simple_mob/animal/space/bats, /mob/living/simple_mob/animal/space/bear, /mob/living/simple_mob/animal/space/carp, diff --git a/code/game/objects/mob_spawner.dm b/code/game/objects/mob_spawner.dm index a7750f0b37d..e7c05dba237 100644 --- a/code/game/objects/mob_spawner.dm +++ b/code/game/objects/mob_spawner.dm @@ -205,10 +205,10 @@ It also makes it so a ghost wont know where all the goodies/mobs are. icon = 'icons/screen/actions/actions.dmi' icon_state = "alien_egg" spawn_types = list( - /mob/living/simple_mob/animal/space/alien/drone = 20, - /mob/living/simple_mob/animal/space/alien/warrior = 10, - /mob/living/simple_mob/animal/space/alien/vanguard = 5, - /mob/living/simple_mob/animal/space/alien/monarch = 1 + /mob/living/simple_mob/animal/space/xenomorph/drone = 20, + /mob/living/simple_mob/animal/space/xenomorph/warrior = 10, + /mob/living/simple_mob/animal/space/xenomorph/vanguard = 5, + /mob/living/simple_mob/animal/space/xenomorph/monarch = 1 ) /obj/structure/mob_spawner/scanner/xenos/royal @@ -224,7 +224,7 @@ It also makes it so a ghost wont know where all the goodies/mobs are. icon = 'icons/screen/actions/actions.dmi' icon_state = "alien_egg" spawn_types = list( - /mob/living/simple_mob/animal/space/alien/monarch = 5 + /mob/living/simple_mob/animal/space/xenomorph/monarch = 5 ) //////////////////////////////////// @@ -381,30 +381,30 @@ It also makes it so a ghost wont know where all the goodies/mobs are. name = "Alien Spawner" prob_fall = 10 mobs_to_pick_from = list( - /mob/living/simple_mob/animal/space/alien/drone = 1 + /mob/living/simple_mob/animal/space/xenomorph/drone = 1 ) /obj/mob_spawner/alien/easy name = "Easy Alien Spawner" mobs_to_pick_from = list( - /mob/living/simple_mob/animal/space/alien/warrior = 1, - /mob/living/simple_mob/animal/space/alien/drone = 2, - /mob/living/simple_mob/animal/space/alien/basic_spitter = 1, + /mob/living/simple_mob/animal/space/xenomorph/warrior = 1, + /mob/living/simple_mob/animal/space/xenomorph/drone = 2, + /mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter = 1, ) /obj/mob_spawner/alien/medium name = "Medium Alien Spawner" mobs_to_pick_from = list( - /mob/living/simple_mob/animal/space/alien/warrior = 2, - /mob/living/simple_mob/animal/space/alien/drone = 3, - /mob/living/simple_mob/animal/space/alien/basic_spitter = 2, + /mob/living/simple_mob/animal/space/xenomorph/warrior = 2, + /mob/living/simple_mob/animal/space/xenomorph/drone = 3, + /mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter = 2, ) /obj/mob_spawner/alien/hard name = "Hard Alien Spawner" mobs_to_pick_from = list( - /mob/living/simple_mob/animal/space/alien/warrior = 4, - /mob/living/simple_mob/animal/space/alien/adv_spitter = 4, + /mob/living/simple_mob/animal/space/xenomorph/warrior = 4, + /mob/living/simple_mob/animal/space/xenomorph/acid_spitter = 4, ) /obj/structure/mob_spawner/scanner/corgi @@ -453,10 +453,10 @@ It also makes it so a ghost wont know where all the goodies/mobs are. icon = 'icons/screen/actions/actions.dmi' icon_state = "alien_egg" spawn_types = list( - /mob/living/simple_mob/animal/space/alien/drone = 20, - /mob/living/simple_mob/animal/space/alien/warrior = 10, - /mob/living/simple_mob/animal/space/alien/basic_spitter = 5, - /mob/living/simple_mob/animal/space/alien/monarch = 1 + /mob/living/simple_mob/animal/space/xenomorph/drone = 20, + /mob/living/simple_mob/animal/space/xenomorph/warrior = 10, + /mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter = 5, + /mob/living/simple_mob/animal/space/xenomorph/monarch = 1 ) /obj/structure/mob_spawner/scanner/xenos/royal @@ -472,5 +472,5 @@ It also makes it so a ghost wont know where all the goodies/mobs are. icon = 'icons/screen/actions/actions.dmi' icon_state = "alien_egg" spawn_types = list( - /mob/living/simple_mob/animal/space/alien/monarch = 5, + /mob/living/simple_mob/animal/space/xenomorph/monarch = 5, ) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index 47eb371602f..678e7fb73aa 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -226,15 +226,15 @@ /obj/structure/largecrate/animal/dangerous name = "Dangerous Predator carrier" - starts_with = list(/mob/living/simple_mob/animal/space/alien/warrior) + starts_with = list(/mob/living/simple_mob/animal/space/xenomorph/warrior) /obj/structure/largecrate/animal/dangerous/Initialize(mapload) starts_with = list(pick(/mob/living/simple_mob/animal/space/carp/large, /mob/living/simple_mob/vore/aggressive/deathclaw, /mob/living/simple_mob/vore/aggressive/dino, - /mob/living/simple_mob/animal/space/alien/drone, - /mob/living/simple_mob/animal/space/alien/basic_spitter, - /mob/living/simple_mob/animal/space/alien/monarch, + /mob/living/simple_mob/animal/space/xenomorph/drone, + /mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter, + /mob/living/simple_mob/animal/space/xenomorph/monarch, /mob/living/simple_mob/vore/aggressive/corrupthound)) return ..() diff --git a/code/modules/awaymissions/loot_vr.dm b/code/modules/awaymissions/loot_vr.dm index 7b50df091c3..870815cdae8 100644 --- a/code/modules/awaymissions/loot_vr.dm +++ b/code/modules/awaymissions/loot_vr.dm @@ -288,7 +288,7 @@ new /obj/item/clothing/suit/storage/hooded/carp_costume(C) else if(prob(50)) if(live_cargo) // Something else very much alive and angry. - var/spawn_type = pick(/mob/living/simple_mob/animal/space/alien/warrior, /mob/living/simple_mob/animal/space/alien/drone, /mob/living/simple_mob/animal/space/alien/basic_spitter) + var/spawn_type = pick(/mob/living/simple_mob/animal/space/xenomorph/warrior, /mob/living/simple_mob/animal/space/xenomorph/drone, /mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter) new spawn_type(C) else // Just a costume. new /obj/item/clothing/head/xenos(C) diff --git a/code/modules/events/xenoinfestation.dm b/code/modules/events/xenoinfestation.dm index c82065c99a7..0aab2802125 100644 --- a/code/modules/events/xenoinfestation.dm +++ b/code/modules/events/xenoinfestation.dm @@ -99,15 +99,15 @@ var/obj/machinery/atmospherics/component/unary/vent_pump/V = pick(vents) switch(xeno_type) if(QUEEN) - new /mob/living/simple_mob/animal/space/alien/monarch(V.loc) + new /mob/living/simple_mob/animal/space/xenomorph/monarch(V.loc) if(PRAE) - new /mob/living/simple_mob/animal/space/alien/vanguard(V.loc) + new /mob/living/simple_mob/animal/space/xenomorph/vanguard(V.loc) if(SENTINEL) - new /mob/living/simple_mob/animal/space/alien/basic_spitter(V.loc) + new /mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter(V.loc) if(DRONE) - new /mob/living/simple_mob/animal/space/alien/drone(V.loc) + new /mob/living/simple_mob/animal/space/xenomorph/drone(V.loc) if(HUNTER) - new /mob/living/simple_mob/animal/space/alien/warrior(V.loc) + new /mob/living/simple_mob/animal/space/xenomorph/warrior(V.loc) spawn_types[xeno_type]-- /datum/event/xeno_infestation/proc/log_this() diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm b/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm deleted file mode 100644 index 4e98fa3554c..00000000000 --- a/code/modules/mob/living/simple_mob/subtypes/animal/space/alien.dm +++ /dev/null @@ -1,695 +0,0 @@ -/datum/category_item/catalogue/fauna/feral_alien - name = "Feral Xenomorph" - desc = "Xenomorphs are a widely recognized and rightfully feared scourge \ - across the Frontier. Some Xenomorph hives lose a connection to the greater \ - Hive structure, and become less coordinated, though no less dangerous. \ - Kill on sight." - value = CATALOGUER_REWARD_TRIVIAL - unlocked_by_any = list(/datum/category_item/catalogue/fauna/feral_alien) - -// Obtained by scanning all Aliens. -/datum/category_item/catalogue/fauna/all_feral_aliens - name = "Collection - Feral Xenomorphs" - desc = "You have scanned a large array of different types of Xenomorph, \ - and therefore you have been granted a large sum of points, through this \ - entry." - value = CATALOGUER_REWARD_SUPERHARD - unlocked_by_all = list( - /datum/category_item/catalogue/fauna/feral_alien/warrior, - /datum/category_item/catalogue/fauna/feral_alien/drone, - /datum/category_item/catalogue/fauna/feral_alien/spitter, - /datum/category_item/catalogue/fauna/feral_alien/monarch, - ) - -/datum/category_item/catalogue/fauna/feral_alien/warrior - name = "Feral Xenomorph - Warrior" - desc = "Warriors serve as the primary combat caste within a Hive Structure, while having fewer numbers than the endless drone hordes, they are none-the-less extremely formidable. " - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/animal/space/alien - iff_factions = MOB_IFF_FACTION_XENOMORPH - -/mob/living/simple_mob/animal/space/alien/warrior - name = "xenomorph warrior" - desc = "A feral Xenomorph that plays the part of the Hive Structures main fighter. Standing at an even larger stance than a drone, its exoskeleton is fully militarized, intended to take hits from both melee and ranged alike. Its claws can easily tear through armor and flesh, while its acid does the rest." - icon = 'icons/mob/biomorphs/warrior.dmi' - icon_state = "warrior_animations" - icon_living = "warrior_animations" - icon_dead = "warrior_dead" - icon_gib = "gibbed-a-small" - var/butcherable = FALSE - icon_rest = "warrior_sleep" - movement_cooldown = 1 - base_pixel_x = -8 - base_pixel_y = 1 - icon_scale_x = 1.1 - icon_scale_y = 1.1 - attack_sound = 'sound/mobs/biomorphs/warrior_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/warrior_move.ogg' - catalogue_data = list(/datum/category_item/catalogue/fauna/feral_alien/warrior) - ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/evasive - - - mob_class = MOB_CLASS_ABERRATION - - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" - - maxHealth = 450 - health = 450 - randomized = FALSE - - harm_intent_damage = 5 - legacy_melee_damage_lower = 35 - legacy_melee_damage_upper = 35 - base_attack_cooldown = 9 - attack_armor_pen = 15 - attack_sharp = TRUE - attack_edge = TRUE - taser_kill = 0 - - attacktext = list("slashed") - attack_sound = 'sound/weapons/bladeslice.ogg' - -/datum/category_item/catalogue/fauna/feral_alien/drone - name = "Feral Xenomorph - Drone" - desc = "The adult form of the Xenomorph, the drone's iconic \ - morphology and biological traits make it easily identifiable across \ - the Frontier. Feared for its prowess, the Drone is a sign that an even \ - larger threat is present: a Xenomorph Hive. When their connection to the \ - Hive has been disrupted, Drones exhibit less construction activity and \ - revert to a defensive Kill on sight." - value = CATALOGUER_REWARD_EASY - -/mob/living/simple_mob/animal/space/alien/drone - name = "xenomorph drone" - icon = 'icons/mob/biomorphs/drone.dmi' - desc = "A feral Xenomorphic Drone that acts as as a building block for the dedicated Hive Structure. Despite the fact it can very well defend itself and its sisters with pairs of razor sharp claws and a bladed tail along with a reinforced chitinous exoskeleton, they are commonly seen tending to the numerous halls of Resin and tending to the Queens eggs." - icon_state = "drone_animations" - icon_living = "drone_animations" - icon_dead = "drone_dead" - icon_rest = "drone_sleep" - icon_gib = "gibbed-a-small" - gib_on_butchery = "gibbed-a-small-corpse" - maxHealth = 150 - health = 150 - base_pixel_x = -8 - movement_cooldown = -0.2 - legacy_melee_damage_lower = 20 - legacy_melee_damage_upper = 20 - base_attack_cooldown = 6 - attack_sound = 'sound/mobs/biomorphs/drone_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/drone_move.ogg' - catalogue_data = list(/datum/category_item/catalogue/fauna/feral_alien/drone) - ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee - -/datum/category_item/catalogue/fauna/feral_alien/spitter - name = "Feral Xenomorph - Spitter" - desc = "Spitters serve as defensive units for the Hive. Possessing \ - a powerful neurotoxic venom, Spitters are able to spit this toxin at \ - range with alarming accuracy and control. Designed to repel assaults, \ - the Spitter serves the dual purpose of weakening aggressors so they may \ - be more easily collected to host future generations. When disconnected \ - from the Hive, Spitter behavior remains almost exactly the same. Kill \ - on sight." - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/animal/space/alien/basic_spitter - name = "xenomorph spitter" - icon = 'icons/mob/biomorphs/spitter.dmi' - desc = "The feral Spitter often uses its minorly developed acidic sacs to spray high velocity acid or neurotoxin at its victims, depending on if the Hive Structure requires new hosts. Fortunately, this Spitter seems to only be a youthful version, rather than a much more developed advanced version." - icon_state = "basic_spitter_walk" - icon_living = "basic_spitter_walk" - icon_dead = "basic_spitter_dead" - icon_rest = "basic_spitter_sleep" - icon_gib = "gibbed-a-small" - gib_on_butchery = "gibbed-a-small-corpse" - maxHealth = 200 - health = 200 - legacy_melee_damage_lower = 10 - legacy_melee_damage_upper = 10 - base_pixel_x = -8 - movement_cooldown = 3 - projectiletype = /obj/projectile/energy/neurotoxin - base_attack_cooldown = 9 - projectilesound = 'sound/effects/splat.ogg' - attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/spitter_move.ogg' - catalogue_data = list(/datum/category_item/catalogue/fauna/feral_alien/spitter) - ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting/threatening - -/mob/living/simple_mob/animal/space/alien/adv_spitter - name = "advanced xenomorph spitter" - icon = 'icons/mob/biomorphs/spitter.dmi' - desc = "It didn't take long for the Hive Structure to evolve a improved version of the basic Spitter caste to fulfill its military requirements. The advanced Spitter is terrifying to meet on the battlefield, standing at the height of the common warrior and lobbing incessant, armor, flesh and metal melting blobs of unfiltered acid at whatever the Hive deems a threat." - icon_state = "advanced_spitter_walk" - icon_living = "advanced_spitter_walk" - icon_dead = "advanced_spitter_dead" - icon_rest = "advanced_spitter_sleep" - icon_gib = "gibbed-a-small" - gib_on_butchery = "gibbed-a-small-corpse" - maxHealth = 250 - health = 250 - legacy_melee_damage_lower = 20 - legacy_melee_damage_upper = 20 - movement_cooldown = 2 - base_pixel_x = -8 - base_pixel_y = 1 - icon_scale_x = 1.1 - icon_scale_y = 1.1 - projectiletype = /obj/projectile/energy/acid - base_attack_cooldown = 12 - projectilesound = 'sound/effects/splat.ogg' - attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/spitter_move.ogg' - catalogue_data = list(/datum/category_item/catalogue/fauna/feral_alien/spitter) - ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting/threatening - -/mob/living/simple_mob/animal/space/alien/breaker - name = "xenomorph line breaker" - icon = 'icons/mob/biomorphs/breaker.dmi' - desc = "Line Breakers, as the name implies are a spearhead caste meant to charge through enemy lines so the smaller and weaker castes can follow. They are heavy armor, and thus can contend with even the most premier exosuits and have been known to shrug off even anti tank weaponry. Seeing one and living to tell the tale is a rarity." - icon_state = "breaker_animations" - icon_living = "breaker_animations" - icon_dead = "breaker_dead" - icon_rest = "breaker_sleep" - icon_gib = "gibbed-a" - gib_on_butchery = "gibbed-a-corpse" - health = 800 - maxHealth = 800 - armor_legacy_mob = list( - "melee" = 50, - "bullet" = 20, - "laser" = 20, - "energy" = 10, - "bomb" = 15, - "bio" = 100, - "rad" = 100, - ) - legacy_melee_damage_lower = 50 - legacy_melee_damage_upper = 50 - movement_cooldown = 2 - base_pixel_x = -17 - base_pixel_y = 6 - icon_scale_x = 1.3 - icon_scale_y = 1.3 - attack_sound = 'sound/mobs/biomorphs/breaker_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/breaker_walk_stomp.ogg' - melee_attack_delay = 4 - attack_armor_pen = 40 - special_attack_min_range = 3 - special_attack_max_range = 12 //Normal view range is 7 this can begin charging from outside normal view You may expand it. - special_attack_cooldown = 10 SECONDS - var/charging = 0 - var/charging_warning = 1 SECONDS - var/charge_damage_mode = DAMAGE_MODE_PIERCE | DAMAGE_MODE_SHARP ///You may want to change this - var/charge_damage_flag = ARMOR_MELEE - var/charge_damage_tier = MELEE_TIER_HEAVY - var/charge_damage = 60 - ai_holder_type = /datum/ai_holder/polaris/simple_mob/destructive //temporary until we get proper AI for xenomorphs.// - -/mob/living/simple_mob/animal/space/alien/breaker/update_icon() - if(charging) - icon_state = "'breaker_charge'-charge" - ..() - -/mob/living/simple_mob/animal/space/alien/breaker/do_special_attack(atom/A) - var/charge_warmup = 1 SECOND // How long the leap telegraphing is. - var/charge_sound = 'sound/mobs/biomorphs/breaker_charge.ogg' - set waitfor = FALSE - set_AI_busy(TRUE) - charging = 1 - movement_shake_radius = 5 - movement_sound = 'sound/mobs/biomorphs/breaker_charge.ogg' - visible_message("\The [src] prepares to charge at \the [A]!") - sleep(charging_warning) - playsound(src, charge_sound, 75, 1) - do_windup_animation(A, charge_warmup) ///This was stolen from the Hunter Spiders means you can see them prepare to charge - sleep(charge_warmup) - update_icon() - var/chargeturf = get_turf(A) - if(!chargeturf) - return - var/chargedir = get_dir(src, chargeturf) - setDir(chargedir) - var/turf/T = get_ranged_target_turf(chargeturf, chargedir, IS_DIAGONAL(chargedir) ? 1 : 2) - if(!T) - charging = 0 - movement_shake_radius = null - movement_sound = 'sound/mobs/biomorphs/breaker_walk_stomp.ogg' - update_icon() - visible_message("\The [src] desists from charging at \the [A]") - return - for(var/distance = get_dist(src.loc, T), src.loc!=T && distance>0, distance--) - var/movedir = get_dir(src.loc, T) - var/moveturf = get_step(src.loc, movedir) - SelfMove(moveturf, movedir, 2) - sleep(2 * world.tick_lag) //Speed it will move, default is two server ticks. You may want to slow it down a lot. - sleep((get_dist(src, T) * 2.2)) - charging = 0 - update_icon() - movement_shake_radius = 0 - movement_sound = 'sound/mobs/biomorphs/breaker_walk_stomp.ogg' - set_AI_busy(FALSE) - -/mob/living/simple_mob/animal/space/alien/breaker/Bump(atom/movable/AM) - if(charging) - visible_message("[src] runs [AM]!") - if(istype(AM, /mob/living)) - var/mob/living/M = AM - M.afflict_stun(20 * 5) - M.afflict_paralyze(20 * 3) - var/throwdir = pick(turn(dir, 45), turn(dir, -45)) - M.throw_at_old(get_step(src.loc, throwdir), 1, 1, src) - runOver(M) // Actually should not use this, placeholder - else if(isobj(AM)) - AM.inflict_atom_damage(charge_damage, charge_damage_tier, charge_damage_flag, charge_damage_mode, ATTACK_TYPE_UNARMED, src) - ..() - -/mob/living/simple_mob/animal/space/alien/breaker/proc/runOver(var/mob/living/M) - if(istype(M)) - visible_message("[src] runs [M] over!") - playsound(src, "sound/mobs/biomorphs/breaker_charge_hit.ogg", 50, 1) - // todo: this ignores charge_damage - var/damage = rand(3,4) - M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_HEAD) - M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_TORSO) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_LEG) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_LEG) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_ARM) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_ARM) - blood_splatter(src, M, 1) - -/mob/living/simple_mob/animal/space/alien/breaker/apply_melee_effects(atom/A) - if(isliving(A)) - var/mob/living/L = A - if(L.mob_size <= MOB_MEDIUM) - visible_message(SPAN_DANGER("\The [src] sends \the [L] flying with their heavy claws!")) - playsound(src, "sound/mobs/biomorphs/breaker_slam.ogg", 50, 1) - var/throw_dir = get_dir(src, L) - var/throw_dist = L.incapacitated(INCAPACITATION_DISABLED) ? 4 : 1 - L.throw_at_old(get_edge_target_turf(L, throw_dir), throw_dist, 1, src) - else - to_chat(L, SPAN_WARNING( "\The [src] punches you with incredible force, but you remain in place.")) - - -/datum/category_item/catalogue/fauna/feral_alien/sentinel/vanguard - name = "Feral Xenomorph - Praetorian" - desc = "The Xenomorph Vanguard is not often seen amongst \ - standard Xeno incursions. Spawned in large Hives to serve as \ - bodyguards to a Monarch, the Vanguard clade are powerful, and \ - nightmarishly effective in close combat. Spotting a Vanguard in \ - the field is often grounds to call for an immediate withdrawal and \ - orbital bombardment. On the rare occasions where Vanguard are \ - cut off from the greater Hive, they remain formidable foes and will \ - die to protect their Monarch. Kill on sight." - value = CATALOGUER_REWARD_MEDIUM - -/mob/living/simple_mob/animal/space/alien/vanguard - name = "xenomorph vanguard" - icon = 'icons/mob/biomorphs/vanguard.dmi' - desc = "The Vanguards are a fearsome sight, often spelling doom for many a person. Serving as the Queens personal body-guard, the presence of one usually means the Hives Queen is not far behind. Bristling in armor and standing at a height that would rival even the tallest of Exosuits, they're fit with razor sharp claws and often use their tails to disable or entirely pierce whatever threats the Queen. While they're not as tough as a Breaker, they can certanly deal enough damage to disuade anyone from approaching." - icon_state = "vanguard_run" - icon_living = "vanguard_run" - icon_dead = "vanguard_dead" - icon_rest = "vanguard_sleep" - icon_gib = "gibbed-a" - gib_on_butchery = "gibbed-a-corpse" - health = 600 - maxHealth = 600 - armor_legacy_mob = list( - "melee" = 20, - "bullet" = 50, - "laser" = 50, - "energy" = 45, - "bomb" = 0, - "bio" = 100, - "rad" = 100, - ) - legacy_melee_damage_lower = 40 - legacy_melee_damage_upper = 40 - attack_armor_type = DAMAGE_MODE_PIERCE | DAMAGE_MODE_SHARP - movement_cooldown = 3 - base_pixel_x = -18 - base_pixel_y = 2 - icon_scale_x = 1.2 - icon_scale_y = 1.2 - attack_sound = 'sound/mobs/biomorphs/vanguard_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/vanguard_move.ogg' - projectiletype = /obj/projectile/energy/acid - projectilesound = 'sound/effects/splat.ogg' - ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/aggressive/priest - -/datum/category_item/catalogue/fauna/feral_alien/monarch - name = "Feral Xenomorph - Monarch" - desc = "When a Drone reaches a certain level of maturity, she may \ - evolve into a Monarch, if there is no functioning Hive nearby. The Monarch \ - is erroneously considered the ultimate end point of Xenomorph evolution. \ - The Monarch is responsible for laying eggs, which will spawn more Facehuggers, \ - and therefore eventually more Xenomorphs. As such, she bears a significant \ - strategic value to the Hive, and will be defended ferociously. Monarchs are \ - imbued with substantial psionic power which lets them direct their Hive, but \ - when they are cut off from the larger Xenomorph Hivemind, they may experience \ - a form of shock which reverts them into a Drone's mindstate. Kill on sight. " - value = CATALOGUER_REWARD_HARD - -/mob/living/simple_mob/animal/space/alien/monarch - name = "xenomorph monarch" - icon = 'icons/mob/biomorphs/monarch.dmi' - desc = "The perfect organism, and the pinnacle of a Xenomorphs evolution. Monarchs are capable of leading an entire Hive filled with sometimes tens of thousands of Xenomorphs, all linked and under the control of her psychic whim. Usually closely protected by a slew of Vanguards, the Monarch herself is nonetheless capable of putting down any who threaten her. Attempting to kill her without adequate equipment is a death warrant." - icon_state = "monarch_run" - icon_living = "monarch_run" - icon_dead = "monarch_dead" - icon_rest = "monarch_sleep" - icon_gib = "gibbed-a" - gib_on_butchery = "gibbed-a-corpse" - health = 1500 - maxHealth = 1500 - armor_legacy_mob = list( - "melee" = 60, - "bullet" = 50, - "laser" = 80, - "energy" = 80, - "bomb" = 20, - "bio" = 100, - "rad" = 100, - ) - legacy_melee_damage_lower = 70 - legacy_melee_damage_upper = 50 - attack_armor_pen = 60 - movement_cooldown = 4 - base_pixel_x = -15 - base_pixel_y = 6 - icon_scale_x = 1.5 - icon_scale_y = 1.5 - attack_sound = 'sound/mobs/biomorphs/monarch_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/monarch_move.ogg' - melee_attack_delay = 4 - projectiletype = /obj/projectile/energy/acid - projectilesound = 'sound/effects/splat.ogg' - ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/aggressive/priest - special_attack_min_range = 3 - special_attack_max_range = 12 //Normal view range is 7 this can begin charging from outside normal view You may expand it. - special_attack_cooldown = 15 SECONDS - var/charging = 0 - var/charging_warning = 0 SECONDS - var/charge_damage_mode = DAMAGE_MODE_PIERCE | DAMAGE_MODE_SHARP ///You may want to change this - var/charge_damage_flag = ARMOR_MELEE - var/charge_damage_tier = MELEE_TIER_HEAVY - var/charge_damage = 80 - ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/aggressive/priest - -/mob/living/simple_mob/animal/space/alien/breaker/update_icon() - if(charging) - icon_state = "monarch_charge-charge" - ..() - -/mob/living/simple_mob/animal/space/alien/monarch/do_special_attack(atom/A) - var/charge_warmup = 0 SECOND // How long the leap telegraphing is. - var/charge_sound = 'sound/mobs/biomorphs/monarch_charge.ogg' - set waitfor = FALSE - set_AI_busy(TRUE) - charging = 1 - movement_shake_radius = 5 - movement_sound = 'sound/mobs/biomorphs/monarch_charge.ogg' - visible_message("\The [src] prepares to charge at \the [A]!") - sleep(charging_warning) - playsound(src, charge_sound, 75, 1) - do_windup_animation(A, charge_warmup) ///This was stolen from the Hunter Spiders means you can see them prepare to charge - sleep(charge_warmup) - update_icon() - var/chargeturf = get_turf(A) - if(!chargeturf) - return - var/chargedir = get_dir(src, chargeturf) - setDir(chargedir) - var/turf/T = get_ranged_target_turf(chargeturf, chargedir, IS_DIAGONAL(chargedir) ? 1 : 2) - if(!T) - charging = 0 - movement_shake_radius = null - movement_sound = 'sound/mobs/biomorphs/monarch_move.ogg' - update_icon() - visible_message("\The [src] desists from charging at \the [A]") - return - for(var/distance = get_dist(src.loc, T), src.loc!=T && distance>0, distance--) - var/movedir = get_dir(src.loc, T) - var/moveturf = get_step(src.loc, movedir) - SelfMove(moveturf, movedir, 2) - sleep(2 * world.tick_lag) //Speed it will move, default is two server ticks. You may want to slow it down a lot. - sleep((get_dist(src, T) * 2.2)) - charging = 0 - update_icon() - movement_shake_radius = 0 - movement_sound = 'sound/mobs/biomorphs/monarch_move.ogg' - set_AI_busy(FALSE) - -/mob/living/simple_mob/animal/space/alien/monarch/Bump(atom/movable/AM) - if(charging) - visible_message("[src] runs [AM]!") - if(istype(AM, /mob/living)) - var/mob/living/M = AM - M.afflict_stun(20 * 5) - M.afflict_paralyze(20 * 3) - var/throwdir = pick(turn(dir, 45), turn(dir, -45)) - M.throw_at_old(get_step(src.loc, throwdir), 1, 1, src) - runOver(M) // Actually should not use this, placeholder - else if(isobj(AM)) - AM.inflict_atom_damage(charge_damage, charge_damage_tier, charge_damage_flag, charge_damage_mode, ATTACK_TYPE_UNARMED, src) - ..() - -/mob/living/simple_mob/animal/space/alien/monarch/proc/runOver(var/mob/living/M) - if(istype(M)) - visible_message("[src] runs [M] over!") - playsound(src, "sound/mobs/biomorphs/monarch_charge.ogg", 50, 1) - // todo: this ignores charge_damage - var/damage = rand(3,4) - M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_HEAD) - M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_TORSO) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_LEG) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_LEG) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_ARM) - M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_ARM) - blood_splatter(src, M, 1) - -/mob/living/simple_mob/animal/space/alien/monarch/apply_melee_effects(atom/A) - if(isliving(A)) - var/mob/living/L = A - if(L.mob_size <= MOB_MEDIUM) - visible_message(SPAN_DANGER("\The [src] sends \the [L] flying with their heavy claws!")) - playsound(src, "sound/mobs/biomorphs/breaker_slam.ogg", 50, 1) - var/throw_dir = get_dir(src, L) - var/throw_dist = L.incapacitated(INCAPACITATION_DISABLED) ? 4 : 1 - L.throw_at_old(get_edge_target_turf(L, throw_dir), throw_dist, 1, src) - else - to_chat(L, SPAN_WARNING( "\The [src] punches you with incredible force, but you remain in place.")) - -/mob/living/simple_mob/animal/space/alien/breaker/death() - ..() - visible_message("[src] emits a high pitched roar as its massive body stills, acidic blood pouring from its remains.") - playsound(src, 'sound/mobs/biomorphs/breaker_death_hiss.ogg', 100, 1) - -/mob/living/simple_mob/animal/space/alien/monarch/death() - ..() - visible_message("[src] lets out a horrifying screech that echoes throughout your mind, it seems like it's finally over... Or is it?") - playsound(src, 'sound/mobs/biomorphs/monarch_death_hiss.ogg', 100, 1) - -/mob/living/simple_mob/animal/space/alien/death() - ..() - visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") - playsound(src, 'sound/mobs/biomorphs/xenomorph_death_hiss.ogg', 100, 1) - -/mob/living/simple_mob/animal/space/alien/special/burrower - name = "xenomorph burrower" - icon = 'icons/mob/biomorphs/burrower.dmi' - desc = "A utter abomination which appears to be some sort of mesh between a spider and a Xenomorph." - icon_state = "burrow_walk" - icon_living = "burrow_walk" - icon_dead = "burrow_dead" - icon_rest = "burrow_sleep" - maxHealth = 300 - health = 300 - legacy_melee_damage_lower = 35 - legacy_melee_damage_upper = 40 - movement_cooldown = 0 - icon_scale_x = 0.7 - icon_scale_y = 0.7 - base_pixel_x = -16 - base_pixel_y = -5 - attack_sound = 'sound/weapons/bite.ogg' - ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/tunneler - - // Tunneling is a special attack, similar to the hunter's Leap. - special_attack_min_range = 2 - special_attack_max_range = 6 - special_attack_cooldown = 10 SECONDS - - var/tunnel_warning = 0.5 SECONDS // How long the dig telegraphing is. - var/tunnel_tile_speed = 2 // How long to wait between each tile. Higher numbers result in an easier to dodge tunnel attack. - -/mob/living/simple_mob/animal/space/alien/special/burrower/should_special_attack(atom/A) - // Make sure its possible for the spider to reach the target so it doesn't try to go through a window. - var/turf/destination = get_turf(A) - var/turf/starting_turf = get_turf(src) - var/turf/T = starting_turf - for(var/i = 1 to get_dist(starting_turf, destination)) - if(T == destination) - break - - T = get_step(T, get_dir(T, destination)) - if(T.check_density(ignore_mobs = TRUE)) - return FALSE - return T == destination - - -/mob/living/simple_mob/animal/space/alien/special/burrower/do_special_attack(atom/A) - set waitfor = FALSE - set_AI_busy(TRUE) - - // Save where we're gonna go soon. - var/turf/destination = get_turf(A) - var/turf/starting_turf = get_turf(src) - - // Telegraph to give a small window to dodge if really close. - do_windup_animation(A, tunnel_warning) - sleep(tunnel_warning) // For the telegraphing. - - // Do the dig! - visible_message(SPAN_DANGER("\The [src] tunnels towards \the [A]!")) - submerge() - - if(handle_tunnel(destination) == FALSE) - set_AI_busy(FALSE) - emerge() - return FALSE - - // Did we make it? - if(!(src in destination)) - set_AI_busy(FALSE) - emerge() - return FALSE - - var/overshoot = TRUE - - // Test if something is at destination. - for(var/mob/living/L in destination) - if(L == src) - continue - - visible_message(SPAN_DANGER("\The [src] erupts from underneath, and hits \the [L]!")) - playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) - L.afflict_paralyze(20 * 3) - overshoot = FALSE - - if(!overshoot) // We hit the target, or something, at destination, so we're done. - set_AI_busy(FALSE) - emerge() - return TRUE - - // Otherwise we need to keep going. - to_chat(src, SPAN_WARNING( "You overshoot your target!")) - playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1) - var/dir_to_go = get_dir(starting_turf, destination) - for(var/i = 1 to rand(2, 4)) - destination = get_step(destination, dir_to_go) - - if(handle_tunnel(destination) == FALSE) - set_AI_busy(FALSE) - emerge() - return FALSE - - set_AI_busy(FALSE) - emerge() - return FALSE - - - -// Does the tunnel movement, stuns enemies, etc. -/mob/living/simple_mob/animal/space/alien/special/burrower/proc/handle_tunnel(turf/destination) - var/turf/T = get_turf(src) // Hold our current tile. - - // Regular tunnel loop. - for(var/i = 1 to get_dist(src, destination)) - if(stat) - return FALSE // We died or got knocked out on the way. - if(loc == destination) - break // We somehow got there early. - - // Update T. - T = get_step(src, get_dir(src, destination)) - if(T.check_density(ignore_mobs = TRUE)) - to_chat(src, SPAN_CRITICAL("You hit something really solid!")) - playsound(src, "punch", 75, 1) - afflict_paralyze(20 * 5) - add_modifier(/datum/modifier/tunneler_vulnerable, 10 SECONDS) - return FALSE // Hit a wall. - - // Stun anyone in our way. - for(var/mob/living/L in T) - playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) - L.afflict_paralyze(20 * 2) - - // Get into the tile. - forceMove(T) - - // Visuals and sound. - dig_under_floor(get_turf(src)) - playsound(src, 'sound/effects/break_stone.ogg', 75, 1) - sleep(tunnel_tile_speed) - -// For visuals. -/mob/living/simple_mob/animal/space/alien/special/burrower/proc/submerge() - alpha = 0 - dig_under_floor(get_turf(src)) - new /obj/effect/temporary_effect/tunneler_hole(get_turf(src)) - -// Ditto. -/mob/living/simple_mob/animal/space/alien/special/burrower/proc/emerge() - alpha = 255 - dig_under_floor(get_turf(src)) - new /obj/effect/temporary_effect/tunneler_hole(get_turf(src)) - -/mob/living/simple_mob/animal/space/alien/special/burrower/proc/dig_under_floor(turf/T) - new /obj/item/stack/ore/glass(T) // This will be rather weird when on station but the alternative is too much work. - -/obj/effect/temporary_effect/tunneler_hole - name = "hole" - desc = "A collapsing tunnel hole." - icon_state = "tunnel_hole" - time_to_die = 1 MINUTE - -/datum/modifier/tunneler_vulnerable - name = "Vulnerable" - desc = "You are vulnerable to more harm than usual." - on_created_text = "You feel vulnerable..." - on_expired_text = "You feel better." - stacks = MODIFIER_STACK_EXTEND - - incoming_damage_percent = 2 - evasion = -100 - -/mob/living/simple_mob/animal/space/alien/special/marksman - name = "xenomorph marksman" - icon = 'icons/mob/biomorphs/marksman.dmi' - desc = "A hulking beast which doesn't resemble any type of Xenomorph you've ever seen. It looks sloppily done, genetic strands grafted onto eachother, but it seems like it can lob acid pretty far." - icon_state = "marksman_walk" - icon_living = "marksman_walk" - icon_dead = "marksman_dead" - icon_rest = "marksman_sleep" - icon_gib = "gibbed-a" - gib_on_butchery = "gibbed-a" - maxHealth = 250 - health = 250 - legacy_melee_damage_lower = 10 - legacy_melee_damage_upper = 10 - movement_cooldown = 4 - base_pixel_x = -8 - base_pixel_y = 1 - icon_scale_x = 1.1 - icon_scale_y = 1.1 - projectiletype = /obj/projectile/energy/acid - projectilesound = 'sound/effects/splat.ogg' - attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' - movement_sound = 'sound/mobs/biomorphs/spitter_move.ogg' - catalogue_data = list(/datum/category_item/catalogue/fauna/feral_alien/spitter) - ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting/sniper diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph.dm b/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph.dm new file mode 100644 index 00000000000..7a622c6878b --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph.dm @@ -0,0 +1,407 @@ +/mob/living/simple_mob/animal/space/xenomorph + iff_factions = MOB_IFF_FACTION_XENOMORPH + mob_class = MOB_CLASS_ABERRATION + randomized = FALSE + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + taser_kill = 0 + attack_sharp = TRUE + attack_edge = TRUE + attacktext = list("slashed") + attack_sound = 'sound/weapons/bladeslice.ogg' + +/mob/living/simple_mob/animal/space/xenomorph/breaker/death() + ..() + visible_message("[src] emits a high pitched roar as its massive body stills, acidic blood pouring from its remains.") + playsound(src, 'sound/mobs/biomorphs/breaker_death_hiss.ogg', 100, 1) + +/mob/living/simple_mob/animal/space/xenomorph/monarch/death() + ..() + visible_message("[src] lets out a horrifying screech that echoes throughout your mind, it seems like it's finally over... Or is it?") + playsound(src, 'sound/mobs/biomorphs/monarch_death_hiss.ogg', 100, 1) + +/mob/living/simple_mob/animal/space/xenomorph/death() + ..() + visible_message("[src] lets out a waning guttural screech, green blood bubbling from its maw...") + playsound(src, 'sound/mobs/biomorphs/xenomorph_death_hiss.ogg', 100, 1) + + +/mob/living/simple_mob/animal/space/xenomorph/warrior + name = "xenomorph warrior" + desc = "A tall beast, dotted with reinforced chitin plates and a pair of razor sharp claws. It looks pretty pissed off." + icon = 'icons/mob/biomorphs/warrior.dmi' + icon_state = "warrior_animations" + icon_living = "warrior_animations" + icon_dead = "warrior_dead" + icon_gib = "gibbed-a-small" + icon_rest = "warrior_sleep" + maxHealth = 450 + health = 450 + legacy_melee_damage_lower = 30 + legacy_melee_damage_upper = 30 + base_attack_cooldown = 9 + attack_armor_pen = 15 + movement_cooldown = 3 + base_pixel_x = -8 + base_pixel_y = 1 + icon_scale_x = 1.1 + icon_scale_y = 1.1 + attack_sound = 'sound/mobs/biomorphs/warrior_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/warrior_move.ogg' + catalogue_data = list(/datum/category_item/catalogue/fauna/feral_xenomorph/warrior) + ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/evasive + +/mob/living/simple_mob/animal/space/xenomorph/drone + name = "xenomorph drone" + icon = 'icons/mob/biomorphs/drone.dmi' + desc = "A creature that stands a bit taller than the average person. Its body is dotted in some sort of odd chitin, moving with some sort of unknown purpose..." + icon_state = "drone_animations" + icon_living = "drone_animations" + icon_dead = "drone_dead" + icon_rest = "drone_sleep" + icon_gib = "gibbed-a-small" + gib_on_butchery = "gibbed-a-small-corpse" + maxHealth = 150 + health = 150 + base_pixel_x = -8 + movement_cooldown = 0.5 + legacy_melee_damage_lower = 20 + legacy_melee_damage_upper = 20 + base_attack_cooldown = 6 + attack_sound = 'sound/mobs/biomorphs/drone_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/drone_move.ogg' + catalogue_data = list(/datum/category_item/catalogue/fauna/feral_xenomorph/drone) + ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee + +/mob/living/simple_mob/animal/space/xenomorph/sprinter + name = "xenomorph sprinter" + icon = 'icons/mob/biomorphs/sprinter.dmi' + desc = "A small dog-like creature which never seems to stay still. Its speed is frightening, but otherwise it doesn't look like it could take too many hits." + icon_state = "sprinter_animation" + icon_living = "sprinter_animation" + icon_dead = "sprinter_dead" + icon_rest = "sprinter_rest" + maxHealth = 130 + health = 130 + base_pixel_x = -15 + movement_cooldown = 0 + legacy_melee_damage_lower = 15 + legacy_melee_damage_upper = 15 + base_attack_cooldown = 4 + attack_sound = 'sound/mobs/biomorphs/drone_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/drone_move.ogg' + ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/hunter_spider + special_attack_min_range = 2 + special_attack_max_range = 5 + special_attack_cooldown = 10 SECONDS + var/leap_warmup = 0.5 SECOND // How long the leap telegraphing is. + + +/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter + name = "xenomorph spitter" + icon = 'icons/mob/biomorphs/spitter.dmi' + desc = "A lithe and unarmored creature, its crest and chest cavity seems to be filled with a bubbling substance." + icon_state = "basic_spitter_walk" + icon_living = "basic_spitter_walk" + icon_dead = "basic_spitter_dead" + icon_rest = "basic_spitter_sleep" + icon_gib = "gibbed-a-small" + gib_on_butchery = "gibbed-a-small-corpse" + maxHealth = 200 + health = 200 + legacy_melee_damage_lower = 10 + legacy_melee_damage_upper = 10 + base_pixel_x = -8 + movement_cooldown = 3 + projectiletype = /obj/projectile/energy/neurotoxin + base_attack_cooldown = 9 + projectilesound = 'sound/effects/splat.ogg' + attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/spitter_move.ogg' + catalogue_data = list(/datum/category_item/catalogue/fauna/feral_xenomorph/spitter) + ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting + +/mob/living/simple_mob/animal/space/xenomorph/acid_spitter + name = "advanced xenomorph spitter" + icon = 'icons/mob/biomorphs/spitter.dmi' + desc = "A large beast, standing well above the average person. Its body is overflowing with a sizzling substance, a large amount dripping from its mouth. Doesn't help that it's covered in armor, too." + icon_state = "advanced_spitter_walk" + icon_living = "advanced_spitter_walk" + icon_dead = "advanced_spitter_dead" + icon_rest = "advanced_spitter_sleep" + icon_gib = "gibbed-a-small" + gib_on_butchery = "gibbed-a-small-corpse" + maxHealth = 250 + health = 250 + legacy_melee_damage_lower = 20 + legacy_melee_damage_upper = 20 + movement_cooldown = 2 + base_pixel_x = -8 + base_pixel_y = 1 + icon_scale_x = 1.1 + icon_scale_y = 1.1 + projectiletype = /obj/projectile/energy/acid + base_attack_cooldown = 12 + projectilesound = 'sound/effects/splat.ogg' + attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/spitter_move.ogg' + catalogue_data = list(/datum/category_item/catalogue/fauna/feral_xenomorph/spitter) + ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting + +/mob/living/simple_mob/animal/space/xenomorph/breaker + name = "xenomorph line breaker" + icon = 'icons/mob/biomorphs/breaker.dmi' + desc = "Whatever this is, it resembles more of a truck than any kind of beat you've ever seen. Its crest is large and armored, and its four legs could easily crush anything in its way. Better stay away..." + icon_living = "breaker_animations" + icon_state = "breaker_animations" + icon_dead = "breaker_dead" + icon_rest = "breaker_sleep" + icon_gib = "gibbed-a" + gib_on_butchery = "gibbed-a-corpse" + health = 800 + maxHealth = 800 + armor_legacy_mob = list( + "melee" = 50, + "bullet" = 20, + "laser" = 30, + "energy" = 30, + "bomb" = 15, + "bio" = 100, + "rad" = 100, + ) + legacy_melee_damage_lower = 50 + legacy_melee_damage_upper = 50 + movement_cooldown = 2 + base_pixel_x = -17 + base_pixel_y = 6 + icon_scale_x = 1.3 + icon_scale_y = 1.3 + attack_sound = 'sound/mobs/biomorphs/breaker_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/breaker_walk_stomp.ogg' + melee_attack_delay = 4 + attack_armor_pen = 40 + special_attack_min_range = 1 + special_attack_max_range = 12 //Normal view range is 7 this can begin charging from outside normal view You may expand it. + special_attack_cooldown = 10 SECONDS + var/charging = 0 + var/charging_warning = 1 SECONDS + var/charge_damage_mode = DAMAGE_MODE_PIERCE | DAMAGE_MODE_SHARP ///You may want to change this + var/charge_damage_flag = ARMOR_MELEE + var/charge_damage_tier = MELEE_TIER_HEAVY + var/charge_damage = 60 + ai_holder_type = /datum/ai_holder/polaris/simple_mob/destructive //temporary until we get proper AI for xenomorphs.// + +/mob/living/simple_mob/animal/space/xenomorph/berserker + name = "xenomorph berserker" + icon = 'icons/mob/biomorphs/berserker.dmi' + desc = "A hulking red beast with scythes the size of a person. Its hide looks tough and burn proof, it also seems EXCEPTIONALLY pissed off at you." + icon_state = "berserker_run" + icon_living = "berserker_run" + icon_dead = "berserker_dead" + icon_rest = "berserker_rest" + health = 600 + maxHealth = 600 + armor_legacy_mob = list( + "melee" = 40, + "bullet" = 50, + "laser" = 30, + "energy" = 20, + "bomb" = 0, + "bio" = 100, + "rad" = 100, + ) + legacy_melee_damage_lower = 40 + legacy_melee_damage_upper = 40 + attack_armor_type = DAMAGE_MODE_PIERCE | DAMAGE_MODE_SHARP + attack_armor_pen = 30 + movement_cooldown = 2 + base_pixel_x = -16 + base_pixel_y = 2 + icon_scale_x = 1.2 + icon_scale_y = 1.2 + attack_sound = 'sound/mobs/biomorphs/warrior_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/breaker_walk_stomp.ogg' + ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/evasive + +/mob/living/simple_mob/animal/space/xenomorph/vanguard + name = "xenomorph vanguard" + icon = 'icons/mob/biomorphs/vanguard.dmi' + desc = "The Vanguards are a fearsome sight, often spelling doom for many a person. Serving as the Queens personal body-guard, the presence of one usually means the Hives Queen is not far behind. Bristling in armor and standing at a height that would rival even the tallest of Exosuits, they're fit with razor sharp claws and often use their tails to disable or entirely pierce whatever threats the Queen. While they're not as tough as a Breaker, they can certanly deal enough damage to disuade anyone from approaching." + icon_state = "vanguard_run" + icon_living = "vanguard_run" + icon_dead = "vanguard_dead" + icon_rest = "vanguard_sleep" + icon_gib = "gibbed-a" + gib_on_butchery = "gibbed-a-corpse" + health = 600 + maxHealth = 600 + armor_legacy_mob = list( + "melee" = 20, + "bullet" = 50, + "laser" = 50, + "energy" = 45, + "bomb" = 0, + "bio" = 100, + "rad" = 100, + ) + legacy_melee_damage_lower = 30 + legacy_melee_damage_upper = 30 + attack_armor_type = DAMAGE_MODE_PIERCE | DAMAGE_MODE_SHARP + movement_cooldown = 3 + base_pixel_x = -18 + base_pixel_y = 2 + icon_scale_x = 1.2 + icon_scale_y = 1.2 + attack_sound = 'sound/mobs/biomorphs/vanguard_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/vanguard_move.ogg' + projectiletype = /obj/projectile/energy/acid + projectilesound = 'sound/effects/splat.ogg' + catalogue_data = list(/datum/category_item/catalogue/fauna/feral_xenomorph/vanguard) + ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/aggressive/priest + +/mob/living/simple_mob/animal/space/xenomorph/monarch + name = "xenomorph monarch" + icon = 'icons/mob/biomorphs/monarch.dmi' + desc = "The perfect organism, and the pinnacle of a Xenomorphs evolution. Monarchs are capable of leading an entire Hive filled with sometimes tens of thousands of Xenomorphs, all linked and under the control of her psychic whim. Usually closely protected by a slew of Vanguards, the Monarch herself is nonetheless capable of putting down any who threaten her. Attempting to kill her without adequate equipment is a death warrant." + icon_state = "monarch_run" + icon_living = "monarch_run" + icon_dead = "monarch_dead" + icon_rest = "monarch_sleep" + icon_gib = "gibbed-a" + gib_on_butchery = "gibbed-a-corpse" + health = 1500 + maxHealth = 1500 + armor_legacy_mob = list( + "melee" = 60, + "bullet" = 50, + "laser" = 80, + "energy" = 80, + "bomb" = 20, + "bio" = 100, + "rad" = 100, + ) + legacy_melee_damage_lower = 70 + legacy_melee_damage_upper = 50 + attack_armor_pen = 60 + movement_cooldown = 4 + base_pixel_x = -15 + base_pixel_y = 6 + icon_scale_x = 1.5 + icon_scale_y = 1.5 + attack_sound = 'sound/mobs/biomorphs/monarch_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/monarch_move.ogg' + melee_attack_delay = 4 + projectiletype = /obj/projectile/energy/acid + projectilesound = 'sound/effects/splat.ogg' + ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/aggressive/priest + special_attack_min_range = 1 + special_attack_max_range = 12 //Normal view range is 7 this can begin charging from outside normal view You may expand it. + special_attack_cooldown = 15 SECONDS + var/charging = 0 + var/charging_warning = 0 SECONDS + var/charge_damage_mode = DAMAGE_MODE_PIERCE | DAMAGE_MODE_SHARP ///You may want to change this + var/charge_damage_flag = ARMOR_MELEE + var/charge_damage_tier = MELEE_TIER_HEAVY + var/charge_damage = 80 + ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/aggressive/priest + +/mob/living/simple_mob/animal/space/xenomorph/special/burrower + name = "xenomorph burrower" + icon = 'icons/mob/biomorphs/burrower.dmi' + desc = "A utter abomination which appears to be some sort of mesh between a spider and a Xenomorph." + icon_state = "burrow_walk" + icon_living = "burrow_walk" + icon_dead = "burrow_dead" + icon_rest = "burrow_sleep" + maxHealth = 300 + health = 300 + legacy_melee_damage_lower = 35 + legacy_melee_damage_upper = 40 + movement_cooldown = 0 + icon_scale_x = 0.7 + icon_scale_y = 0.7 + base_pixel_x = -16 + base_pixel_y = -5 + attack_sound = 'sound/weapons/bite.ogg' + ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee/tunneler + special_attack_min_range = 2 + special_attack_max_range = 6 + special_attack_cooldown = 10 SECONDS + var/tunnel_warning = 0.5 SECONDS // How long the dig telegraphing is. + var/tunnel_tile_speed = 2 // How long to wait between each tile. Higher numbers result in an easier to dodge tunnel attack. + +/mob/living/simple_mob/animal/space/xenomorph/special/marksman + name = "xenomorph marksman" + icon = 'icons/mob/biomorphs/marksman.dmi' + desc = "A hulking beast which doesn't resemble any type of Xenomorph you've ever seen. It looks sloppily done, genetic strands grafted onto eachother, but it seems like it can lob acid pretty far." + icon_state = "marksman_walk" + icon_living = "marksman_walk" + icon_dead = "marksman_dead" + icon_rest = "marksman_sleep" + icon_gib = "gibbed-a" + gib_on_butchery = "gibbed-a" + maxHealth = 250 + health = 250 + legacy_melee_damage_lower = 10 + legacy_melee_damage_upper = 10 + movement_cooldown = 4 + base_pixel_x = -8 + base_pixel_y = 1 + icon_scale_x = 1.1 + icon_scale_y = 1.1 + projectiletype = /obj/projectile/energy/acid + projectilesound = 'sound/effects/splat.ogg' + attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/spitter_move.ogg' + catalogue_data = list(/datum/category_item/catalogue/fauna/feral_xenomorph/spitter) + ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting/sniper + +/mob/living/simple_mob/animal/space/xenomorph/special/burster + name = "xenomorph burster" + icon = 'icons/mob/biomorphs/burster.dmi' + desc = "A peculiar floating amalgamation of different chitin, acid and flesh. It looks like it could burst at any moment! Better stay away." + icon_state = "burster_run" + icon_living = "burster_run" + icon_dead = "burster_dead" + icon_rest = "burster_rest" + maxHealth = 200 + health = 200 + legacy_melee_damage_lower = 15 + legacy_melee_damage_upper = 15 + movement_cooldown = 3 + base_pixel_x = -16 + attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' + ai_holder_type = /datum/ai_holder/polaris/simple_mob/melee + var/exploded = FALSE + var/explosion_dev_range = 1 + var/explosion_heavy_range = 2 + var/explosion_light_range = 4 + var/explosion_flash_range = 6 + var/explosion_delay_lower = 1 SECOND + var/explosion_delay_upper = 2 SECONDS + +/mob/living/simple_mob/animal/space/xenomorph/special/inferno + name = "xenomorph inferno" + icon = 'icons/mob/biomorphs/inferno.dmi' + desc = "It's hard to believe this... Thing is real. Its body squirms and writhes with a dedicated purpose, blue flame bursting from every orfice on its body, giving it an intimidating glow." + icon_state = "inferno_run" + icon_living = "inferno_run" + icon_dead = "inferno_dead" + icon_rest = "inferno_stun" + maxHealth = 300 + health = 300 + legacy_melee_damage_lower = 20 + legacy_melee_damage_upper = 20 + movement_cooldown = 3 + base_pixel_x = -16 + base_pixel_y = -3 + icon_scale_x = 0.9 + icon_scale_y = 0.9 + projectiletype = /obj/projectile/potent_fire + base_attack_cooldown = 10 + projectilesound = 'sound/items/Welder.ogg' + attack_sound = 'sound/mobs/biomorphs/spitter_attack.ogg' + movement_sound = 'sound/mobs/biomorphs/spitter_move.ogg' + ai_holder_type = /datum/ai_holder/polaris/simple_mob/ranged/kiting + diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_abilities.dm b/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_abilities.dm new file mode 100644 index 00000000000..c0a083a3e38 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_abilities.dm @@ -0,0 +1,413 @@ + +// Breaker Charge + +/mob/living/simple_mob/animal/space/xenomorph/breaker/do_special_attack(atom/A) + var/charge_warmup = 1 SECOND // How long the leap telegraphing is. + var/charge_sound = 'sound/mobs/biomorphs/breaker_charge.ogg' + set waitfor = FALSE + set_AI_busy(TRUE) + charging = 1 + movement_shake_radius = 5 + movement_sound = 'sound/mobs/biomorphs/breaker_charge.ogg' + visible_message("\The [src] prepares to charge at \the [A]!") + sleep(charging_warning) + playsound(src, charge_sound, 75, 1) + do_windup_animation(A, charge_warmup) ///This was stolen from the Hunter Spiders means you can see them prepare to charge + sleep(charge_warmup) + update_icon() + var/chargeturf = get_turf(A) + if(!chargeturf) + return + var/chargedir = get_dir(src, chargeturf) + setDir(chargedir) + var/turf/T = get_ranged_target_turf(chargeturf, chargedir, IS_DIAGONAL(chargedir) ? 1 : 2) + if(!T) + charging = 0 + movement_shake_radius = null + movement_sound = 'sound/mobs/biomorphs/breaker_walk_stomp.ogg' + update_icon() + visible_message("\The [src] desists from charging at \the [A]") + return + for(var/distance = get_dist(src.loc, T), src.loc!=T && distance>0, distance--) + var/movedir = get_dir(src.loc, T) + var/moveturf = get_step(src.loc, movedir) + SelfMove(moveturf, movedir, 2) + sleep(2 * world.tick_lag) //Speed it will move, default is two server ticks. You may want to slow it down a lot. + sleep((get_dist(src, T) * 2.2)) + charging = 0 + update_icon() + movement_shake_radius = 0 + movement_sound = 'sound/mobs/biomorphs/breaker_walk_stomp.ogg' + set_AI_busy(FALSE) + +/mob/living/simple_mob/animal/space/xenomorph/breaker/Bump(atom/movable/AM) + if(charging) + visible_message("[src] runs [AM]!") + if(istype(AM, /mob/living)) + var/mob/living/M = AM + M.afflict_stun(20 * 5) + M.afflict_paralyze(20 * 3) + var/throwdir = pick(turn(dir, 45), turn(dir, -45)) + M.throw_at_old(get_step(src.loc, throwdir), 1, 1, src) + runOver(M) // Actually should not use this, placeholder + else if(isobj(AM)) + AM.inflict_atom_damage(charge_damage, charge_damage_tier, charge_damage_flag, charge_damage_mode, ATTACK_TYPE_UNARMED, src) + ..() + +/mob/living/simple_mob/animal/space/xenomorph/breaker/proc/runOver(var/mob/living/M) + if(istype(M)) + visible_message("[src] runs [M] over!") + playsound(src, "sound/mobs/biomorphs/breaker_charge_hit.ogg", 50, 1) + // todo: this ignores charge_damage + var/damage = rand(3,4) + M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_HEAD) + M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_TORSO) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_LEG) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_LEG) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_ARM) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_ARM) + blood_splatter(src, M, 1) + +/mob/living/simple_mob/animal/space/xenomorph/breaker/apply_melee_effects(atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.mob_size <= MOB_MEDIUM) + visible_message(SPAN_DANGER("\The [src] sends \the [L] flying with their heavy claws!")) + playsound(src, "sound/mobs/biomorphs/breaker_slam.ogg", 50, 1) + var/throw_dir = get_dir(src, L) + var/throw_dist = L.incapacitated(INCAPACITATION_DISABLED) ? 4 : 1 + L.throw_at_old(get_edge_target_turf(L, throw_dir), throw_dist, 1, src) + else + to_chat(L, SPAN_WARNING( "\The [src] punches you with incredible force, but you remain in place.")) + +// Monarch Charge + +/mob/living/simple_mob/animal/space/xenomorph/monarch/update_icon() + if(charging) + icon_state = "monarch_charge-charge" + ..() + +/mob/living/simple_mob/animal/space/xenomorph/monarch/do_special_attack(atom/A) + var/charge_warmup = 0 SECOND // How long the leap telegraphing is. + var/charge_sound = 'sound/mobs/biomorphs/monarch_charge.ogg' + set waitfor = FALSE + set_AI_busy(TRUE) + charging = 1 + movement_shake_radius = 5 + movement_sound = 'sound/mobs/biomorphs/monarch_charge.ogg' + visible_message("\The [src] prepares to charge at \the [A]!") + sleep(charging_warning) + playsound(src, charge_sound, 75, 1) + do_windup_animation(A, charge_warmup) ///This was stolen from the Hunter Spiders means you can see them prepare to charge + sleep(charge_warmup) + update_icon() + var/chargeturf = get_turf(A) + if(!chargeturf) + return + var/chargedir = get_dir(src, chargeturf) + setDir(chargedir) + var/turf/T = get_ranged_target_turf(chargeturf, chargedir, IS_DIAGONAL(chargedir) ? 1 : 2) + if(!T) + charging = 0 + movement_shake_radius = null + movement_sound = 'sound/mobs/biomorphs/monarch_move.ogg' + update_icon() + visible_message("\The [src] desists from charging at \the [A]") + return + for(var/distance = get_dist(src.loc, T), src.loc!=T && distance>0, distance--) + var/movedir = get_dir(src.loc, T) + var/moveturf = get_step(src.loc, movedir) + SelfMove(moveturf, movedir, 2) + sleep(2 * world.tick_lag) //Speed it will move, default is two server ticks. You may want to slow it down a lot. + sleep((get_dist(src, T) * 2.2)) + charging = 0 + update_icon() + movement_shake_radius = 0 + movement_sound = 'sound/mobs/biomorphs/monarch_move.ogg' + set_AI_busy(FALSE) + +/mob/living/simple_mob/animal/space/xenomorph/monarch/Bump(atom/movable/AM) + if(charging) + visible_message("[src] runs [AM]!") + if(istype(AM, /mob/living)) + var/mob/living/M = AM + M.afflict_stun(20 * 5) + M.afflict_paralyze(20 * 3) + var/throwdir = pick(turn(dir, 45), turn(dir, -45)) + M.throw_at_old(get_step(src.loc, throwdir), 1, 1, src) + runOver(M) // Actually should not use this, placeholder + else if(isobj(AM)) + AM.inflict_atom_damage(charge_damage, charge_damage_tier, charge_damage_flag, charge_damage_mode, ATTACK_TYPE_UNARMED, src) + ..() + +/mob/living/simple_mob/animal/space/xenomorph/monarch/proc/runOver(var/mob/living/M) + if(istype(M)) + visible_message("[src] runs [M] over!") + playsound(src, "sound/mobs/biomorphs/monarch_charge.ogg", 50, 1) + // todo: this ignores charge_damage + var/damage = rand(3,4) + M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_HEAD) + M.apply_damage(2 * damage, DAMAGE_TYPE_BRUTE, BP_TORSO) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_LEG) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_LEG) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_L_ARM) + M.apply_damage(0.5 * damage, DAMAGE_TYPE_BRUTE, BP_R_ARM) + blood_splatter(src, M, 1) + +/mob/living/simple_mob/animal/space/xenomorph/monarch/apply_melee_effects(atom/A) + if(isliving(A)) + var/mob/living/L = A + if(L.mob_size <= MOB_MEDIUM) + visible_message(SPAN_DANGER("\The [src] sends \the [L] flying with their heavy claws!")) + playsound(src, "sound/mobs/biomorphs/breaker_slam.ogg", 50, 1) + var/throw_dir = get_dir(src, L) + var/throw_dist = L.incapacitated(INCAPACITATION_DISABLED) ? 4 : 1 + L.throw_at_old(get_edge_target_turf(L, throw_dir), throw_dist, 1, src) + else + to_chat(L, SPAN_WARNING( "\The [src] punches you with incredible force, but you remain in place.")) + +/mob/living/simple_mob/animal/space/xenomorph/special/burrower/should_special_attack(atom/A) + // Make sure its possible for the spider to reach the target so it doesn't try to go through a window. + var/turf/destination = get_turf(A) + var/turf/starting_turf = get_turf(src) + var/turf/T = starting_turf + for(var/i = 1 to get_dist(starting_turf, destination)) + if(T == destination) + break + + T = get_step(T, get_dir(T, destination)) + if(T.check_density(ignore_mobs = TRUE)) + return FALSE + return T == destination + +// Burrower Tunneling + +/mob/living/simple_mob/animal/space/xenomorph/special/burrower/do_special_attack(atom/A) + set waitfor = FALSE + set_AI_busy(TRUE) + + // Save where we're gonna go soon. + var/turf/destination = get_turf(A) + var/turf/starting_turf = get_turf(src) + + // Telegraph to give a small window to dodge if really close. + do_windup_animation(A, tunnel_warning) + sleep(tunnel_warning) // For the telegraphing. + + // Do the dig! + visible_message(SPAN_DANGER("\The [src] tunnels towards \the [A]!")) + submerge() + + if(handle_tunnel(destination) == FALSE) + set_AI_busy(FALSE) + emerge() + return FALSE + + // Did we make it? + if(!(src in destination)) + set_AI_busy(FALSE) + emerge() + return FALSE + + var/overshoot = TRUE + + // Test if something is at destination. + for(var/mob/living/L in destination) + if(L == src) + continue + + visible_message(SPAN_DANGER("\The [src] erupts from underneath, and hits \the [L]!")) + playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) + L.afflict_paralyze(20 * 3) + overshoot = FALSE + + if(!overshoot) // We hit the target, or something, at destination, so we're done. + set_AI_busy(FALSE) + emerge() + return TRUE + + // Otherwise we need to keep going. + to_chat(src, SPAN_WARNING( "You overshoot your target!")) + playsound(src, 'sound/weapons/punchmiss.ogg', 75, 1) + var/dir_to_go = get_dir(starting_turf, destination) + for(var/i = 1 to rand(2, 4)) + destination = get_step(destination, dir_to_go) + + if(handle_tunnel(destination) == FALSE) + set_AI_busy(FALSE) + emerge() + return FALSE + + set_AI_busy(FALSE) + emerge() + return FALSE + + + +// Does the tunnel movement, stuns enemies, etc. +/mob/living/simple_mob/animal/space/xenomorph/special/burrower/proc/handle_tunnel(turf/destination) + var/turf/T = get_turf(src) // Hold our current tile. + + // Regular tunnel loop. + for(var/i = 1 to get_dist(src, destination)) + if(stat) + return FALSE // We died or got knocked out on the way. + if(loc == destination) + break // We somehow got there early. + + // Update T. + T = get_step(src, get_dir(src, destination)) + if(T.check_density(ignore_mobs = TRUE)) + to_chat(src, SPAN_CRITICAL("You hit something really solid!")) + playsound(src, "punch", 75, 1) + afflict_paralyze(20 * 5) + add_modifier(/datum/modifier/tunneler_vulnerable, 10 SECONDS) + return FALSE // Hit a wall. + + // Stun anyone in our way. + for(var/mob/living/L in T) + playsound(L, 'sound/weapons/heavysmash.ogg', 75, 1) + L.afflict_paralyze(20 * 2) + + // Get into the tile. + forceMove(T) + + // Visuals and sound. + dig_under_floor(get_turf(src)) + playsound(src, 'sound/effects/break_stone.ogg', 75, 1) + sleep(tunnel_tile_speed) + +// For visuals. +/mob/living/simple_mob/animal/space/xenomorph/special/burrower/proc/submerge() + alpha = 0 + dig_under_floor(get_turf(src)) + new /obj/effect/temporary_effect/tunneler_hole(get_turf(src)) + +// Ditto. +/mob/living/simple_mob/animal/space/xenomorph/special/burrower/proc/emerge() + alpha = 255 + dig_under_floor(get_turf(src)) + new /obj/effect/temporary_effect/tunneler_hole(get_turf(src)) + +/mob/living/simple_mob/animal/space/xenomorph/special/burrower/proc/dig_under_floor(turf/T) + new /obj/item/stack/ore/glass(T) // This will be rather weird when on station but the alternative is too much work. + +/obj/effect/temporary_effect/tunneler_hole + name = "hole" + desc = "A collapsing tunnel hole." + icon_state = "tunnel_hole" + time_to_die = 1 MINUTE + +/datum/modifier/tunneler_vulnerable + name = "Vulnerable" + desc = "You are vulnerable to more harm than usual." + on_created_text = "You feel vulnerable..." + on_expired_text = "You feel better." + stacks = MODIFIER_STACK_EXTEND + + incoming_damage_percent = 2 + evasion = -100 + +// Sprinter Leap + +// Multiplies damage if the victim is stunned in some form, including a successful leap. +/mob/living/simple_mob/animal/space/xenomorph/sprinter/apply_bonus_melee_damage(atom/A, damage_amount) + if(isliving(A)) + var/mob/living/L = A + if(L.incapacitated(INCAPACITATION_DISABLED)) + return damage_amount * 1.5 + return ..() + + +// The actual leaping attack. +/mob/living/simple_mob/animal/space/xenomorph/sprinter/do_special_attack(atom/A) + set waitfor = FALSE + set_AI_busy(TRUE) + + // Telegraph, since getting stunned suddenly feels bad. + do_windup_animation(A, leap_warmup) + sleep(leap_warmup) // For the telegraphing. + + // Do the actual leap. + status_flags |= STATUS_LEAPING // Lets us pass over everything. + visible_message(SPAN_DANGER("\The [src] leaps at \the [A]!")) + throw_at_old(get_step(get_turf(A), get_turf(src)), special_attack_max_range+1, 1, src) + + sleep(5) // For the throw to complete. It won't hold up the AI SSticker due to waitfor being false. + + if(status_flags & STATUS_LEAPING) + status_flags &= ~STATUS_LEAPING // Revert special passage ability. + + var/turf/T = get_turf(src) // Where we landed. This might be different than A's turf. + + . = FALSE + + // Now for the stun. + var/mob/living/victim = null + for(var/mob/living/L in T) // So player-controlled spiders only need to click the tile to stun them. + if(L == src) + continue + + var/list/shieldcall_result = L.atom_shieldcall(40, DAMAGE_TYPE_BRUTE, MELEE_TIER_MEDIUM, ARMOR_MELEE, NONE, ATTACK_TYPE_MELEE) + if(shieldcall_result[SHIELDCALL_ARG_FLAGS] & SHIELDCALL_FLAGS_BLOCK_ATTACK) + continue + + victim = L + break + + if(victim) + victim.afflict_paralyze(20 * 2) + victim.visible_message(SPAN_DANGER("\The [src] knocks down \the [victim]!")) + to_chat(victim, SPAN_CRITICAL("\The [src] jumps on you!")) + . = TRUE + + set_AI_busy(FALSE) + + +// Berserker Rage +/mob/living/simple_mob/animal/space/xenomorph/berserker/handle_special() + if((get_polaris_AI_stance() in list(STANCE_APPROACH, STANCE_FIGHT)) && !is_AI_busy() && isturf(loc)) + if(health <= (maxHealth * 0.5)) // At half health, and fighting someone currently. + berserk() + +/mob/living/simple_mob/animal/space/xenomorph/berserker/verb/berserk() + set name = "Berserk" + set desc = "Enrage and become vastly stronger for a period of time, however you will be weaker afterwards." + set category = "Abilities" + + add_modifier(/datum/modifier/berserk, 30 SECONDS) + +// Burster Explosion + +/mob/living/simple_mob/animal/space/xenomorph/special/burster/proc/baneling() + visible_message(SPAN_CRITICAL("\The [src]'s body begins to rupture!")) + var/delay = rand(explosion_delay_lower, explosion_delay_upper) + spawn(0) + // Flash black and red as a warning. + for(var/i = 1 to delay) + if(i % 2 == 0) + color = "#04310c" + else + color = "#31cc1d" + sleep(1) + + spawn(delay) + // The actual boom. + if(src && !exploded) + visible_message(SPAN_DANGER("\The [src]'s body detonates!")) + exploded = TRUE + explosion(src.loc, explosion_dev_range, explosion_heavy_range, explosion_light_range, explosion_flash_range) + +/mob/living/simple_mob/animal/space/xenomorph/special/burster/death() + baneling() + + +// Inferno's Fire Projectile +/obj/projectile/potent_fire + name = "ember" + icon = 'icons/effects/effects.dmi' + icon_state = "explosion_particle" + modifier_type_to_apply = /datum/modifier/fire + modifier_duration = 8 SECONDS // About 15 damage per stack, as Life() ticks every two seconds. + damage_force = 0 + nodamage = TRUE diff --git a/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_catalogue.dm b/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_catalogue.dm new file mode 100644 index 00000000000..14f675ae997 --- /dev/null +++ b/code/modules/mob/living/simple_mob/subtypes/animal/xenomorph/xenomorph_catalogue.dm @@ -0,0 +1,74 @@ +/datum/category_item/catalogue/fauna/feral_xenomorph + name = "Feral Xenomorph" + desc = "Xenomorphs are a widely recognized and rightfully feared scourge \ + across the Frontier. Some Xenomorph hives lose a connection to the greater \ + Hive structure, and become less coordinated, though no less dangerous. \ + Kill on sight." + value = CATALOGUER_REWARD_TRIVIAL + unlocked_by_any = list(/datum/category_item/catalogue/fauna/feral_xenomorph) + +// Obtained by scanning all Xenomorphs. +/datum/category_item/catalogue/fauna/all_feral_xenomorphs + name = "Collection - Feral Xenomorphs" + desc = "You have scanned a large array of different types of Xenomorph, \ + and therefore you have been granted a large sum of points, through this \ + entry." + value = CATALOGUER_REWARD_SUPERHARD + unlocked_by_all = list( + /datum/category_item/catalogue/fauna/feral_xenomorph/warrior, + /datum/category_item/catalogue/fauna/feral_xenomorph/drone, + /datum/category_item/catalogue/fauna/feral_xenomorph/spitter, + /datum/category_item/catalogue/fauna/feral_xenomorph/vanguard, + /datum/category_item/catalogue/fauna/feral_xenomorph/monarch, + ) + +/datum/category_item/catalogue/fauna/feral_xenomorph/warrior + name = "Feral Xenomorph - Warrior" + desc = "Warriors serve as the primary combat caste within a Hive Structure, while having fewer numbers than the endless drone hordes, they are none-the-less extremely formidable. " + value = CATALOGUER_REWARD_MEDIUM + +/datum/category_item/catalogue/fauna/feral_xenomorph/drone + name = "Feral Xenomorph - Drone" + desc = "The adult form of the Xenomorph, the drone's iconic \ + morphology and biological traits make it easily identifiable across \ + the Frontier. Feared for its prowess, the Drone is a sign that an even \ + larger threat is present: a Xenomorph Hive. When their connection to the \ + Hive has been disrupted, Drones exhibit less construction activity and \ + revert to a defensive Kill on sight." + value = CATALOGUER_REWARD_EASY + +/datum/category_item/catalogue/fauna/feral_xenomorph/spitter + name = "Feral Xenomorph - Spitter" + desc = "Spitters serve as defensive units for the Hive. Possessing \ + a powerful neurotoxic venom, Spitters are able to spit this toxin at \ + range with alarming accuracy and control. Designed to repel assaults, \ + the Spitter serves the dual purpose of weakening aggressors so they may \ + be more easily collected to host future generations. When disconnected \ + from the Hive, Spitter behavior remains almost exactly the same. Kill \ + on sight." + value = CATALOGUER_REWARD_MEDIUM + +/datum/category_item/catalogue/fauna/feral_xenomorph/vanguard + name = "Feral Xenomorph - Vanguard" + desc = "The Xenomorph Vanguard is not often seen amongst \ + standard Xeno incursions. Spawned in large Hives to serve as \ + bodyguards to a Monarch, the Vanguard clade are powerful, and \ + nightmarishly effective in close combat. Spotting a Vanguard in \ + the field is often grounds to call for an immediate withdrawal and \ + orbital bombardment. On the rare occasions where Vanguard are \ + cut off from the greater Hive, they remain formidable foes and will \ + die to protect their Monarch. Kill on sight." + value = CATALOGUER_REWARD_MEDIUM + +/datum/category_item/catalogue/fauna/feral_xenomorph/monarch + name = "Feral Xenomorph - Monarch" + desc = "When a Drone reaches a certain level of maturity, she may \ + evolve into a Monarch, if there is no functioning Hive nearby. The Monarch \ + is erroneously considered the ultimate end point of Xenomorph evolution. \ + The Monarch is responsible for laying eggs, which will spawn more Facehuggers, \ + and therefore eventually more Xenomorphs. As such, she bears a significant \ + strategic value to the Hive, and will be defended ferociously. Monarchs are \ + imbued with substantial psionic power which lets them direct their Hive, but \ + when they are cut off from the larger Xenomorph Hivemind, they may experience \ + a form of shock which reverts them into a Drone's mindstate. Kill on sight. " + value = CATALOGUER_REWARD_SUPERHARD diff --git a/code/modules/rogueminer_vr/asteroid.dm b/code/modules/rogueminer_vr/asteroid.dm index 98aa4a9779f..650f06274db 100644 --- a/code/modules/rogueminer_vr/asteroid.dm +++ b/code/modules/rogueminer_vr/asteroid.dm @@ -118,7 +118,7 @@ /datum/rogue/asteroid/predef/cargo/angry/New() ..() spot_add(2,2,/obj/random/roguemineloot) //EXTRA loot! - spot_add(2,2,/mob/living/simple_mob/animal/space/alien/basic_spitter) //GRRR + spot_add(2,2,/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter) //GRRR //Longer cargo container for higher difficulties /datum/rogue/asteroid/predef/cargo_large @@ -152,4 +152,4 @@ spot_add(4,3,/obj/random/roguemineloot) //Right loot if(prob(30)) - spot_add(3,3,/mob/living/simple_mob/animal/space/alien/warrior) //And maybe a big friend for big loot. + spot_add(3,3,/mob/living/simple_mob/animal/space/xenomorph/warrior) //And maybe a big friend for big loot. diff --git a/code/modules/xenoarcheaology/artifacts/autocloner.dm b/code/modules/xenoarcheaology/artifacts/autocloner.dm index 0d205b34086..84ecedef2dc 100644 --- a/code/modules/xenoarcheaology/artifacts/autocloner.dm +++ b/code/modules/xenoarcheaology/artifacts/autocloner.dm @@ -22,7 +22,7 @@ if(prob(33)) spawn_type = pick( /mob/living/simple_mob/animal/giant_spider/nurse, - /mob/living/simple_mob/animal/space/alien, + /mob/living/simple_mob/animal/space/xenomorph, /mob/living/simple_mob/animal/space/bear, /mob/living/simple_mob/creature, /mob/living/simple_mob/slime/xenobio, diff --git a/icons/mob/biomorphs/berserker.dmi b/icons/mob/biomorphs/berserker.dmi new file mode 100644 index 0000000000000000000000000000000000000000..166a476380ccb61676fdda7e9e54e60b612f3651 GIT binary patch literal 6192 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 EH?Q@>_y7O^ literal 0 HcmV?d00001 diff --git a/icons/mob/biomorphs/burster.dmi b/icons/mob/biomorphs/burster.dmi new file mode 100644 index 0000000000000000000000000000000000000000..0a7824a0535c4bda6bb1377927dafa713a6ca8fd GIT binary patch literal 3745 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 A2><{9 literal 0 HcmV?d00001 diff --git a/icons/mob/biomorphs/inferno.dmi b/icons/mob/biomorphs/inferno.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d457ed30f18d22e417ca2600afbce38ed469f5f9 GIT binary patch literal 10199 zcmY+Kc_38L+xYK{8T(F%7)!ELMiD8@P@>Her7TgAElaW`X0et%g%S-(w4z86cSL9< z6d^N~vYQ#p%y4J?{n^Xp3n2#d&Ak$UP@e58~^~R!wv^e z004|2_+dqb1pg#4JS_wVcjsenc7kK>#do)<^i!%XuB2%r8>elC=346eZT$&yO6o!| z32`w%Q{PxtR>k=a)mgN*eYB2@j9H_pn*T}f zZp(+J11*A~VNoX>T>^*HaOZ(X3V12*%o! z;nAIj-@f#?)}A!}ZbF^d(R0k;BM|xJ*qgm3CrtWHj%b!l$$<>8wR2+X%6vq z`bI`JuSL()i51&npYFY~ydpvVbbFH**NaRP0#pH4X>-RZDgbB#hY#Ag#g#02OI(<& ze(^f_YhlTo(!;S!_xr!``K8K-MG?Yk7>@w6pZ85dHRR*95JA?(e;?j*+&BAQ#g>Mm z3Z&)!Qn|e;!|g~*bC;h_gpiifp`~ph>{3Y4LKeT{^UPPcbk*~@unE?Zj>tsrXZaiV zkXsyGh97KDK2qe1&dWThtn_38 zk1wP*J^pmK*gZs4vw5v}s?h{h?AS260rS^AbKRBIU@g~r7^`10Kc6@0<(k~jaoIjV z>2}KU9;{30w0^R*wNZ4&h0x!01_hhCRmfUEZLvRk8y_KA%k0*m3T=_f+sMJcKE3;aie z4PW~BeaYV5!iJTdVs8lG;n6PX`db^3>+-OVR}!7J0VsRlAPIR+cqKJ_7NPGc4^ghk zW_T2E&%;iCrg(}k&3nXM%AT9k#=?sa5}qiPL10-dbERlxR{ZzXgu5N52%8v#`C<;_E?~`)|WggIy#(F7`2PoY}9_$&`e%OIH^{(PRN;Ta* z$L2Orpjc+GeTZkAJow9rqbv^m^7$x3dnD@Bi)WLA=*zoF4xd`xSzEA@gc#LT?=<|> z87NGdkVzu9-tNhHF*;HStnDra?1IL4N+vN4+$p>%=nsXkFY`2o)@ezzPtVE!a)+*p z?QLZ$04Hm6gT%Ag`!5Gi9A>#;Pvbc)M)1?jL~aAet>Zj@<@(#G+sxP!!uEv#WQ6$b z#UA=dQl)|4OshmrIBDi_(VYU{O}#OFSNZ*0>-$gm@0@uve$(j$;vmAH$gafCNgY?! z0LddUllZ|xzt6;4P-4Atly_=~;y6Td!G@Sf6TTN`kqUtRme6P|zykLNLO8{6WP$BT zQgU*l;Yz%&m+g|4F<$uH6^W_bRKSg10ViuJ1}4K_$vY6uq_8wal@;j4@j{jC>>)dO z^vC02_CcgcfAfn;(g#1c#XYk{FkfP%u)lb>Nu9K7RfN){p<8F9iVdZb_y=HGQsSJU zR}q6fJ$qDb30#p|hu({3+1v5^_ivTyuFbeshYN7_a*lb4F)UMIJm3Pf%56^R!E;zP1^}K0Vwp%7hw)46g zfKHc|kBiS^U-|eixcft?@L>b&wVP#xuPP^iFT|GMQ%Rk>i~(;gz%9oWM>m`D6uH`i znrz6fL+qkD5KPA1E1&Ug<R~=Owbd0PUMs^s`fYtkrN+Y+xaAiT8qBc{J zeG)J;`(#L-tgzbFE~EO6YBUx?I7)Z`q{M6;?@AEq85tA7YjvGRym0vT*2=EzWU&r_ zVTi?5n)9BoN^GDyg?^Ny9{3!Qz}EU4hJNgZxZAvjYaT7gi2H5~Z4}mAF3#?Ly5?yb7SSy}_{G!+GJt=Z9qNiTQsLRrag%C# z!Fv~dsV*LJ+pJZ@mZ68d2awcG4yM%^#2_X+l0*gDW#Q2(Y97gQcn>(qAi{KF(5Sn(un z55T{7-?SHr3s%;$34PJ5I(A|4mPixF5&<}#W<(6~gzh;?1IC%_gXeXldpv1AZ|dT& zew@+xMR|P*vne?qI(Z%}Zop`{k;!Qqp5@YWWo93w9X(HjGy>k|0={^-+>HQC! zOi!sS?+zaH&UzbFU7nd8BiH-sq)nwm-;cmST?ReTCxeV*_HSOw;_AQ^$f~E?e9qR& z)yhD3Y~~|@8>n|!acBIAsa&Vvh`L4SsRXQQhgk19rLvgPpXxy~uTXq{4Q0pqn0W=S zlFEDHu%UilFA7Z^+$;1vD@U>R*N@390}b#zREO6h-TnAjFOt{IZ=IzD$+O3N*r@IM z3LUDwtF>A)Z0K@%*OH#ja(`m0ov)M4M=%$=K9K%e9J4WRE?4iBqKw0*XIjn(jPx zL&bgMm!zFv?EmG+YhFZW$-qpbo}HhO3-UcZu&0OC)ivXzW7{bQ#)?WgbeU&=KJRW` z!q2WT`eq{wOl$J36|}Ll)1PX_*R_Nb5Rk;A>zMP;Rd(JUk`;%_zxexvBjWH2x8HJe9KX;8MbcRUk;M;uRxCcYG^nVf_ zDs{<-kv~uGp{HMxrB(T1i_(^T6JATOB#e&4#^jas4DLmwO}mK_Gs)3g2s#TgSxr?3 z05_SxPNzE@iXTZOlAf2I^V~RMkzkJL^8>$F1hTkmCerBUBA1Wr?(!#kb2U_=S->g)fev^N^TVryc ztb5L*-MKUI(f(c0yDcZ}M7&(g9aq$qt$b{TuDoCwq`oX1;Br*< zPh7`^kP3Y0f{_QdJg(;$ZU?4zhB@GO=dwd`&S1!s&w}}-O!xSf9CA0kUQbjkyLc%Q z9*@+vf2(@hjZhqCWa-jI9_-Z_7&~?durDvp6;rz*_cCZZV=q%8%&^%FXc1-gu1%ZR zL_zGmV1(yAi|^u-k>jR=^`BUrZ%wtcfj04S|FxJuZq*0Y76{5~Uu4%_kR;J@VX-HO?^z6(T zWM7q@VgxVtT2avN(Tj$xrjd^0^MRw%4YI@o3r<7lYGhQma*T19{jkFazrB9EiL6}q zz3GnrxzU>eM(`!sz{uQ;3h(KR-q;Zo*b`2koaR1Cz#~)mXz#!6ksdvqM=y;<>T7to zid&vF1#?EOa(l@QmT31YMR1pjJz0IZTXrg@M4UJD zeWy@j%${`|lKT&3iZUeDSU1%Ox8WW>!xzSV92={2oQ<_)?lfEZ~2 zcj!srvlDU~VbCk_JmGUI-zMD+jbDdq!;BSv|EzPVpaEWQ6ZN{zezZA^NZ`#M;<@zh z1=x)Tmo7;Lj4_x2*RN=9Q8l^&s_p#RYumbBRAxBUD!1SWXUCq9aiYFY6O~zKtUebj zpp@!nA%=GaO6eo0&5J#TW!apmB+T?vH_ZUGYZm6J3Hi3ov8#@1+{L#e`9}^7hGZC& zJ;vOy@*5RCWr=*C)w$$FRurO_GN(6@b8mZhkJen#J8VPD3SIca894yt~xDz@RtqZvq1?pf|OCZlfkJjy9-$e=^jH=vsA3{$!V`a=YjPKY!zSqARFR{;yt5fj=bED5gddFL^#h3R)Wr zI7$fTOuF|_Sj~li5AcMBRvBl7t2O;5PoMqO%6HR9O~;__105Py#g(3xopi@92F+#m%~h-Num=qM3roRuk|_=pbK$IpD< zq_L8mbKChaOyw6XUA^&emiN--TyrYRAX{Z<^`;buKzhnGaf zo@b|lxB(;O34OS?@{;`H&85m15wBtvCVO8dr3ZF8l|m6lZlgn2_HETId;a=toThx< zcEGa!lG{V!Cu`I{FkGagm`j}Hl}`SzUF&;@lw5LE2pxK!Hv>mvUu>UX1)OkZxrkNw zfO$k0!Ih!yC9i#TNLBq;2%h~1@USXStkRYb%Frn_%3Y%M$ApVG1weGGm z65#t0cNd4S%#@?c*69XSd`aNuJw#aQeet=L}<0Q-8-6DdiM2FD76nBi! zPFJ`}v9N=`X#F(#Lnc;+9+?!(3k@@U!P=NTou)(4lB62t3Dy;LSrcD*kkXss697IM ztXwmVU*jUZH+FtXWpn9L@2B8Mg_d{fpidW@8?S`}C9$SLN7&pzyt_Y`Pbrg>L+lJ$ zpmp<7lqOm8&btb(&9ps+H{CdsO{uxS!L`VOpdw*6jt__0ybfMxGKFSZP8?l8A$B$NCZHu4oymYMF9s=3vV2-KK%bHimxU~nDYO%{eK@=8 zoIs55ft_zb%_5vY!xn%~3Z+H`^m+b)Cc|dDVsno!Htx6j3ae#4&1RyzXyN zYJ%0ciOro~>;f*m#_Qtn%5yj}HF00O@deH-(!gSSy2n ze!nGL75z6j!sWa>bSCB!MqEL>Lvah7Z%bw}ehq*)f!RwTg9SPrp zPPO>q8^FQI^PSn;I_|9dA!aK`?fWu}5hvegbNAG4l1ZiD$y}sfX;k0g|1MU6`pxm{ z9bsb*0SM`Gq-eU&R_fauFJpwx|Go&zJz!6r-p{&9pT8J%C|oIGZ|KQb1u&MBjt(#W zzv-D5SRYDf&kVHC_Mt3Vkg+)~hvSK_H7=XOp*)-sdiox6Dr~QhO-SYSg)^f2to{nJ zGrSid^tiav)=VOhd4n9h*-#dDyT$F=$C|>GSA6#T*w+&xVM-CkkAc$WpFDDn(u&^F zmCf(4@3+BzFG)T7)b8qdnU08wP}shN7Ucx*!q2t-)O&9(CYpLBQGHIO=*s%&(G~mW z&UhWnuK0(tDWs(*`#uIPm2gecN@E~AWYJw4mI%zR`)|a{Bq0cu?08rOB=K`qwpAkN7e8bP zE$eGjjr;#nG|!M|A0y4HMlGQ4`VRUp^!VpnV$QF(GC`K6VuK;{0bW}O+7As;!PZzd zH=53n1~E!yPmn;|+u#BcIO^y=^KJ6;)@|LbYb@oc#Us!KnD`R9I)$S54(F>o&=t+* zddv1&tg>GcX3lt~ASOnBLK6Di^L(c>brddgh7iW&CCOnXStbjAk8p6)cu8QA#rjY7 z1(>SC0JMdSH4LPwWBru$1$Jj77Eye3ik^YaE<#_}OGik09ToKgo)n80b(a zpVpCngMQ%cji_CKHs)o!Tsa9Emzg}cBl#ptIYrz!8sByYLuHAqE>{ZN(!3sUV6c!5 z?GKBax|NWelB@aW<@H+&k3ET`8vR9NNGJcr&X0vcSMfI8;2);m%%UA+A|BXDD}otk z(xH)4%J94vn>Lo%{Z5uL-Fpisr;m$#vErSj7=J+`-D?6h zSyxdTq_JH@3MxkU1JYj)>W3tT1ykiCaCo&zR^w+nlqj)dk3b1R8&;tT+iB>)iEW*U z^fS4Xnu|2_&_(dm5JsRtckF&-AX;9rcJl=#DhpDIS0q^C`0pW!+ev8Cc$xP#!X-~x z%>tvyQm#&ADJu#&H-Xqd0-IYOE5qi>5|C`J3-BhlRznuY%__Mh~4X=dXAoRttav*+|iww=6P^^D)kq?AlaZOmtweUOE z1d7a-EQ-uFqc&R6fASCvvt|PhFGdW9u~3KDVGJ%(0hNV-emsICb~FFkDANeRxYj!H zlBb(RK@tWwF+Te`*_#24^OAC25a(KFcuBteVMrng3ZS9$RQGalpJxSN5^_3;lDje( z(kst-H>?bz{wF2yjVn-==W9|%TQMXt#J|GSJILnNmUo@%Cc5U*Z8G2{1WDaPF=nSvK%DSNd} z@RF<+s!T>VL-td>hho}j_Q-0C!7>KoB6a$l(kS>^?geH*I}J0$`@;UO^HfGnk3hVZ zo5~=Gf_z`-)g(q4$FF0GbXI-%*O9zl&*pXwqfO&HIJ^ssGOCt4as0Obj+aOxAU_bQ z6z;iBK^fo)+?#2C#Td}7U9BU$6z)15Qt)p5&0{CxgfuYx@J?FpZ9zQo)Rb+;;px2t zHFe!D%Dku1mg$VKI!_v!;FOD+=OsOZ+fT5bdI22Cq3e{I-E6MN2ubT3j3~`J&gR~w z$u`{rc%=jVf<-4TsMHHvc5{(uko7l7UI{ulaP1%SufJe(HC4|qd_!tX@{-=c?Z;U< zy0Efg^bgNW3MFmuOZ%u#o*LhQ!%JZb^j&jzOJ|}Ab-y5vpbxOQGXDJk@dN+s5u*BT zeV1eDl_*Y@b6m>$`O?~)L|h8^TmYPO{<+&@mpCnb4VK zf9iKt9~6tIyb8+}?Leud3VkHvn=t;TFUyFFIDdIq)4OssQ0&;E`{AjYyVq8yQ?=Qd z%SXJ*Y8_I!N63+fKj#HcS3dr5vO`A(LT&YX44}YD&R3k==^Y|GqmHL7(NU!L$Cc(I zlAdQ@r&8v15nB(1AKr-v@nV`+8|dp++E{T8@A%|P&3V3nE41MVYP~OYFK&&K2!@E! zk!2eKbBN==E*}x#N|x;x*RrP|>|7Mlb`LmKhd3x`&(%J`;e}Qd(V=O!O0>Z-;-lTb zkqsZOGUv~ryVz-O002=LdfUN6Vl<(&XP&tfieSPgYO-!g0`TSV3~`=tUd9n}v5Gzo zm&Nr_K>EIOQ1C6Xmv9}SL+XK(aU9#&S`-d^gFPn>;vc4Kc#rSG%s7Y@C=zaRaYL8y zbqxK{V8sdHFc-oC6!noIYiICwr)L>u-NPCoGYkX>+@hs;?Gs^0W% z+0-tR01iq0mX89PE1J+G3{u2z7&!w|P1-p8He@uafUv=l*sQWiaAlDlwS!rv4h+a! zKY#%RjT&%p_sgzcL*Ot{;6FLWToFWZl#tg!C32kFQQqS4Z%#e6*52p%uicfDP<$>3AiVQ{b zn31#b_s=5?C_0PskJ>*22TcS%C6^g{lDU0d>XWQZ@5@eJ&Vp0mE*vPm$@OizMu}nB zy*oeH+Ckq0r z4M*t8&!^0nDj;g`e#|Z$|Ia)F`fz58d7cTIYlPgs=$_J@%e-JbkPk^j&Nd2zBq6#T zo0}oPd4W+PpfH&fZ~)ib-@gS20fz(m0=j+O-n>k0{z0HnmU1ah=K8%{u@DBdE_sd* zNw{4ChyDJ=a(R^YO-eC0Q;4I8fs5uGoUz6=mnPu60K7ek6mSeDNxlfVPq1QPAP9+b zaNSyno=yox0j29Ceiei)UCdauMSKj0SHO&IG;CRKTiJ-n^*i7o7Z#ye*BO0G4gcBKQ`aRbNwHdw`b<^ z&iaN!XdTD`CMnnprg@(7m%c_jCI@qHY7-*uG^d3gq^~*D2GfBq{G(|1FrUNpLmZq6 zzm5LSr?>v(ec>YIL2z>jHeZtOsPSH*`VX7Cqa>J`Ol9dYt9<^B_47Ity{%qj-U~3k zb~_G(_Z};ixRXv64DKYW8`D7Y?_yRMmt&u`32g3;yPNd?Y%Q%yRQMMp=yH?Sy#*8x z)Nwl*C+@gP#dOm27y{ZxjgWBuel$qJ=<73X1+Z{~;v?kA5a7AUs87WIW$=2L-(g+L z7^~lA@e$kk{r#a8B8|(Ws6*7ieL4}QQdki|o0M5rD1s=O0(JWNfHf-LLLw^!%3G;Z)xlfNH_ zl%Y?aoAY}#g&l7jDFz0X`LI>yDVFtkhI<5n(MWr|TdF3@lHH^a++(BekLCTPq|bYc zl5=H&T5t<2?k?qz*n0BNEO2QO9~Tb=1zE#m9xJ>Rl`ix7wemq!QQbiUA@c1RY=n)< ze+W{>aKr0f%7iu%s)&fMZ;zrjb=rOb``JkY@%F&oL=*mjo9=x`f(F=f#;4Vh0kebE zim@l{gw0LT0@n`N;%H>8l^k_8D)(K!*({}FvXQi@Nv8a#JuFaoF1gqRF;ntr z0sCa4k*LhL3^Xz@TdwLp=W7ABvzvdXdu}19?IrJO?+7F#Cks@p;#Sr-8?HUQqWNMn zj~tmu$>o2)UXW1XZ~mz`=#Plu9&G^A2aHCh#*qiro+z9L5AqI(4C~P>YYy$Z^apR; zbXh?tbE$_^*XJrnmb~&+_-!Ja(XRI!%XJCUjoGRF;uhP8^)8mW{iI6%kF0NnjmsF7 z^*yV4s}UH5NgXPb;RVo2zFq)UUYnpEIs9#g*sMKp1L}Jb@!?n&;Eh)`^Pub47{^|xT0YC z*ZpH66F)n;ZZZ_f0i!9GH*=Z>h@R`YRW1j1{&YSSKere5J9CM3w`UE-8$4KbvjTV% zAtu5Tl~&XpozI`CE#Sif2b`hg6wlT3f>%__k-%10Rf4Q}USdU%w}qYiig&HURC~N%Z;?+hL)3NyRz@W zjXrlM(o1h<{-U1xB8lk=4!rcUH4+Y%3!PDUU4Moj`iGL;+5N=>1i?W&g4!HIb)UPf z>R&ZZYmpuRCOvE4`PhCJCVII}2*080wiLzsOUe8~DU^RU4{8Agl$9L_O`MY%P#(Dl zlZaSAhlgvMP4TW>^u2FhOXW|=CrKw<;qF8qyZWJVIb1KPDZxJf7I_0ir9Cm|rRP|S zlk}JKfLyhFLlyrLn7aN790F6?&eOTGSBtKe6zf1e9I&&k3#uf zR2r(O$q)VgR08|DP=-eD?Ar81ruv$ z`wN3`YvaGx#65TZrooJ(b*o1^4u-34*7|hvfOLd`IYB7SP`03xsj2LjTmgJ5>BCS*<2%hTu6PTLtf>>j_)%MzZ&h-_UL? z!0)^pd&pxeRV?|3sEzJexKus%fa@lr^T8v>kF}%F1*gAvYef>wIcCQo3V+QujdbPQ zu;8I|m#>&py^h$?wt6qkzYPmSc>_Z?Sk0HtQ(f#76qJB!2;+@f&JgRayjowJ`?$lY zA+K<#W{QH9+~9tew{UlXtr29EUA+yK~itByvou4HS`E4~kIj89cunpR9m6*m?gKWX|m zwxG6ev*&tIevEs`JFxxyGdy>N;xmq!IjnxVG;xyuM@RGCokwp+c1&**#wp8HKOWay z%C@9$1jnAUM9-<`{qf0rClJ56h<#468f~c);?eMY?pjY*R~LWBxnrUxuM)1gOyH-Z zS1lchwJG0_fIoFf*%BCWz6`gR2Ut1n>_OSrWwd(g@D4t^c2b4@ZWjv0`~@o{Y=_ww z*16u|bQzjTzTid^!7!f~+KfZBj{{Ah@1qrm4J)=fzi1-#VGyWb5TpAQpXv3OX zj~M{%&5Y*B9qUFK3Axr?!MWcF2F~9**s1rHrTF)UQ!5e>EG%c<0ZgB}P(f#m7i*aW z##>5yP}VjTKLGiExwdIX*==!B|#}y{G#ScZL4)0INJ)%*BS8uD6;U%>q`3EZ7 zCdz5CQck~o(zYK1p1IjcuJq0x%(nhUe6sB#b)!8dy~{`nbq}xpYb+gY^?idR!|lN^ zzyD6ajjfeYXezgxr9?H)veRu@Dy*{X~&TbSH#5hFa9f&AymwI5RFM1P5Wj+ z_vICAMYp^!VB*p}R@R}$oi?#T^MuZ{WohJGxc9ql+FM{BdamT|+n@aF*zRJCpR|R= zG@)XBF#kA{Lh4O#GWiZNL?>1zSpioDhwe_a&8Tl9@88i;Iq$b3SIxw?`+qsy5vWLzP2Af2a!9j|Wg*6&dr!J#OVsddh}@ z6yXkxmeZs_p;n1JUW({xK803G$JrjcB)ZUFFHQ!p-^vQxf<(I6Fau9L^L%P#k?6S_6)^}bN|?eP*>;;E_fG#~xU`qyp4}@2f`=KiJ4K$UX3pfAAwe zUjP7J@G_&1J61*D#%Qk{>$J!nf#&rJ#UD55@s~0l@m{%;_5L^7@AGbb(vTASw)CJ* zQ~j7-;`b9v^~-V(D#PVMPFY$HDx7}5SJ9*O@mW3W)w0C?)R%r7P#x#|-iweX@Xr*=;H!Kt3vM=GYE160SXXj_W(RI7RRmV#Bm zT9i>*!Ygq7ySzXy2GAoWpcbvJE)D=drc8_sY~cl4g}m-%=NjYLxUOe?U1?!5aZV!> zs9eQ2UU@~6trcodg?|gL^zHvo{AJ3CyAKLCE@)2J{UGzTHZ!_k z>>IJxfBvGp33M-*)b9Qk^i&;<&)*5 zKD!z7o2D!6l)SvN_1j?s2k1{)@0LhQOc1Uhtj zgHtK4#@MD^@+$m$p(C;TFs1t(N;L}EIkylA$5(lk3HO%=UNfO3)}q?BUEdrI}!n z7%=Y!%nBN-R`ozM&DM-Y52PpOoAsZr|JDi~!9El~KR-Bw7mC2+uJe!Sy{ETwt+@z+ z*;fKY7L*b$_9|smOug%+j4jxi`o}$@v2QLIGzmNZE;u^KS%)qZrp z*}+s--8WQ)uplVHOnbW8V$gscOd9BuX-dtphi-S23rXg)5j`(-u*i)V1b^63KYdEw zv)?Oigf@6s%ZggMVBu)XHrvzp&ZMCr;FH}-_*&~{Ig#!?&N_z_-u$)~?>k6rIORLK zU*+4rbvd%Nx%2CU>Ps*+yWQ4yHyd;NiE{xrJC#o}Frp(Hy!AbM+m~pBs_m1vpSI@l|NsWxt6GxK8wq54wqG~^#R@nSz&@!&fO9~nnVeH6sy zn%Otr%kisXlJ^!oRSHyY61j$ZmdrkbR8%{=J)Q@k%+fhK)le@v&F#nLsmdDlfp<-S z(YH|z`k-+9A^bdk>Lpm3|7@ZeU*?B$(88hhGRoe;2Hn8u1Nv)AvPTy!R#~3(E>dhw z>6?@L8vBDYS&~|(&iXTVo|-dy|Iwe~UZa_mpfJw6W=f`fNjA)^~fH)t|#XPy=EcIQFjJpLGLI$TEqNy}MG3G3NN?iqy+Mb;I+HC?8oN%v+AYZW61) zlG42dgP%+HCYkvgXff0cK&-qzE2cS_T0fp1Amm-QmaHM)6OGIOk>Z*PwG9XPdkWSt ze`sed@xJ$#Q5t5BR;@4CFqJmtO1Vne`(|MWog52bg`eGAS`SgneSHmj0JejkxqT)thPtlC{YzwQXa zvRist6T<)W{9Xi0uJp-72dUU$N{ieTZ-;HG+v8)d&6)d$O|U$=KC1Ga$Yh)5%w6VL z0IX)=%HPhNjca;d9k-)+K$EbklkE035r!1X(dNx7Q#E(_@#4R>&P~$C7Ag6gk9|Y4 zx1U9}_ys=8;~RCzoqoI^I}{@C_W>E1d_-UOJ&Ve3?rx&IR5o2|o+$nhj^bLphXd-^ zeme+Mc|)cIh6>Df1jT-!`vsnPiPoUhg`JnR3%^Cb`+qU^y6ujrHM*4Mm!na0km87J zrqzz_n!O;LWp2dJ{?ZT(0qv?h1CM{T+v$j;4u%)rc(KS}u}K{F45#5EsGZji2C_xG0ZyNpI~ zs)XD5+X@3e4ECOrj7dxmcWisW}Jsy@d??Hvg94vnF?<7Vc}Q^X421>q!^TVbcV zdlRM%Ts({~_i5%c#=q99IBzeM(pF&S&^h{OEE1ncI(nq#>fV;#p7R9cyzvw(qzda9 z1$kfc<1lm+^W8_OIv4XV=`p0y-}^>gH;E9cD=q5G1_x&PzBT!aYIS(j1;I0^L4iBM zk{8huHSGxlS}s%Al@=OyluAGstMWg4S^MM{L6100r3VaUO#9*WE;~-fwTWY{+8ZoQ zJR-oG$<+g1N7O^NgIXM}R{5WF<*r4-)jqpByGQ&ql_(@;`(pLJvEkB0TQf*S)a3Qo z7e_caIG-~o-xEDA>~f%N{L|fe)V|F-or&RJpkReJmrRR7+nipx`Wf(Ug)1swKRwK3 z(+NjYp0X|6+|7Q<-1DQgpb@{7n9;>Q2)9DaaA+2dhN-9r!KR1eTOoTVzE}!d1Je^C zR$I~y1rKR73eua211*_d459MV6r<4hYl)1Ya-Te2(!$7wDfY5V4k1IPOLlKx!b&_C zn1jOA$}PQ*WPtRNXCZYq^Q{kgB-7Qc{ajp|zB@VSGdMFX$%*&>F|$On8;EvI_-5wQFJq$JKQzO+x3%*$k6FFmR}hY$>DSKlZ`3eanSscF>L&P<3QB69laroTEDQM5&H3tDr79~mtDbG&3olwazrE4jDuSJUA5@qiG(zd(&Ea{MQTT|v5G?~NT3P%MA zGF5ie2|VI`%#TLialOZ!1`Tl~7uD&WVK-(~R)*p2O~SH?n`3-PskMzG5v*GW5FFDB zViB$6XrD?b%k@K974w;G^Q%C{9-%W&jkOb;YtUkxi-&}+s^|RIFDU*^2V0W`RXeTO zYuJoxgrX`NW>PXi4xYHb4O|=-IkPxeFF=XooPQ$%=kPfmagv8@{u)LU4pm6*xZiH~ z5bhXHZ*1c(o$^dy0>wGu$}-Igf2V-CtP_U{a#R|3vVO36UYb)BVbuX& zfO6jO5EaRkZXoy7{`iCj?@H)BJw9 zW;3rF51tm9mke_6WOxWFkM|Os-yu!gzcG3;s;#XJF98z5wM|Nn60K6Qd3%D`qcTkD zf-Qwuac7NpGQ2qJBPxX+et6}2#ar<@N78#Cn1a-J)b%%fyU3Dfsrd`9VEbqCrH2Oo zgZZA3T6XutPr&Y3vd;CI77x%Fhu4)nG^p>7VL8b`RHmAXT-+n4QFX=n8&DC}-IrX_ zmJ(fGu+M>M=51@O6O8gg(^c9?AEDUMXjbKg(K_L4NOZQ) zT?tgz$Wy#7OS8kIiWB+YJ-y1R)@V>_IDr$Jo9G0V#ZKPd zkufP4N4UI-Pp0>d=mvKa618lOPhvg8qD5ZfhD=%pTyumtfdYa*VsK~3G*d~qPV5zO z`vA?0)72|BYcQt%;RViej&q~YKfbFmbK=jx=I>W>+_ao<6mR4`iAG|EleY5@u!qeX zkwLsgo&c^~u22!LnX95?S~zu8%dZ~U?HDkT=o{zgV`Y7D{%h4&C_WNyej%+bQ7F1t z@R>R!H-fKfvbZ027r59AWV|I-F{JavWj!U?7uzO~t~rPk6P^(~IydB7A36xQEdStX znxXigDq%B{VD=*LEi0HS-NAonT{FKTa8(3TkqQwepbNe`~^LquQ;c8d69CTTs!XYr! z>qKL9D=0i4z*J2`T{|Ve%h{^4un=2KB5g@|chiqz-~5l%~nz!TnXq;g)}@lkVKYoU7X0!sP0@ zR!iiY6}8BQ(+AiSEa&_5fB0I^5T`;^j~vh9zh#)yXugQ6_wuC~Y-;?OW53I)sdQFq zUr3xyod$!0diLiR7^QSR=M^MTu`JF&%JF$?kcP^QC&@^J$){y|e=j<10%p zwh@arbr;9HsQV+f7Sa>1fil;OGT1eNxqzKN`%V=li_og(T$46Ib0b#jPh<`B^jr1rm)GhuKh81D{ zH>nK*1Dxg0)TJ+s0k5p^L`; z@KfEgwCp(lUQ(G=Q~hstp|(~n&}I=&Mj%w;)sUV4pxVxi@q?@hJ2n5E6L0f}`=lw0 z(!1nT98N~P3+q?8# zz*zfVag47AKv{^?ebR;dIwwPRDUKmbeVB4B{Rf0Zii|gGi;jK9!oojy0~eB3kk+a4 z)sVlfaF=!tlv`g2q(!p)gBymjtAvif=lCGpR2E*bG~FnSb3!1va&C9g;K_{)_ym+9 z5oDI1;C9vVJdC}cw!k!SsDrl|~9Jzd>+urF)3&8uJ+vudz2PYSHZnLRcz9YQAoh#(oLY7lY4?q4FtoPFN znUNnw8U75=VdxlPm-JS-Wy-#F8jb%86mV+m9~228n30w`?LqN5N1{E{jYO9g9Y9t? z4r$2{7j?P~q4}hw4u=LT&Ky;TC8eTIh99i~WcE1eN<=bSNJuG66cM&zPM0mXWHmPD z?85!6v9~9al!M1lx)xrt>e(d+%G%+VF2Y0FbL@8aV|U37BIkmbF=^*B2etjm6J6EP z&=2VY5?hz8a`EFQTc;FkUj=;~>I3UE8{xTinuq#4Uzr|=x3-8DMNSz07^HzG?jpMz zudw5T=%c4{#T7pXd{l#n+)$>R)Rh4VUhWmqkwj>xj&nl@Pr}1^aWkuN#~bDzy+j&( z+;1RZqHWkqREGgZx~fLhfsI*FeYF^Io#u+11vf4TWOS#`7~q`%v)f$e!FB7AREE^p zAeKIOBjw`uhRJLGe+*Bj*}KCSY+ykD`@@~8Y^YzjAbv?h%DZHVqUmn+3B8xmEVX}NrCD^a zz|Ae^Iwz#s#Y2Lp*w%b+ zltX87Cymu)Pe^|z*ZdD(`Q$5;I-p+#SB#iqm&p1TD-#Brp+yZ1jBsaF@Tqm5Y*)f? zKll^pfy~Bm@h@F^x4iwRYlOJgtCA+!qG1O+GEnqJhgn3BBl&zkryn8#QU+1l4a=LmW6X}Q2`Q6fw&&u^%en{f@dJ*<(F6R=c`Z*UZ(XL? zurL0RA;uM*3HAY-on;q!86C6n*~+8@ZeYhhj&|`5(eK!Q;H+{mwOe;$Xz{w3$I=zV zx3uZo?`u*~!hjaN2^(mAL*#b!%UinMm|Q_6b86WAK>H^D!UsP;BaHuuliMj+GUlY{j!rcef3;8D}_^WAy?EFXT$ou4fZKGDb)J$tnVHX!ZE1&}LY#q342 z+PcEb-a3jY<$U3g2`qlru99i2)5a~@%*f@&Iw#<*pZJ!!d)nL;SIqqll)T_XQYO}A z8MOXD10+%VoK?cx&(+hqquymyUb!iREMPG{My;EZ%^DwfQc8^&x_i%$yjrJfO7>Ww zI}~tFh1aO_?eI~SDjvT3%jwo)eH<`<4lnp5N!jI4Auf->cHAG|bg8~N%BMM&TUiNh zQT?(dB@bLY0R{SmCFz?Z17}_1re~WtdE8RX%|E}bfBJ;il`15g9@g-hw?I?yE<5)( z(ANvL$;jxSQUBWvw$Y==AlAW?c97uNj`8~BFOcdbKoxogu=y&nC!+%6vZ~>BZ-~Bk z7w#^(bDBXOd>aN2>FUf*b(MrDOIt}QCLue%#{aC_bRJS;ft+fqkxILDzGfPf4isx# zlfBfVG~L%Bp*=)bHCco;j!ss{@eV)Euna8ZWwLHSc!XCy$6QM( z)?7!*@+=YPk{9nNuF3e;BIP)gMn}F-8JpK#G!zQ-%+=DDV^gH1Od~{EKYt z7an!PY2a?MG|_Y=xe}Z)kB$V2-A^4IrOST_Vhu?NdyAa^F9`mF^V^20wZ?@7=7Kf{ zjsc`nnN5T34NR6+dZO9bzVgRy6ZpP;_z}{Al^Uw4IJG?s!pU^2?e1R@AD-_<<1iq3 zwepmw9Pt~J_J(E>iT)Tgr7lf6A#fj*b07Jw~crG+8eU_`49-ScWE8ZA7OBM zjs!gT$vlOiVl@WBdClpgH-o*csUhg6# zMjNJjT(SbJ)LgQ92O0!$U=R`-ckCWKd{9Bs}o znw$7~xv}T7{HwC|1HJm~I%0}{ZqM-Jihge^=v@6Z$yWGqVIlNwLa+YZsf)%@$UvgE z{X1cfbX#UXi;gCo#(S5>VAWJV_MDg26IbMf=$%xnmfr>725*I68X~(P`5Xw^&5H`) zmp}D^UhH_zh&LV=rFD|yjn{w<)+*9E7gXyN=e_N%crnr<=OW~3QRF+k8$MalEO06p z{WgdVLwXK?rAbmZIp84%8h#xO@iRq3y;pSGra@}pm%aMH_rf$EWm*&uEa2?@1}hRU z`{p{~HP}Zx6J_xP{IW1@N|;Kgns=UX2NR2i$KqHwjPk#CDbHeHSHHhKE*){cGYPQR z8Ku=l*MxMx`Zq9rZ$ltornkIulVtf=khuct3R-1`F*2hLSwKC7owy# z4Q;WU$fo;AwleBkY-U`YoxhI0vATDpd3u(T4`l$$qn>3#mYdgLu54YR-gS+VyDlRz zcAU~#Z%|R;>XwsBcMt+mmQmQ&l52$Lk4aztbk0jrVd;y9?4__V+p}VcNhI!DCo~ke zsOx7aNv`hvf##oOj2lmVi#)>@wTYT5DtYe!c6*a!N8FqOIuLzI8-ixf*q zxA1q16G_>ur5m|P0l>0oi+X|gIzFb{-P(Xk2}^#Fq5QBs#NbbZx8J~e@+OzlDf9KR z1uhE z%$cH}wtVMmi-F~T^sa&D2J}%{_xp`0gEnvZ-r>hT@e`t9XTqB)Y6wLBY;m~D@&l+e zY8qwYu6z1$S(>=QQz>B%Le6%8w?xN{~-*V(d@Z_@SRTIx2{p zQUHqy!(b`IqosSE``neNvqgzxyiL`xJ5tQ07crilo$-y*w)=gO;~!f$5n}BtgI2?n z{G_8LqRQz=-?QHos2e{j=rTCbdXkxcYw`DrRvAA& zmYg6ievp|NAMk;79U1*Ye**EP9?ykBmaDtRoqiBRJ9YnruATCU%Yo(a(jm?>Y9*@i Tz7fYC6#ynTER1RlU1I(Rs9(cw literal 0 HcmV?d00001 diff --git a/maps/away_missions/140x140/zoo.dmm b/maps/away_missions/140x140/zoo.dmm index e69738ee316..85060ec55e2 100644 --- a/maps/away_missions/140x140/zoo.dmm +++ b/maps/away_missions/140x140/zoo.dmm @@ -1537,12 +1537,6 @@ }, /turf/simulated/floor/plating, /area/awaymission/zoo/pirateship) -"eB" = ( -/mob/living/simple_mob/animal/space/alien{ - iff_factions = "pirate" - }, -/turf/simulated/floor/plating, -/area/awaymission/zoo/pirateship) "eC" = ( /obj/machinery/door/window{ base_state = "right"; @@ -6372,15 +6366,6 @@ name = "scorched sand" }, /area/awaymission/zoo) -"rL" = ( -/mob/living/simple_mob/animal/space/alien{ - iff_factions = "!bind-map" - }, -/turf/simulated/floor/holofloor/desert{ - icon_state = "asteroidplating"; - name = "scorched sand" - }, -/area/awaymission/zoo) "rM" = ( /obj/effect/floor_decal/spline{ icon_state = "asteroid_edge_e"; @@ -6432,15 +6417,6 @@ }, /turf/simulated/floor/plating, /area/awaymission/zoo) -"rS" = ( -/mob/living/simple_mob/animal/space/alien/drone{ - iff_factions = "!bind-map" - }, -/turf/simulated/floor/holofloor/desert{ - icon_state = "asteroidplating"; - name = "scorched sand" - }, -/area/awaymission/zoo) "rT" = ( /obj/structure/window/reinforced{ dir = 4 @@ -6505,23 +6481,6 @@ icon_state = "fullgrass1" }, /area/awaymission/zoo) -"sa" = ( -/obj/effect/floor_decal/spline{ - icon_state = "asteroid_edge_w"; - name = "rocky edge" - }, -/obj/effect/floor_decal/spline{ - icon_state = "asteroid_edge_s"; - name = "rocky edge" - }, -/mob/living/simple_mob/animal/space/alien/drone{ - iff_factions = "!bind-map" - }, -/turf/simulated/floor/holofloor/desert{ - icon_state = "asteroidplating"; - name = "scorched sand" - }, -/area/awaymission/zoo) "sb" = ( /obj/effect/floor_decal/spline{ icon_state = "asteroid_edge_s"; @@ -6616,19 +6575,6 @@ name = "scorched sand" }, /area/awaymission/zoo) -"so" = ( -/obj/effect/floor_decal/spline{ - icon_state = "asteroid_edge_e"; - name = "rocky edge" - }, -/mob/living/simple_mob/animal/space/alien/drone{ - iff_factions = "!bind-map" - }, -/turf/simulated/floor/holofloor/desert{ - icon_state = "asteroidplating"; - name = "scorched sand" - }, -/area/awaymission/zoo) "sp" = ( /obj/structure/window/reinforced{ dir = 4 @@ -6738,20 +6684,6 @@ name = "scorched sand" }, /area/awaymission/zoo) -"sz" = ( -/obj/effect/floor_decal/spline{ - icon_state = "asteroid_edge_w"; - name = "rocky edge" - }, -/mob/living/simple_mob/animal/space/alien{ - iff_factions = "!bind-map"; - name = "invisible alien hunter" - }, -/turf/simulated/floor/holofloor/desert{ - icon_state = "asteroidplating"; - name = "scorched sand" - }, -/area/awaymission/zoo) "sA" = ( /obj/effect/spider/stickyweb{ icon_state = "stickyweb2" @@ -6838,16 +6770,6 @@ }, /turf/simulated/floor/holofloor/desert, /area/awaymission/zoo) -"sM" = ( -/mob/living/simple_mob/animal/space/alien{ - iff_factions = "!bind-map"; - name = "invisible alien hunter" - }, -/turf/simulated/floor/holofloor/desert{ - icon_state = "asteroidplating"; - name = "scorched sand" - }, -/area/awaymission/zoo) "sN" = ( /obj/effect/decal/remains, /obj/effect/gibspawner/generic, @@ -6943,16 +6865,6 @@ /obj/structure/flora/grass/brown, /turf/simulated/floor/holofloor/snow, /area/awaymission/zoo) -"ta" = ( -/obj/effect/floor_decal/asteroid, -/mob/living/simple_mob/animal/space/alien{ - iff_factions = "!bind-map" - }, -/turf/simulated/floor/holofloor/desert{ - icon_state = "asteroidplating"; - name = "scorched sand" - }, -/area/awaymission/zoo) "tb" = ( /obj/structure/grille, /obj/structure/window/reinforced, @@ -15424,7 +15336,7 @@ br dl dY al -eB +al eg al dl @@ -17370,7 +17282,7 @@ rM ry ry ry -rS +rx rx ry ry @@ -17977,7 +17889,7 @@ ry rD rx rA -sz +rA rA sn sQ @@ -18894,7 +18806,7 @@ rx rx rx rx -sa +rE rz rM rB @@ -18903,7 +18815,7 @@ rz rz rG rx -sM +rx rx rx rx @@ -19199,7 +19111,7 @@ rt rx rx rx -rL +rx rx sb rz @@ -19517,7 +19429,7 @@ rx rx rD rx -rS +rx rx rx rB @@ -21054,7 +20966,7 @@ rM rD rx rx -rS +rx rx rx rx @@ -21349,7 +21261,7 @@ rB rz rz rM -rS +rx rx rN rB @@ -21671,7 +21583,7 @@ rM rx rD rx -ta +rD rx rt hq @@ -21970,7 +21882,7 @@ rF rA rx rx -sM +rx rA rE rz @@ -22274,7 +22186,7 @@ rz rz rz rM -so +ry ry rx rx diff --git a/maps/away_missions/archive/stationCollision.dmm b/maps/away_missions/archive/stationCollision.dmm index 4e725afbab2..b7cec5d39d3 100644 --- a/maps/away_missions/archive/stationCollision.dmm +++ b/maps/away_missions/archive/stationCollision.dmm @@ -124,9 +124,6 @@ "aJ" = ( /turf/simulated/floor/airless, /area/awaymission/syndishuttle) -"aK" = ( -/turf/space, -/area/awaymission/syndishuttle) "aL" = ( /obj/machinery/recharge_station, /turf/simulated/floor/airless, @@ -582,13 +579,6 @@ /obj/structure/closet/firecloset, /turf/simulated/floor/airless, /area/awaymission/research) -"cU" = ( -/mob/living/simple_mob/animal/space/alien{ - fireloss = 200; - stat = 2 - }, -/turf/simulated/floor/airless, -/area/awaymission/research) "cV" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ @@ -1367,9 +1357,6 @@ /obj/structure/grille, /turf/simulated/shuttle/plating, /area/awaymission/arrivalblock) -"fT" = ( -/turf/simulated/shuttle/wall, -/area/awaymission/arrivalblock) "fU" = ( /obj/structure/table/woodentable, /obj/item/flashlight/lamp/green{ @@ -3714,7 +3701,7 @@ aj aj aa aa -fT +fO fO gB gU @@ -3966,7 +3953,7 @@ bB bB aC aI -aK +aD aC af dy @@ -4088,7 +4075,7 @@ ap ap af af -aK +aD aD aC bl @@ -4488,7 +4475,7 @@ ak aa ba aa -aK +aD bf aC aD @@ -4554,7 +4541,7 @@ ak ak aa ap -aK +aD bf aC af @@ -4688,7 +4675,7 @@ aj ap aJ aJ -aK +aD ap ap ap @@ -5286,7 +5273,7 @@ bw bw co cG -cU +bw dg bw co diff --git a/maps/submaps/level_specific/class_d/cave2D.dmm b/maps/submaps/level_specific/class_d/cave2D.dmm index fb0f4556db2..e0a465c955c 100644 --- a/maps/submaps/level_specific/class_d/cave2D.dmm +++ b/maps/submaps/level_specific/class_d/cave2D.dmm @@ -2,11 +2,9 @@ "a" = ( /turf/template_noop, /area/template_noop) -"g" = ( +"h" = ( /obj/structure/alien/weeds, -/obj/structure/alien/weeds, -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/basic_spitter, +/mob/living/simple_mob/animal/space/xenomorph/drone, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) "i" = ( @@ -62,9 +60,10 @@ /obj/structure/alien/resin/wall, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"z" = ( +"A" = ( +/obj/structure/alien/weeds, /obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien, +/mob/living/simple_mob/animal/space/xenomorph/acid_spitter, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) "B" = ( @@ -84,14 +83,14 @@ /obj/random/energy, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"F" = ( +"H" = ( /obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/warrior, +/obj/random/trash_pile, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"H" = ( +"I" = ( /obj/structure/alien/weeds, -/obj/random/trash_pile, +/mob/living/simple_mob/animal/space/xenomorph/sprinter, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) "K" = ( @@ -109,11 +108,6 @@ /obj/structure/alien/weeds, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"N" = ( -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/adv_spitter, -/turf/simulated/mineral/floor/classd/indoors, -/area/class_d/explored) "O" = ( /obj/structure/alien/weeds, /obj/structure/alien/weeds, @@ -125,18 +119,24 @@ /obj/structure/alien/egg, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) +"Q" = ( +/obj/structure/alien/weeds, +/mob/living/simple_mob/animal/space/xenomorph/vanguard, +/turf/simulated/mineral/floor/classd/indoors, +/area/class_d/explored) "R" = ( /obj/structure/alien/weeds, /obj/random/energy, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"T" = ( -/obj/structure/alien/resin/wall, +"S" = ( +/obj/structure/alien/weeds, +/obj/structure/alien/weeds, +/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"U" = ( -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/drone, +"T" = ( +/obj/structure/alien/resin/wall, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) "W" = ( @@ -251,14 +251,14 @@ p K s r -g -s +r s s +h s D s -s +h p p p @@ -271,7 +271,7 @@ p p W O -q +S r q p @@ -302,7 +302,7 @@ p p p M -U +s X s p @@ -313,7 +313,7 @@ a (8,1,1) = {" p p -s +I s p p @@ -326,8 +326,8 @@ p m M m +h s -U p p a @@ -385,7 +385,7 @@ p p p P -N +s s p p @@ -407,15 +407,15 @@ p p i R -s +Q s P p p p T +h s -z p p a @@ -446,7 +446,7 @@ a p p s -s +I p p y @@ -476,7 +476,7 @@ y q q L -F +s p p p @@ -492,12 +492,12 @@ p p s s -q +A q Z q s -s +Q i p p @@ -539,7 +539,7 @@ p p P y -F +s P p p diff --git a/maps/submaps/level_specific/class_d/vault4D.dmm b/maps/submaps/level_specific/class_d/vault4D.dmm index 9b7a9fde9bd..7edd9a893c8 100644 --- a/maps/submaps/level_specific/class_d/vault4D.dmm +++ b/maps/submaps/level_specific/class_d/vault4D.dmm @@ -20,11 +20,6 @@ /obj/structure/alien/weeds, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"f" = ( -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/drone, -/turf/simulated/mineral/floor/classd/indoors, -/area/class_d/explored) "g" = ( /obj/structure/alien/weeds/node, /turf/simulated/mineral/floor/classd/indoors, @@ -35,11 +30,6 @@ /obj/fiftyspawner/uranium, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"i" = ( -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien, -/turf/simulated/mineral/floor/classd/indoors, -/area/class_d/explored) "j" = ( /obj/structure/alien/weeds, /obj/structure/alien/egg, @@ -51,6 +41,22 @@ /obj/fiftyspawner/diamond, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) +"s" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/mob/living/simple_mob/animal/space/xenomorph/drone, +/turf/simulated/mineral/floor/classd/indoors, +/area/class_d/explored) +"Q" = ( +/obj/structure/alien/weeds, +/mob/living/simple_mob/animal/space/xenomorph/sprinter, +/turf/simulated/mineral/floor/classd/indoors, +/area/class_d/explored) +"R" = ( +/obj/structure/alien/weeds, +/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter, +/turf/simulated/mineral/floor/classd/indoors, +/area/class_d/explored) (1,1,1) = {" a @@ -78,8 +84,8 @@ a a b b -d -i +s +e k b b @@ -92,7 +98,7 @@ d e e g -f +e b a "} @@ -100,9 +106,9 @@ a a c e -e +R j -e +Q e c a @@ -110,11 +116,11 @@ a (6,1,1) = {" a b -f +e g e e -d +s b a "} @@ -123,7 +129,7 @@ a b b h -i +e d b b diff --git a/maps/submaps/level_specific/class_d/vault5D.dmm b/maps/submaps/level_specific/class_d/vault5D.dmm index e67eb76f460..fd01b9b56bf 100644 --- a/maps/submaps/level_specific/class_d/vault5D.dmm +++ b/maps/submaps/level_specific/class_d/vault5D.dmm @@ -30,7 +30,7 @@ /obj/structure/alien/weeds, /obj/structure/bed/nest, /obj/fiftyspawner/osmium, -/mob/living/simple_mob/animal/space/alien/drone, +/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) "h" = ( @@ -46,7 +46,7 @@ "j" = ( /obj/structure/alien/weeds, /obj/structure/alien/weeds/node, -/mob/living/simple_mob/animal/space/alien/basic_spitter, +/mob/living/simple_mob/animal/space/xenomorph/vanguard, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) "k" = ( @@ -61,15 +61,16 @@ /obj/fiftyspawner/durasteel, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) -"W" = ( +"S" = ( /obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/drone, +/mob/living/simple_mob/animal/space/xenomorph/sprinter, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) "X" = ( /obj/structure/alien/weeds, /obj/structure/bed/nest, /obj/fiftyspawner/phoron, +/mob/living/simple_mob/animal/space/xenomorph/warrior, /turf/simulated/mineral/floor/classd/indoors, /area/class_d/explored) @@ -112,7 +113,7 @@ b d e e -e +S k b a @@ -132,7 +133,7 @@ a a b f -W +e e e A diff --git a/maps/submaps/level_specific/debrisfield_vr/new_escapepod_xeno.dmm b/maps/submaps/level_specific/debrisfield_vr/new_escapepod_xeno.dmm index 36eb738d316..657ef829d69 100644 --- a/maps/submaps/level_specific/debrisfield_vr/new_escapepod_xeno.dmm +++ b/maps/submaps/level_specific/debrisfield_vr/new_escapepod_xeno.dmm @@ -13,11 +13,6 @@ /obj/structure/alien/weeds, /turf/space, /area/submap/debrisfield_vr/misc_debris) -"k" = ( -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien, -/turf/simulated/floor/airless, -/area/submap/debrisfield_vr/misc_debris) "r" = ( /obj/structure/grille/broken, /obj/structure/window/reinforced{ @@ -37,6 +32,11 @@ /obj/structure/alien/weeds, /turf/simulated/floor/airless, /area/submap/debrisfield_vr/misc_debris) +"x" = ( +/obj/structure/alien/weeds, +/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter, +/turf/simulated/floor/airless, +/area/submap/debrisfield_vr/misc_debris) "A" = ( /obj/structure/alien/weeds/node, /turf/simulated/floor/airless, @@ -46,9 +46,9 @@ /obj/structure/alien/resin/wall, /turf/simulated/wall/rshull, /area/submap/debrisfield_vr/misc_debris) -"R" = ( +"F" = ( /obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/basic_spitter, +/mob/living/simple_mob/animal/space/xenomorph/drone, /turf/simulated/floor/airless, /area/submap/debrisfield_vr/misc_debris) "T" = ( @@ -69,11 +69,6 @@ /obj/structure/alien/egg, /turf/simulated/floor/airless, /area/submap/debrisfield_vr/misc_debris) -"X" = ( -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/drone, -/turf/simulated/floor/airless, -/area/submap/debrisfield_vr/misc_debris) (1,1,1) = {" a @@ -84,30 +79,30 @@ a "} (2,1,1) = {" h -X -U +F +F W D "} (3,1,1) = {" a -k +U A U D "} (4,1,1) = {" a +x U -R -U +x a "} (5,1,1) = {" h W U -X +U a "} (6,1,1) = {" diff --git a/maps/submaps/level_specific/virgo2/CrashedSmuggler.dmm b/maps/submaps/level_specific/virgo2/CrashedSmuggler.dmm index 32edf1ae5c4..a16f665b5a8 100644 --- a/maps/submaps/level_specific/virgo2/CrashedSmuggler.dmm +++ b/maps/submaps/level_specific/virgo2/CrashedSmuggler.dmm @@ -50,11 +50,6 @@ /obj/machinery/light/small, /turf/simulated/floor/tiled/techfloor/virgo2, /area/submap/virgo2/CrashedSmuggler/ship) -"eO" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_mob/animal/space/alien/drone, -/turf/simulated/mineral/floor/ignore_mapgen/virgo2, -/area/submap/virgo2/CrashedSmuggler) "fa" = ( /obj/structure/cable/green{ icon_state = "4-8" @@ -628,11 +623,6 @@ }, /turf/simulated/floor/tiled/techfloor/virgo2, /area/submap/virgo2/CrashedSmuggler/ship) -"ZN" = ( -/obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/drone, -/turf/simulated/mineral/floor/ignore_mapgen/virgo2, -/area/submap/virgo2/CrashedSmuggler) (1,1,1) = {" Dj @@ -731,7 +721,7 @@ HE Ps gX zl -eO +Gf RJ zl zl @@ -938,7 +928,7 @@ ie ef gX zl -ZN +Gh Gh zl zl @@ -1146,7 +1136,7 @@ KS OR Gh Gh -ZN +Gh Gh Gh zl @@ -1167,7 +1157,7 @@ Gh Gh EY Gh -eO +Gf EY EY Gh @@ -1216,7 +1206,7 @@ gv jf mP EY -ZN +Gh Gh Gh Gf @@ -1249,7 +1239,7 @@ Gh gv Gh Gh -ZN +Gh Gh Gh zl diff --git a/maps/submaps/mountains/crashed_ufo_frigate.dmm b/maps/submaps/mountains/crashed_ufo_frigate.dmm index 499ecc4e439..4cddda07b79 100644 --- a/maps/submaps/mountains/crashed_ufo_frigate.dmm +++ b/maps/submaps/mountains/crashed_ufo_frigate.dmm @@ -15,10 +15,6 @@ /obj/structure/alien/egg, /turf/simulated/shuttle/floor/alienplating, /area/submap/cave/crashed_ufo_frigate) -"af" = ( -/mob/living/simple_mob/animal/space/alien/drone, -/turf/simulated/shuttle/floor/alienplating, -/area/submap/cave/crashed_ufo_frigate) "ag" = ( /obj/machinery/porta_turret/alien{ faction = "xeno" @@ -170,11 +166,6 @@ /obj/structure/prop/alien/power, /turf/simulated/shuttle/floor/alienplating, /area/submap/cave/crashed_ufo_frigate) -"aQ" = ( -/obj/structure/alien/weeds/node, -/mob/living/simple_mob/animal/space/alien/drone, -/turf/simulated/shuttle/floor/alienplating, -/area/submap/cave/crashed_ufo_frigate) "aR" = ( /obj/structure/alien/weeds/node, /turf/simulated/shuttle/floor/alien, @@ -270,10 +261,6 @@ /obj/effect/decal/remains/xeno, /turf/simulated/shuttle/floor/alienplating, /area/submap/cave/crashed_ufo_frigate) -"bk" = ( -/mob/living/simple_mob/animal/space/alien, -/turf/simulated/shuttle/floor/alienplating, -/area/submap/cave/crashed_ufo_frigate) "bl" = ( /obj/effect/decal/remains/xeno, /obj/item/clothing/under/psysuit, @@ -471,10 +458,6 @@ /obj/structure/window/phoronreinforced, /turf/simulated/shuttle/floor/alien, /area/submap/cave/crashed_ufo_frigate) -"bX" = ( -/mob/living/simple_mob/animal/space/alien, -/turf/simulated/shuttle/floor/alien, -/area/submap/cave/crashed_ufo_frigate) "bY" = ( /obj/structure/foamedmetal, /obj/machinery/door/airlock/alien/locked, @@ -1191,7 +1174,7 @@ ac aJ ac aO -aQ +aA ae ab ac @@ -1239,7 +1222,7 @@ ac aF al ap -bk +ac aF ab bw @@ -1289,7 +1272,7 @@ aR bL ap ap -bX +ap ap ap ag @@ -1302,7 +1285,7 @@ ab "} (20,1,1) = {" ab -af +ac ac an al diff --git a/maps/submaps/mountains/vault3.dmm b/maps/submaps/mountains/vault3.dmm index be5d563ecd8..449690fe75c 100644 --- a/maps/submaps/mountains/vault3.dmm +++ b/maps/submaps/mountains/vault3.dmm @@ -17,7 +17,7 @@ /area/submap/cave/vault3) "e" = ( /obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/drone, +/mob/living/simple_mob/animal/space/xenomorph/neurotoxin_spitter, /turf/simulated/floor/plating, /area/submap/cave/vault3) "f" = ( @@ -33,12 +33,18 @@ /obj/structure/alien/weeds, /obj/structure/alien/weeds, /obj/structure/alien/weeds/node, +/mob/living/simple_mob/animal/space/xenomorph/special/burrower, /turf/simulated/floor/plating, /area/submap/cave/vault3) "i" = ( /obj/structure/bed/nest, /turf/simulated/floor/plating, /area/submap/cave/vault3) +"W" = ( +/obj/structure/alien/weeds, +/mob/living/simple_mob/animal/space/xenomorph/sprinter, +/turf/simulated/floor/plating, +/area/submap/cave/vault3) (1,1,1) = {" a @@ -66,7 +72,7 @@ a a b b -e +W g g b diff --git a/maps/submaps/mountains/vault4.dmm b/maps/submaps/mountains/vault4.dmm index e04ec09faa6..ea29fd0340f 100644 --- a/maps/submaps/mountains/vault4.dmm +++ b/maps/submaps/mountains/vault4.dmm @@ -22,7 +22,7 @@ /area/submap/cave/vault4) "f" = ( /obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien/drone, +/mob/living/simple_mob/animal/space/xenomorph/warrior, /turf/simulated/mineral/floor/ignore_mapgen, /area/submap/cave/vault4) "g" = ( @@ -34,14 +34,16 @@ /obj/random/multiple/minevault, /turf/simulated/mineral/floor/ignore_mapgen, /area/submap/cave/vault4) -"i" = ( +"j" = ( /obj/structure/alien/weeds, -/mob/living/simple_mob/animal/space/alien, +/obj/structure/alien/egg, +/mob/living/simple_mob/animal/space/xenomorph/vanguard, /turf/simulated/mineral/floor/ignore_mapgen, /area/submap/cave/vault4) -"j" = ( +"N" = ( /obj/structure/alien/weeds, -/obj/structure/alien/egg, +/obj/structure/bed/nest, +/mob/living/simple_mob/animal/space/xenomorph/warrior, /turf/simulated/mineral/floor/ignore_mapgen, /area/submap/cave/vault4) @@ -71,8 +73,8 @@ a a b b -d -i +N +e h b b @@ -85,7 +87,7 @@ d e e g -f +e b a "} @@ -107,7 +109,7 @@ f g e e -d +N b a "} @@ -116,7 +118,7 @@ a b b h -i +e d b b diff --git a/maps/submaps/mountains/vault5.dmm b/maps/submaps/mountains/vault5.dmm index 7cef2cdef87..a4d438d57fc 100644 --- a/maps/submaps/mountains/vault5.dmm +++ b/maps/submaps/mountains/vault5.dmm @@ -44,6 +44,7 @@ "j" = ( /obj/structure/alien/weeds, /obj/structure/alien/weeds/node, +/mob/living/simple_mob/animal/space/xenomorph/vanguard, /turf/simulated/mineral/floor/ignore_mapgen, /area/submap/cave/vault5) "k" = ( @@ -52,6 +53,12 @@ /obj/item/gun/ballistic/SVD, /turf/simulated/mineral/floor/ignore_mapgen, /area/submap/cave/vault5) +"A" = ( +/obj/structure/alien/weeds, +/obj/structure/bed/nest, +/mob/living/simple_mob/animal/space/xenomorph/warrior, +/turf/simulated/mineral/floor/ignore_mapgen, +/area/submap/cave/vault5) (1,1,1) = {" a @@ -79,7 +86,7 @@ a a b b -g +A i h b @@ -125,7 +132,7 @@ b b h i -g +A b b a