FREESCAPE: added basic loading of Driller Amstrad CPC release (but without correct palette)

This commit is contained in:
neuromancer 2022-12-29 09:46:48 -03:00
parent 90d97edd63
commit cd5dffdce8
8 changed files with 84 additions and 1 deletions

View File

@ -59,6 +59,18 @@ static const ADGameDescription gameDescriptions[] = {
ADGF_ZX_MUSICAL | ADGF_TESTING,
GUIO2(GUIO_NOMIDI, GAMEOPTION_AUTOMATIC_DRILLING)
},
{
"driller",
"",
{
{"DRILLER.CPC.EXTRACTED", 0, "4e4b2fa20f96cea9c19ea3940ae76956", 204032},
AD_LISTEND
},
Common::EN_ANY,
Common::kPlatformAmstradCPC,
ADGF_TESTING,
GUIO2(GUIO_NOMIDI, GAMEOPTION_AUTOMATIC_DRILLING)
},
{
"driller",
"",

View File

@ -49,6 +49,8 @@ FreescapeEngine::FreescapeEngine(OSystem *syst, const ADGameDescription *gd)
_renderMode = Common::kRenderAmiga;
} else if (isAtariST()) {
_renderMode = Common::kRenderAtariST;
} else if (isCPC()) {
_renderMode = Common::kRenderCPC;
} else if (isSpectrum()) {
_renderMode = Common::kRenderZX;
}

View File

@ -97,6 +97,7 @@ public:
bool isAtariST() { return _gameDescription->platform == Common::kPlatformAtariST; }
bool isDOS() { return _gameDescription->platform == Common::kPlatformDOS; }
bool isSpectrum() { return _gameDescription->platform == Common::kPlatformZX; }
bool isCPC() { return _gameDescription->platform == Common::kPlatformAmstradCPC; }
Common::Error run() override;

View File

@ -452,7 +452,18 @@ void DrillerEngine::loadAssetsFullGame() {
load8bitBinary(&file, 0x5c0a, 4);
else
error("Unknown ZX spectrum variant");
} else if (isCPC()) {
file.open("driller.cpc.extracted");
if (!file.isOpen())
error("Failed to open driller.cpc.extracted");
//loadMessagesFixedSize(&file, 0x20e4, 14, 20);
//loadFonts(&file, 0x62ca);
//loadGlobalObjects(&file, 0x1c93);
load8bitBinary(&file, 0xec76, 4);
} else if (_renderMode == Common::kRenderEGA) {
loadBundledImages();
file.open("DRILLE.EXE");

View File

@ -53,11 +53,43 @@ byte kDrillerZXPalette[9][3] = {
{0x00, 0x00, 0x00},
};
byte kDrillerCPCPalette[27][3] = {
{0x00, 0x00, 0x00},
{0x00, 0x00, 0x80},
{0x00, 0x00, 0xff},
{0x80, 0x00, 0x00},
{0x80, 0x00, 0x80},
{0x80, 0x00, 0xff},
{0xff, 0x00, 0x00},
{0xff, 0x00, 0x80},
{0xff, 0x00, 0xff},
{0x00, 0x80, 0x00},
{0x00, 0x80, 0x80},
{0x00, 0x88, 0xff},
{0x80, 0x80, 0x00},
{0x80, 0x80, 0x80},
{0x80, 0x80, 0xff},
{0xff, 0x80, 0x00},
{0xff, 0x80, 0x80},
{0xff, 0x80, 0xff},
{0x00, 0xff, 0x00},
{0x00, 0xff, 0x80},
{0x00, 0xff, 0xff},
{0x80, 0xff, 0x00},
{0x80, 0xff, 0x80},
{0x80, 0xff, 0xff},
{0xff, 0xff, 0x00},
{0xff, 0xff, 0x80},
{0xff, 0xff, 0xff},
};
void FreescapeEngine::loadColorPalette() {
if (_renderMode == Common::kRenderEGA) {
_gfx->_palette = (byte *)&dos_EGA_palette;
} else if (_renderMode == Common::kRenderZX) {
_gfx->_palette = (byte *)kDrillerZXPalette;
} else if (_renderMode == Common::kRenderCPC) {
_gfx->_palette = (byte *)kDrillerCPCPalette;
} else if (_renderMode == Common::kRenderCGA) {
_gfx->_palette = nullptr; // palette depends on the area
} else if (_renderMode == Common::kRenderAmiga || _renderMode == Common::kRenderAtariST) {

View File

@ -121,6 +121,28 @@ bool Renderer::getRGBAtZX(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r
return true;
}
bool Renderer::getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2) {
if (index == _keyColor)
return false;
assert (_renderMode == Common::kRenderCPC);
if (index == 4) { // Solid colors
readFromPalette(index - 1, r1, g1, b1);
r2 = r1;
g2 = g1;
b2 = b1;
return true;
}
byte *entry = (*_colorMap)[index - 1];
byte be = *(entry);
readFromPalette((be >> 4), r1, g1, b1);
entry++;
be = *(entry);
readFromPalette((be >> 4), r2, g2, b2);
return true;
}
bool Renderer::getRGBAtEGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2) {
// assert(index-1 < _colorMap->size());
byte *entry = (*_colorMap)[index - 1];
@ -175,6 +197,8 @@ bool Renderer::getRGBAt(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2,
return getRGBAtEGA(index, r1, g1, b1, r2, g2, b2);
else if (_renderMode == Common::kRenderCGA)
return getRGBAtCGA(index, r1, g1, b1, r2, g2, b2);
else if (_renderMode == Common::kRenderCPC)
return getRGBAtCPC(index, r1, g1, b1, r2, g2, b2);
else if (_renderMode == Common::kRenderZX)
return getRGBAtZX(index, r1, g1, b1, r2, g2, b2, stipple);

View File

@ -100,6 +100,7 @@ public:
uint8 indexFromColor(uint8 r, uint8 g, uint8 b);
bool getRGBAt(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple);
bool getRGBAtCGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
bool getRGBAtCPC(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
bool getRGBAtEGA(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2);
bool getRGBAtZX(uint8 index, uint8 &r1, uint8 &g1, uint8 &b1, uint8 &r2, uint8 &g2, uint8 &b2, byte *stipple);

View File

@ -285,7 +285,7 @@ void OpenGLRenderer::useStipple(bool enabled) {
glEnable(GL_POLYGON_OFFSET_FILL);
glPolygonOffset(-5.0f, 1.0f);
glEnable(GL_POLYGON_STIPPLE);
glPolygonStipple(_renderMode == Common::kRenderCGA ? _defaultStippleArray : _variableStippleArray);
glPolygonStipple(_renderMode == Common::kRenderZX ? _variableStippleArray : _defaultStippleArray);
} else {
glPolygonOffset(0, 0);
glDisable(GL_POLYGON_OFFSET_FILL);