mirror of
https://github.com/VOREStation/VOREStation.git
synced 2026-08-30 07:28:53 +01:00
Add vore taste system
There's a setting on bellies (off by default except for the first belly you're ever given which is on by default) as to whether or not they can 'taste' prey. If so, and the prey has set their (literal) flavor text in their vore prefs (button at the bottom) you will be shown their taste when ingested into that belly. There's also a "Lick Someone" verb in IC that allows you to lick adjacent mobs to see what they taste like. Both system account for reagents splashed on the mob, so if you want to apply soy sauce to the akula before you eat them, you should be able to taste that as well. Just keep in mind those splashed reagents do dry up eventually, so don't take too long to eat them after that if you actually want to taste it.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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("<span class='warning'>[src] licks [tasted]!</span>","<span class='notice'>You lick [tasted]. They taste rather like [taste_message].</span>","<b>Slurp!</b>")
|
||||
|
||||
//
|
||||
// OOC Escape code for pref-breaking or AFK preds
|
||||
//
|
||||
@@ -353,6 +390,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 << "<span class='notice'>[prey] tastes of [flavor_message].</span>"
|
||||
|
||||
// Inform Admins
|
||||
if (pred == user)
|
||||
msg_admin_attack("[key_name(pred)] ate [key_name(prey)]. ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 += "<br><a href='?src=\ref[src];b_msgs=\ref[selected]'>Belly Messages</a>"
|
||||
|
||||
//Can belly taste?
|
||||
dat += "<br><a href='?src=\ref[src];b_tastes=\ref[selected]'>Can Taste:</a>"
|
||||
dat += " [selected.can_taste ? "Yes" : "No"]"
|
||||
|
||||
//Belly escapability
|
||||
dat += "<br><a href='?src=\ref[src];b_escapable=\ref[selected]'>Belly Interactions ([selected.escapable ? "On" : "Off"])</a>"
|
||||
if(selected.escapable)
|
||||
@@ -216,6 +221,7 @@
|
||||
//Under the last HR, save and stuff.
|
||||
dat += "<a href='?src=\ref[src];saveprefs=1'>Save Prefs</a>"
|
||||
dat += "<a href='?src=\ref[src];refresh=1'>Refresh</a>"
|
||||
dat += "<a href='?src=\ref[src];setflavor=1'>Set Flavor</a>"
|
||||
|
||||
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 << "<span class='notice'>Virgo-specific preferences saved!</span>"
|
||||
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user