author | sheepluva |
Sun, 01 Mar 2015 17:12:02 +0100 | |
changeset 10842 | a039464cbb4a |
parent 10841 | 6b0a839f399e |
child 10843 | 5c2ef0507971 |
permissions | -rw-r--r-- |
942 | 1 |
(* |
1066 | 2 |
* Hedgewars, a free turn based strategy game |
9998 | 3 |
* Copyright (c) 2004-2014 Andrey Korotaev <unC0Rr@gmail.com> |
942 | 4 |
* |
5 |
* This program is free software; you can redistribute it and/or modify |
|
6 |
* it under the terms of the GNU General Public License as published by |
|
7 |
* the Free Software Foundation; version 2 of the License |
|
8 |
* |
|
9 |
* This program is distributed in the hope that it will be useful, |
|
10 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
12 |
* GNU General Public License for more details. |
|
13 |
* |
|
14 |
* You should have received a copy of the GNU General Public License |
|
15 |
* along with this program; if not, write to the Free Software |
|
10108
c68cf030eded
update FSF address. note: two sdl include files (by Sam Lantinga) still have the old FSF address in their copyright - but I ain't gonna touch their copyright headers
sheepluva
parents:
10104
diff
changeset
|
16 |
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
942 | 17 |
*) |
18 |
||
2630 | 19 |
{$INCLUDE "options.inc"} |
20 |
||
942 | 21 |
unit uChat; |
22 |
||
23 |
interface |
|
24 |
||
3038 | 25 |
procedure initModule; |
26 |
procedure freeModule; |
|
6379 | 27 |
procedure ReloadLines; |
8738 | 28 |
procedure CleanupInput; |
942 | 29 |
procedure AddChatString(s: shortstring); |
30 |
procedure DrawChat; |
|
10836 | 31 |
procedure KeyPressChat(Key, Sym: Longword; Modifier: Word); |
9669 | 32 |
procedure SendHogSpeech(s: shortstring); |
942 | 33 |
|
34 |
implementation |
|
10737 | 35 |
uses SDLh, uInputHandler, uTypes, uVariables, uCommands, uUtils, uTextures, uRender, uIO, uScript, uRenderUtils; |
942 | 36 |
|
990
dfa6a6fe1542
Implement history for chat (27 entries), no key binding yet
unc0rr
parents:
988
diff
changeset
|
37 |
const MaxStrIndex = 27; |
942 | 38 |
|
946 | 39 |
type TChatLine = record |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
40 |
Tex: PTexture; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
41 |
Time: Longword; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
42 |
Width: LongInt; |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
43 |
s: shortstring; |
10303 | 44 |
Color: TSDL_Color; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
45 |
end; |
9954 | 46 |
TChatCmd = (ccQuit, ccPause, ccFinish, ccShowHistory, ccFullScreen); |
942 | 47 |
|
10835
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
48 |
type TInputStrL = array[0..260] of byte; |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
49 |
|
946 | 50 |
var Strs: array[0 .. MaxStrIndex] of TChatLine; |
3539 | 51 |
MStrs: array[0 .. MaxStrIndex] of shortstring; |
8740
3eb1891f81ef
use a local storage for chat history which prevents mix ups in netgame and simplifies code
koda
parents:
8739
diff
changeset
|
52 |
LocalStrs: array[0 .. MaxStrIndex] of shortstring; |
10835
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
53 |
LocalStrsL: array[0 .. MaxStrIndex] of TInputStrL; |
3539 | 54 |
missedCount: LongWord; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
55 |
lastStr: LongWord; |
9145 | 56 |
localLastStr: LongInt; |
57 |
history: LongInt; |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
58 |
visibleCount: LongWord; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
59 |
InputStr: TChatLine; |
10835
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
60 |
InputStrL: TInputStrL; // for full str + 4-byte utf-8 char |
4814
e19791f08443
smaller rearrangement of (non stereo related) variables
koda
parents:
4467
diff
changeset
|
61 |
ChatReady: boolean; |
e19791f08443
smaller rearrangement of (non stereo related) variables
koda
parents:
4467
diff
changeset
|
62 |
showAll: boolean; |
10312 | 63 |
liveLua: boolean; |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
64 |
ChatHidden: boolean; |
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
65 |
firstDraw: boolean; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
66 |
InputLinePrefix: shortstring; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
67 |
// cursor |
10836 | 68 |
cursorPos, cursorX, selectedPos, selectionDx: LongInt; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
69 |
LastKeyPressTick: LongWord; |
942 | 70 |
|
8152 | 71 |
const |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
72 |
InputStrLNoPred: byte = 255; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
73 |
|
8152 | 74 |
colors: array[#0..#6] of TSDL_Color = ( |
9311
5baf10a52f43
engine uses final (?) SDL 2 APIs, new events and types added. Touch input broke by the way, and system events should be handled differently
koda
parents:
9145
diff
changeset
|
75 |
(r:$FF; g:$FF; b:$FF; a:$FF), // unused, feel free to take it for anything |
5baf10a52f43
engine uses final (?) SDL 2 APIs, new events and types added. Touch input broke by the way, and system events should be handled differently
koda
parents:
9145
diff
changeset
|
76 |
(r:$FF; g:$FF; b:$FF; a:$FF), // chat message [White] |
5baf10a52f43
engine uses final (?) SDL 2 APIs, new events and types added. Touch input broke by the way, and system events should be handled differently
koda
parents:
9145
diff
changeset
|
77 |
(r:$FF; g:$00; b:$FF; a:$FF), // action message [Purple] |
5baf10a52f43
engine uses final (?) SDL 2 APIs, new events and types added. Touch input broke by the way, and system events should be handled differently
koda
parents:
9145
diff
changeset
|
78 |
(r:$90; g:$FF; b:$90; a:$FF), // join/leave message [Lime] |
5baf10a52f43
engine uses final (?) SDL 2 APIs, new events and types added. Touch input broke by the way, and system events should be handled differently
koda
parents:
9145
diff
changeset
|
79 |
(r:$FF; g:$FF; b:$A0; a:$FF), // team message [Light Yellow] |
5baf10a52f43
engine uses final (?) SDL 2 APIs, new events and types added. Touch input broke by the way, and system events should be handled differently
koda
parents:
9145
diff
changeset
|
80 |
(r:$FF; g:$00; b:$00; a:$FF), // error messages [Red] |
5baf10a52f43
engine uses final (?) SDL 2 APIs, new events and types added. Touch input broke by the way, and system events should be handled differently
koda
parents:
9145
diff
changeset
|
81 |
(r:$00; g:$FF; b:$FF; a:$FF) // input line [Light Blue] |
8152 | 82 |
); |
83 |
ChatCommandz: array [TChatCmd] of record |
|
84 |
ChatCmd: string[31]; |
|
85 |
ProcedureCallChatCmd: string[31]; |
|
86 |
end = ( |
|
87 |
(ChatCmd: '/quit'; ProcedureCallChatCmd: 'halt'), |
|
88 |
(ChatCmd: '/pause'; ProcedureCallChatCmd: 'pause'), |
|
89 |
(ChatCmd: '/finish'; ProcedureCallChatCmd: 'finish'), |
|
9569 | 90 |
(ChatCmd: '/history'; ProcedureCallChatCmd: 'history'), |
8152 | 91 |
(ChatCmd: '/fullscreen'; ProcedureCallChatCmd: 'fullscr') |
92 |
); |
|
2396 | 93 |
|
10303 | 94 |
|
95 |
const Padding = 2; |
|
96 |
ClHeight = 2 * Padding + 16; // font height |
|
97 |
||
10836 | 98 |
procedure ResetSelection(); |
99 |
begin |
|
100 |
selectedPos:= -1; |
|
101 |
end; |
|
102 |
||
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
103 |
procedure UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
104 |
var font: THWFont; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
105 |
str : shortstring; |
10836 | 106 |
coff, soff: LongInt; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
107 |
begin |
10836 | 108 |
if cursorPos = selectedPos then |
109 |
ResetSelection(); |
|
110 |
||
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
111 |
// calculate cursor offset |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
112 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
113 |
str:= InputLinePrefix + InputStr.s; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
114 |
font:= CheckCJKFont(ansistring(str), fnt16); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
115 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
116 |
// get only substring before cursor to determine length |
10837
1b7a4d3111ea
pas2c does not like setlength called with a shortstring apparently
sheepluva
parents:
10836
diff
changeset
|
117 |
// SetLength(str, Length(InputLinePrefix) + cursorPos); // makes pas2c unhappy |
1b7a4d3111ea
pas2c does not like setlength called with a shortstring apparently
sheepluva
parents:
10836
diff
changeset
|
118 |
str[0]:= char(Length(InputLinePrefix) + cursorPos); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
119 |
// get render size of text |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
120 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @coff, nil); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
121 |
|
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
122 |
cursorX:= 2 + coff; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
123 |
|
10836 | 124 |
// calculate selection width on screen |
125 |
if selectedPos >= 0 then |
|
126 |
begin |
|
127 |
if selectedPos > cursorPos then |
|
128 |
str:= InputLinePrefix + InputStr.s; |
|
10837
1b7a4d3111ea
pas2c does not like setlength called with a shortstring apparently
sheepluva
parents:
10836
diff
changeset
|
129 |
// SetLength(str, Length(InputLinePrefix) + selectedPos); // makes pas2c unhappy |
1b7a4d3111ea
pas2c does not like setlength called with a shortstring apparently
sheepluva
parents:
10836
diff
changeset
|
130 |
str[0]:= char(Length(InputLinePrefix) + selectedPos); |
10836 | 131 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @soff, nil); |
132 |
selectionDx:= soff - coff; |
|
133 |
end |
|
134 |
else |
|
135 |
selectionDx:= 0; |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
136 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
137 |
|
10836 | 138 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
139 |
procedure ResetCursor(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
140 |
begin |
10836 | 141 |
ResetSelection(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
142 |
cursorPos:= 0; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
143 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
144 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
145 |
|
10303 | 146 |
procedure RenderChatLineTex(var cl: TChatLine; var str: shortstring); |
147 |
var strSurface, |
|
148 |
resSurface: PSDL_Surface; |
|
149 |
dstrect : TSDL_Rect; // destination rectangle for blitting |
|
150 |
font : THWFont; |
|
151 |
const |
|
152 |
shadowint = $80 shl AShift; |
|
153 |
begin |
|
154 |
||
155 |
font:= CheckCJKFont(ansistring(str), fnt16); |
|
156 |
||
157 |
// get render size of text |
|
158 |
TTF_SizeUTF8(Fontz[font].Handle, Str2PChar(str), @cl.Width, nil); |
|
159 |
||
160 |
// calculate and save size |
|
161 |
cl.Width := cl.Width + 2 * Padding; |
|
162 |
||
163 |
// create surface to draw on |
|
164 |
resSurface:= SDL_CreateRGBSurface( |
|
165 |
0, toPowerOf2(cl.Width), toPowerOf2(ClHeight), |
|
166 |
32, RMask, GMask, BMask, AMask); |
|
167 |
||
168 |
// define area we want to draw in |
|
169 |
dstrect.x:= 0; |
|
170 |
dstrect.y:= 0; |
|
171 |
dstrect.w:= cl.Width; |
|
172 |
dstrect.h:= ClHeight; |
|
173 |
||
174 |
// draw background |
|
175 |
SDL_FillRect(resSurface, @dstrect, shadowint); |
|
176 |
||
177 |
// create and blit text |
|
10370 | 178 |
strSurface:= TTF_RenderUTF8_Blended(Fontz[font].Handle, Str2PChar(str), cl.color); |
10737 | 179 |
//SDL_UpperBlit(strSurface, nil, resSurface, @dstrect); |
180 |
if strSurface <> nil then copyTOXY(strSurface, resSurface, Padding, Padding); |
|
10303 | 181 |
SDL_FreeSurface(strSurface); |
182 |
||
183 |
cl.Tex:= Surface2Tex(resSurface, false); |
|
184 |
||
185 |
SDL_FreeSurface(resSurface) |
|
186 |
end; |
|
187 |
||
188 |
const ClDisplayDuration = 12500; |
|
189 |
||
990
dfa6a6fe1542
Implement history for chat (27 entries), no key binding yet
unc0rr
parents:
988
diff
changeset
|
190 |
procedure SetLine(var cl: TChatLine; str: shortstring; isInput: boolean); |
10303 | 191 |
var color : TSDL_Color; |
942 | 192 |
begin |
4925 | 193 |
if cl.Tex <> nil then |
10634
35d059bd0932
Use FreeAndNil across the board. Even if we are immediately assigning after, probably avoids accidental mistakes. Also free neglected owner tex on shutdown, and delete hog gears using the normal deletion procedure if for any reason they still exist (EndGame call?).
nemo
parents:
10588
diff
changeset
|
194 |
FreeAndNilTexture(cl.Tex); |
2396 | 195 |
|
196 |
if isInput then |
|
6379 | 197 |
begin |
10303 | 198 |
cl.s:= str; |
5392 | 199 |
color:= colors[#6]; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
200 |
str:= InputLinePrefix + str + ' '; |
6379 | 201 |
end |
2664
949c189ba568
powerpc and gameserver compilation disabled temporarily
koda
parents:
2630
diff
changeset
|
202 |
else |
6379 | 203 |
begin |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
204 |
color:= colors[str[1]]; |
10303 | 205 |
delete(str, 1, 1); |
206 |
cl.s:= str; |
|
6379 | 207 |
end; |
2396 | 208 |
|
10303 | 209 |
cl.color:= color; |
945
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
210 |
|
10303 | 211 |
// set texture, note: variables cl.s and str will be different here if isInput |
212 |
RenderChatLineTex(cl, str); |
|
1118 | 213 |
|
10303 | 214 |
cl.Time:= RealTicks + ClDisplayDuration; |
946 | 215 |
end; |
216 |
||
6379 | 217 |
// For uStore texture recreation |
218 |
procedure ReloadLines; |
|
6381 | 219 |
var i, t: LongWord; |
6379 | 220 |
begin |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
221 |
if InputStr.s <> '' then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
222 |
SetLine(InputStr, InputStr.s, true); |
6381 | 223 |
for i:= 0 to MaxStrIndex do |
224 |
if Strs[i].s <> '' then |
|
225 |
begin |
|
226 |
t:= Strs[i].Time; |
|
227 |
SetLine(Strs[i], Strs[i].s, false); |
|
228 |
Strs[i].Time:= t |
|
229 |
end; |
|
6379 | 230 |
end; |
231 |
||
946 | 232 |
procedure AddChatString(s: shortstring); |
233 |
begin |
|
3539 | 234 |
if not ChatReady then |
235 |
begin |
|
236 |
if MissedCount < MaxStrIndex - 1 then |
|
237 |
MStrs[MissedCount]:= s |
|
238 |
else if MissedCount < MaxStrIndex then |
|
239 |
MStrs[MissedCount]:= #5 + '[...]'; |
|
240 |
inc(MissedCount); |
|
241 |
exit |
|
242 |
end; |
|
243 |
||
946 | 244 |
lastStr:= (lastStr + 1) mod (MaxStrIndex + 1); |
245 |
||
990
dfa6a6fe1542
Implement history for chat (27 entries), no key binding yet
unc0rr
parents:
988
diff
changeset
|
246 |
SetLine(Strs[lastStr], s, false); |
945
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
247 |
|
4ead9cde4e14
- Start chat implementation: chat strings are on the screen
unc0rr
parents:
942
diff
changeset
|
248 |
inc(visibleCount) |
942 | 249 |
end; |
250 |
||
251 |
procedure DrawChat; |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
252 |
var i, t, left, top, cnt: LongInt; |
10836 | 253 |
selRect: TSDL_Rect; |
942 | 254 |
begin |
3539 | 255 |
ChatReady:= true; // maybe move to somewhere else? |
1431 | 256 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
257 |
if ChatHidden and (not showAll) then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
258 |
visibleCount:= 0; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
259 |
|
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
260 |
// draw chat lines with some distance from screen border |
10303 | 261 |
left:= 4 - cScreenWidth div 2; |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
262 |
top := 10 + visibleCount * ClHeight; // we start with input line (if any) |
1431 | 263 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
264 |
// draw chat input line first and under all other lines |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
265 |
if (GameState = gsChat) and (InputStr.Tex <> nil) then |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
266 |
begin |
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
267 |
if firstDraw then |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
268 |
begin |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
269 |
UpdateCursorCoords(); |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
270 |
firstDraw:= false; |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
271 |
end; |
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
272 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
273 |
DrawTexture(left, top, InputStr.Tex); |
10836 | 274 |
if selectedPos < 0 then |
275 |
begin |
|
276 |
// draw cursor |
|
277 |
if ((RealTicks - LastKeyPressTick) and 512) < 256 then |
|
10839
aa0ceb47da1d
make sure cursor drawing position does not get messed up by screen resize
sheepluva
parents:
10837
diff
changeset
|
278 |
DrawLineOnScreen(left + cursorX, top + 2, left + cursorX, top + ClHeight - 2, 2.0, $00, $FF, $FF, $FF); |
10836 | 279 |
end |
280 |
else // draw selection |
|
281 |
begin |
|
282 |
selRect.y:= top + 2; |
|
283 |
selRect.h:= clHeight - 4; |
|
284 |
if selectionDx < 0 then |
|
285 |
begin |
|
10839
aa0ceb47da1d
make sure cursor drawing position does not get messed up by screen resize
sheepluva
parents:
10837
diff
changeset
|
286 |
selRect.x:= left + cursorX + selectionDx; |
10836 | 287 |
selRect.w:= -selectionDx; |
288 |
end |
|
289 |
else |
|
290 |
begin |
|
10839
aa0ceb47da1d
make sure cursor drawing position does not get messed up by screen resize
sheepluva
parents:
10837
diff
changeset
|
291 |
selRect.x:= left + cursorX; |
10836 | 292 |
selRect.w:= selectionDx; |
293 |
end; |
|
294 |
||
295 |
DrawRect(selRect, $FF, $FF, $FF, $40, true); |
|
296 |
end; |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
297 |
end; |
1431 | 298 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
299 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
300 |
// draw chat lines |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
301 |
if ((not ChatHidden) or showAll) and (UIDisplay <> uiNone) then |
10375 | 302 |
begin |
303 |
if MissedCount <> 0 then // there are chat strings we missed, so print them now |
|
304 |
begin |
|
305 |
for i:= 0 to MissedCount - 1 do |
|
306 |
AddChatString(MStrs[i]); |
|
307 |
MissedCount:= 0; |
|
308 |
end; |
|
309 |
i:= lastStr; |
|
10303 | 310 |
|
10375 | 311 |
cnt:= 0; // count of lines displayed |
312 |
t := 1; // # of current line processed |
|
2376 | 313 |
|
10375 | 314 |
// draw lines in reverse order |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
315 |
while (((t < 7) and (Strs[i].Time > RealTicks)) or ((t <= MaxStrIndex + 1) and showAll)) |
10375 | 316 |
and (Strs[i].Tex <> nil) do |
317 |
begin |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
318 |
top:= top - ClHeight; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
319 |
// draw chatline only if not offscreen |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
320 |
if top > 0 then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
321 |
DrawTexture(left, top, Strs[i].Tex); |
8745 | 322 |
|
10375 | 323 |
if i = 0 then |
324 |
i:= MaxStrIndex |
|
325 |
else |
|
326 |
dec(i); |
|
327 |
||
328 |
inc(cnt); |
|
329 |
inc(t) |
|
330 |
end; |
|
331 |
||
332 |
visibleCount:= cnt; |
|
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
333 |
end; |
942 | 334 |
end; |
335 |
||
4467 | 336 |
procedure SendHogSpeech(s: shortstring); |
337 |
begin |
|
338 |
SendIPC('h' + s); |
|
339 |
ParseCommand('/hogsay '+s, true) |
|
340 |
end; |
|
341 |
||
10392 | 342 |
procedure SendConsoleCommand(s: shortstring); |
343 |
begin |
|
344 |
Delete(s, 1, 1); |
|
345 |
SendIPC('~' + s) |
|
346 |
end; |
|
347 |
||
1033 | 348 |
procedure AcceptChatString(s: shortstring); |
1035 | 349 |
var i: TWave; |
8152 | 350 |
j: TChatCmd; |
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
351 |
c, t: LongInt; |
4467 | 352 |
x: byte; |
1033 | 353 |
begin |
10513
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
354 |
if s <> LocalStrs[localLastStr] then |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
355 |
begin |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
356 |
// put in input history |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
357 |
localLastStr:= (localLastStr + 1) mod MaxStrIndex; |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
358 |
LocalStrs[localLastStr]:= s; |
10835
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
359 |
LocalStrsL[localLastStr]:= InputStrL; |
10513
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
360 |
end; |
58fa783e0cfd
fixes to chat input history: remember all inputs, don not remember duplicates
sheepluva
parents:
10396
diff
changeset
|
361 |
|
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
362 |
t:= LocalTeam; |
4467 | 363 |
x:= 0; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
364 |
if (s[1] = '"') and (s[Length(s)] = '"') |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
365 |
then x:= 1 |
8745 | 366 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
367 |
else if (s[1] = '''') and (s[Length(s)] = '''') then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
368 |
x:= 2 |
8745 | 369 |
|
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
370 |
else if (s[1] = '-') and (s[Length(s)] = '-') then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
371 |
x:= 3; |
8745 | 372 |
|
8026
4a4f21070479
merge xymeng's gsoc engine with a few updates (and further checks on symbol definitions)
koda
parents:
7722
diff
changeset
|
373 |
if (not CurrentTeam^.ExtDriven) and (x <> 0) then |
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
374 |
for c:= 0 to Pred(TeamsCount) do |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
375 |
if (TeamsArray[c] = CurrentTeam) then |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
376 |
t:= c; |
4467 | 377 |
|
378 |
if x <> 0 then |
|
2017 | 379 |
begin |
4465
743673c67d0c
Allow hog speech when not your turn. Currently is set to 40% opacity (could be fainter) and drawn behind the hogs instead of in front. Also allows hog targetting using a number.
nemo
parents:
4404
diff
changeset
|
380 |
if t = -1 then |
2111 | 381 |
ParseCommand('/say ' + copy(s, 2, Length(s)-2), true) |
382 |
else |
|
4467 | 383 |
SendHogSpeech(char(x) + char(t) + copy(s, 2, Length(s)-2)); |
2017 | 384 |
exit |
385 |
end; |
|
4467 | 386 |
|
9669 | 387 |
if (s[1] = '/') then |
2017 | 388 |
begin |
9676 | 389 |
// These 3 are same as above, only are to make the hedgehog say it on next attack |
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
390 |
if (copy(s, 2, 4) = 'hsa ') then |
9669 | 391 |
begin |
392 |
if CurrentTeam^.ExtDriven then |
|
393 |
ParseCommand('/say ' + copy(s, 6, Length(s)-5), true) |
|
394 |
else |
|
395 |
SendHogSpeech(#4 + copy(s, 6, Length(s)-5)); |
|
396 |
exit |
|
397 |
end; |
|
398 |
||
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
399 |
if (copy(s, 2, 4) = 'hta ') then |
9669 | 400 |
begin |
401 |
if CurrentTeam^.ExtDriven then |
|
402 |
ParseCommand('/say ' + copy(s, 6, Length(s)-5), true) |
|
403 |
else |
|
404 |
SendHogSpeech(#5 + copy(s, 6, Length(s)-5)); |
|
405 |
exit |
|
406 |
end; |
|
407 |
||
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
408 |
if (copy(s, 2, 4) = 'hya ') then |
9669 | 409 |
begin |
410 |
if CurrentTeam^.ExtDriven then |
|
411 |
ParseCommand('/say ' + copy(s, 6, Length(s)-5), true) |
|
412 |
else |
|
413 |
SendHogSpeech(#6 + copy(s, 6, Length(s)-5)); |
|
414 |
exit |
|
415 |
end; |
|
2111 | 416 |
|
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
417 |
if (copy(s, 2, 5) = 'team ') and (length(s) > 6) then |
9669 | 418 |
begin |
419 |
ParseCommand(s, true); |
|
420 |
exit |
|
421 |
end; |
|
422 |
||
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
423 |
if (copy(s, 2, 3) = 'me ') then |
9669 | 424 |
begin |
9680 | 425 |
ParseCommand('/say ' + s, true); |
426 |
exit |
|
427 |
end; |
|
2376 | 428 |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
429 |
if (copy(s, 2, 10) = 'togglechat') then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
430 |
begin |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
431 |
ChatHidden:= (not ChatHidden); |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
432 |
if ChatHidden then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
433 |
showAll:= false; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
434 |
exit |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
435 |
end; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
436 |
|
10304
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
437 |
// debugging commands |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
438 |
if (copy(s, 2, 7) = 'debugvl') then |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
439 |
begin |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
440 |
cViewLimitsDebug:= (not cViewLimitsDebug); |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
441 |
UpdateViewLimits(); |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
442 |
exit |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
443 |
end; |
7e40820b7ed6
fix gl2 build, further rendering cleanup WIP, also new chat command: /debugvl
sheepluva
parents:
10303
diff
changeset
|
444 |
|
10312 | 445 |
if (copy(s, 2, 3) = 'lua') then |
446 |
begin |
|
447 |
AddFileLog('/lua issued'); |
|
448 |
if gameType <> gmtNet then |
|
449 |
begin |
|
450 |
liveLua:= (not liveLua); |
|
451 |
if liveLua then |
|
452 |
begin |
|
453 |
AddFileLog('[Lua] chat input string parsing enabled'); |
|
454 |
AddChatString(#3 + 'Lua parsing: ON'); |
|
455 |
end |
|
456 |
else |
|
457 |
begin |
|
458 |
AddFileLog('[Lua] chat input string parsing disabled'); |
|
459 |
AddChatString(#3 + 'Lua parsing: OFF'); |
|
460 |
end; |
|
461 |
end; |
|
462 |
exit |
|
463 |
end; |
|
464 |
||
465 |
// hedghog animations/taunts and engine commands |
|
9680 | 466 |
if (not CurrentTeam^.ExtDriven) and (CurrentTeam^.Hedgehogs[0].BotLevel = 0) then |
467 |
begin |
|
9669 | 468 |
for i:= Low(TWave) to High(TWave) do |
469 |
if (s = Wavez[i].cmd) then |
|
470 |
begin |
|
471 |
ParseCommand('/taunt ' + char(i), true); |
|
472 |
exit |
|
473 |
end; |
|
10588
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
474 |
end; |
8152 | 475 |
|
10588
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
476 |
for j:= Low(TChatCmd) to High(TChatCmd) do |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
477 |
if (s = ChatCommandz[j].ChatCmd) then |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
478 |
begin |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
479 |
ParseCommand(ChatCommandz[j].ProcedureCallChatCmd, true); |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
480 |
exit |
6189bb1c903d
don't forbid running regular chat commands during turns of other teams. that was probably only meant for emotes to begin with
sheepluva
parents:
10514
diff
changeset
|
481 |
end; |
10392 | 482 |
|
483 |
if (gameType = gmtNet) then |
|
484 |
SendConsoleCommand(s) |
|
10308 | 485 |
end |
10312 | 486 |
else |
487 |
begin |
|
488 |
if liveLua then |
|
489 |
LuaParseString(s) |
|
9676 | 490 |
else |
491 |
ParseCommand('/say ' + s, true); |
|
10312 | 492 |
end; |
1033 | 493 |
end; |
494 |
||
8738 | 495 |
procedure CleanupInput; |
496 |
begin |
|
497 |
FreezeEnterKey; |
|
498 |
history:= 0; |
|
9317
a04c30940d2d
use SDL2 as ifdef symbol because we're not really sdl1.3 compatible, change the compatibility layer, drop unused code, add some documentation
koda
parents:
9311
diff
changeset
|
499 |
{$IFNDEF SDL2} |
8738 | 500 |
SDL_EnableKeyRepeat(0,0); |
9317
a04c30940d2d
use SDL2 as ifdef symbol because we're not really sdl1.3 compatible, change the compatibility layer, drop unused code, add some documentation
koda
parents:
9311
diff
changeset
|
501 |
{$ENDIF} |
8738 | 502 |
GameState:= gsGame; |
503 |
ResetKbd; |
|
504 |
end; |
|
505 |
||
10836 | 506 |
procedure DelBytesFromInputStrBack(endIdx: integer; count: byte); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
507 |
var i, startIdx: integer; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
508 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
509 |
// nothing to do if count is 0 |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
510 |
if count = 0 then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
511 |
exit; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
512 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
513 |
// first byte to delete |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
514 |
startIdx:= endIdx - (count - 1); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
515 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
516 |
// delete bytes from string |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
517 |
Delete(InputStr.s, startIdx, count); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
518 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
519 |
// wipe utf8 info for deleted char |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
520 |
InputStrL[endIdx]:= InputStrLNoPred; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
521 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
522 |
// shift utf8 char info to reflect new string |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
523 |
for i:= endIdx + 1 to Length(InputStr.s) + count do |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
524 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
525 |
if InputStrL[i] <> InputStrLNoPred then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
526 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
527 |
InputStrL[i-count]:= InputStrL[i] - count; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
528 |
InputStrL[i]:= InputStrLNoPred; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
529 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
530 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
531 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
532 |
SetLine(InputStr, InputStr.s, true); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
533 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
534 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
535 |
// returns count of removed bytes |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
536 |
function DelCharFromInputStr(idx: integer): integer; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
537 |
var btw: byte; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
538 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
539 |
// note: idx is always at last byte of utf8 chars. cuz relevant for InputStrL |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
540 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
541 |
if (Length(InputStr.s) < 1) or (idx < 1) or (idx > Length(InputStr.s)) then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
542 |
exit(0); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
543 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
544 |
btw:= byte(idx) - InputStrL[idx]; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
545 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
546 |
DelCharFromInputStr:= btw; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
547 |
|
10836 | 548 |
DelBytesFromInputStrBack(idx, btw); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
549 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
550 |
|
10836 | 551 |
// unchecked |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
552 |
procedure DoCursorStepForward(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
553 |
begin |
10836 | 554 |
// go to end of next utf8-char |
555 |
repeat |
|
556 |
inc(cursorPos); |
|
557 |
until InputStrL[cursorPos] <> InputStrLNoPred; |
|
558 |
end; |
|
559 |
||
560 |
procedure DeleteSelected(); |
|
561 |
begin |
|
562 |
if (selectedPos >= 0) and (cursorPos <> selectedPos) then |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
563 |
begin |
10836 | 564 |
DelBytesFromInputStrBack(max(cursorPos, selectedPos), abs(selectedPos-cursorPos)); |
565 |
cursorPos:= min(cursorPos, selectedPos); |
|
566 |
ResetSelection(); |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
567 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
568 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
569 |
|
10836 | 570 |
procedure HandleSelection(enabled: boolean); |
571 |
begin |
|
572 |
if enabled then |
|
573 |
begin |
|
574 |
if selectedPos < 0 then |
|
575 |
selectedPos:= cursorPos; |
|
576 |
end |
|
577 |
else |
|
578 |
ResetSelection(); |
|
579 |
end; |
|
580 |
||
581 |
procedure KeyPressChat(Key, Sym: Longword; Modifier: Word); |
|
6893 | 582 |
const firstByteMark: array[0..3] of byte = (0, $C0, $E0, $F0); |
8737
0d56265dd60a
implement up and down keys to navigate in the chat history, needs testing over network
koda
parents:
8736
diff
changeset
|
583 |
var i, btw, index: integer; |
8740
3eb1891f81ef
use a local storage for chat history which prevents mix ups in netgame and simplifies code
koda
parents:
8739
diff
changeset
|
584 |
utf8: shortstring; |
10836 | 585 |
action, selMode, ctrl: boolean; |
946 | 586 |
begin |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
587 |
LastKeyPressTick:= RealTicks; |
8745 | 588 |
action:= true; |
10836 | 589 |
|
590 |
selMode:= (modifier and (KMOD_LSHIFT or KMOD_RSHIFT)) <> 0; |
|
591 |
ctrl:= (modifier and (KMOD_LCTRL or KMOD_RCTRL)) <> 0; |
|
592 |
||
8743 | 593 |
case Sym of |
594 |
SDLK_BACKSPACE: |
|
595 |
begin |
|
10836 | 596 |
if selectedPos < 0 then |
597 |
begin |
|
598 |
// remove char before cursor (note: cursorPos is 0-based, char idx isn't) |
|
599 |
dec(cursorPos, DelCharFromInputStr(cursorPos)); |
|
600 |
end |
|
601 |
else |
|
602 |
DeleteSelected(); |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
603 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
604 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
605 |
SDLK_DELETE: |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
606 |
begin |
10836 | 607 |
if selectedPos < 0 then |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
608 |
begin |
10836 | 609 |
// remove char after cursor |
610 |
if cursorPos < Length(InputStr.s) then |
|
611 |
begin |
|
612 |
DoCursorStepForward(); |
|
613 |
dec(cursorPos, DelCharFromInputStr(cursorPos)); |
|
614 |
end; |
|
615 |
end |
|
616 |
else |
|
617 |
DeleteSelected(); |
|
618 |
UpdateCursorCoords(); |
|
8743 | 619 |
end; |
8745 | 620 |
SDLK_ESCAPE: |
8743 | 621 |
begin |
8745 | 622 |
if Length(InputStr.s) > 0 then |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
623 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
624 |
SetLine(InputStr, '', true); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
625 |
FillChar(InputStrL, sizeof(InputStrL), InputStrLNoPred); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
626 |
ResetCursor(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
627 |
end |
8743 | 628 |
else CleanupInput |
629 |
end; |
|
9319
492a0ad67e33
allow to send chat messages with numpad enter key too (regression?)
koda
parents:
9317
diff
changeset
|
630 |
SDLK_RETURN, SDLK_KP_ENTER: |
8743 | 631 |
begin |
632 |
if Length(InputStr.s) > 0 then |
|
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
633 |
begin |
8743 | 634 |
AcceptChatString(InputStr.s); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
635 |
SetLine(InputStr, '', false); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
636 |
FillChar(InputStrL, sizeof(InputStrL), InputStrLNoPred); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
637 |
ResetCursor(); |
2948
3f21a9dc93d0
Replace tabs with spaces using 'expand -t 4' command
unc0rr
parents:
2716
diff
changeset
|
638 |
end; |
8743 | 639 |
CleanupInput |
640 |
end; |
|
641 |
SDLK_UP, SDLK_DOWN: |
|
642 |
begin |
|
643 |
if (Sym = SDLK_UP) and (history < localLastStr) then inc(history); |
|
644 |
if (Sym = SDLK_DOWN) and (history > 0) then dec(history); |
|
645 |
index:= localLastStr - history + 1; |
|
646 |
if (index > localLastStr) then |
|
10835
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
647 |
begin |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
648 |
SetLine(InputStr, '', true); |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
649 |
FillChar(InputStrL, sizeof(InputStrL), InputStrLNoPred); |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
650 |
end |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
651 |
else |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
652 |
begin |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
653 |
SetLine(InputStr, LocalStrs[index], true); |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
654 |
InputStrL:= LocalStrsL[index]; |
8ac09cd322b7
fix chat input history not restoring utf8-related info
sheepluva
parents:
10834
diff
changeset
|
655 |
end; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
656 |
cursorPos:= Length(InputStr.s); |
10836 | 657 |
ResetSelection(); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
658 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
659 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
660 |
SDLK_HOME: |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
661 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
662 |
if cursorPos > 0 then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
663 |
begin |
10836 | 664 |
HandleSelection(selMode); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
665 |
cursorPos:= 0; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
666 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
667 |
end; |
8745 | 668 |
end; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
669 |
SDLK_END: |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
670 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
671 |
i:= Length(InputStr.s); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
672 |
if cursorPos < i then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
673 |
begin |
10836 | 674 |
HandleSelection(selMode); |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
675 |
cursorPos:= i; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
676 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
677 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
678 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
679 |
SDLK_LEFT: |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
680 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
681 |
if cursorPos > 0 then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
682 |
begin |
10836 | 683 |
if selMode or (selectedPos < 0) then |
684 |
begin |
|
685 |
HandleSelection(selMode); |
|
686 |
// go to end of previous utf8-char |
|
687 |
cursorPos:= InputStrL[cursorPos]; |
|
688 |
end |
|
689 |
else // if we're leaving selection mode, jump to its left end |
|
690 |
begin |
|
691 |
cursorPos:= min(cursorPos, selectedPos); |
|
692 |
ResetSelection(); |
|
693 |
end; |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
694 |
UpdateCursorCoords(); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
695 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
696 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
697 |
SDLK_RIGHT: |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
698 |
begin |
10836 | 699 |
if cursorPos < Length(InputStr.s) then |
700 |
begin |
|
701 |
if selMode or (selectedPos < 0) then |
|
702 |
begin |
|
703 |
HandleSelection(selMode); |
|
704 |
DoCursorStepForward(); |
|
705 |
end |
|
706 |
else // if we're leaving selection mode, jump to its right end |
|
707 |
begin |
|
708 |
cursorPos:= max(cursorPos, selectedPos); |
|
709 |
ResetSelection(); |
|
710 |
end; |
|
711 |
UpdateCursorCoords(); |
|
712 |
end; |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
713 |
end; |
8745 | 714 |
SDLK_PAGEUP, SDLK_PAGEDOWN: |
715 |
begin |
|
716 |
// ignore me!!! |
|
717 |
end; |
|
10836 | 718 |
SDLK_a: |
719 |
begin |
|
720 |
// select all |
|
721 |
if ctrl then |
|
722 |
begin |
|
723 |
ResetSelection(); |
|
724 |
cursorPos:= Length(InputStr.s); |
|
725 |
HandleSelection(true); |
|
726 |
cursorPos:= 0; |
|
727 |
UpdateCursorCoords(); |
|
728 |
end |
|
729 |
else |
|
730 |
action:= false; |
|
731 |
end; |
|
8745 | 732 |
else |
733 |
action:= false; |
|
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
734 |
end; |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
735 |
if not action and (Key <> 0) then |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
736 |
begin |
10836 | 737 |
DeleteSelected(); |
738 |
||
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
739 |
if (Key < $80) then |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
740 |
btw:= 1 |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
741 |
else if (Key < $800) then |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
742 |
btw:= 2 |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
743 |
else if (Key < $10000) then |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
744 |
btw:= 3 |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
745 |
else |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
746 |
btw:= 4; |
8737
0d56265dd60a
implement up and down keys to navigate in the chat history, needs testing over network
koda
parents:
8736
diff
changeset
|
747 |
|
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
748 |
utf8:= ''; |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
749 |
|
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
750 |
for i:= btw downto 2 do |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
751 |
begin |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
752 |
utf8:= char((Key or $80) and $BF) + utf8; |
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
753 |
Key:= Key shr 6 |
8737
0d56265dd60a
implement up and down keys to navigate in the chat history, needs testing over network
koda
parents:
8736
diff
changeset
|
754 |
end; |
2376 | 755 |
|
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
756 |
utf8:= char(Key or firstByteMark[Pred(btw)]) + utf8; |
946 | 757 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
758 |
if Length(InputStr.s) + btw > 240 then |
8742
b7b8bd398c1b
Key returned 0 for arrows under linux. Sym works, clearer anyway.
nemo
parents:
8741
diff
changeset
|
759 |
exit; |
2376 | 760 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
761 |
// if we insert rather than append, shift info in InputStrL accordingly |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
762 |
if cursorPos < Length(InputStr.s) then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
763 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
764 |
for i:= Length(InputStr.s) downto cursorPos + 1 do |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
765 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
766 |
if InputStrL[i] <> InputStrLNoPred then |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
767 |
begin |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
768 |
InputStrL[i+btw]:= InputStrL[i] + btw; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
769 |
InputStrL[i]:= InputStrLNoPred; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
770 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
771 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
772 |
end; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
773 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
774 |
InputStrL[cursorPos + btw]:= cursorPos; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
775 |
Insert(utf8, InputStr.s, cursorPos + 1); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
776 |
SetLine(InputStr, InputStr.s, true); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
777 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
778 |
cursorPos:= cursorPos + btw; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
779 |
UpdateCursorCoords(); |
8735 | 780 |
end |
946 | 781 |
end; |
782 |
||
4404 | 783 |
procedure chChatMessage(var s: shortstring); |
784 |
begin |
|
785 |
AddChatString(s) |
|
786 |
end; |
|
787 |
||
4402 | 788 |
procedure chSay(var s: shortstring); |
789 |
begin |
|
790 |
SendIPC('s' + s); |
|
791 |
||
792 |
if copy(s, 1, 4) = '/me ' then |
|
6453
11c578d30bd3
Countless imporvements to the parser and countless help to the parser in sources.
unc0rr
parents:
6381
diff
changeset
|
793 |
s:= #2 + '* ' + UserNick + ' ' + copy(s, 5, Length(s) - 4) |
4402 | 794 |
else |
795 |
s:= #1 + UserNick + ': ' + s; |
|
796 |
||
797 |
AddChatString(s) |
|
798 |
end; |
|
799 |
||
800 |
procedure chTeamSay(var s: shortstring); |
|
801 |
begin |
|
802 |
SendIPC('b' + s); |
|
803 |
||
804 |
s:= #4 + '[Team] ' + UserNick + ': ' + s; |
|
805 |
||
806 |
AddChatString(s) |
|
807 |
end; |
|
808 |
||
809 |
procedure chHistory(var s: shortstring); |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
810 |
var i: LongInt; |
4402 | 811 |
begin |
812 |
s:= s; // avoid compiler hint |
|
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
813 |
showAll:= not showAll; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
814 |
// immediatly recount |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
815 |
visibleCount:= 0; |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
816 |
if showAll or (not ChatHidden) then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
817 |
for i:= 0 to MaxStrIndex do |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
818 |
begin |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
819 |
if (Strs[i].Tex <> nil) and (showAll or (Strs[i].Time > RealTicks)) then |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
820 |
inc(visibleCount); |
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
821 |
end; |
4402 | 822 |
end; |
823 |
||
824 |
procedure chChat(var s: shortstring); |
|
825 |
begin |
|
826 |
s:= s; // avoid compiler hint |
|
827 |
GameState:= gsChat; |
|
9317
a04c30940d2d
use SDL2 as ifdef symbol because we're not really sdl1.3 compatible, change the compatibility layer, drop unused code, add some documentation
koda
parents:
9311
diff
changeset
|
828 |
{$IFNDEF SDL2} |
5099
ce1a761d3c1e
enable keyrepeat while chatting so you can keep backspace pressed to delete a line (fix issue 111)
koda
parents:
4976
diff
changeset
|
829 |
SDL_EnableKeyRepeat(200,45); |
9317
a04c30940d2d
use SDL2 as ifdef symbol because we're not really sdl1.3 compatible, change the compatibility layer, drop unused code, add some documentation
koda
parents:
9311
diff
changeset
|
830 |
{$ENDIF} |
4402 | 831 |
if length(s) = 0 then |
5100 | 832 |
SetLine(InputStr, '', true) |
4402 | 833 |
else |
10841 | 834 |
begin |
8739 | 835 |
SetLine(InputStr, '/team ', true) |
10841 | 836 |
// update InputStrL and cursor accordingly |
837 |
// this allows cursor-jumping over '/team ' as if it was a single char |
|
838 |
InputStrL[6]:= 0; |
|
839 |
cursorPos:= 6; |
|
840 |
UpdateCursorCoords(); |
|
841 |
end; |
|
4402 | 842 |
end; |
843 |
||
3038 | 844 |
procedure initModule; |
4925 | 845 |
var i: ShortInt; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
846 |
begin |
6898 | 847 |
RegisterVariable('chatmsg', @chChatMessage, true); |
848 |
RegisterVariable('say', @chSay, true); |
|
849 |
RegisterVariable('team', @chTeamSay, true); |
|
850 |
RegisterVariable('history', @chHistory, true ); |
|
851 |
RegisterVariable('chat', @chChat, true ); |
|
4402 | 852 |
|
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
853 |
lastStr:= 0; |
8740
3eb1891f81ef
use a local storage for chat history which prevents mix ups in netgame and simplifies code
koda
parents:
8739
diff
changeset
|
854 |
localLastStr:= 0; |
8737
0d56265dd60a
implement up and down keys to navigate in the chat history, needs testing over network
koda
parents:
8736
diff
changeset
|
855 |
history:= 0; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
856 |
visibleCount:= 0; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
857 |
showAll:= false; |
3539 | 858 |
ChatReady:= false; |
859 |
missedCount:= 0; |
|
10312 | 860 |
liveLua:= false; |
10514
a1423588a4e4
chat: fix some glitches, add /togglechat command for changing chat visibility
sheepluva
parents:
10513
diff
changeset
|
861 |
ChatHidden:= false; |
10842
a039464cbb4a
since fonts can be loaded in late, update cursor position before first chat display
sheepluva
parents:
10841
diff
changeset
|
862 |
firstDraw:= true; |
4925 | 863 |
|
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
864 |
InputLinePrefix:= UserNick + '> '; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
865 |
inputStr.s:= ''; |
4925 | 866 |
inputStr.Tex := nil; |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
867 |
for i:= 0 to MaxStrIndex do |
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
868 |
Strs[i].Tex := nil; |
10834
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
869 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
870 |
FillChar(InputStrL, sizeof(InputStrL), InputStrLNoPred); |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
871 |
|
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
872 |
LastKeyPressTick:= 0; |
2e83f33dfe5b
engine: moveable chat cursor. note: discovered bug that utf8 char info is lost/corrupted when input history is used
sheepluva
parents:
10737
diff
changeset
|
873 |
ResetCursor(); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
874 |
end; |
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
875 |
|
3038 | 876 |
procedure freeModule; |
4901 | 877 |
var i: ShortInt; |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
878 |
begin |
10634
35d059bd0932
Use FreeAndNil across the board. Even if we are immediately assigning after, probably avoids accidental mistakes. Also free neglected owner tex on shutdown, and delete hog gears using the normal deletion procedure if for any reason they still exist (EndGame call?).
nemo
parents:
10588
diff
changeset
|
879 |
FreeAndNilTexture(InputStr.Tex); |
6580
6155187bf599
A partial reformatting of the pascal code to have consistent syntax. Things that are still inconsistent.
lovelacer
parents:
6453
diff
changeset
|
880 |
for i:= 0 to MaxStrIndex do |
10634
35d059bd0932
Use FreeAndNil across the board. Even if we are immediately assigning after, probably avoids accidental mistakes. Also free neglected owner tex on shutdown, and delete hog gears using the normal deletion procedure if for any reason they still exist (EndGame call?).
nemo
parents:
10588
diff
changeset
|
881 |
FreeAndNilTexture(Strs[i].Tex); |
2716
b9ca1bfca24f
complete the replacement of init/free wrappers for every unit
koda
parents:
2699
diff
changeset
|
882 |
end; |
946 | 883 |
|
942 | 884 |
end. |