diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 16f4339e1fd..2d3185f1f62 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -32,7 +32,6 @@ var/global/list/autolathe_recipes = list( \
new /obj/item/weapon/hemostat(),\
new /obj/item/weapon/reagent_containers/glass/beaker(), \
new /obj/item/weapon/reagent_containers/glass/beaker/large(), \
- new /obj/item/ammo_casing/shotgun/blank(), \
new /obj/item/ammo_casing/shotgun/beanbag(), \
new /obj/item/ammo_box/c38(), \
new /obj/item/device/taperecorder/empty(), \
@@ -57,6 +56,7 @@ var/global/list/autolathe_recipes_hidden = list( \
new /obj/item/weapon/handcuffs(), \
new /obj/item/ammo_box/a357(), \
new /obj/item/ammo_casing/shotgun(), \
+ new /obj/item/ammo_casing/shotgun/buckshot(), \
new /obj/item/ammo_casing/shotgun/dart(), \
/* new /obj/item/weapon/shield/riot(), */ \
)
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 95ddb69ab94..2c2549bf579 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -67,7 +67,8 @@
sound = 1
else
var/obj/item/weapon/gun/energy/E=new installation //All energy-based weapons are applicable
- projectile = E.projectile_type
+ var/obj/item/ammo_casing/shottype = E.ammo_type[1]
+ projectile = shottype.projectile_type
eprojectile = projectile
switch(E.type)
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 401acff9da5..a17948ecdff 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -277,7 +277,9 @@
O:icon_state = "flash"
if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg))
if(O:power_supply.charge < O:power_supply.maxcharge)
- O:power_supply.give(O:charge_cost * coeff)
+ var/obj/item/weapon/gun/energy/G = O
+ var/obj/item/ammo_casing/energy/S = G.ammo_type[G.select]
+ O:power_supply.give(S.e_cost * coeff)
O:update_icon()
else
O:charge_tick = 0
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index b1673bd3286..879622ab01a 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -145,7 +145,7 @@
new /obj/item/weapon/dnainjector/m2h(src)
new /obj/item/weapon/dnainjector/m2h(src)
-/obj/item/weapon/storage/box/blanks
+/*/obj/item/weapon/storage/box/blanks //Blanks removed, go home
name = "box of blank shells"
desc = "It has a picture of a gun and several warning symbols on the front."
@@ -157,7 +157,7 @@
new /obj/item/ammo_casing/shotgun/blank(src)
new /obj/item/ammo_casing/shotgun/blank(src)
new /obj/item/ammo_casing/shotgun/blank(src)
- new /obj/item/ammo_casing/shotgun/blank(src)
+ new /obj/item/ammo_casing/shotgun/blank(src)*/
/obj/item/weapon/storage/box/flashbangs
name = "box of flashbangs (WARNING)"
diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm
index 91c1706d7cf..b30fb220fb2 100644
--- a/code/modules/projectiles/ammunition.dm
+++ b/code/modules/projectiles/ammunition.dm
@@ -10,6 +10,8 @@
var/caliber = null //Which kind of guns it can be loaded into
var/projectile_type = null //The bullet type to create when New() is called
var/obj/item/projectile/BB = null //The loaded bullet
+ var/pellets = 0 //Pellets for spreadshot
+ var/variance = 0 //Variance for inaccuracy fundamental to the casing
/obj/item/ammo_casing/New()
@@ -26,12 +28,17 @@
icon_state = "[initial(icon_state)][BB ? "-live" : ""]"
desc = "[initial(desc)][BB ? "" : " This one is spent"]"
+/obj/item/ammo_casing/proc/newshot() //For energy weapons and shotgun shells.
+ if (!BB)
+ BB = new projectile_type(src)
+ return
+
//Boxes of ammo
/obj/item/ammo_box
- name = "ammo box (.357)"
- desc = "A box of ammo"
+ name = "ammo box (null_reference_exception)"
+ desc = "A box of ammo."
icon_state = "357"
icon = 'icons/obj/ammo.dmi'
flags = CONDUCT
@@ -47,6 +54,7 @@
var/max_ammo = 7
var/multiple_sprites = 0
var/caliber
+ var/multiload = 1
/obj/item/ammo_box/New()
@@ -73,15 +81,16 @@
return 1
return 0
-/obj/item/ammo_box/attackby(var/obj/item/A as obj, mob/user as mob)
+/obj/item/ammo_box/attackby(var/obj/item/A as obj, mob/user as mob, var/silent = 0)
var/num_loaded = 0
if(istype(A, /obj/item/ammo_box))
var/obj/item/ammo_box/AM = A
for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- if(give_round(AC))
+ var/did_load = give_round(AC)
+ if(did_load)
AM.stored_ammo -= AC
num_loaded++
- else
+ if(!did_load || !multiload)
break
if(istype(A, /obj/item/ammo_casing))
var/obj/item/ammo_casing/AC = A
@@ -90,9 +99,12 @@
AC.loc = src
num_loaded++
if(num_loaded)
- user << "You load [num_loaded] shell\s into \the [src]!"
+ if (!silent)
+ user << "You load [num_loaded] shell\s into \the [src]!"
A.update_icon()
update_icon()
+ return num_loaded
+ return 0
/obj/item/ammo_box/update_icon()
switch(multiple_sprites)
@@ -100,7 +112,7 @@
icon_state = "[initial(icon_state)]-[stored_ammo.len]"
if(2)
icon_state = "[initial(icon_state)]-[stored_ammo.len ? "[max_ammo]" : "0"]"
- desc = "There are [stored_ammo.len] shell\s left!"
+ desc = "[initial(desc)] There are [stored_ammo.len] shell\s left!"
//Behavior for magazines
/obj/item/ammo_box/magazine/proc/ammo_count()
diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm
index facac4e2206..71f5319eb1a 100644
--- a/code/modules/projectiles/ammunition/bullets.dm
+++ b/code/modules/projectiles/ammunition/bullets.dm
@@ -14,12 +14,6 @@
projectile_type = /obj/item/projectile/bullet/suffocationbullet
-/obj/item/ammo_casing/a75
- desc = "A .75 bullet casing."
- caliber = "75"
- projectile_type = /obj/item/projectile/bullet/gyro
-
-
/obj/item/ammo_casing/a666
desc = "A .666 bullet casing."
caliber = "357"
@@ -57,20 +51,21 @@
/obj/item/ammo_casing/shotgun
- name = "shotgun shell"
- desc = "A 12 gauge shell."
- icon_state = "gshell"
+ name = "shotgun slug"
+ desc = "A 12 gauge slug."
+ icon_state = "blshell"
caliber = "shotgun"
projectile_type = /obj/item/projectile/bullet
m_amt = 12500
-/obj/item/ammo_casing/shotgun/blank
+/obj/item/ammo_casing/shotgun/buckshot
name = "shotgun shell"
- desc = "A blank shell."
- icon_state = "blshell"
- projectile_type = null
- m_amt = 250
+ desc = "A 12 gauge shell."
+ icon_state = "gshell"
+ projectile_type = /obj/item/projectile/bullet/pellet
+ pellets = 5
+ variance = 0.8
/obj/item/ammo_casing/shotgun/beanbag
@@ -106,6 +101,24 @@
return
/obj/item/ammo_casing/a762
- desc = "A 7.62 bullet casing."
+ desc = "A 7.62mm bullet casing."
caliber = "a762"
- projectile_type = /obj/item/projectile/bullet
\ No newline at end of file
+ projectile_type = /obj/item/projectile/bullet
+
+
+/obj/item/ammo_casing/caseless
+ desc = "A caseless bullet casing."
+
+
+/obj/item/ammo_casing/caseless/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet)
+ if (..())
+ loc = null
+ return 1
+ else
+ return 0
+
+
+/obj/item/ammo_casing/caseless/a75
+ desc = "A .75 bullet casing."
+ caliber = "75"
+ projectile_type = /obj/item/projectile/bullet/gyro
diff --git a/code/modules/projectiles/ammunition/energy.dm b/code/modules/projectiles/ammunition/energy.dm
new file mode 100644
index 00000000000..b6557e600d0
--- /dev/null
+++ b/code/modules/projectiles/ammunition/energy.dm
@@ -0,0 +1,106 @@
+/obj/item/ammo_casing/energy
+ name = "energy weapon lens"
+ desc = "The part of the gun that makes the laser go pew"
+ caliber = "energy"
+ projectile_type = /obj/item/projectile/energy
+ var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
+ var/select_name = "energy"
+ var/mod_name = null
+ var/fire_sound = 'sound/weapons/Laser.ogg'
+
+/obj/item/ammo_casing/energy/laser
+ projectile_type = /obj/item/projectile/beam
+ select_name = "kill"
+
+/obj/item/ammo_casing/energy/laser/practice
+ projectile_type = /obj/item/projectile/practice
+ select_name = "practice"
+
+/obj/item/ammo_casing/energy/laser/scatter
+ projectile_type = /obj/item/projectile/beam/scatter
+ pellets = 5
+ variance = 0.8
+ select_name = "scatter"
+
+/obj/item/ammo_casing/energy/laser/heavy
+ projectile_type = /obj/item/projectile/beam/heavylaser
+ select_name = "anti-vehicle"
+ fire_sound = 'sound/weapons/lasercannonfire.ogg'
+
+/obj/item/ammo_casing/energy/laser/pulse
+ projectile_type = /obj/item/projectile/beam/pulse
+ e_cost = 200
+ select_name = "DESTROY"
+ fire_sound = 'sound/weapons/pulse.ogg'
+
+/obj/item/ammo_casing/energy/laser/bluetag
+ projectile_type = /obj/item/projectile/bluetag
+ select_name = "bluetag"
+
+/obj/item/ammo_casing/energy/laser/redtag
+ projectile_type = /obj/item/projectile/redtag
+ select_name = "redtag"
+
+/obj/item/ammo_casing/energy/bolt
+ projectile_type = /obj/item/projectile/energy/bolt
+ select_name = "bolt"
+ fire_sound = 'sound/weapons/Genhit.ogg'
+
+/obj/item/ammo_casing/energy/bolt/large
+ projectile_type = /obj/item/projectile/energy/bolt/large
+ select_name = "heavy bolt"
+
+/obj/item/ammo_casing/energy/xray
+ projectile_type = /obj/item/projectile/beam/xray
+ e_cost = 50
+ fire_sound = 'sound/weapons/laser3.ogg'
+
+/obj/item/ammo_casing/energy/electrode
+ projectile_type = /obj/item/projectile/energy/electrode
+ select_name = "stun"
+ fire_sound = 'sound/weapons/taser.ogg'
+
+/obj/item/ammo_casing/energy/electrode/gun
+ fire_sound = 'sound/weapons/gunshot.ogg'
+
+/obj/item/ammo_casing/energy/ion
+ projectile_type = /obj/item/projectile/ion
+ select_name = "ion"
+ fire_sound = 'sound/weapons/Laser.ogg'
+
+/obj/item/ammo_casing/energy/declone
+ projectile_type = /obj/item/projectile/energy/declone
+ select_name = "declone"
+ fire_sound = 'sound/weapons/pulse3.ogg'
+
+/obj/item/ammo_casing/energy/mindflayer
+ projectile_type = /obj/item/projectile/beam/mindflayer
+ select_name = "MINDFUCK"
+ fire_sound = 'sound/weapons/Laser.ogg'
+
+/obj/item/ammo_casing/energy/flora
+ fire_sound = 'sound/effects/stealthoff.ogg'
+
+/obj/item/ammo_casing/energy/flora/yield
+ projectile_type = /obj/item/projectile/energy/florayield
+ select_name = "increase yield"
+ mod_name = "yield"
+
+/obj/item/ammo_casing/energy/flora/mut
+ projectile_type = /obj/item/projectile/energy/floramut
+ select_name = "induce mutations"
+ mod_name = "mut"
+
+/obj/item/ammo_casing/energy/temp
+ projectile_type = /obj/item/projectile/temp
+ select_name = "freeze"
+ e_cost = 250
+ fire_sound = 'sound/weapons/pulse3.ogg'
+
+/obj/item/ammo_casing/energy/temp/hot
+ projectile_type = /obj/item/projectile/temp/hot
+ select_name = "bake"
+
+/obj/item/ammo_casing/energy/meteor
+ projectile_type = /obj/item/projectile/meteor
+ select_name = "goddamn meteor"
\ No newline at end of file
diff --git a/code/modules/projectiles/ammunition/magazines.dm b/code/modules/projectiles/ammunition/magazines.dm
index 950fbd050e3..f2605d939e2 100644
--- a/code/modules/projectiles/ammunition/magazines.dm
+++ b/code/modules/projectiles/ammunition/magazines.dm
@@ -15,7 +15,7 @@
boolets++
return boolets
else
- return stored_ammo.len
+ return ..()
/obj/item/ammo_box/magazine/internal/cylinder/rus357
name = "russian revolver cylinder"
@@ -23,6 +23,7 @@
ammo_type = /obj/item/ammo_casing/a357
caliber = "357"
max_ammo = 6
+ multiload = 0
/obj/item/ammo_box/magazine/internal/cylinder/rus357/New()
stored_ammo += new ammo_type(src)
@@ -40,13 +41,15 @@
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
caliber = "shotgun"
max_ammo = 4
+ multiload = 0
/obj/item/ammo_box/magazine/internal/shotcom
name = "combat shotgun internal magazine"
desc = "Oh god, this shouldn't be here"
- ammo_type = /obj/item/ammo_casing/shotgun
+ ammo_type = /obj/item/ammo_casing/shotgun/buckshot
caliber = "shotgun"
max_ammo = 8
+ multiload = 0
/obj/item/ammo_box/magazine/internal/cylinder/dualshot
name = "double-barrel shotgun internal magazine"
@@ -54,6 +57,7 @@
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
caliber = "shotgun"
max_ammo = 2
+ multiload = 0
///////////EXTERNAL MAGAZINES////////////////
/obj/item/ammo_box/magazine/m9mm
@@ -131,7 +135,7 @@
/obj/item/ammo_box/magazine/m75
name = "magazine (.75)"
icon_state = "75"
- ammo_type = /obj/item/ammo_casing/a75
+ ammo_type = /obj/item/ammo_casing/caseless/a75
caliber = "75"
multiple_sprites = 2
max_ammo = 8
diff --git a/code/modules/projectiles/ammunition/special.dm b/code/modules/projectiles/ammunition/special.dm
new file mode 100644
index 00000000000..e530d7c2fca
--- /dev/null
+++ b/code/modules/projectiles/ammunition/special.dm
@@ -0,0 +1,30 @@
+/obj/item/ammo_casing/magic
+ name = "magic casing"
+ desc = "I didn't even know magic needed ammo..."
+ projectile_type = /obj/item/projectile/magic
+
+/obj/item/ammo_casing/magic/change
+ projectile_type = /obj/item/projectile/magic/change
+
+/obj/item/ammo_casing/magic/animate
+ projectile_type = /obj/item/projectile/magic/animate
+
+/obj/item/ammo_casing/magic/heal
+ projectile_type = /obj/item/projectile/magic/resurrection
+
+/obj/item/ammo_casing/magic/death
+ projectile_type = /obj/item/projectile/magic/death
+
+/obj/item/ammo_casing/magic/teleport
+ projectile_type = /obj/item/projectile/magic/teleport
+
+/obj/item/ammo_casing/magic/door
+ projectile_type = /obj/item/projectile/magic/door
+
+/obj/item/ammo_casing/magic/fireball
+ projectile_type = /obj/item/projectile/magic/fireball
+
+/obj/item/ammo_casing/syringegun
+ name = "syringe gun spring"
+ desc = "A high-power spring that throws syringes."
+ projectile_type = null
\ No newline at end of file
diff --git a/code/modules/projectiles/firing.dm b/code/modules/projectiles/firing.dm
new file mode 100644
index 00000000000..590e9c5177e
--- /dev/null
+++ b/code/modules/projectiles/firing.dm
@@ -0,0 +1,57 @@
+/obj/item/ammo_casing/proc/fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, params, var/distro, var/quiet)
+ distro += variance
+ for (var/i = max(1, pellets), i > 0, i--)
+ var/curloc = user.loc
+ var/targloc = get_turf(target)
+ ready_proj(target, user, quiet)
+ if(distro)
+ targloc = spread(targloc, curloc, distro)
+ if(!throw_proj(targloc, user, params))
+ return 0
+ if(i > 1)
+ newshot()
+ user.next_move = world.time + 4
+ update_icon()
+ return 1
+
+/obj/item/ammo_casing/proc/ready_proj(atom/target as mob|obj|turf, mob/living/user, var/quiet)
+ if (!BB)
+ return
+ BB.original = target
+ BB.firer = user
+ BB.def_zone = user.zone_sel.selecting
+ BB.silenced = quiet
+ return
+
+/obj/item/ammo_casing/proc/throw_proj(var/turf/targloc, mob/living/user as mob|obj, params)
+ var/turf/curloc = user.loc
+ if (!istype(targloc) || !istype(curloc) || !BB)
+ return 0
+ if(targloc == curloc) //Fire the projectile
+ user.bullet_act(BB)
+ del(BB)
+ return 1
+ BB.loc = get_turf(user)
+ BB.starting = get_turf(user)
+ BB.current = curloc
+ BB.yo = targloc.y - curloc.y
+ BB.xo = targloc.x - curloc.x
+
+ if(params)
+ var/list/mouse_control = params2list(params)
+ if(mouse_control["icon-x"])
+ BB.p_x = text2num(mouse_control["icon-x"])
+ if(mouse_control["icon-y"])
+ BB.p_y = text2num(mouse_control["icon-y"])
+
+ if(BB)
+ BB.process()
+ BB = null
+ return 1
+
+/obj/item/ammo_casing/proc/spread(var/turf/target, var/turf/current, var/distro)
+ var/dx = abs(target.x - current.x)
+ var/dy = abs(target.y - current.y)
+ return locate(target.x + round(gaussian(0, distro) * (dy+2)/8, 1), target.y + round(gaussian(0, distro) * (dx+2)/8, 1), target.z)
+
+// gaussian(0, distro)
\ No newline at end of file
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 4afd2a7a420..d7309b080e3 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -16,26 +16,32 @@
attack_verb = list("struck", "hit", "bashed")
var/fire_sound = "gunshot"
- var/obj/item/projectile/in_chamber = null
var/silenced = 0
var/recoil = 0
var/clumsy_check = 1
+ var/obj/item/ammo_casing/chambered = null
- proc/process_chambered()
+ proc/process_chamber()
return 0
proc/special_check(var/mob/M) //Placeholder for any special checks, like detective's revolver.
return 1
- proc/prepare_shot(var/obj/item/projectile/proj) //Transfer properties from the gun to the bullet
- proj.shot_from = src
- proj.silenced = silenced
- return
-
proc/shoot_with_empty_chamber(mob/living/user as mob|obj)
user << "*click*"
return
+ proc/shoot_live_shot(mob/living/user as mob|obj)
+ if(recoil)
+ spawn()
+ shake_camera(user, recoil + 1, recoil)
+
+ if(silenced)
+ playsound(user, fire_sound, 10, 1)
+ else
+ playsound(user, fire_sound, 50, 1)
+ user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(src, /obj/item/weapon/gun/energy) ? "laser blast" : "gunshot"]!")
+
emp_act(severity)
for(var/obj/O in contents)
O.emp_act(severity)
@@ -71,63 +77,16 @@
add_fingerprint(user)
- var/turf/curloc = user.loc
- var/turf/targloc = get_turf(target)
- if (!istype(targloc) || !istype(curloc))
- return
-
if(!special_check(user))
return
- if(!process_chambered())
- shoot_with_empty_chamber(user)
-
- if(!in_chamber)
- return
-
- in_chamber.firer = user
- in_chamber.def_zone = user.zone_sel.selecting
-
-
- if(recoil)
- spawn()
- shake_camera(user, recoil + 1, recoil)
-
- if(silenced)
- playsound(user, fire_sound, 10, 1)
+ if(chambered)
+ if(!chambered.fire(target, user, params, , silenced))
+ shoot_with_empty_chamber(user)
+ else
+ shoot_live_shot(user)
else
- playsound(user, fire_sound, 50, 1)
- user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
-
- prepare_shot(in_chamber) //Set the projectile's properties
-
-
-
- if(targloc == curloc) //Fire the projectile
- user.bullet_act(in_chamber)
- del(in_chamber)
- update_icon()
- return
- in_chamber.original = target
- in_chamber.loc = get_turf(user)
- in_chamber.starting = get_turf(user)
- in_chamber.current = curloc
- in_chamber.yo = targloc.y - curloc.y
- in_chamber.xo = targloc.x - curloc.x
- user.next_move = world.time + 4
-
- if(params)
- var/list/mouse_control = params2list(params)
- if(mouse_control["icon-x"])
- in_chamber.p_x = text2num(mouse_control["icon-x"])
- if(mouse_control["icon-y"])
- in_chamber.p_y = text2num(mouse_control["icon-y"])
-
- spawn()
- if(in_chamber)
- in_chamber.process()
- sleep(1)
- in_chamber = null
-
+ shoot_with_empty_chamber(user)
+ process_chamber()
update_icon()
if(user.hand)
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index 76aa1482568..bc3f4208b9f 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -2,43 +2,74 @@
icon_state = "energy"
name = "energy gun"
desc = "A basic energy-based gun."
- fire_sound = 'sound/weapons/Taser.ogg'
var/obj/item/weapon/cell/power_supply //What type of power cell this uses
- var/charge_cost = 100 //How much energy is needed to fire.
- var/cell_type = "/obj/item/weapon/cell"
- var/projectile_type = "/obj/item/projectile/energy"
- var/modifystate
-
- emp_act(severity)
- power_supply.use(round(power_supply.maxcharge / severity))
- update_icon()
- ..()
-
-
- New()
- ..()
- if(cell_type)
- power_supply = new cell_type(src)
- else
- power_supply = new(src)
- power_supply.give(power_supply.maxcharge)
- return
-
-
- process_chambered()
- if(in_chamber) return 1
- if(!power_supply) return 0
- if(!power_supply.use(charge_cost)) return 0
- if(!projectile_type) return 0
- in_chamber = new projectile_type(src)
- return 1
-
+ var/cell_type = /obj/item/weapon/cell
+ var/modifystate = 0
+ var/list/ammo_type = list(/obj/item/ammo_casing/energy)
+ var/select = 1 //The state of the select fire switch. Determines from the ammo_type list what kind of shot is fired next.
+/obj/item/weapon/gun/energy/emp_act(severity)
+ power_supply.use(round(power_supply.maxcharge / severity))
update_icon()
- var/ratio = power_supply.charge / power_supply.maxcharge
- ratio = round(ratio, 0.25) * 100
- if(modifystate)
- icon_state = "[modifystate][ratio]"
- else
- icon_state = "[initial(icon_state)][ratio]"
\ No newline at end of file
+ ..()
+
+
+/obj/item/weapon/gun/energy/New()
+ ..()
+ if(cell_type)
+ power_supply = new cell_type(src)
+ else
+ power_supply = new(src)
+ power_supply.give(power_supply.maxcharge)
+ var/obj/item/ammo_casing/energy/shot
+ for (var/i = 1, i <= ammo_type.len, i++)
+ var/shottype = ammo_type[i]
+ shot = new shottype(src)
+ ammo_type[i] = shot
+ shot = ammo_type[select]
+ fire_sound = shot.fire_sound
+ update_icon()
+ return
+
+
+/obj/item/weapon/gun/energy/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params)
+ newshot()
+ ..()
+
+
+/obj/item/weapon/gun/energy/proc/newshot()
+ if (!ammo_type || !power_supply) return
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if (!power_supply.use(shot.e_cost)) return
+ chambered = shot
+ chambered.newshot()
+ return
+
+/obj/item/weapon/gun/energy/process_chamber()
+ chambered = null
+ return
+
+/obj/item/weapon/gun/energy/proc/select_fire(mob/living/user as mob)
+ select++
+ if (select > ammo_type.len)
+ select = 1
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ fire_sound = shot.fire_sound
+ if (shot.select_name)
+ user << "\red [src] is now set to [shot.select_name]."
+ update_icon()
+ return
+
+/obj/item/weapon/gun/energy/update_icon()
+ var/ratio = power_supply.charge / power_supply.maxcharge
+ ratio = Ceiling(ratio*4) * 25
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ switch(modifystate)
+ if (0)
+ icon_state = "[initial(icon_state)][ratio]"
+ if (1)
+ icon_state = "[initial(icon_state)][shot.mod_name][ratio]"
+ if (2)
+ icon_state = "[initial(icon_state)][shot.select_name][ratio]"
+ return
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm
index 9f7c3b8f26b..cfb0e93b773 100644
--- a/code/modules/projectiles/guns/energy/laser.dm
+++ b/code/modules/projectiles/guns/energy/laser.dm
@@ -3,16 +3,16 @@
desc = "a basic weapon designed kill with concentrated energy bolts"
icon_state = "laser"
item_state = "laser"
- fire_sound = 'sound/weapons/Laser.ogg'
w_class = 3.0
m_amt = 2000
origin_tech = "combat=3;magnets=2"
- projectile_type = "/obj/item/projectile/beam"
+ ammo_type = list(/obj/item/ammo_casing/energy/laser)
+
/obj/item/weapon/gun/energy/laser/practice
name = "practice laser gun"
desc = "A modified version of the basic laser gun, this one fires less concentrated energy bolts designed for target practice."
- projectile_type = "/obj/item/projectile/practice"
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/practice)
clumsy_check = 0
obj/item/weapon/gun/energy/laser/retro
@@ -50,36 +50,41 @@ obj/item/weapon/gun/energy/laser/retro
-/obj/item/weapon/gun/energy/laser/cyborg/process_chambered()
- if(in_chamber)
- return 1
+/obj/item/weapon/gun/energy/laser/cyborg/newshot()
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
- R.cell.use(100)
- in_chamber = new/obj/item/projectile/beam(src)
- return 1
- return 0
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
+ if(R.cell.use(shot.e_cost))
+ chambered = shot
+ chambered.newshot()
+ return
+/obj/item/weapon/gun/energy/laser/scatter
+ name = "scatter laser gun"
+ desc = "A laser gun equipped with a refraction kit that spreads bolts."
+ ammo_type = list(/obj/item/ammo_casing/energy/laser, /obj/item/ammo_casing/energy/laser/scatter)
+
+ attack_self(mob/living/user as mob)
+ select_fire(user)
+ update_icon()
+
/obj/item/weapon/gun/energy/lasercannon
name = "laser cannon"
desc = "With the L.A.S.E.R. cannon, the lasing medium is enclosed in a tube lined with uranium-235 and subjected to high neutron flux in a nuclear reactor core. This incredible technology may help YOU achieve high excitation rates with small laser volumes!"
icon_state = "lasercannon"
- fire_sound = 'sound/weapons/lasercannonfire.ogg'
origin_tech = "combat=4;materials=3;powerstorage=3"
- projectile_type = "/obj/item/projectile/beam/heavylaser"
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/heavy)
/obj/item/weapon/gun/energy/xray
name = "xray laser gun"
desc = "A high-power laser gun capable of expelling concentrated xray blasts."
icon_state = "xray"
- fire_sound = 'sound/weapons/laser3.ogg'
origin_tech = "combat=5;materials=3;magnets=2;syndicate=2"
- projectile_type = "/obj/item/projectile/beam/xray"
- charge_cost = 50
+ ammo_type = list(/obj/item/ammo_casing/energy/xray)
////////Laser Tag////////////////////
@@ -88,7 +93,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "bluetag"
desc = "Standard issue weapon of the Imperial Guard"
- projectile_type = "/obj/item/projectile/bluetag"
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/bluetag)
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
@@ -125,7 +130,7 @@ obj/item/weapon/gun/energy/laser/retro
name = "laser tag gun"
icon_state = "redtag"
desc = "Standard issue weapon of the Imperial Guard"
- projectile_type = "/obj/item/projectile/redtag"
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/redtag)
origin_tech = "combat=1;magnets=2"
clumsy_check = 0
var/charge_tick = 0
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 488376b88f2..9bc774e8095 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -1,38 +1,18 @@
/obj/item/weapon/gun/energy/gun
name = "energy gun"
desc = "A basic energy-based gun with two settings: Stun and kill."
- icon_state = "energystun100"
+ icon_state = "energy"
item_state = null //so the human update icon uses the icon_state instead.
- fire_sound = 'sound/weapons/Taser.ogg'
-
- charge_cost = 100 //How much energy is needed to fire.
- projectile_type = "/obj/item/projectile/energy/electrode"
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
origin_tech = "combat=3;magnets=2"
- modifystate = "energystun"
-
- var/mode = 0 //0 = stun, 1 = kill
+ modifystate = 2
attack_self(mob/living/user as mob)
- switch(mode)
- if(0)
- mode = 1
- charge_cost = 100
- fire_sound = 'sound/weapons/Laser.ogg'
- user << "\red [src.name] is now set to kill."
- projectile_type = "/obj/item/projectile/beam"
- modifystate = "energykill"
- if(1)
- mode = 0
- charge_cost = 100
- fire_sound = 'sound/weapons/Taser.ogg'
- user << "\red [src.name] is now set to stun."
- projectile_type = "/obj/item/projectile/energy/electrode"
- modifystate = "energystun"
+ select_fire(user)
update_icon()
-
/obj/item/weapon/gun/energy/gun/nuclear
name = "Advanced Energy Gun"
desc = "An energy gun with an experimental miniaturized reactor."
@@ -40,6 +20,7 @@
origin_tech = "combat=3;materials=5;powerstorage=3"
var/lightfail = 0
var/charge_tick = 0
+ modifystate = 0
New()
..()
@@ -92,7 +73,7 @@
overlays += "nucgun-whee"
return
var/ratio = power_supply.charge / power_supply.maxcharge
- ratio = round(ratio, 0.25) * 100
+ ratio = Ceiling(ratio*4) * 25
overlays += "nucgun-[ratio]"
@@ -109,9 +90,9 @@
update_mode()
- if (mode == 0)
+ if (select == 1)
overlays += "nucgun-stun"
- else if (mode == 1)
+ else if (select == 2)
overlays += "nucgun-kill"
diff --git a/code/modules/projectiles/guns/energy/pulse.dm b/code/modules/projectiles/guns/energy/pulse.dm
index 74f5a7fb42f..c57d098f37b 100644
--- a/code/modules/projectiles/guns/energy/pulse.dm
+++ b/code/modules/projectiles/guns/energy/pulse.dm
@@ -4,43 +4,21 @@
icon_state = "pulse"
item_state = null //so the human update icon uses the icon_state instead.
force = 10
- fire_sound = 'sound/weapons/pulse.ogg'
- charge_cost = 200
- projectile_type = "/obj/item/projectile/beam/pulse"
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse, /obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
cell_type = "/obj/item/weapon/cell/super"
- var/mode = 2
- attack_self(mob/living/user as mob)
- switch(mode)
- if(2)
- mode = 0
- charge_cost = 100
- fire_sound = 'sound/weapons/Taser.ogg'
- user << "\red [src.name] is now set to stun."
- projectile_type = "/obj/item/projectile/energy/electrode"
- if(0)
- mode = 1
- charge_cost = 100
- fire_sound = 'sound/weapons/Laser.ogg'
- user << "\red [src.name] is now set to kill."
- projectile_type = "/obj/item/projectile/beam"
- if(1)
- mode = 2
- charge_cost = 200
- fire_sound = 'sound/weapons/pulse.ogg'
- user << "\red [src.name] is now set to DESTROY."
- projectile_type = "/obj/item/projectile/beam/pulse"
- return
-
+/obj/item/weapon/gun/energy/pulse_rifle/attack_self(mob/living/user as mob)
+ select_fire(user)
/obj/item/weapon/gun/energy/pulse_rifle/destroyer
name = "pulse destroyer"
desc = "A heavy-duty, pulse-based energy weapon."
cell_type = "/obj/item/weapon/cell/infinite"
+ ammo_type = list(/obj/item/ammo_casing/energy/laser/pulse)
- attack_self(mob/living/user as mob)
- user << "\red [src.name] has three settings, and they are all DESTROY."
+/obj/item/weapon/gun/energy/pulse_rifle/destroyer/attack_self(mob/living/user as mob)
+ user << "\red [src.name] has three settings, and they are all DESTROY."
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 1663bcc1071..241a7145478 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -2,13 +2,11 @@
name = "ion rifle"
desc = "A man portable anti-armor weapon designed to disable mechanical threats"
icon_state = "ionrifle"
- fire_sound = 'sound/weapons/Laser.ogg'
origin_tech = "combat=2;magnets=4"
w_class = 5
flags = CONDUCT
slot_flags = SLOT_BACK
- charge_cost = 100
- projectile_type = "/obj/item/projectile/ion"
+ ammo_type = list(/obj/item/ammo_casing/energy/ion)
/obj/item/weapon/gun/energy/ionrifle/emp_act(severity)
if(severity <= 2)
@@ -21,21 +19,17 @@
name = "biological demolecularisor"
desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements."
icon_state = "decloner"
- fire_sound = 'sound/weapons/pulse3.ogg'
origin_tech = "combat=5;materials=4;powerstorage=3"
- charge_cost = 100
- projectile_type = "/obj/item/projectile/energy/declone"
+ ammo_type = list(/obj/item/ammo_casing/energy/declone)
/obj/item/weapon/gun/energy/floragun
name = "floral somatoray"
desc = "A tool that discharges controlled radiation which induces mutation in plant cells."
- icon_state = "floramut100"
+ icon_state = "flora"
item_state = "obj/item/gun.dmi"
- fire_sound = 'sound/effects/stealthoff.ogg'
- charge_cost = 100
- projectile_type = "/obj/item/projectile/energy/floramut"
+ ammo_type = list(/obj/item/ammo_casing/energy/flora/yield, /obj/item/ammo_casing/energy/flora/mut)
origin_tech = "materials=2;biotech=3;powerstorage=3"
- modifystate = "floramut"
+ modifystate = 1
var/charge_tick = 0
var/mode = 0 //0 = mutate, 1 = yield boost
@@ -59,19 +53,7 @@
return 1
attack_self(mob/living/user as mob)
- switch(mode)
- if(0)
- mode = 1
- charge_cost = 100
- user << "\red The [src.name] is now set to increase yield."
- projectile_type = "/obj/item/projectile/energy/florayield"
- modifystate = "florayield"
- if(1)
- mode = 0
- charge_cost = 100
- user << "\red The [src.name] is now set to induce mutations."
- projectile_type = "/obj/item/projectile/energy/floramut"
- modifystate = "floramut"
+ select_fire(user)
update_icon()
return
@@ -81,8 +63,7 @@
icon_state = "riotgun"
item_state = "c20r"
w_class = 4
- projectile_type = "/obj/item/projectile/meteor"
- charge_cost = 100
+ ammo_type = list(/obj/item/ammo_casing/energy/meteor)
cell_type = "/obj/item/weapon/cell/potato"
clumsy_check = 0 //Admin spawn only, might as well let clowns use it.
var/charge_tick = 0
@@ -121,5 +102,4 @@
name = "mind flayer"
desc = "A prototype weapon recovered from the ruins of Research-Station Epsilon."
icon_state = "xray"
- projectile_type = "/obj/item/projectile/beam/mindflayer"
- fire_sound = 'sound/weapons/Laser.ogg'
\ No newline at end of file
+ ammo_type = list(/obj/item/ammo_casing/energy/mindflayer)
diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm
index 3481d53c167..4fc9a2a7375 100644
--- a/code/modules/projectiles/guns/energy/stun.dm
+++ b/code/modules/projectiles/guns/energy/stun.dm
@@ -4,9 +4,7 @@
desc = "A small, low capacity gun used for non-lethal takedowns."
icon_state = "taser"
item_state = null //so the human update icon uses the icon_state instead.
- fire_sound = 'sound/weapons/Taser.ogg'
- charge_cost = 100
- projectile_type = "/obj/item/projectile/energy/electrode"
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode)
cell_type = "/obj/item/weapon/cell/crap"
/obj/item/weapon/gun/energy/taser/cyborg
@@ -14,8 +12,6 @@
desc = "A small, low capacity gun used for non-lethal takedowns."
icon_state = "taser"
fire_sound = 'sound/weapons/Taser.ogg'
- charge_cost = 100
- projectile_type = "/obj/item/projectile/energy/electrode"
cell_type = "/obj/item/weapon/cell/secborg"
var/charge_tick = 0
var/recharge_time = 10 //Time it takes for shots to recharge (in ticks)
@@ -38,8 +34,9 @@
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
- R.cell.use(charge_cost) //Take power from the borg...
- power_supply.give(charge_cost) //... to recharge the shot
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
+ if(R.cell.use(shot.e_cost)) //Take power from the borg...
+ power_supply.give(shot.e_cost) //... to recharge the shot
update_icon()
return 1
@@ -49,10 +46,8 @@
name = "stun revolver"
desc = "A high-tech revolver that fires stun cartridges. The stun cartridges can be recharged using a conventional energy weapon recharger."
icon_state = "stunrevolver"
- fire_sound = 'sound/weapons/Gunshot.ogg'
origin_tech = "combat=3;materials=3;powerstorage=2"
- charge_cost = 125
- projectile_type = "/obj/item/projectile/energy/electrode"
+ ammo_type = list(/obj/item/ammo_casing/energy/electrode/gun)
cell_type = "/obj/item/weapon/cell"
@@ -66,8 +61,7 @@
m_amt = 2000
origin_tech = "combat=2;magnets=2;syndicate=5"
silenced = 1
- fire_sound = 'sound/weapons/Genhit.ogg'
- projectile_type = "/obj/item/projectile/energy/bolt"
+ ammo_type = list(/obj/item/ammo_casing/energy/bolt)
cell_type = "/obj/item/weapon/cell/crap"
var/charge_tick = 0
@@ -94,16 +88,15 @@
update_icon()
return
-/obj/item/weapon/gun/energy/crossbow/cyborg/process_chambered()
- if(in_chamber)
- return 1
+/obj/item/weapon/gun/energy/crossbow/cyborg/newshot()
if(isrobot(src.loc))
var/mob/living/silicon/robot/R = src.loc
if(R && R.cell)
- R.cell.use(100)
- in_chamber = new /obj/item/projectile/energy/bolt(src)
- return 1
- return 0
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select] //Necessary to find cost of shot
+ if(R.cell.use(shot.e_cost))
+ chambered = shot
+ chambered.newshot()
+ return
/obj/item/weapon/gun/energy/crossbow/largecrossbow
name = "Energy Crossbow"
@@ -111,6 +104,3 @@
w_class = 4.0
force = 10
m_amt = 200000
- projectile_type = "/obj/item/projectile/energy/bolt/large"
-
-
diff --git a/code/modules/projectiles/guns/energy/temperature.dm b/code/modules/projectiles/guns/energy/temperature.dm
index d28ae8b8d8f..33023dab775 100644
--- a/code/modules/projectiles/guns/energy/temperature.dm
+++ b/code/modules/projectiles/guns/energy/temperature.dm
@@ -1,86 +1,13 @@
/obj/item/weapon/gun/energy/temperature
name = "temperature gun"
icon_state = "freezegun"
- fire_sound = 'sound/weapons/pulse3.ogg'
desc = "A gun that changes temperatures."
- var/temperature = T20C
- var/current_temperature = T20C
- charge_cost = 100
origin_tech = "combat=3;materials=4;powerstorage=3;magnets=2"
-
- projectile_type = "/obj/item/projectile/temp"
+ ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot)
cell_type = "/obj/item/weapon/cell/high"
- New()
- ..()
- processing_objects.Add(src)
-
-
- Del()
- processing_objects.Remove(src)
- ..()
-
-
attack_self(mob/living/user as mob)
- user.set_machine(src)
- var/temp_text = ""
- if(temperature > (T0C - 50))
- temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)"
- else
- temp_text = "[temperature] ([round(temperature-T0C)]°C) ([round(temperature*1.8-459.67)]°F)"
-
- var/dat = {"Freeze Gun Configuration:
- Current output temperature: [temp_text]
- Target output temperature: - - - [current_temperature] + + +
- "}
-
-
- user << browse(dat, "window=freezegun;size=450x300;can_resize=1;can_close=1;can_minimize=1")
- onclose(user, "window=freezegun", src)
-
- prepare_shot(var/obj/item/projectile/temp/proj)
- proj.temperature = temperature //Set the temperature of the beam
- if(proj.temperature > 300) //If it's not a freeze beam, don't call it one
- proj.name = "heat beam"
- ..()
-
-
- Topic(href, href_list)
- if (..())
- return
- usr.set_machine(src)
- src.add_fingerprint(usr)
-
-
-
- if(href_list["temp"])
- var/amount = text2num(href_list["temp"])
- if(amount > 0)
- src.current_temperature = min(500, src.current_temperature+amount)
- else
- src.current_temperature = max(0, src.current_temperature+amount)
- if (istype(src.loc, /mob))
- attack_self(src.loc)
- src.add_fingerprint(usr)
- return
-
-
- process()
- switch(temperature)
- if(0 to 100) charge_cost = 1000
- if(100 to 250) charge_cost = 500
- if(251 to 300) charge_cost = 100
- if(301 to 400) charge_cost = 500
- if(401 to 500) charge_cost = 1000
-
- if(current_temperature != temperature)
- var/difference = abs(current_temperature - temperature)
- if(difference >= 10)
- if(current_temperature < temperature)
- temperature -= 10
- else
- temperature += 10
- else
- temperature = current_temperature
- return
+ select_fire(user)
+ update_icon()
+ return
\ No newline at end of file
diff --git a/code/modules/projectiles/guns/magic.dm b/code/modules/projectiles/guns/magic.dm
index 2786136427e..a4b7da17b15 100644
--- a/code/modules/projectiles/guns/magic.dm
+++ b/code/modules/projectiles/guns/magic.dm
@@ -7,29 +7,29 @@
fire_sound = 'sound/weapons/emitter.ogg'
flags = CONDUCT
w_class = 5
- var/projectile_type = "/obj/item/projectile/magic"
var/max_charges = 6
var/charges = 0
var/recharge_rate = 4
var/charge_tick = 0
var/can_charge = 1
+ var/ammo_type
origin_tech = null
clumsy_check = 0
-/obj/item/weapon/gun/magic/process_chambered()
- if(in_chamber) return 1
- if(!charges) return 0
- if(!projectile_type) return 0
- in_chamber = new projectile_type(src)
- return 1
-
/obj/item/weapon/gun/magic/afterattack(atom/target as mob, mob/living/user as mob, flag)
+ newshot()
..()
- if(charges && !in_chamber && !flag) charges--
+
+/obj/item/weapon/gun/magic/proc/newshot()
+ if (charges && chambered)
+ chambered.newshot()
+ charges--
+ return
/obj/item/weapon/gun/magic/New()
..()
charges = max_charges
+ chambered = new ammo_type(src)
if(can_charge) processing_objects.Add(src)
diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm
index dd38641e184..a07ea02d7c9 100644
--- a/code/modules/projectiles/guns/magic/staff.dm
+++ b/code/modules/projectiles/guns/magic/staff.dm
@@ -4,20 +4,20 @@ obj/item/weapon/gun/magic/staff/
obj/item/weapon/gun/magic/staff/change
name = "staff of change"
desc = "An artefact that spits bolts of coruscating energy which cause the target's very form to reshape itself"
- projectile_type = "/obj/item/projectile/magic/change"
+ ammo_type = /obj/item/ammo_casing/magic/change
icon_state = "staffofchange"
item_state = "staffofchange"
obj/item/weapon/gun/magic/staff/animate
name = "staff of animation"
desc = "An artefact that spits bolts of life-force which causes objects which are hit by it to animate and come to life! This magic doesn't affect machines."
- projectile_type = "/obj/item/projectile/magic/animate"
+ ammo_type = /obj/item/ammo_casing/magic/animate
icon_state = "staffofanimation"
item_state = "staffofanimation"
obj/item/weapon/gun/magic/staff/healing
name = "staff of healing"
desc = "An artefact that spits bolts of restoring magic which can remove ailments of all kinds and even raise the dead."
- projectile_type = "/obj/item/projectile/magic/resurrection"
+ ammo_type = /obj/item/ammo_casing/magic/heal
icon_state = "staffofhealing"
item_state = "staffofhealing"
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index bc9dd552202..b25e68c4aa6 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -1,7 +1,7 @@
/obj/item/weapon/gun/magic/wand/
name = "wand of nothing"
desc = "It's not just a stick, it's a MAGIC stick!"
- projectile_type = "/obj/item/projectile/magic"
+ ammo_type = /obj/item/ammo_casing/magic
icon_state = "nothingwand"
item_state = "wand"
w_class = 2
@@ -22,6 +22,9 @@
usr << "Has [charges] charge\s remaining."
return
+/obj/item/weapon/gun/magic/wand/update_icon()
+ icon_state = "[initial(icon_state)][charges ? "" : "-drained"]"
+
/obj/item/weapon/gun/magic/wand/attack(atom/target as mob, mob/living/user as mob)
if(target == user)
return
@@ -29,14 +32,13 @@
/obj/item/weapon/gun/magic/wand/afterattack(atom/target as mob, mob/living/user as mob)
if(!charges)
- user << "The [name] whizzles quietly."
+ shoot_with_empty_chamber(user)
return
if(target == user)
zap_self(user)
else
..()
- if(!charges)
- icon_state = "[icon_state]-drained"
+ update_icon()
/obj/item/weapon/gun/magic/wand/proc/zap_self(mob/living/user as mob)
@@ -47,7 +49,7 @@
/obj/item/weapon/gun/magic/wand/death
name = "wand of death"
desc = "This deadly wand overwhelms the victim's body with pure energy, slaying them without fail."
- projectile_type = "/obj/item/projectile/magic/death"
+ ammo_type = /obj/item/ammo_casing/magic/death
icon_state = "deathwand"
max_charges = 3 //3, 2, 2, 1
@@ -62,7 +64,7 @@
/obj/item/weapon/gun/magic/wand/resurrection
name = "wand of healing"
desc = "This wand uses healing magics to heal and revive. They are rarely utilized within the Wizard Federation for some reason."
- projectile_type = "/obj/item/projectile/magic/resurrection"
+ ammo_type = /obj/item/ammo_casing/magic/heal
icon_state = "revivewand"
max_charges = 10 //10, 5, 5, 4
@@ -75,7 +77,7 @@
/obj/item/weapon/gun/magic/wand/polymorph
name = "wand of polymorph"
desc = "This wand is attuned to chaos and will radically alter the victim's form."
- projectile_type = "/obj/item/projectile/magic/change"
+ ammo_type = /obj/item/ammo_casing/magic/change
icon_state = "polywand"
max_charges = 10 //10, 5, 5, 4
@@ -87,7 +89,7 @@
/obj/item/weapon/gun/magic/wand/teleport
name = "wand of teleportation"
desc = "This wand will wrench targets through space and time to move them somewhere else."
- projectile_type = "/obj/item/projectile/magic/teleport"
+ ammo_type = /obj/item/ammo_casing/magic/teleport
icon_state = "telewand"
max_charges = 10 //10, 5, 5, 4
@@ -102,7 +104,7 @@
/obj/item/weapon/gun/magic/wand/door
name = "wand of door creation"
desc = "This particular wand can create doors in any wall for the unscrupulous wizard who shuns teleportation magics."
- projectile_type = "/obj/item/projectile/magic/door"
+ ammo_type = /obj/item/ammo_casing/magic/door
icon_state = "doorwand"
max_charges = 20 //20, 10, 10, 7
@@ -112,7 +114,7 @@
/obj/item/weapon/gun/magic/wand/fireball
name = "wand of fireball"
desc = "This wand shoots scorching balls of fire that explode into destructive flames."
- projectile_type = "/obj/item/projectile/magic/fireball"
+ ammo_type = /obj/item/ammo_casing/magic/fireball
icon_state = "firewand"
max_charges = 8 //8, 4, 4, 3
diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm
index cfe74037548..875bd2622f3 100644
--- a/code/modules/projectiles/guns/projectile.dm
+++ b/code/modules/projectiles/guns/projectile.dm
@@ -6,10 +6,8 @@
w_class = 3.0
m_amt = 1000
- var/ammo_type = /obj/item/ammo_casing/c10mm
var/mag_type = /obj/item/ammo_box/magazine/m10mm //Removes the need for max_ammo and caliber info
var/obj/item/ammo_box/magazine/magazine
- var/obj/item/ammo_casing/chambered = null // The round (not bullet) that is in the chamber.
/obj/item/weapon/gun/projectile/New()
..()
@@ -18,28 +16,19 @@
update_icon()
return
-/obj/item/weapon/gun/projectile/process_chambered(var/eject_casing = 1, var/empty_chamber = 1)
+/obj/item/weapon/gun/projectile/process_chamber(var/eject_casing = 1, var/empty_chamber = 1)
// if(in_chamber)
// return 1
var/obj/item/ammo_casing/AC = chambered //Find chambered round
if(isnull(AC) || !istype(AC))
- return 0
+ chamber_round()
+ return
if(eject_casing)
AC.loc = get_turf(src) //Eject casing onto ground.
if(empty_chamber)
chambered = null
chamber_round()
- if(AC.BB)
- if(AC.reagents && AC.BB.reagents)
- var/datum/reagents/casting_reagents = AC.reagents
- casting_reagents.trans_to(AC.BB, casting_reagents.total_volume) //For chemical darts/bullets
- casting_reagents.delete()
- in_chamber = AC.BB //Load projectile into chamber.
- AC.BB.loc = src //Set projectile loc to gun.
- AC.BB = null
- AC.update_icon()
- return 1
- return 0
+ return
/obj/item/weapon/gun/projectile/proc/chamber_round()
if (chambered || !magazine)
@@ -47,6 +36,11 @@
else if (magazine.ammo_count())
chambered = magazine.get_round()
chambered.loc = src
+ if(chambered.BB)
+ if(chambered.reagents && chambered.BB.reagents)
+ var/datum/reagents/casting_reagents = chambered.reagents
+ casting_reagents.trans_to(chambered.BB, casting_reagents.total_volume) //For chemical darts/bullets
+ casting_reagents.delete()
return
/obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob)
@@ -56,7 +50,7 @@
user.remove_from_mob(AM)
magazine = AM
magazine.loc = src
- user << "You load a new magazine into \the [src]!"
+ user << "You load a new magazine into \the [src]."
chamber_round()
A.update_icon()
update_icon()
@@ -71,7 +65,7 @@
user.put_in_hands(magazine)
magazine.update_icon()
magazine = null
- user << "You pull the magazine out of \the [src]!"
+ user << "You pull the magazine out of \the [src]."
else
user << "There's no magazine in \the [src]."
update_icon()
diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm
index 29a23cbfb23..93eba8d5eff 100644
--- a/code/modules/projectiles/guns/projectile/automatic.dm
+++ b/code/modules/projectiles/guns/projectile/automatic.dm
@@ -4,7 +4,6 @@
icon_state = "saber" //ugly
w_class = 3.0
origin_tech = "combat=4;materials=2"
- ammo_type = /obj/item/ammo_casing/c9mm
mag_type = /obj/item/ammo_box/magazine/msmg9mm
var/alarmed = 0
@@ -24,7 +23,6 @@
icon_state = "mini-uzi"
w_class = 3.0
origin_tech = "combat=5;materials=2;syndicate=8"
- ammo_type = /obj/item/ammo_casing/c45
mag_type = /obj/item/ammo_box/magazine/uzim45
@@ -36,7 +34,6 @@
item_state = "c20r"
w_class = 3.0
origin_tech = "combat=5;materials=2;syndicate=8"
- ammo_type = /obj/item/ammo_casing/a12mm
mag_type = /obj/item/ammo_box/magazine/m12mm
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
@@ -58,7 +55,7 @@
/obj/item/weapon/gun/projectile/automatic/c20r/update_icon()
..()
- icon_state = "c20r[magazine ? "-[round(get_ammo(0),4)]" : ""][chambered ? "" : "-e"]"
+ icon_state = "c20r[magazine ? "-[Ceiling(get_ammo(0)/4)*4]" : ""][chambered ? "" : "-e"]"
return
@@ -71,7 +68,6 @@
w_class = 5
slot_flags = 0
origin_tech = "combat=5;materials=1;syndicate=2"
- ammo_type = /obj/item/ammo_casing/a762
mag_type = /obj/item/ammo_box/magazine/m762
fire_sound = 'sound/weapons/Gunshot_smg.ogg'
var/cover_open = 0
@@ -84,7 +80,7 @@
/obj/item/weapon/gun/projectile/automatic/l6_saw/update_icon()
- icon_state = "l6[cover_open ? "open" : "closed"][magazine ? round(magazine.ammo_count() * 2, 25) : "-empty"]"
+ icon_state = "l6[cover_open ? "open" : "closed"][magazine ? Ceiling(get_ammo(0)/12.5)*25 : "-empty"]"
/obj/item/weapon/gun/projectile/automatic/l6_saw/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params) //what I tried to do here is just add a check to see if the cover is open or not and add an icon_state change because I can't figure out how c-20rs do it with overlays
diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm
index 91908817c54..f75bf8fcc8a 100644
--- a/code/modules/projectiles/guns/projectile/pistol.dm
+++ b/code/modules/projectiles/guns/projectile/pistol.dm
@@ -5,7 +5,6 @@
w_class = 3.0
silenced = 1
origin_tech = "combat=2;materials=2;syndicate=8"
- ammo_type = /obj/item/ammo_casing/c45
mag_type = /obj/item/ammo_box/magazine/sm45
fire_sound = 'sound/weapons/Gunshot_silenced.ogg'
@@ -20,7 +19,6 @@
desc = "A robust handgun that uses .50 AE ammo"
icon_state = "deagle"
force = 14.0
- ammo_type = /obj/item/ammo_casing/a50
mag_type = /obj/item/ammo_box/magazine/m50
@@ -56,14 +54,10 @@
icon_state = "gyropistol"
fire_sound = 'sound/effects/Explosion1.ogg'
origin_tech = "combat=3"
- ammo_type = /obj/item/ammo_casing/a75
mag_type = /obj/item/ammo_box/magazine/m75
-/obj/item/weapon/gun/projectile/automatic/gyropistol/New()
+/obj/item/weapon/gun/projectile/automatic/gyropistol/process_chamber(var/eject_casing = 0, var/empty_chamber = 1)
..()
- update_icon()
- return
-
/obj/item/weapon/gun/projectile/automatic/gyropistol/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
..()
@@ -85,18 +79,8 @@
w_class = 2
silenced = 0
origin_tech = "combat=2;materials=2;syndicate=2"
- ammo_type = /obj/item/ammo_casing/c10mm
mag_type = /obj/item/ammo_box/magazine/m10mm
-/obj/item/weapon/gun/projectile/automatic/pistol/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag)
- ..()
- if(magazine)
- if(!chambered && !magazine.ammo_count())
- magazine.update_icon()
- magazine.loc = get_turf(src.loc)
- magazine = null
- return
-
/obj/item/weapon/gun/projectile/automatic/pistol/attack_hand(mob/user as mob)
if(loc == user)
if(silenced)
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 7cd352a177e..a76b6e19cd9 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -2,7 +2,6 @@
desc = "A classic revolver. Uses 357 ammo"
name = "revolver"
icon_state = "revolver"
- ammo_type = /obj/item/ammo_casing/a357
mag_type = /obj/item/ammo_box/magazine/internal/cylinder
/obj/item/weapon/gun/projectile/revolver/chamber_round()
@@ -12,27 +11,13 @@
chambered = magazine.get_round(1)
return
-/obj/item/weapon/gun/projectile/revolver/process_chambered()
+/obj/item/weapon/gun/projectile/revolver/process_chamber()
return ..(0, 1)
/obj/item/weapon/gun/projectile/revolver/attackby(var/obj/item/A as obj, mob/user as mob)
- var/num_loaded = 0
- if(istype(A, /obj/item/ammo_box))
- var/obj/item/ammo_box/AM = A
- for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- if(magazine.give_round(AC))
- AM.stored_ammo -= AC
- num_loaded++
- else
- break
- if(istype(A, /obj/item/ammo_casing))
- var/obj/item/ammo_casing/AC = A
- if(magazine.give_round(AC))
- user.drop_item()
- AC.loc = src
- num_loaded++
+ var/num_loaded = magazine.attackby(A, user, 1)
if(num_loaded)
- user << "You load [num_loaded] shell\s into \the [src]!"
+ user << "You load [num_loaded] shell\s into \the [src]."
A.update_icon()
update_icon()
chamber_round()
@@ -47,7 +32,7 @@
CB.update_icon()
num_unloaded++
if (num_unloaded)
- user << "You unload [num_unloaded] shell\s from [src]!"
+ user << "You unload [num_unloaded] shell\s from [src]."
else
user << "[src] is empty."
@@ -68,7 +53,6 @@
name = "revolver"
icon_state = "detective"
origin_tech = "combat=2;materials=2"
- ammo_type = /obj/item/ammo_casing/c38
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/rev38
@@ -76,7 +60,7 @@
if(magazine.caliber == initial(magazine.caliber))
return 1
if(prob(70 - (magazine.ammo_count() * 10))) //minimum probability of 10, maximum of 60
- M << "[src] blows up in your face."
+ M << "[src] blows up in your face!"
M.take_organ_damage(0,20)
M.drop_item()
del(src)
@@ -177,22 +161,7 @@
spun = 1
/obj/item/weapon/gun/projectile/revolver/russian/attackby(var/obj/item/A as obj, mob/user as mob)
- var/num_loaded = 0
- if(istype(A, /obj/item/ammo_box))
- var/obj/item/ammo_box/AM = A
- for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- if(get_ammo() <= 1)
- if(magazine.give_round(AC))
- AM.stored_ammo -= AC
- num_loaded++
- break
- if(istype(A, /obj/item/ammo_casing))
- var/obj/item/ammo_casing/AC = A
- if(get_ammo() <= 1)
- magazine.give_round(AC)
- user.drop_item()
- AC.loc = src
- num_loaded++
+ var/num_loaded = ..()
if(num_loaded)
user.visible_message("[user] loads a single bullet into the revolver and spins the chamber.", "You load a single bullet into the chamber and spin it.")
else
@@ -222,32 +191,35 @@
user << "[src] is empty."
/obj/item/weapon/gun/projectile/revolver/russian/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, flag, params)
+ if(!spun && get_ammo(0,0))
+ user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.")
+ Spin()
..()
spun = 0
/obj/item/weapon/gun/projectile/revolver/russian/attack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj)
-
- if(!chambered)
- user.visible_message("\red *click*", "\red *click*")
+ if(!spun && get_ammo(0,0))
+ user.visible_message("[user] spins the chamber of the revolver.", "You spin the revolver's chamber.")
+ Spin()
return
- if(isliving(target) && isliving(user))
- if(target == user)
+
+ if(target == user)
+ if(!chambered)
+ user.visible_message("\red *click*", "\red *click*")
+ return
+
+ if(isliving(target) && isliving(user))
var/obj/item/organ/limb/affecting = user.zone_sel.selecting
if(affecting == "head")
var/obj/item/ammo_casing/AC = chambered
- if(!process_chambered())
+ if(AC.fire(user, user))
+ user.apply_damage(300, BRUTE, affecting)
+ playsound(user, fire_sound, 50, 1)
+ user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a [istype(AC.BB, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
+ return
+ else
user.visible_message("\red *click*", "\red *click*")
return
- if(!in_chamber)
- return
- var/obj/item/projectile/P = new AC.projectile_type
- playsound(user, fire_sound, 50, 1)
- user.visible_message("[user.name] fires [src] at \his head!", "You fire [src] at your head!", "You hear a [istype(in_chamber, /obj/item/projectile/beam) ? "laser blast" : "gunshot"]!")
- if(!P.nodamage)
- user.apply_damage(300, BRUTE, affecting) // You are dead, dead, dead.
- return
-
- spun = 0
..()
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 241ab5faceb..60f94f2fe63 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -8,33 +8,18 @@
flags = CONDUCT
slot_flags = SLOT_BACK
origin_tech = "combat=4;materials=2"
- ammo_type = /obj/item/ammo_casing/shotgun/beanbag
mag_type = /obj/item/ammo_box/magazine/internal/shot
var/recentpump = 0 // to prevent spammage
var/pumped = 0
/obj/item/weapon/gun/projectile/shotgun/attackby(var/obj/item/A as obj, mob/user as mob)
- var/num_loaded = 0
- if(istype(A, /obj/item/ammo_box))
- var/obj/item/ammo_box/AM = A
- for(var/obj/item/ammo_casing/AC in AM.stored_ammo)
- if(magazine.give_round(AC))
- AM.stored_ammo -= AC
- num_loaded++
- else
- break
- if(istype(A, /obj/item/ammo_casing))
- var/obj/item/ammo_casing/AC = A
- if(magazine.give_round(AC))
- user.drop_item()
- AC.loc = src
- num_loaded++
+ var/num_loaded = magazine.attackby(A, user, 1)
if(num_loaded)
user << "You load [num_loaded] shell\s into \the [src]!"
A.update_icon()
update_icon()
-/obj/item/weapon/gun/projectile/shotgun/process_chambered()
+/obj/item/weapon/gun/projectile/shotgun/process_chamber()
return ..(0, 0)
/obj/item/weapon/gun/projectile/shotgun/chamber_round()
@@ -55,8 +40,6 @@
if(chambered)//We have a shell in the chamber
chambered.loc = get_turf(src)//Eject casing
chambered = null
- if(in_chamber)
- in_chamber = null
if(!magazine.ammo_count()) return 0
var/obj/item/ammo_casing/AC = magazine.get_round() //load next casing.
chambered = AC
@@ -72,7 +55,6 @@
name = "combat shotgun"
icon_state = "cshotgun"
origin_tech = "combat=5;materials=2"
- ammo_type = /obj/item/ammo_casing/shotgun
mag_type = /obj/item/ammo_box/magazine/internal/shotcom
w_class = 5
@@ -86,7 +68,6 @@
flags = CONDUCT
slot_flags = SLOT_BACK
origin_tech = "combat=3;materials=1"
- ammo_type = /obj/item/ammo_casing/shotgun/beanbag
mag_type = /obj/item/ammo_box/magazine/internal/cylinder/dualshot
/obj/item/weapon/gun/projectile/revolver/doublebarrel/attackby(var/obj/item/A as obj, mob/user as mob)
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 63152bc832a..3fed362bf38 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -25,7 +25,6 @@
var/yo = null
var/xo = null
var/current = null
- var/obj/shot_from = null // the object which shot us
var/atom/original = null // the original target clicked
var/turf/starting = null // the projectile's starting turf
var/list/permutated = list() // we've passed through these atoms, don't try to hit them again
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index e753c085559..061660d27cd 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -16,6 +16,11 @@
flag = "laser"
eyeblur = 2
+/obj/item/projectile/beam/scatter
+ name = "laser pellet"
+ icon_state = "scatterlaser"
+ damage = 5
+
/obj/item/projectile/beam/heavylaser
name = "heavy laser"
diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm
index 54e8814d22a..d98d1c03d3c 100644
--- a/code/modules/projectiles/projectile/bullets.dm
+++ b/code/modules/projectiles/projectile/bullets.dm
@@ -19,6 +19,11 @@
weaken = 5
+/obj/item/projectile/bullet/pellet
+ name = "pellet"
+ damage = 15
+
+
/obj/item/projectile/bullet/midbullet
damage = 20
stun = 5
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index c824945bf26..d3b734d6d2d 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -30,7 +30,7 @@
damage_type = BURN
nodamage = 1
flag = "energy"
- var/temperature = 300
+ var/temperature = 100
on_hit(var/atom/target, var/blocked = 0)//These two could likely check temp protection on the mob
@@ -39,6 +39,10 @@
M.bodytemperature = temperature
return 1
+/obj/item/projectile/temp/hot
+ name = "heat beam"
+ temperature = 400
+
/obj/item/projectile/meteor
name = "meteor"
icon = 'icons/obj/meteor.dmi'
diff --git a/code/modules/reagents/syringe_gun.dm b/code/modules/reagents/syringe_gun.dm
index f6f9c673abb..a2fb2d14c72 100644
--- a/code/modules/reagents/syringe_gun.dm
+++ b/code/modules/reagents/syringe_gun.dm
@@ -13,20 +13,31 @@
var/list/syringes = list()
var/max_syringes = 1
-/obj/item/weapon/gun/syringe/process_chambered()
- if(!syringes.len) return 0
-
+/obj/item/weapon/gun/syringe/New()
+ ..()
+ chambered = new /obj/item/ammo_casing/syringegun(src)
+
+/obj/item/weapon/gun/syringe/proc/newshot()
+ if(!syringes.len) return
+
var/obj/item/weapon/reagent_containers/syringe/S = syringes[1]
-
- if(!S) return 0
-
- in_chamber = new /obj/item/projectile/bullet/dart/syringe(src)
- S.reagents.trans_to(in_chamber, S.reagents.total_volume)
- in_chamber.name = S.name
+
+ if(!S) return
+
+ chambered.BB = new /obj/item/projectile/bullet/dart/syringe(src)
+ S.reagents.trans_to(chambered.BB, S.reagents.total_volume)
+ chambered.BB.name = S.name
syringes.Remove(S)
-
+
del(S)
- return 1
+ return
+
+/obj/item/weapon/gun/syringe/process_chamber()
+ return
+
+/obj/item/weapon/gun/syringe/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params)
+ newshot()
+ ..()
/obj/item/weapon/gun/syringe/examine()
..()
@@ -37,22 +48,22 @@
if(!syringes.len)
user << "[src] is empty."
return 0
-
+
var/obj/item/weapon/reagent_containers/syringe/S = syringes[syringes.len]
-
+
if(!S) return 0
S.loc = user.loc
-
+
syringes.Remove(S)
user << "You unload [S] from \the [src]!"
-
+
return 1
/obj/item/weapon/gun/syringe/attackby(var/obj/item/A as obj, mob/user as mob, var/show_msg = 1)
if(istype(A, /obj/item/weapon/reagent_containers/syringe))
if(syringes.len < max_syringes)
user.drop_item()
- user << "You load [A] into \the [src]!"
+ user << "You load [A] into \the [src]."
syringes.Add(A)
A.loc = src
return 1
diff --git a/icons/obj/projectiles.dmi b/icons/obj/projectiles.dmi
index 2844889a4da..a2edc4cc054 100644
Binary files a/icons/obj/projectiles.dmi and b/icons/obj/projectiles.dmi differ
diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm
index 46b67a369b9..938b73a1d06 100644
--- a/maps/RandomZLevels/stationCollision.dm
+++ b/maps/RandomZLevels/stationCollision.dm
@@ -64,7 +64,7 @@ obj/item/weapon/gun/energy/laser/retro/sc_retro
name ="retro laser"
icon_state = "retro"
desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces."
- projectile_type = "/obj/item/projectile/practice"
+// projectile_type = "/obj/item/projectile/practice"
clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face
//Syndicate silenced pistol. This definition is not necessary, it's just habit.
diff --git a/tgstation.dme b/tgstation.dme
index 4a1cd48528e..58437ae429a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -1079,11 +1079,14 @@
#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm"
#include "code\modules\power\singularity\particle_accelerator\particle_power.dm"
#include "code\modules\projectiles\ammunition.dm"
+#include "code\modules\projectiles\firing.dm"
#include "code\modules\projectiles\gun.dm"
#include "code\modules\projectiles\projectile.dm"
#include "code\modules\projectiles\ammunition\boxes.dm"
#include "code\modules\projectiles\ammunition\bullets.dm"
+#include "code\modules\projectiles\ammunition\energy.dm"
#include "code\modules\projectiles\ammunition\magazines.dm"
+#include "code\modules\projectiles\ammunition\special.dm"
#include "code\modules\projectiles\guns\energy.dm"
#include "code\modules\projectiles\guns\magic.dm"
#include "code\modules\projectiles\guns\projectile.dm"