mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-07-19 02:56:14 +01:00
Merge remote-tracking branch 'upstream/master' into replicators
This commit is contained in:
@@ -84,7 +84,7 @@
|
||||
.["target"]["availalbe_channels"] = availalbe_channels
|
||||
// Components
|
||||
.["target"]["components"] = get_components()
|
||||
.["cell"] = target.cell?.name
|
||||
.["cell"] = list("name" = target.cell?.name, "charge" = target.cell?.charge, "maxcharge" = target.cell?.maxcharge)
|
||||
.["cell_options"] = get_cells()
|
||||
// Access
|
||||
.["id_icon"] = icon2html(target.idcard, user, sourceonly=TRUE)
|
||||
@@ -368,6 +368,17 @@
|
||||
if(istype(C, /datum/robot_component/cell))
|
||||
target.cell = null
|
||||
return TRUE
|
||||
if("adjust_cell_charge")
|
||||
target.cell.charge = text2num(params["charge"])
|
||||
return TRUE
|
||||
if("adjust_brute")
|
||||
var/datum/robot_component/C = locate(params["component"])
|
||||
C.brute_damage = text2num(params["damage"])
|
||||
return TRUE
|
||||
if("adjust_electronics")
|
||||
var/datum/robot_component/C = locate(params["component"])
|
||||
C.electronics_damage = text2num(params["damage"])
|
||||
return TRUE
|
||||
if("add_access")
|
||||
target.idcard.access += text2num(params["access"])
|
||||
return TRUE
|
||||
|
||||
@@ -555,60 +555,17 @@ Talon pin
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(insignia)
|
||||
|
||||
/datum/gear/accessory/plushie
|
||||
display_name = "Plushie Selection"
|
||||
description = "A single plushie of your selection!"
|
||||
path = /obj/item/toy/plushie/nymph
|
||||
/datum/gear/accessory/belt_selection
|
||||
display_name = "belts (selection, colorable)"
|
||||
path = /obj/item/clothing/accessory/belt
|
||||
|
||||
/datum/gear/accessory/plushie/New()
|
||||
/datum/gear/accessory/belt_selection/New()
|
||||
..()
|
||||
var/plushie = list(
|
||||
"Nymph" = /obj/item/toy/plushie/nymph,
|
||||
"Mouse" = /obj/item/toy/plushie/mouse,
|
||||
"Kitten" = /obj/item/toy/plushie/kitten,
|
||||
"Lizard" = /obj/item/toy/plushie/lizard,
|
||||
"Black cat" = /obj/item/toy/plushie/black_cat,
|
||||
"Black fox" = /obj/item/toy/plushie/black_fox,
|
||||
"Blue fox" = /obj/item/toy/plushie/blue_fox,
|
||||
"Carp plushie" = /obj/random/carp_plushie,
|
||||
"Coffee fox" = /obj/item/toy/plushie/coffee_fox,
|
||||
"Corgi" = /obj/item/toy/plushie/corgi,
|
||||
"Crimson fox" = /obj/item/toy/plushie/crimson_fox,
|
||||
"Deer" = /obj/item/toy/plushie/deer,
|
||||
"Girly corgi" = /obj/item/toy/plushie/girly_corgi,
|
||||
"Grey cat" = /obj/item/toy/plushie/grey_cat,
|
||||
"Marble fox" = /obj/item/toy/plushie/marble_fox,
|
||||
"Octopus" = /obj/item/toy/plushie/octopus,
|
||||
"Orange cat" = /obj/item/toy/plushie/orange_cat,
|
||||
"Orange fox" = /obj/item/toy/plushie/orange_fox,
|
||||
"Pink fox" = /obj/item/toy/plushie/pink_fox,
|
||||
"Purple fox" = /obj/item/toy/plushie/purple_fox,
|
||||
"Red fox" = /obj/item/toy/plushie/red_fox,
|
||||
"Robo corgi" = /obj/item/toy/plushie/robo_corgi,
|
||||
"Siamese cat" = /obj/item/toy/plushie/siamese_cat,
|
||||
"Spider" = /obj/item/toy/plushie/spider,
|
||||
"Tabby cat" = /obj/item/toy/plushie/tabby_cat,
|
||||
"Tuxedo cat" = /obj/item/toy/plushie/tuxedo_cat,
|
||||
"White cat" = /obj/item/toy/plushie/white_cat,
|
||||
"Lizard" = /obj/item/toy/plushie/lizardplushie,
|
||||
"Kobold" = /obj/item/toy/plushie/lizardplushie/kobold,
|
||||
"Resh" = /obj/item/toy/plushie/lizardplushie/resh,
|
||||
"Slime" = /obj/item/toy/plushie/slimeplushie,
|
||||
"Box" = /obj/item/toy/plushie/box,
|
||||
"Robot" = /obj/item/toy/plushie/borgplushie,
|
||||
"Medihound" = /obj/item/toy/plushie/borgplushie/medihound,
|
||||
"Scrubpuppy" = /obj/item/toy/plushie/borgplushie/scrubpuppy,
|
||||
"Foxbear" = /obj/item/toy/plushie/foxbear,
|
||||
"Operative" = /obj/item/toy/plushie/nukeplushie,
|
||||
"Otter" = /obj/item/toy/plushie/otter,
|
||||
"Vox" = /obj/item/toy/plushie/vox,
|
||||
"Shark" = /obj/item/toy/plushie/shark,
|
||||
"Sec Drake" = /obj/item/toy/plushie/borgplushie/drake/sec,
|
||||
"Med Drake" = /obj/item/toy/plushie/borgplushie/drake/med,
|
||||
"Sci Drake" = /obj/item/toy/plushie/borgplushie/drake/sci,
|
||||
"Jani Drake" = /obj/item/toy/plushie/borgplushie/drake/jani,
|
||||
"Eng Drake" = /obj/item/toy/plushie/borgplushie/drake/eng,
|
||||
"Mine Drake" = /obj/item/toy/plushie/borgplushie/drake/mine,
|
||||
"Trauma Drake" = /obj/item/toy/plushie/borgplushie/drake/trauma,
|
||||
var/list/wristband_lists = list(
|
||||
"Thin Belt" = /obj/item/clothing/accessory/belt,
|
||||
"Thick Belt" = /obj/item/clothing/accessory/belt/thick,
|
||||
"Strap Belt" = /obj/item/clothing/accessory/belt/strap,
|
||||
"Studded Belt" = /obj/item/clothing/accessory/belt/studded
|
||||
)
|
||||
gear_tweaks += new/datum/gear_tweak/path(plushie)
|
||||
gear_tweaks += new/datum/gear_tweak/path(wristband_lists)
|
||||
gear_tweaks += gear_tweak_free_color_choice
|
||||
@@ -185,7 +185,9 @@ Talon jumpsuit
|
||||
"high skirt"=/obj/item/clothing/under/skirt/colorable/high,
|
||||
"swept skirt"=/obj/item/clothing/under/skirt/colorable/swept,
|
||||
"jumper skirt"=/obj/item/clothing/under/skirt/colorable/jumper,
|
||||
"jumper dress"=/obj/item/clothing/under/skirt/colorable/jumperdress
|
||||
"jumper dress"=/obj/item/clothing/under/skirt/colorable/jumperdress,
|
||||
"short skirt"=/obj/item/clothing/under/skirt/colorable/short,
|
||||
"short skirt (split)"=/obj/item/clothing/under/skirt/colorable/short_split
|
||||
)
|
||||
gear_tweaks += list(new/datum/gear_tweak/path(skirts), gear_tweak_free_color_choice)
|
||||
|
||||
|
||||
@@ -1181,3 +1181,31 @@
|
||||
flags_inv = HIDEHOLSTER
|
||||
to_chat(user, "You adjust your poncho.")
|
||||
update_clothing_icon()
|
||||
|
||||
/obj/item/clothing/accessory/belt
|
||||
name = "Thin Belt"
|
||||
desc = "A thin belt for holding your pants up."
|
||||
icon = 'icons/inventory/accessory/item.dmi'
|
||||
icon_override = 'icons/inventory/accessory/mob.dmi'
|
||||
icon_state = "belt_thin"
|
||||
item_state = "belt_thin"
|
||||
slot_flags = SLOT_TIE | SLOT_BELT
|
||||
slot = ACCESSORY_SLOT_DECOR
|
||||
|
||||
/obj/item/clothing/accessory/belt/thick
|
||||
name = "Thick Belt"
|
||||
desc = "A thick belt for holding your pants up."
|
||||
icon_state = "belt_thick"
|
||||
item_state = "belt_thick"
|
||||
|
||||
/obj/item/clothing/accessory/belt/strap
|
||||
name = "Strap Belt"
|
||||
desc = "A belt with no bucklet for holding your pants up."
|
||||
icon_state = "belt_strap"
|
||||
item_state = "belt_strap"
|
||||
|
||||
/obj/item/clothing/accessory/belt/studded
|
||||
name = "Studded Belt"
|
||||
desc = "A studded belt for holding your pants up and looking cool."
|
||||
icon_state = "belt_studded"
|
||||
item_state = "belt_studded"
|
||||
|
||||
@@ -524,6 +524,20 @@
|
||||
item_state = "skirt_jumperdress"
|
||||
worn_state = "skirt_jumperdress"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/short
|
||||
name = "short skirt"
|
||||
desc = "A far too short pleated skirt."
|
||||
icon_state = "skirt_short"
|
||||
item_state = "skirt_short"
|
||||
worn_state = "skirt_short"
|
||||
|
||||
/obj/item/clothing/under/skirt/colorable/short_split
|
||||
name = "short skirt (split)"
|
||||
desc = "A far too short pleated skirt with an open split down one side."
|
||||
icon_state = "skirt_short_split"
|
||||
item_state = "skirt_short_split"
|
||||
worn_state = "skirt_short_split"
|
||||
|
||||
// Gwen Beedell's clown outfit
|
||||
|
||||
/obj/item/clothing/under/stripeddungarees
|
||||
|
||||
@@ -621,6 +621,10 @@
|
||||
/obj/item/clothing/accessory/wristbandcollection/trans = 5,
|
||||
/obj/item/clothing/accessory/wristbandcollection/ace = 5,
|
||||
/obj/item/clothing/accessory/wristband_spiked = 5,
|
||||
/obj/item/clothing/accessory/belt = 5,
|
||||
/obj/item/clothing/accessory/belt/thick = 5,
|
||||
/obj/item/clothing/accessory/belt/strap = 5,
|
||||
/obj/item/clothing/accessory/belt/studded = 5,
|
||||
/obj/item/weapon/storage/wallet = 5,
|
||||
/obj/item/weapon/storage/wallet/poly = 5,
|
||||
/obj/item/weapon/storage/wallet/womens = 5,
|
||||
@@ -762,6 +766,10 @@
|
||||
/obj/item/clothing/accessory/wristbandcollection/trans = 30,
|
||||
/obj/item/clothing/accessory/wristbandcollection/ace = 30,
|
||||
/obj/item/clothing/accessory/wristband_spiked = 20,
|
||||
/obj/item/clothing/accessory/belt = 50,
|
||||
/obj/item/clothing/accessory/belt/thick = 50,
|
||||
/obj/item/clothing/accessory/belt/strap = 50,
|
||||
/obj/item/clothing/accessory/belt/studded = 50,
|
||||
/obj/item/weapon/storage/wallet = 50,
|
||||
/obj/item/weapon/storage/wallet/poly = 50,
|
||||
/obj/item/weapon/storage/wallet/womens = 50,
|
||||
@@ -909,6 +917,8 @@
|
||||
/obj/item/clothing/under/ascetic = 5,
|
||||
/obj/item/clothing/under/dress/white3 = 5,
|
||||
/obj/item/clothing/under/skirt/pleated = 5,
|
||||
/obj/item/clothing/under/skirt/colorable/short = 5,
|
||||
/obj/item/clothing/under/skirt/colorable/short_split = 5,
|
||||
/obj/item/clothing/under/dress/darkred = 5,
|
||||
/obj/item/clothing/under/dress/redeveninggown = 5,
|
||||
/obj/item/clothing/under/dress/red_swept_dress = 5,
|
||||
@@ -1093,6 +1103,8 @@
|
||||
/obj/item/clothing/under/ascetic = 50,
|
||||
/obj/item/clothing/under/dress/white3 = 50,
|
||||
/obj/item/clothing/under/skirt/pleated = 50,
|
||||
/obj/item/clothing/under/skirt/colorable/short = 50,
|
||||
/obj/item/clothing/under/skirt/colorable/short_split = 50,
|
||||
/obj/item/clothing/under/dress/darkred = 50,
|
||||
/obj/item/clothing/under/dress/redeveninggown = 50,
|
||||
/obj/item/clothing/under/dress/red_swept_dress = 50,
|
||||
@@ -2125,6 +2137,8 @@
|
||||
/obj/item/clothing/under/skirt/red = 5,
|
||||
/obj/item/clothing/under/skirt/denim = 5,
|
||||
/obj/item/clothing/under/skirt/pleated = 5,
|
||||
/obj/item/clothing/under/skirt/colorable/short = 5,
|
||||
/obj/item/clothing/under/skirt/colorable/short_split = 5,
|
||||
/obj/item/clothing/under/skirt/outfit/plaid_blue = 5,
|
||||
/obj/item/clothing/under/skirt/outfit/plaid_red = 5,
|
||||
/obj/item/clothing/under/skirt/outfit/plaid_purple = 5,
|
||||
|
||||
@@ -77,7 +77,7 @@
|
||||
string += "-\a [CI.container.label(null, CI.combine_target)], [report_progress(CI)]</br>"
|
||||
return string
|
||||
else
|
||||
to_chat(user, "<span class='notice>'It is empty.</span>")
|
||||
to_chat(user, "<span class='notice'>It is empty.</span>")
|
||||
|
||||
/obj/machinery/appliance/proc/report_progress_tgui(datum/cooking_item/CI)
|
||||
if(!CI || !CI.max_cookwork)
|
||||
@@ -812,4 +812,4 @@
|
||||
return
|
||||
|
||||
food_safety = !food_safety
|
||||
to_chat(usr, "<span class = 'notice'>You flip \the [src]'s safe mode switch. Safe mode is now [food_safety ? "on" : "off"].</span>")
|
||||
to_chat(usr, "<span class = 'notice'>You flip \the [src]'s safe mode switch. Safe mode is now [food_safety ? "on" : "off"].</span>")
|
||||
|
||||
@@ -8,7 +8,6 @@
|
||||
transmutation and energy sharing abilities not unlike they lleill, but considerably more limited. Unlike \
|
||||
other shapeshifter species, such as proteans or prometheans, Hanner have a typical humanoid set of organs and can not regenerate."
|
||||
|
||||
flags = NO_SCAN
|
||||
color_mult = 1
|
||||
appearance_flags = HAS_SKIN_COLOR | HAS_EYE_COLOR | HAS_HAIR_COLOR | HAS_UNDERWEAR | HAS_LIPS
|
||||
spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED | SPECIES_WHITELIST_SELECTABLE
|
||||
|
||||
@@ -130,7 +130,7 @@
|
||||
for(var/mob/living/carbon/human/M in mob_list)
|
||||
if(M.z != user.z || get_dist(user,M) > 10)
|
||||
continue
|
||||
if(istype(M) && M.resleeve_lock && M.ckey != M.resleeve_lock)
|
||||
if(!M.allow_mimicry)
|
||||
continue
|
||||
targets |= M
|
||||
|
||||
|
||||
@@ -210,11 +210,6 @@
|
||||
if(pred.prey_controlled)
|
||||
to_chat(prey, "<span class='warning'>\The [pred] is already dominated, and cannot be controlled at this time.</span>")
|
||||
return
|
||||
if(ishuman(pred))
|
||||
var/mob/living/carbon/human/h = pred
|
||||
if(h.resleeve_lock && ckey != h.resleeve_lock)
|
||||
to_chat(src, "<span class='warning'>\The [h] cannot be impersonated!</span>")
|
||||
return
|
||||
if(tgui_alert(prey, "You are attempting to take over [pred], are you sure? Ensure that their preferences align with this kind of play.", "Take Over Predator",list("No","Yes")) != "Yes")
|
||||
return
|
||||
to_chat(prey, "<span class='notice'>You attempt to exert your control over \the [pred]...</span>")
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
|
||||
/mob/living/simple_mob/vore/morph/proc/assume(atom/movable/target)
|
||||
var/mob/living/carbon/human/humantarget = target
|
||||
if(istype(humantarget) && humantarget.resleeve_lock && ckey != humantarget.resleeve_lock)
|
||||
if(istype(humantarget) && !humantarget.allow_mimicry)
|
||||
to_chat(src, "<span class='warning'>[target] cannot be impersonated!</span>")
|
||||
return
|
||||
if(morphed)
|
||||
@@ -272,12 +272,9 @@
|
||||
var/mob/living/L = tgui_input_list(src, "Select a mob to take over:", "Take Over Prey", possible_mobs)
|
||||
if(!L)
|
||||
return
|
||||
// Adding a ishuman check here, since silicon mobs don't have a resleeve_lock from what I can tell.
|
||||
if(ishuman(L))
|
||||
var/mob/living/carbon/human/M = L
|
||||
if(M.resleeve_lock && ckey != M.resleeve_lock)
|
||||
to_chat(src, "<span class='warning'>\The [M] cannot be impersonated!</span>")
|
||||
return
|
||||
if(!L.allow_mimicry)
|
||||
to_chat(src, "<span class='warning'>\The [L] cannot be impersonated!</span>")
|
||||
return
|
||||
if(tgui_alert(src, "You selected [L] to attempt to take over. Are you sure?", "Take Over Prey",list("No","Yes")) == "Yes")
|
||||
log_admin("[key_name_admin(src)] offered [L] to swap bodies as a morph.")
|
||||
if(tgui_alert(L, "\The [src] has elected to attempt to take over your body and control you. Is this something you will allow to happen?", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
noisy = client.prefs_vr.noisy
|
||||
selective_preference = client.prefs_vr.selective_preference
|
||||
eating_privacy_global = client.prefs_vr.eating_privacy_global
|
||||
allow_mimicry = client.prefs_vr.allow_mimicry
|
||||
|
||||
drop_vore = client.prefs_vr.drop_vore
|
||||
stumble_vore = client.prefs_vr.stumble_vore
|
||||
|
||||
@@ -52,7 +52,8 @@ When editing the list, please try and keep similar probabilities near each other
|
||||
prob(25); "[info] Emergency Fire Doors seal breaches and keep active fires out. Please do not open them without good reason.",
|
||||
prob(25); "[info] The kitchen's Oven can fit multiple ingredients in one slot if you pull the baking tray out first. This is required for most recipes, and the Grille and Deep Frier work the same way!",
|
||||
prob(10); "[info] You can keep a single item between rounds using secure lockboxes! Beware! You can only store 1 item across all characters! To find these lockboxes, feel free to ask over radio!",
|
||||
prob(10); "[info] Not every hostile NPC you encounter while mining or exploring need to be defeated. Sometimes, it's better to avoid or run away from them. For example, star-treaders are slow and weak but have lots of HP - it is better to just run away."
|
||||
prob(10); "[info] Not every hostile NPC you encounter while mining or exploring need to be defeated. Sometimes, it's better to avoid or run away from them. For example, star-treaders are slow and weak but have lots of HP - it is better to just run away.",
|
||||
prob(10); "[info] Clicking on a venomous animal/person with a closed beaker will express their venom into the beaker!",
|
||||
)
|
||||
|
||||
if("roleplay")
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
unacidable = TRUE //glass doesn't dissolve in acid
|
||||
drop_sound = 'sound/items/drop/bottle.ogg'
|
||||
pickup_sound = 'sound/items/pickup/bottle.ogg'
|
||||
description_info = "Clicking on a venomous animal (or person) with the lid closed will express their venom into the beaker!"
|
||||
|
||||
var/label_text = ""
|
||||
|
||||
@@ -85,15 +86,16 @@
|
||||
if(force && !(flags & NOBLUDGEON) && user.a_intent == I_HURT)
|
||||
return ..()
|
||||
|
||||
// If the container is *closed* we do snake milking!~
|
||||
if(!is_open_container() && isliving(M))
|
||||
return attempt_snake_milking(user, M)
|
||||
|
||||
if(standard_feed_mob(user, M))
|
||||
return
|
||||
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/standard_feed_mob(var/mob/user, var/mob/target)
|
||||
if(!is_open_container())
|
||||
to_chat(user, "<span class='notice'>You need to open \the [src] first.</span>")
|
||||
return 1
|
||||
if(user.a_intent == I_HURT)
|
||||
return 1
|
||||
return ..()
|
||||
@@ -101,8 +103,33 @@
|
||||
/obj/item/weapon/reagent_containers/glass/self_feed_message(var/mob/user)
|
||||
to_chat(user, "<span class='notice'>You swallow a gulp from \the [src].</span>")
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/proc/attempt_snake_milking(mob/living/user, mob/living/target)
|
||||
var/reagent
|
||||
var/amount
|
||||
|
||||
if(target.trait_injection_selected)
|
||||
reagent = target.trait_injection_selected
|
||||
amount = target.trait_injection_amount
|
||||
else if(istype(target, /mob/living/simple_mob/animal/giant_spider))
|
||||
var/mob/living/simple_mob/animal/giant_spider/spider = target
|
||||
reagent = spider.poison_type
|
||||
amount = spider.poison_per_bite
|
||||
|
||||
if(!reagent || !amount)
|
||||
to_chat(user, span_warning("[target] does not have venom you can express. Open the beaker to drink from it."))
|
||||
return TRUE
|
||||
|
||||
if(TIMER_COOLDOWN_RUNNING(target, COOLDOWN_VENOM_MILKING))
|
||||
user.visible_message(span_warning("[user] attempts to express venom from [target], but nothing happens."), span_warning("[target] had their venom expressed too recently, try again later."))
|
||||
return TRUE
|
||||
|
||||
TIMER_COOLDOWN_START(target, COOLDOWN_VENOM_MILKING, 30 SECONDS)
|
||||
user.visible_message(span_notice("[user] expresses venom from [target]."))
|
||||
reagents.add_reagent(reagent, amount)
|
||||
return TRUE
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/afterattack(var/obj/target, var/mob/user, var/proximity)
|
||||
if(!is_open_container() || !proximity) //Is the container open & are they next to whatever they're clicking?
|
||||
if(!proximity || !is_open_container()) //Is the container open & are they next to whatever they're clicking?
|
||||
return 1 //If not, do nothing.
|
||||
for(var/type in can_be_placed_into) //Is it something it can be placed into?
|
||||
if(istype(target, type))
|
||||
|
||||
@@ -112,10 +112,11 @@
|
||||
//Person OOCly doesn't want people impersonating them
|
||||
locked = ckeylock
|
||||
|
||||
//Prevent people from printing restricted and whitelisted species
|
||||
var/datum/species/S = GLOB.all_species["[M.dna.species]"]
|
||||
if(S)
|
||||
toocomplex = (S.spawn_flags & SPECIES_IS_WHITELISTED) || (S.spawn_flags & SPECIES_IS_RESTRICTED)
|
||||
// Force ckey locking if species is whitelisted
|
||||
if((S.spawn_flags & SPECIES_IS_WHITELISTED) || (S.spawn_flags & SPECIES_IS_RESTRICTED))
|
||||
locked = TRUE
|
||||
|
||||
//General stuff about them
|
||||
synthetic = M.isSynthetic()
|
||||
|
||||
@@ -33,7 +33,11 @@
|
||||
var/datum/dna2/record/R = current_project.mydna
|
||||
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species)
|
||||
if(current_project.locked)
|
||||
H.resleeve_lock = current_project.ckey
|
||||
if(current_project.ckey)
|
||||
H.resleeve_lock = current_project.ckey
|
||||
else
|
||||
// Ensure even body scans without an attached ckey respect locking
|
||||
H.resleeve_lock = "@badckey"
|
||||
|
||||
//Fix the external organs
|
||||
for(var/part in current_project.limb_data)
|
||||
@@ -180,6 +184,7 @@
|
||||
occupant = null
|
||||
if(locked)
|
||||
locked = 0
|
||||
update_icon()
|
||||
return
|
||||
|
||||
return
|
||||
@@ -189,6 +194,12 @@
|
||||
return 100 * ((occupant.health + abs(config.health_threshold_dead)) / (occupant.maxHealth + abs(config.health_threshold_dead)))
|
||||
return 0
|
||||
|
||||
/obj/machinery/clonepod/transhuman/examine(mob/user, infix, suffix)
|
||||
. = ..()
|
||||
if(occupant)
|
||||
var/completion = get_completion()
|
||||
. += "Progress: [round(completion)]% [chat_progress_bar(round(completion), TRUE)]"
|
||||
|
||||
//Synthetic version
|
||||
/obj/machinery/transhuman/synthprinter
|
||||
name = "SynthFab 3000"
|
||||
@@ -282,7 +293,11 @@
|
||||
var/datum/dna2/record/R = current_project.mydna
|
||||
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src, R.dna.species)
|
||||
if(current_project.locked)
|
||||
H.resleeve_lock = current_project.ckey
|
||||
if(current_project.ckey)
|
||||
H.resleeve_lock = current_project.ckey
|
||||
else
|
||||
// Ensure even body scans without an attached ckey respect locking
|
||||
H.resleeve_lock = "@badckey"
|
||||
|
||||
//Fix the external organs
|
||||
for(var/part in current_project.limb_data)
|
||||
|
||||
@@ -1,5 +1,64 @@
|
||||
//Health bars in the game window would be pretty challenging and I don't know how to do that, so I thought this would be a good alternative
|
||||
|
||||
// Generates the progress bar text
|
||||
/proc/chat_progress_bar(percentage, add_color = FALSE)
|
||||
switch(percentage)
|
||||
if(100)
|
||||
. = "|▓▓▓▓▓▓▓▓▓▓|"
|
||||
if(95 to 99)
|
||||
. = "|▓▓▓▓▓▓▓▓▓▒|"
|
||||
if(90 to 94)
|
||||
. = "|▓▓▓▓▓▓▓▓▓░|"
|
||||
if(85 to 89)
|
||||
. = "|▓▓▓▓▓▓▓▓▒░|"
|
||||
if(80 to 84)
|
||||
. = "|▓▓▓▓▓▓▓▓░░|"
|
||||
if(75 to 79)
|
||||
. = "|▓▓▓▓▓▓▓▒░░|"
|
||||
if(70 to 74)
|
||||
. = "|▓▓▓▓▓▓▓░░░|"
|
||||
if(65 to 69)
|
||||
. = "|▓▓▓▓▓▓▒░░░|"
|
||||
if(60 to 64)
|
||||
. = "|▓▓▓▓▓▓░░░░|"
|
||||
if(55 to 59)
|
||||
. = "|▓▓▓▓▓▒░░░░|"
|
||||
if(50 to 54)
|
||||
. = "|▓▓▓▓▓░░░░░|"
|
||||
if(45 to 49)
|
||||
. = "|▓▓▓▓▒░░░░░|"
|
||||
if(40 to 44)
|
||||
. = "|▓▓▓▓░░░░░░|"
|
||||
if(35 to 39)
|
||||
. = "|▓▓▓▒░░░░░░|"
|
||||
if(30 to 34)
|
||||
. = "|▓▓▓░░░░░░░|"
|
||||
if(25 to 29)
|
||||
. = "|▓▓▒░░░░░░░|"
|
||||
if(20 to 24)
|
||||
. = "|▓▓░░░░░░░░|"
|
||||
if(15 to 19)
|
||||
. = "|▓▒░░░░░░░░|"
|
||||
if(10 to 14)
|
||||
. = "|▓░░░░░░░░░|"
|
||||
if(5 to 9)
|
||||
. = "|▒░░░░░░░░░|"
|
||||
if(0)
|
||||
. = "|░░░░░░░░░░|"
|
||||
else
|
||||
. = "!░░░░░░░░░░!"
|
||||
|
||||
if(add_color)
|
||||
switch(percentage)
|
||||
if(75 to 100)
|
||||
. = span_green(.)
|
||||
if(50 to 75)
|
||||
. = span_yellow(.)
|
||||
if(25 to 50)
|
||||
. = span_orange(.)
|
||||
else
|
||||
. = span_red(.)
|
||||
|
||||
/mob/living/proc/chat_healthbar(var/mob/living/reciever, onExamine = FALSE, override = FALSE)
|
||||
if(!reciever) //No one to send it to, don't bother
|
||||
return
|
||||
@@ -26,52 +85,7 @@
|
||||
|
||||
ourpercent = round(ourpercent)
|
||||
|
||||
switch(ourpercent) //I thought about trying to do this in a more automated way but my brain isn't very large so enjoy my stupid switch statement
|
||||
if(100)
|
||||
ourbar = "|▓▓▓▓▓▓▓▓▓▓|"
|
||||
if(95 to 99)
|
||||
ourbar = "|▓▓▓▓▓▓▓▓▓▒|"
|
||||
if(90 to 94)
|
||||
ourbar = "|▓▓▓▓▓▓▓▓▓░|"
|
||||
if(85 to 89)
|
||||
ourbar = "|▓▓▓▓▓▓▓▓▒░|"
|
||||
if(80 to 84)
|
||||
ourbar = "|▓▓▓▓▓▓▓▓░░|"
|
||||
if(75 to 79)
|
||||
ourbar = "|▓▓▓▓▓▓▓▒░░|"
|
||||
if(70 to 74)
|
||||
ourbar = "|▓▓▓▓▓▓▓░░░|"
|
||||
if(65 to 69)
|
||||
ourbar = "|▓▓▓▓▓▓▒░░░|"
|
||||
if(60 to 64)
|
||||
ourbar = "|▓▓▓▓▓▓░░░░|"
|
||||
if(55 to 59)
|
||||
ourbar = "|▓▓▓▓▓▒░░░░|"
|
||||
if(50 to 54)
|
||||
ourbar = "|▓▓▓▓▓░░░░░|"
|
||||
if(45 to 49)
|
||||
ourbar = "|▓▓▓▓▒░░░░░|"
|
||||
if(40 to 44)
|
||||
ourbar = "|▓▓▓▓░░░░░░|"
|
||||
if(35 to 39)
|
||||
ourbar = "|▓▓▓▒░░░░░░|"
|
||||
if(30 to 34)
|
||||
ourbar = "|▓▓▓░░░░░░░|"
|
||||
if(25 to 29)
|
||||
ourbar = "|▓▓▒░░░░░░░|"
|
||||
if(20 to 24)
|
||||
ourbar = "|▓▓░░░░░░░░|"
|
||||
if(15 to 19)
|
||||
ourbar = "|▓▒░░░░░░░░|"
|
||||
if(10 to 14)
|
||||
ourbar = "|▓░░░░░░░░░|"
|
||||
if(5 to 9)
|
||||
ourbar = "|▒░░░░░░░░░|"
|
||||
if(0)
|
||||
ourbar = "|░░░░░░░░░░|"
|
||||
else
|
||||
ourbar = "!░░░░░░░░░░!"
|
||||
|
||||
ourbar = chat_progress_bar(ourpercent, FALSE)
|
||||
ourbar = "[ourbar] [which_var] - [src.name]"
|
||||
|
||||
if(stat == UNCONSCIOUS)
|
||||
|
||||
@@ -259,6 +259,7 @@
|
||||
P.digest_pain = src.digest_pain
|
||||
P.stumble_vore = src.stumble_vore
|
||||
P.eating_privacy_global = src.eating_privacy_global
|
||||
P.allow_mimicry = src.allow_mimicry
|
||||
|
||||
P.nutrition_message_visible = src.nutrition_message_visible
|
||||
P.nutrition_messages = src.nutrition_messages
|
||||
@@ -312,6 +313,7 @@
|
||||
food_vore = P.food_vore
|
||||
digest_pain = P.digest_pain
|
||||
eating_privacy_global = P.eating_privacy_global
|
||||
allow_mimicry = P.allow_mimicry
|
||||
|
||||
nutrition_message_visible = P.nutrition_message_visible
|
||||
nutrition_messages = P.nutrition_messages
|
||||
@@ -1212,6 +1214,7 @@
|
||||
dispvoreprefs += "<b>Can be stepped on/over:</b> [step_mechanics_pref ? "Allowed" : "Disallowed"]<br>"
|
||||
dispvoreprefs += "<b>Can be picked up:</b> [pickup_pref ? "Allowed" : "Disallowed"]<br>"
|
||||
dispvoreprefs += "<b>Global Vore Privacy is:</b> [eating_privacy_global ? "Subtle" : "Loud"]<br>"
|
||||
dispvoreprefs += "<b>Allow Mimicry:</b> [allow_mimicry ? "Yes" : "No"]<br>"
|
||||
user << browse("<html><head><title>Vore prefs: [src]</title></head><body><center>[dispvoreprefs]</center></body></html>", "window=[name]mvp;size=300x400;can_resize=1;can_minimize=0")
|
||||
onclose(user, "[name]")
|
||||
return
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
|
||||
var/text_warnings = TRUE // Allows us to dismiss the text limit warning messages after viewing it once per round
|
||||
var/eating_privacy_global = FALSE // Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
|
||||
var/allow_mimicry = TRUE // Allows mimicking their character
|
||||
var/allow_mind_transfer = FALSE //Allows ones mind to be taken over or swapped
|
||||
var/nutrition_message_visible = TRUE
|
||||
var/list/nutrition_messages = list(
|
||||
|
||||
@@ -54,6 +54,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
var/permit_healbelly = TRUE
|
||||
var/noisy = FALSE
|
||||
var/eating_privacy_global = FALSE //Makes eating attempt/success messages only reach for subtle range if true, overwritten by belly-specific var
|
||||
var/allow_mimicry = TRUE
|
||||
|
||||
// These are 'modifier' prefs, do nothing on their own but pair with drop_prey/drop_pred settings.
|
||||
var/drop_vore = TRUE
|
||||
@@ -196,6 +197,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
weight_message_visible = json_from_file["weight_message_visible"]
|
||||
weight_messages = json_from_file["weight_messages"]
|
||||
eating_privacy_global = json_from_file["eating_privacy_global"]
|
||||
allow_mimicry = json_from_file["allow_mimicry"]
|
||||
vore_sprite_color = json_from_file["vore_sprite_color"]
|
||||
allow_mind_transfer = json_from_file["allow_mind_transfer"]
|
||||
|
||||
@@ -254,6 +256,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
weight_message_visible = TRUE
|
||||
if(isnull(eating_privacy_global))
|
||||
eating_privacy_global = FALSE
|
||||
if(isnull(allow_mimicry))
|
||||
allow_mimicry = TRUE
|
||||
if(isnull(nutrition_messages))
|
||||
nutrition_messages = list(
|
||||
"They are starving! You can hear their stomach snarling from across the room!",
|
||||
@@ -329,6 +333,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
||||
"weight_message_visible" = weight_message_visible,
|
||||
"weight_messages" = weight_messages,
|
||||
"eating_privacy_global" = eating_privacy_global,
|
||||
"allow_mimicry" = allow_mimicry,
|
||||
"vore_sprite_color" = vore_sprite_color,
|
||||
)
|
||||
|
||||
|
||||
@@ -347,6 +347,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
|
||||
"weight_message_visible" = host.weight_message_visible,
|
||||
"weight_messages" = host.weight_messages,
|
||||
"eating_privacy_global" = host.eating_privacy_global,
|
||||
"allow_mimicry" = host.allow_mimicry,
|
||||
)
|
||||
|
||||
return data
|
||||
@@ -535,6 +536,12 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
|
||||
host.eating_privacy_global = host.eating_privacy_global
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_mimicry")
|
||||
host.allow_mimicry = !host.allow_mimicry
|
||||
if(host.client.prefs_vr)
|
||||
host.client.prefs_vr.allow_mimicry = host.allow_mimicry
|
||||
unsaved_changes = TRUE
|
||||
return TRUE
|
||||
if("toggle_devour")
|
||||
host.devourable = !host.devourable
|
||||
if(host.client.prefs_vr)
|
||||
|
||||
@@ -249,6 +249,7 @@
|
||||
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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user