diff --git a/code/modules/vore/eating/belly_vr.dm b/code/modules/vore/eating/belly_vr.dm
index 517ff5bde3d..0bc8e25e6b2 100644
--- a/code/modules/vore/eating/belly_vr.dm
+++ b/code/modules/vore/eating/belly_vr.dm
@@ -26,6 +26,7 @@
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/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
@@ -452,6 +453,7 @@
dupe.digest_burn = digest_burn
dupe.digest_tickrate = digest_tickrate
dupe.immutable = immutable
+ dupe.can_taste = can_taste
dupe.escapable = escapable
dupe.escapetime = escapetime
dupe.digestchance = digestchance
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 459945c6b7b..8126498854d 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -7,10 +7,11 @@
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
- var/egg_type = "egg" // Default egg type.
+ var/egg_type = "egg" // Default egg type.
var/feral = 0 // How feral the mob is, if at all. Does nothing for non xenochimera at the moment.
var/reviving = 0 // 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
//
// Hook for generic creation of stuff on new creatures
@@ -18,6 +19,7 @@
/hook/living_new/proc/vore_setup(mob/living/M)
M.verbs += /mob/living/proc/insidePanel
M.verbs += /mob/living/proc/escapeOOC
+ M.verbs += /mob/living/proc/lick
//Tries to load prefs if a client is present otherwise gives freebie stomach
if(!M.vore_organs || !M.vore_organs.len)
@@ -38,6 +40,7 @@
B.immutable = 1
B.name = "Stomach"
B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]."
+ B.can_taste = 1
M.vore_organs[B.name] = B
M.vore_selected = B.name
@@ -218,6 +221,7 @@
P.digestable = src.digestable
P.belly_prefs = src.vore_organs
+ P.vore_taste = src.vore_taste
return 1
@@ -233,6 +237,7 @@
src.digestable = P.digestable
src.vore_organs = list()
+ src.vore_taste = P.vore_taste
for(var/I in P.belly_prefs)
var/datum/belly/Bp = P.belly_prefs[I]
@@ -240,6 +245,38 @@
return 1
+//
+// Clearly super important. Obviously.
+//
+/mob/living/proc/lick(var/mob/living/tasted in oview(1))
+ set name = "Lick Someone"
+ set category = "IC"
+ set desc = "Lick someone nearby!"
+
+ if(!istype(tasted))
+ return
+
+ if(src.sleeping || src.resting || src.weakened || src.stat >= DEAD)
+ return
+
+ var/taste_message = ""
+ if(tasted.vore_taste && (tasted.vore_taste != ""))
+ taste_message += "[tasted.vore_taste]"
+ else
+ if(ishuman(tasted))
+ var/mob/living/carbon/human/H = tasted
+ taste_message += "a normal [H.custom_species ? H.custom_species : H.species.name]"
+ else
+ taste_message += "a plain old normal [tasted]"
+
+ if(ishuman(tasted))
+ var/mob/living/carbon/human/H = tasted
+ if(H.touching.reagent_list.len) //Just the first one otherwise I'll go insane.
+ var/datum/reagent/R = H.touching.reagent_list[1]
+ taste_message += " You also get the flavor of [R.taste_description] from something on them"
+
+ src.visible_message("[src] licks [tasted]!","You lick [tasted]. They taste rather like [taste_message].","Slurp!")
+
//
// OOC Escape code for pref-breaking or AFK preds
//
@@ -268,11 +305,12 @@
//You're in a PC!
else if(istype(src.loc,/mob/living))
var/mob/living/carbon/pred = src.loc
- var/confirm = alert(src, "You're in a player-character. This is for escaping from preference-breaking and if your predator disconnects/AFKs. If you are in more than one pred, use this more than once. If your preferences were being broken, please admin-help as well.", "Confirmation", "Okay", "Cancel")
+ var/confirm = alert(src, "You're in a player-character. This is for escaping from preference-breaking and if your predator disconnects/AFKs. If you are in more than one pred. If your preferences were being broken, please admin-help as well.", "Confirmation", "Okay", "Cancel")
if(confirm == "Okay")
for(var/O in pred.vore_organs)
var/datum/belly/CB = pred.vore_organs[O]
- CB.release_specific_contents(src)
+ CB.internal_contents -= src //Clean them if we can, otherwise it will get GC'd by the vore code later.
+ src.forceMove(get_turf(loc))
message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(pred)] (PC) ([pred ? "JMP" : "null"])")
//You're in a dogborg!
@@ -353,6 +391,19 @@
belly_target.nom_mob(prey, user)
user.update_icons()
+ // Flavor handling
+ var/flavor_message = ""
+ if(belly_target.can_taste && prey.vore_taste && (prey.vore_taste != ""))
+ flavor_message += "[prey.vore_taste]."
+ if(ishuman(prey))
+ var/mob/living/carbon/human/H = prey
+ if(H.touching.reagent_list.len) //Just the first one otherwise I'll go insane.
+ var/datum/reagent/R = H.touching.reagent_list[1]
+ flavor_message += " You also get the flavor of [R.taste_description] from something on them"
+
+ if(flavor_message != "")
+ src << "[prey] tastes of [flavor_message]."
+
// Inform Admins
if (pred == user)
msg_admin_attack("[key_name(pred)] ate [key_name(prey)]. ([pred ? "JMP" : "null"])")
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index dda25f84ba9..1f1e50b0b87 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -43,6 +43,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
//Actual preferences
var/digestable = 1
var/list/belly_prefs = list()
+ var/vore_taste
//Mechanically required
var/path
@@ -101,6 +102,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["digestable"] >> digestable
S["belly_prefs"] >> belly_prefs
+ S["vore_taste"] >> vore_taste
if(isnull(digestable))
digestable = 1
@@ -118,5 +120,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
S["digestable"] << digestable
S["belly_prefs"] << belly_prefs
+ S["vore_taste"] << vore_taste
return 1
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 16c8270fbc4..fa918a85ed5 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -6,6 +6,7 @@
#define BELLIES_NAME_MIN 2
#define BELLIES_NAME_MAX 12
#define BELLIES_DESC_MAX 1024
+#define FLAVOR_MAX 40
/mob/living/proc/insidePanel()
set name = "Vore Panel"
@@ -177,6 +178,10 @@
//Belly messages
dat += "
Belly Messages"
+ //Can belly taste?
+ dat += "
Can Taste:"
+ dat += " [selected.can_taste ? "Yes" : "No"]"
+
//Belly escapability
dat += "
Belly Interactions ([selected.escapable ? "On" : "Off"])"
if(selected.escapable)
@@ -216,6 +221,7 @@
//Under the last HR, save and stuff.
dat += "Save Prefs"
dat += "Refresh"
+ dat += "Set Flavor"
switch(user.digestable)
if(1)
@@ -537,6 +543,9 @@
if(href_list["b_soundtest"])
user << selected.vore_sound
+ if(href_list["b_tastes"])
+ selected.can_taste = !selected.can_taste
+
if(href_list["b_escapable"])
if(selected.escapable == 0) //Possibly escapable and special interactions.
selected.escapable = 1
@@ -620,6 +629,18 @@
else
user << "Virgo-specific preferences saved!"
+ 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)
+ new_flavor = readd_quotes(new_flavor)
+ if(length(new_flavor) > FLAVOR_MAX)
+ alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error")
+ return 0
+ user.vore_taste = new_flavor
+ else //Returned null
+ return 0
+
if(href_list["toggledg"])
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Don't abuse this button by toggling it back and forth to extend a scene or whatever, or you'll make the admins cry. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
switch(choice)