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"
|
2021-01-02 14:19:23 -03:00
|
|
|
#include "common/str.h"
|
2020-12-24 16:10:32 -03:00
|
|
|
|
|
|
|
#include "engines/util.h"
|
|
|
|
|
2021-01-02 14:19:23 -03:00
|
|
|
#include "image/bmp.h"
|
2021-01-07 23:10:19 -03:00
|
|
|
#include "graphics/cursorman.h"
|
2021-01-02 14:19:23 -03:00
|
|
|
|
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"
|
|
|
|
|
2020-12-24 16:10:32 -03:00
|
|
|
namespace Private {
|
|
|
|
|
2021-01-07 23:32:17 -03:00
|
|
|
PrivateEngine *g_private = NULL;
|
2021-01-07 23:10:19 -03:00
|
|
|
|
2020-12-30 17:25:02 -03:00
|
|
|
extern int parse(char*);
|
|
|
|
|
2021-01-07 23:10:19 -03:00
|
|
|
static const byte MOUSECURSOR_SCI[] = {
|
2021-01-07 23:38:18 -03:00
|
|
|
1,1,0,0,0,0,0,0,0,0,0,
|
|
|
|
1,2,1,0,0,0,0,0,0,0,0,
|
|
|
|
1,2,2,1,0,0,0,0,0,0,0,
|
|
|
|
1,2,2,2,1,0,0,0,0,0,0,
|
|
|
|
1,2,2,2,2,1,0,0,0,0,0,
|
|
|
|
1,2,2,2,2,2,1,0,0,0,0,
|
|
|
|
1,2,2,2,2,2,2,1,0,0,0,
|
|
|
|
1,2,2,2,2,2,2,2,1,0,0,
|
|
|
|
1,2,2,2,2,2,2,2,2,1,0,
|
|
|
|
1,2,2,2,2,2,2,2,2,2,1,
|
|
|
|
1,2,2,2,2,2,1,0,0,0,0,
|
|
|
|
1,2,1,0,1,2,2,1,0,0,0,
|
|
|
|
1,1,0,0,1,2,2,1,0,0,0,
|
|
|
|
0,0,0,0,0,1,2,2,1,0,0,
|
|
|
|
0,0,0,0,0,1,2,2,1,0,0,
|
|
|
|
0,0,0,0,0,0,1,2,2,1,0
|
2021-01-07 23:10:19 -03:00
|
|
|
};
|
|
|
|
|
|
|
|
static const byte cursorPalette[] = {
|
2021-01-07 23:38:18 -03:00
|
|
|
0, 0, 0, // Black / Transparent
|
|
|
|
0x80, 0x80, 0x80, // Gray
|
|
|
|
0xff, 0xff, 0xff // White
|
2021-01-07 23:10:19 -03:00
|
|
|
};
|
|
|
|
|
2020-12-24 16:10:32 -03:00
|
|
|
PrivateEngine::PrivateEngine(OSystem *syst)
|
2021-01-07 23:38:18 -03:00
|
|
|
: 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
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
// Do not initialize graphics here
|
|
|
|
// Do not initialize audio devices here
|
2020-12-24 16:10:32 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
// However this is the place to specify all default directories
|
|
|
|
//const Common::FSNode gameDataDir(ConfMan.get("path"));
|
|
|
|
//SearchMan.addSubDirectoryMatching(gameDataDir, "..");
|
2020-12-24 16:10:32 -03:00
|
|
|
|
2021-01-07 23:38:18 -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
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
// Don't forget to register your random source
|
|
|
|
_rnd = new Common::RandomSource("private");
|
2020-12-24 16:10:32 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
g_private = this;
|
2021-01-07 23:32:17 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
_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() {
|
2021-01-07 23:38:18 -03:00
|
|
|
debug("PrivateEngine::~PrivateEngine");
|
2020-12-24 16:10:32 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
// Dispose your resources here
|
|
|
|
delete _rnd;
|
2020-12-24 16:10:32 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
// Remove all of our debug levels here
|
|
|
|
DebugMan.clearAllDebugChannels();
|
2020-12-24 16:10:32 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
Common::Error PrivateEngine::run() {
|
2021-01-07 23:38:18 -03:00
|
|
|
Common::File *file = new Common::File();
|
2021-01-09 16:11:30 -03:00
|
|
|
if (!file->open("GAME.DAT")) // if the full game is not used
|
|
|
|
assert(file->open("assets/GAME.TXT")); // open the demo file
|
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
void *buf = malloc(191000);
|
|
|
|
file->read(buf, 191000);
|
|
|
|
initFuncs();
|
|
|
|
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);
|
2021-01-07 23:38:18 -03:00
|
|
|
initGraphics(_screenW, _screenH, &_pixelFormat);
|
|
|
|
|
|
|
|
CursorMan.replaceCursor(MOUSECURSOR_SCI, 11, 16, 0, 0, 0);
|
|
|
|
CursorMan.replaceCursorPalette(cursorPalette, 0, 3);
|
|
|
|
|
2021-01-08 22:42:34 -03:00
|
|
|
_origin = new Common::Point(0, 0);
|
2021-01-07 23:38:18 -03:00
|
|
|
_image = new Image::BitmapDecoder();
|
|
|
|
_compositeSurface = new Graphics::ManagedSurface();
|
|
|
|
_compositeSurface->create(_screenW, _screenH, _pixelFormat);
|
2021-01-08 22:42:34 -03:00
|
|
|
_compositeSurface->setTransparentColor(_transparentColor);
|
2021-01-07 23:38:18 -03:00
|
|
|
|
|
|
|
// 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();
|
|
|
|
|
|
|
|
_nextSetting = new Common::String("kGoIntro");
|
|
|
|
|
|
|
|
while (!shouldQuit()) {
|
|
|
|
g_system->getEventManager()->pollEvent(event);
|
|
|
|
mousePos = g_system->getEventManager()->getMousePos();
|
|
|
|
|
|
|
|
g_system->delayMillis(10);
|
|
|
|
|
|
|
|
// Events
|
|
|
|
switch (event.type) {
|
2021-01-09 16:11:30 -03:00
|
|
|
case Common::EVENT_KEYDOWN:
|
|
|
|
if (event.kbd.keycode == Common::KEYCODE_ESCAPE && _videoDecoder)
|
|
|
|
skipVideo();
|
|
|
|
break;
|
|
|
|
|
2021-01-08 22:42:34 -03:00
|
|
|
case Common::EVENT_QUIT:
|
|
|
|
case Common::EVENT_RETURN_TO_LAUNCHER:
|
|
|
|
break;
|
2021-01-07 23:38:18 -03:00
|
|
|
|
2021-01-08 22:42:34 -03:00
|
|
|
case Common::EVENT_LBUTTONDOWN:
|
|
|
|
selectMask(mousePos);
|
2021-01-09 16:11:30 -03:00
|
|
|
if (!_nextSetting)
|
|
|
|
selectExit(mousePos);
|
|
|
|
g_system->delayMillis(30);
|
2021-01-08 22:42:34 -03:00
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
{}
|
2021-01-07 23:38:18 -03:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
// 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 16:11:30 -03:00
|
|
|
if (_nextSetting != NULL) {
|
2021-01-07 23:38:18 -03:00
|
|
|
debug("Executing %s", _nextSetting->c_str());
|
|
|
|
_exits.clear();
|
2021-01-08 22:42:34 -03:00
|
|
|
_masks.clear();
|
2021-01-07 23:38:18 -03:00
|
|
|
loadSetting(_nextSetting);
|
|
|
|
_nextSetting = NULL;
|
|
|
|
CursorMan.showMouse(false);
|
|
|
|
execute(prog);
|
|
|
|
CursorMan.showMouse(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
g_system->updateScreen();
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return Common::kNoError;
|
2020-12-24 16:10:32 -03:00
|
|
|
}
|
|
|
|
|
2021-01-07 23:10:19 -03:00
|
|
|
void PrivateEngine::selectExit(Common::Point mousePos) {
|
2021-01-09 16:11:30 -03:00
|
|
|
debug("Mousepos %d %d", mousePos.x, mousePos.y);
|
|
|
|
mousePos = mousePos - *_origin;
|
2021-01-07 23:38:18 -03:00
|
|
|
Common::String *ns = NULL;
|
2021-01-08 22:42:34 -03:00
|
|
|
int rs = 100000000;
|
2021-01-07 23:38:18 -03:00
|
|
|
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;
|
|
|
|
cs = e.rect->width()*e.rect->height();
|
2021-01-09 16:11:30 -03:00
|
|
|
debug("Testing exit %s %d", e.nextSetting->c_str(), cs);
|
2021-01-07 23:38:18 -03:00
|
|
|
if (e.rect->contains(mousePos)) {
|
2021-01-09 16:11:30 -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);
|
2021-01-07 23:38:18 -03:00
|
|
|
rs = cs;
|
|
|
|
ns = e.nextSetting;
|
|
|
|
}
|
|
|
|
|
2021-01-07 23:10:19 -03:00
|
|
|
}
|
2021-01-07 23:38:18 -03:00
|
|
|
}
|
2021-01-08 22:42:34 -03:00
|
|
|
if (ns != NULL) {
|
|
|
|
debug("Exit selected %s", ns->c_str());
|
2021-01-07 23:38:18 -03:00
|
|
|
_nextSetting = ns;
|
2021-01-08 22:42:34 -03:00
|
|
|
}
|
2021-01-07 23:10:19 -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-08 22:42:34 -03:00
|
|
|
Common::String *ns = NULL;
|
|
|
|
MaskInfo m;
|
|
|
|
for (MaskList::iterator it = _masks.begin(); it != _masks.end(); ++it) {
|
|
|
|
m = *it;
|
|
|
|
|
|
|
|
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
|
|
|
|
debug("Found Mask %s", m.nextSetting->c_str());
|
|
|
|
ns = m.nextSetting;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ns != NULL) {
|
|
|
|
debug("Mask selected %s", ns->c_str());
|
|
|
|
_nextSetting = ns;
|
|
|
|
}
|
|
|
|
}
|
2021-01-07 23:10:19 -03:00
|
|
|
|
2020-12-24 16:10:32 -03:00
|
|
|
bool PrivateEngine::hasFeature(EngineFeature f) const {
|
2021-01-07 23:38:18 -03:00
|
|
|
return
|
|
|
|
(f == kSupportsReturnToLauncher) ||
|
|
|
|
(f == kSupportsLoadingDuringRuntime) ||
|
|
|
|
(f == kSupportsSavingDuringRuntime);
|
2020-12-24 16:10:32 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
Common::Error PrivateEngine::loadGameStream(Common::SeekableReadStream *stream) {
|
2021-01-07 23:38:18 -03:00
|
|
|
Common::Serializer s(stream, nullptr);
|
|
|
|
syncGameStream(s);
|
|
|
|
return Common::kNoError;
|
2020-12-24 16:10:32 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
Common::Error PrivateEngine::saveGameStream(Common::WriteStream *stream, bool isAutosave) {
|
2021-01-07 23:38:18 -03:00
|
|
|
Common::Serializer s(nullptr, stream);
|
|
|
|
syncGameStream(s);
|
|
|
|
return Common::kNoError;
|
2020-12-24 16:10:32 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
void PrivateEngine::syncGameStream(Common::Serializer &s) {
|
2021-01-07 23:38:18 -03:00
|
|
|
// Use methods of Serializer to save/load fields
|
|
|
|
int dummy = 0;
|
|
|
|
s.syncAsUint16LE(dummy);
|
2020-12-24 16:10:32 -03:00
|
|
|
}
|
|
|
|
|
2021-01-07 23:32:17 -03:00
|
|
|
Common::String PrivateEngine::convertPath(Common::String name) {
|
2021-01-07 23:38:18 -03:00
|
|
|
Common::String path(name);
|
|
|
|
Common::String s1("\\");
|
|
|
|
Common::String s2("/");
|
2021-01-07 23:32:17 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
while (path.contains(s1))
|
|
|
|
Common::replace(path, s1, s2);
|
2021-01-07 23:32:17 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
s1 = Common::String("\"");
|
|
|
|
s2 = Common::String("");
|
2021-01-07 23:32:17 -03:00
|
|
|
|
2021-01-07 23:38:18 -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) {
|
2021-01-07 23:38:18 -03:00
|
|
|
debugC(1, kPrivateDebugExample, "%s : %s", __FUNCTION__, name.c_str());
|
2021-01-02 10:22:07 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
Common::File *file = new Common::File();
|
|
|
|
Common::String path = convertPath(name);
|
2021-01-02 14:19:23 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
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);
|
2021-01-07 23:38:18 -03:00
|
|
|
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());
|
2021-01-07 23:38:18 -03:00
|
|
|
Common::File *file = new Common::File();
|
|
|
|
Common::String path = convertPath(name);
|
2021-01-04 08:14:40 -03:00
|
|
|
|
2021-01-07 23:38:18 -03:00
|
|
|
if (!file->open(path))
|
|
|
|
error("unable to find video file %s", path.c_str());
|
2020-12-24 19:02:12 -03:00
|
|
|
|
2021-01-07 23:38:18 -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() {
|
2021-01-07 23:38:18 -03:00
|
|
|
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) {
|
2021-01-07 23:38:18 -03:00
|
|
|
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);
|
2021-01-07 23:38:18 -03:00
|
|
|
drawScreen();
|
2021-01-02 14:19:23 -03:00
|
|
|
}
|
|
|
|
|
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) {
|
|
|
|
_compositeSurface->transBlitFrom(surf->rawSurface(), Common::Point(x,y), _transparentColor);
|
|
|
|
drawScreen();
|
|
|
|
}
|
|
|
|
|
|
|
|
return surf;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2021-01-02 14:19:23 -03:00
|
|
|
|
2020-12-24 19:02:12 -03:00
|
|
|
void PrivateEngine::drawScreen() {
|
2021-01-07 23:38:18 -03:00
|
|
|
if (_videoDecoder ? _videoDecoder->needsUpdate() : false || _compositeSurface) {
|
|
|
|
Graphics::Surface *screen = g_system->lockScreen();
|
|
|
|
//screen->fillRect(Common::Rect(0, 0, g_system->getWidth(), g_system->getHeight()), 0);
|
2021-01-09 16:11:30 -03:00
|
|
|
//
|
|
|
|
//if (_mode == 1)
|
|
|
|
// drawScreenFrame();
|
2021-01-07 23:38:18 -03:00
|
|
|
|
|
|
|
Graphics::ManagedSurface *surface = _compositeSurface;
|
|
|
|
|
|
|
|
if (_videoDecoder) {
|
|
|
|
Graphics::Surface *frame = new Graphics::Surface;
|
|
|
|
frame->create(_screenW, _screenH, _pixelFormat);
|
|
|
|
frame->copyFrom(*_videoDecoder->decodeNextFrame());
|
2021-01-08 22:42:34 -03:00
|
|
|
const Common::Point o(_origin->x, _origin->y);
|
|
|
|
surface->transBlitFrom(*frame->convertTo(_pixelFormat, _videoDecoder->getPalette()), o);
|
2021-01-07 23:38:18 -03:00
|
|
|
}
|
|
|
|
|
|
|
|
int w = surface->w; //CLIP<int>(surface->w, 0, _screenW);
|
|
|
|
int h = surface->h; //CLIP<int>(surface->h, 0, _screenH);
|
|
|
|
assert(w == _screenW && h == _screenH);
|
|
|
|
|
|
|
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2020-12-24 16:10:32 -03:00
|
|
|
} // End of namespace Private
|