diff --git a/code/modules/mob/living/simple_animal/vore/badboi.dm b/code/modules/mob/living/simple_animal/vore/badboi.dm index 15c24526600..11ede1c1055 100644 --- a/code/modules/mob/living/simple_animal/vore/badboi.dm +++ b/code/modules/mob/living/simple_animal/vore/badboi.dm @@ -1,6 +1,6 @@ /mob/living/simple_animal/hostile/badboi name = "corrupt hound" - desc = "Good boy machine broke. At least they haven't stripped the planet down to bare minerals yet." + desc = "Good boy machine broke. This is definitely no good news for the organic lifeforms in vicinity." icon = 'icons/mob/vore64x32.dmi' icon_state = "badboi" icon_living = "badboi" @@ -57,6 +57,22 @@ loot_list = list(/obj/item/borg/upgrade/syndicate = 6, /obj/item/borg/upgrade/vtec = 6, /obj/item/weapon/material/knife/ritual = 6, /obj/item/weapon/disk/nifsoft/compliance = 6) +/mob/living/simple_animal/hostile/badboi/prettyboi + name = "corrupt corrupt hound" + desc = "Bad boy machine broke as well. Seems an attempt was made to achieve a less threatening look, and this one is definitely having some conflicting feelings about it." + icon_state = "prettyboi" + icon_living = "prettyboi" + icon_dead = "prettyboi-dead" + icon_rest = "prettyboi_rest" + + speak = list("I FEEL SOFT.","FEED ME!","Feelin' fine... So fine!","F-F-F-F-darn.","Delicious!","Still craving meat...","PET ME!","I am become softness.","I AM BIG MEAN HUG MACHINE!","Honk...") + speak_emote = list("growls", "declares", "groans", "distorts") + emote_hear = list("jitters and snaps.", "lets out some awkwardly distorted kitten noises.", "awoos mechanically", "growls.", "emits some soft distorted melody.", "gurgles ferociously.", "lets out a distorted beep.", "borks.", "lets out a broken howl.") + emote_see = list("stares ferociously.", "snarls.", "jitters and snaps.", "convulses.", "suddenly hugs something unseen.", "appears to howl unaudibly.", "nuzzles at something unseen.", "dissociates for a moment.", "twitches.") + say_maybe_target = list("MEAT?", "NEW FRIEND?", "WHAT!", "Not again. NOT AGAIN!", "FRIEND?") + say_got_target = list("HERE COMES BIG MEAN HUG MACHINE!", "I'LL BE GENTLE!", "FUEL ME FRIEND!", "I*M SO SORRY!", "YUMMY TREAT DETECTED!", "LOVE ME!", "Not again. NOT AGAIN!") + + /mob/living/simple_animal/hostile/badboi/isSynthetic() return TRUE diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm index 8029425d841..2418fe7091c 100644 --- a/code/modules/vore/eating/belly_obj_vr.dm +++ b/code/modules/vore/eating/belly_obj_vr.dm @@ -173,14 +173,14 @@ // If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in. // Returns the number of mobs so released. /obj/belly/proc/release_all_contents(var/include_absorbed = FALSE, var/silent = FALSE) - + //Don't bother if we don't have contents if(!contents.len) return 0 - + //Find where we should drop things into (certainly not the owner) var/count = 0 - + //Iterate over contents and move them all for(var/thing in contents) var/atom/movable/AM = thing @@ -189,18 +189,18 @@ if(L.absorbed && !include_absorbed) continue count += release_specific_contents(AM, silent = TRUE) - + //Clean up our own business items_preserved.Cut() if(isanimal(owner)) owner.update_icons() - + //Print notifications/sound if necessary if(!silent) - owner.visible_message("[owner] expels everything from their [lowertext(name)]!") + owner.visible_message("[owner] expels everything from their [lowertext(name)]!") if(release_sound) playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) - + return count // Release a specific atom from the contents of this belly into the owning mob's location. @@ -213,7 +213,7 @@ //Place them into our drop_location M.forceMove(drop_location()) items_preserved -= M - + //Special treatment for absorbed prey if(istype(M,/mob/living)) var/mob/living/ML = M @@ -232,13 +232,13 @@ //Clean up our own business if(isanimal(owner)) owner.update_icons() - + //Print notifications/sound if necessary if(!silent) owner.visible_message("[owner] expels [M] from their [lowertext(name)]!") if(release_sound) playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises) - + return 1 // Actually perform the mechanics of devouring the tasty prey. @@ -441,6 +441,9 @@ /obj/belly/AllowDrop() return TRUE +/obj/belly/onDropInto(var/atom/movable/AM) + return null + //Handle a mob struggling // Called from /mob/living/carbon/relaymove() /obj/belly/proc/relay_resist(var/mob/living/R) diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm index 1482e226b8f..2afba124df3 100644 --- a/code/modules/vore/eating/living_vr.dm +++ b/code/modules/vore/eating/living_vr.dm @@ -51,7 +51,7 @@ B.name = "Stomach" B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]." B.can_taste = 1 - + //Return 1 to hook-caller return 1 @@ -147,7 +147,7 @@ var/obj/belly/B = loc B.relay_resist(src) return TRUE //resist() on living does this TRUE thing. - + //Other overridden resists go here return 0 @@ -192,7 +192,7 @@ for(var/belly in src.vore_organs) var/obj/belly/B = belly serialized += list(B.serialize()) //Can't add a list as an object to another list in Byond. Thanks. - + P.belly_prefs = serialized return 1 @@ -213,6 +213,7 @@ can_be_drop_prey = P.can_be_drop_prey can_be_drop_pred = P.can_be_drop_pred + release_vore_contents(silent = TRUE) vore_organs.Cut() for(var/entry in P.belly_prefs) list_to_object(entry,src) @@ -321,7 +322,7 @@ for(var/mob/living/simple_animal/SA in range(10)) SA.prey_excludes[src] = world.time log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "JMP" : "null"])") - + if(isanimal(B.owner)) var/mob/living/simple_animal/SA = B.owner SA.update_icons() @@ -465,7 +466,7 @@ to_chat(src,"You manage to escape \the [C]!") to_chat(H,"Somone has climbed out of your [C]!") forceMove(H.loc) - + else //Being held by a human to_chat(src,"You start to climb out of \the [C]!") to_chat(H,"Something is trying to climb out of your [C]!") @@ -522,17 +523,17 @@ if(!vore_selected) to_chat(src,"You either don't have a belly selected, or don't have a belly!") return - + var/obj/item/I = get_active_hand() if(!I) to_chat(src, "You are not holding anything.") return - + if(is_type_in_list(I,edible_trash)) drop_item() I.forceMove(vore_selected) updateVRPanel() - + if(istype(I,/obj/item/device/flashlight/flare) || istype(I,/obj/item/weapon/flame/match) || istype(I,/obj/item/weapon/storage/box/matches)) to_chat(src, "You can taste the flavor of spicy cardboard.") else if(istype(I,/obj/item/device/flashlight/glowstick)) diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm index 89c40daf92d..d3f37842bf4 100644 --- a/code/modules/vore/eating/vorepanel_vr.dm +++ b/code/modules/vore/eating/vorepanel_vr.dm @@ -56,7 +56,7 @@ /datum/vore_look/proc/gen_ui(var/mob/living/user) var/dat - + var/atom/userloc = user.loc if (isbelly(userloc)) var/obj/belly/inside_belly = userloc @@ -288,6 +288,7 @@ //Under the last HR, save and stuff. dat += "Save Prefs" dat += "Refresh" + dat += "Reload Slot Prefs" //Returns the dat html to the vore_look return dat @@ -410,7 +411,7 @@ var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs if(!choice) return 0 - + for(var/atom/movable/tgt in selected) to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!") selected.transfer_contents(tgt, choice, 1) @@ -602,7 +603,7 @@ to_chat(user,"Invalid size.") else if(new_bulge) selected.bulge_size = (new_bulge/100) - + if(href_list["b_grow_shrink"]) var/new_grow = input(user, "Choose the size that prey will be grown/shrunk to, ranging from 25% to 200%", "Set Growth Shrink Size.", selected.shrink_grow_size) as num|null if (new_grow == null) @@ -679,7 +680,7 @@ var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") if(!alert == "Delete") return 0 - + var/failure_msg = "" var/dest_for //Check to see if it's the destination of another vore organ. @@ -696,7 +697,7 @@ failure_msg += "This belly is marked as undeletable. " if(user.vore_organs.len == 1) failure_msg += "You must have at least one belly. " - + if(failure_msg) alert(user,failure_msg,"Error!") return 0 @@ -711,11 +712,20 @@ else to_chat(user,"Virgo-specific preferences saved!") + if(href_list["applyprefs"]) + var/alert = alert("Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel") + if(!alert == "Reload") + return 0 + if(!user.apply_vore_prefs()) + alert("ERROR: Virgo-specific preferences failed to apply!","Error") + else + to_chat(user,"Virgo-specific preferences applied from active slot!") + if(href_list["setflavor"]) var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null) if(!new_flavor) return 0 - + new_flavor = readd_quotes(new_flavor) if(length(new_flavor) > FLAVOR_MAX) alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") diff --git a/icons/mob/vore64x32.dmi b/icons/mob/vore64x32.dmi index 01c42c7c9ce..455a1e3bf35 100644 Binary files a/icons/mob/vore64x32.dmi and b/icons/mob/vore64x32.dmi differ