diff --git a/code/__defines/chemistry_vr.dm b/code/__defines/chemistry_vr.dm
index 0058985adc..3ce868c5b8 100644
--- a/code/__defines/chemistry_vr.dm
+++ b/code/__defines/chemistry_vr.dm
@@ -1,4 +1,5 @@
// More for our custom races
#define IS_CHIMERA 12
#define IS_SHADEKIN 13
-#define IS_ALRAUNE 14
\ No newline at end of file
+#define IS_ALRAUNE 14
+#define IS_LLEILL 15
\ No newline at end of file
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 183921ecde..61080f2fca 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -33,6 +33,7 @@
#define SPECIES_ZORREN_HIGH "Zorren"
#define SPECIES_CUSTOM "Custom Species"
#define SPECIES_TAJARAN "Tajara"
+#define SPECIES_LLEILL "Lleill"
//monkey species
#define SPECIES_MONKEY_AKULA "Sobaka"
#define SPECIES_MONKEY_NEVREAN "Sparra"
diff --git a/code/__defines/species_languages_vr.dm b/code/__defines/species_languages_vr.dm
index ec9165653d..146fcb86ab 100644
--- a/code/__defines/species_languages_vr.dm
+++ b/code/__defines/species_languages_vr.dm
@@ -17,3 +17,4 @@
#define LANGUAGE_MOUSE "Mouse"
#define LANGUAGE_SHADEKIN "Shadekin Empathy"
+#define LANGUAGE_LLEILL "Glamour Speak"
diff --git a/code/game/objects/structures/props/rocks.dm b/code/game/objects/structures/props/rocks.dm
index 220bc83215..253a36bda5 100644
--- a/code/game/objects/structures/props/rocks.dm
+++ b/code/game/objects/structures/props/rocks.dm
@@ -80,3 +80,28 @@
/obj/structure/prop/rock/ice/small/alt
icon_state = "icesmall2"
+
+// glamour things for whitespace
+/obj/structure/prop/rock/glamour
+ name = "glamour"
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "pillar_1"
+
+/obj/structure/prop/rock/glamour/double
+ icon_state = "pillar_3"
+
+/obj/structure/prop/rock/glamour/triple
+ icon_state = "pillar_2"
+
+/obj/structure/prop/rock/glamour/small
+ icon_state = "gems_1"
+ density = FALSE
+
+/obj/structure/prop/rock/glamour/small/alt1
+ icon_state = "gems_2"
+
+/obj/structure/prop/rock/glamour/small/alt2
+ icon_state = "gems_3"
+
+/obj/structure/prop/rock/glamour/small/alt3
+ icon_state = "gems_4"
\ No newline at end of file
diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm
index ae136ec0e6..fc6f5b261e 100644
--- a/code/game/turfs/simulated/water.dm
+++ b/code/game/turfs/simulated/water.dm
@@ -263,3 +263,14 @@ var/list/shoreline_icon_cache = list()
to_chat(L, "You get drenched in blood from entering \the [src]!")
AM.water_act(5)
..()
+
+/turf/simulated/floor/water/glamour
+ name = "glamour"
+ desc = "A body of glamour. It seems shallow enough to walk through, if needed."
+ icon = 'icons/turf/flooring/glamour.dmi'
+ icon_state = "water"
+ water_icon = 'icons/turf/flooring/glamour.dmi'
+ water_state = "water"
+ under_state = "glamour"
+ reagent_type = "water"
+
diff --git a/code/modules/clothing/spacesuits/void/ert_vr.dm b/code/modules/clothing/spacesuits/void/ert_vr.dm
index 8b147a4dc3..9d98e3273c 100644
--- a/code/modules/clothing/spacesuits/void/ert_vr.dm
+++ b/code/modules/clothing/spacesuits/void/ert_vr.dm
@@ -171,6 +171,7 @@
sprite_sheets = list(
SPECIES_HUMAN = 'icons/inventory/suit/mob_vr.dmi',
SPECIES_TAJ = 'icons/inventory/suit/mob_vr_tajaran.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/mob_vr_tajaran.dmi',
SPECIES_SKRELL = 'icons/inventory/suit/mob_vr_skrell.dmi',
SPECIES_UNATHI = 'icons/inventory/suit/mob_vr_unathi.dmi',
SPECIES_XENOHYBRID = 'icons/inventory/suit/mob_vr_unathi.dmi',
@@ -201,13 +202,15 @@
SPECIES_NEVREAN = 'icons/inventory/suit/item_vr.dmi',
SPECIES_RAPALA = 'icons/inventory/suit/item_vr.dmi',
SPECIES_ALRAUNE = 'icons/inventory/suit/item_vr.dmi',
- SPECIES_ZADDAT = 'icons/inventory/suit/item_vr.dmi'
+ SPECIES_ZADDAT = 'icons/inventory/suit/item_vr.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/item_vr.dmi'
)
/obj/item/clothing/head/helmet/space/void/responseteam
sprite_sheets = list(
SPECIES_HUMAN = 'icons/inventory/head/mob_vr.dmi',
SPECIES_TAJ = 'icons/inventory/head/mob_vr_tajaran.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/mob_vr_tajaran.dmi',
SPECIES_SKRELL = 'icons/inventory/head/mob_vr_skrell.dmi',
SPECIES_UNATHI = 'icons/inventory/head/mob_vr_unathi.dmi',
SPECIES_XENOHYBRID = 'icons/inventory/head/mob_vr_unathi.dmi',
@@ -238,5 +241,6 @@
SPECIES_NEVREAN = 'icons/inventory/head/item_vr.dmi',
SPECIES_RAPALA = 'icons/inventory/head/item_vr.dmi',
SPECIES_ALRAUNE = 'icons/inventory/head/item_vr.dmi',
- SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi'
+ SPECIES_ZADDAT = 'icons/inventory/head/item_vr.dmi',
+ SPECIES_LLEILL = 'icons/inventory/suit/item_vr.dmi'
)
diff --git a/code/modules/mob/language/station_vr.dm b/code/modules/mob/language/station_vr.dm
index df525dbe38..797e5778c1 100644
--- a/code/modules/mob/language/station_vr.dm
+++ b/code/modules/mob/language/station_vr.dm
@@ -143,6 +143,21 @@
/datum/language/echosong/scramble(var/input, var/list/known_languages)
return stars(input)
+/datum/language/lleill
+ name = LANGUAGE_LLEILL
+ desc = "An ancient, gutteral language involving a lot of spitting."
+ speech_verb = "speaks"
+ ask_verb = "ponders"
+ exclaim_verb = "calls"
+ colour = "echosong"
+ key = "L"
+ syllables = list(
+ "llyn", "bren", "gwyn", "gwyr", "ddys", "dath", "llio", "cym", "ddrai", "ffyr", "lle", "dy", "eto", "uno", "dydno", "llego", "bryth", "ffair",
+ "ynys", "ed", "fore", "oe", "hen", "wladd", "ty", "nha", "dwy", "mae", "dros", "pob", "ia", "wyll", "gwdd", "fi"
+ )
+ machine_understands = FALSE
+ flags = WHITELISTED
+
/datum/language/echosong/broadcast(var/mob/living/speaker, var/message, var/speaker_mask)
log_say("(INAUDIBLE) [message]", speaker)
speaker.say_signlang(format_message(message), pick(signlang_verb), pick(signlang_verb_understood), src, 2)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 38427453e3..f298a47fcb 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -19,6 +19,7 @@
var/can_defib = 1 //Horrible damage (like beheadings) will prevent defibbing organics.
var/active_regen = FALSE //Used for the regenerate proc in human_powers.dm
var/active_regen_delay = 300
+ var/list/teleporters = list() //Used for lleill abilities
/mob/living/carbon/human/Initialize(mapload, var/new_species = null)
if(!dna)
diff --git a/code/modules/mob/living/carbon/human/human_species_vr.dm b/code/modules/mob/living/carbon/human/human_species_vr.dm
index a747280df8..dd3134420a 100644
--- a/code/modules/mob/living/carbon/human/human_species_vr.dm
+++ b/code/modules/mob/living/carbon/human/human_species_vr.dm
@@ -31,3 +31,6 @@
/mob/living/carbon/human/altevian/New(var/new_loc)
..(new_loc, SPECIES_ALTEVIAN)
+
+/mob/living/carbon/human/lleill/New(var/new_loc)
+ ..(new_loc, SPECIES_LLEILL)
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
new file mode 100644
index 0000000000..48146df8e8
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
@@ -0,0 +1,178 @@
+/datum/species/lleill
+
+ name = SPECIES_LLEILL
+ name_plural = "Lleill"
+ icobase = 'icons/mob/human_races/r_lleill.dmi'
+ deform = 'icons/mob/human_races/r_lleill.dmi'
+ color_mult = 1
+ tail = "tail"
+ icobase_tail = 1
+ blurb = "A species that appears to originate somewhere in redspace. Their forms are not consistent, \
+ they do not care for consistency, and are working under a constant never-ending drive to improve themselves \
+ and the world around them. With little care for whether the world itself wants to change." //PLACEHOLDER
+
+ blood_color = "#FFFFFF"
+ blood_name = "glamour"
+ flesh_color = "#FFFFFF"
+ reagent_tag = IS_LLEILL
+
+ num_alternate_languages = 3
+ species_language = LANGUAGE_LLEILL
+ language = LANGUAGE_LLEILL
+ name_language = LANGUAGE_LLEILL
+
+ flags = NO_SCAN | NO_MINOR_CUT | NO_INFECT | NO_HALLUCINATION
+ spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
+ appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_UNDERWEAR
+
+ max_age = 200
+
+ economic_modifier = 15
+
+ digi_allowed = TRUE
+
+ //Specific abilities
+
+ darksight = 10 //Can see in dark
+
+ burn_mod = 0.25 //Very resistant to fire
+ pain_mod = 0.25 //Whilst not resistant to brute or stunning, they are quite resistant to pain, making them tanky in their own way.
+
+ warning_low_pressure = 50
+ hazard_low_pressure = -1
+ warning_high_pressure = 300
+ hazard_high_pressure = 10000 //Can be killed by pressure but you're going to need a hell of a lot
+
+ cold_level_1 = -1 //Safe in space
+ cold_level_2 = -1
+ cold_level_3 = -1
+
+ heat_level_1 = 1500 //Very resiliant to heat
+ heat_level_2 = 2500
+ heat_level_3 = 5000
+
+ can_space_freemove = TRUE //Have no issue moving through space.
+ can_zero_g_move = TRUE
+
+ chem_strength_alcohol = 0 //Can't get drunk
+
+ oxy_mod = 0.25 //Suffocates very slowly, but does ultimately need to breathe, will outpace heal most oxygen damage.
+ poison_type = null //Not harmed by phoron.
+ water_breather = TRUE
+
+ var/list/valid_transform_species = list(
+ "Human", "Unathi", "Tajara", "Skrell",
+ "Diona", "Teshari", "Monkey","Sergal",
+ "Akula","Nevrean","Zorren",
+ "Fennec", "Vulpkanin", "Vasilissan",
+ "Rapala", "Neaera", "Stok", "Farwa", "Sobaka",
+ "Wolpin", "Saru", "Sparra", "Lleill")
+
+ // Looks like a lot but the majority of these are just to change their appearance.
+ inherent_verbs = list(
+ /mob/living/carbon/human/proc/lleill_select_colour,
+ /mob/living/carbon/human/proc/lleill_select_shape,
+ /mob/living/carbon/human/proc/shapeshifter_select_hair,
+ /mob/living/carbon/human/proc/shapeshifter_select_hair_colors,
+ /mob/living/carbon/human/proc/shapeshifter_select_gender,
+ /mob/living/carbon/human/proc/shapeshifter_select_wings,
+ /mob/living/carbon/human/proc/shapeshifter_select_tail,
+ /mob/living/carbon/human/proc/shapeshifter_select_ears,
+ /mob/living/proc/set_size,
+ /mob/living/carbon/human/proc/lleill_invisibility,
+ /mob/living/carbon/human/proc/lleill_transmute,
+ /mob/living/carbon/human/proc/lleill_rings)
+
+ //organs, going with just the basics for now
+
+ has_organ = list(
+ O_HEART = /obj/item/organ/internal/heart,
+ O_LUNGS = /obj/item/organ/internal/lungs,
+ O_VOICE = /obj/item/organ/internal/voicebox,
+ O_LIVER = /obj/item/organ/internal/liver,
+ O_KIDNEYS = /obj/item/organ/internal/kidneys,
+ O_BRAIN = /obj/item/organ/internal/brain,
+ O_APPENDIX = /obj/item/organ/internal/appendix,
+ O_SPLEEN = /obj/item/organ/internal/spleen,
+ O_EYES = /obj/item/organ/internal/eyes,
+ O_STOMACH = /obj/item/organ/internal/stomach,
+ O_INTESTINE = /obj/item/organ/internal/intestine
+ )
+
+ has_limbs = list(
+ BP_TORSO = list("path" = /obj/item/organ/external/chest),
+ BP_GROIN = list("path" = /obj/item/organ/external/groin),
+ BP_HEAD = list("path" = /obj/item/organ/external/head/lleill),
+ BP_L_ARM = list("path" = /obj/item/organ/external/arm),
+ BP_R_ARM = list("path" = /obj/item/organ/external/arm/right),
+ BP_L_LEG = list("path" = /obj/item/organ/external/leg),
+ BP_R_LEG = list("path" = /obj/item/organ/external/leg/right),
+ BP_L_HAND = list("path" = /obj/item/organ/external/hand),
+ BP_R_HAND = list("path" = /obj/item/organ/external/hand/right),
+ BP_L_FOOT = list("path" = /obj/item/organ/external/foot),
+ BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right)
+ )
+
+ base_species = SPECIES_LLEILL
+
+// Shapeshifters have some behaviour that doesn't play well with this species so I have taken the main parts needed for here.
+
+/datum/species/lleill/get_valid_shapeshifter_forms(var/mob/living/carbon/human/H)
+ return valid_transform_species
+
+/datum/species/lleill/get_icobase(var/mob/living/carbon/human/H, var/get_deform)
+ if(!H) return ..(null, get_deform)
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.type == src.type) return ..(H, get_deform)
+ return S.get_icobase(H,get_deform)
+
+/datum/species/lleill/get_race_key(var/mob/living/carbon/human/H)
+ return "[..()]-[wrapped_species_by_ref["\ref[H]"]]"
+
+/datum/species/lleill/get_bodytype(var/mob/living/carbon/human/H)
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!H || !S) return ..()
+ if(S.type == src.type) return ..(H)
+ return S.get_bodytype(H)
+
+/datum/species/lleill/get_blood_mask(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_blood_mask(H)
+
+/datum/species/lleill/get_damage_mask(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_damage_mask(H)
+
+/datum/species/lleill/get_damage_overlays(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_damage_overlays(H)
+
+/datum/species/lleill/get_tail(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_tail(H)
+
+/datum/species/lleill/get_tail_animation(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_tail_animation(H)
+
+/datum/species/lleill/get_tail_hair(var/mob/living/carbon/human/H)
+ if(!H) return ..()
+ var/datum/species/S = GLOB.all_species[wrapped_species_by_ref["\ref[H]"]]
+ if(!S || S.name == src.name)
+ return ..()
+ return S?.get_tail_hair(H)
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
new file mode 100644
index 0000000000..97ee036c8a
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
@@ -0,0 +1,179 @@
+/datum/power/lleill
+
+// Simple ability to become invisible. Does not phase you out of the world, you can still interact with things and can not pass through walls.
+// Essentially the same as traitor cloaking, using the same proc for it.
+
+/datum/power/lleill/invisibility
+ name = "Invisibility"
+ desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
+ verbpath = /mob/living/carbon/human/proc/lleill_invisibility
+
+/mob/living/carbon/human/proc/lleill_invisibility()
+ set name = "Invisibility"
+ set desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
+ set category = "Abilities"
+
+ if(stat)
+ to_chat(src, "You can't go invisible when weakened like this.")
+ return
+
+ if(!cloaked)
+ cloak()
+ to_chat(src, "Your fur shimmers and shifts around you, hiding you from the naked eye.")
+ else
+ uncloak()
+ to_chat(src, "The brustling of your fur settles down and you become visible once again.")
+
+/mob/living/carbon/human/proc/lleill_select_shape()
+
+ set name = "Select Body Shape"
+ set category = "Abilities"
+
+ if(stat || world.time < last_special)
+ return
+
+ last_special = world.time + 50
+
+ var/new_species = null
+ new_species = tgui_input_list(usr, "Please select a species to emulate.", "Shapeshifter Body", species.get_valid_shapeshifter_forms(src))
+
+ if(!new_species || !GLOB.all_species[new_species] || wrapped_species_by_ref["\ref[src]"] == new_species)
+ return
+ lleill_change_shape(new_species)
+
+/mob/living/carbon/human/proc/lleill_change_shape(var/new_species = null)
+ if(!new_species)
+ return
+
+ wrapped_species_by_ref["\ref[src]"] = new_species
+ dna.base_species = new_species
+ species.base_species = new_species
+ visible_message("\The [src] shifts and contorts, taking the form of \a [new_species]!")
+ regenerate_icons()
+
+/mob/living/carbon/human/proc/lleill_select_colour()
+
+ set name = "Select Body Colour"
+ set category = "Abilities"
+
+ if(stat || world.time < last_special)
+ return
+
+ last_special = world.time + 50
+
+ var/new_skin = input(usr, "Please select a new body color.", "Shapeshifter Colour", rgb(r_skin, g_skin, b_skin)) as null|color
+ if(!new_skin)
+ return
+ lleill_set_colour(new_skin)
+
+/mob/living/carbon/human/proc/lleill_set_colour(var/new_skin)
+
+ r_skin = hex2num(copytext(new_skin, 2, 4))
+ g_skin = hex2num(copytext(new_skin, 4, 6))
+ b_skin = hex2num(copytext(new_skin, 6, 8))
+ r_synth = r_skin
+ g_synth = g_skin
+ b_synth = b_skin
+
+ for(var/obj/item/organ/external/E in organs)
+ E.sync_colour_to_human(src)
+
+ regenerate_icons()
+
+/mob/living/carbon/human/proc/lleill_transmute()
+ set name = "Transmute Object"
+ set desc = "Convert an object into a piece of glamour."
+ set category = "Abilities"
+
+ var/list/transmute_list = list(
+ /obj/item/weapon/potion_material/glamour_transparent,
+ /obj/item/weapon/potion_material/glamour_shrinking,
+ /obj/item/weapon/potion_material/glamour_twinkling,
+ /obj/item/weapon/potion_material/glamour_shard,
+ /obj/item/capture_crystal/glamour,
+ /obj/item/glamour_face,
+ /obj/item/device/universal_translator/glamour
+ )
+
+ if(stat)
+ to_chat(src, "You can't go do that when weakened like this.")
+ return
+
+ var/obj/item/I = get_active_hand()
+ if(!I)
+ to_chat(src, "You have no item in your active hand.")
+ return
+
+ var/obj/item/transmute_product = tgui_input_list(src, "Choose an glamour to transmute the item into:", "Transmutation", transmute_list)
+ if(!get_active_hand(I))
+ to_chat(src, "The item is no longer in your hands.")
+ return
+ else
+ visible_message("\The [src] begins to change the form of \the [I].")
+ if(!do_after(usr, 10 SECONDS, I, exclusive = TASK_USER_EXCLUSIVE))
+ visible_message("\The [src] leaves \the [I] in its original form.")
+ return 0
+ visible_message("\The [src] transmutes \the [I] into a \the [transmute_product.name].")
+ drop_item(I)
+ qdel(I)
+ var/spawnloc = get_turf(usr)
+ var/obj/item/N = new transmute_product(spawnloc)
+ put_in_active_hand(N)
+
+/mob/living/carbon/human/proc/lleill_rings()
+ set name = "Place/Use Rings"
+ set desc = "Place or teleport to a glamour ring."
+ set category = "Abilities"
+
+ if(stat)
+ to_chat(src, "You can't go do that when weakened like this.")
+ return
+ if(buckled)
+ to_chat(src,"You can't do that when restrained.")
+
+ var/r_action = tgui_alert(src, "What would you like to do with your rings?", "Actions", list("Spawn New Ring", "Teleport to Ring", "Cancel"))
+ if(r_action == "Cancel")
+ return
+ if(r_action == "Spawn New Ring")
+ if(!do_after(src, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ src.visible_message("\The [src] begins to form white rings on the ground.")
+ return 0
+ to_chat(src, "You place a new glamour ring at your feet.")
+ var/spawnloc = get_turf(src)
+ var/obj/structure/glamour_ring/R = new(spawnloc)
+ src.teleporters |= R
+ if(r_action == "Teleport to Ring")
+ if(!src.teleporters.len)
+ to_chat(src, "You need to place rings to teleport to them.")
+ return
+ else
+ var/obj/structure/glamour_ring/R = tgui_input_list(src, "Where do you wish to teleport?", "Teleport", src.teleporters)
+
+ var/datum/effect/effect/system/spark_spread/spk
+ spk = new(src)
+
+ var/T = get_turf(src)
+ spk.set_up(5, 0, src)
+ spk.attach(src)
+ playsound(T, "sparks", 50, 1)
+ anim(T,src,'icons/mob/mob.dmi',,"phaseout",,src.dir)
+
+ var/S = get_turf(R)
+ src.forceMove(S)
+
+ spk.start()
+ playsound(S, 'sound/effects/phasein.ogg', 25, 1)
+ playsound(S, 'sound/effects/sparks2.ogg', 50, 1)
+ anim(S,src,'icons/mob/mob.dmi',,"phasein",,src.dir)
+ spk.set_up(5, 0, src)
+ spk.attach(src)
+
+ //Would be fun to eat people standing on your ring...
+ if(can_be_drop_pred && vore_selected)
+ var/list/target_list = src.living_mobs(0)
+ if(target_list.len)
+ for(var/mob/living/M in target_list)
+ if(M.devourable && M.can_be_drop_prey)
+ M.forceMove(vore_selected)
+ to_chat(M,"In a bright flash of white light, you suddenly find yourself trapped in \the [src]'s [vore_selected.name]!")
+
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
new file mode 100644
index 0000000000..8b724fe8b6
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
@@ -0,0 +1,198 @@
+//Transparent Glamour (invisibility potion)
+
+/obj/item/weapon/potion_material/glamour_transparent
+ name = "transparent glamour"
+ desc = "A shard of hardened white crystal that is clearly translucent."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "transparent"
+ base_reagent = /obj/item/weapon/potion_base/aqua_regia
+ product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/invisibility
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/invisibility
+ name = "transparent potion"
+ desc = "A small white potion, the clear liquid inside can barely be seen at all."
+ prefill = list("transparent glamour" = 1)
+
+/datum/reagent/glamour_transparent
+ name = "Clear Glamour"
+ id = "transparent glamour"
+ description = "This material is from somewhere else, it can barely be seen by the naked eye."
+ taste_description = "nothingness"
+ reagent_state = LIQUID
+ color = "#ffffff"
+ scannable = 1
+
+/datum/reagent/glamour_transparent/affect_blood(var/mob/living/carbon/target, var/removed)
+ if(!target.cloaked)
+ target.visible_message("\The [target] vanishes from sight.")
+ target.cloak()
+ target.bloodstr.clear_reagents() //instantly clears reagents afterwards
+ target.ingested.clear_reagents()
+ target.touching.clear_reagents()
+ spawn(600)
+ if(target.cloaked)
+ target.uncloak()
+ target.visible_message("\The [target] appears as if from thin air.")
+
+//Shrinking Glamour (scaling potion)
+
+/obj/item/weapon/potion_material/glamour_shrinking
+ name = "shrinking glamour"
+ desc = "A soft clump of white material that seems to shrink at your touch."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "shrinking"
+ base_reagent = /obj/item/weapon/potion_base/aqua_regia
+ product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/scaling
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/scaling
+ name = "scaling potion"
+ desc = "A small white potion, the clear liquid inside can barely be seen at all."
+ prefill = list("scaling glamour" = 1)
+
+/datum/reagent/glamour_scaling
+ name = "Scaling Glamour"
+ id = "scaling glamour"
+ description = "This material is from somewhere else, it appears to change volumes readily at a glance."
+ taste_description = "difficult to discern"
+ reagent_state = LIQUID
+ color = "#ffffff"
+ scannable = 1
+
+/datum/reagent/glamour_scaling/affect_blood(var/mob/living/carbon/target, var/removed)
+ if(!(/mob/living/proc/set_size in target.verbs))
+ to_chat(target, "You feel as though you could change size at any moment.")
+ target.verbs |= /mob/living/proc/set_size
+ target.bloodstr.clear_reagents() //instantly clears reagents afterwards
+ target.ingested.clear_reagents()
+ target.touching.clear_reagents()
+
+//Twinkling Glamour (Sparkling potion - Gives darksight)
+
+/obj/item/weapon/potion_material/glamour_twinkling
+ name = "twinkling glamour"
+ desc = "A sheet of white material that twinkles on its own accord."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "twinkling"
+ base_reagent = /obj/item/weapon/potion_base/aqua_regia
+ product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/darksight
+
+/obj/item/weapon/reagent_containers/glass/bottle/potion/darksight
+ name = "twinling potion"
+ desc = "A small white potion, the thin white liquid inside twinkles brightly."
+ prefill = list("twinkling glamour" = 1)
+
+/datum/reagent/glamour_twinkling
+ name = "Twinkling Glamour"
+ id = "twinkling glamour"
+ description = "This material is from somewhere else, it appears to be twinkling."
+ taste_description = "bright"
+ reagent_state = LIQUID
+ color = "#ffffff"
+ scannable = 1
+
+/datum/reagent/glamour_twinkling/affect_blood(var/mob/living/carbon/human/target, var/removed)
+ if(target.species.darksight < 10)
+ to_chat(target, "You can suddenly see much better than before.")
+ target.species.darksight = 10
+ if(target.disabilities & NEARSIGHTED)
+ target.disabilities &= ~NEARSIGHTED
+ to_chat(target, "Everything is much less blurry.")
+ target.bloodstr.clear_reagents() //instantly clears reagents afterwards
+ target.ingested.clear_reagents()
+ target.touching.clear_reagents()
+
+//Glamour Cell (variant of capture crystal)
+
+/obj/item/capture_crystal/glamour
+ name = "glamour cell"
+ desc = "A large but light round ball of glamour that glows from somewhere within."
+ icon = 'icons/obj/glamour.dmi'
+
+/obj/item/capture_crystal/glamour/animate_action(atom/thing)
+ var/image/coolanimation = image('icons/obj/glamour.dmi', null, "animation")
+ coolanimation.plane = PLANE_LIGHTING_ABOVE
+ thing.overlays += coolanimation
+ sleep(14)
+ thing.overlays -= coolanimation
+
+//Face of Glamour (creates a clone of a target)
+
+/obj/item/glamour_face
+ name = "face of glamour"
+ desc = "A piece of glamour that is formed vaguely into the shape of a face."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "face"
+ var/mob/living/homunculus = 0
+
+/obj/item/glamour_face/attack_self(var/mob/user)
+ if(!homunculus)
+ var/list/targets = list()
+ for(var/mob/living/carbon/human/M in mob_list)
+ if(M.z != user.z || get_dist(user,M) > 10)
+ continue
+ if(istype(M) && M.resleeve_lock && M.ckey != M.resleeve_lock)
+ continue
+ targets |= M
+
+ if(!targets)
+ to_chat(user, "There are no appropriate targets in range.")
+ return
+
+ var/mob/living/carbon/human/chosen_target = tgui_input_list(user, "Which target do you wish to create a homunculus of?", "homunculus", targets)
+
+ var/spawnloc = get_turf(user)
+ var/mob/living/simple_mob/homunculus/H = new(spawnloc)
+ H.name = chosen_target.name
+ H.desc = chosen_target.desc
+ H.icon = chosen_target.icon
+ H.icon_state = chosen_target.icon_state
+ H.copy_overlays(chosen_target, TRUE)
+ H.resize(chosen_target.size_multiplier, ignore_prefs = TRUE)
+ homunculus = H
+ H.owner = src
+ return
+ if(homunculus)
+ var/mob/living/simple_mob/homunculus/H = homunculus
+ var/h_action = tgui_alert(user, "What would you like to do with your homunculus?", "Actions", list("Recall", "Speak Through", "Cancel"))
+ if(h_action == "Cancel")
+ return
+ if(h_action == "Recall")
+ H.visible_message("\The [H] returns to the face.")
+ qdel(H)
+ homunculus = 0
+ return
+ if(h_action == "Speak Through")
+ var/words_to_say = tgui_input_text(user, "What should the homunculus say:", "Speak Through")
+ H.say(words_to_say)
+ return
+
+
+//Speaking Glamour (universal translator)
+
+/obj/item/device/universal_translator/glamour
+ name = "speaking glamour"
+ desc = "A shard of glamour that translates all known language for the user."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "translator"
+
+//Teleporter ring
+
+/obj/structure/glamour_ring
+ name = "glamour ring"
+ desc = "A ring of glowing white, oddly reflective material."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "ring"
+ density = 0
+ anchored = 1
+
+ var/connected_mob
+ var/area_name
+
+/obj/structure/glamour_ring/Initialize()
+ . = ..()
+ var/area/A = get_area(src)
+ area_name = A.name
+ name = "[area_name] glamour ring"
+
+//Glamour Floor
+//Glamour Wall
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 804d9ad78b..9d82aaa30a 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -1060,7 +1060,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
apply_layer(tail_layer)
return
- var/species_tail = species.get_tail(src) // Species tail icon_state prefix.
+ var/species_tail = species?.get_tail(src) // Species tail icon_state prefix.
//This one is actually not that bad I guess.
if(species_tail && !(wear_suit && wear_suit.flags_inv & HIDETAIL))
diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/homunculus.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/homunculus.dm
new file mode 100644
index 0000000000..3a65edf7b6
--- /dev/null
+++ b/code/modules/mob/living/simple_mob/subtypes/glamour/homunculus.dm
@@ -0,0 +1,35 @@
+/mob/living/simple_mob/homunculus
+ name = "homunculus"
+ desc = "A strange misshapen humanoid creature made purely from glamour!"
+
+ icon_dead = "homunculus"
+ icon_living = "homunculus"
+ icon_state = "homunculus"
+ icon = 'icons/mob/vore.dmi'
+
+ ai_holder_type = /datum/ai_holder/simple_mob/passive
+
+ min_oxy = 0
+ max_oxy = 0
+ min_tox = 0
+ max_tox = 0
+ min_co2 = 0
+ max_co2 = 0
+ min_n2 = 0
+ max_n2 = 0
+ minbodytemp = 0
+
+ var/owner
+
+/mob/living/simple_mob/homunculus/death()
+ if(owner)
+ var/obj/item/glamour_face/O = owner
+ O.homunculus = 0
+ qdel(src)
+
+/mob/living/simple_mob/homunculus/update_icon()
+ return
+
+/mob/living/simple_mob/homunculus/update_icons()
+ return
+
diff --git a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
index 4f62456cd2..d2932c0b25 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/ears_vr.dmi'
do_colouration = 0 // Set to 1 to blend (ICON_ADD) hair color
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
// Species-unique ears
@@ -30,6 +30,17 @@
do_colouration = 1
extra_overlay = "shadekin-round-inner"
+/datum/sprite_accessory/ears/lleill
+ name = "Lleill Ears, colorable"
+ desc = ""
+ icon = 'icons/mob/vore/ears_32x64.dmi'
+ icon_state = "lleill"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "lleill-antlers"
+ species_allowed = list(SPECIES_LLEILL)
+
+
// Ears avaliable to anyone
/datum/sprite_accessory/ears/alien_slug
diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm
index a4f1e457f5..b1f6a930a7 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail.dm
@@ -1058,3 +1058,12 @@
extra_overlay2 = "zorgoia_fluff_top"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
+
+/datum/sprite_accessory/tail/lleill
+ name = "Lleill tail"
+ desc = ""
+ icon = 'icons/mob/species/lleill/tail.dmi'
+ icon_state = "tail"
+ do_colouration = 1
+ color_blend_mode = ICON_MULTIPLY
+ extra_overlay = "tail_marking"
diff --git a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
index b71cede427..67f07f57b5 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail_vr.dm
@@ -13,7 +13,7 @@
var/mob_offset_x = 0
var/mob_offset_y = 0
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
var/list/lower_layer_dirs = list(SOUTH)
var/icon_loaf = null
diff --git a/code/modules/mob/new_player/sprite_accessories_vr.dm b/code/modules/mob/new_player/sprite_accessories_vr.dm
index d6e61062bf..ac03b0692d 100644
--- a/code/modules/mob/new_player/sprite_accessories_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_vr.dm
@@ -6,7 +6,7 @@
/datum/sprite_accessory/hair
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the default hairstyles.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use the default hairstyles.
/datum/sprite_accessory/hair/astolfo
name = "Astolfo"
@@ -485,20 +485,20 @@
/datum/sprite_accessory/facial_hair
icon = 'icons/mob/human_face_or_vr.dmi'
color_blend_mode = ICON_MULTIPLY
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use the facial hair styles.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use the facial hair styles.
/datum/sprite_accessory/facial_hair/shaved
name = "Shaved"
icon_state = "bald"
gender = NEUTER
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This needed to be manually defined, apparantly.
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This needed to be manually defined, apparantly.
/datum/sprite_accessory/facial_hair/neck_fluff
name = "Neck Fluff"
icon = 'icons/mob/human_face_or_vr.dmi'
icon_state = "facial_neckfluff"
gender = NEUTER
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN)
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL)
/datum/sprite_accessory/facial_hair/vulp_none
name = "None"
diff --git a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
index 1e8f6d4919..8bd27ee746 100644
--- a/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_wing_vr.dm
@@ -9,7 +9,7 @@
name = "You should not see this..."
icon = 'icons/mob/vore/wings_vr.dmi'
do_colouration = 0 //Set to 1 to enable coloration using the tail color.
- species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN) //This lets all races use
+ species_allowed = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_TESHARI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_FENNEC, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_XENOCHIMERA, SPECIES_XENOHYBRID, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_PROTEAN, SPECIES_ALRAUNE, SPECIES_WEREBEAST, SPECIES_SHADEKIN, SPECIES_SHADEKIN_CREW, SPECIES_ALTEVIAN, SPECIES_LLEILL) //This lets all races use
color_blend_mode = ICON_ADD // Only appliciable if do_coloration = 1
var/wing_offset = 0
var/multi_dir = FALSE // Does it use different sprites at different layers? _front will be added for sprites on low layer, _back to high layer
diff --git a/code/modules/multiz/portals_vr.dm b/code/modules/multiz/portals_vr.dm
index 4f6756ad49..a7a4c9c75b 100644
--- a/code/modules/multiz/portals_vr.dm
+++ b/code/modules/multiz/portals_vr.dm
@@ -93,7 +93,7 @@
if(portal_type == "Weird Green")
portal_icon_selection = "type-b-portal"
if(portal_type == "Pulsing")
- var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow"))
+ var/portal_subtype = tgui_alert(user, "Which subtype would you prefer?", "Subtype Selection", list("Blue","Red","Blue/Red Mix", "Yellow", "White"))
if(portal_subtype == "Blue")
portal_icon_selection = "type-c-blue-portal"
if(portal_subtype == "Red")
@@ -102,6 +102,8 @@
portal_icon_selection = "type-c-mix-portal"
if(portal_subtype == "Yellow")
portal_icon_selection = "type-c-yellow-portal"
+ if(portal_subtype == "White")
+ portal_icon_selection = "type-c-white-portal"
return portal_icon_selection
/obj/structure/portal_event/proc/teleport(atom/movable/M as mob|obj)
diff --git a/code/modules/organs/subtypes/lleill.dm b/code/modules/organs/subtypes/lleill.dm
new file mode 100644
index 0000000000..bd50b6ebff
--- /dev/null
+++ b/code/modules/organs/subtypes/lleill.dm
@@ -0,0 +1,3 @@
+/obj/item/organ/external/head/lleill
+ eye_icon_location = 'icons/mob/human_face_vr.dmi'
+ eye_icon = "eyes_lleill"
diff --git a/icons/mob/human_face_vr.dmi b/icons/mob/human_face_vr.dmi
index ea687def73..5da8720d00 100644
Binary files a/icons/mob/human_face_vr.dmi and b/icons/mob/human_face_vr.dmi differ
diff --git a/icons/mob/human_races/r_lleill.dmi b/icons/mob/human_races/r_lleill.dmi
new file mode 100644
index 0000000000..a3f6d1429b
Binary files /dev/null and b/icons/mob/human_races/r_lleill.dmi differ
diff --git a/icons/mob/species/lleill/tail.dmi b/icons/mob/species/lleill/tail.dmi
new file mode 100644
index 0000000000..3ff9003890
Binary files /dev/null and b/icons/mob/species/lleill/tail.dmi differ
diff --git a/icons/mob/vore.dmi b/icons/mob/vore.dmi
index 2aabf0438b..e11ef54c8d 100644
Binary files a/icons/mob/vore.dmi and b/icons/mob/vore.dmi differ
diff --git a/icons/mob/vore/ears_32x64.dmi b/icons/mob/vore/ears_32x64.dmi
index cfae3acbcb..1e73072d94 100644
Binary files a/icons/mob/vore/ears_32x64.dmi and b/icons/mob/vore/ears_32x64.dmi differ
diff --git a/icons/obj/glamour.dmi b/icons/obj/glamour.dmi
new file mode 100644
index 0000000000..2682d7badc
Binary files /dev/null and b/icons/obj/glamour.dmi differ
diff --git a/icons/obj/stationobjs_vr.dmi b/icons/obj/stationobjs_vr.dmi
index aa6df06395..8ce777ec97 100644
Binary files a/icons/obj/stationobjs_vr.dmi and b/icons/obj/stationobjs_vr.dmi differ
diff --git a/icons/turf/flooring/glamour.dmi b/icons/turf/flooring/glamour.dmi
index 74ee643065..8f60748a65 100644
Binary files a/icons/turf/flooring/glamour.dmi and b/icons/turf/flooring/glamour.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index ed1bfc3330..cd19d2ec9e 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2969,6 +2969,9 @@
#include "code\modules\mob\living\carbon\human\species\species_shapeshift.dm"
#include "code\modules\mob\living\carbon\human\species\species_shapeshift_vr.dm"
#include "code\modules\mob\living\carbon\human\species\species_vr.dm"
+#include "code\modules\mob\living\carbon\human\species\lleill\lleill.dm"
+#include "code\modules\mob\living\carbon\human\species\lleill\lleill_abilities.dm"
+#include "code\modules\mob\living\carbon\human\species\lleill\lleill_items.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\event.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\replicant.dm"
#include "code\modules\mob\living\carbon\human\species\outsider\shadow.dm"
@@ -3206,6 +3209,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\animal\space\worm.dm"
#include "code\modules\mob\living\simple_mob\subtypes\blob\blob.dm"
#include "code\modules\mob\living\simple_mob\subtypes\blob\spore.dm"
+#include "code\modules\mob\living\simple_mob\subtypes\glamour\homunculus.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\clown.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid.dm"
#include "code\modules\mob\living\simple_mob\subtypes\humanoid\humanoid_vr.dm"
@@ -3493,6 +3497,7 @@
#include "code\modules\organs\internal\robotic\robotic.dm"
#include "code\modules\organs\subtypes\diona.dm"
#include "code\modules\organs\subtypes\indestructible.dm"
+#include "code\modules\organs\subtypes\lleill.dm"
#include "code\modules\organs\subtypes\machine.dm"
#include "code\modules\organs\subtypes\nano.dm"
#include "code\modules\organs\subtypes\replicant.dm"