changeset 528:b1598f110b07

Chest working
author Gloval
date Sun, 03 Mar 2013 13:36:41 +0400
parents 214d9d47cf1f
children 6e4619fb5808
files Chest.cpp Chest.h
diffstat 2 files changed, 66 insertions(+), 94 deletions(-) [+]
line wrap: on
line diff
--- a/Chest.cpp	Sun Mar 03 01:55:57 2013 +0400
+++ b/Chest.cpp	Sun Mar 03 13:36:41 2013 +0400
@@ -29,9 +29,9 @@
 Chest pChests[20];
 
 
-const int pChestPixelOffsetX[8] = {42, 18, 18, 42, 42, 42, 18, 42};
-const int pChestPixelOffsetY[8] = {34, 30, 30, 34, 34, 34, 30, 34};
-const int pChestWidthsByType[8] = {9, 9, 9, 9, 9, 9, 9, 9};
+const int pChestPixelOffsetX[8]  = {42, 18, 18, 42, 42, 42, 18, 42};
+const int pChestPixelOffsetY[8]  = {34, 30, 30, 34, 34, 34, 30, 34};
+const int pChestWidthsByType[8]  = {9, 9, 9, 9, 9, 9, 9, 9};
 const int pChestHeightsByType[8] = {9, 9, 9, 9, 9, 9, 9, 9};
 
 
@@ -271,7 +271,7 @@
     signed int chestHeghtCells; // [sp+18h] [bp-1Ch]@1
     int chest_offs_x; // [sp+1Ch] [bp-18h]@1
     signed int chestWidthCells; // [sp+20h] [bp-14h]@1
-    signed int cells_counter; // [sp+30h] [bp-4h]@1
+    signed int item_counter; // [sp+30h] [bp-4h]@1
 
     v16 = pRenderer->pActiveZBuffer;
     pRenderer->ClearZBuffer(0, 479);
@@ -284,9 +284,9 @@
     v5 = pIcons_LOD->LoadTexture(pTmpBuf, TEXTURE_16BIT_PALETTE);
     pRenderer->DrawTextureIndexed(8u, 8u, (Texture *)(v5 != -1 ? (int)&pIcons_LOD->pTextures[v5] : 0));
 
