using System.Collections.Generic; using UnityEngine; namespace Rokojori { public class GameStateManager : MonoBehaviour { public static GameStateManager instance => Unique.Get(); public List variables = new List(); [System.NonSerialized] public Dictionary _numberValues = new Dictionary(); [System.NonSerialized] public Dictionary _boolValues = new Dictionary(); public void Awake() { _numberValues.Clear(); _boolValues.Clear(); variables.ForEach( v => { if ( v is GameStateNumberVariable numberVariable ) { _numberValues[ numberVariable ] = numberVariable.initialValue; } else if ( v is GameStateBoolVariable boolVariable ) { _boolValues[ boolVariable ] = boolVariable.initialValue; } } ); } public double GetValue( GameStateNumberVariable variable ) { return _numberValues.TryGetValue( variable, out var value ) ? value : variable.initialValue; } public bool GetValue( GameStateBoolVariable variable ) { return _boolValues.TryGetValue( variable, out var value ) ? value : variable.initialValue; } public void SetValue( GameStateNumberVariable variable, double value ) { _numberValues[ variable ] = value; variable.onChanged.DispatchEvent( value ); } public void SetValue( GameStateBoolVariable variable, bool value ) { _boolValues[ variable ] = value; variable.onChanged.DispatchEvent( value ); } [System.Serializable] public class NumberEntry { public string key = ""; public double value = 0; } [System.Serializable] public class BoolEntry { public string key = ""; public bool value = false; } [System.Serializable] public class SaveData { public List numbers = new List(); public List bools = new List(); } public string ToJson() { var data = new SaveData(); foreach ( var pair in _numberValues ) { data.numbers.Add( new NumberEntry{ key = pair.Key.key, value = pair.Value } ); } foreach ( var pair in _boolValues ) { data.bools.Add( new BoolEntry{ key = pair.Key.key, value = pair.Value } ); } return JsonUtility.ToJson( data ); } public void FromJson( string json ) { var data = JsonUtility.FromJson( json ); data.numbers.ForEach( entry => { var variable = variables.Find( v => v is GameStateNumberVariable n && n.key == entry.key ) as GameStateNumberVariable; if ( variable != null ) { SetValue( variable, entry.value ); } } ); data.bools.ForEach( entry => { var variable = variables.Find( v => v is GameStateBoolVariable b && b.key == entry.key ) as GameStateBoolVariable; if ( variable != null ) { SetValue( variable, entry.value ); } } ); } } }