diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 1e865a4cae7..8db7f4cc688 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -848,8 +848,9 @@ var/global/GLOBAL_RADIO_TYPE = 1 // radio type to use
icon_state = "radio_grid"
/obj/item/device/radio_grid/proc/attach(obj/item/device/radio/radio)
- radio.on = TRUE
- radio.grid = TRUE
+ if(prob(reliability))
+ radio.on = TRUE
+ radio.grid = TRUE
qdel(src)
/obj/item/device/radio_grid/proc/dettach(obj/item/device/radio/radio)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index a769c1dcb0a..1b751fad1f6 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -513,6 +513,8 @@ var/global/list/death_alarm_stealth_areas = list(
/obj/item/weapon/implant/death_alarm/implanted(mob/source)
mobname = source.real_name
START_PROCESSING(SSobj, src)
+ if(!prob(reliability))
+ malfunction = MALFUNCTION_PERMANENT
return 1
/obj/item/weapon/implant/death_alarm/coordinates
diff --git a/code/game/objects/items/weapons/implants/implantfreedom.dm b/code/game/objects/items/weapons/implants/implantfreedom.dm
index d257aa6eecc..583be7ca02e 100644
--- a/code/game/objects/items/weapons/implants/implantfreedom.dm
+++ b/code/game/objects/items/weapons/implants/implantfreedom.dm
@@ -4,13 +4,14 @@
desc = "Используйте это, чтоб удрать от злых Красных рубашек."
gender = MALE
var/activation_emote = "blink"
- uses = 1.0
+ uses = 1
implant_type = "r"
/obj/item/weapon/implant/freedom/atom_init()
activation_emote = pick("blink", "eyebrow", "twitch", "frown", "nod", "giggle", "grin", "groan", "shrug", "smile", "sniff", "whimper", "wink")
- uses = rand(3, 5)
+ if(prob(reliability))
+ uses = rand(3, 5)
. = ..()
diff --git a/code/game/objects/items/weapons/implants/mindshield.dm b/code/game/objects/items/weapons/implants/mindshield.dm
index a07f31ace9a..868d43c974b 100644
--- a/code/game/objects/items/weapons/implants/mindshield.dm
+++ b/code/game/objects/items/weapons/implants/mindshield.dm
@@ -5,6 +5,8 @@
/obj/item/weapon/implant/mind_protect/implanted(mob/M)
if(!ishuman(M) || !M.mind)
return TRUE
+ if(!prob(reliability))
+ meltdown()
var/mob/living/carbon/human/H = M
if(isrevhead(H) || isshadowling(H) || isshadowthrall(H)|| iswizard(H))
M.visible_message("[M] похоже, сопротивляется имплантату!", "Вы чувствуете, что что-то мешает вашим мыслям, но вы сопротивляетесь этому!")
diff --git a/code/game/objects/random/random_guns.dm b/code/game/objects/random/random_guns.dm
index a6b7c180877..7742f258951 100644
--- a/code/game/objects/random/random_guns.dm
+++ b/code/game/objects/random/random_guns.dm
@@ -119,7 +119,7 @@
name = "Random Weapon"
desc = "This is a random weapon."
icon = 'icons/obj/gun.dmi'
- icon_state = "saber-18"
+ icon_state = "saber"
/obj/random/guns/weapon_item/item_to_spawn()
return pick(\
prob(100);/obj/random/guns/energy_weapon,\
@@ -148,7 +148,7 @@
name = "Random shotgun Weapon with ammunition"
desc = "This is a random weapon."
icon = 'icons/obj/gun.dmi'
- icon_state = "saber-18"
+ icon_state = "saber"
/obj/random/guns/set_shotgun/item_to_spawn()
return pick(\
prob(100);/obj/item/ammo_casing/shotgun/beanbag,\
@@ -164,7 +164,7 @@
name = "Random lethal Weapon with ammunition"
desc = "This is a random weapon."
icon = 'icons/obj/gun.dmi'
- icon_state = "saber-18"
+ icon_state = "saber"
/obj/random/guns/set_357/item_to_spawn()
return pick(\
prob(200);/obj/item/ammo_casing/a357,\
@@ -178,7 +178,7 @@
name = "Random lethal Weapon"
desc = "This is a random weapon."
icon = 'icons/obj/gun.dmi'
- icon_state = "saber-18"
+ icon_state = "saber"
/obj/random/guns/set_special/item_to_spawn()
return pick(\
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 3adb0137337..3d380b073d4 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -187,7 +187,7 @@
name = "extended magazine (9mm)"
icon_state = "glock_mag_extended"
max_ammo = 20
- overlay = "glock-mag-ex"
+ overlay = "glock-mag-extended"
/obj/item/ammo_box/magazine/glock/extended/rubber
name = "extended magazine (9mm rubber)"
@@ -196,14 +196,17 @@
/obj/item/ammo_box/magazine/smg
name = "SMG magazine (9mm)"
- icon_state = "smg_mag"
+ icon_state = "smg_mag-5"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = "9mm"
max_ammo = 18
+ overlay = "saber-mag"
/obj/item/ammo_box/magazine/smg/update_icon()
- ..()
- icon_state = "[initial(icon_state)]-[round(ammo_count(),3)]"
+ var/ammo_perc = ammo_count() / max_ammo
+ var/ammo_state_indx = CEIL(LERP(0, 5, ammo_perc))
+
+ icon_state = "smg_mag-[ammo_state_indx]"
/obj/item/ammo_box/magazine/c20r
name = "magazine (.45)"
diff --git a/code/modules/research/prototipify.dm b/code/modules/research/prototipify.dm
index aa78eca7e63..39890026c33 100644
--- a/code/modules/research/prototipify.dm
+++ b/code/modules/research/prototipify.dm
@@ -76,6 +76,84 @@
break
rating = max(rating - 1, 0)
+/obj/item/ammo_box/magazine/smg/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ max_ammo *= mark
+ var/need_bullets = max_ammo - stored_ammo.len
+ for(var/i in 1 to need_bullets)
+ stored_ammo += new ammo_type(src)
+
+/obj/item/weapon/gun/energy/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ power_supply.maxcharge += (mark - 1) * 200
+ fire_delay = max(fire_delay / mark, 4)
+ if(!prob(reliability))
+ fire_delay *= 2
+ power_supply.maxcharge /= 2
+ power_supply.charge = power_supply.maxcharge
+
+/obj/item/weapon/gun/projectile/automatic/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ recoil = max(recoil / mark, 0.5)
+ fire_delay = max(fire_delay / mark, 2)
+ if(!prob(reliability))
+ fire_delay *= 2
+ recoil += 1
+
+/obj/item/weapon/gun/plasma/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ number_of_shots = min(number_of_shots * mark, 40)
+ if(!prob(reliability))
+ number_of_shots /= 2
+
+/obj/item/weapon/storage/backpack/holding/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ max_storage_space += 10 * (mark - 1)
+ if(!prob(reliability))
+ max_storage_space -= 30
+
+/obj/item/weapon/storage/bag/trash/bluespace/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ max_storage_space += 10 * (mark - 1)
+ if(!prob(reliability))
+ max_storage_space /= 2
+
+/obj/item/weapon/storage/bag/ore/holding/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ max_storage_space += 25 * (mark - 1)
+ if(!prob(reliability))
+ max_storage_space /= 2
+
+/obj/item/clothing/glasses/set_prototype_qualities(rel_val=100, mark=0)
+ if(!prob(reliability))
+ hud_types = list(DATA_HUD_BROKEN)
+
+/obj/item/weapon/weldingtool/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ toolspeed -= 0.5 * (mark - 1)
+ max_fuel *= mark
+ if(!prob(reliability))
+ max_fuel /= 2
+ toolspeed = max(toolspeed + 0.5, 3)
+
+/obj/item/clothing/mask/gas/welding/set_prototype_qualities(rel_val=100, mark=0)
+ if(!prob(reliability))
+ flash_protection = FALSE
+
+/obj/item/clothing/suit/space/rig/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ slowdown /= mark
+ max_mounted_devices += mark - 1
+ if(!prob(reliability))
+ slowdown *= 2
+ max_mounted_devices -= max(max_mounted_devices - 2, 1)
+
+/obj/item/weapon/reagent_containers/glass/beaker/bluespace/set_prototype_qualities(rel_val=100, mark=0)
+ if(mark)
+ volume *= mark
+ if(!prob(reliability))
+ volume /= mark
+
#undef PROTOTYPE_ADJECTIVES
#undef PROTOTYPE_DESC_REMARKS
diff --git a/icons/obj/ammo/magazines.dmi b/icons/obj/ammo/magazines.dmi
index 71d5d869771..7ee6f6754b0 100644
Binary files a/icons/obj/ammo/magazines.dmi and b/icons/obj/ammo/magazines.dmi differ
diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi
index 711bb595ea4..e45adf6adf2 100644
Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