changeset 519:8f70e52646eb

Merge
author Gloval
date Fri, 01 Mar 2013 22:18:22 +0400
parents 9c984eef0a7d (current diff) cb0ad52d6a26 (diff)
children 35f28d4c0ff9
files LayingItem.cpp LayingItem.h mm7_2.cpp mm7_4.cpp
diffstat 21 files changed, 1566 insertions(+), 1527 deletions(-) [+]
line wrap: on
line diff
--- a/Actor.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/Actor.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -1,7 +1,7 @@
 #include <assert.h>
 
 #include "Actor.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "Math.h"
 #include "Party.h"
 #include "Outdoor.h"
@@ -469,7 +469,7 @@
   float v112; // [sp+3Ch] [bp-94h]@49
   int v113; // [sp+40h] [bp-90h]@41
   int v114; // [sp+48h] [bp-88h]@41
-  LayingItem a1; // [sp+4Ch] [bp-84h]@1
+  SpriteObject a1; // [sp+4Ch] [bp-84h]@1
   int v116; // [sp+BCh] [bp-14h]@49
   AIDirection *v117; // [sp+C0h] [bp-10h]@1
   int v118; // [sp+C4h] [bp-Ch]@29
@@ -561,7 +561,7 @@
               v10 = v105;
 LABEL_29:
               spellnuma = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
-              a1.uItemType = stru_4E3ACC[15].field_0;
+              a1.uType = stru_4E3ACC[15].field_0;
               v118 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v10 - 1);
               v11 = 0;
               if ( (signed int)pObjectList->uNumObjects <= 0 )
@@ -642,7 +642,7 @@
               return;
             }
 LABEL_159:
-            a1.uItemType = stru_4E3ACC[spellnum].field_0;
+            a1.uType = stru_4E3ACC[spellnum].field_0;
             v119 = 0.0;
             if ( (signed int)pObjectList->uNumObjects <= 0 )
             {
@@ -652,7 +652,7 @@
             else
             {
               v66 = (char *)&pObjectList->pObjects->uObjectID;
-              while ( (short)a1.uItemType != *(short *)v66 )
+              while ( (short)a1.uType != *(short *)v66 )
               {
                 ++LODWORD(v119);
                 v66 += 56;
@@ -790,7 +790,7 @@
                 pitch = stru_5C6E00->Atan2(v31, (signed __int64)spellnumc);
               }
               a1.stru_24.Reset();
-              a1.uItemType = stru_4E3ACC[9].field_0;
+              a1.uType = stru_4E3ACC[9].field_0;
               spellnumd = 0;
               if ( (signed int)pObjectList->uNumObjects <= 0 )
               {
@@ -800,7 +800,7 @@
               else
               {
                 v33 = (char *)&pObjectList->pObjects->uObjectID;
-                while ( (short)a1.uItemType != *(short *)v33 )
+                while ( (short)a1.uType != *(short *)v33 )
                 {
                   ++spellnumd;
                   v33 += 56;
@@ -1334,7 +1334,7 @@
   v70 = v108;
 LABEL_179:
   spellnume = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360;
-  a1.uItemType = stru_4E3ACC[SPELL_DARK_SHARPMETAL].field_0;
+  a1.uType = stru_4E3ACC[SPELL_DARK_SHARPMETAL].field_0;
   v116 = (signed int)(60 * stru_5C6E00->uIntegerDoublePi) / 360 / (v70 - 1);
   v71 = 0;
   if ( (signed int)pObjectList->uNumObjects <= 0 )
@@ -1482,7 +1482,7 @@
   signed int v11; // ecx@19
   int v12; // eax@19
   int v13; // edx@28
-  //LayingItem a1; // [sp+Ch] [bp-74h]@1
+  //SpriteObject a1; // [sp+Ch] [bp-74h]@1
   unsigned int v15; // [sp+7Ch] [bp-4h]@1
   signed int v16; // [sp+88h] [bp+8h]@14
   signed int v17; // [sp+88h] [bp+8h]@19
@@ -1491,47 +1491,47 @@
   v4 = a2;
   v5 = &pActors[uActorID];
 
-  LayingItem a1; // [sp+Ch] [bp-74h]@1
-  //LayingItem::LayingItem(&a1);
+  SpriteObject a1; // [sp+Ch] [bp-74h]@1
+  //SpriteObject::SpriteObject(&a1);
 
   result = a3 - 1;
   switch ( a3 )
   {
     case 1:
-      a1.uItemType = 545;
+      a1.uType = 545;
       goto LABEL_14;
     case 2:
-      a1.uItemType = 550;
+      a1.uType = 550;
       goto LABEL_14;
     case 3:
-      a1.uItemType = 510;
+      a1.uType = 510;
       goto LABEL_14;
     case 4:
-      a1.uItemType = 500;
+      a1.uType = 500;
       goto LABEL_14;
     case 5:
-      a1.uItemType = 515;
+      a1.uType = 515;
       goto LABEL_14;
     case 6:
-      a1.uItemType = 505;
+      a1.uType = 505;
       goto LABEL_14;
     case 7:
-      a1.uItemType = 530;
+      a1.uType = 530;
       goto LABEL_14;
     case 8:
-      a1.uItemType = 525;
+      a1.uType = 525;
       goto LABEL_14;
     case 9:
-      a1.uItemType = 520;
+      a1.uType = 520;
       goto LABEL_14;
     case 10:
-      a1.uItemType = 535;
+      a1.uType = 535;
       goto LABEL_14;
     case 11:
-      a1.uItemType = 540;
+      a1.uType = 540;
       goto LABEL_14;
     case 13:
-      a1.uItemType = 555;
+      a1.uType = 555;
 LABEL_14:
       v16 = 0;
       if ( (signed int)pObjectList->uNumObjects <= 0 )
@@ -1541,7 +1541,7 @@
     default:
       return result;
   }
-  while ( (short)a1.uItemType != *(short *)v7 )
+  while ( (short)a1.uType != *(short *)v7 )
   {
     ++v16;
     v7 += 56;
@@ -1636,14 +1636,14 @@
   int v5; // ebx@6
   int v6; // ecx@6
   int v7; // eax@6
-  LayingItem a1; // [sp+Ch] [bp-78h]@1
+  SpriteObject a1; // [sp+Ch] [bp-78h]@1
   unsigned int v10; // [sp+7Ch] [bp-8h]@1
   int v11; // [sp+80h] [bp-4h]@6
 
   v10 = uActorID;
   v1 = &pActors[uActorID];
   v2 = 0;
-  a1.uItemType = 600;
+  a1.uType = 600;
   if ( (signed int)pObjectList->uNumObjects <= 0 )
   {
 LABEL_5:
@@ -1692,7 +1692,7 @@
 // //
 // //
 // // object1 & object2 format :  objectType | (objectID << 3)
-// //    objectType == 2 - LayingItem
+// //    objectType == 2 - SpriteObject
 // //    objectType == 3 - Actor
 // //    objectType == 4 - Party
 // //    objectType == 5 - Decoration
@@ -1755,9 +1755,9 @@
   if ( !v5 )
   {
     v19 = v4;
-    outx = pLayingItems[v19].vPosition.x;
-    v13 = pLayingItems[v19].vPosition.y;
-    v14 = pLayingItems[v19].vPosition.z;
+    outx = pSpriteObjects[v19].vPosition.x;
+    v13 = pSpriteObjects[v19].vPosition.y;
+    v14 = pSpriteObjects[v19].vPosition.z;
     goto LABEL_26;
   }
   v7 = v5 - 1;
@@ -1865,9 +1865,9 @@
   if ( v21 == 2 )
   {
     v30 = v22;
-    LODWORD(v45) = pLayingItems[v30].vPosition.x;
-    v27 = pLayingItems[v30].vPosition.y;
-    v28 = pLayingItems[v30].vPosition.z;
+    LODWORD(v45) = pSpriteObjects[v30].vPosition.x;
+    v27 = pSpriteObjects[v30].vPosition.y;
+    v28 = pSpriteObjects[v30].vPosition.z;
     goto LABEL_43;
   }
   if ( v21 == 3 )
--- a/AudioPlayer.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/AudioPlayer.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -5,7 +5,7 @@
 #include "Allocator.h"
 #include "FrameTableInc.h"
 #include "Indoor.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "Party.h"
 #include "Actor.h"
 #include "Game.h"
@@ -635,7 +635,7 @@
   signed int v14; // eax@20
   int v15; // eax@24
   signed int v16; // eax@25
-  LayingItem *pLayingItem; // eax@28
+  SpriteObject *pLayingItem; // eax@28
   signed int v18; // eax@29
   Actor *pActor1; // eax@32
   signed int v20; // ecx@32
@@ -662,7 +662,7 @@
   char *v41; // edi@82
   int v42; // esi@82
   double v43; // st7@91
-  LayingItem *pLayingItem2; // eax@92
+  SpriteObject *pLayingItem2; // eax@92
   Actor *pActor; // eax@93
   signed int v46; // ecx@93
   double v47; // st7@93
@@ -675,7 +675,7 @@
   float v54; // ST04_4@106
   //AudioPlayer *pAudioPlayer3; // edx@106
   SoundDesc *pSoundDesc; // edx@107
-  LayingItem *pLayingItem3; // eax@114
+  SpriteObject *pLayingItem3; // eax@114
   //int v58; // edx@115
   //int v59; // ecx@115
   //Actor *pActor2; // eax@118
@@ -695,7 +695,7 @@
   //unsigned int pVolume; // eax@157
   //int pPartyX; // ebx@159
   //int v76; // ebx@160
-  //LayingItem *pLayingItem4; // edi@164
+  //SpriteObject *pLayingItem4; // edi@164
   //unsigned int pPosY; // edx@166
   //unsigned int pPosX; // ecx@166
   //int v80; // eax@167
@@ -829,8 +829,8 @@
             start_channel = 5;
             end_channel = 7;
 
-            assert(object_id < uNumLayingItems);
-            auto object = &pLayingItems[object_id];
+            assert(object_id < uNumSpriteObjects);
+            auto object = &pSpriteObjects[object_id];
 
             sample_volume = GetSoundStrengthByDistanceFromParty(object->vPosition.x, object->vPosition.y, object->vPosition.z);
             if (!sample_volume)
@@ -1008,8 +1008,8 @@
       }
       else if (object_type == OBJECT_Item)
       {
-        assert(object_id < uNumLayingItems);
-        auto object = &pLayingItems[object_id];
+        assert(object_id < uNumSpriteObjects);
+        auto object = &pSpriteObjects[object_id];
         if (!GetSoundStrengthByDistanceFromParty(object->vPosition.x, object->vPosition.y, object->vPosition.z) )
             return;
         AIL_set_sample_pan(channel->hSample, sub_4AB66C(object->vPosition.x, object->vPosition.y));
@@ -1087,7 +1087,7 @@
       v96 = 7;
       v12 = 5;
     }
-    pLayingItem = &pLayingItems[a3 >> 3];
+    pLayingItem = &pSpriteObjects[a3 >> 3];
   }
   else
   {
@@ -1160,7 +1160,7 @@
       v12 = 4;
       v96 = 4;
     }
-    pLayingItem = (LayingItem *)&pLevelDecorations[a3 >> 3];
+    pLayingItem = (SpriteObject *)&pLevelDecorations[a3 >> 3];
   }
   pRenderVertexSoft.vWorldPosition.x = (double)pLayingItem->vPosition.x;
   pRenderVertexSoft.vWorldPosition.y = (double)pLayingItem->vPosition.y;
@@ -1334,7 +1334,7 @@
         }
         if ( (a3 & 7) == 2 )
         {
-          pLayingItem2 = &pLayingItems[a3 >> 3];
+          pLayingItem2 = &pSpriteObjects[a3 >> 3];
         }
         else
         {
@@ -1357,7 +1357,7 @@
             v47 = (double)pParty->sEyelevel + (double)pParty->vPosition.z;
             goto LABEL_101;
           }
-          pLayingItem2 = (LayingItem *)&pLevelDecorations[a3 >> 3];
+          pLayingItem2 = (SpriteObject *)&pLevelDecorations[a3 >> 3];
         }
         pRenderVertexSoft.vWorldPosition.x = (double)pLayingItem2->vPosition.x;
         pRenderVertexSoft.vWorldPosition.y = (double)pLayingItem2->vPosition.y;
@@ -1393,7 +1393,7 @@
   int v9; // ebx@10
   int v10; // ebx@11
   double v11; // st7@13
-  LayingItem *v12; // eax@14
+  SpriteObject *v12; // eax@14
   Actor *v13; // eax@15
   signed int v14; // edx@15
   BLVDoor *v15; // eax@19
@@ -1413,12 +1413,12 @@
   //unsigned __int8 v29; // of@43
   //MixerChannel *v30; // esi@44
   //int v31; // eax@45
-  //LayingItem *v32; // eax@49
+  //SpriteObject *v32; // eax@49
   //Actor *v33; // edi@50
   //int v34; // eax@50
   //unsigned int v35; // edx@51
   //unsigned int v36; // ecx@51
-  //LayingItem *v37; // edi@53
+  //SpriteObject *v37; // edi@53
   int v38; // eax@53
   //BLVDoor *v39; // edi@56
   //int v40; // eax@57
@@ -1527,11 +1527,11 @@
               v11 = (double)pParty->sEyelevel + (double)pParty->vPosition.z;
               goto LABEL_21;
             }
-            v12 = (LayingItem *)&pLevelDecorations[v6->field_4 >> 3];
+            v12 = (SpriteObject *)&pLevelDecorations[v6->field_4 >> 3];
           }
           else
           {
-            v12 = &pLayingItems[v6->field_4 >> 3];
+            v12 = &pSpriteObjects[v6->field_4 >> 3];
           }
           a1.vWorldPosition.x = (double)v12->vPosition.x;
           a1.vWorldPosition.y = (double)v12->vPosition.y;
