// // Vore management panel for players // /mob/living/proc/insidePanel() set name = "Vore Panel" set category = "Vore" var/datum/vore_look/picker_holder = new() picker_holder.loop = picker_holder picker_holder.selected = vore_organs[vore_selected] var/dat = picker_holder.gen_vui(src) picker_holder.popup = new(src, "insidePanel","Vore Panel", 400, 600, picker_holder) picker_holder.popup.set_content(dat) picker_holder.popup.open() // // Callback Handler for the Inside form // /datum/vore_look var/datum/belly/selected var/datum/browser/popup var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action. /datum/vore_look/Topic(href,href_list[]) if (vp_interact(href, href_list)) popup.set_content(gen_vui(usr)) usr << output(popup.get_content(), "insidePanel.browser") /datum/vore_look/proc/gen_vui(var/mob/living/user) var/dat if (is_vore_predator(user.loc)) var/mob/living/eater = user.loc var/datum/belly/inside_belly //This big block here figures out where the prey is inside_belly = check_belly(user) if(inside_belly) dat += "You are currently inside [eater]'s [inside_belly]!

" if(inside_belly.inside_flavor) dat += "[inside_belly.inside_flavor]

" if (inside_belly.internal_contents.len > 1) dat += "You can see the following around you:
" for (var/atom/movable/O in inside_belly.internal_contents) if(istype(O,/mob/living)) var/mob/living/M = O //That's just you if(M == user) continue //Anything else dat += "[O]" else dat += "You aren't inside anyone." dat += "
" dat += "
    " for(var/K in user.vore_organs) //Fuggin can't iterate over values var/datum/belly/B = user.vore_organs[K] if(B == selected) dat += "
  1. [B.name]" else dat += "
  2. [B.name]" var/spanstyle switch(B.digest_mode) if(DM_HOLD) spanstyle = "" if(DM_DIGEST) spanstyle = "color:red;" if(DM_DIGESTF) spanstyle = "color:purple;" if(DM_HEAL) spanstyle = "color:green;" dat += " ([B.internal_contents.len])
  3. " if(user.vore_organs.len < 10) dat += "
  4. New+
  5. " dat += "
