diff --git a/baystation12.dme b/baystation12.dme
index eb38432789eb3..01c493e3d0bab 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -1450,6 +1450,18 @@
#include "code\modules\projectiles\guns\launcher\pneumatic.dm"
#include "code\modules\projectiles\guns\launcher\rocket.dm"
#include "code\modules\projectiles\guns\launcher\syringe_gun.dm"
+#include "code\modules\projectiles\guns\modular\assembly.dm"
+#include "code\modules\projectiles\guns\modular\core.dm"
+#include "code\modules\projectiles\guns\modular\components\barrel.dm"
+#include "code\modules\projectiles\guns\modular\components\chamber.dm"
+#include "code\modules\projectiles\guns\modular\components\chassis.dm"
+#include "code\modules\projectiles\guns\modular\components\driver.dm"
+#include "code\modules\projectiles\guns\modular\components\frame.dm"
+#include "code\modules\projectiles\guns\modular\components\loader.dm"
+#include "code\modules\projectiles\guns\modular\components\lockpin.dm"
+#include "code\modules\projectiles\guns\modular\components\misc.dm"
+#include "code\modules\projectiles\guns\modular\components\sight.dm"
+#include "code\modules\projectiles\guns\modular\components\stock.dm"
#include "code\modules\projectiles\guns\projectile\automatic.dm"
#include "code\modules\projectiles\guns\projectile\dartgun.dm"
#include "code\modules\projectiles\guns\projectile\pistol.dm"
diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm
index 96c635b77861f..12584989cdeb1 100644
--- a/code/game/objects/items/weapons/power_cells.dm
+++ b/code/game/objects/items/weapons/power_cells.dm
@@ -72,6 +72,14 @@
icon_state = "hcell"
maxcharge = 10000
matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 60)
+
+/obj/item/weapon/cell/med
+ name = "WT-2000 power cell"
+ desc = "A middle-of-the-line power cell produced by Ward-Takahashi."
+ origin_tech = "powerstorage=1"
+ icon_state = "hcell"
+ maxcharge = 2000
+ matter = list(DEFAULT_WALL_MATERIAL = 700, "glass" = 40)
/obj/item/weapon/cell/high/empty/New()
..()
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 0cc7b38fe61e7..bfcf5bccc50ed 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -61,6 +61,25 @@
var/accuracy = 0 //accuracy is measured in tiles. +1 accuracy means that everything is effectively one tile closer for the purpose of miss chance, -1 means the opposite. launchers are not supported, at the moment.
var/scoped_accuracy = null
+//MFCS vars below
+
+ var/modAssembly = null
+ var/modChassis = null
+ var/modChamber = null
+ var/modDriver = null
+ var/modLoader = null
+ var/modBarrel = null
+ var/modStock = null
+ var/modSight = null
+ var/modMisc = list()
+ var/mastertype = src
+ var/list/components = list()
+ var/list/removable = list()
+ var/stockmessage = null
+ var/compilesprite = null
+
+//End of MFCS vars
+
var/next_fire_time = 0
var/sel_mode = 1 //index of the currently selected mode
@@ -86,6 +105,29 @@
if(isnull(scoped_accuracy))
scoped_accuracy = accuracy
+
+ compilesprite = icon_state
+
+ if(modAssembly)
+ mastertype = src
+ if(!modAssembly.compiled)
+ recompile()
+
+/obj/item/weapon/gun/proc/recompile()
+ var/assembly/A = new modAssembly(src)
+ A.mastertype = mastertype
+ A.compilesprite = compilesprite
+ A.modChassis = modChassis
+ A.modChamber = modChamber
+ A.modDriver = modDriver
+ A.modLoader = modLoader
+ A.modBarrel = modBarrel
+ if(modStock)
+ A.modStock = modStock
+ if(modScope)
+ A.modScope = modScope
+ A.compiled = 0
+ A.compile()
//Checks whether a given mob can use the gun
//Any checks that shouldn't result in handle_click_empty() being called if they fail should go here.
@@ -143,13 +185,40 @@
else
return ..() //Pistolwhippin'
+/obj/item/weapon/gun/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype (I, /obj/item/weapon/screwdriver))
+ user << "You begin taking apart the [src]."
+ sleep(20)
+ recompile()
+
/obj/item/weapon/gun/proc/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0)
+ var/isenergy = null
if(!user || !target) return
add_fingerprint(user)
if(!special_check(user))
return
+
+ if(istype (src, /obj/item/weapon/gun/energy))
+ isenergy = 1
+ if(src.vent_stack)
+ return
+ else if(src.heat_level = src.heat_cap)
+ user << "[src] feels hot in your hands!"
+ else if((src.heat_level - src.heat_cap) = 1)
+ user << "[src] beeps in alarm, painfully hot!"
+ else if((src.heat_level - src.heat_cap) = 2)
+ user << "[src] flashes a red warning light, searing hot! It can't take much more!"
+ else if((src.heat_level - src.heat_cap) >= 3)
+ if(prob(80))
+ user << "[src] overheats, venting boiling-hot steam!"
+ src.vent_stack += 5
+ return
+ else
+ user << "[src] explodes violently in your hands!"
+ src.explode()
+ return
if(world.time < next_fire_time)
if (world.time % 3) //to prevent spam
@@ -179,6 +248,9 @@
var/acc = firemode.accuracy[min(i, firemode.accuracy.len)]
var/disp = firemode.dispersion[min(i, firemode.dispersion.len)]
process_accuracy(projectile, user, target, acc, disp)
+
+ if(isenergy)
+ src.heat_level += 1
if(pointblank)
process_point_blank(projectile, user, target)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 2a7fdad64753f..6f3a97d5d82dc 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -19,6 +19,9 @@
var/projectile_type = /obj/item/projectile/beam/practice
var/modifystate
var/charge_meter = 1 //if set, the icon state will be chosen based on the current charge
+ var/heat_level = null //Handles overheating for energy weapons
+ var/heat_cap = 5
+ var/vent_stack = null
//self-recharging
var/self_recharge = 0 //if set, the weapon will recharge itself
@@ -58,6 +61,10 @@
..()
/obj/item/weapon/gun/energy/process()
+ if(heat_level)
+ heat_level -= 0.5
+ if(vent_stack)
+ vent_stack -= 1
if(self_recharge) //Every [recharge_time] ticks, recharge a shot for the cyborg
charge_tick++
if(charge_tick < recharge_time) return 0
diff --git a/code/modules/projectiles/guns/modular/assembly.dm b/code/modules/projectiles/guns/modular/assembly.dm
new file mode 100644
index 0000000000000..8987c54191959
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/assembly.dm
@@ -0,0 +1,63 @@
+//Frames are the starting blocks of the weapon. The type of frame decides how large a weapon you can build.
+//In general, weight affects the size and weight (slow to use, bulky, etc) of the weapon
+
+
+obj/item/weapon/modular_firearms/assembly
+ name = "standard assembly"
+ desc = "The outer framework for a firearm of some kind. This one looks rather basic."
+ icon = 'icons/placeholder.dmi'
+ var/mastertype = null
+ var/compiled = null
+ var/msg = null
+ var/modChassis = null
+ var/modChamber = null
+ var/modDriver = null
+ var/modLoader = null
+ var/modBarrel = null
+ var/modStock = null
+ var/modSight = null
+ var/modMisc = list()
+ w_class = 3
+ var/isEnergy = null
+ var/isKinetic = null
+ var/list/components = list()
+ var/list/removable = list()
+
+/obj/item/weapon/modular_firearms/assembly/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I, /obj/item/weapon/modular_firearms))
+ var/part = null
+ var/prereq = null
+ if(istype(I, /obj/item/weapon/modular_firearms/chassis))
+ part = modChassis
+ prereq = null
+
+ else if(istype(I, /obj/item/weapon/modular_firearms/chamber))
+ part = modChamber
+ prereq = modChassis
+
+ else if(istype(I, /obj/item/weapon/modular_firearms/driver))
+ part = modDriver
+ prereq = modChamber
+
+ else if(istype(I, /obj/item/weapon/modular_firearms/loader))
+ part = modLoader
+ prereq = modChamber
+
+ else if(istype(I, /obj/item/weapon/modular_firearms/barrel))
+ part = modBarrel
+ prereq = modChamber
+
+ else if(istype(I, /obj/item/weapon/modular_firearms/stock))
+ part = modStock
+ prereq = modChassis
+
+ else if(istype(I, /obj/item/weapon/modular_firearms/sight))
+ part = modSight
+ prereq = modChassis
+
+ add_part(I, user, part, prereq)
+
+obj/item/weapon/modular_firearms/assembly/heavy
+ name = "heavy assembly"
+ desc = "The outer framework for a firearm. You could probably make something over the top with this."
+ w_class = 4
diff --git a/code/modules/projectiles/guns/modular/components/barrel.dm b/code/modules/projectiles/guns/modular/components/barrel.dm
new file mode 100644
index 0000000000000..e4b7c3268d806
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/barrel.dm
@@ -0,0 +1,96 @@
+//Barrels define the range of the weapon, as well as affecting their accuracy.
+//For energy weapons, this refers to focusing chambers.
+
+obj/item/weapon/modular_firearms/barrel
+ name = "barrel"
+ icon = 'icons/placeholder.dmi'
+ var/accuracy_mod = null
+ var/weight = null
+ var/burst_mod = null
+
+obj/item/weapon/modular_firearms/barrel/sniper
+ name = "marksman barrel"
+ accuracy_mod = 1
+ weight = 4
+
+obj/item/weapon/modular_firearms/barrel/rifle
+ name = "long barrel"
+ accuracy_mod = 0.5
+ weight = 3
+
+
+obj/item/weapon/modular_firearms/barrel/standard
+ name = "standard barrel"
+ accuracy_mod = 0
+ weight = 2
+
+obj/item/weapon/modular_firearms/barrel/short
+ name = "short barrel"
+ accuracy_mod = -0.5
+ weight = 1
+
+obj/item/weapon/modular_firearms/barrel/snub
+ name = "snub barrel"
+ accuracy_mod = -1
+ weight = 0
+
+obj/item/weapon/modular_firearms/barrel/rotating //boom goes your accuracy. Good luck getting one though
+ name = "rotating barrel"
+ accuracy_mod = -3
+ weight = 5
+ burst_mod = 5
+
+obj/item/weapon/modular_firearms/barrel/double
+ name = "double barrel"
+ accuracy_mod = -1
+ weight = 2
+ burst_mod = 2
+
+obj/item/weapon/modular_firearms/barrel/triple
+ name = "triple barrel"
+ accuracy_mod = -2
+ weight = 3
+ burst_mod = 3
+
+ /* //Not quite sure about energy barrels yet.
+obj/item/weapon/modular_firearms/barrel/energy
+ var/power_mod = null
+
+
+obj/item/weapon/modular_firearms/barrel/energy/long
+ name = "high-refraction focusing chamber"
+ accuracy_mod = 2
+ weight = 3
+ power_mod = 4
+
+obj/item/weapon/modular_firearms/barrel/energy/high
+ name = "dense focusing chamber"
+ accuracy_mod = 1
+ weight = 2
+ power_mod = 3
+
+obj/item/weapon/modular_firearms/barrel/energy/heavy
+ name = "heavy focusing chamber"
+ accuracy_mod = 0
+ weight = 4
+ power_mod = 5
+ var/heavyfocus = 1
+
+obj/item/weapon/modular_firearms/barrel/energy/standard
+ name = "regulated focusing chamber"
+ accuracy_mod = 0
+ weight = 1
+ power_mod = 2
+
+obj/item/weapon/modular_firearms/barrel/energy/standard
+ name = "simple focusing chamber"
+ accuracy_mod = 0
+ weight = 0.5
+ power_mod = 1
+
+ */
+
+
+
+
+
diff --git a/code/modules/projectiles/guns/modular/components/chamber.dm b/code/modules/projectiles/guns/modular/components/chamber.dm
new file mode 100644
index 0000000000000..1d73eadd9d2a3
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/chamber.dm
@@ -0,0 +1,122 @@
+//The chamber decides what type of projectile the gun fires.
+//For ballistic, there will be a chamber for each bullet type, along with cartridges and shotgun shells
+//For energy, it will include each type of beam, excluding pulse weaponry. Heavy lasers may only be made with a heavy frame
+
+obj/item/weapon/modular_firearms/chamber
+ var/caliber = null
+ var/projectile_type = null
+ icon = 'icons/placeholder.dmi'
+
+obj/item/weapon/modular_firearms/chamber/a357
+ name = ".357 chamber"
+ desc = "Compatible with .357"
+ caliber = "357"
+
+obj/item/weapon/modular_firearms/chamber/a50
+ name = ".50 chamber"
+ desc = "Compatible with .50"
+ caliber = ".50"
+
+
+obj/item/weapon/modular_firearms/chamber/c38
+ name = ".38 chamber"
+ desc = "Compatible with .38"
+ caliber = "38"
+
+obj/item/weapon/modular_firearms/chamber/a75
+ name = ".75 chamber"
+ desc = "Compatible with .75 ammunition."
+ caliber = "75"
+
+obj/item/weapon/modular_firearms/chamber/c9mm
+ name = "9mm chamber"
+ desc = "Compatible with 9mm ammunition."
+ caliber = "9mm"
+
+obj/item/weapon/modular_firearms/chamber/a12mm
+ name = "12mm chamber"
+ desc = "Compatible with 12mm ammunition."
+ caliber = "12mm"
+
+obj/item/weapon/modular_firearms/chamber/c45
+ name = ".45 chamber"
+ desc = "Compatible with .45 ammunition."
+ caliber = ".45"
+
+obj/item/weapon/modular_firearms/chamber/shotgun
+ name = "shotgun chamber"
+ desc = "Compatible with all shotgun-grade ammunition."
+ caliber = "shotgun"
+
+//obj/item/weapon/modular_firearms/chamber/stunshell
+// name = "taser cartridge system"
+// desc = "Compatible with Taser cartridges."
+// allowed_projectiles = list(/obj/item/projectile/energy/electrode/stunshot, /obj/item/projectile/energy/electrode)
+
+obj/item/weapon/modular_firearms/chamber/a762
+ name = ".762 chamber"
+ desc = "Compatible with .762 ammunition."
+ caliber = "a762"
+
+obj/item/weapon/modular_firearms/chamber/a145
+ name = ".145 chamber"
+ desc = "Compatible with .145 ammunition."
+ caliber = "14.5mm"
+
+obj/item/weapon/modular_firearms/chamber/a556
+ name = ".556 chamber"
+ desc = "Compatible with .556 ammunition."
+ caliber = "a556"
+
+obj/item/weapon/modular_firearms/chamber/energy
+ var/charge_cost = 200
+
+obj/item/weapon/modular_firearms/chamber/energy/laser
+ name = "laser emitter"
+ projectile_type = /obj/item/projectile/beam
+
+obj/item/weapon/modular_firearms/chamber/energy/plaser
+ name = "practice laser emitter"
+ projectile_type = /obj/item/projectile/beam/practice
+
+obj/item/weapon/modular_firearms/chamber/energy/hlaser
+ name = "heavy laser emitter"
+ charge_cost = 400
+ projectile_type = /obj/item/projectile/beam/heavylaser
+
+obj/item/weapon/modular_firearms/chamber/energy/xray
+ name = "X-ray laser emitter"
+ charge_cost = 100
+ projectile_type = /obj/item/projectile/beam/xray
+
+obj/item/weapon/modular_firearms/chamber/energy/xsniper
+ name = "sniper laser emitter"
+ charge_cost = 400
+ projectile_type = /obj/item/projectile/beam/sniper
+
+obj/item/weapon/modular_firearms/chamber/energy/ltagblue
+ name = "blue laser-tag emitter"
+ projectile_type = /obj/item/projectile/beam/lastertag/blue
+
+obj/item/weapon/modular_firearms/chamber/energy/ltagred
+ name = "red laser-tag emitter"
+ projectile_type = /obj/item/projectile/beam/lastertag/red
+
+obj/item/weapon/modular_firearms/chamber/energy/stun
+ name = "stun beam emitter"
+ projectile_type = /obj/item/projectile/beam/stun
+
+obj/item/weapon/modular_firearms/chamber/energy/ion
+ name = "ion emitter"
+ charge_cost = 300
+ projectile_type = /obj/item/projectile/ion
+
+obj/item/weapon/modular_firearms/chamber/energy/floramut
+ name = "floral emitter"
+ charge_cost = 100
+ projectile_type = /obj/item/projectile/energy/floramut
+
+obj/item/weapon/modular_firearms/chamber/energy/phoron
+ name = "phoron emitter"
+ projectile_type = /obj/item/projectile/energy/phoron
+
diff --git a/code/modules/projectiles/guns/modular/components/chassis.dm b/code/modules/projectiles/guns/modular/components/chassis.dm
new file mode 100644
index 0000000000000..e0e306e8d7e2b
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/chassis.dm
@@ -0,0 +1,10 @@
+//The chassis is basically the actual framework of the gun, and decides what type of weapon it will be.
+//Options are ballistic and energy, for the moment
+
+obj/item/weapon/modular_firearms/chassis
+ icon = 'icons/placeholder.dmi'
+ var/weight = 2
+
+obj/item/weapon/modular_firearms/chassis/energy
+
+obj/item/weapon/modular_firearms/chassis/ballistic
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/modular/components/driver.dm b/code/modules/projectiles/guns/modular/components/driver.dm
new file mode 100644
index 0000000000000..b7a9344f0e016
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/driver.dm
@@ -0,0 +1,54 @@
+//Drivers affect how the gun fires. Does it use burst fire? Automatic? Semi? Charge?
+
+/*/datum/firemode/modular
+ name = "modular-default"
+ burst = 1
+ burst_delay = null
+ fire_delay = null
+ move_delay = 1
+ list/accuracy = list(0)
+ list/dispersion = list(0)
+ */
+
+obj/item/weapon/modular_firearms/driver
+ icon = 'icons/placeholder.dmi'
+ var/list/firemodes = list(
+ list(name="semiauto", burst=1, fire_delay=0)
+ )
+
+obj/item/weapon/modular_firearms/driver/longburst
+ name = "rapid-automatic driver"
+ icon = 'icons/placeholder.dmi'
+ firemodes = list(
+ list(name="long bursts", burst=8, move_delay=8, accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2)),
+ list(name="short bursts", burst=5, move_delay=6, accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2))
+ )
+
+obj/item/weapon/modular_firearms/driver/semiauto
+ name = "semi-automatic driver"
+ icon = 'icons/placeholder.dmi'
+
+obj/item/weapon/modular_firearms/driver/burst3
+ name = "burst driver"
+ icon = 'icons/placeholder.dmi'
+ firemodes = list(
+ list(name="3-round bursts", burst=3, move_delay=6, accuracy = list(0,-1,-1), dispersion = list(0.0, 0.6, 0.6)),
+ list(name="semiauto", burst=1, fire_delay=0)
+ )
+
+obj/item/weapon/modular_firearms/driver/burst5
+ name = "5-burst driver"
+ icon = 'icons/placeholder.dmi'
+ firemodes = list(
+ list(name="short bursts", burst=5, move_delay=6, accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)),
+ list(name="3-round bursts", burst=3, move_delay=6, accuracy = list(0,-1,-1), dispersion = list(0.0, 0.6, 0.6)),
+ list(name="semiauto", burst=1, fire_delay=0)
+ )
+
+obj/item/weapon/modular_firearms/driver/z8
+ name = "Z8 driver"
+ firemodes = list(
+ list(name="semiauto", burst=1, fire_delay=0),
+ list(name="3-round bursts", burst=3, move_delay=6, accuracy = list(0,-1,-1), dispersion = list(0.0, 0.6, 0.6)),
+ list(name="fire grenades", use_launcher=1)
+ )
diff --git a/code/modules/projectiles/guns/modular/components/frame.dm b/code/modules/projectiles/guns/modular/components/frame.dm
new file mode 100644
index 0000000000000..78b8122a8db6a
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/frame.dm
@@ -0,0 +1,2 @@
+//Frames are the starting blocks of the weapon. The type of frame decides how large a weapon you can build.
+//In general, weight affects the size and weight (slow to use, bulky, etc) of the weapon
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/modular/components/loader.dm b/code/modules/projectiles/guns/modular/components/loader.dm
new file mode 100644
index 0000000000000..6ed57488b588c
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/loader.dm
@@ -0,0 +1,63 @@
+//Loaders are how the gun handles ammuni
+
+obj/item/weapon/modular_firearms/loader
+ icon = 'icons/placeholder.dmi'
+ var/load_method = null
+ var/isbolt = null
+ var/useCell = null
+ var/useSupply = null
+ var/Eloader = null
+ var/max_shells = null
+ var/handle_casings = null
+
+obj/item/weapon/modular_firearms/loader/magazine
+ name = "magazine loader"
+ load_method = MAGAZINE
+ handle_casings = EJECT_CASINGS
+
+obj/item/weapon/modular_firearms/loader/speedloader
+ name = "speedloader"
+ load_method = SINGLE_CASING|SPEEDLOADER
+ handle_casings = EJECT_CASINGS
+
+obj/item/weapon/modular_firearms/loader/shell
+ name = "shell loader"
+ load_method = SINGLE_CASING
+ handle_casings = HOLD_CASINGS
+ max_shells = 4
+
+obj/item/weapon/modular_firearms/loader/shell/combat //lockbox
+ name = "combat shell loader"
+ max_shells = 7
+
+obj/item/weapon/modular_firearms/loader/bolt
+ name = "bolt loader"
+ load_method = SINGLE_CASING
+ handle_casings = HOLD_CASINGS
+ max_shells = 1
+ isbolt = 1
+
+obj/item/weapon/modular_firearms/loader/powersupply
+ name = "internal power supply"
+ icon = 'icons/placeholder.dmi'
+ useSupply = 1
+ Eloader = 1
+ var/celltype = /obj/item/weapon/cell
+ var/cooler = null
+
+obj/item/weapon/modular_firearms/loader/powersupply/verylow
+ name = "WT-500 power supply"
+ desc = "Powered with an AA battery. This is pretty awful."
+ celltype = /obj/item/weapon/cell/crap
+
+obj/item/weapon/modular_firearms/loader/powersupply/low
+ name = "WT-1000 power supply"
+ celltype = /obj/item/weapon/cell/device
+
+obj/item/weapon/modular_firearms/loader/powersupply/med
+ name = "WT-2000 power supply"
+ celltype = /obj/item/weapon/cell
+
+obj/item/weapon/modular_firearms/loader/powersupply/high
+ name = "WT-5000 power supply."
+ celltype = /obj/item/weapon/cell/apc
diff --git a/code/modules/projectiles/guns/modular/components/lockpin.dm b/code/modules/projectiles/guns/modular/components/lockpin.dm
new file mode 100644
index 0000000000000..10552f49ab781
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/lockpin.dm
@@ -0,0 +1,5 @@
+//This is a special little pin that you have to get either from a lockbox in R&D or from security
+//Without this, the gun won't work. it's basically to stop people making guns and going on a rampage.
+
+obj/item/weapon/modular_firearms/lockpin
+ icon = 'icons/placeholder.dmi'
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/modular/components/misc.dm b/code/modules/projectiles/guns/modular/components/misc.dm
new file mode 100644
index 0000000000000..781c37bf8e524
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/misc.dm
@@ -0,0 +1,10 @@
+//Misc includes things such as silencers and compensators.
+
+obj/item/weapon/modular_firearms/silencer
+ icon = 'icons/placeholder.dmi'
+
+obj/item/weapon/modular_firearms/compensator
+ icon = 'icons/placeholder.dmi'
+
+obj/item/weapon/modular_firearms/flashlight
+ icon = 'icons/placeholder.dmi'
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/modular/components/sight.dm b/code/modules/projectiles/guns/modular/components/sight.dm
new file mode 100644
index 0000000000000..a3fcc05e69305
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/sight.dm
@@ -0,0 +1,4 @@
+//What it says on the tin
+
+obj/item/weapon/modular_firearms/sight
+ icon = 'icons/placeholder.dmi'
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/modular/components/stock.dm b/code/modules/projectiles/guns/modular/components/stock.dm
new file mode 100644
index 0000000000000..2398c2a40b5c9
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/components/stock.dm
@@ -0,0 +1,35 @@
+//Stocks affect the gun's accuracy and recoil, in the case of projectile weaponry.
+
+obj/item/weapon/modular_firearms/stock
+ icon = 'icons/placeholder.dmi'
+ var/weight = null
+ var/folding = null //can be folded away. Makes the weapon less unwieldy, but removes recoil bonus
+ var/telescopic = null //can collapse. Slightly better but heavier than the folding stock
+ var/recoil_mod = null
+
+obj/item/weapon/modular_firearms/stock/comp
+ name = "compound stock"
+ recoil_mod = -2
+ weight = 2
+
+obj/item/weapon/modular_firearms/stock/fixed
+ name = "fixed stock"
+ recoil_mod = -1.5
+ weight = 1.5
+
+obj/item/weapon/modular_firearms/stock/folding
+ name = "folding stock"
+ recoil_mod = -1
+ weight = 1
+ folding = 1
+
+obj/item/weapon/modular_firearms/stock/tele //telescopic everything
+ name = "telescopic stock"
+ recoil_mod = -1.5
+ weight = 1.5
+ telescopic = 1
+
+obj/item/weapon/modular_firearms/stock/pistol
+ name = "pistol stock"
+ recoil_mod = -0.5
+ weight = 0.5
diff --git a/code/modules/projectiles/guns/modular/core.dm b/code/modules/projectiles/guns/modular/core.dm
new file mode 100644
index 0000000000000..abea12a8e5586
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/core.dm
@@ -0,0 +1,175 @@
+//MFCS procs -- Cirra
+
+/obj/item/weapon/modular_firearms/assembly/proc/debug(var/part as var, var/type as var)
+ user << "DEBUG: [part] is current [type]"
+
+/obj/item/weapon/modular_firearms/assembly/proc/process_part(obj/item/I as obj, mob/user as mob) //this should handle processing new parts in the weapon, without relying on the weapon actually being attacked.
+ if(istype(I, /obj/item/weapon/modular_firearms/chassis))
+ if(istype(I, /obj/item/weapon/modular_firearms/chassis/energy))
+ src.isEnergy = 1
+ if(istype(I, /obj/item/weapon/modular_firearms/chassis/ballistic))
+ src.isKinetic = 1
+ modChassis = I
+ src.removable += I //adds itself to the removable list
+ if(istype(I, /obj/item/weapon/modular_firearms/chamber))
+ var/obj/item/weapon/modular_firearms/chamber/chamber = I
+ if(chamber.projectile_type) //checking for energy weaponry
+ if(src.isEnergy)
+ else
+ src.msg = " A ballistic chamber won't work with an energy chassis!"
+ return
+ if(chamber.caliber) //checking for kinetic weaponry
+ if(src.isKinetic)
+ else
+ src.msg = " An energy chamber won't work with a ballistic chassis!"
+ return
+ src.modChamber = I
+ src.removable -= src.modChassis //removes its source part from the removable list.
+ src.removable += I
+ if(istype(I, /obj/item/weapon/modular_firearms/driver))
+ var/obj/item/weapon/modular_firearms/driver/D = I
+ if(D.firemodes)
+ else
+ src.msg = " Have you considered using a real driver?" //this will usually only be returned if
+ return // they try and use the base driver
+ src.modDriver = I
+ src.removable += I
+ src.removable -= src.modChamber
+ if(istype(I, /obj/item/weapon/modular_firearms/loader))
+ var/obj/item/weapon/modular_firearms/loader/L = I
+ if(!L.Eloader)
+ useBullet = 1
+ if(L.Eloader)
+ if(L.useCell)
+ useCell = 1
+ if(L.useSupply)
+ useSupply = 1
+ src.modLoader = I
+ src.removable += I
+ src.removable -= src.modChamber
+ if(istype(I, /obj/item/weapon/modular_firearms/barrel))
+ var/obj/item/weapon/modular_firearms/barrel/B = I
+ src.modBarrel = I
+ src.removable += I
+ src.removable -= src.modChamber
+ if(istype(I, /obj/item/weapon/modular_firearms/stock))
+ src.modStock += I
+ src.removable += I
+ src.removable -= src.modChassis
+ if(istype(I, /obj/item/weapon/modular_firearms/sight))
+ src.modSight += I
+ src.removable += I
+ src.removable -= src.modChassis
+
+/obj/item/weapon/modular_firearms/assembly/proc/add_part(obj/item/I as obj, mob/user as mob, var/part, var/prereq) //Handles all part processing in a single proc. So clean~
+ if(part)
+ if(part in src.components)
+ user << " There is already a [part] installed!"
+ return
+ else
+ user << " Error - null part variable for [I]." //for debugging
+ return
+ if(prereq)
+ if(!prereq in src.components)
+ user << " The [I] needs to be attached to a [prereq]!"
+ return
+ src.process_part(I, user)
+ if(!src.msg)
+ src.msg = ("\blue You install the [I] onto the [src].")
+ user << src.msg
+ user.drop_item()
+ I.loc = src
+ src.components += I
+
+/obj/item/weapon/modular_firearms/assembly/proc/remove_part(obj/item/I as obj, mob/user as mob)
+ var/picked = input("Select part to remove", "none")as null|anything in removable
+ if(!picked || !removable[picked])
+ return
+ var/removing = removable[picked]
+ removing.loc = user
+ src.components -= removing
+ if(removing == src.modChassis) //will figure out how to make this cleaner at some point
+ src.modChassis = null
+ if(removing == src.modChamber)
+ src.modChamber = null
+ if(removing == src.modDriver)
+ src.modDriver = null
+ if(removing == src.modLoader)
+ src.modLoader = null
+ if(removing == src.modBarrel)
+ src.modBarrel = null
+ if(removing == src.modSight)
+ src.modSight = null
+ if(removing == src.modStock)
+ src.modStock = null
+ if(removing == src.modAttachment)
+ src.modAttachment = null
+ user << " You remove the [removing] from the frame."
+
+/* var/obj/item/weapon/cell/power_supply //What type of power cell this uses
+ var/charge_cost = 200 //How much energy is needed to fire.
+ var/max_shots = 10 //Determines the capacity of the weapon's power cell. Specifying a cell_type overrides this value.
+ var/cell_type = null
+ var/projectile_type = /obj/item/projectile/beam/practice
+ var/modifystate
+ var/charge_meter = 1
+ */
+
+/obj/item/weapon/modular_firearms/assembly/proc/compile(mob/user as mob)
+ var/obj/item/weapon/gun/MFCS/P // Declares but does not instantiate a variable or create the object.
+ src.compiled = 1
+ if(src.mastertype)
+ P = new mastertype(loc)
+ else
+ if(src.isKinetic)
+ P = new obj/item/weapon/gun/MFCS/projectile(loc) // Previously declared variable refers to this object.
+ else if(src.isEnergy)
+ P = new obj/item/weapon/gun/MFCS/energy(loc) // As above, different path, shared parent type.
+ P.modChassis = src.modChassis //etc. Credit to Zuhayr for the above.
+ P.modChamber = src.modChamber
+ if(src.caliber)
+ P.caliber = src.caliber
+ else
+ P.projectile_type = src.projectile_type
+ P.charge_cost = src.modChamber.charge_cost
+ P.modLoader = src.modLoader
+ var/load = src.modLoader
+ if(!load.Eloader)
+ if(!P.max_shells)
+ P.max_shells = load.max_shells
+ P.load_method = load.load_method
+ P.handle_casings = load.handle_casings
+ else
+ P.cell = new/obj/item/weapon/cell(P) //Initializes a powercell inside of the energy weapon.
+ P.modDriver = src.modDriver
+ var/driver = src.modDriver
+ for(datum/firemode/F in driver.firemodes())
+ P.firemodes += F //adds each firemode from the driver to the gun
+ P.modBarrel = src.modBarrel
+ var/barrel = src.modBarrel
+ if(barrel.burst_mod) //checking if it's some kind of special barrel such as double or rotating
+ for(datum/firemode/F in P.firemodes())
+ F.burst += barrel.burst_mod //should add the number of extra shots to each firemode the gun has
+ if(src.modStock)
+ P.modStock = src.modStock
+ var/stock = src.modStock
+ if(stock.folding)
+ P.stockmessage = "You fold away the [modStock]"
+ else if(stock.telescopic)
+ P.stockmessage = "You collapse the [modStock]"
+
+ for(obj/item/I in P.contents()) //so I don't have to repeat these lines every time something modifies them
+ if(I.accuracy_mod)
+ P.accuracy += I.accuracy_mod
+ if(I.weight) //will be used to calculate w_class
+ P.weight += I.weight
+ if(I.overlays) //critical component of the upcoming modular sprite system
+ if(!P.compilesprite)
+ P.overlays += I.overlays
+ else
+ I.overlays = list()
+ P.icon_state = P.compilesprite
+ if(I.recoil_mod)
+ P.recoil += I.recoil_mod
+
+ src.debug(I, I.name)
diff --git a/code/modules/projectiles/guns/modular/firearms/base.dm b/code/modules/projectiles/guns/modular/firearms/base.dm
new file mode 100644
index 0000000000000..4d12b34052529
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/firearms/base.dm
@@ -0,0 +1,21 @@
+/obj/item/weapon/gun/MFCS
+ name = "modular gun template"
+ desc = "Nothing to see here. Move along, citizen."
+ var/modChassis = null
+ var/modChamber = null
+ var/modDriver = null
+ var/modLoader = null
+ var/modBarrel = null
+ var/modStock = null
+ var/modSight = null
+ var/modMisc = list()
+ var/weight = 1
+ fire_delay
+ burst_delay
+ list/firemodes = list()
+ accuracy = 0
+ var/list/components = list()
+ var/list/removable = list()
+ var/useCell = null
+ var/useSupply = null
+ var/useBullet = null
diff --git a/code/modules/projectiles/guns/modular/firearms/energy.dm b/code/modules/projectiles/guns/modular/firearms/energy.dm
new file mode 100644
index 0000000000000..94a1fbdf490cb
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/firearms/energy.dm
@@ -0,0 +1,19 @@
+
+/obj/item/weapon/gun/energy/modular
+ name = "energy gun"
+ desc = "Pew pew."
+ var/modChassis = null
+ var/modChamber = null
+ var/modDriver = null
+ var/modLoader = null
+ var/modBarrel = null
+ var/modStock = null
+ var/modSight = null
+ var/modMisc = list()
+ var/weight = 1
+ fire_delay = null
+ burst_delay = null
+ list/firemodes = list()
+ accuracy = 0
+ var/list/components = list()
+ var/list/removable = list()
diff --git a/code/modules/projectiles/guns/modular/firearms/projectile.dm b/code/modules/projectiles/guns/modular/firearms/projectile.dm
new file mode 100644
index 0000000000000..4ffa7808fd9f0
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/firearms/projectile.dm
@@ -0,0 +1,21 @@
+/obj/item/weapon/gun/MFCS/projectile
+ name = "modular gun"
+ desc = "A gun, obviously."
+ modChassis = null
+ modChamber = null
+ modDriver = null
+ modLoader = null
+ modBarrel = null
+ modStock = null
+ modSight = null
+ modMisc = list()
+ recoil = 0
+ muzzle_flash = 0
+ accuracy = 0
+ fire_delay = 0
+ burst_delay = 0
+ list/firemodes = list()
+ caliber = null
+ max_shells = null
+ load_method = null
+ handle_casings = null
diff --git a/code/modules/projectiles/guns/modular/premade/energy/beam.dm b/code/modules/projectiles/guns/modular/premade/energy/beam.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/energy/beam.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/premade/energy/nuclear.dm b/code/modules/projectiles/guns/modular/premade/energy/nuclear.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/energy/nuclear.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/premade/energy/special.dm b/code/modules/projectiles/guns/modular/premade/energy/special.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/energy/special.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/premade/projectile/automatic.dm b/code/modules/projectiles/guns/modular/premade/projectile/automatic.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/projectile/automatic.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/premade/projectile/dart.dm b/code/modules/projectiles/guns/modular/premade/projectile/dart.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/projectile/dart.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/premade/projectile/pistol.dm b/code/modules/projectiles/guns/modular/premade/projectile/pistol.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/projectile/pistol.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/premade/projectile/shotgun.dm b/code/modules/projectiles/guns/modular/premade/projectile/shotgun.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/projectile/shotgun.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/premade/projectile/sniper.dm b/code/modules/projectiles/guns/modular/premade/projectile/sniper.dm
new file mode 100644
index 0000000000000..8b137891791fe
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/premade/projectile/sniper.dm
@@ -0,0 +1 @@
+
diff --git a/code/modules/projectiles/guns/modular/readme.txt b/code/modules/projectiles/guns/modular/readme.txt
new file mode 100644
index 0000000000000..925e2f0b6969a
--- /dev/null
+++ b/code/modules/projectiles/guns/modular/readme.txt
@@ -0,0 +1,79 @@
+################################################################################################
+# README - MODULAR FIREARM CONSTRUCTION SYSTEM
+# ----------------------------------------------------------------------------------------------
+# 1. Constructing firearms
+# 2. Deconstructing firearms
+# 3. Components
+# 4. Overview of the finished product
+# 5. Debugging
+#
+#
+# --Constructing firearms--
+# MFCS allows players to design new guns from an array
+# of parts, in-game. These parts can be obtained by
+# cargo, or constructed by research, and will normally
+# come in a HoS-locked box. Once the player has obtained
+# enough of these components to create a new weapon,
+# they may "compile" the firearm after installing each
+# part on the firearm's frame.
+#
+# Assembly
+# In order to assemble a firearm, the user should obtain the parts they wish to use, starting with
+# the "assembly." The type of assembly will indicate the size of the final weapon, as should be clear.
+# In order to actually assemble the weapon, the player should follow the following steps.
+#
+# 1. Click on the assembly with a chassis in hand (ballistic/energy.) This will decide if the weapon
+# will fire beams or other energy projectiles, or if it will fire bullets. For now, there are only
+# Two types of chassis, although another may be coming in the future.
+#
+# 2. Click on the assembly with a chamber. This will decide what type of projectile the weapon will fire -
+# If the assembly has a ballistic chassis attached, then the player may attach a chamber for any type of
+# bullet in the game. For energy chassis's, the player may do the same, but for any type of energy projectile
+# including lasers, x-ray, ion, phoron, et cetera. From this point, the steps may be carried out in a variety
+# of different orders. It should be noted that in the case of ballistic weapons, this step also decides the
+# calibre of the weapon. At this point, the chassis may no longer be removed.
+#
+# 3. Click on the assembly with either a barrel, a driver, or a loader.
+# i) If the player attaches a barrel at this stage, then this will decide the accuracy of the weapon. This
+# does not affect the accuracy levels of each firemode, however. Once a barrel is attached, the chamber may not be removed.
+# ii) If the player attaches a driver at this stage, then this will decide how the weapon fires. Each driver represents a set
+# of firemodes, which will be applied to the final weapon. For instance, the player may attach a longburst driver if they wish
+# to replicate the functionality of a SAW, while a semi-automatic driver will act like most pistols in the game. As
+# should be obvious, it would be very foolish to attach a driver which allows for longer bursts than the weapon is
+# capable of, due to its capacity. Once this part is attached, the chamber may not be removed.
+# iii) If the player attaches a loader at this stage, then this will decide how the weapon can be loaded with ammunition.
+# care should be taken to ensure that the player does not install a loader with a lower capacity than the weapon's firemodes,
+# such as a bolt loader with a fully automatic weapon. In the case of an energy weapon, this step will decide on the size
+# of the firearm's power supply. Depending on the chosen loader, the weapon will then accept
+# any ammunition of the same calibre as the weapon itself, as long as that ammunition is delivered with the correct loading
+# procedure. For instance, a weapon with a magazine loader will accept any magazines with ammunition of the same calibre
+# as that defined by the chamber. As with the other two options, carrying out this step will render the chamber unremovable.
+# step 3 can be carried out until all three parts are installed.
+#
+# 4. (optional) Click on the assembly with either a stock or a scope.
+# i) If the player attaches a stock at this stage, then this will affect the recoil of the weapon in question, usually reducing
+# it. In some cases, the stock will be able to be folded, at which point the weapon will display a message and the W_class will
+# be reduced by one. In all cases, having the stock attached and/or extended will increase the W_class of the firearm by 1.
+# ii) If the player attaches a scope at this stage, then this will have two effects. If the scope is some kind of long-range
+# sniper's scope, this will allow the player to zoom, as they can with any sniper rifle in the game. Their accuracy in this
+# mode will be affected by the barrel and firemode in use. If the scope is of any other kind, this will affect the accuracy
+# of the weapon when unscoped. For instance, a red-dot sight will slightly increase the accuracy of the weapon, in comparison
+# to standard iron sights.
+#
+# 5. Click on the assembly with a screwdriver. This will complete the weapon, and put it into the hands of the player. Note that
+# doing this while the weapon is already compiled will dissasemble it, and the process must be restarted.
+#
+# ----------------------------
+# assembly
+# |
+# chassis
+# | | |
+# stock _| | |_ scope
+# chamber
+# | | |
+# driver _| | |_ barrel
+# loader
+# -----------------------------
+#
+# Fig. 1 - The tree of parts in a firearm. All parts that are linked to others futher down the tree may not be removed
+# until all of the further-down parts are removed
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index 576488e774526..3c286f13e4ed0 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -10,6 +10,13 @@
w_class = 3
matter = list(DEFAULT_WALL_MATERIAL = 1000)
recoil = 1
+
+ modFrame = /obj/item/weapon/modular_firearms/assembly
+ modChassis = /obj/item/weapon/modular_firearms/chassis/ballistic
+ modLoader = /obj/item/weapon/modular_firearms/loader/speedloader
+ modChamber = /obj/item/weapon/modular_firearms/chamber/a357
+ modBarrel = /obj/item/weapon/modular_firearms/barrel/standard
+ modDriver = /obj/item/weapon/modular_firearms/driver
var/caliber = "357" //determines which casings will fit
var/handle_casings = EJECT_CASINGS //determines how spent casings should be handled
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 106f8a0ea4778..5f983aa04a587 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -11,11 +11,8 @@
ammo_type = /obj/item/ammo_casing/c9mm
multi_aim = 1
- firemodes = list(
- list(name="semiauto", burst=1, fire_delay=0),
- list(name="3-round bursts", burst=3, move_delay=4, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.0, 0.6, 1.0)),
- list(name="short bursts", burst=5, move_delay=4, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)),
- )
+ modChamber = /obj/item/weapon/modular_firearms/chamber/c9mm
+ modDriver = /obj/item/weapon/modular_firearms/driver/burst5
/obj/item/weapon/gun/projectile/automatic/mini_uzi
name = "\improper Uzi"
@@ -27,6 +24,8 @@
caliber = ".45"
origin_tech = "combat=5;materials=2;syndicate=8"
ammo_type = /obj/item/ammo_casing/c45
+
+ modBarrel = /obj/item/weapon/modular_firearms/barrel/short
/obj/item/weapon/gun/projectile/automatic/c20r
name = "\improper C-20r SMG"
@@ -43,6 +42,9 @@
magazine_type = /obj/item/ammo_magazine/a12mm
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
+
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
+ modChamber = obj/item/weapon/modular_firearms/chamber/a12mm
/obj/item/weapon/gun/projectile/automatic/c20r/update_icon()
..()
@@ -65,11 +67,10 @@
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/c762
- firemodes = list(
- list(name="semiauto", burst=1, fire_delay=0),
- list(name="3-round bursts", burst=3, move_delay=6, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.0, 0.6, 0.6)),
- list(name="short bursts", burst=5, move_delay=6, accuracy = list(0,-1,-1,-2,-2), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)),
- )
+ modAssembly = /obj/item/weapon/modular_firearms/assembly/heavy
+ modDriver = /obj/item/weapon/modular_firearms/driver/burst5
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
+ modChamber = /obj/item/weapon/modular_firearms/chamber/a762
/obj/item/weapon/gun/projectile/automatic/sts35/update_icon()
..()
@@ -89,6 +90,9 @@
fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/mc9mmt/rubber
+
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
+ modChamber = /obj/item/weapon/modular_firearms/chamber/c9mm
/obj/item/weapon/gun/projectile/automatic/wt550/update_icon()
..()
@@ -118,13 +122,13 @@
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
+ modAssembly = /obj/item/weapon/modular_firearms/assembly/heavy
+ modDriver = /obj/item/weapon/modular_firearms/driver/z8
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
+ modChamber = /obj/item/weapon/modular_firearms/chamber/a556
+
burst_delay = 4
firemode_type = /datum/firemode/z8
- firemodes = list(
- list(name="semiauto", burst=1, fire_delay=0),
- list(name="3-round bursts", burst=3, move_delay=6, accuracy = list(0,-1,-1), dispersion = list(0.0, 0.6, 0.6)),
- list(name="fire grenades", use_launcher=1)
- )
var/obj/item/weapon/gun/launcher/grenade/underslung/launcher
@@ -186,10 +190,10 @@
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/a762
- firemodes = list(
- list(name="short bursts", burst=5, move_delay=6, accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(0.6, 1.0, 1.0, 1.0, 1.2)),
- list(name="long bursts", burst=8, move_delay=8, accuracy = list(0,-1,-1,-2,-2,-2,-3,-3), dispersion = list(1.0, 1.0, 1.0, 1.0, 1.2)),
- )
+ modAssembly = /obj/item/weapon/modular_firearms/assembly/heavy
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
+ modDriver = /obj/item/weapon/modular_firearms/driver/longburst
+ modChamber = /obj/item/weapon/modular_firearms/chamber/a762
var/cover_open = 0
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 7e0fdc99a316a..0da42528f398b 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -7,6 +7,9 @@
origin_tech = "combat=2;materials=2"
fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE
+
+ modChamber = /obj/item/weapon/modular_firearms/chamber/c45
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
/obj/item/weapon/gun/projectile/colt/detective
desc = "A cheap Martian knock-off of a Colt M1911. Uses .45 rounds."
@@ -39,6 +42,9 @@
origin_tech = "combat=2;materials=2"
fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE
+
+ modChamber = /obj/item/weapon/modular_firearms/chamber/c45
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
/obj/item/weapon/gun/projectile/sec/flash
name = "\improper NT Mk58 signal pistol"
@@ -59,6 +65,9 @@
origin_tech = "combat=2;materials=2;syndicate=8"
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/c45m
+
+ modChamber = /obj/item/weapon/modular_firearms/chamber/c45
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
/obj/item/weapon/gun/projectile/deagle
name = "desert eagle"
@@ -70,6 +79,9 @@
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/a50
auto_eject = 1
+
+ modChamber = /obj/item/weapon/modular_firearms/chamber/a50
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
/obj/item/weapon/gun/projectile/deagle/gold
desc = "A gold plated gun folded over a million times by superior martian gunsmiths. Uses .50 AE ammo."
@@ -98,6 +110,9 @@
auto_eject = 1
auto_eject_sound = 'sound/weapons/smg_empty_alarm.ogg'
+ modChamber = /obj/item/weapon/modular_firearms/chamber/a75
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
+
/obj/item/weapon/gun/projectile/gyropistol/update_icon()
..()
if(ammo_magazine)
@@ -117,6 +132,9 @@
fire_sound = 'sound/weapons/Gunshot_light.ogg'
load_method = MAGAZINE
magazine_type = /obj/item/ammo_magazine/mc9mm
+
+ modChamber = /obj/item/weapon/modular_firearms/chamber/c9mm
+ modLoader = /obj/item/weapon/modular_firearms/loader/magazine
/obj/item/weapon/gun/projectile/pistol/flash
name = "\improper Stechtkin signal pistol"
diff --git a/icons/placeholder.dmi b/icons/placeholder.dmi
index b0297b3953c9e..8192fb79e24a9 100644
Binary files a/icons/placeholder.dmi and b/icons/placeholder.dmi differ