diff options
Diffstat (limited to 'engines/queen')
-rw-r--r-- | engines/queen/bankman.cpp | 198 | ||||
-rw-r--r-- | engines/queen/bankman.h | 4 | ||||
-rw-r--r-- | engines/queen/display.cpp | 695 | ||||
-rw-r--r-- | engines/queen/display.h | 9 | ||||
-rw-r--r-- | engines/queen/graphics.cpp | 83 | ||||
-rw-r--r-- | engines/queen/journal.cpp | 14 | ||||
-rw-r--r-- | engines/queen/logic.cpp | 3 | ||||
-rw-r--r-- | engines/queen/music.cpp | 2 | ||||
-rw-r--r-- | engines/queen/queen.cpp | 20 | ||||
-rw-r--r-- | engines/queen/queen.h | 3 | ||||
-rw-r--r-- | engines/queen/resource.cpp | 86 | ||||
-rw-r--r-- | engines/queen/resource.h | 38 | ||||
-rw-r--r-- | engines/queen/sound.cpp | 643 | ||||
-rw-r--r-- | engines/queen/sound.h | 97 | ||||
-rw-r--r-- | engines/queen/talk.cpp | 6 |
15 files changed, 1293 insertions, 608 deletions
diff --git a/engines/queen/bankman.cpp b/engines/queen/bankman.cpp index 18ad276d0f..d9eb020dfe 100644 --- a/engines/queen/bankman.cpp +++ b/engines/queen/bankman.cpp @@ -31,7 +31,6 @@ BankManager::BankManager(Resource *res) : _res(res) { memset(_frames, 0, sizeof(_frames)); memset(_banks, 0, sizeof(_banks)); - memset(_loadedBanks, 0, sizeof(_loadedBanks)); } BankManager::~BankManager() { @@ -43,102 +42,189 @@ BankManager::~BankManager() { void BankManager::load(const char *bankname, uint32 bankslot) { debug(9, "BankManager::load(%s, %d)", bankname, bankslot); + assert(bankslot < MAX_BANKS_NUMBER); + PackedBank *bank = &_banks[bankslot]; - if (!scumm_stricmp(bankname, _loadedBanks[bankslot])) { + if (!scumm_stricmp(bankname, bank->name)) { debug(9, "BankManager::load() bank '%s' already loaded", bankname); return; } close(bankslot); - _banks[bankslot].data = _res->loadFile(bankname); - - uint16 entries = READ_LE_UINT16(_banks[bankslot].data); - assert(entries < MAX_BANK_SIZE); - debug(9, "BankManager::load() entries = %d", entries); - - uint32 offset = 2; - const uint8 *p = _banks[bankslot].data; - for (uint16 i = 1; i <= entries; ++i) { - _banks[bankslot].indexes[i] = offset; - uint16 w = READ_LE_UINT16(p + offset + 0); - uint16 h = READ_LE_UINT16(p + offset + 2); - // jump to next entry, skipping data & header - offset += w * h + 8; + bank->data = _res->loadFile(bankname); + + if (_res->getPlatform() == Common::kPlatformAmiga) { + uint16 entries = READ_BE_UINT16(bank->data + 4); + assert(entries < MAX_BANK_SIZE); + debug(9, "BankManager::load() entries = %d", entries); + uint32 offset = 6; + for (uint16 i = 1; i <= entries; ++i) { + _banks[bankslot].indexes[i] = offset; + uint16 dataSize = READ_BE_UINT16(bank->data + offset + 10); + offset += dataSize + 12; + } + } else { + uint16 entries = READ_LE_UINT16(bank->data); + assert(entries < MAX_BANK_SIZE); + debug(9, "BankManager::load() entries = %d", entries); + uint32 offset = 2; + for (uint16 i = 1; i <= entries; ++i) { + _banks[bankslot].indexes[i] = offset; + uint16 w = READ_LE_UINT16(bank->data + offset + 0); + uint16 h = READ_LE_UINT16(bank->data + offset + 2); + offset += w * h + 8; + } } // mark this bank as loaded - strcpy(_loadedBanks[bankslot], bankname); + strcpy(bank->name, bankname); +} + +static void convertPlanarBitmap(uint8 *dst, int dstPitch, const uint8 *src, int w, int h, int plane) { + assert(w != 0 && h != 0); + int planarSize = plane * h * w * 2; + uint8 *planarBuf = new uint8[ planarSize ]; + uint8 *dstPlanar = planarBuf; + while (planarSize > 0) { + if (src[0] == 0) { + int count = src[1]; + memset(dstPlanar, 0, count); + dstPlanar += count; + src += 2; + planarSize -= count; + } else { + *dstPlanar++ = *src++; + --planarSize; + } + } + + src = planarBuf; + int i = 0; + int planeSize = h * w * 2; + while (h--) { + for (int x = 0; x < w * 2; ++x) { + for (int b = 0; b < 8; ++b) { + const uint8 mask = (1 << (7 - b)); + uint8 color = 0; + for (int p = 0; p < plane; ++p) { + if (src[planeSize * p + i] & mask) { + color |= (1 << p); + } + } + dst[8 * x + b] = color; + } + ++i; + } + dst += dstPitch; + } + + delete[] planarBuf; } void BankManager::unpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { debug(9, "BankManager::unpack(%d, %d, %d)", srcframe, dstframe, bankslot); + assert(bankslot < MAX_BANKS_NUMBER); - assert(_banks[bankslot].data != NULL); - - BobFrame *pbf = &_frames[dstframe]; - const uint8 *p = _banks[bankslot].data + _banks[bankslot].indexes[srcframe]; - pbf->width = READ_LE_UINT16(p + 0); - pbf->height = READ_LE_UINT16(p + 2); - pbf->xhotspot = READ_LE_UINT16(p + 4); - pbf->yhotspot = READ_LE_UINT16(p + 6); - - uint32 size = pbf->width * pbf->height; - delete[] pbf->data; - pbf->data = new uint8[ size ]; - memcpy(pbf->data, p + 8, size); + PackedBank *bank = &_banks[bankslot]; + assert(bank->data != NULL); + + assert(dstframe < MAX_FRAMES_NUMBER); + BobFrame *bf = &_frames[dstframe]; + delete[] bf->data; + bf->data = NULL; + + const uint8 *p = bank->data + bank->indexes[srcframe]; + + if (_res->getPlatform() == Common::kPlatformAmiga) { + uint16 w = READ_BE_UINT16(p + 0); + uint16 h = READ_BE_UINT16(p + 2); + uint16 plane = READ_BE_UINT16(p + 4); + bf->xhotspot = READ_BE_UINT16(p + 6); + bf->yhotspot = READ_BE_UINT16(p + 8); + bf->width = w * 16; + bf->height = h; + + uint32 size = bf->width * bf->height; + bf->data = new uint8[ size ]; + convertPlanarBitmap(bf->data, bf->width, p + 12, w, h, plane); + } else { + bf->width = READ_LE_UINT16(p + 0); + bf->height = READ_LE_UINT16(p + 2); + bf->xhotspot = READ_LE_UINT16(p + 4); + bf->yhotspot = READ_LE_UINT16(p + 6); + + uint32 size = bf->width * bf->height; + bf->data = new uint8[ size ]; + memcpy(bf->data, p + 8, size); + } } void BankManager::overpack(uint32 srcframe, uint32 dstframe, uint32 bankslot) { debug(9, "BankManager::overpack(%d, %d, %d)", srcframe, dstframe, bankslot); - assert(bankslot < MAX_BANKS_NUMBER); - assert(_banks[bankslot].data != NULL); - const uint8 *p = _banks[bankslot].data + _banks[bankslot].indexes[srcframe]; - uint16 src_w = READ_LE_UINT16(p + 0); - uint16 src_h = READ_LE_UINT16(p + 2); - - // unpack if destination frame is smaller than source one - if (_frames[dstframe].width < src_w || _frames[dstframe].height < src_h) { - unpack(srcframe, dstframe, bankslot); + assert(bankslot < MAX_BANKS_NUMBER); + PackedBank *bank = &_banks[bankslot]; + assert(bank->data != NULL); + + assert(dstframe < MAX_FRAMES_NUMBER); + BobFrame *bf = &_frames[dstframe]; + + const uint8 *p = bank->data + bank->indexes[srcframe]; + + if (_res->getPlatform() == Common::kPlatformAmiga) { + uint16 w = READ_BE_UINT16(p + 0); + uint16 h = READ_BE_UINT16(p + 2); + uint16 plane = READ_BE_UINT16(p + 4); + uint16 src_w = w * 16; + uint16 src_h = h; + + if (bf->width < src_w || bf->height < src_h) { + unpack(srcframe, dstframe, bankslot); + } else { + convertPlanarBitmap(bf->data, bf->width, p + 12, w, h, plane); + } } else { - // copy data 'over' destination frame (without changing frame header) - memcpy(_frames[dstframe].data, p + 8, src_w * src_h); + uint16 src_w = READ_LE_UINT16(p + 0); + uint16 src_h = READ_LE_UINT16(p + 2); + + // unpack if destination frame is smaller than source + if (bf->width < src_w || bf->height < src_h) { + unpack(srcframe, dstframe, bankslot); + } else { + // copy data 'over' destination frame (without updating frame header) + memcpy(bf->data, p + 8, src_w * src_h); + } } } void BankManager::close(uint32 bankslot) { debug(9, "BankManager::close(%d)", bankslot); assert(bankslot < MAX_BANKS_NUMBER); - delete[] _banks[bankslot].data; - memset(&_banks[bankslot], 0, sizeof(PackedBank)); - _loadedBanks[bankslot][0] = '\0'; + PackedBank *bank = &_banks[bankslot]; + delete[] bank->data; + memset(bank, 0, sizeof(PackedBank)); } BobFrame *BankManager::fetchFrame(uint32 index) { debug(9, "BankManager::fetchFrame(%d)", index); assert(index < MAX_FRAMES_NUMBER); - BobFrame *pbf = &_frames[index]; - assert(pbf->data != 0); - return pbf; + BobFrame *bf = &_frames[index]; + assert(bf->data != 0); + return bf; } void BankManager::eraseFrame(uint32 index) { debug(9, "BankManager::eraseFrame(%d)", index); assert(index < MAX_FRAMES_NUMBER); - BobFrame *pbf = &_frames[index]; - delete[] pbf->data; - memset(pbf, 0, sizeof(BobFrame)); + BobFrame *bf = &_frames[index]; + delete[] bf->data; + memset(bf, 0, sizeof(BobFrame)); } void BankManager::eraseFrames(bool joe) { - uint32 i = 0; - if (!joe) { - i = FRAMES_JOE; - } - while (i < MAX_FRAMES_NUMBER) { + for (uint32 i = joe ? 0 : FRAMES_JOE; i < MAX_FRAMES_NUMBER; ++i) { eraseFrame(i); - ++i; } } diff --git a/engines/queen/bankman.h b/engines/queen/bankman.h index a386706950..bdc9847d31 100644 --- a/engines/queen/bankman.h +++ b/engines/queen/bankman.h @@ -68,6 +68,7 @@ private: struct PackedBank { uint32 indexes[MAX_BANK_SIZE]; uint8 *data; + char name[20]; }; //! unpacked bob frames @@ -76,9 +77,6 @@ private: //! banked bob frames PackedBank _banks[MAX_BANKS_NUMBER]; - //! loaded banks names - char _loadedBanks[MAX_BANKS_NUMBER][20]; - Resource *_res; }; diff --git a/engines/queen/display.cpp b/engines/queen/display.cpp index 7f5e26102d..ef059bb8af 100644 --- a/engines/queen/display.cpp +++ b/engines/queen/display.cpp @@ -45,18 +45,11 @@ Display::Display(QueenEngine *vm, OSystem *system) : _fullscreen(true), _horizontalScroll(0), _bdWidth(0), _bdHeight(0), _system(system), _vm(vm) { - if (vm->resource()->getLanguage() == Common::HB_ISR) - _font = _fontHebrew; - else if (vm->resource()->getLanguage() == Common::RU_RUS) - _font = _fontRussian; - else - _font = _fontRegular; - initFont(); - _screenBuf = new uint8[SCREEN_W * SCREEN_H]; - _panelBuf = new uint8[PANEL_W * PANEL_H]; - _backdropBuf = new uint8[BACKDROP_W * BACKDROP_H]; + _screenBuf = new uint8[ SCREEN_W * SCREEN_H ]; + _panelBuf = new uint8[ PANEL_W * PANEL_H ]; + _backdropBuf = new uint8[ BACKDROP_W * BACKDROP_H ]; memset(_screenBuf, 0, SCREEN_W * SCREEN_H); memset(_panelBuf, 0, PANEL_W * PANEL_H); memset(_backdropBuf, 0, BACKDROP_W * BACKDROP_H); @@ -77,6 +70,11 @@ Display::Display(QueenEngine *vm, OSystem *system) _pal.dirtyMax = 255; _pal.scrollable = true; + _imageExt = (_vm->resource()->getPlatform() == Common::kPlatformAmiga) ? "LBM" : "PCX"; + + _curTextColor = 0; + memset(_texts, 0, sizeof(_texts)); + memset(&_dynalum, 0, sizeof(_dynalum)); } @@ -106,10 +104,10 @@ void Display::dynalumInit(const char *roomName, uint16 roomNum) { if (!isPalFadingDisabled(roomNum)) { char filename[20]; - sprintf(filename, "%s.msk", roomName); + sprintf(filename, "%s.MSK", roomName); if (_vm->resource()->fileExists(filename)) { _dynalum.mskBuf = (uint8 *)_vm->resource()->loadFile(filename, 0, &_dynalum.mskSize); - sprintf(filename, "%s.lum", roomName); + sprintf(filename, "%s.LUM", roomName); if (_vm->resource()->fileExists(filename)) { _dynalum.lumBuf = (int8 *)_vm->resource()->loadFile(filename, 0, &_dynalum.lumSize); _dynalum.valid = true; @@ -628,35 +626,44 @@ void Display::update(bool dynalum, int16 dynaX, int16 dynaY) { } void Display::setupPanel() { - uint32 size; - uint8 *pcxBuf = _vm->resource()->loadFile("panel.pcx", 0, &size); - uint8 *dst = _panelBuf + PANEL_W * 10; - readPCX(dst, PANEL_W, pcxBuf + 128, PANEL_W, PANEL_H - 10); - const uint8 *pal = pcxBuf + size - 768 + 144 * 3; - memcpy(_pal.panel, pal, (256 - 144) * 3); - delete[] pcxBuf; + uint16 panelWidth, panelHeight; + uint32 dataSize; + char dataName[20]; + sprintf(dataName, "PANEL.%s", _imageExt); + uint8 *data = _vm->resource()->loadFile(dataName, 0, &dataSize); + + if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) { + decodeLBM(data, dataSize, _panelBuf, PANEL_W, &panelWidth, &panelHeight, _pal.panel, 0, 32, 144); + } else { + WRITE_LE_UINT16(data + 14, PANEL_H - 10); + decodePCX(data, dataSize, _panelBuf + PANEL_W * 10, PANEL_W, &panelWidth, &panelHeight, _pal.panel, 144, 256); + } palSetPanel(); + + delete[] data; } void Display::setupNewRoom(const char *name, uint16 room) { dynalumInit(name, room); - uint32 size; - char filename[20]; - sprintf(filename, "%s.PCX", name); - uint8 *pcxBuf = _vm->resource()->loadFile(filename, 0, &size); - _bdWidth = READ_LE_UINT16(pcxBuf + 12); - _bdHeight = READ_LE_UINT16(pcxBuf + 14); - readPCX(_backdropBuf, BACKDROP_W, pcxBuf + 128, _bdWidth, _bdHeight); - int n = getNumColorsForRoom(room); - if (n != 256) { - n = 144; - } - memcpy(_pal.room, pcxBuf + size - 768, n * 3); - delete[] pcxBuf; - palCustomColors(room); + uint32 dataSize; + char dataName[20]; + sprintf(dataName, "%s.%s", name, _imageExt); + uint8 *data = _vm->resource()->loadFile(dataName, 0, &dataSize); + if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) { + decodeLBM(data, dataSize, _backdropBuf, BACKDROP_W, &_bdWidth, &_bdHeight, _pal.room, 0, 32); + } else { + int n = getNumColorsForRoom(room); + if (n != 256) { + n = 144; + } + decodePCX(data, dataSize, _backdropBuf, BACKDROP_W, &_bdWidth, &_bdHeight, _pal.room, 0, n); + palCustomColors(room); + } + + delete[] data; forceFullRefresh(); } @@ -670,10 +677,24 @@ void Display::drawBobPasteDown(const uint8 *data, uint16 x, uint16 y, uint16 w, } void Display::drawInventoryItem(const uint8 *data, uint16 x, uint16 y, uint16 w, uint16 h) { - if (data != NULL) { - blit(_panelBuf, PANEL_W, x, y, data, w, w, h, false, false); + if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) { + if (data != NULL) { + uint8 *dst = _panelBuf + y * PANEL_W + x; + while (h--) { + for (int i = 0; i < w; ++i) { + dst[i] = 144 + *data++; + } + dst += PANEL_W; + } + } else { + fill(_panelBuf, PANEL_W, x, y, w, h, 144 + 2); + } } else { - fill(_panelBuf, PANEL_W, x, y, w, h, INK_BG_PANEL); + if (data != NULL) { + blit(_panelBuf, PANEL_W, x, y, data, w, w, h, false, false); + } else { + fill(_panelBuf, PANEL_W, x, y, w, h, INK_BG_PANEL); + } } setDirtyBlock(x, 150 + y, w, h); } @@ -722,10 +743,18 @@ void Display::fill(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, uint16 w, } } -void Display::readPCX(uint8 *dst, uint16 dstPitch, const uint8 *src, uint16 w, uint16 h) { - while (h--) { +void Display::decodePCX(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd) { + *w = READ_LE_UINT16(src + 12); + *h = READ_LE_UINT16(src + 14); + + assert(palStart <= palEnd && palEnd <= 256); + const uint8 *palData = src + srcSize - 768; + memcpy(pal, palData + palStart * 3, (palEnd - palStart) * 3); + + src += 128; + for (int y = 0; y < *h; ++y) { uint8 *p = dst; - while (p < dst + w) { + while (p < dst + *w) { uint8 col = *src++; if ((col & 0xC0) == 0xC0) { uint8 len = col & 0x3F; @@ -739,6 +768,75 @@ void Display::readPCX(uint8 *dst, uint16 dstPitch, const uint8 *src, uint16 w, u } } +void Display::decodeLBM(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd, uint8 colorBase) { + int planeCount, planePitch; + const uint8 *srcEnd = src + srcSize; + src += 12; + while (src < srcEnd) { + uint32 type = READ_BE_UINT32(src); + uint32 size = READ_BE_UINT32(src + 4); + src += 8; + switch (type) { + case MKID_BE('BMHD'): { + *w = READ_BE_UINT16(src + 0); + *h = READ_BE_UINT16(src + 2); + planeCount = src[8]; + planePitch = ((*w + 15) >> 4) * 2; + } + break; + case MKID_BE('CMAP'): { + assert(palStart <= palEnd && palEnd <= size / 3); + memcpy(pal, src + palStart * 3, (palEnd - palStart) * 3); + } + break; + case MKID_BE('BODY'): { + uint32 planarSize = (*h) * planeCount * planePitch; + uint8 *planarBuf = new uint8[planarSize]; + uint8 *dstPlanar = planarBuf; + for (int y = 0; y < *h; ++y) { + for (int p = 0; p < planeCount; ++p) { + const uint8 *end = dstPlanar + planePitch; + while (dstPlanar < end) { + int code = (int8)*src++; + if (code != -128) { + if (code < 0) { + code = -code + 1; + memset(dstPlanar, *src++, code); + } else { + ++code; + memcpy(dstPlanar, src, code); + src += code; + } + dstPlanar += code; + } + } + } + } + src = planarBuf; + for (int y = 0; y < *h; ++y) { + for (int x = 0; x < *w / 8; ++x) { + for (int b = 0; b < 8; ++b) { + const uint8 mask = (1 << (7 - b)); + uint8 color = 0; + for (int p = 0; p < planeCount; ++p) { + if (src[planePitch * p + x] & mask) { + color |= 1 << p; + } + } + dst[x * 8 + b] = colorBase + color; + } + } + src += planeCount * planePitch; + dst += dstPitch; + } + delete[] planarBuf; + } + return; + } + src += size; + } +} + void Display::horizontalScrollUpdate(int16 xCamera) { debug(9, "Display::horizontalScrollUpdate(%d)", xCamera); if (_bdWidth <= 320) { @@ -790,6 +888,17 @@ void Display::showMouseCursor(bool show) { } void Display::initFont() { + switch (_vm->resource()->getLanguage()) { + case Common::HB_ISR: + _font = _fontHebrew; + break; + case Common::RU_RUS: + _font = _fontRussian; + break; + default: + _font = _fontRegular; + break; + } // calculate font justification sizes for (int i = 0; i < 256; ++i) { _charWidth[i] = 0; @@ -1017,264 +1126,264 @@ void Display::blankScreenEffect3() { #ifndef PALMOS_68K const uint8 Display::_fontRegular[] = { - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, - 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, - 0x30, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00, 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, - 0x38, 0x6C, 0x68, 0x36, 0xDC, 0xCC, 0x76, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0xC0, 0x60, 0x30, 0x30, 0x30, 0x60, 0xC0, 0x00, - 0x00, 0x6C, 0x38, 0xFE, 0x38, 0x6C, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x00, - 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x30, 0x70, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x00, - 0x78, 0xCC, 0x0C, 0x78, 0xC0, 0xC0, 0xFC, 0x00, 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, - 0x1C, 0x3C, 0x6C, 0xCC, 0xFC, 0x0C, 0x0C, 0x00, 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00, - 0x78, 0xCC, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00, 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, - 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, - 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0xC0, - 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, - 0xC0, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00, 0x30, 0x00, - 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x38, 0x7C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0xF8, 0xCC, 0xCC, 0xF8, 0xCC, 0xCC, 0xF8, 0x00, 0x78, 0xCC, 0xC0, 0xC0, 0xC0, 0xCC, 0x78, 0x00, - 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xFC, 0x00, - 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xC0, 0xDC, 0xCC, 0xCC, 0x7C, 0x00, - 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, - 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0xC6, 0xCC, 0xD8, 0xF8, 0xD8, 0xCC, 0xC6, 0x00, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0x00, 0x82, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, - 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, - 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x0C, - 0xF8, 0xCC, 0xCC, 0xF8, 0xD8, 0xCC, 0xCC, 0x00, 0x78, 0xCC, 0xC0, 0x78, 0x0C, 0xCC, 0x78, 0x00, - 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, - 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38, 0x10, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, - 0xC6, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x00, - 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0x00, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, - 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x00, - 0xE8, 0x4D, 0x4A, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, - 0xC0, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, - 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00, - 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, - 0x38, 0x6C, 0x60, 0xF8, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x78, - 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, - 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0x00, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xCC, 0xEE, 0xD6, 0xC6, 0xC6, 0x00, - 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, - 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, - 0x00, 0x00, 0xF8, 0xCC, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0x78, 0x00, - 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, - 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xD6, 0x6C, 0x6C, 0x00, - 0x00, 0x00, 0xCC, 0x78, 0x30, 0x78, 0xCC, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0xE0, - 0x00, 0x00, 0xFC, 0x18, 0x30, 0x60, 0xFC, 0x00, 0x38, 0x60, 0x60, 0xC0, 0x60, 0x60, 0x38, 0x00, - 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xE0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xE0, 0x00, - 0x38, 0x44, 0xBA, 0xAA, 0xBA, 0x44, 0x38, 0x00, 0x00, 0x98, 0x30, 0x60, 0xC8, 0x98, 0x30, 0x00, - 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x18, 0x66, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, - 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, - 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, - 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, - 0x18, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x18, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x18, 0x30, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x18, 0x30, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, - 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, - 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0x3C, 0x60, 0x3C, 0x66, 0x3C, 0x06, 0x3C, 0x00, - 0x18, 0x00, 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, 0x3F, 0x40, 0x4E, 0x58, 0x4E, 0x40, 0x3F, 0x00, - 0x1C, 0xA4, 0xC4, 0xBC, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, - 0x3E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, - 0x81, 0xB9, 0xA5, 0xB9, 0xA5, 0x81, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0xFC, 0x00, - 0xF0, 0x18, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x30, 0x18, 0xF0, 0x00, 0x00, 0x00, - 0x30, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0xC0, - 0x3E, 0x7A, 0x7A, 0x3A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x38, 0x44, 0x44, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00, - 0x40, 0xC6, 0x4C, 0x58, 0x32, 0x66, 0xCF, 0x02, 0x40, 0xC6, 0x4C, 0x58, 0x3E, 0x62, 0xC4, 0x0E, - 0xC0, 0x23, 0x66, 0x2C, 0xD9, 0x33, 0x67, 0x01, 0x18, 0x00, 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, - 0x60, 0x30, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x0C, 0x18, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0x38, 0xC6, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x71, 0x8E, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0x6C, 0x00, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x38, 0x44, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0x1F, 0x3C, 0x3C, 0x6F, 0x7C, 0xCC, 0xCF, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, - 0x60, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, - 0x30, 0xCC, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0xCC, 0x00, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, - 0x60, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0x18, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x30, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0xCC, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x78, 0x6C, 0x66, 0xF6, 0x66, 0x6C, 0x78, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, - 0x30, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, - 0x18, 0x66, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, - 0xC3, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, - 0x3F, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0xFC, 0x00, 0x30, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x0C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x06, 0x08, 0xC3, 0x66, 0x3C, 0x18, 0x18, 0x00, - 0x60, 0x60, 0x7E, 0x63, 0x7E, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x6C, 0x66, 0x66, 0x6C, 0x60, - 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x18, 0x66, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x71, 0x8E, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x00, 0x00, 0x7E, 0x1B, 0x7F, 0xD8, 0x77, 0x00, 0x00, 0x00, 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x18, - 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, - 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, - 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x60, 0xFC, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, - 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, - 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, - 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6, 0x7C, 0x80, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, + 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, + 0x30, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00, 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, + 0x38, 0x6C, 0x68, 0x36, 0xDC, 0xCC, 0x76, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0xC0, 0x60, 0x30, 0x30, 0x30, 0x60, 0xC0, 0x00, + 0x00, 0x6C, 0x38, 0xFE, 0x38, 0x6C, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x00, + 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x30, 0x70, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x00, + 0x78, 0xCC, 0x0C, 0x78, 0xC0, 0xC0, 0xFC, 0x00, 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, + 0x1C, 0x3C, 0x6C, 0xCC, 0xFC, 0x0C, 0x0C, 0x00, 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00, + 0x78, 0xCC, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00, 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, + 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, + 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0xC0, + 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, + 0xC0, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00, 0x30, 0x00, + 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x38, 0x7C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0xF8, 0xCC, 0xCC, 0xF8, 0xCC, 0xCC, 0xF8, 0x00, 0x78, 0xCC, 0xC0, 0xC0, 0xC0, 0xCC, 0x78, 0x00, + 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xFC, 0x00, + 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xC0, 0xDC, 0xCC, 0xCC, 0x7C, 0x00, + 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, + 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0xC6, 0xCC, 0xD8, 0xF8, 0xD8, 0xCC, 0xC6, 0x00, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0x00, 0x82, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, + 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, + 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x0C, + 0xF8, 0xCC, 0xCC, 0xF8, 0xD8, 0xCC, 0xCC, 0x00, 0x78, 0xCC, 0xC0, 0x78, 0x0C, 0xCC, 0x78, 0x00, + 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, + 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38, 0x10, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, + 0xC6, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x00, + 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0x00, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, + 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x00, + 0xE8, 0x4D, 0x4A, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, + 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00, + 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, + 0x38, 0x6C, 0x60, 0xF8, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x78, + 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, + 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0x00, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xCC, 0xEE, 0xD6, 0xC6, 0xC6, 0x00, + 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, + 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, + 0x00, 0x00, 0xF8, 0xCC, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0x78, 0x00, + 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, + 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xD6, 0x6C, 0x6C, 0x00, + 0x00, 0x00, 0xCC, 0x78, 0x30, 0x78, 0xCC, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0xE0, + 0x00, 0x00, 0xFC, 0x18, 0x30, 0x60, 0xFC, 0x00, 0x38, 0x60, 0x60, 0xC0, 0x60, 0x60, 0x38, 0x00, + 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xE0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xE0, 0x00, + 0x38, 0x44, 0xBA, 0xAA, 0xBA, 0x44, 0x38, 0x00, 0x00, 0x98, 0x30, 0x60, 0xC8, 0x98, 0x30, 0x00, + 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x18, 0x66, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, + 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, + 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, + 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, + 0x18, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x30, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x18, 0x30, 0x00, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x18, 0x30, 0x00, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, + 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, + 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0x3C, 0x60, 0x3C, 0x66, 0x3C, 0x06, 0x3C, 0x00, + 0x18, 0x00, 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, 0x3F, 0x40, 0x4E, 0x58, 0x4E, 0x40, 0x3F, 0x00, + 0x1C, 0xA4, 0xC4, 0xBC, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, + 0x3E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, + 0x81, 0xB9, 0xA5, 0xB9, 0xA5, 0x81, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0xFC, 0x00, + 0xF0, 0x18, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x30, 0x18, 0xF0, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0xC0, + 0x3E, 0x7A, 0x7A, 0x3A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, + 0x38, 0x44, 0x44, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00, + 0x40, 0xC6, 0x4C, 0x58, 0x32, 0x66, 0xCF, 0x02, 0x40, 0xC6, 0x4C, 0x58, 0x3E, 0x62, 0xC4, 0x0E, + 0xC0, 0x23, 0x66, 0x2C, 0xD9, 0x33, 0x67, 0x01, 0x18, 0x00, 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, + 0x60, 0x30, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x0C, 0x18, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0x38, 0xC6, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x71, 0x8E, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0x6C, 0x00, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x38, 0x44, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0x1F, 0x3C, 0x3C, 0x6F, 0x7C, 0xCC, 0xCF, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, + 0x60, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, + 0x30, 0xCC, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0xCC, 0x00, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, + 0x60, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0x18, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x30, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0xCC, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x78, 0x6C, 0x66, 0xF6, 0x66, 0x6C, 0x78, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, + 0x30, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0x18, 0x66, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0xC3, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, + 0x3F, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0xFC, 0x00, 0x30, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x0C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x06, 0x08, 0xC3, 0x66, 0x3C, 0x18, 0x18, 0x00, + 0x60, 0x60, 0x7E, 0x63, 0x7E, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x6C, 0x66, 0x66, 0x6C, 0x60, + 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x18, 0x66, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x71, 0x8E, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x00, 0x00, 0x7E, 0x1B, 0x7F, 0xD8, 0x77, 0x00, 0x00, 0x00, 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x18, + 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, + 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, + 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x60, 0xFC, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, + 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, + 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, + 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6, 0x7C, 0x80, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x00, 0x66, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30 }; const uint8 Display::_fontHebrew[] = { - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, - 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, - 0x30, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00, 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, - 0x38, 0x6C, 0x68, 0x36, 0xDC, 0xCC, 0x76, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0xC0, 0x60, 0x30, 0x30, 0x30, 0x60, 0xC0, 0x00, - 0x00, 0x6C, 0x38, 0xFE, 0x38, 0x6C, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x00, - 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x30, 0x70, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x00, - 0x78, 0xCC, 0x0C, 0x78, 0xC0, 0xC0, 0xFC, 0x00, 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, - 0x1C, 0x3C, 0x6C, 0xCC, 0xFC, 0x0C, 0x0C, 0x00, 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00, - 0x78, 0xCC, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00, 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, - 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, - 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0xC0, - 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, - 0xC0, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00, 0x30, 0x00, - 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x38, 0x7C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0xF8, 0xCC, 0xCC, 0xF8, 0xCC, 0xCC, 0xF8, 0x00, 0x78, 0xCC, 0xC0, 0xC0, 0xC0, 0xCC, 0x78, 0x00, - 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xFC, 0x00, - 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xC0, 0xDC, 0xCC, 0xCC, 0x7C, 0x00, - 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, - 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0xC6, 0xCC, 0xD8, 0xF8, 0xD8, 0xCC, 0xC6, 0x00, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0x00, 0x82, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, - 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, - 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x0C, - 0xF8, 0xCC, 0xCC, 0xF8, 0xD8, 0xCC, 0xCC, 0x00, 0x78, 0xCC, 0xC0, 0x78, 0x0C, 0xCC, 0x78, 0x00, - 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, - 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38, 0x10, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, - 0xC6, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x00, - 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0x00, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, - 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x00, - 0xE8, 0x4D, 0x4A, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, - 0xC0, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, - 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00, - 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, - 0x38, 0x6C, 0x60, 0xF8, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x78, - 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, - 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0x00, - 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xCC, 0xEE, 0xD6, 0xC6, 0xC6, 0x00, - 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, - 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, - 0x00, 0x00, 0xF8, 0xCC, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0x78, 0x00, - 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, - 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xD6, 0x6C, 0x6C, 0x00, - 0x00, 0x00, 0xCC, 0x78, 0x30, 0x78, 0xCC, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0xE0, - 0x00, 0x00, 0xFC, 0x18, 0x30, 0x60, 0xFC, 0x00, 0x38, 0x60, 0x60, 0xC0, 0x60, 0x60, 0x38, 0x00, - 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xE0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xE0, 0x00, - 0x38, 0x44, 0xBA, 0xAA, 0xBA, 0x44, 0x38, 0x00, 0x00, 0x98, 0x30, 0x60, 0xC8, 0x98, 0x30, 0x00, - 0xCC, 0x66, 0x76, 0xBC, 0x98, 0x8C, 0xE6, 0x00, 0xFC, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xFE, 0x00, - 0x78, 0x18, 0x18, 0x18, 0x38, 0x78, 0xD8, 0x00, 0xFE, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - 0xFE, 0x06, 0x06, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x7C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, - 0xDC, 0x66, 0xE6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0xF0, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xFE, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0xF8, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xF8, 0x00, - 0xC0, 0xFE, 0x06, 0x06, 0x0C, 0x18, 0x18, 0x00, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7E, 0x00, - 0xFC, 0x76, 0x66, 0x66, 0x66, 0x66, 0x6E, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, - 0xEE, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0xFE, 0xC6, 0xC6, 0xF6, 0x06, 0x06, 0x06, 0x06, - 0xFE, 0xC6, 0xC6, 0xFE, 0x06, 0x06, 0xFE, 0x00, 0xFE, 0x66, 0x6C, 0x78, 0x60, 0x60, 0x60, 0x60, - 0xEE, 0x66, 0x3C, 0x18, 0x0C, 0x06, 0xFE, 0x00, 0xFE, 0x06, 0x0E, 0xD8, 0xF0, 0xF0, 0xC0, 0xC0, - 0xFC, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0xEE, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x7C, 0x00, - 0xFF, 0x67, 0x67, 0x67, 0x67, 0x67, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x00, 0x0C, 0x3E, 0x6C, 0x3E, 0x0C, 0x00, 0x00, 0x38, 0x6C, 0x60, 0xF0, 0x60, 0x60, 0xFC, 0x00, - 0x42, 0x3C, 0x66, 0x3C, 0x42, 0x00, 0x00, 0x00, 0xC3, 0x66, 0x3C, 0x18, 0x3C, 0x18, 0x18, 0x00, - 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0x3C, 0x60, 0x3C, 0x66, 0x3C, 0x06, 0x3C, 0x00, - 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x4E, 0x58, 0x4E, 0x40, 0x3F, 0x00, - 0x1C, 0xA4, 0xC4, 0xBC, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, - 0x3E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, - 0x81, 0xB9, 0xA5, 0xB9, 0xA5, 0x81, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x78, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0xFC, 0x00, - 0xF0, 0x18, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x30, 0x18, 0xF0, 0x00, 0x00, 0x00, - 0x30, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0xC0, - 0x3E, 0x7A, 0x7A, 0x3A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, - 0x38, 0x44, 0x44, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00, - 0x40, 0xC6, 0x4C, 0x58, 0x32, 0x66, 0xCF, 0x02, 0x40, 0xC6, 0x4C, 0x58, 0x3E, 0x62, 0xC4, 0x0E, - 0xC0, 0x23, 0x66, 0x2C, 0xD9, 0x33, 0x67, 0x01, 0x18, 0x00, 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, - 0x60, 0x30, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x0C, 0x18, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0x38, 0xC6, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x71, 0x8E, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0x6C, 0x00, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x38, 0x44, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, - 0x1F, 0x3C, 0x3C, 0x6F, 0x7C, 0xCC, 0xCF, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, - 0x60, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, - 0x30, 0xCC, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0xCC, 0x00, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, - 0x60, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0x18, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x30, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0xCC, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, - 0x78, 0x6C, 0x66, 0xF6, 0x66, 0x6C, 0x78, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, - 0x30, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, - 0x18, 0x66, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, - 0xC3, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, - 0x3F, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0xFC, 0x00, 0x30, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x0C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x06, 0x08, 0xC3, 0x66, 0x3C, 0x18, 0x18, 0x00, - 0x60, 0x60, 0x7E, 0x63, 0x7E, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x6C, 0x66, 0x66, 0x6C, 0x60, - 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x18, 0x66, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x71, 0x8E, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, - 0x00, 0x00, 0x7E, 0x1B, 0x7F, 0xD8, 0x77, 0x00, 0x00, 0x00, 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x18, - 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, - 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, - 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, - 0x60, 0xFC, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, - 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, - 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, - 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x00, - 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6, 0x7C, 0x80, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, - 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, 0xF8, 0xB0, 0xB0, 0x80, 0xB0, 0xB0, 0xC0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0x00, + 0xD8, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x6C, 0xFE, 0x6C, 0xFE, 0x6C, 0x6C, 0x00, + 0x30, 0x7C, 0xC0, 0x78, 0x0C, 0xF8, 0x30, 0x00, 0x00, 0xC6, 0xCC, 0x18, 0x30, 0x66, 0xC6, 0x00, + 0x38, 0x6C, 0x68, 0x36, 0xDC, 0xCC, 0x76, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xC0, 0xC0, 0xC0, 0x60, 0x30, 0x00, 0xC0, 0x60, 0x30, 0x30, 0x30, 0x60, 0xC0, 0x00, + 0x00, 0x6C, 0x38, 0xFE, 0x38, 0x6C, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0xC0, 0x00, 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0x00, + 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, 0x30, 0x70, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x00, + 0x78, 0xCC, 0x0C, 0x78, 0xC0, 0xC0, 0xFC, 0x00, 0x78, 0xCC, 0x0C, 0x38, 0x0C, 0xCC, 0x78, 0x00, + 0x1C, 0x3C, 0x6C, 0xCC, 0xFC, 0x0C, 0x0C, 0x00, 0xFC, 0xC0, 0xF8, 0x0C, 0x0C, 0xCC, 0x78, 0x00, + 0x78, 0xCC, 0xC0, 0xF8, 0xCC, 0xCC, 0x78, 0x00, 0xFC, 0xCC, 0x0C, 0x18, 0x30, 0x30, 0x30, 0x00, + 0x78, 0xCC, 0xCC, 0x78, 0xCC, 0xCC, 0x78, 0x00, 0x78, 0xCC, 0xCC, 0x7C, 0x0C, 0xCC, 0x78, 0x00, + 0x00, 0xC0, 0xC0, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, 0x60, 0x60, 0xC0, + 0x18, 0x30, 0x60, 0xC0, 0x60, 0x30, 0x18, 0x00, 0x00, 0x00, 0xFC, 0x00, 0xFC, 0x00, 0x00, 0x00, + 0xC0, 0x60, 0x30, 0x18, 0x30, 0x60, 0xC0, 0x00, 0x78, 0xCC, 0x0C, 0x18, 0x30, 0x00, 0x30, 0x00, + 0x6C, 0xFE, 0xFE, 0xFE, 0x7C, 0x38, 0x10, 0x00, 0x38, 0x7C, 0xC6, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0xF8, 0xCC, 0xCC, 0xF8, 0xCC, 0xCC, 0xF8, 0x00, 0x78, 0xCC, 0xC0, 0xC0, 0xC0, 0xCC, 0x78, 0x00, + 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xFC, 0x00, + 0xFC, 0xC0, 0xC0, 0xF0, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xC0, 0xDC, 0xCC, 0xCC, 0x7C, 0x00, + 0xCC, 0xCC, 0xCC, 0xFC, 0xCC, 0xCC, 0xCC, 0x00, 0xF0, 0x60, 0x60, 0x60, 0x60, 0x60, 0xF0, 0x00, + 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0xCC, 0x78, 0x00, 0xC6, 0xCC, 0xD8, 0xF8, 0xD8, 0xCC, 0xC6, 0x00, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xFC, 0x00, 0x82, 0xC6, 0xEE, 0xFE, 0xD6, 0xC6, 0xC6, 0x00, + 0xC6, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0xC6, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x78, 0x00, + 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0xC0, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0xCC, 0xDC, 0x78, 0x0C, + 0xF8, 0xCC, 0xCC, 0xF8, 0xD8, 0xCC, 0xCC, 0x00, 0x78, 0xCC, 0xC0, 0x78, 0x0C, 0xCC, 0x78, 0x00, + 0xFC, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, + 0xC6, 0xC6, 0x6C, 0x6C, 0x38, 0x38, 0x10, 0x00, 0xC6, 0xC6, 0xC6, 0xD6, 0xFE, 0xEE, 0xC6, 0x00, + 0xC6, 0x6C, 0x38, 0x10, 0x38, 0x6C, 0xC6, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x00, + 0xFC, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xFC, 0x00, 0xF0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xF0, 0x00, + 0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x00, 0xF0, 0x30, 0x30, 0x30, 0x30, 0x30, 0xF0, 0x00, + 0xE8, 0x4D, 0x4A, 0x48, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0xC0, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x7C, 0xCC, 0x7C, 0x00, + 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xF8, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xC0, 0xCC, 0x78, 0x00, + 0x0C, 0x0C, 0x7C, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xFC, 0xC0, 0x78, 0x00, + 0x38, 0x6C, 0x60, 0xF8, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x78, + 0xC0, 0xC0, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, + 0x0C, 0x00, 0x0C, 0x0C, 0x0C, 0x0C, 0xCC, 0x78, 0xC0, 0xC0, 0xCC, 0xD8, 0xF0, 0xD8, 0xCC, 0x00, + 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0xCC, 0xEE, 0xD6, 0xC6, 0xC6, 0x00, + 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xCC, 0xCC, 0x00, 0x00, 0x00, 0x78, 0xCC, 0xCC, 0xCC, 0x78, 0x00, + 0x00, 0x00, 0xF8, 0xCC, 0xCC, 0xF8, 0xC0, 0xC0, 0x00, 0x00, 0x7C, 0xCC, 0xCC, 0x7C, 0x0C, 0x0C, + 0x00, 0x00, 0xF8, 0xCC, 0xC0, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x7C, 0xC0, 0x78, 0x0C, 0x78, 0x00, + 0x30, 0x30, 0xFC, 0x30, 0x30, 0x30, 0x30, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0x7C, 0x00, + 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0x00, 0x00, 0x00, 0xC6, 0xD6, 0xD6, 0x6C, 0x6C, 0x00, + 0x00, 0x00, 0xCC, 0x78, 0x30, 0x78, 0xCC, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0x78, 0x30, 0xE0, + 0x00, 0x00, 0xFC, 0x18, 0x30, 0x60, 0xFC, 0x00, 0x38, 0x60, 0x60, 0xC0, 0x60, 0x60, 0x38, 0x00, + 0xC0, 0xC0, 0xC0, 0x00, 0xC0, 0xC0, 0xC0, 0x00, 0xE0, 0x30, 0x30, 0x18, 0x30, 0x30, 0xE0, 0x00, + 0x38, 0x44, 0xBA, 0xAA, 0xBA, 0x44, 0x38, 0x00, 0x00, 0x98, 0x30, 0x60, 0xC8, 0x98, 0x30, 0x00, + 0xCC, 0x66, 0x76, 0xBC, 0x98, 0x8C, 0xE6, 0x00, 0xFC, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xFE, 0x00, + 0x78, 0x18, 0x18, 0x18, 0x38, 0x78, 0xD8, 0x00, 0xFE, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + 0xFE, 0x06, 0x06, 0xC6, 0xC6, 0xC6, 0xC6, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x7C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, + 0xDC, 0x66, 0xE6, 0xC6, 0xC6, 0xC6, 0x7C, 0x00, 0xF0, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0xF8, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0xF8, 0x00, + 0xC0, 0xFE, 0x06, 0x06, 0x0C, 0x18, 0x18, 0x00, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x66, 0x7E, 0x00, + 0xFC, 0x76, 0x66, 0x66, 0x66, 0x66, 0x6E, 0x00, 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, + 0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x00, 0xFE, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0xEE, 0x66, 0x66, 0x66, 0x66, 0x6C, 0xF8, 0x00, 0xFE, 0xC6, 0xC6, 0xF6, 0x06, 0x06, 0x06, 0x06, + 0xFE, 0xC6, 0xC6, 0xFE, 0x06, 0x06, 0xFE, 0x00, 0xFE, 0x66, 0x6C, 0x78, 0x60, 0x60, 0x60, 0x60, + 0xEE, 0x66, 0x3C, 0x18, 0x0C, 0x06, 0xFE, 0x00, 0xFE, 0x06, 0x0E, 0xD8, 0xF0, 0xF0, 0xC0, 0xC0, + 0xFC, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x00, 0xEE, 0xCA, 0xCA, 0xCA, 0xCA, 0xCA, 0x7C, 0x00, + 0xFF, 0x67, 0x67, 0x67, 0x67, 0x67, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x00, 0x0C, 0x3E, 0x6C, 0x3E, 0x0C, 0x00, 0x00, 0x38, 0x6C, 0x60, 0xF0, 0x60, 0x60, 0xFC, 0x00, + 0x42, 0x3C, 0x66, 0x3C, 0x42, 0x00, 0x00, 0x00, 0xC3, 0x66, 0x3C, 0x18, 0x3C, 0x18, 0x18, 0x00, + 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00, 0x3C, 0x60, 0x3C, 0x66, 0x3C, 0x06, 0x3C, 0x00, + 0x66, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x4E, 0x58, 0x4E, 0x40, 0x3F, 0x00, + 0x1C, 0xA4, 0xC4, 0xBC, 0x80, 0xFE, 0x00, 0x00, 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00, + 0x3E, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, + 0x81, 0xB9, 0xA5, 0xB9, 0xA5, 0x81, 0x7E, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x78, 0xCC, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0xFC, 0x30, 0x30, 0x00, 0xFC, 0x00, + 0xF0, 0x18, 0x30, 0x60, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x18, 0x30, 0x18, 0xF0, 0x00, 0x00, 0x00, + 0x30, 0x60, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCC, 0xCC, 0xCC, 0xCC, 0xFE, 0xC0, + 0x3E, 0x7A, 0x7A, 0x3A, 0x0A, 0x0A, 0x0A, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x60, 0x60, 0xE0, 0x60, 0x60, 0x60, 0x00, 0x00, 0x00, + 0x38, 0x44, 0x44, 0x38, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00, + 0x40, 0xC6, 0x4C, 0x58, 0x32, 0x66, 0xCF, 0x02, 0x40, 0xC6, 0x4C, 0x58, 0x3E, 0x62, 0xC4, 0x0E, + 0xC0, 0x23, 0x66, 0x2C, 0xD9, 0x33, 0x67, 0x01, 0x18, 0x00, 0x18, 0x30, 0x60, 0x66, 0x3C, 0x00, + 0x60, 0x30, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x0C, 0x18, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0x38, 0xC6, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x71, 0x8E, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0x6C, 0x00, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, 0x38, 0x44, 0x7C, 0xC6, 0xFE, 0xC6, 0xC6, 0x00, + 0x1F, 0x3C, 0x3C, 0x6F, 0x7C, 0xCC, 0xCF, 0x00, 0x1E, 0x30, 0x60, 0x60, 0x30, 0x1E, 0x0C, 0x18, + 0x60, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0x18, 0x30, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, + 0x30, 0xCC, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, 0xCC, 0x00, 0xFC, 0xC0, 0xF0, 0xC0, 0xFC, 0x00, + 0x60, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0x18, 0x30, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x30, 0xCC, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, 0xCC, 0x00, 0x78, 0x30, 0x30, 0x30, 0x78, 0x00, + 0x78, 0x6C, 0x66, 0xF6, 0x66, 0x6C, 0x78, 0x00, 0x71, 0xCE, 0xE6, 0xF6, 0xDE, 0xCE, 0xC6, 0x00, + 0x30, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0x18, 0x66, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x00, + 0xC3, 0x3C, 0x66, 0x66, 0x66, 0x66, 0x3C, 0x00, 0x00, 0xC6, 0x6C, 0x38, 0x6C, 0xC6, 0x00, 0x00, + 0x3F, 0x66, 0x6E, 0x7E, 0x76, 0x66, 0xFC, 0x00, 0x30, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x0C, 0x18, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x66, 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x06, 0x08, 0xC3, 0x66, 0x3C, 0x18, 0x18, 0x00, + 0x60, 0x60, 0x7E, 0x63, 0x7E, 0x60, 0x60, 0x00, 0x3C, 0x66, 0x66, 0x6C, 0x66, 0x66, 0x6C, 0x60, + 0x30, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x18, 0x66, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x71, 0x8E, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x66, 0x00, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, 0x18, 0x24, 0x3C, 0x06, 0x3E, 0x66, 0x3E, 0x00, + 0x00, 0x00, 0x7E, 0x1B, 0x7F, 0xD8, 0x77, 0x00, 0x00, 0x00, 0x3C, 0x60, 0x60, 0x60, 0x3C, 0x18, + 0x30, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x0C, 0x18, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, + 0x18, 0x66, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, 0x66, 0x00, 0x3C, 0x66, 0x7E, 0x60, 0x3C, 0x00, + 0x30, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x0C, 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x18, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, 0x00, 0x66, 0x00, 0x18, 0x18, 0x18, 0x18, 0x00, + 0x60, 0xFC, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x7C, 0x66, 0x66, 0x66, 0x00, + 0x30, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x0C, 0x18, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, + 0x18, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x71, 0x8E, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, + 0x00, 0x66, 0x00, 0x3C, 0x66, 0x66, 0x3C, 0x00, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x02, 0x7C, 0xCE, 0xD6, 0xE6, 0x7C, 0x80, 0x30, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x0C, 0x18, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x18, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, + 0x00, 0x66, 0x00, 0x66, 0x66, 0x66, 0x3E, 0x00, 0x0C, 0x18, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30, 0x60, 0x60, 0x7C, 0x66, 0x66, 0x7C, 0x60, 0x60, 0x00, 0x66, 0x00, 0x66, 0x66, 0x3C, 0x18, 0x30 }; diff --git a/engines/queen/display.h b/engines/queen/display.h index 953d8f95e8..62a17fc993 100644 --- a/engines/queen/display.h +++ b/engines/queen/display.h @@ -109,8 +109,11 @@ public: void blit(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, const uint8 *srcBuf, uint16 srcPitch, uint16 w, uint16 h, bool xflip, bool masked); void fill(uint8 *dstBuf, uint16 dstPitch, uint16 x, uint16 y, uint16 w, uint16 h, uint8 color); - //! decode a PCX stream - void readPCX(uint8 *dst, uint16 dstPitch, const uint8 *src, uint16 w, uint16 h); + //! decode PCX picture data + void decodePCX(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd); + + //! decode ILBM picture data + void decodeLBM(const uint8 *src, uint32 srcSize, uint8 *dst, uint16 dstPitch, uint16 *w, uint16 *h, uint8 *pal, uint16 palStart, uint16 palEnd, uint8 colorBase = 0); void horizontalScrollUpdate(int16 xCamera); void horizontalScroll(int16 scroll); @@ -223,6 +226,8 @@ private: uint16 _horizontalScroll; uint16 _bdWidth, _bdHeight; + const char *_imageExt; + //! texts list TextSlot _texts[GAME_SCREEN_HEIGHT]; diff --git a/engines/queen/graphics.cpp b/engines/queen/graphics.cpp index 60be8f86cc..6d79a71197 100644 --- a/engines/queen/graphics.cpp +++ b/engines/queen/graphics.cpp @@ -246,31 +246,76 @@ Graphics::~Graphics() { } void Graphics::unpackControlBank() { - _vm->bankMan()->load("control.BBK",17); - _vm->bankMan()->unpack(1, 1, 17); // Mouse pointer - // unpack arrows frames and change hotspot to be always on top - for (int i = 3; i <= 4; ++i) { - _vm->bankMan()->unpack(i, i, 17); - BobFrame *bf = _vm->bankMan()->fetchFrame(i); - bf->yhotspot += 200; + if (_vm->resource()->getPlatform() == Common::kPlatformPC) { + _vm->bankMan()->load("CONTROL.BBK",17); + + // unpack mouse pointer frame + _vm->bankMan()->unpack(1, 1, 17); + + // unpack arrows frames and change hotspot to be always on top + _vm->bankMan()->unpack(3, 3, 17); + _vm->bankMan()->fetchFrame(3)->yhotspot += 200; + _vm->bankMan()->unpack(4, 4, 17); + _vm->bankMan()->fetchFrame(4)->yhotspot += 200; + + _vm->bankMan()->close(17); } - _vm->bankMan()->close(17); } void Graphics::setupArrows() { - int scrollX = _vm->display()->horizontalScroll(); - BobSlot *arrow; - arrow = bob(ARROW_BOB_UP); - arrow->curPos(303 + 8 + scrollX, 150 + 1 + 200); - arrow->frameNum = 3; - arrow = bob(ARROW_BOB_DOWN); - arrow->curPos(303 + scrollX, 175 + 200); - arrow->frameNum = 4; + if (_vm->resource()->getPlatform() == Common::kPlatformPC) { + int scrollX = _vm->display()->horizontalScroll(); + BobSlot *arrow; + arrow = bob(ARROW_BOB_UP); + arrow->curPos(303 + 8 + scrollX, 150 + 1 + 200); + arrow->frameNum = 3; + arrow = bob(ARROW_BOB_DOWN); + arrow->curPos(303 + scrollX, 175 + 200); + arrow->frameNum = 4; + } } void Graphics::setupMouseCursor() { - BobFrame *bf = _vm->bankMan()->fetchFrame(1); - _vm->display()->setMouseCursor(bf->data, bf->width, bf->height); + if (_vm->resource()->getPlatform() == Common::kPlatformAmiga) { + static const uint8 defaultAmigaCursor[4 * 15] = { + 0x00, 0x00, 0xFF, 0xC0, + 0x7F, 0x80, 0x80, 0x40, + 0x7F, 0x00, 0x80, 0x80, + 0x7E, 0x00, 0x81, 0x00, + 0x7F, 0x00, 0x80, 0x80, + 0x7F, 0x80, 0x80, 0x40, + 0x7F, 0xC0, 0x80, 0x20, + 0x6F, 0xE0, 0x90, 0x10, + 0x47, 0xF0, 0xA8, 0x08, + 0x03, 0xF8, 0xC4, 0x04, + 0x01, 0xFC, 0x02, 0x02, + 0x00, 0xF8, 0x01, 0x04, + 0x00, 0x70, 0x00, 0x88, + 0x00, 0x20, 0x00, 0x50, + 0x00, 0x00, 0x00, 0x20 + }; + uint8 cursorData[16 * 15]; + const uint8 *src = defaultAmigaCursor; + int i = 0; + for (int h = 0; h < 15; ++h) { + for (int b = 0; b < 16; ++b) { + const uint16 mask = (1 << (15 - b)); + cursorData[i] = 0; + if (READ_BE_UINT16(src + 0) & mask) { + cursorData[i] |= 4; + } + if (READ_BE_UINT16(src + 2) & mask) { + cursorData[i] |= 8; + } + ++i; + } + src += 4; + } + _vm->display()->setMouseCursor(cursorData, 16, 15); + } else { + BobFrame *bf = _vm->bankMan()->fetchFrame(1); + _vm->display()->setMouseCursor(bf->data, bf->width, bf->height); + } } void Graphics::drawBob(const BobSlot *bs, const BobFrame *bf, const Box *bbox, int16 x, int16 y) { @@ -1119,7 +1164,7 @@ BamScene::BamScene(QueenEngine *vm) } void BamScene::playSfx() { - // Don't try to play all the sounds. This is only necessary for the + // Don't try to play all the sounds. This is only necessary for the // fight bam, in which the number of 'sfx bam frames' is too much // important / too much closer. The original game does not have // this problem since its playSfx() function returns immediately diff --git a/engines/queen/journal.cpp b/engines/queen/journal.cpp index b36b4bad31..5e722ef111 100644 --- a/engines/queen/journal.cpp +++ b/engines/queen/journal.cpp @@ -268,7 +268,7 @@ void Journal::handleMouseDown(int x, int y) { if (_saveDescriptions[currentSlot][0]) { _vm->graphics()->clearBobs(); _vm->display()->palFadeOut(ROOM_JOURNAL); - _vm->music()->stopSong(); + _vm->sound()->stopSong(); _vm->loadGameState(currentSlot); _vm->display()->clearTexts(0, GAME_SCREEN_HEIGHT - 1); _quitMode = QM_RESTORE; @@ -320,7 +320,7 @@ void Journal::handleMouseDown(int x, int y) { break; case ZN_MUSIC_VOLUME: val = (x - 136) * QueenEngine::MAX_MUSIC_VOLUME / (266 - 136); - _vm->music()->setVolume(val); + _vm->sound()->setVolume(val); drawConfigPanel(); break; case ZN_DESC_1: @@ -357,7 +357,7 @@ void Journal::handleMouseDown(int x, int y) { if (_vm->sound()->musicOn()) { _vm->sound()->playLastSong(); } else { - _vm->music()->stopSong(); + _vm->sound()->stopSong(); } drawConfigPanel(); break; @@ -447,7 +447,7 @@ void Journal::drawConfigPanel() { _vm->checkOptionSettings(); drawSlideBar(_vm->talkSpeed(), QueenEngine::MAX_TEXT_SPEED, BOB_TALK_SPEED, 164, FRAME_BLUE_PIN); - drawSlideBar(_vm->music()->volume(), QueenEngine::MAX_MUSIC_VOLUME, BOB_MUSIC_VOLUME, 177, FRAME_GREEN_PIN); + drawSlideBar(_vm->sound()->volume(), QueenEngine::MAX_MUSIC_VOLUME, BOB_MUSIC_VOLUME, 177, FRAME_GREEN_PIN); drawCheckBox(_vm->sound()->sfxOn(), BOB_SFX_TOGGLE, 221, 155, FRAME_CHECK_BOX); drawCheckBox(_vm->sound()->speechOn(), BOB_SPEECH_TOGGLE, 158, 155, FRAME_CHECK_BOX); @@ -468,12 +468,6 @@ void Journal::drawInfoPanel() { case 'a': _vm->display()->setTextCentered(132, "Amiga A500/600", false); break; - case 'A': - _vm->display()->setTextCentered(132, "Amiga A1200", false); - break; - case 'c': - _vm->display()->setTextCentered(132, "Amiga CD-32", false); - break; } switch (ver[1]) { case 'E': diff --git a/engines/queen/logic.cpp b/engines/queen/logic.cpp index f7a23eeb3d..848efb68b4 100644 --- a/engines/queen/logic.cpp +++ b/engines/queen/logic.cpp @@ -98,7 +98,8 @@ void Logic::readQueenJas() { } _roomData[_numRooms + 1] = _numObjects; - if (_vm->resource()->isDemo()) { + if ((_vm->resource()->isDemo() && _vm->resource()->getPlatform() == Common::kPlatformPC) || + (_vm->resource()->isInterview() && _vm->resource()->getPlatform() == Common::kPlatformAmiga)) { _sfxName = NULL; } else { _sfxName = new uint16[_numRooms + 1]; diff --git a/engines/queen/music.cpp b/engines/queen/music.cpp index bf7402e824..ccd7f9c86f 100644 --- a/engines/queen/music.cpp +++ b/engines/queen/music.cpp @@ -56,7 +56,7 @@ void MusicPlayer::setVolume(int volume) { volume = 255; if (_masterVolume == volume) - return; + return; _masterVolume = volume; diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp index 168f80f364..2363d29429 100644 --- a/engines/queen/queen.cpp +++ b/engines/queen/queen.cpp @@ -40,14 +40,11 @@ #include "queen/grid.h" #include "queen/input.h" #include "queen/logic.h" -#include "queen/music.h" #include "queen/resource.h" #include "queen/sound.h" #include "queen/talk.h" #include "queen/walk.h" -#include "sound/mididrv.h" - static const PlainGameDescriptor queenGameDescriptor = { "queen", "Flight of the Amazon Queen" }; @@ -80,7 +77,7 @@ GameList Engine_QUEEN_detectGames(const FSList &fslist) { } Queen::DetectedGameVersion version; if (Queen::Resource::detectVersion(&version, &dataFile)) { - GameDescriptor dg(queenGameDescriptor.gameid, queenGameDescriptor.description, version.language, Common::kPlatformPC); + GameDescriptor dg(queenGameDescriptor.gameid, queenGameDescriptor.description, version.language, version.platform); if (version.features & Queen::GF_DEMO) { dg.updateDesc("Demo"); } else if (version.features & Queen::GF_INTERVIEW) { @@ -123,7 +120,6 @@ QueenEngine::~QueenEngine() { delete _grid; delete _input; delete _logic; - delete _music; delete _sound; delete _walk; } @@ -153,7 +149,7 @@ void QueenEngine::checkOptionSettings() { } void QueenEngine::readOptionSettings() { - _music->setVolume(ConfMan.getInt("music_volume")); + _sound->setVolume(ConfMan.getInt("music_volume")); _sound->musicToggle(!ConfMan.getBool("music_mute")); _sound->sfxToggle(!ConfMan.getBool("sfx_mute")); _talkSpeed = (ConfMan.getInt("talkspeed") * (MAX_TEXT_SPEED - MIN_TEXT_SPEED) + 255 / 2) / 255 + MIN_TEXT_SPEED; @@ -163,7 +159,7 @@ void QueenEngine::readOptionSettings() { } void QueenEngine::writeOptionSettings() { - ConfMan.setInt("music_volume", _music->volume()); + ConfMan.setInt("music_volume", _sound->volume()); ConfMan.setBool("music_mute", !_sound->musicOn()); ConfMan.setBool("sfx_mute", !_sound->sfxOn()); ConfMan.setInt("talkspeed", ((_talkSpeed - MIN_TEXT_SPEED) * 255 + (MAX_TEXT_SPEED - MIN_TEXT_SPEED) / 2) / (MAX_TEXT_SPEED - MIN_TEXT_SPEED)); @@ -388,16 +384,6 @@ int QueenEngine::init() { // Set mixer music volume to maximum, since music volume is regulated by MusicPlayer's MIDI messages _mixer->setVolumeForSoundType(Audio::Mixer::kMusicSoundType, Audio::Mixer::kMaxMixerVolume); - int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); - bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - - MidiDriver *driver = MidiDriver::createMidi(midiDriver); - if (native_mt32) - driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); - - _music = new Music(driver, this); - _music->hasNativeMT32(native_mt32); - _sound = Sound::makeSoundInstance(_mixer, this, _resource->getCompression()); _walk = new Walk(this); //_talkspeedScale = (MAX_TEXT_SPEED - MIN_TEXT_SPEED) / 255.0; diff --git a/engines/queen/queen.h b/engines/queen/queen.h index d51ad97abc..c1a9b0f455 100644 --- a/engines/queen/queen.h +++ b/engines/queen/queen.h @@ -65,7 +65,6 @@ class Graphics; class Grid; class Input; class Logic; -class Music; class Resource; class Sound; class Walk; @@ -85,7 +84,6 @@ public: Grid *grid() const { return _grid; } Input *input() const { return _input; } Logic *logic() const { return _logic; } - Music *music() const { return _music; } Resource *resource() const { return _resource; } Sound *sound() const { return _sound; } Walk *walk() const { return _walk; } @@ -146,7 +144,6 @@ protected: Grid *_grid; Input *_input; Logic *_logic; - Music *_music; Resource *_resource; Sound *_sound; Walk *_walk; diff --git a/engines/queen/resource.cpp b/engines/queen/resource.cpp index 6945635818..cece71ae8b 100644 --- a/engines/queen/resource.cpp +++ b/engines/queen/resource.cpp @@ -46,7 +46,10 @@ const RetailGameVersion Resource::_gameVersions[] = { { "CHM10", 0x000DA981, 190705558 }, { "PE100", 0x00101EC6, 3724538 }, { "PE100", 0x00102B7F, 3732177 }, - { "PEint", 0x00103838, 1915913 } + { "PEint", 0x00103838, 1915913 }, + { "aEM10", 0x00103F1E, 351775 }, + { "CE101", 0x00107D8D, 563335 }, + { "PE100", 0x001086D4, 597032 } }; static int compareResourceEntry(const void *a, const void *b) { @@ -107,26 +110,41 @@ ResourceEntry *Resource::resourceEntry(const char *filename) const { return re; } +static uint8 emptyBank[] = { 0, 0 }; + uint8 *Resource::loadFile(const char *filename, uint32 skipBytes, uint32 *size) { + debug(7, "Resource::loadFile('%s')", filename); ResourceEntry *re = resourceEntry(filename); + if (_version.platform == Common::kPlatformAmiga && re == NULL) { + return emptyBank; + } assert(re != NULL); uint32 sz = re->size - skipBytes; if (size != NULL) { *size = sz; } - byte *dstBuf = new byte[sz]; - _resourceFile.seek(re->offset + skipBytes); - _resourceFile.read(dstBuf, sz); + if (re->bundle == 1) { + _resourceFile.seek(re->offset + skipBytes); + _resourceFile.read(dstBuf, sz); + } else { + Common::File resourceFile; + char name[20]; + sprintf(name, "queen.%d", re->bundle); + if (!resourceFile.open(name)) { + error("Could not open resource file '%s'", name); + } + resourceFile.seek(re->offset + skipBytes); + resourceFile.read(dstBuf, sz); + } return dstBuf; } bool Resource::detectVersion(DetectedGameVersion *ver, Common::File *f) { memset(ver, 0, sizeof(DetectedGameVersion)); - char versionStr[6]; if (f->readUint32BE() == MKID_BE('QTBL')) { - f->read(versionStr, 6); + f->read(ver->str, 6); f->skip(2); ver->compression = f->readByte(); ver->features = GF_REBUILT; @@ -137,13 +155,26 @@ bool Resource::detectVersion(DetectedGameVersion *ver, Common::File *f) { warning("Unknown/unsupported FOTAQ version"); return false; } - strcpy(versionStr, gameVersion->str); + strcpy(ver->str, gameVersion->str); ver->compression = COMPRESSION_NONE; ver->features = 0; ver->tableOffset = gameVersion->tableOffset; + strcpy(ver->str, gameVersion->str); + + // Handle game versions for which versionStr information is irrevelant + if (gameVersion == &_gameVersions[VER_AMI_DEMO]) { // CE101 + ver->features |= GF_FLOPPY | GF_DEMO; + ver->platform = Common::kPlatformAmiga; + return true; + } + if (gameVersion == &_gameVersions[VER_AMI_INTERVIEW]) { // PE100 + ver->features |= GF_FLOPPY | GF_INTERVIEW; + ver->platform = Common::kPlatformAmiga; + return true; + } } - switch (versionStr[1]) { + switch (ver->str[1]) { case 'E': if (Common::parseLanguage(ConfMan.get("language")) == Common::RU_RUS) { ver->language = Common::RU_RUS; @@ -167,33 +198,43 @@ bool Resource::detectVersion(DetectedGameVersion *ver, Common::File *f) { ver->language = Common::HB_ISR; break; default: - warning("Unknown language id '%c', defaulting to English", versionStr[1]); - ver->language = Common::EN_ANY; + error("Invalid language id '%c'", ver->str[1]); break; } - switch (versionStr[0]) { + switch (ver->str[0]) { case 'P': ver->features |= GF_FLOPPY; + ver->platform = Common::kPlatformPC; break; case 'C': ver->features |= GF_TALKIE; + ver->platform = Common::kPlatformPC; + break; + case 'a': + ver->features |= GF_FLOPPY; + ver->platform = Common::kPlatformAmiga; + break; + default: + error("Invalid platform id '%c'", ver->str[0]); break; } - if (strcmp(versionStr, "PE100") == 0) { + if (strcmp(ver->str + 2, "100") == 0 || strcmp(ver->str + 2, "101") == 0) { ver->features |= GF_DEMO; - } else if (strcmp(versionStr, "PEint") == 0) { + } else if (strcmp(ver->str + 2, "int") == 0) { ver->features |= GF_INTERVIEW; } - - strcpy(ver->str, versionStr); return true; } void Resource::checkJASVersion() { + if (_version.platform == Common::kPlatformAmiga) { + warning("Resource::checkJASVersion() disabled for Amiga versions"); + return; + } ResourceEntry *re = resourceEntry("QUEEN.JAS"); - assert(re != NULL); + assert(re != NULL && re->bundle == 1); uint32 offset = re->offset; if (isDemo()) offset += JAS_VERSION_OFFSET_DEMO; @@ -252,17 +293,14 @@ const RetailGameVersion *Resource::detectGameVersionFromSize(uint32 size) { } Common::File *Resource::findSound(const char *filename, uint32 *size) { - assert(strstr(filename, ".SB")); - Common::File *f = NULL; + assert(strstr(filename, ".SB") != NULL || strstr(filename, ".AMR") != NULL); ResourceEntry *re = resourceEntry(filename); - if (re) { - if (size != NULL) { - *size = re->size; - } + if (re && re->bundle == 1) { + *size = re->size; _resourceFile.seek(re->offset); - f = &_resourceFile; + return &_resourceFile; } - return f; + return NULL; } LineReader::LineReader(char *buffer, uint32 bufsize) : _buffer(buffer), _bufSize(bufsize), _current(0) { diff --git a/engines/queen/resource.h b/engines/queen/resource.h index 2e669198fb..2c16e51b82 100644 --- a/engines/queen/resource.h +++ b/engines/queen/resource.h @@ -44,6 +44,7 @@ struct RetailGameVersion { }; struct DetectedGameVersion { + Common::Platform platform; Common::Language language; uint8 features; uint8 compression; @@ -87,29 +88,34 @@ public: //! returns the language of the game Common::Language getLanguage() const { return _version.language; } + Common::Platform getPlatform() const { return _version.platform; } + //! detect game version static bool detectVersion(DetectedGameVersion *ver, Common::File *f); enum Version { - VER_ENG_FLOPPY = 0, - VER_ENG_TALKIE = 1, - VER_FRE_FLOPPY = 2, - VER_FRE_TALKIE = 3, - VER_GER_FLOPPY = 4, - VER_GER_TALKIE = 5, - VER_ITA_FLOPPY = 6, - VER_ITA_TALKIE = 7, - VER_SPA_TALKIE = 8, - VER_HEB_TALKIE = 9, - VER_DEMO_PCGAMES = 10, - VER_DEMO = 11, - VER_INTERVIEW = 12, - - VER_COUNT = 13 + VER_ENG_FLOPPY = 0, + VER_ENG_TALKIE = 1, + VER_FRE_FLOPPY = 2, + VER_FRE_TALKIE = 3, + VER_GER_FLOPPY = 4, + VER_GER_TALKIE = 5, + VER_ITA_FLOPPY = 6, + VER_ITA_TALKIE = 7, + VER_SPA_TALKIE = 8, + VER_HEB_TALKIE = 9, + VER_DEMO_PCGAMES = 10, + VER_DEMO = 11, + VER_INTERVIEW = 12, + VER_AMI_ENG_FLOPPY = 13, + VER_AMI_DEMO = 14, + VER_AMI_INTERVIEW = 15, + + VER_COUNT = 16 }; enum { - CURRENT_TBL_VERSION = 1 + CURRENT_TBL_VERSION = 2 }; enum { diff --git a/engines/queen/sound.cpp b/engines/queen/sound.cpp index 917351f3da..e228d6a1dd 100644 --- a/engines/queen/sound.cpp +++ b/engines/queen/sound.cpp @@ -21,45 +21,47 @@ */ #include "common/stdafx.h" +#include "common/config-manager.h" #include "common/endian.h" +#include "common/stream.h" #include "queen/sound.h" - #include "queen/input.h" +#include "queen/logic.h" #include "queen/music.h" #include "queen/queen.h" #include "queen/resource.h" #include "sound/flac.h" +#include "sound/mididrv.h" #include "sound/mp3.h" #include "sound/vorbis.h" #define SB_HEADER_SIZE_V104 110 #define SB_HEADER_SIZE_V110 122 -#define STOP_MUSIC -1 namespace Queen { -class SilentSound : public Sound { +class SilentSound : public PCSound { public: - SilentSound(Audio::Mixer *mixer, QueenEngine *vm) : Sound(mixer, vm) {} + SilentSound(Audio::Mixer *mixer, QueenEngine *vm) : PCSound(mixer, vm) {} protected: void playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) { // Do nothing } }; -class SBSound : public Sound { +class SBSound : public PCSound { public: - SBSound(Audio::Mixer *mixer, QueenEngine *vm) : Sound(mixer, vm) {} + SBSound(Audio::Mixer *mixer, QueenEngine *vm) : PCSound(mixer, vm) {} protected: void playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle); }; #ifdef USE_MAD -class MP3Sound : public Sound { +class MP3Sound : public PCSound { public: - MP3Sound(Audio::Mixer *mixer, QueenEngine *vm) : Sound(mixer, vm) {} + MP3Sound(Audio::Mixer *mixer, QueenEngine *vm) : PCSound(mixer, vm) {} protected: void playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) { _mixer->playInputStream(Audio::Mixer::kSFXSoundType, soundHandle, Audio::makeMP3Stream(f, size)); @@ -68,9 +70,9 @@ protected: #endif #ifdef USE_VORBIS -class OGGSound : public Sound { +class OGGSound : public PCSound { public: - OGGSound(Audio::Mixer *mixer, QueenEngine *vm) : Sound(mixer, vm) {} + OGGSound(Audio::Mixer *mixer, QueenEngine *vm) : PCSound(mixer, vm) {} protected: void playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) { _mixer->playInputStream(Audio::Mixer::kSFXSoundType, soundHandle, Audio::makeVorbisStream(f, size)); @@ -79,9 +81,9 @@ protected: #endif #ifdef USE_FLAC -class FLACSound : public Sound { +class FLACSound : public PCSound { public: - FLACSound(Audio::Mixer *mixer, QueenEngine *vm) : Sound(mixer, vm) {}; + FLACSound(Audio::Mixer *mixer, QueenEngine *vm) : PCSound(mixer, vm) {}; protected: void playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) { _mixer->playInputStream(Audio::Mixer::kSFXSoundType, soundHandle, Audio::makeFlacStream(f, size)); @@ -90,15 +92,13 @@ protected: #endif // #ifdef USE_FLAC Sound::Sound(Audio::Mixer *mixer, QueenEngine *vm) : - _mixer(mixer), _vm(vm), _sfxToggle(true), _speechToggle(true), _musicToggle(true), _lastOverride(0) { -#ifdef ENABLE_AMIGA_MUSIC - _lastModuleOverride = -1; -#endif + _mixer(mixer), _vm(vm), _sfxToggle(true), _speechToggle(true), _musicToggle(true), + _speechSfxExists(false), _lastOverride(0), _masterVolume(0) { } Sound *Sound::makeSoundInstance(Audio::Mixer *mixer, QueenEngine *vm, uint8 compression) { - if (!mixer->isReady()) - return new SilentSound(mixer, vm); + if (vm->resource()->getPlatform() == Common::kPlatformAmiga) + return new AmigaSound(mixer, vm); switch (compression) { case COMPRESSION_NONE: @@ -130,135 +130,52 @@ Sound *Sound::makeSoundInstance(Audio::Mixer *mixer, QueenEngine *vm, uint8 comp } } -void Sound::waitFinished(bool isSpeech) { - while (_mixer->isSoundHandleActive(isSpeech ? _speechHandle : _sfxHandle)) - _vm->input()->delay(10); -} - -void Sound::playSfx(uint16 sfx) { - if (sfxOn() && sfx != 0) { -#ifndef PALMOS_68K - playSound(_sfxName[sfx - 1], false); -#else - playSound(_sfxName + 10 * (sfx - 1), false); // saved as 8char + /0/0 -#endif - } -} - -void Sound::playSpeech(const char *base) { - if (speechOn()) { - playSound(base, true); - } +void Sound::saveState(byte *&ptr) { + WRITE_BE_UINT16(ptr, _lastOverride); ptr += 2; } -void Sound::playSound(const char *base, bool isSpeech) { - char name[13]; - strcpy(name, base); - // alter filename to add zeros and append ".SB" - for (int i = 0; i < 8; i++) { - if (name[i] == ' ') - name[i] = '0'; - } - strcat(name, ".SB"); - waitFinished(isSpeech); - uint32 size; - Common::File *f = _vm->resource()->findSound(name, &size); - if (f) { - playSoundData(f, size, isSpeech ? &_speechHandle : &_sfxHandle); - _speechSfxExists = isSpeech; - } else { - _speechSfxExists = false; - } +void Sound::loadState(uint32 ver, byte *&ptr) { + _lastOverride = (int16)READ_BE_INT16(ptr); ptr += 2; } -#ifdef ENABLE_AMIGA_MUSIC - -static struct { - const char *name; - uint8 songNum; - uint8 remapSongNumTable[6]; -} amigaMusicData[] = { - { "HOTEL", 1, { 1, 2, 39, 0 } }, - { "HOTEL", 2, { 20, 30, 34, 0 } }, - { "HOTEL", 3, { 19, 0 } }, - { "HOTEL", 4, { 29, 35, 36, 0 } }, - { "JUNG", 1, { 40, 0 } }, - { "JUNG", 2, { 3, 38, 89, 0 } }, - { "TEMPLE", 1, { 54, 0 } }, - { "TEMPLE", 2, { 12, 0 } }, - { "TEMPLE", 3, { 7, 9, 10, 11, 0 } }, - { "TEMPLE", 4, { 31, 0 } }, - { "FLODA", 1, { 16, 0 } }, - { "FLODA", 2, { 17, 0 } }, - { "FLODA", 3, { 13, 0 } }, - { "FLODA", 4, { 41, 0 } }, - { "FLODA", 5, { 30, 43, 0 } }, - { "TITLE", 1, { 67, 88, 203, 0 } }, - { "AWESTRUK", 1, { 37, 52, 90, 196, 0 } }, - { "'JUNGLE'", 1, { 91, 0 } }, - { "FRANK", 1, { 46, 0 } }, - { "BOB", 1, { 6, 0 } }, - { "AZURA", 1, { 44, 53, 204, 0 } }, - { "FORT", 1, { 21, 0 } }, - { "ROCKET", 1, { 32, 194, 195, 0 } }, - { "ROBOT", 1, { 92, 0 } } -}; - -void Sound::playSong(int16 songNum) { - debug(2, "Sound::playSong %d override %d/%d", songNum, _lastModuleOverride, _lastOverride); +PCSound::PCSound(Audio::Mixer *mixer, QueenEngine *vm) + : Sound(mixer, vm) { - const char *moduleName = 0; - for (int i = 0; i < ARRAYSIZE(amigaMusicData) && !moduleName; ++i) { - for (int j = 0; amigaMusicData[i].remapSongNumTable[j] != 0; ++j) { - if (amigaMusicData[i].remapSongNumTable[j] == songNum) { - moduleName = amigaMusicData[i].name; - songNum = amigaMusicData[i].songNum; + int midiDriver = MidiDriver::detectMusicDriver(MDT_MIDI | MDT_ADLIB | MDT_PREFER_MIDI); + bool native_mt32 = ((midiDriver == MD_MT32) || ConfMan.getBool("native_mt32")); - if (_lastModuleOverride == i && _lastOverride == songNum) - return; + MidiDriver *driver = MidiDriver::createMidi(midiDriver); + if (native_mt32) + driver->property(MidiDriver::PROP_CHANNEL_MASK, 0x03FE); - _lastModuleOverride = i; - _lastOverride = songNum; - break; - } - } - } - if (!moduleName) - return; - - _mixer->stopHandle(_musicHandle); - - debug(1, "playAmigaSong name '%s' subsong %d", moduleName, songNum); - - char buf[16]; - sprintf(buf, "%s.SNG", moduleName); - Common::File fsng; - if (!fsng.open(buf)) - return; - - sprintf(buf, "%s.INS", moduleName); - Common::File fins; - if (!fins.open(buf)) - return; + _music = new Music(driver, vm); + _music->hasNativeMT32(native_mt32); +} - Audio::AudioStream *rjp1Stream = Audio::makeRjp1Stream(&fsng, &fins, songNum); - if (rjp1Stream) { - _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_musicHandle, rjp1Stream); - } +PCSound::~PCSound() { + delete _music; } +void PCSound::playSfx(uint16 sfx) { + if (sfxOn() && sfx != 0) { +#ifndef PALMOS_68K + playSound(_sfxName[sfx - 1], false); #else + playSound(_sfxName + 10 * (sfx - 1), false); // saved as 8char + /0/0 +#endif + } +} -void Sound::playSong(int16 songNum) { +void PCSound::playSong(int16 songNum) { if (songNum <= 0) { - _vm->music()->stopSong(); + _music->stopSong(); return; } int16 newTune; if (_vm->resource()->isDemo()) { if (songNum == 17) { - _vm->music()->stopSong(); + _music->stopSong(); return; } newTune = _songDemo[songNum - 1].tuneList[0] - 1; @@ -281,25 +198,58 @@ void Sound::playSong(int16 songNum) { break; // Alter song settings (such as volume) and exit case 2: - _vm->music()->toggleVChange(); + _music->toggleVChange(); default: return; } _lastOverride = songNum; - _vm->music()->queueTuneList(newTune); - _vm->music()->playMusic(); + _music->queueTuneList(newTune); + _music->playMusic(); } -#endif // ENABLE_AMIGA_MUSIC +void PCSound::stopSong() { + _music->stopSong(); +} -void Sound::saveState(byte *&ptr) { - WRITE_BE_UINT16(ptr, _lastOverride); ptr += 2; +void PCSound::playSpeech(const char *base) { + if (speechOn()) { + playSound(base, true); + } } -void Sound::loadState(uint32 ver, byte *&ptr) { - _lastOverride = (int16)READ_BE_INT16(ptr); ptr += 2; +void PCSound::setVolume(int vol) { + _music->setVolume(vol); +} + +int PCSound::volume() { + return _music->volume(); +} + +void PCSound::waitFinished(bool isSpeech) { + while (_mixer->isSoundHandleActive(isSpeech ? _speechHandle : _sfxHandle)) + _vm->input()->delay(10); +} + +void PCSound::playSound(const char *base, bool isSpeech) { + char name[13]; + strcpy(name, base); + // alter filename to add zeros and append ".SB" + for (int i = 0; i < 8; i++) { + if (name[i] == ' ') + name[i] = '0'; + } + strcat(name, ".SB"); + waitFinished(isSpeech); + uint32 size; + Common::File *f = _vm->resource()->findSound(name, &size); + if (f) { + playSoundData(f, size, isSpeech ? &_speechHandle : &_sfxHandle); + _speechSfxExists = isSpeech; + } else { + _speechSfxExists = false; + } } void SBSound::playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) { @@ -328,4 +278,425 @@ void SBSound::playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *so } } +AmigaSound::AmigaSound(Audio::Mixer *mixer, QueenEngine *vm) + : Sound(mixer, vm), _fanfareRestore(0), _fanfareCount(0), _fluteCount(0) { +} + +void AmigaSound::playSfx(uint16 sfx) { + if (_vm->logic()->currentRoom() == 111) { + // lightning sound + playSound("88SSSSSS"); + } +} + +void AmigaSound::playSong(int16 song) { + debug(2, "Sound::playSong %d override %d", song, _lastOverride); + + if (song < 0) { + stopSong(); + return; + } + + // remap song numbers for the Amiga + switch (song) + { + case 1: + case 2: + song = 39; + break; + case 37: + case 52: + case 196: + song = 90; + break; + case 38: + case 89: + song = 3; + break; + case 24: + case 158: + song = 117; + break; + case 71: + case 72: + case 73: + case 75: + song = 133; + break; + case 203: + song = 67; + break; + case 145: + song = 140; + break; + case 53: + case 204: + song = 44; + break; + case 136: + case 142: + case 179: + song = 86; + break; + case 101: + case 102: + case 143: + song = 188; + break; + case 65: + case 62: + song = 69; + break; + case 118: + case 119: + song = 137; + break; + case 130: + case 131: + song = 59; + break; + case 174: + case 175: + song = 57; + break; + case 171: + case 121: + song = 137; + break; + case 138: + case 170: + case 149: + song = 28; + break; + case 122: + case 180: + case 83: + case 98: + song = 83; + break; + case 20: + case 33: + song = 34; + break; + case 29: + case 35: + song = 36; + break; + case 7: + case 9: + case 10: + song = 11; + break; + case 110: + song = 94; + break; + case 111: + song = 95; + break; + case 30: + song = 43; + break; + case 76: + song = 27; + break; + case 194: + case 195: + song = 32; + break; + } + + if (_lastOverride != 32 && _lastOverride != 44) { + if (playSpecialSfx(song)) { + return; + } + } + + if (_lastOverride == song && _mixer->isSoundHandleActive(_modHandle)) { + return; + } + switch (song) { + // hotel + case 39: + playModule("HOTEL", 1); + break; + case 19: + playModule("HOTEL", 3); + break; + case 34: + playModule("HOTEL", 2); + break; + case 36: + playModule("HOTEL", 4); + _fanfareRestore = _lastOverride; + _fanfareCount = 60; + break; + // jungle + case 40: + playModule("JUNG", 1); + _fanfareRestore = _lastOverride; + _fanfareCount = 80; + _fluteCount = 100; + break; + case 3: + playModule("JUNG", 2); + _fluteCount = 100; + break; + // temple + case 54: + playModule("TEMPLE", 1); + break; + case 12: + playModule("TEMPLE", 2); + break; + case 11: + playModule("TEMPLE", 3); + break; + case 31: + playModule("TEMPLE", 4); + _fanfareRestore = _lastOverride; + _fanfareCount = 80; + break; + // floda + case 41: + playModule("FLODA", 4); + _fanfareRestore = _lastOverride; + _fanfareCount = 60; + break; + case 13: + playModule("FLODA", 3); + break; + case 16: + playModule("FLODA", 1); + break; + case 17: + playModule("FLODA", 2); + break; + case 43: + playModule("FLODA", 5); + break; + // end credits + case 67: + playModule("TITLE", 1); + break; + // intro credits + case 88: + playModule("TITLE", 1); + break; + // valley + case 90: + playModule("AWESTRUK", 1); + break; + // confrontation + case 91: + playModule("'JUNGLE'", 1); + break; + // Frank + case 46: + playModule("FRANK", 1); + break; + // trader bob + case 6: + playModule("BOB", 1); + break; + // azura + case 44: + playModule("AZURA", 1); + break; + // amazon fortress + case 21: + playModule("FORT", 1); + break; + // rocket + case 32: + playModule("ROCKET", 1); + break; + // robot + case 92: + playModule("ROBOT", 1); + break; + default: + // song not available in the amiga version + return; + } + _lastOverride = song; +} + +void AmigaSound::stopSfx() { + _mixer->stopHandle(_sfxHandle); +} + +void AmigaSound::stopSong() { + _mixer->stopHandle(_modHandle); + _fanfareCount = _fluteCount = 0; +} + +void AmigaSound::updateMusic() { + if (_fanfareCount > 0) { + --_fanfareCount; + if (_fanfareCount == 0) { + playSong(_fanfareRestore); + } + } + if (_fluteCount > 0 && (_lastOverride == 40 || _lastOverride == 3)) { + --_fluteCount; + if (_fluteCount == 0) { +// playPattern(3, 5 + (getRandomNumber() & 7)); + _fluteCount = 100; + } + } +} + +void AmigaSound::playSound(const char *base) { + char soundName[20]; + sprintf(soundName, "%s.AMR", base); + + uint32 soundSize; + Common::File *f = _vm->resource()->findSound(soundName, &soundSize); + if (f) { + uint8 *soundData = (uint8 *)malloc(soundSize); + if (soundData) { + f->read(soundData, soundSize); + byte flags = Audio::Mixer::FLAG_AUTOFREE; + _mixer->playRaw(Audio::Mixer::kSFXSoundType, &_sfxHandle, soundData, soundSize, 11025, flags); + } + } +} + +void AmigaSound::playModule(const char *base, int song) { + char name[20]; + + // load song/pattern data + uint32 sngDataSize; + sprintf(name, "%s.SNG", base); + uint8 *sngData = _vm->resource()->loadFile(name, 0, &sngDataSize); + Common::MemoryReadStream sngStr(sngData, sngDataSize); + + // load instruments/wave data + uint32 insDataSize; + sprintf(name, "%s.INS", base); + uint8 *insData = _vm->resource()->loadFile(name, 0, &insDataSize); + Common::MemoryReadStream insStr(insData, insDataSize); + + _mixer->stopHandle(_modHandle); + Audio::AudioStream *stream = Audio::makeRjp1Stream(&sngStr, &insStr, song, _mixer->getOutputRate()); + if (stream) { + _mixer->playInputStream(Audio::Mixer::kMusicSoundType, &_modHandle, stream); + } + + delete[] sngData; + delete[] insData; + + _fanfareCount = 0; +} + +bool AmigaSound::playSpecialSfx(int16 sfx) { + switch (sfx) { + case 5: // normal volume + break; + case 15: // soft volume + break; + case 14: // medium volume + break; + case 25: // open door + playSound("116BSSSS"); + break; + case 26: // close door + playSound("105ASSSS"); + break; + case 56: // light switch + playSound("27SSSSSS"); + break; + case 57: // hydraulic doors open + playSound("96SSSSSS"); + break; + case 58: // hydraulic doors close + playSound("97SSSSSS"); + break; + case 59: // metallic door slams + playSound("105SSSSS"); + break; + case 63: // oracle rezzes in + playSound("132SSSSS"); + break; + case 27: // cloth slide 1 + playSound("135SSSSS"); + break; + case 83: // splash + playSound("18SSSSSS"); + break; + case 85: // agression enhancer + playSound("138BSSSS"); + break; + case 68: // dino ray + playSound("138SSSSS"); + break; + case 140: // dino transformation + playSound("55BSSSSS"); + break; + case 141: // experimental laser + playSound("55SSSSSS"); + break; + case 94: // plane hatch open + playSound("3SSSSSSS"); + break; + case 95: // plane hatch close + playSound("4SSSSSSS"); + break; + case 117: // oracle rezzes out + playSound("70SSSSSS"); + break; + case 124: // dino horn + playSound("103SSSSS"); + break; + case 127: // punch + playSound("128SSSSS"); + break; + case 128: // body hits ground + playSound("129SSSSS"); + break; + case 137: // explosion + playSound("88SSSSSS"); + break; + case 86: // stone door grind 1 + playSound("1001SSSS"); + break; + case 188: // stone door grind 2 + playSound("1002SSSS"); + break; + case 28: // cloth slide 2 + playSound("1005SSSS"); + break; + case 151: // rattle bars + playSound("115SSSSS"); + break; + case 152: // door dissolves + playSound("56SSSSSS"); + break; + case 153: // altar slides + playSound("85SSSSSS"); + break; + case 166 : // pull lever + playSound("1008SSSS"); + break; + case 182: // zap Frank + playSound("1023SSSS"); + break; + case 69: // splorch + playSound("137ASSSS"); + break; + case 70: // robot laser + playSound("61SSSSSS"); + break; + case 133: // pick hits stone + playSound("71SSSSSS"); + break; + case 165: // press button + playSound("1007SSSS"); + break; + default: + return false; + } + return true; +} + } //End of namespace Queen diff --git a/engines/queen/sound.h b/engines/queen/sound.h index 38dadd7ece..c93714e0d9 100644 --- a/engines/queen/sound.h +++ b/engines/queen/sound.h @@ -28,18 +28,12 @@ #include "sound/mods/rjp1.h" #include "queen/defs.h" -// define this to enable amiga "rjp1" modules playback -//#define ENABLE_AMIGA_MUSIC 1 - namespace Common { class File; } namespace Queen { -class Input; -class Resource; - struct songData { int16 tuneList[5]; int16 volume; @@ -56,6 +50,7 @@ struct tuneData { int16 delay; }; +class Music; class QueenEngine; class Sound { @@ -68,27 +63,33 @@ public: */ static Sound *makeSoundInstance(Audio::Mixer *mixer, QueenEngine *vm, uint8 compression); - void playSfx(uint16 sfx); - void playSpeech(const char *base); - void playSong(int16 songNum); + virtual void playSfx(uint16 sfx) {} + virtual void playSong(int16 songNum) {} + virtual void playSpeech(const char *base) {} + + virtual void stopSfx() {} + virtual void stopSong() {} + virtual void stopSpeech() {} + + virtual bool isSpeechActive() const { return false; } + virtual bool isSfxActive() const { return false; } + + virtual void setVolume(int vol) { _masterVolume = vol; } + virtual int volume() { return _masterVolume; } + void playLastSong() { playSong(_lastOverride); } - void stopSpeech() { _mixer->stopHandle(_speechHandle); } - void stopSfx() { _mixer->stopHandle(_sfxHandle); } bool sfxOn() const { return _sfxToggle; } void sfxToggle(bool val) { _sfxToggle = val; } - void toggleSfx() { _sfxToggle ^= true; } + void toggleSfx() { _sfxToggle = !_sfxToggle; } bool speechOn() const { return _speechToggle; } void speechToggle(bool val) { _speechToggle = val; } - void toggleSpeech() { _speechToggle ^= true; } + void toggleSpeech() { _speechToggle = !_speechToggle; } bool musicOn() const { return _musicToggle; } void musicToggle(bool val) { _musicToggle = val; } - void toggleMusic() { _musicToggle ^= true; } - - bool isSpeechActive() const { return _mixer->isSoundHandleActive(_speechHandle); } - bool isSfxActive() const { return _mixer->isSoundHandleActive(_sfxHandle); } + void toggleMusic() { _musicToggle = !_musicToggle; } bool speechSfxExists() const { return _speechSfxExists; } @@ -114,9 +115,6 @@ public: #endif protected: - void waitFinished(bool isSpeech); - void playSound(const char *base, bool isSpeech); - virtual void playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) = 0; Audio::Mixer *_mixer; QueenEngine *_vm; @@ -127,12 +125,63 @@ protected: bool _speechSfxExists; int16 _lastOverride; + int _masterVolume; +}; + +class PCSound : public Sound { +public: + PCSound(Audio::Mixer *mixer, QueenEngine *vm); + ~PCSound(); + + void playSfx(uint16 sfx); + void playSpeech(const char *base); + void playSong(int16 songNum); + + void stopSfx() { _mixer->stopHandle(_sfxHandle); } + void stopSong(); + void stopSpeech() { _mixer->stopHandle(_speechHandle); } + + bool isSpeechActive() const { return _mixer->isSoundHandleActive(_speechHandle); } + bool isSfxActive() const { return _mixer->isSoundHandleActive(_sfxHandle); } + + void setVolume(int vol); + int volume(); + +protected: + void waitFinished(bool isSpeech); + void playSound(const char *base, bool isSpeech); + + virtual void playSoundData(Common::File *f, uint32 size, Audio::SoundHandle *soundHandle) = 0; + Audio::SoundHandle _sfxHandle; Audio::SoundHandle _speechHandle; -#ifdef ENABLE_AMIGA_MUSIC - int16 _lastModuleOverride; - Audio::SoundHandle _musicHandle; -#endif + Music *_music; +}; + +class AmigaSound : public Sound { +public: + AmigaSound(Audio::Mixer *mixer, QueenEngine *vm); + + void playSfx(uint16 sfx); + void playSong(int16 song); + + void stopSfx(); + void stopSong(); + + void updateMusic(); + + bool isSfxActive() const { return false; } + +protected: + + void playSound(const char *base); + void playModule(const char *base, int song); + bool playSpecialSfx(int16 sfx); + + int16 _fanfareRestore; + int _fanfareCount, _fluteCount; + Audio::SoundHandle _modHandle; + Audio::SoundHandle _sfxHandle; }; } // End of namespace Queen diff --git a/engines/queen/talk.cpp b/engines/queen/talk.cpp index 5d1cb6e447..17cf56d60b 100644 --- a/engines/queen/talk.cpp +++ b/engines/queen/talk.cpp @@ -350,9 +350,9 @@ byte *Talk::loadDialogFile(const char *filename) { const char *filename; Common::Language language; } dogFiles[] = { - { "chief1.dog", Common::FR_FRA }, - { "chief2.dog", Common::FR_FRA }, - { "bud1.dog", Common::IT_ITA } + { "CHIEF1.DOG", Common::FR_FRA }, + { "CHIEF2.DOG", Common::FR_FRA }, + { "BUD1.DOG", Common::IT_ITA } }; for (int i = 0; i < ARRAYSIZE(dogFiles); ++i) { if (!scumm_stricmp(filename, dogFiles[i].filename) && |