Simple animal xenos are now basic animal xenos (#82187)

## About The Pull Request

We currently have 2 types of xenos in the codebase, simple animal and
carbon.
I'd like to unite them both under basic, and I thought I should go for
simple animal first since it's more of a conversion than a remake.
This helps set a base for a future basic-only xeno, which would require
the following:
- Basic mobs (or just anything than Carbon) to have Organs, which we can
then use for things like referring to their plasma sac for egg-laying,
etc.
- All xeno types having a basic mob variant, preferably with an AI so
they would work without a player.
- Something be done about larva, either we'd split basic xenos into
"larva" and "adult" (like carbon) or have it be a separate path that can
also have organs so they can still have hivemind.

Everything else seems to have been done overtime as simple animals have
been converted to basic (HUDs and holding things now seem possible,
etc.)

Even if this doesn't work out, at least this cuts off a good chunk of
the remaining simple animals to convert to basic.

Sprites used (for mapping helpers):

Fire medkit
Toxin medkit
Oingo Boingo punch face (i tried to shrink it down)

## Why It's Good For The Game

This helps advance us move away from simple animals, and helps move
carbon xenos to basic mob later too if that's what we want to go for.

## Changelog

🆑
refactor: Xenomorphs (Lavaland & Oldstation ones) are now basic mobs.
/🆑
This commit is contained in:
John Willard
2024-03-26 17:28:58 -04:00
committed by GitHub
parent 4e714a857c
commit 2163f60527
25 changed files with 432 additions and 294 deletions

View File

@@ -33,7 +33,7 @@
/area/ruin/unpowered/xenonest)
"j" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
"l" = (
@@ -55,7 +55,7 @@
/area/ruin/unpowered/xenonest)
"t" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/sentinel,
/mob/living/basic/alien/sentinel,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
"u" = (
@@ -103,18 +103,18 @@
/area/ruin/unpowered/xenonest)
"E" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
"F" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/queen/large{
/mob/living/basic/alien/queen/large{
desc = "A gigantic alien who is in charge of the hive and all of its loyal servants.";
name = "alien queen";
pixel_x = -16;
plants_off = 1
can_plant_weeds = 0
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
@@ -137,13 +137,13 @@
/area/ruin/unpowered/xenonest)
"K" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
"L" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)
@@ -160,8 +160,8 @@
"Q" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/xenonest)

View File

