diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/agos/agos.h | 20 | ||||
-rw-r--r-- | engines/agos/icons.cpp | 106 | ||||
-rw-r--r-- | engines/agos/window.cpp | 83 |
3 files changed, 157 insertions, 52 deletions
diff --git a/engines/agos/agos.h b/engines/agos/agos.h index 5d4a300285..3f2fcd6c06 100644 --- a/engines/agos/agos.h +++ b/engines/agos/agos.h @@ -780,7 +780,8 @@ protected: virtual void handleMouseMoved(); virtual void drawMousePointer(); - virtual void addArrows(WindowBlock *window); + void drawArrow(uint16 x, uint16 y, int8 dir); + virtual void addArrows(WindowBlock *window, uint8 num); void removeArrows(WindowBlock *window, uint num); virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y); @@ -1118,9 +1119,10 @@ protected: void sendWindow(uint a); - void restoreWindow(WindowBlock *window); - void colorWindow(WindowBlock *window); + virtual void colorWindow(WindowBlock *window); + void colorBlock(WindowBlock *window, uint16 x, uint16 y, uint16 w, uint16 h); + void restoreWindow(WindowBlock *window); void restoreBlock(uint h, uint w, uint y, uint x); byte *getFrontBuf(); @@ -1366,7 +1368,7 @@ protected: virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y); - virtual void addArrows(WindowBlock *window); + virtual void addArrows(WindowBlock *window, uint8 num); virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr); virtual void moveDirn(Item *i, uint x); @@ -1422,7 +1424,7 @@ protected: virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y); - virtual void addArrows(WindowBlock *window); + virtual void addArrows(WindowBlock *window, uint8 num); virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr); virtual bool loadTablesIntoMem(uint subr_id); @@ -1476,7 +1478,7 @@ protected: virtual void handleMouseMoved(); - virtual void addArrows(WindowBlock *window); + virtual void addArrows(WindowBlock *window, uint8 num); virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr); virtual void playSpeech(uint speech_id, uint vga_sprite_id); @@ -1524,7 +1526,7 @@ protected: virtual void drawIcon(WindowBlock *window, uint icon, uint x, uint y); - virtual void addArrows(WindowBlock *window); + virtual void addArrows(WindowBlock *window, uint8 num); virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr); virtual void playSpeech(uint speech_id, uint vga_sprite_id); @@ -1597,7 +1599,7 @@ protected: void swapCharacterLogo(); virtual void timer_proc1(); - virtual void addArrows(WindowBlock *window); + virtual void addArrows(WindowBlock *window, uint8 num); virtual uint setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, Item *item_ptr); virtual void resetVerbs(); @@ -1611,6 +1613,8 @@ protected: virtual void drawIconArray(uint i, Item *item_ptr, int line, int classMask); + virtual void colorWindow(WindowBlock *window); + virtual void doOutput(const byte *src, uint len); virtual void printScreenText(uint vga_sprite_id, uint color, const char *string_ptr, int16 x, int16 y, int16 width); diff --git a/engines/agos/icons.cpp b/engines/agos/icons.cpp index 88b6f6c07b..64703c29a1 100644 --- a/engines/agos/icons.cpp +++ b/engines/agos/icons.cpp @@ -114,7 +114,7 @@ static void decompressIconPlanar(byte *dst, byte *src, uint width, uint height, // Translate planar data to chunky (very slow method) for (y = 0; y < height * 2; y++) { - for (x = 0; x < 24; x++) { + for (x = 0; x < width; x++) { byte pixel = (srcPtr[((height * 0 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 1 : 0) | (srcPtr[((height * 2 + y) * 3) + (x >> 3)] & (1 << (7 - (x & 7))) ? 2 : 0) @@ -404,7 +404,7 @@ l1:; itemRef = derefItem(itemRef->next); } /* Plot arrows and add their boxes */ - addArrows(window); + addArrows(window, num); window->iconPtr->upArrow = _scrollUpHitArea; window->iconPtr->downArrow = _scrollDownHitArea; } @@ -506,7 +506,7 @@ void AGOSEngine::drawIconArray(uint num, Item *itemRef, int line, int classMask) if (showArrows != 0 || window->iconPtr->line != 0) { /* Plot arrows and add their boxes */ - addArrows(window); + addArrows(window, num); window->iconPtr->upArrow = _scrollUpHitArea; window->iconPtr->downArrow = _scrollDownHitArea; } @@ -614,7 +614,7 @@ uint AGOSEngine::setupIconHitArea(WindowBlock *window, uint num, uint x, uint y, return ha - _hitAreas; } -void AGOSEngine_Feeble::addArrows(WindowBlock *window) { +void AGOSEngine_Feeble::addArrows(WindowBlock *window, uint8 num) { HitArea *ha; ha = findEmptyHitArea(); @@ -644,7 +644,7 @@ void AGOSEngine_Feeble::addArrows(WindowBlock *window) { ha->verb = 1; } -void AGOSEngine_Simon2::addArrows(WindowBlock *window) { +void AGOSEngine_Simon2::addArrows(WindowBlock *window, uint8 num) { HitArea *ha; ha = findEmptyHitArea(); @@ -674,7 +674,7 @@ void AGOSEngine_Simon2::addArrows(WindowBlock *window) { ha->verb = 1; } -void AGOSEngine_Simon1::addArrows(WindowBlock *window) { +void AGOSEngine_Simon1::addArrows(WindowBlock *window, uint8 num) { HitArea *ha; ha = findEmptyHitArea(); @@ -720,7 +720,7 @@ void AGOSEngine_Simon1::addArrows(WindowBlock *window) { _lockWord &= ~0x8; } -void AGOSEngine_Waxworks::addArrows(WindowBlock *window) { +void AGOSEngine_Waxworks::addArrows(WindowBlock *window, uint8 num) { HitArea *ha; ha = findEmptyHitArea(); @@ -752,7 +752,7 @@ void AGOSEngine_Waxworks::addArrows(WindowBlock *window) { setWindowImageEx(6, 103); } -void AGOSEngine_Elvira2::addArrows(WindowBlock *window) { +void AGOSEngine_Elvira2::addArrows(WindowBlock *window, uint8 num) { HitArea *ha; ha = findEmptyHitArea(); @@ -784,8 +784,17 @@ void AGOSEngine_Elvira2::addArrows(WindowBlock *window) { setWindowImageEx(6, 106); } -void AGOSEngine::addArrows(WindowBlock *window) { +void AGOSEngine::addArrows(WindowBlock *window, uint8 num) { HitArea *ha; + uint16 x, y; + + x = 30; + y = 151; + if (num != 2) { + y = window->height * 4 + window->y - 19; + x = window->width + window->x; + } + drawArrow(x, y, 16); ha = findEmptyHitArea(); _scrollUpHitArea = ha - _hitAreas; @@ -800,6 +809,14 @@ void AGOSEngine::addArrows(WindowBlock *window) { ha->window = window; ha->verb = 1; + x = 30; + y = 170; + if (num != 2) { + y = window->height * 4; + x = window->width + window->x; + } + drawArrow(x, y, -16); + ha = findEmptyHitArea(); _scrollDownHitArea = ha - _hitAreas; @@ -814,6 +831,69 @@ void AGOSEngine::addArrows(WindowBlock *window) { ha->verb = 1; } +static const byte _arrowImage[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, + 0x0b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, + 0x0a, 0x0b, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0a, + 0x0d, 0x0a, 0x0b, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0a, 0x0d, + 0x03, 0x0d, 0x0a, 0x0b, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0a, 0x0d, 0x03, + 0x04, 0x03, 0x0d, 0x0a, 0x0b, 0x0a, 0x00, 0x00, + 0x00, 0x00, 0x0a, 0x0b, 0x0a, 0x0d, 0x03, 0x04, + 0x0f, 0x04, 0x03, 0x0d, 0x0a, 0x0b, 0x0a, 0x00, + 0x00, 0x0a, 0x0b, 0x0a, 0x0d, 0x0d, 0x0d, 0x03, + 0x04, 0x03, 0x0d, 0x0d, 0x0d, 0x0a, 0x0b, 0x0a, + 0x00, 0x0b, 0x0a, 0x0a, 0x0a, 0x0a, 0x09, 0x0d, + 0x03, 0x0d, 0x09, 0x0a, 0x0a, 0x0a, 0x0a, 0x0b, + 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0a, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, + 0x00, 0x0a, 0x0a, 0x0a, 0x0e, 0x0b, 0x0b, 0x0c, + 0x0e, 0x0c, 0x0b, 0x0b, 0x0e, 0x0a, 0x0a, 0x0a, + 0x00, 0x00, 0x02, 0x02, 0x0a, 0x0b, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0a, 0x0b, 0x0a, 0x02, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x02, 0x0a, 0x0b, 0x0b, 0x0c, + 0x0e, 0x0c, 0x0b, 0x0b, 0x0a, 0x02, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0a, 0x0d, + 0x0d, 0x0d, 0x0a, 0x0b, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0b, 0x0c, + 0x0e, 0x0c, 0x0b, 0x0b, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x0b, 0x0b, 0x0b, + 0x0b, 0x0b, 0x0b, 0x0b, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x02, 0x0e, 0x0a, 0x0a, + 0x0e, 0x0a, 0x0a, 0x0e, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x02, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, +}; + +void AGOSEngine::drawArrow(uint16 x, uint16 y, int8 dir) { + const byte *src; + uint8 w, h; + + if (dir < 0) { + src = _arrowImage + 288; + } else { + src = _arrowImage; + } + + byte *dst = getFrontBuf() + y * _screenWidth + x * 8; + + for (h = 0; h < 19; h++) { + for (w = 0; w < 16; w++) { + dst[w] = src[w] + 16; + } + + src += dir; + dst+= _screenWidth; + } +} + void AGOSEngine::removeArrows(WindowBlock *window, uint num) { if (getGameType() == GType_SIMON1) { restoreBlock(200, 320, 146, 304); @@ -823,6 +903,14 @@ void AGOSEngine::removeArrows(WindowBlock *window, uint num) { } else if (getGameType() == GType_ELVIRA2) { setBitFlag(21, false); setWindowImageEx(6, 106); + } else if (getGameType() == GType_ELVIRA1) { + if (num != 2) { + uint y = window->height * 4 + window->y - 19; + uint x = window->width + window->x; + restoreBlock(y + 38, x + 16, y, x); + } else { + colorBlock(window, 240, 151, 16, 38); + } } } diff --git a/engines/agos/window.cpp b/engines/agos/window.cpp index 2af0fd43f2..2587002803 100644 --- a/engines/agos/window.cpp +++ b/engines/agos/window.cpp @@ -108,54 +108,67 @@ void AGOSEngine::clearWindow(WindowBlock *window) { window->scrollY = 0; } -void AGOSEngine::colorWindow(WindowBlock *window) { +void AGOSEngine_Feeble::colorWindow(WindowBlock *window) { byte *dst; - int16 h, w; + uint16 h, w; _lockWord |= 0x8000; - if (getGameType() == GType_FF || getGameType() == GType_PP) { - dst = getFrontBuf() + _dxSurfacePitch * window->y + window->x; + dst = getFrontBuf() + _dxSurfacePitch * window->y + window->x; - for (h = 0; h < window->height; h++) { - for (w = 0; w < window->width; w++) { - if (dst[w] == 113 || dst[w] == 116 || dst[w] == 252) - dst[w] = window->fill_color; - } - dst += _screenWidth; + for (h = 0; h < window->height; h++) { + for (w = 0; w < window->width; w++) { + if (dst[w] == 113 || dst[w] == 116 || dst[w] == 252) + dst[w] = window->fill_color; } - } else { - dst = getFrontBuf() + _dxSurfacePitch * (window->y) + window->x * 8; - h = window->height * 8; - w = window->width * 8; - - if (getGameType() == GType_ELVIRA2 && window->y == 146) { - if (window->fill_color == 1) { - _displayPalette[33 * 4 + 0] = 48 * 4; - _displayPalette[33 * 4 + 1] = 40 * 4; - _displayPalette[33 * 4 + 2] = 32 * 4; - } else { - _displayPalette[33 * 4 + 0] = 56 * 4; - _displayPalette[33 * 4 + 1] = 56 * 4; - _displayPalette[33 * 4 + 2] = 40 * 4; - } + dst += _screenWidth; + } - dst -= _dxSurfacePitch; - h += 2; + _lockWord &= ~0x8000; +} - _paletteFlag = 1; +void AGOSEngine::colorWindow(WindowBlock *window) { + uint16 x, y, h, w; + + x = window->x * 8; + y = window->y; + h = window->height * 8; + w = window->width * 8; + + if (getGameType() == GType_ELVIRA2 && window->y == 146) { + if (window->fill_color == 1) { + _displayPalette[33 * 4 + 0] = 48 * 4; + _displayPalette[33 * 4 + 1] = 40 * 4; + _displayPalette[33 * 4 + 2] = 32 * 4; + } else { + _displayPalette[33 * 4 + 0] = 56 * 4; + _displayPalette[33 * 4 + 1] = 56 * 4; + _displayPalette[33 * 4 + 2] = 40 * 4; } - uint8 color = window->fill_color; - if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) - color += dst[0] & 0xF0; + y--; + h += 2; - do { - memset(dst, color, w); - dst += _dxSurfacePitch; - } while (--h); + _paletteFlag = 1; } + colorBlock(window, x, y, w, h); +} + +void AGOSEngine::colorBlock(WindowBlock *window, uint16 x, uint16 y, uint16 w, uint16 h) { + _lockWord |= 0x8000; + + byte *dst = getFrontBuf() + y * _screenWidth + x; + + uint8 color = window->fill_color; + if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) + color += dst[0] & 0xF0; + + do { + memset(dst, color, w); + dst += _screenWidth; + } while (--h); + _lockWord &= ~0x8000; } |