[MIRROR] Glamour Experimentation (#10042)

Co-authored-by: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-02-01 15:12:01 -07:00
committed by GitHub
parent 7ae39b09aa
commit a8aec08612
20 changed files with 549 additions and 376 deletions

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -148,6 +148,10 @@
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"

View File

@@ -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]")
)

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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,

View File

@@ -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

View File

@@ -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

View File

@@ -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()

212
code/modules/vore/mob_tf.dm Normal file
View File

@@ -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

View File

@@ -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/////

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.4 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -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

View File

@@ -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"