11using Intersect . Client . Core ;
2+ using Intersect . Client . Utilities ;
23using Intersect . Configuration ;
34using Intersect . Utilities ;
45
56namespace Intersect . Client . Interface . Game . Typewriting ;
67
78internal 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