diff --git a/code/game/mecha/combat/combat.dm b/code/game/mecha/combat/combat.dm
index ae57e5c108..8a4a2fdd9b 100644
--- a/code/game/mecha/combat/combat.dm
+++ b/code/game/mecha/combat/combat.dm
@@ -3,9 +3,9 @@
internal_damage_threshold = 50
armor = list("melee" = 30, "bullet" = 30, "laser" = 15, "energy" = 20, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 100)
mouse_pointer = 'icons/mecha/mecha_mouse.dmi'
- var/spawn_tracked = TRUE
-/obj/mecha/combat/Initialize()
- . = ..()
- if(spawn_tracked)
- trackers += new /obj/item/mecha_parts/mecha_tracking(src)
\ No newline at end of file
+/obj/mecha/combat/proc/max_ammo() //Max the ammo stored for Nuke Ops mechs, or anyone else that calls this
+ for(var/obj/item/I in equipment)
+ if(istype(I, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/))
+ var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun = I
+ gun.projectiles_cache = gun.projectiles_cache_max
\ No newline at end of file
diff --git a/code/game/mecha/combat/gygax.dm b/code/game/mecha/combat/gygax.dm
index 3364bbb9a2..71258d1ccb 100644
--- a/code/game/mecha/combat/gygax.dm
+++ b/code/game/mecha/combat/gygax.dm
@@ -30,7 +30,6 @@
internals_req_access = list(ACCESS_SYNDICATE)
wreckage = /obj/structure/mecha_wreckage/gygax/dark
max_equip = 4
- spawn_tracked = FALSE
/obj/mecha/combat/gygax/dark/loaded/Initialize()
. = ..()
@@ -42,6 +41,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/tesla_energy_relay
ME.attach(src)
+ max_ammo()
/obj/mecha/combat/gygax/dark/add_cell(obj/item/stock_parts/cell/C=null)
if(C)
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index c796cb7c1f..5c60a97864 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -17,7 +17,6 @@
force = 45
max_equip = 4
bumpsmash = 1
- spawn_tracked = FALSE
/obj/mecha/combat/marauder/GrantActions(mob/living/user, human_occupant = 0)
..()
@@ -41,6 +40,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
+ max_ammo()
/obj/mecha/combat/marauder/seraph
desc = "Heavy-duty, command-type exosuit. This is a custom model, utilized only by high-ranking military personnel."
@@ -68,6 +68,7 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
+ max_ammo()
/obj/mecha/combat/marauder/mauler
desc = "Heavy-duty, combat exosuit, developed off of the existing Marauder model."
@@ -90,5 +91,6 @@
ME.attach(src)
ME = new /obj/item/mecha_parts/mecha_equipment/antiproj_armor_booster(src)
ME.attach(src)
+ max_ammo()
diff --git a/code/game/mecha/combat/neovgre.dm b/code/game/mecha/combat/neovgre.dm
index 8fc1dd97b2..c678912a21 100644
--- a/code/game/mecha/combat/neovgre.dm
+++ b/code/game/mecha/combat/neovgre.dm
@@ -15,7 +15,6 @@
internals_req_access = list()
add_req_access = 0
wreckage = /obj/structure/mecha_wreckage/durand/neovgre
- spawn_tracked = FALSE
/obj/mecha/combat/neovgre/GrantActions(mob/living/user, human_occupant = 0) //No Eject action for you sonny jim, your life for Ratvar!
internals_action.Grant(user, src)
diff --git a/code/game/mecha/combat/reticence.dm b/code/game/mecha/combat/reticence.dm
index 62e891494d..7343a85483 100644
--- a/code/game/mecha/combat/reticence.dm
+++ b/code/game/mecha/combat/reticence.dm
@@ -19,7 +19,6 @@
stepsound = null
turnsound = null
opacity = 0
- spawn_tracked = FALSE
/obj/mecha/combat/reticence/loaded/Initialize()
. = ..()
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 33d5166481..759fcd996d 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -34,6 +34,19 @@
return
if(!cargo_holder)
return
+ if(ismecha(target))
+ var/obj/mecha/M = target
+ var/have_ammo
+ for(var/obj/item/mecha_ammo/box in cargo_holder.cargo)
+ if(istype(box, /obj/item/mecha_ammo) && box.rounds)
+ have_ammo = TRUE
+ if(M.ammo_resupply(box, chassis.occupant, TRUE))
+ return
+ if(have_ammo)
+ to_chat(chassis.occupant, "No further supplies can be provided to [M].")
+ else
+ to_chat(chassis.occupant, "No providable supplies found in cargo hold")
+ return
if(isobj(target))
var/obj/O = target
if(!O.anchored)
diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm
new file mode 100644
index 0000000000..83a85ffcba
--- /dev/null
+++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm
@@ -0,0 +1,94 @@
+/obj/item/mecha_ammo
+ name = "generic ammo box"
+ desc = "A box of ammo for an unknown weapon."
+ w_class = WEIGHT_CLASS_BULKY
+ icon = 'icons/mecha/mecha_ammo.dmi'
+ icon_state = "empty"
+ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi'
+ var/rounds = 0
+ var/round_term = "round"
+ var/direct_load //For weapons where we re-load the weapon itself rather than adding to the ammo storage.
+ var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg"
+ var/ammo_type
+
+/obj/item/mecha_ammo/proc/update_name()
+ if(!rounds)
+ name = "empty ammo box"
+ desc = "An exosuit ammuniton box that has since been emptied. Please recycle."
+ icon_state = "empty"
+
+/obj/item/mecha_ammo/attack_self(mob/user)
+ ..()
+ if(rounds)
+ to_chat(user, "You cannot flatten the ammo box until it's empty!")
+ return
+
+ to_chat(user, "You fold [src] flat.")
+ var/I = new /obj/item/stack/sheet/metal(user.loc)
+ qdel(src)
+ user.put_in_hands(I)
+
+/obj/item/mecha_ammo/examine(mob/user)
+ . = ..()
+ if(rounds)
+ . += "There [rounds > 1?"are":"is"] [rounds] [round_term][rounds > 1?"s":""] left."
+
+/obj/item/mecha_ammo/incendiary
+ name = "incendiary ammo"
+ desc = "A box of incendiary ammunition for use with exosuit weapons."
+ icon_state = "incendiary"
+ rounds = 24
+ ammo_type = "incendiary"
+
+/obj/item/mecha_ammo/scattershot
+ name = "scattershot ammo"
+ desc = "A box of scaled-up buckshot, for use in exosuit shotguns."
+ icon_state = "scattershot"
+ rounds = 40
+ ammo_type = "scattershot"
+
+/obj/item/mecha_ammo/lmg
+ name = "machine gun ammo"
+ desc = "A box of linked ammunition, designed for the Ultra AC 2 exosuit weapon."
+ icon_state = "lmg"
+ rounds = 300
+ ammo_type = "lmg"
+
+/obj/item/mecha_ammo/missiles_br
+ name = "breaching missiles"
+ desc = "A box of large missiles, ready for loading into a BRM-6 exosuit missile rack."
+ icon_state = "missile_br"
+ rounds = 6
+ round_term = "missile"
+ direct_load = TRUE
+ load_audio = "sound/weapons/bulletinsert.ogg"
+ ammo_type = "missiles_br"
+
+/obj/item/mecha_ammo/missiles_he
+ name = "anti-armor missiles"
+ desc = "A box of large missiles, ready for loading into an SRM-8 exosuit missile rack."
+ icon_state = "missile_he"
+ rounds = 8
+ round_term = "missile"
+ direct_load = TRUE
+ load_audio = "sound/weapons/bulletinsert.ogg"
+ ammo_type = "missiles_he"
+
+
+/obj/item/mecha_ammo/flashbang
+ name = "launchable flashbangs"
+ desc = "A box of smooth flashbangs, for use with a large exosuit launcher. Cannot be primed by hand."
+ icon_state = "flashbang"
+ rounds = 6
+ round_term = "grenade"
+ ammo_type = "flashbang"
+
+/obj/item/mecha_ammo/clusterbang
+ name = "launchable flashbang clusters"
+ desc = "A box of clustered flashbangs, for use with a specialized exosuit cluster launcher. Cannot be primed by hand."
+ icon_state = "clusterbang"
+ rounds = 3
+ round_term = "cluster"
+ direct_load = TRUE
+ ammo_type = "clusterbang"
diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm
index f5eefb1391..3873e7ddd7 100644
--- a/code/game/mecha/equipment/weapons/weapons.dm
+++ b/code/game/mecha/equipment/weapons/weapons.dm
@@ -196,7 +196,11 @@
name = "general ballistic weapon"
fire_sound = 'sound/weapons/gunshot.ogg'
var/projectiles
+ var/projectiles_cache //ammo to be loaded in, if possible.
+ var/projectiles_cache_max
var/projectile_energy_cost
+ var/disabledreload //For weapons with no cache (like the rockets) which are reloaded by hand
+ var/ammo_type
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_shot_amount()
return min(projectiles, projectiles_per_shot)
@@ -209,19 +213,32 @@
return 1
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/get_equip_info()
- return "[..()] \[[src.projectiles]\][(src.projectiles < initial(src.projectiles))?" - Rearm":null]"
+ return "[..()] \[[src.projectiles][projectiles_cache_max &&!projectile_energy_cost?"/[projectiles_cache]":""]\][!disabledreload &&(src.projectiles < initial(src.projectiles))?" - Rearm":null]"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/rearm()
if(projectiles < initial(projectiles))
var/projectiles_to_add = initial(projectiles) - projectiles
- while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
- projectiles++
- projectiles_to_add--
- chassis.use_power(projectile_energy_cost)
- send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info())
- mecha_log_message("Rearmed [src.name].")
- return 1
+
+ if(projectile_energy_cost)
+ while(chassis.get_charge() >= projectile_energy_cost && projectiles_to_add)
+ projectiles++
+ projectiles_to_add--
+ chassis.use_power(projectile_energy_cost)
+
+ else
+ if(!projectiles_cache)
+ return FALSE
+ if(projectiles_to_add <= projectiles_cache)
+ projectiles = projectiles + projectiles_to_add
+ projectiles_cache = projectiles_cache - projectiles_to_add
+ else
+ projectiles = projectiles + projectiles_cache
+ projectiles_cache = 0
+
+ send_byjax(chassis.occupant,"exosuit.browser","[REF(src)]",src.get_equip_info())
+ log_message("Rearmed [src.name].", LOG_MECHA)
+ return TRUE
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/needs_rearm()
@@ -249,8 +266,10 @@
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/incendiary/fnx99
projectiles = 24
- projectile_energy_cost = 15
+ projectiles_cache = 24
+ projectiles_cache_max = 96
harmful = TRUE
+ ammo_type = "incendiary"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced
name = "\improper S.H.H. \"Quietus\" Carbine"
@@ -270,10 +289,12 @@
equip_cooldown = 20
projectile = /obj/item/projectile/bullet/scattershot
projectiles = 40
- projectile_energy_cost = 25
+ projectiles_cache = 40
+ projectiles_cache_max = 160
projectiles_per_shot = 4
variance = 25
harmful = TRUE
+ ammo_type = "scattershot"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/seedscatter
name = "\improper Melon Seed \"Scattershot\""
@@ -294,23 +315,42 @@
equip_cooldown = 10
projectile = /obj/item/projectile/bullet/lmg
projectiles = 300
- projectile_energy_cost = 20
+ projectiles_cache = 300
+ projectiles_cache_max = 1200
projectiles_per_shot = 3
variance = 6
randomspread = 1
projectile_delay = 2
harmful = TRUE
+ ammo_type = "lmg"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
name = "\improper SRM-8 missile rack"
- desc = "A weapon for combat exosuits. Shoots light explosive missiles."
+ desc = "A weapon for combat exosuits. Launches light explosive missiles."
icon_state = "mecha_missilerack"
projectile = /obj/item/projectile/bullet/a84mm_he
fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 8
- projectile_energy_cost = 1000
+ projectiles_cache = 0
+ projectiles_cache_max = 0
+ disabledreload = TRUE
equip_cooldown = 60
harmful = TRUE
+ ammo_type = "missiles_he"
+
+/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching
+ name = "\improper BRM-6 missile rack"
+ desc = "A weapon for combat exosuits. Launches low-explosive breaching missiles designed to explode only when striking a sturdy target."
+ icon_state = "mecha_missilerack_six"
+ projectile = /obj/item/projectile/bullet/a84mm_br
+ fire_sound = 'sound/weapons/grenadelaunch.ogg'
+ projectiles = 6
+ projectiles_cache = 0
+ projectiles_cache_max = 0
+ disabledreload = TRUE
+ equip_cooldown = 60
+ harmful = TRUE
+ ammo_type = "missiles_br"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher
@@ -341,10 +381,12 @@
projectile = /obj/item/grenade/flashbang
fire_sound = 'sound/weapons/grenadelaunch.ogg'
projectiles = 6
+ projectiles_cache = 6
+ projectiles_cache_max = 24
missile_speed = 1.5
- projectile_energy_cost = 800
equip_cooldown = 60
var/det_time = 20
+ ammo_type = "flashbang"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/flashbang/proj_init(var/obj/item/grenade/flashbang/F)
var/turf/T = get_turf(src)
@@ -356,9 +398,12 @@
name = "\improper SOB-3 grenade launcher"
desc = "A weapon for combat exosuits. Launches primed clusterbangs. You monster."
projectiles = 3
+ projectiles_cache = 0
+ projectiles_cache_max = 0
+ disabledreload = TRUE
projectile = /obj/item/grenade/clusterbuster
- projectile_energy_cost = 1600 //getting off cheap seeing as this is 3 times the flashbangs held in the grenade launcher.
equip_cooldown = 90
+ ammo_type = "clusterbang"
/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/launcher/banana_mortar
name = "banana mortar"
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index f2d907283a..442e4f5464 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -29,6 +29,7 @@
"H.O.N.K",
"Phazon",
"Exosuit Equipment",
+ "Exosuit Ammunition",
"Cyborg Upgrade Modules",
"Misc"
)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 6891719f97..669bc89875 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1070,3 +1070,53 @@
if(occupant_sight_flags)
if(user == occupant)
user.sight |= occupant_sight_flags
+
+///////////////////////
+////// Ammo stuff /////
+///////////////////////
+
+/obj/mecha/proc/ammo_resupply(var/obj/item/mecha_ammo/A, mob/user,var/fail_chat_override = FALSE)
+ if(!A.rounds)
+ if(!fail_chat_override)
+ to_chat(user, "This box of ammo is empty!")
+ return FALSE
+ var/ammo_needed
+ var/found_gun
+ for(var/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/gun in equipment)
+ ammo_needed = 0
+
+ if(istype(gun, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic) && gun.ammo_type == A.ammo_type)
+ found_gun = TRUE
+ if(A.direct_load)
+ ammo_needed = initial(gun.projectiles) - gun.projectiles
+ else
+ ammo_needed = gun.projectiles_cache_max - gun.projectiles_cache
+
+ if(ammo_needed)
+ if(ammo_needed < A.rounds)
+ if(A.direct_load)
+ gun.projectiles = gun.projectiles + ammo_needed
+ else
+ gun.projectiles_cache = gun.projectiles_cache + ammo_needed
+ playsound(get_turf(user),A.load_audio,50,1)
+ to_chat(user, "You add [ammo_needed] [A.round_term][ammo_needed > 1?"s":""] to the [gun.name]")
+ A.rounds = A.rounds - ammo_needed
+ A.update_name()
+ return TRUE
+
+ else
+ if(A.direct_load)
+ gun.projectiles = gun.projectiles + A.rounds
+ else
+ gun.projectiles_cache = gun.projectiles_cache + A.rounds
+ playsound(get_turf(user),A.load_audio,50,1)
+ to_chat(user, "You add [A.rounds] [A.round_term][A.rounds > 1?"s":""] to the [gun.name]")
+ A.rounds = 0
+ A.update_name()
+ return TRUE
+ if(!fail_chat_override)
+ if(found_gun)
+ to_chat(user, "You can't fit any more ammo of this type!")
+ else
+ to_chat(user, "None of the equipment on this exosuit can use this ammo!")
+ return FALSE
diff --git a/code/game/mecha/mecha_defense.dm b/code/game/mecha/mecha_defense.dm
index 3a448f4f92..08843c9202 100644
--- a/code/game/mecha/mecha_defense.dm
+++ b/code/game/mecha/mecha_defense.dm
@@ -172,6 +172,10 @@
to_chat(user, "[src]-[W] interface initialization failed.")
return
+ if(istype(W, /obj/item/mecha_ammo))
+ ammo_resupply(W, user)
+ return
+
if(istype(W, /obj/item/mecha_parts/mecha_equipment))
var/obj/item/mecha_parts/mecha_equipment/E = W
spawn()
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 63c8fd9faf..cee8e0f3ee 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -528,6 +528,31 @@
for(var/i in 1 to 9)
new /obj/item/ammo_box/magazine/smgm45(src)
+/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax
+ desc = "A large duffel bag, packed to the brim with various exosuit ammo."
+
+/obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax/PopulateContents()
+ new /obj/item/mecha_ammo/incendiary(src)
+ new /obj/item/mecha_ammo/incendiary(src)
+ new /obj/item/mecha_ammo/incendiary(src)
+ new /obj/item/mecha_ammo/flashbang(src)
+ new /obj/item/mecha_ammo/flashbang(src)
+ new /obj/item/mecha_ammo/flashbang(src)
+
+/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler
+ desc = "A large duffel bag, packed to the brim with various exosuit ammo."
+
+/obj/item/storage/backpack/duffelbag/syndie/ammo/mauler/PopulateContents()
+ new /obj/item/mecha_ammo/lmg(src)
+ new /obj/item/mecha_ammo/lmg(src)
+ new /obj/item/mecha_ammo/lmg(src)
+ new /obj/item/mecha_ammo/scattershot(src)
+ new /obj/item/mecha_ammo/scattershot(src)
+ new /obj/item/mecha_ammo/scattershot(src)
+ new /obj/item/mecha_ammo/missiles_he(src)
+ new /obj/item/mecha_ammo/missiles_he(src)
+ new /obj/item/mecha_ammo/missiles_he(src)
+
/obj/item/storage/backpack/duffelbag/syndie/c20rbundle
desc = "A large duffel bag containing a C-20r, some magazines, and a cheap looking suppressor."
diff --git a/code/modules/projectiles/projectile/special/rocket.dm b/code/modules/projectiles/projectile/special/rocket.dm
index 0cee20dd53..df417ad734 100644
--- a/code/modules/projectiles/projectile/special/rocket.dm
+++ b/code/modules/projectiles/projectile/special/rocket.dm
@@ -43,4 +43,34 @@
explosion(target, 0, 1, 2, 4)
else
explosion(target, 0, 0, 2, 4)
- return BULLET_ACT_HIT
\ No newline at end of file
+ return BULLET_ACT_HIT
+
+/obj/item/projectile/bullet/a84mm_br
+ name ="\improper HE missile"
+ desc = "Boom."
+ icon_state = "missile"
+ damage = 30
+ ricochets_max = 0 //it's a MISSILE
+ var/sturdy = list(
+ /turf/closed,
+ /obj/mecha,
+ /obj/machinery/door/,
+ /obj/machinery/door/poddoor/shutters
+ )
+
+/obj/item/broken_missile
+ name = "\improper broken missile"
+ desc = "A missile that did not detonate. The tail has snapped and it is in no way fit to be used again."
+ icon = 'icons/obj/projectiles.dmi'
+ icon_state = "missile_broken"
+ w_class = WEIGHT_CLASS_TINY
+
+
+/obj/item/projectile/bullet/a84mm_br/on_hit(atom/target, blocked=0)
+ ..()
+ for(var/i in sturdy)
+ if(istype(target, i))
+ explosion(target, 0, 1, 1, 2)
+ return BULLET_ACT_HIT
+ //if(istype(target, /turf/closed) || ismecha(target))
+ new /obj/item/broken_missile(get_turf(src), 1)
\ No newline at end of file
diff --git a/code/modules/research/designs/mecha_designs.dm b/code/modules/research/designs/mecha_designs.dm
index 7ccc41c232..32272dc2bc 100644
--- a/code/modules/research/designs/mecha_designs.dm
+++ b/code/modules/research/designs/mecha_designs.dm
@@ -157,6 +157,17 @@
construction_time = 70
category = list("Exosuit Equipment")
+/datum/design/mech_scattershot_ammo
+ name = "Scattershot Ammunition"
+ desc = "Ammunition for the LBX AC 10 and Melon Seed exosuit weapon."
+ id = "mech_scattershot_ammo"
+ build_type = PROTOLATHE | MECHFAB
+ build_path = /obj/item/mecha_ammo/scattershot
+ materials = list(MAT_METAL=6000)
+ construction_time = 20
+ category = list("Exosuit Ammunition", "Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/mech_carbine
name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)"
desc = "Allows for the construction of FNX-99 \"Hades\" Carbine."
@@ -167,6 +178,17 @@
construction_time = 100
category = list("Exosuit Equipment")
+/datum/design/mech_carbine_ammo
+ name = "FNX-99 Carbine Ammunition"
+ desc = "Ammunition for the FNX-99 \"Hades\" Carbine."
+ id = "mech_carbine_ammo"
+ build_type = PROTOLATHE | MECHFAB
+ build_path = /obj/item/mecha_ammo/incendiary
+ materials = list(MAT_METAL=6000)
+ construction_time = 20
+ category = list("Exosuit Ammunition", "Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/mech_ion
name = "Exosuit Weapon (MKIV Ion Heavy Cannon)"
desc = "Allows for the construction of MKIV Ion Heavy Cannon."
@@ -217,16 +239,38 @@
construction_time = 100
category = list("Exosuit Equipment")
+/datum/design/mech_grenade_launcher_ammo
+ name = "SGL-6 Grenade Launcher Ammunition"
+ desc = "Ammunition for the SGL-6 Grenade Launcher."
+ id = "mech_grenade_launcher_ammo"
+ build_type = PROTOLATHE | MECHFAB
+ build_path = /obj/item/mecha_ammo/flashbang
+ materials = list(MAT_METAL=4000,MAT_GOLD=500,MAT_SILVER=500)
+ construction_time = 20
+ category = list("Exosuit Ammunition", "Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/mech_missile_rack
- name = "Exosuit Weapon (SRM-8 Missile Rack)"
- desc = "Allows for the construction of an SRM-8 Missile Rack."
+ name = "Exosuit Weapon (BRM-6 Missile Rack)"
+ desc = "Allows for the construction of an BRM-6 Breaching Missile Rack."
id = "mech_missile_rack"
build_type = MECHFAB
- build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack
+ build_path = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/breaching
materials = list(MAT_METAL=22000,MAT_GOLD=6000,MAT_SILVER=8000)
construction_time = 100
category = list("Exosuit Equipment")
+/datum/design/mech_missile_rack_ammo
+ name = "SRM-8 Missile Rack Ammunition"
+ desc = "Ammunition for the SRM-8 Missile Rack."
+ id = "mech_missile_rack_ammo"
+ build_type = PROTOLATHE | MECHFAB
+ build_path = /obj/item/mecha_ammo/missiles_br
+ materials = list(MAT_METAL=8000,MAT_GOLD=500,MAT_SILVER=500)
+ construction_time = 20
+ category = list("Exosuit Ammunition", "Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/clusterbang_launcher
name = "Exosuit Module (SOB-3 Clusterbang Launcher)"
desc = "A weapon that violates the Geneva Convention at 3 rounds per minute"
@@ -237,6 +281,17 @@
construction_time = 100
category = list("Exosuit Equipment")
+/datum/design/clusterbang_launcher_ammo
+ name = "SOB-3 Clusterbang Launcher Ammunition"
+ desc = "Ammunition for the SOB-3 Clusterbang Launcher"
+ id = "clusterbang_launcher_ammo"
+ build_type = PROTOLATHE | MECHFAB
+ build_path = /obj/item/mecha_ammo/clusterbang
+ materials = list(MAT_METAL=6000,MAT_GOLD=1500,MAT_URANIUM=1500)
+ construction_time = 20
+ category = list("Exosuit Ammunition", "Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/mech_wormhole_gen
name = "Exosuit Module (Localized Wormhole Generator)"
desc = "An exosuit module that allows generating of small quasi-stable wormholes."
@@ -367,6 +422,17 @@
construction_time = 100
category = list("Exosuit Equipment")
+/datum/design/mech_lmg_ammo
+ name = "Ultra AC 2 Ammunition"
+ desc = "Ammunition for the Ultra AC 2 LMG"
+ id = "mech_lmg_ammo"
+ build_type = PROTOLATHE | MECHFAB
+ build_path = /obj/item/mecha_ammo/lmg
+ materials = list(MAT_METAL=4000)
+ construction_time = 20
+ category = list("Exosuit Ammunition", "Ammo")
+ departmental_flags = DEPARTMENTAL_FLAG_SECURITY
+
/datum/design/mech_sleeper
name = "Exosuit Medical Equipment (Mounted Sleeper)"
desc = "Equipment for medical exosuits. A mounted sleeper that stabilizes patients and can inject reagents in the exosuit's reserves."
diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm
index 75b71611d5..66d51fb168 100644
--- a/code/modules/research/techweb/all_nodes.dm
+++ b/code/modules/research/techweb/all_nodes.dm
@@ -851,7 +851,7 @@
display_name = "Exosuit Weapon (LBX AC 10 \"Scattershot\")"
description = "An advanced piece of mech weaponry"
prereq_ids = list("ballistic_weapons")
- design_ids = list("mech_scattershot")
+ design_ids = list("mech_scattershot", "mech_scattershot_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -869,7 +869,7 @@
display_name = "Exosuit Weapon (FNX-99 \"Hades\" Carbine)"
description = "An advanced piece of mech weaponry"
prereq_ids = list("ballistic_weapons")
- design_ids = list("mech_carbine")
+ design_ids = list("mech_carbine", "mech_carbine_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -914,16 +914,16 @@
display_name = "Exosuit Weapon (SGL-6 Grenade Launcher)"
description = "An advanced piece of mech weaponry"
prereq_ids = list("explosive_weapons")
- design_ids = list("mech_grenade_launcher")
+ design_ids = list("mech_grenade_launcher", "mech_grenade_launcher_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
/datum/techweb_node/mech_missile_rack
id = "mech_missile_rack"
- display_name = "Exosuit Weapon (SRM-8 Missile Rack)"
+ display_name = "Exosuit Weapon (BRM-6 Missile Rack)"
description = "An advanced piece of mech weaponry"
prereq_ids = list("explosive_weapons")
- design_ids = list("mech_missile_rack")
+ design_ids = list("mech_missile_rack", "mech_missile_rack_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -932,7 +932,7 @@
display_name = "Exosuit Module (SOB-3 Clusterbang Launcher)"
description = "An advanced piece of mech weaponry"
prereq_ids = list("explosive_weapons")
- design_ids = list("clusterbang_launcher")
+ design_ids = list("clusterbang_launcher", "clusterbang_launcher_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
@@ -968,7 +968,7 @@
display_name = "Exosuit Weapon (\"Ultra AC 2\" LMG)"
description = "An advanced piece of mech weaponry"
prereq_ids = list("ballistic_weapons")
- design_ids = list("mech_lmg")
+ design_ids = list("mech_lmg", "mech_lmg_ammo")
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500)
export_price = 5000
diff --git a/code/modules/uplink/uplink_items/uplink_ammo.dm b/code/modules/uplink/uplink_items/uplink_ammo.dm
index 0db1bc96f0..911aa1a32e 100644
--- a/code/modules/uplink/uplink_items/uplink_ammo.dm
+++ b/code/modules/uplink/uplink_items/uplink_ammo.dm
@@ -253,3 +253,17 @@
item = /obj/item/ammo_box/a762
cost = 1
include_modes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/ammo/dark_gygax/bag
+ name = "Dark Gygax Ammo Bag"
+ desc = "A duffel bag containing ammo for three full reloads of the incendiary carbine and flash bang launcher that are equipped on a standard Dark Gygax exosuit."
+ item = /obj/item/storage/backpack/duffelbag/syndie/ammo/dark_gygax
+ cost = 4
+ include_modes = list(/datum/game_mode/nuclear)
+
+/datum/uplink_item/ammo/mauler/bag
+ name = "Mauler Ammo Bag"
+ desc = "A duffel bag containing ammo for three full reloads of the LMG, scattershot carbine, and SRM-8 missile laucher that are equipped on a standard Mauler exosuit."
+ item = /obj/item/storage/backpack/duffelbag/syndie/ammo/mauler
+ cost = 6
+ include_modes = list(/datum/game_mode/nuclear)
diff --git a/icons/mecha/mecha_ammo.dmi b/icons/mecha/mecha_ammo.dmi
new file mode 100644
index 0000000000..63bc38cfa7
Binary files /dev/null and b/icons/mecha/mecha_ammo.dmi differ
diff --git a/icons/mecha/mecha_equipment.dmi b/icons/mecha/mecha_equipment.dmi
index 02c7984831..5e277af7cc 100644
Binary files a/icons/mecha/mecha_equipment.dmi and b/icons/mecha/mecha_equipment.dmi differ
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 668f3388ce..92e76f78bb 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index 28f469ac25..769d836db8 100755
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -783,6 +783,7 @@
#include "code\game\mecha\equipment\tools\mining_tools.dm"
#include "code\game\mecha\equipment\tools\other_tools.dm"
#include "code\game\mecha\equipment\tools\work_tools.dm"
+#include "code\game\mecha\equipment\weapons\mecha_ammo.dm"
#include "code\game\mecha\equipment\weapons\weapons.dm"
#include "code\game\mecha\medical\medical.dm"
#include "code\game\mecha\medical\odysseus.dm"