diff Weather.cpp @ 0:9c0607679772

init
author Ritor1
date Sat, 12 Jan 2013 09:45:18 +0600
parents
children 1f0af5cac2dd
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Weather.cpp	Sat Jan 12 09:45:18 2013 +0600
@@ -0,0 +1,244 @@
+#include <stdlib.h>
+
+#include "Weather.h"
+#include "Viewport.h"
+#include "Render.h"
+
+#include "mm7_data.h"
+
+
+
+
+struct Weather *pWeather = new Weather;
+
+
+
+//----- (004C2AA6) --------------------------------------------------------
+int Weather::DrawSnow()
+{
+  unsigned __int16 *v1; // edi@1
+  __int16 *v2; // esi@2
+  int v3; // eax@2
+  signed int v4; // eax@6
+  int v5; // edx@8
+  __int16 *v6; // esi@11
+  __int16 *v7; // eax@11
+  int v8; // ecx@11
+  int v9; // eax@12
+  int v10; // ecx@16
+  int v11; // edx@18
+  Weather *v12; // eax@20
+  __int16 *v13; // esi@20
+  int v14; // eax@21
+  int v15; // eax@21
+  int v16; // edx@23
+  int v17; // eax@24
+  int v18; // edx@26
+  int v19; // ecx@27
+  int v20; // eax@27
+  char v21; // zf@27
+  unsigned int v23; // [sp+Ch] [bp-20h]@1
+  unsigned int v24; // [sp+10h] [bp-1Ch]@1
+  unsigned int v25; // [sp+14h] [bp-18h]@1
+  Weather *v26; // [sp+18h] [bp-14h]@1
+  signed int v27; // [sp+18h] [bp-14h]@20
+  unsigned int v28; // [sp+1Ch] [bp-10h]@1
+  unsigned int v29; // [sp+20h] [bp-Ch]@1
+  __int16 *v30; // [sp+24h] [bp-8h]@2
+  signed int v31; // [sp+28h] [bp-4h]@1
+  signed int v32; // [sp+28h] [bp-4h]@10
+
+  v26 = this;
+  v25 = viewparams->uScreenZ;
+  v28 = viewparams->uScreenY;
+  v31 = 0;
+  v1 = pRenderer->pTargetSurface;
+  v29 = viewparams->uScreenX;
+  v23 = viewparams->uScreenW;
+  v24 = viewparams->uScreenZ - viewparams->uScreenX;
+  do
+  {
+    v2 = &v26->field_0[2 * v31];
+    v30 = &v26->field_0[2 * v31 + 1];
+    *v2 += rand() % 3 + 1;
+    *v30 += rand() % 2 + 1;
+    v3 = *v2;
+    if ( v3 < (signed int)(v25 - 1) )
+    {
+      if ( v3 < (signed int)v29 )
+        *v2 = v25 - rand() % 8;
+    }
+    else
+    {
+      *v2 = v29 + rand() % 8;
+    }
+    v4 = *v30;
+    if ( v4 < (signed int)v28 || v4 >= (signed int)v23 )
+    {
+      v5 = rand() % (signed int)(v24 - 2);
+      *v30 = v28;
+      *v2 = v29 + v5;
+    }
+    ++v31;
+    v1[*v2 + 640 * *v30] = 0xFFFFu;
+  }
+  while ( v31 < 700 );
+  v32 = 700;
+  do
+  {
+    v6 = &v26->field_0[2 * v32];
+    *v6 += rand() % 5 - 3;
+    v7 = &v26->field_0[2 * v32 + 1];
+    v8 = *v6;
+    *v7 += 4;
+    if ( v8 < (signed int)v29 )
+    {
+      LOWORD(v9) = v25 - rand() % 4 - 2;
+LABEL_15:
+      *v6 = v9;
+      v7 = &v26->field_0[2 * v32 + 1];
+      goto LABEL_16;
+    }
+    if ( v8 >= (signed int)(v25 - 2) )
+    {
+      v9 = rand() % 4 + v29 + 2;
+      goto LABEL_15;
+    }
+LABEL_16:
+    v10 = *v7;
+    if ( v10 < (signed int)v28 || v10 >= (signed int)(v23 - 1) )
+    {
+      v11 = rand() % (signed int)(v24 - 2);
+      v26->field_0[2 * v32 + 1] = v28;
+      v7 = &v26->field_0[2 * v32 + 1];
+      *v6 = v29 + v11;
+    }
+    *(&v1[640 * *v7 + 1] + *v6) = 0xFFFFu;
+    *(&v1[640 * *v7 + 641] + *v6) = 0xFFFFu;
+    v1[*v6 + 640 * (*v7 + 1)] = 0xFFFFu;
+    ++v32;
+    v1[*v6 + 640 * *v7] = 0xFFFFu;
+  }
+  while ( v32 < 950 );
+  v12 = v26;
+  v27 = 50;
+  v13 = &v12->field_0[1901];
+  do
+  {
+    v14 = rand();
+    *v13 += 8;
+    *(v13 - 1) += v14 % 11 - 5;
+    v15 = *(v13 - 1);
+    if ( v15 < (signed int)v29 || v15 >= (signed int)(v25 - 5) )
+    {
+      v16 = rand() % (signed int)(v24 - 5);
+      *v13 = v28;
+      *(v13 - 1) = v29 + v16;
+    }
+    v17 = *v13;
+    if ( v17 < (signed int)v28 || v17 >= (signed int)(v23 - 5) )
+    {
+      v18 = rand() % (signed int)(v24 - 5);
+      *v13 = v28;
+      *(v13 - 1) = v29 + v18;
+    }
+    *(&v1[640 * *v13 + 1] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 641] + *(v13 - 1)) = 0xFFFFu;
+    v1[*(v13 - 1) + 640 * (*v13 + 1)] = 0xFFFFu;
+    v1[*(v13 - 1) + 640 * *v13] = 0xFFFFu;
+    *(&v1[640 * *v13 + 1281] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 1921] + *(v13 - 1)) = 0xFFFFu;
+    v1[*(v13 - 1) + 640 * (*v13 + 3)] = 0xFFFFu;
+    v1[*(v13 - 1) + 640 * (*v13 + 2)] = 0xFFFFu;
+    *(&v1[640 * *v13 + 3] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 643] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 642] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 2] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 1283] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 1923] + *(v13 - 1)) = 0xFFFFu;
+    *(&v1[640 * *v13 + 1922] + *(v13 - 1)) = 0xFFFFu;
+    v19 = *(v13 - 1);
+    v20 = 5 * *v13;
+    v13 += 2;
+    v21 = v27-- == 1;
+    *(&v1[128 * v20 + 1282] + v19) = 0xFFFFu;
+  }
+  while ( !v21 );
+  return 0;
+}
+
+//----- (004C2EA0) --------------------------------------------------------
+int Weather::Initialize()
+{
+  Weather *v1; // edi@1
+  signed int v2; // esi@1
+  signed int v3; // ebx@1
+  signed int v4; // ebp@1
+
+  v1 = this;
+  v2 = 0;
+  v3 = pViewport->uScreenZ - pViewport->uScreenX - 4;
+  v4 = pViewport->uScreenW - pViewport->uScreenY - 4;
+  do
+  {
+    v1->field_0[2 * v2++] = LOWORD(pViewport->uViewportX) + rand() % v3;
+    *((short *)v1 + 2 * v2 - 1) = LOWORD(pViewport->uViewportY) + rand() % v4;
+  }
+  while ( v2 < 1000 );
+  return 0;
+}
+
+//----- (004C2EFA) --------------------------------------------------------
+int Weather::Draw()
+{
+  if (bRenderSnow)
+    DrawSnow();
+  return 0;
+}
+
+//----- (004C2F0B) --------------------------------------------------------
+bool Weather::_4C2F0B(__int16 a2)
+{
+  int v3; // edx@3
+  signed int v4; // ebx@3
+  unsigned int screen_width; // esi@3
+  __int16 *v6; // eax@5
+  signed int v7; // edi@5
+  unsigned int screen_x; // [sp+0h] [bp-Ch]@3
+  unsigned int screen_z_minus_4; // [sp+4h] [bp-8h]@3
+  Weather *v10; // [sp+8h] [bp-4h]@1
+
+  v10 = this;
+  if ( this->bRenderSnow != 1 )
+    return 0;
+  HIWORD(v3) = HIWORD(viewparams->uScreenX);
+  v4 = 0;
+  screen_width = viewparams->uScreenZ - viewparams->uScreenX;
+  screen_x = viewparams->uScreenX;
+  screen_z_minus_4 = viewparams->uScreenZ - 4;
+
+  auto _this = this->field_0;
+  while ( 1 )
+  {
+    v6 = &_this[2 * v4];
+    *v6 += a2;
+    LOWORD(v3) = *v6;
+    v7 = *v6;
+    if ( v7 < (signed int)screen_z_minus_4 )
+    {
+      if ( v7 >= (signed int)screen_x )
+        goto LABEL_10;
+      v3 += screen_width;
+    }
+    else
+    {
+      v3 = v3 - screen_width + 4;
+    }
+    *v6 = v3;
+LABEL_10:
+    ++v4;
+    if ( v4 >= 1000 )
+      return 1;
+    //_this = v10;
+  }
+}
\ No newline at end of file