New advanced Egg Release mechanics.

This commit is contained in:
Chompstation Bot
2021-02-01 19:35:41 +00:00
parent 710c6b5021
commit d3c7cc6040
13 changed files with 378 additions and 55 deletions

View File

@@ -108,30 +108,66 @@ var/global/list/fancy_release_sounds = list(
)
var/global/list/global_vore_egg_types = list(
"Unathi" = UNATHI_EGG,
"Tajaran" = TAJARAN_EGG,
"Akula" = AKULA_EGG,
"Skrell" = SKRELL_EGG,
"Nevrean" = NEVREAN_EGG,
"Sergal" = SERGAL_EGG,
"Human" = HUMAN_EGG,
"Slime" = SLIME_EGG,
"Egg" = EGG_EGG,
"Xenochimera" = XENOCHIMERA_EGG,
"Xenomorph" = XENOMORPH_EGG)
"Unathi",
"Tajara",
"Akula",
"Skrell",
"Sergal",
"Nevrean",
"Human",
"Slime",
"Egg",
"Xenochimera",
"Xenomorph",
"Chocolate",
"Boney",
"Slime glob",
"Chicken",
"Synthetic",
"Cooking error",
"Escape pod",
"Web cocoon",
"Bug cocoon",
"Rock",
"Yellow",
"Blue",
"Green",
"Orange",
"Purple",
"Red",
"Rainbow",
"Spotted pink")
var/global/list/tf_vore_egg_types = list(
"Unathi" = /obj/structure/closet/secure_closet/egg/unathi,
"Tajara" = /obj/structure/closet/secure_closet/egg/tajaran,
"Akula" = /obj/structure/closet/secure_closet/egg/shark,
"Skrell" = /obj/structure/closet/secure_closet/egg/skrell,
"Sergal" = /obj/structure/closet/secure_closet/egg/sergal,
"Nevrean" = /obj/structure/closet/secure_closet/egg/nevrean,
"Human" = /obj/structure/closet/secure_closet/egg/human,
"Slime" = /obj/structure/closet/secure_closet/egg/slime,
"Egg" = /obj/structure/closet/secure_closet/egg,
"Xenochimera" = /obj/structure/closet/secure_closet/egg/scree,
"Xenomorph" = /obj/structure/closet/secure_closet/egg/xenomorph)
"Unathi" = /obj/item/weapon/storage/vore_egg/unathi,
"Tajara" = /obj/item/weapon/storage/vore_egg/tajaran,
"Akula" = /obj/item/weapon/storage/vore_egg/shark,
"Skrell" = /obj/item/weapon/storage/vore_egg/skrell,
"Sergal" = /obj/item/weapon/storage/vore_egg/sergal,
"Nevrean" = /obj/item/weapon/storage/vore_egg/nevrean,
"Human" = /obj/item/weapon/storage/vore_egg/human,
"Slime" = /obj/item/weapon/storage/vore_egg/slime,
"Egg" = /obj/item/weapon/storage/vore_egg,
"Xenochimera" = /obj/item/weapon/storage/vore_egg/scree,
"Xenomorph" = /obj/item/weapon/storage/vore_egg/xenomorph,
"Chocolate" = /obj/item/weapon/storage/vore_egg/chocolate,
"Boney" = /obj/item/weapon/storage/vore_egg/owlpellet,
"Slime glob" = /obj/item/weapon/storage/vore_egg/slimeglob,
"Chicken" = /obj/item/weapon/storage/vore_egg/chicken,
"Synthetic" = /obj/item/weapon/storage/vore_egg/synthetic,
"Cooking error" = /obj/item/weapon/storage/vore_egg/badrecipe,
"Escape pod" = /obj/item/weapon/storage/vore_egg/escapepod,
"Web cocoon" = /obj/item/weapon/storage/vore_egg/cocoon,
"Bug cocoon" = /obj/item/weapon/storage/vore_egg/bugcocoon,
"Rock" = /obj/item/weapon/storage/vore_egg/rock,
"Yellow" = /obj/item/weapon/storage/vore_egg/yellow,
"Blue" = /obj/item/weapon/storage/vore_egg/blue,
"Green" = /obj/item/weapon/storage/vore_egg/green,
"Orange" = /obj/item/weapon/storage/vore_egg/orange,
"Purple" = /obj/item/weapon/storage/vore_egg/purple,
"Red" = /obj/item/weapon/storage/vore_egg/red,
"Rainbow" = /obj/item/weapon/storage/vore_egg/rainbow,
"Spotted pink" = /obj/item/weapon/storage/vore_egg/pinkspots)
var/global/list/edible_trash = list(/obj/item/broken_device,
/obj/item/clothing/accessory/collar, //TFF 10/7/19 - add option to nom collars,
@@ -182,7 +218,8 @@ var/global/list/edible_trash = list(/obj/item/broken_device,
/obj/item/weapon/storage/fancy/cigarettes,
/obj/item/weapon/storage/fancy/crayons,
/obj/item/weapon/storage/fancy/egg_box,
/obj/item/weapon/storage/wallet)
/obj/item/weapon/storage/wallet,
/obj/item/weapon/storage/vore_egg)
var/global/list/contamination_flavors = list(
"Generic" = contamination_flavors_generic,

View File

@@ -0,0 +1,182 @@
//Item type vorepanel egg release containers.
/obj/item/weapon/storage/vore_egg
name = "egg"
desc = "It's an egg; it's smooth to the touch." //This is the default egg.
icon = 'icons/obj/egg_new_vr.dmi'
icon_state = "egg"
var/open_egg_icon = 'icons/obj/egg_open_vr.dmi'
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_storage.dmi',
slot_r_hand_str = 'icons/mob/items/righthand_storage.dmi',
)
w_class = 2
max_w_class = 0
show_messages = 0
allow_quick_empty = TRUE
use_sound = 'sound/items/drop/flesh.ogg'
/obj/item/weapon/storage/vore_egg/open(mob/user as mob)
icon = open_egg_icon
..()
/obj/item/weapon/storage/vore_egg/proc/hatch(mob/living/user as mob)
visible_message("<span class='danger'>\The [src] begins to shake as something pushes out from within!</span>")
animate_shake()
if(do_after(user, 50))
if(use_sound)
playsound(src, src.use_sound, 50, 0, -5)
animate_shake()
drop_contents()
icon = open_egg_icon
/obj/item/weapon/storage/vore_egg/proc/animate_shake()
var/init_px = pixel_x
var/shake_dir = pick(-1, 1)
animate(src, transform=turn(matrix(), 8*shake_dir), pixel_x=init_px + 2*shake_dir, time=1)
animate(transform=null, pixel_x=init_px, time=6, easing=ELASTIC_EASING)
/obj/item/weapon/storage/vore_egg/unathi
name = "unathi egg"
desc = "Some species of Unathi apparently lay soft-shelled eggs!"
icon_state = "egg_unathi"
/obj/item/weapon/storage/vore_egg/nevrean
name = "nevrean egg"
desc = "Most Nevreans lay hard-shelled eggs!"
icon_state = "egg_nevrean"
/obj/item/weapon/storage/vore_egg/human
name = "human egg"
desc = "Some humans lay eggs that are--wait, what?"
icon_state = "egg_human"
/obj/item/weapon/storage/vore_egg/tajaran
name = "tajaran egg"
desc = "Apparently that's what a Tajaran egg looks like. Weird."
icon_state = "egg_tajaran"
/obj/item/weapon/storage/vore_egg/skrell
name = "skrell egg"
desc = "Its soft and squishy"
icon_state = "egg_skrell"
/obj/item/weapon/storage/vore_egg/shark
name = "akula egg"
desc = "Its soft and slimy to the touch"
icon_state = "egg_akula"
/obj/item/weapon/storage/vore_egg/sergal
name = "sergal egg"
desc = "An egg with a slightly fuzzy exterior, and a hard layer beneath."
icon_state = "egg_sergal"
/obj/item/weapon/storage/vore_egg/slime
name = "slime egg"
desc = "An egg with a soft and squishy interior, coated with slime."
icon_state = "egg_slime"
/obj/item/weapon/storage/vore_egg/special //Not actually used, but the sprites are in, and it's there in case any admins need to spawn in the egg for any specific reasons.
name = "special egg"
desc = "This egg has a very unique look to it."
icon_state = "egg_unique"
/obj/item/weapon/storage/vore_egg/scree
name = "Chimera egg"
desc = "...You don't know what type of creature laid this egg."
icon_state = "egg_scree"
/obj/item/weapon/storage/vore_egg/xenomorph
name = "Xenomorph egg"
desc = "Some type of pitch black egg. It has a slimy exterior coating."
icon_state = "egg_xenomorph"
/obj/item/weapon/storage/vore_egg/chocolate
name = "chocolate egg"
desc = "Delicious. May contain a choking hazard."
icon_state = "egg_chocolate"
/obj/item/weapon/storage/vore_egg/owlpellet
name = "boney egg"
desc = "Can an egg shell be made of bones and hair?"
icon_state = "egg_pellet"
/obj/item/weapon/storage/vore_egg/slimeglob
name = "glob of slime"
desc = "Very squishy."
icon_state = "egg_slimeglob"
/obj/item/weapon/storage/vore_egg/chicken
name = "chicken egg"
desc = "Looks like chickens come in all sizes and shapes."
icon_state = "egg_chicken"
/obj/item/weapon/storage/vore_egg/synthetic
name = "synthetic egg"
desc = "Can robots lay eggs?"
icon_state = "egg_synthetic"
/obj/item/weapon/storage/vore_egg/badrecipe
name = "Burned mess"
desc = "Someone didn't cook this egg quite right..."
icon_state = "egg_badrecipe"
/obj/item/weapon/storage/vore_egg/escapepod
name = "small escape pod"
desc = "Someone left in a hurry."
icon_state = "egg_escapepod"
/obj/item/weapon/storage/vore_egg/cocoon
name = "web cocoon"
desc = "It straight up smells like spiders in here."
icon_state = "egg_cocoon"
/obj/item/weapon/storage/vore_egg/bugcocoon
name = "bug cocoon"
desc = "Metamorphosis!"
icon_state = "egg_bugcocoon"
/obj/item/weapon/storage/vore_egg/rock
name = "rock egg"
desc = "It looks like a small boulder."
icon_state = "egg_rock"
/obj/item/weapon/storage/vore_egg/yellow
name = "yellow egg"
desc = "It is a nice yellow egg."
icon_state = "egg_yellow"
/obj/item/weapon/storage/vore_egg/blue
name = "blue egg"
desc = "It is a nice blue egg."
icon_state = "egg_blue"
/obj/item/weapon/storage/vore_egg/green
name = "green egg"
desc = "It is a nice green egg."
icon_state = "egg_green"
/obj/item/weapon/storage/vore_egg/orange
name = "orange egg"
desc = "It is a nice orange egg."
icon_state = "egg_orange"
/obj/item/weapon/storage/vore_egg/purple
name = "purple egg"
desc = "It is a nice purple egg."
icon_state = "egg_purple"
/obj/item/weapon/storage/vore_egg/red
name = "red egg"
desc = "It is a nice red egg."
icon_state = "egg_red"
/obj/item/weapon/storage/vore_egg/rainbow
name = "rainbow egg"
desc = "It looks so colorful."
icon_state = "egg_rainbow"
/obj/item/weapon/storage/vore_egg/pinkspots
name = "spotted pink egg"
desc = "It is a cute pink egg with white spots."
icon_state = "egg_pinkspots"

