From 7cae73aae3775e82ca8e78abe7809d125b67ccc3 Mon Sep 17 00:00:00 2001 From: athrxx Date: Sat, 16 Nov 2019 22:00:30 +0100 Subject: KYRA: (EOB/PC98) - initial startup fix - hook up static resources, sound code, etc - nothing really working yet, though (except the music) --- engines/kyra/graphics/screen_eob.cpp | 59 ++++++++++++++++++++++++++++-------- engines/kyra/graphics/screen_eob.h | 9 ++++++ 2 files changed, 56 insertions(+), 12 deletions(-) (limited to 'engines/kyra/graphics') diff --git a/engines/kyra/graphics/screen_eob.cpp b/engines/kyra/graphics/screen_eob.cpp index f1efbd0943..785317ba23 100644 --- a/engines/kyra/graphics/screen_eob.cpp +++ b/engines/kyra/graphics/screen_eob.cpp @@ -63,6 +63,18 @@ Screen_EoB::Screen_EoB(EoBCoreEngine *vm, OSystem *system) : Screen(vm, system, _cgaMappingDefault = 0; _cgaDitheringTables[0] = _cgaDitheringTables[1] = 0; _useHiResEGADithering = _dualPaletteMode = false; + for (int i = 0; i < 10; ++i) + _palette16c[i] = 0; + + _cpsFilePattern = "%s.CPS"; + if (_vm->gameFlags().platform == Common::kPlatformFMTowns) { + _cpsFilePattern = "%s.SHP"; + } else if (_vm->game() == GI_EOB1) { + if (_vm->gameFlags().platform == Common::kPlatformPC98) + _cpsFilePattern = "%s.BIN"; + else if (_renderMode == Common::kRenderEGA || _renderMode == Common::kRenderCGA) + _cpsFilePattern = "%s.EGA"; + } } Screen_EoB::~Screen_EoB() { @@ -114,6 +126,12 @@ bool Screen_EoB::init() { _cgaScaleTable[i] = ((i & 0xF0) >> 2) | (i & 0x03); } + const uint8 *pal16c = _vm->staticres()->loadRawData(kEoB1Palettes16c, temp); + if (pal16c) { + for (int i = 0; i < 10; i++) + _palette16c[i] = pal16c + i * 48; + } + return true; } return false; @@ -235,11 +253,11 @@ void Screen_EoB::loadShapeSetBitmap(const char *file, int tempPage, int destPage void Screen_EoB::loadBitmap(const char *filename, int tempPage, int dstPage, Palette *pal, bool skip) { Screen::loadBitmap(filename, tempPage, dstPage, pal); - Common::SeekableReadStream *str = _vm->resource()->createReadStream(filename); - str->skip(4); - uint32 imgSize = str->readUint32LE(); - if (_isAmiga && !skip) { + Common::SeekableReadStream *str = _vm->resource()->createReadStream(filename); + str->skip(4); + uint32 imgSize = str->readUint32LE(); + if (_vm->game() == GI_EOB1 && (dstPage == 3 || dstPage == 4) && imgSize == 40064) { // Yay, this is where EOB1 Amiga hides the palette data loadPalette(_pagePtrs[dstPage] + 40000, *_palettes[0], 64); @@ -253,15 +271,14 @@ void Screen_EoB::loadBitmap(const char *filename, int tempPage, int dstPage, Pal _palettes[i]->loadAmigaPalette(*str, 0, 32); } } - Screen::convertAmigaGfx(getPagePtr(dstPage), 320, 200); - } - delete str; + Screen::convertAmigaGfx(getPagePtr(dstPage), 320, 200); + delete str; + } } void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int tempPage, int destPage, int convertToPage) { - const char *filePattern = _vm->gameFlags().platform == Common::kPlatformFMTowns ? "%s.SHP" : ((_vm->game() == GI_EOB1 && (_renderMode == Common::kRenderEGA || _renderMode == Common::kRenderCGA)) ? "%s.EGA" : "%s.CPS"); - Common::String tmp = Common::String::format(filePattern, file); + Common::String tmp = Common::String::format(_cpsFilePattern, file); Common::SeekableReadStream *s = _vm->resource()->createReadStream(tmp); bool loadAlternative = false; @@ -271,6 +288,14 @@ void Screen_EoB::loadEoBBitmap(const char *file, const uint8 *cgaMapping, int te s->read(_shpBuffer, s->size()); decodeSHP(_shpBuffer, destPage); + } if (_vm->gameFlags().platform == Common::kPlatformPC98) { + if (!s) + error("Screen_EoB::loadEoBBitmap(): Failed to load file '%s'", file); + s->skip(2); + uint16 imgSize = s->readUint16LE(); + loadFileDataToPage(s, tempPage, s->size() - 4); + decodeBIN(_pagePtrs[tempPage], _pagePtrs[destPage], imgSize); + } else if (s) { // This additional check is necessary since some localized versions of EOB II seem to contain invalid (size zero) cps files if (s->size() == 0) { @@ -368,9 +393,9 @@ void Screen_EoB::setScreenPalette(const Palette &pal) { if (_bytesPerPixel == 2) { for (int i = 0; i < 4; i++) createFadeTable16bit((const uint16*)(pal.getData()), &_16bitPalette[i * 256], 0, i * 85); - }else if (_useHiResEGADithering && pal.getNumColors() != 16) { + } else if (_useHiResEGADithering && pal.getNumColors() != 16) { generateEGADitheringTable(pal); - } else if (_renderMode == Common::kRenderEGA && pal.getNumColors() == 16) { + } else if ((_renderMode == Common::kRenderEGA) && pal.getNumColors() == 16) { _screenPalette->copy(pal); _system->getPaletteManager()->setPalette(_screenPalette->getData(), 0, _screenPalette->getNumColors()); } else if (_renderMode != Common::kRenderCGA && _renderMode != Common::kRenderEGA) { @@ -400,7 +425,7 @@ uint8 *Screen_EoB::encodeShape(uint16 x, uint16 y, uint16 w, uint16 h, bool enco uint8 *srcLineStart = getPagePtr(_curPage | 1) + y * 320 + (x << 3); uint8 *src = srcLineStart; - if (_renderMode == Common::kRenderEGA && !_useHiResEGADithering) + if (_use16ColorMode || (_renderMode == Common::kRenderEGA && !_useHiResEGADithering)) encode8bit = false; if (_bytesPerPixel == 2 && encode8bit) { @@ -1650,6 +1675,16 @@ void Screen_EoB::loadSpecialAmigaCPS(const char *fileName, int destPage, bool is convertAmigaGfx(_pagePtrs[destPage], 320, 200); } +void Screen_EoB::load16ColPalette(int palID, Palette &dest) { + if (!_palette16c[palID]) + return; + loadPalette(_palette16c[palID], dest, 48); +} + +void Screen_EoB::decodeBIN(const uint8 *src, uint8 *dst, uint32 dstSize) { + +} + void Screen_EoB::setupDualPalettesSplitScreen(Palette &top, Palette &bottom) { // The original supports simultaneous fading of both palettes, but doesn't make any use of that // feature. The fade rate is always set to 0. So I see no need to implement that. diff --git a/engines/kyra/graphics/screen_eob.h b/engines/kyra/graphics/screen_eob.h index 5df67df506..edc49e144a 100644 --- a/engines/kyra/graphics/screen_eob.h +++ b/engines/kyra/graphics/screen_eob.h @@ -93,6 +93,10 @@ public: // Amiga specific void loadSpecialAmigaCPS(const char *fileName, int destPage, bool isGraphics); + // PC-98 specific + void load16ColPalette(int palID, Palette &dest); + void decodeBIN(const uint8 *src, uint8 *dst, uint32 dstSize); + // This is a simple way of emulating the Amiga copper list palette magic for more than 32 colors. // I use colors 32 to 63 for these extra colors (which the Amiga copper sends to the color // registers on the fly at vertical beam position 120). @@ -136,6 +140,11 @@ private: uint8 *_egaDitheringTable; uint8 *_egaDitheringTempPage; + // hard coded 16 color palettes for PC98 version of EOB1 + const uint8 *_palette16c[10]; + + const char *_cpsFilePattern; + const uint16 _cursorColorKey16Bit; static const uint8 _egaMatchTable[]; -- cgit v1.2.3