From 2163f605274b0ff20b51fab91cec8a30f76d8521 Mon Sep 17 00:00:00 2001 From: John Willard <53777086+JohnFulpWillard@users.noreply.github.com> Date: Tue, 26 Mar 2024 17:28:58 -0400 Subject: [PATCH] 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 :cl: refactor: Xenomorphs (Lavaland & Oldstation ones) are now basic mobs. /:cl: --- .../LavaRuins/lavaland_surface_xeno_nest.dmm | 22 +-- .../SpaceRuins/infested_frigate.dmm | 38 ++-- _maps/RandomRuins/SpaceRuins/oldstation.dmm | 22 +-- _maps/RandomZLevels/moonoutpost19.dmm | 34 ++-- _maps/shuttles/emergency_bar.dmm | 2 +- _maps/shuttles/emergency_cruise.dmm | 2 +- _maps/virtual_domains/xeno_nest.dmm | 16 +- code/__DEFINES/is_helpers.dm | 2 +- .../ai/idle_behaviors/idle_random_walk.dm | 5 +- .../virtual_domain/modular_mob_segment.dm | 6 +- code/modules/mapping/mapping_helpers.dm | 63 ++++++- code/modules/mob/living/basic/alien/_alien.dm | 84 +++++++++ .../mob/living/basic/alien/alien_ai.dm | 73 ++++++++ code/modules/mob/living/basic/alien/drone.dm | 9 + code/modules/mob/living/basic/alien/maid.dm | 60 ++++++ code/modules/mob/living/basic/alien/queen.dm | 40 ++++ .../mob/living/basic/alien/sentinel.dm | 20 ++ .../mob/living/carbon/alien/adult/adult.dm | 5 - code/modules/mob/living/living.dm | 7 +- .../mob/living/simple_animal/hostile/alien.dm | 173 ------------------ code/modules/shuttle/special.dm | 25 --- .../unit_tests/simple_animal_freeze.dm | 7 - icons/effects/mapping_helpers.dmi | Bin 26231 -> 26667 bytes tgstation.dme | 7 +- .../UpdatePaths/Scripts/82187_basic_xenos.txt | 4 + 25 files changed, 432 insertions(+), 294 deletions(-) create mode 100644 code/modules/mob/living/basic/alien/_alien.dm create mode 100644 code/modules/mob/living/basic/alien/alien_ai.dm create mode 100644 code/modules/mob/living/basic/alien/drone.dm create mode 100644 code/modules/mob/living/basic/alien/maid.dm create mode 100644 code/modules/mob/living/basic/alien/queen.dm create mode 100644 code/modules/mob/living/basic/alien/sentinel.dm delete mode 100644 code/modules/mob/living/simple_animal/hostile/alien.dm create mode 100644 tools/UpdatePaths/Scripts/82187_basic_xenos.txt diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm index 3cf1169c0bb..e7a854d6bde 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_xeno_nest.dmm @@ -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) diff --git a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm index 7be584aa608..542f64d7abd 100644 --- a/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm +++ b/_maps/RandomRuins/SpaceRuins/infested_frigate.dmm @@ -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, diff --git a/_maps/RandomRuins/SpaceRuins/oldstation.dmm b/_maps/RandomRuins/SpaceRuins/oldstation.dmm index a99d5cccb83..60088fb274d 100644 --- a/_maps/RandomRuins/SpaceRuins/oldstation.dmm +++ b/_maps/RandomRuins/SpaceRuins/oldstation.dmm @@ -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, diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index 4e83b077751..86c152348f8 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -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" diff --git a/_maps/shuttles/emergency_bar.dmm b/_maps/shuttles/emergency_bar.dmm index e547390ded9..848f487020f 100644 --- a/_maps/shuttles/emergency_bar.dmm +++ b/_maps/shuttles/emergency_bar.dmm @@ -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) diff --git a/_maps/shuttles/emergency_cruise.dmm b/_maps/shuttles/emergency_cruise.dmm index aa4364858e1..81328a07751 100644 --- a/_maps/shuttles/emergency_cruise.dmm +++ b/_maps/shuttles/emergency_cruise.dmm @@ -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" = ( diff --git a/_maps/virtual_domains/xeno_nest.dmm b/_maps/virtual_domains/xeno_nest.dmm index 047bb417928..907436758c7 100644 --- a/_maps/virtual_domains/xeno_nest.dmm +++ b/_maps/virtual_domains/xeno_nest.dmm @@ -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" = ( diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 8271bb725d1..91c5c03b74f 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -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)) diff --git a/code/datums/ai/idle_behaviors/idle_random_walk.dm b/code/datums/ai/idle_behaviors/idle_random_walk.dm index 8924da5c30b..c27caa50072 100644 --- a/code/datums/ai/idle_behaviors/idle_random_walk.dm +++ b/code/datums/ai/idle_behaviors/idle_random_walk.dm @@ -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 diff --git a/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm b/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm index ab691274bc5..c0e017a0b9f 100644 --- a/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm +++ b/code/modules/bitrunning/virtual_domain/modular_mob_segment.dm @@ -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 diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index faaaf9e4206..e601256a8b6 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -1414,13 +1414,68 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) continue if(isliving(possible_buckle)) - mobs += possible_buckle - + mobs += possible_buckle + if(isnull(buckle_to)) log_mapping("[type] at [x] [y] [z] did not find anything to buckle to") return INITIALIZE_HINT_QDEL - + for(var/mob/living/mob as anything in mobs) 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 diff --git a/code/modules/mob/living/basic/alien/_alien.dm b/code/modules/mob/living/basic/alien/_alien.dm new file mode 100644 index 00000000000..d809e7c292f --- /dev/null +++ b/code/modules/mob/living/basic/alien/_alien.dm @@ -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) diff --git a/code/modules/mob/living/basic/alien/alien_ai.dm b/code/modules/mob/living/basic/alien/alien_ai.dm new file mode 100644 index 00000000000..a06ec4ea943 --- /dev/null +++ b/code/modules/mob/living/basic/alien/alien_ai.dm @@ -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() diff --git a/code/modules/mob/living/basic/alien/drone.dm b/code/modules/mob/living/basic/alien/drone.dm new file mode 100644 index 00000000000..80c4c61dddc --- /dev/null +++ b/code/modules/mob/living/basic/alien/drone.dm @@ -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 diff --git a/code/modules/mob/living/basic/alien/maid.dm b/code/modules/mob/living/basic/alien/maid.dm new file mode 100644 index 00000000000..decfe5736ce --- /dev/null +++ b/code/modules/mob/living/basic/alien/maid.dm @@ -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 ..() diff --git a/code/modules/mob/living/basic/alien/queen.dm b/code/modules/mob/living/basic/alien/queen.dm new file mode 100644 index 00000000000..f2d787743a2 --- /dev/null +++ b/code/modules/mob/living/basic/alien/queen.dm @@ -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 + diff --git a/code/modules/mob/living/basic/alien/sentinel.dm b/code/modules/mob/living/basic/alien/sentinel.dm new file mode 100644 index 00000000000..8f5ae815c5f --- /dev/null +++ b/code/modules/mob/living/basic/alien/sentinel.dm @@ -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) diff --git a/code/modules/mob/living/carbon/alien/adult/adult.dm b/code/modules/mob/living/carbon/alien/adult/adult.dm index bbacffd4f6f..d2ee7432b3c 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult.dm @@ -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 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 57d06a6d92d..ac6a5aac059 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -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,7 +1798,8 @@ GLOBAL_LIST_EMPTY(fire_appearances) user.put_in_hands(holder) /mob/living/proc/set_name() - numba = rand(1, 1000) + if(!numba) + numba = rand(1, 1000) name = "[name] ([numba])" real_name = name diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm deleted file mode 100644 index 8ce6d28f2ab..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ /dev/null @@ -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 diff --git a/code/modules/shuttle/special.dm b/code/modules/shuttle/special.dm index 13f3c5fdf30..0617b9696a7 100644 --- a/code/modules/shuttle/special.dm +++ b/code/modules/shuttle/special.dm @@ -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) diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index 41b5cdf4767..736669f76d4 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -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, diff --git a/icons/effects/mapping_helpers.dmi b/icons/effects/mapping_helpers.dmi index 351bb5f00c4aa267d2325891754135e0d6ce89c1..8bfe0af0854d4a3935481a4bf7f2d044ced2406c 100644 GIT binary patch delta 3287 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 V*qEUf!*l=u002ovPDHLkV1gpesKWpN diff --git a/tgstation.dme b/tgstation.dme index 5358a63eff1..8552083073a 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -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" diff --git a/tools/UpdatePaths/Scripts/82187_basic_xenos.txt b/tools/UpdatePaths/Scripts/82187_basic_xenos.txt new file mode 100644 index 00000000000..6821a136258 --- /dev/null +++ b/tools/UpdatePaths/Scripts/82187_basic_xenos.txt @@ -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}