From a1d3788def18f42d9036dddee4364a0573f9612d Mon Sep 17 00:00:00 2001 From: Savya Bikram Shah Date: Wed, 27 May 2026 12:45:26 +0545 Subject: [PATCH] Undo system made --- .../Contracts/Features/History/ICommand.cs | 4 +- .../Features/History/Features.History.asmdef | 18 +++++++ .../History/Features.History.asmdef.meta | 7 +++ .../Code/Features/History/Installers.meta | 8 ++++ .../Installers/HistoryServiceModule.cs | 15 ++++++ .../Installers/HistoryServiceModule.cs.meta | 2 + .../Code/Features/History/Stack.meta | 8 ++++ .../Code/Features/History/Stack/UndoStack.cs | 47 +++++++++++++++++++ .../Features/History/Stack/UndoStack.cs.meta | 2 + Assets/Darkmatter/Scenes/GamePlay.unity | 46 ++++++++++++++++++ 10 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 Assets/Darkmatter/Code/Features/History/Features.History.asmdef create mode 100644 Assets/Darkmatter/Code/Features/History/Features.History.asmdef.meta create mode 100644 Assets/Darkmatter/Code/Features/History/Installers.meta create mode 100644 Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs create mode 100644 Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs.meta create mode 100644 Assets/Darkmatter/Code/Features/History/Stack.meta create mode 100644 Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs create mode 100644 Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs.meta diff --git a/Assets/Darkmatter/Code/Core/Contracts/Features/History/ICommand.cs b/Assets/Darkmatter/Code/Core/Contracts/Features/History/ICommand.cs index a5da6f2..745de1f 100644 --- a/Assets/Darkmatter/Code/Core/Contracts/Features/History/ICommand.cs +++ b/Assets/Darkmatter/Code/Core/Contracts/Features/History/ICommand.cs @@ -1,6 +1,4 @@ -using UnityEngine; - -namespace Darkmatter.Core +namespace Darkmatter.Core.Contracts.Features.History { public interface ICommand { diff --git a/Assets/Darkmatter/Code/Features/History/Features.History.asmdef b/Assets/Darkmatter/Code/Features/History/Features.History.asmdef new file mode 100644 index 0000000..d5255d2 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Features.History.asmdef @@ -0,0 +1,18 @@ +{ + "name": "Features.History", + "rootNamespace": "Darkmatter.Features.History", + "references": [ + "GUID:6a0a834eb41764f12ba55c3fb04a40cb", + "GUID:b0214a6008ed146ff8f122a6a9c2f6cc", + "GUID:c1c03c0e5b2f4412b9f2be1c20d6a9b1" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/History/Features.History.asmdef.meta b/Assets/Darkmatter/Code/Features/History/Features.History.asmdef.meta new file mode 100644 index 0000000..821a536 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Features.History.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3aa6224adf551496497bf0c866e704b5 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Darkmatter/Code/Features/History/Installers.meta b/Assets/Darkmatter/Code/Features/History/Installers.meta new file mode 100644 index 0000000..756ecc8 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Installers.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9cc86805d75dc4f3781d17d7c65ac1c8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs b/Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs new file mode 100644 index 0000000..3daca18 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs @@ -0,0 +1,15 @@ +using Darkmatter.Core.Contracts.Features.History; +using Darkmatter.Libs.Installers; +using UnityEngine; +using VContainer; + +namespace Darkmatter.Features.History +{ + public class HistoryServiceModule : MonoBehaviour,IServiceModule + { + public void Register(IContainerBuilder builder) + { + builder.Register(Lifetime.Singleton); + } + } +} diff --git a/Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs.meta b/Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs.meta new file mode 100644 index 0000000..f62df8c --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Installers/HistoryServiceModule.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 45c42e41a28d34b01a364a3c2631ba73 \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/History/Stack.meta b/Assets/Darkmatter/Code/Features/History/Stack.meta new file mode 100644 index 0000000..2b9cff6 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Stack.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 352fce035805a47c4aec94d870adea6d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs b/Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs new file mode 100644 index 0000000..a94eb23 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using Darkmatter.Core.Contracts.Features.History; + +namespace Darkmatter.Features.History +{ + public sealed class UndoStack : IUndoStack + { + private const int Capacity = 20; + + private readonly LinkedList _undo = new(); + private readonly Stack _redo = new(); + + public bool CanUndo => _undo.Count > 0; + public bool CanRedo => _redo.Count > 0; + + public void Push(ICommand cmd) + { + cmd.Execute(); + _undo.AddLast(cmd); + if (_undo.Count > Capacity) _undo.RemoveFirst(); + _redo.Clear(); + } + + public void Undo() + { + if (!CanUndo) return; + var cmd = _undo.Last!.Value; + _undo.RemoveLast(); + cmd.Undo(); + _redo.Push(cmd); + } + + public void Redo() + { + if (!CanRedo) return; + var cmd = _redo.Pop(); + cmd.Execute(); + _undo.AddLast(cmd); + } + + public void Clear() + { + _undo.Clear(); + _redo.Clear(); + } + } +} \ No newline at end of file diff --git a/Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs.meta b/Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs.meta new file mode 100644 index 0000000..488bc88 --- /dev/null +++ b/Assets/Darkmatter/Code/Features/History/Stack/UndoStack.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1a9ed946cf48e4bd582992ca4ca662a3 \ No newline at end of file diff --git a/Assets/Darkmatter/Scenes/GamePlay.unity b/Assets/Darkmatter/Scenes/GamePlay.unity index 9935902..9dc1b6f 100644 --- a/Assets/Darkmatter/Scenes/GamePlay.unity +++ b/Assets/Darkmatter/Scenes/GamePlay.unity @@ -461,6 +461,51 @@ MonoBehaviour: autoInjectGameObjects: [] serviceModules: - {fileID: 1594774441} + - {fileID: 1551649429} +--- !u!1 &1551649427 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1551649428} + - component: {fileID: 1551649429} + m_Layer: 0 + m_Name: HistoryServiceModule + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1551649428 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551649427} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1965442263} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1551649429 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1551649427} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 45c42e41a28d34b01a364a3c2631ba73, type: 3} + m_Name: + m_EditorClassIdentifier: Features.History::Darkmatter.Features.History.HistoryServiceModule --- !u!1 &1594774439 GameObject: m_ObjectHideFlags: 0 @@ -538,6 +583,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1594774440} + - {fileID: 1551649428} m_Father: {fileID: 1224714932} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &2069155637