@@ -1,7 +1,7 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
"ab" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium,
@@ -368,7 +368,7 @@
/turf/template_noop,
/area/ruin/space/has_grav/infested_frigate)
"eE" = (
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/obj/structure/cable,
@@ -430,7 +430,6 @@
/obj/effect/turf_decal/tile/bar,
/obj/structure/table/reinforced,
/obj/structure/closet/mini_fridge/grimy{
anchored = 1;
pixel_y = 6
},
/obj/effect/spawner/random/food_or_drink/refreshing_beverage,
@@ -844,7 +843,7 @@
/turf/open/floor/pod/dark,
/area/ruin/space/has_grav/infested_frigate)
"nG" = (
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium/red,
@@ -1232,7 +1231,7 @@
icon_state = "warningline_red";
dir = 4
},
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/pod/dark,
@@ -1327,8 +1326,7 @@
},
/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear,
/obj/structure/bed/nest,
/mob/living/simple_animal/hostile/alien/drone{
del_on_death = 1;
/mob/living/basic/alien/drone{
loot = list(/obj/effect/gibspawner/xeno);
faction = list("syndicate","xenomorph")
},
@@ -1387,7 +1385,7 @@
dir = 4
},
/obj/structure/cable,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium,
@@ -1475,7 +1473,7 @@
icon_state = "gib1-old"
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium/red,
@@ -1535,7 +1533,7 @@
/obj/item/ammo_casing/spent,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/obj/structure/cable,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium/red,
@@ -1643,7 +1641,7 @@
/obj/effect/mob_spawn/corpse/human/syndicatecommando/lessenedgear,
/obj/item/ammo_casing/spent,
/obj/item/ammo_casing/spent,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/titanium/tiled/white,
@@ -1941,8 +1939,7 @@
/area/ruin/space/has_grav/infested_frigate)
"ER" = (
/obj/structure/cable,
/mob/living/simple_animal/hostile/alien/sentinel{
del_on_death = 1;
/mob/living/basic/alien/sentinel{
loot = list(/obj/effect/gibspawner/xeno);
faction = list("syndicate","xenomorph")
},
@@ -1958,7 +1955,7 @@
/obj/effect/decal/cleanable/glass,
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium/red,
@@ -2050,7 +2047,7 @@
},
/obj/structure/cable,
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium/red,
@@ -2077,7 +2074,7 @@
icon_state = "gib1-old"
},
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium,
@@ -2098,7 +2095,7 @@
icon_state = "xgibhead";
dir = 4
},
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium,
@@ -2201,7 +2198,7 @@
/turf/open/floor/pod/dark,
/area/ruin/space/has_grav/infested_frigate)
"Jx" = (
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium,
@@ -2809,8 +2806,7 @@
/obj/item/shard{
icon_state = "plastitaniumtiny"
},
/mob/living/simple_animal/hostile/alien/queen/large{
del_on_death = 1;
/mob/living/basic/alien/queen/large{
loot = list(/obj/effect/gibspawner/xeno,/obj/item/ammo_box/magazine/plastikov9mm,/obj/effect/mob_spawn/corpse/human/syndicatecommando/soft_suit);
desc = "What you saw in your dreams last night.";
faction = list("syndicate","xenomorph")
@@ -3086,7 +3082,7 @@
"Yd" = (
/obj/effect/decal/cleanable/dirt,
/obj/structure/alien/egg/burst,
/mob/living/simple_animal/hostile/alien{
/mob/living/basic/alien{
faction = list("syndicate","xenomorph")
},
/turf/open/floor/mineral/plastitanium/red,

View File

@@ -24,7 +24,7 @@
/area/ruin/space/ancientstation/delta/biolab)
"af" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
"ag" = (
@@ -47,7 +47,7 @@
/area/ruin/space/ancientstation/charlie/bridge)
"ao" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/basic/alien/drone,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
"ap" = (
@@ -727,7 +727,7 @@
/area/ruin/space/ancientstation/delta/ai)
"de" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/queen,
/mob/living/basic/alien/queen,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
"df" = (
@@ -1496,7 +1496,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/machinery/firealarm/directional/east,
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/basic/alien/drone,
/turf/open/floor/iron,
/area/ruin/space/ancientstation/delta/hall)
"gE" = (
@@ -1708,7 +1708,7 @@
/turf/open/floor/iron,
/area/ruin/space/ancientstation/charlie/sec)
"hE" = (
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/basic/alien/drone,
/obj/machinery/atmospherics/components/unary/vent_pump/on/layer4{
dir = 8
},
@@ -2638,7 +2638,7 @@
"lq" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood/gibs/old,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/floor/iron/dark,
/area/ruin/space/ancientstation/delta/ai)
"lr" = (
@@ -3234,7 +3234,7 @@
/area/ruin/space/ancientstation/delta/hall)
"nN" = (
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/basic/alien/drone,
/turf/open/floor/iron/white,
/area/ruin/space/ancientstation/delta/rnd)
"nO" = (
@@ -3931,7 +3931,7 @@
/obj/effect/decal/cleanable/blood/tracks{
dir = 1
},
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/obj/structure/cable,
/obj/machinery/light/broken/directional/east,
/turf/open/floor/iron,
@@ -4483,7 +4483,7 @@
"wr" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/basic/alien/drone,
/obj/machinery/duct,
/obj/machinery/light/broken/directional/south,
/turf/open/floor/iron,
@@ -5012,7 +5012,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/structure/cable,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/basic/alien/drone,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2{
dir = 10
},
@@ -6320,7 +6320,7 @@
/turf/open/floor/iron,
/area/ruin/space/ancientstation/charlie/hall)
"JZ" = (
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/obj/structure/alien/weeds,
/obj/machinery/light/small/broken/directional/west,
/turf/open/floor/iron/dark,

View File

@@ -2089,7 +2089,7 @@
/area/awaymission/moonoutpost19/syndicate)
"nz" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/sentinel,
/mob/living/basic/alien/sentinel,
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
@@ -3079,8 +3079,8 @@
/area/awaymission/moonoutpost19/arrivals)
"tN" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
@@ -3214,11 +3214,11 @@
/area/awaymission/moonoutpost19/arrivals)
"uH" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/queen/large{
/mob/living/basic/alien/queen/large{
desc = "A gigantic alien who is in charge of the hive and all of its loyal servants.";
name = "alien queen";
pixel_x = -16;
plants_off = 1
can_plant_weeds = 0
},
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
@@ -4692,7 +4692,7 @@
/area/awaymission/moonoutpost19/research)
"EZ" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
@@ -5006,7 +5006,7 @@
/area/awaymission/moonoutpost19/research)
"Ha" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
},
@@ -5292,8 +5292,8 @@
"Ja" = (
/obj/structure/alien/weeds,
/obj/effect/decal/cleanable/blood,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
@@ -5370,8 +5370,8 @@
/area/awaymission/moonoutpost19/research)
"Jw" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
@@ -5504,8 +5504,8 @@
/area/awaymission/moonoutpost19/research)
"KA" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
@@ -5950,8 +5950,8 @@
},
/area/awaymission/moonoutpost19/arrivals)
"NU" = (
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"
@@ -7011,8 +7011,8 @@
/area/awaymission/moonoutpost19/research)
"UI" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/moon{
initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"

View File

@@ -230,7 +230,7 @@
/turf/open/floor/iron,
/area/shuttle/escape)
"aU" = (
/mob/living/simple_animal/hostile/alien/maid/barmaid,
/mob/living/basic/alien/maid/barmaid,
/obj/effect/turf_decal/tile/bar/opposingcorners,
/turf/open/floor/iron,
/area/shuttle/escape)

