void AGOSEngine_Feeble::scrollOracleDown() { byte *src, *dst; uint16 w, h; src = getBackGround() + 203 * _backGroundBuf->pitch + 136; dst = getBackGround() + 206 * _backGroundBuf->pitch + 136; for (h = 0; h < 77; h++) { memcpy(dst, src, 360); dst -= _backGroundBuf->pitch; src -= _backGroundBuf->pitch; } for (h = 0; h < 24; h++) { for (w = 0; w < 360; w++) { if (src[w] == 0) dst[w] = src[w]; if (src[w] == 113 || src[w] == 116 || src[w] == 252) { dst[w] = src[w]; src[w] = 0; } } dst -= _backGroundBuf->pitch; src -= _backGroundBuf->pitch; } }
void AGOSEngine_Feeble::scrollOracleUp() { byte *src, *dst; uint16 w, h; dst = getBackGround() + 103 * _backGroundBuf->pitch + 136; src = getBackGround() + 106 * _backGroundBuf->pitch + 136; for (h = 0; h < 21; h++) { for (w = 0; w < 360; w++) { if (dst[w] == 0 || dst[w] == 113 || dst[w] == 116 || dst[w] == 252) dst[w] = src[w]; } dst += _backGroundBuf->pitch; src += _backGroundBuf->pitch; } for (h = 0; h < 80; h++) { memcpy(dst, src, 360); dst += _backGroundBuf->pitch; src += _backGroundBuf->pitch; } for (h = 0; h < 3; h++) { memset(dst, 0, 360); dst += _backGroundBuf->pitch; src += _backGroundBuf->pitch; } }
void AGOSEngine::fillBackGroundFromBack() { byte *src = getBackBuf(); byte *dst = getBackGround(); for (int i = 0; i < _screenHeight; i++) { memcpy(dst, src, _screenWidth); src += _backBuf->pitch; dst += _backGroundBuf->pitch; } }
void AGOSEngine::fillBackFromBackGround(uint16 height, uint16 width) { byte *src = getBackGround(); byte *dst = getBackBuf(); for (int i = 0; i < height; i++) { memcpy(dst, src, width); src += _backGroundBuf->pitch; dst += _backBuf->pitch; } }
void AGOSEngine::fillBackGroundFromFront() { Graphics::Surface *screen = _system->lockScreen(); byte *src = (byte *)screen->pixels; byte *dst = getBackGround(); for (int i = 0; i < _screenHeight; i++) { memcpy(dst, src, _screenWidth); src += screen->pitch; dst += _backGroundBuf->pitch; } _system->unlockScreen(); }
void CRole::setFaceTo(CRole* role) { do { CC_ASSERT(role); CBackgroundManager* bkg = getBackGround(); CC_ASSERT(bkg); CLogicGrid* l1 = getLogicGrid(); CLogicGrid* l2 = role->getLogicGrid(); BREAK_IF(l1 == nullptr || l2 == nullptr); Point p1 = l1->getGridPos(); Point p2 = l2->getGridPos(); p1 = bkg->gridToWorldPoint(p1); p2 = bkg->gridToWorldPoint(p2); FACE_TO ft; if (p2.x > p1.x) { if (p2.y > p1.y) { ft = FACE_TO_RIGHT_UP; } else { ft = FACE_TO_RIGHT_DOWN; } } else { if (p2.y > p1.y) { ft = FACE_TO_LEFT_UP; } else { ft = FACE_TO_LEFT_DOWN; } } setFaceTo(ft); } while (false); return; }
void CRole::die() { CBackgroundManager* bkg = getBackGround(); if (bkg) { bkg->removeRoleFromGrid(this); } BF_MANAGER->removeRole(this); FIGHT_RELATION->removeAllRelation(dynamic_cast<IFightingRelation*>(this)); CSpriteObject::die(); setSpriteVisible(false); if (m_pHPBar != nullptr) { m_pHPBar->setSpriteVisible(false); } }
void AGOSEngine::saveBackGround(VgaSprite *vsp) { if (getGameType() == GType_ELVIRA1 && getPlatform() == Common::kPlatformAtariST && (getFeatures() & GF_DEMO)) { return; } if ((vsp->flags & kDFSkipStoreBG) || !vsp->image) return; AnimTable *animTable = _screenAnim1; while (animTable->srcPtr) animTable++; const byte *ptr = _curVgaFile2 + vsp->image * 8; int16 x = vsp->x - _scrollX; int16 y = vsp->y - _scrollY; if (_window3Flag == 1) { animTable->srcPtr = (const byte *)_window4BackScn->pixels; } else { int xoffs = (_videoWindows[vsp->windowNum * 4 + 0] * 2 + x) * 8; int yoffs = (_videoWindows[vsp->windowNum * 4 + 1] + y); animTable->srcPtr = getBackGround() + yoffs * _backGroundBuf->pitch + xoffs; } animTable->x = x; animTable->y = y; animTable->width = READ_BE_UINT16(ptr + 6) / 16; if (vsp->flags & 0x40) { animTable->width++; } animTable->height = ptr[5]; animTable->windowNum = vsp->windowNum; animTable->id = vsp->id; animTable->zoneNum = vsp->zoneNum; animTable++; animTable->srcPtr = 0; }
void CRole::updateVertexZ() { do { CBackgroundManager* bkg = getBackGround(); BREAK_IF(nullptr == bkg); TMXTiledMap* map = bkg->getTiledMap(); BREAK_IF(nullptr == map); const Size& szMap = map->getMapSize(); float lowestZ = -(szMap.width + szMap.height); const Point& tilePos = getLogicGrid()->getGridPos(); float currentZ = tilePos.x + tilePos.y; setSpriteVertexZ(lowestZ + currentZ - 1); // setSpriteZOrder(lowestZ + currentZ - 1); } while (false); }
void AGOSEngine_Feeble::windowBackSpace(WindowBlock *window) { byte *dst; uint x, y, h, w; _videoLockOut |= 0x8000; x = window->x + window->textColumn; y = window->y + window->textRow; dst = getBackGround() + _backGroundBuf->pitch * y + x; for (h = 0; h < 13; h++) { for (w = 0; w < 8; w++) { if (dst[w] == 113 || dst[w] == 116 || dst[w] == 252) dst[w] = 0; } dst += _backGroundBuf->pitch; } _videoLockOut &= ~0x8000; }
void AGOSEngine::displayScreen() { if (_fastFadeInFlag == 0 && _paletteFlag == 1) { _paletteFlag = 0; if (memcmp(_displayPalette, _currentPalette, sizeof(_currentPalette))) { memcpy(_currentPalette, _displayPalette, sizeof(_displayPalette)); _system->getPaletteManager()->setPalette(_displayPalette, 0, 256); } } Graphics::Surface *screen = _system->lockScreen(); if (getGameType() == GType_PP || getGameType() == GType_FF) { byte *src = getBackBuf(); byte *dst = (byte *)screen->pixels; for (int i = 0; i < _screenHeight; i++) { memcpy(dst, src, _screenWidth); src += _backBuf->pitch; dst += screen->pitch; } if (getGameId() != GID_DIMP) fillBackFromBackGround(_screenHeight, _screenWidth); } else { if (_window4Flag == 2) { _window4Flag = 0; uint16 srcWidth, width, height; byte *dst = (byte *)screen->pixels; const byte *src = (const byte *)_window4BackScn->pixels; if (_window3Flag == 1) { src = getBackGround(); } dst += (_moveYMin + _videoWindows[17]) * screen->pitch; dst += (_videoWindows[16] * 16) + _moveXMin; src += (_videoWindows[18] * 16 * _moveYMin); src += _moveXMin; srcWidth = _videoWindows[18] * 16; width = _moveXMax - _moveXMin; height = _moveYMax - _moveYMin; for (; height > 0; height--) { memcpy(dst, src, width); dst += screen->pitch; src += srcWidth; } _moveXMin = 0xFFFF; _moveYMin = 0xFFFF; _moveXMax = 0; _moveYMax = 0; } if (_window6Flag == 2) { _window6Flag = 0; byte *src = (byte *)_window6BackScn->pixels; byte *dst = (byte *)screen->pixels + 51 * screen->pitch; for (int i = 0; i < 80; i++) { memcpy(dst, src, _window6BackScn->w); dst += screen->pitch; src += _window6BackScn->pitch; } } } _system->unlockScreen(); if (getGameType() == GType_FF && _scrollFlag) { scrollScreen(); } if (_fastFadeInFlag) { fastFadeIn(); } }
void AGOSEngine::scrollScreen() { byte *dst; const byte *src; uint x, y; dst = getBackGround(); if (_scrollXMax == 0) { uint screenSize = 8 * _screenWidth; if (_scrollFlag < 0) { memmove(dst + screenSize, dst, _scrollWidth * _screenHeight - screenSize); } else { memmove(dst, dst + screenSize, _scrollWidth * _screenHeight - screenSize); } y = _scrollY - 8; if (_scrollFlag > 0) { dst += _screenHeight * _screenWidth - screenSize; y += 488; } src = _scrollImage + y / 2; decodeRow(dst, src + readUint32Wrapper(src), _scrollWidth, _backGroundBuf->pitch); _scrollY += _scrollFlag; vcWriteVar(250, _scrollY); fillBackFromBackGround(_screenHeight, _scrollWidth); } else { if (_scrollFlag < 0) { memmove(dst + 8, dst, _screenWidth * _scrollHeight - 8); } else { memmove(dst, dst + 8, _screenWidth * _scrollHeight - 8); } x = _scrollX; x -= (getGameType() == GType_FF) ? 8 : 1; if (_scrollFlag > 0) { dst += _screenWidth - 8; x += (getGameType() == GType_FF) ? 648 : 41; } if (getGameType() == GType_FF) src = _scrollImage + x / 2; else src = _scrollImage + x * 4; decodeColumn(dst, src + readUint32Wrapper(src), _scrollHeight, _backGroundBuf->pitch); _scrollX += _scrollFlag; vcWriteVar(251, _scrollX); if (getGameType() == GType_SIMON2) { src = getBackGround(); dst = (byte *)_window4BackScn->pixels; for (int i = 0; i < _scrollHeight; i++) { memcpy(dst, src, _screenWidth); src += _backGroundBuf->pitch; dst += _window4BackScn->pitch; } } else { fillBackFromBackGround(_scrollHeight, _screenWidth); } setMoveRect(0, 0, 320, _scrollHeight); _window4Flag = 1; } _scrollFlag = 0; if (getGameType() == GType_SIMON2) { AnimTable *animTable = _screenAnim1; while (animTable->srcPtr) { animTable->srcPtr = 0; animTable++; } VgaSprite *vsp = _vgaSprites; while (vsp->id) { vsp->windowNum |= 0x8000; vsp++; } } }
void AGOSEngine::animateSprites() { VgaSprite *vsp; VgaPointersEntry *vpe; if (_copyScnFlag) { _copyScnFlag--; _vgaSpriteChanged++; } if (getGameType() == GType_ELVIRA1 || getGameType() == GType_ELVIRA2) { const uint8 var = (getGameType() == GType_ELVIRA1) ? 293 : 71; if (_wallOn && !_variableArray[var]) { _wallOn--; VC10_state state; state.srcPtr = getBackGround() + 3 * _backGroundBuf->pitch + 3 * 16; state.height = state.draw_height = 127; state.width = state.draw_width = 14; state.y = 0; state.x = 0; state.palette = 0; state.paletteMod = 0; state.flags = kDFNonTrans; _windowNum = 4; _backFlag = true; drawImage(&state); _backFlag = false; _vgaSpriteChanged++; } } if (!_scrollFlag && !_vgaSpriteChanged) { return; } _vgaSpriteChanged = 0; if (_paletteFlag == 2) _paletteFlag = 1; if (getGameType() == GType_SIMON2 && _scrollFlag) { scrollScreen(); } if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) { dirtyClips(); } restoreBackGround(); vsp = _vgaSprites; for (; vsp->id !=0; vsp++) { if ((getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) && !(vsp->windowNum & 0x8000)) { continue; } vsp->windowNum &= ~0x8000; vpe = &_vgaBufferPointers[vsp->zoneNum]; _curVgaFile1 = vpe->vgaFile1; _curVgaFile2 = vpe->vgaFile2; _curSfxFile = vpe->sfxFile; _windowNum = vsp->windowNum; _vgaCurSpriteId = vsp->id; saveBackGround(vsp); drawImage_init(vsp->image, vsp->palette, vsp->x, vsp->y, vsp->flags); } if (getGameType() == GType_ELVIRA1 && _variableArray[293]) { // Used by the Fire Wall and Ice Wall spells debug(0, "Using special wall"); uint8 color, h, len; byte *dst = (byte *)_window4BackScn->pixels; color = (_variableArray[293] & 1) ? 13 : 15; _wallOn = 2; h = 127; while (h) { len = 112; while (len--) { *dst++ = color; dst++; } h--; if (h == 0) break; len = 112; while (len--) { dst++; *dst++ = color; } h--; } _window4Flag = 1; setMoveRect(0, 0, 224, 127); } else if (getGameType() == GType_ELVIRA2 && _variableArray[71] & 2) { // Used by the Unholy Barrier spell uint8 color, h, len; byte *dst = (byte *)_window4BackScn->pixels; color = 1; _wallOn = 2; h = 43; while (h) { len = 56; while (len--) { *dst++ = color; dst += 3; } h--; if (h == 0) break; dst += 448; len = 56; while (len--) { dst += 2; *dst++ = color; dst += 1; } dst += 448; h--; } _window4Flag = 1; setMoveRect(0, 0, 224, 127); } if (_window6Flag == 1) _window6Flag++; if (_window4Flag == 1) _window4Flag++; _displayFlag++; }
void CRole::findPath(const Point& startPos, const Point& targetPos, IPathFinderDelegate* delegate) { CBackgroundManager* bkg = getBackGround(); CC_ASSERT(bkg); bkg->findPath(startPos, targetPos, this, delegate); }