mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2025-12-12 11:13:16 +00:00
VS: Rewrites basically all of how bellies work
And cleans up a ton of stuff.
This commit is contained in:
1
code/_macros_vr.dm
Normal file
1
code/_macros_vr.dm
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#define isbelly(A) istype(A, /obj/belly)
|
||||||
41
code/controllers/subsystems/bellies_vr.dm
Normal file
41
code/controllers/subsystems/bellies_vr.dm
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
#define SSBELLIES_PROCESSED 1
|
||||||
|
#define SSBELLIES_IGNORED 2
|
||||||
|
|
||||||
|
//
|
||||||
|
// Bellies subsystem - Process vore bellies
|
||||||
|
//
|
||||||
|
|
||||||
|
SUBSYSTEM_DEF(bellies)
|
||||||
|
name = "Bellies"
|
||||||
|
priority = 5
|
||||||
|
wait = 1 SECONDS
|
||||||
|
flags = SS_KEEP_TIMING|SS_NO_INIT
|
||||||
|
runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME
|
||||||
|
|
||||||
|
var/static/list/belly_list = list()
|
||||||
|
var/list/currentrun = list()
|
||||||
|
var/ignored_bellies = 0
|
||||||
|
|
||||||
|
/datum/controller/subsystem/bellies/stat_entry()
|
||||||
|
..("#: [belly_list.len] | P: [ignored_bellies]")
|
||||||
|
|
||||||
|
/datum/controller/subsystem/bellies/fire(resumed = 0)
|
||||||
|
if (!resumed)
|
||||||
|
ignored_bellies = 0
|
||||||
|
src.currentrun = belly_list.Copy()
|
||||||
|
|
||||||
|
//cache for sanic speed (lists are references anyways)
|
||||||
|
var/list/currentrun = src.currentrun
|
||||||
|
var/times_fired = src.times_fired
|
||||||
|
while(currentrun.len)
|
||||||
|
var/obj/belly/B = currentrun[currentrun.len]
|
||||||
|
currentrun.len--
|
||||||
|
|
||||||
|
if(QDELETED(B))
|
||||||
|
belly_list -= B
|
||||||
|
else
|
||||||
|
if(B.process_belly(times_fired,wait) == SSBELLIES_IGNORED)
|
||||||
|
ignored_bellies++
|
||||||
|
|
||||||
|
if (MC_TICK_CHECK)
|
||||||
|
return
|
||||||
@@ -1,22 +1,13 @@
|
|||||||
/datum/teleport/proc/try_televore()
|
/datum/teleport/proc/try_televore()
|
||||||
var/datum/belly/target_belly
|
//Destination is in a belly
|
||||||
|
if(isbelly(destination.loc))
|
||||||
|
var/obj/belly/B = destination.loc
|
||||||
|
|
||||||
//Destination is a living thing
|
teleatom.forceMove(get_turf(B)) //So we can splash the sound and sparks and everything.
|
||||||
target_belly = check_belly(destination)
|
|
||||||
|
|
||||||
//Destination has a living thing on it
|
|
||||||
if(!target_belly)
|
|
||||||
for(var/mob/living/M in get_turf(destination))
|
|
||||||
if(M.vore_organs.len)
|
|
||||||
var/I = M.vore_organs[1]
|
|
||||||
target_belly = M.vore_organs[I]
|
|
||||||
|
|
||||||
if(target_belly)
|
|
||||||
teleatom.forceMove(destination.loc)
|
|
||||||
playSpecials(destination,effectout,soundout)
|
playSpecials(destination,effectout,soundout)
|
||||||
target_belly.internal_contents |= teleatom
|
teleatom.forceMove(B)
|
||||||
playsound(destination, target_belly.vore_sound, 100, 1)
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
//No fun!
|
//No fun!
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -12,9 +12,9 @@
|
|||||||
var/livingprey = 0
|
var/livingprey = 0
|
||||||
var/objectprey = 0
|
var/objectprey = 0
|
||||||
|
|
||||||
for(var/I in H.vore_organs)
|
for(var/belly in H.vore_organs)
|
||||||
var/datum/belly/B = H.vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
for(var/C in B.internal_contents)
|
for(var/C in B)
|
||||||
if(ishuman(C))
|
if(ishuman(C))
|
||||||
humanprey++
|
humanprey++
|
||||||
else if(isliving(C))
|
else if(isliving(C))
|
||||||
|
|||||||
@@ -12,10 +12,7 @@
|
|||||||
if(H.species.trashcan == 1)
|
if(H.species.trashcan == 1)
|
||||||
playsound(H.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
playsound(H.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||||
user.drop_item()
|
user.drop_item()
|
||||||
var/belly = H.vore_selected
|
forceMove(H.vore_selected)
|
||||||
var/datum/belly/selected = H.vore_organs[belly]
|
|
||||||
forceMove(H)
|
|
||||||
selected.internal_contents |= src
|
|
||||||
to_chat(H, "<span class='notice'>You can taste the flavor of garbage. Wait what?</span>")
|
to_chat(H, "<span class='notice'>You can taste the flavor of garbage. Wait what?</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -24,10 +21,7 @@
|
|||||||
if(R.module.type == /obj/item/weapon/robot_module/robot/scrubpup) // You can now feed the trash borg yay.
|
if(R.module.type == /obj/item/weapon/robot_module/robot/scrubpup) // You can now feed the trash borg yay.
|
||||||
playsound(R.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
playsound(R.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
|
||||||
user.drop_item()
|
user.drop_item()
|
||||||
var/belly = R.vore_selected
|
forceMove(R.vore_selected)
|
||||||
var/datum/belly/selected = R.vore_organs[belly]
|
|
||||||
forceMove(R)
|
|
||||||
selected.internal_contents |= src // Too many hoops and obstacles to stick it into the sleeper module.
|
|
||||||
R.visible_message("<span class='warning'>[user] feeds [R] with [src]!</span>")
|
R.visible_message("<span class='warning'>[user] feeds [R] with [src]!</span>")
|
||||||
return
|
return
|
||||||
..()
|
..()
|
||||||
@@ -18,13 +18,6 @@
|
|||||||
src.dump_contents()
|
src.dump_contents()
|
||||||
qdel(src)
|
qdel(src)
|
||||||
|
|
||||||
/obj/structure/closet/secure_closet/egg/dump_contents()
|
|
||||||
var/datum/belly/belly = check_belly(src)
|
|
||||||
if(belly)
|
|
||||||
for(var/atom/movable/M in src)
|
|
||||||
belly.internal_contents |= M
|
|
||||||
return ..()
|
|
||||||
|
|
||||||
/obj/structure/closet/secure_closet/egg/unathi
|
/obj/structure/closet/secure_closet/egg/unathi
|
||||||
name = "unathi egg"
|
name = "unathi egg"
|
||||||
desc = "Some species of Unathi apparently lay soft-shelled eggs!"
|
desc = "Some species of Unathi apparently lay soft-shelled eggs!"
|
||||||
|
|||||||
@@ -86,7 +86,18 @@ var/list/_client_preferences_by_type
|
|||||||
preference_mob.stop_all_music()
|
preference_mob.stop_all_music()
|
||||||
else
|
else
|
||||||
preference_mob.update_music()
|
preference_mob.update_music()
|
||||||
|
//VOREStation Add - Need to put it here because it should be ordered riiiight here.
|
||||||
|
/datum/client_preference/eating_noises
|
||||||
|
description = "Eating Noises"
|
||||||
|
key = "EATING_NOISES"
|
||||||
|
enabled_description = "Noisy"
|
||||||
|
disabled_description = "Silent"
|
||||||
|
/datum/client_preference/digestion_noises
|
||||||
|
description = "Digestion Noises"
|
||||||
|
key = "DIGEST_NOISES"
|
||||||
|
enabled_description = "Noisy"
|
||||||
|
disabled_description = "Silent"
|
||||||
|
//VOREStation Add End
|
||||||
/datum/client_preference/ghost_ears
|
/datum/client_preference/ghost_ears
|
||||||
description ="Ghost ears"
|
description ="Ghost ears"
|
||||||
key = "CHAT_GHOSTEARS"
|
key = "CHAT_GHOSTEARS"
|
||||||
|
|||||||
@@ -1,21 +1,5 @@
|
|||||||
/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this?
|
/obj/item/clothing/var/hides_bulges = FALSE // OwO wats this?
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/show_pudge()
|
|
||||||
//A uniform could hide it.
|
|
||||||
if(istype(w_uniform,/obj/item/clothing))
|
|
||||||
var/obj/item/clothing/under = w_uniform
|
|
||||||
if(under.hides_bulges)
|
|
||||||
return FALSE
|
|
||||||
|
|
||||||
//We return as soon as we find one, no need for 'else' really.
|
|
||||||
if(istype(wear_suit,/obj/item/clothing))
|
|
||||||
var/obj/item/clothing/suit = wear_suit
|
|
||||||
if(suit.hides_bulges)
|
|
||||||
return FALSE
|
|
||||||
|
|
||||||
|
|
||||||
return TRUE
|
|
||||||
|
|
||||||
/obj/item/clothing/under/permit
|
/obj/item/clothing/under/permit
|
||||||
name = "public nudity permit"
|
name = "public nudity permit"
|
||||||
desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide."
|
desc = "This permit entitles the bearer to conduct their duties without a uniform. Normally issued to furred crewmembers or those with nothing to hide."
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
use_me = 0 //Can't use the me verb, it's a freaking immobile brain
|
use_me = 0 //Can't use the me verb, it's a freaking immobile brain
|
||||||
icon = 'icons/obj/surgery.dmi'
|
icon = 'icons/obj/surgery.dmi'
|
||||||
icon_state = "brain1"
|
icon_state = "brain1"
|
||||||
|
no_vore = TRUE //VOREStation Edit - PLEASE. lol.
|
||||||
|
|
||||||
New()
|
New()
|
||||||
var/datum/reagents/R = new/datum/reagents(1000)
|
var/datum/reagents/R = new/datum/reagents(1000)
|
||||||
|
|||||||
@@ -107,17 +107,6 @@
|
|||||||
message = "<span class='warning'>[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!</span>\n"
|
message = "<span class='warning'>[t_He] [t_is] so absolutely stuffed that you aren't sure how it's possible to move. [t_He] can't seem to swell any bigger. The surface of [t_his] belly looks sorely strained!</span>\n"
|
||||||
return message
|
return message
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/examine_bellies()
|
|
||||||
if(!show_pudge()) //Some clothing or equipment can hide this.
|
|
||||||
return ""
|
|
||||||
|
|
||||||
var/message = ""
|
|
||||||
for (var/I in src.vore_organs)
|
|
||||||
var/datum/belly/B = vore_organs[I]
|
|
||||||
message += B.get_examine_msg()
|
|
||||||
|
|
||||||
return message
|
|
||||||
|
|
||||||
//For OmniHUD records access for appropriate models
|
//For OmniHUD records access for appropriate models
|
||||||
/proc/hasHUD_vr(mob/living/carbon/human/H, hudtype)
|
/proc/hasHUD_vr(mob/living/carbon/human/H, hudtype)
|
||||||
if(H.nif)
|
if(H.nif)
|
||||||
|
|||||||
@@ -66,7 +66,8 @@
|
|||||||
list_body = null
|
list_body = null
|
||||||
LAZYCLEARLIST(list_huds)
|
LAZYCLEARLIST(list_huds)
|
||||||
list_huds = null
|
list_huds = null
|
||||||
if(nif) qdel_null(nif) //VOREStation Add
|
qdel_null(nif) //VOREStation Add
|
||||||
|
qdel_null_list(vore_organs) //VOREStation Add
|
||||||
return ..()
|
return ..()
|
||||||
|
|
||||||
/mob/living/carbon/human/Stat()
|
/mob/living/carbon/human/Stat()
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
/mob/living/carbon/human/dummy
|
||||||
|
no_vore = TRUE //Dummies don't need bellies.
|
||||||
|
|
||||||
/mob/living/carbon/human/sergal/New(var/new_loc)
|
/mob/living/carbon/human/sergal/New(var/new_loc)
|
||||||
h_style = "Sergal Plain"
|
h_style = "Sergal Plain"
|
||||||
..(new_loc, "Sergal")
|
..(new_loc, "Sergal")
|
||||||
|
|||||||
@@ -606,9 +606,6 @@
|
|||||||
C.absorbing_prey = 0
|
C.absorbing_prey = 0
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/succubus_drain_finalize()
|
/mob/living/carbon/human/proc/succubus_drain_finalize()
|
||||||
set name = "Drain/Feed Finalization"
|
set name = "Drain/Feed Finalization"
|
||||||
set desc = "Toggle to allow for draining to be prolonged. Turn this on to make it so prey will be knocked out/die while being drained, or you will feed yourself to the prey's selected stomach if you're feeding them. Can be toggled at any time."
|
set desc = "Toggle to allow for draining to be prolonged. Turn this on to make it so prey will be knocked out/die while being drained, or you will feed yourself to the prey's selected stomach if you're feeding them. Can be toggled at any time."
|
||||||
@@ -618,110 +615,134 @@
|
|||||||
C.drain_finalized = !C.drain_finalized
|
C.drain_finalized = !C.drain_finalized
|
||||||
to_chat(C, "<span class='notice'>You will [C.drain_finalized?"now":"not"] finalize draining/feeding.</span>")
|
to_chat(C, "<span class='notice'>You will [C.drain_finalized?"now":"not"] finalize draining/feeding.</span>")
|
||||||
|
|
||||||
/mob/living/carbon/human/proc/shred_limb() //If you're looking at this, nothing but pain and suffering lies below.
|
|
||||||
|
//Test to see if we can shred a mob. Some child override needs to pass us a target. We'll return it if you can.
|
||||||
|
/mob/living/var/vore_shred_time = 45 SECONDS
|
||||||
|
/mob/living/proc/can_shred(var/mob/living/carbon/human/target)
|
||||||
|
//Needs to have organs to be able to shred them.
|
||||||
|
if(!istype(target))
|
||||||
|
to_chat(src,"<span class='warning'>You can't shred that type of creature.</span>")
|
||||||
|
return FALSE
|
||||||
|
//Needs to be capable (replace with incapacitated call?)
|
||||||
|
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
||||||
|
to_chat(src,"<span class='warning'>You cannot do that in your current state!</span>")
|
||||||
|
return FALSE
|
||||||
|
//Needs to be adjacent, at the very least.
|
||||||
|
if(!Adjacent(target))
|
||||||
|
to_chat(src,"<span class='warning'>You must be next to your target.</span>")
|
||||||
|
return FALSE
|
||||||
|
//Cooldown on abilities
|
||||||
|
if(last_special > world.time)
|
||||||
|
to_chat(src,"<span class='warning'>You can't perform an ability again so soon!</span>")
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
return target
|
||||||
|
|
||||||
|
//Human test for shreddability, returns the mob if they can be shredded.
|
||||||
|
/mob/living/carbon/human/vore_shred_time = 10 SECONDS
|
||||||
|
/mob/living/carbon/human/can_shred()
|
||||||
|
//Humans need a grab
|
||||||
|
var/obj/item/weapon/grab/G = get_active_hand()
|
||||||
|
if(!istype(G))
|
||||||
|
to_chat(src,"<span class='warning'>You have to have a very strong grip on someone first!</span>")
|
||||||
|
return FALSE
|
||||||
|
if(G.state != GRAB_NECK)
|
||||||
|
to_chat(src,"<span class='warning'>You must have a tighter grip to severely damage this creature!</span>")
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
return ..(G.affecting)
|
||||||
|
|
||||||
|
//PAIs don't need a grab or anything
|
||||||
|
/mob/living/silicon/pai/can_shred(var/mob/living/carbon/human/target)
|
||||||
|
if(!target)
|
||||||
|
var/list/choices = list()
|
||||||
|
for(var/mob/living/carbon/human/M in oviewers(1))
|
||||||
|
choices += M
|
||||||
|
|
||||||
|
if(!choices.len)
|
||||||
|
to_chat(src,"<span class='warning'>There's nobody nearby to use this on.</span>")
|
||||||
|
|
||||||
|
target = input(src,"Who do you wish to target?","Damage/Remove Prey's Organ") as null|anything in choices
|
||||||
|
if(!istype(target))
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
return ..(target)
|
||||||
|
|
||||||
|
/mob/living/proc/shred_limb()
|
||||||
set name = "Damage/Remove Prey's Organ"
|
set name = "Damage/Remove Prey's Organ"
|
||||||
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
|
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
|
||||||
set category = "Abilities"
|
set category = "Abilities"
|
||||||
if(!ishuman(src))
|
|
||||||
return //If you're not a human you don't have permission to do this.
|
|
||||||
|
|
||||||
if(last_special > world.time)
|
//can_shred() will return a mob we can shred, if we can shred any.
|
||||||
|
var/mob/living/carbon/human/T = can_shred()
|
||||||
|
if(!istype(T))
|
||||||
|
return //Silent, because can_shred does messages.
|
||||||
|
|
||||||
|
//Let them pick any of the target's external organs
|
||||||
|
var/obj/item/organ/external/T_ext = input(src,"What do you wish to severely damage?") as null|anything in T.organs //D for destroy.
|
||||||
|
if(!T_ext) //Picking something here is critical.
|
||||||
return
|
return
|
||||||
|
if(T_ext.vital)
|
||||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
if(alert("Are you sure you wish to severely damage their [T_ext]? It will likely kill [T]...",,"Yes", "No") != "Yes")
|
||||||
to_chat(src, "You cannot severely damage anything in your current state!")
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/C = src
|
|
||||||
var/obj/item/weapon/grab/G = src.get_active_hand()
|
|
||||||
if(!istype(G))
|
|
||||||
to_chat(C, "<span class='warning'>We must be grabbing a creature in our active hand to severely damage them.</span>")
|
|
||||||
return
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/T = G.affecting
|
|
||||||
if(!istype(T)) //Are they a mob?
|
|
||||||
to_chat(C, "<span class='warning'>\The [T] is not able to be severely damaged!</span>")
|
|
||||||
return
|
|
||||||
|
|
||||||
if(G.state != GRAB_NECK)
|
|
||||||
to_chat(C, "<span class='warning'>You must have a tighter grip to severely damage this creature.</span>")
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!T || !C || C.stat)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(!Adjacent(T))
|
|
||||||
return
|
|
||||||
|
|
||||||
var/list/choices2 = list()
|
|
||||||
for(var/obj/item/organ/O in T.organs) //External organs
|
|
||||||
choices2 += O
|
|
||||||
|
|
||||||
var/obj/item/organ/external/D = input(C,"What do you wish to severely damage?") as null|anything in choices2 //D for destroy.
|
|
||||||
if(D.vital)
|
|
||||||
if(alert("Are you sure you wish to severely damage their [D]? It most likely will kill the prey...",,"Yes", "No") != "Yes")
|
|
||||||
return //If they reconsider, don't continue.
|
return //If they reconsider, don't continue.
|
||||||
|
|
||||||
var/list/choices3 = list()
|
//Any internal organ, if there are any
|
||||||
for(var/obj/item/organ/internal/I in D.internal_organs) //Look for the internal organ in the organ being shreded.
|
var/obj/item/organ/internal/T_int = input(src,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'") as null|anything in T_ext.internal_organs
|
||||||
choices3 += I
|
if(T_int && T_int.vital)
|
||||||
|
if(alert("Are you sure you wish to severely damage their [T_int]? It will likely kill [T]...",,"Yes", "No") != "Yes")
|
||||||
|
return //If they reconsider, don't continue.
|
||||||
|
|
||||||
var/obj/item/organ/internal/P = input(C,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'") as null|anything in choices3
|
//And a belly, if they want
|
||||||
|
var/obj/belly/B = input(src,"Do you wish to swallow the organ if you tear if out? If not, click 'cancel'") as null|anything in vore_organs
|
||||||
|
|
||||||
var/eat_limb = input(C,"Do you wish to swallow the organ if you tear if out? If so, select which stomach.") as null|anything in C.vore_organs //EXTREMELY EFFICIENT
|
if(can_shred(T) != T)
|
||||||
|
to_chat(src,"<span class='warning'>Looks like you lost your chance...</span>")
|
||||||
if(last_special > world.time)
|
|
||||||
return
|
return
|
||||||
|
|
||||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
last_special = world.time + vore_shred_time
|
||||||
to_chat(C, "You cannot shred in your current state.")
|
visible_message("<span class='danger'>[src] appears to be preparing to do something to [T]!</span>") //Let everyone know that bad times are ahead
|
||||||
|
|
||||||
|
if(do_after(src, vore_shred_time, T)) //Ten seconds. You have to be in a neckgrab for this, so you're already in a bad position.
|
||||||
|
if(can_shred(T) != T)
|
||||||
|
to_chat(src,"<span class='warning'>Looks like you lost your chance...</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
last_special = world.time + 100 //10 seconds.
|
//Removing an internal organ
|
||||||
C.visible_message("<font color='red'><b>[C] appears to be preparing to do something to [T]!</b></font>") //Let everyone know that bad times are head
|
if(T_int && T_int.damage >= 25) //Internal organ and it's been severely damaged
|
||||||
|
T.apply_damage(15, BRUTE, T_ext) //Damage the external organ they're going through.
|
||||||
if(do_after(C, 100, T)) //Ten seconds. You have to be in a neckgrab for this, so you're already in a bad position.
|
T_int.removed()
|
||||||
if(!Adjacent(T)) return
|
if(B)
|
||||||
if(P && P.damage >= 25) //Internal organ and it's been severely damage
|
T_int.forceMove(B) //Move to pred's gut
|
||||||
T.apply_damage(15, BRUTE, D) //Damage the external organ they're going through.
|
visible_message("<span class='danger'>[src] severely damages [T_int.name] of [T]!</span>")
|
||||||
P.removed()
|
|
||||||
P.forceMove(T.loc) //Move to where prey is.
|
|
||||||
log_and_message_admins("tore out [P] of [T].", C)
|
|
||||||
if(eat_limb)
|
|
||||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
|
||||||
P.forceMove(C) //Move to pred's gut
|
|
||||||
S.internal_contents |= P //Add to pred's gut.
|
|
||||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") // Same as below, but (pred) damages the (right hand) of (person)
|
|
||||||
to_chat(C, "[P] of [T] moves into your [S]!") //Quietly eat their internal organ! Comes out "The (right hand) of (person) moves into your (stomach)
|
|
||||||
playsound(C, S.vore_sound, 70, 1)
|
|
||||||
log_and_message_admins("tore out and ate [P] of [T].", C)
|
|
||||||
else
|
else
|
||||||
log_and_message_admins("tore out [P] of [T].", C)
|
T_int.forceMove(T.loc)
|
||||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T], resulting in their [P] coming out!</b></font>")
|
visible_message("<span class='danger'>[src] severely damages [T_ext.name] of [T], resulting in their [T_int.name] coming out!</span>","<span class='warning'>You tear out [T]'s [T_int.name]!</span>")
|
||||||
else if(!P && (D.damage >= 25 || D.brute_dam >= 25)) //Not targeting an internal organ & external organ has been severely damaged already.
|
|
||||||
D.droplimb(1,DROPLIMB_EDGE) //Clean cut so it doesn't kill the prey completely.
|
//Removing an external organ
|
||||||
if(D.cannot_amputate) //Is it groin/chest? You can't remove those.
|
else if(!T_int && (T_ext.damage >= 25 || T_ext.brute_dam >= 25))
|
||||||
T.apply_damage(25, BRUTE, D)
|
T_ext.droplimb(1,DROPLIMB_EDGE) //Clean cut so it doesn't kill the prey completely.
|
||||||
C.visible_message("<font color='red'><b>[C] severely damage [T]'s [D]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
|
||||||
log_and_message_admins("shreded [T]'s [D].", C)
|
//Is it groin/chest? You can't remove those.
|
||||||
return
|
if(T_ext.cannot_amputate)
|
||||||
if(eat_limb)
|
T.apply_damage(25, BRUTE, T_ext)
|
||||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
visible_message("<span class='danger'>[src] severely damages [T]'s [T_ext.name]!</span>")
|
||||||
D.forceMove(C) //Move to pred's gut
|
else if(B)
|
||||||
S.internal_contents |= D //Add to pred's gut.
|
T_ext.forceMove(B)
|
||||||
C.visible_message("<span class='warning'>[C] swallows [D] of [T] into their [S]!</span>","You swallow [D] of [T]!")
|
visible_message("<span class='warning'>[src] swallows [T]'s [T_ext.name] into their [lowertext(B.name)]!</span>")
|
||||||
playsound(C, S.vore_sound, 70, 1)
|
|
||||||
to_chat(C, "Their [D] moves into your [S]!")
|
|
||||||
log_and_message_admins("tore off and ate [D] of [T].", C)
|
|
||||||
else
|
else
|
||||||
C.visible_message("<span class='warning'>[C] tears off [D] of [T]!</span>","You tear out [D] of [T]!") //Will come out "You tear out (the right foot) of (person)
|
T_ext.forceMove(T.loc)
|
||||||
log_and_message_admins("tore off [T]'s [D].", C)
|
visible_message("<span class='warning'>[src] tears off [T]'s [T_ext.name]!</span>","<span class='warning'>You tear off [T]'s [T_ext.name]!</span>")
|
||||||
else //Not targeting an internal organ w/ > 25 damage , and the limb doesn't have < 25 damage.
|
|
||||||
if(P)
|
//Not targeting an internal organ w/ > 25 damage , and the limb doesn't have < 25 damage.
|
||||||
P.damage = 25 //Internal organs can only take damage, not brute damage.
|
else
|
||||||
T.apply_damage(25, BRUTE, D)
|
if(T_int)
|
||||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
T_int.damage = 25 //Internal organs can only take damage, not brute damage.
|
||||||
log_and_message_admins("shreded [D] of [T].", C)
|
T.apply_damage(25, BRUTE, T_ext)
|
||||||
|
visible_message("<span class='danger'>[src] severely damages [T]'s [T_ext.name]!</span>")
|
||||||
|
|
||||||
|
src.attack_log += text("\[[time_stamp()]\] <font color='orange'>Shred_limb'd [T.real_name] ([T.ckey])</font>")
|
||||||
|
T.attack_log += text("\[[time_stamp()]\] <font color='red'>[src.real_name] ([src.ckey]) shred_limb'd me</font>")
|
||||||
|
msg_admin_attack("[src.real_name] ([src.ckey]) shredded (shred_limb) [T.real_name] ([T.ckey]) (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[src.x];Y=[src.y];Z=[src.z]'>JMP</a>)")
|
||||||
|
|
||||||
/mob/living/proc/flying_toggle()
|
/mob/living/proc/flying_toggle()
|
||||||
set name = "Toggle Flight"
|
set name = "Toggle Flight"
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
/mob/living/carbon/human/proc/succubus_drain_finalize,
|
/mob/living/carbon/human/proc/succubus_drain_finalize,
|
||||||
/mob/living/carbon/human/proc/succubus_drain_lethal,
|
/mob/living/carbon/human/proc/succubus_drain_lethal,
|
||||||
/mob/living/carbon/human/proc/bloodsuck,
|
/mob/living/carbon/human/proc/bloodsuck,
|
||||||
/mob/living/carbon/human/proc/shred_limb,
|
/mob/living/proc/shred_limb,
|
||||||
/mob/living/proc/flying_toggle,
|
/mob/living/proc/flying_toggle,
|
||||||
/mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits.
|
/mob/living/proc/start_wings_hovering) //Xenochimera get all the special verbs since they can't select traits.
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
spawn_flags = SPECIES_CAN_JOIN
|
spawn_flags = SPECIES_CAN_JOIN
|
||||||
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
appearance_flags = HAS_HAIR_COLOR | HAS_LIPS | HAS_UNDERWEAR | HAS_SKIN_COLOR | HAS_EYE_COLOR
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
flesh_color = "#AFA59E"
|
flesh_color = "#AFA59E"
|
||||||
base_color = "#777777"
|
base_color = "#777777"
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
secondary_langs = list(LANGUAGE_SKRELLIAN)
|
secondary_langs = list(LANGUAGE_SKRELLIAN)
|
||||||
name_language = LANGUAGE_SKRELLIAN
|
name_language = LANGUAGE_SKRELLIAN
|
||||||
color_mult = 1
|
color_mult = 1
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
min_age = 18
|
min_age = 18
|
||||||
max_age = 80
|
max_age = 80
|
||||||
@@ -120,7 +120,7 @@
|
|||||||
secondary_langs = list(LANGUAGE_BIRDSONG)
|
secondary_langs = list(LANGUAGE_BIRDSONG)
|
||||||
name_language = LANGUAGE_BIRDSONG
|
name_language = LANGUAGE_BIRDSONG
|
||||||
color_mult = 1
|
color_mult = 1
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb,/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering)
|
inherent_verbs = list(/mob/living/proc/shred_limb,/mob/living/proc/flying_toggle,/mob/living/proc/start_wings_hovering)
|
||||||
|
|
||||||
min_age = 18
|
min_age = 18
|
||||||
max_age = 80
|
max_age = 80
|
||||||
@@ -183,7 +183,7 @@
|
|||||||
"You feel uncomfortably warm.",
|
"You feel uncomfortably warm.",
|
||||||
"Your overheated skin itches."
|
"Your overheated skin itches."
|
||||||
)
|
)
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
/datum/species/fl_zorren
|
/datum/species/fl_zorren
|
||||||
name = "Flatland Zorren"
|
name = "Flatland Zorren"
|
||||||
@@ -215,7 +215,7 @@
|
|||||||
flesh_color = "#AFA59E"
|
flesh_color = "#AFA59E"
|
||||||
base_color = "#333333"
|
base_color = "#333333"
|
||||||
color_mult = 1
|
color_mult = 1
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
heat_discomfort_strings = list(
|
heat_discomfort_strings = list(
|
||||||
"Your fur prickles in the heat.",
|
"Your fur prickles in the heat.",
|
||||||
@@ -241,7 +241,7 @@
|
|||||||
// gluttonous = 1
|
// gluttonous = 1
|
||||||
num_alternate_languages = 3
|
num_alternate_languages = 3
|
||||||
color_mult = 1
|
color_mult = 1
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
|
blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
|
||||||
dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \
|
dual-star Vazzend system. Their politically de-centralized society and independent natures have led them to become a species and \
|
||||||
@@ -295,7 +295,7 @@
|
|||||||
"You feel uncomfortably warm.",
|
"You feel uncomfortably warm.",
|
||||||
"Your chitin feels hot."
|
"Your chitin feels hot."
|
||||||
)
|
)
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
/datum/species/unathi
|
/datum/species/unathi
|
||||||
spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled.
|
spawn_flags = SPECIES_CAN_JOIN //Species_can_join is the only spawn flag all the races get, so that none of them will be whitelist only if whitelist is enabled.
|
||||||
@@ -304,7 +304,7 @@
|
|||||||
tail_animation = 'icons/mob/species/unathi/tail_vr.dmi'
|
tail_animation = 'icons/mob/species/unathi/tail_vr.dmi'
|
||||||
color_mult = 1
|
color_mult = 1
|
||||||
min_age = 18
|
min_age = 18
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
/datum/species/tajaran
|
/datum/species/tajaran
|
||||||
spawn_flags = SPECIES_CAN_JOIN
|
spawn_flags = SPECIES_CAN_JOIN
|
||||||
@@ -314,7 +314,7 @@
|
|||||||
color_mult = 1
|
color_mult = 1
|
||||||
min_age = 18
|
min_age = 18
|
||||||
gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm
|
gluttonous = 0 //Moving this here so I don't have to fix this conflict every time polaris glances at station.dm
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
/datum/species/skrell
|
/datum/species/skrell
|
||||||
spawn_flags = SPECIES_CAN_JOIN
|
spawn_flags = SPECIES_CAN_JOIN
|
||||||
@@ -340,7 +340,7 @@
|
|||||||
inherent_verbs = list(
|
inherent_verbs = list(
|
||||||
/mob/living/carbon/human/proc/sonar_ping,
|
/mob/living/carbon/human/proc/sonar_ping,
|
||||||
/mob/living/proc/hide,
|
/mob/living/proc/hide,
|
||||||
/mob/living/carbon/human/proc/shred_limb,
|
/mob/living/proc/shred_limb,
|
||||||
/mob/living/proc/toggle_pass_table
|
/mob/living/proc/toggle_pass_table
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -361,7 +361,7 @@
|
|||||||
min_age = 18
|
min_age = 18
|
||||||
icobase = 'icons/mob/human_races/r_vox_old.dmi'
|
icobase = 'icons/mob/human_races/r_vox_old.dmi'
|
||||||
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
|
deform = 'icons/mob/human_races/r_def_vox_old.dmi'
|
||||||
inherent_verbs = list(/mob/living/carbon/human/proc/shred_limb)
|
inherent_verbs = list(/mob/living/proc/shred_limb)
|
||||||
|
|
||||||
datum/species/harpy
|
datum/species/harpy
|
||||||
name = "Rapala"
|
name = "Rapala"
|
||||||
|
|||||||
@@ -87,7 +87,7 @@
|
|||||||
|
|
||||||
/datum/trait/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
/datum/trait/hard_vore/apply(var/datum/species/S,var/mob/living/carbon/human/H)
|
||||||
..(S,H)
|
..(S,H)
|
||||||
H.verbs |= /mob/living/carbon/human/proc/shred_limb
|
H.verbs |= /mob/living/proc/shred_limb
|
||||||
|
|
||||||
/datum/trait/trashcan
|
/datum/trait/trashcan
|
||||||
name = "Trash Can"
|
name = "Trash Can"
|
||||||
|
|||||||
@@ -29,8 +29,6 @@
|
|||||||
//Random events (vomiting etc)
|
//Random events (vomiting etc)
|
||||||
handle_random_events()
|
handle_random_events()
|
||||||
|
|
||||||
attempt_vr(src,"handle_internal_contents",args) //VOREStation Code
|
|
||||||
|
|
||||||
. = 1
|
. = 1
|
||||||
|
|
||||||
//Chemicals in the body, this is moved over here so that blood can be added after death
|
//Chemicals in the body, this is moved over here so that blood can be added after death
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
if(!src.client) msg += "\nIt appears to be in stand-by mode.\n" //afk
|
if(!src.client) msg += "\nIt appears to be in stand-by mode.\n" //afk
|
||||||
if(UNCONSCIOUS) msg += "\n<span class='warning'>It doesn't seem to be responding.</span>\n"
|
if(UNCONSCIOUS) msg += "\n<span class='warning'>It doesn't seem to be responding.</span>\n"
|
||||||
if(DEAD) msg += "\n<span class='deadsay'>It looks completely unsalvageable.</span>\n"
|
if(DEAD) msg += "\n<span class='deadsay'>It looks completely unsalvageable.</span>\n"
|
||||||
msg += attempt_vr(src,"examine_bellies_pai",args) //VOREStation Edit
|
msg += attempt_vr(src,"examine_bellies",args) //VOREStation Edit
|
||||||
|
|
||||||
// VOREStation Edit: Start
|
// VOREStation Edit: Start
|
||||||
if(ooc_notes)
|
if(ooc_notes)
|
||||||
|
|||||||
@@ -21,7 +21,6 @@
|
|||||||
src << "<font color=green>Communication circuit reinitialized. Speech and messaging functionality restored.</font>"
|
src << "<font color=green>Communication circuit reinitialized. Speech and messaging functionality restored.</font>"
|
||||||
|
|
||||||
handle_statuses()
|
handle_statuses()
|
||||||
handle_internal_contents() //VOREStation edit
|
|
||||||
|
|
||||||
if(health <= 0)
|
if(health <= 0)
|
||||||
death(null,"gives one shrill beep before falling lifeless.")
|
death(null,"gives one shrill beep before falling lifeless.")
|
||||||
|
|||||||
@@ -298,7 +298,7 @@
|
|||||||
if(istype(T)) T.visible_message("<b>[src]</b> folds outwards, expanding into a mobile form.")
|
if(istype(T)) T.visible_message("<b>[src]</b> folds outwards, expanding into a mobile form.")
|
||||||
verbs += /mob/living/silicon/pai/proc/pai_nom //VOREStation edit
|
verbs += /mob/living/silicon/pai/proc/pai_nom //VOREStation edit
|
||||||
verbs += /mob/living/proc/set_size //VOREStation edit
|
verbs += /mob/living/proc/set_size //VOREStation edit
|
||||||
verbs += /mob/living/silicon/pai/proc/shred_limb //VORREStation edit
|
verbs += /mob/living/proc/shred_limb //VORREStation edit
|
||||||
|
|
||||||
/mob/living/silicon/pai/verb/fold_up()
|
/mob/living/silicon/pai/verb/fold_up()
|
||||||
set category = "pAI Commands"
|
set category = "pAI Commands"
|
||||||
@@ -389,9 +389,7 @@
|
|||||||
if(src.loc == card)
|
if(src.loc == card)
|
||||||
return
|
return
|
||||||
|
|
||||||
for(var/I in vore_organs) //VOREStation edit. Release all their stomach contents. Don't want them to be in the PAI when they fold or weird things might happen.
|
release_vore_contents() //VOREStation Add
|
||||||
var/datum/belly/B = vore_organs[I] //VOREStation edit
|
|
||||||
B.release_all_contents() //VOREStation edit
|
|
||||||
|
|
||||||
var/turf/T = get_turf(src)
|
var/turf/T = get_turf(src)
|
||||||
if(istype(T)) T.visible_message("<b>[src]</b> neatly folds inwards, compacting down to a rectangular card.")
|
if(istype(T)) T.visible_message("<b>[src]</b> neatly folds inwards, compacting down to a rectangular card.")
|
||||||
|
|||||||
@@ -13,13 +13,12 @@
|
|||||||
|
|
||||||
/mob/living/silicon/pai/proc/update_fullness_pai() //Determines if they have something in their stomach. Copied and slightly modified.
|
/mob/living/silicon/pai/proc/update_fullness_pai() //Determines if they have something in their stomach. Copied and slightly modified.
|
||||||
var/new_people_eaten = 0
|
var/new_people_eaten = 0
|
||||||
for(var/I in vore_organs)
|
for(var/belly in vore_organs)
|
||||||
var/datum/belly/B = vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
for(var/mob/living/M in B.internal_contents)
|
for(var/mob/living/M in B)
|
||||||
new_people_eaten += M.size_multiplier
|
new_people_eaten += M.size_multiplier
|
||||||
people_eaten = min(1, new_people_eaten)
|
people_eaten = min(1, new_people_eaten)
|
||||||
|
|
||||||
|
|
||||||
/mob/living/silicon/pai/update_icon() //Some functions cause this to occur, such as resting
|
/mob/living/silicon/pai/update_icon() //Some functions cause this to occur, such as resting
|
||||||
..()
|
..()
|
||||||
update_fullness_pai()
|
update_fullness_pai()
|
||||||
@@ -43,114 +42,3 @@
|
|||||||
icon_state = "[chassis]_full"
|
icon_state = "[chassis]_full"
|
||||||
else if(people_eaten && resting)
|
else if(people_eaten && resting)
|
||||||
icon_state = "[chassis]_rest_full"
|
icon_state = "[chassis]_rest_full"
|
||||||
|
|
||||||
/mob/living/silicon/pai/proc/examine_bellies_pai()
|
|
||||||
|
|
||||||
var/message = ""
|
|
||||||
for (var/I in src.vore_organs)
|
|
||||||
var/datum/belly/B = vore_organs[I]
|
|
||||||
message += B.get_examine_msg()
|
|
||||||
|
|
||||||
return message
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//PAI Remove Limb code
|
|
||||||
/mob/living/silicon/pai/proc/shred_limb()
|
|
||||||
set name = "Damage/Remove Prey's Organ"
|
|
||||||
set desc = "Severely damages prey's organ. If the limb is already severely damaged, it will be torn off."
|
|
||||||
set category = "Abilities"
|
|
||||||
if(!ispAI(src))
|
|
||||||
return //If you're not a pai you don't have permission to do this.
|
|
||||||
var/mob/living/silicon/pai/C = src
|
|
||||||
|
|
||||||
if(last_special > world.time)
|
|
||||||
return
|
|
||||||
|
|
||||||
var/list/choices = list()
|
|
||||||
for(var/mob/living/carbon/human/M in view(1,src))
|
|
||||||
if(!istype(M,/mob/living/silicon) && Adjacent(M))
|
|
||||||
choices += M
|
|
||||||
choices -= src
|
|
||||||
|
|
||||||
var/mob/living/carbon/human/T = input(src,"Who do you wish to target?") as null|anything in choices
|
|
||||||
|
|
||||||
if(!T || !src || src.stat) return
|
|
||||||
|
|
||||||
if(!Adjacent(T)) return
|
|
||||||
|
|
||||||
if(last_special > world.time) return
|
|
||||||
|
|
||||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
|
||||||
src << "You cannot target in your current state."
|
|
||||||
return
|
|
||||||
|
|
||||||
var/list/choices2 = list()
|
|
||||||
for(var/obj/item/organ/O in T.organs) //External organs
|
|
||||||
choices2 += O
|
|
||||||
|
|
||||||
var/obj/item/organ/external/D = input(C,"What do you wish to severely damage?") as null|anything in choices2 //D for destroy.
|
|
||||||
if(D.vital)
|
|
||||||
if(alert("Are you sure you wish to severely damage their [D]? It most likely will kill the prey...",,"Yes", "No") != "Yes")
|
|
||||||
return //If they reconsider, don't continue.
|
|
||||||
|
|
||||||
var/list/choices3 = list()
|
|
||||||
for(var/obj/item/organ/internal/I in D.internal_organs) //Look for the internal organ in the organ being shreded.
|
|
||||||
choices3 += I
|
|
||||||
|
|
||||||
var/obj/item/organ/internal/P = input(C,"Do you wish to severely damage an internal organ, as well? If not, click 'cancel'") as null|anything in choices3
|
|
||||||
|
|
||||||
var/eat_limb = input(C,"Do you wish to swallow the organ if you tear if out? If so, select which stomach.") as null|anything in C.vore_organs //EXTREMELY EFFICIENT
|
|
||||||
|
|
||||||
if(last_special > world.time)
|
|
||||||
return
|
|
||||||
|
|
||||||
if(stat || paralysis || stunned || weakened || lying || restrained() || buckled)
|
|
||||||
to_chat(C, "You cannot shred in your current state.")
|
|
||||||
return
|
|
||||||
|
|
||||||
last_special = world.time + 450 //45 seconds.
|
|
||||||
C.visible_message("<font color='red'><b>[C] appears to be preparing to do something to [T]!</b></font>") //Let everyone know that bad times are head
|
|
||||||
|
|
||||||
if(do_after(C, 450, T)) //Fourty-Five seconds. You don't need a neckgrab for this, so it's going to take a long while.
|
|
||||||
if(!Adjacent(T)) return
|
|
||||||
if(P && P.damage >= 25) //Internal organ and it's been severely damage
|
|
||||||
T.apply_damage(15, BRUTE, D) //Damage the external organ they're going through.
|
|
||||||
P.removed()
|
|
||||||
P.forceMove(T.loc) //Move to where prey is.
|
|
||||||
log_and_message_admins("tore out [P] of [T].", C)
|
|
||||||
if(eat_limb)
|
|
||||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
|
||||||
P.forceMove(C) //Move to pred's gut
|
|
||||||
S.internal_contents |= P //Add to pred's gut.
|
|
||||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") // Same as below, but (pred) damages the (right hand) of (person)
|
|
||||||
to_chat(C, "[P] of [T] moves into your [S]!") //Quietly eat their internal organ! Comes out "The (right hand) of (person) moves into your (stomach)
|
|
||||||
playsound(C, S.vore_sound, 70, 1)
|
|
||||||
log_and_message_admins("tore out and ate [P] of [T].", C)
|
|
||||||
else
|
|
||||||
log_and_message_admins("tore out [P] of [T].", C)
|
|
||||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T], resulting in their [P] coming out!</b></font>")
|
|
||||||
else if(!P && (D.damage >= 25 || D.brute_dam >= 25)) //Not targeting an internal organ & external organ has been severely damaged already.
|
|
||||||
D.droplimb(1,DROPLIMB_EDGE) //Clean cut so it doesn't kill the prey completely.
|
|
||||||
if(D.cannot_amputate) //Is it groin/chest? You can't remove those.
|
|
||||||
T.apply_damage(25, BRUTE, D)
|
|
||||||
C.visible_message("<font color='red'><b>[C] severely damage [T]'s [D]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
|
||||||
log_and_message_admins("shreded [T]'s [D].", C)
|
|
||||||
return
|
|
||||||
if(eat_limb)
|
|
||||||
var/datum/belly/S = C.vore_organs[eat_limb]
|
|
||||||
D.forceMove(C) //Move to pred's gut
|
|
||||||
S.internal_contents |= D //Add to pred's gut.
|
|
||||||
C.visible_message("<span class='warning'>[C] swallows [D] of [T] into their [S]!</span>","You swallow [D] of [T]!")
|
|
||||||
playsound(C, S.vore_sound, 70, 1)
|
|
||||||
to_chat(C, "Their [D] moves into your [S]!")
|
|
||||||
log_and_message_admins("tore off and ate [D] of [T].", C)
|
|
||||||
else
|
|
||||||
C.visible_message("<span class='warning'>[C] tears off [D] of [T]!</span>","You tear out [D] of [T]!") //Will come out "You tear out (the right foot) of (person)
|
|
||||||
log_and_message_admins("tore off [T]'s [D].", C)
|
|
||||||
else //Not targeting an internal organ w/ > 25 damage , and the limb doesn't have < 25 damage.
|
|
||||||
if(P)
|
|
||||||
P.damage = 25 //Internal organs can only take damage, not brute damage.
|
|
||||||
T.apply_damage(25, BRUTE, D)
|
|
||||||
C.visible_message("<font color='red'><b>[C] severely damages [D] of [T]!</b></font>") //Keep it vague. Let the /me's do the talking.
|
|
||||||
log_and_message_admins("shreded [D] of [T].", C)
|
|
||||||
|
|||||||
@@ -527,15 +527,12 @@
|
|||||||
hearer << deathsound
|
hearer << deathsound
|
||||||
T << deathsound
|
T << deathsound
|
||||||
if(is_vore_predator(T))
|
if(is_vore_predator(T))
|
||||||
for (var/bellytype in T.vore_organs)
|
for(var/belly in T.vore_organs)
|
||||||
var/datum/belly/belly = T.vore_organs[bellytype]
|
var/obj/belly/B = belly
|
||||||
for (var/obj/thing in belly.internal_contents)
|
for(var/atom/movable/thing in B)
|
||||||
thing.loc = src
|
thing.forceMove(src)
|
||||||
belly.internal_contents -= thing
|
if(ismob(thing))
|
||||||
for (var/mob/subprey in belly.internal_contents)
|
to_chat(thing, "As [T] melts away around you, you find yourself in [hound]'s [name]")
|
||||||
subprey.loc = src
|
|
||||||
belly.internal_contents -= subprey
|
|
||||||
to_chat(subprey, "As [T] melts away around you, you find yourself in [hound]'s [name]")
|
|
||||||
for(var/obj/item/I in T)
|
for(var/obj/item/I in T)
|
||||||
if(istype(I,/obj/item/organ/internal/mmi_holder/posibrain))
|
if(istype(I,/obj/item/organ/internal/mmi_holder/posibrain))
|
||||||
var/obj/item/organ/internal/mmi_holder/MMI = I
|
var/obj/item/organ/internal/mmi_holder/MMI = I
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/mob/living/silicon/robot/proc/examine_bellies_borg()
|
/mob/living/silicon/robot/proc/examine_bellies_borg()
|
||||||
|
|
||||||
var/message = ""
|
var/message = ""
|
||||||
for (var/I in src.vore_organs)
|
for(var/belly in vore_organs)
|
||||||
var/datum/belly/B = vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
message += B.get_examine_msg()
|
message += B.get_examine_msg()
|
||||||
|
|
||||||
return message
|
return message
|
||||||
@@ -24,7 +24,6 @@
|
|||||||
process_killswitch()
|
process_killswitch()
|
||||||
process_locks()
|
process_locks()
|
||||||
process_queued_alarms()
|
process_queued_alarms()
|
||||||
handle_internal_contents() //VOREStation Edit
|
|
||||||
update_canmove()
|
update_canmove()
|
||||||
|
|
||||||
/mob/living/silicon/robot/proc/clamp_values()
|
/mob/living/silicon/robot/proc/clamp_values()
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
/mob/living/simple_animal/cat/fluff/Runtime/init_belly()
|
/mob/living/simple_animal/cat/fluff/Runtime/init_belly()
|
||||||
..()
|
..()
|
||||||
var/datum/belly/B = vore_organs[vore_selected]
|
var/obj/belly/B = vore_selected
|
||||||
B.name = "Stomach"
|
B.name = "Stomach"
|
||||||
B.inside_flavor = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside."
|
B.desc = "The slimy wet insides of Runtime! Not quite as clean as the cat on the outside."
|
||||||
|
|
||||||
B.emote_lists[DM_HOLD] = list(
|
B.emote_lists[DM_HOLD] = list(
|
||||||
"Runtime's stomach kneads gently on you and you're fairly sure you can hear her start purring.",
|
"Runtime's stomach kneads gently on you and you're fairly sure you can hear her start purring.",
|
||||||
|
|||||||
@@ -11,9 +11,9 @@
|
|||||||
|
|
||||||
/mob/living/simple_animal/fish/koi/poisonous/Life()
|
/mob/living/simple_animal/fish/koi/poisonous/Life()
|
||||||
..()
|
..()
|
||||||
var/datum/belly/why = check_belly(src)
|
if(isbelly(loc) && prob(10))
|
||||||
if(why && prob(10))
|
var/obj/belly/B = loc
|
||||||
sting(why.owner)
|
sting(B.owner)
|
||||||
|
|
||||||
/mob/living/simple_animal/fish/koi/poisonous/react_to_attack(var/atom/A)
|
/mob/living/simple_animal/fish/koi/poisonous/react_to_attack(var/atom/A)
|
||||||
if(isliving(A) && Adjacent(A))
|
if(isliving(A) && Adjacent(A))
|
||||||
|
|||||||
@@ -40,9 +40,9 @@
|
|||||||
|
|
||||||
/mob/living/simple_animal/fox/init_belly()
|
/mob/living/simple_animal/fox/init_belly()
|
||||||
..()
|
..()
|
||||||
var/datum/belly/B = vore_organs[vore_selected]
|
var/obj/belly/B = vore_selected
|
||||||
B.name = "Stomach"
|
B.name = "Stomach"
|
||||||
B.inside_flavor = "Slick foxguts. Cute on the outside, slimy on the inside!"
|
B.desc = "Slick foxguts. Cute on the outside, slimy on the inside!"
|
||||||
|
|
||||||
B.emote_lists[DM_HOLD] = list(
|
B.emote_lists[DM_HOLD] = list(
|
||||||
"The foxguts knead and churn around you harmlessly.",
|
"The foxguts knead and churn around you harmlessly.",
|
||||||
@@ -187,9 +187,9 @@
|
|||||||
|
|
||||||
/mob/living/simple_animal/fox/fluff/Renault/init_belly()
|
/mob/living/simple_animal/fox/fluff/Renault/init_belly()
|
||||||
..()
|
..()
|
||||||
var/datum/belly/B = vore_organs[vore_selected]
|
var/obj/belly/B = vore_selected
|
||||||
B.name = "Stomach"
|
B.name = "Stomach"
|
||||||
B.inside_flavor = "Slick foxguts. They seem somehow more regal than perhaps other foxes!"
|
B.desc = "Slick foxguts. They seem somehow more regal than perhaps other foxes!"
|
||||||
|
|
||||||
B.emote_lists[DM_HOLD] = list(
|
B.emote_lists[DM_HOLD] = list(
|
||||||
"Renault's stomach walls squeeze around you more tightly for a moment, before relaxing, as if testing you a bit.",
|
"Renault's stomach walls squeeze around you more tightly for a moment, before relaxing, as if testing you a bit.",
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
/mob/living/simple_animal/slime
|
/mob/living/simple_animal/old_slime
|
||||||
name = "pet slime"
|
name = "pet slime"
|
||||||
desc = "A lovable, domesticated slime."
|
desc = "A lovable, domesticated slime."
|
||||||
icon = 'icons/mob/slimes.dmi'
|
icon = 'icons/mob/slimes.dmi'
|
||||||
@@ -19,14 +19,14 @@
|
|||||||
|
|
||||||
var/colour = "grey"
|
var/colour = "grey"
|
||||||
|
|
||||||
/mob/living/simple_animal/slime/science
|
/mob/living/simple_animal/old_slime/science
|
||||||
name = "Kendrick"
|
name = "Kendrick"
|
||||||
colour = "rainbow"
|
colour = "rainbow"
|
||||||
icon_state = "rainbow baby slime"
|
icon_state = "rainbow baby slime"
|
||||||
icon_living = "rainbow baby slime"
|
icon_living = "rainbow baby slime"
|
||||||
icon_dead = "rainbow baby slime dead"
|
icon_dead = "rainbow baby slime dead"
|
||||||
|
|
||||||
/mob/living/simple_animal/slime/science/initialize()
|
/mob/living/simple_animal/old_slime/science/initialize()
|
||||||
. = ..()
|
. = ..()
|
||||||
overlays.Cut()
|
overlays.Cut()
|
||||||
overlays += "aslime-:33"
|
overlays += "aslime-:33"
|
||||||
@@ -56,12 +56,12 @@
|
|||||||
overlays += "aslime-:33"
|
overlays += "aslime-:33"
|
||||||
|
|
||||||
/mob/living/simple_animal/adultslime/death()
|
/mob/living/simple_animal/adultslime/death()
|
||||||
var/mob/living/simple_animal/slime/S1 = new /mob/living/simple_animal/slime (src.loc)
|
var/mob/living/simple_animal/old_slime/S1 = new /mob/living/simple_animal/old_slime (src.loc)
|
||||||
S1.icon_state = "[src.colour] baby slime"
|
S1.icon_state = "[src.colour] baby slime"
|
||||||
S1.icon_living = "[src.colour] baby slime"
|
S1.icon_living = "[src.colour] baby slime"
|
||||||
S1.icon_dead = "[src.colour] baby slime dead"
|
S1.icon_dead = "[src.colour] baby slime dead"
|
||||||
S1.colour = "[src.colour]"
|
S1.colour = "[src.colour]"
|
||||||
var/mob/living/simple_animal/slime/S2 = new /mob/living/simple_animal/slime (src.loc)
|
var/mob/living/simple_animal/old_slime/S2 = new /mob/living/simple_animal/old_slime (src.loc)
|
||||||
S2.icon_state = "[src.colour] baby slime"
|
S2.icon_state = "[src.colour] baby slime"
|
||||||
S2.icon_living = "[src.colour] baby slime"
|
S2.icon_living = "[src.colour] baby slime"
|
||||||
S2.icon_dead = "[src.colour] baby slime dead"
|
S2.icon_dead = "[src.colour] baby slime dead"
|
||||||
|
|||||||
@@ -33,11 +33,9 @@
|
|||||||
if(!IsAdvancedToolUser())
|
if(!IsAdvancedToolUser())
|
||||||
verbs |= /mob/living/simple_animal/proc/animal_nom
|
verbs |= /mob/living/simple_animal/proc/animal_nom
|
||||||
|
|
||||||
// Release belly contents beforey being gc'd!
|
// Release belly contents before being gc'd!
|
||||||
/mob/living/simple_animal/Destroy()
|
/mob/living/simple_animal/Destroy()
|
||||||
for(var/I in vore_organs)
|
release_vore_contents()
|
||||||
var/datum/belly/B = vore_organs[I]
|
|
||||||
B.release_all_contents(include_absorbed = TRUE) // When your stomach is empty
|
|
||||||
prey_excludes.Cut()
|
prey_excludes.Cut()
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
@@ -49,9 +47,9 @@
|
|||||||
// Update fullness based on size & quantity of belly contents
|
// Update fullness based on size & quantity of belly contents
|
||||||
/mob/living/simple_animal/proc/update_fullness()
|
/mob/living/simple_animal/proc/update_fullness()
|
||||||
var/new_fullness = 0
|
var/new_fullness = 0
|
||||||
for(var/I in vore_organs)
|
for(var/belly in vore_organs)
|
||||||
var/datum/belly/B = vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
for(var/mob/living/M in B.internal_contents)
|
for(var/mob/living/M in B)
|
||||||
new_fullness += M.size_multiplier
|
new_fullness += M.size_multiplier
|
||||||
new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry.
|
new_fullness = round(new_fullness, 1) // Because intervals of 0.25 are going to make sprite artists cry.
|
||||||
vore_fullness = min(vore_capacity, new_fullness)
|
vore_fullness = min(vore_capacity, new_fullness)
|
||||||
@@ -137,10 +135,8 @@
|
|||||||
stop_automated_movement = 0
|
stop_automated_movement = 0
|
||||||
|
|
||||||
/mob/living/simple_animal/death()
|
/mob/living/simple_animal/death()
|
||||||
for(var/I in vore_organs)
|
release_vore_contents()
|
||||||
var/datum/belly/B = vore_organs[I]
|
. = ..()
|
||||||
B.release_all_contents(include_absorbed = TRUE) // When your stomach is empty
|
|
||||||
..() // then you have my permission to die.
|
|
||||||
|
|
||||||
// Simple animals have only one belly. This creates it (if it isn't already set up)
|
// Simple animals have only one belly. This creates it (if it isn't already set up)
|
||||||
/mob/living/simple_animal/proc/init_belly()
|
/mob/living/simple_animal/proc/init_belly()
|
||||||
@@ -149,10 +145,11 @@
|
|||||||
if(no_vore) //If it can't vore, let's not give it a stomach.
|
if(no_vore) //If it can't vore, let's not give it a stomach.
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/belly/B = new /datum/belly(src)
|
var/obj/belly/B = new /obj/belly(src)
|
||||||
|
vore_selected = B
|
||||||
B.immutable = 1
|
B.immutable = 1
|
||||||
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
|
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
|
||||||
B.inside_flavor = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
|
B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
|
||||||
B.digest_mode = vore_default_mode
|
B.digest_mode = vore_default_mode
|
||||||
B.escapable = vore_escape_chance > 0
|
B.escapable = vore_escape_chance > 0
|
||||||
B.escapechance = vore_escape_chance
|
B.escapechance = vore_escape_chance
|
||||||
@@ -161,7 +158,6 @@
|
|||||||
B.human_prey_swallow_time = swallowTime
|
B.human_prey_swallow_time = swallowTime
|
||||||
B.nonhuman_prey_swallow_time = swallowTime
|
B.nonhuman_prey_swallow_time = swallowTime
|
||||||
B.vore_verb = "swallow"
|
B.vore_verb = "swallow"
|
||||||
// TODO - Customizable per mob
|
|
||||||
B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
|
B.emote_lists[DM_HOLD] = list( // We need more that aren't repetitive. I suck at endo. -Ace
|
||||||
"The insides knead at you gently for a moment.",
|
"The insides knead at you gently for a moment.",
|
||||||
"The guts glorp wetly around you as some air shifts.",
|
"The guts glorp wetly around you as some air shifts.",
|
||||||
@@ -192,8 +188,6 @@
|
|||||||
"The juices pooling beneath you sizzle against your sore skin.",
|
"The juices pooling beneath you sizzle against your sore skin.",
|
||||||
"The churning walls slowly pulverize you into meaty nutrients.",
|
"The churning walls slowly pulverize you into meaty nutrients.",
|
||||||
"The stomach glorps and gurgles as it tries to work you into slop.")
|
"The stomach glorps and gurgles as it tries to work you into slop.")
|
||||||
src.vore_organs[B.name] = B
|
|
||||||
src.vore_selected = B.name
|
|
||||||
|
|
||||||
/mob/living/simple_animal/Bumped(var/atom/movable/AM, yes)
|
/mob/living/simple_animal/Bumped(var/atom/movable/AM, yes)
|
||||||
if(ismob(AM))
|
if(ismob(AM))
|
||||||
|
|||||||
@@ -184,27 +184,20 @@
|
|||||||
if(ai_inactive)//No autobarf on player control.
|
if(ai_inactive)//No autobarf on player control.
|
||||||
return
|
return
|
||||||
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_animal/otie/security))
|
if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/donut) && istype(src, /mob/living/simple_animal/otie/security))
|
||||||
user << "<span class='notice'>The guard pup accepts your offer for their catch.</span>"
|
to_chat(user,"<span class='notice'>The guard pup accepts your offer for their catch.</span>")
|
||||||
for(var/I in vore_organs)
|
release_vore_contents()
|
||||||
var/datum/belly/B = vore_organs[I]
|
else if(prob(2)) //Small chance to get prey out from non-sec oties.
|
||||||
B.release_all_contents()
|
to_chat(user,"<span class='notice'>The pup accepts your offer for their catch.</span>")
|
||||||
|
release_vore_contents()
|
||||||
return
|
return
|
||||||
if(prob(2)) //Small chance to get prey out from non-sec oties.
|
. = ..()
|
||||||
for(var/I in vore_organs)
|
|
||||||
var/datum/belly/B = vore_organs[I]
|
|
||||||
B.release_all_contents()
|
|
||||||
return
|
|
||||||
return
|
|
||||||
..()
|
|
||||||
|
|
||||||
/mob/living/simple_animal/otie/security/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey) // Make the gut start out safe for bellybrigging.
|
/mob/living/simple_animal/otie/security/feed_grabbed_to_self(var/mob/living/user, var/mob/living/prey) // Make the gut start out safe for bellybrigging.
|
||||||
var/datum/belly/B = user.vore_selected
|
|
||||||
var/datum/belly/belly_target = user.vore_organs[B]
|
|
||||||
if(ishuman(target_mob))
|
if(ishuman(target_mob))
|
||||||
belly_target.digest_mode = DM_HOLD
|
vore_selected.digest_mode = DM_HOLD
|
||||||
if(istype(prey,/mob/living/simple_animal/mouse))
|
if(istype(prey,/mob/living/simple_animal/mouse))
|
||||||
belly_target.digest_mode = DM_DIGEST
|
vore_selected.digest_mode = DM_DIGEST
|
||||||
..()
|
. = ..()
|
||||||
|
|
||||||
/mob/living/simple_animal/otie/security/proc/check_threat(var/mob/living/M)
|
/mob/living/simple_animal/otie/security/proc/check_threat(var/mob/living/M)
|
||||||
if(!M || !ishuman(M) || M.stat == DEAD || src == M)
|
if(!M || !ishuman(M) || M.stat == DEAD || src == M)
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
ability_flags &= ~AB_PHASE_SHIFTED
|
ability_flags &= ~AB_PHASE_SHIFTED
|
||||||
name = real_name
|
name = real_name
|
||||||
for(var/belly in vore_organs)
|
for(var/belly in vore_organs)
|
||||||
var/datum/belly/B = vore_organs[belly]
|
var/obj/belly/B = belly
|
||||||
B.escapable = initial(B.escapable)
|
B.escapable = initial(B.escapable)
|
||||||
|
|
||||||
overlays.Cut()
|
overlays.Cut()
|
||||||
@@ -43,13 +43,9 @@
|
|||||||
var/list/potentials = living_mobs(0)
|
var/list/potentials = living_mobs(0)
|
||||||
if(potentials.len)
|
if(potentials.len)
|
||||||
var/mob/living/target = pick(potentials)
|
var/mob/living/target = pick(potentials)
|
||||||
var/datum/belly/B = vore_organs[vore_selected]
|
if(istype(target) && vore_selected)
|
||||||
if(istype(target) && istype(B))
|
target.forceMove(vore_selected)
|
||||||
target.forceMove(src)
|
to_chat(target,"<span class='warning'>\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!</span>")
|
||||||
B.internal_contents |= target
|
|
||||||
playsound(src, B.vore_sound, 100, 1)
|
|
||||||
to_chat(target,"<span class='warning'>\The [src] phases in around you, [B.vore_verb]ing you into their [B.name]!</span>")
|
|
||||||
to_chat(src,"<span class='warning'>Your [B.name] has a new occupant!</span>")
|
|
||||||
|
|
||||||
// Do this after the potential vore, so we get the belly
|
// Do this after the potential vore, so we get the belly
|
||||||
update_icon()
|
update_icon()
|
||||||
@@ -79,7 +75,7 @@
|
|||||||
name = "Something"
|
name = "Something"
|
||||||
|
|
||||||
for(var/belly in vore_organs)
|
for(var/belly in vore_organs)
|
||||||
var/datum/belly/B = vore_organs[belly]
|
var/obj/belly/B = belly
|
||||||
B.escapable = FALSE
|
B.escapable = FALSE
|
||||||
|
|
||||||
overlays.Cut()
|
overlays.Cut()
|
||||||
|
|||||||
@@ -130,10 +130,11 @@
|
|||||||
if(no_vore) //If it can't vore, let's not give it a stomach.
|
if(no_vore) //If it can't vore, let's not give it a stomach.
|
||||||
return
|
return
|
||||||
|
|
||||||
var/datum/belly/B = new /datum/belly(src)
|
var/obj/belly/B = new /obj/belly(src)
|
||||||
|
vore_selected = B
|
||||||
B.immutable = 1
|
B.immutable = 1
|
||||||
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
|
B.name = vore_stomach_name ? vore_stomach_name : "stomach"
|
||||||
B.inside_flavor = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
|
B.desc = vore_stomach_flavor ? vore_stomach_flavor : "Your surroundings are warm, soft, and slimy. Makes sense, considering you're inside \the [name]."
|
||||||
B.digest_mode = vore_default_mode
|
B.digest_mode = vore_default_mode
|
||||||
B.escapable = vore_escape_chance > 0
|
B.escapable = vore_escape_chance > 0
|
||||||
B.escapechance = vore_escape_chance
|
B.escapechance = vore_escape_chance
|
||||||
@@ -186,14 +187,6 @@
|
|||||||
"The chaos of being digested fades as you’re snuffed out by a harsh clench! You’re steadily broken down into a thick paste, processed and absorbed by the predator!"
|
"The chaos of being digested fades as you’re snuffed out by a harsh clench! You’re steadily broken down into a thick paste, processed and absorbed by the predator!"
|
||||||
)
|
)
|
||||||
|
|
||||||
src.vore_organs[B.name] = B
|
|
||||||
src.vore_selected = B.name
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/mob/living/simple_animal/shadekin/Life()
|
/mob/living/simple_animal/shadekin/Life()
|
||||||
. = ..()
|
. = ..()
|
||||||
if(ability_flags & AB_PHASE_SHIFTED)
|
if(ability_flags & AB_PHASE_SHIFTED)
|
||||||
|
|||||||
@@ -228,8 +228,8 @@
|
|||||||
// Override stuff for holodeck carp to make them not digest when set to safe!
|
// Override stuff for holodeck carp to make them not digest when set to safe!
|
||||||
/mob/living/simple_animal/hostile/carp/holodeck/set_safety(var/safe)
|
/mob/living/simple_animal/hostile/carp/holodeck/set_safety(var/safe)
|
||||||
. = ..()
|
. = ..()
|
||||||
for(var/I in vore_organs)
|
for(var/belly in vore_organs)
|
||||||
var/datum/belly/B = vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
B.digest_mode = safe ? DM_HOLD : vore_default_mode
|
B.digest_mode = safe ? DM_HOLD : vore_default_mode
|
||||||
B.digestchance = safe ? 0 : vore_digest_chance
|
B.digestchance = safe ? 0 : vore_digest_chance
|
||||||
B.absorbchance = safe ? 0 : vore_absorb_chance
|
B.absorbchance = safe ? 0 : vore_absorb_chance
|
||||||
|
|||||||
@@ -80,9 +80,9 @@
|
|||||||
M.make_dizzy(1)
|
M.make_dizzy(1)
|
||||||
M.adjustHalLoss(2)
|
M.adjustHalLoss(2)
|
||||||
|
|
||||||
for(var/I in M.vore_organs)
|
for(var/belly in M.vore_organs)
|
||||||
var/datum/belly/B = M.vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
for(var/atom/movable/A in B.internal_contents)
|
for(var/atom/movable/A in B)
|
||||||
if(isliving(A))
|
if(isliving(A))
|
||||||
var/mob/living/P = A
|
var/mob/living/P = A
|
||||||
if(P.absorbed)
|
if(P.absorbed)
|
||||||
@@ -90,8 +90,6 @@
|
|||||||
if(prob(5))
|
if(prob(5))
|
||||||
playsound(M, 'sound/effects/splat.ogg', 50, 1)
|
playsound(M, 'sound/effects/splat.ogg', 50, 1)
|
||||||
B.release_specific_contents(A)
|
B.release_specific_contents(A)
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
/datum/reagent/unsorbitol
|
/datum/reagent/unsorbitol
|
||||||
name = "Unsorbitol"
|
name = "Unsorbitol"
|
||||||
@@ -109,13 +107,13 @@
|
|||||||
M.confused = max(M.confused, 20)
|
M.confused = max(M.confused, 20)
|
||||||
M.hallucination += 15
|
M.hallucination += 15
|
||||||
|
|
||||||
for(var/I in M.vore_organs)
|
for(var/belly in M.vore_organs)
|
||||||
var/datum/belly/B = M.vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
|
|
||||||
if(B.digest_mode == DM_ABSORB) //Turn off absorbing on bellies
|
if(B.digest_mode == DM_ABSORB) //Turn off absorbing on bellies
|
||||||
B.digest_mode = DM_HOLD
|
B.digest_mode = DM_HOLD
|
||||||
|
|
||||||
for(var/mob/living/P in B.internal_contents)
|
for(var/mob/living/P in B)
|
||||||
if(!P.absorbed)
|
if(!P.absorbed)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -123,7 +121,6 @@
|
|||||||
playsound(M, 'sound/vore/schlorp.ogg', 50, 1)
|
playsound(M, 'sound/vore/schlorp.ogg', 50, 1)
|
||||||
P.absorbed = 0
|
P.absorbed = 0
|
||||||
M.visible_message("<font color='green'><b>Something spills into [M]'s [lowertext(B.name)]!</b></font>")
|
M.visible_message("<font color='green'><b>Something spills into [M]'s [lowertext(B.name)]!</b></font>")
|
||||||
return
|
|
||||||
|
|
||||||
//Special toxins for solargrubs
|
//Special toxins for solargrubs
|
||||||
|
|
||||||
|
|||||||
162
code/modules/vore/eating/belly_dat_vr.dm
Normal file
162
code/modules/vore/eating/belly_dat_vr.dm
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
// // // // // // // // // // // //
|
||||||
|
// // // LEGACY USE ONLY!! // // //
|
||||||
|
// // // // // // // // // // // //
|
||||||
|
|
||||||
|
// These have been REPLACED by the object-based bellies. These remain here,
|
||||||
|
// so that people can load save files from prior times, and the Copy() proc can
|
||||||
|
// convert their belly to a new object-based one.
|
||||||
|
|
||||||
|
/datum/belly
|
||||||
|
var/name // Name of this location
|
||||||
|
var/inside_flavor // Flavor text description of inside sight/sound/smells/feels.
|
||||||
|
var/vore_sound = 'sound/vore/gulp.ogg' // Sound when ingesting someone
|
||||||
|
var/vore_verb = "ingest" // Verb for eating with this in messages
|
||||||
|
var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
|
||||||
|
var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else
|
||||||
|
var/emoteTime = 600 // How long between stomach emotes at prey
|
||||||
|
var/digest_brute = 2 // Brute damage per tick in digestion mode
|
||||||
|
var/digest_burn = 3 // Burn damage per tick in digestion mode
|
||||||
|
var/digest_tickrate = 3 // Modulus this of air controller tick number to iterate gurgles on
|
||||||
|
var/immutable = 0 // Prevents this belly from being deleted
|
||||||
|
var/escapable = 0 // Belly can be resisted out of at any time
|
||||||
|
var/escapetime = 60 SECONDS // Deciseconds, how long to escape this belly
|
||||||
|
var/digestchance = 0 // % Chance of stomach beginning to digest if prey struggles
|
||||||
|
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/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
|
||||||
|
var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
|
||||||
|
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.
|
||||||
|
var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes
|
||||||
|
var/tmp/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG)
|
||||||
|
var/tmp/mob/living/owner // The mob whose belly this is.
|
||||||
|
var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
|
||||||
|
var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote
|
||||||
|
var/tmp/list/items_preserved = list() // Stuff that wont digest.
|
||||||
|
var/list/slots = list(slot_back,slot_handcuffed,slot_l_store,slot_r_store,slot_wear_mask,slot_l_hand,slot_r_hand,slot_wear_id,slot_glasses,slot_gloves,slot_head,slot_shoes,slot_belt,slot_wear_suit,slot_w_uniform,slot_s_store,slot_l_ear,slot_r_ear)
|
||||||
|
|
||||||
|
|
||||||
|
// Don't forget to watch your commas at the end of each line if you change these.
|
||||||
|
var/list/struggle_messages_outside = list(
|
||||||
|
"%pred's %belly wobbles with a squirming meal.",
|
||||||
|
"%pred's %belly jostles with movement.",
|
||||||
|
"%pred's %belly briefly swells outward as someone pushes from inside.",
|
||||||
|
"%pred's %belly fidgets with a trapped victim.",
|
||||||
|
"%pred's %belly jiggles with motion from inside.",
|
||||||
|
"%pred's %belly sloshes around.",
|
||||||
|
"%pred's %belly gushes softly.",
|
||||||
|
"%pred's %belly lets out a wet squelch.")
|
||||||
|
|
||||||
|
var/list/struggle_messages_inside = list(
|
||||||
|
"Your useless squirming only causes %pred's slimy %belly to squelch over your body.",
|
||||||
|
"Your struggles only cause %pred's %belly to gush softly around you.",
|
||||||
|
"Your movement only causes %pred's %belly to slosh around you.",
|
||||||
|
"Your motion causes %pred's %belly to jiggle.",
|
||||||
|
"You fidget around inside of %pred's %belly.",
|
||||||
|
"You shove against the walls of %pred's %belly, making it briefly swell outward.",
|
||||||
|
"You jostle %pred's %belly with movement.",
|
||||||
|
"You squirm inside of %pred's %belly, making it wobble around.")
|
||||||
|
|
||||||
|
var/list/digest_messages_owner = list(
|
||||||
|
"You feel %prey's body succumb to your digestive system, which breaks it apart into soft slurry.",
|
||||||
|
"You hear a lewd glorp as your %belly muscles grind %prey into a warm pulp.",
|
||||||
|
"Your %belly lets out a rumble as it melts %prey into sludge.",
|
||||||
|
"You feel a soft gurgle as %prey's body loses form in your %belly. They're nothing but a soft mass of churning slop now.",
|
||||||
|
"Your %belly begins gushing %prey's remains through your system, adding some extra weight to your thighs.",
|
||||||
|
"Your %belly begins gushing %prey's remains through your system, adding some extra weight to your rump.",
|
||||||
|
"Your %belly begins gushing %prey's remains through your system, adding some extra weight to your belly.",
|
||||||
|
"Your %belly groans as %prey falls apart into a thick soup. You can feel their remains soon flowing deeper into your body to be absorbed.",
|
||||||
|
"Your %belly kneads on every fiber of %prey, softening them down into mush to fuel your next hunt.",
|
||||||
|
"Your %belly churns %prey down into a hot slush. You can feel the nutrients coursing through your digestive track with a series of long, wet glorps.")
|
||||||
|
|
||||||
|
var/list/digest_messages_prey = list(
|
||||||
|
"Your body succumbs to %pred's digestive system, which breaks you apart into soft slurry.",
|
||||||
|
"%pred's %belly lets out a lewd glorp as their muscles grind you into a warm pulp.",
|
||||||
|
"%pred's %belly lets out a rumble as it melts you into sludge.",
|
||||||
|
"%pred feels a soft gurgle as your body loses form in their %belly. You're nothing but a soft mass of churning slop now.",
|
||||||
|
"%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's thighs.",
|
||||||
|
"%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's rump.",
|
||||||
|
"%pred's %belly begins gushing your remains through their system, adding some extra weight to %pred's belly.",
|
||||||
|
"%pred's %belly groans as you fall apart into a thick soup. Your remains soon flow deeper into %pred's body to be absorbed.",
|
||||||
|
"%pred's %belly kneads on every fiber of your body, softening you down into mush to fuel their next hunt.",
|
||||||
|
"%pred's %belly churns you down into a hot slush. Your nutrient-rich remains course through their digestive track with a series of long, wet glorps.")
|
||||||
|
|
||||||
|
var/list/examine_messages = list(
|
||||||
|
"They have something solid in their %belly!",
|
||||||
|
"It looks like they have something in their %belly!")
|
||||||
|
|
||||||
|
//Mostly for being overridden on precreated bellies on mobs. Could be VV'd into
|
||||||
|
//a carbon's belly if someone really wanted. No UI for carbons to adjust this.
|
||||||
|
//List has indexes that are the digestion mode strings, and keys that are lists of strings.
|
||||||
|
var/tmp/list/emote_lists = list()
|
||||||
|
|
||||||
|
//OLD: This only exists for legacy conversion purposes
|
||||||
|
//It's called whenever an old datum-style belly is loaded
|
||||||
|
/datum/belly/proc/copy(obj/belly/new_belly)
|
||||||
|
|
||||||
|
//// Non-object variables
|
||||||
|
new_belly.name = name
|
||||||
|
new_belly.desc = inside_flavor
|
||||||
|
new_belly.vore_sound = vore_sound
|
||||||
|
new_belly.vore_verb = vore_verb
|
||||||
|
new_belly.human_prey_swallow_time = human_prey_swallow_time
|
||||||
|
new_belly.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
|
||||||
|
new_belly.emote_time = emoteTime
|
||||||
|
new_belly.digest_brute = digest_brute
|
||||||
|
new_belly.digest_burn = digest_burn
|
||||||
|
new_belly.digest_tickrate = digest_tickrate
|
||||||
|
new_belly.immutable = immutable
|
||||||
|
new_belly.can_taste = can_taste
|
||||||
|
new_belly.escapable = escapable
|
||||||
|
new_belly.escapetime = escapetime
|
||||||
|
new_belly.digestchance = digestchance
|
||||||
|
new_belly.absorbchance = absorbchance
|
||||||
|
new_belly.escapechance = escapechance
|
||||||
|
new_belly.transferchance = transferchance
|
||||||
|
new_belly.transferlocation = transferlocation
|
||||||
|
new_belly.bulge_size = bulge_size
|
||||||
|
new_belly.shrink_grow_size = shrink_grow_size
|
||||||
|
|
||||||
|
//// Object-holding variables
|
||||||
|
//struggle_messages_outside - strings
|
||||||
|
new_belly.struggle_messages_outside.Cut()
|
||||||
|
for(var/I in struggle_messages_outside)
|
||||||
|
new_belly.struggle_messages_outside += I
|
||||||
|
|
||||||
|
//struggle_messages_inside - strings
|
||||||
|
new_belly.struggle_messages_inside.Cut()
|
||||||
|
for(var/I in struggle_messages_inside)
|
||||||
|
new_belly.struggle_messages_inside += I
|
||||||
|
|
||||||
|
//digest_messages_owner - strings
|
||||||
|
new_belly.digest_messages_owner.Cut()
|
||||||
|
for(var/I in digest_messages_owner)
|
||||||
|
new_belly.digest_messages_owner += I
|
||||||
|
|
||||||
|
//digest_messages_prey - strings
|
||||||
|
new_belly.digest_messages_prey.Cut()
|
||||||
|
for(var/I in digest_messages_prey)
|
||||||
|
new_belly.digest_messages_prey += I
|
||||||
|
|
||||||
|
//examine_messages - strings
|
||||||
|
new_belly.examine_messages.Cut()
|
||||||
|
for(var/I in examine_messages)
|
||||||
|
new_belly.examine_messages += I
|
||||||
|
|
||||||
|
//emote_lists - index: digest mode, key: list of strings
|
||||||
|
new_belly.emote_lists.Cut()
|
||||||
|
for(var/K in emote_lists)
|
||||||
|
new_belly.emote_lists[K] = list()
|
||||||
|
for(var/I in emote_lists[K])
|
||||||
|
new_belly.emote_lists[K] += I
|
||||||
|
|
||||||
|
return new_belly
|
||||||
|
|
||||||
|
// // // // // // // // // // // //
|
||||||
|
// // // LEGACY USE ONLY!! // // //
|
||||||
|
// // // // // // // // // // // //
|
||||||
|
// See top of file! //
|
||||||
|
// // // // // // // // // // // //
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
|
#define VORE_SOUND_FALLOFF 0.05
|
||||||
|
|
||||||
//
|
//
|
||||||
// The belly object is what holds onto a mob while they're inside a predator.
|
// Belly system 2.0, now using objects instead of datums because EH at datums.
|
||||||
// It takes care of altering the pred's decription, digesting the prey, relaying struggles etc.
|
// How many times have I rewritten bellies and vore now? -Aro
|
||||||
//
|
//
|
||||||
|
|
||||||
// If you change what variables are on this, then you need to update the copy() proc.
|
// If you change what variables are on this, then you need to update the copy() proc.
|
||||||
@@ -8,16 +10,16 @@
|
|||||||
//
|
//
|
||||||
// Parent type of all the various "belly" varieties.
|
// Parent type of all the various "belly" varieties.
|
||||||
//
|
//
|
||||||
/datum/belly
|
/obj/belly
|
||||||
var/name // Name of this location
|
name = "belly" // Name of this location
|
||||||
var/inside_flavor // Flavor text description of inside sight/sound/smells/feels.
|
desc = "It's a belly! You're in it!" // Flavor text description of inside sight/sound/smells/feels.
|
||||||
var/vore_sound = 'sound/vore/gulp.ogg' // Sound when ingesting someone
|
var/vore_sound = 'sound/vore/gulp.ogg' // Sound when ingesting someone
|
||||||
var/vore_verb = "ingest" // Verb for eating with this in messages
|
var/vore_verb = "ingest" // Verb for eating with this in messages
|
||||||
var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
|
var/human_prey_swallow_time = 100 // Time in deciseconds to swallow /mob/living/carbon/human
|
||||||
var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else
|
var/nonhuman_prey_swallow_time = 30 // Time in deciseconds to swallow anything else
|
||||||
var/emoteTime = 600 // How long between stomach emotes at prey
|
var/emote_time = 60 SECONDS // How long between stomach emotes at prey
|
||||||
var/digest_brute = 2 // Brute damage per tick in digestion mode
|
var/digest_brute = 2 // Brute damage per tick in digestion mode
|
||||||
var/digest_burn = 3 // Burn damage per tick in digestion mode
|
var/digest_burn = 2 // Burn damage per tick in digestion mode
|
||||||
var/digest_tickrate = 3 // Modulus this of air controller tick number to iterate gurgles on
|
var/digest_tickrate = 3 // Modulus this of air controller tick number to iterate gurgles on
|
||||||
var/immutable = 0 // Prevents this belly from being deleted
|
var/immutable = 0 // Prevents this belly from being deleted
|
||||||
var/escapable = 0 // Belly can be resisted out of at any time
|
var/escapable = 0 // Belly can be resisted out of at any time
|
||||||
@@ -29,19 +31,20 @@
|
|||||||
var/can_taste = 0 // If this belly prints the flavor of prey when it eats someone.
|
var/can_taste = 0 // If this belly prints the flavor of prey when it eats someone.
|
||||||
var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
|
var/bulge_size = 0.25 // The minimum size the prey has to be in order to show up on examine.
|
||||||
var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
|
var/shrink_grow_size = 1 // This horribly named variable determines the minimum/maximum size it will shrink/grow prey to.
|
||||||
var/datum/belly/transferlocation = null // Location that the prey is released if they struggle and get dropped off.
|
var/transferlocation // Location that the prey is released if they struggle and get dropped off.
|
||||||
|
var/release_sound = TRUE // Boolean for now, maybe replace with something else later
|
||||||
|
|
||||||
|
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
|
||||||
|
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes
|
||||||
|
var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG)
|
||||||
|
var/tmp/static/list/slots = list(slot_back,slot_handcuffed,slot_l_store,slot_r_store,slot_wear_mask,slot_l_hand,slot_r_hand,slot_wear_id,slot_glasses,slot_gloves,slot_head,slot_shoes,slot_belt,slot_wear_suit,slot_w_uniform,slot_s_store,slot_l_ear,slot_r_ear)
|
||||||
|
|
||||||
var/tmp/digest_mode = DM_HOLD // Whether or not to digest. Default to not digest.
|
|
||||||
var/tmp/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ITEMWEAK,DM_STRIPDIGEST,DM_HEAL,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_SHRINK,DM_GROW,DM_SIZE_STEAL,DM_DIGEST_NUMB) // Possible digest modes
|
|
||||||
var/tmp/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG)
|
|
||||||
var/tmp/mob/living/owner // The mob whose belly this is.
|
var/tmp/mob/living/owner // The mob whose belly this is.
|
||||||
var/tmp/list/internal_contents = list() // People/Things you've eaten into this belly!
|
var/tmp/digest_mode = DM_HOLD // Current mode the belly is set to from digest_modes (+transform_modes if human)
|
||||||
var/tmp/is_full // Flag for if digested remeans are present. (for disposal messages)
|
var/tmp/next_process = 0 // Waiting for this SSbellies times_fired to process again.
|
||||||
var/tmp/emotePend = FALSE // If there's already a spawned thing counting for the next emote
|
var/tmp/list/items_preserved = list() // Stuff that wont digest so we shouldn't process it again.
|
||||||
var/tmp/list/items_preserved = list() // Stuff that wont digest.
|
var/tmp/next_emote = 0 // When we're supposed to print our next emote, as a belly controller tick #
|
||||||
var/tmp/list/checked_slots = list() // Checked gear slots for strip digest.
|
var/tmp/recent_sound = FALSE // Prevent audio spam
|
||||||
var/list/slots = list(slot_back,slot_handcuffed,slot_l_store,slot_r_store,slot_wear_mask,slot_l_hand,slot_r_hand,slot_wear_id,slot_glasses,slot_gloves,slot_head,slot_shoes,slot_belt,slot_wear_suit,slot_w_uniform,slot_s_store,slot_l_ear,slot_r_ear)
|
|
||||||
|
|
||||||
|
|
||||||
// Don't forget to watch your commas at the end of each line if you change these.
|
// Don't forget to watch your commas at the end of each line if you change these.
|
||||||
var/list/struggle_messages_outside = list(
|
var/list/struggle_messages_outside = list(
|
||||||
@@ -97,56 +100,77 @@
|
|||||||
//List has indexes that are the digestion mode strings, and keys that are lists of strings.
|
//List has indexes that are the digestion mode strings, and keys that are lists of strings.
|
||||||
var/tmp/list/emote_lists = list()
|
var/tmp/list/emote_lists = list()
|
||||||
|
|
||||||
// Constructor that sets the owning mob
|
/obj/belly/initialize()
|
||||||
/datum/belly/New(var/mob/living/owning_mob)
|
. = ..()
|
||||||
owner = owning_mob
|
//If not, we're probably just in a prefs list or something.
|
||||||
|
if(isliving(loc))
|
||||||
|
owner = loc
|
||||||
|
owner.vore_organs |= src
|
||||||
|
SSbellies.belly_list += src
|
||||||
|
|
||||||
// Toggle digestion on/off and notify user of the new setting.
|
/obj/belly/Destroy()
|
||||||
// If multiple digestion modes are avaliable (i.e. unbirth) then user should be prompted.
|
SSbellies.belly_list -= src
|
||||||
/datum/belly/proc/toggle_digestion()
|
if(owner)
|
||||||
return
|
owner.vore_organs -= src
|
||||||
|
owner = null
|
||||||
|
. = ..()
|
||||||
|
|
||||||
// Checks if any mobs are present inside the belly
|
// Called whenever an atom enters this belly
|
||||||
// return True if the belly is empty.
|
/obj/belly/Entered(var/atom/movable/thing,var/atom/OldLoc)
|
||||||
/datum/belly/proc/is_empty()
|
if(OldLoc in contents)
|
||||||
return internal_contents.len == 0
|
return //Someone dropping something (or being stripdigested)
|
||||||
|
|
||||||
|
//Generic entered message
|
||||||
|
to_chat(owner,"<span class='notice'>[thing] slides into your [lowertext(name)].</span>")
|
||||||
|
|
||||||
|
//Sound w/ antispam flag setting
|
||||||
|
if(vore_sound && !recent_sound)
|
||||||
|
playsound(src, vore_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||||
|
recent_sound = TRUE
|
||||||
|
|
||||||
|
//Messages if it's a mob
|
||||||
|
if(isliving(thing))
|
||||||
|
var/mob/living/M = thing
|
||||||
|
if(desc)
|
||||||
|
to_chat(M, "<span class='notice'><B>[desc]</B></span>")
|
||||||
|
var/taste
|
||||||
|
if(can_taste && (taste = M.get_taste_message(FALSE)))
|
||||||
|
to_chat(owner, "<span class='notice'>[M] tastes of [taste].</span>")
|
||||||
|
|
||||||
// Release all contents of this belly into the owning mob's location.
|
// Release all contents of this belly into the owning mob's location.
|
||||||
// If that location is another mob, contents are transferred into whichever of its bellies the owning mob is in.
|
// 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.
|
// Returns the number of mobs so released.
|
||||||
/datum/belly/proc/release_all_contents(var/include_absorbed = FALSE)
|
/obj/belly/proc/release_all_contents(var/include_absorbed = FALSE)
|
||||||
if (internal_contents.len == 0)
|
var/atom/destination = drop_location()
|
||||||
return 0
|
var/count = 0
|
||||||
for (var/M in internal_contents)
|
for(var/thing in contents)
|
||||||
if(istype(M,/mob/living))
|
var/atom/movable/AM = thing
|
||||||
var/mob/living/ML = M
|
if(isliving(AM))
|
||||||
if(ML.absorbed && !include_absorbed)
|
var/mob/living/L = AM
|
||||||
|
if(L.absorbed && !include_absorbed)
|
||||||
continue
|
continue
|
||||||
ML.absorbed = FALSE
|
L.absorbed = FALSE
|
||||||
|
|
||||||
var/atom/movable/AM = M
|
AM.forceMove(destination) // Move the belly contents into the same location as belly's owner.
|
||||||
AM.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
|
count++
|
||||||
internal_contents -= AM // Remove from the belly contents
|
|
||||||
var/datum/belly/B = check_belly(owner) // This makes sure that the mob behaves properly if released into another mob
|
|
||||||
if(B)
|
|
||||||
B.internal_contents += AM
|
|
||||||
items_preserved.Cut()
|
items_preserved.Cut()
|
||||||
checked_slots.Cut()
|
|
||||||
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
|
owner.visible_message("<font color='green'><b>[owner] expels everything from their [lowertext(name)]!</b></font>")
|
||||||
owner.update_icons()
|
owner.update_icons()
|
||||||
return 1
|
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.
|
// Release a specific atom from the contents of this belly into the owning mob's location.
|
||||||
// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
|
// If that location is another mob, the atom is transferred into whichever of its bellies the owning mob is in.
|
||||||
// Returns the number of atoms so released.
|
// Returns the number of atoms so released.
|
||||||
/datum/belly/proc/release_specific_contents(var/atom/movable/M)
|
/obj/belly/proc/release_specific_contents(var/atom/movable/M)
|
||||||
if (!(M in internal_contents))
|
if (!(M in contents))
|
||||||
return 0 // They weren't in this belly anyway
|
return 0 // They weren't in this belly anyway
|
||||||
|
|
||||||
M.forceMove(owner.loc) // Move the belly contents into the same location as belly's owner.
|
M.forceMove(drop_location()) // Move the belly contents into the same location as belly's owner.
|
||||||
src.internal_contents -= M // Remove from the belly contents
|
items_preserved -= M
|
||||||
if(M in items_preserved)
|
if(release_sound)
|
||||||
src.items_preserved -= M
|
playsound(src, 'sound/effects/splat.ogg', vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/eating_noises)
|
||||||
|
|
||||||
if(istype(M,/mob/living))
|
if(istype(M,/mob/living))
|
||||||
var/mob/living/ML = M
|
var/mob/living/ML = M
|
||||||
@@ -156,17 +180,12 @@
|
|||||||
if(ishuman(M) && ishuman(OW))
|
if(ishuman(M) && ishuman(OW))
|
||||||
var/mob/living/carbon/human/Prey = M
|
var/mob/living/carbon/human/Prey = M
|
||||||
var/mob/living/carbon/human/Pred = OW
|
var/mob/living/carbon/human/Pred = OW
|
||||||
// TODO - If we ever find a way to share reagent containers, un-share them here
|
|
||||||
var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion
|
var/absorbed_count = 2 //Prey that we were, plus the pred gets a portion
|
||||||
for(var/mob/living/P in internal_contents)
|
for(var/mob/living/P in contents)
|
||||||
if(P.absorbed)
|
if(P.absorbed)
|
||||||
absorbed_count++
|
absorbed_count++
|
||||||
Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
|
Pred.bloodstr.trans_to(Prey, Pred.reagents.total_volume / absorbed_count)
|
||||||
|
|
||||||
var/datum/belly/B = check_belly(owner)
|
|
||||||
if(B)
|
|
||||||
B.internal_contents += M
|
|
||||||
|
|
||||||
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
|
owner.visible_message("<font color='green'><b>[owner] expels [M] from their [lowertext(name)]!</b></font>")
|
||||||
owner.update_icons()
|
owner.update_icons()
|
||||||
return 1
|
return 1
|
||||||
@@ -174,38 +193,32 @@
|
|||||||
// Actually perform the mechanics of devouring the tasty prey.
|
// Actually perform the mechanics of devouring the tasty prey.
|
||||||
// The purpose of this method is to avoid duplicate code, and ensure that all necessary
|
// The purpose of this method is to avoid duplicate code, and ensure that all necessary
|
||||||
// steps are taken.
|
// steps are taken.
|
||||||
/datum/belly/proc/nom_mob(var/mob/prey, var/mob/user)
|
/obj/belly/proc/nom_mob(var/mob/prey, var/mob/user)
|
||||||
if(owner.stat == DEAD)
|
if(owner.stat == DEAD)
|
||||||
return
|
return
|
||||||
if (prey.buckled)
|
if (prey.buckled)
|
||||||
prey.buckled.unbuckle_mob()
|
prey.buckled.unbuckle_mob()
|
||||||
|
|
||||||
prey.forceMove(owner)
|
prey.forceMove(src)
|
||||||
internal_contents |= prey
|
|
||||||
owner.updateVRPanel()
|
owner.updateVRPanel()
|
||||||
for(var/mob/living/M in internal_contents)
|
|
||||||
|
for(var/mob/living/M in contents)
|
||||||
M.updateVRPanel()
|
M.updateVRPanel()
|
||||||
|
|
||||||
if(inside_flavor)
|
|
||||||
prey << "<span class='notice'><B>[inside_flavor]</B></span>"
|
|
||||||
|
|
||||||
for(var/obj/item/weapon/storage/S in prey)
|
|
||||||
S.hide_from(owner)
|
|
||||||
|
|
||||||
// Get the line that should show up in Examine message if the owner of this belly
|
// Get the line that should show up in Examine message if the owner of this belly
|
||||||
// is examined. By making this a proc, we not only take advantage of polymorphism,
|
// is examined. By making this a proc, we not only take advantage of polymorphism,
|
||||||
// but can easily make the message vary based on how many people are inside, etc.
|
// but can easily make the message vary based on how many people are inside, etc.
|
||||||
// Returns a string which shoul be appended to the Examine output.
|
// Returns a string which shoul be appended to the Examine output.
|
||||||
/datum/belly/proc/get_examine_msg()
|
/obj/belly/proc/get_examine_msg()
|
||||||
if(internal_contents.len && examine_messages.len)
|
if(contents.len && examine_messages.len)
|
||||||
var/formatted_message
|
var/formatted_message
|
||||||
var/raw_message = pick(examine_messages)
|
var/raw_message = pick(examine_messages)
|
||||||
var/total_bulge = 0
|
var/total_bulge = 0
|
||||||
|
|
||||||
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
|
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
|
||||||
formatted_message = replacetext(formatted_message,"%pred",owner)
|
formatted_message = replacetext(formatted_message,"%pred",owner)
|
||||||
formatted_message = replacetext(formatted_message,"%prey",english_list(internal_contents))
|
formatted_message = replacetext(formatted_message,"%prey",english_list(contents))
|
||||||
for(var/mob/living/P in internal_contents)
|
for(var/mob/living/P in contents)
|
||||||
if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
|
if(!P.absorbed) //This is required first, in case there's a person absorbed and not absorbed in a stomach.
|
||||||
total_bulge += P.size_multiplier
|
total_bulge += P.size_multiplier
|
||||||
if(total_bulge >= bulge_size && bulge_size != 0)
|
if(total_bulge >= bulge_size && bulge_size != 0)
|
||||||
@@ -216,7 +229,7 @@
|
|||||||
// The next function gets the messages set on the belly, in human-readable format.
|
// The next function gets the messages set on the belly, in human-readable format.
|
||||||
// This is useful in customization boxes and such. The delimiter right now is \n\n so
|
// This is useful in customization boxes and such. The delimiter right now is \n\n so
|
||||||
// in message boxes, this looks nice and is easily delimited.
|
// in message boxes, this looks nice and is easily delimited.
|
||||||
/datum/belly/proc/get_messages(var/type, var/delim = "\n\n")
|
/obj/belly/proc/get_messages(var/type, var/delim = "\n\n")
|
||||||
ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
|
ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
|
||||||
var/list/raw_messages
|
var/list/raw_messages
|
||||||
|
|
||||||
@@ -238,18 +251,18 @@
|
|||||||
// The next function sets the messages on the belly, from human-readable var
|
// The next function sets the messages on the belly, from human-readable var
|
||||||
// replacement strings and linebreaks as delimiters (two \n\n by default).
|
// replacement strings and linebreaks as delimiters (two \n\n by default).
|
||||||
// They also sanitize the messages.
|
// They also sanitize the messages.
|
||||||
/datum/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n")
|
/obj/belly/proc/set_messages(var/raw_text, var/type, var/delim = "\n\n")
|
||||||
ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
|
ASSERT(type == "smo" || type == "smi" || type == "dmo" || type == "dmp" || type == "em")
|
||||||
|
|
||||||
var/list/raw_list = text2list(html_encode(raw_text),delim)
|
var/list/raw_list = text2list(html_encode(raw_text),delim)
|
||||||
if(raw_list.len > 10)
|
if(raw_list.len > 10)
|
||||||
raw_list.Cut(11)
|
raw_list.Cut(11)
|
||||||
log_debug("[owner] tried to set [name] with 11+ messages")
|
log_debug("[owner] tried to set [lowertext(name)] with 11+ messages")
|
||||||
|
|
||||||
for(var/i = 1, i <= raw_list.len, i++)
|
for(var/i = 1, i <= raw_list.len, i++)
|
||||||
if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
|
if(length(raw_list[i]) > 160 || length(raw_list[i]) < 10) //160 is fudged value due to htmlencoding increasing the size
|
||||||
raw_list.Cut(i,i)
|
raw_list.Cut(i,i)
|
||||||
log_debug("[owner] tried to set [name] with >121 or <10 char message")
|
log_debug("[owner] tried to set [lowertext(name)] with >121 or <10 char message")
|
||||||
else
|
else
|
||||||
raw_list[i] = readd_quotes(raw_list[i])
|
raw_list[i] = readd_quotes(raw_list[i])
|
||||||
//Also fix % sign for var replacement
|
//Also fix % sign for var replacement
|
||||||
@@ -275,45 +288,36 @@
|
|||||||
// Called from the process_Life() methods of bellies that digest prey.
|
// Called from the process_Life() methods of bellies that digest prey.
|
||||||
// Default implementation calls M.death() and removes from internal contents.
|
// Default implementation calls M.death() and removes from internal contents.
|
||||||
// Indigestable items are removed, and M is deleted.
|
// Indigestable items are removed, and M is deleted.
|
||||||
/datum/belly/proc/digestion_death(var/mob/living/M)
|
/obj/belly/proc/digestion_death(var/mob/living/M)
|
||||||
is_full = 1
|
|
||||||
//M.death(1) // "Stop it he's already dead..." Basically redundant and the reason behind screaming mouse carcasses.
|
//M.death(1) // "Stop it he's already dead..." Basically redundant and the reason behind screaming mouse carcasses.
|
||||||
if(M.ckey)
|
if(M.ckey)
|
||||||
message_admins("[key_name(owner)] has digested [key_name(M)] in their [name] ([owner ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[owner.x];Y=[owner.y];Z=[owner.z]'>JMP</a>" : "null"])")
|
message_admins("[key_name(owner)] has digested [key_name(M)] in their [lowertext(name)] ([owner ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[owner.x];Y=[owner.y];Z=[owner.z]'>JMP</a>" : "null"])")
|
||||||
internal_contents -= M
|
|
||||||
|
|
||||||
// If digested prey is also a pred... anyone inside their bellies gets moved up.
|
// If digested prey is also a pred... anyone inside their bellies gets moved up.
|
||||||
if(is_vore_predator(M))
|
if(is_vore_predator(M))
|
||||||
for(var/bellytype in M.vore_organs)
|
for(var/belly in M.vore_organs)
|
||||||
var/datum/belly/belly = M.vore_organs[bellytype]
|
var/obj/belly/B = belly
|
||||||
for (var/obj/thing in belly.internal_contents)
|
for(var/thing in B)
|
||||||
thing.loc = owner
|
var/atom/movable/AM = thing
|
||||||
internal_contents += thing
|
AM.forceMove(owner.loc)
|
||||||
for (var/mob/subprey in belly.internal_contents)
|
if(isliving(AM))
|
||||||
subprey.loc = owner
|
to_chat(AM,"As [M] melts away around you, you find yourself in [owner]'s [lowertext(name)]")
|
||||||
internal_contents += subprey
|
|
||||||
subprey << "As [M] melts away around you, you find yourself in [owner]'s [name]"
|
|
||||||
|
|
||||||
//Drop all items into the belly.
|
//Drop all items into the belly.
|
||||||
if(config.items_survive_digestion)
|
if(config.items_survive_digestion)
|
||||||
var/mob/living/carbon/human/H = M
|
for(var/obj/item/W in M)
|
||||||
if(!H)
|
|
||||||
H = owner
|
|
||||||
for(var/obj/item/W in H)
|
|
||||||
if(istype(W,/obj/item/organ/internal/mmi_holder/posibrain))
|
if(istype(W,/obj/item/organ/internal/mmi_holder/posibrain))
|
||||||
var/obj/item/organ/internal/mmi_holder/MMI = W
|
var/obj/item/organ/internal/mmi_holder/MMI = W
|
||||||
var/atom/movable/brain = MMI.removed()
|
var/atom/movable/brain = MMI.removed()
|
||||||
if(brain)
|
if(brain)
|
||||||
H.remove_from_mob(brain,owner)
|
M.remove_from_mob(brain,owner)
|
||||||
brain.forceMove(owner)
|
brain.forceMove(src)
|
||||||
items_preserved += brain
|
items_preserved += brain
|
||||||
internal_contents += brain
|
|
||||||
for(var/slot in slots)
|
for(var/slot in slots)
|
||||||
var/obj/item/thingy = M.get_equipped_item(slot = slot)
|
var/obj/item/thingy = M.get_equipped_item(slot = slot)
|
||||||
if(thingy)
|
if(thingy)
|
||||||
M.unEquip(thingy,force = TRUE)
|
M.unEquip(thingy,force = TRUE)
|
||||||
thingy.forceMove(owner)
|
thingy.forceMove(src)
|
||||||
internal_contents |= thingy
|
|
||||||
|
|
||||||
//Reagent transfer
|
//Reagent transfer
|
||||||
if(ishuman(owner))
|
if(ishuman(owner))
|
||||||
@@ -331,10 +335,10 @@
|
|||||||
qdel(M)
|
qdel(M)
|
||||||
|
|
||||||
// Handle a mob being absorbed
|
// Handle a mob being absorbed
|
||||||
/datum/belly/proc/absorb_living(var/mob/living/M)
|
/obj/belly/proc/absorb_living(var/mob/living/M)
|
||||||
M.absorbed = 1
|
M.absorbed = 1
|
||||||
M << "<span class='notice'>[owner]'s [name] absorbs your body, making you part of them.</span>"
|
to_chat(M,"<span class='notice'>[owner]'s [lowertext(name)] absorbs your body, making you part of them.</span>")
|
||||||
owner << "<span class='notice'>Your [name] absorbs [M]'s body, making them part of you.</span>"
|
to_chat(owner,"<span class='notice'>Your [lowertext(name)] absorbs [M]'s body, making them part of you.</span>")
|
||||||
|
|
||||||
if(ishuman(M) && ishuman(owner))
|
if(ishuman(M) && ishuman(owner))
|
||||||
var/mob/living/carbon/human/Prey = M
|
var/mob/living/carbon/human/Prey = M
|
||||||
@@ -348,55 +352,68 @@
|
|||||||
// problems when A absorbs B, and then C absorbs A, resulting in B holding onto an invalid reagent container.
|
// problems when A absorbs B, and then C absorbs A, resulting in B holding onto an invalid reagent container.
|
||||||
|
|
||||||
//This is probably already the case, but for sub-prey, it won't be.
|
//This is probably already the case, but for sub-prey, it won't be.
|
||||||
M.forceMove(owner)
|
if(M.loc != src)
|
||||||
|
M.forceMove(src)
|
||||||
|
|
||||||
//Seek out absorbed prey of the prey, absorb them too.
|
//Seek out absorbed prey of the prey, absorb them too.
|
||||||
//This in particular will recurse oddly because if there is absorbed prey of prey of prey...
|
//This in particular will recurse oddly because if there is absorbed prey of prey of prey...
|
||||||
//it will just move them up one belly. This should never happen though since... when they were
|
//it will just move them up one belly. This should never happen though since... when they were
|
||||||
//absobred, they should have been absorbed as well!
|
//absobred, they should have been absorbed as well!
|
||||||
for(var/I in M.vore_organs)
|
for(var/belly in M.vore_organs)
|
||||||
var/datum/belly/B = M.vore_organs[I]
|
var/obj/belly/B = belly
|
||||||
for(var/mob/living/Mm in B.internal_contents)
|
for(var/mob/living/Mm in B)
|
||||||
if(Mm.absorbed)
|
if(Mm.absorbed)
|
||||||
internal_contents += Mm
|
|
||||||
B.internal_contents -= Mm
|
|
||||||
absorb_living(Mm)
|
absorb_living(Mm)
|
||||||
|
|
||||||
|
//Update owner
|
||||||
|
owner.updateVRPanel()
|
||||||
|
|
||||||
//Digest a single item
|
//Digest a single item
|
||||||
//Receives a return value from digest_act that's how much nutrition
|
//Receives a return value from digest_act that's how much nutrition
|
||||||
//the item should be worth
|
//the item should be worth
|
||||||
/datum/belly/proc/digest_item(var/obj/item/item)
|
/obj/belly/proc/digest_item(var/obj/item/item)
|
||||||
var/digested = item.digest_act(internal_contents, owner)
|
var/digested = item.digest_act(src, owner)
|
||||||
if(!digested)
|
if(!digested)
|
||||||
items_preserved |= item
|
items_preserved |= item
|
||||||
else
|
else
|
||||||
internal_contents -= item
|
|
||||||
owner.nutrition += (5 * digested)
|
owner.nutrition += (5 * digested)
|
||||||
if(isrobot(owner))
|
if(isrobot(owner))
|
||||||
var/mob/living/silicon/robot/R = owner
|
var/mob/living/silicon/robot/R = owner
|
||||||
R.cell.charge += (50 * digested)
|
R.cell.charge += (50 * digested)
|
||||||
|
|
||||||
|
//Determine where items should fall out of us into.
|
||||||
|
//Typically just to the owner's location.
|
||||||
|
/obj/belly/drop_location()
|
||||||
|
//Should be the case 99.99% of the time
|
||||||
|
if(owner)
|
||||||
|
return owner.loc
|
||||||
|
//Sketchy fallback for safety, put them somewhere safe.
|
||||||
|
else
|
||||||
|
log_debug("[src] (\ref[src]) doesn't have an owner, and dropped someone at a latespawn point!")
|
||||||
|
var/fallback = pick(latejoin)
|
||||||
|
return get_turf(fallback)
|
||||||
|
|
||||||
//Handle a mob struggling
|
//Handle a mob struggling
|
||||||
// Called from /mob/living/carbon/relaymove()
|
// Called from /mob/living/carbon/relaymove()
|
||||||
/datum/belly/proc/relay_resist(var/mob/living/R)
|
/obj/belly/proc/relay_resist(var/mob/living/R)
|
||||||
if (!(R in internal_contents))
|
if (!(R in contents))
|
||||||
return // User is not in this belly, or struggle too soon.
|
return // User is not in this belly
|
||||||
|
|
||||||
R.setClickCooldown(50)
|
R.setClickCooldown(50)
|
||||||
|
|
||||||
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
|
if(owner.stat) //If owner is stat (dead, KO) we can actually escape
|
||||||
R << "<span class='warning'>You attempt to climb out of \the [name]. (This will take around [escapetime/10] seconds.)</span>"
|
to_chat(R,"<span class='warning'>You attempt to climb out of \the [lowertext(name)]. (This will take around [escapetime/10] seconds.)</span>")
|
||||||
owner << "<span class='warning'>Someone is attempting to climb out of your [name]!</span>"
|
to_chat(owner,"<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
|
||||||
|
|
||||||
if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
|
if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
|
||||||
if((owner.stat || escapable) && (R in internal_contents)) //Can still escape?
|
if((owner.stat || escapable) && (R.loc == src)) //Can still escape?
|
||||||
release_specific_contents(R)
|
release_specific_contents(R)
|
||||||
return
|
return
|
||||||
else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
|
else if(R.loc != src) //Aren't even in the belly. Quietly fail.
|
||||||
return
|
return
|
||||||
else //Belly became inescapable or mob revived
|
else //Belly became inescapable or mob revived
|
||||||
R << "<span class='warning'>Your attempt to escape [name] has failed!</span>"
|
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed!</span>")
|
||||||
owner << "<span class='notice'>The attempt to escape from your [name] has failed!</span>"
|
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
|
||||||
return
|
return
|
||||||
return
|
return
|
||||||
var/struggle_outer_message = pick(struggle_messages_outside)
|
var/struggle_outer_message = pick(struggle_messages_outside)
|
||||||
@@ -415,112 +432,96 @@
|
|||||||
|
|
||||||
for(var/mob/M in hearers(4, owner))
|
for(var/mob/M in hearers(4, owner))
|
||||||
M.show_message(struggle_outer_message, 2) // hearable
|
M.show_message(struggle_outer_message, 2) // hearable
|
||||||
R << struggle_user_message
|
to_chat(R,struggle_user_message)
|
||||||
|
|
||||||
var/strpick = pick(struggle_sounds)
|
var/strpick = pick(struggle_sounds)
|
||||||
var/strsound = struggle_sounds[strpick]
|
var/strsound = struggle_sounds[strpick]
|
||||||
playsound(R.loc, strsound, 50, 1)
|
playsound(src, strsound, vary = 1, vol = 100, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises)
|
||||||
|
|
||||||
if(escapable) //If the stomach has escapable enabled.
|
if(escapable) //If the stomach has escapable enabled.
|
||||||
if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
|
if(prob(escapechance)) //Let's have it check to see if the prey escapes first.
|
||||||
R << "<span class='warning'>You start to climb out of \the [name].</span>"
|
to_chat(R,"<span class='warning'>You start to climb out of \the [lowertext(name)].</span>")
|
||||||
owner << "<span class='warning'>Someone is attempting to climb out of your [name]!</span>"
|
to_chat(owner,"<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
|
||||||
if(do_after(R, escapetime))
|
if(do_after(R, escapetime))
|
||||||
if((escapable) && (R in internal_contents) && !R.absorbed) //Does the owner still have escapable enabled?
|
if((escapable) && (R.loc == src) && !R.absorbed) //Does the owner still have escapable enabled?
|
||||||
release_specific_contents(R)
|
release_specific_contents(R)
|
||||||
R << "<span class='warning'>You climb out of \the [name].</span>"
|
to_chat(R,"<span class='warning'>You climb out of \the [lowertext(name)].</span>")
|
||||||
owner << "<span class='warning'>[R] climbs out of your [name]!</span>"
|
to_chat(owner,"<span class='warning'>[R] climbs out of your [lowertext(name)]!</span>")
|
||||||
for(var/mob/M in hearers(4, owner))
|
for(var/mob/M in hearers(4, owner))
|
||||||
M.show_message("<span class='warning'>[R] climbs out of [owner]'s [name]!</span>", 2)
|
M.show_message("<span class='warning'>[R] climbs out of [owner]'s [lowertext(name)]!</span>", 2)
|
||||||
return
|
return
|
||||||
else if(!(R in internal_contents)) //Aren't even in the belly. Quietly fail.
|
else if(!(R.loc == src)) //Aren't even in the belly. Quietly fail.
|
||||||
return
|
return
|
||||||
else //Belly became inescapable.
|
else //Belly became inescapable.
|
||||||
R << "<span class='warning'>Your attempt to escape [name] has failed!</span>"
|
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed!</span>")
|
||||||
owner << "<span class='notice'>The attempt to escape from your [name] has failed!</span>"
|
to_chat(owner,"<span class='notice'>The attempt to escape from your [lowertext(name)] has failed!</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
else if(prob(transferchance) && istype(transferlocation)) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
|
else if(prob(transferchance) && transferlocation) //Next, let's have it see if they end up getting into an even bigger mess then when they started.
|
||||||
var/location_found = 0
|
var/obj/belly/dest_belly
|
||||||
var/name_found = 0
|
for(var/belly in owner.vore_organs)
|
||||||
for(var/I in owner.vore_organs)
|
var/obj/belly/B = belly
|
||||||
var/datum/belly/B = owner.vore_organs[I]
|
if(B.name == transferlocation)
|
||||||
if(B == transferlocation)
|
dest_belly = B
|
||||||
location_found = 1
|
|
||||||
break
|
break
|
||||||
|
|
||||||
if(!location_found)
|
if(!dest_belly)
|
||||||
for(var/I in owner.vore_organs)
|
to_chat(owner, "<span class='warning'>Something went wrong with your belly transfer settings. Your <b>[lowertext(name)]</b> has had it's transfer chance and transfer location cleared as a precaution.</span>")
|
||||||
var/datum/belly/B = owner.vore_organs[I]
|
transferchance = 0
|
||||||
if(B.name == transferlocation.name)
|
|
||||||
name_found = 1
|
|
||||||
transferlocation = B
|
|
||||||
break
|
|
||||||
|
|
||||||
if(!location_found && !name_found)
|
|
||||||
to_chat(owner, "<span class='warning'>Something went wrong with your belly transfer settings.</span>")
|
|
||||||
transferlocation = null
|
transferlocation = null
|
||||||
return
|
return
|
||||||
|
|
||||||
R << "<span class='warning'>Your attempt to escape [name] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!</span>"
|
to_chat(R,"<span class='warning'>Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!</span>")
|
||||||
owner << "<span class='warning'>Someone slid into your [transferlocation] due to their struggling inside your [name]!</span>"
|
to_chat(owner,"<span class='warning'>Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!</span>")
|
||||||
transfer_contents(R, transferlocation)
|
transfer_contents(R, dest_belly)
|
||||||
return
|
return
|
||||||
|
|
||||||
else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance.
|
else if(prob(absorbchance) && digest_mode != DM_ABSORB) //After that, let's have it run the absorb chance.
|
||||||
R << "<span class='warning'>In response to your struggling, \the [name] begins to cling more tightly...</span>"
|
to_chat(R,"<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to cling more tightly...</span>")
|
||||||
owner << "<span class='warning'>You feel your [name] start to cling onto its contents...</span>"
|
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] start to cling onto its contents...</span>")
|
||||||
digest_mode = DM_ABSORB
|
digest_mode = DM_ABSORB
|
||||||
return
|
return
|
||||||
|
|
||||||
else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
|
else if(prob(digestchance) && digest_mode != DM_ITEMWEAK && digest_mode != DM_DIGEST) //Finally, let's see if it should run the digest chance.
|
||||||
R << "<span class='warning'>In response to your struggling, \the [name] begins to get more active...</span>"
|
to_chat(R,"<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get more active...</span>")
|
||||||
owner << "<span class='warning'>You feel your [name] beginning to become active!</span>"
|
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] beginning to become active!</span>")
|
||||||
digest_mode = DM_ITEMWEAK
|
digest_mode = DM_ITEMWEAK
|
||||||
return
|
return
|
||||||
|
|
||||||
else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice!
|
else if(prob(digestchance) && digest_mode == DM_ITEMWEAK) //Oh god it gets even worse if you fail twice!
|
||||||
R << "<span class='warning'>In response to your struggling, \the [name] begins to get even more active!</span>"
|
to_chat(R,"<span class='warning'>In response to your struggling, \the [lowertext(name)] begins to get even more active!</span>")
|
||||||
owner << "<span class='warning'>You feel your [name] beginning to become even more active!</span>"
|
to_chat(owner,"<span class='warning'>You feel your [lowertext(name)] beginning to become even more active!</span>")
|
||||||
digest_mode = DM_DIGEST
|
digest_mode = DM_DIGEST
|
||||||
return
|
return
|
||||||
else //Nothing interesting happened.
|
else //Nothing interesting happened.
|
||||||
R << "<span class='warning'>You make no progress in escaping [owner]'s [name].</span>"
|
to_chat(R,"<span class='warning'>You make no progress in escaping [owner]'s [lowertext(name)].</span>")
|
||||||
owner << "<span class='warning'>Your prey appears to be unable to make any progress in escaping your [name].</span>"
|
to_chat(owner,"<span class='warning'>Your prey appears to be unable to make any progress in escaping your [lowertext(name)].</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
//Transfers contents from one belly to another
|
//Transfers contents from one belly to another
|
||||||
/datum/belly/proc/transfer_contents(var/atom/movable/content, var/datum/belly/target, silent = 0)
|
/obj/belly/proc/transfer_contents(var/atom/movable/content, var/obj/belly/target, silent = 0)
|
||||||
if(!(content in internal_contents))
|
if(!(content in src) || !istype(target))
|
||||||
return
|
return
|
||||||
internal_contents -= content
|
content.forceMove(target)
|
||||||
target.internal_contents += content
|
|
||||||
if(isliving(content))
|
|
||||||
var/mob/living/M = content
|
|
||||||
if(target.inside_flavor)
|
|
||||||
to_chat(M, "<span class='notice'><B>[target.inside_flavor]</B></span>")
|
|
||||||
if(target.can_taste && M.get_taste_message(0))
|
|
||||||
to_chat(owner, "<span class='notice'>[M] tastes of [M.get_taste_message(0)].</span>")
|
|
||||||
if(!silent)
|
if(!silent)
|
||||||
for(var/mob/hearer in range(1,owner))
|
playsound(src, target.vore_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/client_preference/digestion_noises)
|
||||||
hearer << sound(target.vore_sound,volume=80)
|
|
||||||
owner.updateVRPanel()
|
owner.updateVRPanel()
|
||||||
for(var/mob/living/M in internal_contents)
|
for(var/mob/living/M in contents)
|
||||||
M.updateVRPanel()
|
M.updateVRPanel()
|
||||||
|
|
||||||
// Belly copies and then returns the copy
|
// Belly copies and then returns the copy
|
||||||
// Needs to be updated for any var changes
|
// Needs to be updated for any var changes
|
||||||
/datum/belly/proc/copy(mob/new_owner)
|
/obj/belly/proc/copy(mob/new_owner)
|
||||||
var/datum/belly/dupe = new /datum/belly(new_owner)
|
var/obj/belly/dupe = new /obj/belly(new_owner)
|
||||||
|
|
||||||
//// Non-object variables
|
//// Non-object variables
|
||||||
dupe.name = name
|
dupe.name = name
|
||||||
dupe.inside_flavor = inside_flavor
|
dupe.desc = desc
|
||||||
dupe.vore_sound = vore_sound
|
dupe.vore_sound = vore_sound
|
||||||
dupe.vore_verb = vore_verb
|
dupe.vore_verb = vore_verb
|
||||||
dupe.human_prey_swallow_time = human_prey_swallow_time
|
dupe.human_prey_swallow_time = human_prey_swallow_time
|
||||||
dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
|
dupe.nonhuman_prey_swallow_time = nonhuman_prey_swallow_time
|
||||||
dupe.emoteTime = emoteTime
|
dupe.emote_time = emote_time
|
||||||
dupe.digest_brute = digest_brute
|
dupe.digest_brute = digest_brute
|
||||||
dupe.digest_burn = digest_burn
|
dupe.digest_burn = digest_burn
|
||||||
dupe.digest_tickrate = digest_tickrate
|
dupe.digest_tickrate = digest_tickrate
|
||||||
@@ -1,41 +1,48 @@
|
|||||||
// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
|
// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
|
||||||
// Called from /mob/living/Life() proc.
|
/obj/belly/proc/process_belly(var/times_fired,var/wait) //Passed by controller
|
||||||
/datum/belly/proc/process_Life()
|
if((times_fired < next_process) || !contents.len)
|
||||||
|
recent_sound = FALSE
|
||||||
|
return SSBELLIES_IGNORED
|
||||||
|
|
||||||
|
if(loc != owner)
|
||||||
|
if(istype(owner))
|
||||||
|
loc = owner
|
||||||
|
else
|
||||||
|
qdel(src)
|
||||||
|
return SSBELLIES_PROCESSED
|
||||||
|
|
||||||
|
next_process = times_fired + (6 SECONDS/wait) //Set up our next process time.
|
||||||
|
var/play_sound //Potential sound to play at the end to avoid code duplication.
|
||||||
|
|
||||||
/////////////////////////// Auto-Emotes ///////////////////////////
|
/////////////////////////// Auto-Emotes ///////////////////////////
|
||||||
if((digest_mode in emote_lists) && !emotePend)
|
if(contents.len && next_emote <= times_fired)
|
||||||
emotePend = TRUE
|
next_emote = times_fired + round(emote_time/wait,1)
|
||||||
|
|
||||||
spawn(emoteTime)
|
|
||||||
var/list/EL = emote_lists[digest_mode]
|
var/list/EL = emote_lists[digest_mode]
|
||||||
for(var/mob/living/M in internal_contents)
|
for(var/mob/living/M in contents)
|
||||||
if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)) // don't give digesty messages to indigestible people
|
if(M.digestable || !(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)) // don't give digesty messages to indigestible people
|
||||||
M << "<span class='notice'>[pick(EL)]</span>"
|
to_chat(M,"<span class='notice'>[pick(EL)]</span>")
|
||||||
src.emotePend = FALSE
|
|
||||||
|
|
||||||
/////////////////////////// Exit Early ////////////////////////////
|
/////////////////////////// Exit Early ////////////////////////////
|
||||||
var/list/touchable_items = internal_contents - items_preserved
|
var/list/touchable_items = contents - items_preserved
|
||||||
if(!length(touchable_items))
|
if(!length(touchable_items))
|
||||||
return
|
return SSBELLIES_PROCESSED
|
||||||
|
|
||||||
//////////////////////// Absorbed Handling ////////////////////////
|
//////////////////////// Absorbed Handling ////////////////////////
|
||||||
for(var/mob/living/M in internal_contents)
|
for(var/mob/living/M in contents)
|
||||||
if(M.absorbed)
|
if(M.absorbed)
|
||||||
M.Weaken(5)
|
M.Weaken(5)
|
||||||
|
|
||||||
///////////////////////////// DM_HOLD /////////////////////////////
|
///////////////////////////// DM_HOLD /////////////////////////////
|
||||||
if(digest_mode == DM_HOLD)
|
if(digest_mode == DM_HOLD)
|
||||||
return //Pretty boring, huh
|
return SSBELLIES_PROCESSED //Pretty boring, huh
|
||||||
|
|
||||||
//////////////////////////// DM_DIGEST ////////////////////////////
|
//////////////////////////// DM_DIGEST ////////////////////////////
|
||||||
else if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)
|
else if(digest_mode == DM_DIGEST || digest_mode == DM_DIGEST_NUMB || digest_mode == DM_ITEMWEAK)
|
||||||
|
|
||||||
if(prob(50)) //Was SO OFTEN. AAAA.
|
if(prob(50)) //Was SO OFTEN. AAAA.
|
||||||
var/churnsound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
for(var/mob/hearer in range(1,owner))
|
|
||||||
hearer << sound(churnsound,volume=80)
|
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
//Pref protection!
|
//Pref protection!
|
||||||
if (!M.digestable || M.absorbed)
|
if (!M.digestable || M.absorbed)
|
||||||
continue
|
continue
|
||||||
@@ -55,12 +62,10 @@
|
|||||||
digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
|
digest_alert_prey = replacetext(digest_alert_prey,"%belly",lowertext(name))
|
||||||
|
|
||||||
//Send messages
|
//Send messages
|
||||||
owner << "<span class='notice'>" + digest_alert_owner + "</span>"
|
to_chat(owner,"<span class='notice'>" + digest_alert_owner + "</span>")
|
||||||
M << "<span class='notice'>" + digest_alert_prey + "</span>"
|
to_chat(M,"<span class='notice'>" + digest_alert_prey + "</span>")
|
||||||
|
|
||||||
var/deathsound = pick(death_sounds)
|
play_sound = pick(death_sounds)
|
||||||
for(var/mob/hearer in range(1,owner))
|
|
||||||
hearer << deathsound
|
|
||||||
digestion_death(M)
|
digestion_death(M)
|
||||||
owner.update_icons()
|
owner.update_icons()
|
||||||
continue
|
continue
|
||||||
@@ -71,7 +76,6 @@
|
|||||||
H.bloodstr.add_reagent("numbenzyme",10)
|
H.bloodstr.add_reagent("numbenzyme",10)
|
||||||
|
|
||||||
// Deal digestion damage (and feed the pred)
|
// Deal digestion damage (and feed the pred)
|
||||||
if(!(M.status_flags & GODMODE))
|
|
||||||
M.adjustBruteLoss(digest_brute)
|
M.adjustBruteLoss(digest_brute)
|
||||||
M.adjustFireLoss(digest_burn)
|
M.adjustFireLoss(digest_burn)
|
||||||
|
|
||||||
@@ -93,28 +97,25 @@
|
|||||||
if(istype(T,/obj/item/weapon/reagent_containers/food) || istype(T,/obj/item/weapon/holder) || istype(T,/obj/item/organ))
|
if(istype(T,/obj/item/weapon/reagent_containers/food) || istype(T,/obj/item/weapon/holder) || istype(T,/obj/item/organ))
|
||||||
digest_item(T)
|
digest_item(T)
|
||||||
else
|
else
|
||||||
T.gurgle_contaminate(internal_contents, owner)
|
T.gurgle_contaminate(contents, owner)
|
||||||
items_preserved |= T
|
items_preserved |= T
|
||||||
else
|
else
|
||||||
digest_item(T)
|
digest_item(T)
|
||||||
|
|
||||||
owner.updateVRPanel()
|
owner.updateVRPanel()
|
||||||
return
|
|
||||||
|
|
||||||
//////////////////////////// DM_STRIPDIGEST ////////////////////////////
|
//////////////////////////// DM_STRIPDIGEST ////////////////////////////
|
||||||
else if(digest_mode == DM_STRIPDIGEST) // Only gurgle the gear off your prey.
|
else if(digest_mode == DM_STRIPDIGEST) // Only gurgle the gear off your prey.
|
||||||
|
|
||||||
if(prob(50))
|
if(prob(50))
|
||||||
var/churnsound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
for(var/mob/hearer in range(1,owner))
|
|
||||||
hearer << sound(churnsound,volume=80)
|
|
||||||
|
|
||||||
// Handle loose items first.
|
// Handle loose items first.
|
||||||
var/obj/item/T = pick(touchable_items)
|
var/obj/item/T = pick(touchable_items)
|
||||||
if(istype(T))
|
if(istype(T))
|
||||||
digest_item(T)
|
digest_item(T)
|
||||||
|
|
||||||
for(var/mob/living/carbon/human/M in internal_contents)
|
for(var/mob/living/carbon/human/M in contents)
|
||||||
if (M.absorbed)
|
if (M.absorbed)
|
||||||
continue
|
continue
|
||||||
for(var/slot in slots)
|
for(var/slot in slots)
|
||||||
@@ -122,22 +123,19 @@
|
|||||||
if(thingy)
|
if(thingy)
|
||||||
M.unEquip(thingy,force = TRUE)
|
M.unEquip(thingy,force = TRUE)
|
||||||
thingy.forceMove(owner)
|
thingy.forceMove(owner)
|
||||||
internal_contents |= thingy
|
contents |= thingy
|
||||||
digest_item(T)
|
digest_item(T)
|
||||||
M.updateVRPanel()
|
M.updateVRPanel()
|
||||||
|
|
||||||
owner.updateVRPanel()
|
owner.updateVRPanel()
|
||||||
return
|
|
||||||
|
|
||||||
//////////////////////////// DM_ABSORB ////////////////////////////
|
//////////////////////////// DM_ABSORB ////////////////////////////
|
||||||
else if(digest_mode == DM_ABSORB)
|
else if(digest_mode == DM_ABSORB)
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
|
|
||||||
if(prob(10)) //Less often than gurgles. People might leave this on forever.
|
if(prob(10)) //Less often than gurgles. People might leave this on forever.
|
||||||
var/absorbsound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
M << sound(absorbsound,volume=80)
|
|
||||||
owner << sound(absorbsound,volume=80)
|
|
||||||
|
|
||||||
if(M.absorbed)
|
if(M.absorbed)
|
||||||
continue
|
continue
|
||||||
@@ -149,48 +147,36 @@
|
|||||||
else if(M.nutrition < 100) //When they're finally drained.
|
else if(M.nutrition < 100) //When they're finally drained.
|
||||||
absorb_living(M)
|
absorb_living(M)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////// DM_UNABSORB ////////////////////////////
|
//////////////////////////// DM_UNABSORB ////////////////////////////
|
||||||
else if(digest_mode == DM_UNABSORB)
|
else if(digest_mode == DM_UNABSORB)
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
if(M.absorbed && owner.nutrition >= 100)
|
if(M.absorbed && owner.nutrition >= 100)
|
||||||
M.absorbed = 0
|
M.absorbed = 0
|
||||||
M << "<span class='notice'>You suddenly feel solid again </span>"
|
to_chat(M,"<span class='notice'>You suddenly feel solid again </span>")
|
||||||
owner << "<span class='notice'>You feel like a part of you is missing.</span>"
|
to_chat(owner,"<span class='notice'>You feel like a part of you is missing.</span>")
|
||||||
owner.nutrition -= 100
|
owner.nutrition -= 100
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////// DM_DRAIN ////////////////////////////
|
//////////////////////////// DM_DRAIN ////////////////////////////
|
||||||
else if(digest_mode == DM_DRAIN)
|
else if(digest_mode == DM_DRAIN)
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
|
|
||||||
if(prob(10)) //Less often than gurgles. People might leave this on forever.
|
if(prob(10)) //Less often than gurgles. People might leave this on forever.
|
||||||
var/drainsound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
M << sound(drainsound,volume=80)
|
|
||||||
owner << sound(drainsound,volume=80)
|
|
||||||
|
|
||||||
if(M.nutrition >= 100) //Drain them until there's no nutrients left.
|
if(M.nutrition >= 100) //Drain them until there's no nutrients left.
|
||||||
var/oldnutrition = (M.nutrition * 0.05)
|
var/oldnutrition = (M.nutrition * 0.05)
|
||||||
M.nutrition = (M.nutrition * 0.95)
|
M.nutrition = (M.nutrition * 0.95)
|
||||||
owner.nutrition += oldnutrition
|
owner.nutrition += oldnutrition
|
||||||
return
|
|
||||||
return
|
|
||||||
|
|
||||||
//////////////////////////// DM_SHRINK ////////////////////////////
|
//////////////////////////// DM_SHRINK ////////////////////////////
|
||||||
else if(digest_mode == DM_SHRINK)
|
else if(digest_mode == DM_SHRINK)
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
|
|
||||||
if(prob(10)) //Infinite gurgles!
|
if(prob(10)) //Infinite gurgles!
|
||||||
var/shrinksound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
M << sound(shrinksound,volume=80)
|
|
||||||
owner << sound(shrinksound,volume=80)
|
|
||||||
|
|
||||||
if(M.size_multiplier > shrink_grow_size) //Shrink until smol.
|
if(M.size_multiplier > shrink_grow_size) //Shrink until smol.
|
||||||
M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick.
|
M.resize(M.size_multiplier-0.01) //Shrink by 1% per tick.
|
||||||
@@ -198,34 +184,27 @@
|
|||||||
var/oldnutrition = (M.nutrition * 0.05)
|
var/oldnutrition = (M.nutrition * 0.05)
|
||||||
M.nutrition = (M.nutrition * 0.95)
|
M.nutrition = (M.nutrition * 0.95)
|
||||||
owner.nutrition += oldnutrition
|
owner.nutrition += oldnutrition
|
||||||
return
|
|
||||||
return
|
|
||||||
|
|
||||||
//////////////////////////// DM_GROW ////////////////////////////
|
//////////////////////////// DM_GROW ////////////////////////////
|
||||||
else if(digest_mode == DM_GROW)
|
else if(digest_mode == DM_GROW)
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
|
|
||||||
if(prob(10))
|
if(prob(10))
|
||||||
var/growsound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
M << sound(growsound,volume=80)
|
|
||||||
owner << sound(growsound,volume=80)
|
|
||||||
|
|
||||||
if(M.size_multiplier < shrink_grow_size) //Grow until large.
|
if(M.size_multiplier < shrink_grow_size) //Grow until large.
|
||||||
M.resize(M.size_multiplier+0.01) //Grow by 1% per tick.
|
M.resize(M.size_multiplier+0.01) //Grow by 1% per tick.
|
||||||
if(M.nutrition >= 100)
|
if(M.nutrition >= 100)
|
||||||
owner.nutrition = (owner.nutrition * 0.95)
|
owner.nutrition = (owner.nutrition * 0.95)
|
||||||
return
|
|
||||||
|
|
||||||
//////////////////////////// DM_SIZE_STEAL ////////////////////////////
|
//////////////////////////// DM_SIZE_STEAL ////////////////////////////
|
||||||
else if(digest_mode == DM_SIZE_STEAL)
|
else if(digest_mode == DM_SIZE_STEAL)
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
|
|
||||||
if(prob(10))
|
if(prob(10))
|
||||||
var/growsound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
M << sound(growsound,volume=80)
|
|
||||||
owner << sound(growsound,volume=80)
|
|
||||||
|
|
||||||
if(M.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small.
|
if(M.size_multiplier > shrink_grow_size && owner.size_multiplier < 2) //Grow until either pred is large or prey is small.
|
||||||
owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick.
|
owner.resize(owner.size_multiplier+0.01) //Grow by 1% per tick.
|
||||||
@@ -234,16 +213,13 @@
|
|||||||
var/oldnutrition = (M.nutrition * 0.05)
|
var/oldnutrition = (M.nutrition * 0.05)
|
||||||
M.nutrition = (M.nutrition * 0.95)
|
M.nutrition = (M.nutrition * 0.95)
|
||||||
owner.nutrition += oldnutrition
|
owner.nutrition += oldnutrition
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_HEAL /////////////////////////////
|
///////////////////////////// DM_HEAL /////////////////////////////
|
||||||
else if(digest_mode == DM_HEAL)
|
else if(digest_mode == DM_HEAL)
|
||||||
if(prob(50)) //Wet heals!
|
if(prob(50)) //Wet heals!
|
||||||
var/healsound = pick(digestion_sounds)
|
play_sound = pick(digestion_sounds)
|
||||||
for(var/mob/hearer in range(1,owner))
|
|
||||||
hearer << sound(healsound,volume=80)
|
|
||||||
|
|
||||||
for (var/mob/living/M in internal_contents)
|
for (var/mob/living/M in contents)
|
||||||
if(M.stat != DEAD)
|
if(M.stat != DEAD)
|
||||||
if(owner.nutrition > 90 && (M.health < M.maxHealth))
|
if(owner.nutrition > 90 && (M.health < M.maxHealth))
|
||||||
M.adjustBruteLoss(-5)
|
M.adjustBruteLoss(-5)
|
||||||
@@ -254,11 +230,10 @@
|
|||||||
else if(owner.nutrition > 90 && (M.nutrition <= 400))
|
else if(owner.nutrition > 90 && (M.nutrition <= 400))
|
||||||
owner.nutrition -= 1
|
owner.nutrition -= 1
|
||||||
M.nutrition += 1
|
M.nutrition += 1
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_HAIR_AND_EYES /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_HAIR_AND_EYES && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_HAIR_AND_EYES && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -272,10 +247,9 @@
|
|||||||
change_eyes(P)
|
change_eyes(P)
|
||||||
change_hair(P,1)
|
change_hair(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
///////////////////////////// DM_TRANSFORM_MALE /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_MALE /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_MALE && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_MALE && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -297,12 +271,9 @@
|
|||||||
if(check_gender(P,MALE))
|
if(check_gender(P,MALE))
|
||||||
change_gender(P,MALE,1)
|
change_gender(P,MALE,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_FEMALE /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_FEMALE /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_FEMALE && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_FEMALE && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -324,11 +295,9 @@
|
|||||||
if(check_gender(P,FEMALE))
|
if(check_gender(P,FEMALE))
|
||||||
change_gender(P,FEMALE,1)
|
change_gender(P,FEMALE,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_KEEP_GENDER /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_KEEP_GENDER /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_KEEP_GENDER && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_KEEP_GENDER && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -346,11 +315,9 @@
|
|||||||
change_hair(P)
|
change_hair(P)
|
||||||
change_skin(P,1)
|
change_skin(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -366,11 +333,9 @@
|
|||||||
change_wing_nocolor(P)
|
change_wing_nocolor(P)
|
||||||
change_species(P,1)
|
change_species(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_REPLICA /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_REPLICA /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_REPLICA && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_REPLICA && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -395,11 +360,9 @@
|
|||||||
change_wing(P)
|
change_wing(P)
|
||||||
change_species(P,1)
|
change_species(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -413,11 +376,9 @@
|
|||||||
if(!P.absorbed)
|
if(!P.absorbed)
|
||||||
put_in_egg(P,1)
|
put_in_egg(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_KEEP_GENDER_EGG /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_KEEP_GENDER_EGG && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_KEEP_GENDER_EGG && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -433,11 +394,9 @@
|
|||||||
if(!P.absorbed)
|
if(!P.absorbed)
|
||||||
put_in_egg(P,1)
|
put_in_egg(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_REPLICA_EGG /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_REPLICA_EGG /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_REPLICA_EGG && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_REPLICA_EGG && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -460,11 +419,9 @@
|
|||||||
if(!P.absorbed)
|
if(!P.absorbed)
|
||||||
put_in_egg(P,1)
|
put_in_egg(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_MALE_EGG /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_MALE_EGG /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_MALE_EGG && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_MALE_EGG && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -484,11 +441,9 @@
|
|||||||
if(!P.absorbed)
|
if(!P.absorbed)
|
||||||
put_in_egg(P,1)
|
put_in_egg(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_TRANSFORM_FEMALE_EGG /////////////////////////////
|
///////////////////////////// DM_TRANSFORM_FEMALE_EGG /////////////////////////////
|
||||||
else if(digest_mode == DM_TRANSFORM_FEMALE_EGG && ishuman(owner))
|
else if(digest_mode == DM_TRANSFORM_FEMALE_EGG && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.stat == DEAD)
|
if(P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
@@ -508,12 +463,14 @@
|
|||||||
if(!P.absorbed)
|
if(!P.absorbed)
|
||||||
put_in_egg(P,1)
|
put_in_egg(P,1)
|
||||||
|
|
||||||
return
|
|
||||||
|
|
||||||
///////////////////////////// DM_EGG /////////////////////////////
|
///////////////////////////// DM_EGG /////////////////////////////
|
||||||
else if(digest_mode == DM_EGG && ishuman(owner))
|
else if(digest_mode == DM_EGG && ishuman(owner))
|
||||||
for (var/mob/living/carbon/human/P in internal_contents)
|
for (var/mob/living/carbon/human/P in contents)
|
||||||
if(P.absorbed || P.stat == DEAD)
|
if(P.absorbed || P.stat == DEAD)
|
||||||
continue
|
continue
|
||||||
|
|
||||||
put_in_egg(P,1)
|
put_in_egg(P,1)
|
||||||
|
|
||||||
|
if(play_sound)
|
||||||
|
playsound(src, play_sound, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, ignore_walls = FALSE, preference = /datum/client_preference/digestion_noises)
|
||||||
|
return SSBELLIES_PROCESSED
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ var/image/gurgled_overlay = image('icons/effects/sludgeoverlay_vr.dmi')
|
|||||||
var/cleanname
|
var/cleanname
|
||||||
var/cleandesc
|
var/cleandesc
|
||||||
|
|
||||||
/obj/item/proc/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/proc/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
if(!can_gurgle())
|
if(!can_gurgle())
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
@@ -18,7 +18,7 @@ var/image/gurgled_overlay = image('icons/effects/sludgeoverlay_vr.dmi')
|
|||||||
name = "[gurgleflavor] [cleanname]"
|
name = "[gurgleflavor] [cleanname]"
|
||||||
desc = "[cleandesc] It seems to be covered in ominously foul residue and needs a wash."
|
desc = "[cleandesc] It seems to be covered in ominously foul residue and needs a wash."
|
||||||
for(var/obj/item/O in contents)
|
for(var/obj/item/O in contents)
|
||||||
gurgle_contaminate(internal_contents, item_storage)
|
gurgle_contaminate(item_storage)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/obj/item/proc/can_gurgle()
|
/obj/item/proc/can_gurgle()
|
||||||
@@ -93,34 +93,34 @@ var/image/gurgled_overlay = image('icons/effects/sludgeoverlay_vr.dmi')
|
|||||||
//////////////
|
//////////////
|
||||||
// Special handling of gurgle_contaminate
|
// Special handling of gurgle_contaminate
|
||||||
//////////////
|
//////////////
|
||||||
/obj/item/weapon/card/id/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/card/id/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
digest_act(internal_contents, item_storage) //Digesting these anyway
|
digest_act(item_storage) //Digesting these anyway
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/reagent_containers/food/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
digest_act(internal_contents, item_storage)
|
digest_act(item_storage)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/obj/item/weapon/holder/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/holder/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
digest_act(internal_contents, item_storage)
|
digest_act(item_storage)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/obj/item/organ/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/organ/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
digest_act(internal_contents, item_storage)
|
digest_act(item_storage)
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/obj/item/weapon/cell/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/cell/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
if(!gurgled)
|
if(!gurgled)
|
||||||
//Don't make them wet, just drain
|
//Don't make them wet, just drain
|
||||||
var/obj/item/weapon/cell/C = src
|
var/obj/item/weapon/cell/C = src
|
||||||
C.charge = 0
|
C.charge = 0
|
||||||
return TRUE
|
return TRUE
|
||||||
|
|
||||||
/obj/item/weapon/storage/box/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/storage/box/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
if((. = ..()))
|
if((. = ..()))
|
||||||
name = "soggy [cleanname]"
|
name = "soggy [cleanname]"
|
||||||
desc = "This soggy box is about to fall apart any time."
|
desc = "This soggy box is about to fall apart any time."
|
||||||
|
|
||||||
/obj/item/device/pda/gurgle_contaminate(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/device/pda/gurgle_contaminate(var/atom/movable/item_storage = null)
|
||||||
if((. = ..()))
|
if((. = ..()))
|
||||||
desc = "This device seems completely unresponsive while drenched with sludge. Perhaps you could still wash it."
|
desc = "This device seems completely unresponsive while drenched with sludge. Perhaps you could still wash it."
|
||||||
|
|||||||
@@ -3,19 +3,14 @@
|
|||||||
//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale).
|
//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale).
|
||||||
|
|
||||||
// Ye default implementation.
|
// Ye default implementation.
|
||||||
/obj/item/proc/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/proc/digest_act(var/atom/movable/item_storage = null)
|
||||||
for(var/obj/item/O in contents)
|
for(var/obj/item/O in contents)
|
||||||
if(istype(O,/obj/item/weapon/storage/internal)) //Dump contents from dummy pockets.
|
if(istype(O,/obj/item/weapon/storage/internal)) //Dump contents from dummy pockets.
|
||||||
for(var/obj/item/SO in O)
|
for(var/obj/item/SO in O)
|
||||||
if(internal_contents)
|
|
||||||
internal_contents |= SO
|
|
||||||
if(item_storage)
|
if(item_storage)
|
||||||
SO.forceMove(item_storage)
|
SO.forceMove(item_storage)
|
||||||
qdel(O)
|
qdel(O)
|
||||||
else
|
else if(item_storage)
|
||||||
if(internal_contents)
|
|
||||||
internal_contents |= O
|
|
||||||
if(item_storage)
|
|
||||||
O.forceMove(item_storage)
|
O.forceMove(item_storage)
|
||||||
|
|
||||||
qdel(src)
|
qdel(src)
|
||||||
@@ -24,82 +19,75 @@
|
|||||||
/////////////
|
/////////////
|
||||||
// Some indigestible stuff
|
// Some indigestible stuff
|
||||||
/////////////
|
/////////////
|
||||||
/obj/item/weapon/hand_tele/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/hand_tele/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/weapon/card/id/gold/captain/spare/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/card/id/gold/captain/spare/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/device/aicard/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/device/aicard/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/device/paicard/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/device/paicard/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/weapon/gun/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/gun/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/weapon/pinpointer/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/pinpointer/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/blueprints/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/blueprints/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/weapon/disk/nuclear/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/disk/nuclear/digest_act(...)
|
||||||
return FALSE
|
return FALSE
|
||||||
/obj/item/device/perfect_tele_beacon/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/device/perfect_tele_beacon/digest_act(...)
|
||||||
return FALSE //Sorta important to not digest your own beacons.
|
return FALSE //Sorta important to not digest your own beacons.
|
||||||
|
|
||||||
/////////////
|
/////////////
|
||||||
// Some special treatment
|
// Some special treatment
|
||||||
/////////////
|
/////////////
|
||||||
//PDAs need to lose their ID to not take it with them, so we can get a digested ID
|
//PDAs need to lose their ID to not take it with them, so we can get a digested ID
|
||||||
/obj/item/device/pda/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/device/pda/digest_act(var/atom/movable/item_storage = null)
|
||||||
if(id)
|
if(id)
|
||||||
id = null
|
id = null
|
||||||
|
|
||||||
/* Doesn't appear to be necessary anymore.
|
|
||||||
if(item_storage)
|
|
||||||
id.forceMove(item_storage)
|
|
||||||
if(internal_contents)
|
|
||||||
internal_contents |= id
|
|
||||||
*/
|
|
||||||
|
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
/obj/item/weapon/card/id/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/card/id/digest_act(var/atom/movable/item_storage = null)
|
||||||
desc = "A partially digested card that has seen better days. Much of it's data has been destroyed."
|
desc = "A partially digested card that has seen better days. Much of it's data has been destroyed."
|
||||||
icon = 'icons/obj/card_vr.dmi'
|
icon = 'icons/obj/card_vr.dmi'
|
||||||
icon_state = "digested"
|
icon_state = "digested"
|
||||||
access = list() // No access
|
access = list() // No access
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
/obj/item/weapon/reagent_containers/food/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/reagent_containers/food/digest_act(var/atom/movable/item_storage = null)
|
||||||
if(ishuman(item_storage))
|
if(isbelly(item_storage))
|
||||||
var/mob/living/carbon/human/H = item_storage
|
var/obj/belly/B = item_storage
|
||||||
|
if(ishuman(B.owner))
|
||||||
|
var/mob/living/carbon/human/H = B.owner
|
||||||
reagents.trans_to_holder(H.ingested, (reagents.total_volume * 0.3), 1, 0)
|
reagents.trans_to_holder(H.ingested, (reagents.total_volume * 0.3), 1, 0)
|
||||||
|
else if(isrobot(B.owner))
|
||||||
else if(isrobot(item_storage))
|
var/mob/living/silicon/robot/R = B.owner
|
||||||
var/mob/living/silicon/robot/R = item_storage
|
|
||||||
R.cell.charge += 150
|
R.cell.charge += 150
|
||||||
|
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
/obj/item/weapon/holder/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/holder/digest_act(var/atom/movable/item_storage = null)
|
||||||
for(var/mob/living/M in contents)
|
for(var/mob/living/M in contents)
|
||||||
if(internal_contents)
|
|
||||||
internal_contents |= M
|
|
||||||
if(item_storage)
|
if(item_storage)
|
||||||
M.forceMove(item_storage)
|
M.forceMove(item_storage)
|
||||||
held_mob = null
|
held_mob = null
|
||||||
|
|
||||||
. = ..()
|
. = ..()
|
||||||
|
|
||||||
/obj/item/organ/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/organ/digest_act(var/atom/movable/item_storage = null)
|
||||||
if((. = ..()))
|
if((. = ..()))
|
||||||
. += 70 //Organs give a little more
|
. += 70 //Organs give a little more
|
||||||
|
|
||||||
/obj/item/weapon/storage/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/weapon/storage/digest_act(var/atom/movable/item_storage = null)
|
||||||
for(var/obj/item/I in contents)
|
for(var/obj/item/I in contents)
|
||||||
I.screen_loc = null
|
I.screen_loc = null
|
||||||
.=..()
|
|
||||||
|
. = ..()
|
||||||
|
|
||||||
/////////////
|
/////////////
|
||||||
// Some more complicated stuff
|
// Some more complicated stuff
|
||||||
/////////////
|
/////////////
|
||||||
/obj/item/device/mmi/digital/posibrain/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/device/mmi/digital/posibrain/digest_act(var/atom/movable/item_storage = null)
|
||||||
//Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim
|
//Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
/mob/living
|
/mob/living
|
||||||
var/digestable = 1 // Can the mob be digested inside a belly?
|
var/digestable = 1 // Can the mob be digested inside a belly?
|
||||||
var/allowmobvore = 1 // Will simplemobs attempt to eat the mob?
|
var/allowmobvore = 1 // Will simplemobs attempt to eat the mob?
|
||||||
var/vore_selected // Default to no vore capability.
|
var/obj/belly/vore_selected // Default to no vore capability.
|
||||||
var/list/vore_organs = list() // List of vore containers inside a mob
|
var/list/vore_organs = list() // List of vore containers inside a mob
|
||||||
var/absorbed = 0 // If a mob is absorbed into another
|
var/absorbed = 0 // If a mob is absorbed into another
|
||||||
var/weight = 137 // Weight for mobs for weightgain system
|
var/weight = 137 // Weight for mobs for weightgain system
|
||||||
@@ -28,13 +28,10 @@
|
|||||||
/hook/living_new/proc/vore_setup(mob/living/M)
|
/hook/living_new/proc/vore_setup(mob/living/M)
|
||||||
M.verbs += /mob/living/proc/escapeOOC
|
M.verbs += /mob/living/proc/escapeOOC
|
||||||
M.verbs += /mob/living/proc/lick
|
M.verbs += /mob/living/proc/lick
|
||||||
if(M.no_vore) //If the mob isn's supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
|
if(M.no_vore) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach.
|
||||||
M << "<span class='warning'>The creature that you are can not eat others.</span>"
|
|
||||||
return 1
|
return 1
|
||||||
M.verbs += /mob/living/proc/insidePanel
|
M.verbs += /mob/living/proc/insidePanel
|
||||||
|
|
||||||
//M.appearance_flags |= PIXEL_SCALE // Moved to 02_size.dm
|
|
||||||
|
|
||||||
//Tries to load prefs if a client is present otherwise gives freebie stomach
|
//Tries to load prefs if a client is present otherwise gives freebie stomach
|
||||||
if(!M.vore_organs || !M.vore_organs.len)
|
if(!M.vore_organs || !M.vore_organs.len)
|
||||||
spawn(20) //Wait a couple of seconds to make sure copy_to or whatever has gone
|
spawn(20) //Wait a couple of seconds to make sure copy_to or whatever has gone
|
||||||
@@ -42,7 +39,7 @@
|
|||||||
|
|
||||||
if(M.client && M.client.prefs_vr)
|
if(M.client && M.client.prefs_vr)
|
||||||
if(!M.copy_from_prefs_vr())
|
if(!M.copy_from_prefs_vr())
|
||||||
M << "<span class='warning'>ERROR: You seem to have saved VOREStation prefs, but they couldn't be loaded.</span>"
|
to_chat(M,"<span class='warning'>ERROR: You seem to have saved VOREStation prefs, but they couldn't be loaded.</span>")
|
||||||
return 0
|
return 0
|
||||||
if(M.vore_organs && M.vore_organs.len)
|
if(M.vore_organs && M.vore_organs.len)
|
||||||
M.vore_selected = M.vore_organs[1]
|
M.vore_selected = M.vore_organs[1]
|
||||||
@@ -50,35 +47,25 @@
|
|||||||
if(!M.vore_organs || !M.vore_organs.len)
|
if(!M.vore_organs || !M.vore_organs.len)
|
||||||
if(!M.vore_organs)
|
if(!M.vore_organs)
|
||||||
M.vore_organs = list()
|
M.vore_organs = list()
|
||||||
var/datum/belly/B = new /datum/belly(M)
|
var/obj/belly/B = new /obj/belly(M)
|
||||||
|
M.vore_selected = B
|
||||||
B.immutable = 1
|
B.immutable = 1
|
||||||
B.name = "Stomach"
|
B.name = "Stomach"
|
||||||
B.inside_flavor = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]."
|
B.desc = "It appears to be rather warm and wet. Makes sense, considering it's inside \the [M.name]."
|
||||||
B.can_taste = 1
|
B.can_taste = 1
|
||||||
M.vore_organs[B.name] = B
|
|
||||||
M.vore_selected = B.name
|
|
||||||
|
|
||||||
//Simple_animal gets emotes. move this to that hook instead?
|
|
||||||
if(istype(src,/mob/living/simple_animal))
|
|
||||||
B.emote_lists[DM_HOLD] = list(
|
|
||||||
"The insides knead at you gently for a moment.",
|
|
||||||
"The guts glorp wetly around you as some air shifts.",
|
|
||||||
"Your predator takes a deep breath and sighs, shifting you somewhat.",
|
|
||||||
"The stomach squeezes you tight for a moment, then relaxes.",
|
|
||||||
"During a moment of quiet, breathing becomes the most audible thing.",
|
|
||||||
"The warm slickness surrounds and kneads on you.")
|
|
||||||
|
|
||||||
B.emote_lists[DM_DIGEST] = list(
|
|
||||||
"The caustic acids eat away at your form.",
|
|
||||||
"The acrid air burns at your lungs.",
|
|
||||||
"Without a thought for you, the stomach grinds inwards painfully.",
|
|
||||||
"The guts treat you like food, squeezing to press more acids against you.",
|
|
||||||
"The onslaught against your body doesn't seem to be letting up; you're food now.",
|
|
||||||
"The insides work on you like they would any other food.")
|
|
||||||
|
|
||||||
//Return 1 to hook-caller
|
//Return 1 to hook-caller
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
//
|
||||||
|
// Hide vore organs in contents
|
||||||
|
//
|
||||||
|
/mob/living/view_variables_filter_contents(list/L)
|
||||||
|
. = ..()
|
||||||
|
var/len_before = L.len
|
||||||
|
L -= vore_organs
|
||||||
|
. += len_before - L.len
|
||||||
|
|
||||||
//
|
//
|
||||||
// Handle being clicked, perhaps with something to devour
|
// Handle being clicked, perhaps with something to devour
|
||||||
//
|
//
|
||||||
@@ -139,15 +126,13 @@
|
|||||||
else if(istype(I,/obj/item/device/radio/beacon))
|
else if(istype(I,/obj/item/device/radio/beacon))
|
||||||
var/confirm = alert(user, "[src == user ? "Eat the beacon?" : "Feed the beacon to [src]?"]", "Confirmation", "Yes!", "Cancel")
|
var/confirm = alert(user, "[src == user ? "Eat the beacon?" : "Feed the beacon to [src]?"]", "Confirmation", "Yes!", "Cancel")
|
||||||
if(confirm == "Yes!")
|
if(confirm == "Yes!")
|
||||||
var/bellychoice = input("Which belly?","Select A Belly") in src.vore_organs
|
var/obj/belly/B = input("Which belly?","Select A Belly") as null|anything in vore_organs
|
||||||
var/datum/belly/B = src.vore_organs[bellychoice]
|
if(!istype(B))
|
||||||
src.visible_message("<span class='warning'>[user] is trying to stuff a beacon into [src]'s [bellychoice]!</span>","<span class='warning'>[user] is trying to stuff a beacon into you!</span>")
|
return 1
|
||||||
|
visible_message("<span class='warning'>[user] is trying to stuff a beacon into [src]'s [lowertext(B.name)]!</span>","<span class='warning'>[user] is trying to stuff a beacon into you!</span>")
|
||||||
if(do_after(user,30,src))
|
if(do_after(user,30,src))
|
||||||
user.drop_item()
|
user.drop_item()
|
||||||
I.loc = src
|
I.forceMove(B)
|
||||||
B.internal_contents |= I
|
|
||||||
src.visible_message("<span class='warning'>[src] is fed the beacon!</span>","You're fed the beacon!")
|
|
||||||
playsound(src, B.vore_sound, 100, 1)
|
|
||||||
return 1
|
return 1
|
||||||
else
|
else
|
||||||
return 1 //You don't get to hit someone 'later'
|
return 1 //You don't get to hit someone 'later'
|
||||||
@@ -160,48 +145,15 @@
|
|||||||
/mob/living/proc/vore_process_resist()
|
/mob/living/proc/vore_process_resist()
|
||||||
|
|
||||||
//Are we resisting from inside a belly?
|
//Are we resisting from inside a belly?
|
||||||
var/datum/belly/B = check_belly(src)
|
if(isbelly(loc))
|
||||||
if(B)
|
var/obj/belly/B = loc
|
||||||
spawn() B.relay_resist(src)
|
B.relay_resist(src)
|
||||||
return TRUE //resist() on living does this TRUE thing.
|
return TRUE //resist() on living does this TRUE thing.
|
||||||
|
|
||||||
//Other overridden resists go here
|
//Other overridden resists go here
|
||||||
|
|
||||||
|
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Proc for updating vore organs and digestion/healing/absorbing
|
|
||||||
//
|
|
||||||
/mob/living/proc/handle_internal_contents()
|
|
||||||
if(air_master.current_cycle%3 != 1)
|
|
||||||
return //The accursed timer
|
|
||||||
|
|
||||||
for (var/I in vore_organs)
|
|
||||||
var/datum/belly/B = vore_organs[I]
|
|
||||||
if(B.internal_contents.len)
|
|
||||||
B.process_Life() //AKA 'do bellymodes_vr.dm'
|
|
||||||
|
|
||||||
if(noisy > 0 && nutrition < 100 && prob(10))
|
|
||||||
var/growlsound = pick(hunger_sounds)
|
|
||||||
if(nutrition < 50)
|
|
||||||
for(var/mob/hearer in range(1,src))
|
|
||||||
hearer << sound(growlsound,volume=80)
|
|
||||||
else
|
|
||||||
for(var/mob/hearer in range(1,src))
|
|
||||||
hearer << sound(growlsound,volume=35)
|
|
||||||
|
|
||||||
if(air_master.current_cycle%90 != 1) return //Occasionally do supercleanups.
|
|
||||||
for (var/I in vore_organs)
|
|
||||||
var/datum/belly/B = vore_organs[I]
|
|
||||||
if(B.internal_contents.len)
|
|
||||||
listclearnulls(B.internal_contents)
|
|
||||||
for(var/atom/movable/M in B.internal_contents)
|
|
||||||
if(M.loc != src)
|
|
||||||
B.internal_contents -= M
|
|
||||||
log_debug("Had to remove [M] from belly [B] in [src]")
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Verb for saving vore preferences to save file
|
// Verb for saving vore preferences to save file
|
||||||
//
|
//
|
||||||
@@ -227,7 +179,7 @@
|
|||||||
|
|
||||||
/mob/living/proc/copy_to_prefs_vr()
|
/mob/living/proc/copy_to_prefs_vr()
|
||||||
if(!client || !client.prefs_vr)
|
if(!client || !client.prefs_vr)
|
||||||
src << "<span class='warning'>You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>"
|
to_chat(src,"<span class='warning'>You attempted to save your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/datum/vore_preferences/P = client.prefs_vr
|
var/datum/vore_preferences/P = client.prefs_vr
|
||||||
@@ -248,26 +200,81 @@
|
|||||||
//
|
//
|
||||||
/mob/living/proc/copy_from_prefs_vr()
|
/mob/living/proc/copy_from_prefs_vr()
|
||||||
if(!client || !client.prefs_vr)
|
if(!client || !client.prefs_vr)
|
||||||
src << "<span class='warning'>You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>"
|
to_chat(src,"<span class='warning'>You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev.</span>")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/datum/vore_preferences/P = client.prefs_vr
|
var/datum/vore_preferences/P = client.prefs_vr
|
||||||
|
|
||||||
src.digestable = P.digestable
|
vore_organs = list()
|
||||||
src.allowmobvore = P.allowmobvore
|
digestable = P.digestable
|
||||||
src.vore_organs = list()
|
allowmobvore = P.allowmobvore
|
||||||
src.vore_taste = P.vore_taste
|
vore_taste = P.vore_taste
|
||||||
src.nif_examine = P.nif_examine
|
nif_examine = P.nif_examine
|
||||||
src.conceal_nif = P.conceal_nif
|
conceal_nif = P.conceal_nif
|
||||||
src.can_be_drop_prey = P.can_be_drop_prey
|
can_be_drop_prey = P.can_be_drop_prey
|
||||||
src.can_be_drop_pred = P.can_be_drop_pred
|
can_be_drop_pred = P.can_be_drop_pred
|
||||||
|
|
||||||
|
var/force_save = FALSE
|
||||||
for(var/I in P.belly_prefs)
|
for(var/I in P.belly_prefs)
|
||||||
|
if(isbelly(I)) //Belly system 2.0
|
||||||
|
var/obj/belly/saved = I
|
||||||
|
saved.copy(src)
|
||||||
|
else if(istext(I)) //Belly name for old datum system
|
||||||
|
force_save = TRUE
|
||||||
|
log_debug("[src] had legacy belly [I], converting.")
|
||||||
var/datum/belly/Bp = P.belly_prefs[I]
|
var/datum/belly/Bp = P.belly_prefs[I]
|
||||||
src.vore_organs[Bp.name] = Bp.copy(src)
|
var/obj/belly/new_belly = new(src)
|
||||||
|
Bp.copy(new_belly) //Rewritten to convert to a 2.0 belly
|
||||||
|
|
||||||
|
if(force_save)
|
||||||
|
save_vore_prefs()
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
//
|
||||||
|
// Release everything in every vore organ
|
||||||
|
//
|
||||||
|
/mob/living/proc/release_vore_contents(var/include_absorbed = TRUE)
|
||||||
|
for(var/belly in vore_organs)
|
||||||
|
var/obj/belly/B = belly
|
||||||
|
B.release_all_contents(include_absorbed)
|
||||||
|
|
||||||
|
//
|
||||||
|
// Returns examine messages for bellies
|
||||||
|
//
|
||||||
|
/mob/living/proc/examine_bellies()
|
||||||
|
if(!show_pudge()) //Some clothing or equipment can hide this.
|
||||||
|
return ""
|
||||||
|
|
||||||
|
var/message = ""
|
||||||
|
for (var/belly in vore_organs)
|
||||||
|
var/obj/belly/B = belly
|
||||||
|
message += B.get_examine_msg()
|
||||||
|
|
||||||
|
return message
|
||||||
|
|
||||||
|
//
|
||||||
|
// Whether or not people can see our belly messages
|
||||||
|
//
|
||||||
|
/mob/living/proc/show_pudge()
|
||||||
|
return TRUE //Can override if you want.
|
||||||
|
|
||||||
|
/mob/living/carbon/human/show_pudge()
|
||||||
|
//A uniform could hide it.
|
||||||
|
if(istype(w_uniform,/obj/item/clothing))
|
||||||
|
var/obj/item/clothing/under = w_uniform
|
||||||
|
if(under.hides_bulges)
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
//We return as soon as we find one, no need for 'else' really.
|
||||||
|
if(istype(wear_suit,/obj/item/clothing))
|
||||||
|
var/obj/item/clothing/suit = wear_suit
|
||||||
|
if(suit.hides_bulges)
|
||||||
|
return FALSE
|
||||||
|
|
||||||
|
|
||||||
|
return ..()
|
||||||
|
|
||||||
//
|
//
|
||||||
// Clearly super important. Obviously.
|
// Clearly super important. Obviously.
|
||||||
//
|
//
|
||||||
@@ -315,48 +322,35 @@
|
|||||||
set name = "OOC Escape"
|
set name = "OOC Escape"
|
||||||
set category = "OOC"
|
set category = "OOC"
|
||||||
|
|
||||||
//You're in an animal!
|
//You're in a belly!
|
||||||
if(istype(src.loc,/mob/living/simple_animal))
|
if(isbelly(loc))
|
||||||
var/mob/living/simple_animal/pred = src.loc
|
var/obj/belly/B = loc
|
||||||
var/confirm = alert(src, "You're in a mob. Don't use this as a trick to get out of hostile animals. This is for escaping from preference-breaking and if you're otherwise unable to escape from endo. If you are in more than one pred, use this more than once.", "Confirmation", "Okay", "Cancel")
|
var/confirm = alert(src, "You're in a mob. Don't use this as a trick to get out of hostile animals. This is for escaping from preference-breaking and if you're otherwise unable to escape from endo (pred AFK for a long time).", "Confirmation", "Okay", "Cancel")
|
||||||
if(confirm == "Okay")
|
if(!confirm == "Okay" || loc != B)
|
||||||
for(var/I in pred.vore_organs)
|
return
|
||||||
var/datum/belly/B = pred.vore_organs[I]
|
//Actual escaping
|
||||||
B.release_specific_contents(src)
|
forceMove(get_turf(src)) //Just move me up to the turf, let's not cascade through bellies, there's been a problem, let's just leave.
|
||||||
|
|
||||||
for(var/mob/living/simple_animal/SA in range(10))
|
for(var/mob/living/simple_animal/SA in range(10))
|
||||||
SA.prey_excludes += src
|
SA.prey_excludes[src] = world.time
|
||||||
spawn(18000)
|
log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[B.owner.x];Y=[B.owner.y];Z=[B.owner.z]'>JMP</a>" : "null"])")
|
||||||
if(src && SA)
|
|
||||||
SA.prey_excludes -= src
|
|
||||||
|
|
||||||
message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(pred)] (MOB) ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
|
if(isanimal(B.owner))
|
||||||
pred.update_icons()
|
var/mob/living/simple_animal/SA = B.owner
|
||||||
|
SA.update_icons()
|
||||||
//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 or 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.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 ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
|
|
||||||
|
|
||||||
//You're in a dogborg!
|
//You're in a dogborg!
|
||||||
else if(istype(src.loc, /obj/item/device/dogborg/sleeper))
|
else if(istype(loc, /obj/item/device/dogborg/sleeper))
|
||||||
var/mob/living/silicon/pred = src.loc.loc //Thing holding the belly!
|
var/mob/living/silicon/pred = loc.loc //Thing holding the belly!
|
||||||
var/obj/item/device/dogborg/sleeper/belly = src.loc //The belly!
|
var/obj/item/device/dogborg/sleeper/belly = loc //The belly!
|
||||||
|
|
||||||
var/confirm = alert(src, "You're in a dogborg sleeper. This is for escaping from preference-breaking or if your predator disconnects/AFKs. If your preferences were being broken, please admin-help as well.", "Confirmation", "Okay", "Cancel")
|
var/confirm = alert(src, "You're in a dogborg sleeper. This is for escaping from preference-breaking or if your predator disconnects/AFKs. If your preferences were being broken, please admin-help as well.", "Confirmation", "Okay", "Cancel")
|
||||||
if(confirm == "Okay")
|
if(!confirm == "Okay" || loc != belly)
|
||||||
message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(pred)] (BORG) ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
|
return
|
||||||
|
//Actual escaping
|
||||||
|
log_and_message_admins("[key_name(src)] used the OOC escape button to get out of [key_name(pred)] (BORG) ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
|
||||||
belly.go_out(src) //Just force-ejects from the borg as if they'd clicked the eject button.
|
belly.go_out(src) //Just force-ejects from the borg as if they'd clicked the eject button.
|
||||||
|
|
||||||
|
|
||||||
else
|
else
|
||||||
src << "<span class='alert'>You aren't inside anyone, you clod.</span>"
|
to_chat(src,"<span class='alert'>You aren't inside anyone, though, is the thing.</span>")
|
||||||
|
|
||||||
//
|
//
|
||||||
// Eating procs depending on who clicked what
|
// Eating procs depending on who clicked what
|
||||||
@@ -384,14 +378,13 @@
|
|||||||
//
|
//
|
||||||
// Master vore proc that actually does vore procedures
|
// Master vore proc that actually does vore procedures
|
||||||
//
|
//
|
||||||
/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly)
|
/mob/living/proc/perform_the_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/obj/belly/belly, var/delay)
|
||||||
//Sanity
|
//Sanity
|
||||||
if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
|
if(!user || !prey || !pred || !istype(belly) || !(belly in pred.vore_organs))
|
||||||
log_debug("[user] attempted to feed [prey] to [pred], via [belly] but it went wrong.")
|
log_debug("[user] attempted to feed [prey] to [pred], via [lowertext(belly.name)] but it went wrong.")
|
||||||
return
|
return
|
||||||
|
|
||||||
// The belly selected at the time of noms
|
// The belly selected at the time of noms
|
||||||
var/datum/belly/belly_target = pred.vore_organs[belly]
|
|
||||||
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
|
var/attempt_msg = "ERROR: Vore message couldn't be created. Notify a dev. (at)"
|
||||||
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
|
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
|
||||||
|
|
||||||
@@ -404,17 +397,17 @@
|
|||||||
|
|
||||||
// Prepare messages
|
// Prepare messages
|
||||||
if(user == pred) //Feeding someone to yourself
|
if(user == pred) //Feeding someone to yourself
|
||||||
attempt_msg = text("<span class='warning'>[] is attemping to [] [] into their []!</span>",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
|
attempt_msg = text("<span class='warning'>[] is attemping to [] [] into their []!</span>",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
|
||||||
success_msg = text("<span class='warning'>[] manages to [] [] into their []!</span>",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
|
success_msg = text("<span class='warning'>[] manages to [] [] into their []!</span>",pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
|
||||||
else //Feeding someone to another person
|
else //Feeding someone to another person
|
||||||
attempt_msg = text("<span class='warning'>[] is attempting to make [] [] [] into their []!</span>",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
|
attempt_msg = text("<span class='warning'>[] is attempting to make [] [] [] into their []!</span>",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
|
||||||
success_msg = text("<span class='warning'>[] manages to make [] [] [] into their []!</span>",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
|
success_msg = text("<span class='warning'>[] manages to make [] [] [] into their []!</span>",user,pred,lowertext(belly.vore_verb),prey,lowertext(belly.name))
|
||||||
|
|
||||||
// Announce that we start the attempt!
|
// Announce that we start the attempt!
|
||||||
user.visible_message(attempt_msg)
|
user.visible_message(attempt_msg)
|
||||||
|
|
||||||
// Now give the prey time to escape... return if they did
|
// Now give the prey time to escape... return if they did
|
||||||
var/swallow_time = istype(prey, /mob/living/carbon/human) ? belly_target.human_prey_swallow_time : belly_target.nonhuman_prey_swallow_time
|
var/swallow_time = delay || istype(prey, /mob/living/carbon/human) ? belly.human_prey_swallow_time : belly.nonhuman_prey_swallow_time
|
||||||
|
|
||||||
//Timer and progress bar
|
//Timer and progress bar
|
||||||
if(!do_after(user, swallow_time, prey))
|
if(!do_after(user, swallow_time, prey))
|
||||||
@@ -422,16 +415,14 @@
|
|||||||
|
|
||||||
// If we got this far, nom successful! Announce it!
|
// If we got this far, nom successful! Announce it!
|
||||||
user.visible_message(success_msg)
|
user.visible_message(success_msg)
|
||||||
if(belly_target.vore_sound)
|
|
||||||
playsound(user, belly_target.vore_sound, 100, 1)
|
|
||||||
|
|
||||||
// Actually shove prey into the belly.
|
// Actually shove prey into the belly.
|
||||||
belly_target.nom_mob(prey, user)
|
belly.nom_mob(prey, user)
|
||||||
user.update_icons()
|
user.update_icons()
|
||||||
|
|
||||||
// Flavor handling
|
// Flavor handling
|
||||||
if(belly_target.can_taste && prey.get_taste_message(0))
|
if(belly.can_taste && prey.get_taste_message(FALSE))
|
||||||
to_chat(belly_target.owner, "<span class='notice'>[prey] tastes of [prey.get_taste_message(0)].</span>")
|
to_chat(belly.owner, "<span class='notice'>[prey] tastes of [prey.get_taste_message(FALSE)].</span>")
|
||||||
|
|
||||||
// Inform Admins
|
// Inform Admins
|
||||||
if (pred == user)
|
if (pred == user)
|
||||||
@@ -444,10 +435,10 @@
|
|||||||
// Magical pred-air breathing for inside preds
|
// Magical pred-air breathing for inside preds
|
||||||
// overrides a proc defined on atom called by breathe.dm
|
// overrides a proc defined on atom called by breathe.dm
|
||||||
//
|
//
|
||||||
/mob/living/return_air()
|
/obj/belly/return_air()
|
||||||
return return_air_for_internal_lifeform()
|
return return_air_for_internal_lifeform()
|
||||||
|
|
||||||
/mob/living/return_air_for_internal_lifeform()
|
/obj/belly/return_air_for_internal_lifeform()
|
||||||
//Free air until someone wants to code processing it for reals from predbreaths
|
//Free air until someone wants to code processing it for reals from predbreaths
|
||||||
var/datum/gas_mixture/belly_air/air = new(1000)
|
var/datum/gas_mixture/belly_air/air = new(1000)
|
||||||
return air
|
return air
|
||||||
@@ -464,108 +455,54 @@
|
|||||||
"oxygen" = 21,
|
"oxygen" = 21,
|
||||||
"nitrogen" = 79)
|
"nitrogen" = 79)
|
||||||
|
|
||||||
|
// Procs for micros stuffed into boots and the like to escape from them
|
||||||
/mob/living/proc/escape_clothes(obj/item/clothing/C)
|
/mob/living/proc/escape_clothes(obj/item/clothing/C)
|
||||||
ASSERT(src.loc == C)
|
ASSERT(loc == C)
|
||||||
|
|
||||||
if(ishuman(C.loc)) //In a /mob/living/carbon/human
|
if(ishuman(C.loc)) //In a /mob/living/carbon/human
|
||||||
var/mob/living/carbon/human/H = C.loc
|
var/mob/living/carbon/human/H = C.loc
|
||||||
if(H.shoes == C) //Being worn
|
if(H.shoes == C) //Being worn
|
||||||
src << "<font color='blue'> You start to climb around the larger creature's feet and ankles!</font>"
|
to_chat(src,"<font color='blue'> You start to climb around the larger creature's feet and ankles!</font>")
|
||||||
H << "<font color='red'>Something is trying to climb out of your [C]!</font>"
|
to_chat(H,"<font color='red'>Something is trying to climb out of your [C]!</font>")
|
||||||
var/original_loc = H.loc
|
var/original_loc = H.loc
|
||||||
for(var/escape_time = 100,escape_time > 0,escape_time--)
|
for(var/escape_time = 100,escape_time > 0,escape_time--)
|
||||||
if(H.loc != original_loc)
|
if(H.loc != original_loc)
|
||||||
src << "<font color='red'>You're pinned back underfoot!</font>"
|
to_chat(src,"<font color='red'>You're pinned back underfoot!</font>")
|
||||||
H << "<font color='blue'>You pin the escapee back underfoot!</font>"
|
to_chat(H,"<font color='blue'>You pin the escapee back underfoot!</font>")
|
||||||
return
|
return
|
||||||
if(src.loc != C)
|
if(src.loc != C)
|
||||||
return
|
return
|
||||||
sleep(1)
|
sleep(1)
|
||||||
|
|
||||||
src << "<font color='blue'>You manage to escape \the [C]!</font>"
|
to_chat(src,"<font color='blue'>You manage to escape \the [C]!</font>")
|
||||||
H << "<font color='red'>Somone has climbed out of your [C]!</font>"
|
to_chat(H,"<font color='red'>Somone has climbed out of your [C]!</font>")
|
||||||
src.loc = H.loc
|
forceMove(H.loc)
|
||||||
var/datum/belly/B = check_belly(H)
|
|
||||||
if(B)
|
|
||||||
B.internal_contents |= src
|
|
||||||
return
|
|
||||||
else //Being held by a human
|
else //Being held by a human
|
||||||
src << "<font color='blue'>You start to climb out of \the [C]!</font>"
|
to_chat(src,"<font color='blue'>You start to climb out of \the [C]!</font>")
|
||||||
H << "<font color='red'>Something is trying to climb out of your [C]!</font>"
|
to_chat(H,"<font color='red'>Something is trying to climb out of your [C]!</font>")
|
||||||
for(var/escape_time = 60,escape_time > 0,escape_time--)
|
for(var/escape_time = 60,escape_time > 0,escape_time--)
|
||||||
if(H.shoes == C)
|
if(H.shoes == C)
|
||||||
src << "<font color='red'>You're pinned underfoot!</font>"
|
to_chat(src,"<font color='red'>You're pinned underfoot!</font>")
|
||||||
H << "<font color='blue'>You pin the escapee underfoot!</font>"
|
to_chat(H,"<font color='blue'>You pin the escapee underfoot!</font>")
|
||||||
return
|
return
|
||||||
if(src.loc != C)
|
if(src.loc != C)
|
||||||
return
|
return
|
||||||
sleep(1)
|
sleep(1)
|
||||||
src << "<font color='blue'>You manage to escape \the [C]!</font>"
|
to_chat(src,"<font color='blue'>You manage to escape \the [C]!</font>")
|
||||||
H << "<font color='red'>Somone has climbed out of your [C]!</font>"
|
to_chat(H,"<font color='red'>Somone has climbed out of your [C]!</font>")
|
||||||
src.loc = H.loc
|
forceMove(H.loc)
|
||||||
var/datum/belly/B = check_belly(H)
|
|
||||||
if(B)
|
|
||||||
B.internal_contents |= src
|
|
||||||
return
|
|
||||||
|
|
||||||
src << "<font color='blue'>You start to climb out of \the [C]!</font>"
|
to_chat(src,"<font color='blue'>You start to climb out of \the [C]!</font>")
|
||||||
sleep(50)
|
sleep(50)
|
||||||
if(src.loc == C)
|
if(loc == C)
|
||||||
src << "<font color='blue'>You climb out of \the [C]!</font>"
|
to_chat(src,"<font color='blue'>You climb out of \the [C]!</font>")
|
||||||
src.loc = C.loc
|
forceMove(C.loc)
|
||||||
var/datum/belly/B
|
|
||||||
if(check_belly(C)) B = check_belly(C)
|
|
||||||
if(check_belly(C.loc)) B = check_belly(C.loc)
|
|
||||||
if(B)
|
|
||||||
B.internal_contents |= src
|
|
||||||
return
|
|
||||||
return
|
return
|
||||||
|
|
||||||
/mob/living/proc/feed_grabbed_to_self_falling_nom(var/mob/living/user, var/mob/living/prey)
|
/mob/living/proc/feed_grabbed_to_self_falling_nom(var/mob/living/user, var/mob/living/prey)
|
||||||
var/belly = user.vore_selected
|
var/belly = user.vore_selected
|
||||||
return perform_the_falling_nom(user, prey, user, belly)
|
return perform_the_nom(user, prey, user, belly, delay = 1) //1/10th of a second is probably fine.
|
||||||
|
|
||||||
/mob/living/proc/perform_the_falling_nom(var/mob/living/user, var/mob/living/prey, var/mob/living/pred, var/belly) //For dropnoms and slime feeding. This is so a nom can be performed instantly.
|
|
||||||
//Sanity
|
|
||||||
belly = pred.vore_selected
|
|
||||||
if(!user || !prey || !pred || !belly || !(belly in pred.vore_organs))
|
|
||||||
log_debug("[user] attempted to feed [prey] to [pred], via [belly] but it went wrong.")
|
|
||||||
return
|
|
||||||
|
|
||||||
// The belly selected at the time of noms
|
|
||||||
var/datum/belly/belly_target = pred.vore_organs[belly]
|
|
||||||
var/success_msg = "ERROR: Vore message couldn't be created. Notify a dev. (sc)"
|
|
||||||
|
|
||||||
//Final distance check. Time has passed, menus have come and gone. Can't use do_after adjacent because doesn't behave for held micros
|
|
||||||
var/user_to_pred = get_dist(get_turf(user),get_turf(pred))
|
|
||||||
var/user_to_prey = get_dist(get_turf(user),get_turf(prey))
|
|
||||||
|
|
||||||
if(user_to_pred > 1 || user_to_prey > 1)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
// Prepare messages
|
|
||||||
if(user == pred) //Feeding someone to yourself
|
|
||||||
success_msg = text("<span class='warning'>[] manages to [] [] into their []!</span>",pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
|
|
||||||
else //Feeding someone to another person. This shouldn't happen.
|
|
||||||
success_msg = text("<span class='warning'>[] manages to make [] [] [] into their []!</span>",user,pred,lowertext(belly_target.vore_verb),prey,lowertext(belly_target.name))
|
|
||||||
|
|
||||||
user.visible_message(success_msg)
|
|
||||||
if(belly_target.vore_sound)
|
|
||||||
playsound(user, belly_target.vore_sound, 100, 1)
|
|
||||||
|
|
||||||
// Actually shove prey into the belly.
|
|
||||||
belly_target.nom_mob(prey, user)
|
|
||||||
user.update_icons()
|
|
||||||
|
|
||||||
// Flavor handling
|
|
||||||
if(belly_target.can_taste && prey.get_taste_message(0))
|
|
||||||
to_chat(belly_target.owner, "<span class='notice'>[prey] tastes of [prey.get_taste_message(0)].</span>")
|
|
||||||
|
|
||||||
// Inform Admins
|
|
||||||
if (pred == user)
|
|
||||||
msg_admin_attack("[key_name(pred)] ate [key_name(prey)] via dropnom/slime feeding!. ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
|
|
||||||
else
|
|
||||||
msg_admin_attack("[key_name(user)] forced [key_name(pred)] to eat [key_name(prey)] via dropnoms/slime feeding!! ([pred ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[pred.x];Y=[pred.y];Z=[pred.z]'>JMP</a>" : "null"])")
|
|
||||||
|
|
||||||
/mob/living/proc/glow_toggle()
|
/mob/living/proc/glow_toggle()
|
||||||
set name = "Glow (Toggle)"
|
set name = "Glow (Toggle)"
|
||||||
@@ -594,18 +531,20 @@
|
|||||||
set category = "Abilities"
|
set category = "Abilities"
|
||||||
set desc = "Consume held garbage."
|
set desc = "Consume held garbage."
|
||||||
|
|
||||||
|
if(!vore_selected)
|
||||||
|
to_chat(src,"<span class='warning'>You either don't have a belly selected, or don't have a belly!</span>")
|
||||||
|
return
|
||||||
|
|
||||||
var/obj/item/I = get_active_hand()
|
var/obj/item/I = get_active_hand()
|
||||||
if(!I)
|
if(!I)
|
||||||
to_chat(src, "<span class='notice'>You are not holding anything.</span>")
|
to_chat(src, "<span class='notice'>You are not holding anything.</span>")
|
||||||
return
|
return
|
||||||
|
|
||||||
if(is_type_in_list(I,edible_trash))
|
if(is_type_in_list(I,edible_trash))
|
||||||
drop_item()
|
drop_item()
|
||||||
var/belly = vore_selected
|
I.forceMove(vore_selected)
|
||||||
var/datum/belly/selected = vore_organs[belly]
|
|
||||||
playsound(src.loc, selected.vore_sound, 20, 1)
|
|
||||||
I.forceMove(src)
|
|
||||||
selected.internal_contents |= I
|
|
||||||
updateVRPanel()
|
updateVRPanel()
|
||||||
|
|
||||||
if(istype(I,/obj/item/device/flashlight/flare) || istype(I,/obj/item/weapon/flame/match) || istype(I,/obj/item/weapon/storage/box/matches))
|
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, "<span class='notice'>You can taste the flavor of spicy cardboard.</span>")
|
to_chat(src, "<span class='notice'>You can taste the flavor of spicy cardboard.</span>")
|
||||||
else if(istype(I,/obj/item/device/flashlight/glowstick))
|
else if(istype(I,/obj/item/device/flashlight/glowstick))
|
||||||
|
|||||||
@@ -34,20 +34,19 @@
|
|||||||
var/mob/living/carbon/human/user = usr
|
var/mob/living/carbon/human/user = usr
|
||||||
if(!istype(user) || user.stat) return
|
if(!istype(user) || user.stat) return
|
||||||
|
|
||||||
var/datum/belly/B = vore_organs[vore_selected]
|
|
||||||
if(retaliate || (hostile && faction != user.faction))
|
if(retaliate || (hostile && faction != user.faction))
|
||||||
user << "<span class='warning'>This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.</span>"
|
user << "<span class='warning'>This predator isn't friendly, and doesn't give a shit about your opinions of it digesting you.</span>"
|
||||||
return
|
return
|
||||||
if(B.digest_mode == "Hold")
|
if(vore_selected.digest_mode == DM_HOLD)
|
||||||
var/confirm = alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will reset after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel")
|
var/confirm = alert(user, "Enabling digestion on [name] will cause it to digest all stomach contents. Using this to break OOC prefs is against the rules. Digestion will reset after 20 minutes.", "Enabling [name]'s Digestion", "Enable", "Cancel")
|
||||||
if(confirm == "Enable")
|
if(confirm == "Enable")
|
||||||
B.digest_mode = "Digest"
|
vore_selected.digest_mode = DM_DIGEST
|
||||||
spawn(12000) //12000=20 minutes
|
spawn(12000) //12000=20 minutes
|
||||||
if(src) B.digest_mode = vore_default_mode
|
if(src) vore_selected.digest_mode = vore_default_mode
|
||||||
else
|
else
|
||||||
var/confirm = alert(user, "This mob is currently set to process all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel")
|
var/confirm = alert(user, "This mob is currently set to process all stomach contents. Do you want to disable this?", "Disabling [name]'s Digestion", "Disable", "Cancel")
|
||||||
if(confirm == "Disable")
|
if(confirm == "Disable")
|
||||||
B.digest_mode = "Hold"
|
vore_selected.digest_mode = DM_HOLD
|
||||||
|
|
||||||
/mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user)
|
/mob/living/simple_animal/attackby(var/obj/item/O, var/mob/user)
|
||||||
if (istype(O, /obj/item/weapon/newspaper) && !(ckey || (hostile && faction != user.faction)) && isturf(user.loc))
|
if (istype(O, /obj/item/weapon/newspaper) && !(ckey || (hostile && faction != user.faction)) && isturf(user.loc))
|
||||||
@@ -65,9 +64,7 @@
|
|||||||
LoseTarget() // only make one attempt at an attack rather than going into full rage mode
|
LoseTarget() // only make one attempt at an attack rather than going into full rage mode
|
||||||
else
|
else
|
||||||
user.visible_message("<span class='info'>\the [user] swats \the [src] with \the [O]!</span>!")
|
user.visible_message("<span class='info'>\the [user] swats \the [src] with \the [O]!</span>!")
|
||||||
for(var/I in vore_organs)
|
release_vore_contents()
|
||||||
var/datum/belly/B = vore_organs[I]
|
|
||||||
B.release_all_contents(include_absorbed = TRUE) // Until we can get a mob version of unsorbitol or whatever, release absorbed too
|
|
||||||
for(var/mob/living/L in living_mobs(0)) //add everyone on the tile to the do-not-eat list for a while
|
for(var/mob/living/L in living_mobs(0)) //add everyone on the tile to the do-not-eat list for a while
|
||||||
if(!(L in prey_excludes)) // Unless they're already on it, just to avoid fuckery.
|
if(!(L in prey_excludes)) // Unless they're already on it, just to avoid fuckery.
|
||||||
prey_excludes += L
|
prey_excludes += L
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
/datum/belly/proc/check_eyes(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_eyes(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
return (M.r_eyes != O.r_eyes || M.g_eyes != O.g_eyes || M.b_eyes != O.b_eyes)
|
return (M.r_eyes != O.r_eyes || M.g_eyes != O.g_eyes || M.b_eyes != O.b_eyes)
|
||||||
|
|
||||||
/datum/belly/proc/change_eyes(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_eyes(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
to_chat(M, "<span class='notice'>You feel lightheaded and drowsy...</span>")
|
to_chat(M, "<span class='notice'>You feel lightheaded and drowsy...</span>")
|
||||||
to_chat(O, "<span class='notice'>You feel warm as you make subtle changes to your captive's body.</span>")
|
to_chat(O, "<span class='notice'>You feel warm as you make subtle changes to your captive's body.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_hair(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_hair(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/datum/belly/proc/change_hair(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_hair(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -49,14 +49,14 @@
|
|||||||
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
||||||
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_skin(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_skin(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
return (M.r_skin != O.r_skin || M.g_skin != O.g_skin || M.b_skin != O.b_skin)
|
return (M.r_skin != O.r_skin || M.g_skin != O.g_skin || M.b_skin != O.b_skin)
|
||||||
|
|
||||||
/datum/belly/proc/change_skin(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_skin(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
||||||
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_gender(var/mob/living/carbon/human/M, target_gender)
|
/obj/belly/proc/check_gender(var/mob/living/carbon/human/M, target_gender)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
|
|
||||||
return (M.gender != target_gender || M.identifying_gender != target_gender)
|
return (M.gender != target_gender || M.identifying_gender != target_gender)
|
||||||
|
|
||||||
/datum/belly/proc/change_gender(var/mob/living/carbon/human/M, target_gender, message=0)
|
/obj/belly/proc/change_gender(var/mob/living/carbon/human/M, target_gender, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -100,7 +100,7 @@
|
|||||||
to_chat(M, "<span class='notice'>Your body feels very strange...</span>")
|
to_chat(M, "<span class='notice'>Your body feels very strange...</span>")
|
||||||
to_chat(O, "<span class='notice'>You feel strange as you alter your captive's gender.</span>")
|
to_chat(O, "<span class='notice'>You feel strange as you alter your captive's gender.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_tail(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_tail(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
@@ -111,7 +111,7 @@
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/datum/belly/proc/change_tail(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_tail(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -125,14 +125,14 @@
|
|||||||
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
||||||
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_tail_nocolor(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_tail_nocolor(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
return (M.tail_style != O.tail_style)
|
return (M.tail_style != O.tail_style)
|
||||||
|
|
||||||
/datum/belly/proc/change_tail_nocolor(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_tail_nocolor(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -143,7 +143,7 @@
|
|||||||
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
||||||
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_wing(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_wing(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
@@ -154,7 +154,7 @@
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/datum/belly/proc/change_wing(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_wing(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -168,14 +168,14 @@
|
|||||||
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
||||||
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_wing_nocolor(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_wing_nocolor(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
return (M.wing_style != O.wing_style)
|
return (M.wing_style != O.wing_style)
|
||||||
|
|
||||||
/datum/belly/proc/change_wing_nocolor(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_wing_nocolor(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -186,14 +186,14 @@
|
|||||||
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
to_chat(M, "<span class='notice'>Your body tingles all over...</span>")
|
||||||
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
to_chat(O, "<span class='notice'>You tingle as you make noticeable changes to your captive's body.</span>")
|
||||||
|
|
||||||
/datum/belly/proc/check_ears(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_ears(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
return (M.ear_style != O.ear_style)
|
return (M.ear_style != O.ear_style)
|
||||||
|
|
||||||
/datum/belly/proc/change_ears(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_ears(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -201,7 +201,7 @@
|
|||||||
M.ear_style = O.ear_style
|
M.ear_style = O.ear_style
|
||||||
M.update_hair()
|
M.update_hair()
|
||||||
|
|
||||||
/datum/belly/proc/check_species(var/mob/living/carbon/human/M)
|
/obj/belly/proc/check_species(var/mob/living/carbon/human/M)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return 0
|
return 0
|
||||||
@@ -210,7 +210,7 @@
|
|||||||
return 1
|
return 1
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
/datum/belly/proc/change_species(var/mob/living/carbon/human/M, message=0)
|
/obj/belly/proc/change_species(var/mob/living/carbon/human/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
if(!istype(M) || !istype(O))
|
if(!istype(M) || !istype(O))
|
||||||
return
|
return
|
||||||
@@ -247,7 +247,7 @@
|
|||||||
M.verbs += /mob/living/proc/set_size
|
M.verbs += /mob/living/proc/set_size
|
||||||
M.shapeshifter_select_shape()
|
M.shapeshifter_select_shape()
|
||||||
|
|
||||||
/datum/belly/proc/put_in_egg(var/atom/movable/M, message=0)
|
/obj/belly/proc/put_in_egg(var/atom/movable/M, message=0)
|
||||||
var/mob/living/carbon/human/O = owner
|
var/mob/living/carbon/human/O = owner
|
||||||
var/egg_path = /obj/structure/closet/secure_closet/egg
|
var/egg_path = /obj/structure/closet/secure_closet/egg
|
||||||
var/egg_name = "odd egg"
|
var/egg_name = "odd egg"
|
||||||
@@ -256,11 +256,9 @@
|
|||||||
egg_path = tf_egg_types[O.egg_type]
|
egg_path = tf_egg_types[O.egg_type]
|
||||||
egg_name = "[O.egg_type] egg"
|
egg_name = "[O.egg_type] egg"
|
||||||
|
|
||||||
var/obj/structure/closet/secure_closet/egg/egg = new egg_path(owner)
|
var/obj/structure/closet/secure_closet/egg/egg = new egg_path(src)
|
||||||
M.forceMove(egg)
|
M.forceMove(egg)
|
||||||
egg.name = egg_name
|
egg.name = egg_name
|
||||||
internal_contents -= M
|
|
||||||
internal_contents |= egg
|
|
||||||
if(message)
|
if(message)
|
||||||
to_chat(M, "<span class='notice'>You lose sensation of your body, feeling only the warmth around you as you're encased in an egg.</span>")
|
to_chat(M, "<span class='notice'>You lose sensation of your body, feeling only the warmth around you as you're encased in an egg.</span>")
|
||||||
to_chat(O, "<span class='notice'>Your body shifts as you encase [M] in an egg.</span>")
|
to_chat(O, "<span class='notice'>Your body shifts as you encase [M] in an egg.</span>")
|
||||||
@@ -74,16 +74,10 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
|
|||||||
|
|
||||||
//
|
//
|
||||||
// Belly searching for simplifying other procs
|
// Belly searching for simplifying other procs
|
||||||
|
// Mostly redundant now with belly-objects and isbelly(loc)
|
||||||
//
|
//
|
||||||
/proc/check_belly(atom/movable/A)
|
/proc/check_belly(atom/movable/A)
|
||||||
if(istype(A.loc,/mob/living))
|
return isbelly(A.loc)
|
||||||
var/mob/living/M = A.loc
|
|
||||||
for(var/I in M.vore_organs)
|
|
||||||
var/datum/belly/B = M.vore_organs[I]
|
|
||||||
if(A in B.internal_contents)
|
|
||||||
return(B)
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Save/Load Vore Preferences
|
// Save/Load Vore Preferences
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
|
|
||||||
var/datum/vore_look/picker_holder = new()
|
var/datum/vore_look/picker_holder = new()
|
||||||
picker_holder.loop = picker_holder
|
picker_holder.loop = picker_holder
|
||||||
picker_holder.selected = vore_organs[vore_selected]
|
picker_holder.selected = vore_selected
|
||||||
|
|
||||||
var/dat = picker_holder.gen_ui(src)
|
var/dat = picker_holder.gen_ui(src)
|
||||||
|
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
if(src.openpanel == 1)
|
if(src.openpanel == 1)
|
||||||
var/datum/vore_look/picker_holder = new()
|
var/datum/vore_look/picker_holder = new()
|
||||||
picker_holder.loop = picker_holder
|
picker_holder.loop = picker_holder
|
||||||
picker_holder.selected = vore_organs[vore_selected]
|
picker_holder.selected = vore_selected
|
||||||
|
|
||||||
var/dat = picker_holder.gen_ui(src)
|
var/dat = picker_holder.gen_ui(src)
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@
|
|||||||
// Callback Handler for the Inside form
|
// Callback Handler for the Inside form
|
||||||
//
|
//
|
||||||
/datum/vore_look
|
/datum/vore_look
|
||||||
var/datum/belly/selected
|
var/obj/belly/selected
|
||||||
var/show_interacts = 0
|
var/show_interacts = 0
|
||||||
var/datum/browser/popup
|
var/datum/browser/popup
|
||||||
var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action.
|
var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action.
|
||||||
@@ -57,23 +57,21 @@
|
|||||||
/datum/vore_look/proc/gen_ui(var/mob/living/user)
|
/datum/vore_look/proc/gen_ui(var/mob/living/user)
|
||||||
var/dat
|
var/dat
|
||||||
|
|
||||||
if (is_vore_predator(user.loc))
|
var/atom/userloc = user.loc
|
||||||
var/mob/living/eater = user.loc
|
if (isbelly(userloc))
|
||||||
var/datum/belly/inside_belly
|
var/obj/belly/inside_belly = userloc
|
||||||
|
var/mob/living/eater = inside_belly.owner
|
||||||
//This big block here figures out where the prey is
|
|
||||||
inside_belly = check_belly(user)
|
|
||||||
|
|
||||||
//Don't display this part if we couldn't find the belly since could be held in hand.
|
//Don't display this part if we couldn't find the belly since could be held in hand.
|
||||||
if(inside_belly)
|
if(inside_belly)
|
||||||
dat += "<font color = 'green'>You are currently [user.absorbed ? "absorbed into " : "inside "]</font> <font color = 'yellow'>[eater]'s</font> <font color = 'red'>[inside_belly]</font>!<br><br>"
|
dat += "<font color = 'green'>You are currently [user.absorbed ? "absorbed into " : "inside "]</font> <font color = 'yellow'>[eater]'s</font> <font color = 'red'>[inside_belly]</font>!<br><br>"
|
||||||
|
|
||||||
if(inside_belly.inside_flavor)
|
if(inside_belly.desc)
|
||||||
dat += "[inside_belly.inside_flavor]<br><br>"
|
dat += "[inside_belly.desc]<br><br>"
|
||||||
|
|
||||||
if (inside_belly.internal_contents.len > 1)
|
if (inside_belly.contents.len > 1)
|
||||||
dat += "You can see the following around you:<br>"
|
dat += "You can see the following around you:<br>"
|
||||||
for (var/atom/movable/O in inside_belly.internal_contents)
|
for (var/atom/movable/O in inside_belly)
|
||||||
if(istype(O,/mob/living))
|
if(istype(O,/mob/living))
|
||||||
var/mob/living/M = O
|
var/mob/living/M = O
|
||||||
//That's just you
|
//That's just you
|
||||||
@@ -99,8 +97,8 @@
|
|||||||
dat += "<HR>"
|
dat += "<HR>"
|
||||||
|
|
||||||
dat += "<ol style='list-style: none; padding: 0; overflow: auto;'>"
|
dat += "<ol style='list-style: none; padding: 0; overflow: auto;'>"
|
||||||
for(var/K in user.vore_organs) //Fuggin can't iterate over values
|
for(var/belly in user.vore_organs)
|
||||||
var/datum/belly/B = user.vore_organs[K]
|
var/obj/belly/B = belly
|
||||||
if(B == selected)
|
if(B == selected)
|
||||||
dat += "<li style='float: left'><a href='?src=\ref[src];bellypick=\ref[B]'><b>[B.name]</b>"
|
dat += "<li style='float: left'><a href='?src=\ref[src];bellypick=\ref[B]'><b>[B.name]</b>"
|
||||||
else
|
else
|
||||||
@@ -153,7 +151,7 @@
|
|||||||
if(DM_EGG)
|
if(DM_EGG)
|
||||||
spanstyle = "color:purple;"
|
spanstyle = "color:purple;"
|
||||||
|
|
||||||
dat += "<span style='[spanstyle]'> ([B.internal_contents.len])</span></a></li>"
|
dat += "<span style='[spanstyle]'> ([B.contents.len])</span></a></li>"
|
||||||
|
|
||||||
if(user.vore_organs.len < BELLIES_MAX)
|
if(user.vore_organs.len < BELLIES_MAX)
|
||||||
dat += "<li style='float: left'><a href='?src=\ref[src];newbelly=1'>New+</a></li>"
|
dat += "<li style='float: left'><a href='?src=\ref[src];newbelly=1'>New+</a></li>"
|
||||||
@@ -164,9 +162,9 @@
|
|||||||
if(!selected)
|
if(!selected)
|
||||||
dat += "No belly selected. Click one to select it."
|
dat += "No belly selected. Click one to select it."
|
||||||
else
|
else
|
||||||
if(selected.internal_contents.len > 0)
|
if(selected.contents.len)
|
||||||
dat += "<b>Contents:</b> "
|
dat += "<b>Contents:</b> "
|
||||||
for(var/O in selected.internal_contents)
|
for(var/O in selected)
|
||||||
|
|
||||||
//Mobs can be absorbed, so treat them separately from everything else
|
//Mobs can be absorbed, so treat them separately from everything else
|
||||||
if(istype(O,/mob/living))
|
if(istype(O,/mob/living))
|
||||||
@@ -184,7 +182,7 @@
|
|||||||
dat += "​"
|
dat += "​"
|
||||||
|
|
||||||
//If there's more than one thing, add an [All] button
|
//If there's more than one thing, add an [All] button
|
||||||
if(selected.internal_contents.len > 1)
|
if(selected.contents.len > 1)
|
||||||
dat += "<a href='?src=\ref[src];insidepick=1;pickall=1'>\[All\]</a>"
|
dat += "<a href='?src=\ref[src];insidepick=1;pickall=1'>\[All\]</a>"
|
||||||
|
|
||||||
dat += "<HR>"
|
dat += "<HR>"
|
||||||
@@ -203,7 +201,7 @@
|
|||||||
|
|
||||||
//Inside flavortext
|
//Inside flavortext
|
||||||
dat += "<br><a href='?src=\ref[src];b_desc=\ref[selected]'>Flavor Text:</a>"
|
dat += "<br><a href='?src=\ref[src];b_desc=\ref[selected]'>Flavor Text:</a>"
|
||||||
dat += " '[selected.inside_flavor]'"
|
dat += " '[selected.desc]'"
|
||||||
|
|
||||||
//Belly sound
|
//Belly sound
|
||||||
dat += "<br><a href='?src=\ref[src];b_sound=\ref[selected]'>Set Vore Sound</a>"
|
dat += "<br><a href='?src=\ref[src];b_sound=\ref[selected]'>Set Vore Sound</a>"
|
||||||
@@ -317,8 +315,8 @@
|
|||||||
|
|
||||||
if(href_list["outsidepick"])
|
if(href_list["outsidepick"])
|
||||||
var/atom/movable/tgt = locate(href_list["outsidepick"])
|
var/atom/movable/tgt = locate(href_list["outsidepick"])
|
||||||
var/datum/belly/OB = locate(href_list["outsidebelly"])
|
var/obj/belly/OB = locate(href_list["outsidebelly"])
|
||||||
if(!(tgt in OB.internal_contents)) //Aren't here anymore, need to update menu.
|
if(!(tgt in OB)) //Aren't here anymore, need to update menu.
|
||||||
return 1
|
return 1
|
||||||
var/intent = "Examine"
|
var/intent = "Examine"
|
||||||
|
|
||||||
@@ -331,49 +329,47 @@
|
|||||||
|
|
||||||
if("Help Out") //Help the inside-mob out
|
if("Help Out") //Help the inside-mob out
|
||||||
if(user.stat || user.absorbed || M.absorbed)
|
if(user.stat || user.absorbed || M.absorbed)
|
||||||
user << "<span class='warning'>You can't do that in your state!</span>"
|
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
user << "<font color='green'>You begin to push [M] to freedom!</font>"
|
to_chat(user,"<font color='green'>You begin to push [M] to freedom!</font>")
|
||||||
M << "[usr] begins to push you to freedom!"
|
to_chat(M,"[usr] begins to push you to freedom!")
|
||||||
M.loc << "<span class='warning'>Someone is trying to escape from inside you!</span>"
|
to_chat(M.loc,"<span class='warning'>Someone is trying to escape from inside you!</span>")
|
||||||
sleep(50)
|
sleep(50)
|
||||||
if(prob(33))
|
if(prob(33))
|
||||||
OB.release_specific_contents(M)
|
OB.release_specific_contents(M)
|
||||||
usr << "<font color='green'>You manage to help [M] to safety!</font>"
|
to_chat(usr,"<font color='green'>You manage to help [M] to safety!</font>")
|
||||||
M << "<font color='green'>[user] pushes you free!</font>"
|
to_chat(M,"<font color='green'>[user] pushes you free!</font>")
|
||||||
M.loc << "<span class='alert'>[M] forces free of the confines of your body!</span>"
|
to_chat(OB.owner,"<span class='alert'>[M] forces free of the confines of your body!</span>")
|
||||||
else
|
else
|
||||||
user << "<span class='alert'>[M] slips back down inside despite your efforts.</span>"
|
to_chat(user,"<span class='alert'>[M] slips back down inside despite your efforts.</span>")
|
||||||
M << "<span class='alert'> Even with [user]'s help, you slip back inside again.</span>"
|
to_chat(M,"<span class='alert'> Even with [user]'s help, you slip back inside again.</span>")
|
||||||
M.loc << "<font color='green'>Your body efficiently shoves [M] back where they belong.</font>"
|
to_chat(OB.owner,"<font color='green'>Your body efficiently shoves [M] back where they belong.</font>")
|
||||||
|
|
||||||
if("Devour") //Eat the inside mob
|
if("Devour") //Eat the inside mob
|
||||||
if(user.absorbed || user.stat)
|
if(user.absorbed || user.stat)
|
||||||
user << "<span class='warning'>You can't do that in your state!</span>"
|
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
if(!user.vore_selected)
|
if(!user.vore_selected)
|
||||||
user << "<span class='warning'>Pick a belly on yourself first!</span>"
|
to_chat(user,"<span class='warning'>Pick a belly on yourself first!</span>")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
var/datum/belly/TB = user.vore_organs[user.vore_selected]
|
var/obj/belly/TB = user.vore_selected
|
||||||
user << "<span class='warning'>You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!</span>"
|
to_chat(user,"<span class='warning'>You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!</span>")
|
||||||
M << "<span class='warning'>[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!</span>"
|
to_chat(M,"<span class='warning'>[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!</span>")
|
||||||
M.loc << "<span class='warning'>Someone inside you is eating someone else!</span>"
|
to_chat(OB.owner,"<span class='warning'>Someone inside you is eating someone else!</span>")
|
||||||
|
|
||||||
sleep(TB.nonhuman_prey_swallow_time)
|
sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound.
|
||||||
if((user in OB.internal_contents) && (M in OB.internal_contents))
|
if((user in OB) && (M in OB)) //Make sure they're still here.
|
||||||
user << "<span class='warning'>You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!</span>"
|
to_chat(user,"<span class='warning'>You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!</span>")
|
||||||
M << "<span class='warning'>[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!</span>"
|
to_chat(M,"<span class='warning'>[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!</span>")
|
||||||
M.loc << "<span class='warning'>Someone inside you has eaten someone else!</span>"
|
to_chat(OB.owner,"<span class='warning'>Someone inside you has eaten someone else!</span>")
|
||||||
M.loc = user
|
|
||||||
TB.nom_mob(M)
|
TB.nom_mob(M)
|
||||||
OB.internal_contents -= M
|
|
||||||
|
|
||||||
else if(istype(tgt,/obj/item))
|
else if(istype(tgt,/obj/item))
|
||||||
var/obj/item/T = tgt
|
var/obj/item/T = tgt
|
||||||
if(!(tgt in OB.internal_contents))
|
if(!(tgt in OB))
|
||||||
//Doesn't exist anymore, update.
|
//Doesn't exist anymore, update.
|
||||||
return 1
|
return 1
|
||||||
intent = alert("What do you want to do to that?","Query","Examine","Use Hand")
|
intent = alert("What do you want to do to that?","Query","Examine","Use Hand")
|
||||||
@@ -383,7 +379,7 @@
|
|||||||
|
|
||||||
if("Use Hand")
|
if("Use Hand")
|
||||||
if(user.stat)
|
if(user.stat)
|
||||||
user << "<span class='warning'>You can't do that in your state!</span>"
|
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
user.ClickOn(T)
|
user.ClickOn(T)
|
||||||
@@ -401,32 +397,26 @@
|
|||||||
|
|
||||||
if("Eject all")
|
if("Eject all")
|
||||||
if(user.stat)
|
if(user.stat)
|
||||||
user << "<span class='warning'>You can't do that in your state!</span>"
|
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
selected.release_all_contents()
|
selected.release_all_contents()
|
||||||
playsound(user, 'sound/effects/splat.ogg', 50, 1)
|
|
||||||
|
|
||||||
if("Move all")
|
if("Move all")
|
||||||
if(user.stat)
|
if(user.stat)
|
||||||
user << "<span class='warning'>You can't do that in your state!</span>"
|
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/choice = input("Move all where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
|
var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs
|
||||||
|
if(!choice)
|
||||||
if(choice == "Cancel - Don't Move")
|
|
||||||
return 0
|
return 0
|
||||||
else
|
|
||||||
var/datum/belly/B = user.vore_organs[choice]
|
|
||||||
for(var/atom/movable/tgt in selected.internal_contents)
|
|
||||||
tgt << "<span class='warning'>You're squished from [user]'s [selected] to their [B]!</span>"
|
|
||||||
selected.transfer_contents(tgt, B, 1)
|
|
||||||
|
|
||||||
for(var/mob/hearer in range(1,user))
|
for(var/atom/movable/tgt in selected)
|
||||||
hearer << sound('sound/vore/squish2.ogg',volume=80)
|
to_chat(tgt,"<span class='warning'>You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!</span>")
|
||||||
|
selected.transfer_contents(tgt, choice, 1)
|
||||||
|
|
||||||
var/atom/movable/tgt = locate(href_list["insidepick"])
|
var/atom/movable/tgt = locate(href_list["insidepick"])
|
||||||
if(!(tgt in selected.internal_contents)) //Old menu, needs updating because they aren't really there.
|
if(!(tgt in selected)) //Old menu, needs updating because they aren't really there.
|
||||||
return 1 //Forces update
|
return 1 //Forces update
|
||||||
intent = "Examine"
|
intent = "Examine"
|
||||||
intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move")
|
intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move")
|
||||||
@@ -436,28 +426,22 @@
|
|||||||
|
|
||||||
if("Eject")
|
if("Eject")
|
||||||
if(user.stat)
|
if(user.stat)
|
||||||
user << "<span class='warning'>You can't do that in your state!</span>"
|
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
selected.release_specific_contents(tgt)
|
selected.release_specific_contents(tgt)
|
||||||
playsound(user, 'sound/effects/splat.ogg', 50, 1)
|
|
||||||
|
|
||||||
if("Move")
|
if("Move")
|
||||||
if(user.stat)
|
if(user.stat)
|
||||||
user << "<span class='warning'>You can't do that in your state!</span>"
|
to_chat(user,"<span class='warning'>You can't do that in your state!</span>")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/choice = input("Move [tgt] where?","Select Belly") in user.vore_organs + "Cancel - Don't Move"
|
var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs
|
||||||
|
if(!choice || !(tgt in selected))
|
||||||
if(choice == "Cancel - Don't Move")
|
|
||||||
return 0
|
return 0
|
||||||
else
|
|
||||||
var/datum/belly/B = user.vore_organs[choice]
|
|
||||||
if (!(tgt in selected.internal_contents))
|
|
||||||
return 0
|
|
||||||
tgt << "<span class='warning'>You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(B.name)]!</span>"
|
|
||||||
selected.transfer_contents(tgt, B)
|
|
||||||
|
|
||||||
|
to_chat(tgt,"<span class='warning'>You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]!</span>")
|
||||||
|
selected.transfer_contents(tgt, choice)
|
||||||
|
|
||||||
if(href_list["newbelly"])
|
if(href_list["newbelly"])
|
||||||
if(user.vore_organs.len >= BELLIES_MAX)
|
if(user.vore_organs.len >= BELLIES_MAX)
|
||||||
@@ -465,21 +449,28 @@
|
|||||||
|
|
||||||
var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null)
|
var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null)
|
||||||
|
|
||||||
|
var/failure_msg
|
||||||
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
|
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
|
||||||
alert("Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX]).","Error")
|
failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])."
|
||||||
return 0
|
// else if(whatever) //Next test here.
|
||||||
if(new_name in user.vore_organs)
|
else
|
||||||
alert("No duplicate belly names, please.","Error")
|
for(var/belly in user.vore_organs)
|
||||||
|
var/obj/belly/B = belly
|
||||||
|
if(lowertext(new_name) == lowertext(B.name))
|
||||||
|
failure_msg = "No duplicate belly names, please."
|
||||||
|
break
|
||||||
|
|
||||||
|
if(failure_msg) //Something went wrong.
|
||||||
|
alert(user,failure_msg,"Error!")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
var/datum/belly/NB = new(user)
|
var/obj/belly/NB = new(user)
|
||||||
NB.name = new_name
|
NB.name = new_name
|
||||||
user.vore_organs[new_name] = NB
|
|
||||||
selected = NB
|
selected = NB
|
||||||
|
|
||||||
if(href_list["bellypick"])
|
if(href_list["bellypick"])
|
||||||
selected = locate(href_list["bellypick"])
|
selected = locate(href_list["bellypick"])
|
||||||
user.vore_selected = selected.name
|
user.vore_selected = selected
|
||||||
|
|
||||||
////
|
////
|
||||||
//Please keep these the same order they are on the panel UI for ease of coding
|
//Please keep these the same order they are on the panel UI for ease of coding
|
||||||
@@ -487,47 +478,43 @@
|
|||||||
if(href_list["b_name"])
|
if(href_list["b_name"])
|
||||||
var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null)
|
var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null)
|
||||||
|
|
||||||
|
var/failure_msg
|
||||||
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
|
if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN)
|
||||||
alert("Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX]).","Error")
|
failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])."
|
||||||
return 0
|
// else if(whatever) //Next test here.
|
||||||
if(new_name in user.vore_organs)
|
else
|
||||||
alert("No duplicate belly names, please.","Error")
|
for(var/belly in user.vore_organs)
|
||||||
|
var/obj/belly/B = belly
|
||||||
|
if(lowertext(new_name) == lowertext(B.name))
|
||||||
|
failure_msg = "No duplicate belly names, please."
|
||||||
|
break
|
||||||
|
|
||||||
|
if(failure_msg) //Something went wrong.
|
||||||
|
alert(user,failure_msg,"Error!")
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
user.vore_organs[new_name] = selected
|
|
||||||
user.vore_organs -= selected.name
|
|
||||||
selected.name = new_name
|
selected.name = new_name
|
||||||
|
|
||||||
if(href_list["b_mode"])
|
if(href_list["b_mode"])
|
||||||
var/list/menu_list = selected.digest_modes
|
var/list/menu_list = selected.digest_modes
|
||||||
if(istype(usr,/mob/living/carbon/human))
|
if(istype(usr,/mob/living/carbon/human))
|
||||||
//var/mob/living/carbon/human/H = usr
|
|
||||||
//if(H.species.vore_numbing)
|
|
||||||
//menu_list += DM_DIGEST_NUMB
|
|
||||||
menu_list += selected.transform_modes
|
menu_list += selected.transform_modes
|
||||||
|
|
||||||
if(selected.digest_modes.len == 1) // Don't do anything
|
var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list
|
||||||
|
if(!new_mode)
|
||||||
return 0
|
return 0
|
||||||
if(selected.digest_modes.len == 2) // Just toggle... there's probably a more elegant way to do this...
|
selected.digest_mode = new_mode
|
||||||
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
|
|
||||||
selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change
|
selected.items_preserved.Cut() //Re-evaltuate all items in belly on belly-mode change
|
||||||
|
|
||||||
if(href_list["b_desc"])
|
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)
|
var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null)
|
||||||
|
|
||||||
if(new_desc)
|
if(new_desc)
|
||||||
new_desc = readd_quotes(new_desc)
|
new_desc = readd_quotes(new_desc)
|
||||||
if(length(new_desc) > BELLIES_DESC_MAX)
|
if(length(new_desc) > BELLIES_DESC_MAX)
|
||||||
alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error")
|
alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error")
|
||||||
return 0
|
return 0
|
||||||
selected.inside_flavor = new_desc
|
selected.desc = new_desc
|
||||||
else //Returned null
|
else //Returned null
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
@@ -612,31 +599,32 @@
|
|||||||
return
|
return
|
||||||
if(new_bulge == 0) //Disable.
|
if(new_bulge == 0) //Disable.
|
||||||
selected.bulge_size = 0
|
selected.bulge_size = 0
|
||||||
user << "<span class='notice'>Your stomach will not be seen on examine.</span>"
|
to_chat(user,"<span class='notice'>Your stomach will not be seen on examine.</span>")
|
||||||
else if (!IsInRange(new_bulge,25,200))
|
else if (!IsInRange(new_bulge,25,200))
|
||||||
selected.bulge_size = 0.25 //Set it to the default.
|
selected.bulge_size = 0.25 //Set it to the default.
|
||||||
user << "<span class='notice'>Invalid size.</span>"
|
to_chat(user,"<span class='notice'>Invalid size.</span>")
|
||||||
else if(new_bulge)
|
else if(new_bulge)
|
||||||
selected.bulge_size = (new_bulge/100)
|
selected.bulge_size = (new_bulge/100)
|
||||||
|
|
||||||
if(href_list["b_grow_shrink"])
|
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.") as num|null
|
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)
|
if (new_grow == null)
|
||||||
return
|
return
|
||||||
if (!IsInRange(new_grow,25,200))
|
if (!IsInRange(new_grow,25,200))
|
||||||
selected.shrink_grow_size = 1 //Set it to the default
|
selected.shrink_grow_size = 1 //Set it to the default
|
||||||
user << "<span class='notice'>Invalid size.</span>"
|
to_chat(user,"<span class='notice'>Invalid size.</span>")
|
||||||
else if(new_grow)
|
else if(new_grow)
|
||||||
selected.shrink_grow_size = (new_grow/100)
|
selected.shrink_grow_size = (new_grow*0.01)
|
||||||
|
|
||||||
if(href_list["b_burn_dmg"])
|
if(href_list["b_burn_dmg"])
|
||||||
var/new_damage = input(user, "Choose the amount of burn damage prey will take per tick. Ranges from 0 to 6.", "Set Belly Burn Damage.") as num|null
|
var/new_damage = input(user, "Choose the amount of burn damage prey will take per tick. Ranges from 0 to 6.", "Set Belly Burn Damage.", selected.digest_burn) as num|null
|
||||||
if(new_damage == null)
|
if(new_damage == null)
|
||||||
return
|
return
|
||||||
var/new_new_damage = Clamp(new_damage, 0, 6)
|
var/new_new_damage = Clamp(new_damage, 0, 6)
|
||||||
selected.digest_burn = new_new_damage
|
selected.digest_burn = new_new_damage
|
||||||
|
|
||||||
if(href_list["b_brute_dmg"])
|
if(href_list["b_brute_dmg"])
|
||||||
var/new_damage = input(user, "Choose the amount of brute damage prey will take per tick. Ranges from 0 to 6", "Set Belly Brute Damage.") as num|null
|
var/new_damage = input(user, "Choose the amount of brute damage prey will take per tick. Ranges from 0 to 6", "Set Belly Brute Damage.", selected.digest_brute) as num|null
|
||||||
if(new_damage == null)
|
if(new_damage == null)
|
||||||
return
|
return
|
||||||
var/new_new_damage = Clamp(new_damage, 0, 6)
|
var/new_new_damage = Clamp(new_damage, 0, 6)
|
||||||
@@ -645,10 +633,10 @@
|
|||||||
if(href_list["b_escapable"])
|
if(href_list["b_escapable"])
|
||||||
if(selected.escapable == 0) //Possibly escapable and special interactions.
|
if(selected.escapable == 0) //Possibly escapable and special interactions.
|
||||||
selected.escapable = 1
|
selected.escapable = 1
|
||||||
usr << "<span class='warning'>Prey now have special interactions with your [selected.name] depending on your settings.</span>"
|
to_chat(usr,"<span class='warning'>Prey now have special interactions with your [lowertext(selected.name)] depending on your settings.</span>")
|
||||||
else if(selected.escapable == 1) //Never escapable.
|
else if(selected.escapable == 1) //Never escapable.
|
||||||
selected.escapable = 0
|
selected.escapable = 0
|
||||||
usr << "<span class='warning'>Prey will not be able to have special interactions with your [selected.name].</span>"
|
to_chat(usr,"<span class='warning'>Prey will not be able to have special interactions with your [lowertext(selected.name)].</span>")
|
||||||
show_interacts = 0 //Force the hiding of the panel
|
show_interacts = 0 //Force the hiding of the panel
|
||||||
else
|
else
|
||||||
alert("Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.","Error") //If they somehow have a varable that's not 0 or 1
|
alert("Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.","Error") //If they somehow have a varable that's not 0 or 1
|
||||||
@@ -671,14 +659,14 @@
|
|||||||
selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(selected.transferchance))
|
selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(selected.transferchance))
|
||||||
|
|
||||||
if(href_list["b_transferlocation"])
|
if(href_list["b_transferlocation"])
|
||||||
var/choice = input("Where do you want your [selected.name] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected.name)
|
var/obj/belly/choice = input("Where do you want your [lowertext(selected.name)] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected)
|
||||||
|
|
||||||
if(!choice) //They cancelled, no changes
|
if(!choice) //They cancelled, no changes
|
||||||
return 0
|
return 0
|
||||||
else if(choice == "None - Remove")
|
else if(choice == "None - Remove")
|
||||||
selected.transferlocation = null
|
selected.transferlocation = null
|
||||||
else
|
else
|
||||||
selected.transferlocation = user.vore_organs[choice]
|
selected.transferlocation = choice.name
|
||||||
|
|
||||||
if(href_list["b_absorbchance"])
|
if(href_list["b_absorbchance"])
|
||||||
var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null
|
var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null
|
||||||
@@ -691,51 +679,51 @@
|
|||||||
selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance))
|
selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance))
|
||||||
|
|
||||||
if(href_list["b_del"])
|
if(href_list["b_del"])
|
||||||
var/dest_for = 0 //Check to see if it's the destination of another vore organ.
|
var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel")
|
||||||
for(var/I in user.vore_organs)
|
if(!alert == "Delete")
|
||||||
var/datum/belly/B = user.vore_organs[I]
|
return 0
|
||||||
|
|
||||||
|
var/failure_msg = ""
|
||||||
|
|
||||||
|
var/dest_for //Check to see if it's the destination of another vore organ.
|
||||||
|
for(var/belly in user.vore_organs)
|
||||||
|
var/obj/belly/B = belly
|
||||||
if(B.transferlocation == selected)
|
if(B.transferlocation == selected)
|
||||||
dest_for = B.name
|
dest_for = B.name
|
||||||
|
failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. "
|
||||||
break
|
break
|
||||||
|
|
||||||
if(dest_for)
|
if(selected.contents.len)
|
||||||
alert("This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it.","Error")
|
failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same.
|
||||||
return 1
|
if(selected.immutable)
|
||||||
else if(selected.internal_contents.len)
|
failure_msg += "This belly is marked as undeletable. "
|
||||||
alert("Can't delete bellies with contents!","Error")
|
if(user.vore_organs.len == 1)
|
||||||
return 1
|
failure_msg += "You must have at least one belly. "
|
||||||
else if(selected.immutable)
|
|
||||||
alert("This belly is marked as undeletable.","Error")
|
if(failure_msg)
|
||||||
return 1
|
alert(user,failure_msg,"Error!")
|
||||||
else if(user.vore_organs.len == 1)
|
return 0
|
||||||
alert("You must have at least one belly.","Error")
|
|
||||||
return 1
|
qdel(selected)
|
||||||
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]
|
selected = user.vore_organs[1]
|
||||||
user.vore_selected = user.vore_organs[1]
|
user.vore_selected = user.vore_organs[1]
|
||||||
usr << "<span class='warning'>Note: If you had this organ selected as a transfer location, please remove the transfer location by selecting Cancel - None - Remove on this stomach.</span>" //If anyone finds a fix to this bug, please tell me. I, for the life of me, can't find any way to fix it.
|
|
||||||
|
|
||||||
if(href_list["saveprefs"])
|
if(href_list["saveprefs"])
|
||||||
if(!user.save_vore_prefs())
|
if(!user.save_vore_prefs())
|
||||||
alert("ERROR: Virgo-specific preferences failed to save!","Error")
|
alert("ERROR: Virgo-specific preferences failed to save!","Error")
|
||||||
else
|
else
|
||||||
user << "<span class='notice'>Virgo-specific preferences saved!</span>"
|
to_chat(user,"<span class='notice'>Virgo-specific preferences saved!</span>")
|
||||||
|
|
||||||
if(href_list["setflavor"])
|
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)
|
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
|
||||||
|
|
||||||
if(new_flavor)
|
|
||||||
new_flavor = readd_quotes(new_flavor)
|
new_flavor = readd_quotes(new_flavor)
|
||||||
if(length(new_flavor) > FLAVOR_MAX)
|
if(length(new_flavor) > FLAVOR_MAX)
|
||||||
alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error")
|
alert("Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!")
|
||||||
return 0
|
return 0
|
||||||
user.vore_taste = new_flavor
|
user.vore_taste = new_flavor
|
||||||
else //Returned null
|
|
||||||
return 0
|
|
||||||
|
|
||||||
if(href_list["toggle_dropnom_pred"])
|
if(href_list["toggle_dropnom_pred"])
|
||||||
var/choice = alert(user, "You are currently [user.can_be_drop_pred ? " able to eat prey that fall from above or that you fall onto" : "not able to eat prey that fall from above or that you fall onto."]", "", "Be Pred", "Cancel", "Don't be Pred")
|
var/choice = alert(user, "You are currently [user.can_be_drop_pred ? " able to eat prey that fall from above or that you fall onto" : "not able to eat prey that fall from above or that you fall onto."]", "", "Be Pred", "Cancel", "Don't be Pred")
|
||||||
@@ -743,9 +731,9 @@
|
|||||||
if("Cancel")
|
if("Cancel")
|
||||||
return 0
|
return 0
|
||||||
if("Be Pred")
|
if("Be Pred")
|
||||||
user.can_be_drop_pred = 1
|
user.can_be_drop_pred = TRUE
|
||||||
if("Don't be Pred")
|
if("Don't be Pred")
|
||||||
user.can_be_drop_pred = 0
|
user.can_be_drop_pred = FALSE
|
||||||
|
|
||||||
if(href_list["toggle_dropnom_prey"])
|
if(href_list["toggle_dropnom_prey"])
|
||||||
var/choice = alert(user, "You are currently [user.can_be_drop_prey ? "able to be eaten." : "not able to be eaten."]", "", "Be Prey", "Cancel", "Don't Be Prey")
|
var/choice = alert(user, "You are currently [user.can_be_drop_prey ? "able to be eaten." : "not able to be eaten."]", "", "Be Prey", "Cancel", "Don't Be Prey")
|
||||||
@@ -753,19 +741,19 @@
|
|||||||
if("Cancel")
|
if("Cancel")
|
||||||
return 0
|
return 0
|
||||||
if("Be Prey")
|
if("Be Prey")
|
||||||
user.can_be_drop_prey = 1
|
user.can_be_drop_prey = TRUE
|
||||||
if("Don't Be Prey")
|
if("Don't Be Prey")
|
||||||
user.can_be_drop_prey = 0
|
user.can_be_drop_prey = FALSE
|
||||||
|
|
||||||
if(href_list["toggledg"])
|
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")
|
var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Digesting you is currently: [user.digestable ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion")
|
||||||
switch(choice)
|
switch(choice)
|
||||||
if("Cancel")
|
if("Cancel")
|
||||||
return 0
|
return 0
|
||||||
if("Allow Digestion")
|
if("Allow Digestion")
|
||||||
user.digestable = 1
|
user.digestable = TRUE
|
||||||
if("Prevent Digestion")
|
if("Prevent Digestion")
|
||||||
user.digestable = 0
|
user.digestable = FALSE
|
||||||
|
|
||||||
message_admins("[key_name(user)] toggled their digestability to [user.digestable] ([user ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[user.loc.];Y=[user.loc.y];Z=[user.loc.z]'>JMP</a>" : "null"])")
|
message_admins("[key_name(user)] toggled their digestability to [user.digestable] ([user ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[user.loc.];Y=[user.loc.y];Z=[user.loc.z]'>JMP</a>" : "null"])")
|
||||||
|
|
||||||
@@ -773,14 +761,14 @@
|
|||||||
user.client.prefs_vr.digestable = user.digestable
|
user.client.prefs_vr.digestable = user.digestable
|
||||||
|
|
||||||
if(href_list["togglemv"])
|
if(href_list["togglemv"])
|
||||||
var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Don't abuse this button by toggling it back and forth in combat or whatever, or you'll make the admins cry. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation")
|
var/choice = alert(user, "This button is for those who don't like being eaten by mobs. Messages admins when changed, so don't try to use it for mechanical benefit. Set it once and save it. Mobs are currently: [user.allowmobvore ? "Allowed to eat" : "Prevented from eating"] you.", "", "Allow Mob Predation", "Cancel", "Prevent Mob Predation")
|
||||||
switch(choice)
|
switch(choice)
|
||||||
if("Cancel")
|
if("Cancel")
|
||||||
return 0
|
return 0
|
||||||
if("Allow Mob Predation")
|
if("Allow Mob Predation")
|
||||||
user.allowmobvore = 1
|
user.allowmobvore = TRUE
|
||||||
if("Prevent Mob Predation")
|
if("Prevent Mob Predation")
|
||||||
user.allowmobvore = 0
|
user.allowmobvore = FALSE
|
||||||
|
|
||||||
message_admins("[key_name(user)] toggled their mob vore preference to [user.allowmobvore] ([user ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[user.loc.];Y=[user.loc.y];Z=[user.loc.z]'>JMP</a>" : "null"])")
|
message_admins("[key_name(user)] toggled their mob vore preference to [user.allowmobvore] ([user ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[user.loc.];Y=[user.loc.y];Z=[user.loc.z]'>JMP</a>" : "null"])")
|
||||||
|
|
||||||
@@ -793,9 +781,9 @@
|
|||||||
if("Cancel")
|
if("Cancel")
|
||||||
return 0
|
return 0
|
||||||
if("Enable audible hunger")
|
if("Enable audible hunger")
|
||||||
user.noisy = 1
|
user.noisy = TRUE
|
||||||
if("Disable audible hunger")
|
if("Disable audible hunger")
|
||||||
user.noisy = 0
|
user.noisy = FALSE
|
||||||
|
|
||||||
//Refresh when interacted with, returning 1 makes vore_look.Topic update
|
//Refresh when interacted with, returning 1 makes vore_look.Topic update
|
||||||
return 1
|
return 1
|
||||||
|
|||||||
@@ -190,7 +190,7 @@
|
|||||||
new /obj/item/ammo_casing/nsfw_batt/net(src)
|
new /obj/item/ammo_casing/nsfw_batt/net(src)
|
||||||
new /obj/item/clothing/accessory/holster(src)
|
new /obj/item/clothing/accessory/holster(src)
|
||||||
|
|
||||||
/obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai/digest_act(var/datum/belly/belly = null)
|
/obj/item/weapon/storage/backpack/satchel/gen/fluff/aronai/digest_act(...)
|
||||||
return FALSE //I get eaten a lot, okay
|
return FALSE //I get eaten a lot, okay
|
||||||
|
|
||||||
//Aerowing:Sebastian Aji
|
//Aerowing:Sebastian Aji
|
||||||
|
|||||||
@@ -105,7 +105,7 @@
|
|||||||
else
|
else
|
||||||
RemoveHood_roiz()
|
RemoveHood_roiz()
|
||||||
|
|
||||||
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/clothing/suit/storage/hooded/wintercoat/roiz/digest_act(var/atom/movable/item_storage = null)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
//ketrai:Ketrai
|
//ketrai:Ketrai
|
||||||
@@ -679,7 +679,7 @@
|
|||||||
else
|
else
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
/obj/item/clothing/under/fluff/screesuit/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/clothing/under/fluff/screesuit/digest_act(var/atom/movable/item_storage = null)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
//HOS Hardsuit
|
//HOS Hardsuit
|
||||||
@@ -769,7 +769,7 @@
|
|||||||
|
|
||||||
action_button_name = "Toggle pom-pom"
|
action_button_name = "Toggle pom-pom"
|
||||||
|
|
||||||
/obj/item/clothing/head/fluff/pompom/digest_act(var/list/internal_contents = null, var/atom/movable/item_storage = null)
|
/obj/item/clothing/head/fluff/pompom/digest_act(var/atom/movable/item_storage = null)
|
||||||
return FALSE
|
return FALSE
|
||||||
|
|
||||||
/obj/item/clothing/head/fluff/pompom/attack_self(mob/user)
|
/obj/item/clothing/head/fluff/pompom/attack_self(mob/user)
|
||||||
|
|||||||
@@ -1509,34 +1509,25 @@
|
|||||||
to_chat(user,"<span class='warning'>\The [src] malfunctions and sends you to the wrong beacon!</span>")
|
to_chat(user,"<span class='warning'>\The [src] malfunctions and sends you to the wrong beacon!</span>")
|
||||||
|
|
||||||
//Destination beacon vore checking
|
//Destination beacon vore checking
|
||||||
var/datum/belly/target_belly
|
var/atom/real_dest = dT
|
||||||
var/atom/real_dest = get_turf(destination)
|
var/televored = FALSE //UR GONNA GET VORED
|
||||||
|
|
||||||
//Destination beacon is held/eaten
|
var/atom/real_loc = destination.loc
|
||||||
if(isliving(destination.loc) && (target != destination.loc)) //We should definitely get televored unless we're teleporting ourselves into ourselves
|
if(isbelly(real_loc))
|
||||||
var/mob/living/L = destination.loc
|
real_dest = real_loc
|
||||||
|
televored = TRUE
|
||||||
//Is the beacon IN a belly?
|
if(isliving(real_loc))
|
||||||
target_belly = check_belly(destination)
|
var/mob/living/L = real_loc
|
||||||
|
|
||||||
//No? Well do they have vore organs at all?
|
|
||||||
if(!target_belly && L.vore_organs.len)
|
|
||||||
|
|
||||||
//If they do, use their picked one.
|
|
||||||
if(L.vore_selected)
|
if(L.vore_selected)
|
||||||
target_belly = L.vore_organs[L.vore_selected]
|
real_dest = L.vore_selected
|
||||||
else
|
televored = TRUE
|
||||||
//Else just use the first one.
|
else if(L.vore_organs.len)
|
||||||
var/I = L.vore_organs[1] //We're just going to use 1
|
real_dest = pick(L.vore_organs)
|
||||||
target_belly = L.vore_organs[I]
|
televored = TRUE
|
||||||
|
|
||||||
//Televore fluff stuff
|
//Televore fluff stuff
|
||||||
if(target_belly)
|
if(televored)
|
||||||
real_dest = destination.loc
|
to_chat(target,"<span class='warning'>\The [src] teleports you right into \a [lowertext(real_dest.name)]!</span>")
|
||||||
target_belly.internal_contents |= target
|
|
||||||
playsound(target_belly.owner, target_belly.vore_sound, 100, 1)
|
|
||||||
to_chat(target,"<span class='warning'>\The [src] teleports you right into [target_belly.owner]'s [target_belly.name]!</span>")
|
|
||||||
to_chat(target_belly.owner,"<span class='warning'>Your [target_belly.name] suddenly has a new occupant!</span>")
|
|
||||||
|
|
||||||
//Phase-out effect
|
//Phase-out effect
|
||||||
phase_out(target,get_turf(target))
|
phase_out(target,get_turf(target))
|
||||||
@@ -1556,20 +1547,18 @@
|
|||||||
|
|
||||||
//Move them, and televore if necessary
|
//Move them, and televore if necessary
|
||||||
G.affecting.forceMove(real_dest)
|
G.affecting.forceMove(real_dest)
|
||||||
if(target_belly)
|
if(televored)
|
||||||
target_belly.internal_contents |= G.affecting
|
to_chat(target,"<span class='warning'>\The [src] teleports you right into \a [lowertext(real_dest.name)]!</span>")
|
||||||
to_chat(G.affecting,"<span class='warning'>\The [src] teleports you right into [target_belly.owner]'s [target_belly.name]!</span>")
|
|
||||||
|
|
||||||
//Phase-in effect for grabbed person
|
//Phase-in effect for grabbed person
|
||||||
phase_in(G.affecting,get_turf(G.affecting))
|
phase_in(G.affecting,get_turf(G.affecting))
|
||||||
|
|
||||||
update_icon()
|
update_icon()
|
||||||
spawn(30 SECONDS)
|
spawn(30 SECONDS)
|
||||||
if(src) //If we still exist, anyway.
|
|
||||||
ready = 1
|
ready = 1
|
||||||
update_icon()
|
update_icon()
|
||||||
|
|
||||||
logged_events["[world.time]"] = "[user] teleported [target] to [real_dest] [target_belly ? "(Belly: [target_belly.name])" : null]"
|
logged_events["[world.time]"] = "[user] teleported [target] to [real_dest] [televored ? "(Belly: [lowertext(real_loc.name)])" : null]"
|
||||||
|
|
||||||
/obj/item/device/perfect_tele/proc/phase_out(var/mob/M,var/turf/T)
|
/obj/item/device/perfect_tele/proc/phase_out(var/mob/M,var/turf/T)
|
||||||
|
|
||||||
@@ -1632,16 +1621,13 @@
|
|||||||
var/mob/living/L = user
|
var/mob/living/L = user
|
||||||
var/confirm = alert(user, "You COULD eat the beacon...", "Eat beacon?", "Eat it!", "No, thanks.")
|
var/confirm = alert(user, "You COULD eat the beacon...", "Eat beacon?", "Eat it!", "No, thanks.")
|
||||||
if(confirm == "Eat it!")
|
if(confirm == "Eat it!")
|
||||||
var/bellychoice = input("Which belly?","Select A Belly") in L.vore_organs|null
|
var/obj/belly/bellychoice = input("Which belly?","Select A Belly") as null|anything in L.vore_organs
|
||||||
if(bellychoice)
|
if(bellychoice)
|
||||||
var/datum/belly/B = L.vore_organs[bellychoice]
|
|
||||||
user.visible_message("<span class='warning'>[user] is trying to stuff \the [src] into [user.gender == MALE ? "his" : user.gender == FEMALE ? "her" : "their"] [bellychoice]!</span>","<span class='notice'>You begin putting \the [src] into your [bellychoice]!</span>")
|
user.visible_message("<span class='warning'>[user] is trying to stuff \the [src] into [user.gender == MALE ? "his" : user.gender == FEMALE ? "her" : "their"] [bellychoice]!</span>","<span class='notice'>You begin putting \the [src] into your [bellychoice]!</span>")
|
||||||
if(do_after(user,5 SECONDS,src))
|
if(do_after(user,5 SECONDS,src))
|
||||||
user.unEquip(src)
|
user.unEquip(src)
|
||||||
forceMove(user)
|
forceMove(bellychoice)
|
||||||
B.internal_contents |= src
|
|
||||||
user.visible_message("<span class='warning'>[user] eats a telebeacon!</span>","You eat the the beacon!")
|
user.visible_message("<span class='warning'>[user] eats a telebeacon!</span>","You eat the the beacon!")
|
||||||
playsound(user, B.vore_sound, 70, 1)
|
|
||||||
|
|
||||||
//InterroLouis: Ruda Lizden
|
//InterroLouis: Ruda Lizden
|
||||||
/obj/item/clothing/accessory/badge/holo/detective/ruda
|
/obj/item/clothing/accessory/badge/holo/detective/ruda
|
||||||
|
|||||||
@@ -35,14 +35,16 @@
|
|||||||
kill_count = 5 //Scary name, but just deletes the projectile after this range
|
kill_count = 5 //Scary name, but just deletes the projectile after this range
|
||||||
|
|
||||||
/obj/item/projectile/sickshot/on_hit(var/atom/movable/target, var/blocked = 0)
|
/obj/item/projectile/sickshot/on_hit(var/atom/movable/target, var/blocked = 0)
|
||||||
|
if(isliving(target))
|
||||||
|
var/mob/living/L = target
|
||||||
|
if(prob(20))
|
||||||
|
L.release_vore_contents()
|
||||||
|
|
||||||
if(ishuman(target))
|
if(ishuman(target))
|
||||||
var/mob/living/carbon/human/H = target
|
var/mob/living/carbon/human/H = target
|
||||||
H.vomit()
|
H.vomit()
|
||||||
H.Confuse(2)
|
H.Confuse(2)
|
||||||
if(prob(20))
|
|
||||||
for(var/X in H.vore_organs)
|
|
||||||
var/datum/belly/B = H.vore_organs[X]
|
|
||||||
B.release_all_contents()
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
//R&D Design
|
//R&D Design
|
||||||
|
|||||||
@@ -21,16 +21,20 @@
|
|||||||
// Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
|
// Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
|
||||||
if(!pred.vore_organs || !pred.vore_organs.len)
|
if(!pred.vore_organs || !pred.vore_organs.len)
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
// Now that pred belly exists, we can eat the prey.
|
// Now that pred belly exists, we can eat the prey.
|
||||||
if(prey.loc != pred)
|
|
||||||
if(!pred.vore_selected)
|
if(!pred.vore_selected)
|
||||||
fail("[pred] has no vore_selected.")
|
fail("[pred] has no vore_selected.")
|
||||||
return 1
|
return 1
|
||||||
var/datum/belly/TB = pred.vore_organs[pred.vore_selected]
|
|
||||||
TB.nom_mob(prey)
|
// Attempt to eat the prey
|
||||||
if(prey.loc != pred)
|
if(prey.loc != pred.vore_selected)
|
||||||
fail("[TB].nom_mob([prey]) did not put prey inside [pred]")
|
pred.vore_selected.nom_mob(prey)
|
||||||
|
|
||||||
|
if(prey.loc != pred.vore_selected)
|
||||||
|
fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
// Okay, we succeeded in eating them, now lets wait a bit
|
// Okay, we succeeded in eating them, now lets wait a bit
|
||||||
startLifeTick = pred.life_tick
|
startLifeTick = pred.life_tick
|
||||||
startOxyloss = prey.getOxyLoss()
|
startOxyloss = prey.getOxyLoss()
|
||||||
@@ -49,3 +53,123 @@
|
|||||||
qdel(prey)
|
qdel(prey)
|
||||||
qdel(pred)
|
qdel(pred)
|
||||||
return 1
|
return 1
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
/datum/unit_test/belly_spacesafe
|
||||||
|
name = "MOB: human mob protected from space in a belly"
|
||||||
|
var/startLifeTick
|
||||||
|
var/startOxyloss
|
||||||
|
var/endOxyloss
|
||||||
|
var/mob/living/carbon/human/pred
|
||||||
|
var/mob/living/carbon/human/prey
|
||||||
|
async = 1
|
||||||
|
|
||||||
|
/datum/unit_test/belly_spacesafe/start_test()
|
||||||
|
pred = create_test_mob()
|
||||||
|
if(!istype(pred))
|
||||||
|
return 0
|
||||||
|
prey = create_test_mob(pred.loc)
|
||||||
|
if(!istype(prey))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/datum/unit_test/belly_spacesafe/check_result()
|
||||||
|
// Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
|
||||||
|
if(!pred.vore_organs || !pred.vore_organs.len)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
// Now that pred belly exists, we can eat the prey.
|
||||||
|
if(!pred.vore_selected)
|
||||||
|
fail("[pred] has no vore_selected.")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
// Attempt to eat the prey
|
||||||
|
if(prey.loc != pred.vore_selected)
|
||||||
|
pred.vore_selected.nom_mob(prey)
|
||||||
|
|
||||||
|
if(prey.loc != pred.vore_selected)
|
||||||
|
fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
var/turf/T = locate(/turf/space)
|
||||||
|
if(!T)
|
||||||
|
fail("could not find a space turf for testing")
|
||||||
|
return 1
|
||||||
|
else
|
||||||
|
pred.forceMove(T)
|
||||||
|
|
||||||
|
// Okay, we succeeded in eating them, now lets wait a bit
|
||||||
|
startLifeTick = pred.life_tick
|
||||||
|
startOxyloss = prey.getOxyLoss()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(pred.life_tick < (startLifeTick + 10))
|
||||||
|
return 0 // Wait for them to breathe a few times
|
||||||
|
|
||||||
|
// Alright lets check it!
|
||||||
|
endOxyloss = prey.getOxyLoss()
|
||||||
|
if(startOxyloss < endOxyloss)
|
||||||
|
fail("Prey takes oxygen damage in space! (Before: [startOxyloss]; after: [endOxyloss])")
|
||||||
|
else
|
||||||
|
pass("Prey is not taking oxygen damage in space. (Before: [startOxyloss]; after: [endOxyloss])")
|
||||||
|
|
||||||
|
qdel(prey)
|
||||||
|
qdel(pred)
|
||||||
|
return 1
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
/datum/unit_test/belly_damage
|
||||||
|
name = "MOB: human mob takes damage from digestion"
|
||||||
|
var/startLifeTick
|
||||||
|
var/startBruteBurn
|
||||||
|
var/endBruteBurn
|
||||||
|
var/mob/living/carbon/human/pred
|
||||||
|
var/mob/living/carbon/human/prey
|
||||||
|
async = 1
|
||||||
|
|
||||||
|
/datum/unit_test/belly_damage/start_test()
|
||||||
|
pred = create_test_mob()
|
||||||
|
if(!istype(pred))
|
||||||
|
return 0
|
||||||
|
prey = create_test_mob(pred.loc)
|
||||||
|
if(!istype(prey))
|
||||||
|
return 0
|
||||||
|
|
||||||
|
return 1
|
||||||
|
|
||||||
|
/datum/unit_test/belly_damage/check_result()
|
||||||
|
// Unfortuantely we need to wait for the pred's belly to initialize. (Currently after a spawn())
|
||||||
|
if(!pred.vore_organs || !pred.vore_organs.len)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
// Now that pred belly exists, we can eat the prey.
|
||||||
|
if(!pred.vore_selected)
|
||||||
|
fail("[pred] has no vore_selected.")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
// Attempt to eat the prey
|
||||||
|
if(prey.loc != pred.vore_selected)
|
||||||
|
pred.vore_selected.nom_mob(prey)
|
||||||
|
|
||||||
|
if(prey.loc != pred.vore_selected)
|
||||||
|
fail("[pred.vore_selected].nom_mob([prey]) did not put prey inside [pred]")
|
||||||
|
return 1
|
||||||
|
|
||||||
|
// Okay, we succeeded in eating them, now lets wait a bit
|
||||||
|
pred.vore_selected.digest_mode = DM_DIGEST
|
||||||
|
startLifeTick = pred.life_tick
|
||||||
|
startBruteBurn = prey.getBruteLoss() + prey.getFireLoss()
|
||||||
|
return 0
|
||||||
|
|
||||||
|
if(pred.life_tick < (startLifeTick + 10))
|
||||||
|
return 0 // Wait a few ticks for damage to happen
|
||||||
|
|
||||||
|
// Alright lets check it!
|
||||||
|
endBruteBurn = prey.getBruteLoss() + prey.getFireLoss()
|
||||||
|
if(startBruteBurn >= endBruteBurn)
|
||||||
|
fail("Prey doesn't take damage in digesting belly! (Before: [startBruteBurn]; after: [endBruteBurn])")
|
||||||
|
else
|
||||||
|
pass("Prey is taking damage in pred's belly. (Before: [startBruteBurn]; after: [endBruteBurn])")
|
||||||
|
|
||||||
|
qdel(prey)
|
||||||
|
qdel(pred)
|
||||||
|
return 1
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
// BEGIN_INCLUDE
|
// BEGIN_INCLUDE
|
||||||
#include "code\_away_mission_tests.dm"
|
#include "code\_away_mission_tests.dm"
|
||||||
#include "code\_macros.dm"
|
#include "code\_macros.dm"
|
||||||
|
#include "code\_macros_vr.dm"
|
||||||
#include "code\_map_tests.dm"
|
#include "code\_map_tests.dm"
|
||||||
#include "code\_unit_tests.dm"
|
#include "code\_unit_tests.dm"
|
||||||
#include "code\global.dm"
|
#include "code\global.dm"
|
||||||
@@ -197,6 +198,7 @@
|
|||||||
#include "code\controllers\subsystems\air.dm"
|
#include "code\controllers\subsystems\air.dm"
|
||||||
#include "code\controllers\subsystems\airflow.dm"
|
#include "code\controllers\subsystems\airflow.dm"
|
||||||
#include "code\controllers\subsystems\atoms.dm"
|
#include "code\controllers\subsystems\atoms.dm"
|
||||||
|
#include "code\controllers\subsystems\bellies_vr.dm"
|
||||||
#include "code\controllers\subsystems\floor_decals.dm"
|
#include "code\controllers\subsystems\floor_decals.dm"
|
||||||
#include "code\controllers\subsystems\garbage.dm"
|
#include "code\controllers\subsystems\garbage.dm"
|
||||||
#include "code\controllers\subsystems\lighting.dm"
|
#include "code\controllers\subsystems\lighting.dm"
|
||||||
@@ -2672,7 +2674,8 @@
|
|||||||
#include "code\modules\vore\appearance\spider_taur_powers_vr.dm"
|
#include "code\modules\vore\appearance\spider_taur_powers_vr.dm"
|
||||||
#include "code\modules\vore\appearance\sprite_accessories_vr.dm"
|
#include "code\modules\vore\appearance\sprite_accessories_vr.dm"
|
||||||
#include "code\modules\vore\appearance\update_icons_vr.dm"
|
#include "code\modules\vore\appearance\update_icons_vr.dm"
|
||||||
#include "code\modules\vore\eating\belly_vr.dm"
|
#include "code\modules\vore\eating\belly_dat_vr.dm"
|
||||||
|
#include "code\modules\vore\eating\belly_obj_vr.dm"
|
||||||
#include "code\modules\vore\eating\bellymodes_vr.dm"
|
#include "code\modules\vore\eating\bellymodes_vr.dm"
|
||||||
#include "code\modules\vore\eating\contaminate_vr.dm"
|
#include "code\modules\vore\eating\contaminate_vr.dm"
|
||||||
#include "code\modules\vore\eating\digest_act_vr.dm"
|
#include "code\modules\vore\eating\digest_act_vr.dm"
|
||||||
|
|||||||
Reference in New Issue
Block a user