Mercurial > might-and-magic-trilogy
diff Random.cpp @ 0:8b8875f5b359
Initial commit
author | Nomad |
---|---|
date | Fri, 05 Oct 2012 16:07:14 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Random.cpp Fri Oct 05 16:07:14 2012 +0200 @@ -0,0 +1,91 @@ +#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 ); +} +