Added Post-Drain belly modes (#15876)

* Added Post-Drain belly modes

Added "Drain Finishing Modes" that kick into effect once a drain belly has extracted all of the nutrition that it can out of a prey character.

These modes are currently:
Normal: Current behaviour, just stops when it runs out of nutrition to extract.
Sleep: Slowly increases the prey's tiredness until the fall asleep. Be warned that they won't be able to post or see posts when they fall asleep.
False Sleep: Slowly increases the prey's tiredness until just before they fall asleep, darkening their screen but NOT preventing them from posting and reading posts.
Weight Drain: You're done draining their nutrition? Well, time to start taking their weight directly and adding it to your own body. Is dependent on the prey's weight loss % chosen in character setup.

* Added a knockout process option

* I forgot eject all on the previous commit

* Update tgui.bundle.js
This commit is contained in:
SatinIsle
2024-03-31 19:03:47 +10:00
committed by GitHub
parent 5ff80dbdd8
commit 5f520271be
10 changed files with 91 additions and 9 deletions
@@ -1245,6 +1245,11 @@
Paralyse(10)
setHalLoss(species.total_health - 1)
if(tiredness) //tiredness for vore drain
tiredness = (tiredness - 1)
if(tiredness >= 100)
Sleeping(5)
if(paralysis || sleeping)
blinded = 1
set_stat(UNCONSCIOUS)
@@ -1429,6 +1434,21 @@
else
clear_fullscreen("brute")
//tiredness for drain vore
if(tiredness)
var/severity = 0
switch(tiredness)
if(10 to 20) severity = 1
if(20 to 30) severity = 2
if(30 to 45) severity = 3
if(45 to 60) severity = 4
if(60 to 75) severity = 5
if(75 to 90) severity = 6
if(90 to INFINITY) severity = 7
overlay_fullscreen("tired", /obj/screen/fullscreen/oxy, severity)
else
clear_fullscreen("tired")
if(healths)
if (chem_effects[CE_PAINKILLER] > 100)
healths.icon_state = "health_numb"
@@ -82,3 +82,4 @@
var/inventory_panel_type = /datum/inventory_panel
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
+12
View File
@@ -71,6 +71,8 @@
var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS, "Muffles" = DM_FLAG_THICKBELLY, "Affect Worn Items" = DM_FLAG_AFFECTWORN, "Jams Sensors" = DM_FLAG_JAMSENSORS, "Complete Absorb" = DM_FLAG_FORCEPSAY)
//Item related modes
var/tmp/static/list/item_digest_modes = list(IM_HOLD,IM_DIGEST_FOOD,IM_DIGEST)
//drain modes
var/tmp/static/list/drainmodes = list(DR_NORMAL,DR_SLEEP,DR_FAKE,DR_WEIGHT)
//List of slots that stripping handles strips
var/tmp/static/list/slots = list(slot_back,slot_handcuffed,slot_l_store,slot_r_store,slot_wear_mask,slot_l_hand,slot_r_hand,slot_wear_id,slot_glasses,slot_gloves,slot_head,slot_shoes,slot_belt,slot_wear_suit,slot_w_uniform,slot_s_store,slot_l_ear,slot_r_ear)
@@ -79,6 +81,7 @@
var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human)
var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
var/tmp/recent_sound = FALSE // Prevent audio spam
var/tmp/drainmode = DR_NORMAL // Simply drains the prey then does nothing.
// Don't forget to watch your commas at the end of each line if you change these.
var/list/struggle_messages_outside = list(
@@ -339,6 +342,7 @@
"belly_mob_mult",
"belly_item_mult",
"belly_overall_mult",
"drainmode",
)
if (save_digest_mode == 1)
@@ -525,6 +529,8 @@
for(var/atom/movable/AM as anything in contents)
if(isliving(AM))
var/mob/living/L = AM
if(L.stat)
L.SetSleeping(min(L.sleeping,20))
if(L.absorbed && !include_absorbed)
continue
count += release_specific_contents(AM, silent = TRUE)
@@ -610,6 +616,12 @@
absorbed_count++
Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
//Makes it so that if prey are heavily asleep, they will wake up shortly after release
if(isliving(M))
var/mob/living/ML = M
if(ML.stat)
ML.SetSleeping(min(ML.sleeping,20))
//Clean up our own business
if(!ishuman(owner))
owner.update_icons()
+14
View File
@@ -301,6 +301,20 @@
owner.adjust_nutrition((nutrition_percent / 100) * compensation * 4.5 * personal_nutrition_modifier * pred_digestion_efficiency)
/obj/belly/proc/steal_nutrition(mob/living/L)
if(L.nutrition <= 110)
if(drainmode == DR_SLEEP && istype(L,/mob/living/carbon/human)) //Slowly put prey to sleep
if(L.tiredness <= 105)
L.tiredness = (L.tiredness + 6)
if(L.tiredness <= 90 && L.tiredness >= 75)
to_chat(L, "<span class='warning'>You are about to fall unconscious!</span>")
to_chat(owner, "<span class='warning'>[L] is about to fall unconscious!</span>")
if(drainmode == DR_FAKE && istype(L,/mob/living/carbon/human)) //Slowly bring prey to the edge of sleep without crossing it
if(L.tiredness <= 93)
L.tiredness = (L.tiredness + 6)
if(drainmode == DR_WEIGHT && istype(L,/mob/living/carbon/human)) //Slowly drain your prey's weight and add it to your own
if(L.weight > 70)
L.weight -= (0.01 * L.weight_loss)
owner.weight += (0.01 * L.weight_loss) //intentionally dependant on the prey's weight loss ratio rather than the preds weight gain to keep them in pace with one another.
if(L.nutrition >= 100)
var/oldnutrition = (L.nutrition * 0.05)
L.nutrition = (L.nutrition * 0.95)
+1
View File
@@ -447,6 +447,7 @@
absorbed = FALSE //Make sure we're not absorbed
muffled = FALSE //Removes Muffling
forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave.
SetSleeping(0) //Wake up instantly if asleep
for(var/mob/living/simple_mob/SA in range(10))
LAZYSET(SA.prey_excludes, src, world.time)
log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "<a href='?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[B.owner.x];Y=[B.owner.y];Z=[B.owner.z]'>JMP</a>" : "null"])")
+21
View File
@@ -225,6 +225,7 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
"belly_mob_mult" = selected.belly_mob_mult,
"belly_item_mult" = selected.belly_item_mult,
"belly_overall_mult" = selected.belly_overall_mult,
"drainmode" = selected.drainmode,
)
@@ -823,6 +824,8 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
if(ourtarget.absorbable)
process_options += "Absorb"
process_options += "Knockout" //Can't think of any mechanical prefs that would restrict this. Even if they are already asleep, you may want to make it permanent.
if(process_options.len)
process_options += "Cancel"
else
@@ -878,6 +881,16 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
var/n = 0 - ourtarget.nutrition
ourtarget.adjust_nutrition(n)
b.absorb_living(ourtarget)
if("Knockout")
if(tgui_alert(ourtarget, "\The [usr] is attempting to instantly make you unconscious, you will be unable until ejected from the pred. Is this something you are okay with happening to you?","Instant Knockout", list("No", "Yes")) != "Yes")
to_chat(usr, "<span class= 'vwarning'>\The [ourtarget] declined your knockout attempt.</span>")
to_chat(ourtarget, "<span class= 'vwarning'>You declined the knockout attempt.</span>")
return
if(ourtarget.loc != b)
to_chat(usr, "<span class= 'vwarning'>\The [ourtarget] is no longer in \the [b].</span>")
return
ourtarget.AdjustSleeping(500000)
to_chat(ourtarget, "<span class= 'vwarning'>\The [usr] has put you to sleep, you will remain unconscious until ejected from the belly.</span>")
if("Cancel")
return
if("Health Check")
@@ -1502,6 +1515,14 @@ var/global/list/belly_colorable_only_fullscreens = list("a_synth_flesh_mono",
var/new_new_damage = CLAMP(new_damage, 0, 6)
host.vore_selected.digest_clone = new_new_damage
. = TRUE
if("b_drainmode")
var/list/menu_list = host.vore_selected.drainmodes.Copy()
var/new_drainmode = tgui_input_list(usr, "Choose Mode (currently [host.vore_selected.digest_mode])", "Mode Choice", menu_list)
if(!new_drainmode)
return FALSE
host.vore_selected.drainmode = new_drainmode
host.vore_selected.updateVRPanels()
if("b_emoteactive")
host.vore_selected.emote_active = !host.vore_selected.emote_active
. = TRUE