From e8350572417cd87ccc5780091c6f05355c12b944 Mon Sep 17 00:00:00 2001 From: copygirl Date: Thu, 13 May 2021 13:16:31 +0200 Subject: [PATCH] Add weapon knockback, improve recovery --- scene/Player.tscn | 14 ++++---------- src/Items/Weapon.cs | 16 +++++++++------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/scene/Player.tscn b/scene/Player.tscn index b636579..e0432a7 100644 --- a/scene/Player.tscn +++ b/scene/Player.tscn @@ -67,18 +67,17 @@ visible = false texture = ExtResource( 7 ) offset = Vector2( 8, 0 ) script = ExtResource( 8 ) +Knockback = 50.0 Spread = 3.0 SpreadIncrease = 1.0 RecoilMin = 3.0 RecoilMax = 5.0 -RecoilRegen = 16.0 [node name="Tip" type="Node2D" parent="Items/Revolver"] position = Vector2( 15, -2.5 ) [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Revolver"] stream = ExtResource( 14 ) -attenuation = 1.0 [node name="Shotgun" type="Sprite" parent="Items"] visible = false @@ -87,19 +86,17 @@ offset = Vector2( 8, 0 ) script = ExtResource( 8 ) EffectiveRange = 240 MaximumRange = 360 +Knockback = 135.0 Spread = 14.0 SpreadIncrease = 20.0 -SpreadRegen = 16.0 RecoilMin = 6.0 RecoilMax = 12.0 -RecoilRegen = 8.0 [node name="Tip" type="Node2D" parent="Items/Shotgun"] position = Vector2( 22, -1.5 ) [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Shotgun"] stream = ExtResource( 13 ) -attenuation = 1.0 [node name="Rifle" type="Sprite" parent="Items"] visible = false @@ -108,27 +105,25 @@ offset = Vector2( 8, 0 ) script = ExtResource( 8 ) EffectiveRange = 480 MaximumRange = 920 +Knockback = 100.0 SpreadIncrease = 2.0 -SpreadRegen = 2.0 RecoilMin = 8.0 RecoilMax = 8.0 -RecoilRegen = 8.0 [node name="Tip" type="Node2D" parent="Items/Rifle"] position = Vector2( 24, -1.5 ) [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Rifle"] stream = ExtResource( 15 ) -attenuation = 1.0 [node name="Assault Rifle" type="Sprite" parent="Items"] visible = false texture = ExtResource( 12 ) offset = Vector2( 8, 0 ) script = ExtResource( 8 ) +Knockback = 30.0 Spread = 1.0 SpreadIncrease = 1.2 -SpreadRegen = 5.0 RecoilMin = 1.0 RecoilMax = 2.5 @@ -137,7 +132,6 @@ position = Vector2( 22, -1.5 ) [node name="Fire" type="AudioStreamPlayer2D" parent="Items/Assault Rifle"] stream = ExtResource( 16 ) -attenuation = 1.0 [node name="Super Soaker" type="Sprite" parent="Items"] visible = false diff --git a/src/Items/Weapon.cs b/src/Items/Weapon.cs index 465166d..8900ed9 100644 --- a/src/Items/Weapon.cs +++ b/src/Items/Weapon.cs @@ -1,19 +1,17 @@ +using System; using Godot; public class Weapon : Sprite { [Export] public int EffectiveRange { get; set; } = 320; [Export] public int MaximumRange { get; set; } = 640; + [Export] public float Knockback { get; set; } = 0.0F; [Export] public float Spread { get; set; } = 0.0F; [Export] public float SpreadIncrease { get; set; } = 0.0F; - [Export] public float SpreadRegen { get; set; } = 10.0F; [Export] public float RecoilMin { get; set; } = 0.0F; [Export] public float RecoilMax { get; set; } = 0.0F; - [Export] public float RecoilRegen { get; set; } = 10.0F; - - // TODO: Make the Regen multiplicative instead of substractive? public Cursor Cursor { get; private set; } @@ -33,7 +31,7 @@ public class Weapon : Sprite public override void _UnhandledInput(InputEvent ev) { - if (!(Player is LocalPlayer)) return; + if (!(Player is LocalPlayer localPlayer)) return; if (ev.IsActionPressed("interact_primary")) { GetNodeOrNull("Fire")?.Play(); @@ -41,13 +39,17 @@ public class Weapon : Sprite // TODO: Tell server (and other clients) we shot. _currentSpreadInc += Mathf.Deg2Rad(SpreadIncrease); _currentRecoil += Mathf.Deg2Rad((float)GD.RandRange(RecoilMin, RecoilMax)); + + localPlayer.Velocity -= Mathf.Polar2Cartesian(Knockback, Rotation); } } public override void _Process(float delta) { - _currentSpreadInc = Mathf.Max(0, _currentSpreadInc - Mathf.Deg2Rad(SpreadRegen) * delta); - _currentRecoil = Mathf.Max(0, _currentRecoil - Mathf.Deg2Rad(RecoilRegen) * delta); + var spreadDecrease = Mathf.Max(Mathf.Tau / 300, _currentSpreadInc * 2); + var recoilDecrease = Mathf.Max(Mathf.Tau / 800, _currentRecoil * 2); + _currentSpreadInc = Mathf.Max(0, _currentSpreadInc - spreadDecrease * delta); + _currentRecoil = Mathf.Max(0, _currentRecoil - recoilDecrease * delta); if (Visible && (Player is LocalPlayer)) { AimDirection = Cursor.Position.AngleToPoint(Player.Position);