view Random.cpp @ 21:3fa5d0522f92

Both Bink 1.5.21.0 & 3.0.0.0 support added
author Nomad
date Sat, 13 Oct 2012 20:17:56 +0200
parents 8b8875f5b359
children
line wrap: on
line source

#include <math.h>

#include "Random.h"

#include "mm7_data.h"




struct Random *pRnd; // idb





//----- (004BE59E) --------------------------------------------------------
void Random::SetRange(int min, int max)
{
  this->min = min;
  this->range = max - min;
}

//----- (004BE5B1) --------------------------------------------------------
double Random::GetRandom()
{
  Random *v1; // esi@1
  double v2; // st7@1
  double v3; // st7@1

  v1 = this;
  this->field_0[3] = this->field_0[2];
  this->field_0[2] = this->field_0[1];
  v2 = this->field_0[0];
  this->field_0[1] = v2;
  v3 = this->field_0[3] * 1492.0
     + this->field_0[2] * 1776.0
     + this->field_0[3] * 2111111111.0
     + v2 * 5115.0
     + this->field_0[4];
  v1->field_0[0] = v3 - floor(v3);
  v1->field_0[4] = v3 * 2.328306436538696e-10;
  return v3 - v3;
}

//----- (004BE623) --------------------------------------------------------
int Random::GetInRange()
{
  Random *v1; // esi@1
  float v2; // ST10_4@1
  double v3; // ST04_8@1
  int floored_random; // ecx@1

  v1 = this;
  v2 = GetRandom() * (double)this->range;
  v3 = v2 + 6.7553994e15;
  floored_random = LODWORD(v3);
  if ( SLODWORD(v3) >= v1->range )
    floored_random = v1->range;
  return floored_random + v1->min;
}

//----- (004BE65D) --------------------------------------------------------
void Random::Initialize(int seed)
{
  int v2; // eax@1
  Random *this_; // esi@1
  signed int v4; // ecx@3
  unsigned int v5; // eax@4
  signed int v6; // edi@5

  v2 = seed;
  this_ = this;
  if ( !seed )
    v2 = -1;
  v4 = 0;
  do
  {
    v5 = (((v2 << 13) ^ (unsigned int)v2) >> 17) ^ (v2 << 13) ^ v2;
    v2 = 32 * v5 ^ v5;
    this_->field_0[v4++] = (double)(unsigned int)v2 * 2.328306436538696e-10;
  }
  while ( v4 < 5 );
  v6 = 19;
  do
  {
    GetRandom();
    --v6;
  }
  while ( v6 );
}