diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 80ee405c026..24fd10d631d 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -45,6 +45,7 @@
var/siemens_coefficient = 1 // for electrical admittance/conductance (electrocution checks and shit)
var/slowdown = 0 // How much clothing is slowing you down. Negative values speeds you up
var/armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0)
+ var/armour_penetration = 0 //percentage of armour effectiveness to remove
var/list/allowed = null //suit storage stuff.
var/obj/item/device/uplink/hidden/hidden_uplink = null // All items can have an uplink hidden inside, just remember to add the triggers.
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 3036d0252a8..c7b615aecfa 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -262,7 +262,7 @@ emp_act
else
visible_message("\red [src] has been attacked in the [hit_area] with [I.name] by [user]!")
- var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].")
+ var/armor = run_armor_check(affecting, "melee", "Your armor has protected your [hit_area].", "Your armor has softened hit to your [hit_area].", I.armour_penetration)
var/weapon_sharp = is_sharp(I)
var/weapon_edge = has_edge(I)
if ((weapon_sharp || weapon_edge) && prob(getarmor(user.zone_sel.selecting, "melee")))
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index 5737aad1c6c..1585383114a 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -10,8 +10,16 @@
1 - halfblock
2 - fullblock
*/
-/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/absorb_text = null, var/soften_text = null)
+/mob/living/proc/run_armor_check(var/def_zone = null, var/attack_flag = "melee", var/absorb_text = null, var/soften_text = null, armour_penetration, penetrated_text)
var/armor = getarmor(def_zone, attack_flag)
+
+ //the if "armor" check is because this is used for everything on /living, including humans
+ if(armor && armour_penetration)
+ armor = max(0, armor - armour_penetration)
+ if(penetrated_text)
+ src << "[penetrated_text]"
+ else
+ src << "Your armor was penetrated!"
if(armor >= 100)
if(absorb_text)
@@ -42,7 +50,7 @@
Stun(2)
//Armor
- var/armor = run_armor_check(def_zone, P.flag)
+ var/armor = run_armor_check(def_zone, P.flag, "", "", P.armour_penetration)
var/proj_sharp = is_sharp(P)
var/proj_edge = has_edge(P)
if ((proj_sharp || proj_edge) && prob(getarmor(def_zone, P.flag)))
diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm
index ff56a80858b..309136dcba0 100644
--- a/code/modules/ninja/energy_katana.dm
+++ b/code/modules/ninja/energy_katana.dm
@@ -5,6 +5,7 @@
item_state = "energy_katana"
force = 40
throwforce = 20
+ armour_penetration = 15
var/cooldown = 0 // Because spam aint cool, yo.
var/datum/effect/effect/system/spark_spread/spark_system
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 647ac2b105b..8117ff8441c 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -24,7 +24,21 @@
desc = "A 9mm bullet casing."
caliber = "9mm"
projectile_type = "/obj/item/projectile/bullet/weakbullet3"
+
+/obj/item/ammo_casing/c9mmap
+ desc = "A 9mm bullet casing."
+ caliber = "9mm"
+ projectile_type =/obj/item/projectile/bullet/armourpiercing
+/obj/item/ammo_casing/c9mmtox
+ desc = "A 9mm bullet casing."
+ caliber = "9mm"
+ projectile_type = /obj/item/projectile/bullet/toxinbullet
+
+/obj/item/ammo_casing/c9mminc
+ desc = "A 9mm bullet casing."
+ caliber = "9mm"
+ projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
/obj/item/ammo_casing/c45
desc = "A .45 bullet casing."
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index e47acf7521e..d84b9e9dc75 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -132,11 +132,23 @@
icon_state = "smg9mm"
ammo_type = "/obj/item/ammo_casing/c9mm"
caliber = "9mm"
- max_ammo = 20
+ max_ammo = 30
+
+/obj/item/ammo_box/magazine/smgm9mm/ap
+ name = "SMG magazine (Armour Piercing 9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mmap
+
+/obj/item/ammo_box/magazine/smgm9mm/toxin
+ name = "SMG magazine (Toxin Tipped 9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mmtox
+
+/obj/item/ammo_box/magazine/smgm9mm/fire
+ name = "SMG Magazine (Incendiary 9mm)"
+ ammo_type = /obj/item/ammo_casing/c9mminc
/obj/item/ammo_box/magazine/smgm9mm/update_icon()
..()
- icon_state = "[initial(icon_state)]-[round(ammo_count(),5)]"
+ icon_state = "[initial(icon_state)]-[round(ammo_count(),6)]"
/obj/item/ammo_box/magazine/smgm45
name = "SMG magazine (.45)"
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 63e1d384a4d..e23c8653667 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -27,6 +27,18 @@
/obj/item/projectile/bullet/weakbullet3
damage = 20
+
+
+/obj/item/projectile/bullet/toxinbullet
+ damage = 15
+ damage_type = TOX
+
+/obj/item/projectile/bullet/incendiary/firebullet
+ damage = 10
+
+/obj/item/projectile/bullet/armourpiercing
+ damage = 17
+ armour_penetration = 10
/obj/item/projectile/bullet/pellet
name = "pellet"
diff --git a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
index b02289784a6..36ae60484e2 100644
--- a/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks/bottle.dm
@@ -53,7 +53,7 @@
var/mob/living/carbon/human/H = target
var/headarmor = 0 // Target's head armour
- armor_block = H.run_armor_check(affecting, "melee") // For normal attack damage
+ armor_block = H.run_armor_check(affecting, "melee","","",armour_penetration) // For normal attack damage
//If they have a hat/helmet and the user is targeting their head.
if(istype(H.head, /obj/item/clothing/head) && affecting == "head")
diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm
index 545e22d0822..5c4ed5c4299 100644
--- a/code/modules/research/designs/weapon_designs.dm
+++ b/code/modules/research/designs/weapon_designs.dm
@@ -126,13 +126,34 @@
/datum/design/mag_smg
name = "Saber Submachine Gun Magazine (9mm)"
- desc = "A 20-round magazine for the Saber submachine gun."
+ desc = "A 30-round magazine for the Saber submachine gun."
id = "mag_smg"
req_tech = list("combat" = 4, "materials" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 2000)
build_path = /obj/item/ammo_box/magazine/smgm9mm
category = list("Weapons")
+
+/datum/design/mag_smg/ap_mag
+ name = "Saber Submachine Gun Magazine (9mmAP)"
+ desc = "A 30-round armour piercing magazine for the Saber submachine gun. Deals slightly less damage but bypasses most armor."
+ id = "mag_smg_ap"
+ materials = list(MAT_METAL = 3000, MAT_SILVER = 100)
+ build_path = /obj/item/ammo_box/magazine/smgm9mm/ap
+
+/datum/design/mag_smg/incin_mag
+ name = "Saber Submachine Gun Magazine (9mmIC)"
+ desc = "A 30-round incendiary round magazine for the Saber submachine gun. Deals significantly less damage but sets the target on fire."
+ id = "mag_smg_ic"
+ materials = list(MAT_METAL = 3000, MAT_SILVER = 100, MAT_GLASS = 400)
+ build_path = /obj/item/ammo_box/magazine/smgm9mm/fire
+
+/datum/design/mag_smg/incin_tox
+ name = "Saber Submachine Gun Magazine (9mmTX)"
+ desc = "A 30-round uranium tipped round magazine for the Saber submachine gun. Deals toxin damage, but less overall damage."
+ id = "mag_smg_tx"
+ materials = list(MAT_METAL = 3000, MAT_GLASS = 200, MAT_URANIUM = 1000)
+ build_path = /obj/item/ammo_box/magazine/smgm9mm/toxin
/datum/design/rapidsyringe
name = "Rapid Syringe Gun"
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index 7978b514703..add4c667b0b 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index c49dbe8cb59..9675d99379b 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