[MIRROR] Panel port test [IDB IGNORE] (#10447)

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
CHOMPStation2StaffMirrorBot
2025-03-17 00:05:24 +01:00
committed by GitHub
co-authored by Kashargul
parent 2439279209
commit 2f698760c7
389 changed files with 4764 additions and 9001 deletions
+61 -86
View File
@@ -91,14 +91,13 @@
if(islist(belly_data["addons"]))
new_belly.mode_flags = 0
new_belly.slow_digestion = FALSE // Not implemented on virgo -> CHOMPEnable
new_belly.speedy_mob_processing = FALSE // Not implemented on virgo -> CHOMPEnable
new_belly.slow_digestion = FALSE
new_belly.speedy_mob_processing = FALSE
STOP_PROCESSING(SSbellies, new_belly)
STOP_PROCESSING(SSobj, new_belly) // Not implemented on virgo -> CHOMPEnable
STOP_PROCESSING(SSobj, new_belly)
START_PROCESSING(SSbellies, new_belly)
for(var/addon in belly_data["addons"])
new_belly.mode_flags += new_belly.mode_flag_list[addon]
// Not implemented on virgo -> CHOMPEnable Start
switch(addon)
if("Slow Body Digestion")
new_belly.slow_digestion = TRUE
@@ -106,7 +105,6 @@
new_belly.speedy_mob_processing = TRUE
STOP_PROCESSING(SSbellies, new_belly)
START_PROCESSING(SSobj, new_belly)
//CHOMPEnable End
// Descriptions
if(istext(belly_data["desc"]))
@@ -140,262 +138,262 @@
if(islist(belly_data["digest_messages_prey"]))
var/new_digest_messages_prey = sanitize(jointext(belly_data["digest_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_digest_messages_prey)
new_belly.set_messages(new_digest_messages_prey,"dmp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_digest_messages_prey,DIGEST_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["digest_messages_owner"]))
var/new_digest_messages_owner = sanitize(jointext(belly_data["digest_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_digest_messages_owner)
new_belly.set_messages(new_digest_messages_owner,"dmo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_digest_messages_owner,DIGEST_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["absorb_messages_prey"]))
var/new_absorb_messages_prey = sanitize(jointext(belly_data["absorb_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_absorb_messages_prey)
new_belly.set_messages(new_absorb_messages_prey,"amp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_absorb_messages_prey,ABSORB_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["absorb_messages_owner"]))
var/new_absorb_messages_owner = sanitize(jointext(belly_data["absorb_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_absorb_messages_owner)
new_belly.set_messages(new_absorb_messages_owner,"amo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_absorb_messages_owner,ABSORB_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["unabsorb_messages_prey"]))
var/new_unabsorb_messages_prey = sanitize(jointext(belly_data["unabsorb_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_unabsorb_messages_prey)
new_belly.set_messages(new_unabsorb_messages_prey,"uamp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_unabsorb_messages_prey,UNABSORBS_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["unabsorb_messages_owner"]))
var/new_unabsorb_messages_owner = sanitize(jointext(belly_data["unabsorb_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_unabsorb_messages_owner)
new_belly.set_messages(new_unabsorb_messages_owner,"uamo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_unabsorb_messages_owner,UNABSORBS_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["struggle_messages_outside"]))
var/new_struggle_messages_outside = sanitize(jointext(belly_data["struggle_messages_outside"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_struggle_messages_outside)
new_belly.set_messages(new_struggle_messages_outside,"smo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_struggle_messages_outside,STRUGGLE_OUTSIDE, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["struggle_messages_inside"]))
var/new_struggle_messages_inside = sanitize(jointext(belly_data["struggle_messages_inside"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_struggle_messages_inside)
new_belly.set_messages(new_struggle_messages_inside,"smi", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_struggle_messages_inside,STRUGGLE_INSIDE, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["absorbed_struggle_messages_outside"]))
var/new_absorbed_struggle_messages_outside = sanitize(jointext(belly_data["absorbed_struggle_messages_outside"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_absorbed_struggle_messages_outside)
new_belly.set_messages(new_absorbed_struggle_messages_outside,"asmo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_absorbed_struggle_messages_outside,ABSORBED_STRUGGLE_OUSIDE, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["absorbed_struggle_messages_inside"]))
var/new_absorbed_struggle_messages_inside = sanitize(jointext(belly_data["absorbed_struggle_messages_inside"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_absorbed_struggle_messages_inside)
new_belly.set_messages(new_absorbed_struggle_messages_inside,"asmi", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_absorbed_struggle_messages_inside,ABSORBED_STRUGGLE_INSIDE, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_attempt_messages_prey"]))
var/new_escape_attempt_messages_prey = sanitize(jointext(belly_data["escape_attempt_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_attempt_messages_prey)
new_belly.set_messages(new_escape_attempt_messages_prey,"escap", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_attempt_messages_prey,ESCAPE_ATTEMPT_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_attempt_messages_owner"]))
var/new_escape_attempt_messages_owner = sanitize(jointext(belly_data["escape_attempt_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_attempt_messages_owner)
new_belly.set_messages(new_escape_attempt_messages_owner,"escao", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_attempt_messages_owner,ESCAPE_ATTEMPT_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_messages_prey"]))
var/new_escape_messages_prey = sanitize(jointext(belly_data["escape_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_messages_prey)
new_belly.set_messages(new_escape_messages_prey,"escp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_messages_prey,ESCAPE_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_messages_owner"]))
var/new_escape_messages_owner = sanitize(jointext(belly_data["escape_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_messages_owner)
new_belly.set_messages(new_escape_messages_owner,"esco", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_messages_owner,ESCAPE_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_messages_outside"]))
var/new_escape_messages_outside = sanitize(jointext(belly_data["escape_messages_outside"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_messages_outside)
new_belly.set_messages(new_escape_messages_outside,"escout", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_messages_outside,ESCAPE_OUTSIDE, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_item_messages_prey"]))
var/new_escape_item_messages_prey = sanitize(jointext(belly_data["escape_item_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_item_messages_prey)
new_belly.set_messages(new_escape_item_messages_prey,"escip", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_item_messages_prey,ESCAPE_ITEM_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_item_messages_owner"]))
var/new_escape_item_messages_owner = sanitize(jointext(belly_data["escape_item_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_item_messages_owner)
new_belly.set_messages(new_escape_item_messages_owner,"escio", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_item_messages_owner,ESCAPE_ITEM_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_item_messages_outside"]))
var/new_escape_item_messages_outside = sanitize(jointext(belly_data["escape_item_messages_outside"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_item_messages_outside)
new_belly.set_messages(new_escape_item_messages_outside,"esciout", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_item_messages_outside,ESCAPE_ITEM_OUTSIDE, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_fail_messages_prey"]))
var/new_escape_fail_messages_prey = sanitize(jointext(belly_data["escape_fail_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_fail_messages_prey)
new_belly.set_messages(new_escape_fail_messages_prey,"escfp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_fail_messages_prey,ESCAPE_FAIL_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_fail_messages_owner"]))
var/new_escape_fail_messages_owner = sanitize(jointext(belly_data["escape_fail_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_fail_messages_owner)
new_belly.set_messages(new_escape_fail_messages_owner,"escfo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_fail_messages_owner,ESCAPE_FAIL_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_attempt_absorbed_messages_prey"]))
var/new_escape_attempt_absorbed_messages_prey = sanitize(jointext(belly_data["escape_attempt_absorbed_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_attempt_absorbed_messages_prey)
new_belly.set_messages(new_escape_attempt_absorbed_messages_prey,"aescap", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_attempt_absorbed_messages_prey,ABSORBED_ESCAPE_ATTEMPT_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_attempt_absorbed_messages_owner"]))
var/new_escape_attempt_absorbed_messages_owner = sanitize(jointext(belly_data["escape_attempt_absorbed_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_attempt_absorbed_messages_owner)
new_belly.set_messages(new_escape_attempt_absorbed_messages_owner,"aescao", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_attempt_absorbed_messages_owner,ABSORBED_ESCAPE_ATTEMPT_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_absorbed_messages_prey"]))
var/new_escape_absorbed_messages_prey = sanitize(jointext(belly_data["escape_absorbed_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_absorbed_messages_prey)
new_belly.set_messages(new_escape_absorbed_messages_prey,"aescp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_absorbed_messages_prey,ABSORBED_ESCAPE_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_absorbed_messages_owner"]))
var/new_escape_absorbed_messages_owner = sanitize(jointext(belly_data["escape_absorbed_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_absorbed_messages_owner)
new_belly.set_messages(new_escape_absorbed_messages_owner,"aesco", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_absorbed_messages_owner,ABSORBED_ESCAPE_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_absorbed_messages_outside"]))
var/new_escape_absorbed_messages_outside = sanitize(jointext(belly_data["escape_absorbed_messages_outside"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_absorbed_messages_outside)
new_belly.set_messages(new_escape_absorbed_messages_outside,"aescout", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_absorbed_messages_outside,ABSORBED_ESCAPE_OUTSIDE, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_fail_absorbed_messages_prey"]))
var/new_escape_fail_absorbed_messages_prey = sanitize(jointext(belly_data["escape_fail_absorbed_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_fail_absorbed_messages_prey)
new_belly.set_messages(new_escape_fail_absorbed_messages_prey,"aescfp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_fail_absorbed_messages_prey,FULL_ABSORBED_ESCAPE_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["escape_fail_absorbed_messages_owner"]))
var/new_escape_fail_absorbed_messages_owner = sanitize(jointext(belly_data["escape_fail_absorbed_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_escape_fail_absorbed_messages_owner)
new_belly.set_messages(new_escape_fail_absorbed_messages_owner,"aescfo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_escape_fail_absorbed_messages_owner,FULL_ABSORBED_ESCAPE_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["primary_transfer_messages_prey"]))
var/new_primary_transfer_messages_prey = sanitize(jointext(belly_data["primary_transfer_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_primary_transfer_messages_prey)
new_belly.set_messages(new_primary_transfer_messages_prey,"trnspp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_primary_transfer_messages_prey,PRIMARY_TRANSFER_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["primary_transfer_messages_owner"]))
var/new_primary_transfer_messages_owner = sanitize(jointext(belly_data["primary_transfer_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_primary_transfer_messages_owner)
new_belly.set_messages(new_primary_transfer_messages_owner,"trnspo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_primary_transfer_messages_owner,PRIMARY_TRANSFER_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["secondary_transfer_messages_prey"]))
var/new_secondary_transfer_messages_prey = sanitize(jointext(belly_data["secondary_transfer_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_secondary_transfer_messages_prey)
new_belly.set_messages(new_secondary_transfer_messages_prey,"trnssp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_secondary_transfer_messages_prey,SECONDARY_TRANSFER_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["secondary_transfer_messages_owner"]))
var/new_secondary_transfer_messages_owner = sanitize(jointext(belly_data["secondary_transfer_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_secondary_transfer_messages_owner)
new_belly.set_messages(new_secondary_transfer_messages_owner,"trnsso", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_secondary_transfer_messages_owner,SECONDARY_TRANSFER_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["primary_autotransfer_messages_prey"]))
var/new_primary_autotransfer_messages_prey = sanitize(jointext(belly_data["primary_autotransfer_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_primary_autotransfer_messages_prey)
new_belly.set_messages(new_primary_autotransfer_messages_prey,"atrnspp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_primary_autotransfer_messages_prey,PRIMARY_AUTO_TRANSFER_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["primary_autotransfer_messages_owner"]))
var/new_primary_autotransfer_messages_owner = sanitize(jointext(belly_data["primary_autotransfer_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_primary_autotransfer_messages_owner)
new_belly.set_messages(new_primary_autotransfer_messages_owner,"atrnspo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_primary_autotransfer_messages_owner,PRIMARY_AUTO_TRANSFER_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["secondary_autotransfer_messages_prey"]))
var/new_secondary_autotransfer_messages_prey = sanitize(jointext(belly_data["secondary_autotransfer_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_secondary_autotransfer_messages_prey)
new_belly.set_messages(new_secondary_autotransfer_messages_prey,"atrnssp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_secondary_autotransfer_messages_prey,SECONDARY_AUTO_TRANSFER_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["secondary_autotransfer_messages_owner"]))
var/new_secondary_autotransfer_messages_owner = sanitize(jointext(belly_data["secondary_autotransfer_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_secondary_autotransfer_messages_owner)
new_belly.set_messages(new_secondary_autotransfer_messages_owner,"atrnsso", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_secondary_autotransfer_messages_owner,SECONDARY_AUTO_TRANSFER_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["digest_chance_messages_prey"]))
var/new_digest_chance_messages_prey = sanitize(jointext(belly_data["digest_chance_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_digest_chance_messages_prey)
new_belly.set_messages(new_digest_chance_messages_prey,"stmodp", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_digest_chance_messages_prey,DIGEST_CHANCE_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["digest_chance_messages_owner"]))
var/new_digest_chance_messages_owner = sanitize(jointext(belly_data["digest_chance_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_digest_chance_messages_owner)
new_belly.set_messages(new_digest_chance_messages_owner,"stmodo", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_digest_chance_messages_owner,DIGEST_CHANCE_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["absorb_chance_messages_prey"]))
var/new_absorb_chance_messages_prey = sanitize(jointext(belly_data["absorb_chance_messages_prey"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_absorb_chance_messages_prey)
new_belly.set_messages(new_absorb_chance_messages_prey,"stmoap", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_absorb_chance_messages_prey,ABSORB_CHANCE_PREY, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["absorb_chance_messages_owner"]))
var/new_absorb_chance_messages_owner = sanitize(jointext(belly_data["absorb_chance_messages_owner"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_absorb_chance_messages_owner)
new_belly.set_messages(new_absorb_chance_messages_owner,"stmoao", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_absorb_chance_messages_owner,ABSORB_CHANCE_OWNER, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["examine_messages"]))
var/new_examine_messages = sanitize(jointext(belly_data["examine_messages"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_examine_messages)
new_belly.set_messages(new_examine_messages,"em", limit = MAX_MESSAGE_LEN / 2)
new_belly.set_messages(new_examine_messages,EXAMINES, limit = MAX_MESSAGE_LEN / 2)
if(islist(belly_data["examine_messages_absorbed"]))
var/new_examine_messages_absorbed = sanitize(jointext(belly_data["examine_messages_absorbed"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_examine_messages_absorbed)
new_belly.set_messages(new_examine_messages_absorbed,"ema", limit = MAX_MESSAGE_LEN / 2)
new_belly.set_messages(new_examine_messages_absorbed,EXAMINES_ABSORBED, limit = MAX_MESSAGE_LEN / 2)
if(islist(belly_data["emotes_digest"]))
var/new_emotes_digest = sanitize(jointext(belly_data["emotes_digest"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_digest)
new_belly.set_messages(new_emotes_digest,"im_digest", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_digest,BELLY_MODE_DIGEST, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_hold"]))
var/new_emotes_hold = sanitize(jointext(belly_data["emotes_hold"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_hold)
new_belly.set_messages(new_emotes_hold,"im_hold", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_hold,BELLY_MODE_HOLD, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_holdabsorbed"]))
var/new_emotes_holdabsorbed = sanitize(jointext(belly_data["emotes_holdabsorbed"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_holdabsorbed)
new_belly.set_messages(new_emotes_holdabsorbed,"im_holdabsorbed", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_holdabsorbed,BELLY_MODE_HOLD_ABSORB, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_absorb"]))
var/new_emotes_absorb = sanitize(jointext(belly_data["emotes_absorb"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_absorb)
new_belly.set_messages(new_emotes_absorb,"im_absorb", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_absorb,BELLY_MODE_ABSORB, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_heal"]))
var/new_emotes_heal = sanitize(jointext(belly_data["emotes_heal"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_heal)
new_belly.set_messages(new_emotes_heal,"im_heal", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_heal,BELLY_MODE_HEAL, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_drain"]))
var/new_emotes_drain = sanitize(jointext(belly_data["emotes_drain"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_drain)
new_belly.set_messages(new_emotes_drain,"im_drain", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_drain,BELLY_MODE_DRAIN, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_steal"]))
var/new_emotes_steal = sanitize(jointext(belly_data["emotes_steal"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_steal)
new_belly.set_messages(new_emotes_steal,"im_steal", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_steal,BELLY_MODE_STEAL, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_egg"]))
var/new_emotes_egg = sanitize(jointext(belly_data["emotes_egg"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_egg)
new_belly.set_messages(new_emotes_egg,"im_egg", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_egg,BELLY_MODE_EGG, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_shrink"]))
var/new_emotes_shrink = sanitize(jointext(belly_data["emotes_shrink"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_shrink)
new_belly.set_messages(new_emotes_shrink,"im_shrink", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_shrink,BELLY_MODE_SHRINK, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_grow"]))
var/new_emotes_grow = sanitize(jointext(belly_data["emotes_grow"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_grow)
new_belly.set_messages(new_emotes_grow,"im_grow", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_grow,BELLY_MODE_GROW, limit = MAX_MESSAGE_LEN / 4)
if(islist(belly_data["emotes_unabsorb"]))
var/new_emotes_unabsorb = sanitize(jointext(belly_data["emotes_unabsorb"],"\n\n"),MAX_MESSAGE_LEN * 1.5,0,0,0)
if(new_emotes_unabsorb)
new_belly.set_messages(new_emotes_unabsorb,"im_unabsorb", limit = MAX_MESSAGE_LEN / 4)
new_belly.set_messages(new_emotes_unabsorb,BELLY_MODE_UNABSORB, limit = MAX_MESSAGE_LEN / 4)
// Options
if(isnum(belly_data["can_taste"]))
@@ -405,14 +403,12 @@
if(new_can_taste == 1)
new_belly.can_taste = TRUE
// Not implemented on virgo -> CHOMPEnable Start
if(isnum(belly_data["is_feedable"]))
var/new_is_feedable = belly_data["is_feedable"]
if(new_is_feedable == 0)
new_belly.is_feedable = FALSE
if(new_is_feedable == 1)
new_belly.is_feedable = TRUE
// CHOMPEnable End
if(isnum(belly_data["contaminates"]))
var/new_contaminates = belly_data["contaminates"]
@@ -473,29 +469,28 @@
if(isnum(belly_data["digest_brute"]))
var/new_digest_brute = belly_data["digest_brute"]
new_belly.digest_brute = CLAMP(new_digest_brute, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6
new_belly.digest_brute = CLAMP(new_digest_brute, 0, new_belly.get_unused_digestion_damage())
if(isnum(belly_data["digest_burn"]))
var/new_digest_burn = belly_data["digest_burn"]
new_belly.digest_burn = CLAMP(new_digest_burn, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6
new_belly.digest_burn = CLAMP(new_digest_burn, 0, new_belly.get_unused_digestion_damage())
if(isnum(belly_data["digest_oxy"]))
var/new_digest_oxy = belly_data["digest_oxy"]
new_belly.digest_oxy = CLAMP(new_digest_oxy, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 12
new_belly.digest_oxy = CLAMP(new_digest_oxy, 0, new_belly.get_unused_digestion_damage())
if(isnum(belly_data["digest_tox"]))
var/new_digest_tox = belly_data["digest_tox"]
new_belly.digest_tox = CLAMP(new_digest_tox, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6
new_belly.digest_tox = CLAMP(new_digest_tox, 0, new_belly.get_unused_digestion_damage())
if(isnum(belly_data["digest_clone"]))
var/new_digest_clone = belly_data["digest_clone"]
new_belly.digest_clone = CLAMP(new_digest_clone, 0, new_belly.get_unused_digestion_damage()) // CHOMP Edit; clamped to unused damage instead of 6
new_belly.digest_clone = CLAMP(new_digest_clone, 0, new_belly.get_unused_digestion_damage())
if(isnum(belly_data["shrink_grow_size"]))
var/new_shrink_grow_size = belly_data["shrink_grow_size"]
new_belly.shrink_grow_size = CLAMP(new_shrink_grow_size, 0.25, 2)
// Not implemented on virgo -> CHOMPEnable Start
if(isnum(belly_data["vorespawn_blacklist"]))
var/new_vorespawn_blacklist = belly_data["vorespawn_blacklist"]
if(new_vorespawn_blacklist == 0)
@@ -516,7 +511,6 @@
new_vorespawn_absorbed |= VS_FLAG_ABSORB_YES
new_vorespawn_absorbed |= VS_FLAG_ABSORB_PREY
new_belly.vorespawn_absorbed = new_vorespawn_absorbed
// CHOMPEnable End
if(istext(belly_data["egg_type"]))
var/new_egg_type = sanitize(belly_data["egg_type"],MAX_MESSAGE_LEN,0,0,0)
@@ -524,7 +518,6 @@
if(new_egg_type in global_vore_egg_types)
new_belly.egg_type = new_egg_type
// Not implemented on virgo -> CHOMPEnable Start
if(istext(belly_data["egg_name"]))
var/new_egg_name = html_encode(belly_data["egg_name"])
if(new_egg_name)
@@ -566,7 +559,6 @@
new_belly.item_digest_logs = FALSE
if(new_item_digest_logs == 1)
new_belly.item_digest_logs = TRUE
// CHOMPEnable End
if(istext(belly_data["selective_preference"]))
var/new_selective_preference = belly_data["selective_preference"]
@@ -575,14 +567,12 @@
if(new_selective_preference == "Absorb")
new_belly.selective_preference = DM_ABSORB
// Not implemented on virgo -> CHOMPEnable Start
if(isnum(belly_data["private_struggle"]))
var/new_private_struggle = belly_data["private_struggle"]
if(new_private_struggle == 0)
new_belly.private_struggle = FALSE
if(new_private_struggle == 1)
new_belly.private_struggle = TRUE
// CHOMPEnable End
if(istext(belly_data["eating_privacy_local"]))
var/new_eating_privacy_local = html_encode(belly_data["eating_privacy_local"])
@@ -638,7 +628,6 @@
if (!new_belly.fancy_vore && (new_release_sound in classic_release_sounds))
new_belly.release_sound = new_release_sound
// Not implemented on virgo -> CHOMPEnable Start
if(isnum(belly_data["sound_volume"]))
var/new_sound_volume = belly_data["sound_volume"]
new_belly.sound_volume = sanitize_integer(new_sound_volume, 0, 100, initial(new_belly.sound_volume))
@@ -646,7 +635,6 @@
if(isnum(belly_data["noise_freq"]))
var/new_noise_freq = belly_data["noise_freq"]
new_belly.noise_freq = sanitize_integer(new_noise_freq, MIN_VOICE_FREQ, MAX_VOICE_FREQ, initial(new_belly.noise_freq))
// CHOMPEnable End
// Visuals
if(isnum(belly_data["affects_vore_sprites"]))
@@ -769,7 +757,6 @@
var/new_belly_fullscreen_color = sanitize_hexcolor(belly_data["belly_fullscreen_color"],new_belly.belly_fullscreen_color)
new_belly.belly_fullscreen_color = new_belly_fullscreen_color
// CHOMPEdit Start
if(istext(belly_data["belly_fullscreen_color2"]))
var/new_belly_fullscreen_color2 = sanitize_hexcolor(belly_data["belly_fullscreen_color2"],new_belly.belly_fullscreen_color2)
new_belly.belly_fullscreen_color2 = new_belly_fullscreen_color2
@@ -783,9 +770,7 @@
else if(istext(belly_data["belly_fullscreen_color_trinary"])) // Inter server support between virgo and chomp!
var/new_belly_fullscreen_color3 = sanitize_hexcolor(belly_data["belly_fullscreen_color_trinary"],new_belly.belly_fullscreen_color3)
new_belly.belly_fullscreen_color3 = new_belly_fullscreen_color3
// CHOMPEdit End
// Not implemented on virgo -> CHOMPEnable Start
if(istext(belly_data["belly_fullscreen_color4"]))
var/new_belly_fullscreen_color4 = sanitize_hexcolor(belly_data["belly_fullscreen_color4"],new_belly.belly_fullscreen_color4)
new_belly.belly_fullscreen_color4 = new_belly_fullscreen_color4
@@ -793,7 +778,6 @@
if(istext(belly_data["belly_fullscreen_alpha"]))
var/new_belly_fullscreen_alpha = sanitize_integer(belly_data["belly_fullscreen_alpha"],0,255,initial(new_belly.belly_fullscreen_alpha))
new_belly.belly_fullscreen_alpha = new_belly_fullscreen_alpha
// CHOMPEnable End
if(isnum(belly_data["colorization_enabled"]))
var/new_colorization_enabled = belly_data["colorization_enabled"]
@@ -809,12 +793,9 @@
if(new_disable_hud == 1)
new_belly.disable_hud = TRUE
var/possible_fullscreens = icon_states('modular_chomp/icons/mob/screen_full_vore_ch.dmi') // CHOMPEdit
var/possible_fullscreens = icon_states('icons/mob/screen_full_vore_list.dmi')
if(!new_belly.colorization_enabled)
possible_fullscreens = icon_states('icons/mob/screen_full_vore.dmi')
possible_fullscreens -= "a_synth_flesh_mono"
possible_fullscreens -= "a_synth_flesh_mono_hole"
possible_fullscreens -= "a_anim_belly"
if(!(new_belly.belly_fullscreen in possible_fullscreens))
new_belly.belly_fullscreen = ""
@@ -877,7 +858,6 @@
if(new_transferlocation_secondary == new_belly.name)
new_belly.transferlocation_secondary = null
// Not implemented on virgo -> CHOMPEnable Start
if(islist(belly_data["autotransfer_whitelist"]))
new_belly.autotransfer_whitelist = 0
for(var/at_flag in belly_data["autotransfer_whitelist"])
@@ -897,7 +877,6 @@
new_belly.autotransfer_secondary_blacklist = 0
for(var/at_flag in belly_data["autotransfer_secondary_blacklist"])
new_belly.autotransfer_secondary_blacklist += new_belly.autotransfer_flags_list[at_flag]
// CHOMPEnable End
if(isnum(belly_data["absorbchance"]))
var/new_absorbchance = belly_data["absorbchance"]
@@ -907,14 +886,12 @@
var/new_digestchance = belly_data["digestchance"]
new_belly.digestchance = sanitize_integer(new_digestchance, 0, 100, initial(new_belly.digestchance))
// Not implemented on virgo -> CHOMPEnable Start
if(isnum(belly_data["autotransfer_enabled"]))
var/new_autotransfer_enabled = belly_data["autotransfer_enabled"]
if(new_autotransfer_enabled == 0)
new_belly.autotransfer_enabled = FALSE
if(new_autotransfer_enabled == 1)
new_belly.autotransfer_enabled = TRUE
// CHOMPEnable End
if(isnum(belly_data["autotransferwait"]))
var/new_autotransferwait = belly_data["autotransferwait"]
@@ -936,7 +913,6 @@
if(new_autotransferlocation == new_belly.name)
new_belly.autotransferlocation = null
// Not implemented on virgo -> CHOMPEnable Start
if(islist(belly_data["autotransferextralocation"]))
var/new_autotransferextralocation = belly_data["autotransferextralocation"]
if(new_autotransferextralocation)
@@ -1171,7 +1147,6 @@
var/new_fullness5_messages = sanitize(jointext(belly_data["fullness5_messages"],"\n\n"),MAX_MESSAGE_LEN,0,0,0)
if(new_fullness5_messages)
new_belly.set_reagent_messages(new_fullness5_messages,"full5")
// CHOMPEnable End
// After import updates
new_belly.items_preserved.Cut()
+108 -114
View File
@@ -93,7 +93,6 @@
var/list/secondary_transfer_messages_prey = list(
"Your attempt to escape %pred's %belly has failed and your struggles only results in you sliding into %pred's %dest!")
//CHOMPAdd Start
var/list/primary_autotransfer_messages_owner = list(
"%prey moves along into your %dest!")
@@ -105,7 +104,6 @@
var/list/secondary_autotransfer_messages_prey = list(
"%pred's %belly moves you along into their %dest!")
//CHOMPAdd End
var/list/digest_chance_messages_owner = list(
"You feel your %belly beginning to become active!")
@@ -237,7 +235,7 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
// 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.
/obj/belly/proc/get_examine_msg()
if(!(contents?.len) || !(examine_messages?.len)) //ChompEDIT - runtimes
if(!(LAZYLEN(contents)) || !(LAZYLEN(examine_messages)))
return ""
var/raw_message = pick(examine_messages)
@@ -258,7 +256,7 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
return(span_red(span_italics("[belly_format_string(raw_message, english_list(vore_contents))]")))
/obj/belly/proc/get_examine_msg_absorbed()
if(!(contents?.len) || !(examine_messages_absorbed?.len) || !display_absorbed_examine) //ChompEDIT - runtimes
if(!(LAZYLEN(contents)) || !(LAZYLEN(examine_messages_absorbed)) || !display_absorbed_examine)
return ""
var/raw_message = pick(examine_messages_absorbed)
@@ -279,115 +277,113 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
// 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.
/obj/belly/proc/get_messages(type, delim = "\n\n")
ASSERT(type == "smo" || type == "smi" || type == "asmo" || type == "asmi" || type == "escao" || type == "escap" || type == "escp" || type == "esco" || type == "escout" || type == "escip" || type == "escio" || type == "esciout" || type == "escfp" || type == "escfo" || type == "aescao" || type == "aescap" || type == "aescp" || type == "aesco" || type == "aescout" || type == "aescfp" || type == "aescfo" || type == "trnspp" || type == "trnspo" || type == "trnssp" || type == "trnsso" || type == "atrnspp" || type == "atrnspo" || type == "atrnssp" || type == "atrnsso" || type == "stmodp" || type == "stmodo" || type == "stmoap" || type == "stmoao" || type == "dmo" || type == "dmp" || type == "amo" || type == "amp" || type == "uamo" || type == "uamp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb") //CHOMPEdit
VB_MESSAGE_SANIRY(type)
var/list/raw_messages
switch(type)
if("smo")
if(STRUGGLE_OUTSIDE)
raw_messages = struggle_messages_outside
if("smi")
if(STRUGGLE_INSIDE)
raw_messages = struggle_messages_inside
if("asmo")
if(ABSORBED_STRUGGLE_OUSIDE)
raw_messages = absorbed_struggle_messages_outside
if("asmi")
if(ABSORBED_STRUGGLE_INSIDE)
raw_messages = absorbed_struggle_messages_inside
if("escao")
if(ESCAPE_ATTEMPT_OWNER)
raw_messages = escape_attempt_messages_owner
if("escap")
if(ESCAPE_ATTEMPT_PREY)
raw_messages = escape_attempt_messages_prey
if("esco")
if(ESCAPE_OWNER)
raw_messages = escape_messages_owner
if("escp")
if(ESCAPE_PREY)
raw_messages = escape_messages_prey
if("escout")
if(ESCAPE_OUTSIDE)
raw_messages = escape_messages_outside
if("escio")
if(ESCAPE_ITEM_OWNER)
raw_messages = escape_item_messages_owner
if("escip")
if(ESCAPE_ITEM_PREY)
raw_messages = escape_item_messages_prey
if("esciout")
if(ESCAPE_ITEM_OUTSIDE)
raw_messages = escape_item_messages_outside
if("escfo")
if(ESCAPE_FAIL_OWNER)
raw_messages = escape_fail_messages_owner
if("escfp")
if(ESCAPE_FAIL_PREY)
raw_messages = escape_fail_messages_prey
if("aescao")
if(ABSORBED_ESCAPE_ATTEMPT_OWNER)
raw_messages = escape_attempt_absorbed_messages_owner
if("aescap")
if(ABSORBED_ESCAPE_ATTEMPT_PREY)
raw_messages = escape_attempt_absorbed_messages_prey
if("aesco")
if(ABSORBED_ESCAPE_OWNER)
raw_messages = escape_absorbed_messages_owner
if("aescp")
if(ABSORBED_ESCAPE_PREY)
raw_messages = escape_absorbed_messages_prey
if("aescout")
if(ABSORBED_ESCAPE_OUTSIDE)
raw_messages = escape_absorbed_messages_outside
if("aescfo")
if(FULL_ABSORBED_ESCAPE_OWNER)
raw_messages = escape_fail_absorbed_messages_owner
if("aescfp")
if(FULL_ABSORBED_ESCAPE_PREY)
raw_messages = escape_fail_absorbed_messages_prey
if("trnspo")
if(PRIMARY_TRANSFER_OWNER)
raw_messages = primary_transfer_messages_owner
if("trnspp")
if(PRIMARY_TRANSFER_PREY)
raw_messages = primary_transfer_messages_prey
if("trnsso")
if(SECONDARY_TRANSFER_OWNER)
raw_messages = secondary_transfer_messages_owner
if("trnssp")
if(SECONDARY_TRANSFER_PREY)
raw_messages = secondary_transfer_messages_prey
//CHOMPAdd Start
if("atrnspo")
if(PRIMARY_AUTO_TRANSFER_OWNER)
raw_messages = primary_autotransfer_messages_owner
if("atrnspp")
if(PRIMARY_AUTO_TRANSFER_PREY)
raw_messages = primary_autotransfer_messages_prey
if("atrnsso")
if(SECONDARY_AUTO_TRANSFER_OWNER)
raw_messages = secondary_autotransfer_messages_owner
if("atrnssp")
if(SECONDARY_AUTO_TRANSFER_PREY)
raw_messages = secondary_autotransfer_messages_prey
//CHOMPAdd End
if("stmodo")
if(DIGEST_CHANCE_OWNER)
raw_messages = digest_chance_messages_owner
if("stmodp")
if(DIGEST_CHANCE_PREY)
raw_messages = digest_chance_messages_prey
if("stmoao")
if(ABSORB_CHANCE_OWNER)
raw_messages = absorb_chance_messages_owner
if("stmoap")
if(ABSORB_CHANCE_PREY)
raw_messages = absorb_chance_messages_prey
if("dmo")
if(DIGEST_OWNER)
raw_messages = digest_messages_owner
if("dmp")
if(DIGEST_PREY)
raw_messages = digest_messages_prey
if("em")
if(EXAMINES)
raw_messages = examine_messages
if("ema")
if(EXAMINES_ABSORBED)
raw_messages = examine_messages_absorbed
if("amo")
if(ABSORB_OWNER)
raw_messages = absorb_messages_owner
if("amp")
if(ABSORB_PREY)
raw_messages = absorb_messages_prey
if("uamo")
if(UNABSORBS_OWNER)
raw_messages = unabsorb_messages_owner
if("uamp")
if(UNABSORBS_PREY)
raw_messages = unabsorb_messages_prey
if("im_digest")
if(BELLY_MODE_DIGEST)
raw_messages = emote_lists[DM_DIGEST]
if("im_hold")
if(BELLY_MODE_HOLD)
raw_messages = emote_lists[DM_HOLD]
if("im_holdabsorbed")
if(BELLY_MODE_HOLD_ABSORB)
raw_messages = emote_lists[DM_HOLD_ABSORBED]
if("im_absorb")
if(BELLY_MODE_ABSORB)
raw_messages = emote_lists[DM_ABSORB]
if("im_heal")
if(BELLY_MODE_HEAL)
raw_messages = emote_lists[DM_HEAL]
if("im_drain")
if(BELLY_MODE_DRAIN)
raw_messages = emote_lists[DM_DRAIN]
if("im_steal")
if(BELLY_MODE_STEAL)
raw_messages = emote_lists[DM_SIZE_STEAL]
if("im_egg")
if(BELLY_MODE_EGG)
raw_messages = emote_lists[DM_EGG]
if("im_shrink")
if(BELLY_MODE_SHRINK)
raw_messages = emote_lists[DM_SHRINK]
if("im_grow")
if(BELLY_MODE_GROW)
raw_messages = emote_lists[DM_GROW]
if("im_unabsorb")
if(BELLY_MODE_UNABSORB)
raw_messages = emote_lists[DM_UNABSORB]
var/messages = null
if(raw_messages)
@@ -401,7 +397,7 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
/obj/belly/proc/set_messages(raw_text, type, delim = "\n\n", limit)
if(!limit)
CRASH("[src] set message called without limit!")
ASSERT(type == "smo" || type == "smi" || type == "asmo" || type == "asmi" || type == "escao" || type == "escap" || type == "escp" || type == "esco" || type == "escout" || type == "escip" || type == "escio" || type == "esciout" || type == "escfp" || type == "escfo" || type == "aescao" || type == "aescap" || type == "aescp" || type == "aesco" || type == "aescout" || type == "aescfp" || type == "aescfo" || type == "trnspp" || type == "trnspo" || type == "trnssp" || type == "trnsso" || type == "atrnspp" || type == "atrnspo" || type == "atrnssp" || type == "atrnsso" || type == "stmodp" || type == "stmodo" || type == "stmoap" || type == "stmoao" || type == "dmo" || type == "dmp" || type == "amo" || type == "amp" || type == "uamo" || type == "uamp" || type == "em" || type == "ema" || type == "im_digest" || type == "im_hold" || type == "im_holdabsorbed" || type == "im_absorb" || type == "im_heal" || type == "im_drain" || type == "im_steal" || type == "im_egg" || type == "im_shrink" || type == "im_grow" || type == "im_unabsorb") //CHOMPEdit
VB_MESSAGE_SANIRY(type)
var/list/raw_list
@@ -434,109 +430,107 @@ GLOBAL_LIST_INIT(vore_words_snake, list("snake","serpent","reptilian","noodle","
ASSERT(raw_list.len <= 10) //Sanity
switch(type)
if("smo")
if(STRUGGLE_OUTSIDE)
struggle_messages_outside = raw_list
if("smi")
if(STRUGGLE_INSIDE)
struggle_messages_inside = raw_list
if("asmo")
if(ABSORBED_STRUGGLE_OUSIDE)
absorbed_struggle_messages_outside = raw_list
if("asmi")
if(ABSORBED_STRUGGLE_INSIDE)
absorbed_struggle_messages_inside = raw_list
if("escao")
if(ESCAPE_ATTEMPT_OWNER)
escape_attempt_messages_owner = raw_list
if("escap")
if(ESCAPE_ATTEMPT_PREY)
escape_attempt_messages_prey = raw_list
if("esco")
if(ESCAPE_OWNER)
escape_messages_owner = raw_list
if("escp")
if(ESCAPE_PREY)
escape_messages_prey = raw_list
if("escout")
if(ESCAPE_OUTSIDE)
escape_messages_outside = raw_list
if("escio")
if(ESCAPE_ITEM_OWNER)
escape_item_messages_owner = raw_list
if("escip")
if(ESCAPE_ITEM_PREY)
escape_item_messages_prey = raw_list
if("esciout")
if(ESCAPE_ITEM_OUTSIDE)
escape_item_messages_outside = raw_list
if("escfo")
if(ESCAPE_FAIL_OWNER)
escape_fail_messages_owner = raw_list
if("escfp")
if(ESCAPE_FAIL_PREY)
escape_fail_messages_prey = raw_list
if("aescao")
if(ABSORBED_ESCAPE_ATTEMPT_OWNER)
escape_attempt_absorbed_messages_owner = raw_list
if("aescap")
if(ABSORBED_ESCAPE_ATTEMPT_PREY)
escape_attempt_absorbed_messages_prey = raw_list
if("aesco")
if(ABSORBED_ESCAPE_OWNER)
escape_absorbed_messages_owner = raw_list
if("aescp")
if(ABSORBED_ESCAPE_PREY)
escape_absorbed_messages_prey = raw_list
if("aescout")
if(ABSORBED_ESCAPE_OUTSIDE)
escape_absorbed_messages_outside = raw_list
if("aescfo")
if(FULL_ABSORBED_ESCAPE_OWNER)
escape_fail_absorbed_messages_owner = raw_list
if("aescfp")
if(FULL_ABSORBED_ESCAPE_PREY)
escape_fail_absorbed_messages_prey = raw_list
if("trnspo")
if(PRIMARY_TRANSFER_OWNER)
primary_transfer_messages_owner = raw_list
if("trnspp")
if(PRIMARY_TRANSFER_PREY)
primary_transfer_messages_prey = raw_list
if("trnsso")
if(SECONDARY_TRANSFER_OWNER)
secondary_transfer_messages_owner = raw_list
if("trnssp")
if(SECONDARY_TRANSFER_PREY)
secondary_transfer_messages_prey = raw_list
//CHOMPAdd Start
if("atrnspo")
if(PRIMARY_AUTO_TRANSFER_OWNER)
primary_autotransfer_messages_owner = raw_list
if("atrnspp")
if(PRIMARY_AUTO_TRANSFER_PREY)
primary_autotransfer_messages_prey = raw_list
if("atrnsso")
if(SECONDARY_AUTO_TRANSFER_OWNER)
secondary_autotransfer_messages_owner = raw_list
if("atrnssp")
if(SECONDARY_AUTO_TRANSFER_PREY)
secondary_autotransfer_messages_prey = raw_list
//CHOMPAdd End
if("stmodo")
if(DIGEST_CHANCE_OWNER)
digest_chance_messages_owner = raw_list
if("stmodp")
if(DIGEST_CHANCE_PREY)
digest_chance_messages_prey = raw_list
if("stmoao")
if(ABSORB_CHANCE_OWNER)
absorb_chance_messages_owner = raw_list
if("stmoap")
if(ABSORB_CHANCE_PREY)
absorb_chance_messages_prey = raw_list
if("dmo")
if(DIGEST_OWNER)
digest_messages_owner = raw_list
if("dmp")
if(DIGEST_PREY)
digest_messages_prey = raw_list
if("amo")
if(ABSORB_OWNER)
absorb_messages_owner = raw_list
if("amp")
if(ABSORB_PREY)
absorb_messages_prey = raw_list
if("uamo")
if(UNABSORBS_OWNER)
unabsorb_messages_owner = raw_list
if("uamp")
if(UNABSORBS_PREY)
unabsorb_messages_prey = raw_list
if("em")
if(EXAMINES)
examine_messages = raw_list
if("ema")
if(EXAMINES_ABSORBED)
examine_messages_absorbed = raw_list
if("im_digest")
if(BELLY_MODE_DIGEST)
emote_lists[DM_DIGEST] = raw_list
if("im_hold")
if(BELLY_MODE_HOLD)
emote_lists[DM_HOLD] = raw_list
if("im_holdabsorbed")
if(BELLY_MODE_HOLD_ABSORB)
emote_lists[DM_HOLD_ABSORBED] = raw_list
if("im_absorb")
if(BELLY_MODE_ABSORB)
emote_lists[DM_ABSORB] = raw_list
if("im_heal")
if(BELLY_MODE_HEAL)
emote_lists[DM_HEAL] = raw_list
if("im_drain")
if(BELLY_MODE_DRAIN)
emote_lists[DM_DRAIN] = raw_list
if("im_steal")
if(BELLY_MODE_STEAL)
emote_lists[DM_SIZE_STEAL] = raw_list
if("im_egg")
if(BELLY_MODE_EGG)
emote_lists[DM_EGG] = raw_list
if("im_shrink")
if(BELLY_MODE_SHRINK)
emote_lists[DM_SHRINK] = raw_list
if("im_grow")
if(BELLY_MODE_GROW)
emote_lists[DM_GROW] = raw_list
if("im_unabsorb")
if(BELLY_MODE_UNABSORB)
emote_lists[DM_UNABSORB] = raw_list
-623
View File
@@ -1,623 +0,0 @@
//CHOMP vore additions.
/obj/belly
//CHOMP - liquid bellies
var/reagentbellymode = FALSE // Belly has abilities to make liquids from digested/absorbed/drained prey and/or nutrition
var/reagent_mode_flags = 0
var/tmp/static/list/reagent_mode_flag_list= list(
"Produce Liquids" = DM_FLAG_REAGENTSNUTRI,
"Digestion Liquids" = DM_FLAG_REAGENTSDIGEST,
"Absorption Liquids" = DM_FLAG_REAGENTSABSORB,
"Draining Liquids" = DM_FLAG_REAGENTSDRAIN
)
var/show_liquids = FALSE //Moved from vorepanel_ch to be a belly var
var/show_fullness_messages = FALSE //Moved from vorepanel_ch to be a belly var
var/liquid_overlay = TRUE //Belly-specific liquid overlay toggle
var/max_liquid_level = 100 //Custom max level for liquid overlay
var/mush_overlay = FALSE //Toggle for nutrition mush overlay
var/reagent_touches = TRUE //If reagents touch and interact with things in belly
var/mush_color = "#664330" //Nutrition mush overlay color
var/mush_alpha = 255 //Mush overlay transparency.
var/max_mush = 500 //How much nutrition for full mush overlay
var/min_mush = 0 //Manual setting for lowest mush level
var/item_mush_val = 0 //How much solid belly contents raise mush level per item
var/metabolism_overlay = FALSE //Extra mush layer for ingested reagents currently in metabolism.
var/metabolism_mush_ratio = 15 //Metabolism reagent volume per unit compared to nutrition units.
var/max_ingested = 500 //How much metabolism content for full overlay.
var/ingested_color = "#664330" //Normal color holder for ingested layer. Blended from existing reagent colors.
var/custom_ingested_color = null //Custom color for ingested reagent layer.
var/custom_ingested_alpha = 255 //Custom alpha for ingested reagent layer if not using normal mush layer.
var/nutri_reagent_gen = FALSE //if belly produces reagent over time using nutrition, needs to be optimized to use subsystem - Jack
var/is_beneficial = FALSE //Sets a reagent as a beneficial one / healing reagents
var/list/generated_reagents = list(REAGENT_ID_WATER = 1) //Any number of reagents, the associated value is how many units are generated per process()
var/reagent_name = REAGENT_ID_WATER //What is shown when reagents are removed, doesn't need to be an actual reagent
var/reagentid = REAGENT_ID_WATER //Selected reagent's id, for use in puddle system currently
var/reagentcolor = "#0064C877" //Selected reagent's color, for use in puddle system currently
var/custom_reagentcolor //Custom reagent color. Blank for normal reagent color
var/custom_reagentalpha //Custom reagent alpha. Blank for capacity based alpha
var/gen_cost = 1 //amount of nutrient taken from the host everytime nutrition is used to make reagents
var/gen_amount = 1 //Does not actually influence amount produced, but is used as a way to tell the system how much total reagent it has to take into account when filling a belly
var/gen_interval = 0 //Interval in seconds for generating fluids, once it reaches the value of gen_time one cycle of reagents generation will occur
var/gen_time = 5 //Time it takes in seconds to produce one cycle of reagents, technically add 1 second to it for the tick where the fluid is produced
var/gen_time_display = "1 hour" //The displayed time it takes from a belly to go from 0 to 100
var/custom_max_volume = 100 //Variable for people to limit amount of liquid they can receive/produce in a belly
var/digest_nutri_gain = 0 //variable to store temporary nutrition gain from digestion and allow a seperate proc to ease up on the wall of code
var/reagent_transfer_verb = "injects" //verb for transfer of reagent from a vore belly
var/vorefootsteps_sounds = FALSE //If this belly can make sounds when someone walks around
var/liquid_fullness1_messages = FALSE
var/liquid_fullness2_messages = FALSE
var/liquid_fullness3_messages = FALSE
var/liquid_fullness4_messages = FALSE
var/liquid_fullness5_messages = FALSE
var/vorespawn_blacklist = FALSE
var/vorespawn_whitelist = list()
var/vorespawn_absorbed = 0
var/list/fullness1_messages = list(
"%pred's %belly looks empty"
)
var/list/fullness2_messages = list(
"%pred's %belly looks filled"
)
var/list/fullness3_messages = list(
"%pred's %belly looks like it's full of liquid"
)
var/list/fullness4_messages = list(
"%pred's %belly is quite full!"
)
var/list/fullness5_messages = list(
"%pred's %belly is completely filled to it's limit!"
)
// Stuff to add in future!
/*
var/list/empty_message = list("You feel as though your internal reagent implant is almost empty.")
var/list/full_message = "You feel as though your internal reagent implant is full."
var/list/emote_descriptor = list("tranfers something") //In format of [x] [emote_descriptor] into [container]
var/list/self_emote_descriptor = list("transfer") //In format of You [self_emote_descriptor] some [generated_reagent] into [container]
*/
var/tmp/reagent_chosen = REAGENT_WATER // variable for switch to figure out what to set variables when a certain reagent is selected
var/tmp/static/list/reagent_choices = list( // List of reagents people can chose, maybe one day expand so it covers criterias like dogborgs who can make meds, booze, etc - Jack
REAGENT_WATER,
REAGENT_MILK,
REAGENT_CREAM,
REAGENT_HONEY,
REAGENT_CHERRYJELLY,
REAGENT_STOMACID,
REAGENT_DIETSTOMACID,
REAGENT_CLEANER,
REAGENT_LUBE,
REAGENT_BIOMASS,
REAGENT_CONCENTRATEDRADIUM,
REAGENT_TRICORDRAZINE
)
var/tail_colouration = FALSE
//var/marking_to_add = NULL
//var/marking_color = NULL
var/special_entrance_sound // Mob specific custom entry sound set by mob's init_vore when applicable
var/slow_digestion = FALSE // Gradual corpse digestion
var/slow_brutal = FALSE // Gradual corpse digestion: Stumpy's Special
var/sound_volume = 100 // Volume knob.
var/speedy_mob_processing = FALSE // Independent belly processing to utilize SSobj instead of SSbellies 3x speed.
var/cycle_sloshed = FALSE // Has vorgan entrance made a wet slosh this cycle? Soundspam prevention for multiple items entered.
var/egg_cycles = 0 // Process egg mode after 10 cycles.
var/recycling = FALSE // Recycling mode.
var/entrance_logs = TRUE // Belly-specific entry message toggle.
var/noise_freq = 42500 // Tasty sound prefs.
var/item_digest_logs = FALSE // Chat messages for digested items.
var/storing_nutrition = FALSE // Storing gained nutrition as paste instead of absorbing it.
var/belchchance = 0 // % Chance of pred belching on prey struggle
var/list/belly_surrounding = list() // A list of living mobs surrounded by this belly, including inside containers, food, on mobs, etc. Exclusing inside other bellies.
///////////////////// NUTRITION REAGENT PRODUCTION /////////////////
/obj/belly/proc/HandleBellyReagents()
if(show_liquids && reagentbellymode && reagent_mode_flags & DM_FLAG_REAGENTSNUTRI && reagents.total_volume < custom_max_volume && !isnewplayer(owner)) //Removed if(reagentbellymode == TRUE) since that's less optimized
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
if(R.cell && R.cell.charge >= gen_cost*10 && gen_interval >= gen_time)
GenerateBellyReagents()
gen_interval = 0
else
gen_interval++
else
if(owner.nutrition >= gen_cost && gen_interval >= gen_time)
GenerateBellyReagents()
gen_interval = 0
else
gen_interval++
/obj/belly/proc/HandleBellyReagentEffects(var/list/touchable_atoms)
if(LAZYLEN(contents))
if(show_liquids && reagent_touches && reagents.total_volume >= 5)
var/affecting_amt = reagents.total_volume / max(LAZYLEN(touchable_atoms), 1)
if(affecting_amt > 5)
affecting_amt = 5
if(affecting_amt >= 1)
for(var/mob/living/L in touchable_atoms)
if(!L.apply_reagents)
continue
if((L.digestable && digest_mode == DM_DIGEST))
if(!L.permit_healbelly && is_beneficial) // Healing reagents turned off in preferences!
continue
if(reagents.total_volume)
reagents.trans_to(L, affecting_amt, 1, FALSE)
if(L.permit_healbelly && digest_mode == DM_HEAL)
if(is_beneficial && reagents.total_volume)
reagents.trans_to(L, affecting_amt, 1, FALSE)
for(var/obj/item/I in touchable_atoms)
if(is_type_in_list(I, item_digestion_blacklist))
continue
if(reagents.total_volume)
reagents.trans_to(I, affecting_amt, 1, FALSE)
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_VORE_FX, FALSE, reagents.total_volume) // Signals vore_fx() reagents updates.
for(var/mob/living/L in contents)
vore_fx(L, FALSE, reagents.total_volume)
if(owner.previewing_belly == src)
vore_fx(owner, FALSE, reagents.total_volume)
/obj/belly/proc/GenerateBellyReagents()
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
if(!R.use_direct_power(gen_cost*10, 200))
return
else
owner.nutrition -= gen_cost
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent])
if(count_liquid_for_sprite)
owner.handle_belly_update() //This is run whenever a belly's contents are changed.
if(LAZYLEN(belly_surrounding))
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_VORE_FX, FALSE, reagents.total_volume) // Signals vore_fx() reagents updates.
//////////////////////////// REAGENT_DIGEST ////////////////////////
/obj/belly/proc/GenerateBellyReagents_digesting() //The rate isnt based on selected reagent, due to the fact that the price of the reagent is already paid by nutrient not gained.
if(reagents.total_volume + (digest_nutri_gain * gen_amount) <= custom_max_volume) //By default a reagent with an amount of 1 should result in pred getting 100 units from a full health prey
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * digest_nutri_gain / gen_cost)
else
owner_adjust_nutrition(digest_nutri_gain * owner.get_digestion_efficiency_modifier())
digest_nutri_gain = 0
/obj/belly/proc/GenerateBellyReagents_digested()
if(reagents.total_volume <= custom_max_volume - 25 * gen_amount)
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * 25)
else
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] / gen_amount * (custom_max_volume - reagents.total_volume))
digest_nutri_gain = 0
//////////////////////////// REAGENT_ABSORB ////////////////////////
/obj/belly/proc/GenerateBellyReagents_absorbing()
if(reagents.total_volume <= custom_max_volume - 1.5 * gen_amount) //Going for 1.5 amount of reagent per cycle, can be adjusted in future if need adjustments
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * 1.5)
else
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] / gen_amount * (custom_max_volume - reagents.total_volume))
/obj/belly/proc/GenerateBellyReagents_absorbed()
if(reagents.total_volume <= custom_max_volume - 25 * gen_amount) //Going for 25 amount of reagent for absorbing the prey, can be adjusted in future if need adjustments
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * 10)
else
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] / gen_amount * (custom_max_volume - reagents.total_volume))
//////////////////////////// REAGENT_DRAIN ///////////////////////// //Currently not needed, maybe later a specific proc for drain needs to be made - Jack
//////////////////////////// REAGENT SELECTION /////////////////////
//This is gonna end up a long proc, but its gonna have to make do for now
/obj/belly/proc/ReagentSwitch()
switch(reagent_chosen)
if(REAGENT_WATER)
generated_reagents = list(REAGENT_ID_WATER = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_ID_WATER
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_WATER
reagentcolor = "#0064C877"
if(REAGENT_MILK)
generated_reagents = list(REAGENT_ID_MILK = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_ID_MILK
gen_amount = 1
gen_cost = 5
reagentid = REAGENT_ID_MILK
reagentcolor = "#DFDFDF"
if(REAGENT_CREAM)
generated_reagents = list(REAGENT_ID_CREAM = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_ID_CREAM
gen_amount = 1
gen_cost = 5
reagentid = REAGENT_ID_CREAM
reagentcolor = "#DFD7AF"
if(REAGENT_HONEY)
generated_reagents = list(REAGENT_ID_HONEY = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_ID_HONEY
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_HONEY
reagentcolor = "#FFFF00"
if(REAGENT_CHERRYJELLY) //Kinda WIP, allows slime like folks something to stuff others with, should make a generic jelly in future
generated_reagents = list(REAGENT_ID_CHERRYJELLY = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = "cherry jelly"
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_CHERRYJELLY
reagentcolor = "#801E28"
if(REAGENT_STOMACID)
generated_reagents = list(REAGENT_ID_STOMACID = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = "digestive acid"
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_STOMACID
reagentcolor = "#664330"
if(REAGENT_DIETSTOMACID)
generated_reagents = list(REAGENT_ID_DIETSTOMACID = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = "diluted digestive acid"
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_DIETSTOMACID
reagentcolor = "#664330"
if(REAGENT_CLEANER)
generated_reagents = list(REAGENT_ID_CLEANER = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_CLEANER
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_CLEANER
reagentcolor = "#A5F0EE"
if(REAGENT_LUBE)
generated_reagents = list(REAGENT_ID_LUBE = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_ID_LUBE
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_LUBE
reagentcolor = "#009CA8"
if(REAGENT_BIOMASS)
generated_reagents = list(REAGENT_ID_BIOMASS = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_ID_BIOMASS
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_BIOMASS
reagentcolor = "#DF9FBF"
if(REAGENT_CONCENTRATEDRADIUM)
generated_reagents = list(REAGENT_ID_CONCENTRATEDRADIUM = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = "concentrated radium"
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_CONCENTRATEDRADIUM
reagentcolor = "#C7C7C7"
if(REAGENT_TRICORDRAZINE)
generated_reagents = list(REAGENT_ID_TRICORDRAZINE = 1)
if(capitalize(reagent_name) in reagent_choices)
reagent_name = REAGENT_ID_TRICORDRAZINE
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_TRICORDRAZINE
reagentcolor = "#8040FF"
is_beneficial = TRUE
/////////////////////// FULLNESS MESSAGES //////////////////////
// Get the line that should show up in Examine message if the owner of this belly is examined.
// Returns a string which shoul be appended to the Examine output.
// Yes I know it doesnt look great with 5 almost identical procs in a row, I didnt have a better idea at the time - Jack
/obj/belly/proc/get_reagent_examine_msg1()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness1_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg2()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness2_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg3()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness3_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg4()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness4_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg5()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness5_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
// 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
// in message boxes, this looks nice and is easily delimited.
/obj/belly/proc/get_reagent_messages(var/type, var/delim = "\n\n")
ASSERT(type == "full1" || type == "full2" || type == "full3" || type == "full4" || type == "full5")
var/list/raw_messages
switch(type)
if("full1")
raw_messages = fullness1_messages
if("full2")
raw_messages = fullness2_messages
if("full3")
raw_messages = fullness3_messages
if("full4")
raw_messages = fullness4_messages
if("full5")
raw_messages = fullness5_messages
var/messages = raw_messages.Join(delim)
return messages
// The next function sets the messages on the belly, from human-readable var
// replacement strings and linebreaks as delimiters (two \n\n by default).
// They also sanitize the messages.
/obj/belly/proc/set_reagent_messages(var/raw_text, var/type, var/delim = "\n\n")
ASSERT(type == "full1" || type == "full2" || type == "full3" || type == "full4" || type == "full5")
var/list/raw_list = splittext(html_encode(raw_text),delim)
if(raw_list.len > 10)
raw_list.Cut(11)
log_debug("[owner] tried to set [lowertext(name)] with 11+ messages")
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
raw_list.Cut(i,i)
log_debug("[owner] tried to set [lowertext(name)] with >121 or <10 char message")
else
raw_list[i] = readd_quotes(raw_list[i])
//Also fix % sign for var replacement
raw_list[i] = replacetext(raw_list[i],"&#37;","%")
ASSERT(raw_list.len <= 10) //Sanity
switch(type)
if("full1")
fullness1_messages = raw_list
if("full2")
fullness2_messages = raw_list
if("full3")
fullness3_messages = raw_list
if("full4")
fullness4_messages = raw_list
if("full5")
fullness5_messages = raw_list
return
/////////////////////////// Process Cycle Lite /////////////////////////// CHOMP PCL
/obj/belly/proc/quick_cycle() //For manual belly cycling without straining the bellies subsystem.
HandleBellyReagents() //CHOMP reagent belly stuff.
// VERY early exit
if(!contents.len)
return
var/to_update = FALSE //Did anything update worthy happen?
/////////////////////////// Exit Early //////////////////////////// CHOMP PCL
var/list/touchable_atoms = contents - items_preserved
if(!length(touchable_atoms))
return
var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
if(!DM)
log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
return FALSE
if(DM.handle_atoms(src, touchable_atoms))
updateVRPanels()
return
var/list/touchable_mobs = null
var/list/hta_returns = handle_touchable_atoms(touchable_atoms)
if(islist(hta_returns))
if(hta_returns["touchable_mobs"])
touchable_mobs = hta_returns["touchable_mobs"]
if(hta_returns["to_update"])
to_update = hta_returns["to_update"]
if(!LAZYLEN(touchable_mobs))
return
///////////////////// Time to actually process mobs ///////////////////// CHOMP PCL
for(var/target in touchable_mobs)
var/mob/living/L = target
if(!istype(L))
continue
var/list/returns = DM.process_mob(src, target)
if(istype(returns) && returns["to_update"])
to_update = TRUE
if(to_update)
updateVRPanels()
/////////////////////////// CHOMP PCL END ///////////////////////////
/obj/belly/proc/update_internal_overlay()
if(LAZYLEN(belly_surrounding))
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_VORE_FX, TRUE) // Signals vore_fx() to listening atoms. Atoms must handle appropriate isliving() checks.
for(var/A in belly_surrounding)
if(isliving(A))
vore_fx(A,1)
if(owner.previewing_belly == src)
if(isbelly(owner.loc))
owner.previewing_belly = null
return
vore_fx(owner,1)
/obj/belly/deserialize(var/list/data)
..()
STOP_PROCESSING(SSbellies, src)
STOP_PROCESSING(SSobj, src)
if(speedy_mob_processing)
START_PROCESSING(SSobj, src)
else
START_PROCESSING(SSbellies, src)
/obj/item/debris_pack/digested
name = "digested material"
desc = "Some thoroughly digested mass of ... something. Might be useful for recycling."
icon = 'icons/obj/recycling.dmi'
icon_state = "matdust"
color = "#664330"
w_class = ITEMSIZE_SMALL
/obj/belly/proc/recycle(var/obj/item/O)
if(!recycling || (!LAZYLEN(O.matter) && !istype(O, /obj/item/ore)))
return FALSE
if(istype(O, /obj/item/ore))
var/obj/item/ore/ore = O
for(var/obj/item/ore_chunk/C in contents)
if(istype(C))
C.stored_ore[ore.material]++
return TRUE
var/obj/item/ore_chunk/newchunk = new /obj/item/ore_chunk(src)
newchunk.stored_ore[ore.material]++
return TRUE
else
var/list/modified_mats = list()
var/trash = 1
if(istype(O,/obj/item/trash))
trash = 5
if(istype(O,/obj/item/stack))
var/obj/item/stack/S = O
trash = S.amount
for(var/mat in O.matter)
modified_mats[mat] = O.matter[mat] * trash
for(var/obj/item/debris_pack/digested/D in contents)
if(istype(D))
for(var/mat in modified_mats)
D.matter[mat] += modified_mats[mat]
if(O.w_class > D.w_class)
D.w_class = O.w_class
//CHOMPAdd Start
if(O.possessed_voice && O.possessed_voice.len)
for(var/mob/living/voice/V in O.possessed_voice)
D.inhabit_item(V, null, V.tf_mob_holder)
qdel(V)
O.possessed_voice = list()
//CHOMPAdd End
return TRUE
var/obj/item/debris_pack/digested/D = new /obj/item/debris_pack/digested(src, modified_mats) //CHOMPEdit
//CHOMPAdd Start
if(O.possessed_voice && O.possessed_voice.len)
for(var/mob/living/voice/V in O.possessed_voice)
D.inhabit_item(V, null, V.tf_mob_holder)
qdel(V)
O.possessed_voice = list()
//CHOMPAdd End
return TRUE
/obj/belly/proc/owner_adjust_nutrition(var/amount = 0)
if(storing_nutrition && amount > 0)
for(var/obj/item/reagent_containers/food/rawnutrition/R in contents)
if(istype(R))
R.stored_nutrition += amount
return
var/obj/item/reagent_containers/food/rawnutrition/NR = new /obj/item/reagent_containers/food/rawnutrition(src)
NR.stored_nutrition += amount
return
else
owner.adjust_nutrition(amount)
/obj/item/reagent_containers/food/rawnutrition
name = "raw nutrition"
desc = "A nutritious pile of converted mass ready for consumption."
icon = 'icons/obj/recycling.dmi'
icon_state = "matdust"
color = "#664330"
w_class = ITEMSIZE_SMALL
var/stored_nutrition = 0
/obj/item/reagent_containers/food/rawnutrition/standard_feed_mob(var/mob/user, var/mob/target)
if(isliving(target))
var/mob/living/L = target
L.nutrition += stored_nutrition
stored_nutrition = 0
qdel(src)
return
.=..()
// Updates the belly_surrounding list variable. Called in bellymodes_vr.dm
/obj/belly/proc/update_belly_surrounding()
if(!contents.len && !LAZYLEN(owner.soulgem?.brainmobs))
belly_surrounding = list()
return
belly_surrounding = get_belly_surrounding(contents)
if(owner.soulgem?.linked_belly == src)
belly_surrounding += owner.soulgem.brainmobs
// Recursive proc that returns all living mobs directly and indirectly inside a belly
// This can also be called more generically to get all living mobs not in bellies within any contents list
/obj/belly/proc/get_belly_surrounding(var/list/C)
var/list/surrounding = list()
for(var/thing in C)
if(istype(thing,/mob/living))
var/mob/living/L = thing
surrounding.Add(L)
surrounding.Add(get_belly_surrounding(L.contents))
if(istype(thing,/obj/item))
var/obj/item/I = thing
surrounding.Add(get_belly_surrounding(I.contents))
return surrounding
/obj/belly/proc/effective_emote_hearers()
. = list(loc)
for(var/atom/movable/AM as anything in contents)
//if(AM.atom_flags & ATOM_HEAR)
. += AM
@@ -0,0 +1,391 @@
///////////////////// NUTRITION REAGENT PRODUCTION /////////////////
/obj/belly/proc/HandleBellyReagents()
if(show_liquids && reagentbellymode && reagent_mode_flags & DM_FLAG_REAGENTSNUTRI && reagents.total_volume < custom_max_volume && !isnewplayer(owner)) //Removed if(reagentbellymode == TRUE) since that's less optimized
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
if(R.cell && R.cell.charge >= gen_cost*10 && gen_interval >= gen_time)
GenerateBellyReagents()
gen_interval = 0
else
gen_interval++
else
if(owner.nutrition >= gen_cost && gen_interval >= gen_time)
GenerateBellyReagents()
gen_interval = 0
else
gen_interval++
/obj/belly/proc/HandleBellyReagentEffects(var/list/touchable_atoms)
if(LAZYLEN(contents))
if(show_liquids && reagent_touches && reagents.total_volume >= 5)
var/affecting_amt = reagents.total_volume / max(LAZYLEN(touchable_atoms), 1)
if(affecting_amt > 5)
affecting_amt = 5
if(affecting_amt >= 1)
for(var/mob/living/L in touchable_atoms)
if(!L.apply_reagents)
continue
if((L.digestable && digest_mode == DM_DIGEST))
if(!L.permit_healbelly && is_beneficial) // Healing reagents turned off in preferences!
continue
if(reagents.total_volume)
reagents.trans_to(L, affecting_amt, 1, FALSE)
if(L.permit_healbelly && digest_mode == DM_HEAL)
if(is_beneficial && reagents.total_volume)
reagents.trans_to(L, affecting_amt, 1, FALSE)
for(var/obj/item/I in touchable_atoms)
if(is_type_in_list(I, item_digestion_blacklist))
continue
if(reagents.total_volume)
reagents.trans_to(I, affecting_amt, 1, FALSE)
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_VORE_FX, FALSE, reagents.total_volume) // Signals vore_fx() reagents updates.
for(var/mob/living/L in contents)
vore_fx(L, FALSE, reagents.total_volume)
if(owner.previewing_belly == src)
vore_fx(owner, FALSE, reagents.total_volume)
/obj/belly/proc/GenerateBellyReagents()
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
if(!R.use_direct_power(gen_cost*10, 200))
return
else
owner.nutrition -= gen_cost
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent])
if(count_liquid_for_sprite)
owner.handle_belly_update() //This is run whenever a belly's contents are changed.
if(LAZYLEN(belly_surrounding))
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_VORE_FX, FALSE, reagents.total_volume) // Signals vore_fx() reagents updates.
//////////////////////////// REAGENT_DIGEST ////////////////////////
/obj/belly/proc/GenerateBellyReagents_digesting() //The rate isnt based on selected reagent, due to the fact that the price of the reagent is already paid by nutrient not gained.
if(reagents.total_volume + (digest_nutri_gain * gen_amount) <= custom_max_volume) //By default a reagent with an amount of 1 should result in pred getting 100 units from a full health prey
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * digest_nutri_gain / gen_cost)
else
owner_adjust_nutrition(digest_nutri_gain * owner.get_digestion_efficiency_modifier())
digest_nutri_gain = 0
/obj/belly/proc/GenerateBellyReagents_digested()
if(reagents.total_volume <= custom_max_volume - 25 * gen_amount)
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * 25)
else
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] / gen_amount * (custom_max_volume - reagents.total_volume))
digest_nutri_gain = 0
//////////////////////////// REAGENT_ABSORB ////////////////////////
/obj/belly/proc/GenerateBellyReagents_absorbing()
if(reagents.total_volume <= custom_max_volume - 1.5 * gen_amount) //Going for 1.5 amount of reagent per cycle, can be adjusted in future if need adjustments
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * 1.5)
else
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] / gen_amount * (custom_max_volume - reagents.total_volume))
/obj/belly/proc/GenerateBellyReagents_absorbed()
if(reagents.total_volume <= custom_max_volume - 25 * gen_amount) //Going for 25 amount of reagent for absorbing the prey, can be adjusted in future if need adjustments
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] * 10)
else
for(var/reagent in generated_reagents)
reagents.add_reagent(reagent, generated_reagents[reagent] / gen_amount * (custom_max_volume - reagents.total_volume))
//////////////////////////// REAGENT_DRAIN ///////////////////////// //Currently not needed, maybe later a specific proc for drain needs to be made - Jack
//////////////////////////// REAGENT SELECTION /////////////////////
//This is gonna end up a long proc, but its gonna have to make do for now
/obj/belly/proc/ReagentSwitch()
var/list/our_reagents = list()
for(var/entry in reagent_choices)
our_reagents.Add(lowertext(entry))
switch(reagent_chosen)
if(REAGENT_WATER)
generated_reagents = list(REAGENT_ID_WATER_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_WATER)
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_WATER_BELLY
reagentcolor = "#0064C877"
if(REAGENT_MILK)
generated_reagents = list(REAGENT_ID_MILK_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_MILK)
gen_amount = 1
gen_cost = 5
reagentid = REAGENT_ID_MILK_BELLY
reagentcolor = "#DFDFDF"
if(REAGENT_CREAM)
generated_reagents = list(REAGENT_ID_CREAM_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_CREAM)
gen_amount = 1
gen_cost = 5
reagentid = REAGENT_ID_CREAM_BELLY
reagentcolor = "#DFD7AF"
if(REAGENT_HONEY)
generated_reagents = list(REAGENT_ID_HONEY_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_HONEY)
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_HONEY_BELLY
reagentcolor = "#FFFF00"
if(REAGENT_CHERRYJELLY) //Kinda WIP, allows slime like folks something to stuff others with, should make a generic jelly in future
generated_reagents = list(REAGENT_ID_CHERRYJELLY_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_CHERRYJELLY)
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_CHERRYJELLY_BELLY
reagentcolor = "#801E28"
if(REAGENT_STOMACID)
generated_reagents = list(REAGENT_ID_STOMACID_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_STOMACID)
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_STOMACID_BELLY
reagentcolor = "#664330"
if(REAGENT_DIETSTOMACID)
generated_reagents = list(REAGENT_ID_DIETSTOMACID_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_DIETSTOMACID)
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_DIETSTOMACID_BELLY
reagentcolor = "#664330"
if(REAGENT_CLEANER)
generated_reagents = list(REAGENT_ID_CLEANER_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_CLEANER)
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_CLEANER_BELLY
reagentcolor = "#A5F0EE"
if(REAGENT_LUBE)
generated_reagents = list(REAGENT_ID_LUBE_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_LUBE)
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_LUBE_BELLY
reagentcolor = "#009CA8"
if(REAGENT_BIOMASS)
generated_reagents = list(REAGENT_ID_BIOMASS_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_BIOMASS)
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_BIOMASS_BELLY
reagentcolor = "#DF9FBF"
if(REAGENT_CONCENTRATEDRADIUM)
generated_reagents = list(REAGENT_ID_CONCENTRATEDRADIUM_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_CONCENTRATEDRADIUM)
gen_amount = 1
gen_cost = 1
reagentid = REAGENT_ID_CONCENTRATEDRADIUM_BELLY
reagentcolor = "#C7C7C7"
if(REAGENT_TRICORDRAZINE)
generated_reagents = list(REAGENT_ID_TRICORDRAZINE_BELLY = 1)
if(reagent_name in our_reagents)
reagent_name = lowertext(REAGENT_TRICORDRAZINE)
gen_amount = 1
gen_cost = 10
reagentid = REAGENT_ID_TRICORDRAZINE_BELLY
reagentcolor = "#8040FF"
is_beneficial = TRUE
/////////////////////// FULLNESS MESSAGES //////////////////////
// Get the line that should show up in Examine message if the owner of this belly is examined.
// Returns a string which shoul be appended to the Examine output.
// Yes I know it doesnt look great with 5 almost identical procs in a row, I didnt have a better idea at the time - Jack
/obj/belly/proc/get_reagent_examine_msg1()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness1_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg2()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness2_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg3()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness3_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg4()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness4_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
/obj/belly/proc/get_reagent_examine_msg5()
if(fullness1_messages.len)
var/formatted_message
var/raw_message = pick(fullness5_messages)
formatted_message = replacetext(raw_message,"%belly",lowertext(name))
formatted_message = replacetext(formatted_message,"%pred",owner)
return(span_red("[formatted_message]<BR>"))
// 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
// in message boxes, this looks nice and is easily delimited.
/obj/belly/proc/get_reagent_messages(var/type, var/delim = "\n\n")
ASSERT(type == "full1" || type == "full2" || type == "full3" || type == "full4" || type == "full5")
var/list/raw_messages
switch(type)
if("full1")
raw_messages = fullness1_messages
if("full2")
raw_messages = fullness2_messages
if("full3")
raw_messages = fullness3_messages
if("full4")
raw_messages = fullness4_messages
if("full5")
raw_messages = fullness5_messages
var/messages = raw_messages.Join(delim)
return messages
// The next function sets the messages on the belly, from human-readable var
// replacement strings and linebreaks as delimiters (two \n\n by default).
// They also sanitize the messages.
/obj/belly/proc/set_reagent_messages(var/raw_text, var/type, var/delim = "\n\n")
ASSERT(type == "full1" || type == "full2" || type == "full3" || type == "full4" || type == "full5")
var/list/raw_list = splittext(html_encode(raw_text),delim)
if(raw_list.len > 10)
raw_list.Cut(11)
log_debug("[owner] tried to set [lowertext(name)] with 11+ messages")
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
raw_list.Cut(i,i)
log_debug("[owner] tried to set [lowertext(name)] with >121 or <10 char message")
else
raw_list[i] = readd_quotes(raw_list[i])
//Also fix % sign for var replacement
raw_list[i] = replacetext(raw_list[i],"&#37;","%")
ASSERT(raw_list.len <= 10) //Sanity
switch(type)
if("full1")
fullness1_messages = raw_list
if("full2")
fullness2_messages = raw_list
if("full3")
fullness3_messages = raw_list
if("full4")
fullness4_messages = raw_list
if("full5")
fullness5_messages = raw_list
return
/////////////////////////// Process Cycle Lite /////////////////////////// CHOMP PCL
/obj/belly/proc/quick_cycle() //For manual belly cycling without straining the bellies subsystem.
HandleBellyReagents() //reagent belly stuff.
// VERY early exit
if(!contents.len)
return
var/to_update = FALSE //Did anything update worthy happen?
/////////////////////////// Exit Early //////////////////////////// CHOMP PCL
var/list/touchable_atoms = contents - items_preserved
if(!length(touchable_atoms))
return
var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
if(!DM)
log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
return FALSE
if(DM.handle_atoms(src, touchable_atoms))
updateVRPanels()
return
var/list/touchable_mobs = null
var/list/hta_returns = handle_touchable_atoms(touchable_atoms)
if(islist(hta_returns))
if(hta_returns["touchable_mobs"])
touchable_mobs = hta_returns["touchable_mobs"]
if(hta_returns["to_update"])
to_update = hta_returns["to_update"]
if(!LAZYLEN(touchable_mobs))
return
///////////////////// Time to actually process mobs ///////////////////// CHOMP PCL
for(var/target in touchable_mobs)
var/mob/living/L = target
if(!istype(L))
continue
var/list/returns = DM.process_mob(src, target)
if(istype(returns) && returns["to_update"])
to_update = TRUE
if(to_update)
updateVRPanels()
/////////////////////////// CHOMP PCL END ///////////////////////////
/obj/belly/proc/update_internal_overlay()
if(LAZYLEN(belly_surrounding))
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_VORE_FX, TRUE) // Signals vore_fx() to listening atoms. Atoms must handle appropriate isliving() checks.
for(var/A in belly_surrounding)
if(isliving(A))
vore_fx(A,1)
if(owner.previewing_belly == src)
if(isbelly(owner.loc))
owner.previewing_belly = null
return
vore_fx(owner,1)
/obj/belly/deserialize(var/list/data)
..()
STOP_PROCESSING(SSbellies, src)
STOP_PROCESSING(SSobj, src)
if(speedy_mob_processing)
START_PROCESSING(SSobj, src)
else
START_PROCESSING(SSbellies, src)
File diff suppressed because it is too large Load Diff
+13 -25
View File
@@ -29,7 +29,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
//Person just died in guts!
if(L.stat == DEAD)
if(!L.digestion_in_progress) //CHOMPEdit Start
if(!L.digestion_in_progress)
if(L.check_sound_preference(/datum/preference/toggle/digestion_noises))
if(!B.fancy_vore)
SEND_SOUND(L, sound(get_sfx("classic_death_sounds")))
@@ -45,9 +45,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
B.owner.handle_belly_update()
return list("to_update" = TRUE)
if(!L)
return //CHOMPEdit End
return
//CHOMPEDIT: Parasitic digestion immunity hook, used to be a synx istype check but this is more optimized.
//Parasitic digestion immunity hook, used to be a synx istype check but this is more optimized.
if(L.parasitic)
if(isliving(L))
var/paratox = B.digest_brute+B.digest_burn
@@ -55,12 +55,10 @@ GLOBAL_LIST_INIT(digest_modes, list())
L.adjust_nutrition(paratox)
L.adjustBruteLoss(-paratox*2) //Should automaticaly clamp to 0
L.adjustFireLoss(-paratox*2) //Should automaticaly clamp to 0
if(B.health_impacts_size) //CHOMPEdit - Health probably changed so...
B.owner.handle_belly_update() //CHOMPEdit - This is run whenever a belly's contents are changed.
if(B.health_impacts_size) //Health probably changed so...
B.owner.handle_belly_update() //This is run whenever a belly's contents are changed.
return
//CHOMPedit end
// Deal digestion damage (and feed the pred)
var/old_health = L.health
var/old_brute = L.getBruteLoss()
@@ -73,17 +71,16 @@ GLOBAL_LIST_INIT(digest_modes, list())
L.adjustOxyLoss(B.digest_oxy)
L.adjustToxLoss(B.digest_tox)
L.adjustCloneLoss(B.digest_clone)
//CHOMPEdit start - Send a message when a prey-thing enters hard crit.
// Send a message when a prey-thing enters hard crit.
if(iscarbon(L) && old_health > 0 && L.health <= 0)
to_chat(B.owner, span_notice("You feel [L] go still within your [lowertext(B.name)]."))
//CHOMPEdit end
var/actual_brute = L.getBruteLoss() - old_brute
var/actual_burn = L.getFireLoss() - old_burn
var/actual_oxy = L.getOxyLoss() - old_oxy
var/actual_tox = L.getToxLoss() - old_tox
var/actual_clone = L.getCloneLoss() - old_clone
var/damage_gain = (actual_brute + actual_burn + actual_oxy/2 + actual_tox + actual_clone*2)*(B.nutrition_percent / 100)
if(B.slow_digestion) //CHOMPEdit Start
if(B.slow_digestion)
damage_gain = damage_gain * 0.5
var/offset = (1 + ((L.weight - 137) / 137)) // 130 pounds = .95 140 pounds = 1.02
var/difference = B.owner.size_multiplier / L.size_multiplier
@@ -92,15 +89,6 @@ GLOBAL_LIST_INIT(digest_modes, list())
B.owner.handle_belly_update()
consider_healthbar(L, old_health, B.owner)
/*if(isrobot(B.owner)) //CHOMPEdit: Borgos can now use nutrition too
if(B.reagent_mode_flags & DM_FLAG_REAGENTSDIGEST && B.reagents.total_volume < B.reagents.maximum_volume) //digestion producing reagents
var/mob/living/silicon/robot/R = B.owner
R.cell.charge += 20*damage_gain
B.digest_nutri_gain += offset * (1.5 * damage_gain / difference)
B.GenerateBellyReagents_digesting()
else
var/mob/living/silicon/robot/R = B.owner
R.cell.charge += 25*damage_gain */
if(offset && damage_gain > 0) // If any different than default weight, multiply the % of offset.
if(B.show_liquids && B.reagent_mode_flags & DM_FLAG_REAGENTSDIGEST && B.reagents.total_volume < B.reagents.maximum_volume) //digestion producing reagents
B.owner_adjust_nutrition(offset * (3 * damage_gain / difference) * L.get_digestion_nutrition_modifier() * B.owner.get_digestion_efficiency_modifier()) //Uncertain if balanced fairly, can adjust by multiplier for the cost of reagent, dont go below 1 or else it will result in more nutrition than normal - Jack
@@ -109,7 +97,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
else
B.owner_adjust_nutrition(offset * (4.5 * damage_gain / difference) * L.get_digestion_nutrition_modifier() * B.owner.get_digestion_efficiency_modifier()) //4.5 nutrition points per health point. Normal same size 100+100 health prey with average weight would give 900 points if the digestion was instant. With all the size/weight offset taxes plus over time oxyloss+hunger taxes deducted with non-instant digestion, this should be enough to not leave the pred starved.
else
B.owner_adjust_nutrition(offset * (4.5 * damage_gain / difference) * L.get_digestion_nutrition_modifier() * B.owner.get_digestion_efficiency_modifier()) //CHOMPEdit End
B.owner_adjust_nutrition(offset * (4.5 * damage_gain / difference) * L.get_digestion_nutrition_modifier() * B.owner.get_digestion_efficiency_modifier())
if(L.stat != oldstat)
return list("to_update" = TRUE)
@@ -125,8 +113,8 @@ GLOBAL_LIST_INIT(digest_modes, list())
B.steal_nutrition(L)
if(L.nutrition < 100)
B.absorb_living(L)
if(B.show_liquids && B.reagent_mode_flags & DM_FLAG_REAGENTSABSORB && B.reagents.total_volume < B.reagents.maximum_volume) //CHOMPedit: absorption reagent production
B.GenerateBellyReagents_absorbed() //CHOMPedit end: A bonus for pred, I know for a fact prey is usually at zero nutrition when absorption finally happens
if(B.show_liquids && B.reagent_mode_flags & DM_FLAG_REAGENTSABSORB && B.reagents.total_volume < B.reagents.maximum_volume) //absorption reagent production
B.GenerateBellyReagents_absorbed() //A bonus for pred, I know for a fact prey is usually at zero nutrition when absorption finally happens
consider_healthbar(L, old_nutrition, B.owner)
return list("to_update" = TRUE)
else
@@ -192,7 +180,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/heal/process_mob(obj/belly/B, mob/living/L)
var/oldstat = L.stat
if(L.stat == DEAD || !L.permit_healbelly) //CHOMPEdit healpref check
if(L.stat == DEAD || !L.permit_healbelly) //healpref check
return null // Can't heal the dead with healbelly
var/mob/living/carbon/human/H = L
if(B.owner.nutrition > 90 && H.isSynthetic())
@@ -237,7 +225,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
B.put_in_egg(H, 1)*/
/datum/digest_mode/egg/handle_atoms(obj/belly/B, list/touchable_atoms)
if(B.egg_cycles < 10) //CHOMPEdit Start
if(B.egg_cycles < 10)
B.egg_cycles ++
return
B.egg_cycles = 0
@@ -318,7 +306,7 @@ GLOBAL_LIST_INIT(digest_modes, list())
B.ownegg.icon_scale_y = clamp(0.25 * B.ownegg.w_class, 0.25, scale_clamp)
B.ownegg.update_transform()
if(B.ownegg.w_class > 4)
B.ownegg.slowdown = 4 //CHOMPEdit End
B.ownegg.slowdown = 4
B.ownegg = null
return list("to_update" = TRUE)
return
+43 -55
View File
@@ -1,7 +1,7 @@
// Process the predator's effects upon the contents of its belly (i.e digestion/transformation etc)
/obj/belly/process(wait) //Passed by controller
recent_sound = FALSE
cycle_sloshed = FALSE //CHOMPAdd
cycle_sloshed = FALSE
if(loc != owner)
if(istype(owner))
@@ -10,13 +10,15 @@
qdel(src)
return
HandleBellyReagents() //CHOMP reagent belly stuff, here to jam it into subsystems and avoid too much cpu usage
update_belly_surrounding() //CHOMPAdd - Updates belly_surrounding list for indirect vore usage
HandleBellyReagents() // reagent belly stuff, here to jam it into subsystems and avoid too much cpu usage
update_belly_surrounding() // Updates belly_surrounding list for indirect vore usage
// VERY early exit
if(!contents.len)
if(owner.previewing_belly == src)
HandleBellyReagentEffects()
return
//CHOMPEdit Start: Autotransfer count moved here.
// Autotransfer count moved here.
if(autotransfer_enabled)
var/list/autotransferables = list()
for(var/atom/movable/M in contents)
@@ -32,26 +34,26 @@
for(var/atom/movable/M in autotransferables)
if(check_autotransfer(M))
tally++
if(autotransfer_max_amount > 0 && tally >= autotransfer_max_amount) break //CHOMPEdit End
if(autotransfer_max_amount > 0 && tally >= autotransfer_max_amount) break
var/play_sound //Potential sound to play at the end to avoid code duplication.
var/to_update = FALSE //Did anything update worthy happen?
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_PREY_LOOP) // CHOMPedit: signals listening atoms to update prey_loop. May be cancelled by early exit otherwise.
SEND_SIGNAL(src, COMSIG_BELLY_UPDATE_PREY_LOOP) // signals listening atoms to update prey_loop. May be cancelled by early exit otherwise.
/////////////////////////// Exit Early ////////////////////////////
var/list/touchable_atoms = contents - items_preserved //CHOMPEdit Start
for(var/mob/observer/G in touchable_atoms) //CHOMPEdit: don't bother trying to process ghosts.
var/list/touchable_atoms = contents - items_preserved
for(var/mob/observer/G in touchable_atoms) // don't bother trying to process ghosts.
touchable_atoms -= G
var/datum/digest_mode/DM = GLOB.digest_modes["[digest_mode]"]
if(!DM)
log_debug("Digest mode [digest_mode] didn't exist in the digest_modes list!!")
return FALSE
if(digest_mode == DM_EGG)
prey_loop() //CHOMPAdd - Apparently on Egg mode the sound loop never played before? Just slapping this here to fix that
prey_loop() //Apparently on Egg mode the sound loop never played before? Just slapping this here to fix that
if(DM.handle_atoms(src, contents))
updateVRPanels()
return
if(!length(touchable_atoms) && !belly_surrounding.len) //CHOMPEdit - Needed to not exit early for indirect vorefx
if(!length(touchable_atoms) && !belly_surrounding.len) // Needed to not exit early for indirect vorefx
return
/////////////////////////// Sound Selections ///////////////////////////
@@ -67,7 +69,7 @@
///////////////////// Early Non-Mode Handling /////////////////////
if(DM.handle_atoms(src, touchable_atoms)) //CHOMPEdit End
if(DM.handle_atoms(src, touchable_atoms))
updateVRPanels()
return
@@ -85,8 +87,8 @@
if(!digestion_noise_chance)
digestion_noise_chance = DM.noise_chance
touchable_atoms -= items_preserved //CHOMPAdd
HandleBellyReagentEffects(touchable_atoms) //CHOMPAdd
touchable_atoms -= items_preserved
HandleBellyReagentEffects(touchable_atoms)
/////////////////////////// Make any noise ///////////////////////////
if(digestion_noise_chance && prob(digestion_noise_chance))
@@ -95,7 +97,7 @@
SEND_SOUND(M, prey_digest)
play_sound = pred_digest
if(!LAZYLEN(belly_surrounding)) //CHOMPEdit - Changed to belly_surrounding from touchable_mobs so indirect vore viewers get this too
if(!LAZYLEN(belly_surrounding)) //Changed to belly_surrounding from touchable_mobs so indirect vore viewers get this too
if(to_update)
updateVRPanels()
if(play_sound)
@@ -104,9 +106,9 @@
continue
if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
if(fancy_vore)
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq) //CHOMPEdit
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq)
else
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq) //CHOMPEdit
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq)
//these are all external sound triggers now, so it's ok.
return
@@ -131,17 +133,17 @@
continue
if(isturf(M.loc) || (M.loc != src)) //to avoid people on the inside getting the outside sounds and their direct sounds + built in sound pref check
if(fancy_vore)
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq) //CHOMPEdit
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq)
else
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq) //CHOMPEdit
M.playsound_local(get_turf(owner), play_sound, vol = sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq)
//these are all external sound triggers now, so it's ok.
if(emote_active)
//ChompEDIT START runtime, emote_lists can be = ""
// emote_lists can be = ""
var/list/EL
if(islist(emote_lists))
EL = emote_lists[digest_mode]
//ChompEDIT END
if((LAZYLEN(EL) || LAZYLEN(emote_lists[DM_HOLD_ABSORBED]) || (digest_mode == DM_DIGEST && LAZYLEN(emote_lists[DM_HOLD])) || (digest_mode == DM_SELECT && (LAZYLEN(emote_lists[DM_HOLD])||LAZYLEN(emote_lists[DM_DIGEST])||LAZYLEN(emote_lists[DM_ABSORB])) )) && next_emote <= world.time)
next_emote = world.time + (emote_time SECONDS)
for(var/mob/living/M in contents)
@@ -171,16 +173,13 @@
for(var/A in touchable_atoms)
//Handle eaten mobs
if(isliving(A)) //CHOMPEdit Start
if(isliving(A))
var/mob/living/L = A
touchable_mobs += L
if(L.absorbed && !issilicon(L))
L.Weaken(5)
// Fullscreen overlays
//vore_fx(L) //CHOMPEdit - Don't update this every single process tick, damn.
//Handle 'human'
if(ishuman(L))
var/mob/living/carbon/human/H = L
@@ -193,18 +192,16 @@
//Thickbelly flag
if((mode_flags & DM_FLAG_THICKBELLY) && !H.muffled)
H.muffled = TRUE
//CHOMPEdit Start - Fix muffled sometimes being sticky.
//Fix muffled sometimes being sticky.
else if(!(mode_flags & DM_FLAG_THICKBELLY) && H.muffled)
H.muffled = FALSE
//CHOMPEdit End
//Force psay
if((mode_flags & DM_FLAG_FORCEPSAY) && !H.forced_psay && H.absorbed)
H.forced_psay = TRUE
//CHOMPEdit Start - Fix forcepsay sometimes being sticky.
//Fix forcepsay sometimes being sticky.
else if(!(mode_flags & DM_FLAG_FORCEPSAY) && H.forced_psay)
H.forced_psay = FALSE
//CHOMPEdit End
//Worn items flag
if(mode_flags & DM_FLAG_AFFECTWORN)
@@ -214,7 +211,7 @@
touchable_atoms |= I
//Stripping flag
if((mode_flags & DM_FLAG_STRIPPING) && H.strip_pref) //CHOMPEdit Stripping pref check
if((mode_flags & DM_FLAG_STRIPPING) && H.strip_pref) //Stripping pref check
for(var/slot in slots)
var/obj/item/I = H.get_equipped_item(slot = slot)
if(I && H.unEquip(I, force = FALSE))
@@ -240,7 +237,7 @@
// but we also want the prob(25) chance to run for -every- item we look at, not just once
// More gurgles the better~
digestion_noise_chance = 25
continue //CHOMPEdit end
continue
//get rid of things like blood drops and gibs that end up in there
else if(istype(A, /obj/effect/decal/cleanable))
@@ -249,7 +246,7 @@
return list("to_update" = to_update, "touchable_mobs" = touchable_mobs, "digestion_noise_chance" = digestion_noise_chance)
/obj/belly/proc/prey_loop()
for(var/mob/living/M in belly_surrounding) //CHOMPEdit - contents changed to belly_surrounding to loop sound for indirect viewers too
for(var/mob/living/M in belly_surrounding) //contents changed to belly_surrounding to loop sound for indirect viewers too
//We don't bother executing any other code if the prey doesn't want to hear the noises.
if(!M.check_sound_preference(/datum/preference/toggle/digestion_noises))
M.stop_sound_channel(CHANNEL_PREYLOOP) // sanity just in case, because byond is whack and you can't trust it
@@ -258,13 +255,13 @@
// We don't want the sounds to overlap, but we do want them to steadily replay.
// We also don't want the sounds to play if the pred hasn't marked this belly as fleshy, or doesn't
// have the right sounds to play.
if(is_wet && wet_loop && (world.time > M.next_preyloop)) //CHOMPEdit - Removed isbelly(M.loc) as some viewers might be indirectly in the belly
if(is_wet && wet_loop && (world.time > M.next_preyloop)) //Removed isbelly(M.loc) as some viewers might be indirectly in the belly
M.stop_sound_channel(CHANNEL_PREYLOOP)
var/sound/preyloop = sound('sound/vore/sunesound/prey/loop.ogg')
M.playsound_local(get_turf(src), preyloop, 80, 0, channel = CHANNEL_PREYLOOP, frequency = noise_freq) //CHOMPEdit
M.playsound_local(get_turf(src), preyloop, 80, 0, channel = CHANNEL_PREYLOOP, frequency = noise_freq)
M.next_preyloop = (world.time + (52 SECONDS))
/obj/belly/proc/handle_digesting_item(obj/item/I, touchable_amount) //CHOMPEdit
/obj/belly/proc/handle_digesting_item(obj/item/I, touchable_amount)
var/did_an_item = FALSE
// We always contaminate IDs.
if(contaminates || istype(I, /obj/item/card/id))
@@ -279,15 +276,15 @@
if(istype(R) && R.robotic >= ORGAN_ROBOT)
items_preserved |= I
else
did_an_item = digest_item(I, touchable_amount) //CHOMPEdit
did_an_item = digest_item(I, touchable_amount)
else
items_preserved |= I
if(IM_DIGEST,IM_DIGEST_PARALLEL)
did_an_item = digest_item(I, touchable_amount) //CHOMPEdit
did_an_item = digest_item(I, touchable_amount)
return did_an_item
/obj/belly/proc/handle_digestion_death(mob/living/M, instant = FALSE) //CHOMPEdit
if(!instant && slow_digestion) //CHOMPAdd Start: Gradual corpse digestion
/obj/belly/proc/handle_digestion_death(mob/living/M, instant = FALSE)
if(!instant && slow_digestion) // Gradual corpse digestion
if(!M.digestion_in_progress)
M.digestion_in_progress = TRUE
if(M.health > -36 || (ishuman(M) && M.health > -136))
@@ -315,7 +312,7 @@
else
M.digestion_in_progress = FALSE
if(M.digestion_in_progress)
return //CHOMPAdd End
return
var/digest_alert_owner = span_vnotice(belly_format_string(digest_messages_owner, M))
var/digest_alert_prey = span_vnotice(belly_format_string(digest_messages_prey, M))
var/compensation = M.maxHealth / 5 //Dead body bonus.
@@ -329,8 +326,8 @@
if(M.ckey)
GLOB.prey_digested_roundstat++
owner.churn_count++ //CHOMPAdd
owner.handle_special_unlocks() //CHOMPAdd
owner.churn_count++
owner.handle_special_unlocks()
var/personal_nutrition_modifier = M.get_digestion_nutrition_modifier()
var/pred_digestion_efficiency = owner.get_digestion_efficiency_modifier()
@@ -345,20 +342,11 @@
if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
handle_remains_leaving(M)
digestion_death(M)
//if(!ishuman(owner)) CHOMPEdit Start
// owner.update_icons()
/*if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
if(reagent_mode_flags & DM_FLAG_REAGENTSDIGEST && reagents.total_volume < reagents.maximum_volume) //CHOMPedit: digestion producing reagents
R.cell.charge += (nutrition_percent / 100) * compensation * 15 * personal_nutrition_modifier
GenerateBellyReagents_digested()
else
R.cell.charge += (nutrition_percent / 100) * compensation * 25 * personal_nutrition_modifier*/
if(show_liquids && reagent_mode_flags & DM_FLAG_REAGENTSDIGEST && reagents.total_volume < reagents.maximum_volume) //CHOMP digestion producing reagents
if(show_liquids && reagent_mode_flags & DM_FLAG_REAGENTSDIGEST && reagents.total_volume < reagents.maximum_volume) // digestion producing reagents
owner_adjust_nutrition((nutrition_percent / 100) * compensation * 3 * personal_nutrition_modifier)
GenerateBellyReagents_digested()
else
owner_adjust_nutrition((nutrition_percent / 100) * compensation * 4.5 * personal_nutrition_modifier * pred_digestion_efficiency) //CHOMPedit end
owner_adjust_nutrition((nutrition_percent / 100) * compensation * 4.5 * personal_nutrition_modifier * pred_digestion_efficiency)
/obj/belly/proc/steal_nutrition(mob/living/L)
if(L.nutrition <= 110)
@@ -378,14 +366,14 @@
if(L.nutrition >= 100)
var/oldnutrition = (L.nutrition * 0.05)
L.nutrition = (L.nutrition * 0.95)
if(show_liquids && reagent_mode_flags & DM_FLAG_REAGENTSDRAIN && reagents.total_volume < reagents.maximum_volume) //CHOMPedit: draining reagent production //Added to this proc now since it's used for draining
if(show_liquids && reagent_mode_flags & DM_FLAG_REAGENTSDRAIN && reagents.total_volume < reagents.maximum_volume) // draining reagent production //Added to this proc now since it's used for draining
owner_adjust_nutrition(oldnutrition * 0.75) //keeping the price static, due to how much nutrition can flunctuate
GenerateBellyReagents_absorbing() //Dont need unique proc so far
else
owner_adjust_nutrition(oldnutrition) //CHOMPedit end
owner_adjust_nutrition(oldnutrition)
/obj/belly/proc/updateVRPanels()
for(var/mob/living/M in belly_surrounding) //CHOMPEdit - Changed to belly_surrounding from contents so updates happen for indirect viewers too
for(var/mob/living/M in belly_surrounding) //Changed to belly_surrounding from contents so updates happen for indirect viewers too
if(M.client)
M.updateVRPanel()
if(owner.client)
+2 -2
View File
@@ -18,7 +18,7 @@ var/list/gurgled_overlays = list(
/obj/item
var/gurgled = FALSE
var/oldname //CHOMPEdit
var/oldname
var/cleanname
var/cleandesc
var/gurgled_color
@@ -33,7 +33,7 @@ var/list/gurgled_overlays = list(
if(!gurgled)
gurgled = TRUE
gurgled_color = contamination_color
if(!isbelly(src.loc)) //CHOMPEdit: Moved non-worn overlay stuff to belly_obj_vr.dm Exited proc. No need to add overlays to things that won't make it out.
if(!isbelly(src.loc)) //Moved non-worn overlay stuff to belly_obj_vr.dm Exited proc. No need to add overlays to things that won't make it out.
add_overlay(gurgled_overlays[gurgled_color])
var/list/pickfrom = contamination_flavors[contamination_flavor]
var/gurgleflavor = pick(pickfrom)
+21 -38
View File
@@ -3,9 +3,9 @@
//return non-negative integer: Amount of nutrition/charge gained (scaled to nutrition, other end can multiply for charge scale).
// Ye default implementation.
/obj/item/proc/digest_act(atom/movable/item_storage = null, touchable_amount, splashing = 0) //CHOMPEdit
if(!digestable) //CHOMPAdd
return FALSE //CHOMPAdd
/obj/item/proc/digest_act(atom/movable/item_storage = null, touchable_amount, splashing = 0)
if(!digestable)
return FALSE
if(istype(item_storage, /obj/item/dogborg/sleeper))
if(istype(src, /obj/item/pda))
var/obj/item/pda/P = src
@@ -13,9 +13,9 @@
P.id = null
for(var/mob/living/voice/V in possessed_voice) // Delete voices.
V.ghostize(0) //CHOMPAdd - Prevent Reenter Corpse sending observers to the shadow realm
V.stat = DEAD //CHOMPAdd - Helps with autosleeving
if(V.mind) V.mind.vore_death = 1 //CHOMPAdd - Digested item TFs get vore_death timer
V.ghostize(0) // Prevent Reenter Corpse sending observers to the shadow realm
V.stat = DEAD // Helps with autosleeving
if(V.mind) V.mind.vore_death = 1 // Digested item TFs get vore_death timer
qdel(V)
for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion
M.forceMove(item_storage)
@@ -35,7 +35,7 @@
if(digest_stage == null)
digest_stage = w_class
var/obj/belly/B //CHOMPEdit Start
var/obj/belly/B
if(isbelly(item_storage))
B = item_storage
if(!touchable_amount)
@@ -79,10 +79,6 @@
var/obj/item/pda/P = src
if(P.id)
P.id = null
/* CHOMPEdit Start - This is handled lower down now
for(var/mob/living/voice/V in possessed_voice) // Delete voices.
qdel(V) //Destroy the voice.
CHOMPEdit End */
for(var/mob/living/M in contents)//Drop mobs from objects(shoes) before deletion
if(item_storage)
M.forceMove(item_storage)
@@ -111,17 +107,16 @@
soundfile = pick('sound/vore/shortgurgles/gurgle_M1.ogg', 'sound/vore/shortgurgles/gurgle_M2.ogg', 'sound/vore/shortgurgles/gurgle_M3.ogg')
else
soundfile = pick('sound/vore/shortgurgles/gurgle_S1.ogg', 'sound/vore/shortgurgles/gurgle_S2.ogg', 'sound/vore/shortgurgles/gurgle_S3.ogg')
playsound(src, soundfile, vol = g_sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq, preference = /datum/preference/toggle/eating_noises, volume_channel = VOLUME_CHANNEL_VORE) //CHOMPEdit
//CHOMPEdit Start - Allow those turned into items to become the recycled item
var/recycled = B.recycle(src)
playsound(src, soundfile, vol = g_sound_volume, vary = 1, falloff = VORE_SOUND_FALLOFF, frequency = noise_freq, preference = /datum/preference/toggle/eating_noises, volume_channel = VOLUME_CHANNEL_VORE)
//Allow those turned into items to become the recycled item
var/recycled = B?.recycle(src)
if(!recycled)
for(var/mob/living/voice/V in possessed_voice) // Delete voices.
V.ghostize(0) //CHOMPAdd - Prevent Reenter Corpse sending observers to the shadow realm
V.stat = DEAD //CHOMPAdd - Helps with autosleeving
if(V.mind) V.mind.vore_death = 1 //CHOMPAdd - Digested item TFs get vore_death timer
V.ghostize(0) //Prevent Reenter Corpse sending observers to the shadow realm
V.stat = DEAD //Helps with autosleeving
if(V.mind) V.mind.vore_death = 1 //Digested item TFs get vore_death timer
qdel(V) //Destroy the voice.
if(istype(B) && recycled)
//CHOMPEdit End
g_damage = w_class / 2
if(B.item_digest_logs)
to_chat(B.owner,span_notice("[src] was digested inside your [lowertext(B.name)]."))
@@ -149,7 +144,7 @@
new goodmeal.trash(src)
if(B.item_digest_logs)
to_chat(B.owner,span_notice("[src] was digested inside your [lowertext(B.name)]."))
qdel(src)//CHOMPEdit End
qdel(src)
if(g_damage > w_class)
return w_class
return g_damage
@@ -191,18 +186,6 @@
update_icon()
return FALSE
/*obj/item/reagent_containers/food/digest_act(atom/movable/item_storage = null) //CHOMPEdit: Included in main proc above.
if(isbelly(item_storage))
var/obj/belly/B = item_storage
if(ishuman(B.owner) && reagents) //CHOMPEdit Start
var/mob/living/carbon/human/H = B.owner
reagents.trans_to_holder(H.ingested, (reagents.total_volume * 0.5), 1, 0)
else if(isliving(B.owner))
B.owner.nutrition += 15 * w_class //CHOMPEdit End
qdel(src)
return w_class
. = ..()*/
/obj/item/holder/digest_act(atom/movable/item_storage = null)
for(var/mob/living/M in contents)
if(item_storage)
@@ -224,21 +207,21 @@
. = ..()
/obj/item/debris_pack/digested/digest_act(atom/movable/item_storage = null) //CHOMPAdd
/obj/item/debris_pack/digested/digest_act(atom/movable/item_storage = null)
if(isbelly(item_storage))
var/obj/belly/B = item_storage
if(istype(B) && B.recycling)
return FALSE
. = ..()
/obj/item/ore_chunk/digest_act(atom/movable/item_storage = null) //CHOMPAdd
/obj/item/ore_chunk/digest_act(atom/movable/item_storage = null)
if(isbelly(item_storage))
var/obj/belly/B = item_storage
if(istype(B) && B.recycling)
return FALSE
. = ..()
/obj/item/reagent_containers/food/rawnutrition/digest_act(atom/movable/item_storage = null) //CHOMPAdd
/obj/item/reagent_containers/food/rawnutrition/digest_act(atom/movable/item_storage = null)
if(isbelly(item_storage))
var/obj/belly/B = item_storage
if(istype(B) && B.storing_nutrition)
@@ -257,11 +240,11 @@
//Replace this with a VORE setting so all types of posibrains can/can't be digested on a whim
return FALSE
//CHOMPEdit - moved prot organ digest to their appropriate file
//moved prot organ digest to their appropriate file
// Gradual damage measurement
/obj/item
var/digest_stage = null
var/d_mult_old = 1 //CHOMPEdit: digest stage descriptions
var/d_mult = 1 //CHOMPEdit: digest stage descriptions
var/d_stage_overlay //CHOMPEdit: digest stage effects
var/d_mult_old = 1 //digest stage descriptions
var/d_mult = 1 //digest stage descriptions
var/d_stage_overlay //digest stage effects
+5 -21
View File
@@ -154,7 +154,6 @@
for(var/msg in B.secondary_transfer_messages_prey)
belly_data["secondary_transfer_messages_prey"] += msg
// CHOMPEnable Start
belly_data["primary_autotransfer_messages_owner"] = list()
for(var/msg in B.primary_autotransfer_messages_owner)
belly_data["primary_autotransfer_messages_owner"] += msg
@@ -170,7 +169,6 @@
belly_data["secondary_autotransfer_messages_prey"] = list()
for(var/msg in B.secondary_autotransfer_messages_prey)
belly_data["secondary_autotransfer_messages_prey"] += msg
// CHOMPEnable End
belly_data["digest_chance_messages_owner"] = list()
for(var/msg in B.digest_chance_messages_owner)
@@ -280,7 +278,7 @@
belly_data["digest_clone"] = B.digest_clone
belly_data["can_taste"] = B.can_taste
belly_data["is_feedable"] = B.is_feedable // CHOMPEnable
belly_data["is_feedable"] = B.is_feedable
belly_data["contaminates"] = B.contaminates
belly_data["contamination_flavor"] = B.contamination_flavor
belly_data["contamination_color"] = B.contamination_color
@@ -291,25 +289,19 @@
belly_data["emote_active"] = B.emote_active
belly_data["emote_time"] = B.emote_time
belly_data["shrink_grow_size"] = B.shrink_grow_size
// CHOMPEnable Start
belly_data["vorespawn_blacklist"] = B.vorespawn_blacklist
belly_data["vorespawn_whitelist"] = B.vorespawn_whitelist
belly_data["vorespawn_absorbed"] = B.vorespawn_absorbed
// CHOMPEnable End
belly_data["egg_type"] = B.egg_type
// CHOMPEnable Start
belly_data["egg_name"] = B.egg_name
belly_data["egg_size"] = B.egg_size
// CHOMPEnable End
belly_data["selective_preference"] = B.selective_preference
// CHOMPEnable Start
belly_data["recycling"] = B.recycling
belly_data["storing_nutrition"] = B.storing_nutrition
belly_data["entrance_logs"] = B.entrance_logs
belly_data["item_digest_logs"] = B.item_digest_logs
belly_data["eating_privacy_local"] = B.eating_privacy_local
belly_data["private_struggle"] = B.private_struggle
// CHOMPEnable End
// Sounds
belly_data["is_wet"] = B.is_wet
@@ -317,10 +309,8 @@
belly_data["fancy_vore"] = B.fancy_vore
belly_data["vore_sound"] = B.vore_sound
belly_data["release_sound"] = B.release_sound
// CHOMPEnable Start
belly_data["sound_volume"] = B.sound_volume
belly_data["noise_freq"] = B.noise_freq
// CHOMPEnable End
// Visuals
belly_data["affects_vore_sprites"] = B.affects_vore_sprites
@@ -331,8 +321,8 @@
belly_data["vore_sprite_flags"] = sprite_flags
belly_data["count_absorbed_prey_for_sprite"] = B.count_absorbed_prey_for_sprite
belly_data["absorbed_multiplier"] = B.absorbed_multiplier
belly_data["count_liquid_for_sprite"] = B.count_liquid_for_sprite // CHOMPEnable
belly_data["liquid_multiplier"] = B.liquid_multiplier // CHOMPEnable
belly_data["count_liquid_for_sprite"] = B.count_liquid_for_sprite
belly_data["liquid_multiplier"] = B.liquid_multiplier
belly_data["count_items_for_sprite"] = B.count_items_for_sprite
belly_data["item_multiplier"] = B.item_multiplier
belly_data["health_impacts_size"] = B.health_impacts_size
@@ -348,18 +338,16 @@
//belly_data["tail_extra_overlay2"] = B.tail_extra_overlay2
// Visuals (Belly Fullscreens Preview and Coloring)
// CHOMPEnable Start
belly_data["belly_fullscreen_color"] = B.belly_fullscreen_color
belly_data["belly_fullscreen_color2"] = B.belly_fullscreen_color2
belly_data["belly_fullscreen_color3"] = B.belly_fullscreen_color3
belly_data["belly_fullscreen_color4"] = B.belly_fullscreen_color4
belly_data["belly_fullscreen_alpha"] = B.belly_fullscreen_alpha
belly_data["colorization_enabled"] = B.colorization_enabled
// CHOMPEnable End
// Visuals (Vore FX)
belly_data["disable_hud"] = B.disable_hud
belly_data["belly_fullscreen"] = B.belly_fullscreen // CHOMPEnable
belly_data["belly_fullscreen"] = B.belly_fullscreen
// Interactions
belly_data["escapable"] = B.escapable
@@ -368,7 +356,7 @@
belly_data["escapechance_absorbed"] = B.escapechance_absorbed
belly_data["escapetime"] = B.escapetime/10
belly_data["belchchance"] = B.belchchance // CHOMPEnable
belly_data["belchchance"] = B.belchchance
belly_data["transferchance"] = B.transferchance
belly_data["transferlocation"] = B.transferlocation
@@ -380,7 +368,6 @@
belly_data["digestchance"] = B.digestchance
// Interactions (Auto-Transfer)
// CHOMPEnable Start
belly_data["autotransferchance"] = B.autotransferchance
belly_data["autotransferwait"] = B.autotransferwait/10
belly_data["autotransferlocation"] = B.autotransferlocation
@@ -463,12 +450,10 @@
if(B.reagent_mode_flags & B.reagent_mode_flag_list[flag_name])
reagent_flags.Add(flag_name)
belly_data["reagent_mode_flag_list"] = reagent_flags
// CHOMPEnable End
data["bellies"] += list(belly_data)
// Liquid Messages
// CHOMPEnable Start
belly_data["show_fullness_messages"] = B.show_fullness_messages
belly_data["liquid_fullness1_messages"] = B.liquid_fullness1_messages
belly_data["liquid_fullness2_messages"] = B.liquid_fullness2_messages
@@ -495,6 +480,5 @@
belly_data["fullness5_messages"] = list()
for(var/msg in B.fullness5_messages)
belly_data["fullness5_messages"] += msg
// CHOMPEnable End
return data
+3 -3
View File
@@ -27,7 +27,7 @@ Please do not abuse this ability.
continue
if(ishuman(pred))
var/mob/living/carbon/human/H = pred
if(!H.latejoin_vore) //CHOMPEdit - Changes pref to the same as vorespawn pred
if(!H.latejoin_vore)
continue
eligible_targets += H
continue
@@ -35,7 +35,7 @@ Please do not abuse this ability.
var/mob/living/silicon/S = pred
if(isAI(S))
continue // Sorry, AI buddies. Your vore works too differently.
if(!S.latejoin_vore) //CHOMPEdit - Changes pref to the same as vorespawn pred
if(!S.latejoin_vore)
continue
eligible_targets += S
continue
@@ -43,7 +43,7 @@ Please do not abuse this ability.
var/mob/living/simple_mob/SM = pred
if(!SM.vore_active) // No vore, no bellies, no inbelly spawning
continue
if(!SM.latejoin_vore) //CHOMPEdit - Changes pref to the same as vorespawn pred
if(!SM.latejoin_vore)
continue
eligible_targets += SM
continue
+6 -8
View File
@@ -24,7 +24,6 @@
skull_type = /obj/item/digestion_remains/skull/teshari
/datum/species/vox
skull_type = /obj/item/digestion_remains/skull/vox
//CHOMPadd start
/datum/species/monkey
skull_type = /obj/item/digestion_remains/skull
/datum/species/monkey/tajaran
@@ -41,7 +40,6 @@
skull_type = /obj/item/digestion_remains/skull/vulpkanin
/datum/species/monkey/sergal
skull_type = /obj/item/digestion_remains/skull/sergal
//CHOMPadd end.
/obj/belly/proc/handle_remains_leaving(var/mob/living/M)
if(!ishuman(M) && !isrobot(M)) //Are we even humanoid or a borg?
@@ -91,18 +89,18 @@
return // TODO: add synth skulls and remove this.
var/skull_amount = 1
if(H.species.skull_type)
new H.species.skull_type(src, owner, H) //CHOMPEdit
new H.species.skull_type(src, owner, H)
skull_amount--
if(skull_amount && H.species.selects_bodytype)
// We still haven't found correct skull...
if(H.species.base_species == SPECIES_HUMAN)
new /obj/item/digestion_remains/skull/unknown(src, owner, H) //CHOMPEdit
new /obj/item/digestion_remains/skull/unknown(src, owner, H)
else
new /obj/item/digestion_remains/skull/unknown/anthro(src, owner, H) //CHOMPEdit
new /obj/item/digestion_remains/skull/unknown/anthro(src, owner, H)
else if(skull_amount)
// Something entirely different...
new /obj/item/digestion_remains/skull/unknown(src, owner, H) //CHOMPEdit
new /obj/item/digestion_remains/skull/unknown(src, owner, H)
/obj/item/digestion_remains
@@ -126,12 +124,12 @@
drop_sound = 'sound/items/drop/device.ogg' //not organic bones, so they get different sounds
pickup_sound = 'sound/items/pickup/device.ogg'
/obj/item/digestion_remains/Initialize(mapload, var/mob/living/pred, var/mob/living/prey) //CHOMPEdit
/obj/item/digestion_remains/Initialize(mapload, var/mob/living/pred, var/mob/living/prey)
. = ..()
if(!mapload)
pred_ckey = pred?.ckey
pred_name = pred?.name
if(prey && isliving(prey) && prey.size_multiplier != 1) //CHOMPAdd
if(prey && isliving(prey) && prey.size_multiplier != 1)
icon_scale_x = prey.size_multiplier
icon_scale_y = prey.size_multiplier
update_transform()
+3 -8
View File
@@ -1,12 +1,7 @@
/mob/proc/update_fullness(var/returning = FALSE)
if(!returning)
if(updating_fullness)
return
updating_fullness = TRUE
spawn(2)
updating_fullness = FALSE
src.update_fullness(TRUE)
/mob/proc/update_fullness()
if(updating_fullness)
return
updating_fullness = TRUE
var/list/new_fullness = list()
vore_fullness = 0
for(var/belly_class in vore_icon_bellies)
-324
View File
@@ -1,324 +0,0 @@
///////////////////// Mob Living /////////////////////
/mob/living
// var/list/vore_organs_reagents = list() //Reagent datums in vore bellies in a mob
// var/vore_footstep_volume = 0 //Variable volume for a mob, updated every 5 steps where a footstep hasnt occurred.
// var/vore_footstep_chance = 0
// var/vore_footstep_volume_cooldown = 0 //goes up each time a step isnt heard, and will proc update of list of viable bellies to determine the most filled and loudest one to base audio on.
var/mute_entry = FALSE //Toggleable vorgan entry logs.
var/parasitic = FALSE //Digestion immunity and nutrition leeching variable
var/liquidbelly_visuals = TRUE //Toggle for liquidbelly level visuals.
var/churn_count = 0 //Counter for digested livings
var/passtable_reset // For crawling
var/passtable_crawl_checked = FALSE
/mob/living/proc/handle_special_unlocks()
return
/* This is an ELEMENT now
/mob/living/proc/check_vorefootstep(var/m_intent, var/turf/T)
if(vore_footstep_volume_cooldown++ >= 5) //updating the 'dominating' belly, the one that has most liquid and is loudest.
choose_vorefootstep()
vore_footstep_volume_cooldown = 0
if(!vore_footstep_volume || !vore_footstep_chance) //Checking if there is actual sound if we run the proc
return
if(prob(vore_footstep_chance)) //Peform the check, lets see if we trigger a sound
handle_vorefootstep(m_intent, T)
//Proc to choose the belly that has most liquid in it and is currently dominant for audio
/mob/living/proc/choose_vorefootstep()
vore_organs_reagents = list()
var/highest_vol = 0
for(var/obj/belly/B in vore_organs)
var/total_volume = B.reagents.total_volume
vore_organs_reagents += total_volume
if(B.show_liquids && B.vorefootsteps_sounds && highest_vol < total_volume)
highest_vol = total_volume
if(highest_vol < 20) //For now the volume will be off if less than 20 units of reagent are in vorebellies
vore_footstep_volume = 0
vore_footstep_chance = 0
else //Volume will start at least at 20 so theres more initial sound
vore_footstep_volume = 20 + highest_vol * 4/5
vore_footstep_chance = highest_vol/4
*/
//
// Returns examine messages for how much reagents are in bellies
//
/mob/living/proc/examine_reagent_bellies()
if(!show_pudge()) //Some clothing or equipment can hide this. Reagent inflation is not very different in this aspect.
return ""
var/message = ""
for (var/belly in vore_organs)
var/obj/belly/B = belly
var/fill_percentage = B.reagents.maximum_volume > 0 ? B.reagents.total_volume / B.reagents.maximum_volume : 0
if(0 <= fill_percentage && fill_percentage <= 0.2 && B.show_fullness_messages)
message += B.get_reagent_examine_msg1()
if(0.2 < fill_percentage && fill_percentage <= 0.4 && B.show_fullness_messages)
message += B.get_reagent_examine_msg2()
if(0.4 < fill_percentage && fill_percentage <= 0.6 && B.show_fullness_messages)
message += B.get_reagent_examine_msg3()
if(0.6 < fill_percentage && fill_percentage <= 0.8 && B.show_fullness_messages)
message += B.get_reagent_examine_msg4()
if(0.8 < fill_percentage && fill_percentage <= 1 && B.show_fullness_messages)
message += B.get_reagent_examine_msg5()
return message
/mob/living/proc/vore_check_reagents()
set name = "Check Belly Liquid (Vore)"
set category = "Abilities.Vore"
set desc = "Check the amount of liquid in your belly."
var/obj/belly/RTB = tgui_input_list(src, "Choose which vore belly to check", "Select Belly", vore_organs)
if(!RTB)
return FALSE
to_chat(src, span_vnotice("[RTB] has [RTB.reagents.total_volume] units of liquid."))
/mob/living/proc/vore_transfer_reagents()
set name = "Transfer Liquid (Vore)"
set category = "Abilities.Vore"
set desc = "Transfer liquid from an organ to another or stomach, or into another person or container."
set popup_menu = FALSE
if(!checkClickCooldown() || incapacitated(INCAPACITATION_KNOCKOUT))
return FALSE
var/mob/living/user = src
var/mob/living/TG = tgui_input_list(user, "Choose who to transfer from", "Transfer From", mobs_in_view(1,user))
if(!TG)
return FALSE
if(TG.give_reagents == FALSE && user != TG) //User isnt forced to allow giving in prefs if they are the one doing it
to_chat(user, span_vwarning("This person's prefs dont allow that!"))
return FALSE
var/obj/belly/RTB = tgui_input_list(user, "Choose which vore belly to transfer from", "Select Belly", vore_organs)
if(!RTB)
return FALSE
var/transfer_amount = input("How much to transfer?") in list(5,10,25,50,100)
if(!transfer_amount)
return FALSE
switch(input(user,"Choose what to transfer to","Select Target") in list("Vore belly", "Stomach", "Container", "Floor", "Cancel"))
if("Cancel")
return FALSE
if("Vore belly")
var/mob/living/TR = tgui_input_list(user,"Choose who to transfer to","Select Target", mobs_in_view(1,user))
if(!TR) return FALSE
if(TR == user) //Proceed, we dont need to have prefs enabled for transfer within user
var/obj/belly/TB = tgui_input_list(user, "Choose which organ to transfer to", "Select Belly", user.vore_organs)
if(!TB)
return FALSE
if(!Adjacent(TR) || !Adjacent(TG))
return //No long distance transfer
if(!TB.reagents?.get_free_space())
to_chat(user, span_vnotice("[TB] is full!"))
return FALSE
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their [lowertext(TB.name)]."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their [lowertext(TB.name)]."))
add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB)
if(RTB.count_liquid_for_sprite || TB.count_liquid_for_sprite)
handle_belly_update()
else if(TR.receive_reagents == FALSE)
to_chat(user, span_vwarning("This person's prefs dont allow that!"))
return FALSE
else
var/obj/belly/TB = tgui_input_list(user, "Choose which organ to transfer to", "Select Belly", TR.vore_organs)
if(!TB)
return FALSE
if(!Adjacent(TR) || !Adjacent(TG))
return //No long distance transfer
if(!TB.reagents?.get_free_space())
to_chat(user, span_vnotice("[TR]'s [lowertext(TB.name)] is full!"))
return FALSE
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)]."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]s [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)]."))
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB)
add_attack_logs(user,TR,"Transfered reagents from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks
if(RTB.count_liquid_for_sprite)
handle_belly_update()
if(TB.count_liquid_for_sprite)
TR.handle_belly_update()
if("Stomach")
var/mob/living/TR = tgui_input_list(user,"Choose who to transfer to","Select Target", mobs_in_view(1,user))
if(!TR) return
if(!Adjacent(TR) || !Adjacent(TG))
return //No long distance transfer
if(TR == user) //Proceed, we dont need to have prefs enabled for transfer within user
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their stomach."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their stomach."))
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null)
add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach")
if(RTB.count_liquid_for_sprite)
handle_belly_update()
else if(TR.receive_reagents == FALSE)
to_chat(user, span_vwarning("This person's prefs dont allow that!"))
return FALSE
else
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s stomach."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [TR]'s stomach."))
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null)
add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") //Bonus for staff so they can see if people have abused transfer and done pref breaks
if(RTB.count_liquid_for_sprite)
handle_belly_update()
if("Container")
if(RTB.reagentid == REAGENT_ID_STOMACID)
return
var/list/choices = list()
for(var/obj/item/reagent_containers/rc in view(1,user.loc))
choices += rc
var/obj/item/reagent_containers/T = tgui_input_list(user,"Choose what to transfer to","Select Target", choices)
if(!T)
return FALSE
if(!Adjacent(T) || !Adjacent(TG))
return //No long distance transfer
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [T]."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [T]."))
RTB.reagents.vore_trans_to_con(T, transfer_amount, 1, 0)
add_attack_logs(user, T,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to a [T]") //Bonus for staff so they can see if people have abused transfer and done pref breaks
if(RTB.count_liquid_for_sprite)
handle_belly_update()
if("Floor")
if(RTB.reagentid == REAGENT_ID_WATER)
return
var/amount_removed = RTB.reagents.remove_any(transfer_amount)
if(RTB.count_liquid_for_sprite)
handle_belly_update()
var/puddle_amount = round(amount_removed/5)
if(puddle_amount == 0)
to_chat(user,span_vnotice("[RTB.reagent_name] dripples from the [lowertext(RTB.name)], not enough to form a puddle."))
return
if(TG == user)
user.custom_emote_vr(1, span_vnotice("spills [RTB.reagent_name] from their [lowertext(RTB.name)] onto the floor!"))
else
user.custom_emote_vr(1, span_vnotice("spills [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] onto the floor!"))
var/obj/effect/decal/cleanable/blood/reagent/puddle = null
if (RTB.custom_reagentcolor)
puddle = new /obj/effect/decal/cleanable/blood/reagent(RTB.reagent_name, RTB.custom_reagentcolor, RTB.reagentid, puddle_amount, user.ckey, TG.ckey)
else
puddle = new /obj/effect/decal/cleanable/blood/reagent(RTB.reagent_name, RTB.reagentcolor, RTB.reagentid, puddle_amount, user.ckey, TG.ckey)
puddle.loc = TG.loc
var/soundfile
if(!RTB.fancy_vore)
soundfile = classic_release_sounds[RTB.release_sound]
else
soundfile = fancy_release_sounds[RTB.release_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/preference/toggle/eating_noises)
/mob/living/proc/vore_bellyrub(var/mob/living/T in view(1,src))
set name = "Give Bellyrubs"
set category = "Abilities.General"
set desc = "Provide bellyrubs to either yourself or another mob with a belly."
if(!T)
T = tgui_input_list(src, "Choose whose belly to rub", "Rub Belly?", mobs_in_view(1,src))
if(!T)
return FALSE
if(!(T in view(1,src)))
return FALSE
if(T.vore_selected)
var/obj/belly/B = T.vore_selected
if(istype(B))
if(T == src)
custom_emote_vr(1, "rubs their [belly_rub_target ? belly_rub_target : lowertext(B.name)].")
else
custom_emote_vr(1, "gives some rubs over [T]'s [belly_rub_target ? belly_rub_target : lowertext(B.name)].")
B.quick_cycle()
return TRUE
to_chat(src, span_vwarning("There is no suitable belly for rubs."))
return FALSE
/mob/living/proc/mute_entry()
set name = "Mute Vorgan Entrance"
set category = "Preferences.Vore"
set desc = "Mute the chatlog messages when something enters a vore belly."
mute_entry = !mute_entry
to_chat(src, span_vwarning("Entrance logs [mute_entry ? "disabled" : "enabled"]."))
/mob/living/proc/restrict_trasheater()
set name = "Restrict Trash Eater"
set category = "Abilities.Vore"
set desc = "Toggle Trash Eater restriction level."
adminbus_trash = !adminbus_trash
to_chat(src, span_vwarning("Trash Eater restriction level set to [adminbus_trash ? "everything not blacklisted" : "only whitelisted items"]."))
/mob/living/proc/liquidbelly_visuals()
set name = "Toggle Liquidbelly Visuals"
set category = "Preferences.Vore"
set desc = "Toggle liquidbelly fullscreen visual effect."
liquidbelly_visuals = !liquidbelly_visuals
to_chat(src, span_vwarning("Liquidbelly overlays [liquidbelly_visuals ? "enabled" : "disabled"]."))
/mob/living/proc/fix_vore_effects()
set name = "Fix Vore Effects"
set category = "OOC.Debug"
set desc = "Fix certain vore effects lingering after you've exited a belly."
if(!isbelly(src.loc))
if(alert(src, "Only use this verb if you are affected by certain vore effects outside of a belly, such as muffling or a stuck belly fullscreen.", "Clear Vore Effects", "Continue", "Nevermind") != "Continue")
return
absorbed = FALSE
muffled = FALSE
clear_fullscreen("belly")
clear_fullscreen(ATOM_BELLY_FULLSCREEN)
stop_sound_channel(CHANNEL_PREYLOOP)
/mob/living/verb/vore_check_nutrition()
set name = "Check Nutrition"
set category = "Abilities.Vore"
set desc = "Check your current nutrition level."
to_chat(src, span_vnotice("Current nutrition level: [nutrition]."))
// This proc will either return the first belly the mob is in or return null if they're not in one
/mob/living/proc/surrounding_belly()
var/atom/curloc = src.loc
while(curloc && !isbelly(curloc))
if(istype(curloc, /turf)) break
if(!curloc.loc || curloc == curloc.loc) break
curloc = curloc.loc
if(isbelly(curloc)) return curloc
+336 -62
View File
@@ -17,8 +17,6 @@
var/absorbing_prey = 0 // Determines if the person is using the succubus drain or not. See station_special_abilities_vr.
var/drain_finalized = 0 // Determines if the succubus drain will be KO'd/absorbed. Can be toggled on at any time.
var/fuzzy = 0 // Preference toggle for sharp/fuzzy icon.
// var/voice_freq = 0 // Preference for character voice frequency CHOMPEdit - Moved to modular_chomp/code/modules/mob/mob.dm
// var/list/voice_sounds_list = list() // The sound list containing our voice sounds! CHOMPEdit - Moved to modular_chomp/code/modules/mob/mob.dm
var/next_preyloop // For Fancy sound internal loop
var/stuffing_feeder = FALSE // Can feed foods to others whole, like trash eater can eat them on their own.
var/adminbus_trash = FALSE // For abusing trash eater for event shenanigans.
@@ -26,7 +24,7 @@
var/vis_height = 32 // Sprite height used for resize features.
var/appendage_color = "#e03997" //Default pink. Used for the 'long_vore' trait.
var/appendage_alt_setting = FALSE // Dictates if 'long_vore' user pulls prey to them or not. 1 = user thrown towards target.
var/digestion_in_progress = FALSE // CHOMPEdit: Gradual corpse gurgles
var/digestion_in_progress = FALSE // Gradual corpse gurgles
var/regen_sounds = list(
'sound/effects/mob_effects/xenochimera/regen_1.ogg',
'sound/effects/mob_effects/xenochimera/regen_2.ogg',
@@ -40,6 +38,17 @@
var/trait_injection_amount = 5 //RSEdit: How much you're injecting with traits.
var/trait_injection_verb = "bites" //RSEdit: Which fluffy manner you're doing the injecting.
var/mute_entry = FALSE //Toggleable vorgan entry logs.
var/parasitic = FALSE //Digestion immunity and nutrition leeching variable
var/liquidbelly_visuals = TRUE //Toggle for liquidbelly level visuals.
var/churn_count = 0 //Counter for digested livings
var/passtable_reset // For crawling
var/passtable_crawl_checked = FALSE
/mob/living/proc/handle_special_unlocks()
return
//
// Hook for generic creation of stuff on new creatures
//
@@ -56,12 +65,10 @@
/mob/proc/init_vore()
//Something else made organs, meanwhile.
if(!isnewplayer(src))
AddElement(/datum/element/slosh) // CHOMPEdit - Sloshy element
AddElement(/datum/element/slosh)
if(LAZYLEN(vore_organs))
//CHOMPAdd Start
if(!soulgem)
soulgem = new(src)
//CHOMPAdd End
return TRUE
//We'll load our client's organs if we have one
@@ -86,11 +93,9 @@
var/mob/living/carbon/human/H = src
if(istype(H.species,/datum/species/monkey))
allow_spontaneous_tf = TRUE
//CHOMPAdd Start
if(!soulgem)
soulgem = new(src)
return TRUE
//CHOMPAdd End
/mob/living/init_vore()
if(no_vore)
@@ -267,6 +272,7 @@
P.slip_vore = src.slip_vore
P.throw_vore = src.throw_vore
P.food_vore = src.food_vore
P.consume_liquid_belly = src.consume_liquid_belly
P.digest_pain = src.digest_pain
P.stumble_vore = src.stumble_vore
P.eating_privacy_global = src.eating_privacy_global
@@ -276,10 +282,9 @@
P.nutrition_messages = src.nutrition_messages
P.weight_message_visible = src.weight_message_visible
P.weight_messages = src.weight_messages
P.vore_sprite_color = src.vore_sprite_color // CHOMPEdit
P.vore_sprite_color = src.vore_sprite_color
P.allow_mind_transfer = src.allow_mind_transfer
//CHOMP stuff Start
P.phase_vore = src.phase_vore
P.noisy_full = src.noisy_full
P.latejoin_vore = src.latejoin_vore
@@ -298,7 +303,6 @@
P.no_latejoin_prey_warning_persists = src.no_latejoin_prey_warning_persists
P.belly_rub_target = src.belly_rub_target
P.soulcatcher_pref_flags = src.soulcatcher_pref_flags
//CHOMP Stuff End
var/list/serialized = list()
for(var/obj/belly/B as anything in src.vore_organs)
@@ -306,13 +310,13 @@
P.belly_prefs = serialized
P.soulcatcher_prefs = src.soulgem.serialize() // CHOMPAdd
P.soulcatcher_prefs = src.soulgem.serialize()
return TRUE
//
// Proc for applying vore preferences, given bellies
//
/mob/proc/copy_from_prefs_vr(var/bellies = TRUE, var/full_vorgans = FALSE) //CHOMPedit: full_vorgans var to bypass 1-belly load optimization.
/mob/proc/copy_from_prefs_vr(var/bellies = TRUE, var/full_vorgans = FALSE) // full_vorgans var to bypass 1-belly load optimization.
if(!client || !client.prefs_vr)
to_chat(src,span_warning("You attempted to apply your vore prefs but somehow you're in this character without a client.prefs_vr variable. Tell a dev."))
return FALSE
@@ -334,7 +338,6 @@
show_vore_fx = P.show_vore_fx
can_be_drop_prey = P.can_be_drop_prey
can_be_drop_pred = P.can_be_drop_pred
// allow_inbelly_spawning = P.allow_inbelly_spawning //CHOMP Removal: we have vore spawning at home. Actually if this were to be enabled, it would break anyway. Just leaving this here as a reference to it.
allow_spontaneous_tf = P.allow_spontaneous_tf
step_mechanics_pref = P.step_mechanics_pref
pickup_pref = P.pickup_pref
@@ -343,6 +346,7 @@
throw_vore = P.throw_vore
stumble_vore = P.stumble_vore
food_vore = P.food_vore
consume_liquid_belly = P.consume_liquid_belly
digest_pain = P.digest_pain
eating_privacy_global = P.eating_privacy_global
allow_mimicry = P.allow_mimicry
@@ -354,7 +358,6 @@
vore_sprite_color = P.vore_sprite_color
allow_mind_transfer = P.allow_mind_transfer
//CHOMP stuff
phase_vore = P.phase_vore
noisy_full = P.noisy_full
latejoin_vore = P.latejoin_vore
@@ -378,7 +381,7 @@
if(isliving(src))
var/mob/living/L = src
L.release_vore_contents(silent = TRUE)
QDEL_LIST(vore_organs) // CHOMPedit
QDEL_LIST(vore_organs)
for(var/entry in P.belly_prefs)
list_to_object(entry,src)
if(!vore_organs.len)
@@ -391,7 +394,6 @@
else
vore_selected = vore_organs[1]
//CHOMPAdd Start
if(soulgem)
src.soulgem.release_mobs()
QDEL_NULL(soulgem)
@@ -399,7 +401,6 @@
soulgem = list_to_object(P.soulcatcher_prefs, src)
else
soulgem = new(src)
//CHMPAdd End
return TRUE
@@ -525,17 +526,17 @@
if(!istype(tasted))
return
if(!checkClickCooldown() || incapacitated(INCAPACITATION_KNOCKOUT)) //CHOMPEdit
if(!checkClickCooldown() || incapacitated(INCAPACITATION_KNOCKOUT))
return
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(tasted == src) //CHOMPEdit Start
if(tasted == src)
visible_message(span_vwarning("[src] licks themself!"),span_notice("You lick yourself. You taste rather like [tasted.get_taste_message()]."),span_infoplain(span_bold("Slurp!")))
balloon_alert_visible("licks themself!", "tastes like [tasted.get_taste_message()]")
//balloon_alert_visible("licks themself!", "tastes like [tasted.get_taste_message()]")
else
visible_message(span_vwarning("[src] licks [tasted]!"),span_notice("You lick [tasted]. They taste rather like [tasted.get_taste_message()]."),span_infoplain(span_bold("Slurp!")))
balloon_alert_visible("licks [tasted]!", "tastes like [tasted.get_taste_message()]")
//CHOMPEdit End
//balloon_alert_visible("licks [tasted]!", "tastes like [tasted.get_taste_message()]")
/mob/living/proc/get_taste_message(allow_generic = 1)
@@ -562,7 +563,7 @@
//This is just the above proc but switched about.
/mob/living/proc/smell(mob/living/smelled in living_mobs(1, TRUE)) //CHOMPEdit
/mob/living/proc/smell(mob/living/smelled in living_mobs(1, TRUE))
set name = "Smell"
set category = "IC.Game"
set desc = "Smell someone nearby!"
@@ -570,17 +571,17 @@
if(!istype(smelled))
return
if(!checkClickCooldown() || incapacitated(INCAPACITATION_KNOCKOUT)) //CHOMPEdit
if(!checkClickCooldown() || incapacitated(INCAPACITATION_KNOCKOUT))
return
setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
if(smelled == src) //CHOMPEdit Start
if(smelled == src)
visible_message(span_vwarning("[src] smells themself!"),span_notice("You smell yourself. You smell like [smelled.get_smell_message()]."),span_infoplain(span_bold("Sniff!")))
balloon_alert_visible("smells themself!", "smells like [smelled.get_smell_message()]")
//balloon_alert_visible("smells themself!", "smells like [smelled.get_smell_message()]")
else
visible_message(span_vwarning("[src] smells [smelled]!"),span_notice("You smell [smelled]. They smell like [smelled.get_smell_message()]."),span_infoplain(span_bold("Sniff!")))
balloon_alert_visible("smells [smelled]!", "smells like [smelled.get_smell_message()]")
//CHOMPEdit End
//balloon_alert_visible("smells [smelled]!", "smells like [smelled.get_smell_message()]")
/mob/living/proc/get_smell_message(allow_generic = 1)
if(!vore_smell && !allow_generic)
@@ -628,7 +629,7 @@
LAZYSET(SA.prey_excludes, src, world.time)
log_and_message_admins("used the OOC escape button to get out of [key_name(B.owner)] ([B.owner ? "<a href='byond://?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[B.owner.x];Y=[B.owner.y];Z=[B.owner.z]'>JMP</a>" : "null"])", src)
B.owner.handle_belly_update() //CHOMPEdit - This is run whenever a belly's contents are changed.
B.owner.handle_belly_update() //This is run whenever a belly's contents are changed.
//You're in a dogborg!
else if(istype(loc, /obj/item/dogborg/sleeper))
@@ -654,13 +655,13 @@
crystal.unleash()
crystal.bound_mob = null
crystal.bound_mob = capture_crystal = 0
clear_fullscreen(ATOM_BELLY_FULLSCREEN) // CHOMPedit
clear_fullscreen(ATOM_BELLY_FULLSCREEN)
log_and_message_admins("used the OOC escape button to get out of [crystal] owned by [crystal.owner]. [ADMIN_FLW(src)]", src)
//You've been turned into an item!
else if(tf_mob_holder && isvoice(src) && istype(src.loc, /obj/item))
var/obj/item/item_to_destroy = src.loc //If so, let's destroy the item they just TF'd out of.
//CHOMPEdit Start - If tf_mob_holder is not located in src, then it's a Mind Binder OOC Escape
//If tf_mob_holder is not located in src, then it's a Mind Binder OOC Escape
var/mob/living/ourmob = tf_mob_holder
if(ourmob.loc != src)
if(isnull(ourmob.loc))
@@ -675,7 +676,6 @@
qdel(src)
log_and_message_admins("[key_name(src)] used the OOC escape button to revert back to their original form from being TFed into an object.")
return
//CHOMPEdit End
if(istype(src.loc, /obj/item/clothing)) //Are they in clothes? Delete the item then revert them.
qdel(item_to_destroy)
log_and_message_admins("used the OOC escape button to revert back to their original form from being TFed into an object.", src)
@@ -701,7 +701,7 @@
qdel(G)
log_and_message_admins("used the OOC escape button to revert back from being petrified.", src)
//CHOMPEdit - In-shoe OOC escape. Checking voices as precaution if something akin to obj TF or possession happens
//In-shoe OOC escape. Checking voices as precaution if something akin to obj TF or possession happens
else if(!istype(src, /mob/living/voice) && istype(src.loc, /obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = src.loc
forceMove(get_turf(src))
@@ -729,14 +729,12 @@
// Eating procs depending on who clicked what
//
//CHOMPAdd Start
/mob/living/proc/feedable_bellies()
var/list/bellies = list()
for(var/obj/belly/Y in src.vore_organs)
if(Y.is_feedable)
bellies += Y
return bellies
//CHOMPAdd End
/mob/living/proc/feed_grabbed_to_self(mob/living/user, mob/living/prey)
var/belly = user.vore_selected
@@ -745,17 +743,17 @@
/mob/living/proc/eat_held_mob(mob/living/user, mob/living/prey, mob/living/pred)
var/belly
if(user != pred)
belly = tgui_input_list(user, "Choose Belly", "Belly Choice", pred.feedable_bellies()) //CHOMPEdit
belly = tgui_input_list(user, "Choose Belly", "Belly Choice", pred.feedable_bellies())
else
belly = pred.vore_selected
return perform_the_nom(user, prey, pred, belly)
/mob/living/proc/feed_self_to_grabbed(mob/living/user, mob/living/pred)
var/belly = tgui_input_list(user, "Choose Belly", "Belly Choice", pred.feedable_bellies()) //CHOMPEdit
var/belly = tgui_input_list(user, "Choose Belly", "Belly Choice", pred.feedable_bellies())
return perform_the_nom(user, user, pred, belly)
/mob/living/proc/feed_grabbed_to_other(mob/living/user, mob/living/prey, mob/living/pred)
var/belly = tgui_input_list(user, "Choose Belly", "Belly Choice", pred.feedable_bellies()) //CHOMPEdit
var/belly = tgui_input_list(user, "Choose Belly", "Belly Choice", pred.feedable_bellies())
return perform_the_nom(user, prey, pred, belly)
//
@@ -832,8 +830,8 @@
prey.ai_holder?.react_to_attack(user)
//Timer and progress bar
if(!user.client && prey.weakened > 0) // CHOMPEdit stop crwaling instantly break swallow attempt for mobvore
prey.Stun(min(prey.weakened, 2)) // CHOMPEdit stop crwaling instantly break swallow attempt for mobvore
if(!user.client && prey.weakened > 0) // stop crwaling instantly break swallow attempt for mobvore
prey.Stun(min(prey.weakened, 2)) // stop crwaling instantly break swallow attempt for mobvore
if(!do_after(user, swallow_time, prey, exclusive = TASK_USER_EXCLUSIVE))
return FALSE // Prey escpaed (or user disabled) before timer expired.
@@ -911,7 +909,7 @@
/datum/gas_mixture/belly_air/vox/New()
. = ..()
gas = list(
GAS_N2 = 100) // Chomp edit
GAS_N2 = 100) // CHOMPEdit
/datum/gas_mixture/belly_air/zaddat
volume = 2500
@@ -933,7 +931,6 @@
gas = list(
GAS_N2 = 100)
//CHOMPEdit Start - for CO2 breathers
/datum/gas_mixture/belly_air/carbon_dioxide_breather
volume = 2500
temperature = 293.150
@@ -943,7 +940,6 @@
. = ..()
gas = list(
GAS_CO2 = 100)
//CHOMPEdit End
/mob/living/proc/feed_grabbed_to_self_falling_nom(var/mob/living/user, var/mob/living/prey)
if(user.is_incorporeal())
@@ -1004,7 +1000,7 @@
to_chat(src, span_notice("You are not holding anything."))
return
if(is_type_in_list(I,edible_trash) || adminbus_trash || is_type_in_list(I,edible_tech) && isSynthetic()) // CHOMPEdit adds edible tech for synth
if(is_type_in_list(I,edible_trash) || adminbus_trash || is_type_in_list(I,edible_tech) && isSynthetic()) // adds edible tech for synth
if(!I.on_trash_eaten(src)) // shows object's rejection message itself
return
drop_item()
@@ -1012,9 +1008,9 @@
updateVRPanel()
log_admin("VORE: [src] used Eat Trash to swallow [I].")
I.after_trash_eaten(src)
visible_message(span_vwarning("[src] demonstrates the voracious capabilities of their [lowertext(vore_selected.name)] by making [I] disappear!")) //CHOMPedit
visible_message(span_vwarning("[src] demonstrates the voracious capabilities of their [lowertext(vore_selected.name)] by making [I] disappear!"))
return
to_chat(src, span_notice("This snack is too powerful to go down that easily.")) //CHOMPEdit
to_chat(src, span_notice("This snack is too powerful to go down that easily."))
return
/mob/living/proc/toggle_trash_catching() //Ported from chompstation
@@ -1022,7 +1018,7 @@
set category = "Abilities.Vore"
set desc = "Toggle Trash Eater throw vore abilities."
trash_catching = !trash_catching
to_chat(src, span_vwarning("Trash catching [trash_catching ? "enabled" : "disabled"].")) //CHOMPEdit
to_chat(src, span_vwarning("Trash catching [trash_catching ? "enabled" : "disabled"]."))
/mob/living/proc/eat_minerals() //Actual eating abstracted so the user isn't given a prompt due to an argument in this verb.
set name = "Eat Minerals"
@@ -1204,7 +1200,7 @@
save_ooc_panel(usr)
if(href_list["print_ooc_notes_chat"])
print_ooc_notes_chat(usr)
//CHOMPEdit Start
// CHOMPEnable Start
if(href_list["edit_ooc_note_favs"])
if(usr == src)
set_metainfo_favs(usr)
@@ -1213,7 +1209,7 @@
set_metainfo_maybes(usr)
if(href_list["set_metainfo_ooc_style"])
set_metainfo_ooc_style(usr)
//CHOMPEdit End
// CHOMPEnable End
if(href_list["save_private_notes"])
if(usr == src)
save_private_notes(usr)
@@ -1230,7 +1226,6 @@
dat += span_red(span_bold("OOC DISABLED")) + "<br>"
if(!client?.prefs?.read_preference(/datum/preference/toggle/show_looc))
dat += span_red(span_bold("LOOC DISABLED")) + "<br>"
//CHOMPEdit Start
dat += span_bold("Devourable:") + " [devourable ? span_green("Enabled") : span_red("Disabled")]<br>"
if(devourable)
dat += span_bold("Healbelly permission:") + " [permit_healbelly ? span_green("Allowed") : span_red("Disallowed")]<br>"
@@ -1260,6 +1255,7 @@
dat += span_bold("Feedable:") + " [feeding ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Receiving liquids:") + " [receive_reagents ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Giving liquids:") + " [give_reagents ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Consuming liquids:") + " [consume_liquid_belly ? span_green("Enabled") : span_red("Disabled")]<br>"
dat += span_bold("Late join spawn point belly:") + " [latejoin_vore ? span_green("Enabled") : span_red("Disabled")]<br>"
if(latejoin_vore)
dat += span_bold("Late join spawn auto accept:") + " [no_latejoin_vore_warning ? span_green("Enabled") : span_red("Disabled")]<br>"
@@ -1269,24 +1265,18 @@
dat += span_bold("Global Vore Privacy is:") + " [eating_privacy_global ? span_green("Subtle") : span_red("Loud")]<br>"
dat += span_bold("Current active belly:") + " [vore_selected ? vore_selected.name : "None"]<br>"
dat += span_bold("Belly rub target:") + " [belly_rub_target ? belly_rub_target : (vore_selected ? vore_selected.name : "None")]<br>"
//CHOMPEdit End
var/datum/browser/popup = new(user, "[name]mvp", "Vore Prefs: [src]", 300, 700, src)
popup.set_content(dat)
popup.open()
// Full screen belly overlays!
/obj/screen/fullscreen/belly
icon = 'modular_chomp/icons/mob/vore_fullscreens/screen_full_vore_ch.dmi' //CHOMPedit
icon = 'icons/mob/vore_fullscreens/screen_full_vore_list.dmi'
/obj/screen/fullscreen/belly/fixed //CHOMPedit: tweaking to preserve save data
icon = 'icons/mob/screen_full_vore.dmi' //CHOMPedit: tweaking to preserve save data
/obj/screen/fullscreen/belly/fixed
icon = 'icons/mob/screen_full_vore.dmi'
icon_state = ""
/* //Chomp DISABLE - use our solution, not upstream's.
/obj/screen/fullscreen/belly/colorized/overlay
icon = 'icons/mob/screen_full_colorized_vore_overlays.dmi'
*/ //Chomp DISABLE End
/mob/living/proc/vorebelly_printout() //Spew the vorepanel belly messages into chat window for copypasting.
set name = "X-Print Vorebelly Settings"
set category = "Preferences.Vore"
@@ -1453,7 +1443,7 @@
if(owner.client)
create_mob_button(parent)
add_verb(owner, /mob/proc/insidePanel)
if(!owner.vorePanel) //CHOMPEdit
if(!owner.vorePanel)
owner.vorePanel = new(owner)
/datum/component/vore_panel/UnregisterFromParent()
@@ -1485,7 +1475,7 @@
/datum/component/vore_panel/proc/vore_panel_click(source, location, control, params, user)
var/mob/living/owner = user
if(istype(owner) && owner.vorePanel)
INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob/living, insidePanel), owner) //CHOMPEdit
INVOKE_ASYNC(owner, TYPE_PROC_REF(/mob/living, insidePanel), owner)
/**
* Screen object for vore panel
*/
@@ -1494,3 +1484,287 @@
icon = 'icons/mob/screen/midnight.dmi'
icon_state = "vore"
screen_loc = ui_smallquad
//
// Returns examine messages for how much reagents are in bellies
//
/mob/living/proc/examine_reagent_bellies()
if(!show_pudge()) //Some clothing or equipment can hide this. Reagent inflation is not very different in this aspect.
return ""
var/message = ""
for (var/belly in vore_organs)
var/obj/belly/B = belly
var/fill_percentage = B.reagents.maximum_volume > 0 ? B.reagents.total_volume / B.reagents.maximum_volume : 0
if(0 <= fill_percentage && fill_percentage <= 0.2 && B.show_fullness_messages)
message += B.get_reagent_examine_msg1()
if(0.2 < fill_percentage && fill_percentage <= 0.4 && B.show_fullness_messages)
message += B.get_reagent_examine_msg2()
if(0.4 < fill_percentage && fill_percentage <= 0.6 && B.show_fullness_messages)
message += B.get_reagent_examine_msg3()
if(0.6 < fill_percentage && fill_percentage <= 0.8 && B.show_fullness_messages)
message += B.get_reagent_examine_msg4()
if(0.8 < fill_percentage && fill_percentage <= 1 && B.show_fullness_messages)
message += B.get_reagent_examine_msg5()
return message
/mob/living/proc/vore_check_reagents()
set name = "Check Belly Liquid (Vore)"
set category = "Abilities.Vore"
set desc = "Check the amount of liquid in your belly."
var/obj/belly/RTB = tgui_input_list(src, "Choose which vore belly to check", "Select Belly", vore_organs)
if(!RTB)
return FALSE
to_chat(src, span_vnotice("[RTB] has [RTB.reagents.total_volume] units of liquid."))
/mob/living/proc/vore_transfer_reagents()
set name = "Transfer Liquid (Vore)"
set category = "Abilities.Vore"
set desc = "Transfer liquid from an organ to another or stomach, or into another person or container."
set popup_menu = FALSE
if(!checkClickCooldown() || incapacitated(INCAPACITATION_KNOCKOUT))
return FALSE
var/mob/living/user = src
var/mob/living/TG = tgui_input_list(user, "Choose who to transfer from", "Transfer From", mobs_in_view(1,user))
if(!TG)
return FALSE
if(TG.give_reagents == FALSE && user != TG) //User isnt forced to allow giving in prefs if they are the one doing it
to_chat(user, span_vwarning("This person's prefs dont allow that!"))
return FALSE
var/obj/belly/RTB = tgui_input_list(user, "Choose which vore belly to transfer from", "Select Belly", vore_organs)
if(!RTB)
return FALSE
var/transfer_amount = tgui_input_list(user, "How much to transfer?", "Transfer Amount", list(5,10,25,50,100))
if(!transfer_amount)
return FALSE
switch(tgui_input_list(user,"Choose what to transfer to","Select Target", list("Vore belly", "Stomach", "Container", "Floor", "Cancel")))
if("Cancel")
return FALSE
if("Vore belly")
var/mob/living/TR = tgui_input_list(user,"Choose who to transfer to","Select Target", mobs_in_view(1,user))
if(!TR) return FALSE
if(TR == user) //Proceed, we dont need to have prefs enabled for transfer within user
var/obj/belly/TB = tgui_input_list(user, "Choose which organ to transfer to", "Select Belly", user.vore_organs)
if(!TB)
return FALSE
if(!Adjacent(TR) || !Adjacent(TG))
return //No long distance transfer
if(!TB.reagents?.get_free_space())
to_chat(user, span_vnotice("[TB] is full!"))
return FALSE
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their [lowertext(TB.name)]."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their [lowertext(TB.name)]."))
add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB)
if(RTB.count_liquid_for_sprite || TB.count_liquid_for_sprite)
handle_belly_update()
else if(TR.receive_reagents == FALSE)
to_chat(user, span_vwarning("This person's prefs dont allow that!"))
return FALSE
else
var/obj/belly/TB = tgui_input_list(user, "Choose which organ to transfer to", "Select Belly", TR.vore_organs)
if(!TB)
return FALSE
if(!Adjacent(TR) || !Adjacent(TG))
return //No long distance transfer
if(!TB.reagents?.get_free_space())
to_chat(user, span_vnotice("[TR]'s [lowertext(TB.name)] is full!"))
return FALSE
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)]."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]s [lowertext(RTB.name)] into [TR]'s [lowertext(TB.name)]."))
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_VORE, 1, 0, TB)
add_attack_logs(user,TR,"Transfered reagents from [TG]'s [RTB] to [TR]'s [TB]") //Bonus for staff so they can see if people have abused transfer and done pref breaks
if(RTB.count_liquid_for_sprite)
handle_belly_update()
if(TB.count_liquid_for_sprite)
TR.handle_belly_update()
if("Stomach")
var/mob/living/TR = tgui_input_list(user,"Choose who to transfer to","Select Target", mobs_in_view(1,user))
if(!TR) return
if(!Adjacent(TR) || !Adjacent(TG))
return //No long distance transfer
if(TR == user) //Proceed, we dont need to have prefs enabled for transfer within user
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into their stomach."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into their stomach."))
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null)
add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach")
if(RTB.count_liquid_for_sprite)
handle_belly_update()
else if(TR.receive_reagents == FALSE)
to_chat(user, span_vwarning("This person's prefs dont allow that!"))
return FALSE
else
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [TR]'s stomach."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [TR]'s stomach."))
RTB.reagents.vore_trans_to_mob(TR, transfer_amount, CHEM_INGEST, 1, 0, null)
add_attack_logs(user,TR,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to [TR]'s Stomach") //Bonus for staff so they can see if people have abused transfer and done pref breaks
if(RTB.count_liquid_for_sprite)
handle_belly_update()
if("Container")
if(RTB.reagentid == REAGENT_ID_STOMACID)
return
var/list/choices = list()
for(var/obj/item/reagent_containers/rc in view(1,user.loc))
choices += rc
var/obj/item/reagent_containers/arc = user.get_active_hand()
if(istype(arc,/obj/item/reagent_containers))
choices += arc
var/obj/item/reagent_containers/irc = user.get_inactive_hand()
if(istype(irc,/obj/item/reagent_containers))
choices += irc
var/obj/item/reagent_containers/T = tgui_input_list(user,"Choose what to transfer to","Select Target", choices)
if(!T)
return FALSE
if(!Adjacent(T) || !Adjacent(TG))
return //No long distance transfer
if(TG == user)
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from their [lowertext(RTB.name)] into [T]."))
else
user.custom_emote_vr(1, span_vnotice("[RTB.reagent_transfer_verb] [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] into [T]."))
RTB.reagents.vore_trans_to_con(T, transfer_amount, 1, 0)
add_attack_logs(user, T,"Transfered [RTB.reagent_name] from [TG]'s [RTB] to a [T]") //Bonus for staff so they can see if people have abused transfer and done pref breaks
if(RTB.count_liquid_for_sprite)
handle_belly_update()
if("Floor")
if(RTB.reagentid == REAGENT_ID_WATER)
return
var/amount_removed = RTB.reagents.remove_any(transfer_amount)
if(RTB.count_liquid_for_sprite)
handle_belly_update()
var/puddle_amount = round(amount_removed/5)
if(puddle_amount == 0)
to_chat(user,span_vnotice("[RTB.reagent_name] dripples from the [lowertext(RTB.name)], not enough to form a puddle."))
return
if(TG == user)
user.custom_emote_vr(1, span_vnotice("spills [RTB.reagent_name] from their [lowertext(RTB.name)] onto the floor!"))
else
user.custom_emote_vr(1, span_vnotice("spills [RTB.reagent_name] from [TG]'s [lowertext(RTB.name)] onto the floor!"))
var/obj/effect/decal/cleanable/blood/reagent/puddle = null
if (RTB.custom_reagentcolor)
puddle = new /obj/effect/decal/cleanable/blood/reagent(RTB.reagent_name, RTB.custom_reagentcolor, RTB.reagentid, puddle_amount, user.ckey, TG.ckey)
else
puddle = new /obj/effect/decal/cleanable/blood/reagent(RTB.reagent_name, RTB.reagentcolor, RTB.reagentid, puddle_amount, user.ckey, TG.ckey)
puddle.loc = TG.loc
var/soundfile
if(!RTB.fancy_vore)
soundfile = classic_release_sounds[RTB.release_sound]
else
soundfile = fancy_release_sounds[RTB.release_sound]
if(soundfile)
playsound(src, soundfile, vol = 100, vary = 1, falloff = VORE_SOUND_FALLOFF, preference = /datum/preference/toggle/eating_noises)
/mob/living/proc/vore_bellyrub(var/mob/living/T in view(1,src))
set name = "Give Bellyrubs"
set category = "Abilities.General"
set desc = "Provide bellyrubs to either yourself or another mob with a belly."
if(!T)
T = tgui_input_list(src, "Choose whose belly to rub", "Rub Belly?", mobs_in_view(1,src))
if(!T)
return FALSE
if(!(T in view(1,src)))
return FALSE
if(T.vore_selected)
var/obj/belly/B = T.vore_selected
if(istype(B))
if(T == src)
custom_emote_vr(1, "rubs their [belly_rub_target ? belly_rub_target : lowertext(B.name)].")
else
custom_emote_vr(1, "gives some rubs over [T]'s [belly_rub_target ? belly_rub_target : lowertext(B.name)].")
B.quick_cycle()
return TRUE
to_chat(src, span_vwarning("There is no suitable belly for rubs."))
return FALSE
/mob/living/proc/mute_entry()
set name = "Mute Vorgan Entrance"
set category = "Preferences.Vore"
set desc = "Mute the chatlog messages when something enters a vore belly."
mute_entry = !mute_entry
to_chat(src, span_vwarning("Entrance logs [mute_entry ? "disabled" : "enabled"]."))
/mob/living/proc/restrict_trasheater()
set name = "Restrict Trash Eater"
set category = "Abilities.Vore"
set desc = "Toggle Trash Eater restriction level."
adminbus_trash = !adminbus_trash
to_chat(src, span_vwarning("Trash Eater restriction level set to [adminbus_trash ? "everything not blacklisted" : "only whitelisted items"]."))
/mob/living/proc/liquidbelly_visuals()
set name = "Toggle Liquidbelly Visuals"
set category = "Preferences.Vore"
set desc = "Toggle liquidbelly fullscreen visual effect."
liquidbelly_visuals = !liquidbelly_visuals
to_chat(src, span_vwarning("Liquidbelly overlays [liquidbelly_visuals ? "enabled" : "disabled"]."))
/mob/living/proc/fix_vore_effects()
set name = "Fix Vore Effects"
set category = "OOC.Debug"
set desc = "Fix certain vore effects lingering after you've exited a belly."
if(!isbelly(src.loc))
if(alert(src, "Only use this verb if you are affected by certain vore effects outside of a belly, such as muffling or a stuck belly fullscreen.", "Clear Vore Effects", "Continue", "Nevermind") != "Continue")
return
absorbed = FALSE
muffled = FALSE
clear_fullscreen("belly")
clear_fullscreen(ATOM_BELLY_FULLSCREEN)
stop_sound_channel(CHANNEL_PREYLOOP)
/mob/living/verb/vore_check_nutrition()
set name = "Check Nutrition"
set category = "Abilities.Vore"
set desc = "Check your current nutrition level."
to_chat(src, span_vnotice("Current nutrition level: [nutrition]."))
// This proc will either return the first belly the mob is in or return null if they're not in one
/mob/living/proc/surrounding_belly()
var/atom/curloc = src.loc
while(curloc && !isbelly(curloc))
if(istype(curloc, /turf)) break
if(!curloc.loc || curloc == curloc.loc) break
curloc = curloc.loc
if(isbelly(curloc)) return curloc
-17
View File
@@ -1,17 +0,0 @@
/mob
var/receive_reagents = FALSE //Pref for people to avoid others transfering reagents into them.
var/give_reagents = FALSE //Pref for people to avoid others taking reagents from them.
var/apply_reagents = TRUE //Pref for people to avoid having stomach reagents applied to them
var/latejoin_vore = FALSE //If enabled, latejoiners can spawn into this, assuming they have a client
var/latejoin_prey = FALSE //If enabled, latejoiners can spawn ontop of and instantly eat the victim
var/noisy_full = FALSE //Enables belching when a mob has overeaten
var/phase_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/strip_pref = TRUE //Enables the ability for worn items to be stripped
var/no_latejoin_vore_warning = FALSE //Auto accepts pred spwan notifications (roundbased / saveable)
var/no_latejoin_prey_warning = FALSE //Auto accepts prey spawn notifications (roundbased / saveable)
var/no_latejoin_vore_warning_time = 15 //Time until accepting prey
var/no_latejoin_prey_warning_time = 15 //Time until accepting pred
var/no_latejoin_vore_warning_persists = FALSE //Do we save it?
var/no_latejoin_prey_warning_persists = FALSE //Do we save it?
var/belly_rub_target = null
var/soulcatcher_pref_flags = 0 //Default disabled
+25 -2
View File
@@ -6,7 +6,6 @@
var/resizable = TRUE // Can other people resize you? (Usually ignored for self-resizes)
var/digest_leave_remains = FALSE // Will this mob leave bones/skull/etc after the melty demise?
var/allowmobvore = TRUE // Will simplemobs attempt to eat the mob?
//var/allow_inbelly_spawning = FALSE // Will we even bother with attempts of someone to spawn in in one of our bellies? // CHOMPedit: use our code instead of upstream's recoding of our code
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/absorbed = FALSE // If a mob is absorbed into another
@@ -19,6 +18,7 @@
var/drop_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/throw_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/food_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/consume_liquid_belly = FALSE //starting off because if someone is into that, they'll toggle it first time they get the error. Otherway around would be more pref breaky.
var/digest_pain = TRUE
var/can_be_drop_prey = FALSE
var/can_be_drop_pred = FALSE
@@ -69,4 +69,27 @@
var/vore_icons = 0 // Bitfield for which fields we have vore icons for.
var/vore_eyes = FALSE // For mobs with fullness specific eye overlays.
var/obj/soulgem/soulgem // CHOMPEnable Soulcatcher. Needs to be up-ported sometime.
var/obj/soulgem/soulgem // Soulcatcher. Needs to be up-ported sometime.
var/receive_reagents = FALSE //Pref for people to avoid others transfering reagents into them.
var/give_reagents = FALSE //Pref for people to avoid others taking reagents from them.
var/apply_reagents = TRUE //Pref for people to avoid having stomach reagents applied to them
var/latejoin_vore = FALSE //If enabled, latejoiners can spawn into this, assuming they have a client
var/latejoin_prey = FALSE //If enabled, latejoiners can spawn ontop of and instantly eat the victim
var/noisy_full = FALSE //Enables belching when a mob has overeaten
var/phase_vore = TRUE //Enabled by default since you have to enable drop pred/prey to do this anyway
var/strip_pref = TRUE //Enables the ability for worn items to be stripped
var/no_latejoin_vore_warning = FALSE //Auto accepts pred spwan notifications (roundbased / saveable)
var/no_latejoin_prey_warning = FALSE //Auto accepts prey spawn notifications (roundbased / saveable)
var/no_latejoin_vore_warning_time = 15 //Time until accepting prey
var/no_latejoin_prey_warning_time = 15 //Time until accepting pred
var/no_latejoin_vore_warning_persists = FALSE //Do we save it?
var/no_latejoin_prey_warning_persists = FALSE //Do we save it?
var/belly_rub_target = null
var/soulcatcher_pref_flags = 0 //Default disabled
var/voice_freq = 42500 // Preference for character voice frequency
var/list/voice_sounds_list = list() // The sound list containing our voice sounds!
var/enabled = TRUE //Pauses a mob if disabled (Prevents life ticks from happening)
var/died_in_vr = FALSE //For virtual reality sleepers
var/last_move_time = 0 //For movement smoothing
+2 -2
View File
@@ -27,7 +27,7 @@
if(istype(src, /mob/living/simple_mob/animal/passive/mouse) && !T.ckey)
// Mice can't eat logged out players!
return
/*if(client && IsAdvancedToolUser()) //CHOMPedit: Mob QOL, not everything can be grabbed and nobody wants wiseguy gotchas for trying.
/*if(client && IsAdvancedToolUser()) Mob QOL, not everything can be grabbed and nobody wants wiseguy gotchas for trying.
to_chat(src, span_warning("Put your hands to good use instead!"))
return
*/
@@ -123,7 +123,7 @@
/mob/living/simple_mob/proc/nutrition_heal()
set name = "Nutrition Heal"
set category = "Abilities.Mob" //CHOMPEdit
set category = "Abilities.Mob"
set desc = "Slowly regenerate health using nutrition."
if(nutrition < 10)
-73
View File
@@ -1,73 +0,0 @@
/mob/living
var/is_slipping = FALSE
var/slip_vore_in_progress = FALSE
/mob/living/proc/can_slip_vore(var/mob/living/target)
if(!target.is_slipping) //Obviously they have to be slipping to get slip vored
return FALSE
if(!(src.can_be_drop_pred && target.devourable && target.can_be_drop_prey)) //Make sure both of their prefs align with what we're gonna do.
return FALSE
if(!is_vore_predator(src)) //Check their bellies and stuff
return FALSE
if(!src.vore_selected) //Gotta have one selected as well.
return FALSE
return TRUE
/mob/living/proc/can_be_slip_vored_by(var/mob/living/target)
if(!target.is_slipping) //Obviously they have to be slipping to get slip vored
return FALSE
if(!(target.can_be_drop_pred && src.devourable && src.can_be_drop_prey)) //Make sure both of their prefs align with what we're gonna do.
return FALSE
if(!is_vore_predator(target)) //Check their bellies and stuff
return FALSE
if(!target.vore_selected) //Gotta have one selected as well.
return FALSE
return TRUE
/mob/living/Crossed(var/atom/movable/AM)
if(AM == src || AM.is_incorporeal()) // We're not going to run over ourselves or ghosts
return
if(istype(AM, /mob/living/bot/mulebot))
var/mob/living/bot/mulebot/MB = AM
MB.runOver(src)
if(istype(AM, /obj/vehicle))
var/obj/vehicle/V = AM
V.RunOver(src)
var/mob/living/target = AM
if(istype(target) && !target.incorporeal_move && !src.incorporeal_move) //The slip vore begins
if(can_slip_vore(target) && !src.slip_vore_in_progress && !target.slip_vore_in_progress) //If we can vore them go for it
target.slip_vore_in_progress = TRUE //Make them stop slipping
perform_the_nom(src,target,src,src.vore_selected,1)
target.slip_vore_in_progress = FALSE
target.is_slipping = FALSE
return
else if(can_be_slip_vored_by(target) && !src.slip_vore_in_progress && !target.slip_vore_in_progress) //Otherwise, if they can vore us, make it happen.
target.slip_vore_in_progress = TRUE //Make them stop slipping
perform_the_nom(target,src,target,target.vore_selected,1)
target.slip_vore_in_progress = FALSE
target.is_slipping = FALSE
return
if(src.step_mechanics_pref && istype(target) && src.lying && target.step_mechanics_pref && target.loc && target.buckled != src)
// src.lying being true means that in theory this code shouldn't run at the same time as the existing code for this in Bump. Probably.
// And optionally, this could be gated behind another preference, to prevent stunlock being abused.
if((mob_always_swap || (a_intent == I_HELP || src.restrained()) && (target.a_intent == I_HELP || target.restrained())) && target.canmove && target.handle_micro_bump_helping(src))
return
else if(!(target.a_intent == I_HELP || target.restrained()) && target.handle_micro_bump_other(src))
return
/mob/living/carbon/slip(var/slipped_on,stun_duration=8)
. = ..()
if(.)
is_slipping = TRUE
return .
/mob/living/update_canmove()
. = ..()
if(is_slipping && !lying)
is_slipping = FALSE
return .
+551
View File
@@ -0,0 +1,551 @@
/obj/soulgem
name = "Mind imprintation matrix"
desc = "A mind storage and processing system capable of capturing and supporting human-level minds in a small VR space."
var/mob/living/owner
var/datum/own_mind
var/obj/belly/linked_belly
var/taken_over_name
var/setting_flags = (NIF_SC_ALLOW_EARS|NIF_SC_ALLOW_EYES|NIF_SC_BACKUPS|NIF_SC_PROJECTING)
var/mob/selected_soul = null
var/list/brainmobs = list()
var/inside_flavor = "A small completely white room with a couch, and a window to what seems to be the outside world. A small sign in the corner says 'Configure Me'."
var/capture_message = "Your vision fades in a haze of static, before returning.\nAround you, you see...\n"
var/transit_message = "Your surroundings change to..."
var/release_message = "Release Message"
var/transfer_message = "Transfer Message"
var/delete_message = "Delete Message"
// Append the vars to save to our savefile list
/obj/soulgem/vars_to_save()
var/list/saving = list (
"setting_flags",
"inside_flavor",
"capture_message",
"transit_message",
"release_message",
"transfer_message",
"delete_message",
"linked_belly"
)
return ..() + saving
// Load the vars_to_save from the savefile
/obj/soulgem/Initialize(mapload)
. = ..()
if(ismob(loc))
owner = loc
owner.recalculate_vis()
// Store the vars_to_save into the save file
/obj/soulgem/deserialize(list/data)
. = ..()
for(var/obj/belly in owner.vore_organs)
if(belly.name == data["linked_belly"])
update_linked_belly(belly, TRUE)
return
linked_belly = null
// Allows to transfer the soulgem to the given mob
/obj/soulgem/proc/transfer_self(var/mob/target)
QDEL_NULL(target.soulgem)
owner.soulgem = null
forceMove(target)
owner = target
target.soulgem = src
// Cleaning up our refs before deletion
/obj/soulgem/Destroy()
owner = null
selected_soul = null
own_mind = null
QDEL_LIST_NULL(brainmobs)
if(istype(linked_belly))
UnregisterSignal(linked_belly, COMSIG_BELLY_UPDATE_VORE_FX)
linked_belly = null
. = ..()
// Sends messages to the owner of the soulcatcher
/obj/soulgem/proc/notify_holder(var/message)
message = span_nif(span_bold("[name]") + " displays, \"" + span_notice("[message]") + "\"")
to_chat(owner, message)
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
to_chat(CS, message)
// Forwards the speech of captured souls
/obj/soulgem/proc/use_speech(var/message, var/mob/living/sender, var/mob/eyeobj, var/whisper)
var/sender_name = eyeobj ? eyeobj.name : sender.name
//AR Projecting
if(eyeobj)
var/speak_verb = "says"
message = span_game(span_say(span_bold("[sender_name]") + " [speak_verb], \"[message]\""))
if(whisper)
speak_verb = "whispers"
sender.eyeobj.visible_message(span_italics(message), range = 1)
else
sender.eyeobj.visible_message(message)
//Not AR Projecting
else
var/speak_verb = "speaks"
message = span_nif(span_bold("\[SC\] [sender_name]") + " [speak_verb], \"[message]\"")
to_chat(owner, message)
if(whisper)
speak_verb = "whispers"
to_chat(sender, span_italics(message))
else
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
to_chat(CS, message)
log_nsay(message, owner.real_name, sender)
// Forwards the emotes of captured souls
/obj/soulgem/proc/use_emote(var/message, var/mob/living/sender, var/mob/eyeobj, var/whisper)
var/sender_name = eyeobj ? eyeobj.name : sender.name
//AR Projecting
if(eyeobj)
message = span_emote("[sender_name] [message]")
if(whisper)
sender.eyeobj.visible_message(span_italics(message), range = 1)
else
sender.eyeobj.visible_message(message)
//Not AR Projecting
else
message = span_nif(span_bold("[sender_name]") + " [message]")
to_chat(owner, message)
if(whisper)
to_chat(sender, span_italics(message))
else
for(var/mob/living/carbon/brain/caught_soul/CS as anything in brainmobs)
to_chat(CS, message)
log_nme(message, owner.real_name,sender)
// The capture function which transfers the given mob's mind into the soulcatcher
/obj/soulgem/proc/catch_mob(var/mob/M, var/custom_name)
if(!(M.soulcatcher_pref_flags & SOULCATCHER_ALLOW_CAPTURE) && !isobserver(M)) return // Bypass pref check for observer join
if(!M.mind) return
if(isbrain(owner)) return
//Create a new brain mob
var/mob/living/carbon/brain/caught_soul/vore/brainmob = new(src)
brainmob.gem = src
brainmob.container = src
brainmob.stat = 0
brainmob.silent = FALSE
dead_mob_list -= brainmob
brainmob.ext_deaf = !flag_check(NIF_SC_ALLOW_EARS)
brainmob.ext_blind = !flag_check(NIF_SC_ALLOW_EYES)
brainmob.add_language(LANGUAGE_GALCOM)
brainmobs |= brainmob
//Put the mind and player into the mob
M.mind.transfer_to(brainmob)
brainmob.name = custom_name ? custom_name : brainmob.mind.name
brainmob.real_name = custom_name ? custom_name : brainmob.mind.name
//If we caught our owner, special settings.
if(M == owner && !own_mind) // Need some more sanity if we allow takeover
brainmob.ext_deaf = FALSE
brainmob.ext_blind = FALSE
brainmob.parent_mob = TRUE
own_mind = brainmob.mind
remove_verb(brainmob, /mob/proc/enter_soulcatcher) //No recursive self capturing...
add_verb(brainmob, /mob/living/carbon/brain/caught_soul/vore/proc/transfer_self)
add_verb(brainmob, /mob/living/carbon/brain/caught_soul/vore/proc/reenter_body)
//If they have these values, apply them
if(isliving(M))
var/mob/living/L = M
brainmob.dna = L.dna
brainmob.ooc_notes = L.ooc_notes
brainmob.ooc_notes_likes = L.ooc_notes_likes
brainmob.ooc_notes_dislikes = L.ooc_notes_dislikes
/* Not implemented on virgo
brainmob.ooc_notes_favs = L.ooc_notes_favs
brainmob.ooc_notes_maybes = L.ooc_notes_maybes
brainmob.ooc_notes_style = L.ooc_notes_style
*/
brainmob.timeofhostdeath = L.timeofdeath
if(ishuman(L))
SStranscore.m_backup(brainmob.mind,0) //It does ONE, so medical will hear about it.
//Else maybe they're a joining ghost
else if(isobserver(M))
brainmob.transient = TRUE
qdel(M) //Bye ghost
//Give them a flavortext message
var/message = span_notice("[capture_message][inside_flavor]")
to_chat(brainmob, message)
//Reminder on how this works to host
if(brainmobs.len == 1) //Only spam this on the first one
to_chat(owner, span_notice("Your occupant's messages/actions can only be seen by you, and you can \
send messages that only they can hear/see by using the NSay and NMe verbs (or the *nsay and *nme emotes)."))
//Announce to host and other minds
notify_holder("New mind loaded: [brainmob.name]")
show_vore_fx(brainmob, TRUE)
brainmob.copy_from_prefs_vr(bellies = FALSE)
return TRUE
// Allows to adjust the interior of the soulcatcher
/obj/soulgem/proc/adjust_interior(var/new_flavor)
new_flavor = sanitize(new_flavor, MAX_MESSAGE_LEN * 2)
inside_flavor = new_flavor
notify_holder("Updating environment...")
for(var/mob/living/carbon/brain/caught_soul/vore/CS as anything in brainmobs)
to_chat(CS, span_notice("[transit_message]") + "\n[inside_flavor]")
// Allows to return to the body after being captured by one's own soulcatcher
/obj/soulgem/proc/return_to_body(var/datum/mind)
if(own_mind != mind)
to_chat(src, span_warning("You aren't in your own soulcatcher!"))
return
var/mob/self = null
for(var/mob/mob in brainmobs)
if(mob.mind == mind)
self = mob
break
if(!self)
return
if(owner.mind)
catch_mob(owner, taken_over_name)
self.mind.transfer_to(owner)
own_mind = null
taken_over_name = null
qdel(self)
// Sets the custom messages depending on the input
/obj/soulgem/proc/set_custom_message(var/message, var/target)
message = sanitize(message, MAX_MESSAGE_LEN / 4)
switch(target)
if("capture")
capture_message = message
if("transit")
transit_message = message
if("release")
release_message = message
if("transfer")
transfer_message = message
if("delete")
delete_message = message
// Allows to rename the soulgem
/obj/soulgem/proc/rename(var/new_name)
if(length(new_name) < 3 || length(new_name) > 60)
to_chat(owner, span_warning("Your soulcatcher's name needs to be between 3 and 60 characters long!"))
return
new_name = sanitize(new_name, 60)
name = new_name
// Toggles the given flag
/obj/soulgem/proc/toggle_setting(var/flag)
setting_flags ^= flag
if(flag & SOULGEM_SHOW_VORE_SFX)
soulgem_show_vfx(TRUE)
soulgem_vfx()
if(flag & NIF_SC_BACKUPS)
soulgem_backup()
if(flag & NIF_SC_ALLOW_EARS)
soulgem_hear()
if(flag & NIF_SC_ALLOW_EYES)
soulgem_sight()
if(flag & NIF_SC_PROJECTING)
soulgem_projecting()
if(flag & SOULGEM_SEE_SR_SOULS)
owner.recalculate_vis()
// Checks a single flag, or if all combined flags are true
/obj/soulgem/proc/flag_check(var/flag, var/match_all = FALSE)
if(match_all)
return (setting_flags & flag) == flag
return setting_flags & flag
// Updates the selected soul after an interaction which rleased, deleted or transferred the previous one
/obj/soulgem/proc/update_selected_soul()
if(brainmobs.len > 1)
selected_soul = brainmobs[1]
else
selected_soul = null
// Backup toggling
/obj/soulgem/proc/soulgem_backup()
if(flag_check(NIF_SC_BACKUPS))
notify_holder("External backups enabled.")
else
notify_holder("External backups disabled.")
// Deaf toggling
/obj/soulgem/proc/soulgem_hear()
for(var/mob/living/carbon/brain/caught_soul/L in brainmobs)
L.ext_deaf = !flag_check(NIF_SC_ALLOW_EARS)
if(flag_check(NIF_SC_ALLOW_EARS))
notify_holder("External sounds enabled.")
else
notify_holder("External sounds disabled.")
// Sight toggling
/obj/soulgem/proc/soulgem_sight()
for(var/mob/living/carbon/brain/caught_soul/L in brainmobs)
L.ext_blind = !flag_check(NIF_SC_ALLOW_EYES)
if(flag_check(NIF_SC_ALLOW_EYES))
notify_holder("External vision enabled.")
else
notify_holder("External vision disabled.")
// Projecting toggling
/obj/soulgem/proc/soulgem_projecting()
if(flag_check(NIF_SC_PROJECTING))
notify_holder("AR projecting enabled.")
else
notify_holder("AR projecting disabled.")
// VORE FX Section
// Updates the vore FX signal links to the new given belly
/obj/soulgem/proc/update_linked_belly(var/obj/belly, var/skip_unreg = FALSE)
if(!belly && linked_belly)
UnregisterSignal(linked_belly, COMSIG_BELLY_UPDATE_VORE_FX)
linked_belly = null
return
if(!isbelly(belly))
return
if(!linked_belly)
linked_belly = belly
RegisterSignal(linked_belly, COMSIG_BELLY_UPDATE_VORE_FX, PROC_REF(soulgem_show_vfx))
return
if(belly != linked_belly)
if(!skip_unreg)
UnregisterSignal(linked_belly, COMSIG_BELLY_UPDATE_VORE_FX)
linked_belly = belly
RegisterSignal(linked_belly, COMSIG_BELLY_UPDATE_VORE_FX, PROC_REF(soulgem_show_vfx))
// Handles the vore fx updates for the captured souls
/obj/soulgem/proc/soulgem_show_vfx(var/update, var/severity = 0)
if(linked_belly)
for(var/mob/living/L in brainmobs)
if(flag_check(SOULGEM_SHOW_VORE_SFX))
show_vore_fx(L, update, severity)
else
clear_vore_fx(L)
// Function to show the vore fx overlay
/obj/soulgem/proc/show_vore_fx(var/mob/living/L, var/update, var/severity = 0)
if(!linked_belly || !flag_check(SOULGEM_SHOW_VORE_SFX))
return
if(!istype(L) || L.eyeobj)
return
linked_belly.vore_fx(L, update, severity)
// Function to clear the vore fx overlay
/obj/soulgem/proc/clear_vore_fx(var/mob/M)
M.clear_fullscreen("belly")
if(M.hud_used && !M.hud_used.hud_shown)
M.toggle_hud_vis(TRUE)
// VFX toggling
/obj/soulgem/proc/soulgem_vfx()
if(flag_check(SOULGEM_SHOW_VORE_SFX))
notify_holder("Interior simulation enabled.")
else
notify_holder("Interior simulation disabled.")
// Takeover section
// Give control of the body to the current selected soul
/obj/soulgem/proc/take_control_selected()
if(!selected_soul) return
take_control(selected_soul)
if(owner.mind == own_mind)
own_mind = null
taken_over_name = null
// Give back control of the body to the owner
/obj/soulgem/proc/take_control_owner()
var/mob/self = null
for(var/mob/mob in brainmobs)
if(mob.mind == own_mind)
self = mob
break
if(!self)
return
take_control(self)
own_mind = null
taken_over_name = null
/obj/soulgem/proc/take_control(var/mob/M)
if(!(owner.soulcatcher_pref_flags & SOULCATCHER_ALLOW_CAPTURE) || !(owner.soulcatcher_pref_flags & SOULCATCHER_ALLOW_TAKEOVER)) return
if(!(M.soulcatcher_pref_flags & SOULCATCHER_ALLOW_CAPTURE) || !(M.soulcatcher_pref_flags & SOULCATCHER_ALLOW_TAKEOVER)) return
if(!own_mind)
if(issilicon(owner) || isanimal(owner))
taken_over_name = owner.name
catch_mob(owner, taken_over_name)
taken_over_name = M.name
M.mind.transfer_to(owner)
brainmobs -= M
if(M == selected_soul)
update_selected_soul()
qdel(M)
// Funtion to test if the owner's body has been taken over
/obj/soulgem/proc/is_taken_over()
return (own_mind && owner.mind && owner.mind != own_mind)
// Transfer section to transfer captured souls
// Returns nearby,valid transfer locations as a list
/obj/soulgem/proc/find_transfer_objects()
var/list/valid_trasfer_objects = list(
/obj/item/sleevemate,
/obj/item/mmi
)
var/list/valid_objects = list()
if(isrobot(owner))
var/mob/living/silicon/robot/R = owner
if(istype(R.module_active, /obj/item/sleevemate))
valid_objects += R.module_active
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
if(is_type_in_list(H.get_left_hand(), valid_trasfer_objects))
valid_objects += H.get_left_hand()
if(is_type_in_list(H.get_right_hand(), valid_trasfer_objects))
valid_objects += H.get_right_hand()
for(var/obj/item/I in range(0, get_turf(owner)))
if(is_type_in_list(I, valid_trasfer_objects))
valid_objects += I
for(var/mob/M in range(1, get_turf(owner)))
if(M == owner)
continue
if(!(M.soulcatcher_pref_flags & SOULCATCHER_ALLOW_TRANSFER))
continue
if(M.client && M.soulgem)
valid_objects += M.soulgem
if(!valid_objects.len)
to_chat(owner, span_warning("No valid objects found!"))
return
return valid_objects
// Transfer the selected soul to either a valid object or another soulcatcher
/obj/soulgem/proc/transfer_selected()
if(!selected_soul) return
if(!(selected_soul.soulcatcher_pref_flags & SOULCATCHER_ALLOW_TRANSFER)) return
var/list/valid_objects = find_transfer_objects()
if(!valid_objects || !valid_objects.len)
return
var/obj/target = tgui_input_list(owner, "Select where you want to store the mind into.", "Mind Transfer Target", valid_objects)
transfer_mob_selector(selected_soul, target)
// Transfer selector proc
/obj/soulgem/proc/transfer_mob_selector(var/mob/M, var/obj/target)
if(!M || !target) return
if(istype(target, /obj/soulgem))
transfer_mob_soulcatcher(M, target)
return
transfer_mob(M, target)
// Transfers a captured soul to a valid object (sleevemate, mmi)
/obj/soulgem/proc/transfer_mob(var/mob/M, var/obj/target)
if(is_taken_over()) return
if(!M || !target) return
if(istype(target, /obj/item/sleevemate))
var/obj/item/sleevemate/mate = target
if(!mate.stored_mind)
to_chat(owner, span_notice("You scan yourself to transfer the soul into the [target]!"))
to_chat(M, span_notice("[transfer_message]"))
if(M.mind == own_mind)
own_mind = null
mate.get_mind(M)
else if(istype(target, /obj/item/mmi))
var/obj/item/mmi/mm = target
if(!mm.brainmob || !mm.brainmob.mind)
if(M.mind == own_mind)
own_mind = null
to_chat(owner, span_notice("You transfer the soul into the [target]!"))
to_chat(M, span_notice("[transfer_message]"))
mm.transfer_identity(M)
if(!mm.brainmob.mind && M.mind)
M.mind.transfer_to(mm.brainmob)
else
return
brainmobs -= M
if(M == selected_soul)
update_selected_soul()
qdel(M)
// Transfers a captured soul to another soulcatcher
/obj/soulgem/proc/transfer_mob_soulcatcher(var/mob/living/carbon/brain/caught_soul/vore/M, var/obj/soulgem/gem)
if(is_taken_over()) return
if(!istype(M) || !gem) return
if(!gem.owner) return
if((tgui_alert(gem.owner, "Do you want to allow [owner] to transfer [selected_soul] to your soulcatcher?", "Allow Transfer", list("No", "Yes")) != "Yes"))
return
if(!in_range(gem.owner, owner))
return
if(!(gem.owner.soulcatcher_pref_flags & SOULCATCHER_ALLOW_TRANSFER))
return
if(M.mind == own_mind)
own_mind = null
brainmobs -= M
M.gem = gem
M.container = gem
gem.brainmobs += M
if(M == selected_soul)
update_selected_soul()
// Release section
// Release the selected soul as a ghost
/obj/soulgem/proc/release_selected()
if(!selected_soul) return
if(release_mob(selected_soul))
update_selected_soul()
// Release all captured souls as ghosts
/obj/soulgem/proc/release_mobs()
selected_soul = null
if(!brainmobs.len) return
for(var/mob/M in brainmobs)
release_mob(M)
// Proc to release the soul as ghost, returns TRUE on success
/obj/soulgem/proc/release_mob(var/mob/M)
if(is_taken_over()) return FALSE
to_chat(M, span_notice("[release_message]"))
brainmobs -= M
M.ghostize(FALSE)
qdel(M)
return TRUE
// Delete section to delete captured souls from the soulcatcher
// Delete the selected mob
/obj/soulgem/proc/delete_selected()
if(!selected_soul) return
if(delete_mob(selected_soul))
update_selected_soul()
// Delete all captured mobs
/obj/soulgem/proc/erase_mobs()
if(!brainmobs.len) return
for(var/mob/M in brainmobs)
delete_mob(M)
// The function handling the actual delete, returns TRUE on success
/obj/soulgem/proc/delete_mob(var/mob/M)
if(is_taken_over()) return FALSE
if(!(M.soulcatcher_pref_flags & SOULCATCHER_ALLOW_DELETION))
return release_mob(M)
if(!(M.soulcatcher_pref_flags & SOULCATCHER_ALLOW_DELETION_INSTANT))
if(tgui_alert(M, "Do you really want to allow [owner] to delete you? On decline, you'll be ghosted.", "Allow Deletion", list("No", "Yes"), timeout=1 MINUTES) != "Yes")
return release_mob(M)
to_chat(M, span_danger("[delete_message]"))
brainmobs -= M
var/mob/observer/dead/ghost = M.ghostize(FALSE)
ghost.abandon_mob()
qdel(M)
return TRUE
+245
View File
@@ -0,0 +1,245 @@
/mob/living/carbon/brain/caught_soul/vore
name = "stored soul"
desc = "A soul stored within the predator."
var/obj/soulgem/gem
// Cleaning up the refs during deletion
/mob/living/carbon/brain/caught_soul/vore/Destroy()
if(gem)
gem.notify_holder("Mind unloaded: [name]")
gem.brainmobs -= src
gem = null
if(eyeobj)
QDEL_NULL(eyeobj)
gem.notify_holder("[name] ended SR projection.")
container = null
return ..()
// Handling the automatic transcore backups in a set interval
/mob/living/carbon/brain/caught_soul/vore/Life()
. = ..()
if(QDELETED(src))
return
if(!parent_mob && !transient &&(life_tick % 150 == 0) && gem.setting_flags & NIF_SC_BACKUPS)
SStranscore.m_backup(mind,0) //Passed 0 means "Don't touch the nif fields on the mind record"
if(!client)
return
if(ext_blind)
eye_blind = 5
client.screen.Remove(global_hud.whitense)
overlay_fullscreen("blind", /obj/screen/fullscreen/blind)
else
eye_blind = 0
clear_fullscreen("blind")
if(!gem.flag_check(SOULGEM_SHOW_VORE_SFX))
client.screen.Add(global_hud.whitense)
if(gem.flag_check(SOULGEM_SHOW_VORE_SFX))
client.screen.Remove(global_hud.whitense)
// Say proc for captures souls
/mob/living/carbon/brain/caught_soul/vore/say(var/message, var/datum/language/speaking = null, var/whispering = 0)
if(silent) return FALSE
gem.use_speech(message, src, eyeobj)
// Emote proc for captured souls
/mob/living/carbon/brain/caught_soul/vore/custom_emote(var/m_type, var/message)
if(silent) return FALSE
gem.use_emote(message,src,eyeobj)
/mob/living/carbon/brain/caught_soul/vore/me_verb_subtle(message as message)
if(silent) return FALSE
gem.use_emote(message,src,eyeobj,TRUE)
/mob/living/carbon/brain/caught_soul/vore/whisper(message as text)
if(silent) return FALSE
gem.use_speech(message,src,eyeobj,TRUE)
// Resist override, only returning a message that one is stuck for now
/mob/living/carbon/brain/caught_soul/vore/resist()
set name = "Resist"
set category = "IC.Game"
to_chat(src, span_warning("There's no way out! You're stuck inside your predator."))
// Allows the predator to enter their own soulcatcher
/mob/proc/enter_soulcatcher()
set name = "Enter Soulcatcher"
set desc = "Enter your own Soulcatcher."
set category = "IC.Vore"
if(!soulgem) // Only sanity...
return
if(soulgem && soulgem.flag_check(SOULGEM_ACTIVE))
var/to_use_custom_name = null
if(issilicon(src) || isanimal(src))
to_use_custom_name = src.name
soulgem.catch_mob(src, to_use_custom_name)
// Speak to the captured souls within the own soulcatcher
/mob/proc/nsay_vore(message as message)
set name = "NSay Vore"
set desc = "Speak into your Soulcatcher."
src.nsay_vore_act(message)
/mob/proc/nsay_vore_ch()
set name = "NSay Vore CH"
set desc = "Speak into your Soulcatcher."
set category = "IC.Vore"
src.nsay_vore_act()
/mob/proc/nsay_vore_act(var/message)
if(stat != CONSCIOUS)
to_chat(src, span_warning("You can't use NSay Vore while unconscious."))
return
if(!soulgem) // Only sanity...
return
var/obj/soulgem/gem = soulgem
if(!gem.brainmobs.len)
to_chat(src, span_warning("You need a devoured soul to use NSay Vore."))
return
if(!message)
message = tgui_input_text(usr, "Type a message to say.","Speak into Soulcatcher", multiline=TRUE)
if(message)
var/sane_message = sanitize(message)
gem.use_speech(sane_message, src)
// Emote to the captured souls within the soulcatcher
/mob/proc/nme_vore(message as message)
set name = "NMe Vore"
set desc = "Emote into your Soulcatcher."
src.nme_vore_act(message)
/mob/proc/nme_vore_ch()
set name = "NMe Vore CH"
set desc = "Emote into your Soulcatcher."
set category = "IC.Vore"
src.nme_vore_act()
/mob/proc/nme_vore_act(var/message)
if(stat != CONSCIOUS)
to_chat(src, span_warning("You can't use NMe Vore while unconscious."))
return
if(!soulgem) // Only sanity...
return
var/obj/soulgem/gem = soulgem
if(!gem.brainmobs.len)
to_chat(src, span_warning("You need a devoured soul to use NMe Vore."))
return
if(!message)
message = tgui_input_text(usr, "Type an action to perform.","Emote into Soulcatcher", multiline=TRUE)
if(message)
var/sane_message = sanitize(message)
gem.use_emote(sane_message, src)
// SR projecting mob
/mob/observer/eye/ar_soul/vore
plane = PLANE_SOULCATCHER
// SR project as captured soul
/mob/living/carbon/brain/caught_soul/vore/ar_project()
set name = "AR/SR Project"
set desc = "Project your form into Augmented Reality for those around your predator with the appearance of your loaded character."
set category = "Soulcatcher"
if(eyeobj)
to_chat(src, span_warning("You're already projecting in SR!"))
return
if(!(gem.setting_flags & NIF_SC_PROJECTING))
to_chat(src, span_warning("Projecting from this NIF has been disabled!"))
return
if(!client || !client.prefs)
return //Um...
eyeobj = new/mob/observer/eye/ar_soul/vore(src, gem.owner)
gem.notify_holder("[src] now SR projecting.")
gem.clear_vore_fx(src)
// Jump to the owner as SR projection
/mob/living/carbon/brain/caught_soul/vore/jump_to_owner()
set name = "Jump to Owner"
set desc = "Jump your projection back to the owner of the soulcatcher you're inside."
set category = "Soulcatcher"
if(!eyeobj)
to_chat(src, span_warning("You're not projecting into SR!"))
return
eyeobj.forceMove(get_turf(gem))
// End SR projecting and return to the soulcatcher containing the soul
/mob/living/carbon/brain/caught_soul/vore/reenter_soulcatcher()
set name = "Re-enter Soulcatcher"
set desc = "Leave SR projection and drop back into the soulcatcher."
set category = "Soulcatcher"
if(!eyeobj)
to_chat(src, span_warning("You're not projecting into SR!"))
return
QDEL_NULL(eyeobj)
gem.notify_holder("[src] ended SR projection.")
gem.show_vore_fx(src, TRUE)
/mob/living/carbon/brain/caught_soul/vore/nsay_brain()
set name = "NSay"
set desc = "Speak to your Soulcatcher (circumventing SR speaking)."
set category = "Soulcatcher"
var/message = tgui_input_text(usr, "Type a message to say.","Speak into Soulcatcher", multiline=TRUE)
if(message)
var/sane_message = sanitize(message)
gem.use_speech(sane_message, src)
/mob/living/carbon/brain/caught_soul/vore/nme_brain()
set name = "NMe"
set desc = "Emote to your Soulcatcher (circumventing SR speaking)."
set category = "Soulcatcher"
var/message = tgui_input_text(usr, "Type an action to perform.","Emote into Soulcatcher", multiline=TRUE)
if(message)
var/sane_message = sanitize(message)
gem.use_emote(sane_message, src)
// Allows the captured owner to transfer themselves to valid nearby objects
/mob/living/carbon/brain/caught_soul/vore/proc/transfer_self()
set name = "Transfer Self"
set desc = "Transfer youself while being in your own soulcatcher into a nearby Sleevemate or MMI."
set category = "Soulcatcher"
if(eyeobj)
to_chat(src, span_warning("You can't do that while SR projecting!"))
return
if(gem.own_mind != mind)
to_chat(src, span_warning("You aren't in your own soulcatcher!"))
return
var/list/valid_objects = gem.find_transfer_objects()
if(!valid_objects || !valid_objects.len)
return
var/obj/target = tgui_input_list(src, "Select where you want to store your own mind into.", "Mind Transfer Target", valid_objects)
gem.transfer_mob_selector(src, target)
// Allows the owner to reenter the body after being caught or having given away control
/mob/living/carbon/brain/caught_soul/vore/proc/reenter_body()
set name = "Re-enter Body"
set desc = "Return to your body after self capturing."
set category = "Soulcatcher"
if(eyeobj)
to_chat(src, span_warning("You can't do that while SR projecting!"))
return
gem.return_to_body(mind)
@@ -0,0 +1,52 @@
/mob/observer/dead/verb/soulcatcherjoin()
set category = "Ghost.Join"
set name = "Join Into Soulcatcher(Vore)"
set desc = "Select a player with enabled Soulcatcher to join."
var/list/valid_players = list()
for(var/mob/player in player_list)
if(player.soulgem?.flag_check(SOULGEM_ACTIVE | SOULGEM_CATCHING_GHOSTS, TRUE))
valid_players += player
if(!valid_players.len)
to_chat(src, span_warning("No valid players found."))
return
var/picked = tgui_input_list(usr, "Pick a friend with enabled Soulcatcher to join into. Harrass strangers, get banned.","Select a player", valid_players)
if(!picked)
return
if(!ismob(picked))
to_chat(src, span_warning("Target is no mob."))
return
var/mob/M = picked
var/obj/soulgem/gem = M.soulgem
if(!gem?.flag_check(SOULGEM_ACTIVE))
to_chat(src, span_warning("[M] has no enabled Soulcatcher."))
return
var/req_time = world.time
gem.notify_holder("Transient mindstate detected, analyzing...")
sleep(15) //So if they are typing they get interrupted by sound and message, and don't type over the box
if(tgui_alert(M,"[src.name] wants to join into your Soulcatcher.","Soulcatcher Request",list("Deny","Allow"), timeout=1 MINUTES) != "Allow")
to_chat(src, span_warning("[M] has denied your request."))
return
if((world.time - req_time) > 1 MINUTES)
to_chat(M, span_warning("The request had already expired. (1 minute waiting max)"))
return
//Final check since we waited for input a couple times.
if(M && src && src.key && !M.stat && gem?.flag_check(SOULGEM_ACTIVE | SOULGEM_CATCHING_GHOSTS, TRUE))
if(!mind) //No mind yet, aka haven't played in this round.
mind = new(key)
mind.name = name
mind.current = src
mind.active = TRUE
gem.catch_mob(src) //This will result in us being deleted so...
+14 -7
View File
@@ -38,21 +38,28 @@
if(CanStumbleVore(M))
visible_message(span_vwarning("[M] flops carelessly into [src]!"))
perform_the_nom(src,M,src,src.vore_selected,1)
else if(M.CanStumbleVore(src))
return
if(M.CanStumbleVore(src))
visible_message(span_vwarning("[M] flops carelessly into [src]!"))
perform_the_nom(M,src,M,M.vore_selected,1)
else if(istype(S) && S.species.lightweight == 1)
return
if(istype(S) && S.species.lightweight == 1)
visible_message(span_vwarning("[M] carelessly bowls [src] over!"))
M.forceMove(get_turf(src))
M.apply_damage(0.5, BRUTE)
Weaken(4)
stop_flying()
apply_damage(0.5, BRUTE)
else if(round(weight) > 474)
return
if(round(weight) > 474)
var/throwtarget = get_edge_target_turf(M, reverse_direction(M.dir))
visible_message(span_vwarning("[M] bounces backwards off of [src]'s plush body!"))
M.throw_at(throwtarget, 2, 1)
else
visible_message(span_vwarning("[M] trips over [src]!"))
M.forceMove(get_turf(src))
M.apply_damage(1, BRUTE)
return
visible_message(span_vwarning("[M] trips over [src]!"))
M.forceMove(get_turf(src))
M.apply_damage(1, BRUTE)
+23 -25
View File
@@ -61,6 +61,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/slip_vore = TRUE
var/throw_vore = TRUE
var/food_vore = TRUE
var/consume_liquid_belly = FALSE //starting off because if someone is into that, they'll toggle it first time they get the error. Otherway around would be more pref breaky.
var/digest_pain = TRUE
@@ -72,7 +73,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/vore_sprite_multiply = list("stomach" = FALSE, "taur belly" = FALSE)
var/allow_mind_transfer = FALSE
//CHOMP stuff
var/phase_vore = TRUE
var/noisy_full = FALSE
var/receive_reagents = FALSE
@@ -91,7 +91,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/belly_rub_target = null
var/soulcatcher_pref_flags = 0
var/list/soulcatcher_prefs = list()
//CHOMP stuff end
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
@@ -214,6 +213,7 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
slip_vore = json_from_file["slip_vore"]
food_vore = json_from_file["food_vore"]
throw_vore = json_from_file["throw_vore"]
consume_liquid_belly = json_from_file["consume_liquid_belly"]
stumble_vore = json_from_file["stumble_vore"]
digest_pain = json_from_file["digest_pain"]
nutrition_message_visible = json_from_file["nutrition_message_visible"]
@@ -225,7 +225,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
vore_sprite_color = json_from_file["vore_sprite_color"]
allow_mind_transfer = json_from_file["allow_mind_transfer"]
//CHOMP stuff Start
phase_vore = json_from_file["phase_vore"]
latejoin_vore = json_from_file["latejoin_vore"]
latejoin_prey = json_from_file["latejoin_prey"]
@@ -248,7 +247,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
belly_rub_target = json_from_file["belly_rub_target"]
soulcatcher_pref_flags = json_from_file["soulcatcher_pref_flags"]
soulcatcher_prefs = json_from_file["soulcatcher_prefs"]
//CHOMP stuff End
//Quick sanitize
if(isnull(digestable))
@@ -295,6 +293,8 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
stumble_vore = TRUE
if(isnull(food_vore))
food_vore = TRUE
if(isnull(consume_liquid_belly))
consume_liquid_belly = FALSE
if(isnull(digest_pain))
digest_pain = TRUE
if(isnull(nutrition_message_visible))
@@ -340,7 +340,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
if(isnull(allow_mind_transfer))
allow_mind_transfer = FALSE
//CHOMP stuff Start
if(isnull(phase_vore))
phase_vore = TRUE
if(isnull(latejoin_vore))
@@ -377,7 +376,6 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
soulcatcher_pref_flags = 0
if(isnull(soulcatcher_prefs))
soulcatcher_prefs = list()
//CHOMP stuff End
return TRUE
@@ -399,28 +397,28 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"vore_smell" = vore_smell,
"permit_healbelly" = permit_healbelly,
"noisy" = noisy,
"noisy_full" = noisy_full, //CHOMPedit
"noisy_full" = noisy_full,
"selective_preference" = selective_preference,
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
"can_be_drop_pred" = can_be_drop_pred,
"latejoin_vore" = latejoin_vore, //CHOMPedit
"latejoin_prey" = latejoin_prey, //CHOMPedit
"latejoin_vore" = latejoin_vore,
"latejoin_prey" = latejoin_prey,
"allow_spontaneous_tf" = allow_spontaneous_tf,
"step_mechanics_pref" = step_mechanics_pref,
"pickup_pref" = pickup_pref,
"belly_prefs" = belly_prefs,
"receive_reagents" = receive_reagents, //CHOMPedit
"give_reagents" = give_reagents, //CHOMPedit
"apply_reagents" = apply_reagents, //CHOMPedit
"receive_reagents" = receive_reagents,
"give_reagents" = give_reagents,
"apply_reagents" = apply_reagents,
"autotransferable" = autotransferable,
"drop_vore" = drop_vore,
"slip_vore" = slip_vore,
"stumble_vore" = stumble_vore,
"throw_vore" = throw_vore,
"allow_mind_transfer" = allow_mind_transfer,
"phase_vore" = phase_vore, //CHOMPedit
"food_vore" = food_vore,
"phase_vore" = phase_vore,
"consume_liquid_belly" = consume_liquid_belly,
"digest_pain" = digest_pain,
"nutrition_message_visible" = nutrition_message_visible,
"nutrition_messages" = nutrition_messages,
@@ -429,17 +427,17 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"eating_privacy_global" = eating_privacy_global,
"vore_sprite_color" = vore_sprite_color,
"allow_mimicry" = allow_mimicry,
"vore_sprite_multiply" = vore_sprite_multiply, //CHOMPEdit
"strip_pref" = strip_pref, //CHOMPEdit
"no_latejoin_vore_warning" = no_latejoin_vore_warning, //CHOMPEdit
"no_latejoin_prey_warning" = no_latejoin_prey_warning, //CHOMPEdit
"no_latejoin_vore_warning_time" = no_latejoin_vore_warning_time, //CHOMPEdit
"no_latejoin_prey_warning_time" = no_latejoin_prey_warning_time, //CHOMPEdit
"no_latejoin_vore_warning_persists" = no_latejoin_vore_warning_persists, //CHOMPEdit
"no_latejoin_prey_warning_persists" = no_latejoin_prey_warning_persists, //CHOMPEdit
"belly_rub_target" = belly_rub_target, //CHOMPEdit
"soulcatcher_pref_flags" = soulcatcher_pref_flags, //CHOMPAdd
"soulcatcher_prefs" = soulcatcher_prefs //CHOMPAdd
"vore_sprite_multiply" = vore_sprite_multiply,
"strip_pref" = strip_pref,
"no_latejoin_vore_warning" = no_latejoin_vore_warning,
"no_latejoin_prey_warning" = no_latejoin_prey_warning,
"no_latejoin_vore_warning_time" = no_latejoin_vore_warning_time,
"no_latejoin_prey_warning_time" = no_latejoin_prey_warning_time,
"no_latejoin_vore_warning_persists" = no_latejoin_vore_warning_persists,
"no_latejoin_prey_warning_persists" = no_latejoin_prey_warning_persists,
"belly_rub_target" = belly_rub_target,
"soulcatcher_pref_flags" = soulcatcher_pref_flags,
"soulcatcher_prefs" = soulcatcher_prefs
)
//List to JSON
-6
View File
@@ -1,6 +0,0 @@
//CHOMP - liquid bellies //These variables have been moved to belly_obj_ch.dm, keeping comments here for reference
/*
/datum/vore_look
var/show_liquids = FALSE
var/show_fullness_messages = FALSE
*/
File diff suppressed because it is too large Load Diff