View File

@@ -955,7 +955,7 @@
/turf/open/floor/iron/dark,
/area/shuttle/escape)
"uu" = (
/mob/living/simple_animal/hostile/alien/maid/barmaid,
/mob/living/basic/alien/maid/barmaid,
/turf/open/floor/wood/parquet,
/area/shuttle/escape)
"uy" = (

View File

@@ -66,8 +66,8 @@
/area/ruin/space/has_grav/powered/virtual_domain)
"p" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/space/has_grav/powered/virtual_domain)
@@ -81,8 +81,8 @@
/area/virtual_domain/safehouse)
"s" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien/drone{
plants_off = 1
/mob/living/basic/alien/drone{
can_plant_weeds = 0
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/space/has_grav/powered/virtual_domain)
@@ -175,11 +175,11 @@
/area/ruin/space/has_grav/powered/virtual_domain)
"J" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien/queen/large{
/mob/living/basic/alien/queen/large{
desc = "A gigantic alien who is in charge of the hive and all of its loyal servants.";
name = "alien queen";
pixel_x = -16;
plants_off = 1
can_plant_weeds = 0
},
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/space/has_grav/powered/virtual_domain)
@@ -218,7 +218,7 @@
/area/ruin/space/has_grav/powered/virtual_domain)
"P" = (
/obj/structure/alien/weeds/node,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/space/has_grav/powered/virtual_domain)
"Q" = (
@@ -228,7 +228,7 @@
/area/ruin/space/has_grav/powered/virtual_domain)
"S" = (
/obj/structure/alien/weeds,
/mob/living/simple_animal/hostile/alien,
/mob/living/basic/alien,
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/ruin/space/has_grav/powered/virtual_domain)
"T" = (

View File

@@ -123,7 +123,7 @@ GLOBAL_LIST_INIT(turfs_pass_meteor, typecacheof(list(
#define islarva(A) (istype(A, /mob/living/carbon/alien/larva))
#define isalienadult(A) (istype(A, /mob/living/carbon/alien/adult) || istype(A, /mob/living/simple_animal/hostile/alien))
#define isalienadult(A) (istype(A, /mob/living/carbon/alien/adult) || istype(A, /mob/living/basic/alien))
#define isalienhunter(A) (istype(A, /mob/living/carbon/alien/adult/hunter))

View File

@@ -6,14 +6,15 @@
. = ..()
var/mob/living/living_pawn = controller.pawn
if(LAZYLEN(living_pawn.do_afters))
return
return FALSE
if(SPT_PROB(walk_chance, seconds_per_tick) && (living_pawn.mobility_flags & MOBILITY_MOVE) && isturf(living_pawn.loc) && !living_pawn.pulledby)
var/move_dir = pick(GLOB.alldirs)
var/turf/destination_turf = get_step(living_pawn, move_dir)
if(!destination_turf?.can_cross_safely(living_pawn))
return
return FALSE
living_pawn.Move(destination_turf, move_dir)
return TRUE
/datum/idle_behavior/idle_random_walk/less_walking
walk_chance = 10

View File

@@ -151,9 +151,9 @@
/datum/modular_mob_segment/xenos
mobs = list(
/mob/living/simple_animal/hostile/alien,
/mob/living/simple_animal/hostile/alien/sentinel,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/basic/alien,
/mob/living/basic/alien/sentinel,
/mob/living/basic/alien/drone,
)
#undef SPAWN_ALWAYS

View File

@@ -1424,3 +1424,58 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava)
buckle_to.buckle_mob(mob, force = force_buckle)
return INITIALIZE_HINT_QDEL
///Basic mob flag helpers for things like deleting on death.
/obj/effect/mapping_helpers/basic_mob_flags
name = "Basic mob flags helper"
desc = "Used to apply basic_mob_flags to basic mobs on the same turf."
late = TRUE
///The basic mob flag that we're adding to all basic mobs on the turf.
var/flag_to_give
/obj/effect/mapping_helpers/basic_mob_flags/Initialize(mapload)
. = ..()
if(!mapload)
log_mapping("[src] spawned outside of mapload!")
return INITIALIZE_HINT_QDEL
/obj/effect/mapping_helpers/basic_mob_flags/LateInitialize()
. = ..()
var/had_any_mobs = FALSE
for(var/mob/living/basic/basic_mobs in loc)
had_any_mobs = TRUE
basic_mobs.basic_mob_flags |= flag_to_give
if(!had_any_mobs)
CRASH("[src] called on a turf without any basic mobs.")
qdel(src)
/obj/effect/mapping_helpers/basic_mob_flags/del_on_death
name = "Basic mob del on death flag helper"
icon_state = "basic_mob_del_on_death"
flag_to_give = DEL_ON_DEATH
/obj/effect/mapping_helpers/basic_mob_flags/flip_on_death
name = "Basic mob flip on death flag helper"
icon_state = "basic_mob_flip_on_death"
flag_to_give = FLIP_ON_DEATH
/obj/effect/mapping_helpers/basic_mob_flags/remain_dense_while_dead
name = "Basic mob remain dense while dead flag helper"
icon_state = "basic_mob_remain_dense_while_dead"
flag_to_give = REMAIN_DENSE_WHILE_DEAD
/obj/effect/mapping_helpers/basic_mob_flags/flammable_mob
name = "Basic mob flammable flag helper"
icon_state = "basic_mob_flammable"
flag_to_give = FLAMMABLE_MOB
/obj/effect/mapping_helpers/basic_mob_flags/immune_to_fists
name = "Basic mob immune to fists flag helper"
icon_state = "basic_mob_immune_to_fists"
flag_to_give = IMMUNE_TO_FISTS
/obj/effect/mapping_helpers/basic_mob_flags/immune_to_getting_wet
name = "Basic mob immune to getting wet flag helper"
icon_state = "basic_mob_immune_to_getting_wet"
flag_to_give = IMMUNE_TO_GETTING_WET

View File

@@ -0,0 +1,84 @@
/mob/living/basic/alien
name = "alien hunter"
desc = "Hiss!"
icon = 'icons/mob/nonhuman-player/alien.dmi'
icon_state = "alienh"
icon_living = "alienh"
icon_dead = "alienh_dead"
icon_gib = "syndicate_gib"
gender = FEMALE
status_flags = CANPUSH
butcher_results = list(
/obj/item/food/meat/slab/xeno = 4,
/obj/item/stack/sheet/animalhide/xeno = 1,
)
maxHealth = 125
health = 125
bubble_icon = "alien"
combat_mode = TRUE
faction = list(ROLE_ALIEN)
// Going for a dark purple here
lighting_cutoff_red = 30
lighting_cutoff_green = 15
lighting_cutoff_blue = 50
unique_name = TRUE
basic_mob_flags = FLAMMABLE_MOB
speed = 0
obj_damage = 60
speak_emote = list("hisses")
melee_damage_lower = 25
melee_damage_upper = 25
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
attack_sound = 'sound/weapons/bladeslice.ogg'
attack_vis_effect = ATTACK_EFFECT_CLAW
gold_core_spawnable = NO_SPAWN
death_sound = 'sound/voice/hiss6.ogg'
death_message = "lets out a waning guttural screech, green blood bubbling from its maw..."
habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = FALSE
unsuitable_heat_damage = 20
ai_controller = /datum/ai_controller/basic_controller/alien
///List of loot items to drop when deleted, if this is set then we apply DEL_ON_DEATH
var/list/loot
///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)
. = ..()
if(length(loot))
basic_mob_flags |= DEL_ON_DEATH
loot = string_list(loot)
AddElement(/datum/element/death_drops, loot)
AddElement(/datum/element/footstep, footstep_type = FOOTSTEP_MOB_CLAW)
/mob/living/basic/alien/get_butt_sprite()
return BUTT_SPRITE_XENOMORPH
///Places alien weeds on the turf the mob is currently standing on.
/mob/living/basic/alien/proc/place_weeds()
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
return
visible_message(span_alertalien("[src] plants some alien weeds!"))
new /obj/structure/alien/weeds/node(loc)
///Lays an egg on the turf the mob is currently standing on.
/mob/living/basic/alien/proc/lay_alien_egg()
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/egg) in get_turf(src))
return
visible_message(span_alertalien("[src] lays an egg!"))
new /obj/structure/alien/egg(loc)

View File

@@ -0,0 +1,73 @@
/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/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_melee_attack_subtree,
)
movement_delay = 0.8 SECONDS
/datum/ai_controller/basic_controller/alien/sentinel
planning_subtrees = list(
/datum/ai_planning_subtree/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_ranged_attack_subtree/alien,
)
/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/simple_find_target,
/datum/ai_planning_subtree/attack_obstacle_in_path,
/datum/ai_planning_subtree/basic_ranged_attack_subtree/alien,
)
/**
* Alien projectile
* Try to avoid friendly fire, and has a 3 second delay.
*/
/datum/ai_planning_subtree/basic_ranged_attack_subtree/alien
ranged_attack_behavior = /datum/ai_behavior/basic_ranged_attack/alien
/datum/ai_behavior/basic_ranged_attack/alien
action_cooldown = 3 SECONDS
required_distance = 3
avoid_friendly_fire = TRUE
/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.place_weeds()
/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_alien_egg()

