Converts simple xeno mobs to basic mobs (#29975)

* Basic xenos

* Fixed config, better ranged code

* Syndiecakes corgis

* Lavaland subtypes

* Renames files because conflict with midround xenos

* Linters, enviro-smash

---------

Signed-off-by: PollardTheDragon <144391971+PollardTheDragon@users.noreply.github.com>
This commit is contained in:
PollardTheDragon
2025-08-07 12:30:36 -04:00
committed by GitHub
parent 32c1d64849
commit cb2032f7d4
20 changed files with 371 additions and 286 deletions
@@ -162,7 +162,6 @@ RESTRICT_TYPE(/mob/living/basic)
var/ranged_burst_interval = 0.2 SECONDS
/// Time between bursts
var/ranged_cooldown = 2 SECONDS
/// What casing type is the projectile?
var/casing_type
/// What projectile do we shoot?
@@ -0,0 +1,91 @@
/datum/ai_controller/basic_controller/alien
ai_movement = /datum/ai_movement/basic_avoidance
idle_behavior = /datum/idle_behavior/idle_random_walk
blackboard = list(
BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic,
)
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/alien,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
ai_traits = AI_FLAG_PAUSE_DURING_DO_AFTER
movement_delay = 0.8 SECONDS
/datum/ai_controller/basic_controller/alien/sentinel
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/alien,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/maintain_distance,
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
/datum/ai_planning_subtree/ranged_skirmish,
)
/datum/ai_controller/basic_controller/alien/corgi
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/maintain_distance,
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
/datum/ai_planning_subtree/ranged_skirmish,
)
/datum/ai_controller/basic_controller/alien/drone
idle_behavior = /datum/idle_behavior/idle_random_walk/plant_weeds
/datum/ai_controller/basic_controller/alien/queen
idle_behavior = /datum/idle_behavior/idle_random_walk/plant_weeds/queen
planning_subtrees = list(
/datum/ai_planning_subtree/random_speech/alien,
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/maintain_distance,
/datum/ai_planning_subtree/basic_melee_attack_subtree/opportunistic,
/datum/ai_planning_subtree/ranged_skirmish,
)
/datum/ai_controller/basic_controller/alien/maid
planning_subtrees = list(
/datum/ai_planning_subtree/find_nearest_thing_which_attacked_me_to_flee,
/datum/ai_planning_subtree/flee_target,
/datum/ai_planning_subtree/find_and_hunt_target/clean,
)
/**
* Alien projectile
* Try to avoid friendly fire, and has a 3 second delay.
*/
/datum/idle_behavior/idle_random_walk/plant_weeds
var/plant_cooldown = 30
var/plants_off = 0
/datum/idle_behavior/idle_random_walk/plant_weeds/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller)
. = ..()
if(!.)
return .
plant_cooldown--
var/mob/living/basic/alien/alien_pawn = controller.pawn
if(alien_pawn.can_plant_weeds && !plants_off && plant_cooldown <= 0)
plant_cooldown = initial(plant_cooldown)
alien_pawn.spread_plants()
/datum/idle_behavior/idle_random_walk/plant_weeds/queen
var/eggs_off = 0
var/egg_cooldown = 30
/datum/idle_behavior/idle_random_walk/plant_weeds/queen/perform_idle_behavior(seconds_per_tick, datum/ai_controller/controller)
. = ..()
if(!.)
return .
egg_cooldown--
var/mob/living/basic/alien/alien_pawn = controller.pawn
if(alien_pawn.can_lay_eggs && !eggs_off && egg_cooldown <= 0)
egg_cooldown = initial(egg_cooldown)
alien_pawn.lay_eggs()
/datum/ai_planning_subtree/random_speech/alien
speech_chance = 2
sound = list('sound/voice/hiss1.ogg', 'sound/voice/hiss2.ogg', 'sound/voice/hiss3.ogg', 'sound/voice/hiss4.ogg')
emote_hear = list("hisses.")
@@ -0,0 +1,12 @@
/mob/living/basic/alien/drone
name = "alien drone"
icon_state = "aliend_running"
icon_living = "aliend_running"
icon_dead = "aliend_dead"
melee_damage_lower = 15
melee_damage_upper = 15
ai_controller = /datum/ai_controller/basic_controller/alien/drone
/mob/living/basic/alien/drone/lavaland
maximum_survivable_temperature = INFINITY
@@ -0,0 +1,71 @@
/mob/living/basic/alien
name = "alien hunter"
desc = "Hiss!"
icon = 'icons/mob/alien.dmi'
icon_state = "alienh_running"
icon_living = "alienh_running"
icon_dead = "alienh_dead"
icon_gib = "syndicate_gib"
gender = FEMALE
speed = 0
status_flags = CANPUSH
basic_mob_flags = FLAMMABLE_MOB
butcher_results = list(/obj/item/food/monstermeat/xenomeat= 3, /obj/item/stack/sheet/animalhide/xeno = 1)
maxHealth = 125
health = 125
harm_intent_damage = 5
obj_damage = 60
melee_attack_cooldown_min = 1.5 SECONDS
melee_attack_cooldown_max = 2.5 SECONDS
speak_emote = list("hisses")
melee_damage_lower = 25
melee_damage_upper = 25
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
bubble_icon = "alien"
a_intent = INTENT_HARM
attack_sound = 'sound/weapons/bladeslice.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 15
unsuitable_heat_damage = 20
faction = list("alien")
minimum_survivable_temperature = 0
see_in_dark = 8
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
death_sound = 'sound/voice/hiss6.ogg'
deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..."
step_type = FOOTSTEP_MOB_CLAW
loot = list(/obj/effect/decal/cleanable/blood/gibs/xeno/limb, /obj/effect/decal/cleanable/blood/gibs/xeno/core, /obj/effect/decal/cleanable/blood/xeno/splatter, /obj/effect/decal/cleanable/blood/gibs/xeno/body, /obj/effect/decal/cleanable/blood/gibs/xeno/down)
ai_controller = /datum/ai_controller/basic_controller/alien
/// Boolean on whether the xeno can plant weeds.
var/can_plant_weeds = TRUE
/// Boolean on whether the xeno can lay eggs.
var/can_lay_eggs = FALSE
/mob/living/basic/alien/Initialize(mapload)
. = ..()
AddComponent(/datum/component/aggro_emote, emote_list = list("flutters"), emote_chance = 20)
/mob/living/basic/alien/proc/spread_plants()
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
return
visible_message("<span class='alertalien'>[src] has planted some alien weeds!</span>")
new /obj/structure/alien/weeds/node(loc)
/mob/living/basic/alien/proc/lay_eggs()
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/egg) in get_turf(src))
return
visible_message("<span class='alertalien'>[src] has laid an egg!</span>")
new /obj/structure/alien/egg(loc)
/mob/living/basic/alien/lavaland
maximum_survivable_temperature = INFINITY
@@ -0,0 +1,43 @@
/mob/living/basic/alien/maid
name = "lusty xenomorph maid"
melee_damage_lower = 0
melee_damage_upper = 0
a_intent = INTENT_HELP
friendly_verb_continuous = "caresses"
friendly_verb_simple = "caress"
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = HOSTILE_SPAWN
ai_controller = /datum/ai_controller/basic_controller/alien/maid
icon_state = "maid"
icon_living = "maid"
icon_dead = "maid_dead"
/// How fast do we clean?
var/cleanspeed = 15
/mob/living/basic/alien/maid/Initialize(mapload)
. = ..()
AddElement(/datum/element/ai_retaliate)
/// Clean instead of attack.
/mob/living/basic/alien/maid/early_melee_attack(atom/target, list/modifiers, ignore_cooldown)
. = ..()
if(!.)
return FALSE
clean_target(target)
return FALSE
/mob/living/basic/alien/maid/proc/clean_target(atom/target)
if(ishuman(target))
var/atom/movable/H = target
H.clean_blood()
visible_message("<span class='notice'>\The [src] polishes \the [target].</span>")
return FALSE
target.cleaning_act(src, src, cleanspeed, text_description = ".") // LXM is both the user and the cleaning implement itself. Wow!
/mob/living/basic/alien/maid/can_clean()
return TRUE
/mob/living/basic/alien/maid/lavaland
maximum_survivable_temperature = INFINITY
@@ -0,0 +1,34 @@
/mob/living/basic/alien/queen
name = "alien queen"
icon_state = "alienq_running"
icon_living = "alienq_running"
icon_dead = "alienq_dead"
health = 250
maxHealth = 250
melee_damage_lower = 15
melee_damage_upper = 15
status_flags = NONE // can't shove the queen, kiddo.
ai_controller = /datum/ai_controller/basic_controller/alien/queen
is_ranged = TRUE
projectile_type = /obj/item/projectile/neurotox
projectile_sound = 'sound/weapons/pierce.ogg'
ranged_cooldown = 3 SECONDS
/mob/living/basic/alien/queen/lavaland
maximum_survivable_temperature = INFINITY
/mob/living/basic/alien/queen/large
name = "alien empress"
icon = 'icons/mob/alienlarge.dmi'
icon_state = "queen_s"
icon_living = "queen_s"
icon_dead = "queen_dead"
bubble_icon = "alienroyal"
maxHealth = 400
health = 400
mob_size = MOB_SIZE_LARGE
/mob/living/basic/alien/queen/large/lavaland
maximum_survivable_temperature = INFINITY
@@ -0,0 +1,37 @@
/mob/living/basic/alien/sentinel
name = "alien sentinel"
icon_state = "aliens_running"
icon_living = "aliens_running"
icon_dead = "aliens_dead"
health = 150
maxHealth = 150
melee_damage_lower = 15
melee_damage_upper = 15
ai_controller = /datum/ai_controller/basic_controller/alien/sentinel
is_ranged = TRUE
projectile_type = /obj/item/projectile/neurotox
projectile_sound = 'sound/weapons/pierce.ogg'
ranged_cooldown = 3 SECONDS
/mob/living/basic/alien/sentinel/corgi
name = "angry corgi"
real_name = "angry corgi"
desc = "It's a corgi."
icon_state = "corgi"
icon_living = "corgi"
icon_dead = "corgi_dead"
icon = 'icons/mob/pets.dmi';
desc = "This is no longer a goodboy. Not anymore. He has seen too much.";
attack_sound = 'sound/weapons/bite.ogg';
attack_verb_continuous = "bites";
attack_verb_simple = "bites";
damage_coeff = list("brute" = 1, "fire" = 1, "tox" = 1, "clone" = 1, "stamina" = 1, "oxy" = 1);
death_sound = null;
deathmessage = "";
ai_controller = /datum/ai_controller/basic_controller/alien/corgi
/mob/living/basic/alien/sentinel/lavaland
maximum_survivable_temperature = INFINITY