diff --git a/Assets/LevelEditor/Levels/Level.asset b/Assets/LevelEditor/Levels/Level.asset index 61e1aa9..bed0520 100644 --- a/Assets/LevelEditor/Levels/Level.asset +++ b/Assets/LevelEditor/Levels/Level.asset @@ -407,7 +407,7 @@ MonoBehaviour: _isInvisible: 0 _isCollidable: 0 _isTrigger: 0 - _renderOrder: 0 + _renderOrder: 1 _renderLayer: Default - _key: Spawners _tiles: diff --git a/Assets/Scripts/LevelManager/ILevelObject.cs b/Assets/Scripts/LevelManager/ILevelObject.cs index d6abab6..8b5c2cd 100644 --- a/Assets/Scripts/LevelManager/ILevelObject.cs +++ b/Assets/Scripts/LevelManager/ILevelObject.cs @@ -3,6 +3,12 @@ using UnityEngine; public interface ILevelObject { + public enum ObjectType + { + Tile = 0, + Prefab = 1 + } + string Name { get; } Vector3 Position { get; } void LevelUpdate(); diff --git a/Assets/Scripts/LevelManager/LevelManagerScript.cs b/Assets/Scripts/LevelManager/LevelManagerScript.cs index 3756f14..eb88277 100644 --- a/Assets/Scripts/LevelManager/LevelManagerScript.cs +++ b/Assets/Scripts/LevelManager/LevelManagerScript.cs @@ -5,6 +5,8 @@ using UnityEngine; using UnityEngine.Tilemaps; using GatherAndDefend.LevelEditor; using Unity.VisualScripting.YamlDotNet.Core.Tokens; +using System.Text; +using System.IO; #region [custom inspector] #if UNITY_EDITOR @@ -32,6 +34,7 @@ public class LevelManagerEditor : Editor #region [singleton level manager] public class LevelManager : Singleton { + string SavePath => Application.dataPath + "/save.txt"; public delegate void LevelAction(ILevelObject levelObject); public delegate bool LevelPredicate(T levelObject) where T : ILevelObject; public event LevelAction Added; @@ -121,8 +124,6 @@ public class LevelManager : Singleton toRemove.Clear(); } - private string saved; - public void ClearLevel() { foreach (var obj in _levelObjects) @@ -131,22 +132,15 @@ public class LevelManager : Singleton } Clear(); } - public void SaveFile() + + /// + /// permet de loader un scriptable object de niveau + /// + /// le niveau à loader + /// est ce qu'on veut effacer ce qui est déjà là? + public void LoadLevel(Level level, bool shouldClear = false) { - var list = _levelObjects.Select(obj => obj.ToDictionary()).ToList(); - list.Add(new Dictionary() - { - {Database.TYPE, "Level" }, - {"Name", _currentLevel.name } - }); - saved = JsonConvert.SerializeObject(list); - - Debug.Log("game saved successfully"); - } - - public void LoadLevel(Level level, bool clear = false) - { - if (clear) + if (shouldClear) { ClearLevel(); } @@ -177,9 +171,15 @@ public class LevelManager : Singleton } Debug.Log("level loaded successfully"); } - public void LoadLevel(string levelName, bool clear = false) + + /// + /// permet de loader un scriptable object de niveau + /// + /// le nom du niveau à loader + /// est ce qu'on veut effacer ce qui est déjà là? + public void LoadLevel(string levelName, bool shouldClear = false) { - if (clear) + if (shouldClear) { ClearLevel(); } @@ -187,18 +187,31 @@ public class LevelManager : Singleton //fetch level from database _currentLevel = Database.Instance.ScriptableObjects[levelName] as Level; - LoadLevel(_currentLevel, clear); + LoadLevel(_currentLevel, shouldClear); } + + + public void SaveFile() + { + var list = _levelObjects.Select(obj => obj.ToDictionary()).ToList(); + string saved = JsonConvert.SerializeObject(list); + + File.WriteAllText(SavePath, saved, Encoding.UTF8); + Debug.Log("game saved successfully"); + } + public void LoadFile() { + + string saved = File.ReadAllText(SavePath, Encoding.UTF8); + var dicts = JsonConvert.DeserializeObject>>(saved); + ClearLevel(); - var dicts = JsonConvert.DeserializeObject>>(saved); - - var prefabDicts = dicts.FindAll(x => x[Database.TYPE].ToString() == nameof(Database.Prefabs)); + var prefabDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Prefab)); foreach (var prefabDict in prefabDicts) CreatePrefab(prefabDict); - var tileDicts = dicts.FindAll(x => x[Database.TYPE].ToString() == nameof(Database.ScriptableObjects)); + var tileDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Tile)); foreach (var tileDict in tileDicts) CreateTile(tileDict); Debug.Log("game loaded successfully"); @@ -228,15 +241,25 @@ public class LevelManager : Singleton public class LevelManagerScript : MonoBehaviour { public Level firstLevel; - private static LevelManagerScript _instance; + private static LevelManagerScript _instance; void Awake() { - if (!_instance) _instance = this; - else Destroy(gameObject); + //we don't want to ever have two LevelManagerScript at the same time in the game. + //We prevent that by erasing any instances that are not registered as our main instance. + if (!_instance) + { + _instance = this; + } + else + { + Destroy(gameObject); + return; + } DontDestroyOnLoad(gameObject); - LevelManager.Instance.LoadLevel(firstLevel.name, true); + if (!firstLevel) throw new System.Exception("there is no first level set in the level manager script"); + LevelManager.Instance.LoadLevel(firstLevel, true); } void Update() { diff --git a/Assets/Scripts/LevelManager/LevelObject.cs b/Assets/Scripts/LevelManager/LevelObject.cs index 2006473..1b651ce 100644 --- a/Assets/Scripts/LevelManager/LevelObject.cs +++ b/Assets/Scripts/LevelManager/LevelObject.cs @@ -40,7 +40,7 @@ public abstract class LevelObject : MonoBehaviour, ILevelObject { {nameof(Name), Name }, {nameof(Position), new float[]{Position.x, Position.y, Position.z } }, - {Database.TYPE, nameof(Database.Prefabs) } + {nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Prefab) } }; } public virtual void LoadDictionary(Dictionary dict) diff --git a/Assets/Scripts/LevelManager/LevelTile.cs b/Assets/Scripts/LevelManager/LevelTile.cs index c6f02d4..12e9333 100644 --- a/Assets/Scripts/LevelManager/LevelTile.cs +++ b/Assets/Scripts/LevelManager/LevelTile.cs @@ -78,15 +78,16 @@ public abstract class LevelTile : TileBase, ILevelObject {nameof(Name), Name }, {nameof(Position), new float[]{Position.x, Position.y, Position.z } }, {nameof(Tilemap), Tilemap }, - {Database.TYPE, nameof(Database.ScriptableObjects) } + {nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Tile) } }; } + public virtual void LoadDictionary(Dictionary dict) { Name = dict[nameof(Name)].ToString(); Position = dict[nameof(Position)].ToVector3(); - var tilemapName = dict[nameof(Tilemap)].ToString(); + _tilemap = FindObjectOfType().GetComponentInChildren(tilemapName); } diff --git a/Assets/Scripts/Opponent/Opponent.cs b/Assets/Scripts/Opponent/Opponent.cs index 67f242a..fe39237 100644 --- a/Assets/Scripts/Opponent/Opponent.cs +++ b/Assets/Scripts/Opponent/Opponent.cs @@ -29,8 +29,8 @@ public class Opponent : Entity void AttackEnemy() { //Attack Cooldown - if(AttackSpeed < AttackSpeedWait) { - + if(AttackSpeed < AttackSpeedWait) + { Enemy.Hp-=AttackDamage; Debug.Log("Ally Hp = " + Enemy.Hp);