View File

@@ -36,11 +36,11 @@
icon_opened = "egg_unathi_open"
/obj/structure/closet/secure_closet/egg/nevrean
name = "nevarean egg"
desc = "Most Nevareans lay hard-shelled eggs!"
icon_state = "egg_nevarean"
icon_closed = "egg_nevarean"
icon_opened = "egg_nevarean_open"
name = "nevrean egg"
desc = "Most Nevreans lay hard-shelled eggs!"
icon_state = "egg_nevrean"
icon_closed = "egg_nevrean"
icon_opened = "egg_nevrean_open"
/obj/structure/closet/secure_closet/egg/human
name = "human egg"

View File

@@ -1,15 +1,3 @@
var/UNATHI_EGG = "Unathi"
var/TAJARAN_EGG = "Tajaran"
var/AKULA_EGG = "Akula"
var/SKRELL_EGG = "Skrell"
var/SERGAL_EGG = "Sergal"
var/HUMAN_EGG = "Human"
var/NEVREAN_EGG = "nevrean"
var/SLIME_EGG = "Slime"
var/EGG_EGG = "Egg"
var/XENOCHIMERA_EGG = "Xenochimera"
var/XENOMORPH_EGG = "Xenomorph"
// Define a place to save appearance in character setup
/datum/preferences
var/vore_egg_type = "Egg" //The egg type they have.
@@ -26,8 +14,7 @@ var/XENOMORPH_EGG = "Xenomorph"
S["vore_egg_type"] << pref.vore_egg_type
/datum/category_item/player_setup_item/vore/egg/sanitize_character()
var/valid_vore_egg_types = global_vore_egg_types
pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, valid_vore_egg_types, initial(pref.vore_egg_type))
pref.vore_egg_type = sanitize_inlist(pref.vore_egg_type, global_vore_egg_types, initial(pref.vore_egg_type))
/datum/category_item/player_setup_item/vore/egg/copy_to_mob(var/mob/living/carbon/human/character)
character.vore_egg_type = pref.vore_egg_type
@@ -44,7 +31,7 @@ var/XENOMORPH_EGG = "Xenomorph"
var/list/vore_egg_types = global_vore_egg_types
var/selection = input(user, "Choose your character's egg type:", "Character Preference", pref.vore_egg_type) as null|anything in vore_egg_types
if(selection)
pref.vore_egg_type = vore_egg_types[selection]
pref.vore_egg_type = selection
return TOPIC_REFRESH
else
return

