diff --git a/src/game/g_basic.pas b/src/game/g_basic.pas
index 01a27b05ef21ccb9dcd247b8ce654884afce96c0..7df493fe4f248a8fe57ac8fb11da55c9713227b4 100644 (file)
--- a/src/game/g_basic.pas
+++ b/src/game/g_basic.pas
DWArray = array of DWORD;
String20 = String[20];
+function g_GetBuilderName (): AnsiString;
+function g_GetBuildHash (full: Boolean = True): AnsiString;
+
function g_CreateUID(UIDType: Byte): Word;
function g_GetUIDType(UID: Word): Byte;
function g_Collide(X1, Y1: Integer; Width1, Height1: Word;
Math, geom, e_log, g_map, g_gfx, g_player, SysUtils, MAPDEF,
StrUtils, e_graphics, g_monsters, g_items, g_game;
+{$PUSH}
+{$WARN 2054 OFF} // unknwon env var
+{$WARN 6018 OFF} // unreachable code
+function g_GetBuilderName (): AnsiString;
+begin
+ if {$I %D2DF_BUILD_USER%} <> '' then
+ result := {$I %D2DF_BUILD_USER%} // custom
+ else if {$I %USER%} <> '' then
+ result := {$I %USER%} // unix username
+ else if {$I %USERNAME%} <> '' then
+ result := {$I %USERNAME%} // windows username
+ else
+ result := 'unknown'
+end;
+
+function g_GetBuildHash (full: Boolean = True): AnsiString;
+begin
+ if {$I %D2DF_BUILD_HASH%} <> '' then
+ if full then
+ result := {$I %D2DF_BUILD_HASH%}
+ else
+ result := Copy({$I %D2DF_BUILD_HASH%}, 1, 7)
+ else
+ result := 'custom build'
+end;
+{$POP}
+
function g_PatchLength(X1, Y1, X2, Y2: Integer): Word;
begin
Result := Min(Round(Hypot(Abs(X2-X1), Abs(Y2-Y1))), 65535);
end;
end;
-{function GetLines(Text: string; MaxChars: Word): SSArray;
-var
- a: Integer;
- b: array of string;
- str: string;
-begin
- Text := Trim(Text);
+function GetLines (Text: string; FontID: DWORD; MaxWidth: Word): SSArray;
+ var i, j, len, lines: Integer;
- while Pos(' ', Text) <> 0 do Text := AnsiReplaceStr(Text, ' ', ' ');
-
- while Text <> '' do
- begin
- SetLength(b, Length(b)+1);
- b[High(b)] := GetStr(Text);
- end;
-
- a := 0;
- while True do
- begin
- if a > High(b) then Break;
-
- str := b[a];
- a := a+1;
-
- if Length(str) >= MaxChars then
+ function GetLine (j, i: Integer): String;
begin
- while str <> '' do
- begin
- SetLength(Result, Length(Result)+1);
- Result[High(Result)] := Copy(str, 1, MaxChars);
- Delete(str, 1, MaxChars);
- end;
-
- Continue;
+ result := Copy(text, j, i - j + 1);
end;
- while (a <= High(b)) and (Length(str+' '+b[a]) <= MaxChars) do
+ function GetWidth (j, i: Integer): Integer;
+ var w, h: Word;
begin
- str := str+' '+b[a];
- a := a+1;
+ e_CharFont_GetSize(FontID, GetLine(j, i), w, h);
+ result := w
end;
- SetLength(Result, Length(Result)+1);
- Result[High(Result)] := str;
- end;
-end;}
-
-function GetLines(Text: string; FontID: DWORD; MaxWidth: Word): SSArray;
-
-function TextLen(Text: string): Word;
-var
- h: Word;
begin
- e_CharFont_GetSize(FontID, Text, Result, h);
-end;
-
-var
- a, c: Integer;
- b: array of string;
- str: string;
-begin
- SetLength(Result, 0);
- SetLength(b, 0);
-
- Text := Trim(Text);
-
-// Óäàëÿåì ìíîæåñòâåííûå ïðîáåëû:
- while Pos(' ', Text) <> 0 do
- Text := AnsiReplaceStr(Text, ' ', ' ');
-
- while Text <> '' do
- begin
- SetLength(b, Length(b)+1);
- b[High(b)] := GetStr(Text);
- end;
-
- a := 0;
- while True do
+ result := nil; lines := 0;
+ j := 1; i := 1; len := Length(Text);
+ // e_LogWritefln('GetLines @%s len=%s [%s]', [MaxWidth, len, Text]);
+ while j <= len do
begin
- if a > High(b) then
- Break;
-
- str := b[a];
- a := a+1;
-
- if TextLen(str) > MaxWidth then
- begin // Òåêóùàÿ ñòðîêà ñëèøêîì äëèííàÿ => ðàçáèâàåì
- while str <> '' do
- begin
- SetLength(Result, Length(Result)+1);
-
- c := 0;
- while (c < Length(str)) and
- (TextLen(Copy(str, 1, c+1)) < MaxWidth) do
- c := c+1;
-
- Result[High(Result)] := Copy(str, 1, c);
- Delete(str, 1, c);
- end;
- end
- else // Ñòðîêà íîðìàëüíîé äëèíû => ñîåäèíÿåì ñî ñëåäóþùèìè
- begin
- while (a <= High(b)) and
- (TextLen(str+' '+b[a]) < MaxWidth) do
- begin
- str := str+' '+b[a];
- a := a + 1;
- end;
-
- SetLength(Result, Length(Result)+1);
- Result[High(Result)] := str;
- end;
+ (* --- Get longest possible sequence --- *)
+ while (i + 1 <= len) and (GetWidth(j, i + 1) <= MaxWidth) do Inc(i);
+ (* --- Do not include part of word --- *)
+ if (i < len) and (text[i] <> ' ') then
+ while (i >= j) and (text[i] <> ' ') do Dec(i);
+ (* --- Do not include spaces --- *)
+ while (i >= j) and (text[i] = ' ') do Dec(i);
+ (* --- Add line --- *)
+ SetLength(result, lines + 1);
+ result[lines] := GetLine(j, i);
+ // e_LogWritefln(' -> (%s:%s::%s) [%s]', [j, i, GetWidth(j, i), result[lines]]);
+ Inc(lines);
+ (* --- Skip spaces --- *)
+ while (i <= len) and (text[i] = ' ') do Inc(i);
+ j := i + 2;
end;
end;