Merge remote-tracking branch 'VOREStation/master' into nova-basicfixes

This commit is contained in:
Unknown
2019-10-14 21:29:45 -04:00
125 changed files with 1112 additions and 355 deletions
+32
View File
@@ -2,3 +2,35 @@
datum/preferences
var/show_in_directory = 1 //TFF 5/8/19 - show in Character Directory
var/sensorpref = 5 //TFF 5/8/19 - set character's suit sensor level
//Why weren't these in game toggles already?
/client/verb/toggle_eating_noises()
set name = "Eating Noises"
set category = "Preferences"
set desc = "Toggles Vore Eating noises."
var/pref_path = /datum/client_preference/eating_noises
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear eating related vore noises."
SScharacter_setup.queue_preferences_save(prefs)
feedback_add_details("admin_verb","TEatNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/verb/toggle_digestion_noises()
set name = "Digestion Noises"
set category = "Preferences"
set desc = "Toggles Vore Digestion noises."
var/pref_path = /datum/client_preference/digestion_noises
toggle_preference(pref_path)
src << "You will [ (is_preference_enabled(pref_path)) ? "now" : "no longer"] hear digestion related vore noises."
SScharacter_setup.queue_preferences_save(prefs)
feedback_add_details("admin_verb","TDigestNoise") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+1 -1
View File
@@ -923,7 +923,7 @@
overeatduration -= 2 //doubled the unfat rate
if(noisy == TRUE && nutrition < 250 && prob(10)) //VOREStation edit for hunger noises.
var/growlsound = pick(hunger_sounds)
var/sound/growlsound = sound(get_sfx("hunger_sounds"))
var/growlmultiplier = 100 - (nutrition / 250 * 100)
playsound(src, growlsound, vol = growlmultiplier, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
// VOREStation Edit End
@@ -0,0 +1,3 @@
#define AB_SHIFT_NONE 0
#define AB_SHIFT_PASSIVE 1
#define AB_SHIFT_ACTIVE 2
@@ -0,0 +1,86 @@
/mob/living/simple_mob/vore/demon
name = "Rift Walker"
desc = "A large bipedal creature, body a mix of dark fur and scales. Marks on the creatures body pulse slowly with red light"
icon_state = "boxfox"
icon_living = "boxfox"
icon_dead = "boxfox_dead"
icon_rest = "boxfox_rest"
icon = 'icons/mob/demon_vr.dmi'
faction = "demon"
maxHealth = 30
health = 30
movement_cooldown = 0
min_oxy = 0
max_oxy = 0
min_tox = 0
max_tox = 0
min_co2 = 0
max_co2 = 0
min_n2 = 0
max_n2 = 0
minbodytemp = 0
maxbodytemp = INFINITY
response_help = "touches"
response_disarm = "pushes"
response_harm = "hits"
melee_damage_lower = 3
melee_damage_upper = 1
attacktext = list("clawed")
vore_active = TRUE
vore_icons = SA_ICON_LIVING
var/shifted_out = FALSE
var/shift_state = AB_SHIFT_NONE
var/last_shift = 0
var/is_shifting = FALSE
/mob/living/simple_mob/vore/demon/init_vore()
..()
var/obj/belly/B = vore_selected
B.name = "Stomach"
B.desc = "You slide down the slick, slippery gullet of the creature. It's warm, and the air is thick. You can feel the doughy walls of the creatures gut push and knead into your form! Slimy juices coat your form stinging against your flesh as they waste no time to start digesting you. The creature's heartbeat and the gurgling of their stomach are all you can hear as your jostled about, treated like nothing but food."
/mob/living/simple_mob/vore/demon/UnarmedAttack()
if(shifted_out)
return FALSE
. = ..()
/mob/living/simple_mob/vore/demon/can_fall()
if(shifted_out)
return FALSE
return ..()
/mob/living/simple_mob/vore/demon/zMove(direction)
if(shifted_out)
var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
if(destination)
forceMove(destination)
return TRUE
return ..()
/mob/living/simple_mob/vore/demon/Life()
. = ..()
if(shifted_out)
density = FALSE
/mob/living/simple_mob/vore/demon/handle_atmos()
if(shifted_out)
return
else
return .=..()
/mob/living/simple_mob/vore/demon/update_canmove()
if(is_shifting)
canmove = FALSE
return canmove
else
return ..()
@@ -0,0 +1,214 @@
/mob/living/simple_mob/vore/demon/verb/blood_crawl()
set name = "Bloodcrawl"
set desc = "Shift out of reality using blood as your gateway"
set category = "Abilities"
var/turf/T = get_turf(src)
if(!T.CanPass(src,T) || loc != T)
to_chat(src,"<span class='warning'>You can't use that here!</span>")
return FALSE
if(shift_state && shift_state == AB_SHIFT_ACTIVE)
to_chat(src,"<span class='warning'>You can't do a shift while actively shifting!</span>")
return FALSE
if(!(locate(/obj/effect/decal/cleanable/blood) in src.loc))
to_chat(src,"<span class='warning'>You need blood to shift between realities!</span>")
return FALSE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
is_shifting = TRUE
//Shifting in
if(shifted_out)
shifted_out = FALSE
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = initial(B.escapable)
overlays.Cut()
alpha = initial(alpha)
invisibility = initial(invisibility)
see_invisible = initial(see_invisible)
incorporeal_move = initial(incorporeal_move)
density = initial(density)
force_max_speed = initial(force_max_speed)
//Cosmetics mostly
flick("phasein",src)
custom_emote(1,"phases in!")
sleep(30) //The duration of the TP animation
is_shifting = FALSE
canmove = original_canmove
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
var/list/potentials = living_mobs(0)
if(potentials.len)
var/mob/living/target = pick(potentials)
if(istype(target) && vore_selected)
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
// Do this after the potential vore, so we get the belly
update_icon()
shift_state = AB_SHIFT_NONE
/*
//Affect nearby lights
var/destroy_lights = 0
for(var/obj/machinery/light/L in machines)
if(L.z != z || get_dist(src,L) > 10)
continue
if(prob(destroy_lights))
spawn(rand(5,25))
L.broken()
else
L.flicker(10)
*/
//Shifting out
else
shifted_out = TRUE
shift_state = AB_SHIFT_PASSIVE
custom_emote(1,"phases out!")
real_name = name
name = "Something"
health = maxHealth //Fullheal
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = FALSE
overlays.Cut()
flick("phaseout",src)
sleep(30)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
update_icon()
alpha = 127
is_shifting = FALSE
canmove = original_canmove
incorporeal_move = TRUE
density = FALSE
force_max_speed = TRUE
/mob/living/simple_mob/vore/demon/verb/phase_shift()
set name = "Phase Shift"
set desc = "Shift out of reality temporarily"
set category = "Abilities"
var/turf/T = get_turf(src)
if(shift_state && shift_state == AB_SHIFT_PASSIVE)
to_chat(src,"<span class='warning'>You can't do a shift while passively shifting!</span>")
return FALSE
if(shifted_out)
to_chat(src,"<span class='warning'>You can't return to the physical world yet!</span>")
return FALSE
if(world.time - last_shift < 600)
to_chat(src,"<span class='warning'>You can't temporarily shift so soon! You need to wait [round(((last_shift+600)-world.time)/10)] second\s!</span>")
return FALSE
shift_state = AB_SHIFT_ACTIVE
forceMove(T)
var/original_canmove = canmove
SetStunned(0)
SetWeakened(0)
if(buckled)
buckled.unbuckle_mob()
if(pulledby)
pulledby.stop_pulling()
stop_pulling()
canmove = FALSE
is_shifting = TRUE
shifted_out = TRUE
custom_emote(1,"phases out!")
real_name = name
name = "Something"
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = FALSE
overlays.Cut()
flick("phaseout",src)
sleep(30)
invisibility = INVISIBILITY_LEVEL_TWO
see_invisible = INVISIBILITY_LEVEL_TWO
update_icon()
alpha = 127
is_shifting = FALSE
canmove = original_canmove
incorporeal_move = TRUE
density = FALSE
force_max_speed = TRUE
spawn(300)
shifted_out = FALSE
name = real_name
for(var/belly in vore_organs)
var/obj/belly/B = belly
B.escapable = initial(B.escapable)
overlays.Cut()
alpha = initial(alpha)
invisibility = initial(invisibility)
see_invisible = initial(see_invisible)
incorporeal_move = initial(incorporeal_move)
density = initial(density)
force_max_speed = initial(force_max_speed)
original_canmove = canmove
canmove = FALSE
is_shifting = TRUE
//Cosmetics mostly
flick("phasein",src)
custom_emote(1,"phases in!")
sleep(30) //The duration of the TP animation
is_shifting = FALSE
canmove = original_canmove
var/turf/NT = get_turf(src)
if(!NT.CanPass(src,NT))
for(var/direction in list(1,2,4,8,5,6,9,10))
var/turf/L = get_step(NT, direction)
if(L)
if(L.CanPass(src,L))
forceMove(L)
break
//Potential phase-in vore
if(can_be_drop_pred) //Toggleable in vore panel
var/list/potentials = living_mobs(0)
if(potentials.len)
var/mob/living/target = pick(potentials)
if(istype(target) && vore_selected)
target.forceMove(vore_selected)
to_chat(target,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
// Do this after the potential vore, so we get the belly
update_icon()
shift_state = AB_SHIFT_NONE
last_shift = world.time
@@ -0,0 +1,19 @@
/mob/living/simple_mob/vore/demon/engorge
name = "Engorge"
icon_state = "engorge"
icon_living = "engorge"
icon_dead = "engorge_dead"
icon_rest = "engorge_rest"
vore_icons = null
/mob/living/simple_mob/vore/demon/zellic
name = "Zellic"
icon_state = "zellic"
icon_living = "zellic"
icon_dead = "zellic_dead"
icon_rest = null
vore_icons = null
@@ -0,0 +1,3 @@
#undef AB_SHIFT_NONE
#undef AB_SHIFT_PASSIVE
#undef AB_SHIFT_ACTIVE
+58 -16
View File
@@ -20,19 +20,22 @@
var/emote_time = 60 SECONDS // How long between stomach emotes at prey
var/digest_brute = 2 // Brute damage per tick in digestion mode
var/digest_burn = 2 // Burn damage per tick in digestion mode
var/immutable = 0 // Prevents this belly from being deleted
var/escapable = 0 // Belly can be resisted out of at any time
var/immutable = FALSE // Prevents this belly from being deleted
var/escapable = FALSE // Belly can be resisted out of at any time
var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly
var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
var/absorbchance = 0 // % Chance of stomach beginning to absorb if prey struggles
var/escapechance = 0 // % Chance of prey beginning to escape if prey struggles.
var/transferchance = 0 // % Chance of prey being
var/can_taste = 0 // If this belly prints the flavor of prey when it eats someone.
var/can_taste = FALSE // If this belly prints the flavor of prey when it eats someone.
var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
var/transferlocation // Location that the prey is released if they struggle and get dropped off.
var/release_sound = TRUE // Boolean for now, maybe replace with something else later
var/release_sound = "Splatter" // Sound for letting someone out. Replaced from True/false
var/mode_flags = 0 // Stripping, numbing, etc.
var/fancy_vore = FALSE // Using the new sounds?
var/is_wet = TRUE // Is this belly's insides made of slimy parts?
var/wet_loop = TRUE // Does the belly have a fleshy loop playing?
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
//Actual full digest modes
@@ -147,7 +150,11 @@
"item_digest_mode",
"contaminates",
"contamination_flavor",
"contamination_color"
"contamination_color",
"release_sound",
"fancy_vore",
"is_wet",
"wet_loop"
)
/obj/belly/New(var/newloc)
@@ -175,7 +182,11 @@
//Sound w/ antispam flag setting
if(vore_sound && !recent_sound)
var/soundfile = vore_sounds[vore_sound]
var/soundfile
if(!fancy_vore)
soundfile = classic_vore_sounds[vore_sound]
else
soundfile = fancy_vore_sounds[vore_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
recent_sound = TRUE
@@ -196,7 +207,7 @@
//Don't bother if we don't have contents
if(!contents.len)
return 0
return FALSE
//Find where we should drop things into (certainly not the owner)
var/count = 0
@@ -218,8 +229,13 @@
//Print notifications/sound if necessary
if(!silent)
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
if(release_sound)
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
else
soundfile = fancy_release_sounds[release_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
return count
@@ -232,12 +248,15 @@
//Place them into our drop_location
M.forceMove(drop_location())
items_preserved -= M
//Special treatment for absorbed prey
if(istype(M,/mob/living))
if(isliving(M))
var/mob/living/ML = M
var/mob/living/OW = owner
if(ML.client)
ML.stop_sound_channel(CHANNEL_PREYLOOP) //Stop the internal loop, it'll restart if the isbelly check on next tick anyway
if(ML.muffled)
ML.muffled = 0
if(ML.absorbed)
@@ -258,8 +277,13 @@
//Print notifications/sound if necessary
if(!silent)
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
if(release_sound)
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
var/soundfile
if(!fancy_vore)
soundfile = classic_release_sounds[release_sound]
else
soundfile = fancy_release_sounds[release_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
return 1
@@ -403,6 +427,8 @@
else if(M.reagents)
M.reagents.trans_to_holder(Pred.bloodstr, M.reagents.total_volume, 0.5, TRUE)
//Incase they have the loop going, let's double check to stop it.
M.stop_sound_channel(CHANNEL_PREYLOOP)
// Delete the digested mob
qdel(M)
@@ -515,9 +541,17 @@
M.show_message(struggle_outer_message, 2) // hearable
to_chat(R,struggle_user_message)
var/strpick = pick(struggle_sounds)
var/strsound = struggle_sounds[strpick]
playsound(src, strsound, vary = 1, vol = 100, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises)
var/sound/struggle_snuggle
var/sound/struggle_rustle = sound(get_sfx("rustle"))
if(is_wet)
if(!fancy_vore)
struggle_snuggle = sound(get_sfx("classic_struggle_sounds"))
else
struggle_snuggle = sound(get_sfx("fancy_prey_struggle"))
playsound(src, struggle_snuggle, vary = 1, vol = 75, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises)
else
playsound(src, struggle_rustle, vary = 1, vol = 75, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises)
if(escapable) //If the stomach has escapable enabled.
if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
@@ -601,7 +635,11 @@
I.gurgle_contaminate(target.contents, target.contamination_flavor, target.contamination_color)
items_preserved -= content
if(!silent && target.vore_sound && !recent_sound)
var/soundfile = vore_sounds[target.vore_sound]
var/soundfile
if(!fancy_vore)
soundfile = classic_vore_sounds[target.vore_sound]
else
soundfile = fancy_vore_sounds[target.vore_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises)
owner.updateVRPanel()
@@ -639,6 +677,10 @@
dupe.contaminates = contaminates
dupe.contamination_flavor = contamination_flavor
dupe.contamination_color = contamination_color
dupe.release_sound = release_sound
dupe.fancy_vore = fancy_vore
dupe.is_wet = is_wet
dupe.wet_loop = wet_loop
//// Object-holding variables
//struggle_messages_outside - strings
+66 -13
View File
@@ -24,6 +24,35 @@
if(M.digestable || digest_mode != DM_DIGEST) // don't give digesty messages to indigestible people
to_chat(M,"<span class='notice'>[pick(EL)]</span>")
///////////////////// Prey Loop Refresh/hack //////////////////////
for(var/mob/living/M in contents)
M.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case, because byond is whack and you can't trust it
if(isbelly(M.loc)) //sanity check
if(world.time > M.next_preyloop) //We don't want it to overlap, but we also want it to replay.
if(is_wet && wet_loop) // Is it a fleshy environment, and does the pred have a fleshy heartbeat loop to play?
if(!M.client)
continue
if(M.is_preference_enabled(/datum/client_preference/digestion_noises)) //then we check if the mob has sounds enabled at all
var/sound/preyloop = sound('sound/vore/sunesound/prey/loop.ogg')
M.playsound_local(get_turf(src),preyloop, 80,0, channel = CHANNEL_PREYLOOP)
M.next_preyloop = (world.time + 52 SECONDS)
/////////////////////////// Sound Selections ///////////////////////////
var/sound/prey_digest
var/sound/prey_death
var/sound/pred_digest
var/sound/pred_death
if(!fancy_vore)
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_death = sound(get_sfx("classic_death_sounds"))
else
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_death = sound(get_sfx("fancy_death_pred"))
/////////////////////////// Exit Early ////////////////////////////
var/list/touchable_atoms = contents - items_preserved
if(!length(touchable_atoms))
@@ -47,7 +76,7 @@
else
items_preserved |= I
if(prob(25)) //Less often than with normal digestion
play_sound = pick(digestion_sounds)
play_sound = pick(pred_digest)
else if(item_digest_mode == IM_DIGEST)
if(I.digest_stage && I.digest_stage > 0)
digest_item(I)
@@ -56,7 +85,7 @@
did_an_item = TRUE
to_update = TRUE
if(prob(25)) //Less often than with normal digestion
play_sound = pick(digestion_sounds)
play_sound = pick(pred_digest)
//Handle eaten mobs
else if(isliving(A))
@@ -96,11 +125,15 @@
else
items_preserved |= I
if(prob(25)) //Less often than with normal digestion
play_sound = pick(digestion_sounds)
if(L && L.client && L.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(L,prey_digest)
play_sound = pick(pred_digest)
else if(item_digest_mode == IM_DIGEST)
digest_item(I)
if(prob(25)) //Less often than with normal digestion
play_sound = pick(digestion_sounds)
if(L && L.client && L.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(L,prey_digest)
play_sound = pick(pred_digest)
to_update = TRUE
break
//get rid of things like blood drops and gibs that end up in there
@@ -115,7 +148,10 @@
else if(digest_mode == DM_DIGEST)
if(prob(50)) //Was SO OFTEN. AAAA.
play_sound = pick(digestion_sounds)
for(var/mob/M in contents)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
for (var/target in touchable_mobs)
var/mob/living/M = target
@@ -142,7 +178,9 @@
to_chat(owner,"<span class='notice'>" + digest_alert_owner + "</span>")
to_chat(M,"<span class='notice'>" + digest_alert_prey + "</span>")
play_sound = pick(death_sounds)
play_sound = pick(pred_death)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_death)
if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
handle_remains_leaving(M)
digestion_death(M)
@@ -183,7 +221,9 @@
for (var/target in touchable_mobs)
var/mob/living/M = target
if(prob(10)) //Less often than gurgles. People might leave this on forever.
play_sound = pick(digestion_sounds)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
if(M.absorbed)
continue
@@ -216,7 +256,9 @@
var/mob/living/M = target
if(prob(10)) //Less often than gurgles. People might leave this on forever.
play_sound = pick(digestion_sounds)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
if(M.nutrition >= 100) //Drain them until there's no nutrients left.
var/oldnutrition = (M.nutrition * 0.05)
@@ -230,7 +272,9 @@
var/mob/living/M = target
if(prob(10)) //Infinite gurgles!
play_sound = pick(digestion_sounds)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
if(M.size_multiplier > shrink_grow_size) //Shrink until smol.
M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick.
@@ -247,7 +291,9 @@
var/mob/living/M = target
if(prob(10))
play_sound = pick(digestion_sounds)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
if(M.size_multiplier < shrink_grow_size) //Grow until large.
M.resize(M.size_multiplier+0.01) //Grow by 1% per tick.
@@ -261,7 +307,9 @@
var/mob/living/M = target
if(prob(10))
play_sound = pick(digestion_sounds)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
if(M.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.
@@ -276,7 +324,10 @@
else if(digest_mode == DM_HEAL)
if(prob(50)) //Wet heals! The secret is you can leave this on for gurgle noises for fun.
play_sound = pick(digestion_sounds)
for(var/mob/M in contents)
if(M && M.client && M.is_preference_enabled(/datum/client_preference/digestion_noises))
SEND_SOUND(M,prey_digest)
play_sound = pick(pred_digest)
for (var/target in touchable_mobs)
var/mob/living/M = target
@@ -303,7 +354,9 @@
/////////////////////////// Make any noise ///////////////////////////
if(play_sound)
playsound(src, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises)
for(var/mob/M in hearers(4, owner)) //so we don't fill the whole room with the sound effect
if(M && M.client && (isturf(M.loc) || (M.loc != src.contents)) && M.is_preference_enabled(/datum/client_preference/digestion_noises)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
SEND_SOUND(M, play_sound) //these are all external sound triggers now, so it's ok.
if(to_update)
for(var/mob/living/M in contents)
if(M.client)
+11 -10
View File
@@ -1,12 +1,12 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = 1 // Can the mob be digested inside a belly?
var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise?
var/allowmobvore = 1 // Will simplemobs attempt to eat the mob?
var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/digestable = TRUE // Can the mob be digested inside a belly?
var/digest_leave_remains = FALSE // Will this mob leave bones/skull/etc after the melty demise?
var/allowmobvore = TRUE // Will simplemobs attempt to eat the mob?
var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/absorbed = 0 // If a mob is absorbed into another
var/absorbed = FALSE // If a mob is absorbed into another
var/weight = 137 // Weight for mobs for weightgain system
var/weight_gain = 1 // How fast you gain weight
var/weight_loss = 0.5 // How fast you lose weight
@@ -15,16 +15,17 @@
var/revive_ready = REVIVING_READY // Only used for creatures that have the xenochimera regen ability, so far.
var/metabolism = 0.0015
var/vore_taste = null // What the character tastes like
var/no_vore = 0 // If the character/mob can vore.
var/openpanel = 0 // Is the vore panel open?
var/noisy = 0 // Toggle audible hunger.
var/no_vore = FALSE // If the character/mob can vore.
var/openpanel = FALSE // Is the vore panel open?
var/noisy = FALSE // Toggle audible hunger.
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
var/fuzzy = 1 // Preference toggle for sharp/fuzzy icon.
var/tail_alt = 0 // Tail layer toggle.
var/permit_healbelly = TRUE
var/can_be_drop_prey = 0
var/can_be_drop_pred = 1 // Mobs are pred by default.
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = TRUE // Mobs are pred by default.
var/next_preyloop // For Fancy sound internal loop
//
// Hook for generic creation of stuff on new creatures
+3 -1
View File
@@ -19,6 +19,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
-Aro <3 */
#define VORE_VERSION 1 //This is a Define so you don't have to worry about magic numbers.
//
// Overrides/additions to stock defines go here, as well as hooks. Sort them by
// the object they are overriding. So all /mob/living together, etc.
@@ -139,7 +141,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
/datum/vore_preferences/proc/save_vore()
if(!path) return 0
var/version = 1 //For "good times" use in the future
var/version = VORE_VERSION //For "good times" use in the future
var/list/settings_list = list(
"version" = version,
"digestable" = digestable,
+73 -15
View File
@@ -189,6 +189,13 @@
dat += "<a href='?src=\ref[src];b_name=\ref[selected]'>Name:</a>"
dat += " '[selected.name]'"
//Belly Type button
dat += "<br><a href='?src=\ref[src];b_wetness=\ref[selected]'>Is this belly fleshy:</a>"
dat += "[selected.is_wet ? "Yes" : "No"]"
if(selected.is_wet)
dat += "<a href='?src=\ref[src];b_wetloop=\ref[selected]'>Internal loop for prey?:</a>"
dat += "[selected.wet_loop ? "Yes" : "No"]"
//Digest Mode Button
dat += "<br><a href='?src=\ref[src];b_mode=\ref[selected]'>Belly Mode:</a>"
var/mode = selected.digest_mode
@@ -229,10 +236,18 @@
dat += "<br><a href='?src=\ref[src];b_desc=\ref[selected]'>Flavor Text:</a>"
dat += " '[selected.desc]'"
//Belly Sound Fanciness
dat += "<br><a href='?src=\ref[src];b_fancy_sound=\ref[selected]'>Use Fancy Sounds:</a>"
dat += "[selected.fancy_vore ? "Yes" : "No"]"
//Belly sound
dat += "<br><a href='?src=\ref[src];b_sound=\ref[selected]'>Set Vore Sound</a>"
dat += "<br><a href='?src=\ref[src];b_sound=\ref[selected]'>Vore Sound: [selected.vore_sound]</a>"
dat += "<a href='?src=\ref[src];b_soundtest=\ref[selected]'>Test</a>"
//Release sound
dat += "<br><a href='?src=\ref[src];b_release=\ref[selected]'>Release Sound: [selected.release_sound]</a>"
dat += "<a href='?src=\ref[src];b_releasesoundtest=\ref[selected]'>Test</a>"
//Belly messages
dat += "<br><a href='?src=\ref[src];b_msgs=\ref[selected]'>Belly Messages</a>"
@@ -293,27 +308,27 @@
dat += "<HR>"
switch(user.digestable)
if(1)
if(TRUE)
dat += "<a href='?src=\ref[src];toggledg=1'>Toggle Digestable</a>"
if(0)
if(FALSE)
dat += "<a href='?src=\ref[src];toggledg=1'><span style='color:green;'>Toggle Digestable</span></a>"
switch(user.digest_leave_remains)
if(1)
if(TRUE)
dat += "<a href='?src=\ref[src];toggledlm=1'><span style='color:red;'>Toggle Leaving Remains</span></a>"
if(0)
if(FALSE)
dat += "<a href='?src=\ref[src];toggledlm=1'>Toggle Leaving Remains</a>"
switch(user.allowmobvore)
if(1)
if(TRUE)
dat += "<br><a href='?src=\ref[src];togglemv=1'>Toggle Mob Vore</a>"
if(0)
if(FALSE)
dat += "<br><a href='?src=\ref[src];togglemv=1'><span style='color:green;'>Toggle Mob Vore</span></a>"
switch(user.permit_healbelly)
if(1)
if(TRUE)
dat += "<a href='?src=\ref[src];togglehealbelly=1'>Toggle Healbelly Permission</a>"
if(0)
if(FALSE)
dat += "<a href='?src=\ref[src];togglehealbelly=1'><span style='color:red;'>Toggle Healbelly Permission</span></a>"
dat += "<br><a href='?src=\ref[src];toggle_dropnom_prey=1'>Toggle Drop-nom Prey</a>" //These two get their own, custom row, too.
@@ -534,6 +549,12 @@
selected.name = new_name
if(href_list["b_wetness"])
selected.is_wet = !selected.is_wet
if(href_list["b_wetloop"])
selected.wet_loop = !selected.wet_loop
if(href_list["b_mode"])
var/list/menu_list = selected.digest_modes.Copy()
if(istype(usr,/mob/living/carbon/human))
@@ -658,17 +679,54 @@
selected.vore_verb = new_verb
if(href_list["b_sound"])
var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in vore_sounds
if(href_list["b_fancy_sound"])
selected.fancy_vore = !selected.fancy_vore
selected.vore_sound = "Gulp"
selected.release_sound = "Splatter"
// defaults as to avoid potential bugs
if(href_list["b_release"])
var/choice
if(selected.fancy_vore)
choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in fancy_release_sounds
else
choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in classic_release_sounds
if(!choice)
return 0
return FALSE
selected.release_sound = choice
if(href_list["b_releasesoundtest"])
var/sound/releasetest
if(selected.fancy_vore)
releasetest = fancy_release_sounds[selected.release_sound]
else
releasetest = classic_release_sounds[selected.release_sound]
if(releasetest)
SEND_SOUND(user, releasetest)
if(href_list["b_sound"])
var/choice
if(selected.fancy_vore)
choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in fancy_vore_sounds
else
choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in classic_vore_sounds
if(!choice)
return FALSE
selected.vore_sound = choice
if(href_list["b_soundtest"])
var/soundfile = vore_sounds[selected.vore_sound]
if(soundfile)
user << soundfile
var/sound/voretest
if(selected.fancy_vore)
voretest = fancy_vore_sounds[selected.vore_sound]
else
voretest = classic_vore_sounds[selected.vore_sound]
if(voretest)
SEND_SOUND(user, voretest)
if(href_list["b_tastes"])
selected.can_taste = !selected.can_taste