moved RNG to common/util.cpp

svn-id: r5778
This commit is contained in:
Oliver Kiehl 2002-12-01 14:57:50 +00:00
parent 89eaf9b319
commit 133f624cc5
9 changed files with 52 additions and 32 deletions

View file

@ -157,3 +157,27 @@ int resStrLen(const char *src)
}
return num;
}
RandomSource::RandomSource(uint32 seed)
{
_randSeed = seed;
}
void RandomSource::setSeed(uint32 seed)
{
_randSeed = seed;
}
uint RandomSource::getRandomNumber(uint max)
{
/* TODO: my own random number generator */
_randSeed = 0xDEADBF03 * (_randSeed + 1);
_randSeed = (_randSeed >> 13) | (_randSeed << 19);
return _randSeed % (max + 1);
}
uint RandomSource::getRandomNumberRng(uint min, uint max)
{
return getRandomNumber(max - min) + min;
}

View file

@ -72,4 +72,16 @@ void hexdump(const byte * data, int len);
// Resource string length
int resStrLen(const char *src);
class RandomSource {
private:
uint32 _randSeed;
public:
RandomSource(uint32 seed = 0xA943DE33);
void setSeed(uint32 seed);
uint getRandomNumber(uint max);
uint getRandomNumberRng(uint min, uint max);
};
#endif

View file

@ -1419,7 +1419,7 @@ bool Scumm::akos_increaseAnim(Actor *a, int chan, byte *aksq, uint16 *akfo, int
continue;
case AKC_Random:
a->setAnimVar(GB(6), getRandomNumberRng(GW(2), GW(4)));
a->setAnimVar(GB(6), _rnd.getRandomNumberRng(GW(2), GW(4)));
continue;
case AKC_SkipGE:
case AKC_SkipG:

View file

@ -2076,7 +2076,7 @@ void Scumm::dissolveEffect(int width, int height) {
for (i = 1; i < w * h; i++) {
int j;
j = getRandomNumber(i - 1);
j = _rnd.getRandomNumber(i - 1);
offsets[i] = offsets[j];
offsets[j] = i;
}
@ -2099,7 +2099,7 @@ void Scumm::dissolveEffect(int width, int height) {
for (i = 1; i < w * h; i++) {
int j;
j = getRandomNumber(i - 1);
j = _rnd.getRandomNumber(i - 1);
offsets[i] = offsets[j];
offsets[j] = offsets2[i];
}

View file

@ -431,6 +431,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(Scumm, _screenEffectFlag, sleByte),
// FIXME: remove when new savegame system is implemented
MKLINE(Scumm, _randSeed1, sleUint32),
MKLINE(Scumm, _randSeed2, sleUint32),
@ -545,6 +546,7 @@ void Scumm::saveOrLoad(Serializer *s)
MKLINE(Scumm, _screenEffectFlag, sleByte),
// FIXME: remove when new savegame system is implemented
MKLINE(Scumm, _randSeed1, sleUint32),
MKLINE(Scumm, _randSeed2, sleUint32),

View file

@ -1134,7 +1134,7 @@ void Scumm::o5_ifNotState()
void Scumm::o5_getRandomNr()
{
getResultPos();
setResult(getRandomNumber(getVarOrDirectByte(0x80)));
setResult(_rnd.getRandomNumber(getVarOrDirectByte(0x80)));
}
void Scumm::o5_getScriptRunning()

View file

@ -1209,7 +1209,7 @@ void Scumm::o6_loadRoomWithEgo()
void Scumm::o6_getRandomNumber()
{
int rnd;
rnd = getRandomNumber(pop());
rnd = _rnd.getRandomNumber(pop());
_vars[VAR_V6_RANDOM_NR] = rnd;
push(rnd);
}
@ -1218,7 +1218,7 @@ void Scumm::o6_getRandomNumberRange()
{
int max = pop();
int min = pop();
int rnd = getRandomNumberRng(min, max);
int rnd = _rnd.getRandomNumberRng(min, max);
_vars[VAR_V6_RANDOM_NR] = rnd;
push(rnd);
}

View file

@ -27,6 +27,7 @@
#include "common/gameDetector.h"
#include "common/timer.h"
#include "common/file.h"
#include "common/util.h"
class GameDetector;
class NewGui;
@ -351,10 +352,8 @@ public:
void convertKeysToClicks();
/* Random number generation */
uint32 _randSeed1, _randSeed2;
void initRandSeeds();
uint getRandomNumber(uint max);
uint getRandomNumberRng(uint min, uint max);
uint32 _randSeed1, _randSeed2; // FIXME: can be removed when new savegame system is implemented
RandomSource _rnd;
/* Core variable definitions */
byte _gameId;

View file

@ -73,25 +73,6 @@ Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst)
return engine;
}
void Scumm::initRandSeeds()
{
_randSeed1 = 0xA943DE33;
_randSeed2 = 0x37A9ED29;
}
uint Scumm::getRandomNumber(uint max)
{
/* TODO: my own random number generator */
_randSeed1 = 0xDEADBF03 * (_randSeed1 + 1);
_randSeed1 = (_randSeed1 >> 13) | (_randSeed1 << 19);
return _randSeed1 % (max + 1);
}
uint Scumm::getRandomNumberRng(uint min, uint max)
{
return getRandomNumber(max - min) + min;
}
Scumm::Scumm (GameDetector *detector, OSystem *syst)
: Engine(detector, syst), _pauseDialog(0), _optionsDialog(0), _saveLoadDialog(0)
{
@ -118,6 +99,10 @@ Scumm::Scumm (GameDetector *detector, OSystem *syst)
_dynamicRoomOffsets = 0;
_shakeEnabled = 0;
// FIXME: remove when new savegame system is implemented
_randSeed1 = 0xA943DE33;
_randSeed2 = 0x37A9ED29;
if (_gameId == GID_ZAK256) { // FmTowns is 320x240
_realWidth = 320;
_realHeight = 240;
@ -404,7 +389,7 @@ int Scumm::scummLoop(int delta)
// Randomize the PRNG by calling it at regular intervals. This ensures
// that it will be in a different state each time you run the program.
getRandomNumber(2);
_rnd.getRandomNumber(2);
_vars[VAR_TMR_1] += delta;
_vars[VAR_TMR_2] += delta;
@ -1589,8 +1574,6 @@ void Scumm::launch()
readIndexFile();
initRandSeeds();
if (_features & GF_NEW_OPCODES)
setupOpcodes2();
else