diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm
index 022c6011a7a..00633e438b2 100644
--- a/code/__defines/mobs.dm
+++ b/code/__defines/mobs.dm
@@ -272,8 +272,6 @@
#define SPECIES_HUMAN "Human"
#define SPECIES_MONKEY "Monkey"
-#define SPECIES_ALIEN "Humanoid"
-#define SPECIES_GOLEM "Golem"
#define SURGERY_CLOSED 0
#define SURGERY_OPEN 1
diff --git a/code/controllers/subsystems/initialization/modpacks.dm b/code/controllers/subsystems/initialization/modpacks.dm
index f2f6c65a2e6..7a44aec55c6 100644
--- a/code/controllers/subsystems/initialization/modpacks.dm
+++ b/code/controllers/subsystems/initialization/modpacks.dm
@@ -6,7 +6,7 @@ SUBSYSTEM_DEF(modpacks)
// Compiled modpack information.
var/list/default_submap_whitelisted_species = list()
- var/list/default_submap_blacklisted_species = list(SPECIES_ALIEN, SPECIES_GOLEM)
+ var/list/default_submap_blacklisted_species = list()
var/list/modpack_nanoui_directories = list()
/datum/controller/subsystem/modpacks/Initialize()
diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm
index 1e9a08082aa..a600a4a68c5 100644
--- a/code/game/objects/random/random.dm
+++ b/code/game/objects/random/random.dm
@@ -24,6 +24,8 @@
return
var/type_to_spawn = item_to_spawn()
+ if(!type_to_spawn)
+ return
if(islist(type_to_spawn))
for(var/spawn_type in type_to_spawn)
LAZYADD(., create_instance(spawn_type, loc))
diff --git a/code/modules/species/outsider/random.dm b/code/modules/species/outsider/random.dm
deleted file mode 100644
index af9094b53ca..00000000000
--- a/code/modules/species/outsider/random.dm
+++ /dev/null
@@ -1,142 +0,0 @@
-/decl/bodytype/alium
- name = "humanoid"
- bodytype_category = BODYTYPE_HUMANOID
- icon_base = 'icons/mob/human_races/species/humanoid/body.dmi'
- bandages_icon = 'icons/mob/bandage.dmi'
- limb_blend = ICON_MULTIPLY
- appearance_flags = HAS_SKIN_COLOR
- body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS
- uid = "bodytype_alium"
-
-/decl/bodytype/alium/Initialize()
- if(prob(10))
- movement_slowdown += pick(-1,1)
- if(prob(5))
- body_flags |= BODY_FLAG_NO_PAIN
- base_color = RANDOM_RGB
- MULT_BY_RANDOM_COEF(eye_flash_mod, 0.5, 1.5)
- eye_darksight_range = rand(1,8)
- var/temp_comfort_shift = rand(-50,50)
- cold_level_1 += temp_comfort_shift
- cold_level_2 += temp_comfort_shift
- cold_level_3 += temp_comfort_shift
- heat_level_1 += temp_comfort_shift
- heat_level_2 += temp_comfort_shift
- heat_level_3 += temp_comfort_shift
- heat_discomfort_level += temp_comfort_shift
- cold_discomfort_level += temp_comfort_shift
- . = ..()
-
-/decl/species/alium
- name = SPECIES_ALIEN
- name_plural = "Humanoids"
- description = "Some alien humanoid species, unknown to humanity. How exciting."
- rarity_value = 5
- hidden_from_codex = TRUE
-
- spawn_flags = SPECIES_IS_RESTRICTED
-
- available_bodytypes = list(/decl/bodytype/alium)
-
- force_background_info = list(
- /decl/background_category/heritage = /decl/background_detail/heritage/hidden/alium
- )
-
- exertion_effect_chance = 10
- exertion_hydration_scale = 1
- exertion_reagent_scale = 1
- exertion_reagent_path = /decl/material/liquid/lactate
- exertion_emotes_biological = list(
- /decl/emote/exertion/biological,
- /decl/emote/exertion/biological/breath,
- /decl/emote/exertion/biological/pant
- )
- var/blood_color
-
-/decl/species/alium/Initialize()
-
- //Coloring
- blood_color = RANDOM_RGB
- flesh_color = RANDOM_RGB
-
- //Combat stats
- MULT_BY_RANDOM_COEF(total_health, 0.8, 1.2)
- MULT_BY_RANDOM_COEF(brute_mod, 0.5, 1.5)
- MULT_BY_RANDOM_COEF(burn_mod, 0.8, 1.2)
- MULT_BY_RANDOM_COEF(oxy_mod, 0.5, 1.5)
- MULT_BY_RANDOM_COEF(toxins_mod, 0, 2)
- MULT_BY_RANDOM_COEF(radiation_mod, 0, 2)
-
- if(brute_mod < 1 && prob(40))
- species_flags |= SPECIES_FLAG_NO_MINOR_CUT
- if(brute_mod < 0.9 && prob(40))
- species_flags |= SPECIES_FLAG_NO_EMBED
- if(toxins_mod < 0.1)
- species_flags |= SPECIES_FLAG_NO_POISON
-
- //Gastronomic traits
- taste_sensitivity = pick(TASTE_HYPERSENSITIVE, TASTE_SENSITIVE, TASTE_DULL, TASTE_NUMB)
- gluttonous = pick(0, GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING)
- stomach_capacity = 5 * stomach_capacity
- if(prob(20))
- gluttonous |= pick(GLUT_ITEM_TINY, GLUT_ITEM_NORMAL, GLUT_ITEM_ANYTHING, GLUT_PROJECTILE_VOMIT)
- if(gluttonous & GLUT_ITEM_ANYTHING)
- stomach_capacity += ITEM_SIZE_HUGE
-
- //Environment
- var/temp_comfort_shift = rand(-50,50)
- body_temperature += temp_comfort_shift
-
- var/pressure_comfort_shift = rand(-50,50)
- hazard_high_pressure += pressure_comfort_shift
- warning_high_pressure += pressure_comfort_shift
- warning_low_pressure += pressure_comfort_shift
- hazard_low_pressure += pressure_comfort_shift
-
- //Misc traits
- if(prob(40))
- available_pronouns = list(/decl/pronouns)
- if(prob(10))
- species_flags |= SPECIES_FLAG_NO_SLIP
- if(prob(10))
- species_flags |= SPECIES_FLAG_NO_TANGLE
-
- . = ..()
-
-/decl/species/alium/get_species_blood_color(mob/living/human/H)
- if(istype(H) && H.isSynthetic())
- return ..()
- return blood_color
-
-/obj/structure/aliumizer
- name = "alien monolith"
- desc = "Your true form is calling. Use this to become an alien humanoid."
- icon = 'icons/obj/xenoarchaeology.dmi'
- icon_state = "ano51"
- anchored = TRUE
-
-/obj/structure/aliumizer/attack_hand(mob/user)
- SHOULD_CALL_PARENT(FALSE)
- if(!ishuman(user))
- to_chat(user, SPAN_WARNING("You've got no business touching this."))
- return TRUE
- var/decl/species/species = user.get_species()
- if(!species)
- return TRUE
- if(species.name == SPECIES_ALIEN)
- to_chat(user, SPAN_WARNING("You're already a [SPECIES_ALIEN]."))
- return TRUE
- if(alert("Are you sure you want to be an alien?", "Mom Look I'm An Alien!", "Yes", "No") == "No")
- to_chat(user, SPAN_NOTICE("You are now a [SPECIES_ALIEN]!"))
- return TRUE
- if(species.name == SPECIES_ALIEN) //no spamming it to get free implants
- return TRUE
- to_chat(user, "You're now an alien humanoid of some undiscovered species. Make up what lore you want, no one knows a thing about your species! You can check info about your traits with Check Species Info verb in IC tab.")
- to_chat(user, "You can't speak any other languages by default. You can use translator implant that spawns on top of this monolith - it will give you knowledge of any language if you hear it enough times.")
- var/mob/living/human/H = user
- new /obj/item/implanter/translator(get_turf(src))
- H.change_species(SPECIES_ALIEN)
- var/decl/background_detail/background = H.get_background_datum_by_flag(BACKGROUND_FLAG_NAMING)
- H.fully_replace_character_name(background.get_random_name(H, H.gender))
- H.rename_self("Humanoid Alien", 1)
- return TRUE
diff --git a/maps/__map_modpack_compatibility.dm b/maps/__map_modpack_compatibility.dm
new file mode 100644
index 00000000000..288644f46e2
--- /dev/null
+++ b/maps/__map_modpack_compatibility.dm
@@ -0,0 +1,25 @@
+// This must be included before maps and any modpacks that use it.
+// That includes before _map_include.dm.
+
+/// A spawner that can have its path overridden by a modpack, so that maps can have optional modpack compatibility.
+/obj/abstract/modpack_compat
+ abstract_type = /obj/abstract/modpack_compat
+ name = "optional modpack object"
+ desc = "This item type is used to spawn a movable at roundstart, whether a modpack is included or not."
+ icon = 'icons/misc/mark.dmi'
+ icon_state = "rup"
+ var/atom/movable/spawn_object
+
+/obj/abstract/modpack_compat/Initialize()
+ ..()
+ if(ispath(spawn_object))
+ new spawn_object
+ return INITIALIZE_HINT_QDEL
+
+#define OPTIONAL_SPAWNER(TYPE, VALUE) \
+/obj/abstract/modpack_compat/##TYPE { \
+ spawn_object = VALUE; \
+}
+
+/// This spawner is used to optionally spawn the aliumizer if the random aliens modpack is included.
+OPTIONAL_SPAWNER(aliumizer, null)
\ No newline at end of file
diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm
index e6dea707f30..af02fb7233b 100644
--- a/maps/modpack_testing/modpack_testing.dm
+++ b/maps/modpack_testing/modpack_testing.dm
@@ -49,6 +49,7 @@
#include "../../mods/species/serpentid/_serpentid.dme"
#include "../../mods/species/utility_frames/_utility_frames.dme"
#include "../../mods/species/vox/_vox.dme"
+ #include "../../mods/species/random_species/_random_species.dme"
#define USING_MAP_DATUM /datum/map/modpack_testing
diff --git a/mods/content/xenobiology/_xenobiology.dm b/mods/content/xenobiology/_xenobiology.dm
index aa3c42d3480..ab4b0f9da7a 100644
--- a/mods/content/xenobiology/_xenobiology.dm
+++ b/mods/content/xenobiology/_xenobiology.dm
@@ -1,4 +1,9 @@
#define isslime(X) istype(X, /mob/living/slime)
+#define SPECIES_GOLEM "Golem"
/decl/modpack/xenobiology
name = "Xenobiology"
+
+/decl/modpack/xenobiology/initialize()
+ . = ..()
+ SSmodpacks.default_submap_blacklisted_species += SPECIES_GOLEM
diff --git a/mods/content/xenobiology/_xenobiology.dme b/mods/content/xenobiology/_xenobiology.dme
index 1591ea3f458..4057d6b485b 100644
--- a/mods/content/xenobiology/_xenobiology.dme
+++ b/mods/content/xenobiology/_xenobiology.dme
@@ -53,5 +53,7 @@
#include "slime\slime_reagents.dm"
#include "slime\slime_surgery.dm"
#include "slime\slime_update_icon.dm"
+#include "species\golem.dm"
+#include "species\golem_organs.dm"
// END_INCLUDE
#endif
\ No newline at end of file
diff --git a/code/modules/species/station/golem.dm b/mods/content/xenobiology/species/golem.dm
similarity index 100%
rename from code/modules/species/station/golem.dm
rename to mods/content/xenobiology/species/golem.dm
diff --git a/code/modules/organs/internal/species/golem.dm b/mods/content/xenobiology/species/golem_organs.dm
similarity index 100%
rename from code/modules/organs/internal/species/golem.dm
rename to mods/content/xenobiology/species/golem_organs.dm
diff --git a/mods/gamemodes/heist/heist_base.dmm b/mods/gamemodes/heist/heist_base.dmm
index e3015fa4193..5a445c37f40 100644
--- a/mods/gamemodes/heist/heist_base.dmm
+++ b/mods/gamemodes/heist/heist_base.dmm
@@ -112,7 +112,7 @@
/turf/unsimulated/floor/plating,
/area/map_template/syndicate_mothership/raider_base)
"aA" = (
-/obj/structure/aliumizer,
+/obj/abstract/modpack_compat/aliumizer,
/turf/unsimulated/floor/asteroid,
/area/map_template/syndicate_mothership/raider_base)
"aB" = (
diff --git a/mods/gamemodes/ninja/maps/ninja_base.dmm b/mods/gamemodes/ninja/maps/ninja_base.dmm
index 828d006063e..9b4d2bb2ad4 100644
--- a/mods/gamemodes/ninja/maps/ninja_base.dmm
+++ b/mods/gamemodes/ninja/maps/ninja_base.dmm
@@ -2,17 +2,10 @@
"ac" = (
/turf/unsimulated/floor/snow,
/area/map_template/ninja_dojo/dojo)
-"ad" = (
-/turf/unsimulated/floor/snow,
-/area/map_template/ninja_dojo/dojo)
"ae" = (
/obj/effect/floor_decal/asteroid,
/turf/unsimulated/floor/snow,
/area/map_template/ninja_dojo/dojo)
-"af" = (
-/obj/effect/floor_decal/asteroid,
-/turf/unsimulated/floor/snow,
-/area/map_template/ninja_dojo/dojo)
"ag" = (
/obj/structure/flora/tree/dead,
/turf/unsimulated/floor/snow,
@@ -21,10 +14,6 @@
/obj/structure/flora/tree/pine,
/turf/unsimulated/floor/snow,
/area/map_template/ninja_dojo/dojo)
-"ai" = (
-/obj/structure/flora/tree/dead,
-/turf/unsimulated/floor/snow,
-/area/map_template/ninja_dojo/dojo)
"aj" = (
/turf/wall/wood,
/area/map_template/ninja_dojo/dojo)
@@ -156,10 +145,6 @@
"aG" = (
/turf/unsimulated/floor/wood,
/area/map_template/ninja_dojo/dojo)
-"aH" = (
-/obj/structure/flora/tree/pine,
-/turf/unsimulated/floor/snow,
-/area/map_template/ninja_dojo/dojo)
"aI" = (
/obj/structure/iv_drip,
/obj/structure/window/reinforced/crescent,
@@ -500,7 +485,7 @@
/area/map_template/ninja_dojo/dojo)
"bM" = (
/obj/effect/floor_decal/snow,
-/obj/structure/aliumizer,
+/obj/abstract/modpack_compat/aliumizer,
/turf/unsimulated/floor/ice,
/area/map_template/ninja_dojo/dojo)
"bN" = (
@@ -905,7 +890,7 @@
/obj/machinery/door/blast/regular/open{
id_tag = "ninjadoor";
name = "Blast Door";
-
+
},
/turf/unsimulated/floor/dark,
/area/map_template/ninja_dojo/start)
@@ -1103,11 +1088,11 @@ ss
ss
ac
ac
-ad
-ad
ac
ac
-af
+ac
+ac
+ae
ac
ac
ac
@@ -1117,14 +1102,14 @@ ac
ac
ac
ac
-ad
+ac
ag
bn
bo
-ad
+ac
ag
ac
-ad
+ac
bn
bn
bn
@@ -1144,30 +1129,30 @@ ss
"}
(3,1,1) = {"
ss
-ad
-af
-ad
-ad
-ad
-ai
-ad
ac
-ad
-ad
+ae
+ac
+ac
+ac
+ag
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ac
-ad
-ad
-ad
ac
ae
-ad
-ad
+ac
+ac
bo
bn
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
bn
bo
bo
@@ -1187,29 +1172,29 @@ ss
"}
(4,1,1) = {"
ss
-ad
-ad
-ad
ac
ac
-ad
-ad
ac
ac
-aH
ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ah
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
bn
bn
ac
-ad
-ad
+ac
+ac
ac
bn
bn
@@ -1230,30 +1215,30 @@ ss
"}
(5,1,1) = {"
ss
-ad
-ad
-ad
ac
-ad
-ad
ac
-ad
-ad
ac
ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
bn
bo
-ad
-ad
+ac
+ac
ae
-ad
+ac
bo
bn
bn
@@ -1277,26 +1262,26 @@ ac
ac
ac
ae
-ad
-ad
-ad
ac
ac
ac
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ae
ac
ac
ag
bo
bn
-ad
+ac
ag
-ad
-ad
+ac
+ac
bo
bn
ck
@@ -1320,7 +1305,7 @@ ac
ac
ac
ac
-ad
+ac
aj
aj
aj
@@ -1329,17 +1314,17 @@ aj
aj
aj
aj
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
bn
bn
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
bo
bn
bn
@@ -1363,7 +1348,7 @@ ac
ac
ac
ac
-ad
+ac
aj
ak
ar
@@ -1382,7 +1367,7 @@ bh
aA
aj
aj
-ad
+ac
bn
bn
bn
@@ -1405,8 +1390,8 @@ ss
ac
ag
ac
-ad
-ad
+ac
+ac
aj
al
ao
@@ -1425,7 +1410,7 @@ aG
aG
bT
aj
-ad
+ac
bn
bn
bn
@@ -1447,9 +1432,9 @@ ss
ss
ac
ac
-ad
-ad
-ad
+ac
+ac
+ac
aj
am
ao
@@ -1468,7 +1453,7 @@ bG
bP
bU
aA
-ad
+ac
bn
bn
ck
@@ -1490,9 +1475,9 @@ ss
ss
ac
ac
-ad
-ad
-ad
+ac
+ac
+ac
aj
an
at
@@ -1533,9 +1518,9 @@ ss
ss
ac
ac
-ad
-ad
-ad
+ac
+ac
+ac
aj
ao
ao
@@ -1575,10 +1560,10 @@ ss
(13,1,1) = {"
ss
ac
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
aj
ao
ao
@@ -1597,7 +1582,7 @@ bI
bR
aU
aA
-ad
+ac
bn
bn
bo
@@ -1618,10 +1603,10 @@ ss
(14,1,1) = {"
ss
ac
-ad
+ac
ac
ae
-ad
+ac
aj
aq
aw
@@ -1640,7 +1625,7 @@ aG
aG
bV
aj
-ad
+ac
bn
bn
bn
@@ -1661,10 +1646,10 @@ ss
(15,1,1) = {"
ss
ac
-ad
ac
ac
-ad
+ac
+ac
aj
aj
aj
@@ -1683,7 +1668,7 @@ bh
aA
aj
aj
-ad
+ac
bo
bn
bn
@@ -1703,12 +1688,12 @@ ss
"}
(16,1,1) = {"
ss
-ad
-ad
ac
ac
-ad
-ad
+ac
+ac
+ac
+ac
aj
ax
aE
@@ -1716,42 +1701,42 @@ aA
aV
aG
aj
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
bn
bn
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
bn
bn
-ad
-ad
-ad
ac
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(17,1,1) = {"
ss
-ad
ac
-ad
ac
-ad
-ad
+ac
+ac
+ac
+ac
aj
ay
aE
@@ -1770,26 +1755,26 @@ bo
bn
bn
bn
-ad
-ad
+ac
+ac
ae
-ad
+ac
bn
bn
-ad
ac
ac
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
ac
ah
ss
"}
(18,1,1) = {"
ss
-ad
+ac
ac
ah
ac
@@ -1802,42 +1787,42 @@ aA
aG
aG
aA
-ad
+ac
bn
ag
bn
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
bn
ah
bn
ac
-ad
-ad
-ad
+ac
+ac
+ac
bn
bn
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
ag
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
ss
"}
(19,1,1) = {"
ss
-ad
-ad
-ad
ac
ac
-ad
+ac
+ac
+ac
+ac
aj
aj
aj
@@ -1845,88 +1830,88 @@ aj
aG
bb
aj
-ad
+ac
bo
bn
bn
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
bn
bn
bn
ac
-ad
-ad
+ac
+ac
ac
bn
bo
-ad
+ac
ae
-ad
-ad
ac
ac
-ad
-ad
+ac
+ac
+ac
+ac
ae
ss
"}
(20,1,1) = {"
ss
-ad
-ad
ac
ac
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
aA
aG
aG
aj
-ad
+ac
bn
-ad
-ad
+ac
+ac
bD
bE
bE
bE
-ad
-ad
+ac
+ac
bn
-ad
-ad
-ad
+ac
+ac
+ac
ac
bn
bn
-ad
-ad
ac
-ad
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(21,1,1) = {"
ss
-ad
-ad
ac
-ad
ac
-ad
-ad
-af
-ad
+ac
+ac
+ac
+ac
+ac
+ae
+ac
aA
aG
aG
@@ -1934,13 +1919,13 @@ bh
bn
bn
ae
-ad
+ac
bE
bJ
bM
bD
-ad
-ad
+ac
+ac
bo
bn
bo
@@ -1948,28 +1933,28 @@ bn
bn
bn
bn
-ad
-ad
ac
-ad
ac
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
ac
ss
"}
(22,1,1) = {"
ss
ac
-ad
ac
-ad
-ai
-ad
-ad
ac
-ad
+ac
+ag
+ac
+ac
+ac
+ac
aA
aG
aG
@@ -1982,8 +1967,8 @@ bD
bJ
bJ
bE
-ad
-ad
+ac
+ac
bo
bn
bn
@@ -1991,15 +1976,15 @@ bo
bn
bn
bn
-ad
-ad
-ad
-ad
ac
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(23,1,1) = {"
@@ -2007,146 +1992,146 @@ ss
ac
ac
ac
-ad
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
aA
aG
aG
aj
-ad
+ac
bn
ac
-ad
+ac
bE
bE
bD
bE
ac
-ad
+ac
bn
ac
-ad
-ad
-ad
+ac
+ac
+ac
bn
bn
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ag
-ad
+ac
ss
"}
(24,1,1) = {"
ss
-ad
-ad
-ad
-ad
-ad
-ad
ac
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
aj
aG
aG
aj
-ad
+ac
bn
bn
bn
-ad
ac
-ad
-ad
+ac
+ac
+ac
bn
bn
bn
ac
ae
-ad
-ad
+ac
+ac
bn
bn
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(25,1,1) = {"
ss
ac
-ad
-ad
-ad
-ad
-ad
ac
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
aj
aG
aG
aA
-ad
+ac
bo
bt
bn
-ad
-ad
-ad
+ac
+ac
+ac
ac
bn
ag
bn
ac
-ad
+ac
aj
aj
cu
cu
aj
aj
-ad
-ad
+ac
+ac
ae
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
ss
"}
(26,1,1) = {"
ss
-ad
-ad
-ad
-ad
ac
ac
ac
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
aj
aG
aG
aA
-ad
+ac
bn
bn
bn
@@ -2157,73 +2142,73 @@ bn
bn
bo
bn
-ad
-ad
+ac
+ac
aj
cm
cp
cp
cy
aj
-ad
-ad
-ad
ac
ac
ac
-ad
+ac
+ac
+ac
+ac
ss
"}
(27,1,1) = {"
ss
-ad
ac
ac
-ad
-ad
ac
ac
-ad
-ad
+ac
+ac
+ac
+ac
+ac
aj
aV
aG
aj
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
bn
bn
-ad
-ad
+ac
+ac
ae
-ad
-ad
-ad
+ac
+ac
+ac
aj
cn
cp
cp
cz
aj
-ad
-ad
-ad
ac
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
ss
"}
(28,1,1) = {"
ss
-ad
-ad
ac
ac
-ad
+ac
+ac
+ac
ae
ac
aj
@@ -2251,22 +2236,22 @@ cp
cp
cA
aj
-ad
-ad
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(29,1,1) = {"
ss
-ad
+ac
ae
ac
-ad
-ad
+ac
+ac
ae
ac
aj
@@ -2294,13 +2279,13 @@ cp
cp
cB
aj
-ad
-ad
-ad
-ad
-ad
-af
-ad
+ac
+ac
+ac
+ac
+ac
+ae
+ac
ss
"}
(30,1,1) = {"
@@ -2309,9 +2294,9 @@ ac
ac
ac
ac
-ad
ac
-ad
+ac
+ac
aA
aG
aG
@@ -2337,13 +2322,13 @@ cp
cp
cC
aj
-ad
-ad
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(31,1,1) = {"
@@ -2354,7 +2339,7 @@ ac
ac
ac
ac
-ad
+ac
aA
aG
aO
@@ -2380,24 +2365,24 @@ cp
cp
cD
aj
-ad
-ad
ac
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(32,1,1) = {"
ss
-ad
-ad
ac
-ad
ac
ac
-ad
+ac
+ac
+ac
+ac
aA
aG
aP
@@ -2423,24 +2408,24 @@ cp
cp
cE
aj
-ad
-ad
-ad
-ad
-aH
ac
-ad
+ac
+ac
+ac
+ah
+ac
+ac
ss
"}
(33,1,1) = {"
ss
-ad
-ad
+ac
+ac
ac
ag
-ad
ac
-ad
+ac
+ac
aA
aG
aP
@@ -2466,24 +2451,24 @@ cp
cp
cF
aj
-ad
-ad
-ad
-ad
ac
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(34,1,1) = {"
ss
-ad
-ad
ac
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
aA
aG
aQ
@@ -2509,24 +2494,24 @@ cv
cw
aj
aj
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(35,1,1) = {"
ss
-ad
-ad
-ad
ac
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
aj
aG
aG
@@ -2551,25 +2536,25 @@ aj
aj
aj
aj
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(36,1,1) = {"
ss
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
aj
aj
aA
@@ -2590,119 +2575,111 @@ cc
ci
ci
aj
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(37,1,1) = {"
ss
ae
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
aj
cd
ci
ci
aj
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(38,1,1) = {"
ss
-ad
-ad
-ad
-ad
-ac
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ae
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
aj
aj
aj
aj
aj
-ad
+ac
ae
ac
ac
-ad
-ad
-ad
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(39,1,1) = {"
ss
-ad
+ac
ag
-ad
-ad
ac
-ad
-ad
-ad
-ad
-ad
-ad
ac
ac
ac
@@ -2711,198 +2688,206 @@ ac
ac
ac
ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
ac
ac
-ad
-ad
-ad
ac
-ad
-ad
-ad
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(40,1,1) = {"
ss
-ad
-ad
-ad
-ad
ac
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ag
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
ac
ac
ac
ac
-ad
-ad
-ad
ac
ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(41,1,1) = {"
ss
-ad
-ad
-ad
-ad
-ad
-ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ag
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ac
-aH
-ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ah
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ag
-ad
-ad
+ac
+ac
ss
"}
(42,1,1) = {"
ss
-ad
-ad
-ad
-ad
-ad
-ad
-ac
-ac
-ac
-ad
-ad
-ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ac
-ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(43,1,1) = {"
ss
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
ac
ac
ac
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ae
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ae
-ad
-ac
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
-ad
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
+ac
ss
"}
(44,1,1) = {"
diff --git a/mods/species/random_species/_random_species.dm b/mods/species/random_species/_random_species.dm
new file mode 100644
index 00000000000..7f20e9a608f
--- /dev/null
+++ b/mods/species/random_species/_random_species.dm
@@ -0,0 +1,8 @@
+#define SPECIES_ALIEN "Humanoid"
+
+/decl/modpack/random_species
+ name = "Random Alien Species"
+
+/decl/modpack/random_species/initialize()
+ . = ..()
+ SSmodpacks.default_submap_blacklisted_species += SPECIES_ALIEN
diff --git a/mods/species/random_species/_random_species.dme b/mods/species/random_species/_random_species.dme
new file mode 100644
index 00000000000..fda80f4abf4
--- /dev/null
+++ b/mods/species/random_species/_random_species.dme
@@ -0,0 +1,9 @@
+#ifndef SPECIES_PACK_RANDOM
+#define SPECIES_PACK_RANDOM
+// BEGIN_INCLUDE
+#include "_random_species.dm"
+#include "aliumizer.dm"
+#include "random_species_bodytype.dm"
+#include "random_species_species.dm"
+// END_INCLUDE
+#endif
diff --git a/mods/species/random_species/aliumizer.dm b/mods/species/random_species/aliumizer.dm
new file mode 100644
index 00000000000..6d7ab1e5796
--- /dev/null
+++ b/mods/species/random_species/aliumizer.dm
@@ -0,0 +1,34 @@
+/obj/structure/aliumizer
+ name = "alien monolith"
+ desc = "Your true form is calling. Use this to become an alien humanoid."
+ icon = 'icons/obj/xenoarchaeology.dmi' // todo: duplicate icon in modpack to avoid skew from upstream changes?
+ icon_state = "ano51"
+ anchored = TRUE
+
+/obj/structure/aliumizer/attack_hand(mob/user)
+ SHOULD_CALL_PARENT(FALSE)
+ if(!ishuman(user))
+ to_chat(user, SPAN_WARNING("You've got no business touching this."))
+ return TRUE
+ var/decl/species/species = user.get_species()
+ if(!species)
+ return TRUE
+ if(species.name == SPECIES_ALIEN)
+ to_chat(user, SPAN_WARNING("You're already a [SPECIES_ALIEN]."))
+ return TRUE
+ if(alert("Are you sure you want to be an alien?", "Mom Look I'm An Alien!", "Yes", "No") == "No")
+ to_chat(user, SPAN_NOTICE("You are now a [SPECIES_ALIEN]!"))
+ return TRUE
+ if(species.name == SPECIES_ALIEN) //no spamming it to get free implants
+ return TRUE
+ to_chat(user, "You're now an alien humanoid of some undiscovered species. Make up what lore you want, no one knows a thing about your species! You can check info about your traits with Check Species Info verb in IC tab.")
+ to_chat(user, "You can't speak any other languages by default. You can use translator implant that spawns on top of this monolith - it will give you knowledge of any language if you hear it enough times.")
+ var/mob/living/human/H = user
+ new /obj/item/implanter/translator(get_turf(src))
+ H.change_species(SPECIES_ALIEN)
+ var/decl/background_detail/background = H.get_background_datum_by_flag(BACKGROUND_FLAG_NAMING)
+ H.fully_replace_character_name(background.get_random_name(H, H.gender))
+ H.rename_self("Humanoid Alien", 1)
+ return TRUE
+
+OPTIONAL_SPAWNER(aliumizer, /obj/structure/aliumizer)
\ No newline at end of file
diff --git a/mods/species/random_species/random_species_bodytype.dm b/mods/species/random_species/random_species_bodytype.dm
new file mode 100644
index 00000000000..b4a015834ff
--- /dev/null
+++ b/mods/species/random_species/random_species_bodytype.dm
@@ -0,0 +1,28 @@
+/decl/bodytype/alium
+ name = "humanoid"
+ bodytype_category = BODYTYPE_HUMANOID
+ icon_base = 'icons/mob/human_races/species/humanoid/body.dmi'
+ bandages_icon = 'icons/mob/bandage.dmi'
+ limb_blend = ICON_MULTIPLY
+ appearance_flags = HAS_SKIN_COLOR
+ body_flags = BODY_FLAG_NO_DNA | BODY_FLAG_NO_DEFIB | BODY_FLAG_NO_STASIS
+ uid = "bodytype_alium"
+
+/decl/bodytype/alium/Initialize()
+ if(prob(10))
+ movement_slowdown += pick(-1,1)
+ if(prob(5))
+ body_flags |= BODY_FLAG_NO_PAIN
+ base_color = RANDOM_RGB
+ MULT_BY_RANDOM_COEF(eye_flash_mod, 0.5, 1.5)
+ eye_darksight_range = rand(1,8)
+ var/temp_comfort_shift = rand(-50,50)
+ cold_level_1 += temp_comfort_shift
+ cold_level_2 += temp_comfort_shift
+ cold_level_3 += temp_comfort_shift
+ heat_level_1 += temp_comfort_shift
+ heat_level_2 += temp_comfort_shift
+ heat_level_3 += temp_comfort_shift
+ heat_discomfort_level += temp_comfort_shift
+ cold_discomfort_level += temp_comfort_shift
+ . = ..()
\ No newline at end of file
diff --git a/mods/species/random_species/random_species_species.dm b/mods/species/random_species/random_species_species.dm
new file mode 100644
index 00000000000..06f431624ac
--- /dev/null
+++ b/mods/species/random_species/random_species_species.dm
@@ -0,0 +1,80 @@
+/decl/species/alium
+ name = SPECIES_ALIEN
+ name_plural = "Humanoids"
+ description = "Some alien humanoid species, unknown to humanity. How exciting."
+ rarity_value = 5
+ hidden_from_codex = TRUE
+
+ spawn_flags = SPECIES_IS_RESTRICTED
+
+ available_bodytypes = list(/decl/bodytype/alium)
+
+ force_background_info = list(
+ /decl/background_category/heritage = /decl/background_detail/heritage/hidden/alium
+ )
+
+ exertion_effect_chance = 10
+ exertion_hydration_scale = 1
+ exertion_reagent_scale = 1
+ exertion_reagent_path = /decl/material/liquid/lactate
+ exertion_emotes_biological = list(
+ /decl/emote/exertion/biological,
+ /decl/emote/exertion/biological/breath,
+ /decl/emote/exertion/biological/pant
+ )
+ var/blood_color
+
+/decl/species/alium/Initialize()
+
+ //Coloring
+ blood_color = RANDOM_RGB
+ flesh_color = RANDOM_RGB
+
+ //Combat stats
+ MULT_BY_RANDOM_COEF(total_health, 0.8, 1.2)
+ MULT_BY_RANDOM_COEF(brute_mod, 0.5, 1.5)
+ MULT_BY_RANDOM_COEF(burn_mod, 0.8, 1.2)
+ MULT_BY_RANDOM_COEF(oxy_mod, 0.5, 1.5)
+ MULT_BY_RANDOM_COEF(toxins_mod, 0, 2)
+ MULT_BY_RANDOM_COEF(radiation_mod, 0, 2)
+
+ if(brute_mod < 1 && prob(40))
+ species_flags |= SPECIES_FLAG_NO_MINOR_CUT
+ if(brute_mod < 0.9 && prob(40))
+ species_flags |= SPECIES_FLAG_NO_EMBED
+ if(toxins_mod < 0.1)
+ species_flags |= SPECIES_FLAG_NO_POISON
+
+ //Gastronomic traits
+ taste_sensitivity = pick(TASTE_HYPERSENSITIVE, TASTE_SENSITIVE, TASTE_DULL, TASTE_NUMB)
+ gluttonous = pick(0, GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING)
+ stomach_capacity = 5 * stomach_capacity
+ if(prob(20))
+ gluttonous |= pick(GLUT_ITEM_TINY, GLUT_ITEM_NORMAL, GLUT_ITEM_ANYTHING, GLUT_PROJECTILE_VOMIT)
+ if(gluttonous & GLUT_ITEM_ANYTHING)
+ stomach_capacity += ITEM_SIZE_HUGE
+
+ //Environment
+ var/temp_comfort_shift = rand(-50,50)
+ body_temperature += temp_comfort_shift
+
+ var/pressure_comfort_shift = rand(-50,50)
+ hazard_high_pressure += pressure_comfort_shift
+ warning_high_pressure += pressure_comfort_shift
+ warning_low_pressure += pressure_comfort_shift
+ hazard_low_pressure += pressure_comfort_shift
+
+ //Misc traits
+ if(prob(40))
+ available_pronouns = list(/decl/pronouns)
+ if(prob(10))
+ species_flags |= SPECIES_FLAG_NO_SLIP
+ if(prob(10))
+ species_flags |= SPECIES_FLAG_NO_TANGLE
+
+ . = ..()
+
+/decl/species/alium/get_species_blood_color(mob/living/human/H)
+ if(istype(H) && H.isSynthetic())
+ return ..()
+ return blood_color
\ No newline at end of file
diff --git a/nebula.dme b/nebula.dme
index e9f8ec7a411..fefac75fff8 100644
--- a/nebula.dme
+++ b/nebula.dme
@@ -3940,7 +3940,6 @@
#include "code\modules\organs\internal\lungs.dm"
#include "code\modules\organs\internal\stomach.dm"
#include "code\modules\organs\internal\voice.dm"
-#include "code\modules\organs\internal\species\golem.dm"
#include "code\modules\overmap\_defines.dm"
#include "code\modules\overmap\_overmap.dm"
#include "code\modules\overmap\overmap_object.dm"
@@ -4384,8 +4383,6 @@
#include "code\modules\species\species_getters.dm"
#include "code\modules\species\species_helpers.dm"
#include "code\modules\species\species_hud.dm"
-#include "code\modules\species\outsider\random.dm"
-#include "code\modules\species\station\golem.dm"
#include "code\modules\species\station\human.dm"
#include "code\modules\species\station\human_bodytypes.dm"
#include "code\modules\species\station\monkey.dm"
@@ -4658,6 +4655,7 @@
#include "code\unit_tests\~helpers.dm"
#include "interface\interface.dm"
#include "interface\skin.dmf"
+#include "maps\__map_modpack_compatibility.dm"
#include "maps\__map_names.dm"
#include "maps\_map_include.dm"
#include "maps\antag_spawn\ert\ert.dm"