sword weapon
parent
ae9f0bbd39
commit
2c4275eac1
|
@ -1,37 +1,54 @@
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Godot;
|
using Godot;
|
||||||
using SupaLidlGame.Characters;
|
using SupaLidlGame.Characters;
|
||||||
|
using SupaLidlGame.Utils;
|
||||||
|
|
||||||
namespace SupaLidlGame.BoundingBoxes
|
namespace SupaLidlGame.BoundingBoxes
|
||||||
{
|
{
|
||||||
public partial class Hitbox : Area2D
|
public partial class Hitbox : Area2D, IFaction
|
||||||
{
|
{
|
||||||
private HashSet<Hurtbox> _ignoreList = new HashSet<Hurtbox>();
|
private HashSet<Hurtbox> _ignoreList = new HashSet<Hurtbox>();
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
public float Damage { get; set; } = 0;
|
public float Damage { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Getter/setter for the CollisionShape2D's Disabled property.
|
||||||
|
/// </summary>
|
||||||
[Export]
|
[Export]
|
||||||
public bool IsEnabled { get; set; }
|
public bool IsDisabled
|
||||||
|
{
|
||||||
|
get => _collisionShape.Disabled;
|
||||||
|
set => _collisionShape.Disabled = value;
|
||||||
|
}
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
public float Knockback { get; set; }
|
public float Knockback { get; set; }
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public ushort Faction { get; set; }
|
||||||
|
|
||||||
public Character Inflictor { get; set; }
|
public Character Inflictor { get; set; }
|
||||||
|
|
||||||
|
private CollisionShape2D _collisionShape;
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
_collisionShape = GetNode<CollisionShape2D>("CollisionShape2D");
|
||||||
|
}
|
||||||
|
|
||||||
public void _on_area_entered(Area2D area)
|
public void _on_area_entered(Area2D area)
|
||||||
{
|
{
|
||||||
if (!IsEnabled)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (area is Hurtbox hurtbox)
|
if (area is Hurtbox hurtbox)
|
||||||
{
|
{
|
||||||
if (!_ignoreList.Contains(hurtbox))
|
// we don't want to hurt teammates
|
||||||
|
if (Faction != hurtbox.Faction)
|
||||||
{
|
{
|
||||||
_ignoreList.Add(hurtbox);
|
if (!_ignoreList.Contains(hurtbox))
|
||||||
hurtbox.InflictDamage(Damage, Inflictor, Knockback);
|
{
|
||||||
|
_ignoreList.Add(hurtbox);
|
||||||
|
hurtbox.InflictDamage(Damage, Inflictor, Knockback);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,29 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
using SupaLidlGame.Characters;
|
using SupaLidlGame.Characters;
|
||||||
|
using SupaLidlGame.Utils;
|
||||||
|
|
||||||
namespace SupaLidlGame.BoundingBoxes
|
namespace SupaLidlGame.BoundingBoxes
|
||||||
{
|
{
|
||||||
public partial class Hurtbox : Area2D
|
public partial class Hurtbox : Area2D, IFaction
|
||||||
{
|
{
|
||||||
[Signal]
|
[Signal]
|
||||||
public delegate void ReceivedDamageEventHandler(float damage);
|
public delegate void ReceivedDamageEventHandler(
|
||||||
|
float damage,
|
||||||
|
Character inflictor,
|
||||||
|
float knockback,
|
||||||
|
Vector2 knockbackOrigin = default,
|
||||||
|
Vector2 knockbackVector = default);
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public ushort Faction { get; set; }
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
if (Faction == default && GetParent() is IFaction factionEntity)
|
||||||
|
{
|
||||||
|
Faction = factionEntity.Faction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void InflictDamage(
|
public void InflictDamage(
|
||||||
float damage,
|
float damage,
|
||||||
|
@ -16,7 +33,7 @@ namespace SupaLidlGame.BoundingBoxes
|
||||||
Vector2 knockbackVector = default)
|
Vector2 knockbackVector = default)
|
||||||
{
|
{
|
||||||
EmitSignal(
|
EmitSignal(
|
||||||
"ReceivedDamage",
|
SignalName.ReceivedDamage,
|
||||||
damage,
|
damage,
|
||||||
inflictor,
|
inflictor,
|
||||||
knockback,
|
knockback,
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using SupaLidlGame.Items;
|
||||||
|
using SupaLidlGame.Utils;
|
||||||
|
|
||||||
namespace SupaLidlGame.Characters
|
namespace SupaLidlGame.Characters
|
||||||
{
|
{
|
||||||
public partial class Character : CharacterBody2D
|
public partial class Character : CharacterBody2D, IFaction
|
||||||
{
|
{
|
||||||
[Export]
|
[Export]
|
||||||
public float Speed { get; protected set; } = 32.0f;
|
public float Speed { get; protected set; } = 32.0f;
|
||||||
|
@ -30,17 +32,50 @@ namespace SupaLidlGame.Characters
|
||||||
|
|
||||||
public Vector2 Target { get; set; } = Vector2.Zero;
|
public Vector2 Target { get; set; } = Vector2.Zero;
|
||||||
|
|
||||||
public float Health { get; set; }
|
public float Health
|
||||||
|
{
|
||||||
|
get => _health;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
if (!IsAlive && value < 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_health = value;
|
||||||
|
GD.Print(_health);
|
||||||
|
if (_health <= 0)
|
||||||
|
{
|
||||||
|
Die();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected float _health = 100f;
|
||||||
|
|
||||||
|
public bool IsAlive => Health > 0;
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public AnimatedSprite2D Sprite { get; set; }
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public Inventory Inventory { get; set; }
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
public State.Machine StateMachine { get; set; }
|
public State.Machine StateMachine { get; set; }
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public ushort Faction { get; set; }
|
||||||
|
|
||||||
public override void _Process(double delta)
|
public override void _Process(double delta)
|
||||||
{
|
{
|
||||||
if (StateMachine != null)
|
if (StateMachine != null)
|
||||||
{
|
{
|
||||||
StateMachine.Process(delta);
|
StateMachine.Process(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Sprite.FlipH = Target.x < 0;
|
||||||
|
DrawTarget();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void _Input(InputEvent @event)
|
public override void _Input(InputEvent @event)
|
||||||
|
@ -59,6 +94,20 @@ namespace SupaLidlGame.Characters
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Modify the <c>Character</c>'s velocity
|
||||||
|
/// </summary>
|
||||||
|
public virtual void ModifyVelocity()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual void Die()
|
||||||
|
{
|
||||||
|
GD.Print("lol died");
|
||||||
|
QueueFree();
|
||||||
|
}
|
||||||
|
|
||||||
public void ApplyImpulse(Vector2 impulse, bool resetVelocity = false)
|
public void ApplyImpulse(Vector2 impulse, bool resetVelocity = false)
|
||||||
{
|
{
|
||||||
// delta p = F delta t
|
// delta p = F delta t
|
||||||
|
@ -67,9 +116,45 @@ namespace SupaLidlGame.Characters
|
||||||
Velocity += impulse / Mass;
|
Velocity += impulse / Mass;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void _on_hurtbox_received_damage(float damage)
|
protected void DrawTarget()
|
||||||
|
{
|
||||||
|
Vector2 target = Target;
|
||||||
|
float angle = Mathf.Atan2(target.y, Mathf.Abs(target.x));
|
||||||
|
Vector2 scale = Inventory.Scale;
|
||||||
|
if (target.x < 0)
|
||||||
|
{
|
||||||
|
scale.y = -1;
|
||||||
|
angle = Mathf.Pi - angle;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
scale.y = 1;
|
||||||
|
}
|
||||||
|
Inventory.Scale = scale;
|
||||||
|
Inventory.Rotation = angle;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void _on_hurtbox_received_damage(float damage,
|
||||||
|
Character inflictor,
|
||||||
|
float knockback,
|
||||||
|
Vector2 knockbackOrigin = default,
|
||||||
|
Vector2 knockbackVector = default)
|
||||||
{
|
{
|
||||||
Health -= damage;
|
Health -= damage;
|
||||||
|
/*
|
||||||
|
Vector2 knockbackDir = knockbackVector;
|
||||||
|
if (knockbackDir == default)
|
||||||
|
{
|
||||||
|
if (knockbackOrigin == default)
|
||||||
|
{
|
||||||
|
knockbackOrigin = inflictor.GlobalPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
knockbackDir = knockbackOrigin.DirectionTo(GlobalPosition);
|
||||||
|
}
|
||||||
|
|
||||||
|
ApplyImpulse(knockback.)
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,5 +5,15 @@ namespace SupaLidlGame.Characters
|
||||||
{
|
{
|
||||||
public partial class Enemy : NPC
|
public partial class Enemy : NPC
|
||||||
{
|
{
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
Inventory.SelectedItem = Inventory.GetNode<Items.Item>("Sword");
|
||||||
|
base._Ready();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Die()
|
||||||
|
{
|
||||||
|
base.Die();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,74 @@
|
||||||
[gd_scene load_steps=9 format=3 uid="uid://dymwd5ihpwyqm"]
|
[gd_scene load_steps=19 format=3 uid="uid://dymwd5ihpwyqm"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://Characters/NPC.cs" id="1_4x3dm"]
|
[ext_resource type="Script" path="res://Characters/Enemy.cs" id="1_2yopk"]
|
||||||
[ext_resource type="Texture2D" uid="uid://bw052v8ikfget" path="res://icon.svg" id="2_ujqd7"]
|
[ext_resource type="Texture2D" uid="uid://dxymfduyrbuvx" path="res://Sprites/Characters/forsen.png" id="2_jfku3"]
|
||||||
[ext_resource type="Script" path="res://Characters/States/Machine.cs" id="3_k4ypw"]
|
[ext_resource type="Script" path="res://Characters/States/Machine.cs" id="3_k4ypw"]
|
||||||
[ext_resource type="Script" path="res://Characters/States/NPCIdleState.cs" id="4_8r2qn"]
|
[ext_resource type="Script" path="res://Characters/States/NPCIdleState.cs" id="4_8r2qn"]
|
||||||
[ext_resource type="Script" path="res://Characters/States/NPCMoveState.cs" id="5_utogm"]
|
[ext_resource type="Script" path="res://Characters/States/NPCMoveState.cs" id="5_utogm"]
|
||||||
[ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="6_jo0cg"]
|
[ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="6_jo0cg"]
|
||||||
|
[ext_resource type="Script" path="res://Items/Inventory.cs" id="7_43gq8"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cajlwb67xenfy" path="res://Items/Weapons/Sword.tscn" id="8_s3c8r"]
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_6d2tf"]
|
||||||
|
atlas = ExtResource("2_jfku3")
|
||||||
|
region = Rect2(0, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_bdyma"]
|
||||||
|
atlas = ExtResource("2_jfku3")
|
||||||
|
region = Rect2(24, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_0dwbr"]
|
||||||
|
atlas = ExtResource("2_jfku3")
|
||||||
|
region = Rect2(48, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_r7fn6"]
|
||||||
|
atlas = ExtResource("2_jfku3")
|
||||||
|
region = Rect2(72, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_py8k0"]
|
||||||
|
atlas = ExtResource("2_jfku3")
|
||||||
|
region = Rect2(96, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_g3nb2"]
|
||||||
|
atlas = ExtResource("2_jfku3")
|
||||||
|
region = Rect2(120, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_jauql"]
|
||||||
|
atlas = ExtResource("2_jfku3")
|
||||||
|
region = Rect2(144, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="SpriteFrames" id="SpriteFrames_4tm2b"]
|
||||||
|
animations = [{
|
||||||
|
"frames": [SubResource("AtlasTexture_6d2tf"), SubResource("AtlasTexture_bdyma")],
|
||||||
|
"loop": true,
|
||||||
|
"name": &"idle",
|
||||||
|
"speed": 5.0
|
||||||
|
}, {
|
||||||
|
"frames": [SubResource("AtlasTexture_0dwbr"), SubResource("AtlasTexture_r7fn6"), SubResource("AtlasTexture_py8k0"), SubResource("AtlasTexture_g3nb2"), SubResource("AtlasTexture_jauql")],
|
||||||
|
"loop": true,
|
||||||
|
"name": &"move",
|
||||||
|
"speed": 12.0
|
||||||
|
}]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_uict5"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_uict5"]
|
||||||
size = Vector2(32, 16)
|
size = Vector2(16, 8)
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_8lxmf"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_8lxmf"]
|
||||||
size = Vector2(32, 32)
|
size = Vector2(16, 24)
|
||||||
|
|
||||||
[node name="ExampleEnemy" type="CharacterBody2D" node_paths=PackedStringArray("StateMachine")]
|
[node name="ExampleEnemy" type="CharacterBody2D" node_paths=PackedStringArray("Sprite", "Inventory", "StateMachine")]
|
||||||
script = ExtResource("1_4x3dm")
|
texture_filter = 3
|
||||||
|
y_sort_enabled = true
|
||||||
|
script = ExtResource("1_2yopk")
|
||||||
|
Sprite = NodePath("Sprite")
|
||||||
|
Inventory = NodePath("Inventory")
|
||||||
StateMachine = NodePath("StateMachine")
|
StateMachine = NodePath("StateMachine")
|
||||||
|
Faction = 2
|
||||||
|
|
||||||
[node name="Icon" type="Sprite2D" parent="."]
|
[node name="Sprite" type="AnimatedSprite2D" parent="."]
|
||||||
scale = Vector2(0.25, 0.25)
|
frames = SubResource("SpriteFrames_4tm2b")
|
||||||
texture = ExtResource("2_ujqd7")
|
animation = &"move"
|
||||||
|
playing = true
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||||
position = Vector2(0, 8)
|
position = Vector2(0, 8)
|
||||||
|
@ -39,10 +88,17 @@ script = ExtResource("5_utogm")
|
||||||
IdleState = NodePath("../Idle")
|
IdleState = NodePath("../Idle")
|
||||||
|
|
||||||
[node name="Hurtbox" parent="." instance=ExtResource("6_jo0cg")]
|
[node name="Hurtbox" parent="." instance=ExtResource("6_jo0cg")]
|
||||||
|
Faction = 2
|
||||||
|
|
||||||
[node name="CollisionShape2D" parent="Hurtbox" index="0"]
|
[node name="CollisionShape2D" parent="Hurtbox" index="0"]
|
||||||
shape = SubResource("RectangleShape2D_8lxmf")
|
shape = SubResource("RectangleShape2D_8lxmf")
|
||||||
|
|
||||||
|
[node name="Inventory" type="Node2D" parent="."]
|
||||||
|
y_sort_enabled = true
|
||||||
|
script = ExtResource("7_43gq8")
|
||||||
|
|
||||||
|
[node name="Sword" parent="Inventory" instance=ExtResource("8_s3c8r")]
|
||||||
|
|
||||||
[connection signal="ReceivedDamage" from="Hurtbox" to="." method="_on_hurtbox_received_damage"]
|
[connection signal="ReceivedDamage" from="Hurtbox" to="." method="_on_hurtbox_received_damage"]
|
||||||
|
|
||||||
[editable path="Hurtbox"]
|
[editable path="Hurtbox"]
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using SupaLidlGame.Items;
|
||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace SupaLidlGame.Characters
|
namespace SupaLidlGame.Characters
|
||||||
|
@ -8,7 +9,7 @@ namespace SupaLidlGame.Characters
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Time in seconds it takes for the NPC to think FeelsDankCube
|
/// Time in seconds it takes for the NPC to think FeelsDankCube
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const float ThinkTime = 0.25f;
|
public const float ThinkTime = 0.125f;
|
||||||
|
|
||||||
public float[] Weights => _weights;
|
public float[] Weights => _weights;
|
||||||
|
|
||||||
|
@ -71,7 +72,7 @@ namespace SupaLidlGame.Characters
|
||||||
Character bestChar = null;
|
Character bestChar = null;
|
||||||
foreach (Node node in GetParent().GetChildren())
|
foreach (Node node in GetParent().GetChildren())
|
||||||
{
|
{
|
||||||
if (node != this && node is Player character)
|
if (node is Character character && character.Faction != Faction)
|
||||||
{
|
{
|
||||||
float dist = Position.DistanceTo(character.Position);
|
float dist = Position.DistanceTo(character.Position);
|
||||||
if (dist < bestDist)
|
if (dist < bestDist)
|
||||||
|
@ -95,12 +96,23 @@ namespace SupaLidlGame.Characters
|
||||||
Direction = _weightDirs[_bestWeightIdx];
|
Direction = _weightDirs[_bestWeightIdx];
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Think()
|
protected virtual void Think()
|
||||||
{
|
{
|
||||||
Vector2 pos = FindBestTarget().GlobalPosition;
|
Vector2 pos = FindBestTarget().GlobalPosition;
|
||||||
Vector2 dir = Target = GlobalPosition.DirectionTo(pos);
|
Target = pos - GlobalPosition;//GlobalPosition.DirectionTo(pos);
|
||||||
|
Vector2 dir = Target.Normalized();
|
||||||
float dist = GlobalPosition.DistanceSquaredTo(pos);
|
float dist = GlobalPosition.DistanceSquaredTo(pos);
|
||||||
|
|
||||||
|
if (Target.LengthSquared() < 1024)
|
||||||
|
{
|
||||||
|
GD.Print("lol");
|
||||||
|
if (Inventory.SelectedItem is Weapon weapon)
|
||||||
|
{
|
||||||
|
GD.Print("use");
|
||||||
|
weapon.Use();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (int i = 0; i < 16; i++)
|
for (int i = 0; i < 16; i++)
|
||||||
{
|
{
|
||||||
float directDot = _weightDirs[i].Dot(dir);
|
float directDot = _weightDirs[i].Dot(dir);
|
||||||
|
@ -122,17 +134,19 @@ namespace SupaLidlGame.Characters
|
||||||
// "When will I use math in the real world" Clueful
|
// "When will I use math in the real world" Clueful
|
||||||
|
|
||||||
|
|
||||||
if (dist > 1024)
|
if (dist > 4096)
|
||||||
{
|
{
|
||||||
_weights[i] = directDot;
|
_weights[i] = directDot;
|
||||||
}
|
}
|
||||||
else if (dist > 64)
|
else if (dist > 64)
|
||||||
{
|
{
|
||||||
float directDotWeighting = (dist - 64) / 960;
|
//float directDotWeighting = dist / 4096;
|
||||||
|
//float directDotWeighting = Mathf.Log(dist) / _log1024;
|
||||||
|
float directDotWeighting = Mathf.Sqrt(dist / 4096);
|
||||||
float horizDotWeighting = 1 - directDotWeighting;
|
float horizDotWeighting = 1 - directDotWeighting;
|
||||||
|
|
||||||
_weights[i] = (directDot * directDotWeighting) +
|
_weights[i] = (directDot * directDotWeighting) +
|
||||||
(horizDot * horizDotWeighting);
|
(horizDot * horizDotWeighting * 0.5f);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -169,7 +183,7 @@ namespace SupaLidlGame.Characters
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
float dot = _weightDirs[i].Dot(_weightDirs[j]);
|
float dot = _weightDirs[i].Dot(_weightDirs[j]) / 2;
|
||||||
_weights[j] -= (dot + 1) / 2;
|
_weights[j] -= (dot + 1) / 2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,63 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
using System;
|
using SupaLidlGame.Items;
|
||||||
|
|
||||||
namespace SupaLidlGame.Characters
|
namespace SupaLidlGame.Characters
|
||||||
{
|
{
|
||||||
public partial class Player : Character
|
public partial class Player : Character
|
||||||
{
|
{
|
||||||
|
private AnimatedSprite2D _sprite;
|
||||||
|
private string _spriteAnim;
|
||||||
|
|
||||||
|
public string Animation
|
||||||
|
{
|
||||||
|
get => _sprite.Animation;
|
||||||
|
set
|
||||||
|
{
|
||||||
|
// the Player.Animation property might be set before this node is
|
||||||
|
// even ready, so if _sprite is null, then we just hold the new
|
||||||
|
// animation in a temp value, which will be assigned once this
|
||||||
|
// node is ready
|
||||||
|
if (_sprite is null)
|
||||||
|
{
|
||||||
|
_spriteAnim = value;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_sprite.Animation = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
|
_sprite = GetNode<AnimatedSprite2D>("Sprite");
|
||||||
|
if (_spriteAnim != default)
|
||||||
|
{
|
||||||
|
_sprite.Animation = _spriteAnim;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void ModifyVelocity()
|
||||||
|
{
|
||||||
|
if (StateMachine.State is State.PlayerRollState)
|
||||||
|
{
|
||||||
|
Velocity *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Inventory.SelectedItem is Weapon weapon)
|
||||||
|
{
|
||||||
|
/*if (weapon is Sword sword)
|
||||||
|
{
|
||||||
|
if (sword.IsAttacking)
|
||||||
|
{
|
||||||
|
Velocity *= 0.5f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else*/
|
||||||
|
if (weapon.IsUsing)
|
||||||
|
{
|
||||||
|
Velocity *= 0.75f;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +1,81 @@
|
||||||
[gd_scene load_steps=11 format=3 uid="uid://bncaar8vp3b84"]
|
[gd_scene load_steps=22 format=3 uid="uid://bncaar8vp3b84"]
|
||||||
|
|
||||||
[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="Texture2D" uid="uid://bw052v8ikfget" path="res://icon.svg" id="2_xmgd1"]
|
[ext_resource type="Texture2D" uid="uid://dxymfduyrbuvx" path="res://Sprites/Characters/forsen.png" id="2_swjho"]
|
||||||
[ext_resource type="Script" path="res://Characters/States/Machine.cs" id="3_npkjp"]
|
[ext_resource type="Script" path="res://Characters/States/Machine.cs" id="3_npkjp"]
|
||||||
[ext_resource type="Script" path="res://Characters/States/PlayerIdleState.cs" id="4_4k4mb"]
|
[ext_resource type="Script" path="res://Characters/States/PlayerIdleState.cs" id="4_4k4mb"]
|
||||||
[ext_resource type="Script" path="res://Characters/States/PlayerMoveState.cs" id="5_tx5rw"]
|
[ext_resource type="Script" path="res://Characters/States/PlayerMoveState.cs" id="5_tx5rw"]
|
||||||
[ext_resource type="Script" path="res://Characters/States/PlayerRollState.cs" id="6_6bgrj"]
|
[ext_resource type="Script" path="res://Characters/States/PlayerRollState.cs" id="6_6bgrj"]
|
||||||
|
[ext_resource type="Script" path="res://Characters/States/PlayerAttackState.cs" id="7_4cuhw"]
|
||||||
[ext_resource type="PackedScene" uid="uid://cajlwb67xenfy" path="res://Items/Weapons/Sword.tscn" id="7_4rxuv"]
|
[ext_resource type="PackedScene" uid="uid://cajlwb67xenfy" path="res://Items/Weapons/Sword.tscn" id="7_4rxuv"]
|
||||||
[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="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="9_avyu4"]
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_us1ce"]
|
||||||
|
atlas = ExtResource("2_swjho")
|
||||||
|
region = Rect2(0, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_hn4kf"]
|
||||||
|
atlas = ExtResource("2_swjho")
|
||||||
|
region = Rect2(24, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_wfbeq"]
|
||||||
|
atlas = ExtResource("2_swjho")
|
||||||
|
region = Rect2(48, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_qlmwk"]
|
||||||
|
atlas = ExtResource("2_swjho")
|
||||||
|
region = Rect2(72, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_l1vgu"]
|
||||||
|
atlas = ExtResource("2_swjho")
|
||||||
|
region = Rect2(96, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_ytlaa"]
|
||||||
|
atlas = ExtResource("2_swjho")
|
||||||
|
region = Rect2(120, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="AtlasTexture" id="AtlasTexture_1q30d"]
|
||||||
|
atlas = ExtResource("2_swjho")
|
||||||
|
region = Rect2(144, 0, 24, 24)
|
||||||
|
|
||||||
|
[sub_resource type="SpriteFrames" id="SpriteFrames_2h7cf"]
|
||||||
|
animations = [{
|
||||||
|
"frames": [SubResource("AtlasTexture_us1ce"), SubResource("AtlasTexture_hn4kf")],
|
||||||
|
"loop": true,
|
||||||
|
"name": &"idle",
|
||||||
|
"speed": 5.0
|
||||||
|
}, {
|
||||||
|
"frames": [SubResource("AtlasTexture_wfbeq"), SubResource("AtlasTexture_qlmwk"), SubResource("AtlasTexture_l1vgu"), SubResource("AtlasTexture_ytlaa"), SubResource("AtlasTexture_1q30d")],
|
||||||
|
"loop": true,
|
||||||
|
"name": &"move",
|
||||||
|
"speed": 12.0
|
||||||
|
}]
|
||||||
|
|
||||||
[sub_resource type="RectangleShape2D" id="RectangleShape2D_bfqew"]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_bfqew"]
|
||||||
size = Vector2(32, 16)
|
size = Vector2(16, 8)
|
||||||
|
|
||||||
[sub_resource type="LabelSettings" id="LabelSettings_q5h1n"]
|
[sub_resource type="LabelSettings" id="LabelSettings_q5h1n"]
|
||||||
font_size = 24
|
font_size = 24
|
||||||
|
|
||||||
[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("StateMachine")]
|
[sub_resource type="RectangleShape2D" id="RectangleShape2D_cjk6b"]
|
||||||
|
size = Vector2(16, 24)
|
||||||
|
|
||||||
|
[node name="Player" type="CharacterBody2D" node_paths=PackedStringArray("Sprite", "Inventory", "StateMachine")]
|
||||||
|
texture_filter = 3
|
||||||
|
y_sort_enabled = true
|
||||||
script = ExtResource("1_flygr")
|
script = ExtResource("1_flygr")
|
||||||
Speed = 64.0
|
Speed = 64.0
|
||||||
|
Mass = 1.0
|
||||||
|
Sprite = NodePath("Sprite")
|
||||||
|
Inventory = NodePath("Inventory")
|
||||||
StateMachine = NodePath("StateMachine")
|
StateMachine = NodePath("StateMachine")
|
||||||
|
Faction = 1
|
||||||
|
|
||||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
[node name="Sprite" type="AnimatedSprite2D" parent="."]
|
||||||
scale = Vector2(0.25, 0.25)
|
frames = SubResource("SpriteFrames_2h7cf")
|
||||||
texture = ExtResource("2_xmgd1")
|
animation = &"move"
|
||||||
|
playing = true
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||||
position = Vector2(0, 8)
|
position = Vector2(0, 8)
|
||||||
|
@ -38,19 +91,24 @@ InitialState = NodePath("Idle")
|
||||||
Character = NodePath("..")
|
Character = NodePath("..")
|
||||||
DebugLevel = 2
|
DebugLevel = 2
|
||||||
|
|
||||||
[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("MoveState")]
|
[node name="Idle" type="Node" parent="StateMachine" node_paths=PackedStringArray("MoveState", "IdleState")]
|
||||||
script = ExtResource("4_4k4mb")
|
script = ExtResource("4_4k4mb")
|
||||||
MoveState = NodePath("../Move")
|
MoveState = NodePath("../Move")
|
||||||
|
IdleState = NodePath("")
|
||||||
|
|
||||||
[node name="Move" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState", "RollState")]
|
[node name="Move" type="Node" parent="StateMachine" node_paths=PackedStringArray("RollState", "IdleState")]
|
||||||
script = ExtResource("5_tx5rw")
|
script = ExtResource("5_tx5rw")
|
||||||
IdleState = NodePath("../Idle")
|
|
||||||
RollState = NodePath("../Roll")
|
RollState = NodePath("../Roll")
|
||||||
|
IdleState = NodePath("../Idle")
|
||||||
|
|
||||||
[node name="Roll" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState")]
|
[node name="Roll" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState")]
|
||||||
script = ExtResource("6_6bgrj")
|
script = ExtResource("6_6bgrj")
|
||||||
IdleState = NodePath("../Idle")
|
IdleState = NodePath("../Idle")
|
||||||
|
|
||||||
|
[node name="Attack" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState")]
|
||||||
|
script = ExtResource("7_4cuhw")
|
||||||
|
IdleState = NodePath("../Idle")
|
||||||
|
|
||||||
[node name="Debug" type="Control" parent="."]
|
[node name="Debug" type="Control" parent="."]
|
||||||
layout_mode = 3
|
layout_mode = 3
|
||||||
anchors_preset = 0
|
anchors_preset = 0
|
||||||
|
@ -67,7 +125,17 @@ horizontal_alignment = 1
|
||||||
[node name="Node" type="Node" parent="."]
|
[node name="Node" type="Node" parent="."]
|
||||||
|
|
||||||
[node name="Inventory" type="Node2D" parent="."]
|
[node name="Inventory" type="Node2D" parent="."]
|
||||||
|
y_sort_enabled = true
|
||||||
script = ExtResource("7_xyenu")
|
script = ExtResource("7_xyenu")
|
||||||
|
|
||||||
[node name="Sword" parent="Inventory" instance=ExtResource("7_4rxuv")]
|
[node name="Sword" parent="Inventory" instance=ExtResource("7_4rxuv")]
|
||||||
position = Vector2(21, 0)
|
|
||||||
|
[node name="Hurtbox" parent="." instance=ExtResource("9_avyu4")]
|
||||||
|
Faction = 1
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" parent="Hurtbox" index="0"]
|
||||||
|
shape = SubResource("RectangleShape2D_cjk6b")
|
||||||
|
|
||||||
|
[connection signal="ReceivedDamage" from="Hurtbox" to="." method="_on_hurtbox_received_damage"]
|
||||||
|
|
||||||
|
[editable path="Hurtbox"]
|
||||||
|
|
|
@ -27,6 +27,7 @@ namespace SupaLidlGame.Characters.State
|
||||||
public virtual CharacterState PhysicsProcess(double delta)
|
public virtual CharacterState PhysicsProcess(double delta)
|
||||||
{
|
{
|
||||||
Character.Velocity = Character.Direction * Character.Speed;
|
Character.Velocity = Character.Direction * Character.Speed;
|
||||||
|
Character.ModifyVelocity();
|
||||||
Character.MoveAndSlide();
|
Character.MoveAndSlide();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,9 @@ namespace SupaLidlGame.Characters.State
|
||||||
|
|
||||||
public void ChangeState(CharacterState nextState, bool isProxied = false)
|
public void ChangeState(CharacterState nextState, bool isProxied = false)
|
||||||
{
|
{
|
||||||
|
if (nextState is null)
|
||||||
|
return;
|
||||||
|
|
||||||
if (DebugLevel >= 2)
|
if (DebugLevel >= 2)
|
||||||
{
|
{
|
||||||
if (State is not null)
|
if (State is not null)
|
||||||
|
|
|
@ -16,5 +16,11 @@ namespace SupaLidlGame.Characters.State
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override CharacterState Enter(CharacterState previousState)
|
||||||
|
{
|
||||||
|
Character.Sprite.Play("idle");
|
||||||
|
return base.Enter(previousState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,5 +16,11 @@ namespace SupaLidlGame.Characters.State
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override CharacterState Enter(CharacterState previousState)
|
||||||
|
{
|
||||||
|
Character.Sprite.Play("move");
|
||||||
|
return base.Enter(previousState);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,25 +1,38 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
using Godot.Collections;
|
using SupaLidlGame.Items;
|
||||||
using Godot.NativeInterop;
|
|
||||||
|
|
||||||
namespace SupaLidlGame.Characters.State
|
namespace SupaLidlGame.Characters.State
|
||||||
{
|
{
|
||||||
public partial class PlayerAttackState : PlayerState
|
public partial class PlayerAttackState : PlayerState
|
||||||
{
|
{
|
||||||
[Export]
|
private double _attackTime = 0;
|
||||||
public CharacterState IdleState { get; set; }
|
|
||||||
|
|
||||||
private float _attackTime = 0;
|
|
||||||
|
|
||||||
public override CharacterState Enter(CharacterState previousState)
|
public override CharacterState Enter(CharacterState previousState)
|
||||||
{
|
{
|
||||||
_attackTime = 0;
|
if (Character.Inventory.SelectedItem is Weapon weapon)
|
||||||
|
{
|
||||||
|
_attackTime = weapon.UseTime;
|
||||||
|
weapon.Visible = true;
|
||||||
|
Character.Inventory.SelectedItem.Use();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return IdleState;
|
||||||
|
}
|
||||||
return base.Enter(previousState);
|
return base.Enter(previousState);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Exit(CharacterState nextState)
|
public override void Exit(CharacterState nextState)
|
||||||
{
|
{
|
||||||
_attackTime = 0;
|
if (Character.Inventory.SelectedItem is null)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
Character.Inventory.SelectedItem.Deuse();
|
||||||
|
if (Character.Inventory.SelectedItem is Weapon weapon)
|
||||||
|
{
|
||||||
|
//weapon.Visible = false;
|
||||||
|
}
|
||||||
base.Exit(nextState);
|
base.Exit(nextState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,11 +43,16 @@ namespace SupaLidlGame.Characters.State
|
||||||
|
|
||||||
public override CharacterState PhysicsProcess(double delta)
|
public override CharacterState PhysicsProcess(double delta)
|
||||||
{
|
{
|
||||||
|
Character.Velocity *= 0.5f;
|
||||||
return base.PhysicsProcess(delta);
|
return base.PhysicsProcess(delta);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override CharacterState Process(double delta)
|
public override CharacterState Process(double delta)
|
||||||
{
|
{
|
||||||
|
if ((_attackTime -= delta) <= 0)
|
||||||
|
{
|
||||||
|
return IdleState;
|
||||||
|
}
|
||||||
return base.Process(delta);
|
return base.Process(delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@ namespace SupaLidlGame.Characters.State
|
||||||
GD.Print("Entered idle state");
|
GD.Print("Entered idle state");
|
||||||
if (previousState is not PlayerMoveState)
|
if (previousState is not PlayerMoveState)
|
||||||
{
|
{
|
||||||
if (Character.Direction.LengthSquared() > 0)
|
if (Character.Direction.LengthSquared() > 0.01f)
|
||||||
{
|
{
|
||||||
// other states like attacking or rolling can just delegate
|
// other states like attacking or rolling can just delegate
|
||||||
// the work of checking if the player is moving to this idle
|
// the work of checking if the player is moving to this idle
|
||||||
|
@ -21,6 +21,7 @@ namespace SupaLidlGame.Characters.State
|
||||||
return MoveState;
|
return MoveState;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_player.Animation = "idle";
|
||||||
return base.Enter(previousState);
|
return base.Enter(previousState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,17 @@
|
||||||
using Godot;
|
using Godot;
|
||||||
|
using SupaLidlGame.Items;
|
||||||
|
|
||||||
namespace SupaLidlGame.Characters.State
|
namespace SupaLidlGame.Characters.State
|
||||||
{
|
{
|
||||||
public partial class PlayerMoveState : PlayerState
|
public partial class PlayerMoveState : PlayerState
|
||||||
{
|
{
|
||||||
[Export]
|
[Export]
|
||||||
public CharacterState IdleState { get; set; }
|
public PlayerRollState RollState { get; set; }
|
||||||
|
|
||||||
[Export]
|
|
||||||
public CharacterState RollState { get; set; }
|
|
||||||
|
|
||||||
public override CharacterState Enter(CharacterState previousState)
|
public override CharacterState Enter(CharacterState previousState)
|
||||||
{
|
{
|
||||||
Godot.GD.Print("Started moving");
|
Godot.GD.Print("Started moving");
|
||||||
|
_player.Animation = "move";
|
||||||
return base.Enter(previousState);
|
return base.Enter(previousState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -30,9 +29,19 @@ namespace SupaLidlGame.Characters.State
|
||||||
{
|
{
|
||||||
if (@event.IsActionPressed("roll"))
|
if (@event.IsActionPressed("roll"))
|
||||||
{
|
{
|
||||||
return RollState;
|
if (Character.Inventory.SelectedItem is Weapon weapon)
|
||||||
|
{
|
||||||
|
if (!weapon.IsUsing)
|
||||||
|
{
|
||||||
|
return RollState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return RollState;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return base.Input(@event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,9 +4,6 @@ namespace SupaLidlGame.Characters.State
|
||||||
{
|
{
|
||||||
public partial class PlayerRollState : PlayerState
|
public partial class PlayerRollState : PlayerState
|
||||||
{
|
{
|
||||||
[Export]
|
|
||||||
public CharacterState IdleState { get; set; }
|
|
||||||
|
|
||||||
private double _timeLeftToRoll = 0;
|
private double _timeLeftToRoll = 0;
|
||||||
|
|
||||||
private Vector2 _rollDirection = Vector2.Zero;
|
private Vector2 _rollDirection = Vector2.Zero;
|
||||||
|
@ -16,6 +13,7 @@ namespace SupaLidlGame.Characters.State
|
||||||
_timeLeftToRoll = 0.5;
|
_timeLeftToRoll = 0.5;
|
||||||
// roll the direction we were previously moving in
|
// roll the direction we were previously moving in
|
||||||
_rollDirection = Character.Direction;
|
_rollDirection = Character.Direction;
|
||||||
|
Character.Target = Character.Direction;
|
||||||
return base.Enter(previousState);
|
return base.Enter(previousState);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,11 +36,13 @@ namespace SupaLidlGame.Characters.State
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
public override CharacterState PhysicsProcess(double delta)
|
public override CharacterState PhysicsProcess(double delta)
|
||||||
{
|
{
|
||||||
Character.Velocity = Character.Direction * Character.Speed * 1.5f;
|
Character.Velocity = Character.Direction * Character.Speed * 1.5f;
|
||||||
Character.MoveAndSlide();
|
Character.MoveAndSlide();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
using Godot;
|
||||||
|
using SupaLidlGame.Items;
|
||||||
|
|
||||||
namespace SupaLidlGame.Characters.State
|
namespace SupaLidlGame.Characters.State
|
||||||
{
|
{
|
||||||
public partial class PlayerState : CharacterState
|
public partial class PlayerState : CharacterState
|
||||||
|
@ -5,10 +8,59 @@ namespace SupaLidlGame.Characters.State
|
||||||
//public PlayerMachine PlayerMachine => Machine as PlayerMachine;
|
//public PlayerMachine PlayerMachine => Machine as PlayerMachine;
|
||||||
protected Player _player => Character as Player;
|
protected Player _player => Character as Player;
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public PlayerIdleState IdleState { get; set; }
|
||||||
|
|
||||||
|
public override CharacterState Input(InputEvent @event)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
if (@event is InputEventKey inputEventKey)
|
||||||
|
{
|
||||||
|
GD.Print("hello");
|
||||||
|
if (inputEventKey.Keycode == Key.G)
|
||||||
|
{
|
||||||
|
GD.Print("hi");
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
if (@event.IsActionPressed("equip"))
|
||||||
|
{
|
||||||
|
Character.Inventory.SelectedItem = Character.Inventory.GetNode<Items.Item>("Sword");
|
||||||
|
//Character.Inventory.AddItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (@event.IsActionPressed("attack1"))
|
||||||
|
{
|
||||||
|
if (Character.Inventory.SelectedItem is not null)
|
||||||
|
{
|
||||||
|
Character.Inventory.SelectedItem.Use();
|
||||||
|
//return AttackState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//if (this is PlayerAttackState)
|
||||||
|
//{
|
||||||
|
// if (@event.IsActionReleased("attack1"))
|
||||||
|
// {
|
||||||
|
// return IdleState;
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
|
||||||
|
return base.Input(@event);
|
||||||
|
}
|
||||||
|
|
||||||
public override CharacterState Process(double delta)
|
public override CharacterState Process(double delta)
|
||||||
{
|
{
|
||||||
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");
|
||||||
|
Vector2 mousePos = Character.GetGlobalMousePosition();
|
||||||
|
Vector2 dirToMouse = Character.GlobalPosition.DirectionTo(mousePos);
|
||||||
|
if (Character.Inventory.SelectedItem is Weapon weapon)
|
||||||
|
{
|
||||||
|
if (!weapon.IsUsing)
|
||||||
|
{
|
||||||
|
Character.Target = dirToMouse;
|
||||||
|
}
|
||||||
|
}
|
||||||
return base.Process(delta);
|
return base.Process(delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,11 @@ namespace SupaLidlGame.Items
|
||||||
|
|
||||||
_selectedItem = value;
|
_selectedItem = value;
|
||||||
|
|
||||||
_selectedItem.Equip(Character);
|
// this is to handle if item was manually unequipped
|
||||||
|
if (_selectedItem is not null)
|
||||||
|
{
|
||||||
|
_selectedItem.Equip(Character);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,23 +47,27 @@ namespace SupaLidlGame.Items
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
item.CharacterOwner = Character;
|
||||||
|
item.Visible = false;
|
||||||
Items.Add(item);
|
Items.Add(item);
|
||||||
return item;
|
return item;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Item DropItem(Item item)
|
public Item DropItem(Item item)
|
||||||
{
|
{
|
||||||
|
item.CharacterOwner = null;
|
||||||
|
item.Visible = true;
|
||||||
throw new System.NotImplementedException();
|
throw new System.NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void _Ready()
|
public override void _Ready()
|
||||||
{
|
{
|
||||||
Owner = GetParent<Character>();
|
Character = GetParent<Character>();
|
||||||
foreach (Node child in GetChildren())
|
foreach (Node child in GetChildren())
|
||||||
{
|
{
|
||||||
if (child is Item item)
|
if (child is Item item)
|
||||||
{
|
{
|
||||||
Items.Add(item);
|
AddItem(item);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
base._Ready();
|
base._Ready();
|
||||||
|
|
|
@ -8,6 +8,8 @@ namespace SupaLidlGame.Items
|
||||||
[Export]
|
[Export]
|
||||||
public string Description { get; set; }
|
public string Description { get; set; }
|
||||||
|
|
||||||
|
public Character CharacterOwner { get; set; }
|
||||||
|
|
||||||
public abstract void Equip(Character character);
|
public abstract void Equip(Character character);
|
||||||
|
|
||||||
public abstract void Unequip(Character character);
|
public abstract void Unequip(Character character);
|
||||||
|
|
|
@ -7,7 +7,7 @@ namespace SupaLidlGame.Items
|
||||||
{
|
{
|
||||||
public double RemainingUseTime { get; protected set; } = 0;
|
public double RemainingUseTime { get; protected set; } = 0;
|
||||||
|
|
||||||
public bool CanStartAttack => RemainingUseTime <= 0;
|
public bool IsUsing => RemainingUseTime > 0;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// How much damage in HP that this weapon deals.
|
/// How much damage in HP that this weapon deals.
|
||||||
|
@ -46,9 +46,25 @@ namespace SupaLidlGame.Items
|
||||||
Character = null;
|
Character = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void Use()
|
||||||
|
{
|
||||||
|
RemainingUseTime = UseTime;
|
||||||
|
}
|
||||||
|
|
||||||
public override void Deuse()
|
public override void Deuse()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
if (RemainingUseTime > 0)
|
||||||
|
{
|
||||||
|
if ((RemainingUseTime -= delta) <= 0)
|
||||||
|
{
|
||||||
|
Deuse();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,22 +6,81 @@ namespace SupaLidlGame.Items.Weapons
|
||||||
{
|
{
|
||||||
public partial class Sword : Weapon
|
public partial class Sword : Weapon
|
||||||
{
|
{
|
||||||
|
public double RemainingAttackTime { get; protected set; } = 0;
|
||||||
|
|
||||||
|
public bool IsAttacking => RemainingAttackTime > 0;
|
||||||
|
|
||||||
[Export]
|
[Export]
|
||||||
public Hitbox Hitbox { get; set; }
|
public Hitbox Hitbox { get; set; }
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public AnimationPlayer AnimationPlayer { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The time frame in seconds for which the weapon will deal damage.
|
||||||
|
/// </summary>
|
||||||
|
/// <remarks>
|
||||||
|
/// The value of <c>AttackTime</c> should be less than the
|
||||||
|
/// value of <c>UseTime</c>
|
||||||
|
/// </remarks>
|
||||||
|
[Export]
|
||||||
|
public double AttackTime { get; set; } = 0;
|
||||||
|
|
||||||
public override void Equip(Character character)
|
public override void Equip(Character character)
|
||||||
{
|
{
|
||||||
|
Visible = true;
|
||||||
base.Equip(character);
|
base.Equip(character);
|
||||||
|
Hitbox.Faction = character.Faction; // character is null before base
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void Unequip(Character character)
|
||||||
|
{
|
||||||
|
Visible = false;
|
||||||
|
base.Unequip(character);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Use()
|
public override void Use()
|
||||||
{
|
{
|
||||||
Hitbox.IsEnabled = true;
|
if (RemainingUseTime > 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
RemainingAttackTime = AttackTime;
|
||||||
|
|
||||||
|
AnimationPlayer.Play("use");
|
||||||
|
Hitbox.IsDisabled = false;
|
||||||
|
base.Use();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Deuse()
|
public override void Deuse()
|
||||||
{
|
{
|
||||||
Hitbox.IsEnabled = false;
|
AnimationPlayer.Stop();
|
||||||
|
Deattack();
|
||||||
|
base.Deuse();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void Deattack()
|
||||||
|
{
|
||||||
|
Hitbox.IsDisabled = true;
|
||||||
|
Hitbox.ResetIgnoreList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void _Ready()
|
||||||
|
{
|
||||||
|
Hitbox.Damage = Damage;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
if (RemainingAttackTime > 0)
|
||||||
|
{
|
||||||
|
if ((RemainingAttackTime -= delta) <= 0)
|
||||||
|
{
|
||||||
|
Deattack();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
base._Process(delta);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +1,159 @@
|
||||||
[gd_scene load_steps=5 format=3 uid="uid://cajlwb67xenfy"]
|
[gd_scene load_steps=13 format=3 uid="uid://cajlwb67xenfy"]
|
||||||
|
|
||||||
[ext_resource type="Script" path="res://Items/Weapons/Sword.cs" id="1_mlo73"]
|
[ext_resource type="Script" path="res://Items/Weapons/Sword.cs" id="1_mlo73"]
|
||||||
[ext_resource type="Texture2D" uid="uid://dt6u8p4h6g7le" path="res://Sprites/knife.png" id="2_dmsp2"]
|
[ext_resource type="Texture2D" uid="uid://dt6u8p4h6g7le" path="res://Sprites/knife.png" id="2_dmsp2"]
|
||||||
[ext_resource type="PackedScene" uid="uid://du5vhccg75nrq" path="res://BoundingBoxes/Hitbox.tscn" id="3_up3ob"]
|
[ext_resource type="PackedScene" uid="uid://du5vhccg75nrq" path="res://BoundingBoxes/Hitbox.tscn" id="3_up3ob"]
|
||||||
|
[ext_resource type="PackedScene" uid="uid://cojxmcin13ihm" path="res://Utils/Trail.tscn" id="4_pt6lq"]
|
||||||
|
|
||||||
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_yln58"]
|
[sub_resource type="CapsuleShape2D" id="CapsuleShape2D_yln58"]
|
||||||
radius = 8.0
|
radius = 8.0
|
||||||
height = 24.0
|
height = 32.0
|
||||||
|
|
||||||
[node name="Sword" type="Node2D" node_paths=PackedStringArray("Hitbox")]
|
[sub_resource type="Curve" id="Curve_4cxtp"]
|
||||||
|
_data = [Vector2(0.00687286, 1), 0.0, 0.0, 0, 0, Vector2(0.879725, 0.190909), -2.93145, -2.93145, 0, 0, Vector2(1, 0.0454545), 0.0483926, 0.0, 0, 0]
|
||||||
|
point_count = 3
|
||||||
|
|
||||||
|
[sub_resource type="Gradient" id="Gradient_2ablm"]
|
||||||
|
offsets = PackedFloat32Array(0.835938, 0.992188)
|
||||||
|
colors = PackedColorArray(1, 1, 1, 0.498039, 1, 1, 1, 0)
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_b7327"]
|
||||||
|
length = 0.001
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("Anchor:rotation")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [-0.785398]
|
||||||
|
}
|
||||||
|
tracks/1/type = "value"
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
|
tracks/1/path = NodePath("Anchor/Sprite2D:rotation")
|
||||||
|
tracks/1/interp = 1
|
||||||
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [-1.19209e-07]
|
||||||
|
}
|
||||||
|
tracks/2/type = "value"
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
|
tracks/2/path = NodePath("Anchor/Sprite2D:position")
|
||||||
|
tracks/2/interp = 1
|
||||||
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/keys = {
|
||||||
|
"times": PackedFloat32Array(0),
|
||||||
|
"transitions": PackedFloat32Array(1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector2(8, 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_mv7y2"]
|
||||||
|
resource_name = "idle"
|
||||||
|
|
||||||
|
[sub_resource type="Animation" id="Animation_orc8t"]
|
||||||
|
resource_name = "use"
|
||||||
|
length = 0.5
|
||||||
|
loop_mode = 1
|
||||||
|
step = 0.05
|
||||||
|
tracks/0/type = "value"
|
||||||
|
tracks/0/imported = false
|
||||||
|
tracks/0/enabled = true
|
||||||
|
tracks/0/path = NodePath("Anchor:rotation")
|
||||||
|
tracks/0/interp = 1
|
||||||
|
tracks/0/loop_wrap = true
|
||||||
|
tracks/0/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 0.1, 0.3, 0.5),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [-0.785398, 1.5708, 1.5708, -0.785398]
|
||||||
|
}
|
||||||
|
tracks/1/type = "value"
|
||||||
|
tracks/1/imported = false
|
||||||
|
tracks/1/enabled = true
|
||||||
|
tracks/1/path = NodePath("Anchor/Sprite2D:rotation")
|
||||||
|
tracks/1/interp = 1
|
||||||
|
tracks/1/loop_wrap = true
|
||||||
|
tracks/1/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 0.1, 0.3, 0.5),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [-1.19209e-07, 0.785398, 0.785398, -1.19209e-07]
|
||||||
|
}
|
||||||
|
tracks/2/type = "value"
|
||||||
|
tracks/2/imported = false
|
||||||
|
tracks/2/enabled = true
|
||||||
|
tracks/2/path = NodePath("Anchor/Sprite2D:position")
|
||||||
|
tracks/2/interp = 1
|
||||||
|
tracks/2/loop_wrap = true
|
||||||
|
tracks/2/keys = {
|
||||||
|
"times": PackedFloat32Array(0, 0.1, 0.3, 0.5),
|
||||||
|
"transitions": PackedFloat32Array(1, 1, 1, 1),
|
||||||
|
"update": 0,
|
||||||
|
"values": [Vector2(8, 1), Vector2(12, -1), Vector2(12, -1), Vector2(8, 1)]
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationLibrary" id="AnimationLibrary_tao4k"]
|
||||||
|
_data = {
|
||||||
|
"RESET": SubResource("Animation_b7327"),
|
||||||
|
"idle": SubResource("Animation_mv7y2"),
|
||||||
|
"use": SubResource("Animation_orc8t")
|
||||||
|
}
|
||||||
|
|
||||||
|
[sub_resource type="AnimationNodeAnimation" id="AnimationNodeAnimation_1lid1"]
|
||||||
|
|
||||||
|
[node name="Sword" type="Node2D" node_paths=PackedStringArray("Hitbox", "AnimationPlayer")]
|
||||||
texture_filter = 3
|
texture_filter = 3
|
||||||
|
y_sort_enabled = true
|
||||||
script = ExtResource("1_mlo73")
|
script = ExtResource("1_mlo73")
|
||||||
Hitbox = NodePath("Hitbox")
|
Hitbox = NodePath("Anchor/Sprite2D/Hitbox")
|
||||||
|
AnimationPlayer = NodePath("AnimationPlayer")
|
||||||
|
AttackTime = 0.1
|
||||||
|
Damage = 20.0
|
||||||
|
UseTime = 0.5
|
||||||
|
Description = "A basic sword."
|
||||||
|
|
||||||
[node name="Sprite2D" type="Sprite2D" parent="."]
|
[node name="Anchor" type="Node2D" parent="."]
|
||||||
|
rotation = -0.785398
|
||||||
|
y_sort_enabled = true
|
||||||
|
|
||||||
|
[node name="Sprite2D" type="Sprite2D" parent="Anchor"]
|
||||||
|
position = Vector2(8, 1)
|
||||||
|
y_sort_enabled = true
|
||||||
texture = ExtResource("2_dmsp2")
|
texture = ExtResource("2_dmsp2")
|
||||||
|
|
||||||
[node name="Hitbox" parent="." instance=ExtResource("3_up3ob")]
|
[node name="Hitbox" parent="Anchor/Sprite2D" instance=ExtResource("3_up3ob")]
|
||||||
|
IsDisabled = true
|
||||||
|
|
||||||
[node name="CollisionShape2D" parent="Hitbox" index="0"]
|
[node name="CollisionShape2D" parent="Anchor/Sprite2D/Hitbox" index="0"]
|
||||||
|
position = Vector2(0, -4)
|
||||||
shape = SubResource("CapsuleShape2D_yln58")
|
shape = SubResource("CapsuleShape2D_yln58")
|
||||||
|
disabled = true
|
||||||
|
|
||||||
|
[node name="Trail" parent="Anchor" node_paths=PackedStringArray("Tracking") instance=ExtResource("4_pt6lq")]
|
||||||
|
position = Vector2(2.40734, -0.55655)
|
||||||
|
rotation = 0.945464
|
||||||
|
scale = Vector2(1, 1)
|
||||||
|
width_curve = SubResource("Curve_4cxtp")
|
||||||
|
gradient = SubResource("Gradient_2ablm")
|
||||||
|
Tracking = NodePath("../Sprite2D")
|
||||||
|
|
||||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
[node name="AnimationPlayer" type="AnimationPlayer" parent="."]
|
||||||
|
libraries = {
|
||||||
|
"": SubResource("AnimationLibrary_tao4k")
|
||||||
|
}
|
||||||
|
|
||||||
[editable path="Hitbox"]
|
[node name="AnimationTree" type="AnimationTree" parent="."]
|
||||||
|
tree_root = SubResource("AnimationNodeAnimation_1lid1")
|
||||||
|
anim_player = NodePath("../AnimationPlayer")
|
||||||
|
active = true
|
||||||
|
|
||||||
|
[editable path="Anchor/Sprite2D/Hitbox"]
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
#+TITLE: SupaLidlGame
|
||||||
|
|
||||||
|
Forsen-related game
|
||||||
|
|
||||||
|
*NOTE:* although the latest version at the time of writing is ~4.0.beta5.mono~, this project only works under ~4.0.beta4.mono~. The latest beta removes node exports, which was previously a feature in Beta 4.
|
||||||
|
|
||||||
|
[[https://github.com/godotengine/godot/pull/67055]]
|
|
@ -1109,7 +1109,7 @@ tile_set = SubResource("TileSet_18c7j")
|
||||||
format = 2
|
format = 2
|
||||||
layer_0/name = "Walls"
|
layer_0/name = "Walls"
|
||||||
layer_0/y_sort_enabled = true
|
layer_0/y_sort_enabled = true
|
||||||
layer_0/tile_data = PackedInt32Array(-131067, 458752, 0, 131065, 458752, 0)
|
layer_0/tile_data = PackedInt32Array(131065, 458752, 0, -65531, 458752, 0)
|
||||||
layer_1/name = "Ground 2"
|
layer_1/name = "Ground 2"
|
||||||
layer_1/enabled = true
|
layer_1/enabled = true
|
||||||
layer_1/modulate = Color(1, 1, 1, 1)
|
layer_1/modulate = Color(1, 1, 1, 1)
|
||||||
|
@ -1134,17 +1134,16 @@ layer_3/tile_data = PackedInt32Array(-458765, 393216, 1, -393229, 327680, 0, -39
|
||||||
|
|
||||||
[node name="Player" parent="TileMap" instance=ExtResource("1_m35hr")]
|
[node name="Player" parent="TileMap" instance=ExtResource("1_m35hr")]
|
||||||
position = Vector2(-81, -34)
|
position = Vector2(-81, -34)
|
||||||
scale = Vector2(0.25, 0.25)
|
|
||||||
motion_mode = 1
|
motion_mode = 1
|
||||||
|
|
||||||
[node name="ExampleEnemy" parent="TileMap" instance=ExtResource("2_uti3y")]
|
[node name="ExampleEnemy" parent="TileMap" instance=ExtResource("2_uti3y")]
|
||||||
position = Vector2(-4, 60)
|
position = Vector2(38, 42)
|
||||||
scale = Vector2(0.25, 0.25)
|
scale = Vector2(1.00571, 1)
|
||||||
|
|
||||||
[node name="ExampleEnemy2" parent="TileMap" instance=ExtResource("2_uti3y")]
|
[node name="ExampleEnemy2" parent="TileMap" instance=ExtResource("2_uti3y")]
|
||||||
position = Vector2(-17, -4)
|
position = Vector2(156, 58)
|
||||||
scale = Vector2(0.25, 0.25)
|
scale = Vector2(1.00571, 1)
|
||||||
|
|
||||||
[node name="ExampleEnemy3" parent="TileMap" instance=ExtResource("2_uti3y")]
|
[node name="ExampleEnemy3" parent="TileMap" instance=ExtResource("2_uti3y")]
|
||||||
position = Vector2(34, 25)
|
position = Vector2(175, -15)
|
||||||
scale = Vector2(0.25, 0.25)
|
scale = Vector2(1.00571, 1)
|
||||||
|
|
Binary file not shown.
Binary file not shown.
After Width: | Height: | Size: 3.4 KiB |
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://dxymfduyrbuvx"
|
||||||
|
path="res://.godot/imported/forsen.png-fce73bdb02d4ae9ad3a1c7a29f120a10.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://Sprites/Characters/forsen.png"
|
||||||
|
dest_files=["res://.godot/imported/forsen.png-fce73bdb02d4ae9ad3a1c7a29f120a10.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/bptc_ldr=0
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
|
@ -17,7 +17,6 @@ position = Vector2(377, 214)
|
||||||
texture = ExtResource("1_jh0yt")
|
texture = ExtResource("1_jh0yt")
|
||||||
|
|
||||||
[node name="Hitbox" parent="Node2D" instance=ExtResource("2_gtebh")]
|
[node name="Hitbox" parent="Node2D" instance=ExtResource("2_gtebh")]
|
||||||
IsEnabled = true
|
|
||||||
|
|
||||||
[node name="OscillatingBody" type="CharacterBody2D" parent="."]
|
[node name="OscillatingBody" type="CharacterBody2D" parent="."]
|
||||||
script = ExtResource("3_exvxj")
|
script = ExtResource("3_exvxj")
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
namespace SupaLidlGame.Utils
|
||||||
|
{
|
||||||
|
public interface IFaction
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The faction index that this entity belongs to.
|
||||||
|
/// </summary>
|
||||||
|
[Export]
|
||||||
|
public ushort Faction { get; set; }
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
using Godot;
|
||||||
|
|
||||||
|
public partial class Trail : Line2D
|
||||||
|
{
|
||||||
|
[Export]
|
||||||
|
public int MaximumPoints { get; set; }
|
||||||
|
|
||||||
|
[Export]
|
||||||
|
public Node2D Tracking { get; set; }
|
||||||
|
|
||||||
|
public override void _Process(double delta)
|
||||||
|
{
|
||||||
|
Vector2 point = Tracking.Position;
|
||||||
|
AddPoint(point);
|
||||||
|
|
||||||
|
while (Points.Length > MaximumPoints)
|
||||||
|
{
|
||||||
|
RemovePoint(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
[gd_scene load_steps=2 format=3 uid="uid://cojxmcin13ihm"]
|
||||||
|
|
||||||
|
[ext_resource type="Script" path="res://Utils/Trail.cs" id="1_t42kk"]
|
||||||
|
|
||||||
|
[node name="Trail" type="Line2D"]
|
||||||
|
show_behind_parent = true
|
||||||
|
script = ExtResource("1_t42kk")
|
||||||
|
MaximumPoints = 16
|
|
@ -51,6 +51,16 @@ roll={
|
||||||
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"unicode":0,"echo":false,"script":null)
|
, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"unicode":0,"echo":false,"script":null)
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
attack1={
|
||||||
|
"deadzone": 0.5,
|
||||||
|
"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"pressed":false,"double_click":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
equip={
|
||||||
|
"deadzone": 0.5,
|
||||||
|
"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":69,"unicode":0,"echo":false,"script":null)
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
[physics]
|
[physics]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue