diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index fa58b9526fc..c4f9a6193e5 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -13,7 +13,7 @@
/obj/item/toy/blink = 2,
/obj/item/weapon/storage/box/fakesyndiesuit = 2,
/obj/item/toy/sword = 2,
- /obj/item/toy/gun = 2,
+ /obj/item/weapon/gun/projectile/revolver/capgun = 2,
/obj/item/toy/crossbow = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
/obj/item/toy/spinningtoy = 2,
@@ -60,8 +60,8 @@
var/prizeselect = pickweight(prizes)
new prizeselect(src.loc)
- if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun
- new /obj/item/toy/ammo/gun(src.loc)
+ if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
+ new /obj/item/ammo_box/caps(src.loc)
else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
new /obj/item/clothing/head/syndicatefake(src.loc)
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 41db700ac12..8b14ecaa96f 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -3,7 +3,6 @@
* Balloons
* Fake telebeacon
* Fake singularity
- * Toy gun
* Toy crossbow
* Toy Tommy Gun
* Toy swords
@@ -125,78 +124,6 @@
icon = 'icons/obj/singularity.dmi'
icon_state = "singularity_s1"
-/*
- * Toy gun: Why isnt this an /obj/item/weapon/gun?
- */
-/obj/item/toy/gun
- name = "cap gun"
- desc = "There are 0 caps left. Looks almost like the real thing! Ages 8 and up. Please recycle in an autolathe when you're out of caps!"
- icon = 'icons/obj/gun.dmi'
- icon_state = "revolver"
- item_state = "gun"
- lefthand_file = 'icons/mob/inhands/guns_lefthand.dmi'
- righthand_file = 'icons/mob/inhands/guns_righthand.dmi'
- flags = CONDUCT
- slot_flags = SLOT_BELT
- w_class = 3.0
- materials = list(MAT_METAL=10, MAT_GLASS=10)
- attack_verb = list("struck", "pistol whipped", "hit", "bashed")
- var/bullets = 7.0
-
- examine(mob/user)
- if(..(user, 0))
- user << "There are [bullets] caps\s left. Looks almost like the real thing! Ages 8 and up."
-
- attackby(obj/item/toy/ammo/gun/A as obj, mob/user as mob, params)
-
- if (istype(A, /obj/item/toy/ammo/gun))
- if (src.bullets >= 7)
- user << "\blue It's already fully loaded!"
- return 1
- if (A.amount_left <= 0)
- user << "\red There is no more caps!"
- return 1
- if (A.amount_left < (7 - src.bullets))
- src.bullets += A.amount_left
- user << text("\red You reload [] caps\s!", A.amount_left)
- A.amount_left = 0
- else
- user << text("\red You reload [] caps\s!", 7 - src.bullets)
- A.amount_left -= 7 - src.bullets
- src.bullets = 7
- A.update_icon()
- return 1
- return
-
- afterattack(atom/target as mob|obj|turf|area, mob/user as mob, flag)
- if (flag)
- return
- if (!user.IsAdvancedToolUser())
- user << "You don't have the dexterity to do this!"
- return
- src.add_fingerprint(user)
- if (src.bullets < 1)
- user.show_message("*click* *click*", 2)
- playsound(user, 'sound/weapons/empty.ogg', 100, 1)
- return
- playsound(user, 'sound/weapons/Gunshot.ogg', 100, 1)
- src.bullets--
- user.visible_message("[user] fires a cap gun at [target]!", null, "You hear a gunshot.")
-
-/obj/item/toy/ammo/gun
- name = "ammo-caps"
- desc = "There are 7 caps left! Make sure to recyle the box in an autolathe when it gets empty."
- icon = 'icons/obj/ammo.dmi'
- icon_state = "357-7"
- flags = CONDUCT
- w_class = 1.0
- materials = list(MAT_METAL=10, MAT_GLASS=10)
- var/amount_left = 7.0
-
- update_icon()
- src.icon_state = text("357-[]", src.amount_left)
- src.desc = text("There are [] caps\s left! Make sure to recycle the box in an autolathe when it gets empty.", src.amount_left)
- return
/*
* Toy crossbow
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index db3d8a38092..a5f38baf06b 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -84,7 +84,7 @@
/obj/item/toy/balloon,
/obj/item/toy/blink,
/obj/item/toy/crossbow,
- /obj/item/toy/gun,
+ /obj/item/weapon/gun/projectile/revolver/capgun,
/obj/item/toy/katana,
/obj/item/toy/prize/deathripley,
/obj/item/toy/prize/durand,
diff --git a/code/modules/computer3/computers/arcade.dm b/code/modules/computer3/computers/arcade.dm
index 746551079b5..a99c05410ae 100644
--- a/code/modules/computer3/computers/arcade.dm
+++ b/code/modules/computer3/computers/arcade.dm
@@ -7,7 +7,7 @@
/obj/item/toy/blink = 2,
/obj/item/clothing/under/syndicate/tacticool = 2,
/obj/item/toy/sword = 2,
- /obj/item/toy/gun = 2,
+ /obj/item/weapon/gun/projectile/revolver/capgun = 2,
/obj/item/toy/crossbow = 2,
/obj/item/clothing/suit/syndicatefake = 2,
/obj/item/weapon/storage/fancy/crayons = 2,
@@ -28,8 +28,8 @@
if(computer && !computer.stat)
var/prizeselect = pickweight(prizes)
new prizeselect(computer.loc)
- if(istype(prizeselect, /obj/item/toy/gun)) //Ammo comes with the gun
- new /obj/item/toy/ammo/gun(computer.loc)
+ if(istype(prizeselect, /obj/item/weapon/gun/projectile/revolver/capgun)) //Ammo comes with the gun
+ new /obj/item/ammo_box/caps(computer.loc)
else if(istype(prizeselect, /obj/item/clothing/suit/syndicatefake)) //Helmet is part of the suit
new /obj/item/clothing/head/syndicatefake(computer.loc)
feedback_inc("arcade_win_normal")
diff --git a/code/modules/projectiles/ammunition/ammo_casings.dm b/code/modules/projectiles/ammunition/ammo_casings.dm
index 557407ac8a3..84bcd8b5ac9 100644
--- a/code/modules/projectiles/ammunition/ammo_casings.dm
+++ b/code/modules/projectiles/ammunition/ammo_casings.dm
@@ -13,6 +13,11 @@
caliber = "38"
projectile_type = "/obj/item/projectile/bullet/weakbullet2/rubber"
+/obj/item/ammo_casing/cap
+ desc = "A cap for children toys."
+ caliber = "caps"
+ projectile_type = "/obj/item/projectile/bullet/cap"
+
/obj/item/ammo_casing/c10mm
desc = "A 10mm bullet casing."
diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm
index 36ebbce963b..66a50373c76 100644
--- a/code/modules/projectiles/ammunition/boxes.dm
+++ b/code/modules/projectiles/ammunition/boxes.dm
@@ -12,6 +12,13 @@
max_ammo = 6
multiple_sprites = 1
+/obj/item/ammo_box/caps
+ name = "speed loader (caps)"
+ icon_state = "357"
+ ammo_type = /obj/item/ammo_casing/cap
+ max_ammo = 7
+ multiple_sprites = 1
+
/obj/item/ammo_box/c9mm
name = "ammo box (9mm)"
icon_state = "9mmbox"
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 9ef9938071a..1e6dfadd7b5 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -36,6 +36,13 @@
caliber = "38"
max_ammo = 6
+/obj/item/ammo_box/magazine/internal/cylinder/cap
+ name = "cap gun revolver cylinder"
+ desc = "Oh god, this shouldn't be here"
+ ammo_type = "/obj/item/ammo_casing/cap"
+ caliber = "cap"
+ max_ammo = 7
+
/obj/item/ammo_box/magazine/internal/shot
name = "shotgun internal magazine"
desc = "Oh god, this shouldn't be here"
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 713ebbf9dce..cee7f1e95b3 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -64,8 +64,26 @@
..(user)
user << "[get_ammo(0,0)] of those are live rounds."
+/obj/item/weapon/gun/projectile/revolver/proc/Spin()
+ set name = "Spin cylinder"
+ set desc = "Fun when you're bored out of your skull."
+ set category = "Object"
+
+ usr.visible_message("[usr] spins the chamber of the revolver.", "You spin the revolver's chamber.")
+ playsound(src.loc, 'sound/weapons/revolver_spin.ogg', 100, 1)
+ chambered = null
+ var/random = rand(1, magazine.max_ammo)
+ if(random <= get_ammo(0,0))
+ chamber_round()
+ update_icon()
+
+/obj/item/weapon/gun/projectile/revolver/capgun
+ name = "cap gun"
+ desc = "Looks almost like the real thing! Ages 8 and up."
+ origin_tech = "combat=1;materials=1"
+ mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/cap"
+
/obj/item/weapon/gun/projectile/revolver/detective
- name = "\improper .38 Mars Special"
desc = "A cheap Martian knock-off of a classic law enforcement firearm. Uses .38-special rounds."
name = "revolver"
icon_state = "detective"
@@ -168,43 +186,11 @@
desc = "A Russian-made revolver for drinking games. Uses .357 ammo, and has a mechanism that spins the chamber before each trigger pull."
origin_tech = "combat=2;materials=2"
mag_type = "/obj/item/ammo_box/magazine/internal/cylinder/rus357"
- var/spun = 0
+
/obj/item/weapon/gun/projectile/revolver/russian/New()
..()
Spin()
- update_icon()
-
-/obj/item/weapon/gun/projectile/revolver/russian/proc/Spin()
- chambered = null
- var/random = rand(1, magazine.max_ammo)
- if(random <= get_ammo(0,0))
- chamber_round()
- spun = 1
-
-/obj/item/weapon/gun/projectile/revolver/russian/attackby(var/obj/item/A as obj, mob/user as mob, params)
- ..()
- user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.")
- if(get_ammo() > 0)
- Spin()
- update_icon()
- A.update_icon()
- return
-
-/obj/item/weapon/gun/projectile/revolver/russian/attack_self(mob/user as mob)
- if(!spun && get_ammo(0,0))
- user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.")
- Spin()
- else
- ..()
-
-
-/obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)
- if (!spun)
- Spin()
- return
- ..()
- spun = 0
/obj/item/weapon/gun/projectile/revolver/russian/attack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj)
@@ -229,6 +215,5 @@
user.apply_damage(300, BRUTE, affecting, sharp=1) // You are dead, dead, dead.
return
- spun = 0
..()
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 2859edc6a3c..5b4273f2480 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -8,6 +8,17 @@
embed = 1
sharp = 1
+/obj/item/projectile/bullet/cap
+ name = "cap"
+ damage = 0
+ nodamage = 1
+ embed = 0
+ sharp = 0
+
+/obj/item/projectile/bullet/cap/process()
+ loc = null
+ qdel(src)
+
/obj/item/projectile/bullet/weakbullet //beanbag, heavy stamina damage
damage = 5
stamina = 80
diff --git a/sound/weapons/revolver_spin.ogg b/sound/weapons/revolver_spin.ogg
new file mode 100644
index 00000000000..8e40848d690
Binary files /dev/null and b/sound/weapons/revolver_spin.ogg differ