mirror of
https://github.com/libretro/scummvm.git
synced 2024-11-27 11:20:40 +00:00
parent
2254028365
commit
77eea722af
@ -27,11 +27,69 @@
|
||||
|
||||
#include "common/config-manager.h"
|
||||
#include "common/system.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "backends/events/default/default-events.h"
|
||||
|
||||
#include "engines/engine.h"
|
||||
#include "gui/message.h"
|
||||
|
||||
#define RECORD_SIGNATURE 0x54455354
|
||||
#define RECORD_VERSION 1
|
||||
|
||||
void readRecord(Common::InSaveFile *inFile, uint32 &diff, Common::Event &event) {
|
||||
diff = inFile->readUint32LE();
|
||||
|
||||
event.type = (Common::EventType)inFile->readUint32LE();
|
||||
|
||||
switch(event.type) {
|
||||
case Common::EVENT_KEYDOWN:
|
||||
case Common::EVENT_KEYUP:
|
||||
event.kbd.keycode = (Common::KeyCode)inFile->readSint32LE();
|
||||
event.kbd.ascii = inFile->readUint16LE();
|
||||
event.kbd.flags = inFile->readByte();
|
||||
break;
|
||||
case Common::EVENT_MOUSEMOVE:
|
||||
case Common::EVENT_LBUTTONDOWN:
|
||||
case Common::EVENT_LBUTTONUP:
|
||||
case Common::EVENT_RBUTTONDOWN:
|
||||
case Common::EVENT_RBUTTONUP:
|
||||
case Common::EVENT_WHEELUP:
|
||||
case Common::EVENT_WHEELDOWN:
|
||||
event.mouse.x = inFile->readSint16LE();
|
||||
event.mouse.y = inFile->readSint16LE();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void writeRecord(Common::OutSaveFile *outFile, uint32 diff, Common::Event &event) {
|
||||
outFile->writeUint32LE(diff);
|
||||
|
||||
outFile->writeUint32LE((uint32)event.type);
|
||||
|
||||
switch(event.type) {
|
||||
case Common::EVENT_KEYDOWN:
|
||||
case Common::EVENT_KEYUP:
|
||||
outFile->writeSint32LE(event.kbd.keycode);
|
||||
outFile->writeUint16LE(event.kbd.ascii);
|
||||
outFile->writeByte(event.kbd.flags);
|
||||
break;
|
||||
case Common::EVENT_MOUSEMOVE:
|
||||
case Common::EVENT_LBUTTONDOWN:
|
||||
case Common::EVENT_LBUTTONUP:
|
||||
case Common::EVENT_RBUTTONDOWN:
|
||||
case Common::EVENT_RBUTTONUP:
|
||||
case Common::EVENT_WHEELUP:
|
||||
case Common::EVENT_WHEELDOWN:
|
||||
outFile->writeSint16LE(event.mouse.x);
|
||||
outFile->writeSint16LE(event.mouse.y);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
DefaultEventManager::DefaultEventManager(OSystem *boss) :
|
||||
_boss(boss),
|
||||
_buttonState(0),
|
||||
@ -40,8 +98,252 @@ DefaultEventManager::DefaultEventManager(OSystem *boss) :
|
||||
|
||||
assert(_boss);
|
||||
|
||||
_recordFile = NULL;
|
||||
_recordTimeFile = NULL;
|
||||
_playbackFile = NULL;
|
||||
_playbackTimeFile = NULL;
|
||||
_timeMutex = _boss->createMutex();
|
||||
_recorderMutex = _boss->createMutex();
|
||||
|
||||
_eventCount = 0;
|
||||
_lastEventCount = 0;
|
||||
_lastMillis = 0;
|
||||
|
||||
Common::String recordModeString = ConfMan.get("record_mode");
|
||||
if (recordModeString.compareToIgnoreCase("record") == 0) {
|
||||
_recordMode = kRecorderRecord;
|
||||
} else {
|
||||
if (recordModeString.compareToIgnoreCase("playback") == 0) {
|
||||
_recordMode = kRecorderPlayback;
|
||||
} else {
|
||||
_recordMode = kPassthrough;
|
||||
}
|
||||
}
|
||||
|
||||
_recordFileName = ConfMan.get("record_file_name");
|
||||
if (_recordFileName.empty()) {
|
||||
_recordFileName = "record.bin";
|
||||
}
|
||||
_recordTempFileName = ConfMan.get("record_temp_file_name");
|
||||
if (_recordTempFileName.empty()) {
|
||||
_recordTempFileName = "record.tmp";
|
||||
}
|
||||
_recordTimeFileName = ConfMan.get("record_time_file_name");
|
||||
if (_recordTimeFileName.empty()) {
|
||||
_recordTimeFileName = "record.time";
|
||||
}
|
||||
|
||||
// Reset key repeat
|
||||
_currentKeyDown.keycode = 0;
|
||||
|
||||
// recorder stuff
|
||||
if (_recordMode == kRecorderRecord) {
|
||||
_recordCount = 0;
|
||||
_recordTimeCount = 0;
|
||||
_recordFile = _boss->getSavefileManager()->openForSaving(_recordTempFileName.c_str());
|
||||
_recordTimeFile = _boss->getSavefileManager()->openForSaving(_recordTimeFileName.c_str());
|
||||
_recordSubtitles = ConfMan.getBool("subtitles");
|
||||
}
|
||||
|
||||
uint32 sign;
|
||||
uint32 version;
|
||||
uint32 randomSourceCount;
|
||||
if (_recordMode == kRecorderPlayback) {
|
||||
_playbackCount = 0;
|
||||
_playbackTimeCount = 0;
|
||||
_playbackFile = _boss->getSavefileManager()->openForLoading(_recordFileName.c_str());
|
||||
_playbackTimeFile = _boss->getSavefileManager()->openForLoading(_recordTimeFileName.c_str());
|
||||
|
||||
if (!_playbackFile) {
|
||||
warning("Cannot open playback file %s. Playback was switched off", _recordFileName.c_str());
|
||||
_recordMode = kPassthrough;
|
||||
}
|
||||
|
||||
if (!_playbackTimeFile) {
|
||||
warning("Cannot open playback time file %s. Playback was switched off", _recordTimeFileName.c_str());
|
||||
_recordMode = kPassthrough;
|
||||
}
|
||||
}
|
||||
|
||||
if (_recordMode == kRecorderPlayback) {
|
||||
sign = _playbackFile->readUint32LE();
|
||||
if (sign != RECORD_SIGNATURE) {
|
||||
error("Unknown record file signature");
|
||||
}
|
||||
version = _playbackFile->readUint32LE();
|
||||
|
||||
// conf vars
|
||||
ConfMan.setBool("subtitles", _playbackFile->readByte() != 0);
|
||||
|
||||
_recordCount = _playbackFile->readUint32LE();
|
||||
_recordTimeCount = _playbackFile->readUint32LE();
|
||||
randomSourceCount = _playbackFile->readUint32LE();
|
||||
for (uint i = 0; i < randomSourceCount; ++i) {
|
||||
RandomSourceRecord rec;
|
||||
rec.name = "";
|
||||
uint32 sLen = _playbackFile->readUint32LE();
|
||||
for (uint j = 0; j < sLen; ++j) {
|
||||
char c = _playbackFile->readSByte();
|
||||
rec.name += c;
|
||||
}
|
||||
rec.seed = _playbackFile->readUint32LE();
|
||||
_randomSourceRecords.push_back(rec);
|
||||
}
|
||||
|
||||
_hasPlaybackEvent = false;
|
||||
}
|
||||
}
|
||||
|
||||
DefaultEventManager::~DefaultEventManager() {
|
||||
_boss->lockMutex(_timeMutex);
|
||||
_boss->lockMutex(_recorderMutex);
|
||||
_recordMode = kPassthrough;
|
||||
_boss->unlockMutex(_timeMutex);
|
||||
_boss->unlockMutex(_recorderMutex);
|
||||
|
||||
if (_playbackFile != NULL) {
|
||||
delete _playbackFile;
|
||||
}
|
||||
if (_playbackTimeFile != NULL) {
|
||||
delete _playbackTimeFile;
|
||||
}
|
||||
|
||||
if (_recordFile != NULL) {
|
||||
_recordFile->finalize();
|
||||
delete _recordFile;
|
||||
_recordTimeFile->finalize();
|
||||
delete _recordTimeFile;
|
||||
|
||||
_playbackFile = _boss->getSavefileManager()->openForLoading(_recordTempFileName.c_str());
|
||||
|
||||
_recordFile = _boss->getSavefileManager()->openForSaving(_recordFileName.c_str());
|
||||
_recordFile->writeUint32LE(RECORD_SIGNATURE);
|
||||
_recordFile->writeUint32LE(RECORD_VERSION);
|
||||
|
||||
// conf vars
|
||||
_recordFile->writeByte(_recordSubtitles ? 1 : 0);
|
||||
|
||||
_recordFile->writeUint32LE(_recordCount);
|
||||
_recordFile->writeUint32LE(_recordTimeCount);
|
||||
|
||||
_recordFile->writeUint32LE(_randomSourceRecords.size());
|
||||
for (uint i = 0; i < _randomSourceRecords.size(); ++i) {
|
||||
_recordFile->writeUint32LE(_randomSourceRecords[i].name.size());
|
||||
_recordFile->writeString(_randomSourceRecords[i].name);
|
||||
_recordFile->writeUint32LE(_randomSourceRecords[i].seed);
|
||||
}
|
||||
|
||||
for (uint i = 0; i < _recordCount; ++i) {
|
||||
uint32 tempDiff;
|
||||
Common::Event tempEvent;
|
||||
readRecord(_playbackFile, tempDiff, tempEvent);
|
||||
writeRecord(_recordFile, tempDiff, tempEvent);
|
||||
}
|
||||
|
||||
_recordFile->finalize();
|
||||
delete _recordFile;
|
||||
delete _playbackFile;
|
||||
|
||||
//TODO: remove recordTempFileName'ed file
|
||||
}
|
||||
_boss->deleteMutex(_timeMutex);
|
||||
_boss->deleteMutex(_recorderMutex);
|
||||
}
|
||||
|
||||
bool DefaultEventManager::playback(Common::Event &event) {
|
||||
|
||||
if (!_hasPlaybackEvent) {
|
||||
if (_recordCount > _playbackCount) {
|
||||
readRecord(_playbackFile, (uint32&)_playbackDiff, _playbackEvent);
|
||||
_playbackCount++;
|
||||
_hasPlaybackEvent = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (_hasPlaybackEvent) {
|
||||
if (_playbackDiff <= (_eventCount - _lastEventCount)) {
|
||||
switch(_playbackEvent.type) {
|
||||
case Common::EVENT_MOUSEMOVE:
|
||||
case Common::EVENT_LBUTTONDOWN:
|
||||
case Common::EVENT_LBUTTONUP:
|
||||
case Common::EVENT_RBUTTONDOWN:
|
||||
case Common::EVENT_RBUTTONUP:
|
||||
case Common::EVENT_WHEELUP:
|
||||
case Common::EVENT_WHEELDOWN:
|
||||
_boss->warpMouse(_playbackEvent.mouse.x, _playbackEvent.mouse.y);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
event = _playbackEvent;
|
||||
_hasPlaybackEvent = false;
|
||||
_lastEventCount = _eventCount;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void DefaultEventManager::record(Common::Event &event) {
|
||||
writeRecord(_recordFile, _eventCount - _lastEventCount, event);
|
||||
|
||||
_recordCount++;
|
||||
_lastEventCount = _eventCount;
|
||||
}
|
||||
|
||||
void DefaultEventManager::registerRandomSource(Common::RandomSource &rnd, const char *name) {
|
||||
|
||||
if (_recordMode == kRecorderRecord) {
|
||||
RandomSourceRecord rec;
|
||||
rec.name = name;
|
||||
rec.seed = rnd.getSeed();
|
||||
_randomSourceRecords.push_back(rec);
|
||||
}
|
||||
|
||||
if (_recordMode == kRecorderPlayback) {
|
||||
for (uint i = 0; i < _randomSourceRecords.size(); ++i) {
|
||||
if (_randomSourceRecords[i].name == name) {
|
||||
rnd.setSeed(_randomSourceRecords[i].seed);
|
||||
_randomSourceRecords.remove_at(i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DefaultEventManager::processMillis(uint32 &millis) {
|
||||
uint32 d;
|
||||
if (_recordMode == kPassthrough) {
|
||||
return;
|
||||
}
|
||||
|
||||
_boss->lockMutex(_timeMutex);
|
||||
if (_recordMode == kRecorderRecord) {
|
||||
//Simple RLE compression
|
||||
d = millis - _lastMillis;
|
||||
if (d >= 0xff) {
|
||||
_recordTimeFile->writeByte(0xff);
|
||||
_recordTimeFile->writeUint32LE(d);
|
||||
} else {
|
||||
_recordTimeFile->writeByte(d);
|
||||
}
|
||||
_recordTimeCount++;
|
||||
}
|
||||
|
||||
if (_recordMode == kRecorderPlayback) {
|
||||
if (_recordTimeCount > _playbackTimeCount) {
|
||||
d = _playbackTimeFile->readByte();
|
||||
if (d == 0xff) {
|
||||
d = _playbackTimeFile->readUint32LE();
|
||||
}
|
||||
millis = _lastMillis + d;
|
||||
_playbackTimeCount++;
|
||||
}
|
||||
}
|
||||
|
||||
_lastMillis = millis;
|
||||
_boss->unlockMutex(_timeMutex);
|
||||
}
|
||||
|
||||
bool DefaultEventManager::pollEvent(Common::Event &event) {
|
||||
@ -50,6 +352,25 @@ bool DefaultEventManager::pollEvent(Common::Event &event) {
|
||||
|
||||
result = _boss->pollEvent(event);
|
||||
|
||||
if (_recordMode != kPassthrough) {
|
||||
|
||||
_boss->lockMutex(_recorderMutex);
|
||||
_eventCount++;
|
||||
|
||||
if (_recordMode == kRecorderPlayback) {
|
||||
if (event.type != Common::EVENT_QUIT) {
|
||||
result = playback(event);
|
||||
}
|
||||
} else {
|
||||
if (_recordMode == kRecorderRecord) {
|
||||
if (result) {
|
||||
record(event);
|
||||
}
|
||||
}
|
||||
}
|
||||
_boss->unlockMutex(_recorderMutex);
|
||||
}
|
||||
|
||||
if (result) {
|
||||
event.synthetic = false;
|
||||
switch (event.type) {
|
||||
|
@ -27,6 +27,7 @@
|
||||
#define BACKEND_EVENTS_DEFAULT_H
|
||||
|
||||
#include "common/events.h"
|
||||
#include "common/savefile.h"
|
||||
|
||||
/*
|
||||
At some point we will remove pollEvent from OSystem and change
|
||||
@ -47,7 +48,45 @@ class DefaultEventManager : public Common::EventManager {
|
||||
int _buttonState;
|
||||
int _modifierState;
|
||||
bool _shouldQuit;
|
||||
|
||||
class RandomSourceRecord {
|
||||
public:
|
||||
Common::String name;
|
||||
uint32 seed;
|
||||
};
|
||||
Common::Array<RandomSourceRecord> _randomSourceRecords;
|
||||
|
||||
bool _recordSubtitles;
|
||||
volatile uint32 _recordCount;
|
||||
volatile uint32 _lastRecordEvent;
|
||||
volatile uint32 _recordTimeCount;
|
||||
Common::OutSaveFile *_recordFile;
|
||||
Common::OutSaveFile *_recordTimeFile;
|
||||
Common::MutexRef _timeMutex;
|
||||
Common::MutexRef _recorderMutex;
|
||||
volatile uint32 _lastMillis;
|
||||
|
||||
volatile uint32 _playbackCount;
|
||||
volatile uint32 _playbackDiff;
|
||||
volatile bool _hasPlaybackEvent;
|
||||
volatile uint32 _playbackTimeCount;
|
||||
Common::Event _playbackEvent;
|
||||
Common::InSaveFile *_playbackFile;
|
||||
Common::InSaveFile *_playbackTimeFile;
|
||||
|
||||
volatile uint32 _eventCount;
|
||||
volatile uint32 _lastEventCount;
|
||||
|
||||
enum RecordMode {
|
||||
kPassthrough = 0,
|
||||
kRecorderRecord = 1,
|
||||
kRecorderPlayback = 2
|
||||
};
|
||||
volatile RecordMode _recordMode;
|
||||
Common::String _recordFileName;
|
||||
Common::String _recordTempFileName;
|
||||
Common::String _recordTimeFileName;
|
||||
|
||||
// for continuous events (keyDown)
|
||||
enum {
|
||||
kKeyRepeatInitialDelay = 400,
|
||||
@ -61,10 +100,15 @@ class DefaultEventManager : public Common::EventManager {
|
||||
} _currentKeyDown;
|
||||
uint32 _keyRepeatTime;
|
||||
|
||||
void record(Common::Event &event);
|
||||
bool playback(Common::Event &event);
|
||||
public:
|
||||
DefaultEventManager(OSystem *boss);
|
||||
~DefaultEventManager();
|
||||
|
||||
virtual bool pollEvent(Common::Event &event);
|
||||
virtual void registerRandomSource(Common::RandomSource &rnd, const char *name);
|
||||
virtual void processMillis(uint32 &millis);
|
||||
|
||||
virtual Common::Point getMousePos() const { return _mousePos; }
|
||||
virtual int getButtonState() const { return _buttonState; }
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
#include "backends/platform/sdl/sdl.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "common/events.h"
|
||||
#include "common/util.h"
|
||||
|
||||
#include "backends/saves/default/default-saves.h"
|
||||
@ -187,7 +188,9 @@ OSystem_SDL::~OSystem_SDL() {
|
||||
}
|
||||
|
||||
uint32 OSystem_SDL::getMillis() {
|
||||
return SDL_GetTicks();
|
||||
uint32 millis = SDL_GetTicks();
|
||||
getEventManager()->processMillis(millis);
|
||||
return millis;
|
||||
}
|
||||
|
||||
void OSystem_SDL::delayMillis(uint msecs) {
|
||||
@ -268,6 +271,7 @@ void OSystem_SDL::quit() {
|
||||
SDL_ShowCursor(SDL_ENABLE);
|
||||
SDL_Quit();
|
||||
|
||||
delete getEventManager();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -225,6 +225,11 @@ void registerDefaults() {
|
||||
ConfMan.registerDefault("savepath", savePath);
|
||||
#endif
|
||||
#endif // #ifdef DEFAULT_SAVE_PATH
|
||||
|
||||
ConfMan.registerDefault("record_mode", "none");
|
||||
ConfMan.registerDefault("record_file_name", "record.bin");
|
||||
ConfMan.registerDefault("record_temp_file_name", "record.tmp");
|
||||
ConfMan.registerDefault("record_time_file_name", "record.time");
|
||||
}
|
||||
|
||||
//
|
||||
@ -500,6 +505,19 @@ Common::String parseCommandLine(Common::StringMap &settings, int argc, char **ar
|
||||
END_OPTION
|
||||
#endif
|
||||
|
||||
DO_LONG_OPTION("record-mode")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION("record-file-name")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION("record-temp-file-name")
|
||||
END_OPTION
|
||||
|
||||
DO_LONG_OPTION("record-time-file-name")
|
||||
END_OPTION
|
||||
|
||||
|
||||
unknownOption:
|
||||
// If we get till here, the option is unhandled and hence unknown.
|
||||
usage("Unrecognized option '%s'", argv[i]);
|
||||
|
@ -140,7 +140,11 @@ public:
|
||||
*/
|
||||
virtual bool pollEvent(Common::Event &event) = 0;
|
||||
|
||||
|
||||
/** Register random source so it can be serialized in game test purposes **/
|
||||
virtual void registerRandomSource(Common::RandomSource &rnd, const char *name) = 0;
|
||||
|
||||
virtual void processMillis(uint32 &millis) = 0;
|
||||
|
||||
/** Return the current key state */
|
||||
virtual Common::Point getMousePos() const = 0;
|
||||
|
||||
|
@ -72,6 +72,10 @@ private:
|
||||
public:
|
||||
RandomSource();
|
||||
void setSeed(uint32 seed);
|
||||
|
||||
uint32 getSeed() {
|
||||
return _randSeed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates a random unsigned integer in the interval [0, max].
|
||||
|
@ -623,6 +623,7 @@ AgiEngine::AgiEngine(OSystem *syst) : AgiBase(syst) {
|
||||
_gameId = g->id;
|
||||
|
||||
_rnd = new Common::RandomSource();
|
||||
syst->getEventManager()->registerRandomSource(*_rnd, "agi");
|
||||
|
||||
Common::addSpecialDebugLevel(kDebugLevelMain, "Main", "Generic debug level");
|
||||
Common::addSpecialDebugLevel(kDebugLevelResources, "Resources", "Resources debugging");
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "common/config-manager.h"
|
||||
#include "common/file.h"
|
||||
#include "common/system.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "agos/debugger.h"
|
||||
#include "agos/intern.h"
|
||||
@ -519,6 +520,8 @@ AGOSEngine::AGOSEngine(OSystem *syst)
|
||||
File::addDefaultDirectory(_gameDataPath + "SFX");
|
||||
File::addDefaultDirectory(_gameDataPath + "speech");
|
||||
File::addDefaultDirectory(_gameDataPath + "SPEECH");
|
||||
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "agos");
|
||||
}
|
||||
|
||||
int AGOSEngine::init() {
|
||||
|
@ -23,7 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "common/events.h"
|
||||
#include "common/file.h"
|
||||
#include "common/savefile.h"
|
||||
#include "common/config-manager.h"
|
||||
@ -62,6 +62,8 @@ CineEngine::CineEngine(OSystem *syst) : Engine(syst) {
|
||||
_mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, ConfMan.getInt("music_volume"));
|
||||
|
||||
g_cine = this;
|
||||
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "cine");
|
||||
}
|
||||
|
||||
CineEngine::~CineEngine() {
|
||||
|
@ -85,6 +85,8 @@ public:
|
||||
const CINEGameDescription *_gameDescription;
|
||||
Common::File _partFileHandle;
|
||||
|
||||
Common::RandomSource _rnd;
|
||||
|
||||
private:
|
||||
void initialize(void);
|
||||
bool makeLoad(char *saveName);
|
||||
|
@ -909,7 +909,7 @@ void o1_loadVar() {
|
||||
break;
|
||||
case 5:
|
||||
debugC(5, kCineDebugScript, "Line: %d: var[%d] = rand mod %d", _currentLine, varIdx, dataIdx);
|
||||
_currentScriptElement->localVars[varIdx] = rand() % dataIdx;
|
||||
_currentScriptElement->localVars[varIdx] = g_cine->_rnd.getRandomNumber(dataIdx - 1);
|
||||
break;
|
||||
case 8:
|
||||
debugC(5, kCineDebugScript, "Line: %d: var[%d] = file[%d].packedSize", _currentLine, varIdx, dataIdx);
|
||||
|
@ -2355,7 +2355,7 @@ void drawFailureMessage(byte cmd) {
|
||||
int16 localY;
|
||||
int16 localWidth;
|
||||
|
||||
byte msgIdx = cmd * 4 + rand() % 4;
|
||||
byte msgIdx = cmd * 4 + g_cine->_rnd.getRandomNumber(3);
|
||||
|
||||
const char *messagePtr = failureMessages[msgIdx];
|
||||
int len = strlen(messagePtr);
|
||||
|
@ -23,7 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include "common/events.h"
|
||||
#include "common/file.h"
|
||||
#include "common/savefile.h"
|
||||
#include "common/config-manager.h"
|
||||
@ -64,6 +64,8 @@ CruiseEngine::CruiseEngine(OSystem * syst) : Engine(syst) {
|
||||
ConfMan.getInt("music_volume"));
|
||||
|
||||
g_cruise = this;
|
||||
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "cruise");
|
||||
}
|
||||
|
||||
CruiseEngine::~CruiseEngine() {
|
||||
@ -75,8 +77,7 @@ CruiseEngine::~CruiseEngine() {
|
||||
int CruiseEngine::init() {
|
||||
// Detect game
|
||||
if (!initGame()) {
|
||||
GUIErrorMessage
|
||||
("No valid games were found in the specified directory.");
|
||||
GUIErrorMessage ("No valid games were found in the specified directory.");
|
||||
return -1;
|
||||
}
|
||||
// Initialize backend
|
||||
|
@ -43,28 +43,30 @@ struct CRUISEGameDescription;
|
||||
|
||||
class CruiseEngine:public Engine {
|
||||
|
||||
protected:
|
||||
protected:
|
||||
int init();
|
||||
int go();
|
||||
void shutdown();
|
||||
|
||||
bool initGame();
|
||||
|
||||
public:
|
||||
CruiseEngine(OSystem * syst);
|
||||
virtual ~ CruiseEngine();
|
||||
public:
|
||||
CruiseEngine(OSystem * syst);
|
||||
virtual ~ CruiseEngine();
|
||||
|
||||
int getGameType() const;
|
||||
uint32 getFeatures() const;
|
||||
Common::Language getLanguage() const;
|
||||
Common::Platform getPlatform() const;
|
||||
Common::Language getLanguage() const;
|
||||
Common::Platform getPlatform() const;
|
||||
|
||||
bool loadSaveDirectory(void);
|
||||
void makeSystemMenu(void);
|
||||
|
||||
const CRUISEGameDescription *_gameDescription;
|
||||
|
||||
private:
|
||||
Common::RandomSource _rnd;
|
||||
|
||||
private:
|
||||
void initialize(void);
|
||||
bool makeLoad(char *saveName);
|
||||
void mainLoop(int bootScriptIdx);
|
||||
|
@ -23,6 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "cruise/cruise.h"
|
||||
#include "cruise/cruise_main.h"
|
||||
#include "cruise/cell.h"
|
||||
#include "common/util.h"
|
||||
@ -193,7 +194,7 @@ int16 Op_rand(void) { // TODO: implement
|
||||
return (0);
|
||||
}
|
||||
|
||||
return (rand() % var);
|
||||
return (g_cruise->_rnd.getRandomNumber(var - 1));
|
||||
}
|
||||
|
||||
int16 Op_PlayFX(void) { // TODO: implement
|
||||
|
@ -71,6 +71,7 @@ DrasculaEngine::DrasculaEngine(OSystem *syst) : Engine(syst) {
|
||||
_gameId = g->id;
|
||||
|
||||
_rnd = new Common::RandomSource();
|
||||
syst->getEventManager()->registerRandomSource(*_rnd, "drascula");
|
||||
|
||||
int cd_num = ConfMan.getInt("cdrom");
|
||||
if (cd_num >= 0)
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
|
||||
#include "common/endian.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "base/plugins.h"
|
||||
#include "common/config-manager.h"
|
||||
@ -98,6 +99,8 @@ GobEngine::GobEngine(OSystem *syst) : Engine(syst) {
|
||||
Common::addSpecialDebugLevel(kDebugFileIO, "FileIO", "File Input/Output debug level");
|
||||
Common::addSpecialDebugLevel(kDebugGraphics, "Graphics", "Graphics debug level");
|
||||
Common::addSpecialDebugLevel(kDebugCollisions, "Collisions", "Collisions debug level");
|
||||
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "gob");
|
||||
}
|
||||
|
||||
GobEngine::~GobEngine() {
|
||||
|
@ -71,6 +71,8 @@ KyraEngine::KyraEngine(OSystem *system, const GameFlags &flags)
|
||||
Common::addSpecialDebugLevel(kDebugLevelSequence, "Sequence", "Sequence debug level");
|
||||
Common::addSpecialDebugLevel(kDebugLevelMovie, "Movie", "Movie debug level");
|
||||
Common::addSpecialDebugLevel(kDebugLevelTimer, "Timer", "Timer debug level");
|
||||
|
||||
system->getEventManager()->registerRandomSource(_rnd, "kyra");
|
||||
}
|
||||
|
||||
int KyraEngine::init() {
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "common/stream.h"
|
||||
#include "common/util.h"
|
||||
#include "common/system.h"
|
||||
#include "common/events.h"
|
||||
#include "kyra/screen.h"
|
||||
#include "kyra/kyra_v1.h"
|
||||
#include "kyra/sprites.h"
|
||||
@ -47,6 +48,7 @@ Sprites::Sprites(KyraEngine_v1 *vm, OSystem *system) {
|
||||
_spriteDefStart = 0;
|
||||
memset(_drawLayerTable, 0, sizeof(_drawLayerTable));
|
||||
_sceneAnimatorBeaconFlag = 0;
|
||||
system->getEventManager()->registerRandomSource(_rnd, "kyraSprites");
|
||||
}
|
||||
|
||||
Sprites::~Sprites() {
|
||||
|
@ -588,6 +588,8 @@ void Hotspot::setRandomDest() {
|
||||
Common::RandomSource rnd;
|
||||
int16 xp, yp;
|
||||
|
||||
g_system->getEventManager()->registerRandomSource(rnd, "lureHotspots");
|
||||
|
||||
if (_currentActions.isEmpty())
|
||||
_currentActions.addFront(START_WALKING, roomNumber());
|
||||
else
|
||||
@ -2925,6 +2927,8 @@ void HotspotTickHandlers::followerAnimHandler(Hotspot &h) {
|
||||
Common::RandomSource rnd;
|
||||
RandomActionType actionType;
|
||||
uint16 scheduleId;
|
||||
g_system->getEventManager()->registerRandomSource(rnd, "lureHotspots");
|
||||
|
||||
int actionIndex = rnd.getRandomNumber(set->numActions() - 1);
|
||||
set->getEntry(actionIndex, actionType, scheduleId);
|
||||
|
||||
@ -3113,6 +3117,8 @@ void HotspotTickHandlers::prisonerAnimHandler(Hotspot &h) {
|
||||
ValueTableData &fields = Resources::getReference().fieldList();
|
||||
Common::RandomSource rnd;
|
||||
|
||||
g_system->getEventManager()->registerRandomSource(rnd, "lureHotspots");
|
||||
|
||||
h.handleTalkDialog();
|
||||
if (h.frameCtr() > 0) {
|
||||
h.setFrameCtr(h.frameCtr() - 1);
|
||||
@ -3153,6 +3159,8 @@ void HotspotTickHandlers::morkusAnimHandler(Hotspot &h) {
|
||||
if (h.executeScript()) {
|
||||
// Script is done - set new script to one of two alternates randomly
|
||||
Common::RandomSource rnd;
|
||||
g_system->getEventManager()->registerRandomSource(rnd, "lureHotspots");
|
||||
|
||||
h.setHotspotScript(rnd.getRandomNumber(100) >= 50 ? 0x54 : 0);
|
||||
h.setFrameCtr(20 + rnd.getRandomNumber(63));
|
||||
}
|
||||
@ -3417,6 +3425,8 @@ void HotspotTickHandlers::barmanAnimHandler(Hotspot &h) {
|
||||
Common::RandomSource rnd;
|
||||
static bool ewanXOffset = false;
|
||||
|
||||
g_system->getEventManager()->registerRandomSource(rnd, "lureHotspots");
|
||||
|
||||
h.handleTalkDialog();
|
||||
if (h.delayCtr() > 0) {
|
||||
h.setDelayCtr(h.delayCtr() - 1);
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "lure/scripts.h"
|
||||
#include "lure/screen.h"
|
||||
#include "common/endian.h"
|
||||
#include "common/events.h"
|
||||
|
||||
namespace Lure {
|
||||
|
||||
@ -40,6 +41,7 @@ Resources &Resources::getReference() {
|
||||
}
|
||||
|
||||
Resources::Resources() {
|
||||
g_system->getEventManager()->registerRandomSource(_rnd, "lureResources");
|
||||
int_resources = this;
|
||||
reloadData();
|
||||
|
||||
|
@ -704,6 +704,7 @@ void Script::addActions(uint16 hotspotId, uint16 actions, uint16 v3) {
|
||||
|
||||
void Script::randomToGeneral(uint16 maxVal, uint16 minVal, uint16 v3) {
|
||||
Common::RandomSource rnd;
|
||||
g_system->getEventManager()->registerRandomSource(rnd, "lureScripts");
|
||||
uint16 v = minVal + rnd.getRandomNumber(maxVal - minVal);
|
||||
Resources::getReference().fieldList().setField(GENERAL, v);
|
||||
}
|
||||
|
@ -23,6 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "parallaction/parallaction.h"
|
||||
#include "parallaction/objects.h"
|
||||
#include "parallaction/parser.h"
|
||||
|
||||
@ -287,7 +288,7 @@ int16 ScriptVar::getRValue() {
|
||||
}
|
||||
|
||||
if (_flags & kParaRandom) {
|
||||
return (rand() * _value) / 32767;
|
||||
return (_vm->_rnd.getRandomNumber(65536) * _value) / 32767;
|
||||
}
|
||||
|
||||
error("Parameter is not an r-value");
|
||||
|
@ -111,6 +111,8 @@ Parallaction::Parallaction(OSystem *syst) :
|
||||
Common::addSpecialDebugLevel(kDebugInput, "input", "Input debug level");
|
||||
Common::addSpecialDebugLevel(kDebugAudio, "audio", "Audio debug level");
|
||||
Common::addSpecialDebugLevel(kDebugMenu, "menu", "Menu debug level");
|
||||
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "parallaction");
|
||||
}
|
||||
|
||||
|
||||
|
@ -492,6 +492,7 @@ public:
|
||||
Font *_menuFont;
|
||||
Font *_dialogueFont;
|
||||
|
||||
Common::RandomSource _rnd;
|
||||
|
||||
protected: // data
|
||||
|
||||
|
@ -25,6 +25,7 @@
|
||||
|
||||
|
||||
#include "common/system.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "graphics/cursorman.h"
|
||||
|
||||
@ -73,6 +74,7 @@ Display::Display(QueenEngine *vm, OSystem *system)
|
||||
memset(&_dynalum, 0, sizeof(_dynalum));
|
||||
|
||||
setupInkColors();
|
||||
system->getEventManager()->registerRandomSource(_rnd, "queenDisplay");
|
||||
}
|
||||
|
||||
Display::~Display() {
|
||||
|
@ -23,6 +23,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common/events.h"
|
||||
|
||||
#include "queen/music.h"
|
||||
#include "queen/queen.h"
|
||||
@ -48,6 +49,7 @@ MidiMusic::MidiMusic(MidiDriver *driver, QueenEngine *vm)
|
||||
this->open();
|
||||
|
||||
_tune = vm->resource()->isDemo() ? Sound::_tuneDemo : Sound::_tune;
|
||||
vm->_system->getEventManager()->registerRandomSource(_rnd, "queenMusic");
|
||||
}
|
||||
|
||||
MidiMusic::~MidiMusic() {
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "common/fs.h"
|
||||
#include "common/savefile.h"
|
||||
#include "common/system.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "queen/queen.h"
|
||||
#include "queen/bankman.h"
|
||||
@ -110,6 +111,7 @@ namespace Queen {
|
||||
|
||||
QueenEngine::QueenEngine(OSystem *syst)
|
||||
: Engine(syst), _debugger(0) {
|
||||
syst->getEventManager()->registerRandomSource(randomizer, "queen");
|
||||
}
|
||||
|
||||
QueenEngine::~QueenEngine() {
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include "common/file.h"
|
||||
#include "common/config-manager.h"
|
||||
#include "common/system.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "sound/mixer.h"
|
||||
|
||||
@ -113,6 +114,7 @@ SagaEngine::SagaEngine(OSystem *syst)
|
||||
}
|
||||
|
||||
_displayClip.left = _displayClip.top = 0;
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "saga");
|
||||
}
|
||||
|
||||
SagaEngine::~SagaEngine() {
|
||||
|
@ -536,6 +536,8 @@ ScummEngine::ScummEngine(OSystem *syst, const DetectorResult &dr)
|
||||
// Add debug levels
|
||||
for (int i = 0; i < ARRAYSIZE(debugChannels); ++i)
|
||||
Common::addSpecialDebugLevel(debugChannels[i].flag, debugChannels[i].channel, debugChannels[i].desc);
|
||||
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "scumm");
|
||||
}
|
||||
|
||||
|
||||
|
@ -26,6 +26,7 @@
|
||||
|
||||
#include "common/endian.h"
|
||||
#include "common/rect.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "sky/autoroute.h"
|
||||
#include "sky/compact.h"
|
||||
@ -71,6 +72,8 @@ void Logic::setupLogicTable() {
|
||||
}
|
||||
|
||||
Logic::Logic(SkyCompact *skyCompact, Screen *skyScreen, Disk *skyDisk, Text *skyText, MusicBase *skyMusic, Mouse *skyMouse, Sound *skySound) {
|
||||
g_system->getEventManager()->registerRandomSource(_rnd, "sky");
|
||||
|
||||
_skyCompact = skyCompact;
|
||||
_skyScreen = skyScreen;
|
||||
_skyDisk = skyDisk;
|
||||
|
@ -26,6 +26,8 @@
|
||||
|
||||
#include "common/endian.h"
|
||||
#include "common/util.h"
|
||||
#include "common/system.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "sword1/logic.h"
|
||||
#include "sword1/text.h"
|
||||
@ -54,6 +56,8 @@ namespace Sword1 {
|
||||
uint32 Logic::_scriptVars[NUM_SCRIPT_VARS];
|
||||
|
||||
Logic::Logic(ObjectMan *pObjMan, ResMan *resMan, Screen *pScreen, Mouse *pMouse, Sound *pSound, Music *pMusic, Menu *pMenu, OSystem *system, Audio::Mixer *mixer) {
|
||||
g_system->getEventManager()->registerRandomSource(_rnd, "sword1");
|
||||
|
||||
_objMan = pObjMan;
|
||||
_resMan = resMan;
|
||||
_screen = pScreen;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include "common/endian.h"
|
||||
|
||||
#include "common/util.h"
|
||||
#include "common/events.h"
|
||||
|
||||
#include "sword1/sound.h"
|
||||
#include "sword1/resman.h"
|
||||
@ -44,6 +45,7 @@ namespace Sword1 {
|
||||
#define SPEECH_FLAGS (Audio::Mixer::FLAG_16BITS | Audio::Mixer::FLAG_AUTOFREE | Audio::Mixer::FLAG_LITTLE_ENDIAN)
|
||||
|
||||
Sound::Sound(const char *searchPath, Audio::Mixer *mixer, ResMan *pResMan) {
|
||||
g_system->getEventManager()->registerRandomSource(_rnd, "sword1sound");
|
||||
strcpy(_filePath, searchPath);
|
||||
_mixer = mixer;
|
||||
_resMan = pResMan;
|
||||
|
@ -209,6 +209,7 @@ Sword2Engine::Sword2Engine(OSystem *syst) : Engine(syst) {
|
||||
_gameSpeed = 1;
|
||||
|
||||
_quit = false;
|
||||
syst->getEventManager()->registerRandomSource(_rnd, "sword2");
|
||||
}
|
||||
|
||||
Sword2Engine::~Sword2Engine() {
|
||||
|
@ -73,6 +73,8 @@ ToucheEngine::ToucheEngine(OSystem *system)
|
||||
Common::addSpecialDebugLevel(kDebugResource, "Resource", "Resource debug level");
|
||||
Common::addSpecialDebugLevel(kDebugOpcodes, "Opcodes", "Opcodes debug level");
|
||||
Common::addSpecialDebugLevel(kDebugUserIntf, "UserIntf", "UserInterface debug level");
|
||||
|
||||
system->getEventManager()->registerRandomSource(_rnd, "touche");
|
||||
}
|
||||
|
||||
ToucheEngine::~ToucheEngine() {
|
||||
|
Loading…
Reference in New Issue
Block a user