New event species - Part 1 (#16037)

* [WIP] Lleill Species

* 2nd Commit

Main functions are now complete and tested

* Renables accidentally disabled files

* Added white portal variant

* Added some glamour/whitespace props for mapping
This commit is contained in:
SatinIsle
2024-06-20 15:24:15 +10:00
committed by GitHub
parent e195df215f
commit 2edd5276d7
30 changed files with 694 additions and 12 deletions
+15
View File
@@ -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)
@@ -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)
@@ -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)
@@ -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)
@@ -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, "<span class='warning'>You can't go invisible when weakened like this.</span>")
return
if(!cloaked)
cloak()
to_chat(src, "<span class='warning'>Your fur shimmers and shifts around you, hiding you from the naked eye.</span>")
else
uncloak()
to_chat(src, "<span class='warning'>The brustling of your fur settles down and you become visible once again.</span>")
/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("<b>\The [src]</b> 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, "<span class='warning'>You can't go do that when weakened like this.</span>")
return
var/obj/item/I = get_active_hand()
if(!I)
to_chat(src, "<span class='warning'>You have no item in your active hand.</span>")
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, "<span class='warning'>The item is no longer in your hands.</span>")
return
else
visible_message("<b>\The [src]</b> begins to change the form of \the [I].")
if(!do_after(usr, 10 SECONDS, I, exclusive = TASK_USER_EXCLUSIVE))
visible_message("<b>\The [src]</b> leaves \the [I] in its original form.")
return 0
visible_message("<b>\The [src]</b> 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, "<span class='warning'>You can't go do that when weakened like this.</span>")
return
if(buckled)
to_chat(src,"<span class='warning'>You can't do that when restrained.</span>")
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("<b>\The [src]</b> begins to form white rings on the ground.")
return 0
to_chat(src, "<span class='warning'>You place a new glamour ring at your feet.</span>")
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, "<span class='warning'>You need to place rings to teleport to them.</span>")
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,"<span class='vwarning'>In a bright flash of white light, you suddenly find yourself trapped in \the [src]'s [vore_selected.name]!</span>")
@@ -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("<b>\The [target]</b> 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("<b>\The [target]</b> 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, "<span class='warning'>You feel as though you could change size at any moment.</span>")
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, "<span class='warning'>You can suddenly see much better than before.</span>")
target.species.darksight = 10
if(target.disabilities & NEARSIGHTED)
target.disabilities &= ~NEARSIGHTED
to_chat(target, "<span class='warning'>Everything is much less blurry.</span>")
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, "<span class='warning'>There are no appropriate targets in range.</span>")
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("<b>\The [H]</b> 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
@@ -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))
@@ -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
@@ -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
@@ -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"
@@ -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
@@ -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"
@@ -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