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