SUPERNOVA: (TEMP COMMIT) drawing to screen surface

This commit is contained in:
Joseph-Eugene Winzer 2017-06-05 16:27:06 +02:00 committed by Thierry Crozat
parent 64e6673d10
commit ec0d557697
6 changed files with 487 additions and 57 deletions

View file

@ -1,11 +1,162 @@
#include "common/algorithm.h"
#include "common/file.h"
#include "common/stream.h"
#include "common/system.h"
#include "graphics/palette.h"
#include "graphics/surface.h"
#include "graphics.h"
namespace Supernova {
MSNImageDecoder::MSNImageDecoder()
{
: _surface(NULL)
, _palette(NULL) {
}
MSNImageDecoder::~MSNImageDecoder()
{
MSNImageDecoder::~MSNImageDecoder() {
destroy();
}
bool MSNImageDecoder::loadStream(Common::SeekableReadStream &stream) {
destroy();
size_t size = 0;
size = (stream.readUint16LE() + 0xF) >> 4;
size |= (stream.readUint16LE() & 0xF) << 12;
size += 0x70; // zus_paragraph
size *= 16; // a paragraph is 16 bytes
_encodedImage = new byte[size];
_palette = new byte[768];
g_system->getPaletteManager()->grabPalette(_palette, 0, 256);
byte pal_diff;
byte flag = stream.readByte();
if (flag == 0) {
pal_diff = 0;
_palette[141] = 0x38;
_palette[142] = 0x38;
_palette[143] = 0x38;
} else {
pal_diff = 1;
for (int i = flag * 3; i != 0; --i) {
_palette[717 - i] = stream.readByte();
}
}
g_system->getPaletteManager()->setPalette(_palette, 0, 256);
byte 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) {
_section[i].x1 = stream.readUint16LE();
_section[i].x2 = stream.readUint16LE();
_section[i].y1 = stream.readByte();
_section[i].y2 = stream.readByte();
_section[i].next = stream.readByte();
_section[i].addressLow = stream.readUint16LE();
_section[i].addressHigh = stream.readByte();
}
byte 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();
_clickField[i].y2 = stream.readByte();
_clickField[i].next = stream.readByte();
}
byte zwCodes[256];
byte numRepeat = stream.readByte();
byte numZw = stream.readByte();
stream.read(zwCodes, numZw);
numZw += numRepeat;
byte input = 0;
size_t i = 0;
// wat
while (stream.read(&input, 1)) {
if (input < numRepeat) {
++input;
byte value = stream.readByte();
for (--value; input > 0; --input) {
_encodedImage[i++] = value;
}
} else if (input < numZw) {
input = zwCodes[input];
--input;
_encodedImage[i++] = input;
_encodedImage[i++] = input;
} else {
input -= pal_diff;
_encodedImage[i++] = input;
}
}
return true;
}
bool MSNImageDecoder::loadSection(int section) {
_surface = new Graphics::Surface;
_surface->create(320, 200, g_system->getScreenFormat());
byte *surfacePixels = static_cast<byte *>(_surface->getPixels());
const uint32 kInvalidAddress = 0x00FFFFFF;
size_t image = section;
if (image < 128) {
do {
uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow;
if (offset == kInvalidAddress) {
return false;
}
int width = _section[image].x2 - _section[image].x1 + 1;
int height = _section[image].y2 - _section[image].y1 + 1;
uint32 destAddress = 320 * _section[image].y1 + _section[image].x1;
while (height) {
Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
offset += width;
destAddress += 320;
--height;
}
image = _section[image].next;
} while (image != 0);
} else {
image -= 128;
do {
int width = _section[image].x2 - _section[image].x1 + 1;
int height = _section[image].y2 - _section[image].y1 + 1;
uint32 destAddress = 320 * _section[image].y1 + _section[image].x1;
uint32 offset = (_section[image].addressHigh << 16) + _section[image].addressLow + destAddress;
while (height) {
Common::copy(_encodedImage + offset, _encodedImage + offset + width, surfacePixels + destAddress);
offset += 320;
destAddress += 320;
--height;
}
image = _section[image].next;
} while (image != 0);
}
return true;
}
void MSNImageDecoder::destroy() {
if (_palette) {
delete[] _palette;
_palette = NULL;
}
if (_surface) {
_surface->free();
_surface = NULL;
}
}
}

View file

