From 9c763357b928cfe5b7f47ada86e670c98c416656 Mon Sep 17 00:00:00 2001 From: HumanoidSandvichDispenser Date: Sun, 28 May 2023 17:54:48 -0700 Subject: [PATCH] NPC angle lock when using weapon --- Characters/Character.cs | 8 +++++ Characters/NPC.cs | 2 +- Characters/Player.tscn | 5 ++- Items/Weapon.cs | 21 +++++++++--- Items/Weapons/Railgun.tscn | 3 +- State/Character/CharacterState.cs | 21 ++++++++++++ State/Character/PlayerState.cs | 54 ++++++++++++++----------------- State/Weapon/RangedFireState.cs | 1 + State/Weapon/SwordAttackState.cs | 2 +- 9 files changed, 78 insertions(+), 39 deletions(-) diff --git a/Characters/Character.cs b/Characters/Character.cs index 2ceab79..a21c4b8 100644 --- a/Characters/Character.cs +++ b/Characters/Character.cs @@ -159,6 +159,14 @@ namespace SupaLidlGame.Characters } } + public void LookTowardsDirection() + { + if (!Direction.IsZeroApprox()) + { + Target = Direction; + } + } + public virtual void _on_hurtbox_received_damage( float damage, Character inflictor, diff --git a/Characters/NPC.cs b/Characters/NPC.cs index 0ce0ef1..a834f9d 100644 --- a/Characters/NPC.cs +++ b/Characters/NPC.cs @@ -216,7 +216,7 @@ namespace SupaLidlGame.Characters float dist = GlobalPosition.DistanceSquaredTo(pos); UpdateWeights(pos); - if (Target.LengthSquared() < 1024) + if (dist < 1024) { if (Inventory.SelectedItem is Weapon weapon) { diff --git a/Characters/Player.tscn b/Characters/Player.tscn index 6dbfec4..e475a08 100644 --- a/Characters/Player.tscn +++ b/Characters/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=29 format=3 uid="uid://b2254pup8k161"] +[gd_scene load_steps=30 format=3 uid="uid://b2254pup8k161"] [ext_resource type="Script" path="res://Characters/Player.cs" id="1_flygr"] [ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="2_ngsgt"] @@ -11,6 +11,7 @@ [ext_resource type="Script" path="res://Items/Inventory.cs" id="7_xyenu"] [ext_resource type="Script" path="res://State/Character/PlayerRollState.cs" id="8_fy0v5"] [ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="9_avyu4"] +[ext_resource type="PackedScene" uid="uid://g7wfcubs6bdd" path="res://Items/Weapons/Railgun.tscn" id="10_7kb8b"] [ext_resource type="AudioStream" uid="uid://njun3e6v4854" path="res://Assets/Sounds/hurt.wav" id="12_h0x0g"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_h78y7"] @@ -209,6 +210,8 @@ InventoryMap = { "equip_2": 1 } +[node name="Railgun" parent="Inventory" instance=ExtResource("10_7kb8b")] + [node name="Node2D" parent="Inventory" instance=ExtResource("7_4rxuv")] [node name="Hurtbox" parent="." instance=ExtResource("9_avyu4")] diff --git a/Items/Weapon.cs b/Items/Weapon.cs index bb6db64..d8485b9 100644 --- a/Items/Weapon.cs +++ b/Items/Weapon.cs @@ -35,20 +35,31 @@ namespace SupaLidlGame.Items [Export] public float InitialVelocity { get; set; } = 0; + /// + /// Hides the weapon if it is idle (i.e. not being used). + /// [Export] public bool ShouldHideIdle { get; set; } = false; + /// + /// Freezes the player's target angle if this weapon is being used. + /// + [Export] + public bool ShouldFreezeAngleOnUse { get; set; } = true; + + [Export] + public float MinDistanceHint { get; set; } + + [Export] + public float MaxDistanceHint { get; set; } + public virtual bool IsParryable { get; protected set; } = false; public bool IsParried { get; set; } public Character Character { get; set; } - [Export] - public float MinDistanceHint { get; set; } - - [Export] - public float MaxDistanceHint { get; set; } + public Vector2 UseDirection { get; set; } public override bool StacksWith(Item item) => false; diff --git a/Items/Weapons/Railgun.tscn b/Items/Weapons/Railgun.tscn index e03bf7e..ef792f8 100644 --- a/Items/Weapons/Railgun.tscn +++ b/Items/Weapons/Railgun.tscn @@ -27,9 +27,10 @@ UseTime = 1.0 script = ExtResource("1_xynim") InitialState = NodePath("Idle") -[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("FireState")] +[node name="Idle" type="Node" parent="State" node_paths=PackedStringArray("FireState", "Weapon")] script = ExtResource("2_a4hhy") FireState = NodePath("../Fire") +Weapon = NodePath("../..") [node name="Fire" type="Node" parent="State" node_paths=PackedStringArray("Weapon", "IdleState")] script = ExtResource("3_dcbnq") diff --git a/State/Character/CharacterState.cs b/State/Character/CharacterState.cs index 2b0cc3a..8b22a14 100644 --- a/State/Character/CharacterState.cs +++ b/State/Character/CharacterState.cs @@ -20,6 +20,27 @@ namespace SupaLidlGame.State.Character { Character.StunTime -= delta; } + + var item = Character.Inventory.SelectedItem; + var offhand = Character.Inventory.OffhandItem; + + // angle towards item use angle or offhand use angle if not used + + bool targetTowards(Items.Item item) + { + if (item is Items.Weapon weapon) + { + if (weapon.IsUsing) + { + Character.Target = weapon.UseDirection; + return true; + } + } + return false; + } + + var _ = targetTowards(item) || targetTowards(offhand); + return null; } diff --git a/State/Character/PlayerState.cs b/State/Character/PlayerState.cs index cd7c7ab..f2ce8c7 100644 --- a/State/Character/PlayerState.cs +++ b/State/Character/PlayerState.cs @@ -30,47 +30,41 @@ namespace SupaLidlGame.State.Character { Character.Direction = Godot.Input.GetVector("ui_left", "ui_right", "ui_up", "ui_down"); + Character.LookTowardsDirection(); + Vector2 mousePos = Character.GetGlobalMousePosition(); Vector2 dirToMouse = Character.GlobalPosition.DirectionTo(mousePos); - bool faceToDir = !Character.Direction.IsZeroApprox(); - - if (Character.Inventory.SelectedItem is Items.Weapon weapon) + bool targetTowards(Items.Item item) { - if (!weapon.IsUsing) + if (Character.Inventory.SelectedItem is Items.Weapon weapon) { - if (weapon.ShouldHideIdle) + if (!weapon.IsUsing) { - faceToDir = true; - } - else - { - Character.Target = dirToMouse; + var isPressed = Godot.Input.IsActionPressed("attack1"); + var ret = false; + + if (!weapon.ShouldHideIdle || isPressed) + { + Character.Target = dirToMouse; + ret = true; + } + + if (isPressed) + { + Character.UseCurrentItem(); + } + + return ret; } } - else - { - faceToDir = false; - } + return false; } - if (faceToDir) - { - Character.Target = Character.Direction; - } + var item = Character.Inventory.SelectedItem; + var offhand = Character.Inventory.OffhandItem; - if (Godot.Input.IsActionPressed("attack1")) - { - var item = Character.Inventory.SelectedItem; - if (item is not null) - { - if (!item.IsUsing) - { - Character.Target = dirToMouse; - } - Character.UseCurrentItem(); - } - } + var _ = targetTowards(item) || targetTowards(offhand); return base.Process(delta); } diff --git a/State/Weapon/RangedFireState.cs b/State/Weapon/RangedFireState.cs index bacfc85..3758672 100644 --- a/State/Weapon/RangedFireState.cs +++ b/State/Weapon/RangedFireState.cs @@ -17,6 +17,7 @@ namespace SupaLidlGame.State.Weapon //_timeLeft _timeLeft = Weapon.UseTime; Weapon.Attack(); + Weapon.UseDirection = Weapon.Character.Target; return null; } diff --git a/State/Weapon/SwordAttackState.cs b/State/Weapon/SwordAttackState.cs index 247a740..90d133e 100644 --- a/State/Weapon/SwordAttackState.cs +++ b/State/Weapon/SwordAttackState.cs @@ -40,7 +40,7 @@ namespace SupaLidlGame.State.Weapon _attackAnimDuration = Sword.AttackAnimationDuration; Sword.Visible = true; - + Sword.UseDirection = Sword.Character.Target; return null; }