@@ -1662,8 +1662,8 @@
 
       case OBJECT_Item:
       {
-        assert(source_id < uNumLayingItems);
-        auto object = &pLayingItems[source_id];
+        assert(source_id < uNumSpriteObjects);
+        auto object = &pSpriteObjects[source_id];
 
         source_x = object->vPosition.x;
         source_y = object->vPosition.y;
@@ -1674,7 +1674,7 @@
       case OBJECT_Decoration:
       {
         assert(source_id < uNumLevelDecorations);
-        auto object = (LayingItem *)&pLevelDecorations[source_id];
+        auto object = (SpriteObject *)&pLevelDecorations[source_id];
 
         source_x = object->vPosition.x;
         source_y = object->vPosition.y;
--- a/Chest.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/Chest.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -61,7 +61,7 @@
   signed int v25; // ecx@28
   char *v26; // edx@29
   unsigned __int16 v27; // ax@32
-  //LayingItem a1; // [sp+14h] [bp-B0h]@28
+  //SpriteObject a1; // [sp+14h] [bp-B0h]@28
   int v29; // [sp+84h] [bp-40h]@16
   int v30; // [sp+88h] [bp-3Ch]@16
   int v31; // [sp+8Ch] [bp-38h]@16
@@ -169,8 +169,8 @@
     v23 = (unsigned int *)(&v29 + v35);
     sub_42F7EB_DropItemAt(*v23, pOut.x, pOut.z, pOut.y, 0, 1, 0, 0x30u, 0);
     
-    LayingItem a1; // [sp+14h] [bp-B0h]@28
-    //LayingItem::LayingItem(&a1);
+    SpriteObject a1; // [sp+14h] [bp-B0h]@28
+    //SpriteObject::SpriteObject(&a1);
 
     a1.stru_24.Reset();
     v24 = *(short *)v23;
@@ -179,7 +179,7 @@
     a1.field_4C = 0;
     a1.field_48 = 0;
     a1.field_54 = 0;
-    a1.uItemType = v24;
+    a1.uType = v24;
     if ( (signed int)pObjectList->uNumObjects <= 0 )
     {
 LABEL_32:
--- a/Indoor.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/Indoor.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -2,7 +2,7 @@
 
 #include "Outdoor.h"
 #include "Render.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "Events.h"
 #include "Game.h"
 #include "Viewport.h"
@@ -1892,7 +1892,7 @@
   int v72; // eax@38
   unsigned __int16 v73; // ax@42
   char *v74; // ecx@42
-  LayingItem *v75; // ecx@44
+  SpriteObject *v75; // ecx@44
   size_t v76; // eax@45
   int j; // edx@46
   unsigned __int16 v78; // ax@50
@@ -2362,13 +2362,13 @@
         while ( Argsi < (signed int)uNumLevelDecorations );
       }
       fseek(v7, v219, 0);
-      fread(&uNumLayingItems, 4u, 1u, v7);
+      fread(&uNumSpriteObjects, 4u, 1u, v7);
       fseek(v7, v220, 0);
-      fread(pLayingItems, 0x70u, uNumLayingItems, v7);
-      if ( (signed int)uNumLayingItems > 0 )
+      fread(pSpriteObjects, 0x70u, uNumSpriteObjects, v7);
+      if ( (signed int)uNumSpriteObjects > 0 )
       {
-        v75 = pLayingItems;
-        pDest = (char *)uNumLayingItems;
+        v75 = pSpriteObjects;
+        pDest = (char *)uNumSpriteObjects;
         do
         {
           Argsj = 0;
@@ -2517,7 +2517,7 @@
   assert(sizeof(SpawnPointMM7) == 24);
   assert(sizeof(DDM_DLV_Header) == 40);
   assert(sizeof(Actor) == 836);
-  assert(sizeof(LayingItem) == 112);
+  assert(sizeof(SpriteObject) == 112);
   assert(sizeof(Chest) == 5324);
   assert(sizeof(stru123) == 0xC8);
   assert(sizeof(BLVMapOutline) == 12);
@@ -2972,23 +2972,23 @@
   pGameLoadingUI_ProgressBar->Progress();
   pGameLoadingUI_ProgressBar->Progress();
 
-  memcpy(&uNumLayingItems, pData, 4);
-  memcpy(pLayingItems, pData + 4, uNumLayingItems * sizeof(LayingItem));
-  pData += 4 + uNumLayingItems * sizeof(LayingItem);
+  memcpy(&uNumSpriteObjects, pData, 4);
+  memcpy(pSpriteObjects, pData + 4, uNumSpriteObjects * sizeof(SpriteObject));
+  pData += 4 + uNumSpriteObjects * sizeof(SpriteObject);
 
   pGameLoadingUI_ProgressBar->Progress();
 
-  for (uint i = 0; i < uNumLayingItems; ++i)
+  for (uint i = 0; i < uNumSpriteObjects; ++i)
   {
-    auto pItem = pLayingItems + i;
+    auto pItem = pSpriteObjects + i;
  
     if (pItem->stru_24.uItemID && !(pItem->uAttributes & 0x0100))
     {
-      pItem->uItemType = pItemsTable->pItems[pItem->stru_24.uItemID - 1].uSpriteID;
+      pItem->uType = pItemsTable->pItems[pItem->stru_24.uItemID - 1].uSpriteID;
 
       uint uObjectID = 0;
       for (uint j = 0; j < pObjectList->uNumObjects; ++j)
-        if (pItem->uItemType == pObjectList->pObjects[j].uObjectID)
+        if (pItem->uType == pObjectList->pObjects[j].uObjectID)
         {
           pItem->uObjectDescID = j;
           break;
@@ -4138,7 +4138,7 @@
           _46E44E_collide_against_faces_and_portals(1u);
           _46E0B2_collide_against_decorations();
           _46EF01_collision_chech_player(0);
-          _46ED8A_collide_against_layingItems(_this);
+          _46ED8A_collide_against_sprite_objects(_this);
           v25 = 0;
           v56 = 0;
           if ( ai_arrays_size > v22 )
@@ -4487,7 +4487,7 @@
   if ( !(dword_6BE364_game_settings_1 & 0x2000) )
   {
     InitializeActors();
-    InitializeLayingItems();
+    InitializeSpriteObjects();
   }
   BYTE1(dword_6BE364_game_settings_1) &= 0xDFu;
   if ( !v39 )
@@ -4658,9 +4658,9 @@
 
   pGameLoadingUI_ProgressBar->Progress();
 
-  for (uint i = 0; i < uNumLayingItems; ++i)
+  for (uint i = 0; i < uNumSpriteObjects; ++i)
   {
-    auto p = pLayingItems + i;
+    auto p = pSpriteObjects + i;
     if (p->uObjectDescID)
     {
       auto uItemID = p->stru_24.uItemID;
--- a/LayingItem.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,131 +0,0 @@
-#include "LayingItem.h"
-#include "Party.h"
-#include "TurnEngine.h"
-#include "MapInfo.h"
-
-#include "mm7_data.h"
-
-
-
-
-size_t uNumLayingItems;
-LayingItem pLayingItems[1000];
-
-
-//----- (00438E35) --------------------------------------------------------
-void LayingItem::_438E35()
-{
-  LayingItem *v1; // edi@1
-  MapInfo *pMapInfo; // esi@1
-  int v3; // ebx@1
-  int v4; // eax@1
-  int v5; // ebx@1
-  unsigned int v6; // ecx@1
-  int v7; // edx@2
-  unsigned int v8; // edx@4
-  unsigned int v9; // edx@6
-  unsigned int v10; // eax@7
-  signed int v11; // ebx@8
-  Player **v12; // esi@18
-  signed int v13; // edi@20
-  int v15; // [sp+Ch] [bp-Ch]@1
-  int v16; // [sp+10h] [bp-8h]@1
-  signed int v17; // [sp+14h] [bp-4h]@8
-  int v18; // [sp+14h] [bp-4h]@14
-
-  v1 = this;
-  pMapInfo = &pMapStats->pInfos[pMapStats->GetMapInfo(pCurrentMapName)];
-  v3 = abs(pParty->vPosition.x - v1->vPosition.x);
-  v15 = abs(pParty->vPosition.y - v1->vPosition.y);
-  v16 = abs(pParty->vPosition.z + pParty->sEyelevel - v1->vPosition.z);
-  v4 = v3;
-  v5 = v15;
-  v6 = v16;
-  if ( v4 < v15 )
-  {
-    v7 = v4;
-    v4 = v15;
-    v5 = v7;
-  }
-  if ( v4 < v16 )
-  {
-    v8 = v4;
-    v4 = v16;
-    v6 = v8;
-  }
-  if ( v5 < (signed int)v6 )
-  {
-    v9 = v6;
-    v6 = v5;
-    v5 = v9;
-  }
-  v10 = ((unsigned int)(11 * v5) >> 5) + (v6 >> 2) + v4;
-  if ( (signed int)v10 <= 768 )
-  {
-    v17 = 0;
-    v11 = 5;
-    if ( pMapInfo->Trap_D20 )
-    {
-      do
-      {
-        ++v17;
-        v11 += rand() % 20 + 1;
-      }
-      while ( v17 < pMapInfo->Trap_D20 );
-    }
-    switch ( v1->uItemType )
-    {
-      case 0x32Bu:
-        v18 = 0;
-        break;
-      case 0x32Cu:
-        v18 = 1;
-        break;
-      case 0x32Du:
-        v18 = 2;
-        break;
-      default:
-        //LOWORD(v10) = v1->uItemType - 814;
-        if ( v1->uItemType != 814 )
-          return;
-        v18 = 8;
-        break;
-    }
-    v12 = &pPlayers[1];
-    do
-    {
-      if ( (*v12)->CanAct() && (v13 = (*v12)->GetPerception() + 20, rand() % v13 > 20) )
-        (*v12)->PlaySound(SPEECH_6, 0);
-      else
-        (*v12)->ReceiveDamage(v11, v18);
-      ++v12;
-    }
-    while ( (signed int)v12 <= (signed int)&pPlayers[4] );
-  }
-}
-
-
-
-//----- (0042F933) --------------------------------------------------------
-void LayingItem::OnItemPickup(unsigned int uLayingItemID)
-{
-  unsigned int v1; // ecx@1
-  unsigned __int16 *pAttributes; // ecx@2
-  unsigned __int16 v3; // ax@2
-
-  //__debugbreak(); // find out what's going on
-
-  v1 = uLayingItemID;
-  pLayingItems[v1].uObjectDescID = 0;
-  if ( pParty->bTurnBasedModeOn == 1 )
-  {
-    pAttributes = &pLayingItems[v1].uAttributes;
-    v3 = *pAttributes;
-    if ( *pAttributes & 4 )
-    {
-      v3 = v3 & 0xFB;
-      --pTurnEngine->field_1C;
-      *pAttributes = v3;
-    }
-  }
-}
--- a/LayingItem.h	Fri Mar 01 22:17:32 2013 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,54 +0,0 @@
-#pragma once
-#include "VectorTypes.h"
-#include "Items.h"
-
-enum
-{
-  OBJECT_ATTACHED_TO_ACTOR = 0x80,
-};
-
-
-/*   72 */
-#pragma pack(push, 1)
-struct LayingItem
-{
-  inline bool AttachedToActor() const {return uAttributes & OBJECT_ATTACHED_TO_ACTOR;}
-
-  LayingItem();
-  int Create(int yaw, int pitch, int a4, int a5);
-  void _46BEF1_apply_spells();
-  void _438E35();
-
-  static void UpdateObject_fn0_BLV(unsigned int uLayingItemID);
-  static void UpdateObject_fn0_ODM(unsigned int uLayingItemID);
-  static void OnItemPickup(unsigned int uLayingItemID);
-
-
-  unsigned __int16 uItemType;
-  unsigned __int16 uObjectDescID;
-  struct Vec3_int_ vPosition;
-  struct Vec3_short_ vVelocity;
-  unsigned __int16 uFacing;
-  unsigned __int16 uSoundID;
-  unsigned __int16 uAttributes;
-  __int16 uSectorID;
-  unsigned __int16 uSpriteFrameID;
-  __int16 field_20;
-  __int16 field_22_glow_radius_multiplier;
-  struct ItemGen stru_24;
-  int field_48;
-  int field_4C;
-  int field_50;
-  int field_54;
-  int field_58_pid;
-  int field_5C;
-  char field_60_distance_related_prolly_lod;
-  char field_61;
-  char field_62[14];
-};
-#pragma pack(pop)
-
-
-
-extern size_t uNumLayingItems;
-extern LayingItem pLayingItems[1000];
\ No newline at end of file
--- a/Outdoor.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/Outdoor.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -2,7 +2,7 @@
 
 #include "Outdoor.h"
 #include "Party.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "LOD.h"
 #include "Render.h"
 #include "MapInfo.h"
@@ -135,7 +135,7 @@
   if (!pOutdoorCamera->bDoNotRenderDecorations)
     pRenderer->PrepareDecorationsRenderList_ODM();
 
-  pRenderer->DrawLayingItems_Shooting_Magic_ODM();
+  pRenderer->DrawSpriteObjects_ODM();
   pRenderer->TransformBillboardsAndSetPalettesODM();
   sub_485F53((Vec2_int_ *)unnamed_6BE060);
 }
@@ -1209,7 +1209,7 @@
   __int16 v20; // ax@16
   int v21; // ecx@16
   ODMFace *v22; // ebx@26
-  LayingItem *pItems; // ecx@27
+  SpriteObject *pItems; // ecx@27
   unsigned int v24; // eax@28
   //unsigned __int8 v25; // zf@28
   //unsigned __int8 v26; // sf@28
@@ -1391,7 +1391,7 @@
     fseek((FILE *)v7, v114, 0);
     fread(&uNumBModels, 4u, 1u, (FILE *)v7);
     fseek((FILE *)v7, v115, 0);
-    fread(&uNumLayingItems, 4u, 1u, (FILE *)v7);
+    fread(&uNumSpriteObjects, 4u, 1u, (FILE *)v7);
     fseek((FILE *)v7, v116, 0);
     fread(&uNumLevelDecorations, 4u, 1u, (FILE *)v7);
     fseek((FILE *)v7, v117, 0);
@@ -1518,11 +1518,11 @@
 LABEL_26:
     v22 = File;
     fseek((FILE *)File, v124, 0);
-    fread(pLayingItems, 0x70u, uNumLayingItems, (FILE *)v22);
-    if ( (signed int)uNumLayingItems > 0 )
+    fread(pSpriteObjects, 0x70u, uNumSpriteObjects, (FILE *)v22);
+    if ( (signed int)uNumSpriteObjects > 0 )
     {
-      pItems = pLayingItems;
-      pNumItems = uNumLayingItems;
+      pItems = pSpriteObjects;
+      pNumItems = uNumSpriteObjects;
       do
       {
         v24 = pItems->stru_24.uItemID;
@@ -2222,15 +2222,15 @@
   //v92 = (char *)v91 + (int)pFilename;
   pGameLoadingUI_ProgressBar->Progress();
 
-  memcpy(&uNumLayingItems, pSrc, 4);
-  assert(uNumLayingItems <= 1000 && "Too many objects");
-  assert(sizeof(LayingItem) == 112);
+  memcpy(&uNumSpriteObjects, pSrc, 4);
+  assert(uNumSpriteObjects <= 1000 && "Too many objects");
+  assert(sizeof(SpriteObject) == 112);
 
   pGameLoadingUI_ProgressBar->Progress();
 
-  //pFilename = (char *)(112 * uNumLayingItems);
-  memcpy(pLayingItems, pSrc + 4, uNumLayingItems * sizeof(LayingItem));
-  pSrc += 4 + uNumLayingItems * sizeof(LayingItem);
+  //pFilename = (char *)(112 * uNumSpriteObjects);
+  memcpy(pSpriteObjects, pSrc + 4, uNumSpriteObjects * sizeof(SpriteObject));
+  pSrc += 4 + uNumSpriteObjects * sizeof(SpriteObject);
 
   //v94 = (char *)v93 + (int)pFilename;
   pGameLoadingUI_ProgressBar->Progress();
@@ -2730,9 +2730,9 @@
 
   v5 = this;
   v1 = 0;
-  if ( (signed int)uNumLayingItems > 0 )
+  if ( (signed int)uNumSpriteObjects > 0 )
   {
-    v2 = (char *)&pLayingItems[0].uObjectDescID;
+    v2 = (char *)&pSpriteObjects[0].uObjectDescID;
     do
     {
       if ( *(short *)v2 )
@@ -2750,7 +2750,7 @@
       ++v1;
       v2 += 112;
     }
-    while ( v1 < (signed int)uNumLayingItems );
+    while ( v1 < (signed int)uNumSpriteObjects );
   }
   pGameLoadingUI_ProgressBar->Progress();
   return 1;
--- a/Render.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/Render.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -14,7 +14,7 @@
 #include "LightmapBuilder.h"
 #include "stru220.h"
 #include "ObjectList.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "DecorationList.h"
 #include "Allocator.h"
 #include "OSInfo.h"
@@ -3050,7 +3050,7 @@
 
 
 //----- (0047AF11) --------------------------------------------------------
-void Render::DrawLayingItems_Shooting_Magic_ODM()
+void Render::DrawSpriteObjects_ODM()
 {
   //char *v0; // edi@2
   //ObjectDesc *v1; // ebx@4
@@ -3101,11 +3101,11 @@
   signed __int16 v46; // [sp+3Ch] [bp-4h]@12
 
   //v41 = 0;
-  for (int i = 0; i < uNumLayingItems; ++i)
-  {
-    auto object = pLayingItems + i;
-    //auto v0 = (char *)&pLayingItems[i].uSectorID;
-    //v0 = (char *)&pLayingItems[0].uSectorID;
+  for (int i = 0; i < uNumSpriteObjects; ++i)
+  {
+    auto object = pSpriteObjects + i;
+    //auto v0 = (char *)&pSpriteObjects[i].uSectorID;
+    //v0 = (char *)&pSpriteObjects[0].uSectorID;
     //do
     //{
     if (!object->uObjectDescID)  // item probably pciked up
@@ -3120,7 +3120,7 @@
         //if ( !(v1->uFlags & 1) )
         //{
           //v2 = *((short *)v0 - 14)
-    v2 = object->uItemType;
+    v2 = object->uType;
     if ( (v2 < 1000 || v2 >= 10000) && (v2 < 500 || v2 >= 600) || pGame->pStru6Instance->_4A81CA(object) )
     {
             //a5 = *(short *)v0;
@@ -3249,7 +3249,7 @@
       //++v41;
       //v0 += 112;
     //}
-    //while ( v41 < (signed int)uNumLayingItems );
+    //while ( v41 < (signed int)uNumSpriteObjects );
   }
 }
 // 4E94D3: using guessed type char byte_4E94D3;
--- a/Render.h	Fri Mar 01 22:17:32 2013 +0400
+++ b/Render.h	Fri Mar 01 22:18:22 2013 +0400
@@ -362,7 +362,7 @@
   void DrawSkyD3D();
   int DrawSkySW(struct Span *a1, stru148 *a2, int a3);
   void PrepareDecorationsRenderList_ODM();
-  void DrawLayingItems_Shooting_Magic_ODM();
+  void DrawSpriteObjects_ODM();
   void TransformBillboardsAndSetPalettesODM();
   float DrawBezierTerrain();
   void RenderTerrainD3D();
--- a/SaveLoad.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/SaveLoad.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -14,7 +14,7 @@
 #include "GUIWindow.h"
 #include "GUIFont.h"
 #include "Overlays.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "Viewport.h"
 #include "stru123.h"
 #include "texts.h"
@@ -467,10 +467,10 @@
       v12 = (char *)v11 + 4;
       memcpy(v12, pActors, 836 * uNumActors);
       v13 = (char *)v12 + 836 * uNumActors;
-      memcpy(v13, &uNumLayingItems, 4);
+      memcpy(v13, &uNumSpriteObjects, 4);
       v13 = (char *)v13 + 4;
-      memcpy(v13, pLayingItems, 112 * uNumLayingItems);
-      v14 = (char *)v13 + 112 * uNumLayingItems;
+      memcpy(v13, pSpriteObjects, 112 * uNumSpriteObjects);
+      v14 = (char *)v13 + 112 * uNumSpriteObjects;
       memcpy(v14, &uNumChests, 4);
       v14 = (char *)v14 + 4;
       memcpy(v14, pChests, 5324 * uNumChests);
@@ -546,10 +546,10 @@
       v28 = (char *)v22 + 4;
       memcpy(v28, pActors, 836 * uNumActors);
       v29 = (char *)v28 + 836 * uNumActors;
-      memcpy(v29, &uNumLayingItems, 4);
+      memcpy(v29, &uNumSpriteObjects, 4);
       v29 = (char *)v29 + 4;
-      memcpy(v29, pLayingItems, 112 * uNumLayingItems);
-      v30 = (char *)v29 + 112 * uNumLayingItems;
+      memcpy(v29, pSpriteObjects, 112 * uNumSpriteObjects);
+      v30 = (char *)v29 + 112 * uNumSpriteObjects;
       memcpy(v30, &uNumChests, 4);
       v30 = (char *)v30 + 4;
       memcpy(v30, pChests, 5324 * uNumChests);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SpriteObject.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -0,0 +1,1085 @@
+#include <assert.h>
+
+#include "SpriteObject.h"
+#include "Party.h"
+#include "TurnEngine.h"
+#include "MapInfo.h"
+#include "Math.h"
+#include "ObjectList.h"
+#include "Indoor.h"
+#include "Outdoor.h"
+#include "ParticleEngine.h"
+#include "Time.h"
+#include "Game.h"
+#include "LOD.h"
+#include "Actor.h"
+#include "Events.h"
+
+#include "mm7_data.h"
+
+
+
+
+size_t uNumSpriteObjects;
+SpriteObject pSpriteObjects[1000];
+
+
+
+
+//----- (0042F5ED) --------------------------------------------------------
+int SpriteObject::Create(int yaw, int pitch, int a4, int a5)
+{
+  //SpriteObject *v5; // eax@1
+  signed int v6; // ebx@2
+  //char *v7; // ecx@2
+  //signed int result; // eax@6
+  SpriteObject *v9; // ebx@7
+  int v10; // edx@11
+  int v11; // edi@18
+  __int16 v12; // ax@18
+  int v13; // ST2C_4@20
+  int v14; // eax@20
+  int v15; // [sp-28h] [bp-38h]@14
+  int v16; // [sp-24h] [bp-34h]@11
+  Vec3_int_ v17; // [sp-20h] [bp-30h]@11
+  int *v18; // [sp-14h] [bp-24h]@11
+  int *v19; // [sp-10h] [bp-20h]@11
+  int *v20; // [sp-Ch] [bp-1Ch]@11
+  //signed int v21; // [sp+8h] [bp-8h]@2
+  int angle; // [sp+Ch] [bp-4h]@1
+  int a4a; // [sp+1Ch] [bp+Ch]@20
+  int a4b; // [sp+1Ch] [bp+Ch]@20
+  int a5a; // [sp+20h] [bp+10h]@20
+
+  //auto a1 = this;
+  angle = yaw;
+  //v5 = a1;
+  if (!uObjectDescID)
+    return -1;
+
+  v6 = 1000;
+  //v7 = (char *)&pSpriteObjects[0].uObjectDescID;
+  /*v21 = 0;
+  do
+  {
+    if ( !*(short *)v7 )
+      break;
+    v7 += 112;
+    ++v6;
+    v21 = v6;
+  }
+  while ( (signed int)v7 < (signed int)((char *)&pObjectList->uNumObjects + 2) );*/
+  for (uint i = 0; i < 1000; ++i)
+    if (!pSpriteObjects[i].uObjectDescID)
+    {
+      v6 = i;
+      break;
+    }
+
+  if ( v6 >= 1000 )
+    return -1;
+  field_64.x = vPosition.x;
+  field_64.y = vPosition.y;
+  v9 = &pSpriteObjects[v6];
+  field_64.z = vPosition.z;
+
+  assert(sizeof(SpriteObject) == 0x70);
+  memcpy(v9, this, sizeof(*this));
+  if ( a5 == 1 )
+  {
+    v20 = &v9->vPosition.z;
+    v19 = &v9->vPosition.y;
+    v18 = (int *)&v9->vPosition;
+    v17.x = vPosition.x;
+    v17.y = vPosition.y;
+    v17.z = vPosition.z;
+    v16 = 0;
+    v10 = stru_5C6E00->uIntegerHalfPi + v9->uFacing;
+    goto LABEL_16;
+  }
+  if ( a5 == 2 )
+  {
+    v20 = &v9->vPosition.z;
+    v19 = &v9->vPosition.y;
+    v18 = (int *)&v9->vPosition;
+    v17.x = vPosition.x;
+    v17.y = vPosition.y;
+    v17.z = vPosition.z;
+    v16 = 0;
+    v10 = stru_5C6E00->uIntegerHalfPi + v9->uFacing;
+    goto LABEL_14;
+  }
+  if ( a5 == 3 )
+  {
+    v20 = &v9->vPosition.z;
+    v19 = &v9->vPosition.y;
+    v18 = (int *)&v9->vPosition;
+    v17.x = vPosition.x;
+    v17.y = vPosition.y;
+    v17.z = vPosition.z;
+    v16 = 0;
+    v10 = v9->uFacing - stru_5C6E00->uIntegerHalfPi;
+LABEL_14:
+    v15 = 8;
+LABEL_17:
+    Vec3_int_::Rotate(v15, v10, v16, v17, v18, v19, v20);
+    goto LABEL_18;
+  }
+  if ( a5 == 4 )
+  {
+    v20 = &v9->vPosition.z;
+    v19 = &v9->vPosition.y;
+    v18 = (int *)&v9->vPosition;
+    v17.x = vPosition.x;
+    v17.y = vPosition.y;
+    v17.z = vPosition.z;
+    v16 = 0;
+    v10 = v9->uFacing - stru_5C6E00->uIntegerHalfPi;
+LABEL_16:
+    v15 = 24;
+    goto LABEL_17;
+  }
+LABEL_18:
+  v11 = a4;
+  v12 = 0;
+  if ( a4 )
+  {
+    a4a = stru_5C6E00->Cos(angle);
+    v13 = (unsigned __int64)(a4a * (signed __int64)stru_5C6E00->Cos(pitch)) >> 16;
+    a4b = stru_5C6E00->Sin(angle);
+    a5a = (unsigned __int64)(a4b * (signed __int64)stru_5C6E00->Cos(pitch)) >> 16;
+    v14 = stru_5C6E00->Sin(pitch);
+    v9->vVelocity.x = (unsigned int)(v13 * v11) >> 16;
+    v9->vVelocity.y = (unsigned int)(a5a * v11) >> 16;
+    v12 = (unsigned int)(v14 * v11) >> 16;
+  }
+  else
+  {
+    v9->vVelocity.y = 0;
+    v9->vVelocity.x = 0;
+  }
+  v9->vVelocity.z = v12;
+
+  if ( v6 >= (signed int)uNumSpriteObjects )
+    uNumSpriteObjects = v6 + 1;
+  return v6;
+}
+
+
+
+//----- (00471C03) --------------------------------------------------------
+void SpriteObject::UpdateObject_fn0_ODM(unsigned int uLayingItemID)
+{
+  SpriteObject *v1; // esi@1
+  ObjectDesc *v2; // ebx@1
+  signed int v3; // edx@1
+  int v4; // ecx@1
+  int v5; // ST04_4@1
+  int v6; // eax@1
+  int v7; // ecx@1
+  int v8; // edi@1
+  int v9; // eax@4
+  __int16 v10; // ax@7
+  int v11; // edx@11
+  int v12; // ecx@11
+  signed int v13; // edx@14
+  signed int v14; // edx@16
+  int v15; // eax@24
+  int v16; // eax@25
+  int v17; // ST10_4@25
+  signed int v18; // eax@25
+  signed int v19; // eax@28
+  Actor *v20; // edi@31
+  int v21; // eax@41
+  int v22; // ecx@43
+  __int16 v23; // bx@45
+  char v24; // al@46
+  signed int i; // edi@50
+  int v26; // edi@52
+  int v27; // eax@52
+  __int16 v28; // cx@55
+  int v29; // eax@55
+  signed int v30; // edi@59
+  BSPModel *v31; // ecx@61
+  ODMFace *v32; // edi@61
+  int v33; // eax@62
+  int v34; // ecx@62
+  int v35; // eax@63
+  Actor *v36; // ecx@67
+  __int16 v37; // ax@67
+  int v38; // eax@72
+  int v39; // eax@72
+  unsigned __int64 v40; // qax@72
+  int v41; // eax@72
+  unsigned __int8 v42; // sf@74
+  unsigned __int8 v43; // of@74
+  int v44; // eax@77
+  __int16 v45; // bx@81
+  int v46; // eax@85
+  const char *v47; // [sp-8h] [bp-B0h]@83
+  enum TEXTURE_TYPE v48; // [sp-4h] [bp-ACh]@46
+  int v49; // [sp+Ch] [bp-9Ch]@52
+  int v50; // [sp+10h] [bp-98h]@52
+  Vec3_int_ v51; // [sp+14h] [bp-94h]@11
+  Particle_ Dst; // [sp+20h] [bp-88h]@45
+  unsigned int uLayingItemID_; // [sp+88h] [bp-20h]@1
+  int v54; // [sp+8Ch] [bp-1Ch]@1
+  int v55; // [sp+90h] [bp-18h]@1
+  int v56; // [sp+94h] [bp-14h]@11
+  int v57; // [sp+98h] [bp-10h]@1
+  int v58; // [sp+9Ch] [bp-Ch]@1
+  int v59; // [sp+A0h] [bp-8h]@1
+  Actor *v60; // [sp+A4h] [bp-4h]@11
+
+  uLayingItemID_ = uLayingItemID;
+  v1 = &pSpriteObjects[uLayingItemID];
+  v58 = 0;
+  v2 = &pObjectList->pObjects[v1->uObjectDescID];
+  v57 = IsTerrainSlopeTooHigh(v1->vPosition.x, v1->vPosition.y);
+  v3 = v1->vPosition.y;
+  v4 = v1->vPosition.x;
+  v5 = v2->uHeight;
+  v55 = 0;
+  v6 = sub_46D49E_prolly_get_world_y_under_party(v4, v3, v1->vPosition.z, v5, &v59, &v55, 0);
+  v7 = v6;
+  v54 = v6;
+  v8 = v6 + 1;
+  if ( v1->vPosition.z <= v6 + 1 )
+  {
+    if ( v59 )
+    {
+      v9 = v6 + 60;
+      if ( v55 )
+        v9 = v7 + 30;
+      sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v9);
+      SpriteObject::OnInteraction(uLayingItemID_);
+      v7 = v54;
+    }
+  }
+  else
+  {
+    v58 = 1;
+  }
+  v10 = v2->uFlags;
+  if ( !(v10 & 0x20) )
+  {
+    if ( v58 )
+    {
+      v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
+      goto LABEL_13;
+    }
+    if ( v57 )
+    {
+      v11 = v1->vPosition.y;
+      v12 = v1->vPosition.x;
+      v1->vPosition.z = v8;
+      ODM_GetTerrainNormalAt(v12, v11, &v51);
+      v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
+      v56 = abs(v51.y * v1->vVelocity.y + v51.z * v1->vVelocity.z + v51.x * v1->vVelocity.x) >> 16;
+      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.x) >> 16);
+      v1->vVelocity.x += (unsigned int)(v56 * v51.x) >> 16;
+      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.y) >> 16);
+      v1->vVelocity.y += (unsigned int)(v56 * v51.y) >> 16;
+      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.z) >> 16);
+      v1->vVelocity.z += (unsigned int)(v56 * v51.z) >> 16;
+LABEL_12:
+      v7 = v54;
+      goto LABEL_13;
+    }
+    if ( v10 & 0x40 )
+    {
+      if ( v1->vPosition.z < v7 )
+        v1->vPosition.z = v8;
+      if ( !_46BFFA_check_object_intercept(uLayingItemID_, 0) )
+        return;
+    }
+    v1->vPosition.z = v8;
+    if ( !(v2->uFlags & 0x80) || (v21 = -v1->vVelocity.z >> 1, v1->vVelocity.z = v21, (signed __int16)v21 < 10) )
+      v1->vVelocity.z = 0;
+    v60 = (Actor *)v1->vVelocity.x;
+    v55 = 58500;
+    v60 = (Actor *)((unsigned __int64)(58500i64 * (signed int)v60) >> 16);
+    v1->vVelocity.x = (signed __int16)v60;
+    v60 = (Actor *)v1->vVelocity.y;
+    v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16);
+    v55 = 58500;
+    v1->vVelocity.y = (signed __int16)v60;
+    v60 = (Actor *)v1->vVelocity.z;
+    v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16);
+    v22 = v1->vVelocity.x;
+    v1->vVelocity.z = (signed __int16)v60;
+    if ( v1->vVelocity.y * v1->vVelocity.y + v22 * v22 >= 400 )
+      goto LABEL_12;
+    v1->vVelocity.y = 0;
+    v1->vVelocity.x = 0;
+    if ( !(HIBYTE(v2->uFlags) & 1) )
+      return;
+    memset(&Dst, 0, 0x68u);
+    v23 = v2->uFlags;
+    Dst.x = (double)v1->vPosition.x;
+    Dst.y = (double)v1->vPosition.y;
+    Dst.z = (double)v1->vPosition.z;
+    Dst.flt_10 = 0.0;
+    Dst.flt_14 = 0.0;
+    Dst.flt_18 = 0.0;
+    if ( HIBYTE(v23) & 2 )
+    {
+      Dst.bFree = 1036;
+      Dst.uDiffuse = 16727070;
+      v24 = rand();
+      v48 = (TEXTURE_TYPE)0;
+LABEL_83:
+      v47 = "effpar01";
+    }
+    else
+    {
+      if ( HIBYTE(v23) & 4 )
+      {
+        Dst.bFree = 512;
+        Dst.uDiffuse = rand();
+        Dst.timeToLive = 64;
+        Dst.uTextureID = 0;
+LABEL_89:
+        Dst.flt_28 = 1.0;
+        pGame->pParticleEngine->AddParticle(&Dst);
+        return;
+      }
+      Dst.bFree = 1032;
+      Dst.uDiffuse = rand();
+      v24 = rand();
+      v48 = (TEXTURE_TYPE)0;
+LABEL_87:
+      v47 = "effpar03";
+    }
+    Dst.timeToLive = (unsigned __int8)(v24 & 0x80) + 128;
+    Dst.uTextureID = pBitmaps_LOD->LoadTexture(v47, v48);
+    goto LABEL_89;
+  }
+LABEL_13:
+  if ( v1->vPosition.z > v7
+    && (v13 = v1->vPosition.x, v13 >= -32768)
+    && v13 <= 32768
+    && (v14 = v1->vPosition.y, v14 >= -32768)
+    && v14 <= 32768
+    && v1->vPosition.z <= 13000
+    || !(v2->uFlags & 0x40) )
+    goto LABEL_92;
+  if ( v1->vPosition.z < v7 )
+    v1->vPosition.z = v8;
+  if ( _46BFFA_check_object_intercept(uLayingItemID_, 0) )
+  {
+LABEL_92:
+    stru_721530.field_0 = 0;
+    v55 = 0;
+    stru_721530.prolly_normal_d = v2->uRadius;
+    stru_721530.field_C = v2->uHeight;
+    stru_721530.field_8 = 0;
+    stru_721530.field_70 = 0;
+    while ( 1 )
+    {
+      stru_721530.field_34.x = v1->vPosition.x;
+      stru_721530.normal.x = stru_721530.field_34.x;
+      v15 = v1->vPosition.y;
+      stru_721530.uSectorID = 0;
+      stru_721530.field_34.y = v15;
+      stru_721530.normal.y = v15;
+      stru_721530.field_34.z = v1->vPosition.z + stru_721530.prolly_normal_d + 1;
+      stru_721530.normal.z = stru_721530.field_34.z;
+      stru_721530.field_1C = v1->vVelocity.x;
+      stru_721530.field_20 = v1->vVelocity.y;
+      stru_721530.field_24 = v1->vVelocity.z;
+      if ( stru_721530._47050A(0) )
+        return;
+      _46E889_collide_against_bmodels(0);
+      v16 = WorldPosToGridCellZ(v1->vPosition.y);
+      v17 = v1->vPosition.x;
+      v58 = v16;
+      v18 = WorldPosToGridCellX(v17);
+      _46E26D_collide_against_sprites(v18, v58);
+      if ( (v1->field_58_pid & 7) != OBJECT_Player)
+        _46EF01_collision_chech_player(0);
+      if ( (v1->field_58_pid & 7) == OBJECT_Actor)
+      {
+        v19 = v1->field_58_pid >> 3;
+        if ( v19 >= 0 )
+        {
+          if ( v19 < (signed int)(uNumActors - 1) )
+          {
+            v56 = 0;
+            if ( (signed int)uNumActors > 0 )
+            {
+              v60 = pActors;
+              v20 = &pActors[v19];
+              do
+              {
+                if ( v20->GetActorsRelation(v60) )
+                  _46DF1A_collide_against_actor(v56, 0);
+                ++v56;
+                ++v60;
+              }
+              while ( v56 < (signed int)uNumActors );
+            }
+          }
+        }
+      }
+      else
+      {
+        for ( i = 0; i < (signed int)uNumActors; ++i )
+          _46DF1A_collide_against_actor(i, 0);
+      }
+      v26 = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
+      v27 = sub_46D49E_prolly_get_world_y_under_party(
+              stru_721530.normal2.x,
+              stru_721530.normal2.y,
+              stru_721530.normal2.z - stru_721530.prolly_normal_d - 1,
+              v2->uHeight,
+              &v49,
+              &v50,
+              0);
+      if ( v59 && v26 < v27 + 60 )
+      {
+        if ( v50 )
+          v44 = v27 + 30;
+        else
+          v44 = v54 + 60;
+        sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v44);
+        SpriteObject::OnInteraction(uLayingItemID_);
+        return;
+      }
+      if ( stru_721530.field_7C >= stru_721530.field_6C )
+      {
+        v1->vPosition.x = stru_721530.normal2.x;
+        v1->vPosition.y = stru_721530.normal2.y;
+        v1->vPosition.z = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
+        v1->uSectorID = LOWORD(stru_721530.uSectorID);
+        if ( !(HIBYTE(v2->uFlags) & 1) )
+          return;
+        memset(&Dst, 0, 0x68u);
+        v45 = v2->uFlags;
+        Dst.x = (double)v1->vPosition.x;
+        Dst.y = (double)v1->vPosition.y;
+        Dst.z = (double)v1->vPosition.z;
+        Dst.flt_10 = 0.0;
+        Dst.flt_14 = 0.0;
+        Dst.flt_18 = 0.0;
+        if ( HIBYTE(v45) & 2 )
+        {
+          Dst.bFree = 1036;
+          Dst.uDiffuse = 16727070;
+          v24 = rand();
+          v48 = (TEXTURE_TYPE)0;
+          goto LABEL_83;
+        }
+        if ( HIBYTE(v45) & 4 )
+        {
+          Dst.bFree = 512;
+          v46 = rand();
+          Dst.uTextureID = 0;
+          Dst.uDiffuse = v46;
+          Dst.timeToLive = 64;
+          goto LABEL_89;
+        }
+        Dst.bFree = 1032;
+        Dst.uDiffuse = rand();
+        v24 = rand();
+        v48 = (TEXTURE_TYPE)0;
+        goto LABEL_87;
+      }
+      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16);
+      v1->vPosition.x += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
+      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16);
+      v1->vPosition.y += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
+      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16);
+      v28 = LOWORD(stru_721530.uSectorID);
+      v1->vPosition.z += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
+      v29 = v1->vPosition.z;
+      v1->uSectorID = v28;
+      stru_721530.field_70 += stru_721530.field_7C;
+      if ( v2->uFlags & 0x40 )
+      {
+        if ( v29 < v54 )
+          v1->vPosition.z = v54 + 1;
+        if ( !_46BFFA_check_object_intercept(uLayingItemID_, stru_721530.uFaceID) )
+          return;
+      }
+      v30 = (signed int)stru_721530.uFaceID >> 3;
+      if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration)
+        break;
+      if ( (stru_721530.uFaceID & 7) == OBJECT_BModel)
+      {
+        v31 = &pOutdoor->pBModels[(signed int)stru_721530.uFaceID >> 9];
+        v32 = &v31->pFaces[v30 & 0x3F];
+        if ( v32->uPolygonType != 3 )
+        {
+          v56 = abs(v32->pFacePlane.vNormal.z * v1->vVelocity.z + v32->pFacePlane.vNormal.y * v1->vVelocity.y
+                                                                + v32->pFacePlane.vNormal.x * v1->vVelocity.x) >> 16;
+          if ( stru_721530.field_64 >> 3 > v56 )
+            v56 = stru_721530.field_64 >> 3;
+          v57 = v32->pFacePlane.vNormal.x;
+          v57 = (unsigned __int64)(v56 * (signed __int64)v57) >> 16;
+          v58 = v32->pFacePlane.vNormal.y;
+          v58 = (unsigned __int64)(v56 * (signed __int64)v58) >> 16;
+          v60 = (Actor *)v32->pFacePlane.vNormal.z;
+          v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)(signed int)v60) >> 16);
+          v1->vVelocity.x += 2 * v57;
+          v1->vVelocity.y += 2 * v58;
+          if ( v32->pFacePlane.vNormal.z <= 32000 )
+          {
+            v37 = 2 * (short)v60;
+          }
+          else
+          {
+            v36 = v60;
+            v57 = 32000;
+            v1->vVelocity.z += (signed __int16)v60;
+            v58 = (unsigned __int64)(v57 * (signed __int64)(signed int)v36) >> 16;
+            v37 = (unsigned int)(v57 * (int)v36) >> 16;
+          }
+          v1->vVelocity.z += v37;
+LABEL_70:
+          if ( BYTE3(v32->uAttributes) & 0x10 )
+            EventProcessor(v32->sCogTriggeredID, 0, 1);
+          goto LABEL_74;
+        }
+        v33 = v31->pVertices.pVertices[v32->pVertexIDs[0]].z;
+        v34 = v1->vVelocity.x;
+        v1->vPosition.z = v33 + 1;
+        if ( v1->vVelocity.y * v1->vVelocity.y + v34 * v34 >= 400 )
+          goto LABEL_70;
+        LOWORD(v35) = 0;
+        v1->vVelocity.z = 0;
+        v1->vVelocity.x = 0;
+        goto LABEL_73;
+      }
+LABEL_74:
+      v58 = v1->vVelocity.x;
+      v57 = 58500;
+      v58 = (unsigned __int64)(58500i64 * v58) >> 16;
+      v1->vVelocity.x = v58;
+      v58 = v1->vVelocity.y;
+      v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16;
+      v57 = 58500;
+      v1->vVelocity.y = v58;
+      v58 = v1->vVelocity.z;
+      v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16;
+      ++v55;
+      v43 = __OFSUB__(v55, 100);
+      v42 = v55 - 100 < 0;
+      v1->vVelocity.z = v58;
+      if ( !(v42 ^ v43) )
+        return;
+    }
+    v57 = integer_sqrt(v1->vVelocity.y * v1->vVelocity.y + v1->vVelocity.x * v1->vVelocity.x);
+    v38 = stru_5C6E00->Atan2(
+            v1->vPosition.x - pLevelDecorations[v30].vPosition.x,
+            v1->vPosition.y - pLevelDecorations[v30].vPosition.y);
+    v56 = v38;
+    v39 = stru_5C6E00->Cos(v38);
+    v60 = (Actor *)v39;
+    v40 = v39 * (signed __int64)v57;
+    v58 = v40 >> 16;
+    v1->vVelocity.x = WORD1(v40);
+    v41 = stru_5C6E00->Sin(v56 - stru_5C6E00->uIntegerHalfPi);
+    v60 = (Actor *)v41;
+    v35 = (unsigned __int64)(v41 * (signed __int64)v57) >> 16;
+    v58 = v35;
+LABEL_73:
+    v1->vVelocity.y = v35;
+    goto LABEL_74;
+  }
+}
+
+
+
+//----- (0047136C) --------------------------------------------------------
+void SpriteObject::UpdateObject_fn0_BLV(unsigned int uLayingItemID)
+{
+  SpriteObject *v1; // esi@1
+  ObjectDesc *v2; // edi@1
+  int v3; // ST08_4@1
+  __int16 v4; // ax@5
+  __int16 v5; // ax@7
+  BLVFace *v6; // ecx@11
+  BLVFace *v7; // eax@11
+  signed int v8; // ebx@12
+  int v9; // ecx@16
+  __int16 v10; // di@18
+  char v11; // al@19
+  int v12; // eax@25
+  int v13; // eax@31
+  int v14; // ebx@34
+  signed int v15; // ebx@46
+  BLVFace *v16; // edi@48
+  int v17; // eax@50
+  int v18; // eax@52
+  int v19; // ecx@52
+  Vec3_short_ *v20; // ecx@53
+  int v21; // ecx@57
+  __int16 v22; // ax@57
+  int v23; // edi@62
+  int v24; // edi@62
+  int v25; // eax@62
+  unsigned __int64 v26; // qax@62
+  unsigned __int8 v27; // sf@64
+  unsigned __int8 v28; // of@64
+  __int16 v29; // di@67
+  char v30; // al@68
+  const char *v31; // [sp-8h] [bp-98h]@19
+  const char *v32; // [sp-8h] [bp-98h]@68
+  enum TEXTURE_TYPE v33; // [sp-4h] [bp-94h]@19
+  enum TEXTURE_TYPE v34; // [sp-4h] [bp-94h]@68
+  Particle_ Dst; // [sp+Ch] [bp-84h]@18
+  unsigned int uLayingItemID_; // [sp+74h] [bp-1Ch]@1
+  ObjectDesc *v37; // [sp+78h] [bp-18h]@1
+  unsigned int uFaceID; // [sp+7Ch] [bp-14h]@4
+  int v39; // [sp+80h] [bp-10h]@33
+  Actor *v39b;
+  int v40; // [sp+84h] [bp-Ch]@28
+  int v41; // [sp+88h] [bp-8h]@34
+  int v42; // [sp+8Ch] [bp-4h]@4
+
+  uLayingItemID_ = uLayingItemID;
+  v1 = &pSpriteObjects[uLayingItemID];
+  v2 = &pObjectList->pObjects[v1->uObjectDescID];
+  v3 = v1->vPosition.x;
+  v37 = &pObjectList->pObjects[v1->uObjectDescID];
+  if ( abs(v3) > 32767
+    || abs(v1->vPosition.y) > 32767
+    || abs(v1->vPosition.z) > 20000
+    || (v42 = _46CEC3_get_floor_level(v1->vPosition.x, v1->vPosition.y, v1->vPosition.z, v1->uSectorID, &uFaceID),
+        v42 <= -30000)
+    && ((v4 = pIndoor->GetSector(v1->vPosition.x, v1->vPosition.y, v1->vPosition.z),
+         (v1->uSectorID = v4) == 0)
+     || (v42 = _46CEC3_get_floor_level(v1->vPosition.x, v1->vPosition.y, v1->vPosition.z, v4, &uFaceID), v42 == -30000)) )
+  {
+    SpriteObject::OnInteraction(uLayingItemID_);
+    return;
+  }
+  v5 = v2->uFlags;
+  if ( v5 & 0x20 )
+  {
+LABEL_24:
+    v8 = 0;
+LABEL_25:
+    stru_721530.field_0 = v8;
+    uFaceID = v8;
+    stru_721530.prolly_normal_d = v2->uRadius;
+    v12 = v2->uHeight;
+    stru_721530.field_84 = -1;
+    stru_721530.field_C = v12;
+    stru_721530.field_8 = v8;
+    stru_721530.field_70 = v8;
+    while ( 1 )
+    {
+      stru_721530.field_34.x = v1->vPosition.x;
+      stru_721530.normal.x = stru_721530.field_34.x;
+      stru_721530.field_34.y = v1->vPosition.y;
+      stru_721530.normal.y = stru_721530.field_34.y;
+      stru_721530.field_34.z = stru_721530.prolly_normal_d + v1->vPosition.z + 1;
+      stru_721530.normal.z = stru_721530.field_34.z;
+      stru_721530.field_1C = v1->vVelocity.x;
+      stru_721530.field_20 = v1->vVelocity.y;
+      stru_721530.field_24 = v1->vVelocity.z;
+      stru_721530.uSectorID = v1->uSectorID;
+      if ( stru_721530._47050A(v8) )
+        return;
+      v40 = v8;
+      do
+      {
+        _46E44E_collide_against_faces_and_portals(0);
+        _46E0B2_collide_against_decorations();
+        if ( (v1->field_58_pid & 7) != OBJECT_Player)
+          _46EF01_collision_chech_player(1);
+        v13 = v1->field_58_pid;
+        v42 = v8;
+        if ( (v13 & 7) == OBJECT_Actor)
+        {
+          if ( (signed int)uNumActors > v8 )
+          {
+            v39b = pActors;//[0].word_000086_some_monster_id;
+            do
+            {
+              //v41 = pActors[v1->field_58 >> 3].pMonsterInfo.uID - 1;
+              //v14 = (signed __int64)((double)v41 * 0.3333333333333333);
+              //v41 = *(short *)(v39 - 38) - 1;
+              //if ( v14 != (unsigned int)(signed __int64)((double)v41 * 0.3333333333333333) )
+				if( pActors[v1->field_58_pid >> 3].pMonsterInfo.uID != v39b->pMonsterInfo.uID )
+					//not sure: pMonsterList->pMonsters[v39b->word_000086_some_monster_id-1].uToHitRadius
+					_46DF1A_collide_against_actor(v42, *((short *)&pMonsterList->pMonsters[v39b->word_000086_some_monster_id] - 73));
+              ++v42;
+              ++v39b;// += 836;
+            }
+            while ( v42 < (signed int)uNumActors );
+            v8 = 0;
+          }
+        }
+        else
+        {
+          if ( (signed int)uNumActors > v8 )
+          {
+            v39b = pActors;//[0].word_000086_some_monster_id;
+            do
+            {
+              _46DF1A_collide_against_actor(v42++, *((short *)&pMonsterList->pMonsters[*(short *)v39b] - 73));
+              ++v39b;
+            }
+            while ( v42 < (signed int)uNumActors );
+          }
+        }
+        if ( _46F04E_collide_against_portals() )
+          break;
+        ++v40;
+      }
+      while ( v40 < 100 );
+      if ( stru_721530.field_7C >= stru_721530.field_6C )
+      {
+        v1->vPosition.x = stru_721530.normal2.x;
+        v1->vPosition.y = stru_721530.normal2.y;
+        v1->vPosition.z = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
+        v1->uSectorID = LOWORD(stru_721530.uSectorID);
+        if ( !(HIBYTE(v2->uFlags) & 1) )
+          return;
+        memset(&Dst, v8, 0x68u);
+        v29 = v2->uFlags;
+        Dst.x = (double)v1->vPosition.x;
+        Dst.y = (double)v1->vPosition.y;
+        Dst.z = (double)v1->vPosition.z;
+        Dst.flt_10 = 0.0;
+        Dst.flt_14 = 0.0;
+        Dst.flt_18 = 0.0;
+        if ( v29 & 0x200 )
+        {
+          Dst.bFree = 1036;
+          Dst.uDiffuse = 0xFF3C1Eu;
+          v30 = rand();
+          v34 = (TEXTURE_TYPE)v8;
+          v32 = "effpar01";
+        }
+        else
+        {
+          if ( v29 & 0x400 )
+            goto LABEL_70;
+          Dst.bFree = 1032;
+          Dst.uDiffuse = rand();
+          v30 = rand();
+          v34 = (TEXTURE_TYPE)v8;
+          v32 = "effpar03";
+        }
+        Dst.timeToLive = (unsigned __int8)(v30 & 0x80) + 128;
+        Dst.uTextureID = pBitmaps_LOD->LoadTexture(v32, v34);
+        goto LABEL_71;
+      }
+      v40 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
+      v1->vPosition.x += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
+      v40 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
+      v1->vPosition.y += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
+      v40 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
+      v1->vPosition.z += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
+      v1->uSectorID = LOWORD(stru_721530.uSectorID);
+      stru_721530.field_70 += stru_721530.field_7C;
+      if ( v2->uFlags & 0x40 && !_46BFFA_check_object_intercept(uLayingItemID_, stru_721530.uFaceID) )
+        return;
+      v15 = (signed int)stru_721530.uFaceID >> 3;
+      if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration)
+      {
+        v40 = integer_sqrt(v1->vVelocity.x * v1->vVelocity.x + v1->vVelocity.y * v1->vVelocity.y);
+        v23 = stru_5C6E00->Atan2(
+                v1->vPosition.x - pLevelDecorations[v15].vPosition.x,
+                v1->vPosition.y - pLevelDecorations[v15].vPosition.y);
+        v42 = stru_5C6E00->Cos(v23);
+        v41 = (unsigned __int64)(v42 * (signed __int64)v40) >> 16;
+        v24 = v23;
+        v1->vVelocity.x = (unsigned int)(v42 * v40) >> 16;
+        v25 = stru_5C6E00->Sin(v23);
+        v42 = v25;
+        v26 = v25 * (signed __int64)v40;
+        v41 = v26 >> 16;
+        v1->vVelocity.y = WORD1(v26);
+      }
+      else
+      {
+        if ( (stru_721530.uFaceID & 7) != OBJECT_BModel)
+          goto LABEL_64;
+        stru_721530.field_84 = (signed int)stru_721530.uFaceID >> 3;
+        v16 = &pIndoor->pFaces[v15];
+        if ( v16->uPolygonType != 3 )
+        {
+          v42 = abs(v16->pFacePlane_old.vNormal.x * v1->vVelocity.x + v16->pFacePlane_old.vNormal.z * v1->vVelocity.z
+                                                                    + v16->pFacePlane_old.vNormal.y * v1->vVelocity.y) >> 16;
+          if ( stru_721530.field_64 >> 3 > v42 )
+            v42 = stru_721530.field_64 >> 3;
+          v40 = v16->pFacePlane_old.vNormal.x;
+          v40 = (unsigned __int64)(v42 * (signed __int64)v40) >> 16;
+          v41 = v16->pFacePlane_old.vNormal.y;
+          v41 = (unsigned __int64)(v42 * (signed __int64)v41) >> 16;
+          v39 = v16->pFacePlane_old.vNormal.z;
+          v39 = (unsigned __int64)(v42 * (signed __int64)v39) >> 16;
+          v1->vVelocity.x += 2 * v40;
+          v1->vVelocity.y += 2 * v41;
+          if ( v16->pFacePlane_old.vNormal.z <= 32000 )
+          {
+            v22 = 2 * v39;
+          }
+          else
+          {
+            v21 = v39;
+            v40 = 32000;
+            v1->vVelocity.z += v39;
+            v41 = (unsigned __int64)(v40 * (signed __int64)v21) >> 16;
+            v22 = (unsigned int)(v40 * v21) >> 16;
+          }
+          v1->vVelocity.z += v22;
+          goto LABEL_60;
+        }
+        if ( v37->uFlags & 0x80 )
+        {
+          v17 = -v1->vVelocity.z >> 1;
+          v1->vVelocity.z = v17;
+          if ( (signed __int16)v17 < 10 )
+            v1->vVelocity.z = 0;
+LABEL_60:
+          if ( BYTE3(v16->uAttributes) & 0x10 )
+            EventProcessor(pIndoor->pFaceExtras[v16->uFaceExtraID].uEventID, 0, 1);
+          goto LABEL_63;
+        }
+        v18 = v1->vVelocity.y;
+        v19 = v1->vVelocity.x;
+        v1->vVelocity.z = 0;
+        if ( v19 * v19 + v18 * v18 >= 400 )
+          goto LABEL_60;
+        v20 = pIndoor->pVertices;
+        v1->vVelocity.z = 0;
+        v1->vVelocity.y = 0;
+        v1->vVelocity.x = 0;
+        v1->vPosition.z = v20[*v16->pVertexIDs].z + 1;
+      }
+LABEL_63:
+      v2 = v37;
+LABEL_64:
+      v41 = v1->vVelocity.x;
+      v40 = 58500;
+      v41 = (unsigned __int64)(58500i64 * v41) >> 16;
+      v1->vVelocity.x = v41;
+      v41 = v1->vVelocity.y;
+      v41 = (unsigned __int64)(v40 * (signed __int64)v41) >> 16;
+      v40 = 58500;
+      v1->vVelocity.y = v41;
+      v41 = v1->vVelocity.z;
+      v41 = (unsigned __int64)(v40 * (signed __int64)v41) >> 16;
+      ++uFaceID;
+      v28 = __OFSUB__(uFaceID, 100);
+      v27 = uFaceID - 100 < 0;
+      v1->vVelocity.z = v41;
+      if ( !(v27 ^ v28) )
+        return;
+      v8 = 0;
+    }
+  }
+  if ( v42 <= v1->vPosition.z - 3 )
+  {
+    v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
+    goto LABEL_24;
+  }
+  if ( !(v5 & 0x40) || _46BFFA_check_object_intercept(uLayingItemID_, 0) )
+  {
+    v6 = pIndoor->pFaces;
+    v1->vPosition.z = v42 + 1;
+    v7 = &v6[uFaceID];
+    if ( v7->uPolygonType == 3 )
+    {
+      v8 = 0;
+      v1->vVelocity.z = 0;
+    }
+    else
+    {
+      if ( v7->pFacePlane_old.vNormal.z < 45000 )
+        v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
+      v8 = 0;
+    }
+    v42 = v1->vVelocity.x;
+    uFaceID = 58500;
+    v42 = (unsigned __int64)(58500i64 * v42) >> 16;
+    v1->vVelocity.x = v42;
+    v42 = v1->vVelocity.y;
+    v42 = (unsigned __int64)(uFaceID * (signed __int64)v42) >> 16;
+    uFaceID = 58500;
+    v1->vVelocity.y = v42;
+    v42 = v1->vVelocity.z;
+    v42 = (unsigned __int64)(uFaceID * (signed __int64)v42) >> 16;
+    v9 = v1->vVelocity.x;
+    v1->vVelocity.z = v42;
+    if ( v9 * v9 + v1->vVelocity.y * v1->vVelocity.y < 400 )
+    {
+      v1->vVelocity.z = v8;
+      v1->vVelocity.y = v8;
+      v1->vVelocity.x = v8;
+      if ( !(HIBYTE(v2->uFlags) & 1) )
+        return;
+      memset(&Dst, v8, 0x68u);
+      v10 = v2->uFlags;
+      Dst.x = (double)v1->vPosition.x;
+      Dst.y = (double)v1->vPosition.y;
+      Dst.z = (double)v1->vPosition.z;
+      Dst.flt_10 = 0.0;
+      Dst.flt_14 = 0.0;
+      Dst.flt_18 = 0.0;
+      if ( v10 & 0x200 )
+      {
+        Dst.bFree = 1036;
+        Dst.uDiffuse = 0xFF3C1Eu;
+        Dst.flt_28 = 1.0;
+        v11 = rand();
+        v33 = (TEXTURE_TYPE)v8;
+        v31 = "effpar01";
+      }
+      else
+      {
+        if ( v10 & 0x400 )
+        {
+LABEL_70:
+          Dst.bFree = 512;
+          Dst.uDiffuse = rand();
+          Dst.timeToLive = 64;
+          Dst.uTextureID = v8;
+LABEL_71:
+          Dst.flt_28 = 1.0;
+          goto LABEL_72;
+        }
+        Dst.bFree = 1032;
+        Dst.uDiffuse = rand();
+        Dst.flt_28 = 1.0;
+        v11 = rand();
+        v33 = (TEXTURE_TYPE)v8;
+        v31 = "effpar03";
+      }
+      Dst.timeToLive = (unsigned __int8)(v11 & 0x80) + 128;
+      Dst.uTextureID = pBitmaps_LOD->LoadTexture(v31, v33);
+LABEL_72:
+      pGame->pParticleEngine->AddParticle(&Dst);
+      return;
+    }
+    goto LABEL_25;
+  }
+}
+// 46DF1A: using guessed type int __fastcall 46DF1A_collide_against_actor(int, int);
+
+
+
+
+//----- (00438E35) --------------------------------------------------------
+void SpriteObject::_438E35()
+{
+  SpriteObject *v1; // edi@1
+  MapInfo *pMapInfo; // esi@1
+  int v3; // ebx@1
+  int v4; // eax@1
+  int v5; // ebx@1
+  unsigned int v6; // ecx@1
+  int v7; // edx@2
+  unsigned int v8; // edx@4
+  unsigned int v9; // edx@6
+  unsigned int v10; // eax@7
+  signed int v11; // ebx@8
+  Player **v12; // esi@18
+  signed int v13; // edi@20
+  int v15; // [sp+Ch] [bp-Ch]@1
+  int v16; // [sp+10h] [bp-8h]@1
+  signed int v17; // [sp+14h] [bp-4h]@8
+  int v18; // [sp+14h] [bp-4h]@14
+
+  v1 = this;
+  pMapInfo = &pMapStats->pInfos[pMapStats->GetMapInfo(pCurrentMapName)];
+  v3 = abs(pParty->vPosition.x - v1->vPosition.x);
+  v15 = abs(pParty->vPosition.y - v1->vPosition.y);
+  v16 = abs(pParty->vPosition.z + pParty->sEyelevel - v1->vPosition.z);
+  v4 = v3;
+  v5 = v15;
+  v6 = v16;
+  if ( v4 < v15 )
+  {
+    v7 = v4;
+    v4 = v15;
+    v5 = v7;
+  }
+  if ( v4 < v16 )
+  {
+    v8 = v4;
+    v4 = v16;
+    v6 = v8;
+  }
+  if ( v5 < (signed int)v6 )
+  {
+    v9 = v6;
+    v6 = v5;
+    v5 = v9;
+  }
+  v10 = ((unsigned int)(11 * v5) >> 5) + (v6 >> 2) + v4;
+  if ( (signed int)v10 <= 768 )
+  {
+    v17 = 0;
+    v11 = 5;
+    if ( pMapInfo->Trap_D20 )
+    {
+      do
+      {
+        ++v17;
+        v11 += rand() % 20 + 1;
+      }
+      while ( v17 < pMapInfo->Trap_D20 );
+    }
+    switch ( v1->uType )
+    {
+      case 0x32Bu:
+        v18 = 0;
+        break;
+      case 0x32Cu:
+        v18 = 1;
+        break;
+      case 0x32Du:
+        v18 = 2;
+        break;
+      default:
+        //LOWORD(v10) = v1->uItemType - 814;
+        if ( v1->uType != 814 )
+          return;
+        v18 = 8;
+        break;
+    }
+    v12 = &pPlayers[1];
+    do
+    {
+      if ( (*v12)->CanAct() && (v13 = (*v12)->GetPerception() + 20, rand() % v13 > 20) )
+        (*v12)->PlaySound(SPEECH_6, 0);
+      else
+        (*v12)->ReceiveDamage(v11, v18);
+      ++v12;
+    }
+    while ( (signed int)v12 <= (signed int)&pPlayers[4] );
+  }
+}
+
+
+
+//----- (0042F933) --------------------------------------------------------
+void SpriteObject::OnInteraction(unsigned int uLayingItemID)
+{
+  unsigned int v1; // ecx@1
+  unsigned __int16 *pAttributes; // ecx@2
+  unsigned __int16 v3; // ax@2
+
+  //__debugbreak(); // find out what's going on
+
+  v1 = uLayingItemID;
+  pSpriteObjects[v1].uObjectDescID = 0;
+  if ( pParty->bTurnBasedModeOn == 1 )
+  {
+    pAttributes = &pSpriteObjects[v1].uAttributes;
+    v3 = *pAttributes;
+    if ( *pAttributes & 4 )
+    {
+      v3 = v3 & 0xFB;
+      --pTurnEngine->field_1C;
+      *pAttributes = v3;
+    }
+  }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SpriteObject.h	Fri Mar 01 22:18:22 2013 +0400
@@ -0,0 +1,55 @@
+#pragma once
+#include "VectorTypes.h"
+#include "Items.h"
+
+enum
+{
+  OBJECT_ATTACHED_TO_ACTOR = 0x80,
+};
+
+
+/*   72 */
+#pragma pack(push, 1)
+struct SpriteObject
+{
+  inline bool AttachedToActor() const {return uAttributes & OBJECT_ATTACHED_TO_ACTOR;}
+
+  SpriteObject();
+  int Create(int yaw, int pitch, int a4, int a5);
+  void _46BEF1_apply_spells();
+  void _438E35();
+
+  static void UpdateObject_fn0_BLV(unsigned int uLayingItemID);
+  static void UpdateObject_fn0_ODM(unsigned int uLayingItemID);
+  static void OnInteraction(unsigned int uLayingItemID);
+
+
+  unsigned __int16 uType;
+  unsigned __int16 uObjectDescID;
+  struct Vec3_int_ vPosition;
+  struct Vec3_short_ vVelocity;
+  unsigned __int16 uFacing;
+  unsigned __int16 uSoundID;
+  unsigned __int16 uAttributes;
+  __int16 uSectorID;
+  unsigned __int16 uSpriteFrameID;
+  __int16 field_20;
+  __int16 field_22_glow_radius_multiplier;
+  struct ItemGen stru_24;
+  int field_48;
+  int field_4C;
+  int field_50;
+  int field_54;
+  int field_58_pid;
+  int field_5C;
+  char field_60_distance_related_prolly_lod;
+  char field_61;
+  char field_62[2];
+  Vec3_int_ field_64;
+};
+#pragma pack(pop)
+
+
+
+extern size_t uNumSpriteObjects;
+extern SpriteObject pSpriteObjects[1000];
\ No newline at end of file
--- a/mm7_1.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/mm7_1.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -29,7 +29,7 @@
 #include "Viewport.h"
 #include "FrameTableInc.h"
 #include "Math.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "ObjectList.h"
 #include "Chest.h"
 #include "PaletteManager.h"
@@ -4024,12 +4024,12 @@
   int v3; // ebx@4
   int v4; // esi@6
   int v5; // ecx@6
-  //LayingItem v6; // [sp+Ch] [bp-80h]@1
+  //SpriteObject v6; // [sp+Ch] [bp-80h]@1
   char v7; // [sp+7Ch] [bp-10h]@2
   POINT a2; // [sp+84h] [bp-8h]@2
   
-  LayingItem v6; // [sp+Ch] [bp-80h]@1
-  //LayingItem::LayingItem(&v6);
+  SpriteObject v6; // [sp+Ch] [bp-80h]@1
+  //SpriteObject::SpriteObject(&v6);
 
   v0 = pGUIWindow_CurrentMenu->ptr_1C;
   if ( pParty->pPickedItem.uItemID )
@@ -4155,7 +4155,7 @@
     if ( (v18 & 7) == OBJECT_Item )
     {
       v30 = v19;
-      if ( pObjectList->pObjects[pLayingItems[v30].uObjectDescID].uFlags & 0x10 )
+      if ( pObjectList->pObjects[pSpriteObjects[v30].uObjectDescID].uFlags & 0x10 )
         //goto LABEL_73;
       {
         pMouse->uPointingObjectID = 0;
@@ -4174,7 +4174,7 @@
       }
       if ( v18 >= (signed int)0x2000000u || pParty->pPickedItem.uItemID )
       {
-        v22 = pLayingItems[v30].stru_24.GetDisplayName();
+        v22 = pSpriteObjects[v30].stru_24.GetDisplayName();
 //LABEL_93:
         v26 = v22;
         //goto LABEL_87;
@@ -4190,7 +4190,7 @@
         uLastPointedObjectID = pMouse->uPointingObjectID;
         return;
       }
-      v31 = pLayingItems[v30].stru_24.GetDisplayName();
+      v31 = pSpriteObjects[v30].stru_24.GetDisplayName();
       v28 = pTmpBuf;
       sprintf(pTmpBuf, pGlobalTXT_LocalizationStrings[470], v31);// "Get %s"
     }
@@ -4847,7 +4847,7 @@
   signed int v6; // eax@11
   char *v7; // edi@12
   __int16 v8; // ax@16
-  LayingItem a1; // [sp+4h] [bp-78h]@11
+  SpriteObject a1; // [sp+4h] [bp-78h]@11
   int v11; // [sp+74h] [bp-8h]@2
   int v12; // [sp+78h] [bp-4h]@5
 
@@ -4884,7 +4884,7 @@
 	{
 		v5 = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID;
 		v6 = 0;
-		a1.uItemType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID;
+		a1.uType = pItemsTable->pItems[pParty->pPickedItem.uItemID].uSpriteID;
 		if ( (signed int)pObjectList->uNumObjects <= 0 )
 		{
 		  LOWORD(v6) = 0;
@@ -5186,7 +5186,7 @@
   signed int v21; // eax@58
   ItemGen *v22; // esi@62
   unsigned int v23; // eax@62
-  LayingItem a1; // [sp+Ch] [bp-80h]@1
+  SpriteObject a1; // [sp+Ch] [bp-80h]@1
   POINT v25; // [sp+7Ch] [bp-10h]@3
   POINT a2; // [sp+84h] [bp-8h]@3
 
@@ -5203,13 +5203,13 @@
   {
     a2.y = (signed int)(unsigned __int16)v0 >> 3;
     v21 = (signed int)(unsigned __int16)v0 >> 3;
-    if ( !(pObjectList->pObjects[pLayingItems[v21].uObjectDescID].uFlags & 0x10)
+    if ( !(pObjectList->pObjects[pSpriteObjects[v21].uObjectDescID].uFlags & 0x10)
       && a2.y < 1000
-      && pLayingItems[v21].uObjectDescID
+      && pSpriteObjects[v21].uObjectDescID
       && (unsigned int)v0 < 0x2000000 )
     {
-      v22 = &pLayingItems[v21].stru_24;
-      v23 = pLayingItems[v21].stru_24.uItemID;
+      v22 = &pSpriteObjects[v21].stru_24;
+      v23 = pSpriteObjects[v21].stru_24.uItemID;
       if ( pItemsTable->pItems[v23].uEquipType == 18 )
       {
         party_finds_gold(v22->uSpecEnchantmentType, 0);
@@ -5226,7 +5226,7 @@
         if ( !pParty->AddItem(v22) )
           pParty->SetHoldingItem(v22);
       }
-      LayingItem::OnItemPickup(a2.y);
+      SpriteObject::OnInteraction(a2.y);
       return;
     }
     goto LABEL_13;
@@ -5269,7 +5269,7 @@
 LABEL_14:
             v5 = pItemsTable->pItems[v4].uSpriteID;
             v6 = 0;
-            a1.uItemType = v5;
+            a1.uType = v5;
             if ( (signed int)pObjectList->uNumObjects <= 0 )
             {
 LABEL_18:
--- a/mm7_2.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/mm7_2.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -21,7 +21,7 @@
 #include "Viewport.h"
 #include "FrameTableInc.h"
 #include "Math.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "ObjectList.h"
 #include "Chest.h"
 #include "PaletteManager.h"
@@ -7872,7 +7872,7 @@
   //int v28; // eax@35
   //int v29; // esi@35
   //__int16 v30; // ax@35
-  LayingItem a1a; // [sp+Ch] [bp-7Ch]@1
+  SpriteObject a1a; // [sp+Ch] [bp-7Ch]@1
   //int v32; // [sp+7Ch] [bp-Ch]@1
   //int v33; // [sp+80h] [bp-8h]@1
   int v34; // [sp+84h] [bp-4h]@1
@@ -7932,7 +7932,7 @@
 LABEL_20:
                 v15 = 0;
                 v16 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
-                a1a.uItemType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
+                a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
                 if ( (signed int)pObjectList->uNumObjects <= 0 )
                 {
 LABEL_24:
@@ -7977,7 +7977,7 @@
     return result;
   v23 = 0;
   v24 = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
-  a1a.uItemType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
+  a1a.uType = pItemsTable->pItems[a1a.stru_24.uItemID].uSpriteID;
   if ( (signed int)pObjectList->uNumObjects <= 0 )
   {
 LABEL_33:
@@ -8025,14 +8025,14 @@
   unsigned __int16 v9; // cx@1
   char *v10; // edx@2
   unsigned __int16 v11; // ax@5
-  LayingItem a1; // [sp+8h] [bp-70h]@1
+  SpriteObject a1; // [sp+8h] [bp-70h]@1
 
   v6 = ecx0;
   v7 = a2;
   pItemsTable->GenerateItem(v6, v7, &a1.stru_24);
   v8 = 0;
   v9 = pItemsTable->pItems[a1.stru_24.uItemID].uSpriteID;
-  a1.uItemType = pItemsTable->pItems[a1.stru_24.uItemID].uSpriteID;
+  a1.uType = pItemsTable->pItems[a1.stru_24.uItemID].uSpriteID;
   if ( (signed int)pObjectList->uNumObjects <= 0 )
   {
 LABEL_5:
@@ -12215,7 +12215,7 @@
   _strrev(Str1);
 
   for (uint i = 0; i < 1000; ++i)
-    pLayingItems[i].uObjectDescID = 0;
+    pSpriteObjects[i].uObjectDescID = 0;
 
   v5 = pMapStats->GetMapInfo(pCurrentMapName);
   bUnderwater = 0;
@@ -14939,12 +14939,12 @@
       v17 = a1 >> 3;
       v26 = a1 >> 3;
       v18 = a1 >> 3;
-      if ( pObjectList->pObjects[pLayingItems[v18].uObjectDescID].uFlags & 0x10
+      if ( pObjectList->pObjects[pSpriteObjects[v18].uObjectDescID].uFlags & 0x10
         || v17 >= 1000
-        || !pLayingItems[v18].uObjectDescID )
+        || !pSpriteObjects[v18].uObjectDescID )
         return 1;
-      v19 = &pLayingItems[v18].stru_24;
-      v20 = pLayingItems[v18].stru_24.uItemID;
+      v19 = &pSpriteObjects[v18].stru_24;
+      v20 = pSpriteObjects[v18].stru_24.uItemID;
       if ( pItemsTable->pItems[v20].uEquipType == EQUIP_GOLD)
       {
         party_finds_gold(v19->uSpecEnchantmentType, 0);
@@ -14966,7 +14966,7 @@
           pParty->SetHoldingItem(v19);
         v21 = v26;
       }
-      LayingItem::OnItemPickup(v21);
+      SpriteObject::OnInteraction(v21);
       break;
 
     case OBJECT_Actor:
@@ -15442,9 +15442,9 @@
     {
       if ( v20 >= 0x3E8 )
         return 0;
-      if ( !(pLayingItems[v20].uAttributes & 0x10) )
-      {
-        v23 = pLayingItems[v20].stru_24.GetDisplayName();
+      if ( !(pSpriteObjects[v20].uAttributes & 0x10) )
+      {
+        v23 = pSpriteObjects[v20].stru_24.GetDisplayName();
 LABEL_36:
         v24 = v23;
         goto LABEL_51;
@@ -15591,9 +15591,9 @@
 
 
 //----- (0046BEF1) --------------------------------------------------------
-void LayingItem::_46BEF1_apply_spells()
-{
-  LayingItem *v1; // edi@1
+void SpriteObject::_46BEF1_apply_spells()
+{
+  SpriteObject *v1; // edi@1
   Actor *v2; // esi@2
   __int16 v3; // fps@4
   unsigned __int8 v4; // c0@4
@@ -15635,7 +15635,7 @@
 //----- (0046BFFA) --------------------------------------------------------
 bool __fastcall _46BFFA_check_object_intercept(unsigned int uLayingItemID, signed int a2)
 {
-  LayingItem *v2; // esi@1
+  SpriteObject *v2; // esi@1
   ObjectDesc *v3; // ebx@1
   unsigned __int16 v5; // cx@9
   unsigned __int16 v6; // cx@14
@@ -15788,7 +15788,7 @@
   unsigned int v153; // [sp+28h] [bp-4h]@1
 
   v153 = uLayingItemID;
-  v2 = &pLayingItems[uLayingItemID];
+  v2 = &pSpriteObjects[uLayingItemID];
   v3 = &pObjectList->pObjects[v2->uObjectDescID];
   v145 = a2;
   v151 = a2 & 7;
@@ -15813,8 +15813,8 @@
   }
   if ( v151 == OBJECT_BModel && (v2->field_58_pid & 7) != OBJECT_Player)
     BYTE2(pActors[v2->field_58_pid >> 3].uAttributes) |= 4u;
-  v6 = v2->uItemType;
-  v7 = v2->uItemType;
+  v6 = v2->uType;
+  v7 = v2->uType;
   if ( v7 > 3060 )
   {
     if ( v7 > 6090 )
@@ -15833,7 +15833,7 @@
             v98 = v6 + 1;
             v99 = pObjectList->uNumObjects;
             v32 = 0;
-            v2->uItemType = v98;
+            v2->uType = v98;
             v146 = 0;
             if ( (signed int)v99 > 0 )
             {
@@ -15877,7 +15877,7 @@
           if ( !v138 )
           {
             v109 = pObjectList->uNumObjects;
-            ++v2->uItemType;
+            ++v2->uType;
             v110 = 0;
             if ( (signed int)v109 <= 0 )
             {
@@ -15887,7 +15887,7 @@
             else
             {
               v111 = (char *)&pObjectList->pObjects->uObjectID;
-              while ( v2->uItemType != *(short *)v111 )
+              while ( v2->uType != *(short *)v111 )
               {
                 ++v110;
                 v111 += 56;
@@ -15898,7 +15898,7 @@
             }
             v2->uObjectDescID = v112;
             if ( !v112 )
-              LayingItem::OnItemPickup(v153);
+              SpriteObject::OnInteraction(v153);
             v2->vVelocity.z = 0;
             v2->vVelocity.y = 0;
             v2->vVelocity.x = 0;
@@ -15921,7 +15921,7 @@
             goto LABEL_269;
           }
 LABEL_246:
-          LayingItem::OnItemPickup(v153);
+          SpriteObject::OnInteraction(v153);
           return 0;
         }
         v106 = v145;
@@ -15966,7 +15966,7 @@
                 if ( stru_50C198.GetMagicalResistance(&pActors[v139], v107) )
                 {
                   v138 = 0;
-                  if ( v2->uItemType == 8030 )
+                  if ( v2->uType == 8030 )
                   {
                     pActors[v108].uAIState = Standing;
                     pActors[v108].UpdateAnimation();
@@ -16002,13 +16002,13 @@
           && MonsterStats::BelongsToSupertype(pActors[v145 >> 3].pMonsterInfo.uID, MONSTER_SUPERTYPE_UNDEAD) )
           sub_43A97E(v153, v145);
         v93 = pObjectList->uNumObjects;
-        ++v2->uItemType;
+        ++v2->uType;
         v9 = 0;
         v52 = 0;
         if ( (signed int)v93 > 0 )
         {
           v94 = (char *)&pObjectList->pObjects->uObjectID;
-          while ( v2->uItemType != *(short *)v94 )
+          while ( v2->uType != *(short *)v94 )
           {
             ++v52;
             v94 += 56;
@@ -16048,7 +16048,7 @@
             v56 = 0;
             v44 = pObjectList->uNumObjects == 0;
             v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-            v2->uItemType = v54;
+            v2->uType = v54;
             if ( v20 | v44 )
             {
 LABEL_102:
@@ -16068,7 +16068,7 @@
             }
             v2->uObjectDescID = v58;
             if ( !v58 )
-              LayingItem::OnItemPickup(v153);
+              SpriteObject::OnInteraction(v153);
             v14 = v153;
             v2->vVelocity.z = 0;
             v2->vVelocity.y = 0;
@@ -16104,7 +16104,7 @@
           v61 = 0;
           v44 = pObjectList->uNumObjects == 0;
           v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-          v2->uItemType = v59;
+          v2->uType = v59;
           if ( v20 | v44 )
           {
 LABEL_111:
@@ -16124,7 +16124,7 @@
           }
           v2->uObjectDescID = v63;
           if ( !v63 )
-            LayingItem::OnItemPickup(v153);
+            SpriteObject::OnInteraction(v153);
           v64 = v2->uFacing - stru_5C6E00->uIntegerDoublePi;
           v44 = v2->field_50 == 4;
           v2->vVelocity.z = 0;
@@ -16147,7 +16147,7 @@
 LABEL_160:
           v14 = v153;
 LABEL_34:
-          LayingItem::OnItemPickup(v14);
+          SpriteObject::OnInteraction(v14);
           goto LABEL_35;
         }
         if ( v151 == 6 || v151 == 5 || (v66 = 0, !v151) )
@@ -16157,7 +16157,7 @@
         v69 = 0;
         v44 = pObjectList->uNumObjects == 0;
         v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-        v2->uItemType = v67;
+        v2->uType = v67;
         if ( v20 | v44 )
         {
 LABEL_128:
@@ -16177,7 +16177,7 @@
         }
         v2->uObjectDescID = v71;
         if ( !v71 )
-          LayingItem::OnItemPickup(v153);
+          SpriteObject::OnInteraction(v153);
         v134 = 0;
         v72 = v153;
         v132 = 0;
@@ -16213,7 +16213,7 @@
         v86 = 0;
         v44 = pObjectList->uNumObjects == 0;
         v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-        v2->uItemType = v84;
+        v2->uType = v84;
         if ( v20 | v44 )
         {
 LABEL_155:
@@ -16233,7 +16233,7 @@
         }
         v2->uObjectDescID = v88;
         if ( !v88 )
-          LayingItem::OnItemPickup(v153);
+          SpriteObject::OnInteraction(v153);
         v89 = v2->uFacing - stru_5C6E00->uIntegerDoublePi;
         v2->vVelocity.z = 0;
         v2->vVelocity.y = 0;
@@ -16260,7 +16260,7 @@
         v81 = 0;
         v44 = pObjectList->uNumObjects == 0;
         v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-        v2->uItemType = 4091;
+        v2->uType = 4091;
         if ( v20 | v44 )
         {
 LABEL_144:
@@ -16280,7 +16280,7 @@
         }
         v2->uObjectDescID = v83;
         if ( !v83 )
-          LayingItem::OnItemPickup(v153);
+          SpriteObject::OnInteraction(v153);
         v134 = 0;
         v72 = v153;
         v132 = v2->field_61;
@@ -16302,7 +16302,7 @@
     {
       sub_43A97E(v153, v145);
       v23 = pObjectList->uNumObjects;
-      ++v2->uItemType;
+      ++v2->uType;
       v18 = 0;
       v24 = 0;
       if ( (signed int)v23 <= 0 )
@@ -16313,7 +16313,7 @@
       else
       {
         v25 = (char *)&pObjectList->pObjects->uObjectID;
-        while ( v2->uItemType != *(short *)v25 )
+        while ( v2->uType != *(short *)v25 )
         {
           ++v24;
           v25 += 56;
@@ -16325,7 +16325,7 @@
 LABEL_42:
       v2->uObjectDescID = v22;
       if ( v22 == v18 )
-        LayingItem::OnItemPickup(v153);
+        SpriteObject::OnInteraction(v153);
       v2->vVelocity.z = v18;
       v2->vVelocity.y = v18;
       v2->vVelocity.x = v18;
@@ -16346,7 +16346,7 @@
         case 540:
           sub_43A97E(v153, v145);
           v8 = pObjectList->uNumObjects;
-          ++v2->uItemType;
+          ++v2->uType;
           v9 = 0;
           v10 = 0;
           if ( (signed int)v8 <= 0 )
@@ -16371,7 +16371,7 @@
           v19 = 0;
           v44 = pObjectList->uNumObjects == 0;
           v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-          v2->uItemType = 600;
+          v2->uType = 600;
           if ( v20 | v44 )
             goto LABEL_41;
           v21 = (char *)&pObjectList->pObjects->uObjectID;
@@ -16387,7 +16387,7 @@
         default:
           return 0;
       }
-      while ( v2->uItemType != *(short *)v11 )
+      while ( v2->uType != *(short *)v11 )
       {
         ++v10;
         v11 += 56;
@@ -16402,8 +16402,8 @@
 LABEL_24:
       v2->uObjectDescID = v12;
       if ( !v12 )
-        LayingItem::OnItemPickup(v153);
-      v44 = v2->uItemType == 555;
+        SpriteObject::OnInteraction(v153);
+      v44 = v2->uType == 555;
       v2->vVelocity.z = 0;
       v2->vVelocity.y = 0;
       v2->vVelocity.x = 0;
@@ -16433,13 +16433,13 @@
 LABEL_93:
     sub_43A97E(v153, v145);
     v51 = pObjectList->uNumObjects;
-    ++v2->uItemType;
+    ++v2->uType;
     v9 = 0;
     v52 = 0;
     if ( (signed int)v51 > 0 )
     {
       v53 = (char *)&pObjectList->pObjects->uObjectID;
-      while ( v2->uItemType != *(short *)v53 )
+      while ( v2->uType != *(short *)v53 )
       {
         ++v52;
         v53 += 56;
@@ -16453,7 +16453,7 @@
 LABEL_182:
     v2->uObjectDescID = v95;
     if ( v95 == (short)v9 )
-      LayingItem::OnItemPickup(v153);
+      SpriteObject::OnInteraction(v153);
     v96 = v2->uSoundID;
     v2->vVelocity.z = v9;
     v2->vVelocity.y = v9;
@@ -16478,7 +16478,7 @@
     v34 = 0;
     v44 = pObjectList->uNumObjects == 0;
     v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-    v2->uItemType = 601;
+    v2->uType = 601;
     if ( v20 | v44 )
     {
 LABEL_69:
@@ -16498,7 +16498,7 @@
     }
     v2->uObjectDescID = v36;
     if ( !v36 )
-      LayingItem::OnItemPickup(v153);
+      SpriteObject::OnInteraction(v153);
     v37 = v2->vPosition.z;
     v2->vVelocity.z = 0;
     v38 = 8 * v153;
@@ -16538,7 +16538,7 @@
       v30 = v6 + 1;
       v31 = pObjectList->uNumObjects;
       v32 = 0;
-      v2->uItemType = v30;
+      v2->uType = v30;
       v146 = 0;
       if ( (signed int)v31 > 0 )
       {
@@ -16555,7 +16555,7 @@
 LABEL_196:
         v2->uObjectDescID = v46;
         if ( v46 == (short)v32 )
-          LayingItem::OnItemPickup(v153);
+          SpriteObject::OnInteraction(v153);
         v100 = v2->field_61;
         v101 = v2->vPosition.z;
         v2->uSpriteFrameID = v32;
@@ -16600,12 +16600,12 @@
   {
     sub_43A97E(v153, v145);
     v122 = pObjectList->uNumObjects;
-    ++v2->uItemType;
+    ++v2->uType;
     v52 = 0;
     if ( (signed int)v122 > 0 )
     {
       v123 = (char *)&pObjectList->pObjects->uObjectID;
-      while ( v2->uItemType != *(short *)v123 )
+      while ( v2->uType != *(short *)v123 )
       {
         ++v52;
         v123 += 56;
@@ -16623,7 +16623,7 @@
   v119 = 0;
   v44 = pObjectList->uNumObjects == 0;
   v20 = (pObjectList->uNumObjects & 0x80000000u) != 0;
-  v2->uItemType = v117;
+  v2->uType = v117;
   if ( v20 | v44 )
   {
 LABEL_255:
@@ -16643,7 +16643,7 @@
   }
   v2->uObjectDescID = v121;
   if ( !v121 )
-    LayingItem::OnItemPickup(v153);
+    SpriteObject::OnInteraction(v153);
   v2->vVelocity.z = 0;
   v2->vVelocity.y = 0;
   v2->vVelocity.x = 0;
--- a/mm7_3.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/mm7_3.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -20,7 +20,7 @@
 #include "Viewport.h"
 #include "FrameTableInc.h"
 #include "Math.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "ObjectList.h"
 #include "Chest.h"
 #include "PaletteManager.h"
@@ -543,7 +543,7 @@
 }
 
 //----- (0046ED8A) --------------------------------------------------------
-void __fastcall _46ED8A_collide_against_layingItems(unsigned int _this)
+void __fastcall _46ED8A_collide_against_sprite_objects(unsigned int _this)
 {
   int v1; // ebx@2
   ObjectDesc *v2; // edx@4
@@ -563,10 +563,10 @@
 
   v15 = 0;
   v12 = _this;
-  if ( (signed int)uNumLayingItems > 0 )
-  {
-    v1 = (int)&pLayingItems[0].uObjectDescID;
-    v14 = (char *)&pLayingItems[0].uObjectDescID;
+  if ( (signed int)uNumSpriteObjects > 0 )
+  {
+    v1 = (int)&pSpriteObjects[0].uObjectDescID;
+    v14 = (char *)&pSpriteObjects[0].uObjectDescID;
     do
     {
       if ( *(short *)v1 )
@@ -625,7 +625,7 @@
       v1 = (int)(v14 + 112);
       v14 += 112;
     }
-    while ( (signed int)v15 < (signed int)uNumLayingItems );
+    while ( (signed int)v15 < (signed int)uNumSpriteObjects );
   }
 }
 
@@ -1161,7 +1161,7 @@
       v30 = WorldPosToGridCellX(v0->vPosition.x);
       _46E26D_collide_against_sprites(v30, v29);
       _46EF01_collision_chech_player(0);
-      _46ED8A_collide_against_layingItems(8 * v75 | 3);
+      _46ED8A_collide_against_sprite_objects(8 * v75 | OBJECT_Actor);
       v31 = 0;
       for ( i = 0; v31 < ai_arrays_size; ++v31 )
       {
@@ -1387,801 +1387,6 @@
 
 
 
-//----- (0047136C) --------------------------------------------------------
-void LayingItem::UpdateObject_fn0_BLV(unsigned int uLayingItemID)
-{
-  LayingItem *v1; // esi@1
-  ObjectDesc *v2; // edi@1
-  int v3; // ST08_4@1
-  __int16 v4; // ax@5
-  __int16 v5; // ax@7
-  BLVFace *v6; // ecx@11
-  BLVFace *v7; // eax@11
-  signed int v8; // ebx@12
-  int v9; // ecx@16
-  __int16 v10; // di@18
-  char v11; // al@19
-  int v12; // eax@25
-  int v13; // eax@31
-  int v14; // ebx@34
-  signed int v15; // ebx@46
-  BLVFace *v16; // edi@48
-  int v17; // eax@50
-  int v18; // eax@52
-  int v19; // ecx@52
-  Vec3_short_ *v20; // ecx@53
-  int v21; // ecx@57
-  __int16 v22; // ax@57
-  int v23; // edi@62
-  int v24; // edi@62
-  int v25; // eax@62
-  unsigned __int64 v26; // qax@62
-  unsigned __int8 v27; // sf@64
-  unsigned __int8 v28; // of@64
-  __int16 v29; // di@67
-  char v30; // al@68
-  const char *v31; // [sp-8h] [bp-98h]@19
-  const char *v32; // [sp-8h] [bp-98h]@68
-  enum TEXTURE_TYPE v33; // [sp-4h] [bp-94h]@19
-  enum TEXTURE_TYPE v34; // [sp-4h] [bp-94h]@68
-  Particle_ Dst; // [sp+Ch] [bp-84h]@18
-  unsigned int uLayingItemID_; // [sp+74h] [bp-1Ch]@1
-  ObjectDesc *v37; // [sp+78h] [bp-18h]@1
-  unsigned int uFaceID; // [sp+7Ch] [bp-14h]@4
-  int v39; // [sp+80h] [bp-10h]@33
-  Actor *v39b;
-  int v40; // [sp+84h] [bp-Ch]@28
-  int v41; // [sp+88h] [bp-8h]@34
-  int v42; // [sp+8Ch] [bp-4h]@4
-
-  uLayingItemID_ = uLayingItemID;
-  v1 = &pLayingItems[uLayingItemID];
-  v2 = &pObjectList->pObjects[v1->uObjectDescID];
-  v3 = v1->vPosition.x;
-  v37 = &pObjectList->pObjects[v1->uObjectDescID];
-  if ( abs(v3) > 32767
-    || abs(v1->vPosition.y) > 32767
-    || abs(v1->vPosition.z) > 20000
-    || (v42 = _46CEC3_get_floor_level(v1->vPosition.x, v1->vPosition.y, v1->vPosition.z, v1->uSectorID, &uFaceID),
-        v42 <= -30000)
-    && ((v4 = pIndoor->GetSector(v1->vPosition.x, v1->vPosition.y, v1->vPosition.z),
-         (v1->uSectorID = v4) == 0)
-     || (v42 = _46CEC3_get_floor_level(v1->vPosition.x, v1->vPosition.y, v1->vPosition.z, v4, &uFaceID), v42 == -30000)) )
-  {
-    LayingItem::OnItemPickup(uLayingItemID_);
-    return;
-  }
-  v5 = v2->uFlags;
-  if ( v5 & 0x20 )
-  {
-LABEL_24:
-    v8 = 0;
-LABEL_25:
-    stru_721530.field_0 = v8;
-    uFaceID = v8;
-    stru_721530.prolly_normal_d = v2->uRadius;
-    v12 = v2->uHeight;
-    stru_721530.field_84 = -1;
-    stru_721530.field_C = v12;
-    stru_721530.field_8 = v8;
-    stru_721530.field_70 = v8;
-    while ( 1 )
-    {
-      stru_721530.field_34.x = v1->vPosition.x;
-      stru_721530.normal.x = stru_721530.field_34.x;
-      stru_721530.field_34.y = v1->vPosition.y;
-      stru_721530.normal.y = stru_721530.field_34.y;
-      stru_721530.field_34.z = stru_721530.prolly_normal_d + v1->vPosition.z + 1;
-      stru_721530.normal.z = stru_721530.field_34.z;
-      stru_721530.field_1C = v1->vVelocity.x;
-      stru_721530.field_20 = v1->vVelocity.y;
-      stru_721530.field_24 = v1->vVelocity.z;
-      stru_721530.uSectorID = v1->uSectorID;
-      if ( stru_721530._47050A(v8) )
-        return;
-      v40 = v8;
-      do
-      {
-        _46E44E_collide_against_faces_and_portals(0);
-        _46E0B2_collide_against_decorations();
-        if ( (v1->field_58_pid & 7) != OBJECT_Player)
-          _46EF01_collision_chech_player(1);
-        v13 = v1->field_58_pid;
-        v42 = v8;
-        if ( (v13 & 7) == OBJECT_Actor)
-        {
-          if ( (signed int)uNumActors > v8 )
-          {
-            v39b = pActors;//[0].word_000086_some_monster_id;
-            do
-            {
-              //v41 = pActors[v1->field_58 >> 3].pMonsterInfo.uID - 1;
-              //v14 = (signed __int64)((double)v41 * 0.3333333333333333);
-              //v41 = *(short *)(v39 - 38) - 1;
-              //if ( v14 != (unsigned int)(signed __int64)((double)v41 * 0.3333333333333333) )
-				if( pActors[v1->field_58_pid >> 3].pMonsterInfo.uID != v39b->pMonsterInfo.uID )
-					//not sure: pMonsterList->pMonsters[v39b->word_000086_some_monster_id-1].uToHitRadius
-					_46DF1A_collide_against_actor(v42, *((short *)&pMonsterList->pMonsters[v39b->word_000086_some_monster_id] - 73));
-              ++v42;
-              ++v39b;// += 836;
-            }
-            while ( v42 < (signed int)uNumActors );
-            v8 = 0;
-          }
-        }
-        else
-        {
-          if ( (signed int)uNumActors > v8 )
-          {
-            v39b = pActors;//[0].word_000086_some_monster_id;
-            do
-            {
-              _46DF1A_collide_against_actor(v42++, *((short *)&pMonsterList->pMonsters[*(short *)v39b] - 73));
-              ++v39b;
-            }
-            while ( v42 < (signed int)uNumActors );
-          }
-        }
-        if ( _46F04E_collide_against_portals() )
-          break;
-        ++v40;
-      }
-      while ( v40 < 100 );
-      if ( stru_721530.field_7C >= stru_721530.field_6C )
-      {
-        v1->vPosition.x = stru_721530.normal2.x;
-        v1->vPosition.y = stru_721530.normal2.y;
-        v1->vPosition.z = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
-        v1->uSectorID = LOWORD(stru_721530.uSectorID);
-        if ( !(HIBYTE(v2->uFlags) & 1) )
-          return;
-        memset(&Dst, v8, 0x68u);
-        v29 = v2->uFlags;
-        Dst.x = (double)v1->vPosition.x;
-        Dst.y = (double)v1->vPosition.y;
-        Dst.z = (double)v1->vPosition.z;
-        Dst.flt_10 = 0.0;
-        Dst.flt_14 = 0.0;
-        Dst.flt_18 = 0.0;
-        if ( v29 & 0x200 )
-        {
-          Dst.bFree = 1036;
-          Dst.uDiffuse = 0xFF3C1Eu;
-          v30 = rand();
-          v34 = (TEXTURE_TYPE)v8;
-          v32 = "effpar01";
-        }
-        else
-        {
-          if ( v29 & 0x400 )
-            goto LABEL_70;
-          Dst.bFree = 1032;
-          Dst.uDiffuse = rand();
-          v30 = rand();
-          v34 = (TEXTURE_TYPE)v8;
-          v32 = "effpar03";
-        }
-        Dst.timeToLive = (unsigned __int8)(v30 & 0x80) + 128;
-        Dst.uTextureID = pBitmaps_LOD->LoadTexture(v32, v34);
-        goto LABEL_71;
-      }
-      v40 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
-      v1->vPosition.x += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
-      v40 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
-      v1->vPosition.y += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
-      v40 = (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
-      v1->vPosition.z += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
-      v1->uSectorID = LOWORD(stru_721530.uSectorID);
-      stru_721530.field_70 += stru_721530.field_7C;
-      if ( v2->uFlags & 0x40 && !_46BFFA_check_object_intercept(uLayingItemID_, stru_721530.uFaceID) )
-        return;
-      v15 = (signed int)stru_721530.uFaceID >> 3;
-      if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration)
-      {
-        v40 = integer_sqrt(v1->vVelocity.x * v1->vVelocity.x + v1->vVelocity.y * v1->vVelocity.y);
-        v23 = stru_5C6E00->Atan2(
-                v1->vPosition.x - pLevelDecorations[v15].vPosition.x,
-                v1->vPosition.y - pLevelDecorations[v15].vPosition.y);
-        v42 = stru_5C6E00->Cos(v23);
-        v41 = (unsigned __int64)(v42 * (signed __int64)v40) >> 16;
-        v24 = v23;
-        v1->vVelocity.x = (unsigned int)(v42 * v40) >> 16;
-        v25 = stru_5C6E00->Sin(v23);
-        v42 = v25;
-        v26 = v25 * (signed __int64)v40;
-        v41 = v26 >> 16;
-        v1->vVelocity.y = WORD1(v26);
-      }
-      else
-      {
-        if ( (stru_721530.uFaceID & 7) != OBJECT_BModel)
-          goto LABEL_64;
-        stru_721530.field_84 = (signed int)stru_721530.uFaceID >> 3;
-        v16 = &pIndoor->pFaces[v15];
-        if ( v16->uPolygonType != 3 )
-        {
-          v42 = abs(v16->pFacePlane_old.vNormal.x * v1->vVelocity.x + v16->pFacePlane_old.vNormal.z * v1->vVelocity.z
-                                                                    + v16->pFacePlane_old.vNormal.y * v1->vVelocity.y) >> 16;
-          if ( stru_721530.field_64 >> 3 > v42 )
-            v42 = stru_721530.field_64 >> 3;
-          v40 = v16->pFacePlane_old.vNormal.x;
-          v40 = (unsigned __int64)(v42 * (signed __int64)v40) >> 16;
-          v41 = v16->pFacePlane_old.vNormal.y;
-          v41 = (unsigned __int64)(v42 * (signed __int64)v41) >> 16;
-          v39 = v16->pFacePlane_old.vNormal.z;
-          v39 = (unsigned __int64)(v42 * (signed __int64)v39) >> 16;
-          v1->vVelocity.x += 2 * v40;
-          v1->vVelocity.y += 2 * v41;
-          if ( v16->pFacePlane_old.vNormal.z <= 32000 )
-          {
-            v22 = 2 * v39;
-          }
-          else
-          {
-            v21 = v39;
-            v40 = 32000;
-            v1->vVelocity.z += v39;
-            v41 = (unsigned __int64)(v40 * (signed __int64)v21) >> 16;
-            v22 = (unsigned int)(v40 * v21) >> 16;
-          }
-          v1->vVelocity.z += v22;
-          goto LABEL_60;
-        }
-        if ( v37->uFlags & 0x80 )
-        {
-          v17 = -v1->vVelocity.z >> 1;
-          v1->vVelocity.z = v17;
-          if ( (signed __int16)v17 < 10 )
-            v1->vVelocity.z = 0;
-LABEL_60:
-          if ( BYTE3(v16->uAttributes) & 0x10 )
-            EventProcessor(pIndoor->pFaceExtras[v16->uFaceExtraID].uEventID, 0, 1);
-          goto LABEL_63;
-        }
-        v18 = v1->vVelocity.y;
-        v19 = v1->vVelocity.x;
-        v1->vVelocity.z = 0;
-        if ( v19 * v19 + v18 * v18 >= 400 )
-          goto LABEL_60;
-        v20 = pIndoor->pVertices;
-        v1->vVelocity.z = 0;
-        v1->vVelocity.y = 0;
-        v1->vVelocity.x = 0;
-        v1->vPosition.z = v20[*v16->pVertexIDs].z + 1;
-      }
-LABEL_63:
-      v2 = v37;
-LABEL_64:
-      v41 = v1->vVelocity.x;
-      v40 = 58500;
-      v41 = (unsigned __int64)(58500i64 * v41) >> 16;
-      v1->vVelocity.x = v41;
-      v41 = v1->vVelocity.y;
-      v41 = (unsigned __int64)(v40 * (signed __int64)v41) >> 16;
-      v40 = 58500;
-      v1->vVelocity.y = v41;
-      v41 = v1->vVelocity.z;
-      v41 = (unsigned __int64)(v40 * (signed __int64)v41) >> 16;
-      ++uFaceID;
-      v28 = __OFSUB__(uFaceID, 100);
-      v27 = uFaceID - 100 < 0;
-      v1->vVelocity.z = v41;
-      if ( !(v27 ^ v28) )
-        return;
-      v8 = 0;
-    }
-  }
-  if ( v42 <= v1->vPosition.z - 3 )
-  {
-    v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
-    goto LABEL_24;
-  }
-  if ( !(v5 & 0x40) || _46BFFA_check_object_intercept(uLayingItemID_, 0) )
-  {
-    v6 = pIndoor->pFaces;
-    v1->vPosition.z = v42 + 1;
-    v7 = &v6[uFaceID];
-    if ( v7->uPolygonType == 3 )
-    {
-      v8 = 0;
-      v1->vVelocity.z = 0;
-    }
-    else
-    {
-      if ( v7->pFacePlane_old.vNormal.z < 45000 )
-        v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
-      v8 = 0;
-    }
-    v42 = v1->vVelocity.x;
-    uFaceID = 58500;
-    v42 = (unsigned __int64)(58500i64 * v42) >> 16;
-    v1->vVelocity.x = v42;
-    v42 = v1->vVelocity.y;
-    v42 = (unsigned __int64)(uFaceID * (signed __int64)v42) >> 16;
-    uFaceID = 58500;
-    v1->vVelocity.y = v42;
-    v42 = v1->vVelocity.z;
-    v42 = (unsigned __int64)(uFaceID * (signed __int64)v42) >> 16;
-    v9 = v1->vVelocity.x;
-    v1->vVelocity.z = v42;
-    if ( v9 * v9 + v1->vVelocity.y * v1->vVelocity.y < 400 )
-    {
-      v1->vVelocity.z = v8;
-      v1->vVelocity.y = v8;
-      v1->vVelocity.x = v8;
-      if ( !(HIBYTE(v2->uFlags) & 1) )
-        return;
-      memset(&Dst, v8, 0x68u);
-      v10 = v2->uFlags;
-      Dst.x = (double)v1->vPosition.x;
-      Dst.y = (double)v1->vPosition.y;
-      Dst.z = (double)v1->vPosition.z;
-      Dst.flt_10 = 0.0;
-      Dst.flt_14 = 0.0;
-      Dst.flt_18 = 0.0;
-      if ( v10 & 0x200 )
-      {
-        Dst.bFree = 1036;
-        Dst.uDiffuse = 0xFF3C1Eu;
-        Dst.flt_28 = 1.0;
-        v11 = rand();
-        v33 = (TEXTURE_TYPE)v8;
-        v31 = "effpar01";
-      }
-      else
-      {
-        if ( v10 & 0x400 )
-        {
-LABEL_70:
-          Dst.bFree = 512;
-          Dst.uDiffuse = rand();
-          Dst.timeToLive = 64;
-          Dst.uTextureID = v8;
-LABEL_71:
-          Dst.flt_28 = 1.0;
-          goto LABEL_72;
-        }
-        Dst.bFree = 1032;
-        Dst.uDiffuse = rand();
-        Dst.flt_28 = 1.0;
-        v11 = rand();
-        v33 = (TEXTURE_TYPE)v8;
-        v31 = "effpar03";
-      }
-      Dst.timeToLive = (unsigned __int8)(v11 & 0x80) + 128;
-      Dst.uTextureID = pBitmaps_LOD->LoadTexture(v31, v33);
-LABEL_72:
-      pGame->pParticleEngine->AddParticle(&Dst);
-      return;
-    }
-    goto LABEL_25;
-  }
-}
-// 46DF1A: using guessed type int __fastcall 46DF1A_collide_against_actor(int, int);
-
-//----- (00471C03) --------------------------------------------------------
-void LayingItem::UpdateObject_fn0_ODM(unsigned int uLayingItemID)
-{
-  LayingItem *v1; // esi@1
-  ObjectDesc *v2; // ebx@1
-  signed int v3; // edx@1
-  int v4; // ecx@1
-  int v5; // ST04_4@1
-  int v6; // eax@1
-  int v7; // ecx@1
-  int v8; // edi@1
-  int v9; // eax@4
-  __int16 v10; // ax@7
-  int v11; // edx@11
-  int v12; // ecx@11
-  signed int v13; // edx@14
-  signed int v14; // edx@16
-  int v15; // eax@24
-  int v16; // eax@25
-  int v17; // ST10_4@25
-  signed int v18; // eax@25
-  signed int v19; // eax@28
-  Actor *v20; // edi@31
-  int v21; // eax@41
-  int v22; // ecx@43
-  __int16 v23; // bx@45
-  char v24; // al@46
-  signed int i; // edi@50
-  int v26; // edi@52
-  int v27; // eax@52
-  __int16 v28; // cx@55
-  int v29; // eax@55
-  signed int v30; // edi@59
-  BSPModel *v31; // ecx@61
-  ODMFace *v32; // edi@61
-  int v33; // eax@62
-  int v34; // ecx@62
-  int v35; // eax@63
-  Actor *v36; // ecx@67
-  __int16 v37; // ax@67
-  int v38; // eax@72
-  int v39; // eax@72
-  unsigned __int64 v40; // qax@72
-  int v41; // eax@72
-  unsigned __int8 v42; // sf@74
-  unsigned __int8 v43; // of@74
-  int v44; // eax@77
-  __int16 v45; // bx@81
-  int v46; // eax@85
-  const char *v47; // [sp-8h] [bp-B0h]@83
-  enum TEXTURE_TYPE v48; // [sp-4h] [bp-ACh]@46
-  int v49; // [sp+Ch] [bp-9Ch]@52
-  int v50; // [sp+10h] [bp-98h]@52
-  Vec3_int_ v51; // [sp+14h] [bp-94h]@11
-  Particle_ Dst; // [sp+20h] [bp-88h]@45
-  unsigned int uLayingItemID_; // [sp+88h] [bp-20h]@1
-  int v54; // [sp+8Ch] [bp-1Ch]@1
-  int v55; // [sp+90h] [bp-18h]@1
-  int v56; // [sp+94h] [bp-14h]@11
-  int v57; // [sp+98h] [bp-10h]@1
-  int v58; // [sp+9Ch] [bp-Ch]@1
-  int v59; // [sp+A0h] [bp-8h]@1
-  Actor *v60; // [sp+A4h] [bp-4h]@11
-
-  uLayingItemID_ = uLayingItemID;
-  v1 = &pLayingItems[uLayingItemID];
-  v58 = 0;
-  v2 = &pObjectList->pObjects[v1->uObjectDescID];
-  v57 = IsTerrainSlopeTooHigh(v1->vPosition.x, v1->vPosition.y);
-  v3 = v1->vPosition.y;
-  v4 = v1->vPosition.x;
-  v5 = v2->uHeight;
-  v55 = 0;
-  v6 = sub_46D49E_prolly_get_world_y_under_party(v4, v3, v1->vPosition.z, v5, &v59, &v55, 0);
-  v7 = v6;
-  v54 = v6;
-  v8 = v6 + 1;
-  if ( v1->vPosition.z <= v6 + 1 )
-  {
-    if ( v59 )
-    {
-      v9 = v6 + 60;
-      if ( v55 )
-        v9 = v7 + 30;
-      sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v9);
-      LayingItem::OnItemPickup(uLayingItemID_);
-      v7 = v54;
-    }
-  }
-  else
-  {
-    v58 = 1;
-  }
-  v10 = v2->uFlags;
-  if ( !(v10 & 0x20) )
-  {
-    if ( v58 )
-    {
-      v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
-      goto LABEL_13;
-    }
-    if ( v57 )
-    {
-      v11 = v1->vPosition.y;
-      v12 = v1->vPosition.x;
-      v1->vPosition.z = v8;
-      ODM_GetTerrainNormalAt(v12, v11, &v51);
-      v1->vVelocity.z -= LOWORD(pEventTimer->uTimeElapsed) * GetGravityStrength();
-      v56 = abs(v51.y * v1->vVelocity.y + v51.z * v1->vVelocity.z + v51.x * v1->vVelocity.x) >> 16;
-      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.x) >> 16);
-      v1->vVelocity.x += (unsigned int)(v56 * v51.x) >> 16;
-      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.y) >> 16);
-      v1->vVelocity.y += (unsigned int)(v56 * v51.y) >> 16;
-      v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)v51.z) >> 16);
-      v1->vVelocity.z += (unsigned int)(v56 * v51.z) >> 16;
-LABEL_12:
-      v7 = v54;
-      goto LABEL_13;
-    }
-    if ( v10 & 0x40 )
-    {
-      if ( v1->vPosition.z < v7 )
-        v1->vPosition.z = v8;
-      if ( !_46BFFA_check_object_intercept(uLayingItemID_, 0) )
-        return;
-    }
-    v1->vPosition.z = v8;
-    if ( !(v2->uFlags & 0x80) || (v21 = -v1->vVelocity.z >> 1, v1->vVelocity.z = v21, (signed __int16)v21 < 10) )
-      v1->vVelocity.z = 0;
-    v60 = (Actor *)v1->vVelocity.x;
-    v55 = 58500;
-    v60 = (Actor *)((unsigned __int64)(58500i64 * (signed int)v60) >> 16);
-    v1->vVelocity.x = (signed __int16)v60;
-    v60 = (Actor *)v1->vVelocity.y;
-    v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16);
-    v55 = 58500;
-    v1->vVelocity.y = (signed __int16)v60;
-    v60 = (Actor *)v1->vVelocity.z;
-    v60 = (Actor *)((unsigned __int64)(v55 * (signed __int64)(signed int)v60) >> 16);
-    v22 = v1->vVelocity.x;
-    v1->vVelocity.z = (signed __int16)v60;
-    if ( v1->vVelocity.y * v1->vVelocity.y + v22 * v22 >= 400 )
-      goto LABEL_12;
-    v1->vVelocity.y = 0;
-    v1->vVelocity.x = 0;
-    if ( !(HIBYTE(v2->uFlags) & 1) )
-      return;
-    memset(&Dst, 0, 0x68u);
-    v23 = v2->uFlags;
-    Dst.x = (double)v1->vPosition.x;
-    Dst.y = (double)v1->vPosition.y;
-    Dst.z = (double)v1->vPosition.z;
-    Dst.flt_10 = 0.0;
-    Dst.flt_14 = 0.0;
-    Dst.flt_18 = 0.0;
-    if ( HIBYTE(v23) & 2 )
-    {
-      Dst.bFree = 1036;
-      Dst.uDiffuse = 16727070;
-      v24 = rand();
-      v48 = (TEXTURE_TYPE)0;
-LABEL_83:
-      v47 = "effpar01";
-    }
-    else
-    {
-      if ( HIBYTE(v23) & 4 )
-      {
-        Dst.bFree = 512;
-        Dst.uDiffuse = rand();
-        Dst.timeToLive = 64;
-        Dst.uTextureID = 0;
-LABEL_89:
-        Dst.flt_28 = 1.0;
-        pGame->pParticleEngine->AddParticle(&Dst);
-        return;
-      }
-      Dst.bFree = 1032;
-      Dst.uDiffuse = rand();
-      v24 = rand();
-      v48 = (TEXTURE_TYPE)0;
-LABEL_87:
-      v47 = "effpar03";
-    }
-    Dst.timeToLive = (unsigned __int8)(v24 & 0x80) + 128;
-    Dst.uTextureID = pBitmaps_LOD->LoadTexture(v47, v48);
-    goto LABEL_89;
-  }
-LABEL_13:
-  if ( v1->vPosition.z > v7
-    && (v13 = v1->vPosition.x, v13 >= -32768)
-    && v13 <= 32768
-    && (v14 = v1->vPosition.y, v14 >= -32768)
-    && v14 <= 32768
-    && v1->vPosition.z <= 13000
-    || !(v2->uFlags & 0x40) )
-    goto LABEL_92;
-  if ( v1->vPosition.z < v7 )
-    v1->vPosition.z = v8;
-  if ( _46BFFA_check_object_intercept(uLayingItemID_, 0) )
-  {
-LABEL_92:
-    stru_721530.field_0 = 0;
-    v55 = 0;
-    stru_721530.prolly_normal_d = v2->uRadius;
-    stru_721530.field_C = v2->uHeight;
-    stru_721530.field_8 = 0;
-    stru_721530.field_70 = 0;
-    while ( 1 )
-    {
-      stru_721530.field_34.x = v1->vPosition.x;
-      stru_721530.normal.x = stru_721530.field_34.x;
-      v15 = v1->vPosition.y;
-      stru_721530.uSectorID = 0;
-      stru_721530.field_34.y = v15;
-      stru_721530.normal.y = v15;
-      stru_721530.field_34.z = v1->vPosition.z + stru_721530.prolly_normal_d + 1;
-      stru_721530.normal.z = stru_721530.field_34.z;
-      stru_721530.field_1C = v1->vVelocity.x;
-      stru_721530.field_20 = v1->vVelocity.y;
-      stru_721530.field_24 = v1->vVelocity.z;
-      if ( stru_721530._47050A(0) )
-        return;
-      _46E889_collide_against_bmodels(0);
-      v16 = WorldPosToGridCellZ(v1->vPosition.y);
-      v17 = v1->vPosition.x;
-      v58 = v16;
-      v18 = WorldPosToGridCellX(v17);
-      _46E26D_collide_against_sprites(v18, v58);
-      if ( (v1->field_58_pid & 7) != OBJECT_Player)
-        _46EF01_collision_chech_player(0);
-      if ( (v1->field_58_pid & 7) == OBJECT_Actor)
-      {
-        v19 = v1->field_58_pid >> 3;
-        if ( v19 >= 0 )
-        {
-          if ( v19 < (signed int)(uNumActors - 1) )
-          {
-            v56 = 0;
-            if ( (signed int)uNumActors > 0 )
-            {
-              v60 = pActors;
-              v20 = &pActors[v19];
-              do
-              {
-                if ( v20->GetActorsRelation(v60) )
-                  _46DF1A_collide_against_actor(v56, 0);
-                ++v56;
-                ++v60;
-              }
-              while ( v56 < (signed int)uNumActors );
-            }
-          }
-        }
-      }
-      else
-      {
-        for ( i = 0; i < (signed int)uNumActors; ++i )
-          _46DF1A_collide_against_actor(i, 0);
-      }
-      v26 = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
-      v27 = sub_46D49E_prolly_get_world_y_under_party(
-              stru_721530.normal2.x,
-              stru_721530.normal2.y,
-              stru_721530.normal2.z - stru_721530.prolly_normal_d - 1,
-              v2->uHeight,
-              &v49,
-              &v50,
-              0);
-      if ( v59 && v26 < v27 + 60 )
-      {
-        if ( v50 )
-          v44 = v27 + 30;
-        else
-          v44 = v54 + 60;
-        sub_42F960_create_object(v1->vPosition.x, v1->vPosition.y, v44);
-        LayingItem::OnItemPickup(uLayingItemID_);
-        return;
-      }
-      if ( stru_721530.field_7C >= stru_721530.field_6C )
-      {
-        v1->vPosition.x = stru_721530.normal2.x;
-        v1->vPosition.y = stru_721530.normal2.y;
-        v1->vPosition.z = stru_721530.normal2.z - stru_721530.prolly_normal_d - 1;
-        v1->uSectorID = LOWORD(stru_721530.uSectorID);
-        if ( !(HIBYTE(v2->uFlags) & 1) )
-          return;
-        memset(&Dst, 0, 0x68u);
-        v45 = v2->uFlags;
-        Dst.x = (double)v1->vPosition.x;
-        Dst.y = (double)v1->vPosition.y;
-        Dst.z = (double)v1->vPosition.z;
-        Dst.flt_10 = 0.0;
-        Dst.flt_14 = 0.0;
-        Dst.flt_18 = 0.0;
-        if ( HIBYTE(v45) & 2 )
-        {
-          Dst.bFree = 1036;
-          Dst.uDiffuse = 16727070;
-          v24 = rand();
-          v48 = (TEXTURE_TYPE)0;
-          goto LABEL_83;
-        }
-        if ( HIBYTE(v45) & 4 )
-        {
-          Dst.bFree = 512;
-          v46 = rand();
-          Dst.uTextureID = 0;
-          Dst.uDiffuse = v46;
-          Dst.timeToLive = 64;
-          goto LABEL_89;
-        }
-        Dst.bFree = 1032;
-        Dst.uDiffuse = rand();
-        v24 = rand();
-        v48 = (TEXTURE_TYPE)0;
-        goto LABEL_87;
-      }
-      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16);
-      v1->vPosition.x += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.x) >> 16;
-      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16);
-      v1->vPosition.y += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.y) >> 16;
-      v60 = (Actor *)((unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16);
-      v28 = LOWORD(stru_721530.uSectorID);
-      v1->vPosition.z += (unsigned __int64)(stru_721530.field_7C * (signed __int64)stru_721530.field_58.z) >> 16;
-      v29 = v1->vPosition.z;
-      v1->uSectorID = v28;
-      stru_721530.field_70 += stru_721530.field_7C;
-      if ( v2->uFlags & 0x40 )
-      {
-        if ( v29 < v54 )
-          v1->vPosition.z = v54 + 1;
-        if ( !_46BFFA_check_object_intercept(uLayingItemID_, stru_721530.uFaceID) )
-          return;
-      }
-      v30 = (signed int)stru_721530.uFaceID >> 3;
-      if ( (stru_721530.uFaceID & 7) == OBJECT_Decoration)
-        break;
-      if ( (stru_721530.uFaceID & 7) == OBJECT_BModel)
-      {
-        v31 = &pOutdoor->pBModels[(signed int)stru_721530.uFaceID >> 9];
-        v32 = &v31->pFaces[v30 & 0x3F];
-        if ( v32->uPolygonType != 3 )
-        {
-          v56 = abs(v32->pFacePlane.vNormal.z * v1->vVelocity.z + v32->pFacePlane.vNormal.y * v1->vVelocity.y
-                                                                + v32->pFacePlane.vNormal.x * v1->vVelocity.x) >> 16;
-          if ( stru_721530.field_64 >> 3 > v56 )
-            v56 = stru_721530.field_64 >> 3;
-          v57 = v32->pFacePlane.vNormal.x;
-          v57 = (unsigned __int64)(v56 * (signed __int64)v57) >> 16;
-          v58 = v32->pFacePlane.vNormal.y;
-          v58 = (unsigned __int64)(v56 * (signed __int64)v58) >> 16;
-          v60 = (Actor *)v32->pFacePlane.vNormal.z;
-          v60 = (Actor *)((unsigned __int64)(v56 * (signed __int64)(signed int)v60) >> 16);
-          v1->vVelocity.x += 2 * v57;
-          v1->vVelocity.y += 2 * v58;
-          if ( v32->pFacePlane.vNormal.z <= 32000 )
-          {
-            v37 = 2 * (short)v60;
-          }
-          else
-          {
-            v36 = v60;
-            v57 = 32000;
-            v1->vVelocity.z += (signed __int16)v60;
-            v58 = (unsigned __int64)(v57 * (signed __int64)(signed int)v36) >> 16;
-            v37 = (unsigned int)(v57 * (int)v36) >> 16;
-          }
-          v1->vVelocity.z += v37;
-LABEL_70:
-          if ( BYTE3(v32->uAttributes) & 0x10 )
-            EventProcessor(v32->sCogTriggeredID, 0, 1);
-          goto LABEL_74;
-        }
-        v33 = v31->pVertices.pVertices[v32->pVertexIDs[0]].z;
-        v34 = v1->vVelocity.x;
-        v1->vPosition.z = v33 + 1;
-        if ( v1->vVelocity.y * v1->vVelocity.y + v34 * v34 >= 400 )
-          goto LABEL_70;
-        LOWORD(v35) = 0;
-        v1->vVelocity.z = 0;
-        v1->vVelocity.x = 0;
-        goto LABEL_73;
-      }
-LABEL_74:
-      v58 = v1->vVelocity.x;
-      v57 = 58500;
-      v58 = (unsigned __int64)(58500i64 * v58) >> 16;
-      v1->vVelocity.x = v58;
-      v58 = v1->vVelocity.y;
-      v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16;
-      v57 = 58500;
-      v1->vVelocity.y = v58;
-      v58 = v1->vVelocity.z;
-      v58 = (unsigned __int64)(v57 * (signed __int64)v58) >> 16;
-      ++v55;
-      v43 = __OFSUB__(v55, 100);
-      v42 = v55 - 100 < 0;
-      v1->vVelocity.z = v58;
-      if ( !(v42 ^ v43) )
-        return;
-    }
-    v57 = integer_sqrt(v1->vVelocity.y * v1->vVelocity.y + v1->vVelocity.x * v1->vVelocity.x);
-    v38 = stru_5C6E00->Atan2(
-            v1->vPosition.x - pLevelDecorations[v30].vPosition.x,
-            v1->vPosition.y - pLevelDecorations[v30].vPosition.y);
-    v56 = v38;
-    v39 = stru_5C6E00->Cos(v38);
-    v60 = (Actor *)v39;
-    v40 = v39 * (signed __int64)v57;
-    v58 = v40 >> 16;
-    v1->vVelocity.x = WORD1(v40);
-    v41 = stru_5C6E00->Sin(v56 - stru_5C6E00->uIntegerHalfPi);
-    v60 = (Actor *)v41;
-    v35 = (unsigned __int64)(v41 * (signed __int64)v57) >> 16;
-    v58 = v35;
-LABEL_73:
-    v1->vVelocity.y = v35;
-    goto LABEL_74;
-  }
-}
-
-
 
 //----- (0047253E) --------------------------------------------------------
 void UpdateObjects()
@@ -2210,9 +1415,9 @@
 
   //v1 = 0;
   //v20 = 0;
-  for (uint i = 0; i < uNumLayingItems; ++i)
-  {
-    auto item = pLayingItems + i;
+  for (uint i = 0; i < uNumSpriteObjects; ++i)
+  {
+    auto item = pSpriteObjects + i;
     v2 = (char *)&item->uSpriteFrameID;
     //do
     //{
@@ -2253,7 +1458,7 @@
           {
             v10 = i;
 LABEL_35:
-            LayingItem::OnItemPickup(v10);
+            SpriteObject::OnInteraction(v10);
             goto LABEL_36;
           }
           v11 = v4->uLifetime;
@@ -2263,9 +1468,9 @@
           {
 LABEL_22:
             if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
-              LayingItem::UpdateObject_fn0_BLV(i);
+              SpriteObject::UpdateObject_fn0_BLV(i);
             else
-              LayingItem::UpdateObject_fn0_ODM(i);
+              SpriteObject::UpdateObject_fn0_ODM(i);
             if ( pParty->bTurnBasedModeOn != 1 || !(*(v2 - 4) & 4) )
               goto LABEL_36;
             v12 = abs(pParty->vPosition.x - *(int *)(v2 - 26));
@@ -2309,7 +1514,7 @@
       //v2 += 112;
       //v1 = v20++ + 1;
     //}
-    //while ( v20 < (signed int)uNumLayingItems );
+    //while ( v20 < (signed int)uNumSpriteObjects );
   }
 }
 
@@ -3668,7 +2873,7 @@
     v37 = WorldPosToGridCellZ(pParty->vPosition.y);
     v38 = WorldPosToGridCellX(pParty->vPosition.x);
     _46E26D_collide_against_sprites(v38, v37);
-    _46ED8A_collide_against_layingItems(4u);
+    _46ED8A_collide_against_sprite_objects(4u);
     for ( i = 0; i < (signed int)uNumActors; ++i )
       _46DF1A_collide_against_actor(i, 0);
     if ( stru_721530.field_7C >= stru_721530.field_6C )
@@ -7525,7 +6730,7 @@
   if ( !(BYTE1(dword_6BE364_game_settings_1) & 0x20) )
   {
     InitializeActors();
-    InitializeLayingItems();
+    InitializeSpriteObjects();
   }
   BYTE1(dword_6BE364_game_settings_1) &= 0xDFu;
   //v5 = 0;
@@ -12177,15 +11382,15 @@
   signed int y; // [sp+54h] [bp-8h]@24
   signed int x; // [sp+58h] [bp-4h]@24
 
-  for (uint i = 0; i < uNumLayingItems; ++i)
-  {
-    auto p = pLayingItems + i;
+  for (uint i = 0; i < uNumSpriteObjects; ++i)
+  {
+    auto p = pSpriteObjects + i;
     if (p->uObjectDescID)
     {
       v1 = &pObjectList->pObjects[p->uObjectDescID];
         if ( !(v1->uFlags & 1) )
          {
-          if ( ((v2 = p->uItemType, v2 < 1000) || v2 >= 10000)
+          if ( ((v2 = p->uType, v2 < 1000) || v2 >= 10000)
             && (v2 < 500 || v2 >= 600)
             && (v2 < 811 || v2 >= 815)
             || pGame->pStru6Instance->_4A81CA(p))
@@ -13014,10 +12219,10 @@
   if ( bWizardEyeActive = true)
   {
     uZe = 0;
-    //for (uint i = 0; i < uNumLayingItems; ++i)
-    if (uNumLayingItems > 0)
-    {
-      a2c = (char *)&pLayingItems[0].uObjectDescID;
+    //for (uint i = 0; i < uNumSpriteObjects; ++i)
+    if (uNumSpriteObjects > 0)
+    {
+      a2c = (char *)&pSpriteObjects[0].uObjectDescID;
       while ( 1 )
       {
         if ( !*((short *)a2c - 1)
@@ -13055,7 +12260,7 @@
 LABEL_83:
         ++uZe;
         a2c += 112;
-        if ( uZe >= (signed int)uNumLayingItems )
+        if ( uZe >= (signed int)uNumSpriteObjects )
         {
           v36 = 255;
           v33 = 0;
@@ -16344,7 +15549,7 @@
   int v55; // [sp+28h] [bp-8Ch]@7
   unsigned int yaw; // [sp+30h] [bp-84h]@7
   int pitch; // [sp+34h] [bp-80h]@7
-  //LayingItem a1; // [sp+38h] [bp-7Ch]@12
+  //SpriteObject a1; // [sp+38h] [bp-7Ch]@12
   int v59; // [sp+A8h] [bp-Ch]@1
   int v60; // [sp+ACh] [bp-8h]@1
   int spellnum_; // [sp+B0h] [bp-4h]@1
@@ -16401,10 +15606,10 @@
     v15 = 1;
   a7b = v15;
 
-  LayingItem a1; // [sp+38h] [bp-7Ch]@12
-  //LayingItem::LayingItem(&a1);
-
-  a1.uItemType = stru_4E3ACC[spellnum_].field_0;
+  SpriteObject a1; // [sp+38h] [bp-7Ch]@12
+  //SpriteObject::SpriteObject(&a1);
+
+  a1.uType = stru_4E3ACC[spellnum_].field_0;
   if ( spellnum_ > 58 )
   {
     if ( spellnum_ == 69 )
@@ -16467,7 +15672,7 @@
         if ( (signed int)pObjectList->uNumObjects <= 0 )
           goto LABEL_34;
         v17 = (char *)&pObjectList->pObjects->uObjectID;
-        while ( (short)a1.uItemType != *(short *)v17 )
+        while ( (short)a1.uType != *(short *)v17 )
         {
           ++v16;
           v17 += 56;
@@ -16510,7 +15715,7 @@
           else
           {
             v22 = (char *)&pObjectList->pObjects->uObjectID;
-            while ( (short)a1.uItemType != *(short *)v22 )
+            while ( (short)a1.uType != *(short *)v22 )
             {
               ++v21;
               v22 += 56;
@@ -16550,7 +15755,7 @@
         v19 = (char *)&pObjectList->pObjects->uObjectID;
         do
         {
-          if ( (short)a1.uItemType == *(short *)v19 )
+          if ( (short)a1.uType == *(short *)v19 )
             goto LABEL_20;
           ++v16;
           v19 += 56;
@@ -16601,7 +15806,7 @@
         if ( (signed int)pObjectList->uNumObjects <= 0 )
           goto LABEL_59;
         v26 = (char *)&pObjectList->pObjects->uObjectID;
-        while ( (short)a1.uItemType != *(short *)v26 )
+        while ( (short)a1.uType != *(short *)v26 )
         {
           ++v25;
           v26 += 56;
@@ -16757,7 +15962,7 @@
       default:
         return;
     }
-    while ( (short)a1.uItemType != *(short *)v30 )
+    while ( (short)a1.uType != *(short *)v30 )
     {
       ++v29;
       v30 += 56;
@@ -18560,27 +17765,24 @@
 
 
 //----- (00404828) --------------------------------------------------------
-LayingItem::LayingItem()
-{
-  LayingItem *v1; // esi@1
-
-  v1 = this;
-  v1->field_22_glow_radius_multiplier = 1;
-  v1->uSoundID = 0;
-  v1->uFacing = 0;
-  v1->vVelocity.z = 0;
-  v1->vVelocity.y = 0;
-  v1->vVelocity.x = 0;
-  v1->uItemType = 0;
-  v1->uObjectDescID = 0;
-  v1->field_61 = 0;
-  v1->field_60_distance_related_prolly_lod = 0;
-  v1->field_20 = 0;
-  v1->uSpriteFrameID = 0;
-  v1->field_50 = 0;
-  v1->field_4C = 0;
-  v1->field_48 = 0;
-  v1->field_54 = 0;
+SpriteObject::SpriteObject()
+{
+  field_22_glow_radius_multiplier = 1;
+  uSoundID = 0;
+  uFacing = 0;
+  vVelocity.z = 0;
+  vVelocity.y = 0;
+  vVelocity.x = 0;
+  uType = 0;
+  uObjectDescID = 0;
+  field_61 = 0;
+  field_60_distance_related_prolly_lod = 0;
+  field_20 = 0;
+  uSpriteFrameID = 0;
+  field_50 = 0;
+  field_4C = 0;
+  field_48 = 0;
+  field_54 = 0;
 }
 
 
--- a/mm7_4.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/mm7_4.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -23,7 +23,7 @@
 #include "Viewport.h"
 #include "FrameTableInc.h"
 #include "Math.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "ObjectList.h"
 #include "Chest.h"
 #include "PaletteManager.h"
@@ -194,9 +194,9 @@
     if ( v1->field_2 & 4 )
     {
       v38 = 0;
-      if ( (signed int)uNumLayingItems > 0 )
-      {
-        v17 = (char *)&pLayingItems[0].vPosition.y;
+      if ( (signed int)uNumSpriteObjects > 0 )
+      {
+        v17 = (char *)&pSpriteObjects[0].vPosition.y;
         do
         {
           v18 = abs(v33 - *((int *)v17 - 1));
@@ -228,7 +228,7 @@
           ++v38;
           v17 += 112;
         }
-        while ( v38 < (signed int)uNumLayingItems );
+        while ( v38 < (signed int)uNumSpriteObjects );
       }
     }
     v0 = i + 1;
@@ -1062,7 +1062,7 @@
   unsigned int result; // eax@1
 
   result = uLayingItemID;
-  if ( pObjectList->pObjects[pLayingItems[uLayingItemID].uObjectDescID].uFlags & 0x10 )
+  if ( pObjectList->pObjects[pSpriteObjects[uLayingItemID].uObjectDescID].uFlags & 0x10 )
     result = _46BFFA_check_object_intercept(uLayingItemID, a2);
   return result;
 }
@@ -3401,7 +3401,7 @@
   int v39; // edi@111
   int v40; // ecx@113
   char v41[400]; // [sp+4h] [bp-22Ch]@20
-  LayingItem a1; // [sp+194h] [bp-9Ch]@15
+  SpriteObject a1; // [sp+194h] [bp-9Ch]@15
   Vec3_int_ a3; // [sp+204h] [bp-2Ch]@15
   int v44; // [sp+210h] [bp-20h]@22
   int v45; // [sp+214h] [bp-1Ch]@25
@@ -3462,7 +3462,7 @@
     }
     if (pParty->ImmolationActive())
     {
-      //LayingItem::LayingItem(&a1);
+      //SpriteObject::SpriteObject(&a1);
       v9 = 0;
       a3.z = 0;
       a3.y = 0;
@@ -3471,7 +3471,7 @@
       a1.field_4C = pParty->pPartyBuffs[10].uPower;
       a1.field_50 = pParty->ImmolationSkillLevel();
       v10 = 0;
-      a1.uItemType = 1070;
+      a1.uType = 1070;
       a1.field_48 = 8;
       if ( (signed int)pObjectList->uNumObjects <= 0 )
       {
@@ -13530,10 +13530,10 @@
     }
     while ( v4 < v2->uActorQueueSize );
   }
-  if ( (signed int)uNumLayingItems > 0 )
-  {
-    pAttributes = &pLayingItems[0].uAttributes;
-    v9 = uNumLayingItems;
+  if ( (signed int)uNumSpriteObjects > 0 )
+  {
+    pAttributes = &pSpriteObjects[0].uAttributes;
+    v9 = uNumSpriteObjects;
     do
     {
       v10 = *pAttributes;
--- a/mm7_5.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/mm7_5.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -22,7 +22,7 @@
 #include "Viewport.h"
 #include "FrameTableInc.h"
 #include "Math.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "ObjectList.h"
 #include "Chest.h"
 #include "PaletteManager.h"
@@ -1783,7 +1783,7 @@
           }
           if ( v45 == 2 )
           {
-            v47 = (pObjectList->pObjects[pLayingItems[v46].uObjectDescID].uFlags & 0x10) == 0;
+            v47 = (pObjectList->pObjects[pSpriteObjects[v46].uObjectDescID].uFlags & 0x10) == 0;
 //LABEL_400:
             if ( !v47 )
               continue;
@@ -4679,7 +4679,7 @@
   char *v1; // esi@2
   int v2; // ecx@3
   signed int v3; // eax@3
-  LayingItem *v4; // eax@4
+  SpriteObject *v4; // eax@4
   signed int v5; // eax@4
   signed int v6; // eax@6
   unsigned int v7; // edi@6
@@ -4711,7 +4711,7 @@
   int v33; // ST24_4@29
   Vec3_int_ v34; // ST04_12@30
   Vec3_int_ *v35; // eax@31
-  LayingItem *v36; // [sp+0h] [bp-28h]@0
+  SpriteObject *v36; // [sp+0h] [bp-28h]@0
   signed int v37; // [sp+4h] [bp-24h]@5
   int v38; // [sp+4h] [bp-24h]@15
   signed int v39; // [sp+8h] [bp-20h]@3
@@ -4738,7 +4738,7 @@
       v39 = (signed int)*((short *)v1 - 300) >> 3;
       if ( v2 == 2 )
       {
-        v4 = &pLayingItems[v3];
+        v4 = &pSpriteObjects[v3];
         v36 = v4;
         v5 = v4->field_58_pid;
         v2 = v5 & 7;
@@ -4904,12 +4904,12 @@
 void DamageMonsterFromParty(signed int a1, unsigned int uActorID_Monster, Vec3_int_ *pVelocity)
 {
   //signed int v3; // eax@1
-  LayingItem *v4; // ebx@1
+  SpriteObject *v4; // ebx@1
   //int v5; // edx@3
   //bool uPlayerID; // eax@3
   //Player *pPlayer; // edi@4
   Actor *pMonster; // esi@7
-  LayingItem *v9; // ebx@12
+  SpriteObject *v9; // ebx@12
   int v10; // eax@12
   int v11; // ebx@12
   unsigned int v12; // ecx@12
@@ -4978,7 +4978,7 @@
   v62 = 0;
   if ( (a1 & 7) == OBJECT_Item)
   {
-    v4 = &pLayingItems[a1 >> 3];
+    v4 = &pSpriteObjects[a1 >> 3];
     //uDamageAmount = (int)v4;
     v61 = v4->field_60_distance_related_prolly_lod;
     a1 = v4->field_58_pid;
@@ -5054,7 +5054,7 @@
   v61 = v4->field_60_distance_related_prolly_lod;
   if ( !v19 )
   {
-    v9 = (LayingItem *)uDamageAmount;
+    v9 = (SpriteObject *)uDamageAmount;
     v50 = pParty->vPosition.x - *(int *)(uDamageAmount + 4);
     //v55 = abs(v50);
     pMonsterName = (char *)(pParty->vPosition.y - v9->vPosition.y);
@@ -5094,7 +5094,7 @@
     {
       v61 = 1;
     }
-    v4 = (LayingItem *)uDamageAmount;
+    v4 = (SpriteObject *)uDamageAmount;
   }
 
   v15 = v4->field_48;
@@ -5409,7 +5409,7 @@
   int v34; // edi@61
   int v35; // eax@70
   double v36; // st7@70
-  LayingItem *v37; // ebx@77
+  SpriteObject *v37; // ebx@77
   int v38; // edi@77
   int v39; // esi@77
   int v40; // eax@77
@@ -5650,7 +5650,7 @@
     viewparams->bRedrawGameUI = 1;
     return;
   }
-  v37 = &pLayingItems[uActorID];
+  v37 = &pSpriteObjects[uActorID];
   v38 = v37->field_58_pid & 7;
   v39 = v37->field_58_pid >> 3;
   v40 = v37->field_58_pid & 7;
@@ -5666,8 +5666,8 @@
       a4 = stru_50C198.which_player_would_attack(v44);
     v45 = &pParty->pPlayers[a4];
     v77 = Actor::_43B3E0_CalcDamage(v44, v74);
-    v46 = v37->uItemType;
-    if ( v37->uItemType == 545 )
+    v46 = v37->uType;
+    if ( v37->uType == 545 )
     {
       LOBYTE(v51) = v45->GetActualSkillLevel(PLAYER_SKILL_UNARMED);
       v52 = v51;
@@ -5892,29 +5892,29 @@
   v6 = uLayingItemID;
   v2 = uLayingItemID;
   v3 = a2 >> 3;
-  v4 = pLayingItems[uLayingItemID].field_58_pid & 7;
+  v4 = pSpriteObjects[uLayingItemID].field_58_pid & 7;
   v5 = (a2 & 7) - 3;
   if ( v5 )
   {
     if ( v5 == 1 )
     {
-      layingitem_vel_50FDFC.x = pLayingItems[v2].vVelocity.x;
-      layingitem_vel_50FDFC.y = pLayingItems[v2].vVelocity.y;
-      layingitem_vel_50FDFC.z = pLayingItems[v2].vVelocity.z;
+      layingitem_vel_50FDFC.x = pSpriteObjects[v2].vVelocity.x;
+      layingitem_vel_50FDFC.y = pSpriteObjects[v2].vVelocity.y;
+      layingitem_vel_50FDFC.z = pSpriteObjects[v2].vVelocity.z;
       Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z);
-      DamagePlayerFromMonster(8 * v6 | 2, pLayingItems[v2].field_61, &layingitem_vel_50FDFC, 0xFFFFFFFFu);
-    }
-  }
-  else
-  {
-    layingitem_vel_50FDFC.x = pLayingItems[v2].vVelocity.x;
-    layingitem_vel_50FDFC.y = pLayingItems[v2].vVelocity.y;
-    layingitem_vel_50FDFC.z = pLayingItems[v2].vVelocity.z;
+      DamagePlayerFromMonster(8 * v6 | 2, pSpriteObjects[v2].field_61, &layingitem_vel_50FDFC, 0xFFFFFFFFu);
+    }
+  }
+  else
+  {
+    layingitem_vel_50FDFC.x = pSpriteObjects[v2].vVelocity.x;
+    layingitem_vel_50FDFC.y = pSpriteObjects[v2].vVelocity.y;
+    layingitem_vel_50FDFC.z = pSpriteObjects[v2].vVelocity.z;
     Vec3_int_::Normalize(&layingitem_vel_50FDFC.x, &layingitem_vel_50FDFC.y, &layingitem_vel_50FDFC.z);
     switch ( v4 )
     {
       case OBJECT_Actor:
-        sub_43B1B0(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC, pLayingItems[v2].field_61);
+        sub_43B1B0(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC, pSpriteObjects[v2].field_61);
         break;
       case OBJECT_Player:
         DamageMonsterFromParty(8 * v6 | AI_OBJECT_LAYING_ITEM, v3, &layingitem_vel_50FDFC);
@@ -6053,7 +6053,7 @@
 void __fastcall sub_43B057(unsigned int uObjID, unsigned int uActorID, Vec3_int_ *pVelocity)
 {
   Actor *pActor; // esi@1
-  LayingItem *v4; // eax@3
+  SpriteObject *v4; // eax@3
   int v5; // ecx@3
   int v6; // eax@4
   int v7; // edi@4
@@ -6068,7 +6068,7 @@
   {
     if ( (a2 & 7) == OBJECT_Item)
     {
-      v4 = &pLayingItems[(signed int)a2 >> 3];
+      v4 = &pSpriteObjects[(signed int)a2 >> 3];
       v5 = v4->field_48;
       if ( v5 )
       {
@@ -6108,7 +6108,7 @@
 void sub_43B1B0(signed int a1, unsigned int a2, Vec3_int_ *pVelocity, signed int a4)
 {
   int v4; // ebx@1
-  LayingItem *v5; // eax@2
+  SpriteObject *v5; // eax@2
   bool v6; // eax@3
   Actor *v7; // esi@4
   Actor *v8; // edi@4
@@ -6127,7 +6127,7 @@
   v17 = a1;
   if ( (a1 & 7) == OBJECT_Item)
   {
-    v5 = &pLayingItems[a1 >> 3];
+    v5 = &pSpriteObjects[a1 >> 3];
     v4 = v5->field_60_distance_related_prolly_lod;
     v17 = v5->field_58_pid;
   }
@@ -10844,10 +10844,10 @@
   else
   {
     v10 = v2;
-    v63 = pLayingItems[v10].vPosition.x;
-    v64 = pLayingItems[v10].vPosition.y;
-    v11 = pLayingItems[v10].vPosition.z;
-    v7 = pLayingItems[v10].uSectorID;
+    v63 = pSpriteObjects[v10].vPosition.x;
+    v64 = pSpriteObjects[v10].vPosition.y;
+    v11 = pSpriteObjects[v10].vPosition.z;
+    v7 = pSpriteObjects[v10].uSectorID;
     v65 = v11;
   }
   v66 = v7;
@@ -10893,10 +10893,10 @@
   else
   {
     v22 = v12;
-    v18 = pLayingItems[v22].vPosition.x;
-    v17 = pLayingItems[v22].vPosition.z;
-    v60 = pLayingItems[v22].vPosition.y;
-    v19 = pLayingItems[v22].uSectorID;
+    v18 = pSpriteObjects[v22].vPosition.x;
+    v17 = pSpriteObjects[v22].vPosition.z;
+    v60 = pSpriteObjects[v22].vPosition.y;
+    v19 = pSpriteObjects[v22].uSectorID;
   }
   v62 = v19;
   v23 = v18 - v63;
@@ -12116,15 +12116,15 @@
 }
 
 //----- (00408896) --------------------------------------------------------
-void InitializeLayingItems()
-{
-  for (uint i = 0; i < uNumLayingItems; ++i)
-  {
-    auto item = pLayingItems + i;
-
-    if (item->uItemType &&
-        (item->uSoundID & 8 || pObjectList->pObjects[item->uItemType].uFlags & 0x10))
-      LayingItem::OnItemPickup(i);
+void InitializeSpriteObjects()
+{
+  for (uint i = 0; i < uNumSpriteObjects; ++i)
+  {
+    auto item = pSpriteObjects + i;
+
+    if (item->uType &&
+        (item->uSoundID & 8 || pObjectList->pObjects[item->uType].uFlags & 0x10))
+      SpriteObject::OnInteraction(i);
   }
 
   for (uint i = 0; i < 100; ++i)
@@ -16426,9 +16426,9 @@
         goto LABEL_132;
       }
       v7 = v6 >> 3;
-      if ( pObjectList->pObjects[pLayingItems[v7].uObjectDescID].uFlags & 0x10 )
+      if ( pObjectList->pObjects[pSpriteObjects[v7].uObjectDescID].uFlags & 0x10 )
         goto LABEL_132;
-      v8 = &pLayingItems[v7].stru_24;
+      v8 = &pSpriteObjects[v7].stru_24;
     }
     GameUI_DrawItemInfo(v8);
     goto LABEL_132;
--- a/mm7_6.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/mm7_6.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -20,7 +20,7 @@
 #include "Viewport.h"
 #include "FrameTableInc.h"
 #include "Math.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "ObjectList.h"
 #include "Chest.h"
 #include "PaletteManager.h"
@@ -2578,9 +2578,9 @@
   //unsigned __int64 v28; // qax@102
   int v29; // ecx@105
   int v30; // ecx@106
-  int v31; // eax@112
-  int v32; // eax@112
-  char *v33; // edx@113
+  //int v31; // eax@112
+  //int v32; // eax@112
+  //char *v33; // edx@113
   int v34; // eax@121
   int v35; // eax@123
   int v36; // edx@125
@@ -3269,7 +3269,7 @@
   signed int sRecoveryTime; // [sp+DD0h] [bp-B4h]@53
   char *y; // [sp+DD4h] [bp-B0h]@325
   int v721; // [sp+DD8h] [bp-ACh]@163
-  //LayingItem a1; // [sp+DDCh] [bp-A8h]@1
+  //SpriteObject a1; // [sp+DDCh] [bp-A8h]@1
   int v723; // [sp+E4Ch] [bp-38h]@1
   ItemGen *_this; // [sp+E50h] [bp-34h]@23
   float v725; // [sp+E54h] [bp-30h]@23
@@ -3291,8 +3291,8 @@
 
   v711 = ecx0;
 
-  LayingItem a1; // [sp+DDCh] [bp-A8h]@1
-  //LayingItem::LayingItem(&a1);
+  SpriteObject a1; // [sp+DDCh] [bp-A8h]@1
+  //SpriteObject::SpriteObject(&a1);
 
   //v1 = 0;
   v2 = 0;
@@ -3336,8 +3336,8 @@
     }
 
 
-    a1.uItemType = stru_4E3ACC[v3->spellnum].field_0;
-    if (a1.uItemType)
+    a1.uType = stru_4E3ACC[v3->spellnum].field_0;
+    if (a1.uType)
     {
       if ( (a2 & 7) == OBJECT_Actor)
       {
@@ -3460,8 +3460,9 @@
 
     switch ( v3->spellnum )
     {
+      case SPELL_101:
+        assert(false && "Unknown spell effect #101 (prolly flaming bow arrow");
       case SPELL_BOW_ARROW:
-      case SPELL_101:
         v17 = pPlayer;
         _this = (ItemGen *)1;
         if ( (signed int)SkillToMastery(pPlayer->pActiveSkills[PLAYER_SKILL_BOW]) >= 3 )
@@ -3472,7 +3473,7 @@
         a1.field_4C = v2;
         a1.field_48 = v18;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         if ( v17->WearsItem(510, 2) )
           a1.uObjectDescID = pObjectList->ObjectIDByItemID(0xBD6u);
         a1.vPosition.x = pParty->vPosition.x;
@@ -3513,7 +3514,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v723;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.x = pParty->vPosition.x;
         a1.vPosition.y = pParty->vPosition.y;
         a1.uAttributes = 0;
@@ -3565,7 +3566,7 @@
         pParty->pPartyBuffs[PARTY_BUFF_TORCHLIGHT].Apply(pParty->uTimePlayed + (signed __int64)((double)(signed int)3600 * v2 * 4.2666669), v731, amount, 0, 0);
         goto LABEL_1056;
 
-      case 7:
+      case SPELL_FIRE_FIRE_SPIKE:
         v29 = v12 - 2;
         if ( v29 )
         {
@@ -3586,14 +3587,19 @@
         {
           amount = 5;
         }
-        v31 = v3->uPlayerID;
+        //v31 = v3->uPlayerID;
+        //v32 = 8 * v31;
+        //LOBYTE(v32) = v32 | OBJECT_Player;
+
+        //if ( (signed int)uNumSpriteObjects > 0 )
         HIDWORD(v733) = 0;
-        v32 = 8 * v31;
-        LOBYTE(v32) = v32 | OBJECT_Player;
-        if ( (signed int)uNumLayingItems > 0 )
-        {
-          v33 = (char *)&pLayingItems[0].field_48;
-          v730 = uNumLayingItems;
+        for (uint i = 0; i < uNumSpriteObjects; ++i)
+        {
+          auto object = pSpriteObjects + i;
+          if (object->uType && object->field_48 == 7 && object->field_58_pid == 8 * (int)v3->uPlayerID | OBJECT_Player)
+            ++HIDWORD(v733);
+          /*v33 = (char *)&pSpriteObjects[0].field_48;
+          v730 = uNumSpriteObjects;
           do
           {
             if ( *((short *)v33 - 36) && *(int *)v33 == 7 && *((int *)v33 + 4) == v32 )
@@ -3601,17 +3607,18 @@
             v33 += 112;
             --v730;
           }
-          while ( v730 );
+          while ( v730 );*/
         }
         if ( SHIDWORD(v733) > amount )
           goto LABEL_200;
         if ( !pPlayer->CanCastSpell(uRequiredMana) )
           goto play_sound_and_continue;
+
         a1.stru_24.Reset();
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.y = pParty->vPosition.y;
         a1.vPosition.x = pParty->vPosition.x;
         a1.uAttributes = 0;
@@ -3648,7 +3655,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -3687,7 +3694,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -3724,7 +3731,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.x = *(short *)(HIDWORD(v733) + 142);
         a1.vPosition.y = *(short *)(HIDWORD(v733) + 144);
         v48 = *(short *)(HIDWORD(v733) + 138);
@@ -3769,7 +3776,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.y = pParty->vPosition.y;
         a1.vPosition.x = pParty->vPosition.x;
         a1.uAttributes = 0;
@@ -3801,7 +3808,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         v51 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
         a1.vPosition.y = pParty->vPosition.y;
         v671 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 2;
@@ -3908,14 +3915,14 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        v60 = pObjectList->ObjectIDByItemID(a1.uItemType);
+        v60 = pObjectList->ObjectIDByItemID(a1.uType);
         v61 = a2 >> 3;
         goto LABEL_1086;
       case 92:
         if ( !pPlayer->CanCastSpell(uRequiredMana) )
           goto play_sound_and_continue;
         a1.stru_24.Reset();
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.x = pParty->vPosition.x;
         a1.vPosition.y = pParty->vPosition.y;
         a1.uAttributes = 0;
@@ -4310,7 +4317,7 @@
             a1.field_48 = *(int *)HIDWORD(v733);
             a1.field_4C = v723;
             a1.field_50 = v731;
-            a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+            a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
             a1.uAttributes = 0;
             a1.uSectorID = 0;
             a1.uSpriteFrameID = 0;
@@ -4492,7 +4499,7 @@
             a1.field_48 = v3->spellnum;
             a1.field_4C = v2;
             a1.field_50 = v731;
-            a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+            a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
             a1.uAttributes = 0;
             a1.vPosition.x = uRequiredMana;
             a1.vPosition.y = LODWORD(v727);
@@ -4539,7 +4546,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -4662,7 +4669,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.y = pParty->vPosition.y;
         a1.vPosition.x = pParty->vPosition.x;
         a1.uAttributes = 0;
@@ -4856,7 +4863,7 @@
           a1.field_48 = v3->spellnum;
           a1.field_4C = v2;
           a1.field_50 = v731;
-          a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+          a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
           a1.uAttributes = 0;
           a1.vPosition.x = LODWORD(v718);
           a1.vPosition.y = v713;
@@ -4945,7 +4952,7 @@
           a1.field_48 = v3->spellnum;
           a1.field_50 = v731;
           a1.field_4C = v2;
-          a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+          a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
           a1.vPosition.y = pParty->vPosition.y;
           v51 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
           v671 = pParty->vPosition.z + (signed int)pParty->uPartyHeight / 3;
@@ -4983,7 +4990,7 @@
           a1.field_48 = v3->spellnum;
           a1.field_4C = v2;
           a1.field_50 = v731;
-          a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+          a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
           a1.vPosition.y = pParty->vPosition.y;
           a1.vPosition.x = pParty->vPosition.x;
           a1.uAttributes = 0;
@@ -5560,7 +5567,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.y = pParty->vPosition.y;
         a1.vPosition.x = pParty->vPosition.x;
         a1.uAttributes = 0;
@@ -5588,12 +5595,12 @@
           goto LABEL_200;
         if ( !pPlayer->CanCastSpell(uRequiredMana) )
           goto play_sound_and_continue;
-        a1.uItemType = 4090;
+        a1.uType = 4090;
         a1.stru_24.Reset();
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.x = pParty->vPosition.x;
         a1.vPosition.y = pParty->vPosition.y;
         a1.uAttributes = 0;
@@ -5780,12 +5787,12 @@
           goto play_sound_and_continue;
         v726 = (Player *)sub_46A6AC((int)dword_50BF30, 100, 4096);
         pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xFFFFFFu, 0xC0u);
-        ++a1.uItemType;
+        ++a1.uType;
         a1.stru_24.Reset();
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -6120,7 +6127,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.x = *(short *)(v730 + 142);
         a1.vPosition.y = *(short *)(v730 + 144);
         v676 = *(short *)(v730 + 138);
@@ -6166,7 +6173,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        v60 = pObjectList->ObjectIDByItemID(a1.uItemType);
+        v60 = pObjectList->ObjectIDByItemID(a1.uType);
         v61 = v426;
         goto LABEL_1086;
       case 66:
@@ -6192,7 +6199,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        v60 = pObjectList->ObjectIDByItemID(a1.uItemType);
+        v60 = pObjectList->ObjectIDByItemID(a1.uType);
         v61 = v427;
         goto LABEL_1086;
       case 63:
@@ -6206,12 +6213,12 @@
           goto play_sound_and_continue;
         v726 = (Player *)sub_46A6AC((int)dword_50BF30, 100, 4096);
         pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xA0A0Au, 0xC0u);
-        ++a1.uItemType;
+        ++a1.uType;
         a1.stru_24.Reset();
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -6300,7 +6307,7 @@
         v445 = a2 >> 3;
         if ( (a2 & 7) == OBJECT_Item)
         {
-          v449 = (char *)&pLayingItems[v445].stru_24;
+          v449 = (char *)&pSpriteObjects[v445].stru_24;
           v450 = *(int *)v449;
           if ( pItemsTable->pItems[v450].uEquipType == 18 )
           {
@@ -6311,10 +6318,10 @@
           {
             sprintf(pTmpBuf2, (char*)pGlobalTXT_LocalizationStrings[471], pItemsTable->pItems[v450].pUnidentifiedName);
             ShowStatusBarString(pTmpBuf2, 2u);
-            if ( !pParty->AddItem(&pLayingItems[v445].stru_24) )
-              pParty->SetHoldingItem(&pLayingItems[v445].stru_24);
+            if ( !pParty->AddItem(&pSpriteObjects[v445].stru_24) )
+              pParty->SetHoldingItem(&pSpriteObjects[v445].stru_24);
           }
-          LayingItem::OnItemPickup(v445);
+          SpriteObject::OnInteraction(v445);
         }
         else
         {
@@ -6626,7 +6633,7 @@
 
         pGame->GetStru6()->FadeScreen__like_Turn_Undead_and_mb_Armageddon(0xAFF0Au, 0xC0u);
         v505 = sub_46A6AC((int)dword_50BF30, 100, 4096);
-        ++a1.uItemType;
+        ++a1.uType;
         HIDWORD(v733) = v505;
         v690 = 0;
         v689 = 0;
@@ -6635,7 +6642,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -6789,7 +6796,7 @@
         if ( !pPlayer->CanCastSpell(uRequiredMana) )
           goto play_sound_and_continue;
         v531 = sub_46A6AC((int)dword_50BF30, 100, 4096);
-        ++a1.uItemType;
+        ++a1.uType;
         v726 = (Player *)v531;
         v696 = 0;
         v695 = 0;
@@ -6798,7 +6805,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -7014,12 +7021,12 @@
         v721 = v578;
         if ( *(short *)(v578 + 40) > 0 || (v579 = *(short *)(v578 + 176), v579 != 5) && v579 != 4 )
           goto LABEL_200;
-        ++a1.uItemType;
+        ++a1.uType;
         a1.stru_24.Reset();
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -7118,7 +7125,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.vPosition.x = pParty->vPosition.x;
         a1.vPosition.y = pParty->vPosition.y;
         a1.uAttributes = 0;
@@ -7192,7 +7199,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        v60 = pObjectList->ObjectIDByItemID(a1.uItemType);
+        v60 = pObjectList->ObjectIDByItemID(a1.uType);
         v61 = v599;
 LABEL_1086:
         v600 = pActors[v61].vPosition.y;
@@ -7340,7 +7347,7 @@
         a1.field_48 = v3->spellnum;
         a1.field_4C = v2;
         a1.field_50 = v731;
-        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uItemType);
+        a1.uObjectDescID = pObjectList->ObjectIDByItemID(a1.uType);
         a1.uAttributes = 0;
         a1.uSectorID = 0;
         a1.uSpriteFrameID = 0;
@@ -8114,131 +8121,6 @@
   return result;
 }
 
-//----- (0042F5ED) --------------------------------------------------------
-int LayingItem::Create(int yaw, int pitch, int a4, int a5)
-{
-  LayingItem *v5; // eax@1
-  signed int v6; // ebx@2
-  char *v7; // ecx@2
-  signed int result; // eax@6
-  LayingItem *v9; // ebx@7
-  int v10; // edx@11
-  int v11; // edi@18
-  __int16 v12; // ax@18
-  int v13; // ST2C_4@20
-  int v14; // eax@20
-  int v15; // [sp-28h] [bp-38h]@14
-  int v16; // [sp-24h] [bp-34h]@11
-  Vec3_int_ v17; // [sp-20h] [bp-30h]@11
-  int *v18; // [sp-14h] [bp-24h]@11
-  int *v19; // [sp-10h] [bp-20h]@11
-  int *v20; // [sp-Ch] [bp-1Ch]@11
-  signed int v21; // [sp+8h] [bp-8h]@2
-  int angle; // [sp+Ch] [bp-4h]@1
-  int a4a; // [sp+1Ch] [bp+Ch]@20
-  int a4b; // [sp+1Ch] [bp+Ch]@20
-  int a5a; // [sp+20h] [bp+10h]@20
-
-  auto a1 = this;
-  angle = yaw;
-  v5 = a1;
-  if ( !a1->uObjectDescID )
-    return -1;
-  v6 = 0;
-  v7 = (char *)&pLayingItems[0].uObjectDescID;
-  v21 = 0;
-  do
-  {
-    if ( !*(short *)v7 )
-      break;
-    v7 += 112;
-    ++v6;
-    v21 = v6;
-  }
-  while ( (signed int)v7 < (signed int)((char *)&pObjectList->uNumObjects + 2) );
-  if ( v6 >= 1000 )
-    return -1;
-  *(int *)&v5->field_62[2] = v5->vPosition.x;
-  *(int *)&v5->field_62[6] = v5->vPosition.y;
-  v9 = &pLayingItems[v6];
-  *(int *)&v5->field_62[10] = v5->vPosition.z;
-  memcpy(v9, v5, 0x70u);
-  if ( a5 == 1 )
-  {
-    v20 = &v9->vPosition.z;
-    v19 = &v9->vPosition.y;
-    v18 = (int *)&v9->vPosition;
-    v17.z = v5->vPosition.z;
-    *(_QWORD *)&v17.x = *(_QWORD *)&v5->vPosition.x;
-    v16 = 0;
-    v10 = stru_5C6E00->uIntegerHalfPi + v9->uFacing;
-    goto LABEL_16;
-  }
-  if ( a5 == 2 )
-  {
-    v20 = &v9->vPosition.z;
-    v19 = &v9->vPosition.y;
-    v18 = (int *)&v9->vPosition;
-    v17.z = v5->vPosition.z;
-    *(_QWORD *)&v17.x = *(_QWORD *)&v5->vPosition.x;
-    v16 = 0;
-    v10 = stru_5C6E00->uIntegerHalfPi + v9->uFacing;
-    goto LABEL_14;
-  }
-  if ( a5 == 3 )
-  {
-    v20 = &v9->vPosition.z;
-    v19 = &v9->vPosition.y;
-    v18 = (int *)&v9->vPosition;
-    v17.z = v5->vPosition.z;
-    *(_QWORD *)&v17.x = *(_QWORD *)&v5->vPosition.x;
-    v16 = 0;
-    v10 = v9->uFacing - stru_5C6E00->uIntegerHalfPi;
-LABEL_14:
-    v15 = 8;
-LABEL_17:
-    Vec3_int_::Rotate(v15, v10, v16, v17, v18, v19, v20);
-    goto LABEL_18;
-  }
-  if ( a5 == 4 )
-  {
-    v20 = &v9->vPosition.z;
-    v19 = &v9->vPosition.y;
-    v18 = (int *)&v9->vPosition;
-    v17.z = v5->vPosition.z;
-    *(_QWORD *)&v17.x = *(_QWORD *)&v5->vPosition.x;
-    v16 = 0;
-    v10 = v9->uFacing - stru_5C6E00->uIntegerHalfPi;
-LABEL_16:
-    v15 = 24;
-    goto LABEL_17;
-  }
-LABEL_18:
-  v11 = a4;
-  v12 = 0;
-  if ( a4 )
-  {
-    a4a = stru_5C6E00->Cos(angle);
-    v13 = (unsigned __int64)(a4a * (signed __int64)stru_5C6E00->Cos(pitch)) >> 16;
-    a4b = stru_5C6E00->Sin(angle);
-    a5a = (unsigned __int64)(a4b * (signed __int64)stru_5C6E00->Cos(pitch)) >> 16;
-    v14 = stru_5C6E00->Sin(pitch);
-    v9->vVelocity.x = (unsigned int)(v13 * v11) >> 16;
-    v9->vVelocity.y = (unsigned int)(a5a * v11) >> 16;
-    v12 = (unsigned int)(v14 * v11) >> 16;
-  }
-  else
-  {
-    v9->vVelocity.y = 0;
-    v9->vVelocity.x = 0;
-  }
-  v9->vVelocity.z = v12;
-  result = v21;
-  if ( v21 >= (signed int)uNumLayingItems )
-    uNumLayingItems = v21 + 1;
-  return result;
-}
-
 //----- (0042F7EB) --------------------------------------------------------
 bool __fastcall sub_42F7EB_DropItemAt(unsigned int uSpriteID, int x, int y, int z, int a4, int count, int a7, unsigned __int16 attributes, ItemGen *a9)
 {
@@ -8252,7 +8134,7 @@
   int v16; // eax@18
   int v17; // edi@20
   int v18; // esi@20
-  //LayingItem a1a; // [sp+Ch] [bp-78h]@1
+  //SpriteObject a1a; // [sp+Ch] [bp-78h]@1
   int v21; // [sp+7Ch] [bp-8h]@1
   unsigned int v22; // [sp+80h] [bp-4h]@1
 
@@ -8260,8 +8142,8 @@
   v21 = x;
   v22 = uSpriteID;
 
-  LayingItem a1a; // [sp+Ch] [bp-78h]@1
-  //LayingItem::LayingItem(&a1a);
+  SpriteObject a1a; // [sp+Ch] [bp-78h]@1
+  //SpriteObject::SpriteObject(&a1a);
   a1a.stru_24.Reset();
 
   if ( a9 )
@@ -8274,7 +8156,7 @@
   a1a.field_4C = 0;
   a1a.field_48 = 0;
   a1a.field_54 = 0;
-  a1a.uItemType = v9;
+  a1a.uType = v9;
   if ( (signed int)pObjectList->uNumObjects <= 0 )
   {
 LABEL_7:
@@ -8366,13 +8248,13 @@
   unsigned __int16 v7; // ax@5
   signed int v8; // eax@6
   signed int v9; // eax@7
-  //LayingItem a1; // [sp+Ch] [bp-70h]@1
+  //SpriteObject a1; // [sp+Ch] [bp-70h]@1
 
   v3 = x;
   v4 = y;
   
-  LayingItem a1; // [sp+Ch] [bp-70h]@1
-  //LayingItem::LayingItem(&a1);
+  SpriteObject a1; // [sp+Ch] [bp-70h]@1
+  //SpriteObject::SpriteObject(&a1);
   a1.stru_24.Reset();
 
   v5 = 0;
@@ -8380,7 +8262,7 @@
   a1.field_4C = 0;
   a1.field_48 = 0;
   a1.field_54 = 0;
-  a1.uItemType = 800;
+  a1.uType = 800;
   if ( (signed int)pObjectList->uNumObjects <= 0 )
   {
 LABEL_5:
@@ -8418,18 +8300,18 @@
 }
 
 //----- (0042FA22) --------------------------------------------------------
-LayingItem *__cdecl sub_42FA22_mess_with_laying_item_list()
+SpriteObject *__cdecl sub_42FA22_mess_with_laying_item_list()
 {
   size_t v0; // edx@1
   int v1; // ebp@1
-  LayingItem *result; // eax@1
-  LayingItem *v3; // ebx@1
+  SpriteObject *result; // eax@1
+  SpriteObject *v3; // ebx@1
 
   v0 = 0;
   v1 = 0;
-  //result = (char *)&pLayingItems[0].uObjectDescID;
-  result = pLayingItems;
-  v3 = pLayingItems;
+  //result = (char *)&pSpriteObjects[0].uObjectDescID;
+  result = pSpriteObjects;
+  v3 = pSpriteObjects;
   do
   {
 	if ( result->uObjectDescID )
@@ -8446,8 +8328,8 @@
     ++v1;
   }
   //while ( (signed int)result < (signed int)((char *)&pObjectList->uNumObjects + 2) );
-  while( result <= &pLayingItems[999] );
-  uNumLayingItems = v0;
+  while( result <= &pSpriteObjects[999] );
+  uNumSpriteObjects = v0;
   return result;
 }
 
@@ -8461,14 +8343,14 @@
   int v10; // eax@10
   signed int result; // eax@11
   __int16 v12; // ax@12
-  //LayingItem a1a; // [sp+Ch] [bp-74h]@1
+  //SpriteObject a1a; // [sp+Ch] [bp-74h]@1
   int v14; // [sp+7Ch] [bp-4h]@1
 
   v6 = a1;
   v7 = a2;
-  LayingItem a1a; // [sp+Ch] [bp-74h]@1
-  //LayingItem::LayingItem(&a1a);
-  a1a.uItemType = 600;
+  SpriteObject a1a; // [sp+Ch] [bp-74h]@1
+  //SpriteObject::SpriteObject(&a1a);
+  a1a.uType = 600;
   a1a.stru_24.Reset();
 
   a1a.field_48 = 6;
@@ -8483,7 +8365,7 @@
   else
   {
     v8 = (char *)&pObjectList->pObjects->uObjectID;
-    while ( (short)a1a.uItemType != *(short *)v8 )
+    while ( (short)a1a.uType != *(short *)v8 )
     {
       ++v14;
       v8 += 56;
--- a/mm7_data.h	Fri Mar 01 22:17:32 2013 +0400
+++ b/mm7_data.h	Fri Mar 01 22:18:22 2013 +0400
@@ -1,7 +1,7 @@
 #pragma once
 #include <string>
 #include "OSAPI.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "VectorTypes.h"
 
 typedef char _UNKNOWN;
@@ -1760,7 +1760,7 @@
 bool __fastcall sub_4077F1(int a1, int a2, int a3, struct ODMFace *a4, struct BSPVertexBuffer *a5);
 bool __fastcall sub_407A1C(int x, int z, int y, struct Vec3_int_ v); // idb
 void InitializeActors();
-void InitializeLayingItems();
+void InitializeSpriteObjects();
 int __fastcall sub_4088E9(int a1, int a2, int a3, int a4, int a5, int a6);
 unsigned int __thiscall SearchAliveActors(unsigned int *pTotalActors);
 unsigned int __fastcall SearchActorByMonsterID(unsigned int *pTotalActors, int uMonsterID);
@@ -1939,7 +1939,7 @@
 signed int __cdecl sub_42F4DA();
 bool __fastcall sub_42F7EB_DropItemAt(unsigned int uSpriteID, int x, int y, int z, int a4, int count, int a7, unsigned __int16 attributes, ItemGen *a9);
 void __fastcall sub_42F960_create_object(int x, int y, int z); // idb
-LayingItem *__cdecl sub_42FA22_mess_with_laying_item_list();
+SpriteObject *__cdecl sub_42FA22_mess_with_laying_item_list();
 signed int __fastcall _42FA66_do_explosive_impact(int a1, int a2, int a3, int a4, __int16 a5, signed int a6);
 bool __fastcall sub_42FB5C(signed int a1);
 // int __cdecl crt_sub_42FBB7();
@@ -2165,7 +2165,7 @@
 int __thiscall _46E44E_collide_against_faces_and_portals(unsigned int b1); // idb
 int __fastcall _46E889_collide_against_bmodels(unsigned int ecx0);
 int _46ED1B_collide_against_floor(int x, int y, int z, unsigned int *pSectorID, unsigned int *pFaceID); // idb
-void __fastcall _46ED8A_collide_against_layingItems(unsigned int _this);
+void __fastcall _46ED8A_collide_against_sprite_objects(unsigned int _this);
 int __thiscall _46EF01_collision_chech_player(int a1); // idb
 signed int __cdecl _46F04E_collide_against_portals();
 void __cdecl BLV_UpdateDoors();
--- a/stru6.cpp	Fri Mar 01 22:17:32 2013 +0400
+++ b/stru6.cpp	Fri Mar 01 22:18:22 2013 +0400
@@ -1,5 +1,5 @@
 #include "stru6.h"
-#include "LayingItem.h"
+#include "SpriteObject.h"
 #include "IndoorCameraD3D.h"
 #include "ParticleEngine.h"
 #include "Game.h"
@@ -146,10 +146,10 @@
 }
 
 //----- (004A73AA) --------------------------------------------------------
-void stru6::_4A73AA_hanging_trace_particles___like_fire_strike_ice_blast_etc(LayingItem *a2, unsigned int uDiffuse, unsigned int uTextureID)
+void stru6::_4A73AA_hanging_trace_particles___like_fire_strike_ice_blast_etc(SpriteObject *a2, unsigned int uDiffuse, unsigned int uTextureID)
 {
   stru6 *v4; // edi@1
-  LayingItem *v5; // esi@1
+  SpriteObject *v5; // esi@1
   int v6; // eax@1
   stru6_stru2 *v7; // eax@2
   double v8; // st7@2
@@ -217,7 +217,7 @@
 }
 
 //----- (004A75CC) --------------------------------------------------------
-void stru6::_4A75CC_single_spell_collision_particle(LayingItem *a1, unsigned int uDiffuse, unsigned int uTextureID)
+void stru6::_4A75CC_single_spell_collision_particle(SpriteObject *a1, unsigned int uDiffuse, unsigned int uTextureID)
 {
   double v4; // st7@1
   signed int v5; // edi@1
@@ -246,9 +246,9 @@
 }
 
 //----- (004A7688) --------------------------------------------------------
-void stru6::_4A7688_fireball_collision_particle(LayingItem *a2)
+void stru6::_4A7688_fireball_collision_particle(SpriteObject *a2)
 {
-  LayingItem *v2; // esi@1
+  SpriteObject *v2; // esi@1
   double v3; // st7@1
   double v4; // st7@2
   double v5; // st7@4
@@ -309,9 +309,9 @@
 }
 
 //----- (004A77FD) --------------------------------------------------------
-void stru6::_4A77FD_some_stuff_d3d(LayingItem *a1)
+void stru6::_4A77FD_some_stuff_d3d(SpriteObject *a1)
 {
-  LayingItem *v2; // esi@1
+  SpriteObject *v2; // esi@1
   stru6 *v3; // edi@1
   double v4; // st7@1
   double v5; // st7@2
@@ -343,7 +343,7 @@
 }
 
 //----- (004A78AE) --------------------------------------------------------
-void stru6::_4A78AE_sparks_spell(LayingItem *a1)
+void stru6::_4A78AE_sparks_spell(SpriteObject *a1)
 {
   ObjectDesc *v2; // esi@1
   unsigned int v3; // eax@1
@@ -369,7 +369,7 @@
 }
 
 //----- (004A7948) --------------------------------------------------------
-void stru6::_4A7948_mind_blast_after_effect(LayingItem *a1)
+void stru6::_4A7948_mind_blast_after_effect(SpriteObject *a1)
 {
   ObjectDesc *v2; // esi@1
   unsigned int v3; // eax@1
@@ -404,7 +404,7 @@
 }
 
 //----- (004A7A27) --------------------------------------------------------
-bool stru6::AddMobileLight(LayingItem *a1, unsigned int uDiffuse, int uRadius)
+bool stru6::AddMobileLight(SpriteObject *a1, unsigned int uDiffuse, int uRadius)
 {
   return pMobileLightsStack->AddLight(
            a1->vPosition.x,
@@ -420,7 +420,7 @@
 // 4E94D3: using guessed type char byte_4E94D3;
 
 //----- (004A7A66) --------------------------------------------------------
-void stru6::_4A7A66_miltiple_spell_collision_partifles___like_after_sparks_or_lightning(LayingItem *a1, unsigned int uDiffuse, unsigned int uTextureID, float a4)
+void stru6::_4A7A66_miltiple_spell_collision_partifles___like_after_sparks_or_lightning(SpriteObject *a1, unsigned int uDiffuse, unsigned int uTextureID, float a4)
 {
   int v5; // eax@1
   char v6; // al@1
@@ -488,10 +488,10 @@
 }
 
 //----- (004A7C07) --------------------------------------------------------
-void stru6::_4A7C07(LayingItem *a2)
+void stru6::_4A7C07(SpriteObject *a2)
 {
   stru6 *v2; // edi@1
-  LayingItem *v3; // esi@1
+  SpriteObject *v3; // esi@1
   int v4; // eax@1
   ObjectDesc *v5; // ebx@1
   stru6_stru2 *v6; // eax@2
@@ -563,7 +563,7 @@
 }
 
 //----- (004A7E05) --------------------------------------------------------
-void stru6::AddProjectile(LayingItem *a2, int a3, unsigned int uTextureID)
+void stru6::AddProjectile(SpriteObject *a2, int a3, unsigned int uTextureID)
 {
   int v4; // edx@1
   float v5; // ST14_4@2
@@ -710,7 +710,7 @@
 }
 
 //----- (004A80DC) --------------------------------------------------------
-void stru6::_4A80DC_some_stuff_sw(LayingItem *a2)
+void stru6::_4A80DC_some_stuff_sw(SpriteObject *a2)
 {
   stru6 *v2; // esi@1
   signed int v3; // ebx@1
@@ -739,7 +739,7 @@
 }
 
 //----- (004A81CA) --------------------------------------------------------
-bool stru6::_4A81CA(LayingItem *a2)
+bool stru6::_4A81CA(SpriteObject *a2)
 {
   stru6 *v2; // ebx@1
   int result; // eax@1
@@ -761,7 +761,7 @@
   int v19; // eax@141
   int v20; // eax@151
   unsigned int v21; // [sp-8h] [bp-20h]@66
-  LayingItem *v22; // [sp-8h] [bp-20h]@81
+  SpriteObject *v22; // [sp-8h] [bp-20h]@81
   unsigned int v23; // [sp-4h] [bp-1Ch]@4
   unsigned int v24; // [sp-4h] [bp-1Ch]@5
   unsigned int v25; // [sp-4h] [bp-1Ch]@30
@@ -779,7 +779,7 @@
 
   __debugbreak(); // need to refactor carefully & collect data
   v2 = this;
-  result = a2->uItemType;
+  result = a2->uType;
   if ( result <= 545 )
   {
     if ( result != 545 )
--- a/stru6.h	Fri Mar 01 22:17:32 2013 +0400
+++ b/stru6.h	Fri Mar 01 22:18:22 2013 +0400
@@ -118,21 +118,21 @@
 
   void DoAddProjectile(float srcX, float srcY, float srcZ, float dstX, float dstY, float dstZ, unsigned int uTextureID);
   void DrawProjectiles();
-  void _4A73AA_hanging_trace_particles___like_fire_strike_ice_blast_etc(struct LayingItem *a2, unsigned int uDiffuse, unsigned int uTextureID);
-  void _4A75CC_single_spell_collision_particle(struct LayingItem *a1, unsigned int uDiffuse, unsigned int uTextureID);
-  void _4A7688_fireball_collision_particle(struct LayingItem *a2);
-  void _4A77FD_some_stuff_d3d(struct LayingItem *a1);
-  void _4A78AE_sparks_spell(struct LayingItem *a1);
-  void _4A7948_mind_blast_after_effect(struct LayingItem *a1);
-  bool AddMobileLight(struct LayingItem *a1, unsigned int uDiffuse, int uRadius);
-  void _4A7A66_miltiple_spell_collision_partifles___like_after_sparks_or_lightning(LayingItem *a1, unsigned int uDiffuse, unsigned int uTextureID, float a4);
-  void _4A7C07(struct LayingItem *a2);
-  void AddProjectile(struct LayingItem *a2, int a3, unsigned int uTextureID);
+  void _4A73AA_hanging_trace_particles___like_fire_strike_ice_blast_etc(struct SpriteObject *a2, unsigned int uDiffuse, unsigned int uTextureID);
+  void _4A75CC_single_spell_collision_particle(struct SpriteObject *a1, unsigned int uDiffuse, unsigned int uTextureID);
+  void _4A7688_fireball_collision_particle(struct SpriteObject *a2);
+  void _4A77FD_some_stuff_d3d(struct SpriteObject *a1);
+  void _4A78AE_sparks_spell(struct SpriteObject *a1);
+  void _4A7948_mind_blast_after_effect(struct SpriteObject *a1);
+  bool AddMobileLight(struct SpriteObject *a1, unsigned int uDiffuse, int uRadius);
+  void _4A7A66_miltiple_spell_collision_partifles___like_after_sparks_or_lightning(SpriteObject *a1, unsigned int uDiffuse, unsigned int uTextureID, float a4);
+  void _4A7C07(struct SpriteObject *a2);
+  void AddProjectile(struct SpriteObject *a2, int a3, unsigned int uTextureID);
   void _4A7E89_sparkles_on_actor_after_it_casts_buff(struct Actor *pActor, unsigned int uDiffuse);
   void _4A7F74(int x, int y, int z);
   int _4A806F(struct Actor *pActor);
-  void _4A80DC_some_stuff_sw(struct LayingItem *a2);
-  bool _4A81CA(struct LayingItem *a2);
+  void _4A80DC_some_stuff_sw(struct SpriteObject *a2);
+  bool _4A81CA(struct SpriteObject *a2);
   void SetPlayerBuffAnim(unsigned __int16 uSpellID, unsigned __int16 uPlayerID);
   void FadeScreen__like_Turn_Undead_and_mb_Armageddon(unsigned int uDiffuseColor, unsigned int uFadeTime);
   int _4A8BFC();