From 7e6d3dd753bd18755d6c17cee499fd0419c8fa9c Mon Sep 17 00:00:00 2001 From: thgvr <81882910+thgvr@users.noreply.github.com> Date: Sat, 12 Oct 2024 14:03:33 -0700 Subject: [PATCH] Bullet stacks (#3456) ## About The Pull Request Partial port of https://github.com/Mojave-Sun/mojave-sun-13/pull/2076 and surrounding PRs Adds bullet handfuls. You can only have the same type of ammunition in a handful. No mismatched stacks Spent casings are not stackable. Generally, the rule is: * By default, stacks can contain 12 rounds. * Pistol-equivalent stacks contain 15 rounds. * Shotshell stacks contain 8 rounds. * Rifle stacks contain 15 rounds. * Large calibre stacks contain 5 rounds. Also replaces old ammo boxes with storage boxes that come pre-filled with stacks of bullets like this: ![image](https://github.com/user-attachments/assets/cb71a690-cbd2-4973-bfca-4e8b9f472349) Here's how the stacks look: ![image](https://github.com/user-attachments/assets/8cb64f4e-8b4c-4b87-9c60-96a8354a69de) ![image](https://github.com/user-attachments/assets/2b42e546-1d04-4542-b6dd-19c9099991e2) ## Changelog :cl: add: Added bullet stacks, they allow you to stack ammo of the same type into a group. balance: Changed old ammo boxes into storage items containing stacks of bullets /:cl: --------- Signed-off-by: thgvr <81882910+thgvr@users.noreply.github.com> --- .../BeachRuins/beach_fishing_hut.dmm | 46 +- .../BeachRuins/beach_treasure_cove.dmm | 9 +- .../icemoon_underground_abandoned_village.dmm | 2 +- .../JungleRuins/jungle_interceptor.dmm | 2 +- .../LavaRuins/lavaland_crashed_starwalker.dmm | 4 +- .../RockRuins/rockplanet_distillery.dmm | 2 +- .../RockRuins/rockplanet_harmfactory.dmm | 5 +- .../whitesands_surface_camp_combination.dmm | 2 +- _maps/RandomRuins/SpaceRuins/power_puzzle.dmm | 4 +- _maps/RandomRuins/SpaceRuins/spacemall.dmm | 4 +- .../WasteRuins/wasteplanet_lab.dmm | 4 +- .../WasteRuins/wasteplanet_pandora.dmm | 2 +- .../independent/independent_dwayne.dmm | 6 +- .../shuttles/independent/independent_kilo.dmm | 4 +- .../independent/independent_rigger.dmm | 2 +- .../independent/independent_shetland.dmm | 2 +- _maps/shuttles/inteq/inteq_hound.dmm | 5 +- _maps/shuttles/inteq/inteq_valor.dmm | 10 +- .../nanotrasen/nanotrasen_harrier.dmm | 6 +- .../shuttles/nanotrasen/nanotrasen_heron.dmm | 20 +- .../shuttles/nanotrasen/nanotrasen_ranger.dmm | 10 +- _maps/shuttles/pirate/pirate_tortuga.dmm | 7 +- _maps/shuttles/roumain/srm_elder.dmm | 14 +- _maps/shuttles/solgov/solgov_chronicle.dmm | 2 +- _maps/shuttles/solgov/solgov_inkwell.dmm | 2 +- _maps/shuttles/solgov/solgov_paracelsus.dmm | 2 +- .../syndicate/syndicate_gorlex_hyena.dmm | 6 +- .../syndicate/syndicate_gorlex_komodo.dmm | 2 +- .../syndicate/syndicate_twinkleshine.dmm | 4 +- code/__DEFINES/vv.dm | 1 + code/game/atoms.dm | 4 + .../mecha/equipment/weapons/mecha_ammo.dm | 2 +- code/game/objects/items/RCD.dm | 2 +- code/game/objects/items/melee/weaponry.dm | 2 +- code/game/objects/items/shrapnel.dm | 2 +- code/game/objects/items/storage/ammo_can.dm | 52 ++ code/game/objects/items/storage/backpack.dm | 4 +- code/game/objects/items/storage/belt.dm | 4 +- code/game/objects/items/storage/toolbox.dm | 52 -- code/game/objects/items/toys.dm | 2 +- .../crates_lockers/closets/secure/security.dm | 4 +- code/modules/antagonists/gang/outfits.dm | 11 +- .../blackmarket/blackmarket_items/ammo.dm | 8 +- code/modules/cargo/exports.dm | 3 +- code/modules/cargo/packs/ammo.dm | 170 +++--- .../clothing/outfits/ert/frontiersmen_ert.dm | 16 +- code/modules/mining/abandoned_crates.dm | 2 +- .../hostile/mining_mobs/hivelord_outfits.dm | 4 +- .../{_ammunition.dm => _ammo_casing.dm} | 136 ++++- .../projectiles/ammunition/ballistic/lmg.dm | 1 - .../ammunition/ballistic/pistol.dm | 14 +- .../ammunition/ballistic/revolver.dm | 5 +- .../projectiles/ammunition/ballistic/rifle.dm | 20 +- .../ammunition/ballistic/shotgun.dm | 7 +- .../projectiles/ammunition/ballistic/smg.dm | 5 +- .../ammunition/ballistic/sniper.dm | 1 - .../projectiles/ammunition/caseless/foam.dm | 1 - .../boxes_magazines/_box_magazine.dm | 56 +- .../projectiles/boxes_magazines/ammo_boxes.dm | 565 ------------------ .../boxes_magazines/ammo_loaders.dm | 176 ++++++ .../ammo_stacks/_ammo_stack.dm | 82 +++ .../prefab_stacks/_premade_stacks.dm | 21 + .../prefab_stacks/premade_gauss_stacks.dm | 41 ++ .../prefab_stacks/premade_lmg_stacks.dm | 15 + .../prefab_stacks/premade_misc_stacks.dm | 26 + .../prefab_stacks/premade_pistol_stacks.dm | 499 ++++++++++++++++ .../prefab_stacks/premade_rifle_stacks.dm | 152 +++++ .../prefab_stacks/premade_shotshell_stacks.dm | 79 +++ .../prefab_stacks/premade_smg_stacks.dm | 113 ++++ .../prefab_stacks/premade_sniper_stacks.dm | 9 + .../boxes_magazines/generic_ammo_box.dm | 53 -- code/modules/projectiles/guns/ballistic.dm | 10 +- .../research/designs/autolathe_designs.dm | 22 +- .../research/designs/weapon_designs.dm | 46 +- code/modules/uplink/uplink_items.dm | 2 +- code/modules/vending/liberation_toy.dm | 4 +- code/modules/vending/security.dm | 2 - code/modules/vending/toys.dm | 2 +- icons/obj/ammo_bullets.dmi | Bin 2226 -> 0 bytes icons/obj/ammo_shotshells.dmi | Bin 3149 -> 0 bytes icons/obj/ammunition/ammo.dmi | Bin 0 -> 20173 bytes icons/obj/ammunition/ammo_boxes.dmi | Bin 0 -> 6468 bytes icons/obj/ammunition/ammo_bullets.dmi | Bin 0 -> 3390 bytes shiptest.dme | 16 +- 84 files changed, 1683 insertions(+), 1033 deletions(-) create mode 100644 code/game/objects/items/storage/ammo_can.dm rename code/modules/projectiles/ammunition/{_ammunition.dm => _ammo_casing.dm} (51%) delete mode 100644 code/modules/projectiles/boxes_magazines/ammo_boxes.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_loaders.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm create mode 100644 code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm delete mode 100644 code/modules/projectiles/boxes_magazines/generic_ammo_box.dm delete mode 100644 icons/obj/ammo_bullets.dmi delete mode 100644 icons/obj/ammo_shotshells.dmi create mode 100644 icons/obj/ammunition/ammo.dmi create mode 100644 icons/obj/ammunition/ammo_boxes.dmi create mode 100644 icons/obj/ammunition/ammo_bullets.dmi diff --git a/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm b/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm index ea1a18b11c4b..6a81ff12aaac 100644 --- a/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_fishing_hut.dmm @@ -67,6 +67,11 @@ }, /turf/open/water/beach/deep, /area/overmap_encounter/planetoid/beachplanet/explored) +"eB" = ( +/obj/item/storage/box/ammo/c38, +/obj/structure/closet/crate/wooden, +/turf/open/floor/wood, +/area/ruin/beach) "eJ" = ( /obj/effect/turf_decal/siding/wood{ dir = 5 @@ -200,12 +205,6 @@ /obj/structure/railing/corner, /turf/open/water/beach/deep, /area/overmap_encounter/planetoid/beachplanet/explored) -"kj" = ( -/obj/structure/closet/cabinet, -/obj/item/pneumatic_cannon/speargun, -/obj/item/melee/knife/hunting, -/turf/open/floor/wood, -/area/ruin/beach) "kr" = ( /obj/effect/turf_decal/weather/sand/corner{ dir = 1 @@ -280,11 +279,6 @@ }, /turf/open/floor/plating/asteroid/sand, /area/overmap_encounter/planetoid/cave/explored) -"mq" = ( -/obj/item/ammo_box/c38_box, -/obj/structure/closet/crate/wooden, -/turf/open/floor/wood, -/area/ruin/beach) "my" = ( /obj/effect/turf_decal/weather/sand{ dir = 5 @@ -745,12 +739,27 @@ }, /turf/open/floor/wood/ebony, /area/overmap_encounter/planetoid/beachplanet/explored) +"CJ" = ( +/obj/structure/closet/cabinet, +/obj/item/pneumatic_cannon/speargun, +/obj/item/melee/knife/hunting, +/obj/machinery/light/small/directional/east{ + light_color = "#d8b1b1" + }, +/turf/open/floor/wood, +/area/ruin/beach) "CV" = ( /obj/machinery/grill, /obj/effect/turf_decal/corner/opaque/pink/diagonal, /obj/effect/decal/cleanable/cobweb, /turf/open/floor/plastic, /area/ruin/beach) +"DG" = ( +/obj/structure/closet/cabinet, +/obj/item/pneumatic_cannon/speargun, +/obj/item/melee/knife/hunting, +/turf/open/floor/wood, +/area/ruin/beach) "DL" = ( /obj/effect/turf_decal/siding/wood{ dir = 4 @@ -1047,15 +1056,6 @@ /obj/effect/turf_decal/siding/white/corner, /turf/open/water/beach, /area/overmap_encounter/planetoid/beachplanet/explored) -"PB" = ( -/obj/structure/closet/cabinet, -/obj/item/pneumatic_cannon/speargun, -/obj/item/melee/knife/hunting, -/obj/machinery/light/small/directional/east{ - light_color = "#d8b1b1" - }, -/turf/open/floor/wood, -/area/ruin/beach) "PC" = ( /obj/effect/turf_decal/weather/sand{ dir = 10 @@ -2186,9 +2186,9 @@ sz ut Ty oS -mq -kj -PB +eB +DG +CJ ut BW BN diff --git a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm index 997f6bb56703..839e87815f93 100644 --- a/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm +++ b/_maps/RandomRuins/BeachRuins/beach_treasure_cove.dmm @@ -666,13 +666,8 @@ /obj/structure/table/reinforced{ color = "#c1b6a5" }, -/obj/item/ammo_box/c38_box{ - pixel_x = 10; - pixel_y = 8 - }, -/obj/item/ammo_box/c38_box{ - pixel_x = 10 - }, +/obj/item/storage/box/ammo/c38, +/obj/item/storage/box/ammo/c38, /obj/structure/sign/poster/contraband/energy_swords{ pixel_x = -32 }, diff --git a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm index 29710e094f64..42aa6b288469 100644 --- a/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm +++ b/_maps/RandomRuins/IceRuins/icemoon_underground_abandoned_village.dmm @@ -383,7 +383,7 @@ "EF" = ( /obj/effect/decal/cleanable/blood/gibs/torso, /obj/structure/safe, -/obj/item/ammo_box/a12g/slug, +/obj/item/storage/box/ammo/a12g_slug, /obj/item/melee/knife/combat, /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/dirt, diff --git a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm index aab9b566f78e..f6efbca453e2 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_interceptor.dmm @@ -3050,7 +3050,7 @@ /obj/item/clothing/under/rank/security/officer/blueshirt, /obj/item/clothing/gloves/combat, /obj/item/clothing/shoes/jackboots, -/obj/item/ammo_box/c9mm, +/obj/item/storage/box/ammo/c9mm, /obj/machinery/light/small/broken/directional/north, /obj/effect/turf_decal/corner/transparent/bar/three_quarters{ dir = 4 diff --git a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm index 4d63ae26b5bb..8f3921ed0520 100644 --- a/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm +++ b/_maps/RandomRuins/LavaRuins/lavaland_crashed_starwalker.dmm @@ -92,7 +92,7 @@ name = "armory locker"; req_one_access_txt = "1" }, -/obj/item/ammo_box/a12g, +/obj/item/storage/box/ammo/a12g_buckshot, /turf/open/floor/mineral/plastitanium, /area/ruin/unpowered/crashed_starwalker) "bL" = ( @@ -942,7 +942,7 @@ /obj/effect/turf_decal/industrial/outline/yellow, /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/closet/crate/secure/gear, -/obj/item/ammo_box/c10mm/surplus, +/obj/item/storage/box/ammo/c10mm_surplus, /obj/item/weaponcrafting/stock, /obj/item/weaponcrafting/stock{ pixel_x = -6 diff --git a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm index 2fd3caa4c42f..3926cffbbf81 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm @@ -3086,7 +3086,7 @@ pixel_x = -3 }, /obj/item/ammo_box/magazine/illestren_a850r, -/obj/item/ammo_box/c9mm/ap, +/obj/item/storage/box/ammo/c9mm/ap, /obj/item/ammo_box/magazine/illestren_a850r, /obj/item/ammo_box/magazine/co9mm{ start_empty = 1 diff --git a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm index a86efe2e9744..a47ad168fb72 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_harmfactory.dmm @@ -1862,10 +1862,7 @@ pixel_x = 5; pixel_y = 7 }, -/obj/item/ammo_box/foambox/riot{ - pixel_x = -3; - pixel_y = -3 - }, +/obj/item/storage/box/ammo/foam_darts/riot, /obj/structure/cable{ icon_state = "4-8" }, diff --git a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm index b903fd3cce78..c7b060634951 100644 --- a/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm +++ b/_maps/RandomRuins/SandRuins/whitesands_surface_camp_combination.dmm @@ -1301,7 +1301,7 @@ "XP" = ( /obj/structure/table, /obj/item/trash/can, -/obj/item/ammo_box/c45/surplus, +/obj/item/storage/box/ammo/c45_surplus, /turf/open/floor/concrete, /area/ruin) "XS" = ( diff --git a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm index 3d05cfb13d35..e126234531f2 100644 --- a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm +++ b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm @@ -2694,8 +2694,8 @@ /obj/structure/closet/crate/secure/weapon{ name = "Ammo Crate" }, -/obj/item/ammo_box/c9mm/surplus, -/obj/item/ammo_box/c9mm/surplus, +/obj/item/storage/box/ammo/c9mm_surplus, +/obj/item/storage/box/ammo/c9mm_surplus, /obj/item/ammo_box/magazine/co9mm, /obj/item/ammo_box/magazine/co9mm, /turf/open/floor/plasteel, diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm index db3f30c15f76..6b75031ae8ba 100644 --- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm +++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm @@ -320,7 +320,7 @@ /obj/item/toy/talking/AI{ pixel_x = 20 }, -/obj/item/ammo_box/foambox/riot, +/obj/item/storage/box/ammo/foam_darts/riot, /obj/item/gun/ballistic/shotgun/toy, /turf/open/floor/light, /area/ruin/space/has_grav/spacemall/shop2) @@ -2434,7 +2434,7 @@ /area/ruin/space/has_grav/spacemall) "jm" = ( /obj/structure/rack, -/obj/item/ammo_box/c9mm, +/obj/item/storage/box/ammo/c9mm, /obj/item/ammo_box/magazine/co9mm{ pixel_x = 5 }, diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm index aa5797d05a95..dba9f5e3c3c9 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_lab.dmm @@ -118,13 +118,13 @@ /area/ruin/powered) "gw" = ( /obj/structure/table, -/obj/item/ammo_box/c45, +/obj/item/storage/box/ammo/c45, /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/mono/white, /area/ruin/powered) "gx" = ( /obj/structure/table, -/obj/item/ammo_box/c9mm/rubbershot, +/obj/item/storage/box/ammo/c9mm_rubber, /turf/open/floor/plasteel/mono/white, /area/ruin/powered) "gz" = ( diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm index 934b648c0bd6..adab5732e0c1 100644 --- a/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm +++ b/_maps/RandomRuins/WasteRuins/wasteplanet_pandora.dmm @@ -23,7 +23,7 @@ /area/ruin/wasteplanet) "bc" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/item/ammo_box/c9mm, +/obj/item/storage/box/ammo/c9mm, /turf/open/floor/plating/wasteplanet, /area/ruin/wasteplanet) "bd" = ( diff --git a/_maps/shuttles/independent/independent_dwayne.dmm b/_maps/shuttles/independent/independent_dwayne.dmm index d1cc698c0c92..7f8e7b569c68 100644 --- a/_maps/shuttles/independent/independent_dwayne.dmm +++ b/_maps/shuttles/independent/independent_dwayne.dmm @@ -272,9 +272,9 @@ dir = 9 }, /obj/effect/decal/cleanable/dirt, -/obj/item/ammo_box/c38_box, -/obj/item/ammo_box/c38_box, -/obj/item/ammo_box/c38_box, +/obj/item/storage/box/ammo/c38, +/obj/item/storage/box/ammo/c38, +/obj/item/storage/box/ammo/c38, /obj/structure/closet/crate/secure/plasma{ name = "ammo crate"; desc = "A secure ammo crate." diff --git a/_maps/shuttles/independent/independent_kilo.dmm b/_maps/shuttles/independent/independent_kilo.dmm index 35f955ff0b3d..f9504be9d31e 100644 --- a/_maps/shuttles/independent/independent_kilo.dmm +++ b/_maps/shuttles/independent/independent_kilo.dmm @@ -661,7 +661,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 }, -/obj/item/ammo_box/a12g/rubbershot, +/obj/item/storage/box/ammo/a12g_rubbershot, /obj/item/gun/ballistic/shotgun/doublebarrel/presawn{ spawnwithmagazine = 0 }, @@ -1875,7 +1875,7 @@ icon_state = "9-10" }, /obj/effect/decal/cleanable/oil, -/obj/item/ammo_box/a12g, +/obj/item/storage/box/ammo/a12g_buckshot, /obj/item/gun/ballistic/shotgun/doublebarrel/no_mag, /turf/open/floor/plasteel/patterned, /area/ship/cargo) diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm index d6cb54aed39c..d87ae083832b 100644 --- a/_maps/shuttles/independent/independent_rigger.dmm +++ b/_maps/shuttles/independent/independent_rigger.dmm @@ -4132,7 +4132,7 @@ name = "ammunition locker"; req_access_txt = "1" }, -/obj/item/ammo_box/c38_box, +/obj/item/storage/box/ammo/c38, /obj/item/ammo_box/magazine/m45/rubber, /obj/item/ammo_box/magazine/m45/rubber, /obj/item/ammo_box/magazine/m45, diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm index 3bf95ea99b6f..75784c301eda 100644 --- a/_maps/shuttles/independent/independent_shetland.dmm +++ b/_maps/shuttles/independent/independent_shetland.dmm @@ -3475,7 +3475,7 @@ req_access_txt = "1"; req_ship_access = 1 }, -/obj/item/ammo_box/c38_box, +/obj/item/storage/box/ammo/c38, /obj/effect/turf_decal/box, /obj/item/ammo_box/c38, /obj/item/ammo_box/c38, diff --git a/_maps/shuttles/inteq/inteq_hound.dmm b/_maps/shuttles/inteq/inteq_hound.dmm index da82ccbf26b7..42c34c5a418e 100644 --- a/_maps/shuttles/inteq/inteq_hound.dmm +++ b/_maps/shuttles/inteq/inteq_hound.dmm @@ -50,10 +50,7 @@ pixel_x = -11; pixel_y = 5 }, -/obj/item/ammo_box/a762_40/inteq{ - pixel_x = 5; - pixel_y = 12 - }, +/obj/item/storage/box/ammo/a762_40/inteq, /obj/item/reagent_containers/food/drinks/bottle/whiskey{ pixel_x = -7; pixel_y = 6 diff --git a/_maps/shuttles/inteq/inteq_valor.dmm b/_maps/shuttles/inteq/inteq_valor.dmm index 3f709a261b15..d35bcb7a808a 100644 --- a/_maps/shuttles/inteq/inteq_valor.dmm +++ b/_maps/shuttles/inteq/inteq_valor.dmm @@ -5074,14 +5074,8 @@ /obj/effect/turf_decal/corner/opaque/yellow, /obj/structure/rack, /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, -/obj/item/ammo_box/c9mm/rubbershot{ - pixel_x = 5; - pixel_y = 10 - }, -/obj/item/ammo_box/c9mm{ - pixel_x = -2; - pixel_y = 2 - }, +/obj/item/storage/box/ammo/c9mm_rubber, +/obj/item/storage/box/ammo/c9mm, /obj/machinery/light/small/directional/north, /obj/structure/sign/poster/official/safety_report{ pixel_x = 32 diff --git a/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm b/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm index 9e5d93f7af77..72bd430d743b 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_harrier.dmm @@ -5189,9 +5189,9 @@ /obj/item/reagent_containers/spray/pepper, /obj/item/ammo_box/magazine/co9mm, /obj/item/ammo_box/magazine/co9mm, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm/rubbershot, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm_rubber, /obj/effect/turf_decal/trimline/opaque/vired/line, /obj/item/storage/belt/security, /obj/item/melee/knife/survival, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm index a5673c22d7bc..a02ec78fc9e6 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_heron.dmm @@ -13072,22 +13072,10 @@ pixel_x = 5; pixel_y = 4 }, -/obj/item/ammo_box/c9mm{ - pixel_x = 4; - pixel_y = -6 - }, -/obj/item/ammo_box/c9mm{ - pixel_x = 4; - pixel_y = 1 - }, -/obj/item/ammo_box/c9mm{ - pixel_x = 4; - pixel_y = 9 - }, -/obj/item/ammo_box/c9mm/ap{ - pixel_y = 17; - pixel_x = 4 - }, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm/ap, /obj/item/stock_parts/cell/gun{ pixel_x = -3; pixel_y = -5 diff --git a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm index 07b8722e5e7b..d70424c08c84 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_ranger.dmm @@ -1750,11 +1750,11 @@ /obj/structure/chair/handrail{ dir = 4 }, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm/rubbershot, -/obj/item/ammo_box/c9mm, -/obj/item/ammo_box/c9mm, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm_rubber, +/obj/item/storage/box/ammo/c9mm, +/obj/item/storage/box/ammo/c9mm, /obj/effect/turf_decal/siding/thinplating/dark{ dir = 10 }, diff --git a/_maps/shuttles/pirate/pirate_tortuga.dmm b/_maps/shuttles/pirate/pirate_tortuga.dmm index fc08d44db510..3e48d25a962c 100644 --- a/_maps/shuttles/pirate/pirate_tortuga.dmm +++ b/_maps/shuttles/pirate/pirate_tortuga.dmm @@ -667,10 +667,7 @@ /area/ship/security/armory) "hU" = ( /obj/structure/rack, -/obj/item/ammo_box/c45{ - pixel_x = -9; - pixel_y = 8 - }, +/obj/item/storage/box/ammo/c45, /obj/item/storage/toolbox/ammo/a762_40{ pixel_x = 5; pixel_y = 6 @@ -3141,7 +3138,7 @@ /obj/item/clothing/shoes/jackboots{ pixel_y = -13 }, -/obj/item/ammo_box/c38_box/surplus, +/obj/item/storage/box/ammo/c38_surplus, /obj/effect/decal/cleanable/dirt, /turf/open/floor/carpet/nanoweave, /area/ship/crew/crewtwo) diff --git a/_maps/shuttles/roumain/srm_elder.dmm b/_maps/shuttles/roumain/srm_elder.dmm index 0e501c62ed57..23c64f4681a6 100644 --- a/_maps/shuttles/roumain/srm_elder.dmm +++ b/_maps/shuttles/roumain/srm_elder.dmm @@ -337,18 +337,12 @@ pixel_y = 14; pixel_x = 5 }, -/obj/item/ammo_box/c38_box{ - pixel_x = -6; - pixel_y = 7 - }, +/obj/item/storage/box/ammo/c38, /obj/item/ammo_box/magazine/illestren_a850r{ pixel_x = 8; pixel_y = 6 }, -/obj/item/ammo_box/c38_box{ - pixel_x = -6; - pixel_y = 1 - }, +/obj/item/storage/box/ammo/c38, /obj/item/ammo_box/magazine/illestren_a850r{ pixel_x = 8 }, @@ -2025,7 +2019,7 @@ pixel_x = -7 }, /obj/item/storage/backpack/satchel/leather, -/obj/item/ammo_box/a44roum, +/obj/item/storage/box/ammo/a44roum, /obj/item/storage/pistolcase/montagne, /obj/item/clothing/accessory/waistcoat/roumain, /turf/open/floor/wood/mahogany, @@ -2698,7 +2692,7 @@ /obj/item/gun/ballistic/revolver/detective, /obj/item/ammo_box/c38, /obj/item/ammo_box/c38, -/obj/item/ammo_box/c38_box, +/obj/item/storage/box/ammo/c38, /obj/item/clothing/head/cowboy/sec/roumain/colligne, /obj/item/clothing/suit/armor/roumain/colligne, /obj/structure/closet/secure_closet/collignes, diff --git a/_maps/shuttles/solgov/solgov_chronicle.dmm b/_maps/shuttles/solgov/solgov_chronicle.dmm index bacabd6cc23c..f08281a47103 100644 --- a/_maps/shuttles/solgov/solgov_chronicle.dmm +++ b/_maps/shuttles/solgov/solgov_chronicle.dmm @@ -273,7 +273,7 @@ /obj/item/spacecash/bundle/loadsamoney, /obj/item/clothing/neck/cloak/solgovcap, /obj/item/storage/pistolcase/modelh, -/obj/item/ammo_box/ferroslugbox, +/obj/item/storage/box/ammo/ferroslug, /turf/open/floor/carpet/royalblue, /area/ship/crew/office) "cg" = ( diff --git a/_maps/shuttles/solgov/solgov_inkwell.dmm b/_maps/shuttles/solgov/solgov_inkwell.dmm index 27427f9bbfa2..1a38d735246b 100644 --- a/_maps/shuttles/solgov/solgov_inkwell.dmm +++ b/_maps/shuttles/solgov/solgov_inkwell.dmm @@ -5934,7 +5934,7 @@ /obj/item/pen/fountain/solgov, /obj/item/clothing/neck/cloak/solgovcap, /obj/item/storage/pistolcase/modelh, -/obj/item/ammo_box/ferroslugbox, +/obj/item/storage/box/ammo/ferroslug, /turf/open/floor/wood/maple, /area/ship/crew/dorm/dormtwo) "LJ" = ( diff --git a/_maps/shuttles/solgov/solgov_paracelsus.dmm b/_maps/shuttles/solgov/solgov_paracelsus.dmm index 9cfda7a14c0d..e062f70d011d 100644 --- a/_maps/shuttles/solgov/solgov_paracelsus.dmm +++ b/_maps/shuttles/solgov/solgov_paracelsus.dmm @@ -3582,7 +3582,7 @@ /obj/item/pen/fountain/solgov, /obj/item/clothing/neck/cloak/solgovcap, /obj/item/storage/pistolcase/modelh, -/obj/item/ammo_box/ferroslugbox, +/obj/item/storage/box/ammo/ferroslug, /turf/open/floor/carpet/royalblue, /area/ship/crew) "IZ" = ( diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm index 66133d79d47a..84ace94a70a2 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_hyena.dmm @@ -65,7 +65,7 @@ /obj/item/ammo_box/a357/match, /obj/item/pen/edagger, /obj/item/storage/pistolcase/a357, -/obj/item/ammo_box/a357_box, +/obj/item/storage/box/ammo/a357, /turf/open/floor/carpet/black, /area/ship/bridge) "bJ" = ( @@ -301,8 +301,8 @@ /obj/effect/decal/cleanable/dirt/dust, /obj/machinery/airalarm/directional/north, /obj/effect/turf_decal/industrial/outline, -/obj/item/ammo_box/a12g, -/obj/item/ammo_box/c10mm, +/obj/item/storage/box/ammo/a12g_buckshot, +/obj/item/storage/box/ammo/c10mm, /turf/open/floor/mineral/plastitanium, /area/ship/security/armory) "fC" = ( diff --git a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm index c466f5351f9c..4b42a90bbb26 100644 --- a/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm +++ b/_maps/shuttles/syndicate/syndicate_gorlex_komodo.dmm @@ -5387,7 +5387,7 @@ }, /obj/item/ammo_box/magazine/m10mm_ringneck, /obj/item/ammo_box/magazine/m10mm_ringneck, -/obj/item/ammo_box/c10mm, +/obj/item/storage/box/ammo/c10mm, /obj/item/clothing/gloves/tackler/combat/insulated, /obj/structure/closet/secure_closet/wall/directional/west{ icon_state = "sec_wall"; diff --git a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm index 29f4bc28922b..3a3438c8f2f8 100644 --- a/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm +++ b/_maps/shuttles/syndicate/syndicate_twinkleshine.dmm @@ -7376,7 +7376,7 @@ }, /obj/item/storage/belt/sabre/solgov, /obj/item/storage/pistolcase/modelh, -/obj/item/ammo_box/ferroslugbox, +/obj/item/storage/box/ammo/ferroslug, /turf/open/floor/mineral/plastitanium, /area/ship/bridge) "Qv" = ( @@ -8879,7 +8879,7 @@ name = "Armory Access"; req_access = list(3,150) }, -/obj/item/ammo_box/c10mm, +/obj/item/storage/box/ammo/c10mm, /turf/open/floor/mineral/plastitanium, /area/ship/security) "YJ" = ( diff --git a/code/__DEFINES/vv.dm b/code/__DEFINES/vv.dm index 602473b6086d..e52d9af56251 100644 --- a/code/__DEFINES/vv.dm +++ b/code/__DEFINES/vv.dm @@ -92,6 +92,7 @@ #define VV_HK_AUTO_RENAME "auto_rename" #define VV_HK_RADIATE "radiate" #define VV_HK_EDIT_FILTERS "edit_filters" +#define VV_HK_SELL "sell_item" #define VV_HK_EDIT_PARTICLES "edit_particles" // /obj diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e7c9c19325a6..84744a9187d6 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1067,6 +1067,7 @@ VV_DROPDOWN_OPTION(VV_HK_TRIGGER_EXPLOSION, "Explosion") VV_DROPDOWN_OPTION(VV_HK_RADIATE, "Radiate") VV_DROPDOWN_OPTION(VV_HK_EDIT_FILTERS, "Edit Filters") + VV_DROPDOWN_OPTION(VV_HK_SELL, "Export Item") /atom/vv_do_topic(list/href_list) . = ..() @@ -1138,6 +1139,9 @@ var/client/C = usr.client C?.open_filter_editor(src) + if(href_list[VV_HK_SELL] && check_rights(R_ADMIN|R_DEBUG) && check_rights(R_VAREDIT)) + export_item_and_contents(src, allowed_categories = ALL, apply_elastic = FALSE) + /atom/vv_get_header() . = ..() var/refid = REF(src) diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index 0febe3327cb6..9e5c6732d1cb 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -83,7 +83,7 @@ /obj/item/mecha_ammo/tank_shell name = "anti-armor missile" desc = "A large missle, intended to be loaded into a Type 207." - icon = 'icons/obj/ammo_bullets.dmi' + icon = 'icons/obj/ammunition/ammo_bullets.dmi' icon_state = "srm-8" rounds = 1 throw_range = 0 diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 7548625b31f6..883265896fe5 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -575,7 +575,7 @@ RLD /obj/item/rcd_ammo name = "compressed matter cartridge" desc = "Highly compressed matter for the RCD." - icon = 'icons/obj/ammo.dmi' + icon = 'icons/obj/ammunition/ammo.dmi' icon_state = "rcd" item_state = "rcdammo" w_class = WEIGHT_CLASS_TINY diff --git a/code/game/objects/items/melee/weaponry.dm b/code/game/objects/items/melee/weaponry.dm index 11c1b118570b..131e5e1aab20 100644 --- a/code/game/objects/items/melee/weaponry.dm +++ b/code/game/objects/items/melee/weaponry.dm @@ -75,7 +75,7 @@ /obj/item/throwing_star/magspear name = "magnetic spear" desc = "A reusable spear that is typically loaded into kinetic spearguns." - icon = 'icons/obj/ammo_bullets.dmi' + icon = 'icons/obj/ammunition/ammo_bullets.dmi' icon_state = "magspear" throwforce = 25 //kills regular carps in one hit force = 10 diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index 959649c8c59b..249ee7dc41ed 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -20,7 +20,7 @@ /obj/item/shrapnel/bullet // bullets name = "bullet" - icon = 'icons/obj/ammo_bullets.dmi' + icon = 'icons/obj/ammunition/ammo_bullets.dmi' icon_state = "pistol-brass" item_flags = NONE diff --git a/code/game/objects/items/storage/ammo_can.dm b/code/game/objects/items/storage/ammo_can.dm new file mode 100644 index 000000000000..7962621674ad --- /dev/null +++ b/code/game/objects/items/storage/ammo_can.dm @@ -0,0 +1,52 @@ +//No idea why this is a toolbox but I'm not fixing that right now +/obj/item/storage/toolbox/ammo + name = "ammo can" + desc = "A metal container for storing multiple boxes of ammunition or grenades." + icon_state = "ammobox" + item_state = "ammobox" + drop_sound = 'sound/items/handling/ammobox_drop.ogg' + pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' + material_flags = NONE + has_latches = FALSE + +/obj/item/storage/toolbox/ammo/a850r/PopulateContents() + name = "ammo can (8x50mmR)" + icon_state = "ammobox_850" + for(var/i in 1 to 4) + new /obj/item/storage/box/ammo/a8_50r(src) + +/obj/item/storage/toolbox/ammo/a762_40/PopulateContents() + name = "ammo can (7.62x40mm CLIP)" + icon_state = "ammobox_762" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a762_40(src) + +/obj/item/storage/toolbox/ammo/a308/PopulateContents() + name = "ammo can (.308)" + icon_state = "ammobox_308" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a308(src) + +/obj/item/storage/toolbox/ammo/c45/PopulateContents() + name = "ammo can (.45)" + icon_state = "ammobox_45" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c45(src) + +/obj/item/storage/toolbox/ammo/c9mm/PopulateContents() + name = "ammo can (9mm)" + icon_state = "ammobox_9mm" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c9mm(src) + +/obj/item/storage/toolbox/ammo/c10mm/PopulateContents() + name = "ammo can (10mm)" + icon_state = "ammobox_10mm" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/c10mm(src) + +/obj/item/storage/toolbox/ammo/shotgun/PopulateContents() + name = "ammo can (12ga)" + icon_state = "ammobox_12ga" + for (var/i in 1 to 4) + new /obj/item/storage/box/ammo/a12g_buckshot(src) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 1d787e24e4d3..34eba9a25191 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -596,7 +596,7 @@ new /obj/item/clothing/shoes/magboots/syndie(src) new /obj/item/storage/firstaid/tactical(src) new /obj/item/gun/ballistic/automatic/toy(src) - new /obj/item/ammo_box/foambox/riot(src) + new /obj/item/storage/box/ammo/foam_darts/riot(src) /obj/item/storage/backpack/duffelbag/syndie/med/bioterrorbundle desc = "A large duffel bag containing deadly chemicals, a handheld chem sprayer, Bioterror foam grenade, a Donksoft assault rifle, box of riot grade darts, a dart pistol, and a box of syringes." @@ -607,7 +607,7 @@ new /obj/item/gun/syringe/syndicate(src) new /obj/item/gun/ballistic/automatic/toy(src) new /obj/item/storage/box/syringes(src) - new /obj/item/ammo_box/foambox/riot(src) + new /obj/item/storage/box/ammo/foam_darts/riot(src) new /obj/item/grenade/chem_grenade/bioterrorfoam(src) if(prob(5)) new /obj/item/reagent_containers/food/snacks/pizza/pineapple(src) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index c6d55e03ef48..3b7de4f3ad1d 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -285,7 +285,6 @@ /obj/item/ammo_box/magazine, /obj/item/ammo_box/c38, //speed loaders don't have a common path like magazines. pain. /obj/item/ammo_box/a357, //some day we should refactor these into an ammo_box/speedloader type - /obj/item/ammo_box/a4570, //but not today /obj/item/ammo_box/a858, //oh boy stripper clips too /obj/item/ammo_box/vickland_a308, /obj/item/ammo_box/a300, @@ -299,7 +298,8 @@ /obj/item/clothing/gloves, /obj/item/restraints/legcuffs/bola, /obj/item/holosign_creator/security, - /obj/item/stock_parts/cell/gun //WS edit Gun cells fit where they should and not where they dont + /obj/item/stock_parts/cell/gun, + /obj/item/ammo_box/magazine/ammo_stack, //handfuls of bullets )) /obj/item/storage/belt/security/full/PopulateContents() diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm index e0768391dae5..0ee29e08e052 100644 --- a/code/game/objects/items/storage/toolbox.dm +++ b/code/game/objects/items/storage/toolbox.dm @@ -225,58 +225,6 @@ new /obj/item/stack/cable_coil/cyan(src) new /obj/item/stack/cable_coil/white(src) -/obj/item/storage/toolbox/ammo - name = "ammo can" - desc = "A metal container for storing multiple boxes of ammunition or grenades." - icon_state = "ammobox" - item_state = "ammobox" - drop_sound = 'sound/items/handling/ammobox_drop.ogg' - pickup_sound = 'sound/items/handling/ammobox_pickup.ogg' - material_flags = NONE - has_latches = FALSE - -/obj/item/storage/toolbox/ammo/a850r/PopulateContents() - name = "ammo can (8x50mmR)" - icon_state = "ammobox_850" - for(var/i in 1 to 4) - new /obj/item/ammo_box/c8x50mm_box(src) - -/obj/item/storage/toolbox/ammo/a762_40/PopulateContents() - name = "ammo can (7.62x40mm CLIP)" - icon_state = "ammobox_762" - for (var/i in 1 to 4) - new /obj/item/ammo_box/a762_40(src) - -/obj/item/storage/toolbox/ammo/a308/PopulateContents() - name = "ammo can (.308)" - icon_state = "ammobox_308" - for (var/i in 1 to 4) - new /obj/item/ammo_box/a308(src) - -/obj/item/storage/toolbox/ammo/c45/PopulateContents() - name = "ammo can (.45)" - icon_state = "ammobox_45" - for (var/i in 1 to 4) - new /obj/item/ammo_box/c45(src) - -/obj/item/storage/toolbox/ammo/c9mm/PopulateContents() - name = "ammo can (9mm)" - icon_state = "ammobox_9mm" - for (var/i in 1 to 4) - new /obj/item/ammo_box/c9mm(src) - -/obj/item/storage/toolbox/ammo/c10mm/PopulateContents() - name = "ammo can (10mm)" - icon_state = "ammobox_10mm" - for (var/i in 1 to 4) - new /obj/item/ammo_box/c10mm(src) - -/obj/item/storage/toolbox/ammo/shotgun/PopulateContents() - name = "ammo can (12ga)" - icon_state = "ammobox_12ga" - for (var/i in 1 to 4) - new /obj/item/ammo_box/a12g(src) - /obj/item/storage/toolbox/infiltrator name = "insidious case" desc = "Bearing the emblem of the Syndicate, this case contains a full infiltrator stealth suit, and has enough room to fit weaponry if necessary." diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 6d6d258b5b0c..81e6ea9d54ec 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -245,7 +245,7 @@ /obj/item/toy/ammo/gun name = "capgun ammo" desc = "Make sure to recyle the box in an autolathe when it gets empty." - icon = 'icons/obj/ammo.dmi' + icon = 'icons/obj/ammunition/ammo.dmi' icon_state = "357OLD-7" w_class = WEIGHT_CLASS_TINY custom_materials = list(/datum/material/iron=10, /datum/material/glass=10) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm index 23aa2df0ab5a..77497b671617 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm @@ -328,10 +328,10 @@ ..() for(var/i in 1 to 3) new /obj/item/storage/box/lethalshot(src) - new /obj/item/ammo_box/magazine/co9mm(src) //WS edit - begin - better safe than sorry new /obj/item/ammo_box/magazine/co9mm(src) new /obj/item/ammo_box/magazine/co9mm(src) - new /obj/item/ammo_box/magazine/co9mm(src) //WS edit - end + new /obj/item/ammo_box/magazine/co9mm(src) + new /obj/item/ammo_box/magazine/co9mm(src) /obj/structure/closet/secure_closet/labor_camp_security name = "labor camp security locker" diff --git a/code/modules/antagonists/gang/outfits.dm b/code/modules/antagonists/gang/outfits.dm index 77c091d2126a..f76bf026e12c 100644 --- a/code/modules/antagonists/gang/outfits.dm +++ b/code/modules/antagonists/gang/outfits.dm @@ -30,10 +30,7 @@ backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, - /obj/item/shield/riot/tele = 1, - /obj/item/ammo_box/magazine/m45 = 3, - /obj/item/ammo_box/c45 = 2) - + /obj/item/shield/riot/tele = 1) /datum/outfit/families_police/beatcop/armored name = "Families: Armored Beat Cop" @@ -53,8 +50,7 @@ backpack_contents = list(/obj/item/storage/box/handcuffs = 1, /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, - /obj/item/shield/riot/tele = 1, - /obj/item/storage/box/lethalshot = 2) + /obj/item/shield/riot/tele = 1) /datum/outfit/families_police/beatcop/fbi name = "Families: Space FBI Officer" @@ -65,8 +61,7 @@ /obj/item/storage/box/teargas = 1, /obj/item/storage/box/flashbangs = 1, /obj/item/shield/riot/tele = 1, - /obj/item/ammo_box/magazine/smgm9mm = 3, - /obj/item/ammo_box/c9mm = 2) + /obj/item/ammo_box/magazine/smgm9mm = 3) /datum/outfit/families_police/beatcop/military name = "Families: Space Military" diff --git a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm index d5489edeb3e0..434a80c6416d 100644 --- a/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm +++ b/code/modules/cargo/blackmarket/blackmarket_items/ammo.dm @@ -28,7 +28,7 @@ /datum/blackmarket_item/ammo/himehabu_box name = ".22 LR Ammo Box" desc = "A 75 round ammo box of .22 LR. Trust me, you'll need every shot." - item = /obj/item/ammo_box/c22lr_box + item = /obj/item/storage/box/ammo/c22lr price_min = 100 price_max = 300 @@ -39,7 +39,7 @@ /datum/blackmarket_item/ammo/a357_box name = ".357 Ammo Box" desc = "A 50 round ammo box of .357." - item = /obj/item/ammo_box/a357_box + item = /obj/item/storage/box/ammo/a357 price_min = 150 price_max = 500 @@ -60,7 +60,7 @@ /datum/blackmarket_item/ammo/c299 name = "Eoehoma .299 Caseless Ammo Box" desc = "This ammunition for the E-40 Hybrid Rifle is probably worth more than the people you're shooting it at." - item = /obj/item/ammo_box/c299 + item = /obj/item/storage/box/ammo/c299 price_min = 300 price_max = 700 @@ -253,7 +253,7 @@ /datum/blackmarket_item/ammo/a4570hp name = ".45-70 Hollow Point Ammo Box" desc = "Put the hollow in hollow point by blowing a crater in some random sod with this devastating .45-70 cartridge." - item = /obj/item/ammo_box/a4570/hp + item = /obj/item/storage/box/ammo/a4570_hp price_min = 600 price_max = 1000 diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index be3ec7a26599..165cfb6c1196 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -59,7 +59,8 @@ then the player gets the profit from selling his own wasted time. if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) - qdel(thing) + if(!dry_run) + qdel(AM) return report diff --git a/code/modules/cargo/packs/ammo.dm b/code/modules/cargo/packs/ammo.dm index 8d8f47a05f65..716cb51d1e97 100644 --- a/code/modules/cargo/packs/ammo.dm +++ b/code/modules/cargo/packs/ammo.dm @@ -1,6 +1,7 @@ /datum/supply_pack/ammo group = "Ammunition" crate_type = /obj/structure/closet/crate/secure/gear + crate_name = "ammo crate" /* Pistol ammo @@ -45,7 +46,7 @@ /datum/supply_pack/ammo/mag_556mm name = "5.56 Pistole C Magazine Crate" desc = "Contains a 5.56mm magazine for the Pistole C, containing twelve rounds." - contains = list(/obj/item/ammo_box/magazine/pistol556mm) + contains = list(/obj/item/storage/box/ammo/c556mm) cost = 750 faction = FACTION_SOLGOV @@ -62,21 +63,21 @@ /datum/supply_pack/ammo/buckshot name = "Buckshot Crate" - desc = "Contains a box of twenty-five buckshot shells for use in lethal persuasion." + desc = "Contains a box of 32 buckshot shells for use in lethal persuasion." cost = 500 - contains = list(/obj/item/ammo_box/a12g) + contains = list(/obj/item/storage/box/ammo/a12g_buckshot) /datum/supply_pack/ammo/slugs name = "Shotgun Slug Crate" - desc = "Contains a box of twenty-five slug shells for use in lethal persuasion." + desc = "Contains a box of 32 slug shells for use in lethal persuasion." cost = 500 - contains = list(/obj/item/ammo_box/a12g/slug) - + contains = list(/obj/item/storage/box/ammo/a12g_slug +) /datum/supply_pack/ammo/blank_shells name = "Blank Shell Crate" desc = "Contains a box of blank shells." cost = 500 - contains = list(/obj/item/ammo_box/a12g/blanks) + contains = list(/obj/item/storage/box/ammo/a12g_blank) /datum/supply_pack/ammo/blank_ammo_disk name = "Blank Ammo Design Disk Crate" @@ -92,9 +93,9 @@ /datum/supply_pack/ammo/rubbershot name = "Rubbershot Crate" - desc = "Contains a box of twenty-five rubbershot shells for use in crowd control or training." + desc = "Contains a box of 32 rubbershot shells for use in crowd control or training." cost = 500 - contains = list(/obj/item/ammo_box/a12g/rubbershot) + contains = list(/obj/item/storage/box/ammo/a12g_rubbershot) /* .38 ammo @@ -104,8 +105,8 @@ name = ".38 Ammo Boxes Crate" desc = "Contains two 50 round ammo boxes for refilling .38 weapons." cost = 250 - contains = list(/obj/item/ammo_box/c38_box, - /obj/item/ammo_box/c38_box) + contains = list(/obj/item/storage/box/ammo/c38, + /obj/item/storage/box/ammo/c38) crate_name = "ammo crate" /datum/supply_pack/ammo/match @@ -195,134 +196,136 @@ /datum/supply_pack/ammo/a762_ammo_box name = "7.62x40mm CLIP Ammo Box Crate" - desc = "Contains a one hundred and twenty-round 7.62x40mm CLIP box for the SKM rifles." - contains = list(/obj/item/ammo_box/a762_40) + desc = "Contains two 60-round 7.62x40mm CLIP boxes for the SKM rifles." + contains = list(/obj/item/storage/box/ammo/a762_40, + /obj/item/storage/box/ammo/a762_40) cost = 500 /datum/supply_pack/ammo/a556_ammo_box name = "5.56x42mm CLIP Ammo Box Crate" - desc = "Contains a one hundred and twenty-round 5.56x42mm CLIP box for most newer rifles." - contains = list(/obj/item/ammo_box/a556_42) + desc = "Contains two 60-round 5.56x42mm CLIP boxes for most newer rifles." + contains = list(/obj/item/storage/box/ammo/a556_42, + /obj/item/storage/box/ammo/a556_42) cost = 450 /datum/supply_pack/ammo/a357_ammo_box name = ".357 Ammo Box Crate" - desc = "Contains a fifty-round .357 box for revolvers such as the Scarborough Revolver and the HP Firebrand." - contains = list(/obj/item/ammo_box/a357_box) + desc = "Contains a 48-round .357 box for revolvers such as the Scarborough Revolver and the HP Firebrand." + contains = list(/obj/item/storage/box/ammo/a357) cost = 250 /datum/supply_pack/ammo/c556mmHITP_ammo_box name = "5.56 Caseless Ammo Box Crate" - desc = "Contains a fifty-round 5.56mm caseless box for SolGov sidearms like the Pistole C." - contains = list(/obj/item/ammo_box/c556mmHITP) + desc = "Contains a 48-round 5.56mm caseless box for SolGov sidearms like the Pistole C." + contains = list(/obj/item/storage/box/ammo/c556mm) cost = 250 /datum/supply_pack/ammo/c45_ammo_box name = ".45 Ammo Box Crate" - desc = "Contains a fifty-round .45 box for pistols and SMGs like the Candor or the C-20r." - contains = list(/obj/item/ammo_box/c45) + desc = "Contains a 48-round .45 box for pistols and SMGs like the Candor or the C-20r." + contains = list(/obj/item/storage/box/ammo/c45) cost = 250 /datum/supply_pack/ammo/c10mm_ammo_box name = "10mm Ammo Box Crate" - desc = "Contains a fifty-round 10mm box for pistols and SMGs like the Ringneck or the SkM-44(k)." - contains = list(/obj/item/ammo_box/c10mm) + desc = "Contains a 48-round 10mm box for pistols and SMGs like the Ringneck or the SkM-44(k)." + contains = list(/obj/item/storage/box/ammo/c10mm) cost = 250 /datum/supply_pack/ammo/c9mm_ammo_box name = "9mm Ammo Box Crate" - desc = "Contains a fifty-round 9mm box for pistols and SMGs such as the Commander or Saber." - contains = list(/obj/item/ammo_box/c9mm) + desc = "Contains a 48-round 9mm box for pistols and SMGs such as the Commander or Saber." + contains = list(/obj/item/storage/box/ammo/c9mm) cost = 200 /datum/supply_pack/ammo/a308_ammo_box name = "308 Ammo Box Crate" desc = "Contains a thirty-round .308 box for DMRs such as the SsG-04 and CM-GAL-S." - contains = list(/obj/item/ammo_box/a308) + contains = list(/obj/item/storage/box/ammo/a308) cost = 500 /datum/supply_pack/ammo/c9mmap_ammo_box name = "9mm AP Ammo Box Crate" - desc = "Contains a fifty-round 9mm box loaded with armor piercing ammo." - contains = list(/obj/item/ammo_box/c9mm/ap) + desc = "Contains a 48-round 9mm box loaded with armor piercing ammo." + contains = list(/obj/item/storage/box/ammo/c9mm/ap) cost = 400 /datum/supply_pack/ammo/a357match_ammo_box name = ".357 Match Ammo Box Crate" - desc = "Contains a fifty-round .357 match box for better performance against armor." - contains = list(/obj/item/ammo_box/a357_box/match) + desc = "Contains a 48-round .357 match box for better performance against armor." + contains = list(/obj/item/storage/box/ammo/a357_match) cost = 500 /datum/supply_pack/ammo/c556mmHITPap_ammo_box name = "5.56 caseless AP Ammo Box Crate" - desc = "Contains a fifty-round 5.56mm caseless boxloaded with armor piercing ammo." - contains = list(/obj/item/ammo_box/c556mmHITP/ap) + desc = "Contains a 48-round 5.56mm caseless boxloaded with armor piercing ammo." + contains = list(/obj/item/storage/box/ammo/c556mm_ap) cost = 500 /datum/supply_pack/ammo/c45ap_ammo_box name = ".45 AP Ammo Box Crate" - desc = "Contains a fifty-round .45 box loaded with armor piercing ammo." - contains = list(/obj/item/ammo_box/c45/ap) + desc = "Contains a 48-round .45 box loaded with armor piercing ammo." + contains = list(/obj/item/storage/box/ammo/c45_ap) cost = 500 /datum/supply_pack/ammo/c10mmap_ammo_box name = "10mm AP Ammo Box Crate" - desc = "Contains a fifty-round 10mm box loaded with armor piercing ammo." - contains = list(/obj/item/ammo_box/c10mm/ap) + desc = "Contains a 48-round 10mm box loaded with armor piercing ammo." + contains = list(/obj/item/storage/box/ammo/c10mm_ap) cost = 500 /datum/supply_pack/ammo/c9mmhp_ammo_box name = "9mm HP Ammo Box Crate" - desc = "Contains a fifty-round 9mm box loaded with hollow point ammo, great against unarmored targets." - contains = list(/obj/item/ammo_box/c9mm/hp) + desc = "Contains a 48-round 9mm box loaded with hollow point ammo, great against unarmored targets." + contains = list(/obj/item/storage/box/ammo/c9mm_hp) cost = 400 /datum/supply_pack/ammo/a357hp_ammo_box name = ".357 HP Ammo Box Crate" - desc = "Contains a fifty-round .357 box loaded with hollow point ammo, great against unarmored targets." - contains = list(/obj/item/ammo_box/a357_box/hp) + desc = "Contains a 48-round .357 box loaded with hollow point ammo, great against unarmored targets." + contains = list(/obj/item/storage/box/ammo/a357_hp) cost = 500 /datum/supply_pack/ammo/c10mmhp_ammo_box name = "10mm HP Ammo Box Crate" - desc = "Contains a fifty-round 10mm box loaded with hollow point ammo, great against unarmored targets." - contains = list(/obj/item/ammo_box/c10mm/hp) + desc = "Contains a 48-round 10mm box loaded with hollow point ammo, great against unarmored targets." + contains = list(/obj/item/storage/box/ammo/c10mm_hp) cost = 500 + /datum/supply_pack/ammo/c45hp_ammo_box name = ".45 HP Ammo Box Crate" - desc = "Contains a fifty-round 10mm box loaded with hollow point ammo, great against unarmored targets." - contains = list(/obj/item/ammo_box/c45/hp) + desc = "Contains a 48-round 10mm box loaded with hollow point ammo, great against unarmored targets." + contains = list(/obj/item/storage/box/ammo/c45_hp) cost = 500 /datum/supply_pack/ammo/c556mmhitphp_ammo_box name = "5.56 Caseless HP Ammo Box Crate" - desc = "Contains a fifty-round 5.56mm caseless box loaded with hollow point ammo, great against unarmored targets." - contains = list(/obj/item/ammo_box/c556mmHITP/hp) + desc = "Contains a 48-round 5.56mm caseless box loaded with hollow point ammo, great against unarmored targets." + contains = list(/obj/item/storage/box/ammo/c556mm_hp) cost = 500 /datum/supply_pack/ammo/c9mmrubber_ammo_box name = "9mm Rubber Ammo Box Crate" - desc = "Contains a fifty-round 9mm box loaded with less-than-lethal rubber rounds." - contains = list(/obj/item/ammo_box/c9mm/rubbershot) + desc = "Contains a 48-round 9mm box loaded with less-than-lethal rubber rounds." + contains = list(/obj/item/storage/box/ammo/c9mm_rubber) cost = 200 /datum/supply_pack/ammo/c10mmrubber_ammo_box name = "10mm Rubber Ammo Box Crate" - desc = "Contains a fifty-round 10mm box loaded with less-than-lethal rubber rounds." - contains = list(/obj/item/ammo_box/c10mm/rubbershot) + desc = "Contains a 48-round 10mm box loaded with less-than-lethal rubber rounds." + contains = list(/obj/item/storage/box/ammo/c10mm_rubber) cost = 250 /datum/supply_pack/ammo/c45mmrubber_ammo_box name = ".45 Rubber Ammo Box Crate" - desc = "Contains a fifty-round .45 box loaded with less-than-lethal rubber rounds." - contains = list(/obj/item/ammo_box/c45/rubbershot) + desc = "Contains a 48-round .45 box loaded with less-than-lethal rubber rounds." + contains = list(/obj/item/storage/box/ammo/c45_rubber) cost = 250 - /datum/supply_pack/ammo/c556HITPrubber_ammo_box name = "5.56 Caseless Rubber Ammo Box Crate" - desc = "Contains a fifty-round 5.56 caseless box loaded with less-than-lethal rubber rounds." - contains = list(/obj/item/ammo_box/c556mmHITP/rubbershot) + desc = "Contains a 48-round 5.56 caseless box loaded with less-than-lethal rubber rounds." + contains = list(/obj/item/storage/box/ammo/c556mm_rubber) cost = 250 /datum/supply_pack/ammo/guncell @@ -339,93 +342,90 @@ /datum/supply_pack/ammo/c57x39mm_boxcrate name = "5.7x39mm Ammo Box Crate" - desc = "Contains a fifty-round 5.7x39mm box for PDWs such as the Sidewinder." - contains = list(/obj/item/ammo_box/c57x39mm_box) + desc = "Contains a 48-round 5.7x39mm box for PDWs such as the Sidewinder." + contains = list(/obj/item/storage/box/ammo/c57x39) cost = 250 /datum/supply_pack/ammo/c46x30mm_boxcrate name = "4.6x30mm Ammo Box Crate" - desc = "Contains a fifty-round 4.6x30mm box for PDWs such as the WT-550." - contains = list(/obj/item/ammo_box/c46x30mm_box) + desc = "Contains a 60-round 4.6x30mm box for PDWs such as the WT-550." + contains = list(/obj/item/storage/box/ammo/c46x30mm) cost = 250 /datum/supply_pack/ammo/c8x50mm_boxcrate name = "8x50mm Ammo Box Crate" - desc = "Contains a twenty-round 8x50mm ammo box for rifles such as the Illestren." - contains = list(/obj/item/ammo_box/c8x50mm_box) + desc = "Contains a 30-round 8x50mm ammo box for rifles such as the Illestren." + contains = list(/obj/item/storage/box/ammo/a8_50r) cost = 250 /datum/supply_pack/ammo/c8x50mm_boxhp_boxcrate name = "8x50mm Hollow Point Crate" - desc = "Contains a twenty-round 8x50mm ammo box loaded with hollow point ammo, great against unarmored targets." - contains = list(/obj/item/ammo_box/c8x50mmhp_box) + desc = "Contains a 30y-round 8x50mm ammo box loaded with hollow point ammo, great against unarmored targets." + contains = list(/obj/item/storage/box/ammo/a8_50r_hp) cost = 500 /datum/supply_pack/ammo/a300_box name = ".300 Ammo Box Crate" desc = "Contains a twenty-round .300 Magnum ammo box for sniper rifles such as the HP Scout." - contains = list(/obj/item/ammo_box/a300_box) + contains = list(/obj/item/storage/box/ammo/a300) cost = 400 /datum/supply_pack/ammo/a65clip_box name = "6.5x57mm CLIP Ammo Box Crate" desc = "Contains a twenty-round 6.5x57mm CLIP ammo box for various sniper rifles such as the CM-F90 and the Boomslang series." - contains = list(/obj/item/ammo_box/a65clip_box) + contains = list(/obj/item/storage/box/ammo/a65clip) cost = 400 - /datum/supply_pack/ammo/a4570_box name = ".45-70 Ammo Box Crate" - desc = "Contains a twelve-round box containing devastatingly powerful .45-70 caliber ammunition." - contains = list(/obj/item/ammo_box/a4570) + desc = "Contains a 20-round box containing devastatingly powerful .45-70 caliber ammunition." + contains = list(/obj/item/storage/box/ammo/a4570) cost = 500 /datum/supply_pack/ammo/a4570_box/match name = ".45-70 Match Crate" - desc = "Contains a twelve-round box containing devastatingly powerful .45-70 caliber ammunition, that travels faster, pierces armour better, and ricochets off targets." - contains = list(/obj/item/ammo_box/a4570/match) + desc = "Contains a 20-round box containing devastatingly powerful .45-70 caliber ammunition, that travels faster, pierces armour better, and ricochets off targets." + contains = list(/obj/item/storage/box/ammo/a4570_match) cost = 750 /datum/supply_pack/ammo/ferropelletboxcrate name = "Ferromagnetic Pellet Box Crate" - desc = "Contains a fifty-round ferromagnetic pellet ammo box for gauss guns such as the Claris." - contains = list(/obj/item/ammo_box/ferropelletbox) + desc = "Contains a 48-round ferromagnetic pellet ammo box for gauss guns such as the Claris." + contains = list(/obj/item/storage/box/ammo/ferropellet) cost = 250 /datum/supply_pack/ammo/ferroslugboxcrate name = "Ferromagnetic Slug Box Crate" desc = "Contains a twenty-round ferromagnetic slug for gauss guns such as the Model-H." - contains = list(/obj/item/ammo_box/ferroslugbox) + contains = list(/obj/item/storage/box/ammo/ferroslug) cost = 250 /datum/supply_pack/ammo/ferrolanceboxcrate name = "Ferromagnetic Lance Box Crate" - desc = "Contains a fifty-round box for high-powered gauss guns such as the GAR assault rifle." - contains = list(/obj/item/ammo_box/ferrolancebox) + desc = "Contains a 48-round box for high-powered gauss guns such as the GAR assault rifle." + contains = list(/obj/item/storage/box/ammo/ferrolance) cost = 250 /datum/supply_pack/ammo/a44roum name = ".44 Roumain Ammo Box Crate" - desc = "Contains a fifty-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne." - contains = list(/obj/item/ammo_box/a44roum) + desc = "Contains a 48-round box of .44 roumain ammo for revolvers such as the Shadow and Montagne." + contains = list(/obj/item/storage/box/ammo/a44roum) cost = 250 /datum/supply_pack/ammo/a44roum_rubber name = ".44 Roumain Rubber Ammo Box Crate" - desc = "Contains a fifty-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds." - contains = list(/obj/item/ammo_box/a44roum/rubber) + desc = "Contains a 48-round box of .44 roumain ammo loaded with less-than-lethal rubber rounds." + contains = list(/obj/item/storage/box/ammo/a44roum_rubber) cost = 250 /datum/supply_pack/ammo/a44roum_hp name = ".44 Roumain Hollow Point Ammo Box Crate" - desc = "Contains a fifty-round box of .44 roumain hollow point ammo, great against unarmored targets." - contains = list(/obj/item/ammo_box/a44roum/hp) + desc = "Contains a 48-round box of .44 roumain hollow point ammo, great against unarmored targets." + contains = list(/obj/item/storage/box/ammo/a44roum_hp) cost = 500 /datum/supply_pack/ammo/c22lr name = ".22 LR Ammo Box Crate" - desc = "Contains two 75 round ammo boxes for refilling .22 LR weapons." - contains = list(/obj/item/ammo_box/c22lr_box, - /obj/item/ammo_box/c22lr_box) - crate_name = "ammo crate" + desc = "Contains a 60-round ammo box for refilling .22 LR weapons." + contains = list(/obj/item/storage/box/ammo/c22lr) cost = 250 diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm index 8401455bf7d8..b685e0e4b8bb 100644 --- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm +++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm @@ -89,11 +89,11 @@ var/loops = rand(1,3) for(var/i in 1 to loops) var/ammotype = pick(list( - /obj/item/ammo_box/c8x50mm_box, - /obj/item/ammo_box/c45, - /obj/item/ammo_box/a357_box, - /obj/item/ammo_box/c45, - /obj/item/ammo_box/a4570, + /obj/item/storage/box/ammo/a8_50r, + /obj/item/storage/box/ammo/c45, + /obj/item/storage/box/ammo/a357, + /obj/item/storage/box/ammo/c45, + /obj/item/storage/box/ammo/a4570, /obj/item/stock_parts/cell/gun/mini)) backpack_contents += ammotype @@ -220,7 +220,11 @@ l_hand = /obj/item/flamethrower/full/tank - backpack_contents = list(/obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1,/obj/item/ammo_box/a12g=1,/obj/item/extinguisher=2,/obj/item/radio=1) + backpack_contents = list( + /obj/item/gun/ballistic/shotgun/doublebarrel/presawn=1, \ + /obj/item/storage/box/ammo/a12g_slug = 1, \ + /obj/item/extinguisher = 2, \ + /obj/item/radio=1) /datum/outfit/job/frontiersmen/ert/sentry_lmg diff --git a/code/modules/mining/abandoned_crates.dm b/code/modules/mining/abandoned_crates.dm index 406259246db1..4d5a07d4130f 100644 --- a/code/modules/mining/abandoned_crates.dm +++ b/code/modules/mining/abandoned_crates.dm @@ -232,7 +232,7 @@ new /obj/item/gun/ballistic/automatic/toy/pistol(src) new /obj/item/gun/ballistic/automatic/toy(src) new /obj/item/gun/ballistic/automatic/toy(src) - new /obj/item/ammo_box/foambox(src) + new /obj/item/storage/box/ammo/foam_darts(src) if(98) for(var/i in 1 to 3) new /mob/living/simple_animal/hostile/poison/bees/toxin(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm index 4869d4a95c1c..86224e131747 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm @@ -461,8 +461,8 @@ /obj/item/assembly/flash/handheld = 5, /obj/item/storage/box/evidence = 6, /obj/item/flashlight/seclite = 4, - /obj/item/ammo_box/c9mm/rubbershot = 3, - /obj/item/ammo_box/c9mm = 1, + /obj/item/storage/box/ammo/c9mm_rubber = 3, + /obj/item/storage/box/ammo/c9mm = 1, /obj/item/stock_parts/cell/gun = 3, /obj/item/coin/antagtoken = 1, /obj/item/grenade/stingbang = 1 diff --git a/code/modules/projectiles/ammunition/_ammunition.dm b/code/modules/projectiles/ammunition/_ammo_casing.dm similarity index 51% rename from code/modules/projectiles/ammunition/_ammunition.dm rename to code/modules/projectiles/ammunition/_ammo_casing.dm index b216296cfe8d..57b6e9b27b57 100644 --- a/code/modules/projectiles/ammunition/_ammunition.dm +++ b/code/modules/projectiles/ammunition/_ammo_casing.dm @@ -1,7 +1,7 @@ /obj/item/ammo_casing name = "bullet casing" desc = "A bullet casing." - icon = 'icons/obj/ammo_bullets.dmi' + icon = 'icons/obj/ammunition/ammo_bullets.dmi' icon_state = "pistol-brass" flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT @@ -30,16 +30,109 @@ /// Disable for things like rockets or other heavy ammunition that should only appear right-side up. var/auto_rotate = TRUE - var/pellets = 1 //Pellets for spreadshot - var/variance = 0 //Variance for inaccuracy fundamental to the casing - var/randomspread = FALSE //Randomspread for automatics - var/delay = 0 //Delay for energy weapons - var/click_cooldown_override = 0 //Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown. + ///Pellets for spreadshot + var/pellets = 1 + ///Variance for inaccuracy fundamental to the casing + var/variance = 0 + ///Randomspread for automatics + var/randomspread = FALSE + ///Delay for energy weapons + var/delay = 0 + ///Override this to make your gun have a faster fire rate, in tenths of a second. 4 is the default gun cooldown. + var/click_cooldown_override = 0 + ///If true, overrides the bouncing sfx from the turf to this one + var/list/bounce_sfx_override + + ///What this casing can be stacked into. + var/obj/item/ammo_box/magazine/stack_type = /obj/item/ammo_box/magazine/ammo_stack + ///Maximum stack size of ammunition + var/stack_size = 12 + +/obj/item/ammo_casing/attackby(obj/item/attacking_item, mob/user, params) + if(istype(attacking_item, /obj/item/ammo_box) && user.is_holding(src)) + add_fingerprint(user) + var/obj/item/ammo_box/ammo_box = attacking_item + var/obj/item/ammo_casing/other_casing = ammo_box.get_round(TRUE) + + if(try_stacking(other_casing, user)) + ammo_box.stored_ammo -= other_casing + ammo_box.update_ammo_count() + return - var/list/bounce_sfx_override // if true, overrides the bouncing sfx from the turf to this one + else if(istype(attacking_item, /obj/item/ammo_box/magazine/ammo_stack)) + add_fingerprint(user) + var/obj/item/ammo_box/magazine/ammo_stack = attacking_item + if(isturf(loc)) + var/boolets = 0 + for(var/obj/item/ammo_casing/bullet in loc) + if(bullet == src) + continue + if(!bullet.BB) + continue + if(length(ammo_stack.stored_ammo) >= ammo_stack.max_ammo) + break + if(ammo_stack.give_round(bullet, FALSE)) + boolets++ + break + if((boolets <= 0) && BB && !(length(ammo_stack.stored_ammo) >= ammo_stack.max_ammo)) + if(ammo_stack.give_round(src, FALSE)) + boolets++ + if(boolets > 0) + ammo_stack.update_ammo_count() + to_chat(user, span_notice("You collect [boolets] round\s. [ammo_stack] now contains [length(ammo_stack.stored_ammo)] round\s.")) + else + to_chat(user, span_warning("You can't stack any more!")) + return - var/bullet_per_box + else if(istype(attacking_item, /obj/item/ammo_casing)) + try_stacking(attacking_item, user) + return + return ..() + +/obj/item/ammo_casing/proc/try_stacking(obj/item/ammo_casing/other_casing, mob/living/user) + if(user) + add_fingerprint(user) + if(!other_casing.stack_type) + if(user) + to_chat(user, span_warning("[other_casing] can't be stacked.")) + return + if(!stack_type) + if(user) + to_chat(user, span_warning("[src] can't be stacked.")) + return + if(name != other_casing.name) //Has to match exactly + if(user) + to_chat(user, span_warning("You can't stack different types of ammunition.")) + return + if(stack_type != other_casing.stack_type) + if(user) + to_chat(user, span_warning("You can't stack [other_casing] with [src].")) + return + if(!BB || !other_casing.BB) //maybe allow empty casing stacking at a later date, when there's a feature to recycle casings + if(user) + to_chat(user, span_warning("You can't stack empty casings.")) + return + if((item_flags & IN_STORAGE) || (other_casing.item_flags & IN_STORAGE)) + if(user) + to_chat(user, span_warning("You can't stack casings while they are inside storage.")) + return + var/obj/item/ammo_box/magazine/ammo_stack/ammo_stack = other_casing.stack_with(src) + if(user) + user.put_in_hands(ammo_stack) + to_chat(user, span_notice("[src] has been stacked with [other_casing].")) + return ammo_stack + +/obj/item/ammo_casing/proc/stack_with(obj/item/ammo_casing/other_casing) + var/obj/item/ammo_box/magazine/ammo_stack/ammo_stack = new stack_type(drop_location()) + ammo_stack.name = "handful of [name]s" //"handful of .9mm bullet casings" + ammo_stack.base_icon_state = other_casing.icon_state + ammo_stack.caliber = caliber + ammo_stack.max_ammo = stack_size + ammo_stack.give_round(src) + ammo_stack.give_round(other_casing) + ammo_stack.update_ammo_count() + return ammo_stack /obj/item/ammo_casing/spent name = "spent bullet casing" @@ -53,7 +146,7 @@ pixel_y = base_pixel_y + rand(-10, 10) item_flags |= NO_PIXEL_RANDOM_DROP if(auto_rotate) - transform = transform.Turn(pick(0, 90, 180, 270)) + transform = transform.Turn(round(45 * rand(0, 32) / 2)) update_appearance() /obj/item/ammo_casing/Destroy() @@ -72,33 +165,11 @@ desc = "[initial(desc)][BB ? null : " This one is spent."]" return ..() -//proc to magically refill a casing with a new projectile +///Proc to magically refill a casing with a new projectile /obj/item/ammo_casing/proc/newshot() //For energy weapons, syringe gun, shotgun shells and wands (!). if(!BB) BB = new projectile_type(src, src) -/obj/item/ammo_casing/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/ammo_box)) - var/obj/item/ammo_box/box = I - if(isturf(loc)) - var/boolets = 0 - for(var/obj/item/ammo_casing/bullet in loc) - if (box.stored_ammo.len >= box.max_ammo) - break - if (bullet.BB) - if (box.give_round(bullet, 0)) - boolets++ - else - continue - if (boolets > 0) - box.update_appearance() - to_chat(user, "You collect [boolets] shell\s. [box] now contains [box.stored_ammo.len] shell\s.") - else - to_chat(user, "You fail to collect anything!") - else - return ..() - - /obj/item/ammo_casing/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) bounce_away(FALSE, NONE) . = ..() @@ -111,7 +182,6 @@ var/angle_of_movement = !isnull(shooter) ? (rand(-3000, 3000) / 100) + dir2angle(turn(shooter.dir, 180)) : rand(-3000, 3000) / 100 AddComponent(/datum/component/movable_physics, _horizontal_velocity = rand(400, 450) / 100, _vertical_velocity = rand(400, 450) / 100, _horizontal_friction = rand(20, 24) / 100, _z_gravity = PHYSICS_GRAV_STANDARD, _z_floor = 0, _angle_of_movement = angle_of_movement, _bounce_sound = bounce_sfx_override) - /obj/item/ammo_casing/proc/bounce_away(still_warm = FALSE, bounce_delay = 3) if(!heavy_metal) return diff --git a/code/modules/projectiles/ammunition/ballistic/lmg.dm b/code/modules/projectiles/ammunition/ballistic/lmg.dm index d46001951ba4..90030e7b0944 100644 --- a/code/modules/projectiles/ammunition/ballistic/lmg.dm +++ b/code/modules/projectiles/ammunition/ballistic/lmg.dm @@ -6,7 +6,6 @@ icon_state = "rifle-steel" caliber = "7.12x82mm" projectile_type = /obj/projectile/bullet/mm712x82 - bullet_per_box = 100 /obj/item/ammo_casing/mm712x82/ap name = "7.12x82mm armor-piercing bullet casing" diff --git a/code/modules/projectiles/ammunition/ballistic/pistol.dm b/code/modules/projectiles/ammunition/ballistic/pistol.dm index e8cb64a673d2..9e1f880ffe1b 100644 --- a/code/modules/projectiles/ammunition/ballistic/pistol.dm +++ b/code/modules/projectiles/ammunition/ballistic/pistol.dm @@ -6,7 +6,6 @@ icon_state = "pistol-steel" caliber = "10mm" projectile_type = /obj/projectile/bullet/c10mm - bullet_per_box = 50 /obj/item/ammo_casing/c10mm/surplus name = "10mm surplus bullet casing" @@ -46,7 +45,7 @@ icon_state = "pistol-brass" caliber = "9mm" projectile_type = /obj/projectile/bullet/c9mm - bullet_per_box = 50 + stack_size = 15 /obj/item/ammo_casing/c9mm/surplus name = "9mm surplus bullet casing" @@ -58,7 +57,7 @@ name = "9mm armor-piercing bullet casing" desc = "A 9mm armor-piercing bullet casing." bullet_skin = "ap" - projectile_type =/obj/projectile/bullet/c9mm/ap + projectile_type = /obj/projectile/bullet/c9mm/ap /obj/item/ammo_casing/c9mm/hp name = "9mm hollow point bullet casing" @@ -86,7 +85,7 @@ icon_state = "pistol-steel" caliber = ".45" projectile_type = /obj/projectile/bullet/c45 - bullet_per_box = 50 + stack_size = 12 /obj/item/ammo_casing/c45/surplus name = ".45 surplus bullet casing" @@ -125,18 +124,17 @@ desc = "A .50 AE bullet casing." caliber = ".50 AE" projectile_type = /obj/projectile/bullet/a50AE - bullet_per_box = 20 /obj/item/ammo_casing/a50AE/hp name = ".50 AE hollow point bullet casing" desc = "A .50 AE hollow point bullet casing." projectile_type = /obj/projectile/bullet/a50AE/hp -// .22 LR (Himehabu) +// .22 LR (Himehabu, Pounder) + /obj/item/ammo_casing/c22lr name = ".22 LR bullet casing" desc = "A .22 LR bullet casing." projectile_type = /obj/projectile/bullet/c22lr caliber = "22lr" - bullet_per_box = 75 - + stack_size = 15 diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 8705a932b392..5b6e8b2e0961 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -6,7 +6,6 @@ caliber = ".357" icon_state = "magnum-brass" projectile_type = /obj/projectile/bullet/a357 - bullet_per_box = 50 /obj/item/ammo_casing/a357/match name = ".357 match bullet casing" @@ -29,7 +28,7 @@ caliber = ".45-70" icon_state = "magnum-brass" projectile_type = /obj/projectile/bullet/a4570 - bullet_per_box = 12 + stack_size = 5 /obj/item/ammo_casing/a4570/match name = ".45-70 match bullet casing" @@ -55,14 +54,12 @@ desc = "A .38 Special bullet casing." caliber = ".38" projectile_type = /obj/projectile/bullet/c38 - bullet_per_box = 50 /obj/item/ammo_casing/c38/surplus name = ".38 surplus bullet casing" desc = "A .38 surplus bullet casing." projectile_type = /obj/projectile/bullet/c38/surplus - /obj/item/ammo_casing/c38/trac name = ".38 TRAC bullet casing" desc = "A .38 \"TRAC\" bullet casing." diff --git a/code/modules/projectiles/ammunition/ballistic/rifle.dm b/code/modules/projectiles/ammunition/ballistic/rifle.dm index 9f71e2973848..04545410300b 100644 --- a/code/modules/projectiles/ammunition/ballistic/rifle.dm +++ b/code/modules/projectiles/ammunition/ballistic/rifle.dm @@ -6,7 +6,7 @@ icon_state = "rifle-brass" caliber = "8x50mmR" projectile_type = /obj/projectile/bullet/a8_50r - bullet_per_box = 20 + stack_size = 10 /obj/item/ammo_casing/a8_50rhp name = "8x50mmR hollow point bullet casing" @@ -14,7 +14,7 @@ icon_state = "rifle-brass-hollow" caliber = "8x50mmR" projectile_type = /obj/projectile/bullet/a8_50rhp - + stack_size = 10 // 8x58mm Caseless (SSG-669C) @@ -24,7 +24,7 @@ icon_state = "caseless" caliber = "a858" projectile_type = /obj/projectile/bullet/a858 - bullet_per_box = 20 + stack_size = 10 // .300 Magnum (Smile Rifle) @@ -34,7 +34,7 @@ icon_state = "rifle-steel" caliber = "a300" projectile_type = /obj/projectile/bullet/a300 - bullet_per_box = 20 + stack_size = 15 // 5.56x42mm CLIP (CM82, Hydra variants) @@ -44,7 +44,7 @@ icon_state = "rifle-brass" caliber = "5.56x42mm" projectile_type = /obj/projectile/bullet/a556_42 - bullet_per_box = 80 + stack_size = 5 // 5.45x39mm (SKM-24v) @@ -55,7 +55,7 @@ caliber = "5.45x39mm" randomspread = TRUE projectile_type = /obj/projectile/bullet/a545_39 - bullet_per_box = 80 + stack_size = 15 /obj/item/ammo_casing/a545_39/recycled name = "recycled 5.45x39mm bullet casing" @@ -63,6 +63,7 @@ bullet_skin = "surplus" caliber = "5.45x39mm" projectile_type = /obj/projectile/bullet/a545_39 + stack_size = 15 // 7.62x40mm CLIP (SKM Rifles) @@ -72,7 +73,7 @@ icon_state = "rifle-brass" caliber = "7.62x40mm" projectile_type = /obj/projectile/bullet/a762_40 - bullet_per_box = 80 + stack_size = 15 //.308 (M514 EBR & CM-GAL-S) @@ -82,7 +83,7 @@ icon_state = "rifle-brass" caliber = ".308" projectile_type = /obj/projectile/bullet/a308 - bullet_per_box = 20 + stack_size = 10 /obj/item/ammo_casing/caseless/c299 name = ".299 Eoehoma caseless bullet casing" @@ -90,7 +91,7 @@ icon_state = "caseless" caliber = ".299 caseless" projectile_type = /obj/projectile/bullet/c299 - bullet_per_box = 100 + stack_size = 5 /obj/item/ammo_casing/a65clip name = "6.5x57mm CLIP bullet casing" @@ -98,3 +99,4 @@ icon_state = "big-brass" caliber = "6.5CLIP" projectile_type = /obj/projectile/bullet/a65clip + stack_size = 5 diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 24854030c041..2bf041a0e661 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -3,12 +3,11 @@ /obj/item/ammo_casing/shotgun name = "shotgun slug" desc = "A 12-gauge lead slug." - icon = 'icons/obj/ammo_shotshells.dmi' icon_state = "slug" caliber = "12ga" custom_materials = list(/datum/material/iron=4000) projectile_type = /obj/projectile/bullet/slug - bullet_per_box = 25 + stack_size = 8 //Make sure this matches max_ammo variable on prefilled stacks (magazine/ammo_stack/prefilled) bounce_sfx_override = 'sound/weapons/gun/general/bulletcasing_shotgun_bounce.ogg' @@ -28,6 +27,7 @@ name = "beanbag slug" desc = "A weak beanbag slug for riot control." icon_state = "beanbag" + caliber = "12ga beanbag" custom_materials = list(/datum/material/iron=250) projectile_type = /obj/projectile/bullet/slug/beanbag @@ -35,6 +35,7 @@ name = "rubber shot" desc = "A shotgun casing filled with densely-packed rubber balls, used to incapacitate crowds from a distance." icon_state = "rubber" + caliber = "12ga rubber" projectile_type = /obj/projectile/bullet/pellet/rubbershot pellets = 8 variance = 25 @@ -44,6 +45,7 @@ name = "incendiary slug" desc = "An incendiary-coated shotgun slug." icon_state = "incendiary" + caliber = "12ga incendiary" projectile_type = /obj/projectile/bullet/incendiary/shotgun /obj/item/ammo_casing/shotgun/blank @@ -57,6 +59,7 @@ name = "improvised shell" desc = "An extremely weak shotgun shell with multiple small pellets made out of metal shards." icon_state = "improvised" + caliber = "improvised 12ga" projectile_type = /obj/projectile/bullet/pellet/improvised custom_materials = list(/datum/material/iron=250) pellets = 10 diff --git a/code/modules/projectiles/ammunition/ballistic/smg.dm b/code/modules/projectiles/ammunition/ballistic/smg.dm index 39086b8cc66f..5e0602da6db2 100644 --- a/code/modules/projectiles/ammunition/ballistic/smg.dm +++ b/code/modules/projectiles/ammunition/ballistic/smg.dm @@ -6,7 +6,6 @@ icon_state = "rifle-steel" caliber = "5.7x39mm" projectile_type = /obj/projectile/bullet/c57x39mm - bullet_per_box = 50 // 4.6x30mm (WT-550 Automatic Rifle & SKM-24v) @@ -16,7 +15,7 @@ icon_state = "rifle-brass" caliber = "4.6x30mm" projectile_type = /obj/projectile/bullet/c46x30mm - bullet_per_box = 50 + stack_size = 15 /obj/item/ammo_casing/c46x30mm/ap name = "4.6x30mm armor-piercing bullet casing" @@ -29,7 +28,6 @@ desc = "A 4.6x30mm incendiary bullet casing." bullet_skin = "incen" projectile_type = /obj/projectile/bullet/incendiary/c46x30mm - bullet_per_box = 50 // 4.73x33mm caseless (Solar) @@ -39,7 +37,6 @@ icon_state = "caseless" caliber = "4.73x33mm caseless" projectile_type = /obj/projectile/bullet/c47x33mm - bullet_per_box = 50 // 5.56mm HITP caseless (Pistole C) diff --git a/code/modules/projectiles/ammunition/ballistic/sniper.dm b/code/modules/projectiles/ammunition/ballistic/sniper.dm index e4b668c2228f..af7369204e6d 100644 --- a/code/modules/projectiles/ammunition/ballistic/sniper.dm +++ b/code/modules/projectiles/ammunition/ballistic/sniper.dm @@ -6,7 +6,6 @@ icon_state = "big-steel" caliber = ".50 BMG" projectile_type = /obj/projectile/bullet/p50 - bullet_per_box = 20 /obj/item/ammo_casing/p50/soporific name = ".50 BMG soporific bullet casing" diff --git a/code/modules/projectiles/ammunition/caseless/foam.dm b/code/modules/projectiles/ammunition/caseless/foam.dm index 0051680fd1e8..3c71d31eb5ed 100644 --- a/code/modules/projectiles/ammunition/caseless/foam.dm +++ b/code/modules/projectiles/ammunition/caseless/foam.dm @@ -9,7 +9,6 @@ custom_materials = list(/datum/material/iron = 11.25) harmful = FALSE var/modified = FALSE - bullet_per_box = 40 /obj/item/ammo_casing/caseless/foam_dart/update_icon_state() . = ..() diff --git a/code/modules/projectiles/boxes_magazines/_box_magazine.dm b/code/modules/projectiles/boxes_magazines/_box_magazine.dm index 7f92dfad16a6..57fb71d17f32 100644 --- a/code/modules/projectiles/boxes_magazines/_box_magazine.dm +++ b/code/modules/projectiles/boxes_magazines/_box_magazine.dm @@ -4,7 +4,7 @@ /obj/item/ammo_box name = "ammo box (null_reference_exception)" desc = "A box of ammo." - icon = 'icons/obj/ammo.dmi' + icon = 'icons/obj/ammunition/ammo.dmi' flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT item_state = "syringe_kit" @@ -26,7 +26,7 @@ ///String, used for checking if ammo of different types but still fits can fit inside it; generally used for magazines var/caliber ///Allows multiple bullets to be loaded in from one click of another box/magazine - var/multiload = TRUE + var/multiload = FALSE ///Whether or not an ammo box skips the do_after process (e.g. speedloaders) var/instant_load = FALSE ///Whether the magazine should start with nothing in it @@ -40,22 +40,42 @@ . = ..() if(!base_icon_state) base_icon_state = icon_state - if (!bullet_cost) + + if(!bullet_cost) for (var/material in custom_materials) var/material_amount = custom_materials[material] LAZYSET(base_cost, material, (material_amount * 0.10)) material_amount *= 0.90 // 10% for the container material_amount /= max_ammo - LAZYSET(bullet_cost, material, material_amount) + LAZYSET(bullet_cost, material, material_amount). + if(!start_empty) - for(var/i = 1, i <= max_ammo, i++) - stored_ammo += new ammo_type(src) - update_ammo_count() + top_off(starting = TRUE) + + update_appearance() + +/* + * top_off is used to refill the magazine to max, in case you want to increase the size of a magazine with VV then refill it at once + * Arguments: + * load_type - if you want to specify a specific ammo casing type to load, enter the path here, otherwise it'll use the basic [/obj/item/ammo_box/var/ammo_type]. Must be a compatible round + * starting - Relevant for revolver cylinders, if FALSE then we mind the nulls that represent the empty cylinders (since those nulls don't exist yet if we haven't initialized when this is TRUE) + */ +/obj/item/ammo_box/proc/top_off(load_type, starting=FALSE) + if(!load_type) //this check comes first so not defining an argument means we just go with default ammo + load_type = ammo_type + + var/obj/item/ammo_casing/round_check = load_type + if(!starting && (caliber && initial(round_check.caliber) != caliber) || (!caliber && load_type != ammo_type)) + stack_trace("Tried loading unsupported ammocasing type [load_type] into ammo box [type].") + return + + for(var/i = max(1, stored_ammo.len), i <= max_ammo, i++) + stored_ammo += new round_check(src) ///gets a round from the magazine, if keep is TRUE the round will stay in the gun /obj/item/ammo_box/proc/get_round(keep = FALSE) - if (!stored_ammo.len) + if(!stored_ammo.len) return null else var/b = stored_ammo[stored_ammo.len] @@ -70,7 +90,7 @@ if(!R || (caliber && R.caliber != caliber) || (!caliber && R.type != ammo_type)) return FALSE - if (stored_ammo.len < max_ammo) + if(stored_ammo.len < max_ammo) stored_ammo += R R.forceMove(src) return TRUE @@ -93,12 +113,14 @@ /obj/item/ammo_box/attackby(obj/item/attacking_obj, mob/user, params, silent = FALSE, replace_spent = FALSE) var/num_loaded = 0 + if(!can_load(user)) return - if(istype(attacking_obj, /obj/item/ammo_box)) + + if(istype(attacking_obj, /obj/item/ammo_box/magazine/ammo_stack)) var/obj/item/ammo_box/attacking_box = attacking_obj for(var/obj/item/ammo_casing/casing_to_insert in attacking_box.stored_ammo) - if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box))) + if(!((instant_load && attacking_box.instant_load) || (stored_ammo.len >= max_ammo) || do_after(user, 1 SECONDS, attacking_box, timed_action_flags = IGNORE_USER_LOC_CHANGE))) break var/did_load = give_round(casing_to_insert, replace_spent) if(!did_load) @@ -114,15 +136,14 @@ var/obj/item/ammo_casing/casing_to_insert = attacking_obj if(give_round(casing_to_insert, replace_spent)) user.transferItemToLoc(casing_to_insert, src, TRUE) - if(!silent) - playsound(casing_to_insert, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) num_loaded++ + casing_to_insert.update_appearance() update_ammo_count() - if(num_loaded) if(!silent) - to_chat(user, "You load [num_loaded] cartridge\s into \the [src]!") + to_chat(user, span_notice("You load [num_loaded] cartridge\s into \the [src]!")) + playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) return num_loaded /obj/item/ammo_box/afterattack(atom/target, mob/user, proximity_flag, click_parameters) @@ -145,6 +166,7 @@ if(num_loaded) to_chat(user, "You load [num_loaded] cartridge\s into \the [to_load]!") return + /obj/item/ammo_box/attack_self(mob/user) var/obj/item/ammo_casing/A = get_round() if(!A) @@ -155,7 +177,7 @@ if(!(user.is_holding(src) || H.l_store == src || H.r_store == src) || !user.put_in_hands(A)) //incase they're using TK A.bounce_away(FALSE, NONE) playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) - to_chat(user, "You remove a round from [src]!") + to_chat(user, span_notice("You remove a round from [src]!")) update_ammo_count() /// Updates the materials and appearance of this ammo box @@ -218,6 +240,7 @@ var/list/L = stored_ammo.Copy() if(drop_list) stored_ammo.Cut() + update_ammo_count() return L ///drops the entire contents of the magazine on the floor @@ -226,6 +249,7 @@ for(var/obj/item/ammo in stored_ammo) ammo.forceMove(turf_mag) stored_ammo -= ammo + update_ammo_count() /obj/item/ammo_box/magazine/handle_atom_del(atom/A) stored_ammo -= A diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm deleted file mode 100644 index 5b78f1fc93a1..000000000000 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ /dev/null @@ -1,565 +0,0 @@ -// .357 Speed Loaders (Syndicate Revolver) - -/obj/item/ammo_box/a357 - name = "speed loader (.357)" - desc = "A 6-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor." - icon_state = "speedloader_357-6" - base_icon_state = "speedloader_357" - ammo_type = /obj/item/ammo_casing/a357 - caliber = ".357" - max_ammo = 6 - multiple_sprites = AMMO_BOX_PER_BULLET - item_flags = NO_MAT_REDEMPTION - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE - -/obj/item/ammo_box/a357/empty - start_empty = TRUE - -/obj/item/ammo_box/a357/match - name = "speed loader (.357 match)" - desc = "A 6-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." - ammo_type = /obj/item/ammo_casing/a357/match - -/obj/item/ammo_box/a357/hp - name = "speed loader (.357 hollow point)" - desc = "A 6-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones." - ammo_type = /obj/item/ammo_casing/a357/hp - -/obj/item/ammo_box/a357_box - name = "ammo box (.357)" - desc = "A box of standard .357 ammo." - icon_state = "357box" - ammo_type = /obj/item/ammo_casing/a357 - max_ammo = 50 - -/obj/item/ammo_box/a357_box/match - name = "ammo box (.357)" - desc = "A box of match .357 ammo." - icon_state = "357box-match" - ammo_type = /obj/item/ammo_casing/a357/match - max_ammo = 50 - -/obj/item/ammo_box/a357_box/hp - name = "ammo box (.357)" - desc = "A box of hollow point .357 ammo." - icon_state = "357box-hp" - ammo_type = /obj/item/ammo_casing/a357/hp - max_ammo = 50 - - -// .45-70 Ammo Holders (Hunting Revolver) - -/obj/item/ammo_box/a4570 - name = "ammo box (.45-70)" - desc = "A box of top grade .45-70 ammo. These rounds do significant damage with average performance against armor." - icon_state = "4570" - ammo_type = /obj/item/ammo_casing/a4570 - max_ammo = 18 - -/obj/item/ammo_box/a4570/match - name = "ammo box (.45-70 match)" - desc = "A 18-round ammo box for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." - icon_state = "4570-match" - ammo_type = /obj/item/ammo_casing/a4570/match - - -/obj/item/ammo_box/a4570/hp - name = "ammo box (.45-70 hollow point)" - desc = "A 18-round ammo box for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones." - icon_state = "4570-hp" - ammo_type = /obj/item/ammo_casing/a4570/hp - -/obj/item/ammo_box/a4570/explosive - name = "ammo box (.45-70 explosive)" - desc = "A 18-round ammo box for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs." - icon_state = "4570-explosive" - ammo_type = /obj/item/ammo_casing/a4570/explosive - - -// .38 special Speed Loaders (Colt Detective Special) - -/obj/item/ammo_box/c38 - name = "speed loader (.38 special)" - desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do okay damage, but struggle against armor." - icon_state = "speedloader_38-6" - base_icon_state = "speedloader_38" - ammo_type = /obj/item/ammo_casing/c38 - caliber = ".38" - max_ammo = 6 - multiple_sprites = AMMO_BOX_PER_BULLET - custom_materials = list(/datum/material/iron = 15000) - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE - -/obj/item/ammo_box/c38/trac - name = "speed loader (.38 TRAC)" - desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These TRAC rounds do pitiful damage, but embed a tracking device in targets hit." - ammo_type = /obj/item/ammo_casing/c38/trac - -/obj/item/ammo_box/c38/match - name = "speed loader (.38 match)" - desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." - ammo_type = /obj/item/ammo_casing/c38/match - -/obj/item/ammo_box/c38/match/bouncy - name = "speed loader (.38 rubber)" - desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with." - ammo_type = /obj/item/ammo_casing/c38/match/bouncy - -/obj/item/ammo_box/c38/dumdum - name = "speed loader (.38 dum-dum)" - desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These dum-dum bullets shatter on impact and embed in the target's innards. However, they're nearly ineffective against armor and do okay damage." - ammo_type = /obj/item/ammo_casing/c38/dumdum - -/obj/item/ammo_box/c38/hotshot - name = "speed loader (.38 hearth)" - desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hearthwine bullets contain an incendiary payload that set targets alight." - ammo_type = /obj/item/ammo_casing/c38/hotshot - -/obj/item/ammo_box/c38/iceblox - name = "speed loader (.38 chilled)" - desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These icewine bullets contain a cryogenic payload that chills targets." - ammo_type = /obj/item/ammo_casing/c38/iceblox - -/obj/item/ammo_box/c38/empty - start_empty = TRUE - -// 8x58mm Stripper Clip (SSG-669C) - -/obj/item/ammo_box/a858 - name = "stripper clip (8x58mm)" - desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration." - icon_state = "enbloc_858" - ammo_type = /obj/item/ammo_casing/caseless/a858 - max_ammo = 5 - multiple_sprites = AMMO_BOX_PER_BULLET - instant_load = TRUE - -/obj/item/ammo_box/a858/empty - start_empty = TRUE - -// .308 Stripper Clip (Vickland) - -/obj/item/ammo_box/vickland_a308 - name = "stripper clip (.308)" - desc = "A 5-round stripper clip for the Vickland Battle Rifle. The Vickland itself has a 10 round capacity, so keep in mind two of these are needed to fully reload it. These rounds do good damage with significant armor penetration." - icon_state = "stripper_308-5" - base_icon_state = "stripper_308" - ammo_type = /obj/item/ammo_casing/a308 - max_ammo = 5 - multiple_sprites = AMMO_BOX_PER_BULLET - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE - -/obj/item/ammo_box/vickland_a308/empty - start_empty = TRUE - -// .300 Magnum Stripper Clip (Scout) - -/obj/item/ammo_box/a300 - name = "stripper clip (.300 Magnum)" - desc = "A 5-round stripper clip for the Scout Rifle. These rounds do great damage with significant armor penetration." - icon_state = "300m" - ammo_type = /obj/item/ammo_casing/a300 - max_ammo = 5 - multiple_sprites = AMMO_BOX_PER_BULLET - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE - -/obj/item/ammo_box/a300/empty - start_empty = TRUE -// 7.62 Stripper Clip (Polymer Survivor Rifle) - -/obj/item/ammo_box/a762_stripper - name = "stripper clip (7.62)" - desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration." - icon_state = "stripper_308-5" - base_icon_state = "stripper_308" - ammo_type = /obj/item/ammo_casing/a762_40 - caliber = "7.62x40mm" - max_ammo = 5 - multiple_sprites = AMMO_BOX_PER_BULLET - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE - -/obj/item/ammo_box/a762_stripper/empty - start_empty = TRUE -// Ferromagnetic Pellet Speed Loader (Claris) - -/obj/item/ammo_box/amagpellet_claris - name = "\improper Claris speed loader (ferromagnetic pellet)" - desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration." - icon_state = "claris-sl-1" - base_icon_state = "claris-sl" - ammo_type = /obj/item/ammo_casing/caseless/gauss - max_ammo = 22 - multiple_sprites = AMMO_BOX_FULL_EMPTY - item_flags = NO_MAT_REDEMPTION - instant_load = TRUE - -// Ammo Boxes - -/obj/item/ammo_box/c38_box - name = "ammo box (.38)" - desc = "A box of standard .38 Special ammo." - icon_state = "38box" - ammo_type = /obj/item/ammo_casing/c38 - max_ammo = 50 - -/obj/item/ammo_box/c38_box/surplus - name = "ammo box (.38 surplus)" - desc = "A box of low-quality .38 Special ammo." - icon_state = "38box-surplus" - ammo_type = /obj/item/ammo_casing/c38/surplus - -/obj/item/ammo_box/c38_box/hotshot - name = "ammo box (.38 hearth)" - desc = "An unorthodox .38 Special cartridge infused with hearthwine. Catches the target on fire." - icon_state = "38hotshot" - ammo_type = /obj/item/ammo_casing/c38/hotshot - -/obj/item/ammo_box/c38_box/iceblox - name = "ammo box (.38 chilled)" - desc = "An unorthodox .38 Special cartridge infused with icewine. Chills the target, slowing them down." - icon_state = "38iceblox" - ammo_type = /obj/item/ammo_casing/c38/iceblox - -/obj/item/ammo_box/a12g - name = "ammo box (12g buckshot)" - desc = "A box of 12-gauge buckshot shells, devastating at close range." - icon_state = "12gbox-buckshot" - ammo_type = /obj/item/ammo_casing/shotgun/buckshot - max_ammo = 25 - -/obj/item/ammo_box/a12g/slug - name = "ammo box (12g slug)" - desc = "A box of 12-gauge slugs, for improved accuracy and penetration." - icon_state = "12gbox-slug" - ammo_type = /obj/item/ammo_casing/shotgun - -/obj/item/ammo_box/a12g/beanbag - name = "ammo box (12g beanbag)" - desc = "A box of 12-gauge beanbag shells, for incapacitating targets." - icon_state = "12gbox-beanbag" - ammo_type = /obj/item/ammo_casing/shotgun/beanbag - -/obj/item/ammo_box/a12g/rubbershot - name = "ammo box (12g rubbershot)" - desc = "A box of 12-gauge rubbershot shells, designed for riot control." - icon_state = "12gbox-rubbershot" - ammo_type = /obj/item/ammo_casing/shotgun/rubbershot - -/obj/item/ammo_box/a12g/blanks - name = "ammo box (12g blanks)" - desc = "A box of 12-gauge blank shells, designed for training." - icon_state ="12gbox-slug" - ammo_type = /obj/item/ammo_casing/shotgun/blank - -/obj/item/ammo_box/c9mm - name = "ammo box (9mm)" - desc = "A box of standard 9mm ammo." - icon_state = "9mmbox" - ammo_type = /obj/item/ammo_casing/c9mm - max_ammo = 50 - -/obj/item/ammo_box/c9mm/surplus - name = "ammo box (9mm surplus)" - desc = "A box of low-quality 9mm ammo." - icon_state = "9mmbox-surplus" - ammo_type = /obj/item/ammo_casing/c9mm/surplus - -/obj/item/ammo_box/c9mm/rubbershot - name = "ammo box (9mm rubbershot)" - desc = "A box of 9mm rubbershot ammo, designed to disable targets without causing serious damage." - icon_state = "9mmbox-rubbershot" - ammo_type = /obj/item/ammo_casing/c9mm/rubber - -/obj/item/ammo_box/c9mm/ap - name = "ammo box (9mm armor-piercing)" - desc = "A box of 9mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage." - icon_state = "9mmbox-ap" - ammo_type = /obj/item/ammo_casing/c9mm/ap - -/obj/item/ammo_box/c9mm/hp - name = "ammo box (9mm hollow point)" - desc = "A box of 9mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." - icon_state = "9mmbox-hp" - ammo_type = /obj/item/ammo_casing/c9mm/hp - -/obj/item/ammo_box/c9mm/fire - name = "ammo box (9mm incendiary)" - desc = "A box of 9mm incendiary ammo, designed to ignite targets at the cost of initial damage." - icon_state = "9mmbox-incendiary" - ammo_type = /obj/item/ammo_casing/c9mm/inc - -/obj/item/ammo_box/c10mm - name = "ammo box (10mm)" - desc = "A box of standard 10mm ammo." - icon_state = "10mmbox" - ammo_type = /obj/item/ammo_casing/c10mm - max_ammo = 50 - -/obj/item/ammo_box/c10mm/surplus - name = "ammo box (10mm surplus)" - desc = "A box of low-quality 10mm ammo." - icon_state = "10mmbox-surplus" - ammo_type = /obj/item/ammo_casing/c10mm/surplus - -/obj/item/ammo_box/c10mm/rubbershot - name = "ammo box (10mm rubbershot)" - desc = "A box of 10mm rubbershot ammo, designed to disable targets without causing serious damage." - icon_state = "10mmbox-rubbershot" - ammo_type = /obj/item/ammo_casing/c10mm/rubber - -/obj/item/ammo_box/c10mm/ap - name = "ammo box (10mm armor-piercing)" - desc = "A box of 10mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage." - icon_state = "10mmbox-ap" - ammo_type = /obj/item/ammo_casing/c10mm/ap - -/obj/item/ammo_box/c10mm/hp - name = "ammo box (10mm hollow point)" - desc = "A box of 10mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." - icon_state = "10mmbox-hp" - ammo_type = /obj/item/ammo_casing/c10mm/hp - -/obj/item/ammo_box/c10mm/fire - name = "ammo box (10mm incendiary)" - desc = "A box of 10mm incendiary ammo, designed to ignite targets at the cost of initial damage." - icon_state = "10mmbox-incendiary" - ammo_type = /obj/item/ammo_casing/c10mm/inc - -/obj/item/ammo_box/c45 - name = "ammo box (.45)" - desc = "A box of standard .45 ammo." - icon_state = "45box" - ammo_type = /obj/item/ammo_casing/c45 - max_ammo = 50 - -/obj/item/ammo_box/c45/surplus - name = "ammo box (.45 surplus)" - desc = "A box of low-quality .45 ammo." - icon_state = "45box-surplus" - ammo_type = /obj/item/ammo_casing/c45/surplus - -/obj/item/ammo_box/c45/rubbershot - name = "ammo box (.45 rubbershot)" - desc = "A box of .45 rubbershot ammo, designed to disable targets without causing serious damage." - icon_state = "45box-rubbershot" - ammo_type = /obj/item/ammo_casing/c45/rubber - -/obj/item/ammo_box/c45/ap - name = "ammo box (.45 armor-piercing)" - desc = "A box of .45 armor-piercing ammo, designed to penetrate through armor at the cost of total damage." - icon_state = "45box-ap" - ammo_type = /obj/item/ammo_casing/c45/ap - -/obj/item/ammo_box/c45/hp - name = "ammo box (.45 hollow point)" - desc = "A box of .45 hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." - icon_state = "45box-hp" - ammo_type = /obj/item/ammo_casing/c45/hp - -/obj/item/ammo_box/c45/fire - name = "ammo box (.45 incendiary)" - desc = "A box of .45 incendiary ammo, designed to ignite targets at the cost of initial damage." - icon_state = "45box-incendiary" - ammo_type = /obj/item/ammo_casing/c45/inc - -/obj/item/ammo_box/c556mmHITP - name = "ammo box (5.56mm HITP caseless)" - desc = "A box of 5.56mm HITP caseless ammo, a SolGov standard." - icon_state = "556mmHITPbox" - ammo_type = /obj/item/ammo_casing/caseless/c556mm - max_ammo = 50 - -/obj/item/ammo_box/c556mmHITP/surplus - name = "ammo box (5.56mm HITP caseless surplus)" - desc = "A box of low-quality 5.56mm HITP caseless ammo." - icon_state = "556mmHITPbox-surplus" - ammo_type = /obj/item/ammo_casing/caseless/c556mm/surplus - -/obj/item/ammo_box/c556mmHITP/rubbershot - name = "ammo box (5.56mm HITP caseless rubbershot)" - desc = "A box of 5.56mm HITP caseless rubbershot ammo, designed to disable targets without causing serious damage." - icon_state = "556mmHITPbox-rubbershot" - ammo_type = /obj/item/ammo_casing/caseless/c556mm/rubbershot - -/obj/item/ammo_box/c556mmHITP/ap - name = "ammo box (5.56mm HITP caseless armor-piercing)" - desc = "A box of 5.56mm HITP caseless armor-piercing ammo, designed to penetrate through armor at the cost of total damage." - icon_state = "556mmHITPbox-ap" - ammo_type = /obj/item/ammo_casing/caseless/c556mm/ap - -/obj/item/ammo_box/c556mmHITP/hp - name = "ammo box (5.56mm HITP caseless hollow point)" - desc = "A box of 5.56mm HITP caseless hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." - icon_state = "556mmHITPbox-hp" - ammo_type = /obj/item/ammo_casing/caseless/c556mm/hp - -/obj/item/ammo_box/a40mm - name = "ammo box (40mm grenades)" - icon_state = "40mm" - ammo_type = /obj/item/ammo_casing/a40mm - max_ammo = 4 - multiple_sprites = AMMO_BOX_PER_BULLET - w_class = WEIGHT_CLASS_NORMAL - -/obj/item/ammo_box/a762_40 - name = "ammo box (7.62x40mm CLIP)" - icon_state = "a762_40box_big" - ammo_type = /obj/item/ammo_casing/a762_40 - max_ammo = 120 - w_class = WEIGHT_CLASS_NORMAL - -/obj/item/ammo_box/a762_40/inteq - icon_state = "a762_40box_big_inteq" - -/obj/item/ammo_box/a556_42 - name = "ammo box (5.56x42mm CLIP)" - icon_state = "a556_42box_big" - ammo_type = /obj/item/ammo_casing/a556_42 - max_ammo = 120 - w_class = WEIGHT_CLASS_NORMAL - -/obj/item/ammo_box/a308 - name = "ammo box (.308)" - icon_state = "a308box" - ammo_type = /obj/item/ammo_casing/a308 - max_ammo = 30 - -/obj/item/ammo_box/a308/hunterspride //just an alternative graphic for srm ships - icon_state = "a308box-HP" - -/obj/item/ammo_box/foambox - name = "ammo box (Foam Darts)" - icon = 'icons/obj/guns/toy.dmi' - icon_state = "foambox" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart - max_ammo = 40 - custom_materials = list(/datum/material/iron = 500) - -/obj/item/ammo_box/foambox/riot - icon_state = "foambox_riot" - ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot - custom_materials = list(/datum/material/iron = 50000) - -/obj/item/ammo_box/c22lr_box - name = "ammo box (.22 LR)" - desc = "A box of standard .22 LR ammo." - icon_state = "22lrbox" - ammo_type = /obj/item/ammo_casing/c22lr - max_ammo = 75 - -/obj/item/ammo_box/a44roum_speedloader - name = "speed loader (.44)" - desc = "Designed to quickly reload revolvers." - icon_state = "speedloader_38-6" - base_icon_state = "speedloader_38" - ammo_type = /obj/item/ammo_casing/a44roum - caliber = ".44 Roumain" - max_ammo = 6 - multiple_sprites = AMMO_BOX_PER_BULLET - custom_materials = list(/datum/material/iron = 15000) - w_class = WEIGHT_CLASS_TINY - instant_load = TRUE - -/obj/item/ammo_box/a44roum_speedloader/empty - start_empty = TRUE - -/obj/item/ammo_box/c57x39mm_box - name = "ammo box (5.7x39mm)" - desc = "A box of standard 5.7x39mm ammo." - icon_state = "57x39mmbox" - ammo_type = /obj/item/ammo_casing/c57x39mm - max_ammo = 50 - - -/obj/item/ammo_box/c46x30mm_box - name = "ammo box (4.6x30mm)" - desc = "A box of standard 4.6x30mm ammo." - icon_state = "46x30mmbox" - ammo_type = /obj/item/ammo_casing/c46x30mm - max_ammo = 50 - -/obj/item/ammo_box/c8x50mm_box - name = "ammo box (8x50mm)" - desc = "A box of standard 8x50mm ammo." - icon_state = "8x50mmbox" - ammo_type = /obj/item/ammo_casing/a8_50r - max_ammo = 25 - -/obj/item/ammo_box/ferropelletbox - name = "ammo box (ferromagnetic pellets)" - desc = "A box of ferromagnetic pellets." - icon_state = "ferropelletsbox" - ammo_type = /obj/item/ammo_casing/caseless/gauss - max_ammo = 50 - -/obj/item/ammo_box/ferroslugbox - name = "ammo box (ferromagnetic slugs)" - desc = "A box of standard ferromagnetic slugs." - icon_state = "ferroslugsbox" - ammo_type = /obj/item/ammo_casing/caseless/gauss/slug - max_ammo = 20 - -/obj/item/ammo_box/ferrolancebox - name = "ammo box (ferromagnetic lances)" - desc = "A box of standard ferromagnetic lances." - icon_state = "ferrolancesbox" - ammo_type = /obj/item/ammo_casing/caseless/gauss/lance - max_ammo = 50 - -/obj/item/ammo_box/c8x50mmhp_box - name = "ammo box (8x50mm)" - desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration." - icon_state = "8x50mmbox-hp" - ammo_type = /obj/item/ammo_casing/a8_50rhp - max_ammo = 20 - -/obj/item/ammo_box/a300_box - name = "ammo box (.300 Magnum)" - desc = "A box of standard .300 Magnum ammo." - icon_state = "300box" - ammo_type = /obj/item/ammo_casing/a300 - max_ammo = 20 - -/obj/item/ammo_box/a65clip_box - name = "ammo box (6.5x57mm CLIP)" - desc = "A box of standard 6.5x57mm CLIP ammo." - icon_state = "65box" - ammo_type = /obj/item/ammo_casing/a65clip - max_ammo = 20 - -/obj/item/ammo_box/a65clip_box/syndicate - icon_state = "65box_sa" - -/obj/item/ammo_box/a44roum - name = "ammo box (.44 roumain)" - desc = "A box of standard .44 roumain ammo." - icon_state = "a44roum" - ammo_type = /obj/item/ammo_casing/a44roum - max_ammo = 50 - -/obj/item/ammo_box/a44roum/rubber - name = "ammo box (.44 roumain rubber)" - desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage." - icon_state = "a44roum-rubber" - ammo_type = /obj/item/ammo_casing/a44roum/rubber - max_ammo = 50 - -/obj/item/ammo_box/a44roum/hp - name = "ammo box (.44 roumain hollow point)" - desc = "A box of .44 roumain hollow point ammo, designed to cause massive damage at the cost of armor penetration." - icon_state = "a44roum-hp" - ammo_type = /obj/item/ammo_casing/a44roum/hp - max_ammo = 50 - -/obj/item/ammo_box/c299 - name = "ammo box (.299 Eoehoma caseless)" - desc = "A box of .299 Eoehoma caseless, for use with the E-40 hybrid assault rifle." - icon_state = "299box" - ammo_type = /obj/item/ammo_casing/caseless/c299 - max_ammo = 120 - w_class = WEIGHT_CLASS_NORMAL // This is a lot of ammo diff --git a/code/modules/projectiles/boxes_magazines/ammo_loaders.dm b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm new file mode 100644 index 000000000000..70d9480493c6 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_loaders.dm @@ -0,0 +1,176 @@ +// .357 Speed Loaders + +/obj/item/ammo_box/a357 + name = "speed loader (.357)" + desc = "A 6-round speed loader for quickly reloading .357 revolvers. These rounds do good damage with average performance against armor." + icon_state = "speedloader_357-6" + base_icon_state = "speedloader_357" + ammo_type = /obj/item/ammo_casing/a357 + caliber = ".357" + max_ammo = 6 + multiple_sprites = AMMO_BOX_PER_BULLET + item_flags = NO_MAT_REDEMPTION + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +/obj/item/ammo_box/a357/empty + start_empty = TRUE + +/obj/item/ammo_box/a357/match + name = "speed loader (.357 match)" + desc = "A 6-round speed loader for quickly reloading .357 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." + ammo_type = /obj/item/ammo_casing/a357/match + +/obj/item/ammo_box/a357/hp + name = "speed loader (.357 hollow point)" + desc = "A 6-round speed loader for quickly reloading .357 revolvers. These hollow point rounds do incredible damage against soft targets, but are nearly ineffective against armored ones." + ammo_type = /obj/item/ammo_casing/a357/hp + +// .38 special Speed Loaders + +/obj/item/ammo_box/c38 + name = "speed loader (.38 special)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds do okay damage, but struggle against armor." + icon_state = "speedloader_38-6" + base_icon_state = "speedloader_38" + ammo_type = /obj/item/ammo_casing/c38 + caliber = ".38" + max_ammo = 6 + multiple_sprites = AMMO_BOX_PER_BULLET + custom_materials = list(/datum/material/iron = 15000) + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +/obj/item/ammo_box/c38/trac + name = "speed loader (.38 TRAC)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These TRAC rounds do pitiful damage, but embed a tracking device in targets hit." + ammo_type = /obj/item/ammo_casing/c38/trac + +/obj/item/ammo_box/c38/match + name = "speed loader (.38 match)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." + ammo_type = /obj/item/ammo_casing/c38/match + +/obj/item/ammo_box/c38/match/bouncy + name = "speed loader (.38 rubber)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These rounds are incredibly bouncy and MOSTLY nonlethal, making them great to show off trickshots with." + ammo_type = /obj/item/ammo_casing/c38/match/bouncy + +/obj/item/ammo_box/c38/dumdum + name = "speed loader (.38 dum-dum)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These dum-dum bullets shatter on impact and embed in the target's innards. However, they're nearly ineffective against armor and do okay damage." + ammo_type = /obj/item/ammo_casing/c38/dumdum + +/obj/item/ammo_box/c38/hotshot + name = "speed loader (.38 hot shot)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These hot shot bullets contain an incendiary payload that set targets alight." + ammo_type = /obj/item/ammo_casing/c38/hotshot + +/obj/item/ammo_box/c38/iceblox + name = "speed loader (.38 iceblox)" + desc = "A 6-round speed loader for quickly reloading .38 special revolvers. These iceblox bullets contain a cryogenic payload that chills targets." + ammo_type = /obj/item/ammo_casing/c38/iceblox + +/obj/item/ammo_box/c38/empty + start_empty = TRUE + +// 8x58mm Stripper Clip + +/obj/item/ammo_box/a858 + name = "stripper clip (8x58mm)" + desc = "A 5-round stripper clip for the SSG-669C rifle. These rounds do good damage with significant armor penetration." + icon_state = "enbloc_858" + ammo_type = /obj/item/ammo_casing/caseless/a858 + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + instant_load = TRUE + +/obj/item/ammo_box/a858/empty + start_empty = TRUE + +// .308 Stripper Clip + +/obj/item/ammo_box/vickland_a308 + name = "stripper clip (.308)" + desc = "A 5-round stripper clip for the Vickland Battle Rifle. The Vickland itself has a 10 round capacity, so keep in mind two of these are needed to fully reload it. These rounds do good damage with significant armor penetration." + icon_state = "stripper_308-5" + base_icon_state = "stripper_308" + ammo_type = /obj/item/ammo_casing/a308 + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +/obj/item/ammo_box/vickland_a308/empty + start_empty = TRUE + +// .300 Magnum Stripper Clip + +/obj/item/ammo_box/a300 + name = "stripper clip (.300 Magnum)" + desc = "A 5-round stripper clip for the Scout Rifle. These rounds do great damage with significant armor penetration." + icon_state = "300m" + ammo_type = /obj/item/ammo_casing/a300 + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +/obj/item/ammo_box/a300/empty + start_empty = TRUE + +// .300 Blackout Stripper Clip + +/obj/item/ammo_box/a762_stripper + name = "stripper clip (7.62)" + desc = "A 5-round stripper clip for makeshift bolt-action rifles. These rounds do good damage with good armor penetration." + icon_state = "stripper_308-5" + base_icon_state = "stripper_308" + ammo_type = /obj/item/ammo_casing/a762_40 + caliber = "7.62x40mm" + max_ammo = 5 + multiple_sprites = AMMO_BOX_PER_BULLET + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +/obj/item/ammo_box/a762_stripper/empty + start_empty = TRUE + +// Ferromagnetic Pellet Speed Loader + +/obj/item/ammo_box/amagpellet_claris + name = "\improper Claris speed loader (ferromagnetic pellet)" + desc = "A 22-round speed loader for quickly reloading the Claris rifle. Ferromagnetic pellets do okay damage with significant armor penetration." + icon_state = "claris-sl-1" + base_icon_state = "claris-sl" + ammo_type = /obj/item/ammo_casing/caseless/gauss + max_ammo = 22 + multiple_sprites = AMMO_BOX_FULL_EMPTY + item_flags = NO_MAT_REDEMPTION + instant_load = TRUE + +/obj/item/ammo_box/a40mm + name = "ammo box (40mm grenades)" + icon_state = "40mm" + ammo_type = /obj/item/ammo_casing/a40mm + max_ammo = 4 + multiple_sprites = AMMO_BOX_PER_BULLET + w_class = WEIGHT_CLASS_NORMAL + +// .44 Roumain speedloader + +/obj/item/ammo_box/a44roum_speedloader + name = "speed loader (.44)" + desc = "Designed to quickly reload revolvers." + icon_state = "speedloader_38-6" + base_icon_state = "speedloader_38" + ammo_type = /obj/item/ammo_casing/a44roum + caliber = ".44 Roumain" + max_ammo = 6 + multiple_sprites = AMMO_BOX_PER_BULLET + custom_materials = list(/datum/material/iron = 15000) + w_class = WEIGHT_CLASS_TINY + instant_load = TRUE + +/obj/item/ammo_box/a44roum_speedloader/empty + start_empty = TRUE diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm new file mode 100644 index 000000000000..f1e84780cb1e --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/_ammo_stack.dm @@ -0,0 +1,82 @@ +/** + * The ammo stack object itself, making this a magazine was the easiest way to handle it + * Practically every casing type needs an associated ammo stack type, because that was the easiest + * way for me to handle it. + */ +/obj/item/ammo_box/magazine/ammo_stack + name = "ammo stack" + desc = "A pile of live rounds." + icon = 'icons/obj/ammunition/ammo_bullets.dmi' + icon_state = "pistol-brass" + base_icon_state = "pistol-brass" + item_flags = NO_PIXEL_RANDOM_DROP + multiple_sprites = AMMO_BOX_ONE_SPRITE + multiload = FALSE + start_empty = TRUE + max_ammo = 12 + +/obj/item/ammo_box/magazine/ammo_stack/update_icon(updates) + icon = initial(icon) + cut_overlays() + return ..() + +/obj/item/ammo_box/magazine/ammo_stack/update_icon_state() + . = ..() + cut_overlays() + icon_state = "" + for(var/casing in stored_ammo) + var/image/bullet = image(initial(icon), src, "[base_icon_state]") + bullet.pixel_x = rand(-8, 8) + bullet.pixel_y = rand(-8, 8) + bullet.transform = bullet.transform.Turn(round(45 * rand(0, 32) / 2)) //this is the equation Eris uses on their bullet stacks + add_overlay(bullet) + return UPDATE_ICON_STATE | UPDATE_OVERLAYS + +/obj/item/ammo_box/magazine/ammo_stack/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum) + . = ..() + var/loc_before_del = loc + while(LAZYLEN(stored_ammo)) + var/obj/item/ammo = get_round(FALSE) + ammo.forceMove(loc_before_del) + ammo.throw_at(loc_before_del) + update_ammo_count() + +/obj/item/ammo_box/magazine/ammo_stack/update_ammo_count() + . = ..() + check_for_del() + +/obj/item/ammo_box/magazine/ammo_stack/proc/check_for_del() + . = FALSE + if((ammo_count() <= 0) && !QDELETED(src)) + qdel(src) + return + +/obj/item/ammo_box/magazine/ammo_stack/attackby(obj/item/handful, mob/user, params, silent = FALSE, replace_spent = 0) + var/num_loaded = 0 + if(!can_load(user)) + return + + if(istype(handful, /obj/item/ammo_box)) + var/obj/item/ammo_box/ammo_box = handful + for(var/obj/item/ammo_casing/casing in ammo_box.stored_ammo) + var/did_load = give_round(casing, replace_spent) + if(did_load) + ammo_box.stored_ammo -= casing + num_loaded++ + if(!did_load || !multiload) + break + if(num_loaded) + ammo_box.update_ammo_count() + + if(istype(handful, /obj/item/ammo_casing)) + var/obj/item/ammo_casing/casing = handful + if(give_round(casing, replace_spent)) + user.transferItemToLoc(casing, src, TRUE) + num_loaded++ + casing.update_appearance() + + if(num_loaded) + if(!silent) + to_chat(user, span_notice("You load [num_loaded] shell\s into \the [src]!")) + playsound(src, 'sound/weapons/gun/general/mag_bullet_insert.ogg', 60, TRUE) + update_ammo_count() diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm new file mode 100644 index 000000000000..8a28920efe6a --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/_premade_stacks.dm @@ -0,0 +1,21 @@ +/obj/item/ammo_box/magazine/ammo_stack/prefilled + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/Initialize(mapload) + make_stack() + update_appearance() + . = ..() + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/proc/make_stack() + var/obj/item/ammo_casing/to_copy = ammo_type + src.top_off() + caliber = to_copy.caliber + base_icon_state = "[initial(to_copy.icon_state)][to_copy.bullet_skin ? "-[to_copy.bullet_skin]" : ""]" + name = "handful of [to_copy.name]s" + +/obj/item/storage/box/ammo //base type, don't use this! + name = "box of default ammo" + desc = "A box of ammunition. Not for consumption." + icon = 'icons/obj/ammunition/ammo_boxes.dmi' + icon_state = "9mmbox" + illustration = null + foldable = null diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm new file mode 100644 index 000000000000..ac82cf6bcebd --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_gauss_stacks.dm @@ -0,0 +1,41 @@ +/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet + ammo_type = /obj/item/ammo_casing/caseless/gauss + +/obj/item/storage/box/ammo/ferropellet + name = "box of ferromagnetic pellets" + desc = "A box of ferromagnetic pellets for gauss firearms." + icon_state = "ferropelletsbox" + +/obj/item/storage/box/ammo/ferropellet/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferropellet = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug + ammo_type = /obj/item/ammo_casing/caseless/gauss/slug + +/obj/item/storage/box/ammo/ferroslug + name = "box of ferromagnetic slugs" + desc = "A box of standard ferromagnetic slugs for gauss firearms." + icon_state = "ferroslugsbox" + +/obj/item/storage/box/ammo/ferroslug/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferroslug = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance + ammo_type = /obj/item/ammo_casing/caseless/gauss/lance + +/obj/item/storage/box/ammo/ferrolance + name = "box of ferromagnetic lances" + desc = "A box of standard ferromagnetic lances for gauss firearms." + icon_state = "ferrolancesbox" + +/obj/item/storage/box/ammo/ferrolance/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/ferrolance = 4) + generate_items_inside(items_inside,src) diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm new file mode 100644 index 000000000000..b98da1f81000 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_lmg_stacks.dm @@ -0,0 +1,15 @@ +// 7.12x82mm (L6 SAW) +/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82 + ammo_type = /obj/item/ammo_casing/mm712x82 + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/ap + ammo_type = /obj/item/ammo_casing/mm712x82/ap + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/hp + ammo_type = /obj/item/ammo_casing/mm712x82/hp + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/incendiary + ammo_type = /obj/item/ammo_casing/mm712x82/inc + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/mm712x82/match + ammo_type = /obj/item/ammo_casing/mm712x82/match diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm new file mode 100644 index 000000000000..a24599138238 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_misc_stacks.dm @@ -0,0 +1,26 @@ +/obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts + ammo_type = /obj/item/ammo_casing/caseless/foam_dart + +/obj/item/storage/box/ammo/foam_darts + name = "box of foam darts" + icon = 'icons/obj/guns/toy.dmi' + icon_state = "foambox" + +/obj/item/storage/box/ammo/foam_darts/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts/riot + ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot + +/obj/item/storage/box/ammo/foam_darts/riot + name = "box of foam darts" + icon_state = "foambox_riot" + +/obj/item/storage/box/ammo/foam_darts/riot/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/foam_darts/riot = 4) + generate_items_inside(items_inside,src) diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm new file mode 100644 index 000000000000..68ea1a7faeb5 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_pistol_stacks.dm @@ -0,0 +1,499 @@ +// 10mm (Stechkin) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm + ammo_type = /obj/item/ammo_casing/c10mm + +/obj/item/storage/box/ammo/c10mm + name = "box of 10mm ammo" + desc = "A box of standard 10mm ammo." + icon_state = "10mmbox" + +/obj/item/storage/box/ammo/c10mm/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/surplus + ammo_type = /obj/item/ammo_casing/c10mm/surplus + +/obj/item/storage/box/ammo/c10mm_surplus + name = "box of surplus 10mm ammo" + desc = "A box of low-quality 10mm ammo." + icon_state = "10mmbox-surplus" + +/obj/item/storage/box/ammo/c10mm_surplus/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/ap + ammo_type = /obj/item/ammo_casing/c10mm/ap + +/obj/item/storage/box/ammo/c10mm_ap + name = "box of AP 10mm ammo" + desc = "A box of 10mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage." + icon_state = "10mmbox-ap" + +/obj/item/storage/box/ammo/c10mm_ap/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/ap = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/hp + ammo_type = /obj/item/ammo_casing/c10mm/hp + +/obj/item/storage/box/ammo/c10mm_hp + name = "box of HP 10mm ammo" + desc = "A box of 10mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." + icon_state = "10mmbox-hp" + +/obj/item/storage/box/ammo/c10mm_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/hp = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/incendiary + ammo_type = /obj/item/ammo_casing/c10mm/inc + +/obj/item/storage/box/ammo/c10mm_incendiary + name = "box of incendiary 10mm ammo" + desc = "A box of 10mm incendiary ammo, designed to ignite targets at the cost of initial damage." + icon_state = "10mmbox-incendiary" + +/obj/item/storage/box/ammo/c10mm_incendiary/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/incendiary = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/rubber + ammo_type = /obj/item/ammo_casing/c10mm/rubber + +/obj/item/storage/box/ammo/c10mm_rubber + name = "box of rubber 10mm ammo" + desc = "A box of 10mm rubbershot ammo, designed to disable targets without causing serious damage." + icon_state = "10mmbox-rubbershot" + +/obj/item/storage/box/ammo/c10mm_rubber/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c10mm/rubber = 4) + generate_items_inside(items_inside,src) + +// 9MM (Commander + SABR) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm + ammo_type = /obj/item/ammo_casing/c9mm + max_ammo = 15 + +/obj/item/storage/box/ammo/c9mm + name = "box of 9mm ammo" + desc = "A box of standard 9mm ammo." + icon_state = "9mmbox" + +/obj/item/storage/box/ammo/c9mm/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/surplus + ammo_type = /obj/item/ammo_casing/c9mm/surplus + +/obj/item/storage/box/ammo/c9mm_surplus + name = "box of surplus 9mm ammo" + desc = "A box of low-quality 9mm ammo." + icon_state = "9mmbox-surplus" + +/obj/item/storage/box/ammo/c9mm_surplus/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/surplus = 48) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm_ap + ammo_type = /obj/item/ammo_casing/c9mm/ap + +/obj/item/storage/box/ammo/c9mm/ap + name = "box of AP 9mm ammo" + desc = "A box of 9mm armor-piercing ammo, designed to penetrate through armor at the cost of total damage." + icon_state = "9mmbox-ap" + +/obj/item/storage/box/ammo/c9mm_ap/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm_ap = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/hp + ammo_type = /obj/item/ammo_casing/c9mm/hp + +/obj/item/storage/box/ammo/c9mm_hp + name = "box of HP 9mm ammo" + desc = "A box of 9mm hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." + icon_state = "9mmbox-hp" + +/obj/item/storage/box/ammo/c9mm_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/hp = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/incendiary + ammo_type = /obj/item/ammo_casing/c9mm/inc + +/obj/item/storage/box/ammo/c9mm_incendiary + name = "box of incendiary 9mm ammo" + desc = "A box of 9mm incendiary ammo, designed to ignite targets at the cost of initial damage." + icon_state = "9mmbox-incendiary" + +/obj/item/storage/box/ammo/c9mm_incendiary/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/incendiary = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/rubber + ammo_type = /obj/item/ammo_casing/c9mm/rubber + +/obj/item/storage/box/ammo/c9mm_rubber + name = "box of rubber 9mm ammo" + desc = "A box of 9mm rubbershot ammo, designed to disable targets without causing serious damage." + icon_state = "9mmbox-rubbershot" + +/obj/item/storage/box/ammo/c9mm_rubber/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c9mm/rubber = 4) + generate_items_inside(items_inside,src) + +// .45 (Candor + C20R) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45 + ammo_type = /obj/item/ammo_casing/c45 + +/obj/item/storage/box/ammo/c45 + name = "box of .45 ammo" + desc = "A box of standard .45 ammo." + icon_state = "45box" + +/obj/item/storage/box/ammo/c45/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45 = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/surplus + ammo_type = /obj/item/ammo_casing/c45/surplus + +/obj/item/storage/box/ammo/c45_surplus + name = "box of surplus .45 ammo" + desc = "A box of low-quality .45 ammo." + icon_state = "45box-surplus" + +/obj/item/storage/box/ammo/c45_surplus/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/surplus = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/ap + ammo_type = /obj/item/ammo_casing/c45/ap + +/obj/item/storage/box/ammo/c45_ap + name = "box of AP .45 ammo" + desc = "A box of .45 armor-piercing ammo, designed to penetrate through armor at the cost of total damage." + icon_state = "45box-ap" + +/obj/item/storage/box/ammo/c45_ap/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/ap = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/hp + ammo_type = /obj/item/ammo_casing/c45/hp + +/obj/item/storage/box/ammo/c45_hp + name = "box of HP .45 ammo" + desc = "A box of .45 hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." + icon_state = "45box-hp" + +/obj/item/storage/box/ammo/c45_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/hp = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/incendiary + ammo_type = /obj/item/ammo_casing/c45/inc + +/obj/item/storage/box/ammo/c45_incendiary + name = "box of incendiary .45 ammo" + desc = "A box of .45 incendiary ammo, designed to ignite targets at the cost of initial damage." + icon_state = "45box-incendiary" + +/obj/item/storage/box/ammo/c45_incendiary/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/incendiary = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/rubber + ammo_type = /obj/item/ammo_casing/c45/rubber + +/obj/item/storage/box/ammo/c45_rubber + name = "box of incendiary .45 ammo" + desc = "A box of .45 rubbershot ammo, designed to disable targets without causing serious damage." + icon_state = "45box-rubbershot" + +/obj/item/storage/box/ammo/c45_rubber/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c45/rubber = 4) + generate_items_inside(items_inside,src) + +// .50 AE (Desert Eagle) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a50AE + ammo_type = /obj/item/ammo_casing/a50AE + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a50AE/hp + ammo_type = /obj/item/ammo_casing/a50AE/hp + +// .22 LR (Himehabu, Pounder) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c22lr + ammo_type = /obj/item/ammo_casing/c22lr + +/obj/item/storage/box/ammo/c22lr + name = "box of .22 LR ammo" + desc = "A box of standard .22 LR ammo." + icon_state = "22lrbox" + +/obj/item/storage/box/ammo/c22lr/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c22lr = 4) + generate_items_inside(items_inside,src) + +// .357 + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357 + ammo_type = /obj/item/ammo_casing/a357 + +/obj/item/storage/box/ammo/a357 + name = "box of .357 ammo" + desc = "A box of standard .357 ammo." + icon_state = "357box" + +/obj/item/storage/box/ammo/a357/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357 = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/match + ammo_type = /obj/item/ammo_casing/a357/match + +/obj/item/storage/box/ammo/a357_match + name = "box of match .357 ammo" + desc = "A box of match .357 ammo." + icon_state = "357box-match" + +/obj/item/storage/box/ammo/a357_match/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/match = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/hp + ammo_type = /obj/item/ammo_casing/a357/hp + +/obj/item/storage/box/ammo/a357_hp + name = "box of HP .357 ammo" + desc = "A box of hollow point .357 ammo." + icon_state = "357box-hp" + +/obj/item/storage/box/ammo/a357_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a357/hp = 4) + generate_items_inside(items_inside,src) + +// .45-70 (Hunting Revolver, Beacon) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570 + ammo_type = /obj/item/ammo_casing/a4570 + max_ammo = 5 + +/obj/item/storage/box/ammo/a4570 + name = "box of .45-70 ammo" + desc = "A box of top grade .45-70 ammo. These rounds do significant damage with average performance against armor." + icon_state = "4570" + +/obj/item/storage/box/ammo/a4570/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570 = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/match + ammo_type = /obj/item/ammo_casing/a4570/match + +/obj/item/storage/box/ammo/a4570_match + name = "box of HP match .45-70 ammo" + desc = "A 12-round ammo box for .45-70 revolvers. These match rounds travel faster, perform better against armor, and can ricochet off targets." + icon_state = "4570-match" + +/obj/item/storage/box/ammo/a4570_match/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/match = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/hp + ammo_type = /obj/item/ammo_casing/a4570/hp + +/obj/item/storage/box/ammo/a4570_hp + name = "box of HP .45-70 ammo" + desc = "A 12-round ammo box for .45-70 revolvers. These hollow point rounds do legendary damage against soft targets, but are nearly ineffective against armored ones." + icon_state = "4570-hp" + +/obj/item/storage/box/ammo/a4570_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/hp = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/explosive + ammo_type = /obj/item/ammo_casing/a4570/explosive + +/obj/item/storage/box/ammo/a4570_explosive + name = "box of explosive .45-70 ammo" + desc = "A 12-round ammo box for .45-70 revolvers. These explosive rounds contain a small explosive charge that detonates on impact, creating large wounds and potentially removing limbs." + icon_state = "4570-explosive" + +/obj/item/storage/box/ammo/a4570_explosive/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a4570/explosive = 4) + generate_items_inside(items_inside,src) + +// .38 Special + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38 + ammo_type = /obj/item/ammo_casing/c38 + +/obj/item/storage/box/ammo/c38 + name = "box of .38 ammo" + desc = "A box of standard .38 Special ammo." + icon_state = "38box" + +/obj/item/storage/box/ammo/c38/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38 = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/surplus + ammo_type = /obj/item/ammo_casing/c38/surplus + +/obj/item/storage/box/ammo/c38_surplus + name = "box of surplus .38 ammo" + desc = "A box of low-quality .38 Special ammo." + icon_state = "38box-surplus" + +/obj/item/storage/box/ammo/c38_surplus/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/surplus = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/trac + ammo_type = /obj/item/ammo_casing/c38/trac + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/match + ammo_type = /obj/item/ammo_casing/c38/match + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/bouncy + ammo_type = /obj/item/ammo_casing/c38/match/bouncy + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/dumdum + ammo_type = /obj/item/ammo_casing/c38/dumdum + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/hotshot + ammo_type = /obj/item/ammo_casing/c38/hotshot + +/obj/item/storage/box/ammo/c38_hotshot + name = "box of .38 hearth ammo" + desc = "An unorthodox .38 Special cartridge infused with hearthwine. Catches the target on fire." + icon_state = "38hotshot" + +/obj/item/storage/box/ammo/c38_hotshot/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/hotshot = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/iceblox + ammo_type = /obj/item/ammo_casing/c38/iceblox + +/obj/item/storage/box/ammo/c38_iceblox + name = "box of .38 chilled ammo" + desc = "An unorthodox .38 Special cartridge infused with icewine. Chills the target, slowing them down." + icon_state = "38iceblox" + +/obj/item/storage/box/ammo/c38_iceblox/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c38/iceblox = 4) + generate_items_inside(items_inside,src) + +// 44 Roumain + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum + ammo_type = /obj/item/ammo_casing/a44roum + +/obj/item/storage/box/ammo/a44roum + name = "box of .44 roumain ammo" + desc = "A box of standard .44 roumain ammo." + icon_state = "a44roum" + +/obj/item/storage/box/ammo/a44roum/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/rubber + ammo_type = /obj/item/ammo_casing/a44roum/rubber + +/obj/item/storage/box/ammo/a44roum_rubber + name = "box of rubber .44 roumain ammo" + desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage." + icon_state = "a44roum-rubber" + +/obj/item/storage/box/ammo/a44roum_rubber/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/rubber = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/hp + ammo_type = /obj/item/ammo_casing/a44roum/hp + +/obj/item/storage/box/ammo/a44roum_hp + name = "box of HP .44 roumain ammo" + desc = "A box of .44 roumain rubbershot ammo, designed to disable targets without causing serious damage." + icon_state = "a44roum-rubber" + +/obj/item/storage/box/ammo/a44roum_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a44roum/hp = 4) + generate_items_inside(items_inside,src) diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm new file mode 100644 index 000000000000..d22f62ec2165 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_rifle_stacks.dm @@ -0,0 +1,152 @@ +// 8x50mmR (Illestren Hunting Rifle) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r + ammo_type = /obj/item/ammo_casing/a8_50r + max_ammo = 10 + +/obj/item/storage/box/ammo/a8_50r + name = "box of 8x50mm ammo" + desc = "A box of standard 8x50mm ammo." + icon_state = "8x50mmbox" + +/obj/item/storage/box/ammo/a8_50r/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r/hp + ammo_type = /obj/item/ammo_casing/a8_50rhp + +/obj/item/storage/box/ammo/a8_50r_hp + name = "box of HP 8x50mm ammo" + desc = "A box of hollow point 8x50mm ammo, designed to cause massive damage at the cost of armor penetration." + icon_state = "8x50mmbox-hp" + +/obj/item/storage/box/ammo/a8_50r_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a8_50r/hp = 4) + generate_items_inside(items_inside,src) + +// 8x58mm Caseless (SSG-669C) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a858 + ammo_type = /obj/item/ammo_casing/caseless/a858 + +// .300 Magnum (Smile Rifle) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a300 + ammo_type = /obj/item/ammo_casing/a300 + max_ammo = 5 + +/obj/item/storage/box/ammo/a300 + name = "box of .300 magnum ammo" + desc = "A box of standard .300 Magnum ammo." + icon_state = "300box" + +/obj/item/storage/box/ammo/a300/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a300 = 4) + generate_items_inside(items_inside,src) + +// 5.56x42mm CLIP (CM82, Hydra variants) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a556_42 + ammo_type = /obj/item/ammo_casing/a556_42 + max_ammo = 15 + +/obj/item/storage/box/ammo/a556_42 + name = "box of 5.56x42mm CLIP ammo" + desc = "A box of standard 5.56x42mm CLIP ammo." + icon_state = "a556_42box_big" + +/obj/item/storage/box/ammo/a556_42/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a556_42 = 4) + generate_items_inside(items_inside,src) + +// 5.45x39mm (SKM-24v) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a545_39 + ammo_type = /obj/item/ammo_casing/a545_39 + max_ammo = 10 + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a545_39/recycled + ammo_type = /obj/item/ammo_casing/a545_39/recycled + +// 7.62x40mm CLIP (SKM Rifles) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a762_40 + ammo_type = /obj/item/ammo_casing/a762_40 + max_ammo = 15 + +/obj/item/storage/box/ammo/a762_40 + name = "box of 7.62x40mm CLIP ammo" + desc = "A box of standard 7.62x40mm CLIP ammo." + icon_state = "a762_40box_big" + +/obj/item/storage/box/ammo/a762_40/inteq + icon_state = "a762_40box_big_inteq" + +/obj/item/storage/box/ammo/a762_40/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a762_40 = 4) + generate_items_inside(items_inside,src) + +//.308 (M514 EBR & CM-GAL-S) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a308 + ammo_type = /obj/item/ammo_casing/a308 + max_ammo = 10 + +/obj/item/storage/box/ammo/a308 + name = "box of .308 ammo" + desc = "A box of standard .308 ammo." + icon_state = "a308box" + +/obj/item/storage/box/ammo/a308/hunterspride + icon_state = "a308box-HP" + +/obj/item/storage/box/ammo/a308/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a308 = 4) + generate_items_inside(items_inside,src) + +//.299 Eoehoma Caseless (E-40) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c299 + ammo_type = /obj/item/ammo_casing/caseless/c299 + max_ammo = 5 + +/obj/item/storage/box/ammo/c299 + name = "box of .299 Eoehoma caseless ammo" + desc = "A box of .299 Eoehoma caseless, for use with the E-40 hybrid assault rifle." + icon_state = "299box" + +/obj/item/storage/box/ammo/c299/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c299 = 4) + generate_items_inside(items_inside,src) + +//6.5x57mm CLIP + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/a65clip + ammo_type = /obj/item/ammo_casing/a65clip + max_ammo = 5 + +/obj/item/storage/box/ammo/a65clip + name = "box of 6.5x57mm CLIP ammo" + desc = "A box of standard 6.5x57mm CLIP ammo." + icon_state = "65box" + +/obj/item/storage/box/ammo/a65clip/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/a65clip = 4) + generate_items_inside(items_inside,src) diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm new file mode 100644 index 000000000000..f67800330724 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_shotshell_stacks.dm @@ -0,0 +1,79 @@ +// Shotshells +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun + max_ammo = 8 //make sure these values are consistent across the board with stack_size variable on respective ammo_casing + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/buckshot + ammo_type = /obj/item/ammo_casing/shotgun/buckshot + +/obj/item/storage/box/ammo/a12g_buckshot + name = "box of 12ga buckshot" + desc = "A box of 12-gauge buckshot shells, devastating at close range." + icon_state = "12gbox-buckshot" + +/obj/item/storage/box/ammo/a12g_buckshot/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/buckshot = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/slug + ammo_type = /obj/item/ammo_casing/shotgun + +/obj/item/storage/box/ammo/a12g_slug + name = "box of 12ga slugs" + desc = "A box of 12-gauge slugs, for improved accuracy and penetration." + icon_state = "12gbox-slug" + +/obj/item/storage/box/ammo/a12g_slug/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/slug = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/beanbag + ammo_type = /obj/item/ammo_casing/shotgun/beanbag + +/obj/item/storage/box/ammo/a12g_beanbag + name = "box of 12ga beanbags" + desc = "A box of 12-gauge beanbag shells, for incapacitating targets." + icon_state = "12gbox-beanbag" + +/obj/item/storage/box/ammo/a12g_beanbag/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/beanbag = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/rubber + ammo_type = /obj/item/ammo_casing/shotgun/rubbershot + +/obj/item/storage/box/ammo/a12g_rubbershot + name = "box of 12ga beanbags" + desc = "A box of 12-gauge rubbershot shells, designed for riot control." + icon_state = "12gbox-rubbershot" + +/obj/item/storage/box/ammo/a12g_beanbag/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/rubber = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/blank + ammo_type = /obj/item/ammo_casing/shotgun/blank + +/obj/item/storage/box/ammo/a12g_blank + name = "box of 12ga blanks" + desc = "A box of 12-gauge blank shells, designed for training." + icon_state = "12gbox-slug" //needs icon + +/obj/item/storage/box/ammo/a12g_blank/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/blank = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/incendiary + ammo_type = /obj/item/ammo_casing/shotgun/incendiary + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/shotgun/improvised + ammo_type = /obj/item/ammo_casing/shotgun/improvised diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm new file mode 100644 index 000000000000..d550f5e461ba --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_smg_stacks.dm @@ -0,0 +1,113 @@ +// 4.6x30mm (WT-550 Automatic Rifle & SKM-24v) +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm + ammo_type = /obj/item/ammo_casing/c46x30mm + max_ammo = 15 + +/obj/item/storage/box/ammo/c46x30mm + name = "box of 4.6x30mm ammo" + desc = "A box of standard 4.6x30mm ammo." + icon_state = "46x30mmbox" + +/obj/item/storage/box/ammo/c46x30mm/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm/ap + ammo_type = /obj/item/ammo_casing/c46x30mm/ap + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c46x30mm/incendiary + ammo_type = /obj/item/ammo_casing/c46x30mm/inc + +// 4.73x33mm caseless (Solar) +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c47x33mm + ammo_type = /obj/item/ammo_casing/caseless/c47x33mm + +// 5.56mm HITP caseless (Pistole C) +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm + ammo_type = /obj/item/ammo_casing/caseless/c556mm + max_ammo = 15 + +/obj/item/storage/box/ammo/c556mm + name = "box of 5.56mm HITP caseless ammo" + desc = "A box of 5.56mm HITP caseless ammo, a SolGov standard." + icon_state = "556mmHITPbox" + +/obj/item/storage/box/ammo/c556mm/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/surplus + ammo_type = /obj/item/ammo_casing/caseless/c556mm/surplus + +/obj/item/storage/box/ammo/c556mm_surplus + name = "box of surplus 5.56mm HITP caseless ammo" + desc = "A box of low-quality 5.56mm HITP caseless ammo." + icon_state = "556mmHITPbox-surplus" + +/obj/item/storage/box/ammo/c556mm_surplus/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/surplus = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/ap + ammo_type = /obj/item/ammo_casing/caseless/c556mm/ap + +/obj/item/storage/box/ammo/c556mm_ap + name = "box of AP 5.56mm HITP caseless ammo" + desc = "A box of 5.56mm HITP caseless armor-piercing ammo, designed to penetrate through armor at the cost of total damage." + icon_state = "556mmHITPbox-ap" + +/obj/item/storage/box/ammo/c556mm_ap/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/ap = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/hp + ammo_type = /obj/item/ammo_casing/caseless/c556mm/hp + +/obj/item/storage/box/ammo/c556mm_hp + name = "box of HP 5.56mm HITP caseless ammo" + desc = "A box of 5.56mm HITP caseless hollow point ammo, designed to cause massive tissue damage at the cost of armor penetration." + icon_state = "556mmHITPbox-hp" + +/obj/item/storage/box/ammo/c556mm_hp/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/hp = 4) + generate_items_inside(items_inside,src) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/rubbershot + ammo_type = /obj/item/ammo_casing/caseless/c556mm/rubbershot + +/obj/item/storage/box/ammo/c556mm_rubber + name = "box of rubber 5.56mm HITP caseless ammo" + desc = "A box of 5.56mm HITP caseless rubbershot ammo, designed to disable targets without causing serious damage." + icon_state = "556mmHITPbox-rubbershot" + +/obj/item/storage/box/ammo/c556mm_rubber/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c556mm/rubbershot = 4) + generate_items_inside(items_inside,src) + +// 5.7x39mm (Asp and Sidewinder) + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/c57x39 + ammo_type = /obj/item/ammo_casing/c57x39mm + +/obj/item/storage/box/ammo/c57x39 + name = "box of 5.7x39mm ammo" + desc = "A box of standard 5.7x39mm ammo." + icon_state = "57x39mmbox" + +/obj/item/storage/box/ammo/c57x39/PopulateContents() + ..() + var/static/items_inside = list( + /obj/item/ammo_box/magazine/ammo_stack/prefilled/c57x39 = 4) + generate_items_inside(items_inside,src) diff --git a/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm new file mode 100644 index 000000000000..8ee54bcd9099 --- /dev/null +++ b/code/modules/projectiles/boxes_magazines/ammo_stacks/prefab_stacks/premade_sniper_stacks.dm @@ -0,0 +1,9 @@ +// .50 BMG (Sniper) +/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50 + ammo_type = /obj/item/ammo_casing/p50 + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50/soporific + ammo_type = /obj/item/ammo_casing/p50/soporific + +/obj/item/ammo_box/magazine/ammo_stack/prefilled/p50/penetrator + ammo_type = /obj/item/ammo_casing/p50/penetrator diff --git a/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm b/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm deleted file mode 100644 index 2c88824623e2..000000000000 --- a/code/modules/projectiles/boxes_magazines/generic_ammo_box.dm +++ /dev/null @@ -1,53 +0,0 @@ -/obj/item/ammo_box/generic - name = "generic ammo box" - desc = "A generic, unbranded box of ammo. It doesn't have great capacity, but it can hold a variety of different calibers." - max_ammo = 20 - start_empty = TRUE - icon_state = "generic-ammo" - /// Does the box currently have an ammo type set? - var/ammo_set = FALSE - /// Name of the currently set ammo type - var/ammo_name - -/obj/item/ammo_box/generic/update_ammo_count() - . = ..() - if(LAZYLEN(stored_ammo) == 0) - ammo_set = FALSE - ammo_type = /obj/item/ammo_casing - -/obj/item/ammo_box/generic/proc/update_max_ammo(obj/item/ammo_casing/ammo) - if(ammo.bullet_per_box) - max_ammo = round(ammo.bullet_per_box) - else - max_ammo = 10 - - return - -/obj/item/ammo_box/generic/attackby(obj/item/attacking_obj, mob/user, params, silent, replace_spent) - . = ..() - - if(!ammo_set && istype(attacking_obj, /obj/item/ammo_casing)) - var/obj/item/ammo_casing/ammo_load = attacking_obj.type - ammo_type = ammo_load - ammo_set = TRUE - ammo_name = attacking_obj.name - update_max_ammo(attacking_obj) - to_chat(user, span_notice("You set the box to hold [attacking_obj]!")) - - if(istype(attacking_obj, /obj/item/pen)) - if(!user.is_literate()) - to_chat(user, span_notice("You scribble illegibly on the cover of [src]!")) - return - var/inputvalue = stripped_input(user, "What would you like to label the box?", "Box Labelling", "", MAX_NAME_LEN) - - if(!inputvalue) - return - - if(user.canUseTopic(src, BE_CLOSE)) - name = "[initial(src.name)][(inputvalue ? " - '[inputvalue]'" : null)]" - -/obj/item/ammo_box/generic/examine(mob/user) - . = ..() - . += span_notice("[ammo_set ? "It's set to hold [ammo_name]\s. The box can hold up to [max_ammo] rounds." : "It doesn't have an ammo type set. Use a bullet on the box to set it."]") - . += span_notice("You can use a pen on it to rename the box.") - diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index f64586871ccf..877079684ed2 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -203,12 +203,14 @@ /obj/item/gun/ballistic/attackby(obj/item/A, mob/user, params) . = ..() - if (.) + + if(.) return + if(sealed_magazine) to_chat(user, span_warning("The magazine on [src] is sealed and cannot be reloaded!")) return - if (!internal_magazine && istype(A, /obj/item/ammo_box/magazine)) + if(!internal_magazine && istype(A, /obj/item/ammo_box/magazine)) var/obj/item/ammo_box/magazine/AM = A if (!magazine) insert_magazine(user, AM) @@ -218,7 +220,8 @@ else to_chat(user, "There's already a [magazine_wording] in \the [src].") return - if (istype(A, /obj/item/ammo_casing) || istype(A, /obj/item/ammo_box)) + + if(istype(A, /obj/item/ammo_casing) || istype(A, /obj/item/ammo_box/magazine/ammo_stack)) if (bolt_type == BOLT_TYPE_NO_BOLT || internal_magazine) if (chambered && !chambered.BB) chambered.on_eject(shooter = user) @@ -235,6 +238,7 @@ if (can_be_sawn_off) if (try_sawoff(user, A)) return + return FALSE ///Prefire empty checks for the bolt drop diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 0b679dfcc4bf..5ac2370dc694 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -761,7 +761,7 @@ id = "foam_dart" build_type = AUTOLATHE materials = list(/datum/material/iron = 500) - build_path = /obj/item/ammo_box/foambox + build_path = /obj/item/storage/box/ammo/foam_darts category = list("initial", "Misc") /datum/design/handcuffs @@ -785,7 +785,7 @@ id = "c38_surplus" build_type = AUTOLATHE | PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c38_box/surplus + build_path = /obj/item/storage/box/ammo/c38_surplus category = list("initial", "Security", "Ammo") /datum/design/beanbag_slug @@ -817,7 +817,7 @@ id = "riot_darts" build_type = AUTOLATHE materials = list(/datum/material/iron = 50000) //Comes with 40 darts - build_path = /obj/item/ammo_box/foambox/riot + build_path = /obj/item/storage/box/ammo/foam_darts/riot category = list("initial", "Security") /datum/design/c10mm_surplus @@ -825,7 +825,7 @@ id = "c10mm-surplus" build_type = AUTOLATHE | PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c10mm/surplus + build_path = /obj/item/storage/box/ammo/c10mm_surplus category = list("initial", "Security", "Ammo") /datum/design/c45_surplus @@ -833,7 +833,7 @@ id = "c45-surplus" build_type = AUTOLATHE | PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c45/surplus + build_path = /obj/item/storage/box/ammo/c45_surplus category = list("initial", "Security", "Ammo") /datum/design/c9mm_surplus @@ -841,7 +841,7 @@ id = "c9mm-surplus" build_type = AUTOLATHE | PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c9mm/surplus + build_path = /obj/item/storage/box/ammo/c9mm_surplus category = list("initial", "Security", "Ammo") /datum/design/c556mmHITP_surplus @@ -849,15 +849,7 @@ id = "c556mmHITP-surplus" build_type = AUTOLATHE | PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c556mmHITP/surplus - category = list("initial", "Security", "Ammo") - -/datum/design/generic_ammo_box - name = "Generic Ammo Box" - id = "ammo-generic" - build_type = AUTOLATHE | PROTOLATHE - materials = list(/datum/material/iron = 1500) - build_path = /obj/item/ammo_box/generic + build_path = /obj/item/storage/box/ammo/c556mm_surplus category = list("initial", "Security", "Ammo") /datum/design/ammo_can diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 1c3edc8b7c32..a07f9d96dd80 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -288,8 +288,6 @@ category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY -//Shiptest edit - standard ammunition - /datum/design/buckshot_shell name = "Buckshot Shell" id = "buckshot_shell" @@ -304,7 +302,7 @@ id = "c38" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c38_box + build_path = /obj/item/storage/box/ammo/c38 category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -313,7 +311,7 @@ id = "c9mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c9mm + build_path = /obj/item/storage/box/ammo/c9mm category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -322,7 +320,7 @@ id = "c10mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c10mm + build_path = /obj/item/storage/box/ammo/c10mm category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -331,7 +329,7 @@ id = "c45" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c45 + build_path = /obj/item/storage/box/ammo/c45 category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -340,19 +338,17 @@ id = "c556mmHITP" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c556mmHITP + build_path = /obj/item/storage/box/ammo/c556mm category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY -// WS edit - not so free rubbershot - /datum/design/rubbershot9mm name = "Rubbershot 9mm ammo box" desc = "A box full of less-than-lethal 9mm ammunition." id = "rubbershot9mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c9mm/rubbershot + build_path = /obj/item/storage/box/ammo/c9mm_rubber category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -362,7 +358,7 @@ id = "rubbershot10mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c10mm/rubbershot + build_path = /obj/item/storage/box/ammo/c10mm_rubber category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -372,7 +368,7 @@ id = "rubbershot45" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c45/rubbershot + build_path = /obj/item/storage/box/ammo/c45_rubber category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS @@ -382,7 +378,7 @@ id = "rubbershot556mmHITP" build_type = PROTOLATHE materials = list(/datum/material/iron = 18000) - build_path = /obj/item/ammo_box/c556mmHITP/rubbershot + build_path = /obj/item/storage/box/ammo/c556mm_rubber category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -392,7 +388,7 @@ id = "ap9mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000) - build_path = /obj/item/ammo_box/c9mm/ap + build_path = /obj/item/storage/box/ammo/c9mm/ap category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -402,7 +398,7 @@ id = "ap10mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000) - build_path = /obj/item/ammo_box/c10mm/ap + build_path = /obj/item/storage/box/ammo/c10mm_ap category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -412,7 +408,7 @@ id = "ap45" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/uranium = 1000) - build_path = /obj/item/ammo_box/c45/ap + build_path = /obj/item/storage/box/ammo/c45_ap category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS @@ -422,7 +418,7 @@ id = "ap556mmHITP" build_type = PROTOLATHE materials = list(/datum/material/iron = 18000, /datum/material/uranium = 1000) - build_path = /obj/item/ammo_box/c556mmHITP/ap + build_path = /obj/item/storage/box/ammo/c556mm_ap category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -432,7 +428,7 @@ id = "hp9mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000) - build_path = /obj/item/ammo_box/c9mm/hp + build_path = /obj/item/storage/box/ammo/c9mm_hp category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -442,7 +438,7 @@ id = "hp10mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000) - build_path = /obj/item/ammo_box/c10mm/hp + build_path = /obj/item/storage/box/ammo/c10mm_hp category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -452,7 +448,7 @@ id = "hp45" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/silver = 1000) - build_path = /obj/item/ammo_box/c45/hp + build_path = /obj/item/storage/box/ammo/c45_hp category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS @@ -462,7 +458,7 @@ id = "hp556mmHITP" build_type = PROTOLATHE materials = list(/datum/material/iron = 18000, /datum/material/silver = 1000) - build_path = /obj/item/ammo_box/c556mmHITP/hp + build_path = /obj/item/storage/box/ammo/c556mm_hp category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -472,7 +468,7 @@ id = "inc9mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000) - build_path = /obj/item/ammo_box/c9mm/fire + build_path = /obj/item/storage/box/ammo/c9mm_incendiary category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -482,7 +478,7 @@ id = "inc10mm" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000) - build_path = /obj/item/ammo_box/c10mm/fire + build_path = /obj/item/storage/box/ammo/c10mm_incendiary category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY @@ -492,7 +488,7 @@ id = "inc45" build_type = PROTOLATHE materials = list(/datum/material/iron = 15000, /datum/material/plasma = 5000) - build_path = /obj/item/ammo_box/c45/fire + build_path = /obj/item/storage/box/ammo/c45_incendiary category = list("Ammo") departmental_flags = DEPARTMENTAL_FLAG_SECURITY | DEPARTMENTAL_FLAG_BALLISTICS @@ -737,5 +733,5 @@ id = "c9mmautolathe" build_type = AUTOLATHE materials = list(/datum/material/iron = 15000) - build_path = /obj/item/ammo_box/c9mm + build_path = /obj/item/storage/box/ammo/c9mm category = list("Imported") diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 0923ba1cc70e..5566c11f7575 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -869,7 +869,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) /datum/uplink_item/ammo/toydarts name = "Box of Riot Darts" desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!" - item = /obj/item/ammo_box/foambox/riot + item = /obj/item/storage/box/ammo/foam_darts/riot cost = 2 surplus = 0 illegal_tech = FALSE diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index 06069e4db764..931611da1df9 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -10,14 +10,14 @@ /obj/item/gun/ballistic/automatic/toy/pistol = 10, /obj/item/gun/ballistic/shotgun/toy = 10, /obj/item/toy/sword = 10, - /obj/item/ammo_box/foambox = 20, + /obj/item/storage/box/ammo/foam_darts = 20, /obj/item/toy/foamblade = 10, /obj/item/toy/balloon/syndicate = 10, /obj/item/clothing/suit/syndicatefake = 5, /obj/item/clothing/head/syndicatefake = 5) //OPS IN DORMS oh wait it's just an assistant contraband = list( /obj/item/gun/ballistic/shotgun/toy/crossbow = 10, //Congrats, you unlocked the +18 setting! - /obj/item/ammo_box/foambox/riot = 20, + /obj/item/storage/box/ammo/foam_darts/riot = 20, /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5, /obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 37a51b27bb89..007b66c193c1 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -12,8 +12,6 @@ /obj/item/assembly/flash/handheld = 5, /obj/item/storage/box/evidence = 6, /obj/item/flashlight/seclite = 4, - /obj/item/ammo_box/c9mm/rubbershot = 3, - /obj/item/ammo_box/c9mm = 1, /obj/item/stock_parts/cell/gun = 3, /obj/item/clothing/glasses/sunglasses = 2) premium = list( diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 08af917aa86a..898844a31c09 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -12,7 +12,7 @@ /obj/item/gun/ballistic/automatic/toy/pistol = 10, /obj/item/gun/ballistic/shotgun/toy = 10, /obj/item/toy/sword = 10, - /obj/item/ammo_box/foambox = 20, + /obj/item/storage/box/ammo/foam_darts = 20, /obj/item/toy/foamblade = 10, /obj/item/toy/balloon/syndicate = 10, /obj/item/clothing/suit/syndicatefake = 5, diff --git a/icons/obj/ammo_bullets.dmi b/icons/obj/ammo_bullets.dmi deleted file mode 100644 index 087cdd4c771e38e83cb64652514ec57690fc445c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2226 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�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 OA28Cps9UA&82&%8d>79E literal 0 HcmV?d00001 diff --git a/icons/obj/ammunition/ammo_bullets.dmi b/icons/obj/ammunition/ammo_bullets.dmi new file mode 100644 index 0000000000000000000000000000000000000000..25ea909762aabe87477e7d5f56203343ac49b436 GIT binary patch literal 3390 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 U5O%5ue*}P~xs6$sseAmt0J)iYw*UYD literal 0 HcmV?d00001 diff --git a/shiptest.dme b/shiptest.dme index 7515bfcece79..b24485302e72 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -1345,6 +1345,7 @@ #include "code\game\objects\items\stacks\tiles\tile_reskinning.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" #include "code\game\objects\items\stacks\tiles\tiles_suns.dm" +#include "code\game\objects\items\storage\ammo_can.dm" #include "code\game\objects\items\storage\backpack.dm" #include "code\game\objects\items\storage\bags.dm" #include "code\game\objects\items\storage\belt.dm" @@ -2992,7 +2993,7 @@ #include "code\modules\power\tesla\generator.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\_ammunition.dm" +#include "code\modules\projectiles\ammunition\_ammo_casing.dm" #include "code\modules\projectiles\ammunition\_firing.dm" #include "code\modules\projectiles\ammunition\ballistic\lmg.dm" #include "code\modules\projectiles\ammunition\ballistic\pistol.dm" @@ -3019,8 +3020,17 @@ #include "code\modules\projectiles\ammunition\special\magic.dm" #include "code\modules\projectiles\ammunition\special\syringe.dm" #include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" -#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" -#include "code\modules\projectiles\boxes_magazines\generic_ammo_box.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_loaders.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\_ammo_stack.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\_premade_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_gauss_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_lmg_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_misc_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_pistol_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_rifle_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_shotshell_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_smg_stacks.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_stacks\prefab_stacks\premade_sniper_stacks.dm" #include "code\modules\projectiles\boxes_magazines\external\gauss.dm" #include "code\modules\projectiles\boxes_magazines\external\grenade.dm" #include "code\modules\projectiles\boxes_magazines\external\pistol.dm"