rolling gives invincibility frames

godot-4.2
HumanoidSandvichDispenser 2023-09-17 00:23:18 -07:00
parent b167354ba7
commit 31c66d33ed
Signed by: sandvich
GPG Key ID: 9A39BE37E602B22D
3 changed files with 163 additions and 10 deletions

View File

@ -13,6 +13,11 @@ public sealed partial class Player : Character
private Vector2 _desiredTarget;
private Node2D _effects;
[Node]
private TargetTracer _targetTracer;
public Vector2 DesiredTarget
{
get => _desiredTarget;
@ -26,8 +31,6 @@ public sealed partial class Player : Character
}
}
private TargetTracer _targetTracer;
[Export]
public PlayerCamera Camera { get; set; }
@ -46,6 +49,8 @@ public sealed partial class Player : Character
{
InteractionRay = GetNode<InteractionRay>("Direction2D/InteractionRay");
_effects = GetNode<Node2D>("%Effects");
_targetTracer = GetNode<TargetTracer>("%TargetTracer");
Stats = GetNode<PlayerStats>("Stats");
@ -126,6 +131,25 @@ public sealed partial class Player : Character
Items.Weapon weapon = null,
Vector2 knockbackDir = default)
{
if (StateMachine.CurrentState is State.Character.PlayerRollState)
{
// dodge dots:
// melee:
float dot = Direction.Dot(knockbackDir);
GD.Print(dot);
if (weapon is Items.Weapons.Sword)
{
// if melee weapon then check if dot is away
GD.Print("sword");
if (dot > Utils.Physics.COS_30_DEG)
{
// ignore hit
GD.Print("ignore hit");
return;
}
}
}
if (damage >= 10 && IsAlive)
{
Camera.Shake(2, 0.5f);

View File

@ -1,4 +1,4 @@
[gd_scene load_steps=65 format=3 uid="uid://b2254pup8k161"]
[gd_scene load_steps=70 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"]
@ -8,7 +8,6 @@
[ext_resource type="PackedScene" uid="uid://cl56eadpklnbo" path="res://Utils/PlayerCamera.tscn" id="4_ym125"]
[ext_resource type="Script" path="res://State/Character/CharacterStateMachine.cs" id="5_rgckv"]
[ext_resource type="Script" path="res://Utils/Values/DoubleValue.cs" id="5_txl0r"]
[ext_resource type="Script" path="res://State/Character/CharacterDashState.cs" id="6_rft7p"]
[ext_resource type="Script" path="res://Utils/Values/IntValue.cs" id="6_sunc5"]
[ext_resource type="Script" path="res://State/Character/PlayerIdleState.cs" id="6_wkfdm"]
[ext_resource type="PackedScene" uid="uid://dvqap2uhcah63" path="res://Items/Weapons/Sword.tscn" id="7_4rxuv"]
@ -23,6 +22,7 @@
[ext_resource type="PackedScene" uid="uid://cjgxyhgcyvsv7" path="res://BoundingBoxes/Hurtbox.tscn" id="9_avyu4"]
[ext_resource type="AnimationLibrary" uid="uid://epe31b7x1nt1" path="res://Assets/Animations/player_hurt.res" id="9_g42dl"]
[ext_resource type="Material" uid="uid://ra02tvwd5o5g" path="res://Assets/Sprites/Particles/PlayerDeathProcessMaterial.tres" id="10_agw51"]
[ext_resource type="Script" path="res://State/Character/CharacterDashState.cs" id="10_vsvfh"]
[ext_resource type="AudioStream" uid="uid://bbqdpexvknma2" path="res://Assets/Sounds/never-lucky.mp3" id="12_vd7j4"]
[ext_resource type="AudioStream" uid="uid://bkeyg8weaqnuu" path="res://Assets/Sounds/splat-player.ogg" id="12_vvem5"]
[ext_resource type="AudioStream" uid="uid://cruylv4pu2fo1" path="res://Assets/Sounds/footstep-tile.wav" id="13_bxguv"]
@ -31,10 +31,13 @@
[ext_resource type="PackedScene" uid="uid://p7oijq6dbvvk" path="res://Items/Weapons/DocLance.tscn" id="14_bj0lo"]
[ext_resource type="Texture2D" uid="uid://d1ukste16yq6v" path="res://Assets/Sprites/Particles/player-light.png" id="15_3hahh"]
[ext_resource type="Script" path="res://Utils/DamageTime.cs" id="15_4xl06"]
[ext_resource type="AudioStream" uid="uid://st8qgqiygy5a" path="res://Assets/Sounds/electricity.wav" id="15_61bua"]
[ext_resource type="AudioStream" uid="uid://b1jmusgltouak" path="res://Assets/Sounds/lightning.wav" id="16_fo4my"]
[ext_resource type="PackedScene" uid="uid://g7wfcubs6bdd" path="res://Items/Weapons/Railgun.tscn" id="21_n8w32"]
[ext_resource type="PackedScene" uid="uid://ce0ph4wk0ylra" path="res://UI/TargetTracer.tscn" id="22_hxi53"]
[ext_resource type="PackedScene" uid="uid://5y1acxl4j4n7" path="res://Items/Weapons/Pugio.tscn" id="22_mqpn7"]
[ext_resource type="PackedScene" uid="uid://d1d4vg7we5rjr" path="res://Items/Weapons/Shotgun.tscn" id="22_rmciq"]
[ext_resource type="Texture2D" uid="uid://bcgm3r168qjn3" path="res://Assets/Sprites/Particles/cast-effect.png" id="24_njn4h"]
[ext_resource type="PackedScene" uid="uid://cgg0sfm2qeiwn" path="res://Items/Weapons/Bow.tscn" id="29_7j1fs"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_h78y7"]
@ -245,6 +248,106 @@ tracks/2/keys = {
"update": 1,
"values": [false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("%Effects/Cast:visible")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [false]
}
tracks/4/type = "value"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("%Effects/Cast:frame")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"times": PackedFloat32Array(0),
"transitions": PackedFloat32Array(1),
"update": 1,
"values": [0]
}
[sub_resource type="Animation" id="Animation_dbsas"]
resource_name = "cast"
length = 1.2
tracks/0/type = "value"
tracks/0/imported = false
tracks/0/enabled = true
tracks/0/path = NodePath("%Sprites/Node2D/Character:frame")
tracks/0/interp = 1
tracks/0/loop_wrap = true
tracks/0/keys = {
"times": PackedFloat32Array(0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 1.1),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
"update": 1,
"values": [36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
}
tracks/1/type = "method"
tracks/1/imported = false
tracks/1/enabled = true
tracks/1/path = NodePath("%Animations/..")
tracks/1/interp = 1
tracks/1/loop_wrap = true
tracks/1/keys = {
"times": PackedFloat32Array(0.2, 0.4),
"transitions": PackedFloat32Array(1, 1),
"values": [{
"args": [],
"method": &"Footstep"
}, {
"args": [],
"method": &"Footstep"
}]
}
tracks/2/type = "value"
tracks/2/imported = false
tracks/2/enabled = true
tracks/2/path = NodePath("%Effects/Cast:visible")
tracks/2/interp = 1
tracks/2/loop_wrap = true
tracks/2/keys = {
"times": PackedFloat32Array(0, 0.3, 0.9),
"transitions": PackedFloat32Array(1, 1, 1),
"update": 1,
"values": [false, true, false]
}
tracks/3/type = "value"
tracks/3/imported = false
tracks/3/enabled = true
tracks/3/path = NodePath("%Effects/Cast:frame")
tracks/3/interp = 1
tracks/3/loop_wrap = true
tracks/3/keys = {
"times": PackedFloat32Array(0.3, 0.4, 0.5, 0.6, 0.7, 0.8),
"transitions": PackedFloat32Array(1, 1, 1, 1, 1, 1),
"update": 1,
"values": [0, 1, 2, 3, 4, 5]
}
tracks/4/type = "audio"
tracks/4/imported = false
tracks/4/enabled = true
tracks/4/path = NodePath("%Effects/MaxLevel")
tracks/4/interp = 1
tracks/4/loop_wrap = true
tracks/4/keys = {
"clips": [{
"end_offset": 2.31782,
"start_offset": 0.141459,
"stream": ExtResource("15_61bua")
}, {
"end_offset": 0.0,
"start_offset": 0.0,
"stream": ExtResource("16_fo4my")
}],
"times": PackedFloat32Array(0.075, 0.3)
}
tracks/4/use_blend = true
[sub_resource type="Animation" id="Animation_audkv"]
resource_name = "heal"
@ -353,6 +456,7 @@ tracks/0/keys = {
[sub_resource type="AnimationLibrary" id="AnimationLibrary_73mj7"]
_data = {
"RESET": SubResource("Animation_adxyh"),
"cast": SubResource("Animation_dbsas"),
"heal": SubResource("Animation_audkv"),
"heal_cancel": SubResource("Animation_60iyy"),
"heal_end": SubResource("Animation_dyfl4"),
@ -422,6 +526,9 @@ scale_max = 0.25
color = Color(0, 0, 0, 1)
color_ramp = SubResource("GradientTexture1D_jb8kb")
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_ejdrf"]
light_mode = 1
[sub_resource type="RectangleShape2D" id="RectangleShape2D_bfqew"]
size = Vector2(12, 8)
@ -475,18 +582,17 @@ HealState = NodePath("../Heal")
IdleState = NodePath(".")
Character = NodePath("../..")
[node name="Move" type="Node" parent="StateMachine" node_paths=PackedStringArray("RollState", "DashState", "IdleState", "Character")]
[node name="Move" type="Node" parent="StateMachine" node_paths=PackedStringArray("AbilityState", "IdleState", "Character")]
script = ExtResource("7_dfqd8")
RollState = NodePath("../Roll")
DashState = NodePath("../Dash")
AbilityState = NodePath("../Roll")
IdleState = NodePath("../Idle")
Character = NodePath("../..")
[node name="Dash" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState", "Character")]
script = ExtResource("6_rft7p")
script = ExtResource("10_vsvfh")
IdleState = NodePath("../Idle")
TimeToDash = 0.1
VelocityModifier = 5.0
VelocityModifier = 4.0
Character = NodePath("../..")
[node name="Roll" type="Node" parent="StateMachine" node_paths=PackedStringArray("IdleState", "Character")]
@ -591,10 +697,22 @@ stream = ExtResource("12_vvem5")
[node name="Healing" type="AudioStreamPlayer2D" parent="Effects"]
[node name="MaxLevel" type="AudioStreamPlayer2D" parent="Effects"]
[node name="TargetTracer" parent="Effects" instance=ExtResource("22_hxi53")]
unique_name_in_owner = true
position = Vector2(0, -4)
[node name="Cast" type="Sprite2D" parent="Effects"]
visible = false
y_sort_enabled = true
material = SubResource("CanvasItemMaterial_ejdrf")
position = Vector2(2, 1)
texture = ExtResource("24_njn4h")
centered = false
offset = Vector2(-9.5, -14)
hframes = 6
[node name="Camera2D" parent="." instance=ExtResource("4_ym125")]
zoom = Vector2(4, 4)
position_smoothing_speed = 8.0
@ -614,7 +732,7 @@ use_parent_material = true
position = Vector2(0, -8)
texture = ExtResource("4_5vird")
offset = Vector2(0, -4)
hframes = 36
hframes = 46
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
position = Vector2(0, -4)
@ -652,6 +770,7 @@ visible = false
visible = false
[node name="Bow" parent="Inventory" instance=ExtResource("29_7j1fs")]
visible = false
[node name="Shotgun" parent="Inventory" instance=ExtResource("22_rmciq")]
visible = false

View File

@ -4,6 +4,16 @@ namespace SupaLidlGame.Utils;
public static class Physics
{
public static readonly float COS_30_DEG;
public static readonly float COS_150_DEG;
static Physics()
{
COS_30_DEG = Mathf.Cos(Mathf.DegToRad(30));
COS_150_DEG = Mathf.Cos(Mathf.DegToRad(150));
}
/// <summary>
/// Returns the predicted position of a target after a time t at which a
/// projectile is predicted to hit a target.