Skip to content

Commit 6d5b7e2

Browse files
committed
Add colorized segments to typewriter
1 parent ec5b6f0 commit 6d5b7e2

File tree

2 files changed

+43
-19
lines changed

2 files changed

+43
-19
lines changed

Intersect.Client.Core/Interface/Game/EventWindow.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,9 +175,11 @@ private EventWindow(Canvas gameCanvas, Dialog dialog) : base(gameCanvas, nameof(
175175
if (_typewriting)
176176
{
177177
_promptLabel.ClearText();
178-
_writer = new Typewriter(_dialog.Prompt ?? string.Empty, text => _promptLabel.AppendText(text, _promptTemplateLabel));
178+
_writer = new Typewriter(parsedText.ToArray(), (text, color) =>
179+
{
180+
_promptLabel.AddText(text, color, Alignments.Left, _promptTemplateLabel.Font);
181+
});
179182
}
180-
181183
Defer(
182184
() =>
183185
{

Intersect.Client.Core/Interface/Game/Typewriting/Typewriter.cs

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,38 @@
11
using Intersect.Client.Core;
2+
using Intersect.Client.Utilities;
23
using Intersect.Configuration;
34
using Intersect.Utilities;
45

56
namespace Intersect.Client.Interface.Game.Typewriting;
67

78
internal sealed class Typewriter
89
{
9-
public delegate void TextWrittenHandler(string text);
10-
10+
public delegate void TextWrittenHandler(string text, Color color);
1111
private static HashSet<string> FullStops => ClientConfiguration.Instance.TypewriterFullStops;
1212
private static long FullStopSpeed => ClientConfiguration.Instance.TypewriterFullStopDelay;
1313
private static HashSet<string> PartialStops => ClientConfiguration.Instance.TypewriterPauses;
1414
private static long PartialStopSpeed => ClientConfiguration.Instance.TypewriterPauseDelay;
1515
private static long TypingSpeed => ClientConfiguration.Instance.TypewriterPartDelay;
1616

1717
private int _offset;
18+
private int _segmentIndex = 0;
1819
private string? _lastText;
1920
private long _nextUpdateTime;
2021

2122
private readonly TextWrittenHandler _textWrittenHandler;
22-
private readonly string _text;
23+
private readonly ColorizedText[] _segments;
2324

2425
public bool IsDone { get; private set; }
2526
public long DoneAtMilliseconds { get; private set; }
2627

27-
public Typewriter(string text, TextWrittenHandler textWrittenHandler)
28+
public Typewriter(ColorizedText[] segments, TextWrittenHandler textWrittenHandler)
2829
{
29-
_text = text.ReplaceLineEndings("\n");
30+
_segments = segments;
3031
_textWrittenHandler = textWrittenHandler;
3132
_nextUpdateTime = Timing.Global.MillisecondsUtc;
32-
33+
_segmentIndex = 0;
3334
_offset = 0;
3435
_lastText = null;
35-
3636
IsDone = false;
3737
}
3838

@@ -43,7 +43,7 @@ public void Write(string? soundName)
4343
return;
4444
}
4545

46-
if (_offset >= _text.Length)
46+
if (_segmentIndex >= _segments.Length)
4747
{
4848
End();
4949
return;
@@ -57,28 +57,44 @@ public void Write(string? soundName)
5757
var emitSound = false;
5858
while (_nextUpdateTime <= Timing.Global.MillisecondsUtc)
5959
{
60-
if (_offset >= _text.Length)
60+
if (_segmentIndex >= _segments.Length)
6161
{
6262
End();
63-
break;
63+
return;
64+
}
65+
66+
var segment = _segments[_segmentIndex];
67+
68+
if (_offset >= segment.Text.Length)
69+
{
70+
_offset = 0;
71+
_segmentIndex++;
72+
73+
if (_segmentIndex >= _segments.Length)
74+
{
75+
End();
76+
return;
77+
}
78+
79+
segment = _segments[_segmentIndex];
6480
}
6581

6682
emitSound |= _offset % ClientConfiguration.Instance.TypewriterSoundFrequency == 0;
6783

6884
string nextText;
69-
if (char.IsSurrogatePair(_text, _offset))
85+
if (char.IsSurrogatePair(segment.Text, _offset))
7086
{
71-
nextText = _text[_offset..(_offset + 2)];
87+
nextText = segment.Text[_offset..(_offset + 2)];
7288
_offset += 2;
7389
}
7490
else
7591
{
76-
nextText = _text[_offset..(_offset + 1)];
92+
nextText = segment.Text[_offset..(_offset + 1)];
7793
++_offset;
7894
}
7995

8096
_nextUpdateTime += GetTypingDelayFor(nextText, _lastText);
81-
_textWrittenHandler(nextText);
97+
_textWrittenHandler(nextText, segment.Color);
8298
_lastText = nextText;
8399
}
84100

@@ -118,14 +134,20 @@ private static long GetTypingDelayFor(string next, string? last)
118134

119135
public void End()
120136
{
121-
if (IsDone || _text.Length < 1)
137+
if (IsDone)
122138
{
123139
return;
124140
}
125141

126-
if (_offset < _text.Length)
142+
while (_segmentIndex < _segments.Length)
127143
{
128-
_textWrittenHandler(_text[_offset..]);
144+
var segment = _segments[_segmentIndex];
145+
if (_offset < segment.Text.Length)
146+
{
147+
_textWrittenHandler(segment.Text.Substring(_offset), segment.Color);
148+
}
149+
_segmentIndex++;
150+
_offset = 0;
129151
}
130152

131153
IsDone = true;

0 commit comments

Comments
 (0)