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