diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm
index 0d06544a7e4..eccfb7d30a1 100644
--- a/code/__defines/flags.dm
+++ b/code/__defines/flags.dm
@@ -43,6 +43,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define BLOCK_GAS_SMOKE_EFFECT (1<<3) // Blocks the effect that chemical clouds would have on a mob -- glasses, mask and helmets ONLY! (NOTE: flag shared with ONESIZEFITSALL)
#define FLEXIBLEMATERIAL (1<<4) // At the moment, masks with this flag will not prevent eating even if they are covering your face.
#define ALLOW_SURVIVALFOOD (1<<5) // Allows special survival food items to be eaten through it
+#define INFINITE_AIR (1<<6) // Provides an infinite air supply.
// Flags for pass_flags. - Used in /atom/var/pass_flags
#define PASSTABLE (1<<0)
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index f2e09405ee4..2a0bf0dc140 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -161,3 +161,5 @@
// Custom Species Name
var/custom_species
+
+ var/block_hud
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 115c9defdc3..12e7fa470ce 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -537,6 +537,11 @@
suiciding--
return 0
+ if(wear_mask && (wear_mask.item_flags & INFINITE_AIR))
+ failed_last_breath = 0
+ adjustOxyLoss(-5)
+ return
+
if(does_not_breathe)
failed_last_breath = 0
adjustOxyLoss(-5)
@@ -1972,6 +1977,8 @@
holder.icon_state = "-100" // X_X
else
holder.icon_state = RoundHealth((health-config.health_threshold_crit)/(getMaxHealth()-config.health_threshold_crit)*100)
+ if(block_hud)
+ holder.icon_state = "hudblank"
apply_hud(HEALTH_HUD, holder)
if (BITTEST(hud_updateflag, LIFE_HUD))
@@ -1982,6 +1989,8 @@
holder.icon_state = "huddead"
else
holder.icon_state = "hudhealthy"
+ if(block_hud)
+ holder.icon_state = "hudblank"
apply_hud(LIFE_HUD, holder)
if (BITTEST(hud_updateflag, STATUS_HUD))
@@ -2013,6 +2022,9 @@
holder2.icon_state = "hudill"
else
holder2.icon_state = "hudhealthy"
+ if(block_hud)
+ holder.icon_state = "hudblank"
+ holder2.icon_state = "hudblank"
apply_hud(STATUS_HUD, holder)
apply_hud(STATUS_HUD_OOC, holder2)
@@ -2028,6 +2040,8 @@
else
holder.icon_state = "hudunknown"
+ if(block_hud)
+ holder.icon_state = "hudblank"
apply_hud(ID_HUD, holder)
if (BITTEST(hud_updateflag, WANTED_HUD))
@@ -2054,7 +2068,8 @@
else if((R.fields["id"] == E.fields["id"]) && (R.fields["criminal"] == "Released"))
holder.icon_state = "hudreleased"
break
-
+ if(block_hud)
+ holder.icon_state = "hudblank"
apply_hud(WANTED_HUD, holder)
if ( BITTEST(hud_updateflag, IMPLOYAL_HUD) \
diff --git a/code/modules/mob/living/carbon/human/life_vr.dm b/code/modules/mob/living/carbon/human/life_vr.dm
index 8e52e3daafa..126fb01012f 100644
--- a/code/modules/mob/living/carbon/human/life_vr.dm
+++ b/code/modules/mob/living/carbon/human/life_vr.dm
@@ -21,6 +21,8 @@
var/image/other_status = hud_list[STATUS_HUD]
var/image/status_r = grab_hud(STATUS_R_HUD)
status_r.icon_state = other_status.icon_state
+ if(block_hud)
+ status_r.icon_state = "hudblank"
apply_hud(STATUS_R_HUD, status_r)
//Our custom health bar HUD
@@ -28,6 +30,8 @@
var/image/other_health = hud_list[HEALTH_HUD]
var/image/health_us = grab_hud(HEALTH_VR_HUD)
health_us.icon_state = other_health.icon_state
+ if(block_hud)
+ health_us.icon_state = "hudblank"
apply_hud(HEALTH_VR_HUD, health_us)
//Backup implant hud status
@@ -46,7 +50,8 @@
holder.icon_state = "hud_backup_nobody"
else
holder.icon_state = "hud_backup_norm"
-
+ if(block_hud)
+ holder.icon_state = "hudblank"
apply_hud(BACKUP_HUD, holder)
//VOREStation Antag Hud
@@ -56,6 +61,8 @@
vantag.icon_state = vantag_pref
else
vantag.icon_state = "hudblank"
+ if(block_hud)
+ vantag.icon_state = "hudblank"
apply_hud(VANTAG_HUD, vantag)
//Our call for the NIF to do whatever
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
index 48146df8e8a..5ead8ebb51d 100644
--- a/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
@@ -33,6 +33,11 @@
//Specific abilities
+ var/lleill_energy = 200
+ var/lleill_energy_max = 200
+
+ var/ring_cooldown = 0
+
darksight = 10 //Can see in dark
burn_mod = 0.25 //Very resistant to fire
@@ -43,6 +48,8 @@
warning_high_pressure = 300
hazard_high_pressure = 10000 //Can be killed by pressure but you're going to need a hell of a lot
+ minimum_breath_pressure = 0 //Doesn't gasp and lungs shouldn't pop
+
cold_level_1 = -1 //Safe in space
cold_level_2 = -1
cold_level_3 = -1
@@ -81,7 +88,9 @@
/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)
+ /mob/living/carbon/human/proc/lleill_rings,
+ /mob/living/carbon/human/proc/lleill_contact,
+ /mob/living/carbon/human/proc/lleill_alchemy)
//organs, going with just the basics for now
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
index 97ee036c8a7..e428f331a56 100644
--- a/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_abilities.dm
@@ -9,19 +9,35 @@
verbpath = /mob/living/carbon/human/proc/lleill_invisibility
/mob/living/carbon/human/proc/lleill_invisibility()
- set name = "Invisibility"
+ set name = "Invisibility (75)"
set desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
set category = "Abilities"
+ var/energy_cost = 75
+
+ var/datum/species/lleill/LL = species
+
+ if(!istype(LL))
+ to_chat(src, "Only a lleill can use that!")
+ return
+
if(stat)
to_chat(src, "You can't go invisible when weakened like this.")
return
if(!cloaked)
+ if(LL.lleill_energy < energy_cost)
+ to_chat(src, "You do not have enough energy to do that!")
+ return
cloak()
+ block_hud = 1
+ hud_updateflag = 1
to_chat(src, "Your fur shimmers and shifts around you, hiding you from the naked eye.")
+ LL.lleill_energy -= energy_cost
else
uncloak()
+ block_hud = 0
+ hud_updateflag = 1
to_chat(src, "The brustling of your fur settles down and you become visible once again.")
/mob/living/carbon/human/proc/lleill_select_shape()
@@ -81,20 +97,34 @@
regenerate_icons()
/mob/living/carbon/human/proc/lleill_transmute()
- set name = "Transmute Object"
+ set name = "Transmute Object (50)"
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
+ "Transparent Glamour" = /obj/item/weapon/potion_material/glamour_transparent,
+ "Shrinking Glamour" = /obj/item/weapon/potion_material/glamour_shrinking,
+ "Twinkling Glamour" = /obj/item/weapon/potion_material/glamour_twinkling,
+ "Glamour Shard" = /obj/item/weapon/potion_material/glamour_shard,
+ "Glamour Cell" = /obj/item/capture_crystal/glamour,
+ "Face of Glamour" = /obj/item/glamour_face,
+ "Speaking Glamour" = /obj/item/device/universal_translator/glamour,
+ "Glamour Bubble" = /obj/item/clothing/mask/gas/glamour,
+ "Pocket of Glamour" = /obj/item/clothing/under/permit/glamour
)
+ var/energy_cost = 50
+
+ var/datum/species/lleill/LL = species
+
+ if(!istype(LL))
+ to_chat(src, "Only a lleill can use that!")
+ return
+
+ if(LL.lleill_energy < energy_cost)
+ to_chat(src, "You do not have enough energy to do that!")
+ return
+
if(stat)
to_chat(src, "You can't go do that when weakened like this.")
return
@@ -104,7 +134,13 @@
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)
+ var/choice = tgui_input_list(src, "Choose a glamour to transmute the item into:", "Transmutation", transmute_list)
+
+ if(!choice)
+ return
+ var/obj/item/transmute_product = transmute_list[choice]
+
+
if(!get_active_hand(I))
to_chat(src, "The item is no longer in your hands.")
return
@@ -113,36 +149,54 @@
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].")
+ visible_message("\The [src] transmutes \the [I] into \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)
+ LL.lleill_energy -= energy_cost
/mob/living/carbon/human/proc/lleill_rings()
set name = "Place/Use Rings"
set desc = "Place or teleport to a glamour ring."
set category = "Abilities"
+ var/energy_cost_multi = src.teleporters.len
+ var/energy_cost_spawn = (25 * energy_cost_multi)
+ var/energy_cost_tele = 50
+
+ var/datum/species/lleill/LL = species
+
+ if(!istype(LL))
+ to_chat(src, "Only a lleill can use that!")
+ return
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"))
+ var/r_action = tgui_alert(src, "What would you like to do with your rings? You currently have [LL.lleill_energy] energy remaining.", "Actions", list("Spawn New Ring ([energy_cost_spawn])", "Teleport to Ring ([energy_cost_tele])", "Cancel"))
if(r_action == "Cancel")
return
- if(r_action == "Spawn New Ring")
+ if(findtext(r_action,"Spawn New Ring"))
+ if(LL.lleill_energy < energy_cost_spawn)
+ to_chat(src, "You do not have enough energy to do that!")
+ return
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)
+ R.connected_mob = src
src.teleporters |= R
- if(r_action == "Teleport to Ring")
+ LL.lleill_energy -= energy_cost_spawn
+ if(findtext(r_action,"Teleport to Ring"))
+ if(LL.lleill_energy < energy_cost_tele)
+ to_chat(src, "You do not have enough energy to do that!")
+ return
if(!src.teleporters.len)
to_chat(src, "You need to place rings to teleport to them.")
return
@@ -160,6 +214,7 @@
var/S = get_turf(R)
src.forceMove(S)
+ LL.lleill_energy -= energy_cost_tele
spk.start()
playsound(S, 'sound/effects/phasein.ogg', 25, 1)
@@ -177,3 +232,139 @@
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]!")
+/mob/living/carbon/human/proc/lleill_contact()
+ set name = "Energy Transfer"
+ set desc = "Take the energy of another creature by making physical contact with them, the other party must consent. This will make them feel drained."
+ set category = "Abilities"
+ if(!ishuman(src))
+ return //If you're not a human you don't have permission to do this.
+ var/datum/species/lleill/LL = species
+
+ var/list/contact_options = list(
+ "Kiss (lips)",
+ "Kiss (neck)",
+ "Bite (neck)",
+ "Bite (wrist)",
+ "Hold Hand",
+ "Embrace",
+ "Boop (nose)",
+ "Stroke (hair)",
+ "Custom"
+ )
+
+ if(!istype(LL))
+ to_chat(src, "Only a lleill can use that!")
+ return
+ if(stat)
+ to_chat(src, "You can't go do that when weakened like this.")
+ return
+
+ var/list/targets = list()
+ for(var/mob/living/carbon/human/M in mob_list)
+ if(M.z != src.z || get_dist(src,M) > 1)
+ continue
+ if(src == M)
+ continue
+ targets |= M
+
+ if(!targets)
+ to_chat(src, "There is nobody next to you.")
+ return
+ var/mob/living/carbon/human/chosen_target = tgui_input_list(src, "Who do you wish to take energy from?", "Make contact", targets)
+ if(!chosen_target)
+ return
+
+ var/contact_type = tgui_input_list(src, "How do you wish to make contact with \the [chosen_target]?", "Contact type", contact_options)
+ if(!contact_type)
+ return
+
+ var/custom_text
+ if(contact_type == "Custom")
+ custom_text = tgui_input_text(src, "Write a description of how you make contact with \the [chosen_target], from a third person perspective.", "Custom contact")
+
+ var/accepted = tgui_alert(chosen_target, "Do you accept the [contact_type] physical contact from \the [src]?", "Actions", list("Yes", "No"))
+ if(get_dist(src,chosen_target) > 1)
+ to_chat(src, "You need to be standing next to [chosen_target].")
+ return
+ if(accepted == "No")
+ to_chat(src, "\The [chosen_target] refuses the contact.")
+ return
+ if(accepted == "Yes")
+ if(contact_type == "Kiss (lips)")
+ src.visible_message("\The [src] presses their lips up against [chosen_target]'s own.")
+ if(contact_type == "Kiss (neck)")
+ src.visible_message("\The [src] presses their lips up against [chosen_target]'s neck.")
+ if(contact_type == "Bite (neck)")
+ src.visible_message("\The [src] bites down on [chosen_target]'s neck.")
+ if(contact_type == "Bite (wrist)")
+ src.visible_message("\The [src] bites down on [chosen_target]'s wrist.")
+ if(contact_type == "Hold Hand")
+ src.visible_message("\The [src] takes [chosen_target]'s hand into their own.")
+ if(contact_type == "Embrace")
+ src.visible_message("\The [src] embraces [chosen_target].")
+ if(contact_type == "Stroke (hair)")
+ src.visible_message("\The [src] runs their hand through [chosen_target]'s hair.")
+ if(contact_type == "Boop (nose)")
+ src.visible_message("\The [src] boops [chosen_target] on the nose.")
+ if(contact_type == "Custom")
+ src.visible_message("[custom_text]")
+ if(!do_after(src, 10 SECONDS, chosen_target, exclusive = TASK_USER_EXCLUSIVE))
+ return
+ else
+ src.visible_message("\The [src] and \the [chosen_target] break contact before energy has been transferred.")
+ src.visible_message("\The [src] and \the [chosen_target] complete their contact.")
+ LL.lleill_energy = LL.lleill_energy_max
+ nutrition += (chosen_target.nutrition / 2)
+ to_chat(src, "You feel revitalised.")
+ chosen_target.tiredness += 70
+ chosen_target.nutrition = max((chosen_target.nutrition / 2),75)
+ chosen_target.remove_blood(40) //removes enough blood to make them feel a bit woozy, mostly just for flavour
+ chosen_target.eye_blurry += 20
+ to_chat(chosen_target, "You feel considerably weakened for the moment.")
+
+/mob/living/carbon/human/proc/lleill_alchemy()
+ set name = "Alchemy (25)"
+ set desc = "Convert a potion material into a potion without the use of a base or alembic."
+ set category = "Abilities"
+
+ var/energy_cost = 25
+
+ var/datum/species/lleill/LL = species
+
+ if(!istype(LL))
+ to_chat(src, "Only a lleill can use that!")
+ return
+
+ if(LL.lleill_energy < energy_cost)
+ to_chat(src, "You do not have enough energy to do that!")
+ return
+
+ if(stat)
+ to_chat(src, "You can't go do that when weakened like this.")
+ return
+
+ var/obj/item/weapon/potion_material/I = get_active_hand()
+ if(!I)
+ to_chat(src, "You have no item in your active hand.")
+ return
+
+ if(!istype(I))
+ to_chat(src, "\The [I] is not a potion material.")
+ return
+ var/obj/item/weapon/reagent_containers/glass/bottle/potion/transmute_product = I.product_potion
+
+ 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 \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)
+ LL.lleill_energy -= energy_cost
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
index 8b724fe8b6b..2a1603e8b88 100644
--- a/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_items.dm
@@ -139,6 +139,8 @@
return
var/mob/living/carbon/human/chosen_target = tgui_input_list(user, "Which target do you wish to create a homunculus of?", "homunculus", targets)
+ if(!chosen_target)
+ return
var/spawnloc = get_turf(user)
var/mob/living/simple_mob/homunculus/H = new(spawnloc)
@@ -175,6 +177,43 @@
icon = 'icons/obj/glamour.dmi'
icon_state = "translator"
+/obj/item/device/universal_translator/glamour/hear_talk(mob/M, list/message_pieces, verb)
+ if(!listening || !istype(M))
+ return
+
+ //Show the "I heard something" animation.
+ if(mult_icons)
+ flick("[initial(icon_state)]2",src)
+
+ //Handheld or pocket only.
+ if(!isliving(loc))
+ return
+
+ var/mob/living/L = loc
+ if(visual && ((L.sdisabilities & BLIND) || L.eye_blind))
+ return
+ if(audio && ((L.sdisabilities & DEAF) || L.ear_deaf))
+ return
+
+ // Using two for loops kinda sucks, but I think it's more efficient
+ // to shortcut past string building if we're just going to discard the string
+ // anyways.
+ if(user_understands(M, L, message_pieces))
+ return
+
+ var/new_message = ""
+
+ for(var/datum/multilingual_say_piece/S in message_pieces)
+ if(S.speaking.flags & NONVERBAL)
+ continue
+
+ new_message += (S.message + " ")
+
+ if(!L.say_understands(null, langset))
+ new_message = langset.scramble(new_message)
+
+ to_chat(L, "[src] translates, \"[new_message]\"")
+
//Teleporter ring
/obj/structure/glamour_ring
@@ -194,5 +233,58 @@
area_name = A.name
name = "[area_name] glamour ring"
+/obj/structure/glamour_ring/attack_hand(mob/living/M as mob)
+
+ var/mob/living/carbon/human/L = connected_mob
+ var/datum/species/lleill/LL = L.species
+
+ var/m_action
+ if(M == L)
+ m_action= tgui_alert(M, "Do you want to destroy the ring, or restore energy?", "Destroy ring", list("Yes", "No", "Restore Energy"))
+ else
+ m_action= tgui_alert(M, "Do you want to destroy the ring, the owner of it may be aware that you have done this?", "Destroy ring", list("Yes", "No"))
+
+ if(m_action == "No")
+ return
+
+ if(m_action == "Yes")
+ to_chat(M, "You begin to break the lines of the glamour ring.")
+ if(!do_after(M, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ to_chat(M, "You leave the glamour ring alone.")
+ return
+ to_chat(M, "You have destroyed \the [src].")
+ src.visible_message("\The [M] has broken apart \the [src].")
+ if(M != connected_mob && connected_mob)
+ to_chat(connected_mob, "\The [src] has been destroyed by \the [M].")
+ if(istype(LL))
+ L.teleporters -= src
+ qdel(src)
+
+ if(m_action == "Restore Energy")
+ if(LL.ring_cooldown + 10 MINUTES > world.time)
+ to_chat(M, "You must wait a while before drawing energy from the glamour again.")
+ return
+ if(!do_after(M, 10 SECONDS, src, exclusive = TASK_USER_EXCLUSIVE))
+ to_chat(M, "You stop drawing energy.")
+ return
+ LL.lleill_energy = min((LL.lleill_energy + 75),LL.lleill_energy_max)
+
+//Glamour Helm
+
+/obj/item/clothing/mask/gas/glamour
+ desc = "A bubble-like helmet of glamour that can protect your face from the atmosphere, or lack thereof, outside."
+ name = "glamour bubble"
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "bubble"
+ item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT | ALLOW_SURVIVALFOOD | INFINITE_AIR
+
+//Glamour Pockets
+
+/obj/item/clothing/under/permit/glamour
+ name = "pocket of glamour"
+ desc = "A small crystal of glamour that is capable of storing small items inside of it."
+ icon = 'icons/obj/glamour.dmi'
+ icon_state = "pocket"
+
//Glamour Floor
//Glamour Wall
\ No newline at end of file
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 d2932c0b258..afb8652050a 100644
--- a/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
+++ b/code/modules/mob/new_player/sprite_accessories_ear_vr.dm
@@ -40,6 +40,15 @@
extra_overlay = "lleill-antlers"
species_allowed = list(SPECIES_LLEILL)
+/datum/sprite_accessory/ears/lleill/curled
+ name = "Lleill Ears Curled, colorable"
+ icon_state = "lleill2"
+ extra_overlay = "lleill2-antlers"
+
+/datum/sprite_accessory/ears/lleill/tall
+ name = "Lleill Ears Tall, colorable"
+ icon_state = "lleill3"
+ extra_overlay = "lleill3-antlers"
// Ears avaliable to anyone
diff --git a/code/modules/mob/new_player/sprite_accessories_tail.dm b/code/modules/mob/new_player/sprite_accessories_tail.dm
index b1f6a930a73..fd9ad113829 100644
--- a/code/modules/mob/new_player/sprite_accessories_tail.dm
+++ b/code/modules/mob/new_player/sprite_accessories_tail.dm
@@ -1067,3 +1067,13 @@
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
extra_overlay = "tail_marking"
+
+/datum/sprite_accessory/tail/lleill/large
+ name = "Lleill tail, Large"
+ icon_state = "tail2"
+ extra_overlay = "tail2_marking"
+
+/datum/sprite_accessory/tail/lleill/small
+ name = "Lleill tail, Small"
+ icon_state = "tail3"
+ extra_overlay = "tail3_marking"
diff --git a/code/modules/reagents/machinery/alembic.dm b/code/modules/reagents/machinery/alembic.dm
index 99f38aa049c..78e9c7feb6a 100644
--- a/code/modules/reagents/machinery/alembic.dm
+++ b/code/modules/reagents/machinery/alembic.dm
@@ -292,7 +292,7 @@
product_potion = /obj/item/weapon/reagent_containers/glass/bottle/potion/truepolymorph
/obj/item/weapon/potion_material/glamour_shard
- name = "glamour_shard"
+ name = "glamour shard"
desc = "A shard of hardened white crystal that seems to change shapes as you hold it."
icon = 'icons/obj/chemical_potionreagents.dmi'
icon_state = "glamour_shard"
diff --git a/icons/inventory/face/mob.dmi b/icons/inventory/face/mob.dmi
index 25b3466e07b..98a73bc7888 100644
Binary files a/icons/inventory/face/mob.dmi and b/icons/inventory/face/mob.dmi differ
diff --git a/icons/inventory/face/mob_vr.dmi b/icons/inventory/face/mob_vr.dmi
index 6596062c57f..f15317e9d5f 100644
Binary files a/icons/inventory/face/mob_vr.dmi and b/icons/inventory/face/mob_vr.dmi differ
diff --git a/icons/mob/species/lleill/tail.dmi b/icons/mob/species/lleill/tail.dmi
index 3ff90038904..d534d35fec3 100644
Binary files a/icons/mob/species/lleill/tail.dmi and b/icons/mob/species/lleill/tail.dmi differ
diff --git a/icons/mob/vore/ears_32x64.dmi b/icons/mob/vore/ears_32x64.dmi
index 1e73072d946..97165c67d12 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
index 2682d7badcf..6e110af3a25 100644
Binary files a/icons/obj/glamour.dmi and b/icons/obj/glamour.dmi differ