moved RNG to common/util.cpp
svn-id: r5778
This commit is contained in:
parent
89eaf9b319
commit
133f624cc5
9 changed files with 52 additions and 32 deletions
|
@ -157,3 +157,27 @@ int resStrLen(const char *src)
|
||||||
}
|
}
|
||||||
return num;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -72,4 +72,16 @@ void hexdump(const byte * data, int len);
|
||||||
// Resource string length
|
// Resource string length
|
||||||
int resStrLen(const char *src);
|
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
|
#endif
|
||||||
|
|
|
@ -1419,7 +1419,7 @@ bool Scumm::akos_increaseAnim(Actor *a, int chan, byte *aksq, uint16 *akfo, int
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
case AKC_Random:
|
case AKC_Random:
|
||||||
a->setAnimVar(GB(6), getRandomNumberRng(GW(2), GW(4)));
|
a->setAnimVar(GB(6), _rnd.getRandomNumberRng(GW(2), GW(4)));
|
||||||
continue;
|
continue;
|
||||||
case AKC_SkipGE:
|
case AKC_SkipGE:
|
||||||
case AKC_SkipG:
|
case AKC_SkipG:
|
||||||
|
|
|
@ -2076,7 +2076,7 @@ void Scumm::dissolveEffect(int width, int height) {
|
||||||
for (i = 1; i < w * h; i++) {
|
for (i = 1; i < w * h; i++) {
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
j = getRandomNumber(i - 1);
|
j = _rnd.getRandomNumber(i - 1);
|
||||||
offsets[i] = offsets[j];
|
offsets[i] = offsets[j];
|
||||||
offsets[j] = i;
|
offsets[j] = i;
|
||||||
}
|
}
|
||||||
|
@ -2099,7 +2099,7 @@ void Scumm::dissolveEffect(int width, int height) {
|
||||||
for (i = 1; i < w * h; i++) {
|
for (i = 1; i < w * h; i++) {
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
j = getRandomNumber(i - 1);
|
j = _rnd.getRandomNumber(i - 1);
|
||||||
offsets[i] = offsets[j];
|
offsets[i] = offsets[j];
|
||||||
offsets[j] = offsets2[i];
|
offsets[j] = offsets2[i];
|
||||||
}
|
}
|
||||||
|
|
|
@ -431,6 +431,7 @@ void Scumm::saveOrLoad(Serializer *s)
|
||||||
|
|
||||||
MKLINE(Scumm, _screenEffectFlag, sleByte),
|
MKLINE(Scumm, _screenEffectFlag, sleByte),
|
||||||
|
|
||||||
|
// FIXME: remove when new savegame system is implemented
|
||||||
MKLINE(Scumm, _randSeed1, sleUint32),
|
MKLINE(Scumm, _randSeed1, sleUint32),
|
||||||
MKLINE(Scumm, _randSeed2, sleUint32),
|
MKLINE(Scumm, _randSeed2, sleUint32),
|
||||||
|
|
||||||
|
@ -545,6 +546,7 @@ void Scumm::saveOrLoad(Serializer *s)
|
||||||
|
|
||||||
MKLINE(Scumm, _screenEffectFlag, sleByte),
|
MKLINE(Scumm, _screenEffectFlag, sleByte),
|
||||||
|
|
||||||
|
// FIXME: remove when new savegame system is implemented
|
||||||
MKLINE(Scumm, _randSeed1, sleUint32),
|
MKLINE(Scumm, _randSeed1, sleUint32),
|
||||||
MKLINE(Scumm, _randSeed2, sleUint32),
|
MKLINE(Scumm, _randSeed2, sleUint32),
|
||||||
|
|
||||||
|
|
|
@ -1134,7 +1134,7 @@ void Scumm::o5_ifNotState()
|
||||||
void Scumm::o5_getRandomNr()
|
void Scumm::o5_getRandomNr()
|
||||||
{
|
{
|
||||||
getResultPos();
|
getResultPos();
|
||||||
setResult(getRandomNumber(getVarOrDirectByte(0x80)));
|
setResult(_rnd.getRandomNumber(getVarOrDirectByte(0x80)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void Scumm::o5_getScriptRunning()
|
void Scumm::o5_getScriptRunning()
|
||||||
|
|
|
@ -1209,7 +1209,7 @@ void Scumm::o6_loadRoomWithEgo()
|
||||||
void Scumm::o6_getRandomNumber()
|
void Scumm::o6_getRandomNumber()
|
||||||
{
|
{
|
||||||
int rnd;
|
int rnd;
|
||||||
rnd = getRandomNumber(pop());
|
rnd = _rnd.getRandomNumber(pop());
|
||||||
_vars[VAR_V6_RANDOM_NR] = rnd;
|
_vars[VAR_V6_RANDOM_NR] = rnd;
|
||||||
push(rnd);
|
push(rnd);
|
||||||
}
|
}
|
||||||
|
@ -1218,7 +1218,7 @@ void Scumm::o6_getRandomNumberRange()
|
||||||
{
|
{
|
||||||
int max = pop();
|
int max = pop();
|
||||||
int min = pop();
|
int min = pop();
|
||||||
int rnd = getRandomNumberRng(min, max);
|
int rnd = _rnd.getRandomNumberRng(min, max);
|
||||||
_vars[VAR_V6_RANDOM_NR] = rnd;
|
_vars[VAR_V6_RANDOM_NR] = rnd;
|
||||||
push(rnd);
|
push(rnd);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "common/gameDetector.h"
|
#include "common/gameDetector.h"
|
||||||
#include "common/timer.h"
|
#include "common/timer.h"
|
||||||
#include "common/file.h"
|
#include "common/file.h"
|
||||||
|
#include "common/util.h"
|
||||||
|
|
||||||
class GameDetector;
|
class GameDetector;
|
||||||
class NewGui;
|
class NewGui;
|
||||||
|
@ -351,10 +352,8 @@ public:
|
||||||
void convertKeysToClicks();
|
void convertKeysToClicks();
|
||||||
|
|
||||||
/* Random number generation */
|
/* Random number generation */
|
||||||
uint32 _randSeed1, _randSeed2;
|
uint32 _randSeed1, _randSeed2; // FIXME: can be removed when new savegame system is implemented
|
||||||
void initRandSeeds();
|
RandomSource _rnd;
|
||||||
uint getRandomNumber(uint max);
|
|
||||||
uint getRandomNumberRng(uint min, uint max);
|
|
||||||
|
|
||||||
/* Core variable definitions */
|
/* Core variable definitions */
|
||||||
byte _gameId;
|
byte _gameId;
|
||||||
|
|
|
@ -73,25 +73,6 @@ Engine *Engine_SCUMM_create(GameDetector *detector, OSystem *syst)
|
||||||
return engine;
|
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)
|
Scumm::Scumm (GameDetector *detector, OSystem *syst)
|
||||||
: Engine(detector, syst), _pauseDialog(0), _optionsDialog(0), _saveLoadDialog(0)
|
: Engine(detector, syst), _pauseDialog(0), _optionsDialog(0), _saveLoadDialog(0)
|
||||||
{
|
{
|
||||||
|
@ -118,6 +99,10 @@ Scumm::Scumm (GameDetector *detector, OSystem *syst)
|
||||||
_dynamicRoomOffsets = 0;
|
_dynamicRoomOffsets = 0;
|
||||||
_shakeEnabled = 0;
|
_shakeEnabled = 0;
|
||||||
|
|
||||||
|
// FIXME: remove when new savegame system is implemented
|
||||||
|
_randSeed1 = 0xA943DE33;
|
||||||
|
_randSeed2 = 0x37A9ED29;
|
||||||
|
|
||||||
if (_gameId == GID_ZAK256) { // FmTowns is 320x240
|
if (_gameId == GID_ZAK256) { // FmTowns is 320x240
|
||||||
_realWidth = 320;
|
_realWidth = 320;
|
||||||
_realHeight = 240;
|
_realHeight = 240;
|
||||||
|
@ -404,7 +389,7 @@ int Scumm::scummLoop(int delta)
|
||||||
|
|
||||||
// Randomize the PRNG by calling it at regular intervals. This ensures
|
// 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.
|
// 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_1] += delta;
|
||||||
_vars[VAR_TMR_2] += delta;
|
_vars[VAR_TMR_2] += delta;
|
||||||
|
@ -1589,8 +1574,6 @@ void Scumm::launch()
|
||||||
|
|
||||||
readIndexFile();
|
readIndexFile();
|
||||||
|
|
||||||
initRandSeeds();
|
|
||||||
|
|
||||||
if (_features & GF_NEW_OPCODES)
|
if (_features & GF_NEW_OPCODES)
|
||||||
setupOpcodes2();
|
setupOpcodes2();
|
||||||
else
|
else
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue