diff --git a/code/datums/trading/weaponry.dm b/code/datums/trading/weaponry.dm
index a51c290cf5c..132bc9cf168 100644
--- a/code/datums/trading/weaponry.dm
+++ b/code/datums/trading/weaponry.dm
@@ -23,6 +23,7 @@
/obj/item/gun/projectile/sec = TRADER_ALL,
/obj/item/gun/projectile/shotgun/pump = TRADER_ALL,
/obj/item/gun/projectile/shotgun/doublebarrel = TRADER_ALL,
+ /obj/item/gun/projectile/shotgun/pump/lever_action = TRADER_THIS_TYPE,
/obj/item/gun/projectile/tanto = TRADER_THIS_TYPE,
/obj/item/gun/projectile/revolver/detective = TRADER_THIS_TYPE,
/obj/item/gun/projectile/leyon = TRADER_THIS_TYPE,
@@ -42,6 +43,7 @@
/obj/item/storage/box/shotgunshells = TRADER_THIS_TYPE,
/obj/item/storage/box/haywireshells = TRADER_THIS_TYPE,
/obj/item/storage/box/incendiaryshells = TRADER_THIS_TYPE,
+ /obj/item/storage/box/governmentammo = TRADER_THIS_TYPE,
/obj/item/clothing/accessory/holster = TRADER_SUBTYPES_ONLY,
/obj/item/clothing/accessory/holster/thigh/fluff = TRADER_BLACKLIST_ALL
)
@@ -115,6 +117,7 @@
/obj/item/gun/projectile/contender = TRADER_THIS_TYPE,
/obj/item/gun/projectile/revolver/lemat = TRADER_THIS_TYPE,
/obj/item/gun/projectile/shotgun/pump/rifle/vintage = TRADER_BLACKLIST,
+ /obj/item/gun/projectile/shotgun/pump/lever_action = TRADER_BLACKLIST,
/obj/item/gun/energy/rifle/icelance = TRADER_THIS_TYPE,
/obj/item/clothing/accessory/storage/bayonet = TRADER_THIS_TYPE,
/obj/item/gun/projectile/cannon = TRADER_THIS_TYPE,
diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm
index 6e3580110fc..d720c6f02f5 100644
--- a/code/datums/uplink/ammunition.dm
+++ b/code/datums/uplink/ammunition.dm
@@ -36,11 +36,28 @@
path = /obj/item/ammo_magazine/a357
desc = "Contains eight rounds of .357 bullets."
+/datum/uplink_item/item/ammo/c38
+ name = ".38 Speedloader"
+ path = /obj/item/ammo_magazine/c38
+ desc = "Contains six rounds of .38 bullets."
+
+/datum/uplink_item/item/ammo/c38/haywire
+ name = ".38 Speedloader (Haywire)"
+ telecrystal_cost = 2
+ path = /obj/item/ammo_magazine/c38/emp
+ desc = "Contains six rounds of .38 haywire bullets."
+
/datum/uplink_item/item/ammo/shotgun_shells
name = "Box of Shells"
path = /obj/item/storage/box/shotgunshells
desc = "Contains eight shotgun buckshot shells."
+/datum/uplink_item/item/ammo/government
+ name = "Box of .45-70 Govt. ammo"
+ telecrystal_cost = 2
+ path = /obj/item/storage/box/governmentammo
+ desc = "Contains eight .45-70 Govt. bullets."
+
/datum/uplink_item/item/ammo/plasma_mag
name = "Plasma Shotgun Magazine"
telecrystal_cost = 2
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 0c5df5d2640..25bb2833da0 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -364,6 +364,16 @@
pickup_sound = 'sound/items/pickup/ammobox.ogg'
starts_with = list(/obj/item/ammo_casing/c10mm = 10)
+/obj/item/storage/box/governmentammo
+ name = "box of .45-70 Govt. rounds"
+ desc = "It has a picture of a rifle shell and several warning symbols on the front.
WARNING: Live ammunition. Misuse may result in serious injury or death."
+ icon_state = "ammobox"
+ item_state = "ammobox"
+ illustration = null
+ drop_sound = 'sound/items/drop/ammobox.ogg'
+ pickup_sound = 'sound/items/pickup/ammobox.ogg'
+ starts_with = list(/obj/item/ammo_casing/govt = 8)
+
/obj/item/storage/box/flashbangs
name = "box of flashbangs"
desc = "A box containing 7 antipersonnel flashbang grenades.
WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use."
diff --git a/code/game/objects/random/weapon.dm b/code/game/objects/random/weapon.dm
index e978d0bef2d..b82011582aa 100644
--- a/code/game/objects/random/weapon.dm
+++ b/code/game/objects/random/weapon.dm
@@ -192,6 +192,7 @@
/obj/item/gun/projectile/shotgun/pump/rifle/obrez,
/obj/item/gun/projectile/contender,
/obj/item/gun/projectile/shotgun/pump/rifle/vintage,
+ /obj/item/gun/projectile/shotgun/pump/lever_action,
/obj/item/gun/projectile/gauss,
/obj/item/gun/projectile/gauss/carbine,
/obj/item/gun/projectile/shotgun/pump,
diff --git a/code/game/objects/random/weapon_and_ammo.dm b/code/game/objects/random/weapon_and_ammo.dm
index a3649f33ca1..8cdef6e30bc 100644
--- a/code/game/objects/random/weapon_and_ammo.dm
+++ b/code/game/objects/random/weapon_and_ammo.dm
@@ -18,6 +18,7 @@
/obj/item/gun/projectile/revolver/derringer = 1,
/obj/item/gun/projectile/shotgun/pump/rifle/obrez = 1,
/obj/item/gun/projectile/shotgun/pump/rifle/vintage = 1,
+ /obj/item/gun/projectile/shotgun/pump/lever_action = 0.5,
/obj/item/gun/launcher/harpoon = 1
)
diff --git a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm
index 9ec267d0631..b0fb0eeebd7 100644
--- a/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm
+++ b/code/game/objects/structures/crates_lockers/crates/gear_loadout.dm
@@ -252,6 +252,7 @@
new /obj/item/clothing/head/cowboy(src)
new /obj/item/melee/whip(src)
new /obj/item/gun/projectile/revolver/detective(src)
+ new /obj/item/gun/projectile/shotgun/pump/lever_action(src)
/obj/structure/closet/crate/secure/gear_loadout/frontier_cowboys/single/fill()
var/obj/item/clothing/under/shorts/khaki/pants = new(src)
@@ -273,6 +274,8 @@
new /obj/item/clothing/head/cowboy(src)
new /obj/item/melee/whip(src)
new /obj/item/gun/projectile/revolver/detective(src)
+ new /obj/item/gun/projectile/shotgun/pump/lever_action(src)
+
//Megacorporate suits are used in devices and tools in the uplink
/obj/structure/closet/crate/gear_loadout/zavodskoi/fill()
new /obj/item/clothing/head/helmet/space/void/zavodskoi(src)
diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm
index 17e5749fba1..8854621df31 100644
--- a/code/modules/projectiles/ammunition/bullets.dm
+++ b/code/modules/projectiles/ammunition/bullets.dm
@@ -297,12 +297,20 @@
/obj/item/ammo_casing/vintage
projectile_type = /obj/item/projectile/bullet/rifle/vintage
- desc = "Some vintage shell casing. It looks old, and you can't understand the writing stamped on it."
- caliber = "vintage"
+ desc = "A .30-06 Government bullet casing. It looks old, and you can barely understand the writing stamped on it."
+ caliber = "30-06 govt"
icon_state = "lcasing"
spent_icon = "lcasing-spent"
max_stack = 6
+/obj/item/ammo_casing/govt
+ projectile_type = /obj/item/projectile/bullet/rifle/govt
+ desc = "A .45-70 Government bullet casing."
+ caliber = "45-70 govt"
+ icon_state = "gcasing"
+ spent_icon = "gcasing-spent"
+ max_stack = 4
+
/obj/item/ammo_casing/slugger
projectile_type = /obj/item/projectile/bullet/rifle/slugger
caliber = "slugger"
diff --git a/code/modules/projectiles/guns/projectile/rifle.dm b/code/modules/projectiles/guns/projectile/rifle.dm
index 2c1ce136e7d..9ff411a1245 100644
--- a/code/modules/projectiles/guns/projectile/rifle.dm
+++ b/code/modules/projectiles/guns/projectile/rifle.dm
@@ -13,6 +13,7 @@
rack_sound = 'sound/weapons/riflebolt.ogg'
rack_verb = "pull back the bolt on"
+ cycle_anim = FALSE
can_bayonet = TRUE
knife_x_offset = 23
@@ -203,7 +204,7 @@
slot_flags = SLOT_BACK
load_method = SINGLE_CASING|SPEEDLOADER
handle_casings = HOLD_CASINGS
- caliber = "vintage"
+ caliber = "30-06 govt"
ammo_type = /obj/item/ammo_casing/vintage
magazine_type = /obj/item/ammo_magazine/boltaction/vintage
can_bayonet = TRUE
@@ -375,3 +376,24 @@
to_chat(user, SPAN_WARNING("You can't fire without stabilizing \the [src]!"))
return 0
return ..()
+
+/obj/item/gun/projectile/shotgun/pump/lever_action
+ name = "lever action rifle"
+ desc = "A lever action rifle with a side-loading port, these are still popular with frontiersmen for hunting and self-defense purposes."
+ icon = 'icons/obj/guns/leveraction.dmi'
+ icon_state = "leveraction"
+ item_state = "leveraction"
+ origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2)
+ fire_sound = 'sound/weapons/gunshot/gunshot_rifle.ogg'
+ caliber = "45-70 govt"
+ ammo_type = /obj/item/ammo_casing/govt
+ max_shells = 4
+ load_method = SINGLE_CASING
+ handle_casings = HOLD_CASINGS
+
+ cycle_anim = TRUE
+
+ rack_sound = 'sound/weapons/reloads/lever_action_cock1.ogg'
+ rack_verb = "work the lever on"
+ can_bayonet = FALSE
+ can_sawoff = FALSE
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index eb781a42b7f..c58dff44cba 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -63,6 +63,8 @@
var/recentpump = 0 // to prevent spammage
var/rack_sound = /singleton/sound_category/shotgun_pump
var/rack_verb = "pump"
+ ///Whether the item icon has a cycling animation
+ var/cycle_anim = TRUE
/obj/item/gun/projectile/shotgun/pump/consume_next_projectile()
if(chambered)
@@ -84,6 +86,8 @@
playsound(M, rack_sound, 60, FALSE)
to_chat(M, SPAN_NOTICE("You [rack_verb] \the [src]!"))
+ if(cycle_anim)
+ flick("[icon_state]-cycling", src)
if(chambered)//We have a shell in the chamber
chambered.forceMove(get_turf(src)) //Eject casing
@@ -111,6 +115,7 @@
max_shells = 7 //match the ammo box capacity, also it can hold a round in the chamber anyways, for a total of 8.
ammo_type = /obj/item/ammo_casing/shotgun
fire_sound = 'sound/weapons/gunshot/gunshot_shotgun.ogg'
+ cycle_anim = FALSE
/obj/item/gun/projectile/shotgun/pump/combat/sol
name = "solarian combat shotgun"
@@ -120,6 +125,7 @@
item_state = "malella"
origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 3, TECH_ILLEGAL = 2)
ammo_type = /obj/item/ammo_casing/shotgun/pellet
+ cycle_anim = FALSE
/obj/item/gun/projectile/shotgun/doublebarrel
name = "double-barreled shotgun"
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 4a96cff71ee..7621652b04f 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -245,11 +245,15 @@
penetrating = TRUE
/obj/item/projectile/bullet/rifle/vintage
- name = "vintage bullet"
+ name = ".30-06 Govt. bullet"
damage = 50
weaken = 1
penetrating = TRUE
+/obj/item/projectile/bullet/rifle/govt
+ name = ".40-70 Govt. bullet"
+ damage = 50
+
/obj/item/projectile/bullet/rifle/slugger
name = "slugger round"
damage = 60
diff --git a/html/changelogs/GeneralCamo - Lever Action.yml b/html/changelogs/GeneralCamo - Lever Action.yml
new file mode 100644
index 00000000000..00d1557dfac
--- /dev/null
+++ b/html/changelogs/GeneralCamo - Lever Action.yml
@@ -0,0 +1,44 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+# balance
+# admin
+# backend
+# security
+# refactor
+#################################
+
+# Your name.
+author: GeneralCamo
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Added a lever action rifle for the frontier cowboys, which uses newly added .45-70 Government rounds. Sprites ported from polaris, with modifications by suethecake and GeneralCamo."
+ - rscadd: ".45-70 Govt. and .38 rounds are now available on the antagonist uplink."
+ - rscadd: "Added support for cycling animations for pump action shotguns (and derivatives)."
+ - tweak: "Renamed the vintage rounds used by the Springfield to .30-06 Government rounds."
diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi
index bf5a22482e9..997bdf73cda 100644
Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ
diff --git a/icons/obj/guns/leveraction.dmi b/icons/obj/guns/leveraction.dmi
new file mode 100644
index 00000000000..1aa5f857258
Binary files /dev/null and b/icons/obj/guns/leveraction.dmi differ
diff --git a/icons/obj/guns/shotgun.dmi b/icons/obj/guns/shotgun.dmi
index c34cee6a1eb..5b9883bfb17 100644
Binary files a/icons/obj/guns/shotgun.dmi and b/icons/obj/guns/shotgun.dmi differ
diff --git a/sound/attributions.txt b/sound/attributions.txt
index 76c219690ed..9fcd27c4509 100644
--- a/sound/attributions.txt
+++ b/sound/attributions.txt
@@ -66,4 +66,8 @@ ATTRIBUTIONS SECTION END
ATTRIBUTIONS SECTION START
sound/machines/sensors/ping.ogg - "archi_sonar_05.wav", licensed under CC0. Obtained and edited from https://freesound.org/people/ElanHickler/sounds/38704
+ATTRIBUTIONS SECTION END
+
+ATTRIBUTIONS SECTION START
+sound/weapons/reloads/lever_action_cock1.ogg - "Lever action cocking 2.wav", licensed under CC0. Obtained and edited from https://freesound.org/people/C-V/sounds/523402/
ATTRIBUTIONS SECTION END
\ No newline at end of file
diff --git a/sound/weapons/reloads/lever_action_cock1.ogg b/sound/weapons/reloads/lever_action_cock1.ogg
new file mode 100644
index 00000000000..2950acee800
Binary files /dev/null and b/sound/weapons/reloads/lever_action_cock1.ogg differ