diff --git a/code/__defines/materials.dm b/code/__defines/materials.dm index 8f68d8a8d3..cb8ade0988 100644 --- a/code/__defines/materials.dm +++ b/code/__defines/materials.dm @@ -63,6 +63,7 @@ #define MAT_WEEDEXTRACT "weed extract" #define MAT_CARDBOARD "cardboard" #define MAT_COTTON "cotton" +#define MAT_GLAMOUR "stable glamour" // cloth materials #define MAT_WOOL "wool" diff --git a/code/game/turfs/glamour_turfs.dm b/code/game/turfs/glamour_turfs.dm new file mode 100644 index 0000000000..a3fc953db1 --- /dev/null +++ b/code/game/turfs/glamour_turfs.dm @@ -0,0 +1,50 @@ +/turf/unsimulated/wall/glamour + name = "glamour" + desc = "A blindingly white light that appears to cast your reflection." + icon = 'icons/turf/flooring/glamour.dmi' + icon_state = "glamour" + +/turf/simulated/floor/glamour + name = "glamour" + desc = "A blindingly white light that appears to cast your reflection." + icon = 'icons/turf/flooring/glamour.dmi' + icon_state = "glamour" + light_range = 7 + light_power = 1 + light_color = "#ffffff" + light_on = TRUE + +/turf/simulated/floor/wood/glamour + name = "wooden floor" + icon = 'icons/turf/flooring/glamour.dmi' + icon_state = "wood" + initial_flooring = /decl/flooring/wood/glamour + +/decl/flooring/wood/glamour + name = "wooden glamour" + desc = "Polished glamourwood planks." + icon = 'icons/turf/flooring/glamour.dmi' + icon_base = "wood" + descriptor = "planks" + build_type = null + flags = TURF_CAN_BREAK + +/turf/simulated/wall/glamourbrick + icon_state = "glamourbrick" + icon = 'icons/turf/flooring/glamour.dmi' + +/turf/simulated/wall/glamourbrick/Initialize(mapload) + . = ..(mapload, MAT_GLAMOUR) + +/turf/simulated/mineral/glamour + icon = 'icons/turf/flooring/glamour.dmi' + sand_icon_path = 'icons/turf/flooring/glamour.dmi' + rock_icon_path = 'icons/turf/flooring/glamour.dmi' + icon_state = "rock-light" + rock_side_icon_state = "rock_side-light" + sand_icon_state = "glamour" + rock_icon_state = "rock-light" + random_icon = 1 + oxygen = MOLES_O2STANDARD + nitrogen = MOLES_N2STANDARD + temperature = T20C diff --git a/code/modules/admin/player_effects.dm b/code/modules/admin/player_effects.dm index 93ff980f5b..520c3d9a2c 100644 --- a/code/modules/admin/player_effects.dm +++ b/code/modules/admin/player_effects.dm @@ -298,48 +298,7 @@ var/mob/living/new_mob = new chosen_beast(get_turf(M)) new_mob.faction = M.faction - if(new_mob && isliving(new_mob)) - for(var/obj/belly/B as anything in new_mob.vore_organs) - new_mob.vore_organs -= B - qdel(B) - new_mob.vore_organs = list() - new_mob.name = M.name - new_mob.real_name = M.real_name - for(var/lang in M.languages) - new_mob.languages |= lang - M.copy_vore_prefs_to_mob(new_mob) - new_mob.vore_selected = M.vore_selected - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(ishuman(new_mob)) - var/mob/living/carbon/human/N = new_mob - N.gender = H.gender - N.identifying_gender = H.identifying_gender - else - new_mob.gender = H.gender - else - new_mob.gender = M.gender - if(ishuman(new_mob)) - var/mob/living/carbon/human/N = new_mob - N.identifying_gender = M.gender - - for(var/obj/belly/B as anything in M.vore_organs) - B.loc = new_mob - B.forceMove(new_mob) - B.owner = new_mob - M.vore_organs -= B - new_mob.vore_organs += B - - new_mob.ckey = M.ckey - if(M.ai_holder && new_mob.ai_holder) - var/datum/ai_holder/old_AI = M.ai_holder - old_AI.set_stance(STANCE_SLEEP) - var/datum/ai_holder/new_AI = new_mob.ai_holder - new_AI.hostile = old_AI.hostile - new_AI.retaliate = old_AI.retaliate - M.loc = new_mob - M.forceMove(new_mob) - new_mob.tf_mob_holder = M + new_mob.mob_tf(M) if("item_tf") var/mob/living/M = target diff --git a/code/modules/materials/fifty_spawner_mats.dm b/code/modules/materials/fifty_spawner_mats.dm index e7e850a916..69ab4335b1 100644 --- a/code/modules/materials/fifty_spawner_mats.dm +++ b/code/modules/materials/fifty_spawner_mats.dm @@ -148,7 +148,11 @@ name = "stack of reinforced borosilicate glass" type_to_spawn = /obj/item/stack/material/glass/phoronrglass +/obj/fiftyspawner/glamour + name = "stack of stable glamour" + type_to_spawn = /obj/item/stack/material/glamour + //R-UST port /obj/fiftyspawner/deuterium name = "stack of deuterium" - type_to_spawn = /obj/item/stack/material/deuterium \ No newline at end of file + type_to_spawn = /obj/item/stack/material/deuterium diff --git a/code/modules/materials/materials/gems.dm b/code/modules/materials/materials/gems.dm index ba3a1bd6fa..456d07461f 100644 --- a/code/modules/materials/materials/gems.dm +++ b/code/modules/materials/materials/gems.dm @@ -165,3 +165,68 @@ supply_conversion_value = 13 icon_base = "stone" table_icon_base = "stone" + +/datum/material/glamour + name = MAT_GLAMOUR + stack_type = /obj/item/stack/material/glamour + icon_base = "stone" + door_icon_base = "stone" + icon_colour = "#fffee7" + icon_reinf = "reinf_mesh" + protectiveness = 70 + integrity = 300 + conductive = 1 + conductivity = 20 + hardness = 120 + shard_type = SHARD_SHARD + weight = 20 + negation = 35 + explosion_resistance = 20 + reflectivity = 1 + radiation_resistance = 100 + stack_origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 8) + supply_conversion_value = 15 + icon_base = "stone" + table_icon_base = "stone" + +/datum/material/glamour/generate_recipes() + ..() + recipes += list( + new /datum/stack_recipe("oar", /obj/item/oar, 2, time = 30, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("boat", /obj/vehicle/boat, 20, time = 10 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("dragon boat", /obj/vehicle/boat/dragon, 50, time = 30 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("glamour sandals", /obj/item/clothing/shoes/sandal, 1, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("glamour circlet", /obj/item/clothing/head/woodcirclet, 1, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("book shelf", /obj/structure/bookcase, 5, time = 15, one_per_turf = 1, on_floor = 1, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("glamour shelves", /obj/structure/table/rack/shelf/wood, 1, one_per_turf = TRUE, time = 5, on_floor = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("glamour standup figure", /obj/structure/barricade/cutout, 5, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("glamour bandage", /obj/item/stack/medical/crude_pack, 1, time = 2 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("bedsheet", /obj/item/bedsheet, 10, time = 30 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("uniform", /obj/item/clothing/under/color/white, 8, time = 15 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("foot wraps", /obj/item/clothing/shoes/footwraps, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("gloves", /obj/item/clothing/gloves/white, 2, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("wig", /obj/item/clothing/head/powdered_wig, 4, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("philosopher's wig", /obj/item/clothing/head/philosopher_wig, 50, time = 2 MINUTES, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("taqiyah", /obj/item/clothing/head/taqiyah, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("turban", /obj/item/clothing/head/turban, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("hijab", /obj/item/clothing/head/hijab, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("kippa", /obj/item/clothing/head/kippa, 3, time = 6 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("scarf", /obj/item/clothing/accessory/scarf/white, 4, time = 5 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("baggy pants", /obj/item/clothing/under/pants/baggy/white, 8, time = 10 SECONDS, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("belt pouch", /obj/item/storage/belt/fannypack/white, 25, time = 1 MINUTE, pass_stack_color = TRUE, recycle_material = "[name]"), + new /datum/stack_recipe("glamour net", /obj/item/material/fishing_net, 10, time = 5 SECONDS, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("glamour ring", /obj/item/clothing/accessory/ring/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("glamour bracelet", /obj/item/clothing/accessory/bracelet/material, 1, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("glamour armor plate", /obj/item/material/armor_plating, 1, time = 20, on_floor = 1, supplied_material = "[name]", pass_stack_color = TRUE), + new /datum/stack_recipe("whip", /obj/item/material/whip, 5, time = 15 SECONDS, pass_stack_color = TRUE, supplied_material = "[name]"), + new /datum/stack_recipe("Transparent Glamour", /obj/item/potion_material/glamour_transparent, 25, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("Shrinking Glamour", /obj/item/potion_material/glamour_shrinking, 10, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("Twinkling Glamour", /obj/item/potion_material/glamour_twinkling, 15, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("Glamour Shard", /obj/item/potion_material/glamour_shard, 15, time = 20 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("Glamour Cell", /obj/item/capture_crystal/glamour, 50, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("Speaking Glamour", /obj/item/universal_translator/glamour, 50, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("Glamour Bubble", /obj/item/clothing/mask/gas/glamour, 20, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("Pocket of Glamour", /obj/item/clothing/under/permit/glamour, 5, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("glamour bow", /obj/item/gun/launcher/crossbow/bow/glamour, 15, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]"), + new /datum/stack_recipe("glamour arrow", /obj/item/arrow/standard/glamour, 1, time = 15 SECONDS, pass_stack_color = FALSE, supplied_material = "[name]") + ) diff --git a/code/modules/materials/sheets/gems.dm b/code/modules/materials/sheets/gems.dm index 4b91e09f3a..28dc21720a 100644 --- a/code/modules/materials/sheets/gems.dm +++ b/code/modules/materials/sheets/gems.dm @@ -62,3 +62,11 @@ default_type = MAT_MORPHIUM no_variants = FALSE apply_colour = TRUE + +/obj/item/stack/material/glamour + name = MAT_GLAMOUR + icon_state = "sheet-glamour" + item_state = "mhydrogen" + default_type = MAT_GLAMOUR + no_variants = FALSE + apply_colour = TRUE 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 c06dbf735a..c98ab0881c 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 @@ -107,12 +107,15 @@ "Transparent Glamour" = /obj/item/potion_material/glamour_transparent, "Shrinking Glamour" = /obj/item/potion_material/glamour_shrinking, "Twinkling Glamour" = /obj/item/potion_material/glamour_twinkling, + "Unstable Glamour" = /obj/item/glamour_unstable, "Glamour Shard" = /obj/item/potion_material/glamour_shard, "Glamour Cell" = /obj/item/capture_crystal/glamour, "Face of Glamour" = /obj/item/glamour_face, "Speaking Glamour" = /obj/item/universal_translator/glamour, "Glamour Bubble" = /obj/item/clothing/mask/gas/glamour, - "Pocket of Glamour" = /obj/item/clothing/under/permit/glamour + "Pocket of Glamour" = /obj/item/clothing/under/permit/glamour, + "glamour arrow" = /obj/item/arrow/standard/glamour, + "glamour bow" = /obj/item/gun/launcher/crossbow/bow/glamour ) var/energy_cost = 50 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 b36bad80e5..08d84e5a42 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 @@ -286,5 +286,167 @@ icon = 'icons/obj/glamour.dmi' icon_state = "pocket" -//Glamour Floor -//Glamour Wall +//Unstable Glamour + +/obj/item/glamour_unstable + name = "unstable glamour" + desc = "A bright white glowing object that appears to move about on its own." + icon = 'icons/obj/glamour.dmi' + icon_state = "unstable" + w_class = ITEMSIZE_SMALL + origin_tech = list(TECH_BLUESPACE = 7, TECH_MATERIAL = 2) + var/tele_range = 4 + var/tf_type = /mob/living/simple_mob/animal/passive/mouse + var/tf_possible_types = list( + "mouse" = /mob/living/simple_mob/animal/passive/mouse, + "rat" = /mob/living/simple_mob/animal/passive/mouse/rat, + "giant rat" = /mob/living/simple_mob/vore/aggressive/rat, + "dust jumper" = /mob/living/simple_mob/vore/alienanimals/dustjumper, + "woof" = /mob/living/simple_mob/vore/woof, + "corgi" = /mob/living/simple_mob/animal/passive/dog/corgi, + "cat" = /mob/living/simple_mob/animal/passive/cat, + "chicken" = /mob/living/simple_mob/animal/passive/chicken, + "cow" = /mob/living/simple_mob/animal/passive/cow, + "lizard" = /mob/living/simple_mob/animal/passive/lizard, + "rabbit" = /mob/living/simple_mob/vore/rabbit, + "fox" = /mob/living/simple_mob/animal/passive/fox, + "fennec" = /mob/living/simple_mob/vore/fennec, + "cute fennec" = /mob/living/simple_mob/animal/passive/fennec, + "fennix" = /mob/living/simple_mob/vore/fennix, + "red panda" = /mob/living/simple_mob/vore/redpanda, + "opossum" = /mob/living/simple_mob/animal/passive/opossum, + "horse" = /mob/living/simple_mob/vore/horse, + "goose" = /mob/living/simple_mob/animal/space/goose, + "sheep" = /mob/living/simple_mob/vore/sheep, + "space bumblebee" = /mob/living/simple_mob/vore/bee, + "space bear" = /mob/living/simple_mob/animal/space/bear, + "voracious lizard" = /mob/living/simple_mob/vore/aggressive/dino, + "giant frog" = /mob/living/simple_mob/vore/aggressive/frog, + "jelly blob" = /mob/living/simple_mob/vore/jelly, + "wolf" = /mob/living/simple_mob/vore/wolf, + "direwolf" = /mob/living/simple_mob/vore/wolf/direwolf, + "great wolf" = /mob/living/simple_mob/vore/greatwolf, + "sect queen" = /mob/living/simple_mob/vore/sect_queen, + "sect drone" = /mob/living/simple_mob/vore/sect_drone, + "panther" = /mob/living/simple_mob/vore/aggressive/panther, + "giant snake" = /mob/living/simple_mob/vore/aggressive/giant_snake, + "deathclaw" = /mob/living/simple_mob/vore/aggressive/deathclaw, + "otie" = /mob/living/simple_mob/vore/otie, + "mutated otie" =/mob/living/simple_mob/vore/otie/feral, + "red otie" = /mob/living/simple_mob/vore/otie/red, + "defanged xenomorph" = /mob/living/simple_mob/vore/xeno_defanged, + "catslug" = /mob/living/simple_mob/vore/alienanimals/catslug, + "monkey" = /mob/living/carbon/human/monkey, + "wolpin" = /mob/living/carbon/human/wolpin, + "sparra" = /mob/living/carbon/human/sparram, + "saru" = /mob/living/carbon/human/sergallingm, + "sobaka" = /mob/living/carbon/human/sharkm, + "farwa" = /mob/living/carbon/human/farwa, + "neaera" = /mob/living/carbon/human/neaera, + "stok" = /mob/living/carbon/human/stok, + "weretiger" = /mob/living/simple_mob/vore/weretiger, + "dragon" = /mob/living/simple_mob/vore/bigdragon/friendly, + "leopardmander" = /mob/living/simple_mob/vore/leopardmander + ) + +/obj/item/glamour_unstable/attack_self(mob/user) + var/mob/living/M = user + if(!istype(M)) + return + user.visible_message(span_warning("[user] triggers \the [src]!"), span_danger("You trigger \the [src]!")) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread() + s.set_up(5, 1, get_turf(src)) + s.start() + var/effect_choice = rand(1,4) + switch(effect_choice) + if(1) //teleport + blink_mob(M) + if(2) //mob_tf, uses polymorph potion code + if(!M.allow_spontaneous_tf) + M.AdjustWeakened(50) + else + mob_tf(M) + if(3) + size_change(M) + if(4) + M.apply_effect(200, IRRADIATE) + +/obj/item/glamour_unstable/proc/blink_mob(mob/living/L) + var/starting_loc = (get_turf(src)) + var/list/target_loc = list() + for(var/turf/simulated/floor/T in range(tele_range, starting_loc)) //Only appear on floors + if(!istype(T)) + continue + if(T == starting_loc) + continue + target_loc |= T + + if(target_loc.len) + var/final_loc = pick(target_loc) + do_teleport(L, final_loc, asoundin = 'sound/effects/phasein.ogg') + +/obj/item/glamour_unstable/proc/mob_tf(mob/living/target) + var/mob/living/M = target + if(!istype(M)) + return + if(M.tf_mob_holder) + var/mob/living/ourmob = M.tf_mob_holder + if(ourmob.ai_holder) + var/datum/ai_holder/our_AI = ourmob.ai_holder + our_AI.set_stance(STANCE_IDLE) + M.tf_mob_holder = null + ourmob.ckey = M.ckey + var/turf/get_dat_turf = get_turf(target) + ourmob.loc = get_dat_turf + ourmob.forceMove(get_dat_turf) + ourmob.vore_selected = M.vore_selected + M.vore_selected = null + ourmob.mob_belly_transfer(M) + + ourmob.Life(1) + if(ishuman(M)) + for(var/obj/item/W in M) + if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif)) + continue + M.drop_from_inventory(W) + + qdel(target) + return + else + if(M.stat == DEAD) //We can let it undo the TF, because the person will be dead, but otherwise things get weird. + return + var/mob/living/new_mob = spawn_mob(M) + new_mob.faction = M.faction + + new_mob.mob_tf(M) + + +/obj/item/glamour_unstable/proc/spawn_mob(var/mob/living/target) + var/choice = pick(tf_possible_types) + tf_type = tf_possible_types[choice] + if(!ispath(tf_type)) + return + var/new_mob = new tf_type(get_turf(target)) + return new_mob + +/obj/item/glamour_unstable/proc/size_change(mob/living/L) + var/new_size = (rand(25,200))/100 + L.resize(new_size, ignore_prefs = FALSE) + +/obj/item/glamour_unstable/attack_hand(mob/user) + . = ..() + + var/mob/living/M = user + if(!istype(M)) + return + + if(ishuman(M)) + var/mob/living/carbon/human/H = user + var/obj/item/clothing/gloves/G = H.gloves + if(istype(G) && ((G.flags & THICKMATERIAL && prob(70)) || istype(G, /obj/item/clothing/gloves/gauntlets))) + return + + if((H.species.name == SPECIES_HANNER) || (H.species.name == SPECIES_LLEILL)) + return + + attack_self(H) diff --git a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm index e682550ad8..bfb22f979c 100644 --- a/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm +++ b/code/modules/mob/living/simple_mob/subtypes/glamour/ddraig.dm @@ -223,12 +223,7 @@ ourmob.forceMove(get_dat_turf) ourmob.vore_selected = M.vore_selected M.vore_selected = null - for(var/obj/belly/B as anything in M.vore_organs) - B.loc = ourmob - B.forceMove(ourmob) - B.owner = ourmob - M.vore_organs -= B - ourmob.vore_organs += B + ourmob.mob_belly_transfer(M) ourmob.Life(1) if(ishuman(M)) @@ -245,51 +240,9 @@ var/mob/living/new_mob = spawn_mob(M) new_mob.faction = M.faction - if(new_mob && isliving(new_mob)) - for(var/obj/belly/B as anything in new_mob.vore_organs) - new_mob.vore_organs -= B - qdel(B) - new_mob.vore_organs = list() - new_mob.name = M.name - new_mob.real_name = M.real_name - for(var/lang in M.languages) - new_mob.languages |= lang - M.copy_vore_prefs_to_mob(new_mob) - new_mob.vore_selected = M.vore_selected - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(ishuman(new_mob)) - var/mob/living/carbon/human/N = new_mob - N.gender = H.gender - N.identifying_gender = H.identifying_gender - else - new_mob.gender = H.gender - else - new_mob.gender = M.gender - if(ishuman(new_mob)) - var/mob/living/carbon/human/N = new_mob - N.identifying_gender = M.gender + new_mob.mob_tf(M) - for(var/obj/belly/B as anything in M.vore_organs) - B.loc = new_mob - B.forceMove(new_mob) - B.owner = new_mob - M.vore_organs -= B - new_mob.vore_organs += B - - new_mob.ckey = M.ckey - if(M.ai_holder && new_mob.ai_holder) - var/datum/ai_holder/old_AI = M.ai_holder - old_AI.set_stance(STANCE_SLEEP) - var/datum/ai_holder/new_AI = new_mob.ai_holder - new_AI.hostile = old_AI.hostile - new_AI.retaliate = old_AI.retaliate - M.loc = new_mob - M.forceMove(new_mob) - new_mob.tf_mob_holder = M - - spawn(30 SECONDS) - new_mob.revert_mob_tf() //TF them back after 30 seconds, basically takes them out of the fight for a short time. + addtimer(CALLBACK(new_mob, TYPE_PROC_REF(/mob/living, revert_mob_tf)), 30 SECONDS, TIMER_DELETE_ME) /obj/item/projectile/beam/mouselaser/ddraig/spawn_mob(var/mob/living/target) var/list/tf_list = list(/mob/living/simple_mob/animal/passive/mouse, diff --git a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm index 7e4f2643a6..477b7cc20d 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_smasher.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_smasher.dm @@ -231,7 +231,7 @@ if(recipe.items && recipe.items.len) for(var/obj/item/I in storage) for(var/item_type in recipe.items) - if(istype(I, item_type)) + if(istype(I, item_type) && prob(recipe.item_consume_chance)) storage -= I qdel(I) break @@ -281,6 +281,7 @@ var/required_atmos_temp_min = 0 // The minimum ambient atmospheric temperature required, in kelvin. var/required_atmos_temp_max = 600 // The maximum ambient atmospheric temperature required, in kelvin. var/probability = 0 // The probability for the recipe to be produced. 0 will make it impossible. + var/item_consume_chance = 100 // The probability for the items (not materials) used in the recipe to be consume. /datum/particle_smasher_recipe/proc/check_items(var/obj/container as obj) . = 1 @@ -418,5 +419,19 @@ required_atmos_temp_max = 20000 probability = 20 +/datum/particle_smasher_recipe/glamour + items = list(/obj/item/glamour_unstable) + + result = /obj/item/stack/material/glamour + required_material = /obj/item/stack/material/phoron + + required_energy_min = 500 + required_energy_max = 600 + + required_atmos_temp_min = 0 + required_atmos_temp_max = 50 + probability = 100 + item_consume_chance = 10 //Allows only a few unstable glamour to be given out to get lots of stable ones. + #undef PS_RESULT_STACK #undef PS_RESULT_ITEM diff --git a/code/modules/projectiles/guns/launcher/bows.dm b/code/modules/projectiles/guns/launcher/bows.dm index b7a4b51824..9552a85583 100644 --- a/code/modules/projectiles/guns/launcher/bows.dm +++ b/code/modules/projectiles/guns/launcher/bows.dm @@ -138,3 +138,17 @@ update_icon() else draw(user) + +/obj/item/gun/launcher/crossbow/bow/glamour + name = "glamour bow" + desc = "A glamour bow, capable of firing arrows at high speed towards a target. Useful for hunting while keeping quiet." + icon = 'icons/obj/guns/projectile/bows.dmi' + icon_override = 'icons/obj/guns/projectile/bows.dmi' + icon_state = "gbow" + item_state = "gbow" + +/obj/item/arrow/standard/glamour + name = "glamour arrow" + icon = 'icons/obj/guns/projectile/bows.dmi' + icon_state = "garrow" + edge = TRUE diff --git a/code/modules/reagents/reagents/medicine_vr.dm b/code/modules/reagents/reagents/medicine_vr.dm index 525a9ef11e..17fdc80278 100644 --- a/code/modules/reagents/reagents/medicine_vr.dm +++ b/code/modules/reagents/reagents/medicine_vr.dm @@ -225,23 +225,14 @@ ourmob.forceMove(get_dat_turf) ourmob.vore_selected = M.vore_selected M.vore_selected = null - for(var/obj/belly/B as anything in M.vore_organs) - log_debug("polymorph belly") - B.loc = ourmob - B.forceMove(ourmob) - B.owner = ourmob - M.vore_organs -= B - ourmob.vore_organs += B + ourmob.mob_belly_transfer(M) M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher ourmob.Life(1) if(ishuman(M)) - log_debug("polymorph human") for(var/obj/item/W in M) - log_debug("polymorph items") if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif)) - log_debug("polymorph implants") continue M.drop_from_inventory(W) @@ -256,56 +247,7 @@ var/mob/living/new_mob = spawn_mob(M) new_mob.faction = M.faction - if(new_mob && isliving(new_mob)) - log_debug("polymorph new_mob") - for(var/obj/belly/B as anything in new_mob.vore_organs) - log_debug("polymorph new_mob belly") - new_mob.vore_organs -= B - qdel(B) - new_mob.vore_organs = list() - new_mob.name = M.name - new_mob.real_name = M.real_name - for(var/lang in M.languages) - new_mob.languages |= lang - M.copy_vore_prefs_to_mob(new_mob) - new_mob.vore_selected = M.vore_selected - if(ishuman(M)) - log_debug("polymorph ishuman part2") - var/mob/living/carbon/human/H = M - if(ishuman(new_mob)) - log_debug("polymorph ishuman(newmob)") - var/mob/living/carbon/human/N = new_mob - N.gender = H.gender - N.identifying_gender = H.identifying_gender - else - log_debug("polymorph gender else") - new_mob.gender = H.gender - else - log_debug("polymorph gender else 2") - new_mob.gender = M.gender - if(ishuman(new_mob)) - var/mob/living/carbon/human/N = new_mob - N.identifying_gender = M.gender - - for(var/obj/belly/B as anything in M.vore_organs) - B.loc = new_mob - B.forceMove(new_mob) - B.owner = new_mob - M.vore_organs -= B - new_mob.vore_organs += B - - M.soulgem.transfer_self(new_mob) //CHOMPAdd Soulcatcher - - new_mob.ckey = M.ckey - if(M.ai_holder && new_mob.ai_holder) - var/datum/ai_holder/old_AI = M.ai_holder - old_AI.set_stance(STANCE_SLEEP) - var/datum/ai_holder/new_AI = new_mob.ai_holder - new_AI.hostile = old_AI.hostile - new_AI.retaliate = old_AI.retaliate - M.loc = new_mob - M.forceMove(new_mob) - new_mob.tf_mob_holder = M + new_mob.mob_tf(M) target.bloodstr.clear_reagents() //Got to clear all reagents to make sure mobs don't keep spawning. target.ingested.clear_reagents() target.touching.clear_reagents() diff --git a/code/modules/vore/mob_tf.dm b/code/modules/vore/mob_tf.dm new file mode 100644 index 0000000000..0e122f2899 --- /dev/null +++ b/code/modules/vore/mob_tf.dm @@ -0,0 +1,212 @@ +// Procs for living mobs based around mob transformation. Initially made for the mouseray, they are now used in various other places and the main procs are now called from here. + + +/mob/living/proc/mob_tf(var/mob/living/M) + if(!istype(M)) + return + if(src && isliving(src)) + //CHOMPEdit Start + faction = M.faction + if(istype(src, /mob/living/simple_mob)) + var/mob/living/simple_mob/S = src + if(!S.voremob_loaded) + S.voremob_loaded = TRUE + S.init_vore() + new /obj/effect/effect/teleport_greyscale(M.loc) + //CHOMPEdit End + for(var/obj/belly/B as anything in src.vore_organs) + src.vore_organs -= B + qdel(B) + src.vore_organs = list() + src.name = M.name + src.real_name = M.real_name + for(var/lang in M.languages) + src.languages |= lang + M.copy_vore_prefs_to_mob(src) + src.vore_selected = M.vore_selected + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(ishuman(src)) + var/mob/living/carbon/human/N = src + N.gender = H.gender + N.identifying_gender = H.identifying_gender + else + src.gender = H.gender + else + src.gender = M.gender + if(ishuman(src)) + var/mob/living/carbon/human/N = src + N.identifying_gender = M.gender + + mob_belly_transfer(M) + nutrition = M.nutrition //CHOMPAdd + M.soulgem.transfer_self(src) //CHOMPAdd Soulcatcher + + src.ckey = M.ckey + if(M.ai_holder && src.ai_holder) + var/datum/ai_holder/old_AI = M.ai_holder + old_AI.set_stance(STANCE_SLEEP) + var/datum/ai_holder/new_AI = src.ai_holder + new_AI.hostile = old_AI.hostile + new_AI.retaliate = old_AI.retaliate + M.loc = src + M.forceMove(src) + src.tf_mob_holder = M + +/mob/living/proc/mob_belly_transfer(var/mob/living/M) + for(var/obj/belly/B as anything in M.vore_organs) + B.loc = src + B.forceMove(src) + B.owner = src + M.vore_organs -= B + src.vore_organs += B + +/mob/living + var/mob/living/tf_mob_holder = null + +/mob/living/proc/revert_mob_tf() + if(!tf_mob_holder) + return + var/mob/living/ourmob = tf_mob_holder + //CHOMPAdd Start - OOC Escape functionality for Mind Binder and Body Snatcher + if(ourmob.loc != src) + if(isnull(ourmob.loc)) + to_chat(src,span_notice("You have no body.")) + tf_mob_holder = null + return + if(istype(ourmob.loc, /mob/living)) //Check for if body was transformed + ourmob = ourmob.loc + if(ourmob.ckey) + if(ourmob.tf_mob_holder && ourmob.tf_mob_holder == src) + //Body Swap + var/datum/mind/ourmind = src.mind + var/datum/mind/theirmind = ourmob.mind + ourmob.ghostize() + src.ghostize() + ourmob.mind = null + src.mind = null + ourmind.current = null + theirmind.current = null + ourmind.active = TRUE + ourmind.transfer_to(ourmob) + theirmind.active = TRUE + theirmind.transfer_to(src) + ourmob.tf_mob_holder = null + src.tf_mob_holder = null + else + to_chat(src,span_notice("Your body appears to be in someone else's control.")) + return + src.mind.transfer_to(ourmob) + tf_mob_holder = null + return + new /obj/effect/effect/teleport_greyscale(src.loc) + //CHOMPAdd End - OOC Escape functionality for Mind Binder and Body Snatcher + if(ourmob.ai_holder) + var/datum/ai_holder/our_AI = ourmob.ai_holder + our_AI.set_stance(STANCE_IDLE) + tf_mob_holder = null + ourmob.ckey = ckey + var/turf/get_dat_turf = get_turf(src) + ourmob.loc = get_dat_turf + ourmob.forceMove(get_dat_turf) + // CHOMPEdit Start + if(!tf_form_ckey) + ourmob.vore_selected = vore_selected + vore_selected = null + for(var/obj/belly/B as anything in vore_organs) + B.loc = ourmob + B.forceMove(ourmob) + B.owner = ourmob + vore_organs -= B + ourmob.vore_organs += B + // CHOMPEdit End + + ourmob.Life(1) + + if(ishuman(src)) + for(var/obj/item/W in src) + if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif)) + continue + src.drop_from_inventory(W) + + // CHOMPEdit Start + if(tf_form == ourmob) + if(tf_form_ckey) + src.ckey = tf_form_ckey + else + src.mind = null + ourmob.tf_form = src + src.forceMove(ourmob) + else + qdel(src) + //CHOMPEdit End + +/mob/living/proc/handle_tf_holder() + if(!tf_mob_holder) + return + if(tf_mob_holder.loc != src) return //CHOMPAdd - Prevent bodyswapped creatures having their life linked + if(stat != tf_mob_holder.stat) + if(stat == DEAD) + tf_mob_holder.death(FALSE, null) + if(tf_mob_holder.stat == DEAD) + death() + +/mob/living/proc/copy_vore_prefs_to_mob(var/mob/living/new_mob) + //For primarily copying vore preference settings from a carbon mob to a simplemob + //It can be used for other things, but be advised, if you're using it to put a simplemob into a carbon mob, you're gonna be overriding a bunch of prefs + new_mob.ooc_notes = ooc_notes + new_mob.ooc_notes_likes = ooc_notes_likes + new_mob.ooc_notes_dislikes = ooc_notes_dislikes + new_mob.digestable = digestable + new_mob.devourable = devourable + new_mob.absorbable = absorbable + new_mob.feeding = feeding + new_mob.can_be_drop_prey = can_be_drop_prey + new_mob.can_be_drop_pred = can_be_drop_pred + // new_mob.allow_inbelly_spawning = allow_inbelly_spawning //CHOMP Removal: we have vore spawning at home. Actually if this were to be enabled, it would break anyway. Just leaving this here as a reference to it. + new_mob.digest_leave_remains = digest_leave_remains + new_mob.allowmobvore = allowmobvore + new_mob.permit_healbelly = permit_healbelly + new_mob.noisy = noisy + new_mob.selective_preference = selective_preference + new_mob.appendage_color = appendage_color + new_mob.appendage_alt_setting = appendage_alt_setting + new_mob.drop_vore = drop_vore + new_mob.stumble_vore = stumble_vore + new_mob.slip_vore = slip_vore + new_mob.throw_vore = throw_vore + new_mob.food_vore = food_vore + new_mob.resizable = resizable + new_mob.show_vore_fx = show_vore_fx + new_mob.step_mechanics_pref = step_mechanics_pref + new_mob.pickup_pref = pickup_pref + new_mob.vore_taste = vore_taste + new_mob.vore_smell = vore_smell + new_mob.nutrition_message_visible = nutrition_message_visible + new_mob.allow_spontaneous_tf = allow_spontaneous_tf + new_mob.eating_privacy_global = eating_privacy_global + new_mob.allow_mimicry = allow_mimicry + new_mob.text_warnings = text_warnings + new_mob.allow_mind_transfer = allow_mind_transfer + + //CHOMP stuff Start + new_mob.phase_vore = phase_vore + new_mob.latejoin_vore = latejoin_vore + new_mob.latejoin_prey = latejoin_prey + new_mob.receive_reagents = receive_reagents + new_mob.give_reagents = give_reagents + new_mob.apply_reagents = apply_reagents + new_mob.autotransferable = autotransferable + new_mob.strip_pref = strip_pref + new_mob.vore_sprite_color = vore_sprite_color + new_mob.vore_sprite_multiply = vore_sprite_multiply + new_mob.noisy_full = noisy_full + new_mob.no_latejoin_vore_warning = no_latejoin_vore_warning + new_mob.no_latejoin_prey_warning = no_latejoin_prey_warning + new_mob.no_latejoin_vore_warning_time = no_latejoin_vore_warning_time + new_mob.no_latejoin_prey_warning_time = no_latejoin_prey_warning_time + new_mob.no_latejoin_vore_warning_persists = no_latejoin_vore_warning_persists + new_mob.no_latejoin_prey_warning_persists = no_latejoin_prey_warning_persists + new_mob.belly_rub_target = belly_rub_target + new_mob.soulcatcher_pref_flags = soulcatcher_pref_flags + //CHOMP stuff End diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm index 70b15bca2e..6941c680f5 100644 --- a/code/modules/vore/mouseray.dm +++ b/code/modules/vore/mouseray.dm @@ -106,12 +106,7 @@ if(!M.tf_form_ckey) ourmob.vore_selected = M.vore_selected M.vore_selected = null - for(var/obj/belly/B as anything in M.vore_organs) - B.loc = ourmob - B.forceMove(ourmob) - B.owner = ourmob - M.vore_organs -= B - ourmob.vore_organs += B + ourmob.mob_belly_transfer(M) ourmob.nutrition = M.nutrition M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher @@ -139,57 +134,7 @@ return var/mob/living/new_mob = spawn_mob(M) - if(new_mob && isliving(new_mob)) - new_mob.faction = M.faction //CHOMPEdit Start - if(istype(new_mob, /mob/living/simple_mob)) - var/mob/living/simple_mob/S = new_mob - if(!S.voremob_loaded) - S.voremob_loaded = TRUE - S.init_vore() - new /obj/effect/effect/teleport_greyscale(M.loc) //CHOMPEdit End - for(var/obj/belly/B as anything in new_mob.vore_organs) - new_mob.vore_organs -= B - qdel(B) - new_mob.vore_organs = list() - new_mob.name = M.name - new_mob.real_name = M.real_name - for(var/lang in M.languages) - new_mob.languages |= lang - M.copy_vore_prefs_to_mob(new_mob) - new_mob.vore_selected = M.vore_selected - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(ishuman(new_mob)) - var/mob/living/carbon/human/N = new_mob - N.gender = H.gender - N.identifying_gender = H.identifying_gender - else - new_mob.gender = H.gender - else - new_mob.gender = M.gender - if(ishuman(new_mob)) - var/mob/living/carbon/human/N = new_mob - N.identifying_gender = M.gender - - for(var/obj/belly/B as anything in M.vore_organs) - B.loc = new_mob - B.forceMove(new_mob) - B.owner = new_mob - M.vore_organs -= B - new_mob.vore_organs += B - new_mob.nutrition = M.nutrition //CHOMPAdd - M.soulgem.transfer_self(new_mob) //CHOMPAdd Soulcatcher - - new_mob.ckey = M.ckey - if(M.ai_holder && new_mob.ai_holder) - var/datum/ai_holder/old_AI = M.ai_holder - old_AI.set_stance(STANCE_SLEEP) - var/datum/ai_holder/new_AI = new_mob.ai_holder - new_AI.hostile = old_AI.hostile - new_AI.retaliate = old_AI.retaliate - M.loc = new_mob - M.forceMove(new_mob) - new_mob.tf_mob_holder = M + new_mob.mob_tf(M) /obj/item/projectile/beam/mouselaser/proc/spawn_mob(var/mob/living/target) if(!ispath(tf_type)) @@ -197,153 +142,7 @@ var/new_mob = new tf_type(get_turf(target)) return new_mob -/mob/living - var/mob/living/tf_mob_holder = null -/mob/living/proc/revert_mob_tf() - if(!tf_mob_holder) - return - //CHOMPEdit Start - OOC Escape functionality for Mind Binder and Body Snatcher - var/mob/living/ourmob = tf_mob_holder - if(ourmob.loc != src) - if(isnull(ourmob.loc)) - to_chat(src,span_notice("You have no body.")) - tf_mob_holder = null - return - if(istype(ourmob.loc, /mob/living)) //Check for if body was transformed - ourmob = ourmob.loc - if(ourmob.ckey) - if(ourmob.tf_mob_holder && ourmob.tf_mob_holder == src) - //Body Swap - var/datum/mind/ourmind = src.mind - var/datum/mind/theirmind = ourmob.mind - ourmob.ghostize() - src.ghostize() - ourmob.mind = null - src.mind = null - ourmind.current = null - theirmind.current = null - ourmind.active = TRUE - ourmind.transfer_to(ourmob) - theirmind.active = TRUE - theirmind.transfer_to(src) - ourmob.tf_mob_holder = null - src.tf_mob_holder = null - else - to_chat(src,span_notice("Your body appears to be in someone else's control.")) - return - src.mind.transfer_to(ourmob) - tf_mob_holder = null - return - //CHOMPEdit End - new /obj/effect/effect/teleport_greyscale(src.loc) //CHOMPEdit Start - if(ourmob.ai_holder) - var/datum/ai_holder/our_AI = ourmob.ai_holder - our_AI.set_stance(STANCE_IDLE) - tf_mob_holder = null - var/turf/get_dat_turf = get_turf(src) - ourmob.loc = get_dat_turf - ourmob.forceMove(get_dat_turf) - if(!tf_form_ckey) - ourmob.vore_selected = vore_selected - vore_selected = null - for(var/obj/belly/B as anything in vore_organs) - B.loc = ourmob - B.forceMove(ourmob) - B.owner = ourmob - vore_organs -= B - ourmob.vore_organs += B - ourmob.nutrition = nutrition - soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher - - ourmob.ckey = ckey - ourmob.Life(1) - - if(ishuman(src)) - for(var/obj/item/W in src) - if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif)) - continue - src.drop_from_inventory(W) - - if(tf_form == ourmob) - if(tf_form_ckey) - src.ckey = tf_form_ckey - else - src.mind = null - ourmob.tf_form = src - src.forceMove(ourmob) - else - qdel(src) //CHOMPEdit End - - -/mob/living/proc/handle_tf_holder() - if(!tf_mob_holder) - return - if(tf_mob_holder.loc != src) return //CHOMPAdd - Prevent bodyswapped creatures having their life linked - if(stat != tf_mob_holder.stat) - if(stat == DEAD) - tf_mob_holder.death(FALSE, null) - if(tf_mob_holder.stat == DEAD) - death() - -/mob/living/proc/copy_vore_prefs_to_mob(var/mob/living/new_mob) - //For primarily copying vore preference settings from a carbon mob to a simplemob - //It can be used for other things, but be advised, if you're using it to put a simplemob into a carbon mob, you're gonna be overriding a bunch of prefs - new_mob.ooc_notes = ooc_notes - new_mob.ooc_notes_likes = ooc_notes_likes - new_mob.ooc_notes_dislikes = ooc_notes_dislikes - new_mob.digestable = digestable - new_mob.devourable = devourable - new_mob.absorbable = absorbable - new_mob.feeding = feeding - new_mob.can_be_drop_prey = can_be_drop_prey - new_mob.can_be_drop_pred = can_be_drop_pred - new_mob.digest_leave_remains = digest_leave_remains - new_mob.allowmobvore = allowmobvore - new_mob.permit_healbelly = permit_healbelly - new_mob.noisy = noisy - new_mob.selective_preference = selective_preference - new_mob.appendage_color = appendage_color - new_mob.appendage_alt_setting = appendage_alt_setting - new_mob.drop_vore = drop_vore - new_mob.stumble_vore = stumble_vore - new_mob.slip_vore = slip_vore - new_mob.throw_vore = throw_vore - new_mob.food_vore = food_vore - new_mob.resizable = resizable - new_mob.show_vore_fx = show_vore_fx - new_mob.step_mechanics_pref = step_mechanics_pref - new_mob.pickup_pref = pickup_pref - new_mob.vore_taste = vore_taste - new_mob.vore_smell = vore_smell - new_mob.nutrition_message_visible = nutrition_message_visible - new_mob.allow_spontaneous_tf = allow_spontaneous_tf - new_mob.eating_privacy_global = eating_privacy_global - new_mob.allow_mimicry = allow_mimicry - new_mob.text_warnings = text_warnings - new_mob.allow_mind_transfer = allow_mind_transfer - - //CHOMP stuff Start - new_mob.phase_vore = phase_vore - new_mob.latejoin_vore = latejoin_vore - new_mob.latejoin_prey = latejoin_prey - new_mob.receive_reagents = receive_reagents - new_mob.give_reagents = give_reagents - new_mob.apply_reagents = apply_reagents - new_mob.autotransferable = autotransferable - new_mob.strip_pref = strip_pref - new_mob.vore_sprite_color = vore_sprite_color - new_mob.vore_sprite_multiply = vore_sprite_multiply - new_mob.noisy_full = noisy_full - new_mob.no_latejoin_vore_warning = no_latejoin_vore_warning - new_mob.no_latejoin_prey_warning = no_latejoin_prey_warning - new_mob.no_latejoin_vore_warning_time = no_latejoin_vore_warning_time - new_mob.no_latejoin_prey_warning_time = no_latejoin_prey_warning_time - new_mob.no_latejoin_vore_warning_persists = no_latejoin_vore_warning_persists - new_mob.no_latejoin_prey_warning_persists = no_latejoin_prey_warning_persists - new_mob.belly_rub_target = belly_rub_target - new_mob.soulcatcher_pref_flags = soulcatcher_pref_flags - //CHOMP stuff End /////SUBTYPES///// diff --git a/icons/obj/glamour.dmi b/icons/obj/glamour.dmi index 6e110af3a2..6741375ad3 100644 Binary files a/icons/obj/glamour.dmi and b/icons/obj/glamour.dmi differ diff --git a/icons/obj/guns/projectile/bows.dmi b/icons/obj/guns/projectile/bows.dmi index 3d3494bfd2..c984e2a45a 100644 Binary files a/icons/obj/guns/projectile/bows.dmi and b/icons/obj/guns/projectile/bows.dmi differ diff --git a/icons/obj/stacks.dmi b/icons/obj/stacks.dmi index cb7f95f509..f348f3d83c 100644 Binary files a/icons/obj/stacks.dmi and b/icons/obj/stacks.dmi differ diff --git a/icons/turf/flooring/glamour.dmi b/icons/turf/flooring/glamour.dmi index 8f60748a65..6b507e50c9 100644 Binary files a/icons/turf/flooring/glamour.dmi and b/icons/turf/flooring/glamour.dmi differ diff --git a/maps/redgate/facility_items.dm b/maps/redgate/facility_items.dm index c51e7dec25..ff65cb4fe8 100644 --- a/maps/redgate/facility_items.dm +++ b/maps/redgate/facility_items.dm @@ -98,19 +98,3 @@ /obj/machinery/button/remote/experimenter/trigger() for(var/obj/machinery/crystalexperimenter/E in machines) E.experiment() - -/turf/unsimulated/wall/glamour - name = "glamour" - desc = "A blindingly white light that appears to cast your reflection." - icon = 'icons/turf/flooring/glamour.dmi' - icon_state = "glamour" - -/turf/simulated/floor/glamour - name = "glamour" - desc = "A blindingly white light that appears to cast your reflection." - icon = 'icons/turf/flooring/glamour.dmi' - icon_state = "glamour" - light_range = 7 - light_power = 1 - light_color = "#ffffff" - light_on = TRUE diff --git a/vorestation.dme b/vorestation.dme index 923f43e2c2..6cb66ef9e2 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -1876,6 +1876,7 @@ #include "code\game\objects\structures\stool_bed_chair_nest\stools_vr.dm" #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.dm" #include "code\game\objects\structures\stool_bed_chair_nest\wheelchair_item.dm" +#include "code\game\turfs\glamour_turfs.dm" #include "code\game\turfs\simulated.dm" #include "code\game\turfs\simulated_vr.dm" #include "code\game\turfs\turf.dm" @@ -4579,6 +4580,7 @@ #include "code\modules\ventcrawl\ventcrawl_verb.dm" #include "code\modules\vore\chat_healthbars.dm" #include "code\modules\vore\hook-defs_vr.dm" +#include "code\modules\vore\mob_tf.dm" #include "code\modules\vore\mouseray.dm" #include "code\modules\vore\trycatch_vr.dm" #include "code\modules\vore\appearance\preferences_vr.dm"