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"