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)