diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm
index 67da8a999ff..6bdd16357cc 100644
--- a/code/_helpers/unsorted.dm
+++ b/code/_helpers/unsorted.dm
@@ -818,23 +818,6 @@ var/global/list/common_tools = list(
return 1
return 0
-//Returns 1 if the given item is capable of popping things like balloons, inflatable barriers, or cutting police tape.
-/proc/can_puncture(obj/item/W as obj) // For the record, WHAT THE HELL IS THIS METHOD OF DOING IT?
- if(!W)
- return 0
- if(W.sharp)
- return 1
- return ( \
- W.sharp || \
- W.isscrewdriver() || \
- W.ispen() || \
- W.iswelder() || \
- istype(W, /obj/item/flame/lighter/zippo) || \
- istype(W, /obj/item/flame/match) || \
- istype(W, /obj/item/clothing/mask/smokable/cigarette) || \
- istype(W, /obj/item/shovel) \
- )
-
/proc/is_surgery_tool(obj/item/W)
return istype(W, /obj/item/surgery)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 9962fc95f85..47c8d508711 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -911,4 +911,12 @@ modules/mob/living/carbon/human/life.dm if you die, you will be zoomed out.
/obj/item/dropped()
..()
if(flags & HELDMAPTEXT)
- check_maptext()
\ No newline at end of file
+ check_maptext()
+
+// used to check whether the item is capable of popping things like balloons, inflatable barriers, or cutting police tape.
+/obj/item/proc/can_puncture()
+ if(sharp || edge)
+ return TRUE
+ if(isFlameSource())
+ return TRUE
+ return FALSE
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 10ef0df8ecf..0a5470bf408 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -174,7 +174,7 @@
return
/obj/item/toy/balloon/attackby(obj/item/W as obj, mob/user as mob)
- if(can_puncture(W))
+ if(W.can_puncture())
burst()
/obj/item/toy/balloon/latex
diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm
index 85c82f9e2fb..dd843e0ea4f 100644
--- a/code/game/objects/items/weapons/policetape.dm
+++ b/code/game/objects/items/weapons/policetape.dm
@@ -214,7 +214,7 @@ var/list/tape_roll_applications = list()
breaktape(null, user)
/obj/item/tape/proc/breaktape(obj/item/W as obj, mob/user as mob)
- if(user.a_intent == I_HELP && ((!can_puncture(W) && src.allowed(user))))
+ if(user.a_intent == I_HELP && ((!W.can_puncture() && src.allowed(user))))
to_chat(user, SPAN_NOTICE("You can't break \the [src] with that!"))
return
user.visible_message(SPAN_NOTICE("[user] breaks \the [src]!"))
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 800d751b448..af920ce7269 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -22,6 +22,7 @@
var/max_w_class = ITEMSIZE_NORMAL //Max size of objects that this object can store (in effect only if can_hold isn't set)
var/max_storage_space = 8 //The sum of the storage costs of all the items in this storage item.
var/storage_slots //The number of storage slots in this container.
+ var/force_column_number // the number of columns the storage item will appear to have
var/obj/screen/storage/boxes
var/obj/screen/storage/storage_start //storage UI
var/obj/screen/storage/storage_continue
@@ -294,7 +295,7 @@
space_orient_objs(numbered_contents, defer_overlays)
else
var/row_num = 0
- var/col_count = min(7,storage_slots) -1
+ var/col_count = force_column_number ? force_column_number : min(7, storage_slots) - 1
if (adjusted_contents > 7)
row_num = round((adjusted_contents-1) / 7) // 7 is the maximum allowed width.
src.slot_orient_objs(row_num, col_count, numbered_contents)
diff --git a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
index 3b9f1c6f209..a36a37bb7c8 100644
--- a/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/utility_closets.dm
@@ -55,9 +55,7 @@
new /obj/item/clothing/suit/space/emergency(src)
new /obj/item/clothing/head/helmet/space/emergency(src)
new /obj/item/device/oxycandle(src)
- new /obj/item/inflatable/door(src)
- new /obj/item/inflatable/wall(src)
- new /obj/item/inflatable/wall(src)
+ new /obj/item/storage/bag/inflatable/emergency(src)
if ("all")
new /obj/item/storage/toolbox/emergency(src)
new /obj/item/tank/emergency_oxygen/engi(src)
@@ -74,9 +72,7 @@
new /obj/item/device/oxycandle(src)
new /obj/item/airbubble(src)
new /obj/item/airbubble(src)
- new /obj/item/inflatable/door(src)
- new /obj/item/inflatable/wall(src)
- new /obj/item/inflatable/wall(src)
+ new /obj/item/storage/bag/inflatable/emergency(src)
/obj/structure/closet/emcloset/legacy/fill()
..()
diff --git a/code/game/objects/structures/inflatable.dm b/code/game/objects/structures/inflatable.dm
index 099f4a7f467..f5a1b7fe7ff 100644
--- a/code/game/objects/structures/inflatable.dm
+++ b/code/game/objects/structures/inflatable.dm
@@ -1,17 +1,20 @@
+#define STATE_CLOSED 0
+#define STATE_OPEN 1
+
/obj/item/inflatable
name = "inflatable"
desc_info = "Inflate by using it in your hand. The inflatable barrier will inflate on your tile. To deflate it, use the 'deflate' verb."
w_class = ITEMSIZE_SMALL
- icon = 'icons/obj/inflatable.dmi'
+ icon = 'icons/obj/contained_items/tools/inflatables.dmi'
var/deploy_path = null
/obj/item/inflatable/attack_self(mob/user)
if(!deploy_path)
return
- playsound(loc, 'sound/items/zip.ogg', 75, 1)
- to_chat(user, "You inflate \the [src].")
+ playsound(loc, 'sound/items/zip.ogg', 75, TRUE)
+ to_chat(user, SPAN_NOTICE("You inflate \the [src]."))
var/obj/structure/inflatable/R = new deploy_path(user.loc)
- src.transfer_fingerprints_to(R)
+ transfer_fingerprints_to(R)
R.add_fingerprint(user)
qdel(src)
@@ -21,7 +24,7 @@
icon_state = "folded_wall"
deploy_path = /obj/structure/inflatable/wall
-/obj/item/inflatable/door/
+/obj/item/inflatable/door
name = "inflatable door"
desc = "A folded membrane which rapidly expands into a simple door on activation."
icon_state = "folded_door"
@@ -31,40 +34,43 @@
name = "inflatable"
desc = "An inflated membrane. Do not puncture."
desc_info = "To remove these safely, use the 'deflate' verb. Hitting these with any objects will probably puncture and break it forever."
- density = 1
- anchored = 1
- opacity = 0
- icon = 'icons/obj/inflatable.dmi'
+ icon = 'icons/obj/contained_items/tools/inflatables.dmi'
icon_state = "wall"
+ density = TRUE
+ anchored = TRUE
atmos_canpass = CANPASS_DENSITY
+ var/deflating = FALSE
var/undeploy_path = null
+ var/torn_path = null
var/health = 50.0
/obj/structure/inflatable/wall
name = "inflatable wall"
undeploy_path = /obj/item/inflatable/wall
+ torn_path = /obj/item/inflatable/torn
-/obj/structure/inflatable/New(location)
- ..()
- update_nearby_tiles(need_rebuild=1)
+/obj/structure/inflatable/Initialize(mapload)
+ . = ..()
+ update_nearby_tiles(need_rebuild = TRUE)
/obj/structure/inflatable/Destroy()
update_nearby_tiles()
return ..()
/obj/structure/inflatable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- return 0
+ return FALSE
/obj/structure/inflatable/bullet_act(var/obj/item/projectile/Proj)
var/proj_damage = Proj.get_structure_damage()
- if(!proj_damage) return
+ if(!proj_damage)
+ return
health -= proj_damage
..()
if(health <= 0)
- deflate(1)
+ deflate(TRUE)
return
/obj/structure/inflatable/ex_act(severity)
@@ -73,54 +79,72 @@
qdel(src)
return
if(2.0)
- deflate(1)
+ deflate(TRUE)
return
if(3.0)
if(prob(50))
- deflate(1)
+ deflate(TRUE)
return
-/obj/structure/inflatable/attack_hand(mob/user as mob)
+/obj/structure/inflatable/attack_hand(mob/user)
add_fingerprint(user)
return
-/obj/structure/inflatable/attackby(obj/item/W as obj, mob/user as mob)
- if(!istype(W) || istype(W, /obj/item/inflatable_dispenser)) return
+/obj/structure/inflatable/attackby(obj/item/W, mob/user)
+ if(!istype(W) || istype(W, /obj/item/inflatable_dispenser))
+ return
+ if(deflating)
+ return
- if (can_puncture(W))
- visible_message("[user] pierces [src] with [W]!")
- deflate(1)
- if(W.damtype == BRUTE || W.damtype == BURN)
+ if(W.can_puncture())
+ user.visible_message(SPAN_DANGER("[user] pierces \the [src] with \the [W]!"), SPAN_WARNING("You pierce \the [src] with \the [W]!"))
+ deflate(TRUE)
+ else if(W.damtype == BRUTE || W.damtype == BURN)
hit(W.force)
..()
- return
-/obj/structure/inflatable/proc/hit(var/damage, var/sound_effect = 1)
+/obj/structure/inflatable/proc/hit(var/damage, var/sound_effect = TRUE)
health = max(0, health - damage)
if(sound_effect)
playsound(loc, 'sound/effects/glass_hit.ogg', 75, 1)
if(health <= 0)
- deflate(1)
+ deflate(TRUE)
/obj/structure/inflatable/CtrlClick()
hand_deflate()
-/obj/structure/inflatable/proc/deflate(var/violent=0)
- playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
+/obj/structure/inflatable/proc/deflate(var/violent = FALSE)
+ if(deflating)
+ return
+ playsound(loc, 'sound/machines/hiss.ogg', 75, TRUE)
if(violent)
- visible_message("[src] rapidly deflates!")
- var/obj/item/inflatable/torn/R = new /obj/item/inflatable/torn(loc)
- src.transfer_fingerprints_to(R)
- qdel(src)
+ if(!torn_path)
+ return
+ deflating = TRUE
+ visible_message(SPAN_WARNING("\The [src] rapidly deflates!"))
+ var/matrix/M = new
+ M.Scale(0.6)
+ M.Turn(pick(-40, 40))
+ animate(src, 0.2 SECONDS, transform = M)
+ addtimer(CALLBACK(src, .proc/post_tear), 0.2 SECONDS)
else
if(!undeploy_path)
return
- visible_message("\The [src] slowly deflates.")
- addtimer(CALLBACK(src, .proc/post_deflate), 26)
+ deflating = TRUE
+ visible_message(SPAN_NOTICE("\The [src] slowly deflates."))
+ var/matrix/M = new
+ M.Scale(0.6)
+ animate(src, 2.6 SECONDS, transform = M)
+ addtimer(CALLBACK(src, .proc/post_deflate), 2.6 SECONDS)
/obj/structure/inflatable/proc/post_deflate()
- var/obj/item/inflatable/R = new undeploy_path(src.loc)
- src.transfer_fingerprints_to(R)
+ var/obj/item/inflatable/R = new undeploy_path(loc)
+ transfer_fingerprints_to(R)
+ qdel(src)
+
+/obj/structure/inflatable/proc/post_tear()
+ var/obj/item/inflatable/torn/R = new torn_path(loc)
+ transfer_fingerprints_to(R)
qdel(src)
/obj/structure/inflatable/verb/hand_deflate()
@@ -138,11 +162,11 @@
health -= damage
user.do_attack_animation(src)
if(health <= 0)
- user.visible_message("[user] [attack_verb] open the [src]!")
- addtimer(CALLBACK(src, .proc/deflate, 1), 1)
+ user.visible_message(SPAN_DANGER("[user] [attack_verb] open the [src]!"))
+ INVOKE_ASYNC(src, .proc/deflate, TRUE)
else
- user.visible_message("[user] [attack_verb] at [src]!")
- return 1
+ user.visible_message(SPAN_DANGER("[user] [attack_verb] at [src]!"))
+ return TRUE
/obj/structure/inflatable/door //Based on mineral door code
name = "inflatable door"
@@ -154,17 +178,18 @@
icon_state = "door_closed"
undeploy_path = /obj/item/inflatable/door
+ torn_path = /obj/item/inflatable/door/torn
- var/state = 0 //closed, 1 == open
- var/isSwitchingStates = 0
+ var/state = STATE_CLOSED
+ var/isSwitchingStates = FALSE
-/obj/structure/inflatable/door/attack_ai(mob/user as mob) //those aren't machinery, they're just big fucking slabs of a mineral
+/obj/structure/inflatable/door/attack_ai(mob/user)
if(isAI(user)) //so the AI can't open it
return
else if(isrobot(user) && Adjacent(user)) //but cyborgs can
return TryToSwitchState(user)
-/obj/structure/inflatable/door/attack_hand(mob/user as mob)
+/obj/structure/inflatable/door/attack_hand(mob/user)
return TryToSwitchState(user)
/obj/structure/inflatable/door/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
@@ -174,17 +199,12 @@
return !opacity
return !density
-/obj/structure/inflatable/door/proc/TryToSwitchState(atom/user)
- if(isSwitchingStates) return
- if(ismob(user))
- var/mob/M = user
- if(M.client)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(!C.handcuffed)
- SwitchState()
- else
- SwitchState()
+/obj/structure/inflatable/door/proc/TryToSwitchState(mob/user)
+ if(isSwitchingStates)
+ return
+ if(use_check_and_message(user))
+ return
+ SwitchState()
/obj/structure/inflatable/door/proc/SwitchState()
if(state)
@@ -195,29 +215,33 @@
/obj/structure/inflatable/door/proc/Open()
set waitfor = FALSE
+
if(isSwitchingStates)
return
- isSwitchingStates = 1
+ isSwitchingStates = TRUE
+ density = FALSE
+ state = STATE_OPEN
flick("door_opening",src)
- sleep(10)
- density = 0
- opacity = 0
- state = 1
+ addtimer(CALLBACK(src, .proc/ResetOpen), 1 SECOND)
+
+/obj/structure/inflatable/door/proc/ResetOpen()
update_icon()
- isSwitchingStates = 0
+ isSwitchingStates = FALSE
/obj/structure/inflatable/door/proc/Close()
set waitfor = FALSE
+
if(isSwitchingStates)
return
- isSwitchingStates = 1
- flick("door_closing",src)
- sleep(10)
- density = 1
- opacity = 0
- state = 0
+ isSwitchingStates = TRUE
+ flick("door_closing", src)
+ addtimer(CALLBACK(src, .proc/ResetClose), 1 SECOND)
+
+/obj/structure/inflatable/door/proc/ResetClose()
+ density = TRUE
+ state = STATE_CLOSED
update_icon()
- isSwitchingStates = 0
+ isSwitchingStates = FALSE
/obj/structure/inflatable/door/update_icon()
if(state)
@@ -225,52 +249,45 @@
else
icon_state = "door_closed"
-/obj/structure/inflatable/door/deflate(var/violent=0)
- playsound(loc, 'sound/machines/hiss.ogg', 75, 1)
- if(violent)
- visible_message("[src] rapidly deflates!")
- var/obj/item/inflatable/door/torn/R = new /obj/item/inflatable/door/torn(loc)
- src.transfer_fingerprints_to(R)
- qdel(src)
- else
- visible_message("[src] slowly deflates.")
- addtimer(CALLBACK(src, .proc/post_deflate), 26)
-
/obj/item/inflatable/torn
name = "torn inflatable wall"
desc = "A folded membrane which rapidly expands into a large cubical shape on activation. It is too torn to be usable."
- icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_wall_torn"
- attack_self(mob/user)
- to_chat(user, "The inflatable wall is too torn to be inflated!")
- add_fingerprint(user)
+/obj/item/inflatable/torn/attack_self(mob/user)
+ to_chat(user, SPAN_NOTICE("The inflatable wall is too torn to be inflated!"))
+ add_fingerprint(user)
/obj/item/inflatable/door/torn
name = "torn inflatable door"
desc = "A folded membrane which rapidly expands into a simple door on activation. It is too torn to be usable."
- icon = 'icons/obj/inflatable.dmi'
icon_state = "folded_door_torn"
- attack_self(mob/user)
- to_chat(user, "The inflatable door is too torn to be inflated!")
- add_fingerprint(user)
+/obj/item/inflatable/door/torn/attack_self(mob/user)
+ to_chat(user, SPAN_NOTICE("The inflatable door is too torn to be inflated!"))
+ add_fingerprint(user)
-/obj/item/storage/briefcase/inflatable
+/obj/item/storage/bag/inflatable
name = "inflatable barrier box"
desc = "Contains inflatable walls and doors."
+ icon = 'icons/obj/contained_items/tools/inflatables.dmi'
icon_state = "inf_box"
- item_state = "box"
+ item_state = "inf_box"
+ contained_sprite = TRUE
w_class = ITEMSIZE_NORMAL
+ display_contents_with_number = TRUE
max_storage_space = 28
+ force_column_number = 3 // we want 4 slots to appear, so 3 columns + 1 free (to insert stuff)
+ storage_slots = 14
can_hold = list(/obj/item/inflatable)
+ starts_with = list(/obj/item/inflatable/door = 5, /obj/item/inflatable/wall = 7)
- New()
- ..()
- new /obj/item/inflatable/door(src)
- new /obj/item/inflatable/door(src)
- new /obj/item/inflatable/door(src)
- new /obj/item/inflatable/wall(src)
- new /obj/item/inflatable/wall(src)
- new /obj/item/inflatable/wall(src)
- new /obj/item/inflatable/wall(src)
+ use_sound = 'sound/items/storage/briefcase.ogg'
+ drop_sound = 'sound/items/drop/backpack.ogg'
+ pickup_sound = 'sound/items/pickup/backpack.ogg'
+
+/obj/item/storage/bag/inflatable/emergency
+ starts_with = list(/obj/item/inflatable/door = 2, /obj/item/inflatable/wall = 3)
+
+#undef STATE_CLOSED
+#undef STATE_OPEN
\ No newline at end of file
diff --git a/code/modules/cargo/bounties/assistant.dm b/code/modules/cargo/bounties/assistant.dm
index c4dcf074f69..52af12ab11f 100644
--- a/code/modules/cargo/bounties/assistant.dm
+++ b/code/modules/cargo/bounties/assistant.dm
@@ -6,7 +6,7 @@
required_count = 4
random_count = 1
wanted_types = list(/obj/item/storage/briefcase)
- exclude_types = list(/obj/item/storage/briefcase/inflatable, /obj/item/storage/briefcase/crimekit)
+ exclude_types = list(/obj/item/storage/briefcase/crimekit)
/datum/bounty/item/assistant/lung
name = "Lungs"
diff --git a/code/modules/cargo/random_stock/t1_common.dm b/code/modules/cargo/random_stock/t1_common.dm
index b00692985c2..8b541fe6b17 100644
--- a/code/modules/cargo/random_stock/t1_common.dm
+++ b/code/modules/cargo/random_stock/t1_common.dm
@@ -171,7 +171,7 @@ STOCK_ITEM_COMMON(weldgear, 2)
new /obj/item/reagent_containers/weldpack(L)
STOCK_ITEM_COMMON(inflatable, 3)
- new /obj/item/storage/briefcase/inflatable(L)
+ new /obj/item/storage/bag/inflatable(L)
STOCK_ITEM_COMMON(wheelchair, 1)
//Wheelchair is not dense so it doesnt NEED a clear tile, but it looks a little silly to
diff --git a/code/modules/clothing/spacesuits/rig/suits/ert.dm b/code/modules/clothing/spacesuits/rig/suits/ert.dm
index ad1e7b181de..483fa5af7a1 100644
--- a/code/modules/clothing/spacesuits/rig/suits/ert.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/ert.dm
@@ -24,7 +24,7 @@
allowed = list(
/obj/item/device/flashlight, /obj/item/tank, /obj/item/device/t_scanner, /obj/item/rfd/construction, /obj/item/crowbar, \
/obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/device/multitool, \
- /obj/item/device/radio, /obj/item/device/analyzer,/obj/item/storage/briefcase/inflatable, /obj/item/melee/baton, /obj/item/gun, \
+ /obj/item/device/radio, /obj/item/device/analyzer, /obj/item/storage/bag/inflatable, /obj/item/melee/baton, /obj/item/gun, \
/obj/item/storage/firstaid, /obj/item/reagent_containers/hypospray, /obj/item/roller,/obj/item/material/twohanded/fireaxe)
initial_modules = list(
/obj/item/rig_module/ai_container,
diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm
index 9a98955e3d9..7a7fd7b9311 100644
--- a/code/modules/clothing/spacesuits/rig/suits/station.dm
+++ b/code/modules/clothing/spacesuits/rig/suits/station.dm
@@ -128,7 +128,7 @@
helm_type = /obj/item/clothing/head/helmet/space/rig/eva
glove_type = /obj/item/clothing/gloves/rig/eva
- allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction,/obj/item/material/twohanded/fireaxe,/obj/item/storage/backpack/cell)
+ allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction,/obj/item/material/twohanded/fireaxe,/obj/item/storage/backpack/cell)
req_access = list()
req_one_access = list()
@@ -177,7 +177,7 @@
helm_type = /obj/item/clothing/head/helmet/space/rig/ce
glove_type = /obj/item/clothing/gloves/rig/ce
- allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/backpack/cell,/obj/item/storage/toolbox)
+ allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/backpack/cell,/obj/item/storage/toolbox,/obj/item/storage/bag/inflatable)
req_access = list()
req_one_access = list()
@@ -338,7 +338,7 @@
offline_slowdown = 4
offline_vision_restriction = TINT_HEAVY
- allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/briefcase/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction)
+ allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/inflatable,/obj/item/device/t_scanner,/obj/item/rfd/construction)
req_access = list()
req_one_access = list()
diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm
index 3a46a27e672..8538f7eee0f 100644
--- a/code/modules/clothing/spacesuits/void/station.dm
+++ b/code/modules/clothing/spacesuits/void/station.dm
@@ -37,7 +37,7 @@
bio = ARMOR_BIO_SHIELDED,
rad = ARMOR_RAD_RESISTANT
)
- allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction)
+ allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/bag/inflatable)
//Mining rig
/obj/item/clothing/head/helmet/space/void/mining
@@ -192,7 +192,7 @@
bio = ARMOR_BIO_SHIELDED,
rad = ARMOR_RAD_SMALL
)
- allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction)
+ allowed = list(/obj/item/device/flashlight,/obj/item/tank,/obj/item/device/suit_cooling_unit,/obj/item/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/pickaxe,/obj/item/material/twohanded/fireaxe,/obj/item/rfd/construction,/obj/item/storage/bag/inflatable)
max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE + 10000 // It is a suit designed for fire, enclosed
//Head of Security
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index aaf22fef08d..9711f0592eb 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -182,7 +182,7 @@ obj/item/clothing/suit/apron/overalls/blue
blood_overlay_type = "armor"
allowed = list (/obj/item/device/analyzer, /obj/item/device/flashlight, /obj/item/device/multitool, /obj/item/device/pipe_painter, /obj/item/device/radio, /obj/item/device/t_scanner, \
/obj/item/crowbar, /obj/item/screwdriver, /obj/item/weldingtool, /obj/item/wirecutters, /obj/item/wrench, /obj/item/tank/emergency_oxygen, \
- /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering)
+ /obj/item/clothing/mask/gas, /obj/item/taperoll/engineering, /obj/item/storage/bag/inflatable)
body_parts_covered = UPPER_TORSO
var/opened
diff --git a/html/changelogs/geeves-inflatables_buff.yml b/html/changelogs/geeves-inflatables_buff.yml
new file mode 100644
index 00000000000..d702b2b092c
--- /dev/null
+++ b/html/changelogs/geeves-inflatables_buff.yml
@@ -0,0 +1,14 @@
+author: Geeves
+
+delete-after: True
+
+changes:
+ - tweak: "Inflatable boxes can now pick up uninflated inflatables by clicking on them, similar to ore satchels."
+ - tweak: "Inflatable boxes now use simple storage slots with a number next to the item to show how much it has."
+ - rscadd: "Inflatable boxes now have in-hand sprites."
+ - tweak: "Tweaked the code for what can puncture inflatables, any sharp, edged, or lit object can now puncture inflatables."
+ - rscadd: "Deflating an inflatable now plays an animation."
+ - tweak: "Tweaked the order of operations when you open in inflatable door. You should now be able to pass through it easier."
+ - tweak: "Inflatables boxes now spawn with more inflatables."
+ - rscadd: "Emergency closets that used to spawn loose inflatables will now instead spawn a less filled inflatables box."
+ - rscadd: "Various engineering suits now let you hold inflatable boxes in suit slots, including hazard vests."
\ No newline at end of file
diff --git a/icons/obj/contained_items/tools/inflatables.dmi b/icons/obj/contained_items/tools/inflatables.dmi
new file mode 100644
index 00000000000..1648890f270
Binary files /dev/null and b/icons/obj/contained_items/tools/inflatables.dmi differ
diff --git a/icons/obj/inflatable.dmi b/icons/obj/inflatable.dmi
deleted file mode 100644
index 403e39c6378..00000000000
Binary files a/icons/obj/inflatable.dmi and /dev/null differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 9b043ce7d6b..6bf6ed125f0 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/maps/aurora/aurora-1_centcomm.dmm b/maps/aurora/aurora-1_centcomm.dmm
index 13831d95ab0..42c36927541 100644
--- a/maps/aurora/aurora-1_centcomm.dmm
+++ b/maps/aurora/aurora-1_centcomm.dmm
@@ -7481,16 +7481,16 @@
},
/area/centcom/legion/hangar5)
"bir" = (
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 8
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 8
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 8
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 8
},
/obj/item/grenade/chem_grenade/metalfoam{
@@ -8301,8 +8301,8 @@
},
/area/shuttle/administration)
"bHu" = (
-/obj/item/storage/briefcase/inflatable,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/structure/closet/l3closet,
/obj/item/clothing/suit/bio_suit/virology,
/obj/item/clothing/head/bio_hood/virology,
@@ -8378,8 +8378,8 @@
},
/area/centcom/bar)
"bJW" = (
-/obj/item/storage/briefcase/inflatable,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/structure/closet/l3closet,
/obj/item/clothing/suit/bio_suit/virology,
/obj/item/clothing/head/bio_hood/virology,
@@ -9944,7 +9944,7 @@
/obj/item/storage/firstaid/o2{
pixel_y = 2
},
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/item/device/flashlight/flare/glowstick/red,
/obj/item/device/flashlight/flare/glowstick/red,
/obj/effect/floor_decal/industrial/outline/yellow,
@@ -16277,7 +16277,7 @@
amount = 50;
pixel_x = 1
},
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/effect/floor_decal/corner/red{
dir = 6
},
@@ -22422,7 +22422,7 @@
/obj/item/storage/firstaid/o2{
pixel_y = 2
},
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/item/device/flashlight/flare,
/obj/item/device/flashlight/flare,
/obj/machinery/light{
@@ -28069,13 +28069,13 @@
/turf/unsimulated/floor,
/area/antag/mercenary)
"nTr" = (
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 2
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 2
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 2
},
/obj/structure/table/steel,
diff --git a/maps/aurora/aurora-2_under-station.dmm b/maps/aurora/aurora-2_under-station.dmm
index 889445490be..3cd4667d637 100644
--- a/maps/aurora/aurora-2_under-station.dmm
+++ b/maps/aurora/aurora-2_under-station.dmm
@@ -38,7 +38,7 @@
/area/engineering/cooling)
"eu" = (
/obj/structure/table/standard,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/turf/simulated/floor/carpet/rubber,
/area/engineering/cooling)
"gY" = (
diff --git a/maps/aurora/aurora-3_sublevel.dmm b/maps/aurora/aurora-3_sublevel.dmm
index 647875f390c..2fac414c909 100644
--- a/maps/aurora/aurora-3_sublevel.dmm
+++ b/maps/aurora/aurora-3_sublevel.dmm
@@ -1639,8 +1639,8 @@
/area/rnd/xenoarch_atrium)
"adR" = (
/obj/structure/table/rack,
-/obj/item/storage/briefcase/inflatable,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
+/obj/item/storage/bag/inflatable,
/turf/simulated/floor/tiled,
/area/rnd/xenoarch_atrium)
"adS" = (
@@ -2638,7 +2638,7 @@
/area/engineering/storage_sublevel)
"agu" = (
/obj/structure/table/rack,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/random/tech_supply,
/obj/random/tech_supply,
/turf/simulated/floor/tiled,
@@ -14980,7 +14980,7 @@
/area/maintenance/medsublevel_port)
"aDh" = (
/obj/structure/table/steel,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/turf/simulated/floor/plating,
/area/maintenance/medsublevel_port)
"aDi" = (
@@ -27871,7 +27871,7 @@
/obj/structure/closet/crate,
/obj/item/storage/box/lights/coloredmixed,
/obj/item/storage/box/lights/mixed,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/item/device/floor_painter,
/obj/effect/decal/cleanable/dirt,
/turf/simulated/floor/airless,
diff --git a/maps/aurora/aurora-4_mainlevel.dmm b/maps/aurora/aurora-4_mainlevel.dmm
index ef0571151de..2f4493bb9bf 100644
--- a/maps/aurora/aurora-4_mainlevel.dmm
+++ b/maps/aurora/aurora-4_mainlevel.dmm
@@ -5365,11 +5365,11 @@
/area/engineering/atmos/storage)
"akE" = (
/obj/structure/table/standard,
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/effect/floor_decal/corner/blue{
dir = 1
},
@@ -20190,13 +20190,13 @@
/area/engineering/engineering_hallway_main)
"aIZ" = (
/obj/structure/table/standard,
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = -3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 3
},
/obj/machinery/light{
@@ -22581,14 +22581,14 @@
/turf/simulated/floor/tiled/dark,
/area/ai_monitored/storage/eva)
"aNa" = (
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 6
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = -3
},
/obj/structure/table/reinforced,
diff --git a/maps/aurora/aurora-5_interstitial.dmm b/maps/aurora/aurora-5_interstitial.dmm
index 6dc82f2cad6..fde7a6de7db 100644
--- a/maps/aurora/aurora-5_interstitial.dmm
+++ b/maps/aurora/aurora-5_interstitial.dmm
@@ -5177,7 +5177,7 @@
/obj/effect/decal/cleanable/dirt,
/obj/item/storage/box/lights/coloredmixed,
/obj/item/storage/box/lights/mixed,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/item/device/floor_painter,
/obj/structure/closet/crate,
/turf/simulated/floor/airless,
@@ -6563,7 +6563,7 @@
},
/area/mine/unexplored)
"wd" = (
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/structure/table/rack{
dir = 1
},
diff --git a/maps/aurora/aurora-6_surface.dmm b/maps/aurora/aurora-6_surface.dmm
index 9445a09064e..fda0d6aae9f 100644
--- a/maps/aurora/aurora-6_surface.dmm
+++ b/maps/aurora/aurora-6_surface.dmm
@@ -5284,7 +5284,7 @@
},
/obj/item/airbubble,
/obj/item/airbubble,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/effect/floor_decal/industrial/outline/yellow,
/obj/item/device/flashlight/flare,
/obj/item/device/flashlight/flare,
diff --git a/maps/exodus/exodus-1_station.dmm b/maps/exodus/exodus-1_station.dmm
index 04502f6a902..bd00a80bdba 100644
--- a/maps/exodus/exodus-1_station.dmm
+++ b/maps/exodus/exodus-1_station.dmm
@@ -59482,11 +59482,11 @@
/turf/simulated/wall/r_wall,
/area/engineering/engine_eva)
"ciR" = (
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/machinery/power/apc{
dir = 8;
name = "west bump";
@@ -60017,14 +60017,14 @@
dir = 1;
pixel_y = -22
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 6
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = -3
},
/obj/structure/table/reinforced/steel,
@@ -76853,14 +76853,14 @@
/turf/simulated/floor/tiled,
/area/hallway/secondary/exit)
"xJl" = (
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 6
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = -3
},
/obj/structure/table/reinforced,
diff --git a/maps/exodus/exodus-2_centcomm.dmm b/maps/exodus/exodus-2_centcomm.dmm
index e635afc730d..65a6d81f1db 100644
--- a/maps/exodus/exodus-2_centcomm.dmm
+++ b/maps/exodus/exodus-2_centcomm.dmm
@@ -5313,19 +5313,19 @@
/obj/item/stack/material/glass/reinforced{
amount = 50
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
@@ -20754,19 +20754,19 @@
/obj/item/stack/material/glass/reinforced{
amount = 50
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
-/obj/item/storage/briefcase/inflatable{
+/obj/item/storage/bag/inflatable{
pixel_x = 3;
pixel_y = 3
},
diff --git a/maps/exodus/exodus-5_asteroid.dmm b/maps/exodus/exodus-5_asteroid.dmm
index 5e13e357c82..0e932484cd6 100644
--- a/maps/exodus/exodus-5_asteroid.dmm
+++ b/maps/exodus/exodus-5_asteroid.dmm
@@ -9403,7 +9403,7 @@
/obj/item/clothing/suit/space/void/engineering,
/obj/item/clothing/shoes/magboots,
/obj/item/clothing/gloves/yellow,
-/obj/item/storage/briefcase/inflatable,
+/obj/item/storage/bag/inflatable,
/obj/machinery/camera/network/engineering_outpost{
c_tag = "Engineering Outpost Storage";
dir = 1