changeset 639:4f2837124c69

Decoration animations
author Nomad
date Mon, 11 Mar 2013 22:20:05 +0200
parents ccf8b4815a1f
children c5a3a9cf00cd
files Render.cpp Sprites.cpp Sprites.h
diffstat 3 files changed, 70 insertions(+), 69 deletions(-) [+]
line wrap: on
line diff
--- a/Render.cpp	Mon Mar 11 21:43:26 2013 +0200
+++ b/Render.cpp	Mon Mar 11 22:20:05 2013 +0200
@@ -3485,11 +3485,11 @@
 void Render::PrepareDecorationsRenderList_ODM()
 {
   //char *v0; // esi@2
-  DecorationDesc *v1; // ebx@6
+  //DecorationDesc *v1; // ebx@6
   __int16 v2; // ax@6
   double v3; // st7@7
-  int v4; // eax@9
-  int v5; // edx@9
+  //int v4; // eax@9
+  //int v5; // edx@9
   unsigned int v6; // edi@9
   int v7; // eax@9
   SpriteFrame *v8; // eax@9
@@ -3517,10 +3517,10 @@
   int v30; // ecx@37
   int v31; // ebx@37
   Particle_sw local_0; // [sp+Ch] [bp-98h]@7
-  int x; // [sp+74h] [bp-30h]@9
-  int y; // [sp+78h] [bp-2Ch]@9
+  //int x; // [sp+74h] [bp-30h]@9
+  //int y; // [sp+78h] [bp-2Ch]@9
   //int v35; // [sp+7Ch] [bp-28h]@1
-  int v36; // [sp+80h] [bp-24h]@9
+  //int v36; // [sp+80h] [bp-24h]@9
   unsigned __int16 *v37; // [sp+84h] [bp-20h]@9
   int v38; // [sp+88h] [bp-1Ch]@9
   int v39; // [sp+8Ch] [bp-18h]@24
@@ -3540,21 +3540,22 @@
     auto decor = pLevelDecorations + i;
     auto v0 = (char *)&pLevelDecorations[i].vPosition.y;
 
-      if ( (!(*(v0 - 6) & 0x40) || ((LevelDecoration *)(v0 - 8))->_47A825()) && !(*(v0 - 6) & 0x20) )
-      {
-        v1 = &pDecorationList->pDecorations[decor->uDecorationDescID];
-        v2 = v1->uFlags;
+      if ( (!(decor->field_2 & 0x40) || decor->_47A825()) && !(decor->field_2 & 0x20) )
+      {
+        //v1 = &pDecorationList->pDecorations[decor->uDecorationDescID];
+        auto decor_desc = pDecorationList->pDecorations + decor->uDecorationDescID;
+        v2 = decor_desc->uFlags;
         if ( (char)v2 >= 0 )
         {
           if ( !(v2 & 0x22) )
           {
-            v4 = *((int *)v0 - 1);
-            v5 = *((int *)v0 + 1);
+            //v4 = decor->vPosition.x;
+            //v5 = decor->vPosition.z;
             v6 = pMiscTimer->uTotalGameTimeElapsed;
-            y = *(int *)v0;
-            x = v4;
-            v36 = v5;
-            v7 = abs(v4 + y);
+            //y = decor->vPosition.y;
+            //x = decor->vPosition.x;
+            //v36 = decor->vPosition.z;
+            v7 = abs(decor->vPosition.x + decor->vPosition.y);
 
 
             #pragma region "New: seasons change"
@@ -3564,7 +3565,7 @@
               {
                 // case 531 (tree60), 536 (tree65), 537 (tree66) have no autumn/winter sprites
                 case 11: case 0: case 1: // winter
-                  switch (v1->uSpriteID)
+                  switch (decor_desc->uSpriteID)
                   {
                     //case 468: //bush02    grows on swamps, which are evergreeen actually
                     case 548:             // flower10
@@ -3575,24 +3576,24 @@
                     case 483:             // tree01
                     case 486:             // tree04
                     case 492:             // tree10
-                      pSpriteFrameTable->InitializeSprite(v1->uSpriteID + 2);
-                      v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID + 2, v6 + v7);
+                      pSpriteFrameTable->InitializeSprite(decor_desc->uSpriteID + 2);
+                      v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID + 2, v6 + v7);
                     break;
 
                     default:
-                      v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID, v6 + v7);
+                      v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID, v6 + v7);
                   }
                 break;
 
                 case 2: case 3: case 4: // spring
-                  switch (v1->uSpriteID)
+                  switch (decor_desc->uSpriteID)
                   {
                   }
-                  v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID, v6 + v7);
+                  v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID, v6 + v7);
                 break;
 
                 case 8: case 9: case 10: // autumn
