Merge remote-tracking branch 'upstream/master' into replicators

This commit is contained in:
SatinIsle
2024-09-27 11:39:35 +01:00
106 changed files with 7881 additions and 991 deletions
+12 -1
View File
@@ -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))
+3 -2
View File
@@ -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()
+17 -2
View File
@@ -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)
+60 -46
View File
@@ -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)
+3
View File
@@ -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
+1
View File
@@ -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(
+5
View File
@@ -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,
)
+7
View File
@@ -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)
+1
View File
@@ -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