diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm index aa0d9d616d..eb9efae474 100644 --- a/code/__defines/belly_modes_vr.dm +++ b/code/__defines/belly_modes_vr.dm @@ -2,10 +2,13 @@ #define DM_HOLD "Hold" #define DM_DIGEST "Digest" #define DM_ITEMWEAK "Digest (Item Friendly)" -#define DM_STRIPDIGEST "Strip Digest (Items Only)" #define DM_DIGEST_NUMB "Digest (Numbing)" +#define DM_ITEMWEAK_NUMB "Digest (Numbing, Item Friendly)" +#define DM_STRIPDIGEST "Strip Digest (Items Only)" +#define DM_STRIP_ITEMWEAK "Strip Digest (Items Friendly)" #define DM_HEAL "Heal" #define DM_ABSORB "Absorb" +#define DM_ABSORB_STRIP "Absorb Naked" #define DM_TRANSFORM_HAIR_AND_EYES "Transform (Hair and eyes)" #define DM_TRANSFORM_MALE "Transform (Male)" #define DM_TRANSFORM_FEMALE "Transform (Female)" diff --git a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm index ba50b3e0ec..745886dec2 100644 --- a/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm +++ b/code/modules/mob/living/silicon/robot/dogborg/dog_sleeper_vr.dm @@ -22,6 +22,7 @@ var/synced = FALSE var/startdrain = 500 var/max_item_count = 1 + var/gulpsound = 'sound/vore/gulp.ogg' /obj/item/device/dogborg/sleeper/New() ..() @@ -55,7 +56,7 @@ if(do_after(user, 30, target) && length(contents) < max_item_count) target.forceMove(src) user.visible_message("[hound.name]'s internal analyzer groans lightly as [target.name] slips inside.", "Your internal analyzer groans lightly as [target] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(istype(target,/obj/item)) var/obj/item/tech_item = target for(var/T in tech_item.origin_tech) @@ -79,7 +80,7 @@ trashman.reset_view(src) processing_objects |= src user.visible_message("[hound.name]'s internal analyzer groans lightly as [trashman] slips inside.", "Your internal analyzer groans lightly as [trashman] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -96,7 +97,7 @@ if(do_after(user, 30, target) && length(contents) < max_item_count) target.forceMove(src) user.visible_message("[hound.name]'s garbage processor groans lightly as [target.name] slips inside.", "Your garbage compactor groans lightly as [target] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -109,7 +110,7 @@ trashmouse.forceMove(src) trashmouse.reset_view(src) user.visible_message("[hound.name]'s garbage processor groans lightly as [trashmouse] slips inside.", "Your garbage compactor groans lightly as [trashmouse] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 30, 1) + playsound(hound, gulpsound, vol = 60, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -129,7 +130,7 @@ trashman.reset_view(src) processing_objects |= src user.visible_message("[hound.name]'s garbage processor groans lightly as [trashman] slips inside.", "Your garbage compactor groans lightly as [trashman] slips inside.") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) update_patient() if(UI_open == TRUE) sleeperUI(usr) @@ -157,7 +158,7 @@ processing_objects |= src user.visible_message("[hound.name]'s medical pod lights up as [H.name] slips inside into their [src.name].", "Your medical pod lights up as [H] slips into your [src]. Life support functions engaged.") message_admins("[key_name(hound)] has eaten [key_name(patient)] as a dogborg. ([hound ? "JMP" : "null"])") - playsound(hound, 'sound/vore/gulp.ogg', 80, 1) + playsound(hound, gulpsound, vol = 100, vary = 1, falloff = 0.1, preference = /datum/client_preference/eating_noises) if(UI_open == TRUE) sleeperUI(usr) @@ -462,9 +463,22 @@ //Belly is entirely empty if(!length(contents)) + var/finisher = pick( + 'sound/vore/death1.ogg', + 'sound/vore/death2.ogg', + 'sound/vore/death3.ogg', + 'sound/vore/death4.ogg', + 'sound/vore/death5.ogg', + 'sound/vore/death6.ogg', + 'sound/vore/death7.ogg', + 'sound/vore/death8.ogg', + 'sound/vore/death9.ogg', + 'sound/vore/death10.ogg') + playsound(hound, finisher, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) to_chat(hound, "Your [src.name] is now clean. Ending self-cleaning cycle.") cleaning = 0 update_patient() + playsound(hound, 'sound/machines/ding.ogg', 50, 1) return if(prob(20)) @@ -481,10 +495,7 @@ 'sound/vore/digest10.ogg', 'sound/vore/digest11.ogg', 'sound/vore/digest12.ogg') - for(var/mob/outhearer in range(1,hound)) - outhearer << sound(churnsound) - for(var/mob/inhearer in contents) - inhearer << sound(churnsound) + playsound(hound, churnsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) //If the timing is right, and there are items to be touched if(air_master.current_cycle%3==1 && length(touchable_items)) @@ -523,9 +534,7 @@ 'sound/vore/death8.ogg', 'sound/vore/death9.ogg', 'sound/vore/death10.ogg') - for(var/mob/hearer in range(1,src.hound)) - hearer << deathsound - T << deathsound + playsound(hound, deathsound, vol = 100, vary = 1, falloff = 0.1, ignore_walls = TRUE, preference = /datum/client_preference/digestion_noises) if(is_vore_predator(T)) for(var/belly in T.vore_organs) var/obj/belly/B = belly diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 8affcb171d..8cd895e159 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -34,7 +34,7 @@ var/release_sound = TRUE // Boolean for now, maybe replace with something else later //I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere. - var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes + var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_DIGEST_NUMB,DM_ITEMWEAK_NUMB,DM_STRIPDIGEST,DM_STRIP_ITEMWEAK,DM_HEAL,DM_ABSORB,DM_ABSORB_STRIP,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL) // Possible digest modes var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG) 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) @@ -383,6 +383,8 @@ M.absorbed = 1 to_chat(M,"[owner]'s [lowertext(name)] absorbs your body, making you part of them.") to_chat(owner,"Your [lowertext(name)] absorbs [M]'s body, making them part of you.") + if(M.noisy) //Mute drained absorbee hunger if enabled. + M.noisy = FALSE if(ishuman(M) && ishuman(owner)) var/mob/living/carbon/human/Prey = M diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm index 564531ef5b..a0d1263449 100644 --- a/code/modules/vore/eating/bellymodes_vr.dm +++ b/code/modules/vore/eating/bellymodes_vr.dm @@ -20,7 +20,7 @@ var/list/EL = emote_lists[digest_mode] if(LAZYLEN(EL)) for(var/mob/living/M in contents) - if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)) // don't give digesty messages to indigestible people + if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK || digest_mode == DM_ITEMWEAK_NUMB)) // don't give digesty messages to indigestible people to_chat(M,"[pick(EL)]") /////////////////////////// Exit Early //////////////////////////// @@ -38,7 +38,7 @@ return SSBELLIES_PROCESSED //Pretty boring, huh //////////////////////////// DM_DIGEST //////////////////////////// - else if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK) + else if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK || digest_mode == DM_ITEMWEAK_NUMB) if(prob(50)) //Was SO OFTEN. AAAA. play_sound = pick(digestion_sounds) @@ -71,7 +71,7 @@ owner.update_icons() continue - if(digest_mode == DM_DIGEST_NUMB && ishuman(M)) + if(digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK_NUMB && ishuman(M)) var/mob/living/carbon/human/H = M if(H.bloodstr.get_reagent_amount("numbenzyme") < 5) H.bloodstr.add_reagent("numbenzyme",10) @@ -94,7 +94,26 @@ //Contaminate or gurgle items var/obj/item/T = pick(touchable_items) if(istype(T)) - if(digest_mode == DM_ITEMWEAK) + if(digest_mode == DM_ITEMWEAK || digest_mode == DM_ITEMWEAK_NUMB) + if(istype(T,/obj/item/weapon/reagent_containers/food) || istype(T,/obj/item/weapon/holder) || istype(T,/obj/item/organ)) + digest_item(T) + else + T.gurgle_contaminate(contents, owner) + items_preserved |= T + else + digest_item(T) + owner.updateVRPanel() + +//////////////////////////// DM_STRIPDIGEST //////////////////////////// + else if(digest_mode == DM_STRIPDIGEST || digest_mode == DM_STRIP_ITEMWEAK) // Only gurgle the gear off your prey. + + if(prob(50)) + play_sound = pick(digestion_sounds) + + // Handle loose items first. + var/obj/item/T = pick(touchable_items) + if(istype(T)) + if(digest_mode == DM_STRIP_ITEMWEAK) if(istype(T,/obj/item/weapon/reagent_containers/food) || istype(T,/obj/item/weapon/holder) || istype(T,/obj/item/organ)) digest_item(T) else @@ -103,19 +122,6 @@ else digest_item(T) - owner.updateVRPanel() - -//////////////////////////// DM_STRIPDIGEST //////////////////////////// - else if(digest_mode == DM_STRIPDIGEST) // Only gurgle the gear off your prey. - - if(prob(50)) - play_sound = pick(digestion_sounds) - - // Handle loose items first. - var/obj/item/T = pick(touchable_items) - if(istype(T)) - digest_item(T) - for(var/mob/living/carbon/human/M in contents) if (M.absorbed) continue @@ -123,14 +129,20 @@ var/obj/item/thingy = M.get_equipped_item(slot = slot) if(thingy) M.unEquip(thingy,force = TRUE) - digest_item(thingy) + if(digest_mode == DM_STRIP_ITEMWEAK) + if(istype(thingy,/obj/item/weapon/reagent_containers/food) || istype(thingy,/obj/item/weapon/holder) || istype(thingy,/obj/item/organ)) + digest_item(thingy) + else + thingy.gurgle_contaminate(contents, owner) + items_preserved |= thingy + else + digest_item(T) break M.updateVRPanel() - owner.updateVRPanel() //////////////////////////// DM_ABSORB //////////////////////////// - else if(digest_mode == DM_ABSORB) + else if(digest_mode == DM_ABSORB || digest_mode == DM_ABSORB_STRIP) for (var/mob/living/M in contents) @@ -141,10 +153,17 @@ continue if(M.nutrition >= 100) //Drain them until there's no nutrients left. Slowly "absorb" them. - var/oldnutrition = (M.nutrition * 0.05) - M.nutrition = (M.nutrition * 0.95) - owner.nutrition += oldnutrition + M.nutrition -= digest_brute+digest_burn + owner.nutrition += digest_brute+digest_burn + if(isrobot(owner)) + var/mob/living/silicon/robot/R = owner + R.cell.charge += 10*(digest_brute+digest_burn) else if(M.nutrition < 100) //When they're finally drained. + if(digest_mode == DM_ABSORB_STRIP) + for(var/slot in slots) + var/obj/item/thingy = M.get_equipped_item(slot = slot) + if(thingy) + M.unEquip(thingy,force = TRUE) absorb_living(M) //////////////////////////// DM_UNABSORB //////////////////////////// @@ -166,9 +185,11 @@ play_sound = pick(digestion_sounds) if(M.nutrition >= 100) //Drain them until there's no nutrients left. - var/oldnutrition = (M.nutrition * 0.05) - M.nutrition = (M.nutrition * 0.95) - owner.nutrition += oldnutrition + M.nutrition -= digest_brute+digest_burn + owner.nutrition += digest_brute+digest_burn + if(isrobot(owner)) + var/mob/living/silicon/robot/R = owner + R.cell.charge += 10*(digest_brute+digest_burn) //////////////////////////// DM_SHRINK //////////////////////////// else if(digest_mode == DM_SHRINK) diff --git a/code/modules/vore/eating/contaminate_vr.dm b/code/modules/vore/eating/contaminate_vr.dm index bf51ca9d59..5754846352 100644 --- a/code/modules/vore/eating/contaminate_vr.dm +++ b/code/modules/vore/eating/contaminate_vr.dm @@ -93,9 +93,9 @@ var/image/gurgled_overlay = image('icons/effects/sludgeoverlay_vr.dmi') ////////////// // Special handling of gurgle_contaminate ////////////// -/obj/item/weapon/card/id/gurgle_contaminate(var/atom/movable/item_storage = null) +/*/obj/item/weapon/card/id/gurgle_contaminate(var/atom/movable/item_storage = null) digest_act(item_storage) //Digesting these anyway - return TRUE + return TRUE*/ /obj/item/weapon/reagent_containers/food/gurgle_contaminate(var/atom/movable/item_storage = null) digest_act(item_storage) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index d3f37842bf..ba2f43b1d4 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -118,6 +118,8 @@ spanstyle = "color:green;" if(DM_ABSORB) spanstyle = "color:purple;" + if(DM_ABSORB_STRIP) + spanstyle = "color:purple;" if(DM_DRAIN) spanstyle = "color:purple;" if(DM_SHRINK)