diff --git a/citadel.dme b/citadel.dme index 9dc2ba4f56e5..a00bfbd6af25 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 f46a7c608f40..3c8145928ce2 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 a7750f0b37de..e7c05dba2374 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 47eb371602f8..678e7fb73aa3 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 7b50df091c34..870815cdae87 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 c82065c99a7f..0aab2802125f 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 4e98fa3554c9..000000000000 --- 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 000000000000..7a622c6878b7 --- /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 000000000000..c0a083a3e38f --- /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 000000000000..14f675ae997a --- /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 98aa4a9779f3..650f06274db7 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 0d205b340865..84ecedef2dcd 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 000000000000..166a476380cc Binary files /dev/null and b/icons/mob/biomorphs/berserker.dmi differ diff --git a/icons/mob/biomorphs/burster.dmi b/icons/mob/biomorphs/burster.dmi new file mode 100644 index 000000000000..0a7824a0535c Binary files /dev/null and b/icons/mob/biomorphs/burster.dmi differ diff --git a/icons/mob/biomorphs/inferno.dmi b/icons/mob/biomorphs/inferno.dmi new file mode 100644 index 000000000000..d457ed30f18d Binary files /dev/null and b/icons/mob/biomorphs/inferno.dmi differ diff --git a/icons/mob/biomorphs/sprinter.dmi b/icons/mob/biomorphs/sprinter.dmi new file mode 100644 index 000000000000..567fefa86a60 Binary files /dev/null and b/icons/mob/biomorphs/sprinter.dmi differ diff --git a/maps/away_missions/140x140/zoo.dmm b/maps/away_missions/140x140/zoo.dmm index e69738ee3168..85060ec55e28 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 4e725afbab26..b7cec5d39d3a 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 fb0f4556db27..e0a465c955c9 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 9b7a9fde9bd4..7edd9a893c8c 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 e67eb76f460c..fd01b9b56bfc 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 36eb738d316d..657ef829d694 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 32edf1ae5c42..a16f665b5a8f 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 499ecc4e4390..4cddda07b791 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 be5d563ecd89..449690fe75c6 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 e04ec09faa6b..ea29fd0340f7 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 7cef2cdef879..a4d438d57fcc 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