From bb31c9a39cc538de2168c3ad0acdee8f644d00c6 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Thu, 30 Oct 2025 02:46:22 +0100 Subject: [PATCH] Add CloseDoorAction and enhance LogicSequenceComponent for activation handling --- GameCore/Logic/CloseDoorAction.cs | 33 +++++++++++++++++++ GameCore/Logic/LogicSequenceComponent.cs | 4 ++- GameCore/Logic/LogicSequenceSystem.cs | 41 +++++++++++++++--------- 3 files changed, 62 insertions(+), 16 deletions(-) create mode 100644 GameCore/Logic/CloseDoorAction.cs diff --git a/GameCore/Logic/CloseDoorAction.cs b/GameCore/Logic/CloseDoorAction.cs new file mode 100644 index 0000000..ef97ee4 --- /dev/null +++ b/GameCore/Logic/CloseDoorAction.cs @@ -0,0 +1,33 @@ +using GameCore.ECS; +using GameCore.Events; +using GameCore.Interaction; +using GameCore.Logic.Interfaces; + +namespace GameCore.Logic; + +public class CloseDoorAction(string targetWorldId) : ITriggerAction +{ + public void Execute(World world) + { + var doorEntity = world.FindEntityByWorldId(targetWorldId); + if (doorEntity == null) + { + world.Logger.Warn($"[CloseDoorAction] Could not find entity with WorldId: {targetWorldId}"); + return; + } + + var door = world.GetComponent(doorEntity.Value); + if (door == null) + { + world.Logger.Warn($"[CloseDoorAction] Entity '{targetWorldId}' does not have a DoorComponent."); + return; + } + + if (door.CurrentState == DoorComponent.DoorState.Open || door.CurrentState == DoorComponent.DoorState.Opening) + { + door.CurrentState = DoorComponent.DoorState.Closing; + world.Logger.Info($"[CloseDoorAction] Closing door: {targetWorldId}"); + world.PublishEvent(new DoorStateChangedEvent(doorEntity.Value, door.CurrentState)); + } + } +} \ No newline at end of file diff --git a/GameCore/Logic/LogicSequenceComponent.cs b/GameCore/Logic/LogicSequenceComponent.cs index 5a4f748..7bfaf3e 100644 --- a/GameCore/Logic/LogicSequenceComponent.cs +++ b/GameCore/Logic/LogicSequenceComponent.cs @@ -7,7 +7,9 @@ public class LogicSequenceComponent : IComponent { public List RequiredChannels { get; set; } = []; public HashSet ActivatedChannels { get; set; } = []; - public List OnCompleteActions { get; set; } = []; + public List OnActivateActions { get; set; } = []; + public List OnDeactivateActions { get; set; } = []; public bool IsOneTimeTrigger { get; set; } = false; public bool HasTriggered { get; set; } = false; + public bool IsCurrentlyActive { get; set; } = false; } \ No newline at end of file diff --git a/GameCore/Logic/LogicSequenceSystem.cs b/GameCore/Logic/LogicSequenceSystem.cs index 1a8e7ae..8b47232 100644 --- a/GameCore/Logic/LogicSequenceSystem.cs +++ b/GameCore/Logic/LogicSequenceSystem.cs @@ -25,27 +25,38 @@ public class LogicSequenceSystem : ISystem foreach (var entity in logicEntities) { var logic = _world.GetComponent(entity); - if (logic == null || (logic.IsOneTimeTrigger && logic.HasTriggered)) continue; + if (logic == null) continue; - if (logic.RequiredChannels.Contains(e.ChannelId)) + if (!logic.RequiredChannels.Contains(e.ChannelId)) continue; + + if (e.NewState) + logic.ActivatedChannels.Add(e.ChannelId); + else + logic.ActivatedChannels.Remove(e.ChannelId); + + _world.Logger.Info( + $"[LogicSequenceSystem] Channel '{e.ChannelId}' activated. Total {logic.ActivatedChannels.Count}/{logic.RequiredChannels.Count}"); + + var allConditionsMet = logic.ActivatedChannels.Count == logic.RequiredChannels.Count; + + if (allConditionsMet && !logic.IsCurrentlyActive) { - if (e.NewState) - logic.ActivatedChannels.Add(e.ChannelId); - else - logic.ActivatedChannels.Remove(e.ChannelId); + if (logic.IsOneTimeTrigger && logic.HasTriggered) continue; - _world.Logger.Info( - $"[LogicSequenceSystem] Channel '{e.ChannelId}' activated. Total {logic.ActivatedChannels.Count}/{logic.RequiredChannels.Count}"); + _world.Logger.Info("[LogicSequenceSystem] All channels activated. Executing OnActivateActions."); + foreach (var action in logic.OnActivateActions) action.Execute(_world); - if (logic.ActivatedChannels.Count == logic.RequiredChannels.Count) - { - _world.Logger.Info("[LogicSequenceSystem] All channels activated. Executing actions."); - foreach (var action in logic.OnCompleteActions) action.Execute(_world); + logic.IsCurrentlyActive = true; + logic.HasTriggered = true; + } + else if (!allConditionsMet && logic.IsCurrentlyActive) + { + if (logic.IsOneTimeTrigger) continue; - if (logic.IsOneTimeTrigger) logic.HasTriggered = true; + _world.Logger.Info("[LogicSequenceSystem] Channels deactivated. Executing OnDeactivateActions."); + foreach (var action in logic.OnDeactivateActions) action.Execute(_world); - logic.ActivatedChannels.Clear(); - } + logic.IsCurrentlyActive = false; } } }