diff --git a/Assets/Scripts/Intrepid/Core/Grounding/MovingGroundSurface.cs b/Assets/Scripts/Intrepid/Core/Grounding/MovingGroundSurface.cs new file mode 100644 index 0000000..01c3fa1 --- /dev/null +++ b/Assets/Scripts/Intrepid/Core/Grounding/MovingGroundSurface.cs @@ -0,0 +1,7 @@ +namespace Intrepid.Core.Grounding +{ + public class MovingGroundSurface : GroundSurface + { + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Core/Grounding/MovingGroundSurface.cs.meta b/Assets/Scripts/Intrepid/Core/Grounding/MovingGroundSurface.cs.meta new file mode 100644 index 0000000..a52387c --- /dev/null +++ b/Assets/Scripts/Intrepid/Core/Grounding/MovingGroundSurface.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 488d97fcd10d484b8d9e50393014a05c +timeCreated: 1781271534 \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Gameplay/Entities/Player/Sentinel/StateMachine/States/SentinelStateKnockdown.cs b/Assets/Scripts/Intrepid/Gameplay/Entities/Player/Sentinel/StateMachine/States/SentinelStateKnockdown.cs index 68b5f69..99c433b 100644 --- a/Assets/Scripts/Intrepid/Gameplay/Entities/Player/Sentinel/StateMachine/States/SentinelStateKnockdown.cs +++ b/Assets/Scripts/Intrepid/Gameplay/Entities/Player/Sentinel/StateMachine/States/SentinelStateKnockdown.cs @@ -1,3 +1,4 @@ +using Intrepid.Diagnostics; using Intrepid.Structures; using Intrepid.Utilities; using UnityEngine; @@ -11,6 +12,7 @@ namespace Intrepid.Gameplay.Entities.Player.Sentinel.StateMachine.States [GroupConfigurations, SerializeField] private float KnockoutTimeMultiplier = 0.1f; [GroupConfigurations, SerializeField, Range(0, 3)] private float knockdownTime = .1f; [GroupConfigurations, SerializeField, Range(0, 3)] private float recoverTime = .5f; + [GroupConfigurations, SerializeField] private float maxKnockdown = 15f; private Vector2 KnockdownForce { get; set; } private float KnockoutTime { get; set; } @@ -33,7 +35,7 @@ namespace Intrepid.Gameplay.Entities.Player.Sentinel.StateMachine.States KnockdownForce = ps.Get(SentinelConstants.Parameters.KnockdownForce); Brain.Entity.ChangeOrientation(-KnockdownForce.normalized); KnockoutTime = KnockdownForce.sqrMagnitude * KnockoutTimeMultiplier; - Brain.Entity.DesiredVelocity = KnockdownForce; + Brain.Entity.DesiredVelocity = Vector2.ClampMagnitude(KnockdownForce, maxKnockdown); KnockdownTimer.Start(); KnockoutTimer.Stop(); RecoverTimer.Stop(); diff --git a/Assets/Scripts/Intrepid/Utilities/Structures.meta b/Assets/Scripts/Intrepid/Utilities/Structures.meta new file mode 100644 index 0000000..3cce2f3 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: d317b4205069414bab2594af1367a7cd +timeCreated: 1781273885 \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits.meta b/Assets/Scripts/Intrepid/Utilities/Structures/Traits.meta new file mode 100644 index 0000000..5befdfd --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 036b53ea50a747568a81067ed062ab63 +timeCreated: 1781273890 \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IMutableTraints.cs b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IMutableTraints.cs new file mode 100644 index 0000000..3769793 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IMutableTraints.cs @@ -0,0 +1,8 @@ +namespace Intrepid.Utilities.Structures.Traits +{ + public interface IMutableTraits where T : ITrait + { + void Declare(TT trait) where TT : T; + bool Discard() where TT : T; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IMutableTraints.cs.meta b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IMutableTraints.cs.meta new file mode 100644 index 0000000..a7cc13f --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IMutableTraints.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 60e2f3c521b5464c99572ec85a79b49c +timeCreated: 1781274068 \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IReadOnlyTraits.cs b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IReadOnlyTraits.cs new file mode 100644 index 0000000..47d8587 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IReadOnlyTraits.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using Intrepid.Structures; + +namespace Intrepid.Utilities.Structures.Traits +{ + public interface IReadOnlyTraits where T : ITrait + { + IEnumerable TraitKeys { get; } + IEnumerable AllTraits { get; } + public bool Has() where TT : T; + bool HasNot() where TT : T; + int Count() where TT : T; + int Count(); + bool TryGet(out TT trait) where TT : T; + } +} \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IReadOnlyTraits.cs.meta b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IReadOnlyTraits.cs.meta new file mode 100644 index 0000000..0b84898 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/IReadOnlyTraits.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: a6152bfba97d417aa80a378af0f845b6 +timeCreated: 1755750583 \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/ITrait.cs b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/ITrait.cs new file mode 100644 index 0000000..1b483eb --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/ITrait.cs @@ -0,0 +1,9 @@ +using Intrepid.Structures; + +namespace Intrepid.Utilities.Structures.Traits +{ + public interface ITrait + { + public SKey Key { get; } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/ITrait.cs.meta b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/ITrait.cs.meta new file mode 100644 index 0000000..fc59bd3 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/ITrait.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: df822f6ba3df45d59124ca029e2bfa68 +timeCreated: 1755154881 \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/Traits.cs b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/Traits.cs new file mode 100644 index 0000000..0752a97 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/Traits.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Intrepid.Structures; + +namespace Intrepid.Utilities.Structures.Traits +{ + public sealed class Traits : IReadOnlyTraits, IMutableTraits where T : ITrait + { + private Dictionary Holder { get; } = new(); + private static string KeyFor

() => typeof(P).AssemblyQualifiedName; + + public IEnumerable TraitKeys => Holder.Values.Select(v => v.Key); + public IEnumerable TraitTypes => AllTraits.Select(t => t.GetType()); + public IEnumerable AllTraits => Holder.Values; + public TraitsQuery Querying() => new(this); + + public void Declare(TT trait) where TT : T + { + Holder[KeyFor()] = trait; + } + + public bool Discard() where TT : T => Holder.Remove(KeyFor()); + + public bool Has() where TT : T => Holder.ContainsKey(KeyFor()); + + public bool HasNot() where TT : T => !Has(); + + public int Count() where TT : T => AllTraits.Count(t => t is TT); + + public int Count() => AllTraits.Count(); + + public bool TryGet(out TT trait) where TT : T + { + if (Holder.TryGetValue(KeyFor(), out var t)) + { + trait = (TT)t; + return true; + } + + trait = default; + return false; + } + + public bool TryFindFirst(out TT tt) where TT : T + { + if (AllTraits.Any(t => t is TT)) + { + tt = (TT)AllTraits.First(t => t is TT); + return true; + } + + tt = default; + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/Traits.cs.meta b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/Traits.cs.meta new file mode 100644 index 0000000..1683534 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/Traits.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: da823f94589947afa622262ed259dc94 +timeCreated: 1755154734 \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/TraitsQuery.cs b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/TraitsQuery.cs new file mode 100644 index 0000000..67db9ac --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/TraitsQuery.cs @@ -0,0 +1,100 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Intrepid.Utilities.Structures.Traits +{ + public sealed class TraitsQuery where T : ITrait + { + public IReadOnlyTraits Source { get; } + private List, IEnumerable>> Operations { get; } = new(); + private Func OrderKey { get; set; } + private bool OrderDesc { get; set; } = true; + private int? _skip; + private int? _take; + + public TraitsQuery(IReadOnlyTraits source) + { + Source = source; + } + + public TraitsQuery Has() where TT : T + { + Operations.Add(seq => seq.Where(_ => Source.Has())); + return this; + } + + public TraitsQuery Where(Func filter = null) where TT : T + { + filter ??= _ => true; + Operations.Add(seq => seq.Where(_ => Source.TryGet(out var tt) && filter(tt))); + return this; + } + + public TraitsQuery OrderBy(Func keySelector, bool descending = true) + { + OrderKey = keySelector; + OrderDesc = descending; + return this; + } + + public TraitsQuery Skip(int count) + { + if (count < 0) + { + return this; + } + + _skip = count; + return this; + } + + public TraitsQuery Take(int count) + { + if (count < 0) + { + return this; + } + + _take = count; + return this; + } + + public IReadOnlyList ToList() => Materialize().ToList(); + public T FirstOrDefault() => Materialize().FirstOrDefault(); + public bool Any() => Materialize().Any(); + + public bool TryGet(out TT trait) where TT : T + { + return Source.TryGet(out trait); + } + + private IEnumerable Materialize() + { + var query = Source.AllTraits; + foreach (var operation in Operations) + { + query = operation(query); + } + + if (OrderKey is not null) + { + query = OrderDesc + ? query.OrderByDescending(OrderKey) + : query.OrderBy(OrderKey); + } + + if (_skip is > 0) + { + query = query.Skip(_skip.Value); + } + + if (_take is > 0) + { + query = query.Take(_take.Value); + } + + return query; + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/Intrepid/Utilities/Structures/Traits/TraitsQuery.cs.meta b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/TraitsQuery.cs.meta new file mode 100644 index 0000000..fa12a00 --- /dev/null +++ b/Assets/Scripts/Intrepid/Utilities/Structures/Traits/TraitsQuery.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: e35096794b4c41948c8c03c8009b7322 +timeCreated: 1755757808 \ No newline at end of file diff --git a/Assets/Scripts/POC.meta b/Assets/Scripts/POC.meta deleted file mode 100644 index 31e635a..0000000 --- a/Assets/Scripts/POC.meta +++ /dev/null @@ -1,3 +0,0 @@ -fileFormatVersion: 2 -guid: 950aecf629064624ba1c60498dddcb8d -timeCreated: 1779168408 \ No newline at end of file