mirror of
https://github.com/coding-horror/basic-computer-games.git
synced 2025-12-22 23:26:40 -08:00
110 lines
2.2 KiB
C#
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;
|
|
}
|
|
}
|