View File

@@ -0,0 +1,9 @@
/mob/living/basic/alien/drone
name = "alien drone"
icon_state = "aliend"
icon_living = "aliend"
icon_dead = "aliend_dead"
melee_damage_lower = 15
melee_damage_upper = 15
ai_controller = /datum/ai_controller/basic_controller/alien/drone

View File

@@ -0,0 +1,60 @@
/mob/living/basic/alien/maid
name = "lusty xenomorph maid"
melee_damage_lower = 0
melee_damage_upper = 0
combat_mode = FALSE
friendly_verb_continuous = "caresses"
friendly_verb_simple = "caress"
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = HOSTILE_SPAWN
icon_state = "maid"
icon_living = "maid"
icon_dead = "maid_dead"
/mob/living/basic/alien/maid/Initialize(mapload)
. = ..()
AddElement(/datum/element/cleaning)
RegisterSignal(src, COMSIG_HOSTILE_PRE_ATTACKINGTARGET, PROC_REF(pre_attack))
///Handles the maid attacking other players, cancelling the attack to clean up instead.
/mob/living/basic/alien/maid/proc/pre_attack(mob/living/puncher, atom/target)
SIGNAL_HANDLER
target.wash(CLEAN_SCRUB)
if(istype(target, /obj/effect/decal/cleanable))
visible_message(span_notice("[src] cleans up \the [target]."))
else
visible_message(span_notice("[src] polishes \the [target]."))
return COMPONENT_HOSTILE_NO_ATTACK
/**
* Barmaid special type
* Spawns on emergency shuttles, has access to them and godmode while inside of them.
*/
/mob/living/basic/alien/maid/barmaid
gold_core_spawnable = NO_SPAWN
name = "Barmaid"
desc = "A barmaid, a maiden found in a bar."
pass_flags = PASSTABLE
unique_name = FALSE
initial_language_holder = /datum/language_holder/universal
ai_controller = null //they don't have their own AI and can uniquely only be controlled by players.
///The access card we use to store access to the emergency shuttle.
var/obj/item/card/id/access_card
/mob/living/basic/alien/maid/barmaid/Initialize(mapload)
. = ..()
// Simple bot ID card that can hold all accesses. Someone turn access into a component at some point, please.
access_card = new /obj/item/card/id/advanced/simple_bot(src)
var/datum/id_trim/job/cap_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/captain]
access_card.add_access(cap_trim.access + cap_trim.wildcard_access + list(ACCESS_CENT_BAR))
ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE)
/mob/living/basic/alien/maid/barmaid/Destroy()
QDEL_NULL(access_card)
return ..()