-                  switch (v1->uSpriteID)
+                  switch (decor_desc->uSpriteID)
                   {
                     //case 468: //bush02    grows on swamps, which are evergreeen actually
                     case 548:             // flower10
@@ -3603,33 +3604,32 @@
                     case 483:             // tree01
                     case 486:             // tree04
                     case 492:             // tree10
-                      pSpriteFrameTable->InitializeSprite(v1->uSpriteID + 1);
-                      v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID + 1, v6 + v7);
+                      pSpriteFrameTable->InitializeSprite(decor_desc->uSpriteID + 1);
+                      v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID + 1, v6 + v7);
                     break;
 
                     default:
-                      v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID, v6 + v7);
+                      v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID, v6 + v7);
                   }
                 break;
 
                 case 5: case 6: case 7: // summer
                   //all green by default
-                  v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID, v6 + v7);
+                  v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID, v6 + v7);
                 break;
 
                 default: assert(pParty->uCurrentMonth >= 0 && pParty->uCurrentMonth < 12);
               }
             else
-              v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID, v6 + v7);
+              v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID, v6 + v7);
             #pragma endregion
-            //v8 = pSpriteFrameTable->GetFrame(v1->uSpriteID, v6 + v7);
+            //v8 = pSpriteFrameTable->GetFrame(decor_desc->uSpriteID, v6 + v7);
 
             //v9 = v8;
             v42 = v8->uFlags;
             a5 = v8->uGlowRadius;
-            v10 = (unsigned __int16 *)stru_5C6E00->Atan2(
-                                        *((int *)v0 - 1) - pIndoorCamera->pos.x,
-                                        *(int *)v0 - pIndoorCamera->pos.y);
+            v10 = (unsigned __int16 *)stru_5C6E00->Atan2(decor->vPosition.x - pIndoorCamera->pos.x,
+                                                         decor->vPosition.y - pIndoorCamera->pos.y);
             v11 = *((int *)v0 + 2);
             v37 = v10;
             v12 = v42;
@@ -3651,9 +3651,9 @@
             {
               if ( pRenderer->pRenderD3D && pRenderer->bUseColoredLights )
               {
-                v14 = v1->uColoredLightRed;
-                v15 = v1->uColoredLightGreen;
-                v16 = v1->uColoredLightBlue;
+                v14 = decor_desc->uColoredLightRed;
+                v15 = decor_desc->uColoredLightGreen;
+                v16 = decor_desc->uColoredLightBlue;
               }
               else
               {
@@ -3663,25 +3663,25 @@
               }
               b = v16;
               pStationaryLightsStack->AddLight(
-                x,
-                y,
-                v36 + v1->uDecorationHeight / 2,
+                decor->vPosition.x,
+                decor->vPosition.y,
+                decor->vPosition.z + decor_desc->uDecorationHeight / 2,
                 a5,
                 v14,
                 v15,
                 v16,
                 byte_4E94D0);
             }
