Merge remote-tracking branch 'upstream/master' into kk-samples

This commit is contained in:
Killian
2024-09-01 05:05:51 +01:00
96 changed files with 1373 additions and 633 deletions
+7
View File
@@ -73,3 +73,10 @@
**Creator:** Poojawa (https://github.com/VOREStation/VOREStation/pull/6052)<br>
**License:** [General License](sound/vore/sunesound/LICENSE.txt)<br>
**Notes:** Permission to use assets also given in writing. All files under this folder is NOT licensed under CC3. Seek separate permission before copying/using.<br>
<br>
**File:** `icons/rogue-star/loafs_64x32.dmi`and `icons/rogue-star/tails_64x32_rs.dmi`<br>
**Title:** Rogue Star Tails<br>
**Icon-States:** `flagtail`, derivs by VerySoft, `bnytr`, derivs by Verysoft, `chonksqrl`, derivs by Verysoft<br>
**Creator:** VerySoft (https://github.com/TS-Rogue-Star/Rogue-Star/pull/435)<br>
**URL:** [Website](https://rogue-star.net/)<br>
**License:** Permission granting in writing for use by Virgo and Chomp with proper attribution
+1
View File
@@ -46,6 +46,7 @@
#define SMITE_BLUESPACEARTILLERY "Bluespace Artillery"
#define SMITE_SPONTANEOUSCOMBUSTION "Spontaneous Combustion"
#define SMITE_LIGHTNINGBOLT "Lightning Bolt"
#define SMITE_TERROR "Terrify"
#define ADMIN_QUE(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];adminmoreinfo=\ref[user]'>?</a>)"
#define ADMIN_FLW(user) "(<a href='?_src_=holder;[HrefToken(TRUE)];adminplayerobservefollow=\ref[user]'>FLW</a>)"
+2
View File
@@ -4,6 +4,8 @@
#define SMITE_AD_SPAM "Ad Spam"
#define SMITE_AUTOSAVE "10 Second Autosave"
#define SMITE_AUTOSAVE_WIDE "10 Second Autosave (AoE)"
#define SMITE_SPICEREQUEST "Give Them Spice (Harmless)"
#define SMITE_PEPPERNADE "Give Them Spice (Extra Spicy)"
#define MODIFIY_ROBOT_MODULE_ADD "Add a Module"
#define MODIFIY_ROBOT_MODULE_REMOVE "Remove a Module"
#define MODIFIY_ROBOT_APPLY_UPGRADE "Apply an Upgrade"
+4 -1
View File
@@ -132,7 +132,10 @@
layer = FULLSCREEN_LAYER
/obj/screen/fullscreen/fishbed
icon_state = "fishbed"
icon_state = "fishbed"
/obj/screen/fullscreen/fear
icon_state = "fear"
/obj/screen/fullscreen/lighting_backdrop
icon = 'icons/mob/screen_gen.dmi'
+1 -1
View File
@@ -153,7 +153,7 @@
var/answer = tgui_alert(user, "Would you like to [density ? "open" : "close"] this [src.name]?[ alarmed && density ? "\nNote that by doing so, you acknowledge any damages from opening this\n[src.name] as being your own fault, and you will be held accountable under the law." : ""]",\
"\The [src]", list("Yes, [density ? "open" : "close"]", "No"))
if(answer == "No")
if(!answer || answer == "No")
return
if(user.incapacitated() || (get_dist(src, user) > 1 && !issilicon(user)))
to_chat(user, "Sorry, you must remain able bodied and close to \the [src] in order to use it.")
+3 -1
View File
@@ -97,4 +97,6 @@
var/mob/living/carbon/human/H = user
if(H.species)
P.accuracy += H.species.gun_accuracy_mod
P.dispersion = max(P.dispersion + H.species.gun_accuracy_dispersion_mod, 0)
P.dispersion = max(P.dispersion + H.species.gun_accuracy_dispersion_mod, 0)
if(H.fear > 30)
P.accuracy -= 35
@@ -25,6 +25,10 @@
to_chat(usr,"<span class='warning'>A warning pops up on the device, informing you that [M] appears braindead.</span>")
return
if(!M.allow_mind_transfer)
to_chat(usr,"<span class='danger'>The target's mind is too complex to be affected!</span>")
return
if(M.stat == DEAD) //Are they dead?
to_chat(usr,"<span class='warning'>A warning pops up on the device, informing you that [M] is dead, and, as such, the mind transfer can not be done.</span>")
return
+1 -1
View File
@@ -5,7 +5,7 @@
if(!check_rights(R_ADMIN|R_DEBUG|R_EVENT)) return
if(tgui_alert(usr, "WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the station is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", list("No", "Yes")) == "No")
if(tgui_alert(usr, "WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the station is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", list("No", "Yes")) != "Yes")
return
feedback_add_details("admin_verb","FA")
+16 -2
View File
@@ -8,8 +8,7 @@
if(!istype(target))
return
var/list/smite_types = list(SMITE_BREAKLEGS,SMITE_BLUESPACEARTILLERY,SMITE_SPONTANEOUSCOMBUSTION,SMITE_LIGHTNINGBOLT,
SMITE_SHADEKIN_ATTACK,SMITE_SHADEKIN_NOMF,SMITE_AD_SPAM,SMITE_REDSPACE_ABDUCT,SMITE_AUTOSAVE,SMITE_AUTOSAVE_WIDE)
var/list/smite_types = list(SMITE_BREAKLEGS,SMITE_BLUESPACEARTILLERY,SMITE_SPONTANEOUSCOMBUSTION,SMITE_LIGHTNINGBOLT,SMITE_SHADEKIN_ATTACK,SMITE_SHADEKIN_NOMF,SMITE_AD_SPAM,SMITE_REDSPACE_ABDUCT,SMITE_AUTOSAVE,SMITE_AUTOSAVE_WIDE,SMITE_SPICEREQUEST,SMITE_PEPPERNADE,SMITE_TERROR)
var/smite_choice = tgui_input_list(usr, "Select the type of SMITE for [target]","SMITE Type Choice", smite_types)
if(!smite_choice)
@@ -158,6 +157,21 @@
if(target.client)
target.client.create_fake_ad_popup_multiple(/obj/screen/popup/default, 15)
if(SMITE_PEPPERNADE)
var/obj/item/weapon/grenade/chem_grenade/teargas/grenade = new /obj/item/weapon/grenade/chem_grenade/teargas
grenade.loc = target.loc
to_chat(target,"<span class='warning'>GRENADE?!</span>")
grenade.detonate()
if(SMITE_SPICEREQUEST)
var/obj/item/weapon/reagent_containers/food/condiment/spacespice/spice = new /obj/item/weapon/reagent_containers/food/condiment/spacespice
spice.loc = target.loc
to_chat(target,"A bottle of spices appears at your feet... be careful what you wish for!")
if(SMITE_TERROR)
if(ishuman(target))
target.fear = 200
else
return //Injection? Don't print any messages.
@@ -279,7 +279,8 @@ var/global/list/valid_bloodreagents = list("default","iron","copper","phoron","s
for(var/T in pref.pos_traits + pref.neg_traits)
points_left -= traits_costs[T]
traits_left--
if(T in pref.pos_traits)
traits_left--
. += "<b>Traits Left:</b> [traits_left]<br>"
. += "<b>Points Left:</b> [points_left]<br>"
if(points_left < 0 || traits_left < 0 || (!pref.custom_species && pref.species == SPECIES_CUSTOM))
+7 -3
View File
@@ -494,6 +494,10 @@ var/list/preferences_datums = list()
error("Player picked [choice] slot to copy to, but that wasn't one we sent.")
return
overwrite_character(slotnum)
sanitize_preferences()
ShowChoices(user)
if(tgui_alert(user, "Are you sure you want to override slot [slotnum], [name][nickname ? " ([nickname])" : ""]'s savedata?", "Confirm Override", list("No", "Yes")) == "Yes")
overwrite_character(slotnum)
sanitize_preferences()
save_preferences()
save_character()
attempt_vr(user.client?.prefs_vr,"load_vore","")
ShowChoices(user)
+1
View File
@@ -4873,6 +4873,7 @@
/mob/living/simple_mob/slime
composition_reagent = "slimejelly"
allow_mind_transfer = TRUE
/mob/living/simple_mob
var/kitchen_tag = "animal" //Used for cooking with animals
+2
View File
@@ -41,6 +41,8 @@
var/frustration = 0
var/max_frustration = 0
allow_mind_transfer = TRUE
/mob/living/bot/New()
..()
//update_icons() //VOREstation edit: moved to Init
@@ -310,7 +310,7 @@
else if(!client)
msg += "<span class='deadsay'>[T.He] [T.is] [ssd_msg].</span>"
//VOREStation Add Start
if(away_from_keyboard && manual_afk)
if(client && away_from_keyboard && manual_afk)
msg += "\[Away From Keyboard for [round((client.inactivity/10)/60)] minutes\]"
else if(client && ((client.inactivity / 10) / 60 > 10)) //10 Minutes
msg += "\[Inactive for [round((client.inactivity/10)/60)] minutes\]"
@@ -438,7 +438,7 @@
organ.applied_pressure = null
if(user == src)
user.visible_message("\<span class='filter_notice'>The [user] stops applying pressure to [TU.his] [organ.name]!</span>", "<span class='filter_notice'>You stop applying pressure to your [organ]!</span>")
user.visible_message("<span class='filter_notice'>\The [user] stops applying pressure to [TU.his] [organ.name]!</span>", "<span class='filter_notice'>You stop applying pressure to your [organ]!</span>")
else
user.visible_message("<span class='filter_notice'>\The [user] stops applying pressure to [src]'s [organ.name]!</span>", "<span class='filter_notice'>You stop applying pressure to [src]'s [organ.name]!</span>")
@@ -162,4 +162,6 @@
// Custom Species Name
var/custom_species
var/block_hud
var/block_hud
var/phobias //For holding a list of phobias
@@ -73,6 +73,8 @@
handle_heartbeat()
handle_nif() //VOREStation Addition
if(phobias)
handle_phobias()
if(!client)
species.handle_npc(src)
@@ -1244,6 +1246,27 @@
if(tiredness >= 100)
Sleeping(5)
if(fear)
fear = (fear - 1)
if(fear >= 80 && is_preference_enabled(/datum/client_preference/play_ambiance))
if(last_fear_sound + 51 SECONDS <= world.time)
src << sound('sound/effects/Heart Beat.ogg',0,0,0,25)
last_fear_sound = world.time
if(fear >= 80 && !isSynthetic())
if(prob(1) && get_active_hand())
var/stuff_to_drop = get_active_hand()
drop_item()
visible_message("<span class='notice'>\The [src] suddenly drops their [stuff_to_drop].</span>","<span class='warning'>You drop your [stuff_to_drop]!</span>")
if(prob(5))
var/fear_self = pick(fear_message_self)
var/fear_other = pick(fear_message_other)
visible_message("<span class='notice'>\The [src][fear_other]</span>","<span class='warning'>[fear_self]</span>")
else if(fear >= 30 && !isSynthetic())
if(prob(2))
var/fear_self = pick(fear_message_self)
var/fear_other = pick(fear_message_other)
visible_message("<span class='notice'>\The [src][fear_other]</span>","<span class='warning'>[fear_self]</span>")
if(paralysis || sleeping)
blinded = 1
set_stat(UNCONSCIOUS)
@@ -1442,6 +1465,19 @@
else
clear_fullscreen("tired")
if(fear)
var/severity = 0
switch(fear)
if(10 to 20) severity = 1
if(20 to 30) severity = 2
if(30 to 50) severity = 3
if(50 to 70) severity = 4
if(70 to 90) severity = 5
if(90 to INFINITY) severity = 6
overlay_fullscreen("fear", /obj/screen/fullscreen/fear, severity)
else
clear_fullscreen("fear")
if(healths)
if (chem_effects[CE_PAINKILLER] > 100)
healths.icon_state = "health_numb"
@@ -0,0 +1,58 @@
//Handling and defining of phobias and fears
#define NYCTOPHOBIA 1
#define ARACHNOPHOBIA 2
#define HEMOPHOBIA 4
#define THALASSOPHOBIA 8
#define CLAUSTROPHOBIA_MINOR 16
#define CLAUSTROPHOBIA_MAJOR 32
#define ANATIDAEPHOBIA 64
#define AGRAVIAPHOBIA 128
/mob/living/carbon/human/proc/handle_phobias()
if(phobias & NYCTOPHOBIA)
var/turf/T = get_turf(src)
var/brightness = T.get_lumcount()
if(brightness < 0.2)
fear = min((fear + 3), 102)
if(phobias & ARACHNOPHOBIA)
for (var/mob/living/simple_mob/animal/giant_spider/S in viewers(src, null))
if(!istype(S) || S.stat)
continue
fear = min((fear + 6), 102)
if(phobias & HEMOPHOBIA)
for(var/obj/effect/decal/cleanable/blood/B in view(7, src))
var/obj/effect/decal/cleanable/blood/oil/O = B
var/obj/effect/decal/cleanable/blood/tracks/T = B
if(istype(O) || istype(T))
continue
fear = min((fear + 2), 102)
for(var/turf/simulated/floor/water/blood/T in view(7, src))
fear = min((fear + 2), 102)
if(phobias & THALASSOPHOBIA)
var/turf/T = get_turf(src)
if(istype(T,/turf/simulated/floor/water/underwater) || istype(T,/turf/simulated/floor/water/deep))
fear = min((fear + 4), 102)
if(phobias & CLAUSTROPHOBIA_MINOR)
if(!isturf(loc))
if(!istype(loc,/obj/belly) && !istype(loc,/obj/item/weapon/holder/micro))
fear = min((fear + 3), 102)
if(phobias & CLAUSTROPHOBIA_MAJOR) //Also activated inside of a belly
if(!isturf(loc))
if(!istype(loc,/obj/item/weapon/holder/micro))
fear = min((fear + 3), 102)
if(phobias & ANATIDAEPHOBIA)
for (var/mob/living/simple_mob/animal/space/goose/G in viewers(src, null))
if(!istype(G) || G.stat)
continue
fear = min((fear + 3), 102)
for (var/mob/living/simple_mob/animal/sif/duck/D in viewers(src, null))
if(!istype(D) || D.stat)
continue
fear = min((fear + 3), 102)
for(var/obj/item/weapon/bikehorn/rubberducky/R in view(7, src))
if(!istype(R))
continue
fear = min((fear + 2), 102)
if(phobias & AGRAVIAPHOBIA)
if(is_floating)
fear = min((fear + 4), 102)
@@ -1563,7 +1563,7 @@
to_chat(src, "<span class='notice'>You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]</span>")
return
if(choice == "Change amount")
var/amount_choice = tgui_input_number(usr, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0)
var/amount_choice = tgui_input_number(usr, "How much of the reagent do you want to inject? (Up to 5 units) (Can select 0 for a bite that doesn't inject venom!)", "How much?", trait_injection_amount, 5, 0, round_value = FALSE)
if(amount_choice >= 0)
trait_injection_amount = amount_choice
to_chat(src, "<span class='notice'>You prepare to inject [trait_injection_amount] units of [trait_injection_selected ? "[trait_injection_selected]" : "...nothing. Select a reagent before trying to inject anything."]</span>")
@@ -1088,3 +1088,86 @@
/datum/trait/neutral/food_pref/coffee
)
our_allergens = list(ALLERGEN_STIMULANT)
//////////////PHOBIAS/////////////////
/datum/trait/neutral/nyctophobia
name = "Phobia: Nyctophobia"
desc = "You are afraid of the dark. When in very dark conditions, you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/nyctophobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= NYCTOPHOBIA
/datum/trait/neutral/arachnophobia
name = "Phobia: Arachnophobia"
desc = "You are afraid of spiders. When you can see a large spider, you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/arachnophobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= ARACHNOPHOBIA
/datum/trait/neutral/hemophobia
name = "Phobia: Hemophobia"
desc = "You are afraid of blood. When you can see large amounts of blood, you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/hemophobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= HEMOPHOBIA
/datum/trait/neutral/thalassophobia
name = "Phobia: Thalassophobia"
desc = "You are afraid of deep water. When in deep water, you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/thalassophobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= THALASSOPHOBIA
/datum/trait/neutral/clasutrophobia_minor
name = "Phobia: Claustrophobia (non-vore)"
desc = "You are afraid of tight, enclosed spaces. When inside of another object, you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/clasutrophobia_minor/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= CLAUSTROPHOBIA_MINOR
/datum/trait/neutral/clasutrophobia_major
name = "Phobia: Claustrophobia (vore)"
desc = "You are afraid of tight, enclosed spaces. When inside of another object, including vore bellies, you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/clasutrophobia_major/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= CLAUSTROPHOBIA_MAJOR
/datum/trait/neutral/anatidaephobia
name = "Phobia: Anatidaephobia"
desc = "You are afraid of ducks. When you can see a duck (even rubber ones), you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/anatidaephobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= ANATIDAEPHOBIA
/datum/trait/neutral/agraviaphobia
name = "Phobia: Agraviaphobia"
desc = "You are afraid of a lack of gravity. When you find yourself floating, you will become afraid."
cost = 0
custom_only = FALSE
/datum/trait/neutral/agraviaphobia/apply(var/datum/species/S,var/mob/living/carbon/human/H, var/trait_prefs = null)
..()
H.phobias |= AGRAVIAPHOBIA
@@ -1356,7 +1356,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(tail_style.extra_overlay)
var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay) //CHOMPEdit
if(wagging && tail_style.ani_state)
overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay_w)
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay_w) //RS EDIT
overlay.Blend(rgb(src.r_tail2, src.g_tail2, src.b_tail2), tail_style.color_blend_mode)
tail_s.Blend(overlay, ICON_OVERLAY)
qdel(overlay)
@@ -1368,7 +1368,7 @@ var/global/list/damage_icon_parts = list() //see UpdateDamageIcon()
if(tail_style.extra_overlay2)
var/icon/overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2) //CHOMPEdit
if(wagging && tail_style.ani_state)
overlay = new/icon("icon" = tail_style.icon, "icon_state" = tail_style.extra_overlay2_w)
overlay = new/icon("icon" = (tail_style?.can_loaf && resting) ? tail_style.icon_loaf : tail_style.icon, "icon_state" = tail_style.extra_overlay2_w) //RS EDIT
overlay.Blend(rgb(src.r_tail3, src.g_tail3, src.b_tail3), tail_style.color_blend_mode)
tail_s.Blend(overlay, ICON_OVERLAY)
qdel(overlay)
+23
View File
@@ -83,3 +83,26 @@
var/datum/inventory_panel/inventory_panel
var/last_resist_time = 0 // world.time of the most recent resist that wasn't on cooldown.
var/tiredness = 0 //For vore draining
var/fear = 0 //For fear effects and phobias
var/last_fear_sound = 0 //For making sure the heartbeats don't play over each other
var/list/fear_message_self = list(
"Your heart is racing, it feels like it's going burst from your chest.",
"Your stomach clenches and churns with anxiety.",
"It's getting hard to breathe, you're panting heavily.",
"You feel your eyes straining.",
"A sharp shiver runs down your spine.",
"You feel like you are drowning.",
"You feel your palms clamming up.",
"Your legs feel weak, you can barely control them.",
"You have difficulty even swallowing."
)
var/list/fear_message_other = list(
"'s eyes are darting around the room rapidly.",
" looks like they are shivering, literally shaking.",
" is breathing rapidly.",
" looks profoundly uncomfortable.",
"s literally trembling in front of you.",
"'s hands are shaking.",
" is rocking slightly from side to side."
)
@@ -60,6 +60,8 @@
var/picked_color = FALSE
allow_mind_transfer = TRUE
can_enter_vent_with = list(
/obj/item/weapon/implant,
/obj/item/device/radio/borg,
@@ -117,6 +117,8 @@
/obj/item/stack/material/chitin = 1\
)
allow_mind_transfer = TRUE
/mob/living/simple_mob/animal/giant_spider/apply_melee_effects(var/atom/A)
if(isliving(A))
var/mob/living/L = A
@@ -2,4 +2,5 @@
// They can also be displaced by all mobs.
/mob/living/simple_mob/animal/passive
ai_holder_type = /datum/ai_holder/simple_mob/passive
mob_bump_flag = 0
mob_bump_flag = 0
allow_mind_transfer = TRUE
@@ -3,6 +3,7 @@
minbodytemp = 175
cold_resist = 0.75
heat_resist = -0.5
allow_mind_transfer = TRUE
tame_items = list(
/obj/item/weapon/reagent_containers/food/snacks/crabmeat = 20,
@@ -27,6 +27,8 @@
say_list_type = /datum/say_list/bear
allow_mind_transfer = TRUE
/datum/say_list/bear
speak = list("RAWR!","Rawr!","GRR!","Growl!")
emote_see = list("stares ferociously", "stomps")
@@ -52,6 +52,8 @@
var/do_seasons = TRUE
var/picked_color = FALSE
allow_mind_transfer = TRUE
/////////////////////////////////////// Vore stuff///////////////////////////////////////////
swallowTime = 4 SECONDS
@@ -24,6 +24,8 @@
faction = "vampire"
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/bat
vore_active = 1
@@ -55,4 +57,3 @@
B.escapechance = 15
B.selective_preference = DM_DRAIN
B.escape_stun = 5
@@ -44,6 +44,8 @@
var/poison_chance = 10 // Chance for injection to occur.
var/poison_per_bite = 1 // Amount added per injection.
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/bee/Process_Spacemove(var/check_drift = 0)
return 1 //No drifting in space for space bee!
@@ -325,6 +325,7 @@ I think I covered everything.
///
/mob/living/simple_mob/vore/bigdragon/update_icon()
..()
update_fullness()
build_icons()
@@ -342,9 +343,10 @@ I think I covered everything.
/mob/living/simple_mob/vore/bigdragon/proc/build_icons(var/random)
cut_overlays()
if(stat == DEAD)
icon_state = "dragon-dead"
plane = MOB_LAYER
return
else
plane = ABOVE_MOB_PLANE
if(random)
var/list/bodycolors = list("#1E1E1E","#3F3F3F","#545454","#969696","#DBDBDB","#ABBBD8","#3D0B00","#3A221D","#77554F","#281D1B","#631F00","#964421","#936B24","#381313","#380000","#682121","#700E00","#44525B","#283035","#29353D","#353E44","#281000","#38261A","#302F3D","#322E3A","#262738")
under = pick(underbelly_styles)
@@ -73,6 +73,8 @@
loot_list = list(/obj/item/borg/upgrade/basic/syndicate = 6, /obj/item/borg/upgrade/basic/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6)
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/aggressive/corrupthound/prettyboi
name = "corrupt corrupt hound"
desc = "Bad boy machine broke as well. Seems an attempt was made to achieve a less threatening look, and this one is definitely having some conflicting feelings about it."
@@ -59,6 +59,8 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee/deathclaw
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/aggressive/deathclaw
vore_active = 1
@@ -39,6 +39,8 @@
max_n2 = 0
minbodytemp = 0
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/aggressive/dino
vore_active = 1
@@ -194,6 +194,10 @@
to_chat(prey, "<span class='warning'>You cannot do that in your current state.</span>")
return
if(!pred.allow_mind_transfer)
to_chat(prey, "<span class='warning'>[pred] is unable to be dominated.</span>")
return
if(!pred.ckey)
to_chat(prey, "<span class='notice'>\The [pred] isn't able to be dominated.</span>")
return
@@ -316,7 +320,7 @@
var/list/possible_mobs = list()
for(var/obj/belly/B in src.vore_organs)
for(var/mob/living/L in B)
if(isliving(L) && L.ckey)
if(isliving(L) && L.ckey && L.allow_mind_transfer)
possible_mobs |= L
else
continue
@@ -327,6 +331,9 @@
if(!input)
return
var/mob/living/M = input
if(!M.allow_mind_transfer) //check if the dominated mob pref is enabled
to_chat(src, "<span class='warning'>[M] is unable to be dominated.</span>")
return
if(tgui_alert(src, "You selected [M] to attempt to dominate. Are you sure?", "Dominate Prey",list("No","Yes")) != "Yes")
return
log_admin("[key_name_admin(src)] offered to use dominate prey on [M] ([M.ckey]).")
@@ -52,6 +52,8 @@
say_list_type = /datum/say_list/fennec
ai_holder_type = /datum/ai_holder/simple_mob/passive
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/fennec
vore_active = 1
@@ -27,6 +27,8 @@
say_list_type = /datum/say_list/fennix
ai_holder_type = /datum/ai_holder/simple_mob/retaliate/cooperative
allow_mind_transfer = TRUE
/datum/say_list/fennix
speak = list("SQUEL!","SQEL?","Skree.")
emote_hear = list("Screeeeecheeeeessss!","Chirrup.")
@@ -44,6 +44,8 @@
special_attack_max_range = 5
special_attack_cooldown = 100
allow_mind_transfer = TRUE
// Pepe is love, not hate.
/mob/living/simple_mob/vore/aggressive/frog/New()
if(rand(1,1000000) == 1)
@@ -35,6 +35,8 @@
say_list_type = /datum/say_list/horse
ai_holder_type = /datum/ai_holder/simple_mob/retaliate
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/horse/big
name = "horse"
icon_state = "horse"
@@ -194,4 +196,4 @@
holder.set_dir(moving_to)
holder.IMove(get_step(holder,moving_to))
wander_delay = base_wander_delay
ai_log("handle_wander_movement() : Exited.", AI_LOG_TRACE)
ai_log("handle_wander_movement() : Exited.", AI_LOG_TRACE)
@@ -27,6 +27,8 @@
max_n2 = 0
minbodytemp = 0
allow_mind_transfer = TRUE
// Activate Noms!
vore_active = 1
vore_pounce_chance = 0
@@ -0,0 +1,260 @@
/mob/living/simple_mob/vore/meowl
name = "Meowl"
desc = "A rather cute looking creature that seems to have the features of both a cat and an owl."
catalogue_data = list(/datum/category_item/catalogue/fauna/meowl)
tt_desc = "Strigiline"
icon = 'icons/mob/vore.dmi'
icon_dead = "meowl-dead"
icon_living = "meowl"
icon_state = "meowl"
icon_rest = "meowl_rest"
faction = "meowl"
friendly = list("nudges", "sniffs on", "rumbles softly at", "nuzzles")
response_help = "pets"
response_disarm = "shoves"
response_harm = "attacks"
movement_cooldown = 2
harm_intent_damage = 1
melee_damage_lower = 1
melee_damage_upper = 2
maxHealth = 100
attacktext = list("scratches")
see_in_dark = 8
minbodytemp = 0
ai_holder_type = /datum/ai_holder/simple_mob/vore/meowl
var/well_fed = 0
vore_bump_chance = 0
vore_digest_chance = 50
vore_escape_chance = 5
vore_pounce_chance = 1000
vore_active = 1
vore_icons = 1
vore_icons = SA_ICON_LIVING | SA_ICON_REST
vore_capacity = 1
swallowTime = 50
vore_ignores_undigestable = FALSE
vore_default_mode = DM_HOLD
vore_pounce_maxhealth = 1000
vore_bump_emote = "pounces on"
/mob/living/simple_mob/vore/meowl/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "stomach"
B.desc = "The strange critter suddenly takes advantage of you being alone to pounce atop you and quickly engulf your head within its maw! Before you even have a chance to react, the world goes dark with the inside of the meowls mouth covering your face, a rough tounge lapping smearing wet hot slobber over you. The rest of the process is pretty quick as the cat-owl begins to gulp your head down through a surprisingly stretchy throat and along the tight, flexing tunnel of its gullet. Before long you are pushing face first into the creature's stomach, the wrinkled walls quickly beginning grind slick flesh across it like any other piece of food. The rest of your body soon follows into the increasingly tight space, forced to curl up over yourself as the stomach lining bears down on you from every angle. At first, the stomach itself seems rather inactive, happily just squeezing and massaging you as the meowl settles down to slowly enjoy their snack. Though, struggling might risk setting off the gut one way or another..."
B.mode_flags = DM_FLAG_THICKBELLY
B.belly_fullscreen = "yet_another_tumby"
B.digest_brute = 1
B.digest_burn = 1
B.digest_oxy = 1
B.selectchance = 25
B.digestchance = 0
B.absorbchance = 0
B.escapechance = 10
B.selective_preference = DM_DIGEST
B.escape_stun = 5
B.transferlocation_absorb = "chub"
var/obj/belly/chub = new /obj/belly(src)
chub.immutable = TRUE
chub.name = "chub"
chub.desc = "Your body quickly begins to feel very... different? In fact, you can't really feel your body much at all any more, but you certainly still feel something. The pressure of the gut that was practically crushing you before is relieved, but somehow still present as though you were now on the other side of the interaction. Your being feels much more spread out and practically intertwined with the world around, that world being the meowl itself. The strange cat-owl's purring feels like it's reverberating throughout your entire form, whatever that might be. Every time the critter shakes to ruffle its feathers, you feel yourself shake with it. Even the creatures emotions feel tangible to you, as though you share themselves, and mostly they are ones of fullness and content."
chub.digest_mode = DM_HOLD // like, its got you already, doesn't need to get you more
chub.mode_flags = DM_FLAG_FORCEPSAY
chub.escapable = TRUE // good luck
chub.escapechance = 40 // high chance of STARTING a successful escape attempt
chub.escapechance_absorbed = 5 // m i n e
chub.vore_verb = "soak"
chub.count_absorbed_prey_for_sprite = FALSE
chub.absorbed_struggle_messages_inside = list(
"You try and push free from %pred's %belly, but can't seem to will yourself to move.",
"Your fruitless mental struggles only cause %pred to purr happily.",
"You can't make any progress freeing yourself from %pred's %belly.")
chub.escape_attempt_absorbed_messages_owner = list(
"%prey is attempting to free themselves from your %belly!")
chub.escape_attempt_absorbed_messages_prey = list(
"You try to force yourself out of %pred's %belly.",
"You strain and push, attempting to reach out of %pred's %belly.",
"You work up the will to try and force yourself free of %pred's clutches.")
chub.escape_absorbed_messages_owner = list(
"%prey forces themselves free of your %belly!")
chub.escape_absorbed_messages_prey = list(
"You finally manage to wrest yourself free from %pred's %belly, re-asserting your more usual form.",
"You heave and push, eventually spilling out from %pred's %belly, eliciting a mildly annoyed flurry of wing flapping.")
chub.escape_absorbed_messages_outside = list(
"%prey suddenly forces themselves free of %pred's %belly!")
chub.escape_fail_absorbed_messages_owner = list(
"%prey's attempt to escape form your %belly has failed!")
chub.escape_fail_absorbed_messages_prey = list(
"Before you manage to reach freedom, you feel yourself getting dragged back into %pred's %belly!",
"%pred cheeps playfully, simply pressing your wrigging form back into their %belly before you get anywhere.",
"%pred holds a wing down on their %belly, the gentle pressure breaking your concentration and sending you sinking back into its form.",
"Try as you might, you barely make an impression before %pred simply clenches with the most minimal effort, binding you back into their %belly.",
"Unfortunately, %pred seems to have absolutely no intention of letting you go, and your futile effort goes nowhere.",
"Strain as you might, you can't keep up the effort long enough before you sink back into %pred's %belly.")
/mob/living/simple_mob/vore/meowl/attackby(var/obj/item/O as obj, var/mob/user as mob)
if(istype(O, /obj/item/weapon/reagent_containers/food))
if(health <= 0)
return
user.visible_message("<span class='notice'>\The [src] happily gulps down \the [O] right out of \the [user]'s hand, it seems pretty content now.</span>","<span class='notice'>\The [src] happily gulps down \the [O] right out of your hand, it seems pretty content now.</span>")
user.drop_from_inventory(O)
qdel(O)
well_fed = world.time
return
return ..()
/mob/living/simple_mob/vore/meowl/PounceTarget(var/mob/living/M, var/successrate = 100)
vore_pounce_cooldown = world.time + 1 SECONDS // don't attempt another pounce for a while
if(prob(max(successrate,33))) // pounce success!
M.Weaken(5)
M.visible_message("<span class='danger'>\The [src] pounces on \the [M]!</span>!")
else // pounce misses!
M.visible_message("<span class='danger'>\The [src] attempts to pounce \the [M] but misses!</span>!")
playsound(src, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
if(will_eat(M) && (!M.canmove || vore_standing_too)) //if they're edible then eat them too
return EatTarget(M)
else
return //just leave them
/datum/category_item/catalogue/fauna/meowl
name = "Extra-Realspace Fauna - Meowl"
desc = "Classification: Strigiline\
<br><br>\
These unusual creatures are sometimes found within redgate locations and seem to exhibit both the characteristics of a cat and of an owl. \
Whilst these animals at a glance appear to be rather sweet and friendly, they are actually very competent predators and excellent opportunists. \
They will very rarely attack their prey when there are other creatures nearby, preferring to wait until their target is alone and unprotected. \
Despite this, these creatues can be rather docile in the right conditions, and will not attack those who it believes it can get food from reliably."
value = CATALOGUER_REWARD_HARD
/datum/ai_holder/simple_mob/vore/meowl
var/last_friend_time = 0
/datum/ai_holder/simple_mob/vore/meowl/engage_target()
ai_log("engage_target() : Entering.", AI_LOG_DEBUG)
// Can we still see them?
if(!target || !can_attack(target))
ai_log("engage_target() : Lost sight of target.", AI_LOG_TRACE)
if(lose_target()) // We lost them (returns TRUE if we found something else to do)
ai_log("engage_target() : Pursuing other options (last seen, or a new target).", AI_LOG_TRACE)
return
var/distance = get_dist(holder, target)
ai_log("engage_target() : Distance to target ([target]) is [distance].", AI_LOG_TRACE)
holder.face_atom(target)
last_conflict_time = world.time
// Check if there is more than one person nearby and if they allow eating them
if(!check_attacker(target)) //Only act friendly if you haven't been attacked yet
var/list/crowd = list_targets()
var/mob/living/L = target
if(istype(L))
if(!L.allowmobvore && vore_hostile && distance <= 8)
play_friend(target)
set_stance(STANCE_APPROACH)
return
if(crowd.len > 1 && distance <= 8)
play_friend(target)
set_stance(STANCE_APPROACH)
return
// Don't attack if you're well fed!
var/mob/living/simple_mob/vore/meowl/M = holder
if(istype(M))
if(M.well_fed + 10 MINUTES > world.time)
set_stance(STANCE_APPROACH)
return
// Do a 'special' attack, if one is allowed.
// if(prob(special_attack_prob) && (distance >= special_attack_min_range) && (distance <= special_attack_max_range))
if(holder.ICheckSpecialAttack(target))
ai_log("engage_target() : Attempting a special attack.", AI_LOG_TRACE)
on_engagement(target)
if(special_attack(target)) // If this fails, then we try a regular melee/ranged attack.
ai_log("engage_target() : Successful special attack. Exiting.", AI_LOG_DEBUG)
return
// Stab them.
else if(distance <= 1 && !pointblank)
ai_log("engage_target() : Attempting a melee attack.", AI_LOG_TRACE)
on_engagement(target)
melee_attack(target)
else if(distance <= 1 && !holder.ICheckRangedAttack(target)) // Doesn't have projectile, but is pointblank
ai_log("engage_target() : Attempting a melee attack.", AI_LOG_TRACE)
on_engagement(target)
melee_attack(target)
// Shoot them.
else if(holder.ICheckRangedAttack(target) && (distance <= max_range(target)) )
on_engagement(target)
if(firing_lanes && !test_projectile_safety(target))
// Nudge them a bit, maybe they can shoot next time.
var/turf/T = get_step(holder, pick(cardinal))
if(T)
holder.IMove(T) // IMove() will respect movement cooldown.
holder.face_atom(target)
ai_log("engage_target() : Could not safely fire at target. Exiting.", AI_LOG_DEBUG)
return
ai_log("engage_target() : Attempting a ranged attack.", AI_LOG_TRACE)
ranged_attack(target)
// Run after them.
else if(!stand_ground)
ai_log("engage_target() : Target ([target]) too far away. Exiting.", AI_LOG_DEBUG)
set_stance(STANCE_APPROACH)
/datum/ai_holder/simple_mob/vore/meowl/proc/play_friend(target)
if(last_friend_time + 60 SECONDS > world.time)
return
var/list/friend_text_close = list("nuzzles its head against \the [target] sweetly.",
"lets out a cute little chirp and flaps its wings.",
"wriggles its tail excitedly and begins to purr.",
"hops up and down on the spot!",
"looks at \the [target] with the biggest, roundest eyes that it can manage.",
"claws at the ground for a moment, as if looking for something.",
"stares off into the distance before letting out a quiet meow.",
"cheeps a high pitch sound, before looking up.",
"rubs its head gently against \the [target].",
"raises a wing to wash under it.",
"lets out a long, sing-songy mrowl.",
"purrs happily as it snuggles up to \the [target].",
"flaps its wings and wiggles its whole body.",
"shakes rapidly to ruffle its own feathers."
)
var/list/friend_text_far = list("lets out a cute little chirp and flaps its wings.",
"wriggles its tail excitedly and begins to purr.",
"hops up and down on the spot!",
"claws at the ground for a moment, as if looking for something.",
"stares off into the distance before letting out a quiet meow.",
"cheeps a high pitch sound, before looking up.",
"raises a wing to wash under it.",
"lets out a long, sing-songy mrowl.",
"flaps its wings and wiggles its whole body.",
"shakes rapidly to ruffle its own feathers."
)
var/distance = get_dist(holder, target)
if(distance <= 1)
var/talkies = pick(friend_text_close)
holder.visible_message("<b>\The [holder]</b> [talkies]")
else
var/talkies = pick(friend_text_far)
holder.visible_message("<b>\The [holder]</b> [talkies]")
last_friend_time = world.time
@@ -265,48 +265,45 @@
var/list/possible_mobs = list()
for(var/obj/belly/B in src.vore_organs)
for(var/mob/living/H in B)
if( (ishuman(H) || isrobot(H)) && H.ckey )
if((ishuman(H) || isrobot(H)) && H.ckey)
possible_mobs += H
else
continue
var/mob/living/carbon/human/M
var/input = tgui_input_list(src, "Select a mob to take over:", "Take Over Prey", possible_mobs)
if(!input)
return
M = input
if(!M)
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(M))
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(tgui_alert(src, "You selected [M] to attempt to take over. Are you sure?", "Take Over Prey",list("No","Yes")) == "Yes")
log_admin("[key_name_admin(src)] offered [M] to swap bodies as a morph.")
if(tgui_alert(M, "\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")
if(tgui_alert(M, "Are you sure? The only way to undo this on your own is to OOC Escape.", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
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")
if(tgui_alert(L, "Are you sure? The only way to undo this on your own is to OOC Escape.", "Allow Morph To Take Over",list("No","Yes")) == "Yes")
if(buckled)
buckled.unbuckle_mob()
if(M.buckled)
M.buckled.unbuckle_mob()
if(L.buckled)
L.buckled.unbuckle_mob()
if(LAZYLEN(buckled_mobs))
for(var/buckledmob in buckled_mobs)
riding_datum.force_dismount(buckledmob)
if(LAZYLEN(M.buckled_mobs))
for(var/p_buckledmob in M.buckled_mobs)
M.riding_datum.force_dismount(p_buckledmob)
if(LAZYLEN(L.buckled_mobs))
for(var/p_buckledmob in L.buckled_mobs)
L.riding_datum.force_dismount(p_buckledmob)
if(pulledby)
pulledby.stop_pulling()
if(M.pulledby)
M.pulledby.stop_pulling()
if(L.pulledby)
L.pulledby.stop_pulling()
stop_pulling()
original_ckey = ckey
log_and_message_admins("[key_name_admin(src)] has swapped bodies with [key_name_admin(M)] as a morph at [get_area(src)] - [COORD(src)].")
new /mob/living/simple_mob/vore/morph/dominated_prey(M.vore_selected, M.ckey, src, M)
log_and_message_admins("[key_name_admin(src)] has swapped bodies with [key_name_admin(L)] as a morph at [get_area(src)] - [COORD(src)].")
new /mob/living/simple_mob/vore/morph/dominated_prey(L.vore_selected, L.ckey, src, L)
else
to_chat(src, "<span class='warning'>\The [M] declined your request for control.</span>")
to_chat(src, "<span class='warning'>\The [L] declined your request for control.</span>")
else
to_chat(src, "<span class='warning'>\The [M] declined your request for control.</span>")
to_chat(src, "<span class='warning'>\The [L] declined your request for control.</span>")
/mob/living/simple_mob/vore/morph/dominated_prey
name = "subservient node"
@@ -47,6 +47,8 @@
var/tamed = 0
var/tame_chance = 50 //It's a fiddy-fiddy default you may get a buddy pal or you may get mauled and ate. Win-win!
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/otie
@@ -58,6 +58,8 @@
maxHealth = 100
health = 100
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/pakkun/Life()
. = ..()
if(client)
@@ -42,6 +42,8 @@
say_list_type = /datum/say_list/panther
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/aggressive/panther
vore_active = 1
@@ -43,6 +43,8 @@
vore_default_mode = DM_HOLD
vore_icons = SA_ICON_LIVING
allow_mind_transfer = TRUE
var/body_color //brown, black and white, leave blank for random
var/grumpiness = 0 // This determines how grumpy we are. Pet us to increase it, leave us alone to decrease.
@@ -48,6 +48,8 @@
"raptorwhite"
)
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/raptor
vore_bump_chance = 25
@@ -70,6 +70,8 @@
say_list_type = /datum/say_list/rat
ai_holder_type = /datum/ai_holder/simple_mob/melee/rat
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/aggressive/rat/init_vore()
..()
var/obj/belly/B = vore_selected
@@ -28,6 +28,8 @@
say_list_type = /datum/say_list/redpanda
ai_holder_type = /datum/ai_holder/simple_mob/passive
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/redpanda
vore_active = 1
@@ -56,6 +56,8 @@
"scel_green"
)
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/scel/New()
..()
if(random_skin)
@@ -75,7 +77,7 @@
vore_icons = SA_ICON_LIVING | SA_ICON_REST
vore_capacity = 1
swallowTime = 50
vore_ignores_undigestable = TRUE
vore_ignores_undigestable = FALSE
vore_default_mode = DM_SELECT
vore_pounce_maxhealth = 125
vore_bump_emote = "tries to devour"
@@ -84,6 +84,8 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee
say_list_type = /datum/say_list/sect_drone
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/sect_drone/Login()
. = ..()
verbs |= /mob/living/simple_mob/vore/sect_drone/proc/set_abdomen_color
@@ -85,6 +85,8 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee
say_list_type = /datum/say_list/sect_queen
allow_mind_transfer = TRUE
/mob/living/simple_mob/vore/sect_queen/Login()
. = ..()
verbs |= /mob/living/simple_mob/vore/sect_queen/proc/set_abdomen_color
@@ -54,6 +54,8 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/aggressive/giant_snake
vore_active = 1
@@ -51,6 +51,7 @@ List of things solar grubs should be able to do:
var/shock_chance = 10 // Beware
var/tracked = FALSE
allow_mind_transfer = TRUE
glow_override = TRUE
/datum/say_list/solargrub
@@ -46,6 +46,7 @@
show_vore_fx = client.prefs_vr.show_vore_fx
step_mechanics_pref = client.prefs_vr.step_mechanics_pref
pickup_pref = client.prefs_vr.pickup_pref
allow_mind_transfer = client.prefs_vr.allow_mind_transfer
/mob/living/simple_mob/proc/set_name()
set name = "Set Name"
@@ -31,6 +31,8 @@
has_hands = 1
allow_mind_transfer = TRUE
// Nomnomn
/mob/living/simple_mob/vore/weretiger
vore_active = 1
@@ -33,6 +33,8 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee/evasive
catalogue_data = list(/datum/category_item/catalogue/fauna/wolf)
allow_mind_transfer = TRUE
// Activate Noms!
/mob/living/simple_mob/vore/wolf
vore_active = 1
@@ -28,7 +28,7 @@
maxHealth = 150
health = 150
see_in_dark = 10
//Something something, phoron mutation.
min_oxy = 0
max_oxy = 0
@@ -64,5 +64,7 @@
ai_holder_type = /datum/ai_holder/simple_mob/melee
say_list_type = /datum/say_list/xeno_defanged
allow_mind_transfer = TRUE
/datum/say_list/xeno_defanged
say_got_target = list("hisses angrily!")
say_got_target = list("hisses angrily!")
+26 -26
View File
@@ -39,35 +39,35 @@
pass = FALSE
to_chat(src,"<span class='warning'>You have to name your custom species. Do this on the VORE tab in character setup.</span>")
//Check traits/costs
var/list/megalist = client.prefs.pos_traits + client.prefs.neu_traits + client.prefs.neg_traits
var/points_left = client.prefs.starting_trait_points
var/traits_left = client.prefs.max_traits
var/pref_synth = client.prefs.dirty_synth
var/pref_meat = client.prefs.gross_meatbag
for(var/datum/trait/T as anything in megalist)
var/cost = traits_costs[T]
//Check traits/costs
var/list/megalist = client.prefs.pos_traits + client.prefs.neu_traits + client.prefs.neg_traits
var/points_left = client.prefs.starting_trait_points
var/traits_left = client.prefs.max_traits
var/pref_synth = client.prefs.dirty_synth
var/pref_meat = client.prefs.gross_meatbag
for(var/datum/trait/T as anything in megalist)
var/cost = traits_costs[T]
if(cost)
traits_left--
if(T.category == TRAIT_TYPE_POSITIVE)
traits_left--
//A trait was removed from the game
if(isnull(cost))
pass = FALSE
to_chat(src,"<span class='warning'>Your custom species is not playable. One or more traits appear to have been removed from the game or renamed. Enter character setup to correct this.</span>")
break
else
points_left -= traits_costs[T]
var/take_flags = initial(T.can_take)
if((pref_synth && !(take_flags & SYNTHETICS)) || (pref_meat && !(take_flags & ORGANICS)))
pass = FALSE
to_chat(src, "<span class='warning'>Some of your traits are not usable by your character type (synthetic traits on organic, or vice versa).</span>")
//Went into negatives
if(points_left < 0 || traits_left < 0)
//A trait was removed from the game
if(isnull(cost))
pass = FALSE
to_chat(src,"<span class='warning'>Your custom species is not playable. Reconfigure your traits on the VORE tab.</span>")
to_chat(src,"<span class='warning'>Your species is not playable. One or more traits appear to have been removed from the game or renamed. Enter character setup to correct this.</span>")
break
else
points_left -= traits_costs[T]
var/take_flags = initial(T.can_take)
if((pref_synth && !(take_flags & SYNTHETICS)) || (pref_meat && !(take_flags & ORGANICS)))
pass = FALSE
to_chat(src, "<span class='warning'>Some of your traits are not usable by your character type (synthetic traits on organic, or vice versa).</span>")
//Went into negatives
if(points_left < 0 || traits_left < 0)
pass = FALSE
to_chat(src,"<span class='warning'>Your species is not playable. Reconfigure your traits on the VORE tab. Trait points: [points_left]. Traits left: [traits_left].</span>")
//Final popup notice
if (!pass)
@@ -1532,3 +1532,21 @@
extra_overlay2 = "kaiju_long_a_spikes_glow"
do_colouration = 1
color_blend_mode = ICON_MULTIPLY
//RS ADD START
/datum/sprite_accessory/tail/longtail/flagtail
name = "Flagtail"
icon = 'icons/rogue-star/tails_64x32_rs.dmi'
icon_state = "flagtail"
extra_overlay = "flagtail-1"
extra_overlay2 = "flagtail-2"
/datum/sprite_accessory/tail/longtail/chonksqrl
name = "Squirrel (Big)"
icon = 'icons/rogue-star/tails_64x32_rs.dmi'
icon_state = "chonksqrl"
extra_overlay = "chonksqrl-m1"
extra_overlay2 = "chonksqrl-m2"
//RS ADD END
@@ -363,69 +363,3 @@
/datum/sprite_accessory/tail/taur/zorgoia/fat
name = "Zorgoia (Fat Taur)"
extra_overlay = "zorgoia_fat"
/datum/sprite_accessory/tail/taur/wolf
vore_tail_sprite_variant = "N"
fullness_icons = 3
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/naga/naga_2c
vore_tail_sprite_variant = "Naga"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/horse
vore_tail_sprite_variant = "Horse"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/cow
vore_tail_sprite_variant = "Cow"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard
vore_tail_sprite_variant = "Lizard"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/lizard/synthlizard
vore_tail_sprite_variant = "SynthLiz"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/feline
vore_tail_sprite_variant = "Feline"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/slug
vore_tail_sprite_variant = "Slug"
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/drake
vore_tail_sprite_variant = "Drake"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/otie
vore_tail_sprite_variant = "Otie"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/deer
vore_tail_sprite_variant = "Deer"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
/datum/sprite_accessory/tail/taur/skunk
vore_tail_sprite_variant = "Skunk"
belly_variant_when_loaf = TRUE
fullness_icons = 1
struggle_anim = TRUE
@@ -84,22 +84,22 @@
/datum/sprite_accessory/tail/taur/wolf/fatwolf_2c
name = "Fat Wolf 3-color (Taur)"
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
icon = 'icons/mob/vore/taurs_ch.dmi' //Ported from Chomp
icon_state = "fatwolf_s"
extra_overlay = "fatwolf_markings"
extra_overlay2 = "fatwolf_markings_2" //CHOMPEdit
extra_overlay2 = "fatwolf_markings_2" //Ported from Chomp
//icon_sprite_tag = "fatwolf2c"
loaf_offset = 3
/datum/sprite_accessory/tail/taur/wolf/wolf_2c_wag
name = "Wolf 3-color (Taur, Fat vwag)"
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
icon = 'icons/mob/vore/taurs_ch.dmi' //Ported from Chomp
icon_state = "wolf_s"
extra_overlay = "wolf_markings"
extra_overlay2 = "wolf_markings_2"
ani_state = "fatwolf_s"
extra_overlay_w = "fatwolf_markings"
extra_overlay2_w = "fatwolf_markings_2" //CHOMPEdit
extra_overlay2_w = "fatwolf_markings_2" //Ported from Chomp
/datum/sprite_accessory/tail/taur/wolf/synthwolf
name = "SynthWolf dual-color (Taur)"
@@ -323,7 +323,7 @@
/datum/sprite_accessory/tail/taur/lizard
name = "Lizard (Taur)"
icon_state = "lizard_s"
// suit_sprites = 'icons/mob/taursuits_lizard_vr.dmi' ///Chomp edit
// suit_sprites = 'icons/mob/taursuits_lizard_vr.dmi' //Ported from Chomp
suit_sprites = 'icons/mob/taursuits_lizard_ch.dmi'
icon_sprite_tag = "lizard"
can_loaf = TRUE
@@ -488,10 +488,10 @@
/datum/sprite_accessory/tail/taur/feline/fatfeline_2c
name = "Fat Feline 3-color (Taur)"
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
icon = 'icons/mob/vore/taurs_ch.dmi' //Ported from Chomp
icon_state = "fatfeline_s"
extra_overlay = "fatfeline_markings"
extra_overlay2 = "fatfeline_markings_2" //CHOMPEdit
extra_overlay2 = "fatfeline_markings_2" //Ported from Chomp
//icon_sprite_tag = "fatfeline2c"
can_loaf = TRUE
icon_loaf = 'icons/mob/vore/taurs_vr_loaf.dmi'
@@ -499,13 +499,13 @@
/datum/sprite_accessory/tail/taur/feline/feline_2c_wag
name = "Feline 3-color (Taur, Fat vwag)"
icon = 'icons/mob/vore/taurs_ch.dmi' //CHOMPEdit
icon = 'icons/mob/vore/taurs_ch.dmi' //Ported from Chomp
icon_state = "feline_s"
extra_overlay = "feline_markings"
extra_overlay2 = "feline_markings_2"
ani_state = "fatfeline_s"
extra_overlay_w = "fatfeline_markings"
extra_overlay2_w = "fatfeline_markings_2" //CHOMPEdit
extra_overlay2_w = "fatfeline_markings_2" //Ported from Chomp
loaf_offset = 3
/datum/sprite_accessory/tail/taur/feline/synthfeline
@@ -930,7 +930,7 @@
name = "Fat Sect Drone (Taur)"
icon_state = "fat_sect_drone"
extra_overlay = "fat_sect_drone_markings"
icon_sprite_tag = "sect_drone" //CHOMPEdit addition
icon_sprite_tag = "sect_drone" //Ported from Chomp
/datum/sprite_accessory/tail/taur/sect_drone/drone_wag
name = "Sect Drone (Taur, Fat vwag)"
@@ -938,7 +938,7 @@
extra_overlay = "sect_drone_markings"
ani_state = "fat_sect_drone"
extra_overlay_w = "fat_sect_drone_markings"
icon_sprite_tag = "sect_drone" //CHOMPEdit addition
icon_sprite_tag = "sect_drone" //Ported from Chomp
/datum/sprite_accessory/tail/taur/giantspider_colorable//these are honestly better fit for vass icontypes whoops
name = "Giant Spider dual-color (Taur)"
@@ -1119,3 +1119,22 @@
offset_y = -11
mob_offset_y = 11
*/
//RS ADD START
/datum/sprite_accessory/tail/taur/bunny
name = "Bunny (Taur, Fat vwag)"
icon = 'icons/rogue-star/tails_64x32_rs.dmi'
icon_state = "bnytr"
extra_overlay = "bnytr-m1"
extra_overlay2 = "bnytr-m2"
ani_state = "bnytr-f"
extra_overlay_w = "bnytr-m1"
extra_overlay2_w = "bnytr-f-m2"
can_loaf = TRUE
icon_loaf = 'icons/rogue-star/loafs_64x32.dmi'
loaf_offset = 4
//RS ADD END
+9
View File
@@ -512,6 +512,15 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
modular_bodyparts = MODULAR_BODYPART_PROSTHETIC
parts = list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)
/datum/robolimb/digi
company = "DSI Digitigrade Legs" //yup that's how I'm fixing this, you NEED to have digi on or else oh god it looks weird
desc = "Synthflesh-wrapped robotic digitigrade legs, for the animal in all of us."
icon = 'icons/mob/human_races/r_digi.dmi'
lifelike = 1
unavailable_to_build = 1
skin_tone = 1
parts = list(BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT)
/obj/item/weapon/disk/limb/New(var/newloc)
..()
+2
View File
@@ -658,6 +658,8 @@
if(H.species)
P.accuracy += H.species.gun_accuracy_mod
P.dispersion = max(P.dispersion + H.species.gun_accuracy_dispersion_mod, 0)
if(H.fear > 30)
P.accuracy -= 35
//does the actual launching of the projectile
/obj/item/weapon/gun/proc/process_projectile(obj/projectile, mob/user, atom/target, var/target_zone, var/params=null)
+7
View File
@@ -232,6 +232,11 @@
high_message_list = list("Everything feels a bit more steady.", "Your mind feels stable.")
sober_message_list = list("You feel a little tired.", "You feel a little more listless...")
/datum/reagent/drugs/citalopram/affect_blood(var/mob/living/carbon/M, var/alien, var/removed)
..()
M.fear = max((M.fear - 3),0)
/datum/reagent/drugs/paroxetine
name = "Paroxetine"
id = "paroxetine"
@@ -243,6 +248,8 @@
/datum/reagent/drugs/paroxetine/affect_blood(mob/living/carbon/M, var/alien, var/removed)
..()
M.fear = max((M.fear - 6),0)
if(prob(5) && prob_proc == TRUE)
to_chat(M, "<span class='warning'>Everything feels out of control...</span>")
M.hallucination += 200
+22 -15
View File
@@ -929,28 +929,35 @@
// The next function sets the messages on the belly, from human-readable var
// replacement strings and linebreaks as delimiters (two \n\n by default).
// They also sanitize the messages.
/obj/belly/proc/set_messages(raw_text, type, delim = "\n\n")
// Give them a limit for each type...
/obj/belly/proc/set_messages(raw_text, type, delim = "\n\n", limit)
if(!limit)
CRASH("[src] set message called without limit!")
ASSERT(type == "smo" || type == "smi" || type == "asmo" || type == "asmi" || type == "escao" || type == "escap" || type == "escp" || type == "esco" || type == "escout" || type == "escip" || type == "escio" || type == "esciout" || type == "escfp" || type == "escfo" || type == "aescao" || type == "aescap" || type == "aescp" || type == "aesco" || type == "aescout" || type == "aescfp" || type == "aescfo" || type == "trnspp" || type == "trnspo" || type == "trnssp" || type == "trnsso" || type == "stmodp" || type == "stmodo" || type == "stmoap" || type == "stmoao" || type == "dmo" || type == "dmp" || type == "amo" || type == "amp" || type == "uamo" || type == "uamp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb")
var/list/raw_list = splittext(html_encode(raw_text),delim)
var/list/raw_list
if(findtext(raw_text, delim))
raw_list = splittext(html_encode(raw_text), delim)
else
raw_list = list(raw_text)
if(raw_list.len > 10)
raw_list.Cut(11)
log_debug("[owner] tried to set [lowertext(name)] with 11+ messages")
var/realIndex = 0
for(var/i = 1, i <= raw_list.len, i++)
if((length(raw_list[i]) > 160 || length(raw_list[i]) < 10) && !(type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb")) //160 is fudged value due to htmlencoding increasing the size
raw_list.Cut(i,i)
log_debug("[owner] tried to set [lowertext(name)] with >121 or <10 char message")
else if((type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb") && (length(raw_list[i]) > 510 || length(raw_list[i]) < 10))
raw_list.Cut(i,i)
log_debug("[owner] tried to set [lowertext(name)] idle message with >501 or <10 char message")
else if((type == "em" || type == "ema") && (length(raw_list[i]) > 260 || length(raw_list[i]) < 10))
raw_list.Cut(i,i)
log_debug("[owner] tried to set [lowertext(name)] examine message with >260 or <10 char message")
else
raw_list[i] = readd_quotes(raw_list[i])
//Also fix % sign for var replacement
raw_list[i] = replacetext(raw_list[i],"&#37;","%")
realIndex++
raw_list[i] = readd_quotes(raw_list[i])
//Also fix % sign for var replacement
raw_list[i] = replacetext(raw_list[i],"&#37;","%")
if(length(raw_list[i]) > limit || length(raw_list[i]) < 10)
to_chat(owner, span_warning("One of the message for [lowertext(name)] exceeded the limit of [limit] characters or has been below the lower limit of 10 characters and has been removed. Actual length: [length(raw_list[i])]"))
//Reflect message to the player so that they don't just lose it
to_chat(owner, span_warning("Message [realIndex]: [raw_list[i]]"))
log_debug("[owner] tried to set [lowertext(name)] [type] message with >[limit] or <10 characters")
raw_list.Cut(i, i + 1)
i--
ASSERT(raw_list.len <= 10) //Sanity
+75
View File
@@ -264,6 +264,7 @@
P.nutrition_messages = src.nutrition_messages
P.weight_message_visible = src.weight_message_visible
P.weight_messages = src.weight_messages
P.allow_mind_transfer = src.allow_mind_transfer
P.vore_sprite_color = istype(src, /mob/living/carbon/human) ? src:vore_sprite_color : null
@@ -316,6 +317,7 @@
nutrition_messages = P.nutrition_messages
weight_message_visible = P.weight_message_visible
weight_messages = P.weight_messages
allow_mind_transfer = P.allow_mind_transfer
if (istype(src, /mob/living/carbon/human))
@@ -331,6 +333,78 @@
return TRUE
/mob/proc/load_vore_prefs_from_slot()
var/datum/preferences/P = client.prefs
var/remembered_default = P.load_vore_prefs_from_client(src) //Loads the preferences of a chosen slot
if(!remembered_default)
return
apply_vore_prefs() //Applies the vore preferences of said slot
if(remembered_default)
P.return_to_character_slot(src, remembered_default) //sets you back to the original default slot
return TRUE
/datum/preferences/proc/load_vore_prefs_from_client(mob/user)
if(selecting_slots)
to_chat(user, "<span class='warning'>You already have a slot selection dialog open!</span>")
return
var/savefile/S = new /savefile(path)
if(!S)
error("Somehow missing savefile path?! [path]")
return
var/name
var/nickname //vorestation edit - This set appends nicknames to the save slot
var/list/charlist = list()
var/default //VOREStation edit
for(var/i=1, i<= config.character_slots, i++)
S.cd = "/character[i]"
S["real_name"] >> name
S["nickname"] >> nickname //vorestation edit
if(!name)
name = "[i] - \[Unused Slot\]"
else if(i == default_slot)
name = "►[i] - [name]"
else
name = "[i] - [name]"
if (i == default_slot) //VOREStation edit
default = "[name][nickname ? " ([nickname])" : ""]"
charlist["[name][nickname ? " ([nickname])" : ""]"] = i
var/remember_default = default_slot
selecting_slots = TRUE
var/choice = tgui_input_list(user, "Select a character to load:", "Load Slot", charlist, default)
selecting_slots = FALSE
if(!choice)
return
var/slotnum = charlist[choice]
if(!slotnum)
error("Player picked [choice] slot to load, but that wasn't one we sent.")
return
load_character(slotnum)
attempt_vr(user.client?.prefs_vr,"load_vore","") //VOREStation Edit
sanitize_preferences()
return remember_default
/datum/preferences/proc/return_to_character_slot(mob/user, var/remembered_default)
var/savefile/S = new /savefile(path)
if(!S)
error("Somehow missing savefile path?! [path]")
return
load_character(remembered_default)
attempt_vr(user.client?.prefs_vr,"load_vore","") //VOREStation Edit
sanitize_preferences()
//
// Release everything in every vore organ
//
@@ -1135,6 +1209,7 @@
dispvoreprefs += "<b>Food Vore:</b> [food_vore ? "Enabled" : "Disabled"]<br>"
dispvoreprefs += "<b>Inbelly Spawning:</b> [allow_inbelly_spawning ? "Allowed" : "Disallowed"]<br>"
dispvoreprefs += "<b>Spontaneous transformation:</b> [allow_spontaneous_tf ? "Enabled" : "Disabled"]<br>"
dispvoreprefs += "<b>Mind transfer:</b> [allow_mind_transfer ? "Allowed" : "Disallowed"]<br>"
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>"
+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_mind_transfer = FALSE //Allows ones mind to be taken over or swapped
var/nutrition_message_visible = TRUE
var/list/nutrition_messages = list(
"They are starving! You can hear their stomach snarling from across the room!",
+5
View File
@@ -70,6 +70,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/pickup_pref = TRUE
var/vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
var/allow_mind_transfer = FALSE
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
@@ -196,6 +197,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
weight_messages = json_from_file["weight_messages"]
eating_privacy_global = json_from_file["eating_privacy_global"]
vore_sprite_color = json_from_file["vore_sprite_color"]
allow_mind_transfer = json_from_file["allow_mind_transfer"]
//Quick sanitize
if(isnull(digestable))
@@ -284,6 +286,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
weight_messages.Add("")
if(isnull(vore_sprite_color))
vore_sprite_color = list("stomach" = "#000", "taur belly" = "#000")
if(isnull(allow_mind_transfer))
allow_mind_transfer = FALSE
return TRUE
/datum/vore_preferences/proc/save_vore()
@@ -317,6 +321,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"slip_vore" = slip_vore,
"stumble_vore" = stumble_vore,
"throw_vore" = throw_vore,
"allow_mind_transfer" = allow_mind_transfer,
"food_vore" = food_vore,
"digest_pain" = digest_pain,
"nutrition_message_visible" = nutrition_message_visible,
+114 -97
View File
@@ -335,6 +335,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
"step_mechanics_active" = host.step_mechanics_pref,
"pickup_mechanics_active" = host.pickup_pref,
"noisy" = host.noisy,
"allow_mind_transfer" = host.allow_mind_transfer,
"drop_vore" = host.drop_vore,
"slip_vore" = host.slip_vore,
"stumble_vore" = host.stumble_vore,
@@ -444,6 +445,16 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
to_chat(usr,"<span class='notice'>Virgo-specific preferences applied from active slot!</span>")
unsaved_changes = FALSE
return TRUE
if("loadprefsfromslot")
var/alert = tgui_alert(usr, "Are you sure you want to load another character slot's preferences? This will remove your current vore organs and eject their contents. This will not be immediately saved to your character slot, and you will need to save manually to overwrite your current bellies and preferences.","Confirmation",list("Load","Cancel"))
if(alert != "Load")
return FALSE
if(!host.load_vore_prefs_from_slot())
tgui_alert_async(usr, "ERROR: Virgo-specific preferences failed to apply!","Error")
else
to_chat(usr,"<span class='notice'>Virgo-specific preferences applied from active slot!</span>")
unsaved_changes = TRUE
return TRUE
if("exportpanel")
var/mob/living/user = usr
if(!user)
@@ -569,6 +580,12 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
host.client.prefs_vr.pickup_pref = host.pickup_pref
unsaved_changes = TRUE
return TRUE
if("toggle_allow_mind_transfer")
host.allow_mind_transfer = !host.allow_mind_transfer
if(host.client.prefs_vr)
host.client.prefs_vr.allow_mind_transfer = host.allow_mind_transfer
unsaved_changes = TRUE
return TRUE
if("toggle_healbelly")
host.permit_healbelly = !host.permit_healbelly
if(host.client.prefs_vr)
@@ -1070,193 +1087,193 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
. = TRUE
if("b_msgs")
if(user.text_warnings)
if(tgui_alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message (250 for examines, 500 for idle messages), max 10 messages per topic.","Really, don't.",list("OK", "Disable Warnings")) == "Disable Warnings") // Should remain tgui_alert() (blocking)
if(tgui_alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max [MAX_MESSAGE_LEN / 4] characters per message ([MAX_MESSAGE_LEN / 2] for examines, [MAX_MESSAGE_LEN / 4] for idle messages), max 10 messages per topic or a total of [MAX_MESSAGE_LEN * 1.5] characters.","Really, don't.",list("OK", "Disable Warnings")) == "Disable Warnings") // Should remain tgui_alert() (blocking)
user.text_warnings = FALSE
var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. '%count' will be replaced with the number of anything in your belly. '%countprey' will be replaced with the number of living prey in your belly."
switch(params["msgtype"])
if("dmp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"dmp")
host.vore_selected.set_messages(new_message,"dmp", limit = MAX_MESSAGE_LEN / 4)
if("dmo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",host.vore_selected.get_messages("dmo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",host.vore_selected.get_messages("dmo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"dmo")
host.vore_selected.set_messages(new_message,"dmo", limit = MAX_MESSAGE_LEN / 4)
if("amp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("amp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Absorb Message (to prey)",host.vore_selected.get_messages("amp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"amp")
host.vore_selected.set_messages(new_message,"amp", limit = MAX_MESSAGE_LEN / 4)
if("amo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("amo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's absorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Absorb Message (to you)",host.vore_selected.get_messages("amo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"amo")
host.vore_selected.set_messages(new_message,"amo", limit = MAX_MESSAGE_LEN / 4)
if("uamp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their unnabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to prey)",host.vore_selected.get_messages("uamp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when their unnabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Unabsorb Message (to prey)",host.vore_selected.get_messages("uamp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"uamp")
host.vore_selected.set_messages(new_message,"uamp", limit = MAX_MESSAGE_LEN / 4)
if("uamo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's unabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Digest Message (to you)",host.vore_selected.get_messages("uamo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey's unabsorption finishes. Write them in 2nd person ('you feel X'). Avoid using %pred in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Unabsorb Message (to you)",host.vore_selected.get_messages("uamo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"uamo")
host.vore_selected.set_messages(new_message,"uamo", limit = MAX_MESSAGE_LEN / 4)
if("smo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",host.vore_selected.get_messages("smo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",host.vore_selected.get_messages("smo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"smo")
host.vore_selected.set_messages(new_message,"smo", limit = MAX_MESSAGE_LEN / 4)
if("smi")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",host.vore_selected.get_messages("smi"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",host.vore_selected.get_messages("smi"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"smi")
host.vore_selected.set_messages(new_message,"smi", limit = MAX_MESSAGE_LEN / 4)
if("asmo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when absorbed prey struggles. Write them in 3rd person ('X's Y bulges'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (outside)",host.vore_selected.get_messages("asmo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to those nearby when absorbed prey struggles. Write them in 3rd person ('X's Y bulges'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Absorbed Struggle Message (outside)",host.vore_selected.get_messages("asmo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"asmo")
host.vore_selected.set_messages(new_message,"asmo", limit = MAX_MESSAGE_LEN / 4)
if("asmi")
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Struggle Message (inside)",host.vore_selected.get_messages("asmi"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type. %count will not work for this type, and %countprey will only count absorbed victims."+help,"Absorbed Struggle Message (inside)",host.vore_selected.get_messages("asmi"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"asmi")
host.vore_selected.set_messages(new_message,"asmi", limit = MAX_MESSAGE_LEN / 4)
if("escap")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they try to escape from within you. Write them in 2nd person ('you start to X')."+help,"Escape Attempt Message (to prey)",host.vore_selected.get_messages("escap"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they try to escape from within you. Write them in 2nd person ('you start to X')."+help,"Escape Attempt Message (to prey)",host.vore_selected.get_messages("escap"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escap")
host.vore_selected.set_messages(new_message,"escap", limit = MAX_MESSAGE_LEN / 4)
if("escao")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey tries to escape from within you. Write them in 2nd person ('X ... from your Y')."+help,"Escape Attempt Message (to you)",host.vore_selected.get_messages("escao"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey tries to escape from within you. Write them in 2nd person ('X ... from your Y')."+help,"Escape Attempt Message (to you)",host.vore_selected.get_messages("escao"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escao")
host.vore_selected.set_messages(new_message,"escao", limit = MAX_MESSAGE_LEN / 4)
if("escp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they escape from within you. Write them in 2nd person ('you climb out of Y)."+help,"Escape Message (to prey)",host.vore_selected.get_messages("escp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they escape from within you. Write them in 2nd person ('you climb out of Y)."+help,"Escape Message (to prey)",host.vore_selected.get_messages("escp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escp")
host.vore_selected.set_messages(new_message,"escp", limit = MAX_MESSAGE_LEN / 4)
if("esco")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey escapes from within you. Write them in 2nd person ('X ... from your Y')."+help,"Escape Message (to you)",host.vore_selected.get_messages("esco"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey escapes from within you. Write them in 2nd person ('X ... from your Y')."+help,"Escape Message (to you)",host.vore_selected.get_messages("esco"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"esco")
host.vore_selected.set_messages(new_message,"esco", limit = MAX_MESSAGE_LEN / 4)
if("escout")
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when prey escapes from within you. Write them in 3rd person ('X climbs out of Z's Y')."+help,"Escape Message (outside)",host.vore_selected.get_messages("escout"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when prey escapes from within you. Write them in 3rd person ('X climbs out of Z's Y')."+help,"Escape Message (outside)",host.vore_selected.get_messages("escout"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escout")
host.vore_selected.set_messages(new_message,"escout", limit = MAX_MESSAGE_LEN / 4)
if("escip")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they manage to eject an item from within you. Write them in 2nd person ('you manage to O'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (to prey)",host.vore_selected.get_messages("escip"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they manage to eject an item from within you. Write them in 2nd person ('you manage to O'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (to prey)",host.vore_selected.get_messages("escip"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escip")
host.vore_selected.set_messages(new_message,"escip", limit = MAX_MESSAGE_LEN / 4)
if("escio")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey manages to eject an item from within you. Write them in 2nd person ('O slips from Y'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (to you)",host.vore_selected.get_messages("escio"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey manages to eject an item from within you. Write them in 2nd person ('O slips from Y'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (to you)",host.vore_selected.get_messages("escio"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escio")
host.vore_selected.set_messages(new_message,"escio", limit = MAX_MESSAGE_LEN / 4)
if("esciout")
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when prey manages to eject an item from within you. Write them in 3rd person ('O from Y'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (outside)",host.vore_selected.get_messages("esciout"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when prey manages to eject an item from within you. Write them in 3rd person ('O from Y'). Use %item to refer to the ejected item in this type."+help,"Escape Item Message (outside)",host.vore_selected.get_messages("esciout"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"esciout")
host.vore_selected.set_messages(new_message,"esciout", limit = MAX_MESSAGE_LEN / 4)
if("escfp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they fail to escape from within you. Write them in 2nd person ('you failed to Y')."+help,"Escape Fail Message (to prey)",host.vore_selected.get_messages("escfp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they fail to escape from within you. Write them in 2nd person ('you failed to Y')."+help,"Escape Fail Message (to prey)",host.vore_selected.get_messages("escfp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escfp")
host.vore_selected.set_messages(new_message,"escfp", limit = MAX_MESSAGE_LEN / 4)
if("escfo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey fails to escape from within you. Write them in 2nd person ('X failed ... your Y')."+help,"Escape Fail Message (to you)",host.vore_selected.get_messages("escfo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey fails to escape from within you. Write them in 2nd person ('X failed ... your Y')."+help,"Escape Fail Message (to you)",host.vore_selected.get_messages("escfo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"escfo")
host.vore_selected.set_messages(new_message,"escfo", limit = MAX_MESSAGE_LEN / 4)
if("aescap")
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they try to escape from within you. Write them in 2nd person ('you start to X')."+help,"Absorbed Escape Attempt Message (to prey)",host.vore_selected.get_messages("aescap"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they try to escape from within you. Write them in 2nd person ('you start to X')."+help,"Absorbed Escape Attempt Message (to prey)",host.vore_selected.get_messages("aescap"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"aescap")
host.vore_selected.set_messages(new_message,"aescap", limit = MAX_MESSAGE_LEN / 4)
if("aescao")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey tries to escape from within you. Write them in 2nd person ('X ... from your Y')."+help,"Absorbed Escape Attempt Message (to you)",host.vore_selected.get_messages("aescao"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey tries to escape from within you. Write them in 2nd person ('X ... from your Y')."+help,"Absorbed Escape Attempt Message (to you)",host.vore_selected.get_messages("aescao"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"aescao")
host.vore_selected.set_messages(new_message,"aescao", limit = MAX_MESSAGE_LEN / 4)
if("aescp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they escape from within you. Write them in 2nd person ('you escape from Y')."+help,"Absorbed Escape Message (to prey)",host.vore_selected.get_messages("aescp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they escape from within you. Write them in 2nd person ('you escape from Y')."+help,"Absorbed Escape Message (to prey)",host.vore_selected.get_messages("aescp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"aescp")
host.vore_selected.set_messages(new_message,"aescp", limit = MAX_MESSAGE_LEN / 4)
if("aesco")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey escapes from within you. Write them in 2nd person ('X ... from your Y')."+help,"Absorbed Escape Message (to you)",host.vore_selected.get_messages("aesco"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey escapes from within you. Write them in 2nd person ('X ... from your Y')."+help,"Absorbed Escape Message (to you)",host.vore_selected.get_messages("aesco"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"aesco")
host.vore_selected.set_messages(new_message,"aesco", limit = MAX_MESSAGE_LEN / 4)
if("aescout")
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when absorbed prey escapes from within you. Write them in 3rd person ('X escapes from Z's Y')."+help,"Absorbed Escape Message (outside)",host.vore_selected.get_messages("aescout"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to those around you when absorbed prey escapes from within you. Write them in 3rd person ('X escapes from Z's Y')."+help,"Absorbed Escape Message (outside)",host.vore_selected.get_messages("aescout"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"aescout")
host.vore_selected.set_messages(new_message,"aescout", limit = MAX_MESSAGE_LEN / 4)
if("aescfp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they fail to escape from within you. Write them in 2nd person ('you failed to Y')."+help,"Absorbed Escape Fail Message (to prey)",host.vore_selected.get_messages("aescfp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to absorbed prey when they fail to escape from within you. Write them in 2nd person ('you failed to Y')."+help,"Absorbed Escape Fail Message (to prey)",host.vore_selected.get_messages("aescfp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"aescfp")
host.vore_selected.set_messages(new_message,"aescfp", limit = MAX_MESSAGE_LEN / 4)
if("aescfo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey fails to escape from within you. Write them in 2nd person ('X failed ... your Y')."+help,"Absorbed Escape Fail Message (to you)",host.vore_selected.get_messages("aescfo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when absorbed prey fails to escape from within you. Write them in 2nd person ('X failed ... your Y')."+help,"Absorbed Escape Fail Message (to you)",host.vore_selected.get_messages("aescfo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"aescfo")
host.vore_selected.set_messages(new_message,"aescfo", limit = MAX_MESSAGE_LEN / 4)
if("trnspp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they are automatically transferred into your primary destination. Write them in 2nd person ('you slide into Y'). Use %dest to refer to the target location in this type."+help,"Primary Transfer Message (to prey)",host.vore_selected.get_messages("trnspp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they are automatically transferred into your primary destination. Write them in 2nd person ('you slide into Y'). Use %dest to refer to the target location in this type."+help,"Primary Transfer Message (to prey)",host.vore_selected.get_messages("trnspp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"trnspp")
host.vore_selected.set_messages(new_message,"trnspp", limit = MAX_MESSAGE_LEN / 4)
if("trnspo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey is automatically transferred into your primary destination. Write them in 2nd person ('X slid into your Y'). Use %dest to refer to the target location in this type."+help,"Primary Transfer Message (to you)",host.vore_selected.get_messages("trnspo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey is automatically transferred into your primary destination. Write them in 2nd person ('X slid into your Y'). Use %dest to refer to the target location in this type."+help,"Primary Transfer Message (to you)",host.vore_selected.get_messages("trnspo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"trnspo")
host.vore_selected.set_messages(new_message,"trnspo", limit = MAX_MESSAGE_LEN / 4)
if("trnssp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they are automatically transferred into your secondary destination. Write them in 2nd person ('you slide into Y'). Use %dest to refer to the target location in this type."+help,"Secondary Transfer Message (to prey)",host.vore_selected.get_messages("trnssp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they are automatically transferred into your secondary destination. Write them in 2nd person ('you slide into Y'). Use %dest to refer to the target location in this type."+help,"Secondary Transfer Message (to prey)",host.vore_selected.get_messages("trnssp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"trnssp")
host.vore_selected.set_messages(new_message,"trnssp", limit = MAX_MESSAGE_LEN / 4)
if("trnsso")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey is automatically transferred into your primary destination. Write them in 2nd person ('X slid into your Y'). Use %dest to refer to the target location in this type."+help,"Secondary Transfer Message (to you)",host.vore_selected.get_messages("trnsso"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey is automatically transferred into your primary destination. Write them in 2nd person ('X slid into your Y'). Use %dest to refer to the target location in this type."+help,"Secondary Transfer Message (to you)",host.vore_selected.get_messages("trnsso"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"trnsso")
host.vore_selected.set_messages(new_message,"trnsso", limit = MAX_MESSAGE_LEN / 4)
if("stmodp")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they trigger the interaction digest chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to prey)",host.vore_selected.get_messages("stmodp"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they trigger the interaction digest chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to prey)",host.vore_selected.get_messages("stmodp"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"stmodp")
host.vore_selected.set_messages(new_message,"stmodp", limit = MAX_MESSAGE_LEN / 4)
if("stmodo")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey triggers the interaction digest chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to you)",host.vore_selected.get_messages("stmodo"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey triggers the interaction digest chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to you)",host.vore_selected.get_messages("stmodo"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"stmodo")
host.vore_selected.set_messages(new_message,"stmodo", limit = MAX_MESSAGE_LEN / 4)
if("stmoap")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they trigger the interaction absorb chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to prey)",host.vore_selected.get_messages("stmoap"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey when they trigger the interaction absorb chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to prey)",host.vore_selected.get_messages("stmoap"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"stmoap")
host.vore_selected.set_messages(new_message,"stmoap", limit = MAX_MESSAGE_LEN / 4)
if("stmoao")
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey triggers the interaction absorb chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to you)",host.vore_selected.get_messages("stmoao"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to you when prey triggers the interaction absorb chance. Write them in 2nd person ('you feel X')."+help,"Stomach Mode Digest Message (to you)",host.vore_selected.get_messages("stmoao"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"stmoao")
host.vore_selected.set_messages(new_message,"stmoao", limit = MAX_MESSAGE_LEN / 4)
if("em")
var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"em")
host.vore_selected.set_messages(new_message,"em", limit = MAX_MESSAGE_LEN / 2)
if("ema")
var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has absorbed victims. Write them in 3rd person ('Their %belly is larger'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Examine Message (with absorbed victims)",host.vore_selected.get_messages("ema"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to people who examine you when this belly has absorbed victims. Write them in 3rd person ('Their %belly is larger'). %count will not work for this type, and %countprey will only count absorbed victims."+help,"Examine Message (with absorbed victims)",host.vore_selected.get_messages("ema"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"ema")
host.vore_selected.set_messages(new_message,"ema", limit = MAX_MESSAGE_LEN / 2)
if("en")
var/list/indices = list(1,2,3,4,5,6,7,8,9,10)
@@ -1285,59 +1302,59 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
host.weight_messages[index] = new_message
if("im_digest")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Digest mode. Write them in 2nd person ('%pred's %belly squishes down on you.')."+help,"Idle Message (Digest)",host.vore_selected.get_messages("im_digest"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Digest mode. Write them in 2nd person ('%pred's %belly squishes down on you.')."+help,"Idle Message (Digest)",host.vore_selected.get_messages("im_digest"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_digest")
host.vore_selected.set_messages(new_message,"im_digest", limit = MAX_MESSAGE_LEN / 4)
if("im_hold")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Hold mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Hold)",host.vore_selected.get_messages("im_hold"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Hold mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Hold)",host.vore_selected.get_messages("im_hold"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_hold")
host.vore_selected.set_messages(new_message,"im_hold", limit = MAX_MESSAGE_LEN / 4)
if("im_holdabsorbed")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are absorbed. Write them in 2nd person ('%pred's %belly squishes down on you.') %count will not work for this type, and %countprey will only count absorbed victims."+help,"Idle Message (Hold Absorbed)",host.vore_selected.get_messages("im_holdabsorbed"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are absorbed. Write them in 2nd person ('%pred's %belly squishes down on you.') %count will not work for this type, and %countprey will only count absorbed victims."+help,"Idle Message (Hold Absorbed)",host.vore_selected.get_messages("im_holdabsorbed"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_holdabsorbed")
host.vore_selected.set_messages(new_message,"im_holdabsorbed", limit = MAX_MESSAGE_LEN / 4)
if("im_absorb")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Absorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Absorb)",host.vore_selected.get_messages("im_absorb"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Absorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Absorb)",host.vore_selected.get_messages("im_absorb"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_absorb")
host.vore_selected.set_messages(new_message,"im_absorb", limit = MAX_MESSAGE_LEN / 4)
if("im_heal")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Heal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Heal)",host.vore_selected.get_messages("im_heal"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Heal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Heal)",host.vore_selected.get_messages("im_heal"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_heal")
host.vore_selected.set_messages(new_message,"im_heal", limit = MAX_MESSAGE_LEN / 4)
if("im_drain")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Drain mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Drain)",host.vore_selected.get_messages("im_drain"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Drain mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Drain)",host.vore_selected.get_messages("im_drain"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_drain")
host.vore_selected.set_messages(new_message,"im_drain", limit = MAX_MESSAGE_LEN / 4)
if("im_steal")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Size Steal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Size Steal)",host.vore_selected.get_messages("im_steal"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Size Steal mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Size Steal)",host.vore_selected.get_messages("im_steal"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_steal")
host.vore_selected.set_messages(new_message,"im_steal", limit = MAX_MESSAGE_LEN / 4)
if("im_egg")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Encase In Egg mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Encase In Egg)",host.vore_selected.get_messages("im_egg"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Encase In Egg mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Encase In Egg)",host.vore_selected.get_messages("im_egg"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_egg")
host.vore_selected.set_messages(new_message,"im_egg", limit = MAX_MESSAGE_LEN / 4)
if("im_shrink")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Shrink mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Shrink)",host.vore_selected.get_messages("im_shrink"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Shrink mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Shrink)",host.vore_selected.get_messages("im_shrink"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_shrink")
host.vore_selected.set_messages(new_message,"im_shrink", limit = MAX_MESSAGE_LEN / 4)
if("im_grow")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Grow mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Grow)",host.vore_selected.get_messages("im_grow"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Grow mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Grow)",host.vore_selected.get_messages("im_grow"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_grow")
host.vore_selected.set_messages(new_message,"im_grow", limit = MAX_MESSAGE_LEN / 4)
if("im_unabsorb")
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Unabsorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Unabsorb)",host.vore_selected.get_messages("im_unabsorb"), multiline = TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN,0,0,0)
var/new_message = sanitize(tgui_input_text(user,"These are sent to prey every [host.vore_selected.emote_time] seconds when you are on Unabsorb mode. Write them in 2nd person ('%pred's %belly squishes down on you.')"+help,"Idle Message (Unabsorb)",host.vore_selected.get_messages("im_unabsorb"), MAX_MESSAGE_LEN * 1.5, TRUE, prevent_enter = TRUE),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_message)
host.vore_selected.set_messages(new_message,"im_unabsorb")
host.vore_selected.set_messages(new_message,"im_unabsorb", limit = MAX_MESSAGE_LEN / 4)
if("reset")
var/confirm = tgui_alert(user,"This will delete any custom messages. Are you sure?","Confirmation",list("Cancel","DELETE"))
+1
View File
@@ -250,6 +250,7 @@
new_mob.allow_spontaneous_tf = allow_spontaneous_tf
new_mob.eating_privacy_global = eating_privacy_global
new_mob.text_warnings = text_warnings
new_mob.allow_mind_transfer = allow_mind_transfer
/////SUBTYPES/////
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 MiB

After

Width:  |  Height:  |  Size: 2.3 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 429 KiB

After

Width:  |  Height:  |  Size: 435 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

+1 -1
View File
@@ -50,7 +50,7 @@
"swc-loader": "^0.2.6",
"typescript": "^5.4.3",
"url-loader": "^4.1.1",
"webpack": "^5.91.0",
"webpack": "^5.94.0",
"webpack-bundle-analyzer": "^4.10.1",
"webpack-cli": "^5.1.4"
}
+1 -1
View File
@@ -4,7 +4,7 @@
"version": "5.0.1",
"type": "module",
"dependencies": {
"axios": "^1.6.8",
"axios": "^1.7.4",
"glob": "^7.2.3",
"source-map": "^0.7.4",
"stacktrace-parser": "^0.1.10",
@@ -137,12 +137,10 @@ export class DraggableControl extends Component {
} else if (this.inputRef) {
const input = this.inputRef.current;
input.value = internalValue;
// IE8: Dies when trying to focus a hidden element
// (Error: Object does not support this action)
try {
setTimeout(() => {
input.focus();
input.select();
} catch {}
}, 100);
}
};
}
@@ -174,12 +174,10 @@ export class NumberInput extends Component<Props, State> {
} else if (this.inputRef) {
const input = this.inputRef.current!;
input.value = String(internalValue);
// IE8: Dies when trying to focus a hidden element
// (Error: Object does not support this action)
try {
setTimeout(() => {
input.focus();
input.select();
} catch {}
}, 100);
}
};
}
@@ -17,7 +17,7 @@ export const SupplyConsoleMenu = (props) => {
tab[4] = <SupplyConsoleMenuHistoryExport />;
return (
<Section title="Menu" scrollable>
<Section title="Menu">
<Tabs>
<Tabs.Tab
icon="box"
@@ -11,7 +11,7 @@ export const SupplyConsoleMenuHistoryExport = (props) => {
}
return (
<Section>
<Section scrollable fill height="290px">
{receipts.map((r, ri) => (
<Section key={ri}>
<LabeledList>
@@ -16,7 +16,7 @@ export const SupplyConsoleMenuOrderList = (props) => {
}
return (
<Section>
<Section scrollable fill height="290px">
{mode === 'Requested' && order_auth ? (
<Button
mt={-1}
@@ -17,9 +17,9 @@ export const VoreBellySelectionAndCustomization = (props: {
const { our_bellies, selected, show_pictures, host_mobtype } = props;
return (
<Flex>
<Flex.Item shrink>
<Section title="My Bellies" scrollable>
<Flex height="83%">
<Flex.Item shrink basis="30%">
<Section title="My Bellies" scrollable fill>
<Tabs vertical>
<Tabs.Tab onClick={() => act('newbelly')}>
New
@@ -53,7 +53,7 @@ export const VoreBellySelectionAndCustomization = (props: {
</Flex.Item>
<Flex.Item grow>
{selected && (
<Section title={selected.belly_name}>
<Section title={selected.belly_name} fill scrollable>
<VoreSelectedBelly
belly={selected}
show_pictures={show_pictures}
@@ -1,5 +1,8 @@
import { useBackend } from '../../../backend';
import { Button, LabeledList } from '../../../components';
import { ReactNode, useEffect, useState } from 'react';
import { useBackend } from 'tgui/backend';
import { Box, Button, LabeledList } from 'tgui/components';
import { SYNTAX_COLOR, SYNTAX_REGEX } from '../constants';
import { selectedData } from '../types';
import { VoreSelectedBellyDescriptionsBellymode } from '../VoreSelectedBellyDescriptionTexts/VoreSelectedBellyDescriptionsBellymode';
import { VoreSelectedBellyDescriptionsEscape } from '../VoreSelectedBellyDescriptionTexts/VoreSelectedBellyDescriptionsEscape';
@@ -8,6 +11,39 @@ import { VoreSelectedBellyDescriptionsInteractionChance } from '../VoreSelectedB
import { VoreSelectedBellyDescriptionsStruggle } from '../VoreSelectedBellyDescriptionTexts/VoreSelectedBellyDescriptionsStruggle';
import { VoreSelectedBellyDescriptionsTransfer } from '../VoreSelectedBellyDescriptionTexts/VoreSelectedBellyDescriptionsTransfer';
const DescriptionSyntaxHighlighting = (props: { desc: string }) => {
const { desc } = props;
const [htmlDesc, setHtmlDesc] = useState<ReactNode[]>([]);
useEffect(() => {
if (!desc || desc.length === 0) {
return;
}
let elements: ReactNode[] = [];
const regexCopy = new RegExp(SYNTAX_REGEX);
let lastIndex = 0;
let result;
while ((result = regexCopy.exec(desc)) !== null) {
elements.push(<>{desc.substring(lastIndex, result.index)}</>);
elements.push(
<Box inline color={SYNTAX_COLOR[result[0]]}>
{result[0]}
</Box>,
);
lastIndex = result.index + result[0].length;
}
elements.push(<>{desc.substring(lastIndex)}</>);
setHtmlDesc(elements);
}, [desc]);
return <Box preserveWhitespace>{htmlDesc}</Box>;
};
export const VoreSelectedBellyDescriptions = (props: {
belly: selectedData;
}) => {
@@ -27,127 +63,128 @@ export const VoreSelectedBellyDescriptions = (props: {
} = belly;
return (
<LabeledList>
<LabeledList.Item
label="Description"
buttons={
<Button
onClick={() => act('set_attribute', { attribute: 'b_desc' })}
icon="pen"
/>
}
>
{desc}
</LabeledList.Item>
<LabeledList.Item
label="Description (Absorbed)"
buttons={
<Box>
<LabeledList>
<LabeledList.Item label="Vore Verb">
<Button onClick={() => act('set_attribute', { attribute: 'b_verb' })}>
{verb}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Release Verb">
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_absorbed_desc' })
act('set_attribute', { attribute: 'b_release_verb' })
}
icon="pen"
/>
}
>
{absorbed_desc}
</LabeledList.Item>
<LabeledList.Item label="Vore Verb">
<Button onClick={() => act('set_attribute', { attribute: 'b_verb' })}>
{verb}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Release Verb">
<Button
onClick={() => act('set_attribute', { attribute: 'b_release_verb' })}
>
{release_verb}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Show All Messages">
<Button
onClick={() =>
act('set_attribute', {
attribute: 'b_message_mode',
})
}
icon={message_mode ? 'toggle-on' : 'toggle-off'}
selected={message_mode}
>
{message_mode ? 'True' : 'False'}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Examine Messages">
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_msgs', msgtype: 'em' })
}
>
Examine Message (when full)
</Button>
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_msgs', msgtype: 'ema' })
}
>
Examine Message (with absorbed victims)
</Button>
</LabeledList.Item>
{message_mode || escapable ? (
<>
<VoreSelectedBellyDescriptionsStruggle />
<VoreSelectedBellyDescriptionsEscape
>
{release_verb}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Show All Messages">
<Button
onClick={() =>
act('set_attribute', {
attribute: 'b_message_mode',
})
}
icon={message_mode ? 'toggle-on' : 'toggle-off'}
selected={message_mode}
>
{message_mode ? 'True' : 'False'}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Examine Messages">
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_msgs', msgtype: 'em' })
}
>
Examine Message (when full)
</Button>
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_msgs', msgtype: 'ema' })
}
>
Examine Message (with absorbed victims)
</Button>
</LabeledList.Item>
{message_mode || escapable ? (
<>
<VoreSelectedBellyDescriptionsStruggle />
<VoreSelectedBellyDescriptionsEscape
message_mode={message_mode}
interacts={interacts}
/>
{(message_mode ||
!!interacts.transferlocation ||
!!interacts.transferlocation_secondary) && (
<VoreSelectedBellyDescriptionsTransfer
message_mode={message_mode}
interacts={interacts}
/>
)}
{(message_mode ||
interacts.digestchance > 0 ||
interacts.absorbchance > 0) && (
<VoreSelectedBellyDescriptionsInteractionChance
message_mode={message_mode}
interacts={interacts}
/>
)}
</>
) : (
''
)}
{(message_mode ||
mode === 'Digest' ||
mode === 'Selective' ||
mode === 'Absorb' ||
mode === 'Unabsorb') && (
<VoreSelectedBellyDescriptionsBellymode
message_mode={message_mode}
interacts={interacts}
mode={mode}
/>
{(message_mode ||
!!interacts.transferlocation ||
!!interacts.transferlocation_secondary) && (
<VoreSelectedBellyDescriptionsTransfer
message_mode={message_mode}
interacts={interacts}
/>
)}
{(message_mode ||
interacts.digestchance > 0 ||
interacts.absorbchance > 0) && (
<VoreSelectedBellyDescriptionsInteractionChance
message_mode={message_mode}
interacts={interacts}
/>
)}
</>
) : (
''
)}
{(message_mode ||
mode === 'Digest' ||
mode === 'Selective' ||
mode === 'Absorb' ||
mode === 'Unabsorb') && (
<VoreSelectedBellyDescriptionsBellymode
message_mode={message_mode}
mode={mode}
/>
)}
{emote_active ? (
<VoreSelectedBellyDescriptionsIdle
message_mode={message_mode}
mode={mode}
/>
) : (
''
)}
<LabeledList.Item label="Reset Messages">
)}
{emote_active ? (
<VoreSelectedBellyDescriptionsIdle
message_mode={message_mode}
mode={mode}
/>
) : (
''
)}
<LabeledList.Item label="Reset Messages">
<Button
color="red"
onClick={() =>
act('set_attribute', { attribute: 'b_msgs', msgtype: 'reset' })
}
>
Reset Messages
</Button>
</LabeledList.Item>
</LabeledList>
<Box color="label" mt={1} mb={1}>
Description:{' '}
<Button
color="red"
onClick={() =>
act('set_attribute', { attribute: 'b_msgs', msgtype: 'reset' })
}
icon="pencil"
onClick={() => act('set_attribute', { attribute: 'b_desc' })}
>
Reset Messages
Edit
</Button>
</LabeledList.Item>
</LabeledList>
</Box>
<DescriptionSyntaxHighlighting desc={desc} />
<Box color="label" mt={2} mb={1}>
Description (Absorbed):{' '}
<Button
icon="pencil"
onClick={() => act('set_attribute', { attribute: 'b_absorbed_desc' })}
>
Edit
</Button>
</Box>
<DescriptionSyntaxHighlighting desc={absorbed_desc} />
<Box mb={2} />
</Box>
);
};
@@ -1,7 +1,14 @@
import { classes } from 'common/react';
import { useBackend } from '../../../backend';
import { Box, Button, Flex, LabeledList, Section } from '../../../components';
import {
Box,
Button,
Flex,
LabeledList,
Section,
Stack,
} from '../../../components';
import { selectedData } from '../types';
export const VoreSelectedBellyVisuals = (props: { belly: selectedData }) => {
@@ -211,85 +218,104 @@ export const VoreSelectedBellyVisuals = (props: { belly: selectedData }) => {
</Flex>
</Section>
<Section title="Belly Fullscreens Preview and Coloring">
<Flex direction="row">
<Box
backgroundColor={belly_fullscreen_color}
width="20px"
height="20px"
/>
<Button
icon="eye-dropper"
onClick={() =>
act('set_attribute', {
attribute: 'b_fullscreen_color',
val: null,
})
}
>
Select Primary Color
</Button>
<Box
backgroundColor={belly_fullscreen_color_secondary}
width="20px"
height="20px"
/>
<Button
icon="eye-dropper"
onClick={() =>
act('set_attribute', {
attribute: 'b_fullscreen_color_secondary',
val: null,
})
}
>
Select Secondary Color
</Button>
<Box
backgroundColor={belly_fullscreen_color_trinary}
width="20px"
height="20px"
/>
<Button
icon="eye-dropper"
onClick={() =>
act('set_attribute', {
attribute: 'b_fullscreen_color_trinary',
val: null,
})
}
>
Select Trinary Color
</Button>
<LabeledList.Item label="Enable Coloration">
<Stack align="center">
<Stack.Item shrink>
<Box
backgroundColor={belly_fullscreen_color}
width="20px"
height="20px"
/>
</Stack.Item>
<Stack.Item grow>
<Button
fluid
icon="eye-dropper"
onClick={() =>
act('set_attribute', { attribute: 'b_colorization_enabled' })
}
icon={colorization_enabled ? 'toggle-on' : 'toggle-off'}
selected={colorization_enabled}
>
{colorization_enabled ? 'Yes' : 'No'}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Preview Belly">
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_preview_belly' })
act('set_attribute', {
attribute: 'b_fullscreen_color',
val: null,
})
}
>
Preview
Select Primary Color
</Button>
</LabeledList.Item>
<LabeledList.Item label="Clear Preview">
</Stack.Item>
<Stack.Item shrink>
<Box
backgroundColor={belly_fullscreen_color_secondary}
width="20px"
height="20px"
/>
</Stack.Item>
<Stack.Item grow>
<Button
fluid
icon="eye-dropper"
onClick={() =>
act('set_attribute', { attribute: 'b_clear_preview' })
act('set_attribute', {
attribute: 'b_fullscreen_color_secondary',
val: null,
})
}
>
Clear
Select Secondary Color
</Button>
</LabeledList.Item>
</Flex>
</Stack.Item>
<Stack.Item shrink>
<Box
backgroundColor={belly_fullscreen_color_trinary}
width="20px"
height="20px"
/>
</Stack.Item>
<Stack.Item grow>
<Button
fluid
icon="eye-dropper"
onClick={() =>
act('set_attribute', {
attribute: 'b_fullscreen_color_trinary',
val: null,
})
}
>
Select Trinary Color
</Button>
</Stack.Item>
</Stack>
<Box mt={1}>
<LabeledList>
<LabeledList.Item label="Enable Coloration">
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_colorization_enabled' })
}
icon={colorization_enabled ? 'toggle-on' : 'toggle-off'}
selected={colorization_enabled}
>
{colorization_enabled ? 'Yes' : 'No'}
</Button>
</LabeledList.Item>
<LabeledList.Item label="Preview Belly">
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_preview_belly' })
}
>
Preview
</Button>
</LabeledList.Item>
<LabeledList.Item label="Clear Preview">
<Button
onClick={() =>
act('set_attribute', { attribute: 'b_clear_preview' })
}
>
Clear
</Button>
</LabeledList.Item>
</LabeledList>
</Box>
</Section>
<Section>
<Section title="Vore FX">
@@ -307,7 +333,7 @@ export const VoreSelectedBellyVisuals = (props: { belly: selectedData }) => {
</LabeledList.Item>
</LabeledList>
</Section>
<Section title="Belly Fullscreens Styles" width="800px">
<Section title="Belly Fullscreens Styles">
Belly styles:
<Button
fluid
@@ -28,6 +28,7 @@ export const VoreUserPreferences = (props: {
can_be_drop_pred,
allow_inbelly_spawning,
allow_spontaneous_tf,
allow_mind_transfer,
step_mechanics_active,
pickup_mechanics_active,
noisy,
@@ -367,6 +368,21 @@ export const VoreUserPreferences = (props: {
disabled: 'Spontaneous TF Disabled',
},
},
mind_transfer: {
action: 'toggle_allow_mind_transfer',
test: allow_mind_transfer,
tooltip: {
main:
'This toggle is for mind transfer interactions' +
' as a victim, such as mind-binder or dominate pred/prey.',
enable: 'Click here to allow your mind being taken or swapped.',
disable: 'Click here to disallow having your mind taken or swapped.',
},
content: {
enabled: 'Mind Transfer Enabled',
disabled: 'Mind Transfer Disabled',
},
},
examine_nutrition: {
action: 'toggle_nutrition_ex',
test: nutrition_message_visible,
@@ -431,6 +447,15 @@ export const VoreUserPreferences = (props: {
Reload Prefs
</Button>
</Flex.Item>
<Flex.Item basis="49%" grow={1}>
<Button
fluid
icon="people-arrows"
onClick={() => act('loadprefsfromslot')}
>
Load Prefs From Slot
</Button>
</Flex.Item>
</Flex>
</Section>
</Box>
@@ -112,7 +112,10 @@ export const VoreUserPreferencesMechanical = (props: {
Selective Mode Preference
</Button>
</Flex.Item>
<Flex.Item basis="32%" grow={3}>
<Flex.Item basis="32%">
<VoreUserPreferenceItem spec={preferences.mind_transfer} />
</Flex.Item>
<Flex.Item basis="32%" grow={1}>
<VoreUserPreferenceItem spec={preferences.eating_privacy_global} />
</Flex.Item>
</Flex>
@@ -27,3 +27,10 @@ export const digestModeToPreyMode = {
Heal: 'being healed.',
'Encase In Egg': 'being encased in an egg.',
};
export const SYNTAX_REGEX = /%belly|%pred|%prey/g;
export const SYNTAX_COLOR = {
'%belly': 'average',
'%pred': 'bad',
'%prey': 'good',
};
@@ -37,7 +37,7 @@ export const VorePanel = (props) => {
return (
<Window width={890} height={660} theme="abstract">
<Window.Content scrollable>
<Window.Content>
{(data.unsaved_changes && (
<NoticeBox danger>
<Flex>
@@ -160,6 +160,7 @@ export type prefData = {
step_mechanics_active: BooleanLike;
pickup_mechanics_active: BooleanLike;
noisy: BooleanLike;
allow_mind_transfer: BooleanLike;
drop_vore: BooleanLike;
slip_vore: BooleanLike;
stumble_vore: BooleanLike;
@@ -198,6 +199,7 @@ export type localPrefs = {
remains: preferenceData;
pickuppref: preferenceData;
spontaneous_tf: preferenceData;
mind_transfer: preferenceData;
examine_nutrition: preferenceData;
examine_weight: preferenceData;
eating_privacy_global: preferenceData;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+27 -48
View File
@@ -1341,27 +1341,7 @@ __metadata:
languageName: node
linkType: hard
"@types/eslint-scope@npm:^3.7.3":
version: 3.7.7
resolution: "@types/eslint-scope@npm:3.7.7"
dependencies:
"@types/eslint": "npm:*"
"@types/estree": "npm:*"
checksum: 10c0/a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc
languageName: node
linkType: hard
"@types/eslint@npm:*":
version: 8.56.10
resolution: "@types/eslint@npm:8.56.10"
dependencies:
"@types/estree": "npm:*"
"@types/json-schema": "npm:*"
checksum: 10c0/674349d6c342c3864d70f4d5a9965f96fb253801532752c8c500ad6a1c2e8b219e01ccff5dc8791dcb58b5483012c495708bb9f3ff929f5c9322b3da126c15d3
languageName: node
linkType: hard
"@types/estree@npm:*, @types/estree@npm:^1.0.5":
"@types/estree@npm:^1.0.5":
version: 1.0.5
resolution: "@types/estree@npm:1.0.5"
checksum: 10c0/b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d
@@ -1423,7 +1403,7 @@ __metadata:
languageName: node
linkType: hard
"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9":
"@types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9":
version: 7.0.15
resolution: "@types/json-schema@npm:7.0.15"
checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db
@@ -1847,12 +1827,12 @@ __metadata:
languageName: node
linkType: hard
"acorn-import-assertions@npm:^1.9.0":
version: 1.9.0
resolution: "acorn-import-assertions@npm:1.9.0"
"acorn-import-attributes@npm:^1.9.5":
version: 1.9.5
resolution: "acorn-import-attributes@npm:1.9.5"
peerDependencies:
acorn: ^8
checksum: 10c0/3b4a194e128efdc9b86c2b1544f623aba4c1aa70d638f8ab7dc3971a5b4aa4c57bd62f99af6e5325bb5973c55863b4112e708a6f408bad7a138647ca72283afe
checksum: 10c0/5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d
languageName: node
linkType: hard
@@ -2226,14 +2206,14 @@ __metadata:
languageName: node
linkType: hard
"axios@npm:^1.6.8":
version: 1.6.8
resolution: "axios@npm:1.6.8"
"axios@npm:^1.7.4":
version: 1.7.6
resolution: "axios@npm:1.7.6"
dependencies:
follow-redirects: "npm:^1.15.6"
form-data: "npm:^4.0.0"
proxy-from-env: "npm:^1.1.0"
checksum: 10c0/0f22da6f490335479a89878bc7d5a1419484fbb437b564a80c34888fc36759ae4f56ea28d55a191695e5ed327f0bad56e7ff60fb6770c14d1be6501505d47ab9
checksum: 10c0/8b4be67056f8f3895ebadbfce0708e5aa9c537a5a68e2da03bec49d35695e29b57f14ce38f20f55bb19946bd89787a839a7c3afa9e58e1152696c208046f8417
languageName: node
linkType: hard
@@ -2362,7 +2342,7 @@ __metadata:
languageName: node
linkType: hard
"braces@npm:^3.0.2, braces@npm:~3.0.2":
"braces@npm:^3.0.3, braces@npm:~3.0.2":
version: 3.0.3
resolution: "braces@npm:3.0.3"
dependencies:
@@ -3214,13 +3194,13 @@ __metadata:
languageName: node
linkType: hard
"enhanced-resolve@npm:^5.16.0":
version: 5.16.1
resolution: "enhanced-resolve@npm:5.16.1"
"enhanced-resolve@npm:^5.17.1":
version: 5.17.1
resolution: "enhanced-resolve@npm:5.17.1"
dependencies:
graceful-fs: "npm:^4.2.4"
tapable: "npm:^2.2.0"
checksum: 10c0/57d52625b978f18b32351a03006699de1e3695ce27af936ab4f1f98d3a4c825b219b445910bb4eef398303bbb5f37d7e382f842513d0f3a32614b78f6fd07ab7
checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370
languageName: node
linkType: hard
@@ -6148,12 +6128,12 @@ __metadata:
linkType: hard
"micromatch@npm:^4.0.4":
version: 4.0.5
resolution: "micromatch@npm:4.0.5"
version: 4.0.8
resolution: "micromatch@npm:4.0.8"
dependencies:
braces: "npm:^3.0.2"
braces: "npm:^3.0.3"
picomatch: "npm:^2.3.1"
checksum: 10c0/3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff
checksum: 10c0/166fa6eb926b9553f32ef81f5f531d27b4ce7da60e5baf8c021d043b27a388fb95e46a8038d5045877881e673f8134122b59624d5cecbd16eb50a42e7a6b5ca8
languageName: node
linkType: hard
@@ -8260,7 +8240,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "tgui-dev-server@workspace:packages/tgui-dev-server"
dependencies:
axios: "npm:^1.6.8"
axios: "npm:^1.7.4"
glob: "npm:^7.2.3"
source-map: "npm:^0.7.4"
stacktrace-parser: "npm:^0.1.10"
@@ -8341,7 +8321,7 @@ __metadata:
swc-loader: "npm:^0.2.6"
typescript: "npm:^5.4.3"
url-loader: "npm:^4.1.1"
webpack: "npm:^5.91.0"
webpack: "npm:^5.94.0"
webpack-bundle-analyzer: "npm:^4.10.1"
webpack-cli: "npm:^5.1.4"
languageName: unknown
@@ -8925,20 +8905,19 @@ __metadata:
languageName: node
linkType: hard
"webpack@npm:^5.91.0":
version: 5.91.0
resolution: "webpack@npm:5.91.0"
"webpack@npm:^5.94.0":
version: 5.94.0
resolution: "webpack@npm:5.94.0"
dependencies:
"@types/eslint-scope": "npm:^3.7.3"
"@types/estree": "npm:^1.0.5"
"@webassemblyjs/ast": "npm:^1.12.1"
"@webassemblyjs/wasm-edit": "npm:^1.12.1"
"@webassemblyjs/wasm-parser": "npm:^1.12.1"
acorn: "npm:^8.7.1"
acorn-import-assertions: "npm:^1.9.0"
acorn-import-attributes: "npm:^1.9.5"
browserslist: "npm:^4.21.10"
chrome-trace-event: "npm:^1.0.2"
enhanced-resolve: "npm:^5.16.0"
enhanced-resolve: "npm:^5.17.1"
es-module-lexer: "npm:^1.2.1"
eslint-scope: "npm:5.1.1"
events: "npm:^3.2.0"
@@ -8958,7 +8937,7 @@ __metadata:
optional: true
bin:
webpack: bin/webpack.js
checksum: 10c0/74a3e0ea1c9a492accf035317f31769ffeaaab415811524b9f17bc7bf7012c5b6e1a9860df5ca6903f3ae2618727b801eb47d9351a2595dfffb25941d368b88c
checksum: 10c0/b4d1b751f634079bd177a89eef84d80fa5bb8d6fc15d72ab40fc2b9ca5167a79b56585e1a849e9e27e259803ee5c4365cb719e54af70a43c06358ec268ff4ebf
languageName: node
linkType: hard
+3 -1
View File
@@ -2942,6 +2942,7 @@
#include "code\modules\mob\living\carbon\human\logout.dm"
#include "code\modules\mob\living\carbon\human\MedicalSideEffects.dm"
#include "code\modules\mob\living\carbon\human\npcs.dm"
#include "code\modules\mob\living\carbon\human\phobias.dm"
#include "code\modules\mob\living\carbon\human\say.dm"
#include "code\modules\mob\living\carbon\human\stripping.dm"
#include "code\modules\mob\living\carbon\human\unarmed_attack.dm"
@@ -3286,6 +3287,7 @@
#include "code\modules\mob\living\simple_mob\subtypes\vore\jelly.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\lamia.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\leopardmander.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\meowl.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\mimic.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\oregrub.dm"
#include "code\modules\mob\living\simple_mob\subtypes\vore\otie.dm"
@@ -4338,6 +4340,6 @@
#include "maps\submaps\space_submaps\debrisfield\debrisfield.dm"
#include "maps\submaps\surface_submaps\wilderness\wilderness.dm"
#include "maps\submaps\surface_submaps\wilderness\wilderness_areas.dm"
#include "maps\tether\tether.dm"
#include "maps\stellar_delight\stellar_delight.dm"
#include "maps\~map_system\maps.dm"
// END_INCLUDE