DEADSOFTWARE

don't load unused textures
[d2df-sdl.git] / src / game / g_map.pas
index bd949579204bebf3560f558c2d840ef49abd9a44..b1174c8595ef86a1dafd7b550994b894906e0e06 100644 (file)
@@ -257,6 +257,21 @@ const
   FLAG_SIGNATURE = $47414C46; // 'FLAG'
 
 
+// ////////////////////////////////////////////////////////////////////////// //
+procedure mapWarningCB (const msg: AnsiString; line, col: Integer);
+begin
+  if (line > 0) then
+  begin
+    e_LogWritefln('parse error at (%s,%s): %s', [line, col, msg], TMsgType.Warning);
+  end
+  else
+  begin
+    e_LogWritefln('parse error: %s', [msg], TMsgType.Warning);
+  end;
+end;
+
+
+// ////////////////////////////////////////////////////////////////////////// //
 var
   panByGUID: array of TPanel = nil;
 
@@ -885,7 +900,7 @@ begin
   if TextNameHash.get(RecName, result) then
   begin
     // i found her!
-    //e_LogWritefln('texture ''%s'' already loaded', [RecName]);
+    //e_LogWritefln('texture ''%s'' already loaded (%s)', [RecName, result]);
     exit;
   end;
 
@@ -953,7 +968,9 @@ begin
     SetLength(Textures, Length(Textures)+1);
     if not e_CreateTextureMem(TextureData, ResLength, Textures[High(Textures)].TextureID) then
     begin
+      e_WriteLog(Format('Error loading texture %s', [RecName]), TMsgType.Warning);
       SetLength(Textures, Length(Textures)-1);
+      result := -1;
       Exit;
     end;
     e_GetTextureSize(Textures[High(Textures)].TextureID, @Textures[High(Textures)].Width, @Textures[High(Textures)].Height);
@@ -1001,7 +1018,7 @@ begin
   if TextNameHash.get(RecName, result) then
   begin
     // i found her!
-    //e_LogWritefln('animated texture ''%s'' already loaded', [RecName]);
+    //e_LogWritefln('animated texture ''%s'' already loaded (%s)', [RecName, result]);
     exit;
   end;
 
@@ -1604,7 +1621,7 @@ var
   PanelID: DWORD;
   AddTextures: TAddTextureArray;
   TriggersTable: array of TTRec;
-  FileName, mapResName, s, TexName: String;
+  FileName, mapResName, TexName, s: AnsiString;
   Data: Pointer;
   Len: Integer;
   ok, isAnim: Boolean;
@@ -1617,6 +1634,7 @@ var
   //moveActive: Boolean;
   pan: TPanel;
   mapOk: Boolean = false;
+  usedTextures: THashStrInt = nil; // key: mapTextureList
 begin
   mapGrid.Free();
   mapGrid := nil;
@@ -1730,31 +1748,53 @@ begin
       e_WriteLog('  Loading textures:', TMsgType.Notify);
       g_Game_SetLoadingText(_lc[I_LOAD_TEXTURES], mapTextureList.count-1, False);
 
-      cnt := -1;
-      for rec in mapTextureList do
-      begin
-        Inc(cnt);
-        s := rec.Resource;
-        {$IF DEFINED(D2F_DEBUG_TXLOAD)}
-        e_WriteLog(Format('    Loading texture #%d: %s', [cnt, s]), TMsgType.Notify);
-        {$ENDIF}
-        //if g_Map_IsSpecialTexture(s) then e_WriteLog('      SPECIAL!', MSG_NOTIFY);
-        if rec.Anim then
-        begin
-          // Àíèìèðîâàííàÿ òåêñòóðà
-          ntn := CreateAnimTexture(rec.Resource, FileName, True);
-          if (ntn < 0) then g_SimpleError(Format(_lc[I_GAME_ERROR_TEXTURE_ANIM], [s]));
-        end
-        else
+      // find used textures
+      usedTextures := hashNewStrInt();
+      try
+        if (panels <> nil) and (panels.count > 0) then
         begin
-          // Îáû÷íàÿ òåêñòóðà
-          ntn := CreateTexture(rec.Resource, FileName, True);
-          if (ntn < 0) then g_SimpleError(Format(_lc[I_GAME_ERROR_TEXTURE_SIMPLE], [s]));
+          for rec in panels do
+          begin
+            texrec := rec.TextureRec;
+            if (texrec <> nil) then usedTextures.put(toLowerCase1251(texrec.Resource), 42);
+          end;
         end;
-        if (ntn < 0) then ntn := CreateNullTexture(rec.Resource);
 
-        rec.tagInt := ntn; // remember texture number
-        g_Game_StepLoading();
+        cnt := -1;
+        for rec in mapTextureList do
+        begin
+          Inc(cnt);
+          if not usedTextures.has(toLowerCase1251(rec.Resource)) then
+          begin
+            rec.tagInt := -1; // just in case
+            e_LogWritefln('    Unused texture #%d: %s', [cnt, rec.Resource]);
+          end
+          else
+          begin
+            {$IF DEFINED(D2F_DEBUG_TXLOAD)}
+            e_LogWritefln('    Loading texture #%d: %s', [cnt, rec.Resource]);
+            {$ENDIF}
+            //if g_Map_IsSpecialTexture(s) then e_WriteLog('      SPECIAL!', MSG_NOTIFY);
+            if rec.Anim then
+            begin
+              // Àíèìèðîâàííàÿ òåêñòóðà
+              ntn := CreateAnimTexture(rec.Resource, FileName, True);
+              if (ntn < 0) then g_SimpleError(Format(_lc[I_GAME_ERROR_TEXTURE_ANIM], [rec.Resource]));
+            end
+            else
+            begin
+              // Îáû÷íàÿ òåêñòóðà
+              ntn := CreateTexture(rec.Resource, FileName, True);
+              if (ntn < 0) then g_SimpleError(Format(_lc[I_GAME_ERROR_TEXTURE_SIMPLE], [rec.Resource]));
+            end;
+            if (ntn < 0) then ntn := CreateNullTexture(rec.Resource);
+
+            rec.tagInt := ntn; // remember texture number
+          end;
+          g_Game_StepLoading();
+        end;
+      finally
+        usedTextures.Free();
       end;
 
       // set panel tagInt to texture index
@@ -1768,6 +1808,7 @@ begin
       end;
     end;
 
+
     // Çàãðóçêà òðèããåðîâ
     gTriggerClientID := 0;
     e_WriteLog('  Loading triggers...', TMsgType.Notify);
@@ -1981,6 +2022,7 @@ begin
         //e_LogWritefln('PANADD: pannum=%s', [pannum]);
 
         // Ñîçäàåì ïàíåëü è çàïîìèíàåì åå GUID
+        //e_LogWritefln('new panel; tcount=%s; curtex=%s', [Length(AddTextures), CurTex]);
         PanelID := CreatePanel(rec, AddTextures, CurTex);
         //e_LogWritefln('panel #%s of type %s got guid #%s', [pannum, rec.PanelType, PanelID]);
         rec.userPanelId := PanelID; // remember game panel id, we'll fix triggers later
@@ -3253,4 +3295,6 @@ begin
 end;
 
 
+begin
+  DynWarningCB := mapWarningCB;
 end.