scummvm/engines/private/private.cpp

620 lines
20 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"
2021-01-13 19:27:09 -03:00
#include "common/archive.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 "common/str.h"
2021-01-12 20:49:12 -03:00
#include "common/savefile.h"
2020-12-24 16:10:32 -03:00
#include "engines/util.h"
#include "image/bmp.h"
#include "graphics/cursorman.h"
2021-01-10 11:18:55 -03:00
#include "private/cursors.h"
2020-12-24 16:10:32 -03:00
#include "private/private.h"
2020-12-30 14:34:32 -03:00
#include "private/grammar.tab.h"
#include "private/grammar.h"
2021-01-10 11:18:55 -03:00
2020-12-24 16:10:32 -03:00
namespace Private {
2021-01-07 23:32:17 -03:00
PrivateEngine *g_private = NULL;
2020-12-30 17:25:02 -03:00
extern int parse(char*);
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().
2020-12-24 16:10:32 -03:00
// Do not initialize graphics here
// Do not initialize audio devices here
2020-12-24 16:10:32 -03:00
// However this is the place to specify all default directories
2021-01-13 19:27:09 -03:00
//SearchMan.addSubDirectoryMatching(gameDataDir, "global", 0, 10, false);
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");
2020-12-24 16:10:32 -03:00
// Don't forget to register your random source
_rnd = new Common::RandomSource("private");
2020-12-24 16:10:32 -03:00
g_private = this;
2021-01-07 23:32:17 -03:00
2021-01-12 20:49:12 -03:00
_saveGameMask = NULL;
_loadGameMask = NULL;
_nextSetting = NULL;
_nextMovie = NULL;
_modified = false;
_mode = -1;
2021-01-09 16:11:30 -03:00
_frame = new Common::String("inface/general/inface2.bmp");
2021-01-07 23:32:17 -03:00
2020-12-24 16:10:32 -03:00
}
PrivateEngine::~PrivateEngine() {
debug("PrivateEngine::~PrivateEngine");
2020-12-24 16:10:32 -03:00
// Dispose your resources here
delete _rnd;
2020-12-24 16:10:32 -03:00
// Remove all of our debug levels here
DebugMan.clearAllDebugChannels();
2020-12-24 16:10:32 -03:00
}
2021-01-13 19:27:09 -03:00
void PrivateEngine::initializePath(const Common::FSNode &gamePath) {
SearchMan.addDirectory(gamePath.getPath(), gamePath, 0, 10);
}
2020-12-24 16:10:32 -03:00
Common::Error PrivateEngine::run() {
2021-01-10 20:17:27 -03:00
2021-01-13 19:27:09 -03:00
const Common::FSNode gameDataDir(ConfMan.get("path"));
//SearchMan.addSubDirectoryMatching(Common::FSNode("/"), "global/transiti/animatio/driving");
//SearchMan.addSubDirectoryMatching(gameDataDir, "global", , 10, false);
Common::ArchiveMemberList list;
SearchMan.listMembers(list);
for (Common::ArchiveMemberList::iterator it = list.begin(); it != list.end(); ++it) {
debug("%s", (*it)->getName().c_str());
}
2021-01-10 20:17:27 -03:00
assert(_installerArchive.open("SUPPORT/ASSETS.Z"));
Common::SeekableReadStream *file = NULL;
if (_installerArchive.hasFile("GAME.DAT")) // if the full game is used
2021-01-10 20:17:27 -03:00
file = _installerArchive.createReadStreamForMember("GAME.DAT");
else if (_installerArchive.hasFile("GAME.TXT")) // if the demo is used
2021-01-10 20:17:27 -03:00
file = _installerArchive.createReadStreamForMember("GAME.TXT");
2021-01-09 19:11:41 -03:00
assert(file != NULL);
void *buf = malloc(191000);
file->read(buf, 191000);
2021-01-10 11:18:55 -03:00
// Initialize stuff
2021-01-09 22:08:41 -03:00
initInsts();
initFuncs();
2021-01-10 11:18:55 -03:00
initCursors();
parse((char *) buf);
assert(constants.size() > 0);
// Initialize graphics using following:
_screenW = 640;
_screenH = 480;
//_pixelFormat = Graphics::PixelFormat::createFormatCLUT8();
_pixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
2021-01-08 22:42:34 -03:00
_transparentColor = _pixelFormat.RGBToColor(0,255,0);
initGraphics(_screenW, _screenH, &_pixelFormat);
2021-01-10 11:18:55 -03:00
CursorMan.replaceCursor(_cursors.getVal("default"), 11, 16, 0, 0, 0, true);
CursorMan.replaceCursorPalette(cursorPalette, 0, 3);
2021-01-10 15:38:10 -03:00
CursorMan.showMouse(true);
2021-01-08 22:42:34 -03:00
_origin = new Common::Point(0, 0);
_image = new Image::BitmapDecoder();
_compositeSurface = new Graphics::ManagedSurface();
_compositeSurface->create(_screenW, _screenH, _pixelFormat);
2021-01-08 22:42:34 -03:00
_compositeSurface->setTransparentColor(_transparentColor);
// 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 event;
Common::Point mousePos;
_videoDecoder = nullptr; //new Video::SmackerDecoder();
2021-01-13 19:27:09 -03:00
int saveSlot = ConfMan.getInt("save_slot");
2021-01-12 20:49:12 -03:00
if (saveSlot >= 0) { // load the savegame
loadGameState(saveSlot);
} else {
_nextSetting = new Common::String("kGoIntro");
}
while (!shouldQuit()) {
2021-01-10 15:38:10 -03:00
if (_mode == 1)
drawScreenFrame();
while (g_system->getEventManager()->pollEvent(event)) {
2021-01-10 11:18:55 -03:00
mousePos = g_system->getEventManager()->getMousePos();
// Events
switch (event.type) {
2021-01-09 19:11:41 -03:00
case Common::EVENT_KEYDOWN:
if (event.kbd.keycode == Common::KEYCODE_ESCAPE && _videoDecoder)
skipVideo();
break;
2021-01-09 19:11:41 -03:00
case Common::EVENT_QUIT:
case Common::EVENT_RETURN_TO_LAUNCHER:
break;
2021-01-09 19:11:41 -03:00
case Common::EVENT_LBUTTONDOWN:
2021-01-12 20:49:12 -03:00
selectLoadGame(mousePos);
selectSaveGame(mousePos);
2021-01-09 19:11:41 -03:00
selectMask(mousePos);
if (!_nextSetting)
selectExit(mousePos);
break;
2021-01-10 11:18:55 -03:00
case Common::EVENT_MOUSEMOVE:
CursorMan.replaceCursor(_cursors.getVal("default"), 11, 16, 0, 0, 0, true);
cursorExit(mousePos);
cursorMask(mousePos);
2021-01-12 20:49:12 -03:00
cursorLoadGame(mousePos);
cursorSaveGame(mousePos);
2021-01-10 11:18:55 -03:00
//
break;
2021-01-09 19:11:41 -03:00
default:
{}
}
}
// Movies
if (_nextMovie != NULL) {
_videoDecoder = new Video::SmackerDecoder();
playVideo(*_nextMovie);
_nextMovie = NULL;
continue;
}
if (_videoDecoder) {
stopSound();
if (_videoDecoder->endOfVideo()) {
_videoDecoder->close();
delete _videoDecoder;
_videoDecoder = nullptr;
} else if (_videoDecoder->needsUpdate()) {
drawScreen();
}
continue;
}
2021-01-09 19:11:41 -03:00
if (_nextSetting != NULL) {
debug("Executing %s", _nextSetting->c_str());
_exits.clear();
2021-01-08 22:42:34 -03:00
_masks.clear();
2021-01-12 20:49:12 -03:00
_loadGameMask = NULL;
_saveGameMask = NULL;
loadSetting(_nextSetting);
_nextSetting = NULL;
2021-01-10 15:38:10 -03:00
//CursorMan.showMouse(false);
execute(prog);
2021-01-10 15:38:10 -03:00
CursorMan.replaceCursor(_cursors.getVal("default"), 11, 16, 0, 0, 0, true);
//CursorMan.showMouse(true);
}
g_system->updateScreen();
g_system->delayMillis(10);
}
return Common::kNoError;
2020-12-24 16:10:32 -03:00
}
2021-01-10 11:18:55 -03:00
bool PrivateEngine::cursorExit(Common::Point mousePos) {
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
mousePos = mousePos - *_origin;
if (mousePos.x < 0 || mousePos.y < 0)
return false;
ExitInfo e;
bool inside = false;
for (ExitList::iterator it = _exits.begin(); it != _exits.end(); ++it) {
e = *it;
if (e.rect->contains(mousePos)) {
inside = true;
if (e.cursor != NULL)
CursorMan.replaceCursor(_cursors.getVal(*e.cursor), 32, 32, 0, 0, 0, true);
}
}
//if (!inside)
// CursorMan.replaceCursor(_cursors.getVal("default"), 11, 16, 0, 0, 0, true);
return inside;
}
bool PrivateEngine::cursorMask(Common::Point mousePos) {
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
mousePos = mousePos - *_origin;
if (mousePos.x < 0 || mousePos.y < 0)
return false;
MaskInfo m;
bool inside = false;
for (MaskList::iterator it = _masks.begin(); it != _masks.end(); ++it) {
m = *it;
if (mousePos.x > m.surf->h || mousePos.y > m.surf->w)
continue;
2021-01-10 11:18:55 -03:00
//debug("Testing mask %s", m.nextSetting->c_str());
if ( *((uint32*) m.surf->getBasePtr(mousePos.x, mousePos.y)) != _transparentColor) {
//debug("Inside!");
if (m.nextSetting != NULL) { // TODO: check this
inside = true;
debug("Rendering cursor mask %s", m.cursor->c_str());
assert(_cursors.contains(*m.cursor));
CursorMan.replaceCursor(_cursors.getVal(*m.cursor), 32, 32, 0, 0, 0, true);
break;
}
}
}
//if (!inside)
// CursorMan.replaceCursor(_cursors.getVal("default"), 11, 16, 0, 0, 0, true);
return inside;
}
void PrivateEngine::selectExit(Common::Point mousePos) {
2021-01-10 11:18:55 -03:00
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
2021-01-09 19:11:41 -03:00
mousePos = mousePos - *_origin;
2021-01-10 11:18:55 -03:00
if (mousePos.x < 0 || mousePos.y < 0)
return;
Common::String *ns = NULL;
2021-01-08 22:42:34 -03:00
int rs = 100000000;
int cs = 0;
2021-01-08 22:42:34 -03:00
ExitInfo e;
for (ExitList::iterator it = _exits.begin(); it != _exits.end(); ++it) {
e = *it;
2021-01-09 19:11:41 -03:00
cs = e.rect->width()*e.rect->height();
2021-01-10 11:18:55 -03:00
//debug("Testing exit %s %d", e.nextSetting->c_str(), cs);
if (e.rect->contains(mousePos)) {
2021-01-09 19:11:41 -03:00
debug("Inside! %d %d", cs, rs);
2021-01-08 22:42:34 -03:00
if (cs < rs && e.nextSetting != NULL) { // TODO: check this
debug("Found Exit %s %d", e.nextSetting->c_str(), cs);
rs = cs;
ns = e.nextSetting;
}
}
}
2021-01-08 22:42:34 -03:00
if (ns != NULL) {
debug("Exit selected %s", ns->c_str());
_nextSetting = ns;
2021-01-08 22:42:34 -03:00
}
}
2021-01-08 22:42:34 -03:00
void PrivateEngine::selectMask(Common::Point mousePos) {
2021-01-09 16:11:30 -03:00
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
mousePos = mousePos - *_origin;
2021-01-10 11:18:55 -03:00
if (mousePos.x < 0 || mousePos.y < 0)
return;
2021-01-08 22:42:34 -03:00
Common::String *ns = NULL;
MaskInfo m;
for (MaskList::iterator it = _masks.begin(); it != _masks.end(); ++it) {
m = *it;
2021-01-09 19:11:41 -03:00
2021-01-10 11:18:55 -03:00
//debug("Testing mask %s", m.nextSetting->c_str());
2021-01-08 22:42:34 -03:00
if ( *((uint32*) m.surf->getBasePtr(mousePos.x, mousePos.y)) != _transparentColor) {
2021-01-09 19:11:41 -03:00
debug("Inside!");
2021-01-08 22:42:34 -03:00
if (m.nextSetting != NULL) { // TODO: check this
debug("Found Mask %s", m.nextSetting->c_str());
ns = m.nextSetting;
}
2021-01-10 15:38:10 -03:00
if (m.flag != NULL) { // TODO: check this
setSymbol(m.flag, 1);
}
break;
2021-01-08 22:42:34 -03:00
}
}
if (ns != NULL) {
debug("Mask selected %s", ns->c_str());
_nextSetting = ns;
}
}
2021-01-12 20:49:12 -03:00
void PrivateEngine::selectLoadGame(Common::Point mousePos) {
if (_loadGameMask == NULL)
return;
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
mousePos = mousePos - *_origin;
if (mousePos.x < 0 || mousePos.y < 0)
return;
//debug("Testing mask %s", m.nextSetting->c_str());
if ( *((uint32*) _loadGameMask->surf->getBasePtr(mousePos.x, mousePos.y)) != _transparentColor) {
//debug("loadGame!");
loadGameDialog();
}
}
bool PrivateEngine::cursorLoadGame(Common::Point mousePos) {
if (_loadGameMask == NULL)
return false;
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
mousePos = mousePos - *_origin;
if (mousePos.x < 0 || mousePos.y < 0)
return false;
if (mousePos.x > _loadGameMask->surf->h || mousePos.y > _loadGameMask->surf->w)
return false;
if ( *((uint32*) _loadGameMask->surf->getBasePtr(mousePos.x, mousePos.y)) != _transparentColor) {
assert(_cursors.contains(*_loadGameMask->cursor));
CursorMan.replaceCursor(_cursors.getVal(*_loadGameMask->cursor), 32, 32, 0, 0, 0, true);
return true;
}
return false;
}
void PrivateEngine::selectSaveGame(Common::Point mousePos) {
if (_saveGameMask == NULL)
return;
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
mousePos = mousePos - *_origin;
if (mousePos.x < 0 || mousePos.y < 0)
return;
//debug("Testing mask %s", m.nextSetting->c_str());
if ( *((uint32*) _saveGameMask->surf->getBasePtr(mousePos.x, mousePos.y)) != _transparentColor) {
saveGameDialog();
}
}
bool PrivateEngine::cursorSaveGame(Common::Point mousePos) {
if (_saveGameMask == NULL)
return false;
//debug("Mousepos %d %d", mousePos.x, mousePos.y);
mousePos = mousePos - *_origin;
if (mousePos.x < 0 || mousePos.y < 0)
return false;
if (mousePos.x > _saveGameMask->surf->h || mousePos.y > _saveGameMask->surf->w)
return false;
if ( *((uint32*) _saveGameMask->surf->getBasePtr(mousePos.x, mousePos.y)) != _transparentColor) {
assert(_cursors.contains(*_saveGameMask->cursor));
CursorMan.replaceCursor(_cursors.getVal(*_saveGameMask->cursor), 32, 32, 0, 0, 0, true);
return true;
}
return false;
}
2020-12-24 16:10:32 -03:00
bool PrivateEngine::hasFeature(EngineFeature f) const {
return
2021-01-10 15:38:10 -03:00
(f == kSupportsReturnToLauncher);
2020-12-24 16:10:32 -03:00
}
Common::Error PrivateEngine::loadGameStream(Common::SeekableReadStream *stream) {
Common::Serializer s(stream, nullptr);
2021-01-12 20:49:12 -03:00
debug("loadGameStream");
_nextSetting = new Common::String("kMainDesktop");
//for (SymbolMap::iterator it = variables.begin(); it != variables.end(); ++it)
// debug("%s %s", it->_key.c_str(), it->_value->name->c_str());
Common::String *key = new Common::String();
int val;
for (VariableList::iterator it = variableList.begin(); it != variableList.end(); ++it) {
//Common::String key = *it;
//debug("key: %s", key.c_str());
s.syncAsUint32LE(val);
Private::Symbol *sym = variables.getVal(*it);
sym->u.val = val;
}
//syncGameStream(s);
return Common::kNoError;
2020-12-24 16:10:32 -03:00
}
Common::Error PrivateEngine::saveGameStream(Common::WriteStream *stream, bool isAutosave) {
2021-01-12 20:49:12 -03:00
debug("saveGameStream %d", isAutosave);
if (isAutosave)
return Common::kNoError;
//Common::Serializer s(nullptr, stream);
//short type;
//assert(_nextSetting->matchString("kMainDesktop"));
for (VariableList::iterator it = variableList.begin(); it != variableList.end(); ++it) {
//Common::String key = *it;
//debug("key: %s", key.c_str());
Private::Symbol *sym = variables.getVal(*it);
stream->writeUint32LE(sym->u.val);
}
return Common::kNoError;
2020-12-24 16:10:32 -03:00
}
void PrivateEngine::syncGameStream(Common::Serializer &s) {
2021-01-12 20:49:12 -03:00
debug("syncGameStream");
// Use methods of Serializer to save/load fields
2021-01-12 20:49:12 -03:00
//int dummy = 0;
//s.syncString(*_currentSetting);
2020-12-24 16:10:32 -03:00
}
2021-01-07 23:32:17 -03:00
Common::String PrivateEngine::convertPath(Common::String name) {
Common::String path(name);
Common::String s1("\\");
Common::String s2("/");
2021-01-07 23:32:17 -03:00
while (path.contains(s1))
Common::replace(path, s1, s2);
2021-01-07 23:32:17 -03:00
s1 = Common::String("\"");
s2 = Common::String("");
2021-01-07 23:32:17 -03:00
Common::replace(path, s1, s2);
Common::replace(path, s1, s2);
path.toLowercase();
return path;
2021-01-07 23:32:17 -03:00
}
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::File *file = new Common::File();
Common::String path = convertPath(name);
if (!file->open(path))
error("unable to find sound file %s", path.c_str());
2020-12-24 19:02:12 -03:00
2021-01-09 16:11:30 -03:00
Audio::LoopingAudioStream *stream;
stream = new Audio::LoopingAudioStream(Audio::makeWAVStream(file, DisposeAfterUse::YES), 1);
stopSound();
_mixer->playStream(Audio::Mixer::kSFXSoundType, &_soundHandle, stream, -1, Audio::Mixer::kMaxChannelVolume);
2020-12-24 19:02:12 -03:00
}
void PrivateEngine::playVideo(const Common::String &name) {
2021-01-08 22:42:34 -03:00
debug("%s : %s", __FUNCTION__, name.c_str());
Common::File *file = new Common::File();
Common::String path = convertPath(name);
2021-01-04 08:14:40 -03:00
if (!file->open(path))
error("unable to find video file %s", path.c_str());
2020-12-24 19:02:12 -03:00
if (!_videoDecoder->loadStream(file))
error("unable to load video %s", path.c_str());
_videoDecoder->start();
2020-12-24 19:02:12 -03:00
}
2021-01-09 16:11:30 -03:00
void PrivateEngine::skipVideo() {
_videoDecoder->close();
delete _videoDecoder;
_videoDecoder = nullptr;
}
2020-12-24 19:02:12 -03:00
void PrivateEngine::stopSound() {
debugC(3, kPrivateDebugExample, "%s", __FUNCTION__);
if (_mixer->isSoundHandleActive(_soundHandle))
_mixer->stopHandle(_soundHandle);
2020-12-24 19:02:12 -03:00
}
2021-01-09 16:11:30 -03:00
void PrivateEngine::loadImage(const Common::String &name, int x, int y, bool drawn) {
debugC(1, kPrivateDebugExample, "%s : %s", __FUNCTION__, name.c_str());
Common::File file;
Common::String path = convertPath(name);
if (!file.open(path))
error("unable to load image %s", path.c_str());
_image->loadStream(file);
//debug("palette %d %d", _image->getPaletteStartIndex(), _image->getPaletteColorCount());
//for (int i = 0; i < 30; i=i+3)
// debug("%x %x %x", *(_image->getPalette()+i), *(_image->getPalette()+i+1), *(_image->getPalette()+i+2));
2021-01-09 16:11:30 -03:00
_compositeSurface->transBlitFrom(*_image->getSurface()->convertTo(_pixelFormat, _image->getPalette()), *_origin + Common::Point(x,y), _transparentColor);
drawScreen();
}
2021-01-09 16:11:30 -03:00
void PrivateEngine::drawScreenFrame() {
Common::File file;
Common::String path = convertPath(*_frame);
if (!file.open(path))
error("unable to load image %s", path.c_str());
_image->loadStream(file);
_compositeSurface->transBlitFrom(*_image->getSurface()->convertTo(_pixelFormat, _image->getPalette()), Common::Point(0,0));
//drawScreen();
}
2021-01-08 22:42:34 -03:00
Graphics::ManagedSurface *PrivateEngine::loadMask(const Common::String &name, int x, int y, bool drawn) {
debugC(1, kPrivateDebugExample, "%s : %s", __FUNCTION__, name.c_str());
Common::File file;
Common::String path = convertPath(name);
if (!file.open(path))
error("unable to load mask %s", path.c_str());
_image->loadStream(file);
Graphics::ManagedSurface *surf = new Graphics::ManagedSurface();
surf->create(_screenW, _screenH, _pixelFormat);
surf->transBlitFrom(*_image->getSurface()->convertTo(_pixelFormat, _image->getPalette()), Common::Point(x,y));
if (drawn) {
2021-01-10 11:18:55 -03:00
_compositeSurface->transBlitFrom(surf->rawSurface(), *_origin + Common::Point(x,y), _transparentColor);
2021-01-08 22:42:34 -03:00
drawScreen();
}
2021-01-09 19:11:41 -03:00
return surf;
2021-01-08 22:42:34 -03:00
}
2021-01-10 20:17:27 -03:00
void PrivateEngine::drawScreen() {
2021-01-10 11:18:55 -03:00
Graphics::Surface *screen = g_system->lockScreen();
Graphics::ManagedSurface *surface = _compositeSurface;
int w = surface->w;
int h = surface->h;
if (_videoDecoder) {
Graphics::Surface *frame = new Graphics::Surface;
frame->create(_screenW, _screenH, _pixelFormat);
frame->copyFrom(*_videoDecoder->decodeNextFrame());
const Common::Point o(_origin->x, _origin->y);
surface->transBlitFrom(*frame->convertTo(_pixelFormat, _videoDecoder->getPalette()), o);
}
2021-01-08 22:42:34 -03:00
2021-01-10 11:18:55 -03:00
assert(w == _screenW && h == _screenH);
2021-01-08 22:42:34 -03:00
2021-01-10 11:18:55 -03:00
screen->copyRectToSurface(*surface, 0, 0, Common::Rect(0, 0, _screenW, _screenH));
g_system->unlockScreen();
//if (_image->getPalette() != nullptr)
// g_system->getPaletteManager()->setPalette(_image->getPalette(), _image->getPaletteStartIndex(), _image->getPaletteColorCount());
//if (_image->getPalette() != nullptr)
// g_system->getPaletteManager()->setPalette(_image->getPalette(), 0, 256);
//g_system->getPaletteManager()->setPalette(_videoDecoder->getPalette(), 0, 256);
g_system->updateScreen();
2020-12-24 19:02:12 -03:00
}
2021-01-10 15:38:10 -03:00
bool PrivateEngine::getRandomBool(uint p) {
uint r = _rnd->getRandomNumber(100);
2021-01-10 20:17:27 -03:00
return (r <= p);
2021-01-10 15:38:10 -03:00
}
2020-12-24 19:02:12 -03:00
2020-12-24 16:10:32 -03:00
} // End of namespace Private