From 946e7df71eca00c84abb1c2dce865c8f48ea2802 Mon Sep 17 00:00:00 2001 From: MaddoScientisto Date: Sun, 4 May 2025 22:01:59 +0200 Subject: [PATCH] Grahpics overhaul and predicting bullets --- ExternalMaterial/HexGrid/HexGrid.pxc | Bin 7880 -> 17943 bytes ExternalMaterial/HexGrid/HexGrid.pxc1 | Bin 17918 -> 7880 bytes .../Roguelite/Roguelite_Boss_1.tres | 53 +++++++++++++++++- .../Roguelite/Roguelite_Boss_1_Script.tres | 5 +- .../Basic_Enemy_Emitter_Spiral_Bullets.tres | 1 + Resources/Enemies/Fairy_Guard.tres | 1 + Scenes/Maps/RogueliteMaps/Beginner1.tscn | 5 +- Scenes/test.tscn | 35 ++++++------ Scripts/AttackPatterns/SpiralPattern.cs | 17 +++++- .../FSM/Enemy/PlayerDetectionModule.cs | 2 + Scripts/Components/FSM/Enemy/Shooting.cs | 17 +++++- Scripts/GameManager.cs | 1 + Scripts/Resources/EnemyResource.cs | 1 + Scripts/Utils/MathFunctions.cs | 32 +++++++++++ 14 files changed, 144 insertions(+), 26 deletions(-) create mode 100644 Scripts/Utils/MathFunctions.cs diff --git a/ExternalMaterial/HexGrid/HexGrid.pxc b/ExternalMaterial/HexGrid/HexGrid.pxc index 4bcf1ef8f1f02b7e1d222bbee6a672e9715d9793..d0df3be1278c15c676d7d6ebb9508d610d77e34b 100644 GIT binary patch literal 17943 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 diff --git a/ExternalMaterial/HexGrid/HexGrid.pxc1 b/ExternalMaterial/HexGrid/HexGrid.pxc1 index 6a7ef34de8d52aecdfe9a4ed4f598f682215311d..4bcf1ef8f1f02b7e1d222bbee6a672e9715d9793 100644 GIT binary patch literal 7880 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 literal 17918 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 _timeModifiers; [ExportCategory("Other")] [Export] public bool _targetPlayer = false; + [ExportCategory("Other")] [Export] public bool _predictPlayer = false; [ExportCategory("Overrides")] [Export] public bool OverrideOwner { get; private set; } = false; @@ -224,7 +226,20 @@ public partial class SpiralPattern : AttackPattern if (pattern._targetPlayer && GameManager.Instance.PlayerPosition.HasValue) { - direction = (GameManager.Instance.PlayerPosition.Value - Parent.GlobalPosition).Normalized(); + if (pattern._predictPlayer && GameManager.Instance.PlayerVelocity.HasValue) + { + var predictedDirection = MathFunctions.PredictInterceptPosition(Parent.GlobalPosition, + GameManager.Instance.PlayerPosition.Value, GameManager.Instance.PlayerVelocity.Value, + pattern.BulletResource.BulletSpeed); + if (predictedDirection.HasValue) + { + direction = (predictedDirection.Value - Parent.GlobalPosition).Normalized(); + } + } + else + { + direction = (GameManager.Instance.PlayerPosition.Value - Parent.GlobalPosition).Normalized(); + } } var bullet = pattern.MakeBullet(Parent.GlobalPosition, pattern.bulletCount, diff --git a/Scripts/Components/FSM/Enemy/PlayerDetectionModule.cs b/Scripts/Components/FSM/Enemy/PlayerDetectionModule.cs index 480250f3..6c6d3175 100644 --- a/Scripts/Components/FSM/Enemy/PlayerDetectionModule.cs +++ b/Scripts/Components/FSM/Enemy/PlayerDetectionModule.cs @@ -16,6 +16,7 @@ public partial class PlayerDetectionModule : Area2D public uint ObstaclesCollisionMask { get; private set; } public Vector2? LastKnownPlayerPosition { get; set; } + public Vector2? LastKnowPlayerVelocity { get; set; } //public bool PlayerInActiveArea { get; private set; } private CollisionShape2D _collisionShape2D; @@ -77,6 +78,7 @@ public partial class PlayerDetectionModule : Area2D if (found) { LastKnownPlayerPosition = GameManager.Instance.PlayerPosition; + LastKnowPlayerVelocity = GameManager.Instance.PlayerVelocity; } return found; } diff --git a/Scripts/Components/FSM/Enemy/Shooting.cs b/Scripts/Components/FSM/Enemy/Shooting.cs index 84916b6a..9c082a7f 100644 --- a/Scripts/Components/FSM/Enemy/Shooting.cs +++ b/Scripts/Components/FSM/Enemy/Shooting.cs @@ -1,5 +1,6 @@ using Cirno.Scripts.Components.Actors; using Cirno.Scripts.Enums; +using Cirno.Scripts.Utils; using Godot; namespace Cirno.Scripts.Components.FSM.Enemy; @@ -150,13 +151,27 @@ public partial class Shooting : EnemyStateBase return null; // No valid strafe position found } + + private Vector2 GetShootDirection() + { + if (StorageModule.EnemyData.PredictPlayer && PlayerDetection.LastKnowPlayerVelocity.HasValue) + { + var predictedDirection = MathFunctions.PredictInterceptPosition(MainObject.GlobalPosition, + PlayerDetection.LastKnownPlayerPosition.Value, PlayerDetection.LastKnowPlayerVelocity.Value, + EquippedWeapon.WeaponData.BulletData.BulletSpeed); + if (predictedDirection.HasValue) return (predictedDirection.Value - MainObject.GlobalPosition).Normalized(); + + } + + return ( PlayerDetection.LastKnownPlayerPosition.Value - MainObject.GlobalPosition).Normalized(); + } private void Shoot() { if (EquippedWeapon == null) return; if (!PlayerDetection.LastKnownPlayerPosition.HasValue) return; - var direction = ( PlayerDetection.LastKnownPlayerPosition.Value - MainObject.GlobalPosition).Normalized(); + var direction = GetShootDirection(); // Shoot at the player's last known position EquippedWeapon.ShootDirection = direction; diff --git a/Scripts/GameManager.cs b/Scripts/GameManager.cs index f8cd340d..f403e53e 100644 --- a/Scripts/GameManager.cs +++ b/Scripts/GameManager.cs @@ -25,6 +25,7 @@ public partial class GameManager : Node2D private Node2D _cameraTarget; public Vector2? PlayerPosition => _player?.GlobalPosition ?? null; + public Vector2? PlayerVelocity => _player?.Velocity ?? null; [Export] public MapResource MapResource { get; private set; } diff --git a/Scripts/Resources/EnemyResource.cs b/Scripts/Resources/EnemyResource.cs index 5e91d454..73780542 100644 --- a/Scripts/Resources/EnemyResource.cs +++ b/Scripts/Resources/EnemyResource.cs @@ -18,6 +18,7 @@ public partial class EnemyResource : Resource [Export] public Array LootDrops { get; private set; } = []; [Export] public float MotivationReward { get; private set; } = 4f; + [Export] public bool PredictPlayer { get; private set; } = false; [ExportCategory("AI")] [Export] public float PlayerDetectionRange { get; private set; } = 90f; [Export] public float ViewRange { get; private set; } = 120f; [Export] public float AlarmReactRange { get; private set; } diff --git a/Scripts/Utils/MathFunctions.cs b/Scripts/Utils/MathFunctions.cs new file mode 100644 index 00000000..15bf7379 --- /dev/null +++ b/Scripts/Utils/MathFunctions.cs @@ -0,0 +1,32 @@ +using Godot; + +namespace Cirno.Scripts.Utils; + +public static class MathFunctions +{ + public static Vector2? PredictInterceptPosition(Vector2 shooterPos, Vector2 targetPos, Vector2 targetVel, float projectileSpeed) + { + Vector2 displacement = targetPos - shooterPos; + float a = targetVel.LengthSquared() - projectileSpeed * projectileSpeed; + float b = 2 * displacement.Dot(targetVel); + float c = displacement.LengthSquared(); + + float discriminant = b * b - 4 * a * c; + + if (discriminant < 0 || Mathf.Abs(a) < 0.001f) + return null; // No solution or projectile too slow + + float sqrtDisc = Mathf.Sqrt(discriminant); + float t1 = (-b - sqrtDisc) / (2 * a); + float t2 = (-b + sqrtDisc) / (2 * a); + + float t = Mathf.Min(t1, t2); + if (t < 0) + t = Mathf.Max(t1, t2); + + if (t < 0) + return null; // No valid positive time + + return targetPos + targetVel * t; + } +} \ No newline at end of file