DEADSOFTWARE

better line wrapping for map description
[d2df-sdl.git] / src / game / g_basic.pas
index bd3f50e76b3f2049e0ce6d9b41d63db4da9c8cf8..92a7955d505d74db05049759ad63e67b5e1bc4ad 100644 (file)
@@ -2,8 +2,7 @@
  *
  * 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
@@ -629,118 +628,42 @@ begin
     end;
 end;
 
-{function GetLines(Text: string; MaxChars: Word): SSArray;
-var
-  a: Integer;
-  b: array of string;
-  str: string;
-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;
+function GetLines (Text: string; FontID: DWORD; MaxWidth: Word): SSArray;
+  var i, j, len, lines: Integer;
 
-  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;