@ -1,12 +1,35 @@
#ifndef GRAPHICS_H
#define GRAPHICS_H
#include "common/stream.h"
#include "common/scummsys.h"
#include "image/image_decoder.h"
#include "graphics/surface.h"
class MSNImageDecoder : public Image::ImageDecoder
{
namespace Common {
class SeekableReadStream;
}
namespace Graphics {
class Surface;
}
namespace Supernova {
const byte initPalette[48] = {
// r g b
0, 0, 0, 16, 16, 16, 22, 22, 22,
28, 28, 28, 63, 63, 63, 0, 52, 0,
0, 63, 0, 54, 0, 0, 63, 0, 0,
0, 0, 30, 0, 0, 45, 40, 40, 40,
20, 50, 63, 10, 63, 10, 60, 60, 0,
63, 10, 10
};
// TODO
const byte defaultVGAPalette[] = {
0, 0, 0
};
class MSNImageDecoder : public Image::ImageDecoder {
public:
MSNImageDecoder();
virtual ~MSNImageDecoder();
@ -15,10 +38,35 @@ public:
virtual bool loadStream(Common::SeekableReadStream &stream);
virtual const Graphics::Surface *getSurface() const { return _surface; }
virtual const byte *getPalette() const { return _palette; }
bool loadSection(int _section);
private:
const Graphics::Surface *_surface;
static const int kMaxSections = 50;
static const int kMaxClickFields = 80;
Graphics::Surface *_surface;
byte *_palette;
byte *_encodedImage;
struct Section {
int16 x1;
int16 x2;
byte y1;
byte y2;
byte next;
uint16 addressLow;
byte addressHigh;
} _section[kMaxSections];
struct ClickField {
int16 x1;
int16 x2;
byte y1;
byte y2;
byte next;
} _clickField[kMaxClickFields];
};
}
#endif

View file

@ -1,9 +1,10 @@
MODULE := engines/supernova
MODULE_OBJS := \
supernova.o \
console.o \
detection.o
detection.o \
graphics.o \
supernova.o \
MODULE_DIRS += \
engines/supernova

View file

@ -362,4 +362,151 @@ enum {X,
TICKETS};
}
const byte mouseNormal[64] = {
0xff,0x3f,0xff,0x1f,0xff,0x0f,0xff,0x07,
0xff,0x03,0xff,0x01,0xff,0x00,0x7f,0x00,
0x3f,0x00,0x1f,0x00,0x0f,0x00,0x0f,0x00,
0xff,0x00,0x7f,0x18,0x7f,0x38,0x7f,0xfc,
0x00,0x00,0x00,0x40,0x00,0x60,0x00,0x70,
0x00,0x78,0x00,0x7c,0x00,0x7e,0x00,0x7f,
0x80,0x7f,0xc0,0x7f,0xe0,0x7f,0x00,0x7e,
0x00,0x66,0x00,0x43,0x00,0x03,0x00,0x00
};
const byte mouseWait[64] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,
0x01,0x80,0x01,0x80,0x11,0x88,0x31,0x8c,
0x31,0x8c,0x11,0x88,0x01,0x80,0x01,0x80,
0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xfe,0x7f,0xf4,0x2f,0xf4,0x2f,
0x14,0x28,0x24,0x24,0x44,0x22,0x84,0x21,
0x84,0x21,0xc4,0x23,0xe4,0x27,0x74,0x2e,
0x34,0x2c,0x14,0x28,0xfe,0x7f,0x00,0x00
};
char font[][5] =
{
{0x00,0x00,0x00,0xff},
{0x5f,0xff},
{0x03,0x00,0x03,0xff},
{0x14,0x7f,0x14,0x7f,0x14},
{0x24,0x2a,0x7f,0x2a,0x12},
{0x61,0x10,0x08,0x04,0x43},
{0x38,0x4e,0x59,0x26,0x50},
{0x03,0xff},
{0x3e,0x41,0xff},
{0x41,0x3e,0xff},
{0x10,0x54,0x38,0x54,0x10},
{0x10,0x10,0x7c,0x10,0x10},
{0x80,0x40,0xff},
{0x10,0x10,0x10,0x10,0x10},
{0x40,0xff},
{0x60,0x10,0x08,0x04,0x03},
{0x3e,0x41,0x41,0x41,0x3e}, /* digits */
{0x04,0x02,0x7f,0xff},
{0x42,0x61,0x51,0x49,0x46},
{0x22,0x41,0x49,0x49,0x36},
{0x18,0x14,0x12,0x7f,0x10},
{0x27,0x45,0x45,0x45,0x39},
{0x3e,0x49,0x49,0x49,0x32},
{0x01,0x61,0x19,0x07,0x01},
{0x36,0x49,0x49,0x49,0x36},
{0x26,0x49,0x49,0x49,0x3e},
{0x44,0xff},
{0x80,0x44,0xff},
{0x10,0x28,0x44,0xff},
{0x28,0x28,0x28,0x28,0x28},
{0x44,0x28,0x10,0xff},
{0x02,0x01,0x51,0x09,0x06},
{0x3e,0x41,0x5d,0x5d,0x1e},
{0x7c,0x12,0x11,0x12,0x7c}, /* uppercase letters*/
{0x7f,0x49,0x49,0x49,0x36},
{0x3e,0x41,0x41,0x41,0x22},
{0x7f,0x41,0x41,0x22,0x1c},
{0x7f,0x49,0x49,0x49,0xff},
{0x7f,0x09,0x09,0x09,0xff},
{0x3e,0x41,0x41,0x49,0x3a},
{0x7f,0x08,0x08,0x08,0x7f},
{0x41,0x7f,0x41,0xff},
{0x20,0x40,0x40,0x3f,0xff},
{0x7f,0x08,0x14,0x22,0x41},
{0x7f,0x40,0x40,0x40,0xff},
{0x7f,0x02,0x04,0x02,0x7f},
{0x7f,0x02,0x0c,0x10,0x7f},
{0x3e,0x41,0x41,0x41,0x3e},
{0x7f,0x09,0x09,0x09,0x06},
{0x3e,0x41,0x51,0x21,0x5e},
{0x7f,0x09,0x19,0x29,0x46},
{0x26,0x49,0x49,0x49,0x32},
{0x01,0x01,0x7f,0x01,0x01},
{0x3f,0x40,0x40,0x40,0x3f},
{0x07,0x18,0x60,0x18,0x07},
{0x1f,0x60,0x18,0x60,0x1f},
{0x63,0x14,0x08,0x14,0x63},
{0x03,0x04,0x78,0x04,0x03},
{0x61,0x51,0x49,0x45,0x43},
{0x7f,0x41,0x41,0xff},
{0x03,0x04,0x08,0x10,0x60},
{0x41,0x41,0x7f,0xff},
{0x02,0x01,0x02,0xff},
{0x80,0x80,0x80,0x80,0x80},
{0x01,0x02,0xff},
{0x38,0x44,0x44,0x44,0x7c}, /* lowercase letters */
{0x7f,0x44,0x44,0x44,0x38},
{0x38,0x44,0x44,0x44,0x44},
{0x38,0x44,0x44,0x44,0x7f},
{0x38,0x54,0x54,0x54,0x58},
{0x04,0x7e,0x05,0x01,0xff},
{0x98,0xa4,0xa4,0xa4,0x7c},
{0x7f,0x04,0x04,0x04,0x78},
{0x7d,0xff},
{0x80,0x80,0x7d,0xff},
{0x7f,0x10,0x28,0x44,0xff},
{0x7f,0xff},
{0x7c,0x04,0x7c,0x04,0x78},
{0x7c,0x04,0x04,0x04,0x78},
{0x38,0x44,0x44,0x44,0x38},
{0xfc,0x24,0x24,0x24,0x18},
{0x18,0x24,0x24,0x24,0xfc},
{0x7c,0x08,0x04,0x04,0xff},
{0x48,0x54,0x54,0x54,0x24},
{0x04,0x3e,0x44,0x40,0xff},
{0x7c,0x40,0x40,0x40,0x3c},
{0x0c,0x30,0x40,0x30,0x0c},
{0x3c,0x40,0x3c,0x40,0x3c},
{0x44,0x28,0x10,0x28,0x44},
{0x9c,0xa0,0xa0,0xa0,0x7c},
{0x44,0x64,0x54,0x4c,0x44},
{0x08,0x36,0x41,0xff},
{0x77,0xff},
{0x41,0x36,0x08,0xff},
{0x02,0x01,0x02,0x01,0xff},
{0xff},
{0xfe,0x49,0x49,0x4e,0x30}, /* á */
{0x7c,0x41,0x40,0x41,0x3c}, /* umlauts */
{0x04,0x06,0x7f,0x06,0x04}, /* arrows */
{0x20,0x60,0xfe,0x60,0x20},
{0x38,0x45,0x44,0x45,0x7c}, /* umlauts */
{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},{0xff},
{0x79,0x14,0x12,0x14,0x79},
{0xff},{0xff},{0xff},{0xff},{0xff},
{0x38,0x45,0x44,0x45,0x38},
{0xff},{0xff},{0xff},{0xff},
{0x3d,0x42,0x42,0x42,0x3d},
{0x3d,0x40,0x40,0x40,0x3d},
};
#endif // MSN_DEF_H

