mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-27 23:29:10 +01:00
[MIRROR] Panel port test [IDB IGNORE] (#10447)
Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
This commit is contained in:
co-authored by
Kashargul
parent
2439279209
commit
2f698760c7
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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],"%","%")
|
||||
|
||||
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],"%","%")
|
||||
|
||||
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
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 .
|
||||
@@ -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
|
||||
@@ -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...
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user