NPC angle lock when using weapon

pull/3/head
John Montagu, the 4th Earl of Sandvich 2023-05-28 17:54:48 -07:00
parent 423c3e3b17
commit 9c763357b9
Signed by: sandvich
GPG Key ID: 9A39BE37E602B22D
9 changed files with 78 additions and 39 deletions

View File

@ -159,6 +159,14 @@ namespace SupaLidlGame.Characters
} }
} }
public void LookTowardsDirection()
{
if (!Direction.IsZeroApprox())
{
Target = Direction;
}
}
public virtual void _on_hurtbox_received_damage( public virtual void _on_hurtbox_received_damage(
float damage, float damage,
Character inflictor, Character inflictor,

View File

@ -216,7 +216,7 @@ namespace SupaLidlGame.Characters
float dist = GlobalPosition.DistanceSquaredTo(pos); float dist = GlobalPosition.DistanceSquaredTo(pos);
UpdateWeights(pos); UpdateWeights(pos);
if (Target.LengthSquared() < 1024) if (dist < 1024)
{ {
if (Inventory.SelectedItem is Weapon weapon) if (Inventory.SelectedItem is Weapon weapon)
{ {

View File

@ -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="Script" path="res://Characters/Player.cs" id="1_flygr"]
[ext_resource type="Shader" path="res://Shaders/Flash.gdshader" id="2_ngsgt"] [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://Items/Inventory.cs" id="7_xyenu"]
[ext_resource type="Script" path="res://State/Character/PlayerRollState.cs" id="8_fy0v5"] [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://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"] [ext_resource type="AudioStream" uid="uid://njun3e6v4854" path="res://Assets/Sounds/hurt.wav" id="12_h0x0g"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_h78y7"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_h78y7"]
@ -209,6 +210,8 @@ InventoryMap = {
"equip_2": 1 "equip_2": 1
} }
[node name="Railgun" parent="Inventory" instance=ExtResource("10_7kb8b")]
[node name="Node2D" parent="Inventory" instance=ExtResource("7_4rxuv")] [node name="Node2D" parent="Inventory" instance=ExtResource("7_4rxuv")]
[node name="Hurtbox" parent="." instance=ExtResource("9_avyu4")] [node name="Hurtbox" parent="." instance=ExtResource("9_avyu4")]

View File

@ -35,20 +35,31 @@ namespace SupaLidlGame.Items
[Export] [Export]
public float InitialVelocity { get; set; } = 0; public float InitialVelocity { get; set; } = 0;
/// <summary>
/// Hides the weapon if it is idle (i.e. not being used).
/// </summary>
[Export] [Export]
public bool ShouldHideIdle { get; set; } = false; public bool ShouldHideIdle { get; set; } = false;
/// <summary>
/// Freezes the player's target angle if this weapon is being used.
/// </summary>
[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 virtual bool IsParryable { get; protected set; } = false;
public bool IsParried { get; set; } public bool IsParried { get; set; }
public Character Character { get; set; } public Character Character { get; set; }
[Export] public Vector2 UseDirection { get; set; }
public float MinDistanceHint { get; set; }
[Export]
public float MaxDistanceHint { get; set; }
public override bool StacksWith(Item item) => false; public override bool StacksWith(Item item) => false;

View File

@ -27,9 +27,10 @@ UseTime = 1.0
script = ExtResource("1_xynim") script = ExtResource("1_xynim")
InitialState = NodePath("Idle") 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") script = ExtResource("2_a4hhy")
FireState = NodePath("../Fire") FireState = NodePath("../Fire")
Weapon = NodePath("../..")
[node name="Fire" type="Node" parent="State" node_paths=PackedStringArray("Weapon", "IdleState")] [node name="Fire" type="Node" parent="State" node_paths=PackedStringArray("Weapon", "IdleState")]
script = ExtResource("3_dcbnq") script = ExtResource("3_dcbnq")

View File

@ -20,6 +20,27 @@ namespace SupaLidlGame.State.Character
{ {
Character.StunTime -= delta; 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; return null;
} }

View File

@ -30,47 +30,41 @@ namespace SupaLidlGame.State.Character
{ {
Character.Direction = Godot.Input.GetVector("ui_left", "ui_right", Character.Direction = Godot.Input.GetVector("ui_left", "ui_right",
"ui_up", "ui_down"); "ui_up", "ui_down");
Character.LookTowardsDirection();
Vector2 mousePos = Character.GetGlobalMousePosition(); Vector2 mousePos = Character.GetGlobalMousePosition();
Vector2 dirToMouse = Character.GlobalPosition.DirectionTo(mousePos); Vector2 dirToMouse = Character.GlobalPosition.DirectionTo(mousePos);
bool faceToDir = !Character.Direction.IsZeroApprox(); bool targetTowards(Items.Item item)
{
if (Character.Inventory.SelectedItem is Items.Weapon weapon) if (Character.Inventory.SelectedItem is Items.Weapon weapon)
{ {
if (!weapon.IsUsing) if (!weapon.IsUsing)
{ {
if (weapon.ShouldHideIdle) var isPressed = Godot.Input.IsActionPressed("attack1");
{ var ret = false;
faceToDir = true;
} if (!weapon.ShouldHideIdle || isPressed)
else
{ {
Character.Target = dirToMouse; Character.Target = dirToMouse;
} ret = true;
}
else
{
faceToDir = false;
}
} }
if (faceToDir) if (isPressed)
{ {
Character.Target = Character.Direction;
}
if (Godot.Input.IsActionPressed("attack1"))
{
var item = Character.Inventory.SelectedItem;
if (item is not null)
{
if (!item.IsUsing)
{
Character.Target = dirToMouse;
}
Character.UseCurrentItem(); Character.UseCurrentItem();
} }
return ret;
} }
}
return false;
}
var item = Character.Inventory.SelectedItem;
var offhand = Character.Inventory.OffhandItem;
var _ = targetTowards(item) || targetTowards(offhand);
return base.Process(delta); return base.Process(delta);
} }

View File

@ -17,6 +17,7 @@ namespace SupaLidlGame.State.Weapon
//_timeLeft //_timeLeft
_timeLeft = Weapon.UseTime; _timeLeft = Weapon.UseTime;
Weapon.Attack(); Weapon.Attack();
Weapon.UseDirection = Weapon.Character.Target;
return null; return null;
} }

View File

@ -40,7 +40,7 @@ namespace SupaLidlGame.State.Weapon
_attackAnimDuration = Sword.AttackAnimationDuration; _attackAnimDuration = Sword.AttackAnimationDuration;
Sword.Visible = true; Sword.Visible = true;
Sword.UseDirection = Sword.Character.Target;
return null; return null;
} }