diff --git a/code/game/objects/effects/spawners/random/pool/space_loot.dm b/code/game/objects/effects/spawners/random/pool/space_loot.dm
index 06fd29d8883..ea7f65fe256 100644
--- a/code/game/objects/effects/spawners/random/pool/space_loot.dm
+++ b/code/game/objects/effects/spawners/random/pool/space_loot.dm
@@ -391,7 +391,7 @@
loot = list(
/obj/item/storage/fancy/shell/confetti,
/obj/item/storage/fancy/shell/ion,
- /obj/item/storage/fancy/shell/incindiary,
+ /obj/item/storage/fancy/shell/incendiary,
/obj/item/storage/fancy/shell/dragonsbreath,
/obj/item/storage/fancy/shell/rubbershot,
)
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 788421b62e1..bdefb5e2676 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -491,6 +491,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list (
new /datum/stack_recipe("cardboard tube", /obj/item/c_tube),
new /datum/stack_recipe("cardboard box", /obj/structure/closet/cardboard, 4),
new /datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5),
+ new /datum/stack_recipe("shotgun ammo box", /obj/item/storage/fancy/shell/empty, 2),
null,
new /datum/stack_recipe_list("chess pieces", list(
new /datum/stack_recipe("black pawn", /obj/item/chesspiece/bpawn, 1),
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index b663a09838a..2e78e02d67c 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -731,6 +731,23 @@
/* Ammo Boxes */
////////////////
+#define TRANQ "Tranquilizer"
+#define RUBBER "Rubbershot"
+#define BUCK "Buckshot"
+#define SLUG "Slug"
+#define BEAN "Beanbag"
+#define TASER "Taser"
+#define DRAGON "Dragonsbreath"
+#define HOLY "Holy"
+#define CLOWN "Confetti"
+#define METEOR "Meteorshot"
+#define ION "Ionshot"
+#define PULSE "Pulse"
+#define INCENDIARY "Incendiary"
+#define LASERSHOT "Laser"
+#define FRAG "Frag"
+
+
/obj/item/storage/fancy/shell
icon = 'icons/obj/shell_boxes.dmi'
storage_slots = 8
@@ -738,11 +755,16 @@
can_hold = list(/obj/item/ammo_casing/shotgun)
/// What shell do we fill the box with
var/shell_type
+ /// Is the box open or closed?
+ var/we_are_open = FALSE
+ /// What is the closed icon state of the box?
+ var/closed_icon_state = null
/obj/item/storage/fancy/shell/fancy_storage_examine(mob/user)
. = list()
if(!length(contents))
. += "There are no shells in the box."
+ . += "Ctrl-click to open or close the box!"
return
var/list/shell_list = list() // Associated list of all shells in the box
@@ -754,11 +776,77 @@
. += "There is one [thing] in the box."
else
. += "There are [shell_list[thing]] [thing]s in the box."
+ . += "Ctrl-click to open or close the box!"
+
+/obj/item/storage/fancy/shell/attackby__legacy__attackchain(obj/item/W, mob/user, params)
+ if(!is_pen(W))
+ return ..()
+ var/list/static/designs = list(TRANQ, RUBBER, BUCK, SLUG, BEAN, TASER, DRAGON, HOLY, CLOWN, METEOR, ION, PULSE, INCENDIARY, LASERSHOT, FRAG)
+ var/switchDesign = tgui_input_list(user, "Select a Design", "Shotgun Box Designs", sortList(designs))
+ if(!switchDesign)
+ return
+ if(we_are_open)
+ to_chat(user, "Close the box first!")
+ return
+ if(get_dist(user, src) > 1 && !user.incapacitated())
+ to_chat(user, "You have moved too far away!")
+ return
+ to_chat(user, "You make some modifications to [src] using your pen.")
+ switch(switchDesign)
+ if(TRANQ)
+ icon_state = "tranqbox"
+ if(RUBBER)
+ icon_state = "rubberbox"
+ if(BUCK)
+ icon_state = "buckbox"
+ if(SLUG)
+ icon_state = "slugbox"
+ if(BEAN)
+ icon_state = "beanbox"
+ if(TASER)
+ icon_state = "stunbox"
+ if(DRAGON)
+ icon_state = "dragonsbox"
+ if(HOLY)
+ icon_state = "holybox"
+ if(CLOWN)
+ icon_state = "partybox"
+ if(METEOR)
+ icon_state = "meteorbox"
+ if(ION)
+ icon_state = "ionbox"
+ if(PULSE)
+ icon_state = "pulsebox"
+ if(INCENDIARY)
+ icon_state = "incendiarybox"
+ if(LASERSHOT)
+ icon_state = "lasershotbox"
+ if(FRAG)
+ icon_state = "frag12box"
+ closed_icon_state = icon_state
+ update_appearance(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+ return
+
+/obj/item/storage/fancy/shell/CtrlClick(mob/living/user)
+ if(!isliving(user))
+ return
+ if((get_dist(user, src) > 1) || user.incapacitated())
+ return
+ if(we_are_open)
+ we_are_open = FALSE
+ else
+ we_are_open = TRUE
+ update_appearance(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+
/obj/item/storage/fancy/shell/update_icon_state()
- icon_state = "open"
+ if(we_are_open)
+ icon_state = "open"
+ else
+ icon_state = closed_icon_state
/obj/item/storage/fancy/shell/populate_contents()
+ closed_icon_state = icon_state
if(!shell_type)
return
for(var/i in 1 to storage_slots)
@@ -766,6 +854,8 @@
/obj/item/storage/fancy/shell/update_overlays()
. = ..()
+ if(!we_are_open)
+ return
var/list/cached_contents = contents
for(var/index in 1 to length(cached_contents))
var/obj/shell = cached_contents[index]
@@ -776,6 +866,19 @@
. += "shell_box_front" // need to add another overlay to prevent from other overlays from showing on top
+/obj/item/storage/fancy/shell/handle_item_insertion(obj/item/I, mob/user, prevent_warning)
+ . = ..()
+ if(.)
+ we_are_open = TRUE
+ update_appearance(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+
+/obj/item/storage/fancy/shell/remove_from_storage(obj/item/I, atom/new_location)
+ . = ..()
+ if(.)
+ we_are_open = TRUE
+ update_appearance(UPDATE_ICON_STATE|UPDATE_OVERLAYS)
+
+
/obj/item/storage/fancy/shell/tranquilizer
name = "ammunition box (Tranquilizer darts)"
desc = "A small box capable of holding eight shotgun shells."
@@ -848,7 +951,7 @@
icon_state = "pulsebox"
shell_type = /obj/item/ammo_casing/shotgun/pulseslug
-/obj/item/storage/fancy/shell/incindiary
+/obj/item/storage/fancy/shell/incendiary
name = "ammunition box (Incendiary slug)"
desc = "A small box capable of holding eight shotgun shells."
icon_state = "incendiarybox"
@@ -866,6 +969,27 @@
icon_state = "frag12box"
shell_type = /obj/item/ammo_casing/shotgun/frag12
+/obj/item/storage/fancy/shell/empty
+ name = "custom shotgun ammunition box"
+ desc = "A small box capable of holding eight shotgun shells. Hand packed, just for you!"
+ icon_state = "buckbox"
+
+#undef TRANQ
+#undef RUBBER
+#undef BUCK
+#undef SLUG
+#undef BEAN
+#undef TASER
+#undef DRAGON
+#undef HOLY
+#undef CLOWN
+#undef METEOR
+#undef ION
+#undef PULSE
+#undef INCENDIARY
+#undef LASERSHOT
+#undef FRAG
+
////////////////
/* Donk Boxes */
////////////////
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 11facf56e26..d2dce8c6b87 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -267,7 +267,7 @@
/obj/item/ammo_casing/shotgun/laserslug
name = "laser slug"
desc = "A rudimentary 12 gauge shotgun shell that replicates the effects of a laser weapon with a low-powered laser."
- icon_state = "laser"
+ icon_state = "improvised"
projectile_type = /obj/item/projectile/beam/laser
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -329,7 +329,7 @@
/obj/item/ammo_casing/shotgun/holy
name = "holy water dart"
desc = "A 12 gauge dart shell loaded with holy water."
- icon_state = "dart"
+ icon_state = "holydart"
projectile_type = /obj/item/projectile/bullet/dart/syringe/holy
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
diff --git a/code/modules/supply/supply_packs/pack_security.dm b/code/modules/supply/supply_packs/pack_security.dm
index fe4f2626cc5..de1b2ec0f98 100644
--- a/code/modules/supply/supply_packs/pack_security.dm
+++ b/code/modules/supply/supply_packs/pack_security.dm
@@ -302,6 +302,27 @@
containertype = /obj/structure/closet/crate/secure/plasma
containername = "lever action rifle crate"
+/datum/supply_packs/security/armory/beanammo
+ name = "Beanbag Shell Crate"
+ contains = list(/obj/item/storage/fancy/shell/beanbag,
+ /obj/item/storage/fancy/shell/beanbag)
+ cost = 175 // Just print them at cargo
+ containername = "beanbag shell crate"
+
+/datum/supply_packs/security/armory/rubberammo
+ name = "Rubbershot Shell Crate"
+ contains = list(/obj/item/storage/fancy/shell/rubbershot,
+ /obj/item/storage/fancy/shell/rubbershot)
+ cost = 175 // Just print them at cargo
+ containername = "rubbershot shell crate"
+
+/datum/supply_packs/security/armory/incendiaryammo
+ name = "Incendiary Shell Crate"
+ contains = list(/obj/item/storage/fancy/shell/incendiary,
+ /obj/item/storage/fancy/shell/incendiary)
+ cost = 225 // This is cargo printable, but slightly increased in cost due to it being lethal
+ containername = "incendiary shell crate"
+
/datum/supply_packs/security/armory/tranqammo
name = "Tranquilizer Shell Crate"
contains = list(/obj/item/storage/fancy/shell/tranquilizer,
@@ -316,6 +337,27 @@
cost = 400
containername = "holy water shell crate"
+/datum/supply_packs/security/armory/dragonsbreathammo
+ name = "Dragonsbreath Shell Crate"
+ contains = list(/obj/item/storage/fancy/shell/dragonsbreath,
+ /obj/item/storage/fancy/shell/dragonsbreath)
+ cost = 400
+ containername = "dragonsbreath shell crate"
+
+/datum/supply_packs/security/armory/ionshotammo
+ name = "Ionshot Shell Crate"
+ contains = list(/obj/item/storage/fancy/shell/ion,
+ /obj/item/storage/fancy/shell/ion)
+ cost = 400
+ containername = "ionshot shell crate"
+
+/datum/supply_packs/security/armory/lasershotammo
+ name = "Lasershot Shell Crate"
+ contains = list(/obj/item/storage/fancy/shell/lasershot,
+ /obj/item/storage/fancy/shell/lasershot)
+ cost = 400
+ containername = "lasershot shell crate"
+
/datum/supply_packs/security/armory/disablersmg
name = "WT-450 Disabler SMG Crate"
contains = list(/obj/item/gun/energy/disabler/smg,
diff --git a/icons/obj/bullet.dmi b/icons/obj/bullet.dmi
index 5921f4a59b0..8f28f3aa4c0 100644
Binary files a/icons/obj/bullet.dmi and b/icons/obj/bullet.dmi differ
diff --git a/icons/obj/shell_boxes.dmi b/icons/obj/shell_boxes.dmi
index 31887ff85aa..4e29db43f3f 100644
Binary files a/icons/obj/shell_boxes.dmi and b/icons/obj/shell_boxes.dmi differ