View File

@@ -38,6 +38,9 @@
var/fancy_vore = FALSE // Using the new sounds?
var/is_wet = TRUE // Is this belly's insides made of slimy parts?
var/wet_loop = TRUE // Does the belly have a fleshy loop playing?
var/obj/item/weapon/storage/vore_egg/ownegg // Is this belly creating an egg?
var/egg_type = "egg" // Default egg type and path.
var/egg_path = /obj/item/weapon/storage/vore_egg
//I don't think we've ever altered these lists. making them static until someone actually overrides them somewhere.
//Actual full digest modes
@@ -341,6 +344,11 @@
if (!(M in contents))
return 0 // They weren't in this belly anyway
for(var/mob/living/L in M.contents)
L.muffled = 0
for(var/obj/item/weapon/holder/H in M.contents)
H.held_mob.muffled = 0
//Place them into our drop_location
M.forceMove(drop_location())
@@ -601,9 +609,10 @@
//Handle a mob struggling
// Called from /mob/living/carbon/relaymove()
/obj/belly/proc/relay_resist(mob/living/R)
/obj/belly/proc/relay_resist(mob/living/R, obj/item/C)
if (!(R in contents))
return // User is not in this belly
if(!C)
return // User is not in this belly
R.setClickCooldown(50)
@@ -612,9 +621,13 @@
to_chat(owner, "<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
if(do_after(R, escapetime, owner, incapacitation_flags = INCAPACITATION_DEFAULT & ~INCAPACITATION_RESTRAINED))
if((owner.stat || escapable) && (R.loc == src)) //Can still escape?
release_specific_contents(R)
return
if((owner.stat || escapable)) //Can still escape?
if(C)
release_specific_contents(C)
return
if(R.loc == src)
release_specific_contents(R)
return
else if(R.loc != src) //Aren't even in the belly. Quietly fail.
return
else //Belly became inescapable or mob revived
@@ -657,6 +670,13 @@
to_chat(R, "<span class='warning'>You start to climb out of \the [lowertext(name)].</span>")
to_chat(owner, "<span class='warning'>Someone is attempting to climb out of your [lowertext(name)]!</span>")
if(do_after(R, escapetime))
if(escapable && C)
release_specific_contents(C)
to_chat(R,"<span class='warning'>Your struggles successfully cause [owner] to squeeze your container out of their \the [lowertext(name)].</span>")
to_chat(owner,"<span class='warning'>[C] suddenly slips out of your [lowertext(name)]!</span>")
for(var/mob/M in hearers(4, owner))
M.show_message("<span class='warning'>[C] suddenly slips out of [owner]'s [lowertext(name)]!</span>", 2)
return
if((escapable) && (R.loc == src) && !R.absorbed) //Does the owner still have escapable enabled?
release_specific_contents(R)
to_chat(R,"<span class='warning'>You climb out of \the [lowertext(name)].</span>")
@@ -687,6 +707,9 @@
to_chat(R, "<span class='warning'>Your attempt to escape [lowertext(name)] has failed and your struggles only results in you sliding into [owner]'s [transferlocation]!</span>")
to_chat(owner, "<span class='warning'>Someone slid into your [transferlocation] due to their struggling inside your [lowertext(name)]!</span>")
if(C)
transfer_contents(C, dest_belly)
return
transfer_contents(R, dest_belly)
return

View File

@@ -14,6 +14,9 @@ GLOBAL_LIST_INIT(digest_modes, list())
/datum/digest_mode/proc/process_mob(obj/belly/B, mob/living/L)
return null
/datum/digest_mode/proc/handle_atoms(obj/belly/B, list/touchable_atoms)
return FALSE
/datum/digest_mode/digest
id = DM_DIGEST
noise_chance = 50
@@ -156,8 +159,69 @@ GLOBAL_LIST_INIT(digest_modes, list())
// E G G
/datum/digest_mode/egg
id = DM_EGG
/*
/datum/digest_mode/egg/process_mob(obj/belly/B, mob/living/carbon/human/H)
if(!istype(H) || H.stat == DEAD || H.absorbed)
return null
B.put_in_egg(H, 1)
B.put_in_egg(H, 1)*/
/datum/digest_mode/egg/handle_atoms(obj/belly/B, list/touchable_atoms)
var/list/egg_contents = list()
for(var/E in touchable_atoms)
if(istype(E, /obj/item/weapon/storage/vore_egg)) // Don't egg other eggs.
continue
if(isliving(E))
var/mob/living/L = E
if(L.absorbed)
continue
egg_contents += L
if(isitem(E))
egg_contents += E
if(egg_contents.len)
if(!B.ownegg)
if(B.owner.vore_egg_type in tf_vore_egg_types)
B.egg_type = B.owner.vore_egg_type
B.egg_path = tf_vore_egg_types[B.egg_type]
B.ownegg = new B.egg_path(B)
for(var/atom/movable/C in egg_contents)
if(isitem(C) && egg_contents.len == 1) //Only egging one item
var/obj/item/I = C
B.ownegg.w_class = I.w_class
B.ownegg.max_storage_space = B.ownegg.w_class
I.forceMove(B.ownegg)
B.ownegg.icon_scale_x = 0.2 * B.ownegg.w_class
B.ownegg.icon_scale_y = 0.2 * B.ownegg.w_class
B.ownegg.update_transform()
egg_contents -= I
B.ownegg = null
return
if(isliving(C))
var/mob/living/M = C
B.ownegg.w_class = M.size_multiplier * 4 //Egg size and weight scaled to match occupant.
var/obj/item/weapon/holder/H = new M.holder_type(B.ownegg)
H.held_mob = M
M.forceMove(H)
H.sync(M)
B.ownegg.max_storage_space = H.w_class
B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class
B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class
B.ownegg.update_transform()
egg_contents -= M
if(B.ownegg.w_class > 4)
B.ownegg.slowdown = B.ownegg.w_class - 4
B.ownegg = null
return
C.forceMove(B.ownegg)
if(isitem(C))
var/obj/item/I = C
B.ownegg.w_class += I.w_class //Let's assume a regular outfit can reach total w_class of 16.
B.ownegg.calibrate_size()
B.ownegg.orient2hud()
B.ownegg.w_class = clamp(B.ownegg.w_class * 0.25, 1, 8) //A total w_class of 16 will result in a backpack sized egg.
B.ownegg.icon_scale_x = 0.25 * B.ownegg.w_class
B.ownegg.icon_scale_y = 0.25 * B.ownegg.w_class
B.ownegg.update_transform()
if(B.ownegg.w_class > 4)
B.ownegg.slowdown = B.ownegg.w_class - 4
B.ownegg = null
return

View File

@@ -32,6 +32,14 @@
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)
@@ -55,11 +63,6 @@
continue // don't give digesty messages to indigestible people
to_chat(M, "<span class='notice'>[pick(EL)]</span>")
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(!digestion_noise_chance)
digestion_noise_chance = DM.noise_chance

