diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm
index 9d9409acf0..5898f882a0 100644
--- a/code/game/objects/items/pet_carrier.dm
+++ b/code/game/objects/items/pet_carrier.dm
@@ -22,6 +22,10 @@
var/occupant_weight = 0
var/max_occupants = 3 //Hard-cap so you can't have infinite mice or something in one carrier
var/max_occupant_weight = MOB_SIZE_SMALL //This is calculated from the mob sizes of occupants
+ var/entrance_name = "door" //name of the entrance to the item
+ var/escape_time = 200 //how long it takes for mobs above small sizes to escape (for small sizes, its randomly 1.5 to 2x this)
+ var/load_time = 30 //how long it takes for mobs to be loaded into the pet carrier
+ var/has_lock_sprites = TRUE //whether to load the lock overlays or not
/obj/item/pet_carrier/Destroy()
if(occupants.len)
@@ -51,20 +55,20 @@
else
. += "It has nothing inside."
if(user.canUseTopic(src))
- . += "Activate it in your hand to [open ? "close" : "open"] its door."
+ . += "Activate it in your hand to [open ? "close" : "open"] its [entrance_name]."
if(!open)
- . += "Alt-click to [locked ? "unlock" : "lock"] its door."
+ . += "Alt-click to [locked ? "unlock" : "lock"] its [entrance_name]."
/obj/item/pet_carrier/attack_self(mob/living/user)
if(open)
- to_chat(user, "You close [src]'s door.")
+ to_chat(user, "You close [src]'s [entrance_name].")
playsound(user, 'sound/effects/bin_close.ogg', 50, TRUE)
open = FALSE
else
if(locked)
to_chat(user, "[src] is locked!")
return
- to_chat(user, "You open [src]'s door.")
+ to_chat(user, "You open [src]'s [entrance_name].")
playsound(user, 'sound/effects/bin_open.ogg', 50, TRUE)
open = TRUE
update_icon()
@@ -86,7 +90,7 @@
if(user.a_intent == INTENT_HARM)
return ..()
if(!open)
- to_chat(user, "You need to open [src]'s door!")
+ to_chat(user, "You need to open [src]'s [entrance_name]!")
return
if(target.mob_size > max_occupant_weight)
if(ishuman(target))
@@ -94,7 +98,7 @@
if(iscatperson(H))
to_chat(user, "You'd need a lot of catnip and treats, plus maybe a laser pointer, for that to work.")
else
- to_chat(user, "Humans, generally, do not fit into pet carriers.")
+ to_chat(user, "Humans, generally, do not fit into [name]s.")
else
to_chat(user, "You get the feeling [target] isn't meant for a [name].")
return
@@ -110,8 +114,8 @@
remove_occupant(user)
return
else if(!locked)
- loc.visible_message("[user] pushes open the door to [src]!", \
- "[user] pushes open the door of [src]!")
+ loc.visible_message("[user] pushes open the [entrance_name] to [src]!", \
+ "[user] pushes open the [entrance_name] of [src]!")
open = TRUE
update_icon()
return
@@ -122,9 +126,9 @@
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
if(user.mob_size <= MOB_SIZE_SMALL)
- to_chat(user, "You poke a limb through [src]'s bars and start fumbling for the lock switch... (This will take some time.)")
- to_chat(loc, "You see [user] reach through the bars and fumble for the lock switch!")
- if(!do_after(user, rand(300, 400), target = user) || open || !locked || !(user in occupants))
+ to_chat(user, "You begin to try escaping the [src] and start fumbling for the lock switch... (This will take some time.)")
+ to_chat(loc, "You see [user] attempting to unlock the [src]!")
+ if(!do_after(user, rand(escape_time * 1.5, escape_time * 2), target = user) || open || !locked || !(user in occupants))
return
loc.visible_message("[user] flips the lock switch on [src] by reaching through!", null, null, null, user)
to_chat(user, "Bingo! The lock pops open!")
@@ -132,12 +136,12 @@
playsound(src, 'sound/machines/boltsup.ogg', 30, TRUE)
update_icon()
else
- loc.visible_message("[src] starts rattling as something pushes against the door!", null, null, null, user)
+ loc.visible_message("[src] starts rattling as something pushes against the [entrance_name]!", null, null, null, user)
to_chat(user, "You start pushing out of [src]... (This will take about 20 seconds.)")
- if(!do_after(user, 200, target = user) || open || !locked || !(user in occupants))
+ if(!do_after(user, escape_time, target = user) || open || !locked || !(user in occupants))
return
loc.visible_message("[user] shoves out of [src]!", null, null, null, user)
- to_chat(user, "You shove open [src]'s door against the lock's resistance and fall out!")
+ to_chat(user, "You shove open [src]'s [entrance_name] against the lock's resistance and fall out!")
locked = FALSE
open = TRUE
update_icon()
@@ -151,7 +155,7 @@
/obj/item/pet_carrier/update_overlays()
. = ..()
- if(!open)
+ if(!open && has_lock_sprites)
. += "[locked ? "" : "un"]locked"
/obj/item/pet_carrier/MouseDrop(atom/over_atom)
@@ -170,7 +174,7 @@
user.visible_message("[user] starts loading [target] into [src].", \
"You start loading [target] into [src]...", null, null, target)
to_chat(target, "[user] starts loading you into [user.p_their()] [name]!")
- if(!do_mob(user, target, 30))
+ if(!do_mob(user, target, load_time))
return
if(target in occupants)
return
@@ -197,4 +201,25 @@
occupant_weight -= occupant.mob_size
occupant.setDir(SOUTH)
+//bluespace jar, a reskin of the pet carrier that can fit people
+/obj/item/pet_carrier/bluespace
+ name = "bluespace jar"
+ desc = "A jar, that seems to be bigger on the inside, somehow allowing lifeforms to fit through its narrow entrance."
+ icon = 'icons/obj/pet_carrier.dmi'
+ icon_state = "bluespace_jar_open"
+ item_state = "bluespace_jar"
+ lefthand_file = ""
+ righthand_file = ""
+ max_occupant_weight = MOB_SIZE_HUMAN //can fit people, like a bluespace bodybag!
+ entrance_name = "lid"
+ w_class = WEIGHT_CLASS_NORMAL //it can fit in bags, like a bluespace bodybag!
+ has_lock_sprites = FALSE //jar doesn't show the regular lock overlay
+ custom_materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 600)
+
+obj/item/pet_carrier/bluespace/update_icon_state()
+ if(open)
+ icon_state = initial(icon_state)
+ else
+ icon_state = "bluespace_jar"
+
#undef pet_carrier_full
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm
index ee515d321f..9169dc6a3d 100644
--- a/code/game/objects/items/storage/bags.dm
+++ b/code/game/objects/items/storage/bags.dm
@@ -326,6 +326,7 @@
w_class = WEIGHT_CLASS_BULKY
flags_1 = CONDUCT_1
custom_materials = list(/datum/material/iron=3000)
+ var/max_items = 7
/obj/item/storage/bag/tray/ComponentInitialize()
. = ..()
@@ -333,6 +334,7 @@
STR.max_w_class = WEIGHT_CLASS_NORMAL
STR.can_hold = typecacheof(list(/obj/item/reagent_containers/food, /obj/item/reagent_containers/glass, /datum/reagent/consumable, /obj/item/kitchen/knife, /obj/item/kitchen/rollingpin, /obj/item/kitchen/fork, /obj/item/storage/box)) //Should cover: Bottles, Beakers, Bowls, Booze, Glasses, Food, Kitchen Tools, and ingredient boxes.
STR.insert_preposition = "on"
+ STR.max_items = max_items
/obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user)
. = ..()
@@ -373,6 +375,14 @@
. = ..()
update_icon()
+//bluespace tray, holds more items
+/obj/item/storage/bag/tray/bluespace
+ name = "bluespace tray"
+ icon_state = "bluespace_tray"
+ desc = "A tray created using bluespace technology to fit more food on it."
+ max_items = 14 // twice as many items
+ custom_materials = list(/datum/material/iron = 2000, /datum/material/bluespace = 500)
+
/*
* Chemistry bag
*/
diff --git a/code/modules/research/designs/bluespace_designs.dm b/code/modules/research/designs/bluespace_designs.dm
index 0d11b8e887..336dc4ec8e 100644
--- a/code/modules/research/designs/bluespace_designs.dm
+++ b/code/modules/research/designs/bluespace_designs.dm
@@ -95,3 +95,23 @@
build_path = /obj/item/storage/bag/ore/holding
category = list("Bluespace Designs")
departmental_flags = DEPARTMENTAL_FLAG_CARGO
+
+/datum/design/bluespace_tray
+ name = "Bluespace Tray"
+ desc = "A tray created using bluespace technology to fit more food on it."
+ id = "bluespace_tray"
+ build_type = PROTOLATHE
+ build_path = /obj/item/storage/bag/tray/bluespace
+ materials = list(/datum/material/iron = 2000, /datum/material/bluespace = 500)
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SERVICE
+
+/datum/design/bluespace_carrier
+ name = "Bluespace Jar"
+ desc = "A jar used to contain creatures, using the power of bluespace."
+ id = "bluespace_carrier"
+ build_type = PROTOLATHE
+ build_path = /obj/item/pet_carrier/bluespace
+ materials = list(/datum/material/glass = 1000, /datum/material/bluespace = 600)
+ category = list("Bluespace Designs")
+ departmental_flags = DEPARTMENTAL_FLAG_SCIENCE
\ No newline at end of file
diff --git a/code/modules/research/techweb/nodes/bluespace_nodes.dm b/code/modules/research/techweb/nodes/bluespace_nodes.dm
index 3aacc9fec5..f8e5eeb0a4 100644
--- a/code/modules/research/techweb/nodes/bluespace_nodes.dm
+++ b/code/modules/research/techweb/nodes/bluespace_nodes.dm
@@ -37,7 +37,7 @@
display_name = "Bluespace Pockets"
description = "Studies into the mysterious alternate dimension known as bluespace and how to place items in the threads of reality."
prereq_ids = list("adv_power", "adv_bluespace", "adv_biotech", "adv_plasma")
- design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag", "duffelbag_holding")
+ design_ids = list( "bluespacebodybag","bag_holding", "bluespace_pod", "borg_upgrade_trashofholding", "blutrash", "satchel_holding", "bsblood_bag", "duffelbag_holding", "bluespace_tray", "bluespace_carrier")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5500)
/datum/techweb_node/bluespace_portal
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index 641715fd87..b0fa8bda2a 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/pet_carrier.dmi b/icons/obj/pet_carrier.dmi
index 340636056c..32fca90f0b 100644
Binary files a/icons/obj/pet_carrier.dmi and b/icons/obj/pet_carrier.dmi differ