View File

@@ -0,0 +1,40 @@
/mob/living/basic/alien/queen
name = "alien queen"
icon_state = "alienq"
icon_living = "alienq"
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.
unique_name = FALSE
ai_controller = /datum/ai_controller/basic_controller/alien/queen
///The type of projectile that fires from attacks.
var/projectiletype = /obj/projectile/neurotoxin/damaging
///The sound that plays when the projectile is fired.
var/projectilesound = 'sound/weapons/pierce.ogg'
/mob/living/basic/alien/queen/Initialize(mapload)
. = ..()
AddComponent(/datum/component/ranged_attacks, projectile_type = projectiletype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS)
/mob/living/basic/alien/queen/large
name = "alien empress"
icon = 'icons/mob/nonhuman-player/alienqueen.dmi'
icon_state = "alienq"
icon_living = "alienq"
icon_dead = "alienq_dead"
health_doll_icon = "alienq"
bubble_icon = "alienroyal"
maxHealth = 400
health = 400
butcher_results = list(
/obj/item/food/meat/slab/xeno = 10,
/obj/item/stack/sheet/animalhide/xeno = 2,
)
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = NO_SPAWN

View File

@@ -0,0 +1,20 @@
/mob/living/basic/alien/sentinel
name = "alien sentinel"
icon_state = "aliens"
icon_living = "aliens"
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
///The type of projectile that fires from attacks.
var/projectiletype = /obj/projectile/neurotoxin/damaging
///The sound that plays when the projectile is fired.
var/projectilesound = 'sound/weapons/pierce.ogg'
/mob/living/basic/alien/sentinel/Initialize(mapload)
. = ..()
AddComponent(/datum/component/ranged_attacks, projectile_type = projectiletype, projectile_sound = projectilesound, cooldown_time = 1 SECONDS)