View File

@@ -929,10 +929,16 @@
qdel(host.vore_selected)
host.vore_selected = host.vore_organs[1]
. = TRUE
<<<<<<< HEAD
if("b_vorespawn_blacklist")
host.vore_selected.vorespawn_blacklist = !host.vore_selected.vorespawn_blacklist
. = TRUE
||||||| parent of 5dd99a1257... Merge pull request #9622 from Verkister/eastercameearly
=======
>>>>>>> 5dd99a1257... Merge pull request #9622 from Verkister/eastercameearly
if(.)
unsaved_changes = TRUE

View File

@@ -48,3 +48,23 @@
..()
for(var/mob/living/carbon/human/I in contents)
item_state = lowertext(I.species.name)
//Egg features.
/obj/item/weapon/holder/attack_hand(mob/living/user as mob)
if(istype(src.loc, /obj/item/weapon/storage/vore_egg)) //Don't scoop up the egged mob
src.pickup(user)
user.drop_from_inventory(src)
return
..()
/obj/item/weapon/holder/container_resist(mob/living/held)
if(!istype(src.loc, /obj/item/weapon/storage/vore_egg))
..()
else
var/obj/item/weapon/storage/vore_egg/E = src.loc
if(isbelly(E.loc))
var/obj/belly/B = E.loc
B.relay_resist(held, E)
return
E.hatch(held)
return

BIN
icons/obj/egg_new_vr.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
icons/obj/egg_open_vr.dmi Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -1428,6 +1428,7 @@
#include "code\game\objects\items\weapons\storage\boxes_ch.dm"
#include "code\game\objects\items\weapons\storage\boxes_vr.dm"
#include "code\game\objects\items\weapons\storage\briefcase.dm"
#include "code\game\objects\items\weapons\storage\egg_vr.dm"
#include "code\game\objects\items\weapons\storage\fancy.dm"
#include "code\game\objects\items\weapons\storage\fancy_ch.dm"
#include "code\game\objects\items\weapons\storage\fancy_yw.dm"