[MIRROR] Glamour Experimentation (#10042)
Co-authored-by: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
@@ -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"
|
||||
|
||||
50
code/game/turfs/glamour_turfs.dm
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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]")
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
@@ -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/////
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 9.8 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 80 KiB After Width: | Height: | Size: 78 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 14 KiB |
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||