scummvm/engines/private/private.cpp

251 lines
7 KiB
C++
Raw Normal View History

2020-12-24 16:10:32 -03:00
#include "common/scummsys.h"
2020-12-24 19:02:12 -03:00
#include "audio/decoders/wave.h"
#include "audio/audiostream.h"
2020-12-24 16:10:32 -03:00
#include "common/config-manager.h"
#include "common/debug.h"
#include "common/debug-channels.h"
#include "common/error.h"
#include "common/events.h"
#include "common/file.h"
#include "common/fs.h"
#include "common/system.h"
#include "engines/util.h"
#include "private/private.h"
2020-12-30 14:34:32 -03:00
#include "private/grammar.tab.h"
#include "private/grammar.h"
extern int yyparse();
2020-12-24 16:10:32 -03:00
namespace Private {
2021-01-02 00:58:58 -03:00
Common::String *_nextSetting = NULL;
int _mode = -1;
2021-01-02 10:22:07 -03:00
PrivateEngine *_private = NULL;
2021-01-02 00:58:58 -03:00
2020-12-30 17:25:02 -03:00
extern int parse(char*);
2021-01-02 10:22:07 -03:00
Common::String &lowercase(Common::String &val) {
Common::String::iterator i;
for (i = val.begin(); i != val.end(); i++)
*i = tolower(*i);
return val;
}
2020-12-24 16:10:32 -03:00
PrivateEngine::PrivateEngine(OSystem *syst)
: Engine(syst) {
// Put your engine in a sane state, but do nothing big yet;
// in particular, do not load data from files; rather, if you
// need to do such things, do them from run().
// Do not initialize graphics here
// Do not initialize audio devices here
// However this is the place to specify all default directories
2020-12-24 19:02:12 -03:00
//const Common::FSNode gameDataDir(ConfMan.get("path"));
2020-12-24 19:53:06 -03:00
//SearchMan.addSubDirectoryMatching(gameDataDir, "..");
2020-12-24 16:10:32 -03:00
// Here is the right place to set up the engine specific debug channels
DebugMan.addDebugChannel(kPrivateDebugExample, "example", "this is just an example for a engine specific debug channel");
DebugMan.addDebugChannel(kPrivateDebugExample2, "example2", "also an example");
// Don't forget to register your random source
_rnd = new Common::RandomSource("private");
debug("PrivateEngine::PrivateEngine");
2021-01-02 10:22:07 -03:00
_private = this;
2020-12-24 16:10:32 -03:00
}
PrivateEngine::~PrivateEngine() {
debug("PrivateEngine::~PrivateEngine");
// Dispose your resources here
delete _rnd;
// Remove all of our debug levels here
DebugMan.clearAllDebugChannels();
}
Common::Error PrivateEngine::run() {
2020-12-30 15:41:29 -03:00
Common::File *file = new Common::File();
2020-12-30 17:25:02 -03:00
assert(file->open("GAME.DAT"));
void *buf = malloc(191000);
file->read(buf, 191000);
2020-12-30 15:41:29 -03:00
parse((char *) buf);
2021-01-01 12:22:05 -03:00
assert(constants.size() > 0);
2020-12-30 14:34:32 -03:00
2021-01-01 12:22:05 -03:00
for (SymbolMap::const_iterator it = settings.begin(); it != settings.end(); ++it) {
Symbol *s = it->_value;
2021-01-02 00:58:58 -03:00
//debug(s->name->c_str());
}
2020-12-24 16:10:32 -03:00
// Initialize graphics using following:
2020-12-24 19:02:12 -03:00
_screenW = 640;
_screenH = 480;
initGraphics(_screenW, _screenH);
2020-12-24 16:10:32 -03:00
// You could use backend transactions directly as an alternative,
// but it isn't recommended, until you want to handle the error values
// from OSystem::endGFXTransaction yourself.
// This is just an example template:
//_system->beginGFXTransaction();
// // This setup the graphics mode according to users seetings
// initCommonGFX(false);
//
// // Specify dimensions of game graphics window.
// // In this example: 320x200
// _system->initSize(320, 200);
//FIXME: You really want to handle
//OSystem::kTransactionSizeChangeFailed here
//_system->endGFXTransaction();
// Create debugger console. It requires GFX to be initialized
Console *console = new Console(this);
setDebugger(console);
// Additional setup.
debug("PrivateEngine::init");
// Your main even loop should be (invoked from) here.
debug("PrivateEngine::go: Hello, World!");
// This test will show up if -d1 and --debugflags=example are specified on the commandline
debugC(1, kPrivateDebugExample, "Example debug call");
// This test will show up if --debugflags=example or --debugflags=example2 or both of them and -d3 are specified on the commandline
debugC(3, kPrivateDebugExample | kPrivateDebugExample2, "Example debug call two");
// Simple main event loop
Common::Event evt;
2020-12-24 19:02:12 -03:00
_videoDecoder = new Video::SmackerDecoder();
2021-01-02 00:58:58 -03:00
_nextSetting = new Common::String("kGoIntro");
//playVideo("intro/intro.smk");
2020-12-24 16:10:32 -03:00
while (!shouldQuit()) {
g_system->getEventManager()->pollEvent(evt);
g_system->delayMillis(10);
2020-12-24 19:02:12 -03:00
if (_videoDecoder) {
if (_videoDecoder->endOfVideo()) {
_videoDecoder->close();
delete _videoDecoder;
_videoDecoder = nullptr;
} else if (_videoDecoder->needsUpdate()) {
drawScreen();
}
}
2021-01-02 00:58:58 -03:00
if (_nextSetting != NULL) {
debug("Executing %s", _nextSetting->c_str());
loadSetting(_nextSetting);
_nextSetting = NULL;
execute(prog);
}
2020-12-24 16:10:32 -03:00
}
return Common::kNoError;
}
bool PrivateEngine::hasFeature(EngineFeature f) const {
return
(f == kSupportsReturnToLauncher) ||
(f == kSupportsLoadingDuringRuntime) ||
(f == kSupportsSavingDuringRuntime);
}
Common::Error PrivateEngine::loadGameStream(Common::SeekableReadStream *stream) {
Common::Serializer s(stream, nullptr);
syncGameStream(s);
return Common::kNoError;
}
Common::Error PrivateEngine::saveGameStream(Common::WriteStream *stream, bool isAutosave) {
Common::Serializer s(nullptr, stream);
syncGameStream(s);
return Common::kNoError;
}
void PrivateEngine::syncGameStream(Common::Serializer &s) {
// Use methods of Serializer to save/load fields
int dummy = 0;
s.syncAsUint16LE(dummy);
}
2020-12-24 19:02:12 -03:00
void PrivateEngine::playSound(const Common::String &name) {
debugC(1, kPrivateDebugExample, "%s : %s", __FUNCTION__, name.c_str());
2021-01-02 10:22:07 -03:00
Common::String path(name);
Common::String s1("\\");
Common::String s2("/");
Common::replace(path, s1, s2);
s1 = Common::String("\"");
s2 = Common::String("");
Common::replace(path, s1, s2);
Common::replace(path, s1, s2);
lowercase(path);
2020-12-24 19:02:12 -03:00
Common::File *file = new Common::File();
2021-01-02 10:22:07 -03:00
if (!file->open(path))
error("unable to find sound file %s", path.c_str());
2020-12-24 19:02:12 -03:00
Audio::AudioStream *stream;
stream = Audio::makeWAVStream(file, DisposeAfterUse::YES);
stopSound();
_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, stream, -1, Audio::Mixer::kMaxChannelVolume);
}
void PrivateEngine::playVideo(const Common::String &name) {
debugC(1, kPrivateDebugExample, "%s : %s", __FUNCTION__, name.c_str());
Common::File *file = new Common::File();
if (!file->open(name))
error("unable to find video file %s", name.c_str());
if (!_videoDecoder->loadStream(file))
error("unable to load video %s", name.c_str());
_videoDecoder->start();
}
void PrivateEngine::stopSound() {
debugC(3, kPrivateDebugExample, "%s", __FUNCTION__);
if (_mixer->isSoundHandleActive(_soundHandle))
_mixer->stopHandle(_soundHandle);
}
void PrivateEngine::drawScreen() {
if (_videoDecoder && _videoDecoder->needsUpdate()) {
Graphics::Surface *screen = g_system->lockScreen();
screen->fillRect(Common::Rect(0, 0, g_system->getWidth(), g_system->getHeight()), 0);
const Graphics::Surface *surface;
surface = _videoDecoder->decodeNextFrame();
int w = surface->w; //CLIP<int>(surface->w, 0, _screenW);
int h = surface->h; //CLIP<int>(surface->h, 0, _screenH);
//int x = (_screenW - w) / 2;
//int y = (_screenH - h) / 2;
//debug("%d %d %d %d", w, h, x, y);
screen->copyRectToSurface(*surface, 0, 0, Common::Rect(0, 0, w, h));
g_system->unlockScreen();
2020-12-24 19:53:06 -03:00
g_system->getPaletteManager()->setPalette(_videoDecoder->getPalette(), 0, 256);
2020-12-24 19:02:12 -03:00
g_system->updateScreen();
}
}
2020-12-24 16:10:32 -03:00
} // End of namespace Private