changeset 117:a64b244da76c

some things lod
author Nomad
date Tue, 13 Nov 2012 17:29:38 +0200
parents 918dca162239
children a2715ce5cf17
files LOD.cpp LOD.h SaveLoad.cpp mm7_2.cpp
diffstat 4 files changed, 65 insertions(+), 51 deletions(-) [+]
line wrap: on
line diff
--- a/LOD.cpp	Thu Nov 08 04:57:39 2012 +0200
+++ b/LOD.cpp	Tue Nov 13 17:29:38 2012 +0200
@@ -995,34 +995,32 @@
     _6A0CA8_lod_unused = 0;
   }
 }
-// 6A0CA8: using guessed type int 6A0CA8_lod_unused;
+
+
 
 //----- (00461492) --------------------------------------------------------
 int LODWriteableFile::_461492(LOD::FileHeader *pHeader, LOD::Directory *pDir, const char *Source)
 {
-  LODWriteableFile *v4; // esi@1
-  FILE *v6; // eax@5
-
-  v4 = this;
-  if ( this->isFileOpened )
+  if (isFileOpened)
     return 1;
   if ( !pDir->pFilename[0] )
     return 2;
-  strcpy((char *)pHeader, "LOD");
+  strcpy(pHeader->pSignature, "LOD");
   pHeader->dword_0000A4 = 100;
   pHeader->uNumIndices = 1;
   pDir->pFilename[15] = 0;
   pDir->uDataSize = 0;
   pDir->uOfsetFromSubindicesStart = 288;
-  strcpy((char *)v4->pLODName, Source);
-  v6 = fopen((const char *)v4->pLODName, "wb+");
-  v4->pFile = v6;
-  if ( !v6 )
+  strcpy(pLODName, Source);
+
+  pFile = fopen(pLODName, "wb+");
+  if (!pFile)
     return 3;
-  fwrite(pHeader, 0x100, 1, v6);
-  fwrite(pDir, 0x20, 1, v4->pFile);
-  fclose(v4->pFile);
-  v4->pFile = 0;
+
+  fwrite(pHeader, 0x100, 1, pFile);
+  fwrite(pDir, 0x20, 1, pFile);
+  fclose(pFile);
+  pFile = 0;
   return 0;
 }
 
@@ -1645,6 +1643,7 @@
 // 6A0CA8: using guessed type int 6A0CA8_lod_unused;
 
 
