DEADSOFTWARE

cleanup: move monster-specific code from g_basic
[d2df-sdl.git] / src / game / g_basic.pas
index e5ef3d9c28acdff92c10e22ddf19ef8beb635e92..d119742bcec3881673e4e8acb7a922810da417ae 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
@@ -39,6 +38,9 @@ type
   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;
@@ -52,7 +54,6 @@ function g_CollidePlayer(X, Y: Integer; Width, Height: Word): Boolean; inline;
 function g_PatchLength(X1, Y1, X2, Y2: Integer): Word;
 function g_TraceVector(X1, Y1, X2, Y2: Integer): Boolean; // `true`: no wall hit
 function g_GetAcidHit(X, Y: Integer; Width, Height: Word): Byte;
-function g_Look(a, b: PObj; d: TDirection): Boolean;
 procedure IncMax(var A: Integer; B, Max: Integer); overload;
 procedure IncMax(var A: Single; B, Max: Single); overload;
 procedure IncMax(var A: Integer; Max: Integer); overload;
@@ -74,8 +75,6 @@ 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): 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;
@@ -90,6 +89,7 @@ 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;
@@ -98,7 +98,34 @@ implementation
 
 uses
   Math, geom, e_log, g_map, g_gfx, g_player, SysUtils, MAPDEF,
-  StrUtils, e_graphics, g_monsters, g_items, g_game;
+  StrUtils, 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
@@ -452,23 +479,6 @@ begin
   Result := tab[a];
 end;
 
-function g_Look(a, b: PObj; d: TDirection): Boolean;
-begin
-  if not gmon_dbg_los_enabled then begin result := false; exit; end; // always "wall hit"
-
-  if ((b^.X > a^.X) and (d = TDirection.D_LEFT)) or
-     ((b^.X < a^.X) and (d = TDirection.D_RIGHT)) then
-  begin
-    Result := False;
-    Exit;
-  end;
-
-  Result := g_TraceVector(a^.X+a^.Rect.X+(a^.Rect.Width div 2),
-                          a^.Y+a^.Rect.Y+(a^.Rect.Height div 2),
-                          b^.X+b^.Rect.X+(b^.Rect.Width div 2),
-                          b^.Y+b^.Rect.Y+(b^.Rect.Height div 2));
-end;
-
 function GetAngle(baseX, baseY, pointX, PointY: Integer): SmallInt;
 var
   c: Single;
@@ -628,138 +638,6 @@ 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;
-
-  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
-  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): 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
-  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;
-  end;
-end;
-
-procedure Sort(var a: SSArray);
-var
-  i, j: Integer;
-  s: string;
-begin
-  if a = nil then Exit;
-
-  for i := High(a) downto Low(a) do
-    for j := Low(a) to High(a)-1 do
-      if LowerCase(a[j]) > LowerCase(a[j+1]) then
-      begin
-        s := a[j];
-        a[j] := a[j+1];
-        a[j+1] := s;
-      end;
-end;
-
 function Sscanf(const s: String; const fmt: String;
                 const Pointers: array of Pointer): Integer;
 var
@@ -1180,4 +1058,14 @@ 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.