-    for (cells_counter = 0; cells_counter< chestWidthCells * chestHeghtCells; ++cells_counter)
+    for (item_counter = 0; item_counter< chestWidthCells * chestHeghtCells; ++item_counter)
         {
-        chest_item_index = pChests[uChestID].pInventoryIndices[cells_counter];
+        chest_item_index = pChests[uChestID].pInventoryIndices[item_counter];
         if ( chest_item_index > 0 )
             {
             item_texture_id = pIcons_LOD->LoadTexture(
@@ -302,11 +302,11 @@
             v13 = v12 + 32;
             if ( itemPixelHeght < 14 )
                 itemPixelHeght = 14;
-            itemPixelPosX = chest_offs_x + (32 * cells_counter) % chestWidthCells + ((v13 - itemPixelWidth) >> 1);
-            itemPixelPosY = chest_offs_y + (32 * cells_counter) / chestHeghtCells +
+            itemPixelPosX = chest_offs_x + 32 * (item_counter % chestWidthCells) + ((v13 - itemPixelWidth) >> 1);
+            itemPixelPosY = chest_offs_y + 32 * (item_counter / chestHeghtCells) +
                 ((((itemPixelHeght - 14) & 0xFFFFFFE0) - item_texture->uTextureHeight + 32) >> 1);
             pRenderer->DrawTextureTransparent(  itemPixelPosX,   itemPixelPosY,  item_texture);
-            sub_40F92A(&v16[itemPixelPosX + pSRZBufferLineOffsets[itemPixelPosY]], item_texture, cells_counter + 1);
+            sub_40F92A(&v16[itemPixelPosX + pSRZBufferLineOffsets[itemPixelPosY]], item_texture, item_counter + 1);
             }
         }
     pRenderer->DrawTextureIndexed(pBtn_ExitCancel->uX, pBtn_ExitCancel->uY,
@@ -333,8 +333,6 @@
     signed int v17; // [sp+10h] [bp-8h]@1
     signed int chest_cell_width; // [sp+14h] [bp-4h]@1
 
-    v17 = test_cell_position;
-
     chest_cell_heght = pChestHeightsByType[pChests[uChestID].uChestBitmapID];
     chest_cell_width = pChestWidthsByType[pChests[uChestID].uChestBitmapID];
     item_texture_id = pIcons_LOD->LoadTexture(pItemsTable->pItems[item_id].pIconName, TEXTURE_16BIT_PALETTE);
@@ -364,12 +362,14 @@
             _column = 0;
             if ( texture_cell_width > 0 )
                 {
-                while ( !pChests[uChestID].pInventoryIndices[test_cell_position + _cell_rows+_column])
+                while ( pChests[uChestID].pInventoryIndices[test_cell_position + _cell_rows+_column]==0)
                     {
                     ++_column;
                     if ( _column >= texture_cell_width )
                         break;
                     }
+                if (pChests[uChestID].pInventoryIndices[test_cell_position + _cell_rows+_column]!=0)
+                    return false;
                 }
             _cell_rows += chest_cell_width;
             ++_row;
@@ -516,83 +516,55 @@
 // 506128: using guessed type int areWeLoadingTexture;
 
 //----- (0042013E) --------------------------------------------------------
-void Chest::PlaceItemAt( unsigned int put_cell_pos, unsigned int uItemIdx, unsigned int uChestID )
+void Chest::PlaceItemAt( unsigned int put_cell_pos, unsigned int item_at_cell, unsigned int uChestID )
     {
-  int v3; // esi@1
-  unsigned int v4; // ebx@1
-  int uItemID; // edi@1
-  int v6; // edx@4
-  unsigned int v7; // eax@5
-  Texture *v8; // ecx@5
-  signed int v9; // eax@5
-  signed int v10; // edi@7
-  unsigned int v11; // ebx@7
-  int v12; // edi@9
-  int v13; // edx@12
-  void *v14; // edi@14
-  int v15; // edi@14
-  int i; // ecx@14
-  unsigned int result; // eax@18
-  __int16 v18; // [sp+Ch] [bp-10h]@1
-  int v19; // [sp+10h] [bp-Ch]@11
-  int v20; // [sp+14h] [bp-8h]@12
-  unsigned int v21; // [sp+18h] [bp-4h]@1
+
+    int uItemID; // edi@1
+    int v6; // edx@4
+    unsigned int v7; // eax@5
+    Texture *v8; // ecx@5
+    signed int v9; // eax@5
+    signed int v10; // edi@7
+    unsigned int texture_cell_width; // ebx@7
+    int textute_cell_height; // edi@9
+    int chest_cell_row_pos; // edx@12
+    int chest_cell_width; // [sp+10h] [bp-Ch]@11
 
-  v3 = 5324 * uChestID;
-  v21 = put_cell_pos;
-  v4 = 5324 * uChestID + 36 * uItemIdx;
-  v18 = uItemIdx;
-  uItemID = pChests[ uChestID].igChestItems[uItemIdx].uItemID;
-  pItemsTable->SetSpecialBonus(&pChests[ uChestID].igChestItems[uItemIdx]);
-  if ( uItemID >= 135 && uItemID <= 159 && !pChests[ uChestID].igChestItems[uItemIdx].uNumCharges)
-  {
-    v6 = rand() % 21 + 10;
-    pChests[ uChestID].igChestItems[uItemIdx].uNumCharges = v6;
-    pChests[ uChestID].igChestItems[uItemIdx].uMaxCharges = v6;
-  }
-  v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[uItemID].pIconName, TEXTURE_16BIT_PALETTE);
-  v8 = (Texture *)(v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0);
-  v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24);
-  if ( v9 < 14 )
-    v9 = 14;
-  v10 = v8->uTextureHeight;
-  v11 = ((v9 - 14) >> 5) + 1;
-  if ( v10 < 14 )
-    v10 = 14;
-  v12 = ((v10 - 14) >> 5) + 1;
-  if ( !areWeLoadingTexture )
-  {
-    v8->Release();
-    pIcons_LOD->_40F9C5();
-  }
-  v19 = pChestWidthsByType[pChests[ uChestID].uChestBitmapID];
-  if ( v12 > 0 )
-  {
-    v13 = 0;
-    v20 = v12;
-    do
-    {
-      if ( (signed int)v11 > 0 )
-      {
-        v14 = &pChests[uChestID].pInventoryIndices[v21 + v13];
-        LOWORD(v3) = -1 - v21;
-        v3 <<= 16;
-        LOWORD(v3) = -1 - v21;
-        memset32(v14, v3, v11 >> 1);
-        v15 = (int)((char *)v14 + 4 * (v11 >> 1));
-        for ( i = v11 & 1; i; --i )
+    uItemID = pChests[ uChestID].igChestItems[item_at_cell].uItemID;
+    pItemsTable->SetSpecialBonus(&pChests[ uChestID].igChestItems[item_at_cell]);
+    if ( uItemID >= 135 && uItemID <= 159 && !pChests[ uChestID].igChestItems[item_at_cell].uNumCharges)
         {
-          *(short *)v15 = v3;
-          v15 += 2;
+        v6 = rand() % 21 + 10;
+        pChests[ uChestID].igChestItems[item_at_cell].uNumCharges = v6;
+        pChests[ uChestID].igChestItems[item_at_cell].uMaxCharges = v6;
         }
-      }
-      v13 += v19;
-      --v20;
+    v7 = pIcons_LOD->LoadTexture(pItemsTable->pItems[uItemID].pIconName, TEXTURE_16BIT_PALETTE);
+    v8 = (Texture *)(v7 != -1 ? (int)&pIcons_LOD->pTextures[v7] : 0);
+    v9 = (v7 != -1 ? pIcons_LOD->pTextures[v7].uTextureWidth : 24);
+    if ( v9 < 14 )
+        v9 = 14;
+    v10 = v8->uTextureHeight;
+    texture_cell_width = ((v9 - 14) >> 5) + 1;
+    if ( v10 < 14 )
+        v10 = 14;
+    textute_cell_height = ((v10 - 14) >> 5) + 1;
+    if ( !areWeLoadingTexture )
+        {
+        v8->Release();
+        pIcons_LOD->_40F9C5();
+        }
+    chest_cell_width = pChestWidthsByType[pChests[ uChestID].uChestBitmapID];
+    chest_cell_row_pos = 0;
+    for(int i=0; i<textute_cell_height; ++i) 
+        { 
+        for (int j=0; j<texture_cell_width; ++j)
+            {
+            pChests[uChestID].pInventoryIndices[put_cell_pos + chest_cell_row_pos+j]=(signed __int16)-(put_cell_pos+1);
+            } 
+        chest_cell_row_pos += chest_cell_width;
+        }
+    pChests[uChestID].pInventoryIndices[put_cell_pos] = item_at_cell + 1;
     }
-    while ( v20 );
-      }
-  pChests[uChestID].pInventoryIndices[v21] = v18 + 1;
-}
 // 506128: using guessed type int areWeLoadingTexture;
 
 //----- (00420284) --------------------------------------------------------
