From a643cb92f028f59dc405a6aacc58fdaedbe1cb01 Mon Sep 17 00:00:00 2001 From: KorPhaeron Date: Sun, 13 Nov 2016 17:02:00 -0600 Subject: [PATCH] Dual (or more!) Wielding (#21397) * Dual (or more!) Wielding * Removes an extra line * Shotguns can't be dual wielded --- code/__DEFINES/combat.dm | 8 ++-- code/modules/projectiles/gun.dm | 42 +++++++++++-------- .../projectiles/guns/ballistic/automatic.dm | 4 +- .../projectiles/guns/ballistic/shotgun.dm | 1 + .../projectiles/guns/energy/energy_gun.dm | 2 +- 5 files changed, 33 insertions(+), 24 deletions(-) diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index ad776db0e76..b51dcec889a 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -79,10 +79,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 //Health Defines diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index d63f339a5df..aef62847bd4 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -119,12 +119,6 @@ else user.visible_message("[user] fires [src]!", null, null, COMBAT_MESSAGE_RANGE) - if(weapon_weight >= WEAPON_MEDIUM) - if(user.get_inactive_held_item()) - 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/weapon/gun/emp_act(severity) for(var/obj/O in contents) O.emp_act(severity) @@ -170,7 +164,21 @@ user << "You need both hands free to fire [src]!" return - process_fire(target,user,1,params) + //DUAL (or more!) WIELDING + var/bonus_spread = 0 + var/loop_counter = 0 + if(ishuman(user) && user.a_intent == "harm") + var/mob/living/carbon/human/H = user + for(var/obj/item/weapon/gun/G in H.held_items) + 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) @@ -195,17 +203,17 @@ obj/item/weapon/gun/proc/recharge_newshot() return -/obj/item/weapon/gun/proc/process_fire(atom/target as mob|obj|turf, mob/living/user as mob|obj, message = 1, params, zone_override) +/obj/item/weapon/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_held_item()) - 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 @@ -216,11 +224,10 @@ obj/item/weapon/gun/proc/recharge_newshot() if( i>1 && !(user.is_holding(src))) //for burst firing break if(chambered && chambered.BB) - var/sprd = 0 if(randomspread) - sprd = round((rand() - 0.5) * spread) + sprd = round((rand() - 0.5) * (randomized_gun_spread + randomized_bonus_spread)) else //Smart spread - sprd = round((i / burst_size - 0.5) * spread) + sprd = round((i / burst_size - 0.5) * (randomized_gun_spread + randomized_bonus_spread)) if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd)) shoot_with_empty_chamber(user) @@ -239,7 +246,8 @@ obj/item/weapon/gun/proc/recharge_newshot() firing_burst = 0 else if(chambered) - if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, spread)) + sprd = round((pick(1,-1)) * (randomized_gun_spread + randomized_bonus_spread)) + if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd)) shoot_with_empty_chamber(user) return else diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index 1d871e9372d..faf398613c4 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -290,7 +290,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/Gunshot_smg.ogg' var/cover_open = 0 can_suppress = 0 @@ -356,7 +356,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_delay = 40 burst_size = 1 diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 15eaf9a0764..2b5ea3be66c 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -11,6 +11,7 @@ mag_type = /obj/item/ammo_box/magazine/internal/shot casing_ejector = 0 var/recentpump = 0 // to prevent spammage + weapon_weight = WEAPON_MEDIUM /obj/item/weapon/gun/ballistic/shotgun/attackby(obj/item/A, mob/user, params) . = ..() diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 0eae9ee65e4..77c2eef75cb 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -69,7 +69,7 @@ slot_flags = null w_class = 5 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