Bracket System

This commit is contained in:
h z
2024-09-26 10:29:27 +01:00
parent a9afe94ebc
commit 67dd8ac8dc
25 changed files with 266 additions and 92 deletions

View File

@@ -37,7 +37,7 @@ public class EnigmosControl
EngineUp = true;
}
public double Energy { get; set; } = 0d;
public double Energy { get; set; } = 1d;
public bool EngineUp { get; private set; }
public double IdlePower => CreatureControl.Instance.CurrentCharacter.MotherBoard.IdlePower + VoidPower;
public double VoidPower { get; set; } = 0;

View File

@@ -0,0 +1,76 @@
using System.Text.Json;
using Nocturnis.Controls;
using Nocturnis.DataStructures.States;
using FileAccess = Godot.FileAccess;
namespace Nocturnis.GlobalManagement.Controls;
public sealed class StateControl
{
public const string NullState = "NullState";
private HashSet<StateTransferRule> Rules { get; set; }
public Dictionary<string, string> States { get; set; }
private StateControl()
{
States = new Dictionary<string, string>();
Rules = new HashSet<StateTransferRule>();
}
private static StateControl _instance = null;
public static StateControl Instance => _instance ??= new StateControl();
public void Load()
{
if (!FileAccess.FileExists("States.json"))
return;
using FileAccess file = FileAccess.Open("States.json", FileAccess.ModeFlags.Read);
string jsonData = file.GetAsText();
States = JsonSerializer.Deserialize<Dictionary<string, string>>(jsonData);
}
public void Save()
{
string jsonData = JsonSerializer.Serialize(States);
using FileAccess file = FileAccess.Open("States.json", FileAccess.ModeFlags.Write);
file.StoreString(jsonData);
}
public bool Transfer(string path, string state)
{
foreach (var rule in Rules)
if (rule(path, States[path], state))
{
States[path] = state;
return true;
}
return false;
}
public string this[string path]
{
get
{
try
{
return States[path];
}
catch (KeyNotFoundException)
{
return NullState;
}
}
set
{
if(!States.ContainsKey(path))
States[path] = NullState;
Transfer(path, value);
}
}
public void AddRule(StateTransferRule rule)
{
Rules.Add(rule);
}
}

View File

@@ -0,0 +1,70 @@
using System.Text.Json;
using Nocturnis.GlobalManagement.Providers;
using Nocturnis.Hermeteus.BracketSystem;
namespace Nocturnis.GlobalManagement.Controls;
public class TopicControl
{
private static TopicControl _instance;
public static TopicControl Instance => _instance ??= new TopicControl();
public HashSet<IBracketTopic> ActiveTopics { get; set; }
public Dictionary<string, IBracketTopic> Topics { get; set; }
private TopicControl()
{
ActiveTopics = new HashSet<IBracketTopic>();
Topics = new Dictionary<string, IBracketTopic>();
}
public void Load(string topicName)
{
string jsonContent = GlobalProvider.FileAccessProvider.Read($"res://Resources/Topics/{topicName}.json");
TopicData topicData = JsonSerializer.Deserialize<TopicData>(jsonContent);
IBracketTopic topic = GlobalProvider.ConstructorProvider.NewBracketTopic();
topic.Topic = topicData.topic;
topic.Reusable = topicData.reusable;
topic.Finished = false;
topic.LineMap = new Dictionary<string, IBracketLine>();
foreach (var lineData in topicData.lines)
{
IBracketLine line = GlobalProvider.ConstructorProvider.NewBracketLine();
line.Conditions = lineData.conditions;
line.Line = lineData.line;
line.Successors = new HashSet<IBracketLine>();
topic.LineMap[lineData.line] = line;
line.BraLines = lineData.braLines;
line.KetLines = lineData.ketLines;
line.ArrowMarkers = lineData.arrows;
line.CleanPrevious = lineData.cleanPrevious;
line.Topic = topicData.topic;
}
foreach (LineData lineData in topicData.lines)
{
IBracketLine line = topic.LineMap[lineData.line];
foreach (string successorId in lineData.successors)
line.Successors.Add(topic.LineMap[successorId]);
}
topic.Root = topic.LineMap[topicData.lines[0].line];
topic.CurrentLine = topic.Root;
Topics.Add(topic.Topic, topic);
}
private class TopicData
{
public bool reusable { get; set; }
public string topic { get; set; }
public LineData[] lines { get; set; }
}
private class LineData
{
public bool cleanPrevious { get; set; }
public string line { get; set; }
public string[] conditions { get; set; }
public string[] successors { get; set; }
public string[] braLines { get; set; }
public string[] ketLines { get; set; }
public string[] arrows { get; set; }
}
}

View File

@@ -1,5 +1,4 @@
using Godot;
using Nocturnis.DataStructures.DataTypes;
using Nocturnis.Enigmos.Modules;
using Nocturnis.Inventories.Items;
@@ -15,6 +14,10 @@ public static class GlobalProvider
public static IDataTypeProvider DataTypeProvider { get; set; }
public static IProcessProvider ProcessProvider { get; set; }
public static ITextureProvider TextureProvider { get; set; }
public static IConstructorProvider ConstructorProvider { get; set; }
public static IFileAccessProvider FileAccessProvider { get; set; }
public static class ModulePreviewMapper<TModule>
where TModule : IBaseModule

View File

@@ -0,0 +1,9 @@
using Nocturnis.Hermeteus.BracketSystem;
namespace Nocturnis.GlobalManagement.Providers;
public interface IConstructorProvider
{
IBracketTopic NewBracketTopic();
IBracketLine NewBracketLine();
}

View File

@@ -0,0 +1,10 @@
using FileAccess = Godot.FileAccess;
namespace Nocturnis.GlobalManagement.Providers;
public interface IFileAccessProvider
{
public string Read(string path);
public void Write(string path, string content);
public string ResRead(string path);
}