diff --git a/_maps/shuttles/pirate_dutchman.dmm b/_maps/shuttles/pirate_dutchman.dmm
index 1d1a0b0902b..a00fff6e7e9 100644
--- a/_maps/shuttles/pirate_dutchman.dmm
+++ b/_maps/shuttles/pirate_dutchman.dmm
@@ -359,10 +359,33 @@
},
/turf/open/floor/carpet/blue/airless,
/area/shuttle/pirate/flying_dutchman)
+"nb" = (
+/obj/structure/mounted_gun/canister_gatling,
+/turf/open/floor/wood/airless,
+/area/shuttle/pirate/flying_dutchman)
"pG" = (
/obj/structure/window/reinforced/shuttle/survival_pod,
/turf/open/floor/wood/airless,
/area/shuttle/pirate/flying_dutchman)
+"qG" = (
+/obj/item/ammo_casing/canister_shot{
+ pixel_y = 8;
+ pixel_x = -8
+ },
+/obj/item/ammo_casing/canister_shot{
+ pixel_y = -8;
+ pixel_x = -8
+ },
+/obj/item/ammo_casing/canister_shot{
+ pixel_x = 6;
+ pixel_y = -8
+ },
+/obj/item/ammo_casing/canister_shot{
+ pixel_y = 8;
+ pixel_x = 6
+ },
+/turf/open/floor/wood/airless,
+/area/shuttle/pirate/flying_dutchman)
"rd" = (
/obj/effect/turf_decal/siding/wood/corner,
/obj/effect/turf_decal/siding/wood/corner{
@@ -1234,7 +1257,7 @@ fW
St
QM
da
-WB
+nb
WB
RQ
eG
@@ -1261,7 +1284,7 @@ km
sC
mG
bn
-WB
+qG
WB
xY
WR
diff --git a/code/datums/components/crafting/ranged_weapon.dm b/code/datums/components/crafting/ranged_weapon.dm
index 174c0226a42..bfd2385f89e 100644
--- a/code/datums/components/crafting/ranged_weapon.dm
+++ b/code/datums/components/crafting/ranged_weapon.dm
@@ -300,6 +300,22 @@
category = CAT_WEAPON_RANGED
crafting_flags = CRAFT_CHECK_DENSITY | CRAFT_MUST_BE_LEARNED
+/datum/crafting_recipe/pipe_organ_gun
+ name = "Pipe Organ Gun"
+ tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER)
+ result = /obj/structure/mounted_gun/pipe
+ reqs = list(
+ /obj/item/pipe = 8,
+ /obj/item/stack/sheet/mineral/wood = 15,
+ /obj/item/stack/sheet/iron = 10,
+ /obj/item/storage/toolbox = 1,
+ /obj/item/stack/rods = 10,
+ /obj/item/assembly/igniter = 2,
+ )
+ time = 15 SECONDS
+ category = CAT_WEAPON_RANGED
+ crafting_flags = CRAFT_CHECK_DENSITY
+
/datum/crafting_recipe/trash_cannon
name = "Trash Cannon"
tool_behaviors = list(TOOL_WELDER, TOOL_SCREWDRIVER)
diff --git a/code/game/objects/structures/cannons/cannon_instructions.dm b/code/game/objects/structures/cannons/cannon_instructions.dm
index c259ea0e76f..34cdcdf1ced 100644
--- a/code/game/objects/structures/cannons/cannon_instructions.dm
+++ b/code/game/objects/structures/cannons/cannon_instructions.dm
@@ -17,4 +17,10 @@ REGULAR CANNONBALL: A fine choice for killing landlubbers! Will take off any lim
EXPLOSIVE SHELLBALL: The most elegant in breaching (er killin', if you're good at aimin') tools, ye be packing this shell with many scuppering chemicals! Just make sure to not fire it when ye be close to target!
MALFUNCTION SHOT: A very gentle "cannonball" dart at first glance, but make no mistake: This is their worst nightmare! Enjoy an easy boarding process while all their machines are broken and all their weapons unloaded from an EMP!
THE BIGGEST ONE: A shellball, but much bigger. Ye won't be seein' much of these as they were discontinued for sinkin' the firer's ship as often as it sunk the scallywag's ship. Very big boom! If ye have one, ye have been warned!
+
+
FIRING THAR CANISTER GATLING
+
+THE CANISTER GATLING AIN'T LIKE OTHER CANNONS, AND DOESN'T REQUIRE GUNPOWDER, INSTEAD RELYING ON SPECIAL CANISTER SHOT SHELLS.
+ALL YOU HAVE TO DO IS CRAM A SHELL IN THE BREACH, LIGHT HER UP AND YOU'LL BE BLOWING THOSE CORPORATE SODS TO KINGDOM COME!
+SHE LACKS THE SHEER WALL-BREAKING PUNCH OF THE HOLEMAKERS, BUT CHEWS THROUGH SOFT TARGETS LIKE A SHARK THROUGH A GROUP OF BEACH THROUGH A GROUP OF BEACHGOERS, YAHAR.
"}
diff --git a/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm
new file mode 100644
index 00000000000..da27cdbdaf9
--- /dev/null
+++ b/code/game/objects/structures/cannons/mounted_guns/mounted_gun.dm
@@ -0,0 +1,187 @@
+//Mounted guns are basically a smaller equivalent to cannons, designed to use pre-existing ammo rather than cannonballs.
+//Due to using pre-existing ammo, they dont require to be loaded with gunpowder or an equivalent.
+
+/obj/structure/mounted_gun
+ name = "Mounted Gun"
+ desc = "Default mounted gun for inheritance purposes."
+ density = TRUE
+ anchored = FALSE
+ icon = 'icons/obj/weapons/cannons.dmi'
+ icon_state = "falconet_patina"
+ var/icon_state_base = "falconet_patina"
+ var/icon_state_fire = "falconet_patina_fire"
+ max_integrity = 300
+ ///whether the cannon can be unwrenched from the ground. Anchorable_cannon equivalent.
+ var/anchorable_gun = TRUE
+ ///Max shots per firing of the gun.
+ var/max_shots_per_fire = 1
+ ///Shots currently loaded. Should never be more than max_shots_per_fire.
+ var/shots_in_gun = 1
+ ///shots added to gun, per piece of ammo loaded.
+ var/shots_per_load = 1
+ ///Accepted "ammo" type
+ var/obj/item/ammo_type = /obj/item/ammo_casing/strilka310
+ ///Projectile from said gun. Doesnt automatically inherit said ammo's projectile in case you wanted to make a gun that shoots floor tiles or something.
+ var/obj/item/projectile_type = /obj/projectile/bullet/strilka310
+ ///If the gun has anything in it.
+ var/loaded_gun = TRUE
+ ///If the gun is currently loaded with its maximum capacity.
+ var/fully_loaded_gun = TRUE
+ ///delay in firing the gun after lighting
+ var/fire_delay = 5
+ ///Delay between shots
+ var/shot_delay = 3
+ ///If the gun shakes the camera when firing
+ var/firing_shakes_camera = TRUE
+ ///sound of firing for all but last shot
+ var/fire_sound = 'sound/weapons/gun/general/mountedgun.ogg'
+ ///sound of firing for last shot
+ var/last_fire_sound = 'sound/weapons/gun/general/mountedgunend.ogg'
+
+/obj/structure/mounted_gun/wrench_act(mob/living/user, obj/item/tool)
+ . = ..()
+ if(!anchorable_gun) /// Can't anchor an unanchorable gun.
+ return FALSE
+ default_unfasten_wrench(user, tool)
+ return ITEM_INTERACT_SUCCESS
+
+///Covers Reloading and lighting of the gun
+/obj/structure/mounted_gun/attackby(obj/item/ammo_casing/used_item, mob/user, params)
+ var/ignition_message = used_item.ignition_effect(src, user) // Checks if item used can ignite stuff.
+ if(istype(used_item, ammo_type))
+ if(fully_loaded_gun)
+ balloon_alert(user, "already fully loaded!")
+ return
+ else
+ shots_in_gun = shots_in_gun + shots_per_load //Add one to the shots in the gun
+
+ loaded_gun = TRUE // Make sure it registers theres ammo in there, so it can fire.
+ QDEL_NULL(used_item)
+ if(shots_in_gun >= max_shots_per_fire)
+ shots_in_gun = max_shots_per_fire // in case of somehow firing only some of a guns shots, and reloading, you still cant get above the maximum ammo size.
+ fully_loaded_gun = TRUE //So you cant load extra.
+ return
+
+ else if(ignition_message) // if item the player used ignites, light the gun!
+ visible_message(ignition_message)
+ user.log_message("fired a cannon", LOG_ATTACK)
+ log_game("[key_name(user)] fired a cannon in [AREACOORD(src)]")
+ addtimer(CALLBACK(src, PROC_REF(fire)), fire_delay) //uses fire proc as shown below to shoot the gun
+ return
+ ..()
+
+/obj/structure/mounted_gun/proc/fire()
+ if (!loaded_gun)
+ balloon_alert_to_viewers("gun is not loaded!","",2)
+ return
+ for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself.
+ for(var/mob/shaken_mob in urange(10, src))
+ if(shaken_mob.stat == CONSCIOUS && firing_shakes_camera == TRUE)
+ shake_camera(shaken_mob, 3, 1)
+ icon_state = icon_state_fire
+ if(loaded_gun)
+
+ if (times_fired < shots_in_gun)
+ playsound(src, fire_sound, 50, FALSE, 5)
+ else
+ playsound(src, last_fire_sound, 50, TRUE, 5)
+ var/obj/projectile/fired_projectile = new projectile_type(get_turf(src))
+ fired_projectile.firer = src
+ fired_projectile.fired_from = src
+ fired_projectile.fire(dir2angle(dir))
+ sleep(shot_delay)
+ loaded_gun = FALSE
+ shots_in_gun = 0
+ fully_loaded_gun = FALSE
+ icon_state = icon_state_base
+
+/obj/structure/mounted_gun/pipe
+
+ name = "Pipe Organ Gun"
+ desc = "To become master over one who has killed, one must become a better killer. This engine of destruction is one of many things made to that end."
+ icon_state = "pipeorgangun"
+ icon_state_base = "pipeorgangun"
+ icon_state_fire = "pipeorgangun_fire"
+ anchored = FALSE
+ anchorable_gun = TRUE
+ max_shots_per_fire = 8
+ shots_in_gun = 8
+ shots_per_load = 2
+ ammo_type = /obj/item/ammo_casing/junk
+ projectile_type = /obj/projectile/bullet/junk
+ loaded_gun = TRUE
+ fully_loaded_gun = TRUE
+ fire_delay = 3
+ shot_delay = 2
+ firing_shakes_camera = FALSE
+
+/obj/structure/mounted_gun/pipe/examine_more(mob/user)
+ . = ..()
+ . += span_notice("Looking down at the [name], you recall a tale told to you in some distant memory...")
+
+ . += span_info("To commit an act of vengeance is not unlike to enter a blood pact with a devil, ending the life of another, at the cost of your own.")
+ . += span_info("When humanity first spilled the blood of its own kind, with likely nothing more than a rock, the seal was broken. Vengeance was borne unto the world.")
+ . += span_info("However, vengeance alone is not enough to carry through the grim deed of murder. One must an gain advantage over their adversary.")
+ . += span_info("As such, the man who ended another's life with a stone, was in turn smote himself by another wielding a spear. After spears, bows. Swords. Guns. Tanks. Missiles. And on and on Vengeance fed. Growing stronger. Growing Worse.")
+ . += span_info("Vengeance persists to this day. It sometimes may slumber, seemingly content with having gorged itself, but in the end, its ceaseless hunger can be neither numbed nor sated.")
+
+/obj/structure/mounted_gun/pipe/fire()
+ if (!loaded_gun)
+ balloon_alert_to_viewers("Gun is not loaded!","",2)
+ return
+ for(var/times_fired = 1, times_fired <= shots_in_gun, times_fired++) //The normal DM for loop structure since the times it has fired is changing in the loop itself.
+ for(var/mob/shaken_mob in urange(10, src))
+ if((shaken_mob.stat == CONSCIOUS)&&(firing_shakes_camera == TRUE))
+ shake_camera(shaken_mob, 3, 1)
+ icon_state = icon_state_fire
+ if(loaded_gun)
+ playsound(src, fire_sound, 50, TRUE, 5)
+
+ var/list_of_projectiles = list(
+ /obj/projectile/bullet/junk = 40,
+ /obj/projectile/bullet/incendiary/fire/junk = 25,
+ /obj/projectile/bullet/junk/shock = 25,
+ /obj/projectile/bullet/junk/hunter = 20,
+ /obj/projectile/bullet/junk/phasic = 8,
+ /obj/projectile/bullet/junk/ripper = 8,
+ /obj/projectile/bullet/junk/reaper = 3,
+ )
+ projectile_type = pick_weight(list_of_projectiles)
+
+ var/obj/projectile/fired_projectile = new projectile_type(get_turf(src))
+ fired_projectile.firer = src
+ fired_projectile.fired_from = src
+ fired_projectile.fire(dir2angle(dir))
+ sleep(shot_delay)
+ loaded_gun = FALSE
+ shots_in_gun = 0
+ fully_loaded_gun = FALSE
+ icon_state = icon_state_base
+
+/obj/structure/mounted_gun/canister_gatling //for the funny skeleton pirates!
+
+ name = "Canister Gatling Gun"
+ desc = "''Quantity has a quality of its own.''"
+ icon_state = "canister_gatling"
+ icon_state_base = "canister_gatling"
+ icon_state_fire = "canister_gatling_fire"
+ anchored = FALSE
+ anchorable_gun = TRUE
+ max_shots_per_fire = 50
+ shots_per_load = 50
+ shots_in_gun = 50
+ ammo_type = /obj/item/ammo_casing/canister_shot
+ projectile_type = /obj/projectile/bullet/shrapnel
+ loaded_gun = TRUE
+ fully_loaded_gun = TRUE
+ fire_delay = 3
+ shot_delay = 1
+ firing_shakes_camera = FALSE
+
+/obj/item/ammo_casing/canister_shot
+ name = "Canister Shot"
+ desc = "A gigantic... well, canister of canister shot. Used for reloading the Canister Gatling Gun."
+ icon_state = "canister_shot"
+ obj_flags = CONDUCTS_ELECTRICITY
+ throwforce = 0
+ w_class = WEIGHT_CLASS_BULKY
diff --git a/icons/obj/weapons/cannons.dmi b/icons/obj/weapons/cannons.dmi
index b9735ba0aef..93b43b19239 100644
Binary files a/icons/obj/weapons/cannons.dmi and b/icons/obj/weapons/cannons.dmi differ
diff --git a/icons/obj/weapons/guns/ammo.dmi b/icons/obj/weapons/guns/ammo.dmi
index 971bdaf4d20..2dab0cb3d8d 100644
Binary files a/icons/obj/weapons/guns/ammo.dmi and b/icons/obj/weapons/guns/ammo.dmi differ
diff --git a/sound/attributions.txt b/sound/attributions.txt
index 3a2468205d0..aa3cd0bf37f 100644
--- a/sound/attributions.txt
+++ b/sound/attributions.txt
@@ -94,6 +94,8 @@ https://www.zapsplat.com/sound-effect-category/sleigh-bells/
tada_fanfare.ogg is adapted from plasterbrain's "Tada Fanfare A", which is public domain (CC 0):
https://freesound.org/people/plasterbrain/sounds/397355/
+mountedgun.ogg and mountedgunend.ogg are a combination of the cannon, cqc grab, and syndicate revolver sounds.
+
glockenspiel_ping.ogg is adapted from FunWithSound's "Short Success Sound Glockenspiel Treasure Video Game", which is public domain (CC 0):
https://freesound.org/people/FunWithSound/sounds/456965/
@@ -212,4 +214,4 @@ place glass object.wav by milpower -- https://freesound.org/s/353105/ -- License
glass_reverse.ogg is adapted from a combination of:
https://freesound.org/people/C_Rogers/sounds/203368/ -- glass-shattering-hit_01.ogg by C_Rogers on freesound.org (CC0)
-https://freesound.org/people/Czarcazas/sounds/330800/ -- Audio reversal/fading of Shattering Glass (Small) by Czarcazas -- https://freesound.org/s/330800/ -- License: Attribution 3.0
\ No newline at end of file
+https://freesound.org/people/Czarcazas/sounds/330800/ -- Audio reversal/fading of Shattering Glass (Small) by Czarcazas -- https://freesound.org/s/330800/ -- License: Attribution 3.0
diff --git a/sound/weapons/gun/general/mountedgun.ogg b/sound/weapons/gun/general/mountedgun.ogg
new file mode 100644
index 00000000000..dfa11134eab
Binary files /dev/null and b/sound/weapons/gun/general/mountedgun.ogg differ
diff --git a/sound/weapons/gun/general/mountedgunend.ogg b/sound/weapons/gun/general/mountedgunend.ogg
new file mode 100644
index 00000000000..dfa11134eab
Binary files /dev/null and b/sound/weapons/gun/general/mountedgunend.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 9f805fd9adc..c982d86a9bb 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2747,6 +2747,7 @@
#include "code\game\objects\structures\cannons\cannon.dm"
#include "code\game\objects\structures\cannons\cannon_instructions.dm"
#include "code\game\objects\structures\cannons\cannonballs.dm"
+#include "code\game\objects\structures\cannons\mounted_guns\mounted_gun.dm"
#include "code\game\objects\structures\construction_console\construction_actions.dm"
#include "code\game\objects\structures\construction_console\construction_console.dm"
#include "code\game\objects\structures\construction_console\construction_console_aux.dm"