Files
basic-computer-games/70_Poetry/csharp/Context.cs
2022-10-05 07:45:50 +11:00

110 lines
2.2 KiB
C#

namespace Poetry;
internal class Context
{
private readonly IReadWrite _io;
private readonly IRandom _random;
private int _phraseNumber;
private int _groupNumber;
private bool _skipComma;
private int _lineCount;
private bool _useGroup2;
private bool _atStartOfLine = true;
public Context(IReadWrite io, IRandom random)
{
_io = io;
_random = random;
}
public int PhraseNumber => Math.Max(_phraseNumber - 1, 0);
public int GroupNumber
{
get
{
var value = _useGroup2 ? 2 : _groupNumber;
_useGroup2 = false;
return Math.Max(value - 1, 0);
}
}
public int PhraseCount { get; set; }
public bool GroupNumberIsValid => _groupNumber < 5;
public void WritePhrase()
{
Phrase.GetPhrase(this).Write(_io, this);
_atStartOfLine = false;
}
public void MaybeWriteComma()
{
if (!_skipComma && _random.NextFloat() <= 0.19F && PhraseCount != 0)
{
_io.Write(",");
PhraseCount = 2;
}
_skipComma = false;
}
public void WriteSpaceOrNewLine()
{
if (_random.NextFloat() <= 0.65F)
{
_io.Write(" ");
PhraseCount += 1;
}
else
{
EndLine();
PhraseCount = 0;
}
}
public void Update(IRandom random)
{
_phraseNumber = random.Next(1, 6);
_groupNumber += 1;
_lineCount += 1;
}
public void MaybeIndent()
{
if (PhraseCount == 0 && _groupNumber % 2 == 0)
{
_io.Write(" ");
}
}
public void ResetGroup()
{
_groupNumber = 0;
EndLine();
}
public bool MaybeCompleteStanza()
{
if (_lineCount > 20)
{
_io.WriteLine();
PhraseCount = _lineCount = 0;
_useGroup2 = true;
return true;
}
return false;
}
internal string MaybeCapitalise(string text) =>
_atStartOfLine ? (char.ToUpper(text[0]) + text[1..]) : text;
public void SkipNextComma() => _skipComma = true;
public void EndLine()
{
_io.WriteLine();
_atStartOfLine = true;
}
}