diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 627934c6f35..ebde3b5eae8 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -54,7 +54,6 @@
var/tmp/mob/living/owner // The mob whose belly this is.
var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human)
- var/tmp/tf_mode = DM_TRANSFORM_REPLICA // Current transformation mode.
var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a world.time
var/tmp/recent_sound = FALSE // Prevent audio spam
diff --git a/code/modules/vore/eating/bellymodes_datum_vr.dm b/code/modules/vore/eating/bellymodes_datum_vr.dm
index 591d106db44..213bde706ab 100644
--- a/code/modules/vore/eating/bellymodes_datum_vr.dm
+++ b/code/modules/vore/eating/bellymodes_datum_vr.dm
@@ -4,8 +4,8 @@ GLOBAL_LIST_INIT(digest_modes, list())
var/id = DM_HOLD
var/noise_chance = 0
-/datum/digest_mode/process_mob(obj/belly/B, mob/living/L)
- return
+/datum/digest_mode/proc/process_mob(obj/belly/B, mob/living/L)
+ return null
/datum/digest_mode/digest
id = DM_DIGEST
@@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/digest/process_mob(obj/belly/B, mob/living/L)
//Pref protection!
if(!L.digestable || L.absorbed)
- return
+ return null
//Person just died in guts!
if(L.stat == DEAD)
@@ -24,16 +24,15 @@ GLOBAL_LIST_INIT(digest_modes, list())
else
SEND_SOUND(L, sound(get_sfx("fancy_death_prey")))
B.handle_digestion_death(L)
- to_update = TRUE
if(!B.fancy_vore)
- return sound(get_sfx("classic_death_sounds"))
- return sound(get_sfx("fancy_death_pred"))
+ return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("classic_death_sounds")))
+ return list("to_update" = TRUE, "soundToPlay" = sound(get_sfx("fancy_death_pred")))
// Deal digestion damage (and feed the pred)
var/old_brute = L.getBruteLoss()
var/old_burn = L.getFireLoss()
- L.adjustBruteLoss(digest_brute)
- L.adjustFireLoss(digest_burn)
+ L.adjustBruteLoss(B.digest_brute)
+ L.adjustFireLoss(B.digest_burn)
var/actual_brute = L.getBruteLoss() - old_brute
var/actual_burn = L.getFireLoss() - old_burn
var/damage_gain = actual_brute + actual_burn
@@ -44,9 +43,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
var/mob/living/silicon/robot/R = B.owner
R.cell.charge += 25 * damage_gain
if(offset) // If any different than default weight, multiply the % of offset.
- B.owner.adjust_nutrition(offset*((nutrition_percent / 100) * 4.5 * (damage_gain) / difference)) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved.
+ B.owner.adjust_nutrition(offset*((B.nutrition_percent / 100) * 4.5 * (damage_gain) / difference)) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved.
else
- B.owner.adjust_nutrition((nutrition_percent / 100) * 4.5 * (damage_gain) / difference)
+ B.owner.adjust_nutrition((B.nutrition_percent / 100) * 4.5 * (damage_gain) / difference)
/datum/digest_mode/absorb
id = DM_ABSORB
@@ -54,12 +53,11 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/absorb/process_mob(obj/belly/B, mob/living/L)
if(!L.absorbable || L.absorbed)
- continue
- digestion_noise_chance = 10
- steal_nutrition(L)
+ return null
+ B.steal_nutrition(L)
if(L.nutrition < 100)
- absorb_living(L)
- to_update = TRUE
+ B.absorb_living(L)
+ return list("to_update" = TRUE)
/datum/digest_mode/unabsorb
id = DM_UNABSORB
@@ -70,14 +68,14 @@ GLOBAL_LIST_INIT(digest_modes, list())
to_chat(L, "You suddenly feel solid again.")
to_chat(B.owner,"You feel like a part of you is missing.")
B.owner.adjust_nutrition(-100)
- to_update = TRUE
+ return list("to_update" = TRUE)
/datum/digest_mode/drain
id = DM_DRAIN
noise_chance = 10
/datum/digest_mode/drain/process_mob(obj/belly/B, mob/living/L)
- steal_nutrition(L)
+ B.steal_nutrition(L)
/datum/digest_mode/drain/shrink
id = DM_SHRINK
@@ -110,7 +108,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/heal/process_mob(obj/belly/B, mob/living/L)
if(L.stat == DEAD)
- continue // Can't heal the dead with healbelly
+ return null // Can't heal the dead with healbelly
if(B.owner.nutrition > 90 && (L.health < L.maxHealth))
L.adjustBruteLoss(-2.5)
L.adjustFireLoss(-2.5)
@@ -139,40 +137,40 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/transform/process_mob(obj/belly/B, mob/living/carbon/human/H)
if(!istype(H) || H.stat == DEAD)
- return
+ return null
if(stabilize_nutrition)
if(B.owner.nutrition > 400 && H.nutrition < 400)
B.owner.adjust_nutrition(-2)
H.adjust_nutrition(1.5)
if(changes_eyes && B.check_eyes(H))
B.change_eyes(H, 1)
- return
+ return null
if(changes_hair_solo && B.check_hair(H))
B.change_hair(H)
- return
+ return null
if(changes_hairandskin && (B.check_hair(H) || B.check_skin(H)))
B.change_hair(H)
B.change_skin(H, 1)
- return
+ return null
if(changes_species)
if(changes_ears_tail_wing_nocolor && (B.check_ears(H) || B.check_tail_nocolor(H) || B.check_wing_nocolor(H) || B.check_species(H)))
B.change_ears(H)
B.change_tail_nocolor(H)
B.change_wing_nocolor(H)
B.change_species(H, 1, 1) // ,1) preserves coloring
- return
+ return null
if(changes_ears_tail_wing_color && (B.check_ears(H) || B.check_tail(H) || B.check_wing(H) || B.check_species(H)))
B.change_ears(H)
B.change_tail(H)
B.change_wing(H)
B.change_species(H, 1, 2) // ,2) does not preserve coloring.
- return
+ return null
if(changes_gender && B.check_gender(H, changes_gender_to))
B.change_gender(H, changes_gender_to, 1)
- return
+ return null
if(eggs && (!H.absorbed))
B.put_in_egg(H, 1)
- return
+ return null
// Regular TF Modes
/datum/digest_mode/transform/hairandeyes
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 9c2021fac2b..d11af093768 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -16,6 +16,7 @@
prey_loop()
/////////////////////////// Sound Selections ///////////////////////////
+ var/digestion_noise_chance = 0
var/sound/prey_digest
var/sound/pred_digest
if(!fancy_vore)
@@ -30,19 +31,73 @@
if(!length(touchable_atoms))
return
- var/list/touchable_mobs = list()
+ var/list/touchable_mobs = null
+
+ var/list/hta_returns = handle_touchable_atoms(touchable_atoms)
+ if(islist(hta_returns))
+ if(hta_returns["digestion_noise_chance"])
+ digestion_noise_chance = hta_returns["digestion_noise_chance"]
+ if(hta_returns["touchable_mobs"])
+ touchable_mobs = hta_returns["touchable_mobs"]
+ if(hta_returns["to_update"])
+ to_update = hta_returns["to_update"]
+
+ if(!islist(touchable_mobs))
+ return
///////////////////// Early Non-Mode Handling /////////////////////
- if(contents.len && next_emote <= world.time)
+ var/list/EL = emote_lists[digest_mode]
+ if(LAZYLEN(EL) && touchable_mobs && next_emote <= world.time)
next_emote = world.time + emote_time
- var/list/EL = emote_lists[digest_mode]
- if(LAZYLEN(EL))
- for(var/mob/living/M in contents)
- if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people
- to_chat(M, "[pick(EL)]")
+ for(var/mob/living/M in contents)
+ if(digest_mode == DM_DIGEST && !M.digestable)
+ continue // don't give digesty messages to indigestible people
+ to_chat(M, "[pick(EL)]")
+ var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
+ if(!DM)
+ log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
+ return FALSE
+
+ if(!digestion_noise_chance)
+ digestion_noise_chance = DM.noise_chance
+
+ for(var/target in touchable_mobs)
+ var/mob/living/L = target
+ if(!istype(L))
+ continue
+ var/list/returns = DM.process_mob(src, target)
+ if(istype(returns) && returns["to_update"])
+ to_update = TRUE
+ if(istype(returns) && returns["soundToPlay"] && !play_sound)
+ play_sound = returns["soundToPlay"]
+
+/////////////////////////// Make any noise ///////////////////////////
+ if(digestion_noise_chance && prob(digestion_noise_chance))
+ for(var/mob/M in contents)
+ if(M && M.is_preference_enabled(/datum/client_preference/digestion_noises))
+ SEND_SOUND(M, prey_digest)
+ play_sound = pred_digest
+
+ if(play_sound)
+ for(var/mob/M in hearers(VORE_SOUND_RANGE, owner)) //so we don't fill the whole room with the sound effect
+ if(!M.is_preference_enabled(/datum/client_preference/digestion_noises))
+ continue
+ if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
+ if(fancy_vore)
+ M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ else
+ M.playsound_local(owner.loc, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
+ //these are all external sound triggers now, so it's ok.
+
+ if(to_update)
+ updateVRPanels()
+
+/obj/belly/proc/handle_touchable_atoms(list/touchable_atoms)
var/did_an_item = FALSE // Only do one item per cycle.
+ var/to_update = FALSE
var/digestion_noise_chance = 0
+ var/list/touchable_mobs = list()
for(var/A in touchable_atoms)
//Handle stray items
@@ -93,130 +148,7 @@
else if(istype(A, /obj/effect/decal/cleanable))
qdel(A)
- var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
- if(!DM)
- log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
- return FALSE
-
- if(!digestion_noise_chance)
- digestion_noise_chance = DM.noise_chance
-
- if(digest_mode == DM_TRANSFORM)
- process_tf(tf_mode, touchable_mobs)
-
- for(var/target in touchable_mobs)
- var/mob/living/L = target
- if(!istype(L))
- continue
- var/sound/soundToPlay = DM.process(src, target)
- if(soundToPlay && !play_sound)
- play_sound = soundToPlay
- //switch(digest_mode)
- // if(DM_DIGEST)
- // digestion_noise_chance = 50
- // //Pref protection!
- // if(!L.digestable || L.absorbed)
- // continue
-
- // //Person just died in guts!
- // if(L.stat == DEAD)
- // play_sound = pred_death
- // if(L.is_preference_enabled(/datum/client_preference/digestion_noises))
- // SEND_SOUND(L, prey_death)
- // handle_digestion_death(L)
- // to_update = TRUE
- // continue
-
- // // Deal digestion damage (and feed the pred)
- // var/old_brute = L.getBruteLoss()
- // var/old_burn = L.getFireLoss()
- // L.adjustBruteLoss(digest_brute)
- // L.adjustFireLoss(digest_burn)
- // var/actual_brute = L.getBruteLoss() - old_brute
- // var/actual_burn = L.getFireLoss() - old_burn
- // var/damage_gain = actual_brute + actual_burn
-
- // var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
- // var/difference = owner.size_multiplier / L.size_multiplier
- // if(isrobot(owner))
- // var/mob/living/silicon/robot/R = owner
- // R.cell.charge += 25 * damage_gain
- // if(offset) // If any different than default weight, multiply the % of offset.
- // owner.adjust_nutrition(offset*((nutrition_percent / 100) * 4.5 * (damage_gain) / difference)) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved.
- // else
- // owner.adjust_nutrition((nutrition_percent / 100) * 4.5 * (damage_gain) / difference)
- // if(DM_ABSORB)
- // if(!L.absorbable || L.absorbed)
- // continue
- // digestion_noise_chance = 10
- // steal_nutrition(L)
- // if(L.nutrition < 100)
- // absorb_living(L)
- // to_update = TRUE
- // if(DM_UNABSORB)
- // if(L.absorbed && owner.nutrition >= 100)
- // L.absorbed = FALSE
- // to_chat(L, "You suddenly feel solid again.")
- // to_chat(owner,"You feel like a part of you is missing.")
- // owner.adjust_nutrition(-100)
- // to_update = TRUE
- // if(DM_DRAIN)
- // digestion_noise_chance = 10
- // steal_nutrition(L)
- // if(DM_SHRINK)
- // digestion_noise_chance = 10
- // if(L.size_multiplier > shrink_grow_size)
- // L.resize(L.size_multiplier - 0.01) // Shrink by 1% per tick
- // steal_nutrition(L)
- // if(DM_GROW)
- // digestion_noise_chance = 10
- // if(L.size_multiplier < shrink_grow_size)
- // L.resize(L.size_multiplier - 0.01) // Grow by 1% per tick
- // if(DM_SIZE_STEAL)
- // digestion_noise_chance = 10
- // if(L.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small.
- // owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick.
- // L.resize(L.size_multiplier-0.01) //Shrink by 1% per tick
- // steal_nutrition(L)
- // if(DM_HEAL)
- // digestion_noise_chance = 50 //Wet heals! The secret is you can leave this on for gurgle noises for fun.
- // if(L.stat == DEAD)
- // continue // Can't heal the dead with healbelly
- // if(owner.nutrition > 90 && (L.health < L.maxHealth))
- // L.adjustBruteLoss(-2.5)
- // L.adjustFireLoss(-2.5)
- // L.adjustToxLoss(-5)
- // L.adjustOxyLoss(-5)
- // L.adjustCloneLoss(-1.25)
- // owner.adjust_nutrition(-2)
- // if(L.nutrition <= 400)
- // L.adjust_nutrition(1)
- // else if(owner.nutrition > 90 && (L.nutrition <= 400))
- // owner.adjust_nutrition(-1)
- // L.adjust_nutrition(1)
-
-/////////////////////////// Make any noise ///////////////////////////
- if(digestion_noise_chance && prob(digestion_noise_chance))
- for(var/mob/M in contents)
- if(M && M.is_preference_enabled(/datum/client_preference/digestion_noises))
- SEND_SOUND(M, prey_digest)
- play_sound = pred_digest
-
- if(play_sound)
- for(var/mob/M in hearers(VORE_SOUND_RANGE, owner)) //so we don't fill the whole room with the sound effect
- if(!M.is_preference_enabled(/datum/client_preference/digestion_noises))
- continue
- if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
- if(fancy_vore)
- M.playsound_local(owner.loc, play_sound, vol = 75, vary = 1, falloff = VORE_SOUND_FALLOFF)
- else
- M.playsound_local(owner.loc, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF)
- //these are all external sound triggers now, so it's ok.
-
- if(to_update)
- updateVRPanels()
-
- return
+ return list("to_update" = to_update, "touchable_mobs" = touchable_mobs, "digestion_noise_chance" = digestion_noise_chance)
/obj/belly/proc/prey_loop()
for(var/mob/living/M in contents)
diff --git a/code/modules/vore/eating/transforming_vr.dm b/code/modules/vore/eating/transforming_vr.dm
index 3e789204192..8f9eea2371c 100644
--- a/code/modules/vore/eating/transforming_vr.dm
+++ b/code/modules/vore/eating/transforming_vr.dm
@@ -206,7 +206,7 @@
if(!istype(M) || !istype(O))
return 0
- if(M.species != O.species || M.custom_species != O.custom_species)
+ if(M.species.name != O.species.name || M.custom_species != O.custom_species)
return 1
return 0
@@ -227,7 +227,7 @@
if(color_action == 1)
M.set_species(O.species.name,0,1,M)
else if(color_action == 2)
- M.set_species(O.species.name,0,1,O)
+ M.species = O.species
else
M.set_species(O.species.name)
M.custom_species = O.custom_species
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 02421f8298a..357345d2735 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -125,32 +125,30 @@
spanstyle = "color:purple;"
if(DM_SIZE_STEAL)
spanstyle = "color:purple;"
- if(DM_TRANSFORM)
- switch(B.tf_mode)
- if(DM_TRANSFORM_MALE)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_HAIR_AND_EYES)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_FEMALE)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_KEEP_GENDER)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_REPLICA)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_REPLICA_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_KEEP_GENDER_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_MALE_EGG)
- spanstyle = "color:purple;"
- if(DM_TRANSFORM_FEMALE_EGG)
- spanstyle = "color:purple;"
- if(DM_EGG)
- spanstyle = "color:purple;"
+ if(DM_TRANSFORM_MALE)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_HAIR_AND_EYES)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_FEMALE)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_KEEP_GENDER)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_REPLICA)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_REPLICA_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_KEEP_GENDER_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_MALE_EGG)
+ spanstyle = "color:purple;"
+ if(DM_TRANSFORM_FEMALE_EGG)
+ spanstyle = "color:purple;"
+ if(DM_EGG)
+ spanstyle = "color:purple;"
belly_list += " ([B.contents.len])"
@@ -203,7 +201,7 @@
//Digest Mode Button
var/mode = selected.digest_mode
- dat += "
Belly Mode: [mode == DM_TRANSFORM ? selected.tf_mode : mode]"
+ dat += "
Belly Mode: [mode]"
//Mode addons button
var/list/flag_list = list()
@@ -581,10 +579,11 @@
if(new_mode == DM_TRANSFORM) //Snowflek submenu
var/list/tf_list = selected.transform_modes
- var/new_tf_mode = input("Choose TF Mode (currently [selected.tf_mode])") as null|anything in tf_list
+ var/new_tf_mode = input("Choose TF Mode (currently [selected.digest_mode])") as null|anything in tf_list
if(!new_tf_mode)
return FALSE
- selected.tf_mode = new_tf_mode
+ selected.digest_mode = new_tf_mode
+ return
selected.digest_mode = new_mode
//selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change //Handled with item modes now
diff --git a/vorestation.dme b/vorestation.dme
index 0f2cb48d5df..65788808c07 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -3427,7 +3427,7 @@
#include "code\modules\vore\appearance\update_icons_vr.dm"
#include "code\modules\vore\eating\belly_dat_vr.dm"
#include "code\modules\vore\eating\belly_obj_vr.dm"
-#include "code\modules\vore\eating\bellymodes_tf_vr.dm"
+#include "code\modules\vore\eating\bellymodes_datum_vr.dm"
#include "code\modules\vore\eating\bellymodes_vr.dm"
#include "code\modules\vore\eating\contaminate_vr.dm"
#include "code\modules\vore\eating\digest_act_vr.dm"