-            v17 = (x - pIndoorCamera->pos.x) << 16;
+            v17 = (decor->vPosition.x - pIndoorCamera->pos.x) << 16;
             if ( pIndoorCamera->sRotationX )
             {
-              v40 = (y - pIndoorCamera->pos.y) << 16;
+              v40 = (decor->vPosition.y - pIndoorCamera->pos.y) << 16;
               v18 = ((unsigned __int64)(v17 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16)
                   + ((unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16);
               v42 = v18;
               b = (unsigned __int64)(v17 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16;
               a5 = (unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16;
-              v40 = (v36 - pIndoorCamera->pos.z) << 16;
+              v40 = (decor->vPosition.z - pIndoorCamera->pos.z) << 16;
               v41 = (unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_sine) >> 16;
               v19 = (unsigned __int64)(v18 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_cosine) >> 16;
               v20 = v19 + ((unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_x_int_sine) >> 16);
@@ -3738,9 +3738,9 @@
                     HIBYTE(v29) |= 2u;
                     v27->uPalette = v28;
                     v27->field_1E = v29;
-                    v27->world_x = x;
-                    v27->world_y = y;
-                    v27->world_z = v36;
+                    v27->world_x = decor->vPosition.x;
+                    v27->world_y = decor->vPosition.y;
+                    v27->world_z = decor->vPosition.z;
                     v27->uScreenSpaceY = v40;
                     HIWORD(v30) = HIWORD(v39);
                     v31 = 8 * i | OBJECT_Decoration;
@@ -3757,8 +3757,8 @@
             }
             else
             {
-              v42 = (x - pIndoorCamera->pos.x) << 16;
-              v40 = (y - pIndoorCamera->pos.y) << 16;
+              v42 = (decor->vPosition.x - pIndoorCamera->pos.x) << 16;
+              v40 = (decor->vPosition.y - pIndoorCamera->pos.y) << 16;
               b = (unsigned __int64)(v17 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16;
               a5 = (unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16;
               v20 = b + ((unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_sine) >> 16);
@@ -3769,7 +3769,7 @@
                 b = (unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16;
                 v21 = ((unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - a5;
                 v41 = ((unsigned __int64)(v40 * (signed __int64)pOutdoorCamera->camera_rotation_y_int_cosine) >> 16) - a5;
-                v22 = (v36 - pIndoorCamera->pos.z) << 16;
+                v22 = (decor->vPosition.z - pIndoorCamera->pos.z) << 16;
                 goto LABEL_30;
               }
             }
--- a/Sprites.cpp	Mon Mar 11 21:43:26 2013 +0200
+++ b/Sprites.cpp	Mon Mar 11 22:20:05 2013 +0200
@@ -326,23 +326,29 @@
 }
 
 //----- (0044D8D0) --------------------------------------------------------
-SpriteFrame *SpriteFrameTable::GetFrame(unsigned int uSpriteID, unsigned int uFrameID)
+SpriteFrame *SpriteFrameTable::GetFrame(unsigned int uSpriteID, unsigned int uTime)
 {
-  SpriteFrame *v3; // edi@1
+  //SpriteFrame *v3; // edi@1
   SpriteFrame *v4; // ecx@1
-  __int16 v5; // dx@2
-  int v6; // edx@3
-  unsigned int v7; // eax@3
-  char *i; // ecx@3
-  int v9; // esi@5
-  SpriteFrame *result; // eax@6
+  //__int16 v5; // dx@2
+  //int v6; // edx@3
+  //unsigned int v7; // eax@3
+  //char *i; // ecx@3
+  //int v9; // esi@5
+  //SpriteFrame *result; // eax@6
 
-  v3 = this->pSpriteSFrames;
-  v4 = &v3[uSpriteID];
-  if ( v4->uFlags & 1 && (v5 = v4->uAnimLength) != 0 )
-  {
-    v6 = ((signed int)uFrameID >> 3) % v5;
-    v7 = uSpriteID;
+  v4 = &pSpriteSFrames[uSpriteID];
+  if (~v4->uFlags & 1 || !v4->uAnimLength)
+    return pSpriteSFrames + uSpriteID;
+
+  for (uint t = (uTime / 8) % v4->uAnimLength; t > v4->uAnimTime; ++v4)
+    t -= v4->uAnimTime;
+  return v4;
+
+  /*for (v4; v4->uAnimTime <= t; ++v4)
+
+    v6 = (uTime / 8) % v4->uAnimLength;
+    //v7 = uSpriteID;
     for ( i = (char *)&v4->uAnimTime; ; i += 60 )
     {
       v9 = *(short *)i;
@@ -351,13 +357,8 @@
       v6 -= v9;
       ++v7;
     }
-    result = &v3[v7];
-  }
-  else
-  {
-    result = &v3[uSpriteID];
-  }
-  return result;
+    return &pSpriteSFrames[v7];*/
+
 }
 
 //----- (0044D91F) --------------------------------------------------------
--- a/Sprites.h	Mon Mar 11 21:43:26 2013 +0200
+++ b/Sprites.h	Mon Mar 11 22:20:05 2013 +0200
@@ -59,7 +59,7 @@
   void InitializeSprite(unsigned int uSpriteID);
   unsigned int FastFindSprite(char *pSpriteName);
   void BinarySearch(int a2, int a3, const char *pSpriteName);
-  SpriteFrame *GetFrame(unsigned int uSpriteID, unsigned int uFrameID);
+  SpriteFrame *GetFrame(unsigned int uSpriteID, unsigned int uTime);
   SpriteFrame *GetFrameBy_x(unsigned int uSpriteID, signed int a3);
 
   unsigned int uNumSpriteFrames;