SUPERNOVA: Enables debug console and preload images

This commit is contained in:
Joseph-Eugene Winzer 2017-06-23 19:48:26 +02:00 committed by Thierry Crozat
parent 5ebe90a45e
commit 018cff8c42
6 changed files with 123 additions and 68 deletions

View File

@ -27,20 +27,60 @@
namespace Supernova {
Console::Console(SupernovaEngine *vm)
Console::Console(SupernovaEngine *vm, GameManager *gm)
{
registerCmd("test", WRAP_METHOD(Console, cmdTest));
registerCmd("render", WRAP_METHOD(Console, cmdRenderImage));
registerCmd("play", WRAP_METHOD(Console, cmdPlaySound));
registerCmd("list", WRAP_METHOD(Console, cmdList));
registerCmd("inventory", WRAP_METHOD(Console, cmdInventory));
_vm = vm;
_gm = gm;
}
bool Console::cmdTest(int argc, const char **argv)
{
if (argc == 2) {
debugPrintf("Success!");
bool Console::cmdRenderImage(int argc, const char **argv) {
if (argc != 3) {
debugPrintf("Usage: render [filenumber] [section]\n");
return true;
} else {
debugPrintf("Failure!");
return false;
}
int filenumber = atoi(argv[1]);
int section = atoi(argv[2]);
_vm->renderImage(atoi(argv[1]), atoi(argv[2]));
return true;
}
bool Console::cmdPlaySound(int argc, const char **argv) {
if (argc != 3) {
debugPrintf("Usage: play [filenumber] [offset]\n");
return true;
}
int filenumber = atoi(argv[1]);
int offset = atoi(argv[2]);
_vm->playSound(filenumber, offset);
return true;
}
bool Console::cmdList(int argc, const char **argv) {
// Objects in room and sections
return true;
}
bool Console::cmdInventory(int argc, const char **argv) {
if (argc != 2 || argc != 3) {
debugPrintf("Usage: inventory [list][add/remove [object]]");
return true;
}
// TODO
return true;
}
}

View File

@ -28,6 +28,7 @@
namespace Supernova {
class SupernovaEngine;
class GameManager;
enum {
kDebugGeneral = 1 << 0
@ -35,12 +36,16 @@ enum {
class Console : public GUI::Debugger {
public:
Console(Supernova::SupernovaEngine *vm);
Console(Supernova::SupernovaEngine *vm, Supernova::GameManager *gm);
virtual ~Console() {}
bool cmdTest(int argc, const char **argv);
bool cmdRenderImage(int argc, const char **argv);
bool cmdPlaySound(int argc, const char **argv);
bool cmdList(int argc, const char **argv);
bool cmdInventory(int argc, const char **argv);
private:
SupernovaEngine *_vm;
GameManager *_gm;
};
}

View File

@ -41,6 +41,18 @@ MSNImageDecoder::~MSNImageDecoder() {
destroy();
}
bool MSNImageDecoder::init(int filenumber) {
Common::File file;
if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
error("File %s could not be read!", file.getName());
}
_filenumber = filenumber;
loadStream(file);
return true;
}
bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
destroy();
@ -68,13 +80,13 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
}
}
byte numSections = stream.readByte();
_numSections = stream.readByte();
for (size_t i = 0; i < kMaxSections; ++i) {
_section[i].addressHigh = 0xff;
_section[i].addressLow = 0xffff;
_section[i].x2 = 0;
}
for (int i = 0; i < numSections; ++i) {
for (int i = 0; i < _numSections; ++i) {
_section[i].x1 = stream.readUint16LE();
_section[i].x2 = stream.readUint16LE();
_section[i].y1 = stream.readByte();
@ -84,8 +96,8 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
_section[i].addressHigh = stream.readByte();
}
byte numClickFields = stream.readByte();
for (int i = 0; i < numClickFields; ++i) {
_numClickFields = stream.readByte();
for (int i = 0; i < _numClickFields; ++i) {
_clickField[i].x1 = stream.readUint16LE();
_clickField[i].x2 = stream.readUint16LE();
_clickField[i].y1 = stream.readByte();
@ -101,7 +113,7 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
byte input = 0;
size_t i = 0;
// wat
while (stream.read(&input, 1)) {
if (input < numRepeat) {
++input;
@ -123,13 +135,16 @@ bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
return true;
}
bool MSNImageDecoder::loadSection(int filenumber, int section) {
bool MSNImageDecoder::loadSection(int section) {
int imageWidth = 320;
int imageHeight = 200;
_surface = new Graphics::Surface;
_filenumber = filenumber;
if (filenumber == 1 || filenumber == 2) {
if (_surface)
_surface->free();
_surface = new Graphics::Surface;
if (_filenumber == 1 || _filenumber == 2) {
imageWidth = 640;
imageHeight = 480;
_pitch = 640;

View File

@ -46,13 +46,16 @@ public:
virtual const Graphics::Surface *getSurface() const { return _surface; }
virtual const byte *getPalette() const { return _palette; }
bool loadSection(int filenumber, int section);
bool loadSection(int section);
bool init(int filenumber);
static const int kMaxSections = 50;
static const int kMaxClickFields = 80;
int _filenumber;
int _pitch;
int _numSections;
int _numClickFields;
Graphics::Surface *_surface;
byte *_palette;
byte *_encodedImage;

View File

@ -70,6 +70,7 @@ ObjectType &operator^=(ObjectType &a, ObjectType b) {
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
, _currentImage(_images)
, _brightness(255)
, _menuBrightness(255)
, _imageIndex(0)
@ -95,12 +96,12 @@ SupernovaEngine::~SupernovaEngine() {
Common::Error SupernovaEngine::run() {
initGraphics(kScreenWidth, kScreenHeight);
_console = new Console(this);
GameManager gm(this, &_event);
_console = new Console(this, &gm);
initData();
initPalette();
paletteFadeIn();
GameManager gm(this, &_event);
CursorMan.showMouse(true);
@ -117,23 +118,6 @@ Common::Error SupernovaEngine::run() {
if (_event.kbd.keycode == Common::KEYCODE_d && _event.kbd.hasFlags(Common::KBD_CTRL)) {
_console->attach();
}
if (_event.kbd.keycode == Common::KEYCODE_q) {
playSound(48, 13530);
}
if (_event.kbd.keycode == Common::KEYCODE_RIGHT) {
++_imageIndex;
_sectionIndex = 0;
}
if (_event.kbd.keycode == Common::KEYCODE_LEFT) {
--_imageIndex;
_sectionIndex = 0;
}
if (_event.kbd.keycode == Common::KEYCODE_UP) {
++_sectionIndex;
}
if (_event.kbd.keycode == Common::KEYCODE_DOWN) {
--_sectionIndex;
}
break;
case Common::EVENT_LBUTTONUP:
@ -151,10 +135,9 @@ Common::Error SupernovaEngine::run() {
// gm.processInput();
}
renderImage(_imageIndex, _sectionIndex, true);
_console->onFrame();
renderText(Common::String::format("%3d | %3d", _imageIndex, _sectionIndex).c_str(),
10, 190, kColorLightGreen);
_console->onFrame();
_system->updateScreen();
_system->delayMillis(_delay);
}
@ -179,6 +162,11 @@ void SupernovaEngine::updateEvents() {
}
void SupernovaEngine::initData() {
// Images
for (int i = 0; i < 44; ++i)
_images[i].init(i);
// Sound
}
void SupernovaEngine::initPalette() {
@ -202,44 +190,46 @@ void SupernovaEngine::stopSound() {
_mixer->stopHandle(_soundHandle);
}
void playSoundMod(int filenumber)
void SupernovaEngine::playSoundMod(int filenumber)
{
if (filenumber != 49 || filenumber != 52) {
error("File not supposed to be played!");
}
Common::File *file = new Common::File;
if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
if (!file->open(Common::String::format("msn_data.%03d", filenumber))) {
error("File %s could not be read!", file->getName());
}
// play Supernova MOD file
}
void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
Common::File file;
if (!file.open(Common::String::format("msn_data.%03d", filenumber))) {
error("File %s could not be read!", file.getName());
}
void SupernovaEngine::renderImage(MSNImageDecoder &image, int section, bool fullscreen) {
_currentImage = &image;
_imageIndex = image._filenumber;
_sectionIndex = section;
if (_currentImage.loadStream(file) && _currentImage.loadSection(filenumber, section)) {
_system->getPaletteManager()->setPalette(_currentImage.getPalette(), 16, 239);
paletteBrightness();
if (fullscreen) {
_system->copyRectToScreen(_currentImage.getSurface()->getPixels(),
_currentImage._pitch, 0, 0, kScreenWidth, kScreenHeight);
} else {
size_t offset = _currentImage._section[section].y1 * 320 + _currentImage._section[section].x1;
_system->copyRectToScreen(static_cast<const byte *>(_currentImage.getSurface()->getPixels()) + offset,
320,
_currentImage._section[section].x1,
_currentImage._section[section].y1,
_currentImage._section[section].x2 - _currentImage._section[section].x1,
_currentImage._section[section].y2 - _currentImage._section[section].y1);
}
image.loadSection(section);
_system->getPaletteManager()->setPalette(image.getPalette(), 16, 239);
paletteBrightness();
if (fullscreen) {
_system->copyRectToScreen(image.getSurface()->getPixels(),
image._pitch, 0, 0, kScreenWidth, kScreenHeight);
} else {
size_t offset = image._section[section].y1 * 320 + image._section[section].x1;
_system->copyRectToScreen(static_cast<const byte *>(image.getSurface()->getPixels()) + offset,
320,
image._section[section].x1,
image._section[section].y1,
image._section[section].x2 - image._section[section].x1,
image._section[section].y2 - image._section[section].y1);
}
}
void SupernovaEngine::renderImage(int filenumber, int section, bool fullscreen) {
renderImage(_images[filenumber], section, fullscreen);
}
void SupernovaEngine::saveScreen(int x, int y, int width, int height) {
_screenBuffer.push(x, y, width, height);
}
@ -410,8 +400,8 @@ void SupernovaEngine::paletteBrightness() {
}
for (size_t i = 0; i < 717; ++i) {
const byte *imagePalette;
if (_currentImage.getPalette()) {
imagePalette = _currentImage.getPalette();
if (_currentImage->getPalette()) {
imagePalette = _currentImage->getPalette();
} else {
imagePalette = palette;
}

View File

@ -80,7 +80,8 @@ public:
Console *_console;
Audio::SoundHandle _soundHandle;
ScreenBufferStack _screenBuffer;
MSNImageDecoder _currentImage;
MSNImageDecoder _images[44];
MSNImageDecoder *_currentImage;
Common::Event _event;
bool _gameRunning;
@ -104,6 +105,7 @@ public:
void playSound(int filenumber, int offset = 0);
void playSoundMod(int filenumber);
void stopSound();
void renderImage(MSNImageDecoder &image, int section, bool fullscreen = false);
void renderImage(int filenumber, int section, bool fullscreen = false);
void saveScreen(int x, int y, int width, int height);
void restoreScreen();