diff --git a/code/__HELPERS/animation.dm b/code/__HELPERS/animation.dm new file mode 100644 index 00000000000..8d749208e8d --- /dev/null +++ b/code/__HELPERS/animation.dm @@ -0,0 +1,14 @@ +///Makes a recoil-like animation on the mob camera. +/proc/recoil_camera(mob/M, duration, backtime_duration, strength, angle) + if(!M || !M.client) + return + var/client/sufferer = M.client + strength *= world.icon_size + var/oldx = sufferer.pixel_x + var/oldy = sufferer.pixel_y + + //get pixels to move the camera in an angle + var/mpx = sin(angle) * strength + var/mpy = cos(angle) * strength + animate(sufferer, pixel_x = oldx+mpx, pixel_y = oldy+mpy, time = duration, flags = ANIMATION_RELATIVE) + animate(pixel_x = oldx, pixel_y = oldy, time = backtime_duration, easing = BACK_EASING) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 7d06941e5a0..8250f9762cc 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -49,7 +49,6 @@ var/suppressed_sound = 'sound/weapons/gun/general/heavy_shot_suppressed.ogg' var/suppressed_volume = 60 var/can_unsuppress = TRUE - var/recoil = 0 //boom boom shake the room var/clumsy_check = TRUE var/obj/item/ammo_casing/chambered = null trigger_guard = TRIGGER_GUARD_NORMAL //trigger guard on the weapon, hulks can't fire them with their big meaty fingers @@ -85,6 +84,13 @@ var/pb_knockback = 0 + ///boom boom shake the room + var/recoil = 0 + ///a multiplier of the duration the recoil takes to go back to normal view, this is (recoil*recoil_backtime_multiplier)+1 + var/recoil_backtime_multiplier = 2 + ///this is how much deviation the gun recoil can have, recoil pushes the screen towards the reverse angle you shot + some deviation which this is the max. + var/recoil_deviation = 22.5 + /obj/item/gun/Initialize(mapload) . = ..() if(pin) @@ -171,8 +177,11 @@ playsound(src, fire_sound, fire_sound_volume, vary_fire_sound) /obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1) + var/angle = get_angle(user, pbtarget)+rand(-recoil_deviation, recoil_deviation) + 180 + if(angle > 360) + angle -= 360 if(recoil && !tk_firing(user)) - shake_camera(user, recoil + 1, recoil) + recoil_camera(user, recoil+1, (recoil*recoil_backtime_multiplier) + 1, recoil, angle) fire_sounds() if(!suppressed) if(message) diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index ede1e51c740..243b65d8427 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -118,6 +118,8 @@ var/misfire_percentage_increment = 0 ///What is the cap on our misfire probability? Do not set this to 100. var/misfire_probability_cap = 25 + /// How much recoil the gun has. + recoil = 1 /obj/item/gun/ballistic/Initialize(mapload) . = ..() diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index 55f893b0dee..10ad3700a96 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -33,6 +33,8 @@ var/use_cyborg_cell = FALSE ///set to true so the gun is given an empty cell var/dead_cell = FALSE + /// How much recoil the gun has. + recoil = 0.2 /obj/item/gun/energy/fire_sounds() var/obj/item/ammo_casing/energy/shot = ammo_type[select] diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index dc2b18114d2..19c01d9f129 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -26,6 +26,7 @@ ammo_x_offset = 2 charge_sections = 3 single_shot_type_overlay = FALSE + recoil = 0.1 /obj/item/gun/energy/e_gun/mini/add_seclight_point() // The mini energy gun's light comes attached but is unremovable. diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 635570fbb15..386e3bb82e3 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -32,6 +32,7 @@ inhand_icon_state = null ammo_type = list(/obj/item/ammo_casing/energy/disabler) ammo_x_offset = 2 + recoil = 0.1 /obj/item/gun/energy/disabler/add_seclight_point() AddComponent(/datum/component/seclite_attachable, \ diff --git a/tgstation.dme b/tgstation.dme index 0a45529c98a..44a97caddf6 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -323,6 +323,7 @@ #include "code\__HELPERS\_string_lists.dm" #include "code\__HELPERS\admin.dm" #include "code\__HELPERS\ai.dm" +#include "code\__HELPERS\animation.dm" #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\atmospherics.dm" #include "code\__HELPERS\atoms.dm"