View File

@@ -69,11 +69,6 @@ GLOBAL_LIST_INIT(strippable_alien_humanoid_items, create_strippable_list(list(
playsound(get_turf(src), pick('sound/voice/lowHiss2.ogg', 'sound/voice/lowHiss3.ogg', 'sound/voice/lowHiss4.ogg'), 50, FALSE, -5)
return ..()
/mob/living/carbon/alien/adult/set_name()
if(numba)
name = "[name] ([numba])"
real_name = name
/mob/living/carbon/alien/adult/setGrabState(newstate)
if(newstate == grab_state)
return

View File

@@ -1453,7 +1453,7 @@
else
picked_xeno_type = pick(
/mob/living/carbon/alien/adult/hunter,
/mob/living/simple_animal/hostile/alien/sentinel,
/mob/living/basic/alien/sentinel,
)
new_mob = new picked_xeno_type(loc)
@@ -1790,7 +1790,7 @@ GLOBAL_LIST_EMPTY(fire_appearances)
if(M.can_be_held && U.pulling == M)
M.mob_try_pickup(U)//blame kevinz
return//dont open the mobs inventory if you are picking them up
. = ..()
return ..()
/mob/living/proc/mob_pickup(mob/living/user)
var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, held_state, head_icon, held_lh, held_rh, worn_slot_flags)
@@ -1798,6 +1798,7 @@ GLOBAL_LIST_EMPTY(fire_appearances)
user.put_in_hands(holder)
/mob/living/proc/set_name()
if(!numba)
numba = rand(1, 1000)
name = "[name] ([numba])"
real_name = name

View File

@@ -1,173 +0,0 @@
/mob/living/simple_animal/hostile/alien
name = "alien hunter"
desc = "Hiss!"
icon = 'icons/mob/nonhuman-player/alien.dmi'
icon_state = "alienh"
icon_living = "alienh"
icon_dead = "alienh_dead"
icon_gib = "syndicate_gib"
gender = FEMALE
speed = 0
butcher_results = list(/obj/item/food/meat/slab/xeno = 4,
/obj/item/stack/sheet/animalhide/xeno = 1)
maxHealth = 125
health = 125
harm_intent_damage = 5
obj_damage = 60
melee_damage_lower = 25
melee_damage_upper = 25
attack_verb_continuous = "slashes"
attack_verb_simple = "slash"
speak_emote = list("hisses")
bubble_icon = "alien"
combat_mode = TRUE
attack_sound = 'sound/weapons/bladeslice.ogg'
attack_vis_effect = ATTACK_EFFECT_CLAW
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
faction = list(ROLE_ALIEN)
status_flags = CANPUSH
minbodytemp = 0
unsuitable_heat_damage = 20
// Going for a dark purple here
lighting_cutoff_red = 30
lighting_cutoff_green = 15
lighting_cutoff_blue = 50
unique_name = TRUE
gold_core_spawnable = NO_SPAWN
death_sound = 'sound/voice/hiss6.ogg'
death_message = "lets out a waning guttural screech, green blood bubbling from its maw..."
footstep_type = FOOTSTEP_MOB_CLAW
/mob/living/simple_animal/hostile/alien/drone
name = "alien drone"
icon_state = "aliend"
icon_living = "aliend"
icon_dead = "aliend_dead"
melee_damage_lower = 15
melee_damage_upper = 15
var/plant_cooldown = 30
var/plants_off = 0
/mob/living/simple_animal/hostile/alien/drone/handle_automated_action()
if(!..()) //AIStatus is off
return
plant_cooldown--
if(AIStatus == AI_IDLE)
if(!plants_off && prob(10) && plant_cooldown <= 0)
plant_cooldown = initial(plant_cooldown)
SpreadPlants()
/mob/living/simple_animal/hostile/alien/sentinel
name = "alien sentinel"
icon_state = "aliens"
icon_living = "aliens"
icon_dead = "aliens_dead"
health = 150
maxHealth = 150
melee_damage_lower = 15
melee_damage_upper = 15
ranged = 1
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/projectile/neurotoxin/damaging
projectilesound = 'sound/weapons/pierce.ogg'
/mob/living/simple_animal/hostile/alien/queen
name = "alien queen"
icon_state = "alienq"
icon_living = "alienq"
icon_dead = "alienq_dead"
health = 250
maxHealth = 250
melee_damage_lower = 15
melee_damage_upper = 15
ranged = 1
retreat_distance = 5
minimum_distance = 5
move_to_delay = 4
butcher_results = list(/obj/item/food/meat/slab/xeno = 4,
/obj/item/stack/sheet/animalhide/xeno = 1)
projectiletype = /obj/projectile/neurotoxin/damaging
projectilesound = 'sound/weapons/pierce.ogg'
status_flags = 0
unique_name = FALSE
var/sterile = 1
var/plants_off = 0
var/egg_cooldown = 30
var/plant_cooldown = 30
/mob/living/simple_animal/hostile/alien/queen/handle_automated_action()
if(!..()) //AIStatus is off
return
egg_cooldown--
plant_cooldown--
if(AIStatus == AI_IDLE)
if(!plants_off && prob(10) && plant_cooldown <= 0)
plant_cooldown = initial(plant_cooldown)
SpreadPlants()
if(!sterile && prob(10) && egg_cooldown <= 0)
egg_cooldown = initial(egg_cooldown)
LayEggs()
/mob/living/simple_animal/hostile/alien/get_butt_sprite()
return BUTT_SPRITE_XENOMORPH
/mob/living/simple_animal/hostile/alien/proc/SpreadPlants()
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/weeds/node) in get_turf(src))
return
visible_message(span_alertalien("[src] plants some alien weeds!"))
new /obj/structure/alien/weeds/node(loc)
/mob/living/simple_animal/hostile/alien/proc/LayEggs()
if(!isturf(loc) || isspaceturf(loc))
return
if(locate(/obj/structure/alien/egg) in get_turf(src))
return
visible_message(span_alertalien("[src] lays an egg!"))
new /obj/structure/alien/egg(loc)
/mob/living/simple_animal/hostile/alien/queen/large
name = "alien empress"
icon = 'icons/mob/nonhuman-player/alienqueen.dmi'
icon_state = "alienq"
icon_living = "alienq"
icon_dead = "alienq_dead"
health_doll_icon = "alienq"
bubble_icon = "alienroyal"
move_to_delay = 4
maxHealth = 400
health = 400
butcher_results = list(/obj/item/food/meat/slab/xeno = 10,
/obj/item/stack/sheet/animalhide/xeno = 2)
mob_size = MOB_SIZE_LARGE
gold_core_spawnable = NO_SPAWN
/mob/living/simple_animal/hostile/alien/maid
name = "lusty xenomorph maid"
melee_damage_lower = 0
melee_damage_upper = 0
combat_mode = FALSE
friendly_verb_continuous = "caresses"
friendly_verb_simple = "caress"
obj_damage = 0
environment_smash = ENVIRONMENT_SMASH_NONE
gold_core_spawnable = HOSTILE_SPAWN
icon_state = "maid"
icon_living = "maid"
icon_dead = "maid_dead"
/mob/living/simple_animal/hostile/alien/maid/Initialize(mapload)
. = ..()
AddElement(/datum/element/cleaning)
/mob/living/simple_animal/hostile/alien/maid/AttackingTarget(atom/attacked_target)
if(ismovable(target))
target.wash(CLEAN_SCRUB)
if(istype(target, /obj/effect/decal/cleanable))
visible_message(span_notice("[src] cleans up \the [target]."))
else
visible_message(span_notice("[src] polishes \the [target]."))
return TRUE

