diff --git a/code/_onclick/hud/_defines_vr.dm b/code/_onclick/hud/_defines_vr.dm
index b419c6bd7f8..82d0af8b028 100644
--- a/code/_onclick/hud/_defines_vr.dm
+++ b/code/_onclick/hud/_defines_vr.dm
@@ -1,2 +1,3 @@
#define ui_shadekin_display "EAST-1:28,CENTER-3:15"
+#define ui_lleill_display "EAST-1:28,CENTER-3:15"
#define ui_xenochimera_danger_display "EAST-1:28,CENTER-3:15"
\ No newline at end of file
diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm
index da17e7616f3..44197fdcf4b 100644
--- a/code/_onclick/hud/human.dm
+++ b/code/_onclick/hud/human.dm
@@ -331,6 +331,11 @@
xenochimera_danger_display.screen_loc = ui_xenochimera_danger_display
xenochimera_danger_display.icon_state = "danger00"
hud_elements |= xenochimera_danger_display
+
+ lleill_display = new /obj/screen/lleill()
+ lleill_display.screen_loc = ui_lleill_display
+ lleill_display.icon_state = "lleill"
+ hud_elements |= lleill_display
//VOREStation Addition end
ling_chem_display = new /obj/screen/ling/chems()
diff --git a/code/_onclick/hud/screen_objects_vr.dm b/code/_onclick/hud/screen_objects_vr.dm
index 4d837803279..818d0fb658d 100644
--- a/code/_onclick/hud/screen_objects_vr.dm
+++ b/code/_onclick/hud/screen_objects_vr.dm
@@ -19,6 +19,10 @@
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/shadekin))
to_chat(usr,"Energy: [H.shadekin_get_energy(H)]")
+ if("lleill status")
+ var/mob/living/carbon/human/H = usr
+ if(istype(H))
+ to_chat(usr,"Energy: [H.species.lleill_energy]/[H.species.lleill_energy_max]")
if("danger level")
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera))
@@ -59,7 +63,7 @@
to_chat(usr, "We are currently reviving, and will be done in [round((H.revive_finished - world.time) / 10)] seconds, or [round(((H.revive_finished - world.time) * 0.1) / 60)] minutes.")
else if(H.revive_ready == REVIVING_DONE)
to_chat(usr, "You should have a notification + alert for this! Bug report that this is still here!")
-
+
if("Ready to Hatch") // Allow Viewing Reconstruction Timer + Hatching for 'chimera
var/mob/living/carbon/human/H = usr
if(istype(H) && istype(H.species, /datum/species/xenochimera)) // If you're somehow able to click this while not a chimera, this should prevent weird runtimes. Will need changing if regeneration is ever opened to non-chimera using the same alert.
diff --git a/code/modules/mob/living/carbon/human/species/lleill/hanner.dm b/code/modules/mob/living/carbon/human/species/lleill/hanner.dm
index a6a11613586..8269104dab2 100644
--- a/code/modules/mob/living/carbon/human/species/lleill/hanner.dm
+++ b/code/modules/mob/living/carbon/human/species/lleill/hanner.dm
@@ -89,10 +89,44 @@
/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_contact,
- /mob/living/carbon/human/proc/lleill_alchemy,
- /mob/living/carbon/human/proc/hanner_beast_form
+// /mob/living/carbon/human/proc/lleill_contact,
+// /mob/living/carbon/human/proc/lleill_alchemy,
+// /mob/living/carbon/human/proc/hanner_beast_form
)
valid_transform_species = list(SPECIES_HUMAN, SPECIES_HUMAN_VATBORN, SPECIES_UNATHI, SPECIES_TAJ, SPECIES_SKRELL, SPECIES_ALTEVIAN, SPECIES_TESHARI, SPECIES_MONKEY, SPECIES_LLEILL, SPECIES_VULPKANIN, SPECIES_ZORREN_HIGH, SPECIES_RAPALA, SPECIES_NEVREAN, SPECIES_VASILISSAN, SPECIES_AKULA)
+ var/list/lleill_abilities = list(/datum/power/lleill/contact,
+ /datum/power/lleill/alchemy,
+ /datum/power/lleill/beastform_hanner)
+
+ var/list/lleill_ability_datums = list()
+
+/datum/species/shapeshifter/hanner/New()
+ ..()
+ for(var/power in lleill_abilities)
+ var/datum/power/lleill/LP = new power(src)
+ lleill_ability_datums.Add(LP)
+
+/datum/species/shapeshifter/hanner/proc/add_lleill_abilities(var/mob/living/carbon/human/H)
+ if(!H.ability_master || !istype(H.ability_master, /obj/screen/movable/ability_master/lleill))
+ H.ability_master = null
+ H.ability_master = new /obj/screen/movable/ability_master/lleill(H)
+ for(var/datum/power/lleill/P in lleill_ability_datums)
+ if(!(P.verbpath in H.verbs))
+ H.verbs += P.verbpath
+ H.ability_master.add_lleill_ability(
+ object_given = H,
+ verb_given = P.verbpath,
+ name_given = P.name,
+ ability_icon_given = P.ability_icon_state,
+ arguments = list()
+ )
+ spawn (50)
+ if(H.lleill_display)
+ H.lleill_display.invisibility = 0
+ H.lleill_display.icon_state = "lleill-4"
+
+/datum/species/shapeshifter/hanner/add_inherent_verbs(var/mob/living/carbon/human/H)
+ ..()
+ add_lleill_abilities(H)
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 b03c32d00f9..4072e5af050 100644
--- a/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill.dm
@@ -83,12 +83,13 @@
/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,
- /mob/living/carbon/human/proc/lleill_contact,
- /mob/living/carbon/human/proc/lleill_alchemy,
- /mob/living/carbon/human/proc/lleill_beast_form)
+// /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_contact,
+// /mob/living/carbon/human/proc/lleill_alchemy,
+// /mob/living/carbon/human/proc/lleill_beast_form
+ )
//organs, going with just the basics for now
@@ -122,6 +123,15 @@
base_species = SPECIES_LLEILL
+ var/list/lleill_abilities = list(/datum/power/lleill/invisibility,
+ /datum/power/lleill/transmute,
+ /datum/power/lleill/rings,
+ /datum/power/lleill/contact,
+ /datum/power/lleill/alchemy,
+ /datum/power/lleill/beastform)
+
+ var/list/lleill_ability_datums = list()
+
// 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)
@@ -183,3 +193,50 @@
if(!S || S.name == src.name)
return ..()
return S?.get_tail_hair(H)
+
+/datum/species/lleill/New()
+ ..()
+ for(var/power in lleill_abilities)
+ var/datum/power/lleill/LP = new power(src)
+ lleill_ability_datums.Add(LP)
+
+/datum/species/lleill/proc/add_lleill_abilities(var/mob/living/carbon/human/H)
+ if(!H.ability_master || !istype(H.ability_master, /obj/screen/movable/ability_master/lleill))
+ H.ability_master = null
+ H.ability_master = new /obj/screen/movable/ability_master/lleill(H)
+ for(var/datum/power/lleill/P in lleill_ability_datums)
+ if(!(P.verbpath in H.verbs))
+ H.verbs += P.verbpath
+ H.ability_master.add_lleill_ability(
+ object_given = H,
+ verb_given = P.verbpath,
+ name_given = P.name,
+ ability_icon_given = P.ability_icon_state,
+ arguments = list()
+ )
+ spawn (50)
+ if(H.lleill_display)
+ H.lleill_display.invisibility = 0
+ H.lleill_display.icon_state = "lleill-4"
+
+/datum/species/proc/update_lleill_hud(var/mob/living/carbon/human/H)
+ var/relative_energy = ((lleill_energy/lleill_energy_max)*100)
+ if(H.lleill_display)
+ H.lleill_display.invisibility = 0
+ switch(relative_energy)
+ if(0 to 24)
+ H.lleill_display.icon_state = "lleill-0"
+ if(25 to 49)
+ H.lleill_display.icon_state = "lleill-1"
+ if(50 to 74)
+ H.lleill_display.icon_state = "lleill-2"
+ if(75 to 99)
+ H.lleill_display.icon_state = "lleill-3"
+ if(100 to INFINITY)
+ H.lleill_display.icon_state = "lleill-4"
+ return
+
+/datum/species/lleill/add_inherent_verbs(var/mob/living/carbon/human/H)
+ ..()
+ add_lleill_abilities(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
index d79dab9d86b..6c9095513ce 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
@@ -4,9 +4,10 @@
// Essentially the same as traitor cloaking, using the same proc for it.
/datum/power/lleill/invisibility
- name = "Invisibility"
+ name = "Invisibility (75)"
desc = "Change your appearance to match your surroundings, becoming completely invisible to the naked eye."
verbpath = /mob/living/carbon/human/proc/lleill_invisibility
+ ability_icon_state = "ling_camoflage"
/mob/living/carbon/human/proc/lleill_invisibility()
set name = "Invisibility (75)"
@@ -33,6 +34,7 @@
block_hud = 0
hud_updateflag = 1
to_chat(src, "The brustling of your fur settles down and you become visible once again.")
+ species.update_lleill_hud(src)
/mob/living/carbon/human/proc/lleill_select_shape()
@@ -90,6 +92,12 @@
regenerate_icons()
+/datum/power/lleill/transmute
+ name = "Transmute Object (50)"
+ desc = "Convert an object into a piece of glamour."
+ verbpath = /mob/living/carbon/human/proc/lleill_transmute
+ ability_icon_state = "lleill_transmute"
+
/mob/living/carbon/human/proc/lleill_transmute()
set name = "Transmute Object (50)"
set desc = "Convert an object into a piece of glamour."
@@ -144,6 +152,13 @@
var/obj/item/N = new transmute_product(spawnloc)
put_in_active_hand(N)
species.lleill_energy -= energy_cost
+ species.update_lleill_hud(src)
+
+/datum/power/lleill/rings
+ name = "Glamour Rings"
+ desc = "Place or teleport to a glamour ring."
+ verbpath = /mob/living/carbon/human/proc/lleill_rings
+ ability_icon_state = "lleill_ring"
/mob/living/carbon/human/proc/lleill_rings()
set name = "Place/Use Rings"
@@ -214,6 +229,13 @@
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]!")
+ species.update_lleill_hud(src)
+
+/datum/power/lleill/contact
+ name = "Energy Transfer"
+ desc = "Take the energy of another creature by making physical contact with them, the other party must consent. This will make them feel drained."
+ verbpath = /mob/living/carbon/human/proc/lleill_contact
+ ability_icon_state = "lleill_contact"
/mob/living/carbon/human/proc/lleill_contact()
set name = "Energy Transfer"
@@ -300,6 +322,13 @@
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.")
+ species.update_lleill_hud(src)
+
+/datum/power/lleill/alchemy
+ name = "Alchemy (25)"
+ desc = "Convert a potion material into a potion without the use of a base or alembic."
+ verbpath = /mob/living/carbon/human/proc/lleill_alchemy
+ ability_icon_state = "lleill_alchemy"
/mob/living/carbon/human/proc/lleill_alchemy()
set name = "Alchemy (25)"
@@ -342,6 +371,13 @@
var/obj/item/N = new transmute_product(spawnloc)
put_in_active_hand(N)
species.lleill_energy -= energy_cost
+ species.update_lleill_hud(src)
+
+/datum/power/lleill/beastform
+ name = "Beast Form (100)"
+ desc = "Take the form of a non-humanoid creature."
+ verbpath = /mob/living/carbon/human/proc/lleill_beast_form
+ ability_icon_state = "lleill_beast"
/mob/living/carbon/human/proc/lleill_beast_form()
set name = "Beast Form (100)"
@@ -478,6 +514,7 @@
M.forceMove(new_mob)
new_mob.tf_mob_holder = M
new_mob.visible_message("\The [src] has transformed into \the [chosen_beast]!")
+ species.update_lleill_hud(src)
/mob/living/carbon/human/proc/spawn_beast_mob(var/chosen_beast)
@@ -510,6 +547,12 @@
//Hanner variant
+/datum/power/lleill/beastform_hanner
+ name = "Beast Form (100)"
+ desc = "Take the form of a non-humanoid creature."
+ verbpath = /mob/living/carbon/human/proc/hanner_beast_form
+ ability_icon_state = "lleill_beast"
+
/mob/living/carbon/human/proc/hanner_beast_form()
set name = "Beast Form (100)"
set desc = "Take the form of a non-humanoid creature."
diff --git a/code/modules/mob/living/carbon/human/species/lleill/lleill_hud.dm b/code/modules/mob/living/carbon/human/species/lleill/lleill_hud.dm
new file mode 100644
index 00000000000..d3f2d68e4d8
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/species/lleill/lleill_hud.dm
@@ -0,0 +1,48 @@
+/obj/screen/lleill
+ name = "lleill status"
+ icon = 'icons/mob/lleill_hud.dmi'
+ invisibility = 101
+
+
+/obj/screen/movable/ability_master/lleill
+ name = "Lleill Abilities"
+ icon = 'icons/mob/screen_spells.dmi'
+ icon_state = "grey_spell_ready"
+ ability_objects = list()
+ showing = 0
+
+ open_state = "master_open"
+ closed_state = "master_closed"
+
+ screen_loc = ui_spell_master
+
+/obj/screen/movable/ability_master/lleill/update_abilities(forced = 0, mob/user) //Different proc to prevent indexing
+ update_icon()
+ if(user && user.client)
+ if(!(src in user.client.screen))
+ user.client.screen += src
+ for(var/obj/screen/ability/ability in ability_objects)
+ ability.update_icon(forced)
+
+/obj/screen/ability/verb_based/lleill
+ icon_state = "grey_spell_base"
+ background_base_state = "grey"
+
+/obj/screen/movable/ability_master/proc/add_lleill_ability(var/object_given, var/verb_given, var/name_given, var/ability_icon_given, var/arguments)
+ if(!object_given)
+ message_admins("ERROR: add_lleill_ability() was not given an object in its arguments.")
+ if(!verb_given)
+ message_admins("ERROR: add_lleill_ability() was not given a verb/proc in its arguments.")
+ if(get_ability_by_proc_ref(verb_given))
+ return // Duplicate
+ var/obj/screen/ability/verb_based/lleill/A = new /obj/screen/ability/verb_based/lleill()
+ A.ability_master = src
+ A.object_used = object_given
+ A.verb_to_call = verb_given
+ A.ability_icon_state = ability_icon_given
+ A.name = name_given
+ if(arguments)
+ A.arguments_to_use = arguments
+ ability_objects.Add(A)
+ if(my_mob.client)
+ toggle_open(2)
diff --git a/code/modules/mob/mob_defines_vr.dm b/code/modules/mob/mob_defines_vr.dm
index 0eaed29131d..3be06ebe6b6 100644
--- a/code/modules/mob/mob_defines_vr.dm
+++ b/code/modules/mob/mob_defines_vr.dm
@@ -6,6 +6,7 @@
var/disconnect_time = null //Time of client loss, set by Logout(), for timekeeping
var/obj/screen/shadekin/shadekin_display = null
+ var/obj/screen/shadekin/lleill_display = null
var/obj/screen/xenochimera/danger_level/xenochimera_danger_display = null
var/size_multiplier = 1 //multiplier for the mob's icon size
diff --git a/icons/mob/lleill_hud.dmi b/icons/mob/lleill_hud.dmi
new file mode 100644
index 00000000000..704635dbbbf
Binary files /dev/null and b/icons/mob/lleill_hud.dmi differ
diff --git a/icons/mob/screen_spells.dmi b/icons/mob/screen_spells.dmi
index 4dd42bac21d..5ce66a1eaa0 100644
Binary files a/icons/mob/screen_spells.dmi and b/icons/mob/screen_spells.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 99fbc8e8d50..9529e2c57dd 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2967,6 +2967,7 @@
#include "code\modules\mob\living\carbon\human\species\lleill\hanner.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_hud.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"