View file

@ -45,6 +45,7 @@ namespace Supernova {
SupernovaEngine::SupernovaEngine(OSystem *syst)
: Engine(syst)
, _console(NULL)
, _colorIndex(0)
{
// const Common::FSNode gameDataDir(ConfMan.get("path"));
// SearchMan.addSubDirectoryMatching(gameDataDir, "sound");
@ -63,35 +64,20 @@ SupernovaEngine::~SupernovaEngine() {
}
Common::Error SupernovaEngine::run() {
// const Graphics::PixelFormat format(3, 8, 8, 8, 0, 16, 8, 0, 0);
// initGraphics(kScreenWidth, kScreenHeight, &format);
initGraphics(kScreenWidth, kScreenHeight);
debug(_system->getScreenFormat().toString().c_str());
_console = new Console(this);
initPalette();
initData();
bool running = true;
while (running) {
Common::Event event;
while (g_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_QUIT:
case Common::EVENT_RTL:
running = false;
break;
case Common::EVENT_KEYDOWN:
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);
}
break;
default:
break;
}
}
_gameRunning = true;
while (_gameRunning) {
updateEvents();
renderImage(31, 0);
_system->updateScreen();
_system->delayMillis(10);
}
@ -102,20 +88,99 @@ Common::Error SupernovaEngine::run() {
return Common::kNoError;
}
void SupernovaEngine::initData() {
Common::File f;
if (!f.open("msn_data.047")) {
error("File s could not be read!");
}
void SupernovaEngine::updateEvents() {
Common::Event event;
debug("%s\t%u", f.getName(), f.size());
while (g_system->getEventManager()->pollEvent(event)) {
switch (event.type) {
case Common::EVENT_QUIT:
case Common::EVENT_RTL:
_gameRunning = false;
break;
case Common::EVENT_KEYDOWN:
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_w) {
++_colorIndex;
}
break;
default:
break;
}
}
}
void SupernovaEngine::initData() {
}
void SupernovaEngine::initPalette() {
// Default VGA palette
byte pal[768] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x00, 0xa8, 0x00, 0x00, 0xa8, 0xa8, 0xa8, 0x00, 0x00, 0xa8, 0x00, 0xa8,
0xa8, 0x54, 0x00, 0xa8, 0xa8, 0xa8, 0x54, 0x54, 0x54, 0x54, 0x54, 0xfc, 0x54, 0xfc, 0x54, 0x54, 0xfc, 0xfc,
0xfc, 0x54, 0x54, 0xfc, 0x54, 0xfc, 0xfc, 0xfc, 0x54, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14,
0x20, 0x20, 0x20, 0x2c, 0x2c, 0x2c, 0x38, 0x38, 0x38, 0x44, 0x44, 0x44, 0x50, 0x50, 0x50, 0x60, 0x60, 0x60,
0x70, 0x70, 0x70, 0x80, 0x80, 0x80, 0x90, 0x90, 0x90, 0xa0, 0xa0, 0xa0, 0xb4, 0xb4, 0xb4, 0xc8, 0xc8, 0xc8,
0xe0, 0xe0, 0xe0, 0xfc, 0xfc, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc,
0xfc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00,
0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc, 0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x00,
0x00, 0xfc, 0x00, 0x00, 0xfc, 0x40, 0x00, 0xfc, 0x7c, 0x00, 0xfc, 0xbc, 0x00, 0xfc, 0xfc, 0x00, 0xbc, 0xfc,
0x00, 0x7c, 0xfc, 0x00, 0x40, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc,
0xfc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c,
0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc, 0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0x7c,
0x7c, 0xfc, 0x7c, 0x7c, 0xfc, 0x9c, 0x7c, 0xfc, 0xbc, 0x7c, 0xfc, 0xdc, 0x7c, 0xfc, 0xfc, 0x7c, 0xdc, 0xfc,
0x7c, 0xbc, 0xfc, 0x7c, 0x9c, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc,
0xfc, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4,
0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc, 0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0xb4,
0xb4, 0xfc, 0xb4, 0xb4, 0xfc, 0xc4, 0xb4, 0xfc, 0xd8, 0xb4, 0xfc, 0xe8, 0xb4, 0xfc, 0xfc, 0xb4, 0xe8, 0xfc,
0xb4, 0xd8, 0xfc, 0xb4, 0xc4, 0xfc, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70,
0x70, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00,
0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70, 0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x00,
0x00, 0x70, 0x00, 0x00, 0x70, 0x1c, 0x00, 0x70, 0x38, 0x00, 0x70, 0x54, 0x00, 0x70, 0x70, 0x00, 0x54, 0x70,
0x00, 0x38, 0x70, 0x00, 0x1c, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70,
0x70, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38,
0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70, 0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x38,
0x38, 0x70, 0x38, 0x38, 0x70, 0x44, 0x38, 0x70, 0x54, 0x38, 0x70, 0x60, 0x38, 0x70, 0x70, 0x38, 0x60, 0x70,
0x38, 0x54, 0x70, 0x38, 0x44, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70,
0x70, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50,
0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70, 0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x50,
0x50, 0x70, 0x50, 0x50, 0x70, 0x58, 0x50, 0x70, 0x60, 0x50, 0x70, 0x68, 0x50, 0x70, 0x70, 0x50, 0x68, 0x70,
0x50, 0x60, 0x70, 0x50, 0x58, 0x70, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40,
0x40, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00,
0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40, 0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x00,
0x00, 0x40, 0x00, 0x00, 0x40, 0x10, 0x00, 0x40, 0x20, 0x00, 0x40, 0x30, 0x00, 0x40, 0x40, 0x00, 0x30, 0x40,
0x00, 0x20, 0x40, 0x00, 0x10, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40,
0x40, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20,
0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40, 0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x20,
0x20, 0x40, 0x20, 0x20, 0x40, 0x28, 0x20, 0x40, 0x30, 0x20, 0x40, 0x38, 0x20, 0x40, 0x40, 0x20, 0x38, 0x40,
0x20, 0x30, 0x40, 0x20, 0x28, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40,
0x40, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c,
0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40, 0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x2c,
0x2c, 0x40, 0x2c, 0x2c, 0x40, 0x30, 0x2c, 0x40, 0x34, 0x2c, 0x40, 0x3c, 0x2c, 0x40, 0x40, 0x2c, 0x3c, 0x40,
0x2c, 0x34, 0x40, 0x2c, 0x30, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
byte init_pal[] = {
0, 0, 0, 16,16,16, 22,22,22, 28,28,28,
63,63,63, 0,52, 0, 0,63, 0, 54, 0, 0,
63, 0, 0, 0, 0,30, 0, 0,45, 40,40,40,
20,50,63, 10,63,10, 60,60, 0, 63,10,10
};
Common::copy(init_pal, init_pal + sizeof(init_pal), pal);
_system->getPaletteManager()->setPalette(pal, 0, 256);
}
void SupernovaEngine::playSound(int filenumber, int offset) {
Common::File *file = new Common::File();
Common::String filename(Common::String::format("msn_data.0%2d", filenumber));
if (!file->open(filename)) {
error("File %s could not be read!", filename.c_str());
Common::File *file = new Common::File;
if (!file->open(Common::String::format("msn_data.0%2d", filenumber))) {
error("File %s could not be read!", file->getName());
}
file->seek(offset);
@ -129,8 +194,29 @@ void SupernovaEngine::stopSound() {
_mixer->stopHandle(_soundHandle);
}
void SupernovaEngine::renderImage(int file, int section) {
// STUB
void 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))) {
error("File %s could not be read!", file->getName());
}
// play Supernova MOD file
}
void SupernovaEngine::renderImage(int filenumber, int section) {
Common::File file;
if (!file.open(Common::String::format("msn_data.0%2d", filenumber))) {
error("File %s could not be read!", file.getName());
}
_image.loadStream(file);
_image.loadSection(section);
_system->copyRectToScreen(_image.getSurface()->getPixels(), 320, 0, 0, 320, 200);
}
}

View file

@ -51,20 +51,17 @@ private:
Common::RandomSource *_rnd;
Console *_console;
Audio::SoundHandle _soundHandle;
// name is file ending of msn_data.xxx
// image decoded from file
// sections ??
// struct imageFile {
// Common::String name;
// MSNImageDecoder image;
// };
// Common::Array<imageFile> _images;
bool _gameRunning;
MSNImageDecoder _image;
byte _colorIndex;
void initData();
void initPalette();
void updateEvents();
void playSound(int filenumber, int offset = 0);
void playSoundMod(int filenumber);
void stopSound();
void renderImage(int file, int section);
void renderImage(int filenumber, int section);
};
}