View File

@@ -167,31 +167,6 @@
. = ..()
AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE)
/mob/living/simple_animal/hostile/alien/maid/barmaid
gold_core_spawnable = NO_SPAWN
name = "Barmaid"
desc = "A barmaid, a maiden found in a bar."
pass_flags = PASSTABLE
unique_name = FALSE
AIStatus = AI_OFF
stop_automated_movement = TRUE
initial_language_holder = /datum/language_holder/universal
/mob/living/simple_animal/hostile/alien/maid/barmaid/Initialize(mapload)
. = ..()
// Simple bot ID card that can hold all accesses. Someone turn access into a component at some point, please.
access_card = new /obj/item/card/id/advanced/simple_bot(src)
var/datum/id_trim/job/cap_trim = SSid_access.trim_singletons_by_path[/datum/id_trim/job/captain]
access_card.add_access(cap_trim.access + cap_trim.wildcard_access + list(ACCESS_CENT_BAR))
ADD_TRAIT(access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT)
AddComponentFrom(ROUNDSTART_TRAIT, /datum/component/area_based_godmode, area_type = /area/shuttle/escape, allow_area_subtypes = TRUE)
/mob/living/simple_animal/hostile/alien/maid/barmaid/Destroy()
qdel(access_card)
. = ..()
// Bar table, a wooden table that kicks you in a direction if you're not
// barstaff (defined as someone who was a roundstart bartender or someone
// with CENTCOM_BARSTAFF)

