Move classes into Program class.

This commit is contained in:
Anna Rose 2025-02-09 20:24:58 -05:00
parent 497f5887bd
commit eac331b4ee
2 changed files with 95 additions and 80 deletions

View File

@ -4,40 +4,43 @@ using System.Collections.Generic;
namespace IngameScript namespace IngameScript
{ {
public class ConfigParser partial class Program
{ {
private Dictionary<string, string> _config; public class ConfigParser
private IMyTerminalBlock _input;
public ConfigParser(IMyTerminalBlock input)
{ {
_input = input; private Dictionary<string, string> _config;
_config = new Dictionary<string, string>(); private IMyTerminalBlock _input;
Parse();
}
// Get a config value, or a default value. public ConfigParser(IMyTerminalBlock input)
// that also does type inference, but the type of `defaultValue` must contain a `Parse()` method.
public T GetValue<T>(string key, T defaultValue)
{
if (!_config.ContainsKey(key))
{ {
return defaultValue; _input = input;
_config = new Dictionary<string, string>();
Parse();
} }
return (T)Convert.ChangeType(_config[key], typeof(T));
}
// Only call this method manually if you are monitoring CustomData for changes. // Get a config value, or a default value.
public void Parse() // that also does type inference, but the type of `defaultValue` must contain a `Parse()` method.
{ public T GetValue<T>(string key, T defaultValue)
_config.Clear();
string[] lines = _input.CustomData.Split('\n');
foreach (string line in lines)
{ {
string[] tokens = line.Split('='); if (!_config.ContainsKey(key))
if (tokens.Length != 2) continue; {
_config[tokens[0]] = tokens[1]; return defaultValue;
}
return (T)Convert.ChangeType(_config[key], typeof(T));
}
// Only call this method manually if you are monitoring CustomData for changes.
public void Parse()
{
_config.Clear();
string[] lines = _input.CustomData.Split('\n');
foreach (string line in lines)
{
string[] tokens = line.Split('=');
if (tokens.Length != 2) continue;
_config[tokens[0]] = tokens[1];
}
} }
} }
} }

View File

@ -8,70 +8,82 @@ using System.Text;
namespace IngameScript namespace IngameScript
{ {
public class Console partial class Program
{ {
private MyGridProgram _program; public interface IConsole
private int _maxLines;
private List<string> _buffer;
private const int DefaultMaxLines = 10;
public Console(MyGridProgram program)
{ {
_program = program; void Print(string text);
_buffer = new List<string>(); void PrintLower(string text);
// Check the PB's custom data for a maxlines directive.
ConfigParser config = new ConfigParser(_program.Me);
_maxLines = config.GetValue("ConsoleMaxLines", DefaultMaxLines);
} }
public PrefixedConsole CreatePrefixedConsole(string prefix) public class Console : IConsole
{ {
return new PrefixedConsole(this, prefix); private MyGridProgram _program;
private int _maxLines;
private List<string> _buffer;
private const int DefaultMaxLines = 10;
public Console(MyGridProgram program)
{
_program = program;
_buffer = new List<string>();
// Check the PB's custom data for a maxlines directive.
ConfigParser config = new ConfigParser(_program.Me);
_maxLines = config.GetValue("ConsoleMaxLines", DefaultMaxLines);
}
public PrefixedConsole CreatePrefixedConsole(string prefix)
{
return new PrefixedConsole(this, prefix);
}
public void Print(string text)
{
_program.Echo(text);
_program.Me.GetSurface(0).WriteText(writeToBuffer(text));
}
// Text written with this method goes to the lower screen / keyboard,
// with no buffering.
public void PrintLower(string text)
{
_program.Me.GetSurface(1).WriteText(text);
}
// Adds the text to the buffer, trims the top if necessary, and builds a printable
// string.
private string writeToBuffer(string text)
{
_buffer.Add(text);
if (_buffer.Count > _maxLines) _buffer.RemoveAt(0);
StringBuilder result = new StringBuilder("", 800);
foreach (string line in _buffer) result.AppendLine(line);
return result.ToString();
}
} }
public void Print(string text) // This class is necessary because we need to keep a *single* buffer
// to write to. So we can ask the primary Console for a prefixer.
public class PrefixedConsole : IConsole
{ {
_program.Echo(text); private IConsole _console;
_program.Me.GetSurface(0).WriteText(writeToBuffer(text)); private string _prefix;
}
// Text written with this method goes to the lower screen / keyboard, public PrefixedConsole(IConsole console, string prefix)
// with no buffering. {
public void PrintLower(string text) _console = console;
{ _prefix = prefix + ": ";
_program.Me.GetSurface(1).WriteText(text); }
}
// Adds the text to the buffer, trims the top if necessary, and builds a printable public void Print(string text)
// string. {
private string writeToBuffer(string text) _console.Print(_prefix + text);
{ }
_buffer.Add(text);
if (_buffer.Count > _maxLines) _buffer.RemoveAt(0);
StringBuilder result = new StringBuilder("", 800);
foreach (string line in _buffer) result.AppendLine(line);
return result.ToString();
}
}
// This class is necessary because we need to keep a *single* buffer // sub-consoles can't print to the ephemeral display
// to write to. So we can ask the primary Console for a prefixer. public void PrintLower(string text) { }
public class PrefixedConsole
{
private Console _console;
private string _prefix;
public PrefixedConsole(Console console, string prefix)
{
_console = console;
_prefix = prefix + ": ";
}
public void Print(string text)
{
_console.Print(_prefix + text);
} }
} }
} }