mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-10 18:22:39 +00:00
Merge pull request #7552 from ShadowLarkens/vore_refactor_mk2
Vore refactor V2
This commit is contained in:
@@ -203,6 +203,13 @@ var/global/list/string_slot_flags = list(
|
|||||||
var/datum/poster/P = new T
|
var/datum/poster/P = new T
|
||||||
NT_poster_designs += P
|
NT_poster_designs += P
|
||||||
|
|
||||||
|
// VOREStation Add - Vore Modes!
|
||||||
|
paths = typesof(/datum/digest_mode) - /datum/digest_mode/transform
|
||||||
|
for(var/T in paths)
|
||||||
|
var/datum/digest_mode/DM = new T
|
||||||
|
GLOB.digest_modes[DM.id] = DM
|
||||||
|
// VOREStation Add End
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/* // Uncomment to debug chemical reaction list.
|
/* // Uncomment to debug chemical reaction list.
|
||||||
|
|||||||
@@ -54,7 +54,6 @@
|
|||||||
|
|
||||||
var/tmp/mob/living/owner // The mob whose belly this is.
|
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/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/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/next_emote = 0 // When we're supposed to print our next emote, as a world.time
|
||||||
var/tmp/recent_sound = FALSE // Prevent audio spam
|
var/tmp/recent_sound = FALSE // Prevent audio spam
|
||||||
|
|||||||
254
code/modules/vore/eating/bellymodes_datum_vr.dm
Normal file
254
code/modules/vore/eating/bellymodes_datum_vr.dm
Normal file
@@ -0,0 +1,254 @@
|
|||||||
|
GLOBAL_LIST_INIT(digest_modes, list())
|
||||||
|
|
||||||
|
/datum/digest_mode
|
||||||
|
var/id = DM_HOLD
|
||||||
|
var/noise_chance = 0
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This proc has all the behavior for the given digestion mode.
|
||||||
|
* It returns either null, or an associative list in the following format:
|
||||||
|
* list("to_update" = TRUE/FALSE, "soundToPlay" = sound())
|
||||||
|
* where to_update is whether or not a updateVorePanel() call is necessary,
|
||||||
|
* and soundToPlay will play the given sound at the end of the process tick.
|
||||||
|
*/
|
||||||
|
/datum/digest_mode/proc/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
return null
|
||||||
|
|
||||||
|
/datum/digest_mode/digest
|
||||||
|
id = DM_DIGEST
|
||||||
|
noise_chance = 50
|
||||||
|
|
||||||
|
/datum/digest_mode/digest/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
//Pref protection!
|
||||||
|
if(!L.digestable || L.absorbed)
|
||||||
|
return null
|
||||||
|
|
||||||
|
//Person just died in guts!
|
||||||
|
if(L.stat == DEAD)
|
||||||
|
if(L.is_preference_enabled(/datum/client_preference/digestion_noises))
|
||||||
|
if(!B.fancy_vore)
|
||||||
|
SEND_SOUND(L, sound(get_sfx("classic_death_sounds")))
|
||||||
|
else
|
||||||
|
SEND_SOUND(L, sound(get_sfx("fancy_death_prey")))
|
||||||
|
B.handle_digestion_death(L)
|
||||||
|
if(!B.fancy_vore)
|
||||||
|
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(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
|
||||||
|
|
||||||
|
var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
|
||||||
|
var/difference = B.owner.size_multiplier / L.size_multiplier
|
||||||
|
if(isrobot(B.owner))
|
||||||
|
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*((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((B.nutrition_percent / 100) * 4.5 * (damage_gain) / difference)
|
||||||
|
|
||||||
|
/datum/digest_mode/absorb
|
||||||
|
id = DM_ABSORB
|
||||||
|
noise_chance = 10
|
||||||
|
|
||||||
|
/datum/digest_mode/absorb/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
if(!L.absorbable || L.absorbed)
|
||||||
|
return null
|
||||||
|
B.steal_nutrition(L)
|
||||||
|
if(L.nutrition < 100)
|
||||||
|
B.absorb_living(L)
|
||||||
|
return list("to_update" = TRUE)
|
||||||
|
|
||||||
|
/datum/digest_mode/unabsorb
|
||||||
|
id = DM_UNABSORB
|
||||||
|
|
||||||
|
/datum/digest_mode/unabsorb/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
if(L.absorbed && B.owner.nutrition >= 100)
|
||||||
|
L.absorbed = FALSE
|
||||||
|
to_chat(L, "<span class='notice'>You suddenly feel solid again.</span>")
|
||||||
|
to_chat(B.owner,"<span class='notice'>You feel like a part of you is missing.</span>")
|
||||||
|
B.owner.adjust_nutrition(-100)
|
||||||
|
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)
|
||||||
|
B.steal_nutrition(L)
|
||||||
|
|
||||||
|
/datum/digest_mode/drain/shrink
|
||||||
|
id = DM_SHRINK
|
||||||
|
|
||||||
|
/datum/digest_mode/drain/shrink/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
if(L.size_multiplier > B.shrink_grow_size)
|
||||||
|
L.resize(L.size_multiplier - 0.01) // Shrink by 1% per tick
|
||||||
|
. = ..()
|
||||||
|
|
||||||
|
/datum/digest_mode/grow
|
||||||
|
id = DM_GROW
|
||||||
|
noise_chance = 10
|
||||||
|
|
||||||
|
/datum/digest_mode/grow/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
if(L.size_multiplier < B.shrink_grow_size)
|
||||||
|
L.resize(L.size_multiplier + 0.01) // Shrink by 1% per tick
|
||||||
|
|
||||||
|
/datum/digest_mode/drain/sizesteal
|
||||||
|
id = DM_SIZE_STEAL
|
||||||
|
|
||||||
|
/datum/digest_mode/drain/sizesteal/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
if(L.size_multiplier > B.shrink_grow_size && B.owner.size_multiplier < 2) //Grow until either pred is large or prey is small.
|
||||||
|
B.owner.resize(B.owner.size_multiplier + 0.01) //Grow by 1% per tick.
|
||||||
|
L.resize(L.size_multiplier - 0.01) //Shrink by 1% per tick
|
||||||
|
. = ..()
|
||||||
|
|
||||||
|
/datum/digest_mode/heal
|
||||||
|
id = DM_HEAL
|
||||||
|
noise_chance = 50 //Wet heals! The secret is you can leave this on for gurgle noises for fun.
|
||||||
|
|
||||||
|
/datum/digest_mode/heal/process_mob(obj/belly/B, mob/living/L)
|
||||||
|
if(L.stat == DEAD)
|
||||||
|
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)
|
||||||
|
L.adjustToxLoss(-5)
|
||||||
|
L.adjustOxyLoss(-5)
|
||||||
|
L.adjustCloneLoss(-1.25)
|
||||||
|
B.owner.adjust_nutrition(-2)
|
||||||
|
if(L.nutrition <= 400)
|
||||||
|
L.adjust_nutrition(1)
|
||||||
|
else if(B.owner.nutrition > 90 && (L.nutrition <= 400))
|
||||||
|
B.owner.adjust_nutrition(-1)
|
||||||
|
L.adjust_nutrition(1)
|
||||||
|
|
||||||
|
// TRANSFORM MODES
|
||||||
|
/datum/digest_mode/transform
|
||||||
|
var/stabilize_nutrition = FALSE
|
||||||
|
var/changes_eyes = FALSE
|
||||||
|
var/changes_hair_solo = FALSE
|
||||||
|
var/changes_hairandskin = FALSE
|
||||||
|
var/changes_gender = FALSE
|
||||||
|
var/changes_gender_to = null
|
||||||
|
var/changes_species = FALSE
|
||||||
|
var/changes_ears_tail_wing_nocolor = FALSE
|
||||||
|
var/changes_ears_tail_wing_color = FALSE
|
||||||
|
var/eggs = FALSE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/process_mob(obj/belly/B, mob/living/carbon/human/H)
|
||||||
|
if(!istype(H) || H.stat == DEAD)
|
||||||
|
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 null
|
||||||
|
if(changes_hair_solo && B.check_hair(H))
|
||||||
|
B.change_hair(H)
|
||||||
|
return null
|
||||||
|
if(changes_hairandskin && (B.check_hair(H) || B.check_skin(H)))
|
||||||
|
B.change_hair(H)
|
||||||
|
B.change_skin(H, 1)
|
||||||
|
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 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 null
|
||||||
|
if(changes_gender && B.check_gender(H, changes_gender_to))
|
||||||
|
B.change_gender(H, changes_gender_to, 1)
|
||||||
|
return null
|
||||||
|
if(eggs && (!H.absorbed))
|
||||||
|
B.put_in_egg(H, 1)
|
||||||
|
return null
|
||||||
|
|
||||||
|
// Regular TF Modes
|
||||||
|
/datum/digest_mode/transform/hairandeyes
|
||||||
|
id = DM_TRANSFORM_HAIR_AND_EYES
|
||||||
|
stabilize_nutrition = TRUE
|
||||||
|
changes_eyes = TRUE
|
||||||
|
changes_hair_solo = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/gender
|
||||||
|
id = DM_TRANSFORM_FEMALE
|
||||||
|
changes_eyes = TRUE
|
||||||
|
changes_hairandskin = TRUE
|
||||||
|
changes_gender = TRUE
|
||||||
|
changes_gender_to = FEMALE
|
||||||
|
stabilize_nutrition = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/gender/male
|
||||||
|
id = DM_TRANSFORM_FEMALE
|
||||||
|
changes_gender_to = MALE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/keepgender
|
||||||
|
id = DM_TRANSFORM_KEEP_GENDER
|
||||||
|
changes_eyes = TRUE
|
||||||
|
changes_hairandskin = TRUE
|
||||||
|
stabilize_nutrition = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/speciesandtaur
|
||||||
|
id = DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR
|
||||||
|
changes_species = TRUE
|
||||||
|
changes_ears_tail_wing_nocolor = TRUE
|
||||||
|
stabilize_nutrition = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/replica
|
||||||
|
id = DM_TRANSFORM_REPLICA
|
||||||
|
changes_eyes = TRUE
|
||||||
|
changes_hairandskin = TRUE
|
||||||
|
changes_species = TRUE
|
||||||
|
changes_ears_tail_wing_color = TRUE
|
||||||
|
|
||||||
|
// E G G
|
||||||
|
/datum/digest_mode/transform/egg
|
||||||
|
id = DM_EGG
|
||||||
|
eggs = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/egg/gender
|
||||||
|
id = DM_TRANSFORM_FEMALE_EGG
|
||||||
|
changes_eyes = TRUE
|
||||||
|
changes_hairandskin = TRUE
|
||||||
|
changes_gender = TRUE
|
||||||
|
changes_gender_to = FEMALE
|
||||||
|
stabilize_nutrition = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/egg/gender/male
|
||||||
|
id = DM_TRANSFORM_MALE_EGG
|
||||||
|
changes_gender_to = MALE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/egg/nogender
|
||||||
|
id = DM_TRANSFORM_KEEP_GENDER_EGG
|
||||||
|
changes_eyes = TRUE
|
||||||
|
changes_hairandskin = TRUE
|
||||||
|
stabilize_nutrition = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/egg/speciesandtaur
|
||||||
|
id = DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG
|
||||||
|
changes_species = TRUE
|
||||||
|
changes_ears_tail_wing_nocolor = TRUE
|
||||||
|
stabilize_nutrition = TRUE
|
||||||
|
|
||||||
|
/datum/digest_mode/transform/egg/replica
|
||||||
|
id = DM_TRANSFORM_REPLICA_EGG
|
||||||
|
changes_eyes = TRUE
|
||||||
|
changes_hairandskin = TRUE
|
||||||
|
changes_species = TRUE
|
||||||
|
changes_ears_tail_wing_color = TRUE
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
/obj/belly/proc/process_tf(mode, list/touchable_mobs) //We pass mode so it's mega-ultra local.
|
|
||||||
/* May not be necessary... Transform only shows up in the panel for humans.
|
|
||||||
if(!ishuman(owner))
|
|
||||||
return //Need DNA and junk for this.
|
|
||||||
*/
|
|
||||||
|
|
||||||
//Cast here for reduced duplication
|
|
||||||
var/mob/living/carbon/human/O = owner
|
|
||||||
|
|
||||||
var/stabilize_nutrition = FALSE
|
|
||||||
var/changes_eyes = FALSE
|
|
||||||
var/changes_hair_solo = FALSE
|
|
||||||
var/changes_hairandskin = FALSE
|
|
||||||
var/changes_gender = FALSE
|
|
||||||
var/changes_gender_to = null
|
|
||||||
var/changes_species = FALSE
|
|
||||||
var/changes_ears_tail_wing_nocolor = FALSE
|
|
||||||
var/changes_ears_tail_wing_color = FALSE
|
|
||||||
var/eggs = FALSE
|
|
||||||
|
|
||||||
switch(mode)
|
|
||||||
if(DM_TRANSFORM_HAIR_AND_EYES)
|
|
||||||
stabilize_nutrition = TRUE
|
|
||||||
changes_eyes = TRUE
|
|
||||||
changes_hair_solo = TRUE
|
|
||||||
if(DM_TRANSFORM_MALE, DM_TRANSFORM_FEMALE, DM_TRANSFORM_MALE_EGG, DM_TRANSFORM_FEMALE_EGG)
|
|
||||||
changes_eyes = TRUE
|
|
||||||
changes_hairandskin = TRUE
|
|
||||||
changes_gender = TRUE
|
|
||||||
changes_gender_to = (mode == DM_TRANSFORM_MALE || mode == DM_TRANSFORM_MALE_EGG) ? MALE : FEMALE
|
|
||||||
stabilize_nutrition = TRUE
|
|
||||||
eggs = (mode == DM_TRANSFORM_MALE_EGG || mode == DM_TRANSFORM_FEMALE_EGG)
|
|
||||||
if(DM_TRANSFORM_KEEP_GENDER, DM_TRANSFORM_KEEP_GENDER_EGG)
|
|
||||||
changes_eyes = TRUE
|
|
||||||
changes_hairandskin = TRUE
|
|
||||||
stabilize_nutrition = TRUE
|
|
||||||
eggs = (mode == DM_TRANSFORM_KEEP_GENDER_EGG)
|
|
||||||
if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR, DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
|
|
||||||
changes_species = TRUE
|
|
||||||
changes_ears_tail_wing_nocolor = TRUE
|
|
||||||
stabilize_nutrition = TRUE
|
|
||||||
eggs = (mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
|
|
||||||
if(DM_TRANSFORM_REPLICA, DM_TRANSFORM_REPLICA_EGG)
|
|
||||||
changes_eyes = TRUE
|
|
||||||
changes_hairandskin = TRUE
|
|
||||||
changes_species = TRUE
|
|
||||||
changes_ears_tail_wing_color = TRUE
|
|
||||||
eggs = (mode == DM_TRANSFORM_REPLICA_EGG)
|
|
||||||
if(DM_EGG)
|
|
||||||
eggs = TRUE
|
|
||||||
|
|
||||||
/* This is designed to do *gradual* transformations.
|
|
||||||
* For each human in the TF belly per cycle, they can only have one "stage" of transformation applied to them.
|
|
||||||
* Some transformation modes have different amounts of stages than others and that's okay.
|
|
||||||
* All stages in order: Eyes, Hair & Skin, Ears & Tail & Wings & Species, Gender, Egg
|
|
||||||
*/
|
|
||||||
for(var/mob/living/carbon/human/H in touchable_mobs)
|
|
||||||
if(H.stat == DEAD)
|
|
||||||
continue
|
|
||||||
if(stabilize_nutrition)
|
|
||||||
if(O.nutrition > 400 && H.nutrition < 400)
|
|
||||||
O.adjust_nutrition(-2)
|
|
||||||
H.adjust_nutrition(1.5)
|
|
||||||
if(changes_eyes && check_eyes(H))
|
|
||||||
change_eyes(H, 1)
|
|
||||||
continue
|
|
||||||
if(changes_hair_solo && check_hair(H))
|
|
||||||
change_hair(H)
|
|
||||||
continue
|
|
||||||
if(changes_hairandskin && (check_hair(H) || check_skin(H)))
|
|
||||||
change_hair(H)
|
|
||||||
change_skin(H, 1)
|
|
||||||
continue
|
|
||||||
if(changes_species)
|
|
||||||
if(changes_ears_tail_wing_nocolor && (check_ears(H) || check_tail_nocolor(H) || check_wing_nocolor(H) || check_species(H)))
|
|
||||||
change_ears(H)
|
|
||||||
change_tail_nocolor(H)
|
|
||||||
change_wing_nocolor(H)
|
|
||||||
change_species(H, 1, 1) // ,1) preserves coloring
|
|
||||||
continue
|
|
||||||
if(changes_ears_tail_wing_color && (check_ears(H) || check_tail(H) || check_wing(H) || check_species(H)))
|
|
||||||
change_ears(H)
|
|
||||||
change_tail(H)
|
|
||||||
change_wing(H)
|
|
||||||
change_species(H, 1, 2) // ,2) does not preserve coloring.
|
|
||||||
continue
|
|
||||||
if(changes_gender && check_gender(H, changes_gender_to))
|
|
||||||
change_gender(H, changes_gender_to, 1)
|
|
||||||
continue
|
|
||||||
if(eggs && (!H.absorbed))
|
|
||||||
put_in_egg(H, 1)
|
|
||||||
continue
|
|
||||||
@@ -16,39 +16,88 @@
|
|||||||
prey_loop()
|
prey_loop()
|
||||||
|
|
||||||
/////////////////////////// Sound Selections ///////////////////////////
|
/////////////////////////// Sound Selections ///////////////////////////
|
||||||
|
var/digestion_noise_chance = 0
|
||||||
var/sound/prey_digest
|
var/sound/prey_digest
|
||||||
var/sound/prey_death
|
|
||||||
var/sound/pred_digest
|
var/sound/pred_digest
|
||||||
var/sound/pred_death
|
|
||||||
if(!fancy_vore)
|
if(!fancy_vore)
|
||||||
prey_digest = sound(get_sfx("classic_digestion_sounds"))
|
prey_digest = sound(get_sfx("classic_digestion_sounds"))
|
||||||
prey_death = sound(get_sfx("classic_death_sounds"))
|
|
||||||
pred_digest = sound(get_sfx("classic_digestion_sounds"))
|
pred_digest = sound(get_sfx("classic_digestion_sounds"))
|
||||||
pred_death = sound(get_sfx("classic_death_sounds"))
|
|
||||||
else
|
else
|
||||||
prey_digest = sound(get_sfx("fancy_digest_prey"))
|
prey_digest = sound(get_sfx("fancy_digest_prey"))
|
||||||
prey_death = sound(get_sfx("fancy_death_prey"))
|
|
||||||
pred_digest = sound(get_sfx("fancy_digest_pred"))
|
pred_digest = sound(get_sfx("fancy_digest_pred"))
|
||||||
pred_death = sound(get_sfx("fancy_death_pred"))
|
|
||||||
|
|
||||||
/////////////////////////// Exit Early ////////////////////////////
|
/////////////////////////// Exit Early ////////////////////////////
|
||||||
var/list/touchable_atoms = contents - items_preserved
|
var/list/touchable_atoms = contents - items_preserved
|
||||||
if(!length(touchable_atoms))
|
if(!length(touchable_atoms))
|
||||||
return
|
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 /////////////////////
|
///////////////////// 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
|
next_emote = world.time + emote_time
|
||||||
var/list/EL = emote_lists[digest_mode]
|
for(var/mob/living/M in contents)
|
||||||
if(LAZYLEN(EL))
|
if(digest_mode == DM_DIGEST && !M.digestable)
|
||||||
for(var/mob/living/M in contents)
|
continue // don't give digesty messages to indigestible people
|
||||||
if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people
|
to_chat(M, "<span class='notice'>[pick(EL)]</span>")
|
||||||
to_chat(M, "<span class='notice'>[pick(EL)]</span>")
|
|
||||||
|
|
||||||
|
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/did_an_item = FALSE // Only do one item per cycle.
|
||||||
|
var/to_update = FALSE
|
||||||
var/digestion_noise_chance = 0
|
var/digestion_noise_chance = 0
|
||||||
|
var/list/touchable_mobs = list()
|
||||||
|
|
||||||
for(var/A in touchable_atoms)
|
for(var/A in touchable_atoms)
|
||||||
//Handle stray items
|
//Handle stray items
|
||||||
@@ -99,125 +148,7 @@
|
|||||||
else if(istype(A, /obj/effect/decal/cleanable))
|
else if(istype(A, /obj/effect/decal/cleanable))
|
||||||
qdel(A)
|
qdel(A)
|
||||||
|
|
||||||
if(digest_mode == DM_HOLD)
|
return list("to_update" = to_update, "touchable_mobs" = touchable_mobs, "digestion_noise_chance" = digestion_noise_chance)
|
||||||
//We deliberately do not want any gurgly noises if the belly is in DM_HOLD
|
|
||||||
if(to_update)
|
|
||||||
updateVRPanels()
|
|
||||||
return
|
|
||||||
|
|
||||||
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
|
|
||||||
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, "<span class='notice'>You suddenly feel solid again.</span>")
|
|
||||||
to_chat(owner,"<span class='notice'>You feel like a part of you is missing.</span>")
|
|
||||||
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
|
|
||||||
|
|
||||||
/obj/belly/proc/prey_loop()
|
/obj/belly/proc/prey_loop()
|
||||||
for(var/mob/living/M in contents)
|
for(var/mob/living/M in contents)
|
||||||
|
|||||||
@@ -206,7 +206,7 @@
|
|||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
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 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -227,7 +227,7 @@
|
|||||||
if(color_action == 1)
|
if(color_action == 1)
|
||||||
M.set_species(O.species.name,0,1,M)
|
M.set_species(O.species.name,0,1,M)
|
||||||
else if(color_action == 2)
|
else if(color_action == 2)
|
||||||
M.set_species(O.species.name,0,1,O)
|
M.species = O.species
|
||||||
else
|
else
|
||||||
M.set_species(O.species.name)
|
M.set_species(O.species.name)
|
||||||
M.custom_species = O.custom_species
|
M.custom_species = O.custom_species
|
||||||
|
|||||||
@@ -125,32 +125,30 @@
|
|||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_SIZE_STEAL)
|
if(DM_SIZE_STEAL)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM)
|
if(DM_TRANSFORM_MALE)
|
||||||
switch(B.tf_mode)
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_MALE)
|
if(DM_TRANSFORM_HAIR_AND_EYES)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_HAIR_AND_EYES)
|
if(DM_TRANSFORM_FEMALE)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_FEMALE)
|
if(DM_TRANSFORM_KEEP_GENDER)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_KEEP_GENDER)
|
if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR)
|
if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG)
|
if(DM_TRANSFORM_REPLICA)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_REPLICA)
|
if(DM_TRANSFORM_REPLICA_EGG)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_REPLICA_EGG)
|
if(DM_TRANSFORM_KEEP_GENDER_EGG)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_KEEP_GENDER_EGG)
|
if(DM_TRANSFORM_MALE_EGG)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_MALE_EGG)
|
if(DM_TRANSFORM_FEMALE_EGG)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_TRANSFORM_FEMALE_EGG)
|
if(DM_EGG)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
if(DM_EGG)
|
|
||||||
spanstyle = "color:purple;"
|
|
||||||
|
|
||||||
belly_list += "<span style='[spanstyle]'> ([B.contents.len])</span></a></li>"
|
belly_list += "<span style='[spanstyle]'> ([B.contents.len])</span></a></li>"
|
||||||
|
|
||||||
@@ -203,7 +201,7 @@
|
|||||||
|
|
||||||
//Digest Mode Button
|
//Digest Mode Button
|
||||||
var/mode = selected.digest_mode
|
var/mode = selected.digest_mode
|
||||||
dat += "<br><a href='?src=\ref[src];b_mode=\ref[selected]'>Belly Mode:</a> [mode == DM_TRANSFORM ? selected.tf_mode : mode]"
|
dat += "<br><a href='?src=\ref[src];b_mode=\ref[selected]'>Belly Mode:</a> [mode]"
|
||||||
|
|
||||||
//Mode addons button
|
//Mode addons button
|
||||||
var/list/flag_list = list()
|
var/list/flag_list = list()
|
||||||
@@ -581,10 +579,11 @@
|
|||||||
|
|
||||||
if(new_mode == DM_TRANSFORM) //Snowflek submenu
|
if(new_mode == DM_TRANSFORM) //Snowflek submenu
|
||||||
var/list/tf_list = selected.transform_modes
|
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)
|
if(!new_tf_mode)
|
||||||
return FALSE
|
return FALSE
|
||||||
selected.tf_mode = new_tf_mode
|
selected.digest_mode = new_tf_mode
|
||||||
|
return
|
||||||
|
|
||||||
selected.digest_mode = new_mode
|
selected.digest_mode = new_mode
|
||||||
//selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change //Handled with item modes now
|
//selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change //Handled with item modes now
|
||||||
|
|||||||
@@ -3438,7 +3438,7 @@
|
|||||||
#include "code\modules\vore\appearance\update_icons_vr.dm"
|
#include "code\modules\vore\appearance\update_icons_vr.dm"
|
||||||
#include "code\modules\vore\eating\belly_dat_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\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\bellymodes_vr.dm"
|
||||||
#include "code\modules\vore\eating\contaminate_vr.dm"
|
#include "code\modules\vore\eating\contaminate_vr.dm"
|
||||||
#include "code\modules\vore\eating\digest_act_vr.dm"
|
#include "code\modules\vore\eating\digest_act_vr.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user