" dat += "
" // Selected Belly (contents, configuration) if(!selected) dat += "No belly selected. Click one to select it." else if(selected.internal_contents.len > 0) dat += "Contents: " for(var/O in selected.internal_contents) dat += "[O]" //If there's more than one thing, add an [All] button if(selected.internal_contents.len > 1) dat += "\[All\]" dat += "
" //Belly Name Button dat += "Name:" dat += " '[selected.name]'" //Digest Mode Button dat += "
Belly Mode:" dat += " [selected.digest_mode]" //Belly verb dat += "
Vore Verb:" dat += " '[selected.vore_verb]'" //Inside flavortext dat += "
Flavor Text:" dat += " '[selected.inside_flavor]'" //Belly sound dat += "
Set Vore Sound" dat += "Test" //Belly messages dat += "
Belly Messages" //Delete button dat += "
Delete Belly" dat += "
" //Under the last HR, save and stuff. dat += "Save Prefs" dat += "Refresh" switch(user.digestable) if(1) dat += "Toggle Digestable" if(0) dat += "Toggle Digestable" switch(user.devourable) if(1) dat += "Toggle Devourable" if(0) dat += "Toggle Devourable" //Returns the dat html to the vore_look return dat /datum/vore_look/proc/vp_interact(href, href_list) var/mob/living/user = usr for(var/H in href_list) if(href_list["close"]) del(src) // Cleanup return if(href_list["outsidepick"]) var/tgt = locate(href_list["outsidepick"]) var/datum/belly/OB = locate(href_list["outsidebelly"]) var/intent = "Examine" if(istype(tgt,/mob/living)) var/mob/living/M = tgt intent = alert("What do you want to do to them?","Query","Examine","Help Out","Devour") switch(intent) if("Examine") //Examine a mob inside another mob M.examine(user) if("Help Out") //Help the inside-mob out user << "You begin to push [M] to freedom!" M << "[usr] begins to push you to freedom!" M.loc << "Someone is trying to escape from inside you!" sleep(50) if(prob(33)) OB.release_specific_contents(M) usr << "You manage to help [M] to safety!" M << "[user] pushes you free!" M.loc << "[M] forces free of the confines of your body!" else user << "[M] slips back down inside despite your efforts." M << " Even with [user]'s help, you slip back inside again." M.loc << "Your body efficiently shoves [M] back where they belong." if("Devour") //Eat the inside mob if(!user.vore_selected) user << "Pick a belly on yourself first!" return 1 var/datum/belly/TB = user.vore_organs[user.vore_selected] user << "You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!" M << "[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!" M.loc << "Someone inside you is eating someone else!" sleep(TB.nonhuman_prey_swallow_time) if((user in OB.internal_contents) && (M in OB.internal_contents)) user << "You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!" M << "[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!" M.loc << "Someone inside you has eaten someone else!" M.loc = user TB.nom_mob(M) OB.internal_contents -= M else if(istype(tgt,/obj/item)) var/obj/item/T = tgt intent = alert("What do you want to do to that?","Query","Examine","Use Hand") switch(intent) if("Examine") T.examine(user) if("Use Hand") if(user.stat) user << "You can't do that in your state!" return 1 user.ClickOn(T) sleep(5) //Seems to exit too fast for the panel to update if(href_list["insidepick"]) var/intent //Handle the [All] choice. Ugh inelegant. Someone make this pretty. if(href_list["pickall"]) intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all") switch(intent) if("Cancel") return 1 if("Eject all") if(user.stat) user << "You can't do that in your state!" return 1 selected.release_all_contents() playsound(user, 'sound/effects/splat.ogg', 50, 1) user.loc << "Everything is released from [user]!" if("Move all") if(user.stat) user << "You can't do that in your state!" return 1 var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" if(choice == "Cancel - Don't Move") return 1 else var/datum/belly/B = user.vore_organs[choice] for(var/atom/movable/tgt in selected.internal_contents) selected.internal_contents -= tgt B.internal_contents += tgt tgt << "You're squished from [user]'s [selected] to their [B]!" for(var/mob/hearer in range(1,user)) hearer << sound('sound/vore/squish2.ogg',volume=80) return 1 var/atom/movable/tgt = locate(href_list["insidepick"]) intent = "Examine" intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") switch(intent) if("Examine") tgt.examine(user) if("Eject") if(user.stat) user << "You can't do that in your state!" return 1 selected.release_specific_contents(tgt) playsound(user, 'sound/effects/splat.ogg', 50, 1) user.loc << "[tgt] is released from [user]!" if("Move") if(user.stat) user << "You can't do that in your state!" return 1 var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move" if(choice == "Cancel - Don't Move") return 1 else var/datum/belly/B = user.vore_organs[choice] selected.internal_contents -= tgt B.internal_contents += tgt tgt << "You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!" for(var/mob/hearer in range(1,user)) hearer << sound('sound/vore/squish2.ogg',volume=80) if(href_list["newbelly"]) if(user.vore_organs.len >= 10) return 1 var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) if(length(new_name) > 12 || length(new_name) < 2) usr << "Entered belly name is too long." return 0 if(new_name in user.vore_organs) usr << "No duplicate belly names, please." return 0 var/datum/belly/NB = new(user) NB.name = new_name NB.owner = user //might be the thing we all needed. user.vore_organs[new_name] = NB selected = NB if(href_list["bellypick"]) selected = locate(href_list["bellypick"]) user.vore_selected = selected.name if(href_list["b_name"]) var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null) if(length(new_name) > 12 || length(new_name) < 2) usr << "Entered belly name length invalid (must be longer than 2, shorter than 12)." return 0 if(new_name in user.vore_organs) usr << "No duplicate belly names, please." return 0 user.vore_organs[new_name] = selected user.vore_organs -= selected.name selected.name = new_name if(href_list["b_mode"]) var/list/menu_list = selected.digest_modes if(selected.digest_modes.len == 1) // Don't do anything return 1 if(selected.digest_modes.len == 2) // Just toggle... there's probably a more elegant way to do this... var/index = selected.digest_modes.Find(selected.digest_mode) switch(index) if(1) selected.digest_mode = selected.digest_modes[2] if(2) selected.digest_mode = selected.digest_modes[1] else selected.digest_mode = input("Choose Mode (currently [selected.digest_mode])") in menu_list if(href_list["b_desc"]) var/new_desc = html_encode(input(usr,"Belly Description (1024 char limit):","New Description",selected.inside_flavor) as message|null) new_desc = readd_quotes(new_desc) if(length(new_desc) > 1024) usr << "Entered belly desc too long. 1024 character limit." return FALSE selected.inside_flavor = new_desc if(href_list["b_msgs"]) var/list/messages = list( "Digest Message (to prey)", "Digest Message (to you)", "Struggle Message (outside)", "Struggle Message (inside)", "Examine Message (when full)", "Reset All To Default", "Cancel - No Changes" ) alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.") var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") in messages var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name." switch(choice) if("Digest Message (to prey)") var/new_message = input(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",selected.get_messages("dmp")) as message if(new_message) selected.set_messages(new_message,"dmp") if("Digest Message (to you)") var/new_message = input(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",selected.get_messages("dmo")) as message if(new_message) selected.set_messages(new_message,"dmo") if("Struggle Message (outside)") var/new_message = input(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",selected.get_messages("smo")) as message if(new_message) selected.set_messages(new_message,"smo") if("Struggle Message (inside)") var/new_message = input(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",selected.get_messages("smi")) as message if(new_message) selected.set_messages(new_message,"smi") if("Examine Message (when full)") var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging'). Do not use %pred or %prey in this type."+help,"Examine Message (when full)",selected.get_messages("em")) as message if(new_message) selected.set_messages(new_message,"em") if("Reset All To Default") var/confirm = alert(user,"This will delete any custom messages. Are you sure?","Confirmation","DELETE","Cancel") if(confirm == "DELETE") selected.digest_messages_prey = initial(selected.digest_messages_prey) selected.digest_messages_owner = initial(selected.digest_messages_owner) selected.struggle_messages_outside = initial(selected.struggle_messages_outside) selected.struggle_messages_inside = initial(selected.struggle_messages_inside) if("Cancel - No Changes") return 1 if(href_list["b_verb"]) var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null) if(length(new_verb) > 12 || length(new_verb) < 2) usr << "Entered verb length invalid (must be longer than 2, shorter than 12)." return FALSE selected.vore_verb = new_verb if(href_list["b_sound"]) var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") in vore_sounds + "Cancel - No Changes" if(choice == "Cancel") return 1 selected.vore_sound = vore_sounds[choice] if(href_list["b_soundtest"]) user << selected.vore_sound if(href_list["b_del"]) if(selected.internal_contents.len) usr << "Can't delete bellies with contents!" else if(selected.immutable) usr << "This belly is marked as undeletable." else if(user.vore_organs.len == 1) usr << "You must have at least one belly." else var/alert = alert("Are you sure you want to delete [selected]?","Confirmation","Delete","Cancel") if(alert == "Delete" && !selected.internal_contents.len) user.vore_organs -= selected.name user.vore_organs.Remove(selected) selected = user.vore_organs[1] user.vore_selected = user.vore_organs[1] if(href_list["saveprefs"]) if(user.save_vore_prefs()) user << "Belly Preferences saved!" else user << "ERROR: Belly Preferences were not saved!" log_admin("Could not save vore prefs on USER: [user].") if(href_list["toggledg"]) var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") switch(choice) if("Cancel") return 1 if("Allow Digestion") user.digestable = 1 if("Prevent Digestion") user.digestable = 0 if(user.client.prefs_vr) user.client.prefs_vr.digestable = user.digestable if(href_list["toggledvor"]) var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [user.devourable ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") switch(choice) if("Cancel") return 1 if("Allow Devourment") user.devourable = 1 if("Prevent Devourment") user.devourable = 0 if(user.client.prefs_vr) user.client.prefs_vr.devourable = user.devourable //Refresh when interacted with, returning 1 makes vore_look.Topic update return 1