@@ -603,13 +575,13 @@
     int test_position; // ebx@11
     char chest_cells_map[144]; // [sp+Ch] [bp-A0h]@1
     int chest_item_id; // [sp+9Ch] [bp-10h]@10
-    unsigned int cell_counter; // [sp+A4h] [bp-8h]@8
+    unsigned int items_counter; // [sp+A4h] [bp-8h]@8
 
     pRenderer->ClearZBuffer(0, 479);
     uChestArea = pChestWidthsByType[pChests[uChestID].uChestBitmapID] * pChestHeightsByType[pChests[uChestID].uChestBitmapID];
     memset(chest_cells_map, 0, 144);
     //fill cell map at random positions
-    for (cell_counter = 0; cell_counter<uChestArea; ++cell_counter)
+    for (items_counter = 0; items_counter<uChestArea; ++items_counter)
         {
         //get random position in chest
         do
@@ -622,13 +594,13 @@
             if ( random_chest_pos == uChestArea )
                 random_chest_pos = 0;
             }
-        chest_cells_map[random_chest_pos] = cell_counter;
+        chest_cells_map[random_chest_pos] = items_counter;
         }
-    cell_counter = 0;
+    items_counter = 0;
 
-    for (cell_counter = 0; cell_counter<uChestArea; ++cell_counter)
+    for (items_counter = 0; items_counter<uChestArea; ++items_counter)
         {
-        chest_item_id = pChests[uChestID].igChestItems[cell_counter].uItemID;
+        chest_item_id = pChests[uChestID].igChestItems[items_counter].uItemID;
         if ( chest_item_id )
             {
             test_position = 0;
@@ -640,13 +612,13 @@
                 }
             if(test_position<uChestArea)
                 {
-                Chest::PlaceItemAt((unsigned __int8)chest_cells_map[test_position], cell_counter, uChestID);
+                Chest::PlaceItemAt((unsigned __int8)chest_cells_map[test_position], items_counter, uChestID);
                 if ( pChests[uChestID].uFlags & 4 )
-                    pChests[uChestID].igChestItems[cell_counter].SetIdentified();
+                    pChests[uChestID].igChestItems[items_counter].SetIdentified();
                 }
             }
         }
-    pChests[uChestID].uFlags = pChests[uChestID].uFlags & 0xFFFB | 2;
+    pChests[uChestID].SetInitialized(true);
     }
 // 420284: using guessed type char Dst[144];
 
--- a/Chest.h	Sun Mar 03 01:55:57 2013 +0400
+++ b/Chest.h	Sun Mar 03 13:36:41 2013 +0400
@@ -65,7 +65,7 @@
   unsigned __int16 uChestBitmapID; //0
   unsigned __int16 uFlags; //2
   struct ItemGen igChestItems[140]; //4
-  __int16 pInventoryIndices[140]; //0x13b4
+  signed __int16 pInventoryIndices[140]; //0x13b4
 };
 #pragma pack(pop)