[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_WEEDEXTRACT "weed extract"
|
||||||
#define MAT_CARDBOARD "cardboard"
|
#define MAT_CARDBOARD "cardboard"
|
||||||
#define MAT_COTTON "cotton"
|
#define MAT_COTTON "cotton"
|
||||||
|
#define MAT_GLAMOUR "stable glamour"
|
||||||
|
|
||||||
// cloth materials
|
// cloth materials
|
||||||
#define MAT_WOOL "wool"
|
#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))
|
var/mob/living/new_mob = new chosen_beast(get_turf(M))
|
||||||
new_mob.faction = M.faction
|
new_mob.faction = M.faction
|
||||||
|
|
||||||
if(new_mob && isliving(new_mob))
|
new_mob.mob_tf(M)
|
||||||
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
|
|
||||||
|
|
||||||
if("item_tf")
|
if("item_tf")
|
||||||
var/mob/living/M = target
|
var/mob/living/M = target
|
||||||
|
|||||||
@@ -148,7 +148,11 @@
|
|||||||
name = "stack of reinforced borosilicate glass"
|
name = "stack of reinforced borosilicate glass"
|
||||||
type_to_spawn = /obj/item/stack/material/glass/phoronrglass
|
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
|
//R-UST port
|
||||||
/obj/fiftyspawner/deuterium
|
/obj/fiftyspawner/deuterium
|
||||||
name = "stack of deuterium"
|
name = "stack of deuterium"
|
||||||
type_to_spawn = /obj/item/stack/material/deuterium
|
type_to_spawn = /obj/item/stack/material/deuterium
|
||||||
|
|||||||
@@ -165,3 +165,68 @@
|
|||||||
supply_conversion_value = 13
|
supply_conversion_value = 13
|
||||||
icon_base = "stone"
|
icon_base = "stone"
|
||||||
table_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
|
default_type = MAT_MORPHIUM
|
||||||
no_variants = FALSE
|
no_variants = FALSE
|
||||||
apply_colour = TRUE
|
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,
|
"Transparent Glamour" = /obj/item/potion_material/glamour_transparent,
|
||||||
"Shrinking Glamour" = /obj/item/potion_material/glamour_shrinking,
|
"Shrinking Glamour" = /obj/item/potion_material/glamour_shrinking,
|
||||||
"Twinkling Glamour" = /obj/item/potion_material/glamour_twinkling,
|
"Twinkling Glamour" = /obj/item/potion_material/glamour_twinkling,
|
||||||
|
"Unstable Glamour" = /obj/item/glamour_unstable,
|
||||||
"Glamour Shard" = /obj/item/potion_material/glamour_shard,
|
"Glamour Shard" = /obj/item/potion_material/glamour_shard,
|
||||||
"Glamour Cell" = /obj/item/capture_crystal/glamour,
|
"Glamour Cell" = /obj/item/capture_crystal/glamour,
|
||||||
"Face of Glamour" = /obj/item/glamour_face,
|
"Face of Glamour" = /obj/item/glamour_face,
|
||||||
"Speaking Glamour" = /obj/item/universal_translator/glamour,
|
"Speaking Glamour" = /obj/item/universal_translator/glamour,
|
||||||
"Glamour Bubble" = /obj/item/clothing/mask/gas/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
|
var/energy_cost = 50
|
||||||
|
|||||||
@@ -286,5 +286,167 @@
|
|||||||
icon = 'icons/obj/glamour.dmi'
|
icon = 'icons/obj/glamour.dmi'
|
||||||
icon_state = "pocket"
|
icon_state = "pocket"
|
||||||
|
|
||||||
//Glamour Floor
|
//Unstable Glamour
|
||||||
//Glamour Wall
|
|
||||||
|
/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.forceMove(get_dat_turf)
|
||||||
ourmob.vore_selected = M.vore_selected
|
ourmob.vore_selected = M.vore_selected
|
||||||
M.vore_selected = null
|
M.vore_selected = null
|
||||||
for(var/obj/belly/B as anything in M.vore_organs)
|
ourmob.mob_belly_transfer(M)
|
||||||
B.loc = ourmob
|
|
||||||
B.forceMove(ourmob)
|
|
||||||
B.owner = ourmob
|
|
||||||
M.vore_organs -= B
|
|
||||||
ourmob.vore_organs += B
|
|
||||||
|
|
||||||
ourmob.Life(1)
|
ourmob.Life(1)
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
@@ -245,51 +240,9 @@
|
|||||||
var/mob/living/new_mob = spawn_mob(M)
|
var/mob/living/new_mob = spawn_mob(M)
|
||||||
new_mob.faction = M.faction
|
new_mob.faction = M.faction
|
||||||
|
|
||||||
if(new_mob && isliving(new_mob))
|
new_mob.mob_tf(M)
|
||||||
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)
|
addtimer(CALLBACK(new_mob, TYPE_PROC_REF(/mob/living, revert_mob_tf)), 30 SECONDS, TIMER_DELETE_ME)
|
||||||
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.
|
|
||||||
|
|
||||||
/obj/item/projectile/beam/mouselaser/ddraig/spawn_mob(var/mob/living/target)
|
/obj/item/projectile/beam/mouselaser/ddraig/spawn_mob(var/mob/living/target)
|
||||||
var/list/tf_list = list(/mob/living/simple_mob/animal/passive/mouse,
|
var/list/tf_list = list(/mob/living/simple_mob/animal/passive/mouse,
|
||||||
|
|||||||
@@ -231,7 +231,7 @@
|
|||||||
if(recipe.items && recipe.items.len)
|
if(recipe.items && recipe.items.len)
|
||||||
for(var/obj/item/I in storage)
|
for(var/obj/item/I in storage)
|
||||||
for(var/item_type in recipe.items)
|
for(var/item_type in recipe.items)
|
||||||
if(istype(I, item_type))
|
if(istype(I, item_type) && prob(recipe.item_consume_chance))
|
||||||
storage -= I
|
storage -= I
|
||||||
qdel(I)
|
qdel(I)
|
||||||
break
|
break
|
||||||
@@ -281,6 +281,7 @@
|
|||||||
var/required_atmos_temp_min = 0 // The minimum ambient atmospheric temperature required, in kelvin.
|
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/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/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)
|
/datum/particle_smasher_recipe/proc/check_items(var/obj/container as obj)
|
||||||
. = 1
|
. = 1
|
||||||
@@ -418,5 +419,19 @@
|
|||||||
required_atmos_temp_max = 20000
|
required_atmos_temp_max = 20000
|
||||||
probability = 20
|
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_STACK
|
||||||
#undef PS_RESULT_ITEM
|
#undef PS_RESULT_ITEM
|
||||||
|
|||||||
@@ -138,3 +138,17 @@
|
|||||||
update_icon()
|
update_icon()
|
||||||
else
|
else
|
||||||
draw(user)
|
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.forceMove(get_dat_turf)
|
||||||
ourmob.vore_selected = M.vore_selected
|
ourmob.vore_selected = M.vore_selected
|
||||||
M.vore_selected = null
|
M.vore_selected = null
|
||||||
for(var/obj/belly/B as anything in M.vore_organs)
|
ourmob.mob_belly_transfer(M)
|
||||||
log_debug("polymorph belly")
|
|
||||||
B.loc = ourmob
|
|
||||||
B.forceMove(ourmob)
|
|
||||||
B.owner = ourmob
|
|
||||||
M.vore_organs -= B
|
|
||||||
ourmob.vore_organs += B
|
|
||||||
|
|
||||||
M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher
|
M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher
|
||||||
|
|
||||||
ourmob.Life(1)
|
ourmob.Life(1)
|
||||||
if(ishuman(M))
|
if(ishuman(M))
|
||||||
log_debug("polymorph human")
|
|
||||||
for(var/obj/item/W in M)
|
for(var/obj/item/W in M)
|
||||||
log_debug("polymorph items")
|
|
||||||
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
|
if(istype(W, /obj/item/implant/backup) || istype(W, /obj/item/nif))
|
||||||
log_debug("polymorph implants")
|
|
||||||
continue
|
continue
|
||||||
M.drop_from_inventory(W)
|
M.drop_from_inventory(W)
|
||||||
|
|
||||||
@@ -256,56 +247,7 @@
|
|||||||
var/mob/living/new_mob = spawn_mob(M)
|
var/mob/living/new_mob = spawn_mob(M)
|
||||||
new_mob.faction = M.faction
|
new_mob.faction = M.faction
|
||||||
|
|
||||||
if(new_mob && isliving(new_mob))
|
new_mob.mob_tf(M)
|
||||||
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
|
|
||||||
target.bloodstr.clear_reagents() //Got to clear all reagents to make sure mobs don't keep spawning.
|
target.bloodstr.clear_reagents() //Got to clear all reagents to make sure mobs don't keep spawning.
|
||||||
target.ingested.clear_reagents()
|
target.ingested.clear_reagents()
|
||||||
target.touching.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)
|
if(!M.tf_form_ckey)
|
||||||
ourmob.vore_selected = M.vore_selected
|
ourmob.vore_selected = M.vore_selected
|
||||||
M.vore_selected = null
|
M.vore_selected = null
|
||||||
for(var/obj/belly/B as anything in M.vore_organs)
|
ourmob.mob_belly_transfer(M)
|
||||||
B.loc = ourmob
|
|
||||||
B.forceMove(ourmob)
|
|
||||||
B.owner = ourmob
|
|
||||||
M.vore_organs -= B
|
|
||||||
ourmob.vore_organs += B
|
|
||||||
ourmob.nutrition = M.nutrition
|
ourmob.nutrition = M.nutrition
|
||||||
M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher
|
M.soulgem.transfer_self(ourmob) //CHOMPAdd Soulcatcher
|
||||||
|
|
||||||
@@ -139,57 +134,7 @@
|
|||||||
return
|
return
|
||||||
var/mob/living/new_mob = spawn_mob(M)
|
var/mob/living/new_mob = spawn_mob(M)
|
||||||
|
|
||||||
if(new_mob && isliving(new_mob))
|
new_mob.mob_tf(M)
|
||||||
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
|
|
||||||
|
|
||||||
/obj/item/projectile/beam/mouselaser/proc/spawn_mob(var/mob/living/target)
|
/obj/item/projectile/beam/mouselaser/proc/spawn_mob(var/mob/living/target)
|
||||||
if(!ispath(tf_type))
|
if(!ispath(tf_type))
|
||||||
@@ -197,153 +142,7 @@
|
|||||||
var/new_mob = new tf_type(get_turf(target))
|
var/new_mob = new tf_type(get_turf(target))
|
||||||
return new_mob
|
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/////
|
/////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()
|
/obj/machinery/button/remote/experimenter/trigger()
|
||||||
for(var/obj/machinery/crystalexperimenter/E in machines)
|
for(var/obj/machinery/crystalexperimenter/E in machines)
|
||||||
E.experiment()
|
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\stools_vr.dm"
|
||||||
#include "code\game\objects\structures\stool_bed_chair_nest\wheelchair.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\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.dm"
|
||||||
#include "code\game\turfs\simulated_vr.dm"
|
#include "code\game\turfs\simulated_vr.dm"
|
||||||
#include "code\game\turfs\turf.dm"
|
#include "code\game\turfs\turf.dm"
|
||||||
@@ -4579,6 +4580,7 @@
|
|||||||
#include "code\modules\ventcrawl\ventcrawl_verb.dm"
|
#include "code\modules\ventcrawl\ventcrawl_verb.dm"
|
||||||
#include "code\modules\vore\chat_healthbars.dm"
|
#include "code\modules\vore\chat_healthbars.dm"
|
||||||
#include "code\modules\vore\hook-defs_vr.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\mouseray.dm"
|
||||||
#include "code\modules\vore\trycatch_vr.dm"
|
#include "code\modules\vore\trycatch_vr.dm"
|
||||||
#include "code\modules\vore\appearance\preferences_vr.dm"
|
#include "code\modules\vore\appearance\preferences_vr.dm"
|
||||||
|
|||||||