mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-20 18:47:53 +01:00
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:
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"])")
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user