+//----- (00461B48) --------------------------------------------------------
 unsigned int LODWriteableFile::Write(const LOD::Directory *pDir, const void *pDirData, int a4)
 {
   //LODWriteableFile *v4; // ebx@1
--- a/LOD.h	Thu Nov 08 04:57:39 2012 +0200
+++ b/LOD.h	Tue Nov 13 17:29:38 2012 +0200
@@ -23,14 +23,18 @@
   {
     inline FileHeader()
     {
+      memset(LodVersion, 0, 8);
+      memset(field_2C, 0, 40);
       memset(array_0000B0, 0, 28);
       memset(array_0000CC, 0, 52);
     }
 
     void Reset();
 
-    unsigned __int8 pSignature[4];
-    char LodVersion[80];
+    char pSignature[4];
+    char LodVersion[8];
+    char field_C[32];
+    char field_2C[40];
     char LodDescription[80];
     int dword_0000A4;
     int dword_0000A8;
--- a/SaveLoad.cpp	Thu Nov 08 04:57:39 2012 +0200
+++ b/SaveLoad.cpp	Tue Nov 13 17:29:38 2012 +0200
@@ -1,5 +1,6 @@
 #include <io.h>
 #include <direct.h>
+#include <assert.h>
 
 #include "SaveLoad.h"
 #include "NPC.h"
@@ -46,7 +47,7 @@
   bool v26; // eax@62
   int v30; // [sp-Ch] [bp-FCh]@65
   int v31; // [sp-8h] [bp-F8h]@4
-  char DstBuf[100]; // [sp+Ch] [bp-E4h]@23
+  SavegameHeader header; // [sp+Ch] [bp-E4h]@23
   char Str[123]; // [sp+70h] [bp-80h]@25
 
   dword_5B65C8 = 0;
@@ -97,7 +98,8 @@
     Log::Warning(L"%S", Str);
     MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:549", 0);
   }
-  fread(&DstBuf, 0x64u, 1u, f);
+  assert(sizeof(SavegameHeader) == 100);
+  fread(&header, sizeof(SavegameHeader), 1, f);
 
   f = pNew_LOD->FindContainer("party.bin", 1);
   if (!f)
@@ -198,16 +200,16 @@
   pEventTimer->Resume();
   pEventTimer->StopGameTime();
 
-  v25 = pGames_LOD->DoesContainerExist(&DstBuf[20]);
-  sprintf(pTmpBuf, "levels\\%s", &DstBuf[20]);
+  v25 = pGames_LOD->DoesContainerExist(header.pLocationName);
+  sprintf(pTmpBuf, "levels\\%s", header.pLocationName);
   v26 = _access(pTmpBuf, 4) != -1;
   if ( !v25 && !v26 )
   {
-    sprintf(pTmpBuf, "Unable to find: %s!", &DstBuf[20]);
+    sprintf(pTmpBuf, "Unable to find: %s!", header.pLocationName);
     Abortf(pTmpBuf);
   }
 
-  strcpy(pCurrentMapName, &DstBuf[20]);
+  strcpy(pCurrentMapName, header.pLocationName);
   dword_6BE364_game_settings_1 |= 0x2001;
 
   for (uint i = 0; i < uNumSavegameFiles; ++i)
@@ -260,16 +262,17 @@
   int v32; // esi@51
   int v33; // eax@51
   DWORD v34; // eax@59
-  std::string v35; // [sp-18h] [bp-288h]@8
+  //std::string v35; // [sp-18h] [bp-288h]@8
   const char *v36; // [sp-10h] [bp-280h]@6
   const char *v37; // [sp-Ch] [bp-27Ch]@6
   const char *v38; // [sp-8h] [bp-278h]@8
   CHAR Buffer; // [sp+Ch] [bp-264h]@59
   char Dir; // [sp+8Ch] [bp-1E4h]@51
   char Drive; // [sp+ACh] [bp-1C4h]@51
-  int v43; // [sp+CCh] [bp-1A4h]@10
-  char Dest[20]; // [sp+E0h] [bp-190h]@10
-  unsigned __int64 pTimePlayed; // [sp+F4h] [bp-17Ch]@10
+  SavegameHeader header; // [sp+CCh] [bp-1A4h]@10
+  //int v43; // [sp+CCh] [bp-1A4h]@10
+  //char Dest[20]; // [sp+E0h] [bp-190h]@10
+  //unsigned __int64 pTimePlayed; // [sp+F4h] [bp-17Ch]@10
   char Filename; // [sp+130h] [bp-140h]@51
   char Ext; // [sp+150h] [bp-120h]@51
   char v48; // [sp+151h] [bp-11Fh]@51
@@ -322,7 +325,7 @@
   strcpy(pDir.pFilename, "image.pcx");
   pRenderer->_49F5A2((int)pScreenshot, 150, 112, DstBuf, 1000000, (int)&pDir.uDataSize);
   free(pScreenshot);
-  if ( pCurrentScreen == 11 )//SaveScreen
+  if (pCurrentScreen == 11) //SaveScreen
   {
     pRenderer->DrawTextureIndexed(8, 8, (Texture *)(uTextureID_loadsave != -1 ? &pIcons_LOD->pTextures[uTextureID_loadsave] : 0));
     pRenderer->DrawTextureIndexed(0x12, 0x8D, (Texture *)(uTextureID_save_up != -1 ? &pIcons_LOD->pTextures[uTextureID_save_up] : 0));
@@ -334,49 +337,51 @@
     pGUIWindow_CurrentMenu->DrawText(pFontSmallnum, v6 + 25, 299, 0, pGlobalTXT_LocalizationStrings[165], 0, 0, 0); //Пожалуйста, подождите
     pRenderer->Present();
    }
-  if ( pNew_LOD->Write(&pDir, DstBuf, 0) )
+  if (pNew_LOD->Write(&pDir, DstBuf, 0))
   {
     sprintf(Str, pGlobalTXT_LocalizationStrings[612], 200); //Сохраненная игра повреждена! Code=%d
     MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:773", 0);
   }
-  strcpy(Dest, pCurrentMapName);
-  pTimePlayed = pParty->uTimePlayed;
-  strcpy((char *)&pDir, "header.bin");
-  pDir.uDataSize = 100;
-  if ( pNew_LOD->Write(&pDir, &v43, 0) )
+
+  assert(sizeof(SavegameHeader) == 100);
+  strcpy(header.pLocationName, pCurrentMapName);
+  header.uWordTime = pParty->uTimePlayed;
+  strcpy(pDir.pFilename, "header.bin");
+  pDir.uDataSize = sizeof(SavegameHeader);
+  if (pNew_LOD->Write(&pDir, &header, 0))
   {
     sprintf(Str, pGlobalTXT_LocalizationStrings[612], 201);
     MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:784", 0);
   }
-  strcpy((char *)&pDir, "party.bin");
+  strcpy(pDir.pFilename, "party.bin");
   pDir.uDataSize = 90680;
-  if ( pNew_LOD->Write(&pDir, &pParty, 0) )
+  if ( pNew_LOD->Write(&pDir, pParty, 0) )
   {
     sprintf(Str, pGlobalTXT_LocalizationStrings[612], 202);
     MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:793", 0);
   }
-  strcpy((char *)&pDir, "clock.bin");
+  strcpy(pDir.pFilename, "clock.bin");
   pDir.uDataSize = 40;
-  if ( pNew_LOD->Write(&pDir, &pEventTimer, 0) )
+  if ( pNew_LOD->Write(&pDir, pEventTimer, 0) )
   {
     sprintf(Str, pGlobalTXT_LocalizationStrings[612], 203);
     MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:802", 0);
   }
-  strcpy((char *)&pDir, "overlay.bin");
+  strcpy(pDir.pFilename, "overlay.bin");
   pDir.uDataSize = 1008;
-  if ( pNew_LOD->Write(&pDir, &pOtherOverlayList, 0) )
+  if ( pNew_LOD->Write(&pDir, pOtherOverlayList, 0) )
   {
     sprintf(Str, pGlobalTXT_LocalizationStrings[612], 204);
     MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:811", 0);
   }
-  strcpy((char *)&pDir, "npcdata.bin");
+  strcpy(pDir.pFilename, "npcdata.bin");
   pDir.uDataSize = 38076;
   if ( pNew_LOD->Write(&pDir, pNPCStats->pNewNPCData, 0) )
   {
     sprintf(Str, pGlobalTXT_LocalizationStrings[612], 205);
     MessageBoxA(nullptr, Str, "E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\LoadSave.cpp:820", 0);
   }
-  strcpy((char *)&pDir, "npcgroup.bin");
+  strcpy(pDir.pFilename, "npcgroup.bin");
   pDir.uDataSize = 102;
   if ( pNew_LOD->Write(&pDir, pNPCStats->pGroups_copy, 0) )
   {
@@ -391,6 +396,7 @@
       v8 = fopen(Str, "rb");
       if ( v8 )
       {
+        __debugbreak();
         sprintf(Str, "lloyd%d%d.pcx", i, j);
         fseek(v8, 0, 2);
         pDir.uDataSize = ftell(v8);
@@ -410,6 +416,7 @@
   }
   if ( !a2 )
   {
+    __debugbreak();
     sub_42FA22_mess_with_laying_item_list();
     v9 = (int)malloc(0xF4240);
     v71 = (std::string *)v9;
@@ -423,6 +430,7 @@
     memcpy((void *)v9, &Src, 0x10);
     if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
     {
+      __debugbreak();
       pIndoor->dlv.uNumFacesInBModels = pIndoor->uNumFaces;
       pIndoor->dlv.uNumBModels = 0;
       pIndoor->dlv.uNumDecorations = uNumLevelDecorations;
@@ -603,6 +611,8 @@
   int bNotArena; // [sp+2Ch] [bp-8h]@1
   unsigned int v6; // [sp+30h] [bp-4h]@1
 
+  __debugbreak();
+
   v1 = uSlot;
   v6 = uSlot;
   bNotArena = _strcmpi(pCurrentMapName, "d05.blv");
--- a/mm7_2.cpp	Thu Nov 08 04:57:39 2012 +0200
+++ b/mm7_2.cpp	Tue Nov 13 17:29:38 2012 +0200
@@ -11280,7 +11280,7 @@
   v27 = height;
   v23 = 452.0 / (double)width;
   v25 = 336.0 / (double)height;
-  pPixels = (unsigned __int16 *)operator new(2 * height * width);
+  pPixels = (unsigned __int16 *)malloc(2 * height * width);
   v3 = pPixels;
   if ( pRenderer->pRenderD3D )
   {
@@ -11754,16 +11754,17 @@
     pNew_LOD->CreateTempFile();
     pNew_LOD->uNumSubIndices = 0;
     pDir.Reset();
-	for (int i =  pGames_LOD->uNumSubIndices / 2; i < pGames_LOD->uNumSubIndices; ++i)
-   {
-    memcpy(&pDir, (char *)&pGames_LOD->pSubIndices[i], sizeof(pDir));
-    v3 = pGames_LOD->FindContainer((const char *)&pGames_LOD->pSubIndices[i], 1);
-    fread(pSave, pGames_LOD->pSubIndices[i].uDataSize, 1, v3);
-    pNew_LOD->AppendDirectory(&pDir, pSave);
-   }
+
+    for (int i = pGames_LOD->uNumSubIndices / 2; i < pGames_LOD->uNumSubIndices; ++i)
+    {
+      memcpy(&pDir, &pGames_LOD->pSubIndices[i], sizeof(pDir));
+      v3 = pGames_LOD->FindContainer(pGames_LOD->pSubIndices[i].pFilename, 1);
+      fread(pSave, pGames_LOD->pSubIndices[i].uDataSize, 1, v3);
+      pNew_LOD->AppendDirectory(&pDir, pSave);
+    }
     v7.Reset();
     strcpy(pSavegameHeader->pLocationName, "out01.odm");
-    strcpy((char *)&v7, "header.bin");
+    strcpy(v7.pFilename, "header.bin");
     v7.uDataSize = 100;
     pNew_LOD->AppendDirectory(&v7, &pSavegameHeader);
     pNew_LOD->Save();