aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/gui_mr.cpp
diff options
context:
space:
mode:
authorJohannes Schickel2008-05-11 15:24:25 +0000
committerJohannes Schickel2008-05-11 15:24:25 +0000
commit4932660f13b08aa30a88d53c1948c1df190201b7 (patch)
tree3ece7a7c9c96e0b95ef9d0f95ee5a5d01ba89f7a /engines/kyra/gui_mr.cpp
parent57dfdbc6c865bfc804fd93b813982b9ca41931e4 (diff)
downloadscummvm-rg350-4932660f13b08aa30a88d53c1948c1df190201b7.tar.gz
scummvm-rg350-4932660f13b08aa30a88d53c1948c1df190201b7.tar.bz2
scummvm-rg350-4932660f13b08aa30a88d53c1948c1df190201b7.zip
- Implemented kyra3 album (page switch animation not yet implemented)
- Implemented opcode 25: o3_showAlbum svn-id: r32022
Diffstat (limited to 'engines/kyra/gui_mr.cpp')
-rw-r--r--engines/kyra/gui_mr.cpp447
1 files changed, 447 insertions, 0 deletions
diff --git a/engines/kyra/gui_mr.cpp b/engines/kyra/gui_mr.cpp
index a7fc742b6f..0408c68317 100644
--- a/engines/kyra/gui_mr.cpp
+++ b/engines/kyra/gui_mr.cpp
@@ -559,6 +559,7 @@ int KyraEngine_MR::buttonInventory(Button *button) {
}
int KyraEngine_MR::buttonMoodChange(Button *button) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::buttonMoodChange(%p)", (const void*)button);
if (queryGameFlag(0x219)) {
snd_playSoundEffect(0x0D, 0xC8);
return 0;
@@ -626,6 +627,7 @@ int KyraEngine_MR::buttonMoodChange(Button *button) {
}
int KyraEngine_MR::buttonShowScore(Button *button) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::buttonShowScore(%p)", (const void*)button);
strcpy(_stringBuffer, (const char*)getTableEntry(_cCodeFile, 18));
char *buffer = _stringBuffer;
@@ -649,6 +651,7 @@ int KyraEngine_MR::buttonShowScore(Button *button) {
}
int KyraEngine_MR::buttonJesterStaff(Button *button) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::buttonJesterStaff(%p)", (const void*)button);
makeCharFacingMouse();
if (_itemInHand == 27) {
_screen->hideMouse();
@@ -679,6 +682,450 @@ int KyraEngine_MR::buttonJesterStaff(Button *button) {
return 0;
}
+void KyraEngine_MR::showAlbum() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::showAlbum()");
+ if (!_screen->isMouseVisible() || queryGameFlag(4) || _handItemSet != -1)
+ return;
+
+ if (!loadLanguageFile("ALBUM.", _album.file))
+ error("Couldn't load ALBUM");
+
+ if (!queryGameFlag(0x8B))
+ _album.wsa->open("ALBMGNTH.WSA", 1, 0);
+ _album.backUpRect = new uint8[3100];
+ assert(_album.backUpRect);
+ _album.backUpPage = new uint8[64000];
+ assert(_album.backUpPage);
+ _album.nextPage = _album.curPage;
+
+ _screen->copyRegionToBuffer(0, 0, 0, 320, 200, _screenBuffer);
+ _screen->copyRegionToBuffer(4, 0, 0, 320, 200, _album.backUpPage);
+
+ memcpy(_screen->getPalette(1), _screen->getPalette(0), 768);
+ _screen->fadeToBlack(9);
+
+ int itemInHand = _itemInHand;
+ removeHandItem();
+
+ _res->loadFileToBuf("ALBUM.COL", _screen->getPalette(0), 768);
+ loadAlbumPage();
+ loadAlbumPageWSA();
+
+ if (_album.leftPage.wsa->opened()) {
+ _album.leftPage.wsa->setX(_albumWSAX[_album.nextPage+0]);
+ _album.leftPage.wsa->setY(_albumWSAY[_album.nextPage+0]);
+ _album.leftPage.wsa->setDrawPage(2);
+
+ _album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 0x4000);
+ }
+ if (_album.rightPage.wsa->opened()) {
+ _album.rightPage.wsa->setX(_albumWSAX[_album.nextPage+1]);
+ _album.rightPage.wsa->setY(_albumWSAY[_album.nextPage+1]);
+ _album.rightPage.wsa->setDrawPage(2);
+
+ _album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 0x4000);
+ }
+
+ printAlbumPageText();
+ _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ _screen->fadePalette(_screen->getPalette(0), 9);
+
+ processAlbum();
+
+ _screen->fadeToBlack(9);
+ _album.wsa->close();
+
+ setHandItem(itemInHand);
+ updateMouse();
+
+ restorePage3();
+ _screen->copyBlockToPage(0, 0, 0, 320, 200, _screenBuffer);
+ _screen->copyBlockToPage(4, 0, 0, 320, 200, _album.backUpPage);
+ delete[] _album.backUpPage;
+ _album.backUpPage = 0;
+
+ memcpy(_screen->getPalette(0), _screen->getPalette(1), 768);
+ _screen->fadePalette(_screen->getPalette(0), 9);
+ delete[] _album.file;
+ _album.file = 0;
+
+ _eventList.clear();
+}
+
+void KyraEngine_MR::loadAlbumPage() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::loadAlbumPage()");
+
+ char filename[16];
+ int num = _album.curPage / 2;
+
+ if (num == 0) {
+ strcpy(filename, "ALBUM0.CPS");
+ } else if (num >= 1 && num <= 6) {
+ --num;
+ num %= 2;
+ snprintf(filename, 16, "ALBUM%d.CPS", num+1);
+ } else {
+ strcpy(filename, "ALBUM3.CPS");
+ }
+
+ _screen->copyRegion(0, 0, 0, 0, 320, 200, 2, 4, Screen::CR_NO_P_CHECK);
+ _screen->loadBitmap(filename, 3, 3, 0);
+}
+
+void KyraEngine_MR::loadAlbumPageWSA() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::loadAlbumPageWSA()");
+ char filename[16];
+
+ _album.leftPage.curFrame = 0;
+ _album.leftPage.maxFrame = 0;
+ _album.leftPage.wsa->close();
+
+ _album.rightPage.curFrame = 0;
+ _album.rightPage.maxFrame = 0;
+ _album.rightPage.wsa->close();
+
+ if (_album.curPage) {
+ snprintf(filename, 16, "PAGE%x.WSA", _album.curPage);
+ _album.leftPage.wsa->open(filename, 1, 0);
+ _album.leftPage.maxFrame = _album.leftPage.wsa->frames()-1;
+ }
+
+ if (_album.curPage != 14) {
+ snprintf(filename, 16, "PAGE%x.WSA", _album.curPage+1);
+ _album.rightPage.wsa->open(filename, 1, 0);
+ _album.rightPage.maxFrame = _album.leftPage.wsa->frames()-1;
+ }
+}
+
+void KyraEngine_MR::printAlbumPageText() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::printAlbumPageText()");
+
+ static const uint8 posY[] = {
+ 0x41, 0x55, 0x55, 0x55, 0x55, 0x55, 0x5A, 0x5A,
+ 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x5A, 0x3C
+ };
+
+ const int leftY = posY[_album.curPage];
+ const int rightY = posY[_album.curPage+1];
+
+ for (int i = 0; i < 5; ++i) {
+ const char *str = (const char *)getTableEntry(_album.file, _album.curPage*5+i);
+ int y = i * 10 + leftY + 20;
+ printAlbumText(2, str, 20, y, 10);
+ }
+
+ for (int i = 0; i < 5; ++i) {
+ const char *str = (const char *)getTableEntry(_album.file, (_album.curPage+1)*5+i);
+ int y = i * 10 + rightY + 20;
+ printAlbumText(2, str, 176, y, 10);
+ }
+
+ albumBackUpRect();
+}
+
+void KyraEngine_MR::printAlbumText(int page, const char *str, int x, int y, uint8 c0) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::printAlbumText(%d, '%s', %d, %d, %d)", page, str, x, y, c0);
+ int oldPage = _screen->_curPage;
+ _screen->_curPage = page;
+
+ static const uint8 colorMap[] = { 0, 0x87, 0xA3, 0 };
+ _screen->setTextColor(colorMap, 0, 3);
+
+ Screen::FontId oldFont = _screen->setFont(Screen::FID_BOOKFONT_FNT);
+ _screen->_charWidth = -2;
+
+ _screen->printText(str, x, y, c0, 0);
+
+ _screen->_charWidth = 0;
+ _screen->setFont(oldFont);
+ _screen->_curPage = oldPage;
+}
+
+void KyraEngine_MR::processAlbum() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::processAlbum()");
+ Button albumButtons[5];
+
+ GUI_V2_BUTTON(albumButtons[0], 36, 0, 0, 1, 1, 1, 0x4487, 0, 130, 190, 10, 10, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+ albumButtons[0].buttonCallback = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::albumPrevPage);
+ GUI_V2_BUTTON(albumButtons[1], 37, 0, 0, 1, 1, 1, 0x4487, 0, 177, 190, 10, 10, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+ albumButtons[1].buttonCallback = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::albumNextPage);
+ GUI_V2_BUTTON(albumButtons[2], 38, 0, 0, 1, 1, 1, 0x4487, 0, 0, 0, 320, 8, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+ albumButtons[2].buttonCallback = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::albumClose);
+ GUI_V2_BUTTON(albumButtons[3], 39, 0, 0, 1, 1, 1, 0x4487, 0, 8, 8, 144, 180, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+ albumButtons[3].buttonCallback = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::albumPrevPage);
+ GUI_V2_BUTTON(albumButtons[4], 40, 0, 0, 1, 1, 1, 0x4487, 0, 170, 8, 142, 180, 0xFF, 0xF0, 0xFF, 0xF0, 0xFF, 0xF0, 0);
+ albumButtons[4].buttonCallback = BUTTON_FUNCTOR(KyraEngine_MR, this, &KyraEngine_MR::albumNextPage);
+
+ Button *buttonList = 0;
+ for (int i = 0; i < 5; ++i)
+ buttonList = _gui->addButtonToList(buttonList, &albumButtons[i]);
+
+ _album.leftPage.timer = _album.rightPage.timer = _system->getMillis();
+ albumNewPage();
+ _album.running = true;
+
+ while (_album.running && !_quitFlag) {
+ updateInput();
+ checkInput(buttonList);
+ removeInputTop();
+
+ musicUpdate(0);
+
+ if (_album.curPage != _album.nextPage) {
+ int oldPage = _album.curPage;
+ _album.curPage = _album.nextPage;
+
+ _album.leftPage.wsa->close();
+ _album.rightPage.wsa->close();
+
+ loadAlbumPage();
+ loadAlbumPageWSA();
+
+ if (_album.leftPage.wsa->opened()) {
+ _album.leftPage.wsa->setX(_albumWSAX[_album.nextPage+0]);
+ _album.leftPage.wsa->setY(_albumWSAY[_album.nextPage+0]);
+ _album.leftPage.wsa->setDrawPage(2);
+
+ _album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 0x4000);
+ }
+ if (_album.rightPage.wsa->opened()) {
+ _album.rightPage.wsa->setX(_albumWSAX[_album.nextPage+1]);
+ _album.rightPage.wsa->setY(_albumWSAY[_album.nextPage+1]);
+ _album.rightPage.wsa->setDrawPage(2);
+
+ _album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 0x4000);
+ }
+
+ printAlbumPageText();
+
+ snd_playSoundEffect(0x85, 0x80);
+ albumSwitchPages(oldPage, _album.nextPage, 4);
+
+ _album.leftPage.timer = _album.rightPage.timer = 0;
+ albumNewPage();
+
+ _eventList.clear();
+ }
+
+ albumUpdateAnims();
+ _system->delayMillis(10);
+ }
+
+ _album.leftPage.wsa->close();
+ _album.rightPage.wsa->close();
+}
+
+void KyraEngine_MR::albumNewPage() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumNewPage()");
+ int page = _album.nextPage / 2;
+ if (!queryGameFlag(0x84+page)) {
+ albumAnim1();
+ delayWithTicks(8);
+
+ int id = _album.curPage / 2 + 100;
+ albumChat((const char *)getTableEntry(_album.file, id), 205, id);
+
+ if (id == 107) {
+ _screen->copyRegion(76, 100, 76, 100, 244, 100, 2, 0, Screen::CR_NO_P_CHECK);
+ albumChat((const char *)getTableEntry(_album.file, 108), 205, 108);
+ _screen->copyRegion(76, 100, 76, 100, 244, 100, 2, 0, Screen::CR_NO_P_CHECK);
+ albumChat((const char *)getTableEntry(_album.file, 109), 205, 109);
+ }
+
+ delayWithTicks(5);
+ albumAnim2();
+
+ setGameFlag(0x84+page);
+ _album.isPage14 = (_album.nextPage == 14);
+ }
+}
+
+void KyraEngine_MR::albumUpdateAnims() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumUpdateAnims()");
+ if (_album.nextPage == 14 && !_album.isPage14)
+ return;
+
+ uint32 nextRun = 0;
+
+ nextRun = _album.leftPage.timer + 5 * _tickLength;
+ if (nextRun < _system->getMillis() && _album.leftPage.wsa->opened()) {
+ _album.leftPage.wsa->setX(_albumWSAX[_album.nextPage+0]);
+ _album.leftPage.wsa->setY(_albumWSAY[_album.nextPage+0]);
+ _album.leftPage.wsa->setDrawPage(2);
+
+ _album.leftPage.wsa->displayFrame(_album.leftPage.curFrame, 0x4000);
+ _screen->copyRegion(40, 17, 40, 17, 87, 73, 2, 0, Screen::CR_NO_P_CHECK);
+
+ ++_album.leftPage.curFrame;
+ _album.leftPage.timer = _system->getMillis();
+
+ if (_album.leftPage.curFrame > _album.leftPage.maxFrame) {
+ _album.leftPage.curFrame = 0;
+ if (_album.nextPage == 14) {
+ _album.isPage14 = false;
+ _album.leftPage.timer += 100000 * _tickLength;
+ } else {
+ _album.leftPage.timer += 180 * _tickLength;
+ }
+ }
+ }
+
+ nextRun = _album.rightPage.timer + 5 * _tickLength;
+ if (nextRun < _system->getMillis() && _album.rightPage.wsa->opened()) {
+ _album.rightPage.wsa->setX(_albumWSAX[_album.nextPage+1]);
+ _album.rightPage.wsa->setY(_albumWSAY[_album.nextPage+1]);
+ _album.rightPage.wsa->setDrawPage(2);
+
+ _album.rightPage.wsa->displayFrame(_album.rightPage.curFrame, 0x4000);
+ _screen->copyRegion(194, 20, 194, 20, 85, 69, 2, 0, Screen::CR_NO_P_CHECK);
+
+ ++_album.rightPage.curFrame;
+ _album.rightPage.timer = _system->getMillis();
+
+ if (_album.rightPage.curFrame > _album.rightPage.maxFrame) {
+ _album.rightPage.curFrame = 0;
+ _album.rightPage.timer += 180 * _tickLength;
+ }
+ }
+
+ _screen->updateScreen();
+}
+
+void KyraEngine_MR::albumAnim1() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumAnim1()");
+ _album.wsa->setX(-100);
+ _album.wsa->setY(90);
+ _album.wsa->setDrawPage(2);
+
+ for (int i = 6; i >= 3; --i) {
+ albumRestoreRect();
+ _album.wsa->displayFrame(i, 0x4000);
+ albumUpdateRect();
+ delayWithTicks(1);
+ }
+
+ albumRestoreRect();
+ _album.wsa->displayFrame(14, 0x4000);
+ albumUpdateRect();
+ delayWithTicks(1);
+}
+
+void KyraEngine_MR::albumAnim2() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumAnim2()");
+ _album.wsa->setX(-100);
+ _album.wsa->setY(90);
+ _album.wsa->setDrawPage(2);
+
+ for (int i = 3; i <= 6; ++i) {
+ albumRestoreRect();
+ _album.wsa->displayFrame(i, 0x4000);
+ albumUpdateRect();
+ delayWithTicks(1);
+ }
+
+ albumRestoreRect();
+ _screen->copyRegion(0, 100, 0, 100, 320, 100, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+}
+
+void KyraEngine_MR::albumBackUpRect() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumBackUpRect()");
+ _screen->copyRegionToBuffer(2, 0, 146, 62, 50, _album.backUpRect);
+}
+
+void KyraEngine_MR::albumRestoreRect() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumRestoreRect()");
+ _screen->copyBlockToPage(2, 0, 146, 62, 50, _album.backUpRect);
+}
+
+void KyraEngine_MR::albumUpdateRect() {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumUpdateRect()");
+ _screen->copyRegion(0, 146, 0, 146, 62, 50, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+}
+
+void KyraEngine_MR::albumSwitchPages(int oldPage, int newPage, int unk) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumSwitchPages()");
+ if (newPage > oldPage) {
+ //XXX
+
+ _screen->copyRegion(260, 7, 260, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ delayWithTicks(1);
+
+ //XXX
+
+ _screen->copyRegion(210, 7, 210, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ delayWithTicks(1);
+
+ _screen->copyRegion(160, 7, 160, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ delayWithTicks(1);
+
+ //XXX
+ delayWithTicks(1);
+
+ //XXX
+ delayWithTicks(1);
+
+ _screen->copyRegion(10, 7, 10, 7, 150, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ } else {
+ //XXX
+
+ _screen->copyRegion(10, 7, 10, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ delayWithTicks(1);
+
+ //XXX
+
+ _screen->copyRegion(60, 7, 60, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ delayWithTicks(1);
+
+ _screen->copyRegion(110, 7, 110, 7, 50, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ delayWithTicks(1);
+
+ //XXX
+ delayWithTicks(1);
+
+ //XXX
+ delayWithTicks(1);
+
+ _screen->copyRegion(160, 7, 160, 7, 150, 186, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ }
+}
+
+int KyraEngine_MR::albumNextPage(Button *caller) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumNextPage(%p)", (const void *)caller);
+ _album.nextPage = _album.curPage + 2;
+ if (_album.nextPage >= 16) {
+ _album.nextPage -= 2;
+ _album.running = false;
+ }
+ return 0;
+}
+
+int KyraEngine_MR::albumPrevPage(Button *caller) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumPrevPage(%p)", (const void *)caller);
+ _album.nextPage = _album.curPage - 2;
+ if (_album.nextPage < 0) {
+ _album.nextPage = 0;
+ _album.running = false;
+ }
+ return 0;
+}
+
+int KyraEngine_MR::albumClose(Button *caller) {
+ debugC(9, kDebugLevelMain, "KyraEngine_MR::albumClose(%p)", (const void *)caller);
+ _album.running = false;
+ return 0;
+}
+
#pragma mark -
GUI_MR::GUI_MR(KyraEngine_MR *vm) : GUI_v2(vm), _vm(vm), _screen(vm->_screen) {