X-Git-Url: https://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fgame%2Fg_basic.pas;h=1ed87abd9145fba8dbf04b0875b590d38dbb7d2f;hb=414f2873efa0cce84499f64774db7000e6268971;hp=f6653a3126574ff91eb115f2af3dda260595b8e1;hpb=2d5c517f0d38a9f31e8e780416269ea787852930;p=d2df-sdl.git diff --git a/src/game/g_basic.pas b/src/game/g_basic.pas index f6653a3..1ed87ab 100644 --- a/src/game/g_basic.pas +++ b/src/game/g_basic.pas @@ -1,9 +1,8 @@ -(* Copyright (C) DooM 2D:Forever Developers +(* Copyright (C) Doom 2D: Forever Developers * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. + * the Free Software Foundation, version 3 of the License ONLY. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -19,10 +18,12 @@ unit g_basic; interface uses - wadreader, g_phys; + utils, g_phys; const GAME_VERSION = '0.667'; + GAME_BUILDDATE = {$I %DATE%}; + GAME_BUILDTIME = {$I %TIME%}; UID_GAME = 1; UID_PLAYER = 2; UID_MONSTER = 3; @@ -72,22 +73,23 @@ function Sign(A: Single): ShortInt; overload; function PointToRect(X, Y, X1, Y1: Integer; Width, Height: Word): Integer; function GetAngle(baseX, baseY, pointX, PointY: Integer): SmallInt; function GetAngle2(vx, vy: Integer): SmallInt; -function GetLines(Text: string; FontID: DWORD; MaxWidth: Word): SArray; -procedure Sort(var a: SArray); +function GetLines(Text: string; FontID: DWORD; MaxWidth: Word): SSArray; +procedure Sort(var a: SSArray); function Sscanf(const s: string; const fmt: string; const Pointers: array of Pointer): Integer; function InDWArray(a: DWORD; arr: DWArray): Boolean; function InWArray(a: Word; arr: WArray): Boolean; -function InSArray(a: string; arr: SArray): Boolean; +function InSArray(a: string; arr: SSArray): Boolean; function GetPos(UID: Word; o: PObj): Boolean; -function parse(s: string): SArray; -function parse2(s: string; delim: Char): SArray; +function parse(s: string): SSArray; +function parse2(s: string; delim: Char): SSArray; function g_GetFileTime(fileName: String): Integer; function g_SetFileTime(fileName: String; time: Integer): Boolean; -procedure SortSArray(var S: SArray); +procedure SortSArray(var S: SSArray); function b_Text_Format(S: string): string; function b_Text_Unformat(S: string): string; - +function b_Text_Wrap(S: string; LineLen: Integer): string; +function b_Text_LineCount(S: string): Integer; var gmon_dbg_los_enabled: Boolean = true; @@ -626,122 +628,42 @@ begin end; end; -{function GetLines(Text: string; MaxChars: Word): SArray; -var - a: Integer; - b: array of string; - str: string; +function GetLines (Text: string; FontID: DWORD; MaxWidth: Word): SSArray; + var i, j, len, lines: Integer; w, cw, ch: Word; skip: Boolean; begin - 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 - begin - if a > High(b) then Break; - - str := b[a]; - a := a+1; - - if Length(str) >= MaxChars then - begin - while str <> '' do - begin - SetLength(Result, Length(Result)+1); - Result[High(Result)] := Copy(str, 1, MaxChars); - Delete(str, 1, MaxChars); - end; - - Continue; - end; - - while (a <= High(b)) and (Length(str+' '+b[a]) <= MaxChars) do + result := nil; lines := 0; w := 0; + j := 1; i := 1; len := Length(Text); + while i <= len do begin - str := str+' '+b[a]; - a := a+1; - end; - - SetLength(Result, Length(Result)+1); - Result[High(Result)] := str; - end; -end;} - -function GetLines(Text: string; FontID: DWORD; MaxWidth: Word): SArray; - -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 - begin - if a > High(b) then - Break; - - str := b[a]; - a := a+1; - - if TextLen(str) > MaxWidth then - begin // Òåêóùàÿ ñòðîêà ñëèøêîì äëèííàÿ => ðàçáèâàåì - while str <> '' do + e_CharFont_GetSize(FontID, '' + Text[i], cw, ch); + if (i >= len) or (w + cw >= MaxWidth) then + begin + skip := (i < len) and (Text[i] <> ' '); + if skip then 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); + // alt: while (i >= j) and (Text[i] <> ' ') do Dec(i); + while (i <= len) and (Text[i] <> ' ') do Inc(i); end; - end - else // Ñòðîêà íîðìàëüíîé äëèíû => ñîåäèíÿåì ñî ñëåäóþùèìè - begin - while (a <= High(b)) and - (TextLen(str+' '+b[a]) < MaxWidth) do + while (i >= j) and (Text[i] = ' ') do Dec(i); + (* --- *) + SetLength(result, lines + 1); + result[lines] := Copy(Text, j, i - j + 1); + Inc(lines); + (* --- *) + if skip then begin - str := str+' '+b[a]; - a := a + 1; + while (i <= len) and (Text[i] = ' ') do Inc(i); + Inc(i); end; - - SetLength(Result, Length(Result)+1); - Result[High(Result)] := str; + j := i + 1; + w := 0 end; + Inc(w, cw); + Inc(i) end; end; -procedure Sort(var a: SArray); +procedure Sort(var a: SSArray); var i, j: Integer; s: string; @@ -934,7 +856,7 @@ begin end; end; -function InSArray(a: string; arr: SArray): Boolean; +function InSArray(a: string; arr: SSArray): Boolean; var b: Integer; begin @@ -983,7 +905,7 @@ begin Result := True; end; -function parse(s: String): SArray; +function parse(s: String): SSArray; var a: Integer; begin @@ -1009,7 +931,7 @@ begin end; end; -function parse2(s: string; delim: Char): SArray; +function parse2(s: string; delim: Char): SSArray; var a: Integer; begin @@ -1064,7 +986,7 @@ begin CloseFile(F); end; -procedure SortSArray(var S: SArray); +procedure SortSArray(var S: SSArray); var b: Boolean; i: Integer; @@ -1173,4 +1095,19 @@ begin end; end; +function b_Text_Wrap(S: string; LineLen: Integer): string; +begin + Result := WrapText(S, ''#10, [#10, ' ', '-'], LineLen); +end; + +function b_Text_LineCount(S: string): Integer; +var + I: Integer; +begin + Result := IfThen(S = '', 0, 1); + for I := 1 to High(S) do + if S[I] = #10 then + Inc(Result); +end; + end.