diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm
index fbc28695ebf..d8e051e600e 100644
--- a/code/__DEFINES/combat.dm
+++ b/code/__DEFINES/combat.dm
@@ -106,9 +106,10 @@
#define SAWN_INTACT 0
#define SAWN_OFF 1
-#define WEAPON_LIGHT 0
-#define WEAPON_MEDIUM 1
-#define WEAPON_HEAVY 2
+#define WEAPON_DUAL_WIELD 0
+#define WEAPON_LIGHT 1
+#define WEAPON_MEDIUM 2
+#define WEAPON_HEAVY 3
#define EXPLODE_NONE 0 //Don't even ask me why we need this.
#define EXPLODE_DEVASTATE 1
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index b8f2d153d9f..0ca2e6cf5cb 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -88,6 +88,7 @@
var/obj/item/gun/energy/E = charging
if(E.power_supply.charge < E.power_supply.maxcharge)
E.power_supply.give(E.power_supply.chargerate)
+ E.on_recharge()
use_power(250)
using_power = TRUE
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 1532eeaccbd..c15aed3b757 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -203,6 +203,7 @@
if(D.power_supply.charge < D.power_supply.maxcharge)
var/obj/item/ammo_casing/energy/E = D.ammo_type[D.select]
D.power_supply.give(E.e_cost)
+ D.on_recharge()
D.update_icon()
else
D.charge_tick = 0
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index d5dfb454e09..07d1cdcf6c2 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -103,12 +103,6 @@
else
user.visible_message("[user] fires [src]!", "You fire [src]!", "You hear \a [fire_sound_text]!")
- if(weapon_weight >= WEAPON_MEDIUM)
- if(user.get_inactive_hand())
- if(prob(15))
- if(user.drop_item())
- user.visible_message("[src] flies out of [user]'s hands!", "[src] kicks out of your grip!")
-
/obj/item/gun/emp_act(severity)
for(var/obj/O in contents)
O.emp_act(severity)
@@ -153,7 +147,21 @@
to_chat(user, "You need both hands free to fire \the [src]!")
return
- process_fire(target,user,1,params)
+ //DUAL WIELDING
+ var/bonus_spread = 0
+ var/loop_counter = 0
+ if(ishuman(user) && user.a_intent == INTENT_HARM)
+ var/mob/living/carbon/human/H = user
+ for(var/obj/item/gun/G in get_both_hands(H))
+ if(G == src || G.weapon_weight >= WEAPON_MEDIUM)
+ continue
+ else if(G.can_trigger_gun(user))
+ bonus_spread += 24 * G.weapon_weight
+ loop_counter++
+ spawn(loop_counter)
+ G.process_fire(target,user,1,params, null, bonus_spread)
+
+ process_fire(target,user,1,params, null, bonus_spread)
/obj/item/gun/proc/can_trigger_gun(mob/living/user)
if(!user.can_use_guns(src))
@@ -166,17 +174,17 @@
obj/item/gun/proc/newshot()
return
-/obj/item/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override)
+/obj/item/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override, bonus_spread = 0)
add_fingerprint(user)
if(semicd)
return
- if(weapon_weight)
- if(user.get_inactive_hand())
- recoil = 4 //one-handed kick
- else
- recoil = initial(recoil)
+ var/sprd = 0
+ var/randomized_gun_spread = 0
+ if(spread)
+ randomized_gun_spread = rand(0,spread)
+ var/randomized_bonus_spread = rand(0, bonus_spread)
if(burst_size > 1)
firing_burst = 1
@@ -187,11 +195,10 @@ obj/item/gun/proc/newshot()
if( i>1 && !(src in get_both_hands(user))) //for burst firing
break
if(chambered)
- var/sprd = 0
if(randomspread)
- sprd = round((rand() - 0.5) * spread)
+ sprd = round((rand() - 0.5) * (randomized_gun_spread + randomized_bonus_spread))
else
- sprd = round((i / burst_size - 0.5) * spread)
+ sprd = round((i / burst_size - 0.5) * (randomized_gun_spread + randomized_bonus_spread))
if(!chambered.fire(target, user, params, ,suppressed, zone_override, sprd))
shoot_with_empty_chamber(user)
break
@@ -209,7 +216,8 @@ obj/item/gun/proc/newshot()
firing_burst = 0
else
if(chambered)
- if(!chambered.fire(target, user, params, , suppressed, zone_override, spread))
+ sprd = round((pick(1,-1)) * (randomized_gun_spread + randomized_bonus_spread))
+ if(!chambered.fire(target, user, params, , suppressed, zone_override, sprd))
shoot_with_empty_chamber(user)
return
else
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index cbc230c1e98..222b15c4e76 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -21,6 +21,12 @@
/obj/item/gun/energy/emp_act(severity)
power_supply.use(round(power_supply.charge / severity))
+ if(chambered)//phil235
+ if(chambered.BB)
+ qdel(chambered.BB)
+ chambered.BB = null
+ chambered = null
+ newshot() //phil235
update_icon()
/obj/item/gun/energy/get_cell()
@@ -34,6 +40,7 @@
power_supply = new(src)
power_supply.give(power_supply.maxcharge)
update_ammo_types()
+ on_recharge()
if(selfcharge)
START_PROCESSING(SSobj, src)
update_icon()
@@ -67,8 +74,12 @@
if(!external || !external.use(E.e_cost)) //Take power from the borg...
return //Note, uses /10 because of shitty mods to the cell system
power_supply.give(100) //... to recharge the shot
+ on_recharge()
update_icon()
+/obj/item/gun/energy/proc/on_recharge()
+ newshot()
+
/obj/item/gun/energy/attack_self(mob/living/user as mob)
if(ammo_type.len > 1)
select_fire(user)
@@ -78,10 +89,6 @@
H.update_inv_l_hand()
H.update_inv_r_hand()
-/obj/item/gun/energy/afterattack(atom/target as mob|obj|turf, mob/living/user as mob|obj, params)
- newshot() //prepare a new shot
- ..()
-
/obj/item/gun/energy/can_shoot()
var/obj/item/ammo_casing/energy/shot = ammo_type[select]
return power_supply.charge >= shot.e_cost
@@ -89,18 +96,20 @@
/obj/item/gun/energy/newshot()
if(!ammo_type || !power_supply)
return
- var/obj/item/ammo_casing/energy/shot = ammo_type[select]
- if(power_supply.charge >= shot.e_cost) //if there's enough power in the power_supply cell...
- chambered = shot //...prepare a new shot based on the current ammo type selected
- chambered.newshot()
- return
+ if(!chambered)
+ var/obj/item/ammo_casing/energy/shot = ammo_type[select]
+ if(power_supply.charge >= shot.e_cost) //if there's enough power in the power_supply cell...
+ chambered = shot //...prepare a new shot based on the current ammo type selected
+ if(!chambered.BB)
+ chambered.newshot()
/obj/item/gun/energy/process_chamber()
if(chambered && !chambered.BB) //if BB is null, i.e the shot has been fired...
var/obj/item/ammo_casing/energy/shot = chambered
power_supply.use(shot.e_cost)//... drain the power_supply cell
+ robocharge()
chambered = null //either way, released the prepared shot
- return
+ newshot()
/obj/item/gun/energy/proc/select_fire(mob/living/user)
select++
@@ -111,6 +120,12 @@
fire_delay = shot.delay
if(shot.select_name)
to_chat(user, "[src] is now set to [shot.select_name].")
+ if(chambered)//phil235
+ if(chambered.BB)
+ qdel(chambered.BB)
+ chambered.BB = null
+ chambered = null
+ newshot()
update_icon()
return
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index fa483903012..1179fd823b0 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -121,6 +121,7 @@
/obj/item/gun/energy/kinetic_accelerator/proc/reload()
power_supply.give(500)
+ on_recharge()
if(!suppressed)
playsound(loc, 'sound/weapons/kenetic_reload.ogg', 60, 1)
else if(isliving(loc))
diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm
index 6cc27a08f09..949ee16fa06 100644
--- a/code/modules/projectiles/guns/energy/nuclear.dm
+++ b/code/modules/projectiles/guns/energy/nuclear.dm
@@ -79,7 +79,7 @@
slot_flags = null
w_class = WEIGHT_CLASS_HUGE
ammo_type = list(/obj/item/ammo_casing/energy/electrode, /obj/item/ammo_casing/energy/laser)
- weapon_weight = WEAPON_MEDIUM
+ weapon_weight = WEAPON_HEAVY
can_flashlight = 0
trigger_guard = TRIGGER_GUARD_NONE
ammo_x_offset = 2
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index fa34753c6a9..3645becb38a 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -168,11 +168,13 @@
var/obj/item/stack/sheet/S = A
S.use(1)
power_supply.give(1000)
+ on_recharge()
to_chat(user, "You insert [A] in [src], recharging it.")
else if(istype(A, /obj/item/stack/ore/plasma))
var/obj/item/stack/ore/S = A
S.use(1)
power_supply.give(500)
+ on_recharge()
to_chat(user, "You insert [A] in [src], recharging it.")
else
..()
@@ -251,10 +253,6 @@
/obj/item/gun/energy/printer/emp_act()
return
-/obj/item/gun/energy/printer/newshot()
- ..()
- robocharge()
-
// Instakill Lasers //
/obj/item/gun/energy/laser/instakill
name = "instakill rifle"
diff --git a/code/modules/projectiles/guns/projectile/saw.dm b/code/modules/projectiles/guns/projectile/saw.dm
index 59bb2595714..db757dbb1f9 100644
--- a/code/modules/projectiles/guns/projectile/saw.dm
+++ b/code/modules/projectiles/guns/projectile/saw.dm
@@ -7,7 +7,7 @@
slot_flags = 0
origin_tech = "combat=6;engineering=3;syndicate=6"
mag_type = /obj/item/ammo_box/magazine/mm556x45
- weapon_weight = WEAPON_MEDIUM
+ weapon_weight = WEAPON_HEAVY
fire_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
magin_sound = 'sound/weapons/gun_interactions/lmg_magin.ogg'
magout_sound = 'sound/weapons/gun_interactions/lmg_magout.ogg'
diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm
index 366b9b6579f..01a5f8d498f 100644
--- a/code/modules/projectiles/guns/projectile/shotgun.dm
+++ b/code/modules/projectiles/guns/projectile/shotgun.dm
@@ -11,6 +11,7 @@
mag_type = /obj/item/ammo_box/magazine/internal/shot
fire_sound = 'sound/weapons/gunshots/gunshot_shotgun.ogg'
var/recentpump = 0 // to prevent spammage
+ weapon_weight = WEAPON_MEDIUM
/obj/item/gun/projectile/shotgun/attackby(obj/item/A, mob/user, params)
. = ..()
diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm
index e030c9afb2a..b310ce6d884 100644
--- a/code/modules/projectiles/guns/projectile/sniper.dm
+++ b/code/modules/projectiles/guns/projectile/sniper.dm
@@ -4,7 +4,7 @@
icon_state = "sniper"
item_state = "sniper"
recoil = 2
- weapon_weight = WEAPON_MEDIUM
+ weapon_weight = WEAPON_HEAVY
mag_type = /obj/item/ammo_box/magazine/sniper_rounds
fire_sound = 'sound/weapons/gunshots/gunshot_sniper.ogg'
magin_sound = 'sound/weapons/gun_interactions/batrifle_magin.ogg'