View File

@@ -24,13 +24,6 @@
/mob/living/simple_animal/bot/secbot/pingsky,
/mob/living/simple_animal/bot/vibebot,
/mob/living/simple_animal/hostile,
/mob/living/simple_animal/hostile/alien,
/mob/living/simple_animal/hostile/alien/drone,
/mob/living/simple_animal/hostile/alien/maid,
/mob/living/simple_animal/hostile/alien/maid/barmaid,
/mob/living/simple_animal/hostile/alien/queen,
/mob/living/simple_animal/hostile/alien/queen/large,
/mob/living/simple_animal/hostile/alien/sentinel,
/mob/living/simple_animal/hostile/asteroid,
/mob/living/simple_animal/hostile/asteroid/curseblob,
/mob/living/simple_animal/hostile/asteroid/elite,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -4559,6 +4559,12 @@
#include "code\modules\mob\living\basic\festivus_pole.dm"
#include "code\modules\mob\living\basic\health_adjustment.dm"
#include "code\modules\mob\living\basic\tree.dm"
#include "code\modules\mob\living\basic\alien\_alien.dm"
#include "code\modules\mob\living\basic\alien\alien_ai.dm"
#include "code\modules\mob\living\basic\alien\drone.dm"
#include "code\modules\mob\living\basic\alien\maid.dm"
#include "code\modules\mob\living\basic\alien\queen.dm"
#include "code\modules\mob\living\basic\alien\sentinel.dm"
#include "code\modules\mob\living\basic\blob_minions\blob_ai.dm"
#include "code\modules\mob\living\basic\blob_minions\blob_mob.dm"
#include "code\modules\mob\living\basic\blob_minions\blob_spore.dm"
@@ -5003,7 +5009,6 @@
#include "code\modules\mob\living\simple_animal\bot\vibebot.dm"
#include "code\modules\mob\living\simple_animal\friendly\gondola.dm"
#include "code\modules\mob\living\simple_animal\friendly\pet.dm"
#include "code\modules\mob\living\simple_animal\hostile\alien.dm"
#include "code\modules\mob\living\simple_animal\hostile\dark_wizard.dm"
#include "code\modules\mob\living\simple_animal\hostile\hostile.dm"
#include "code\modules\mob\living\simple_animal\hostile\illusion.dm"

View File

@@ -0,0 +1,4 @@
# repating all subtypes of xeno (and snipe base type) to basic mob.
/mob/living/simple_animal/hostile/alien/@SUBTYPES : /mob/living/basic/alien/@SUBTYPES{@OLD}
/mob/living/simple_animal/hostile/alien : /mob/living/basic/alien{@OLD}