mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-15 06:08:35 +00:00
867 lines
20 KiB
C++
867 lines
20 KiB
C++
/* ScummVM - Graphic Adventure Engine
|
|
*
|
|
* ScummVM is the legal property of its developers, whose names
|
|
* are too numerous to list here. Please refer to the COPYRIGHT
|
|
* file distributed with this source distribution.
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
|
|
#include "dreamweb/sound.h"
|
|
#include "dreamweb/dreamweb.h"
|
|
|
|
namespace DreamWeb {
|
|
|
|
const uint16 kKeypadx = 36+112;
|
|
const uint16 kKeypady = 72;
|
|
|
|
void DreamWebEngine::enterCode(uint8 digit0, uint8 digit1, uint8 digit2, uint8 digit3) {
|
|
RectWithCallback keypadList[] = {
|
|
{ kKeypadx+9,kKeypadx+30,kKeypady+9,kKeypady+22,&DreamWebEngine::buttonOne },
|
|
{ kKeypadx+31,kKeypadx+52,kKeypady+9,kKeypady+22,&DreamWebEngine::buttonTwo },
|
|
{ kKeypadx+53,kKeypadx+74,kKeypady+9,kKeypady+22,&DreamWebEngine::buttonThree },
|
|
{ kKeypadx+9,kKeypadx+30,kKeypady+23,kKeypady+40,&DreamWebEngine::buttonFour },
|
|
{ kKeypadx+31,kKeypadx+52,kKeypady+23,kKeypady+40,&DreamWebEngine::buttonFive },
|
|
{ kKeypadx+53,kKeypadx+74,kKeypady+23,kKeypady+40,&DreamWebEngine::buttonSix },
|
|
{ kKeypadx+9,kKeypadx+30,kKeypady+41,kKeypady+58,&DreamWebEngine::buttonSeven },
|
|
{ kKeypadx+31,kKeypadx+52,kKeypady+41,kKeypady+58,&DreamWebEngine::buttonEight },
|
|
{ kKeypadx+53,kKeypadx+74,kKeypady+41,kKeypady+58,&DreamWebEngine::buttonNine },
|
|
{ kKeypadx+9,kKeypadx+30,kKeypady+59,kKeypady+73,&DreamWebEngine::buttonNought },
|
|
{ kKeypadx+31,kKeypadx+74,kKeypady+59,kKeypady+73,&DreamWebEngine::buttonEnter },
|
|
{ kKeypadx+72,kKeypadx+86,kKeypady+80,kKeypady+94,&DreamWebEngine::quitKey },
|
|
{ 0,320,0,200,&DreamWebEngine::blank },
|
|
{ 0xFFFF,0,0,0,0 }
|
|
};
|
|
|
|
getRidOfReels();
|
|
loadKeypad();
|
|
createPanel();
|
|
showIcon();
|
|
showOuterPad();
|
|
showKeypad();
|
|
readMouse();
|
|
showPointer();
|
|
workToScreen();
|
|
delPointer();
|
|
_pressPointer = 0;
|
|
_getBack = 0;
|
|
while (true) {
|
|
delPointer();
|
|
readMouse();
|
|
showKeypad();
|
|
showPointer();
|
|
waitForVSync();
|
|
if (_pressCount == 0) {
|
|
_pressed = 255;
|
|
_graphicPress = 255;
|
|
waitForVSync();
|
|
} else
|
|
--_pressCount;
|
|
|
|
dumpPointer();
|
|
dumpKeypad();
|
|
dumpTextLine();
|
|
checkCoords(keypadList);
|
|
if (_quitRequested || (_getBack == 1))
|
|
break;
|
|
if (_lightCount == 1) {
|
|
if (_vars._lockStatus == 0)
|
|
break;
|
|
} else {
|
|
if (_pressCount == 40) {
|
|
addToPressList();
|
|
if (_pressed == 11) {
|
|
if (isItRight(digit0, digit1, digit2, digit3))
|
|
_vars._lockStatus = 0;
|
|
_sound->playChannel1(11);
|
|
_lightCount = 120;
|
|
_pressPointer = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
_manIsOffScreen = 0;
|
|
_keypadGraphics.clear();
|
|
restoreReels();
|
|
redrawMainScrn();
|
|
workToScreenM();
|
|
}
|
|
|
|
// Note: isItRight comes from use.asm, but is only used by enterCode(),
|
|
// so we place it here.
|
|
bool DreamWebEngine::isItRight(uint8 digit0, uint8 digit1, uint8 digit2, uint8 digit3) {
|
|
return digit0 == _pressList[0] && digit1 == _pressList[1]
|
|
&& digit2 == _pressList[2] && digit3 == _pressList[3];
|
|
}
|
|
|
|
void DreamWebEngine::loadKeypad() {
|
|
loadGraphicsFile(_keypadGraphics, "G02");
|
|
}
|
|
|
|
void DreamWebEngine::quitKey() {
|
|
commandOnlyCond(4, 222);
|
|
|
|
if (_mouseButton != _oldButton && (_mouseButton & 1))
|
|
_getBack = 1;
|
|
}
|
|
|
|
void DreamWebEngine::addToPressList() {
|
|
if (_pressPointer == 5)
|
|
return;
|
|
uint8 pressed = _pressed;
|
|
if (pressed == 10)
|
|
pressed = 0;
|
|
|
|
_pressList[_pressPointer] = pressed;
|
|
++_pressPointer;
|
|
}
|
|
|
|
void DreamWebEngine::buttonOne() {
|
|
buttonPress(1);
|
|
}
|
|
|
|
void DreamWebEngine::buttonTwo() {
|
|
buttonPress(2);
|
|
}
|
|
|
|
void DreamWebEngine::buttonThree() {
|
|
buttonPress(3);
|
|
}
|
|
|
|
void DreamWebEngine::buttonFour() {
|
|
buttonPress(4);
|
|
}
|
|
|
|
void DreamWebEngine::buttonFive() {
|
|
buttonPress(5);
|
|
}
|
|
|
|
void DreamWebEngine::buttonSix() {
|
|
buttonPress(6);
|
|
}
|
|
|
|
void DreamWebEngine::buttonSeven() {
|
|
buttonPress(7);
|
|
}
|
|
|
|
void DreamWebEngine::buttonEight() {
|
|
buttonPress(8);
|
|
}
|
|
|
|
void DreamWebEngine::buttonNine() {
|
|
buttonPress(9);
|
|
}
|
|
|
|
void DreamWebEngine::buttonNought() {
|
|
buttonPress(10);
|
|
}
|
|
|
|
void DreamWebEngine::buttonEnter() {
|
|
buttonPress(11);
|
|
}
|
|
|
|
void DreamWebEngine::buttonPress(uint8 buttonId) {
|
|
commandOnlyCond(buttonId + 4, buttonId + 100);
|
|
if ((_mouseButton & 1) && (_mouseButton != _oldButton)) {
|
|
_pressed = buttonId;
|
|
_graphicPress = buttonId + 21;
|
|
_pressCount = 40;
|
|
if (buttonId != 11)
|
|
_sound->playChannel1(10);
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::showOuterPad() {
|
|
showFrame(_keypadGraphics, kKeypadx-3, kKeypady-4, 1, 0);
|
|
showFrame(_keypadGraphics, kKeypadx+74, kKeypady+76, 37, 0);
|
|
}
|
|
|
|
void DreamWebEngine::showKeypad() {
|
|
singleKey(22, kKeypadx+9, kKeypady+5);
|
|
singleKey(23, kKeypadx+31, kKeypady+5);
|
|
singleKey(24, kKeypadx+53, kKeypady+5);
|
|
singleKey(25, kKeypadx+9, kKeypady+23);
|
|
singleKey(26, kKeypadx+31, kKeypady+23);
|
|
singleKey(27, kKeypadx+53, kKeypady+23);
|
|
singleKey(28, kKeypadx+9, kKeypady+41);
|
|
singleKey(29, kKeypadx+31, kKeypady+41);
|
|
singleKey(30, kKeypadx+53, kKeypady+41);
|
|
singleKey(31, kKeypadx+9, kKeypady+59);
|
|
singleKey(32, kKeypadx+31, kKeypady+59);
|
|
if (_lightCount) {
|
|
--_lightCount;
|
|
uint8 frameIndex;
|
|
uint16 y;
|
|
if (_vars._lockStatus) {
|
|
frameIndex = 36;
|
|
y = kKeypady-1+63;
|
|
} else {
|
|
frameIndex = 41;
|
|
y = kKeypady+4+63;
|
|
}
|
|
if ((_lightCount >= 60) && (_lightCount < 100))
|
|
--frameIndex;
|
|
showFrame(_keypadGraphics, kKeypadx+60, y, frameIndex, 0);
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::singleKey(uint8 key, uint16 x, uint16 y) {
|
|
if (key == _graphicPress) {
|
|
key += 11;
|
|
if (_pressCount < 8)
|
|
key -= 11;
|
|
}
|
|
key -= 20;
|
|
showFrame(_keypadGraphics, x, y, key, 0);
|
|
}
|
|
|
|
void DreamWebEngine::dumpKeypad() {
|
|
multiDump(kKeypadx - 3, kKeypady - 4, 120, 90);
|
|
}
|
|
|
|
void DreamWebEngine::useMenu() {
|
|
getRidOfReels();
|
|
loadMenu();
|
|
createPanel();
|
|
showPanel();
|
|
showIcon();
|
|
_vars._newObs = 0;
|
|
drawFloor();
|
|
printSprites();
|
|
showFrame(_menuGraphics2, kMenux-48, kMenuy-4, 4, 0);
|
|
getUnderMenu();
|
|
showFrame(_menuGraphics2, kMenux+54, kMenuy+72, 5, 0);
|
|
workToScreenM();
|
|
_getBack = 0;
|
|
do {
|
|
delPointer();
|
|
putUnderMenu();
|
|
showMenu();
|
|
readMouse();
|
|
showPointer();
|
|
waitForVSync();
|
|
dumpPointer();
|
|
dumpMenu();
|
|
dumpTextLine();
|
|
RectWithCallback menuList[] = {
|
|
{ kMenux+54,kMenux+68,kMenuy+72,kMenuy+88,&DreamWebEngine::quitKey },
|
|
{ 0,320,0,200,&DreamWebEngine::blank },
|
|
{ 0xFFFF,0,0,0,0 }
|
|
};
|
|
checkCoords(menuList);
|
|
} while ((_getBack != 1) && !_quitRequested);
|
|
_manIsOffScreen = 0;
|
|
redrawMainScrn();
|
|
_menuGraphics.clear();
|
|
_menuGraphics2.clear();
|
|
restoreReels();
|
|
workToScreenM();
|
|
}
|
|
|
|
void DreamWebEngine::dumpMenu() {
|
|
multiDump(kMenux, kMenuy, 48, 48);
|
|
}
|
|
|
|
void DreamWebEngine::getUnderMenu() {
|
|
multiGet(_underTimedText, kMenux, kMenuy, 48, 48);
|
|
}
|
|
|
|
void DreamWebEngine::putUnderMenu() {
|
|
multiPut(_underTimedText, kMenux, kMenuy, 48, 48);
|
|
}
|
|
|
|
// Note: showoutermenu from the asm version was unused and thus not placed here
|
|
|
|
void DreamWebEngine::showMenu() {
|
|
++_menuCount;
|
|
if (_menuCount == 37*2)
|
|
_menuCount = 0;
|
|
showFrame(_menuGraphics, kMenux, kMenuy, _menuCount / 2, 0);
|
|
}
|
|
|
|
void DreamWebEngine::loadMenu() {
|
|
loadGraphicsFile(_menuGraphics, "S02"); // sprite name 3
|
|
loadGraphicsFile(_menuGraphics2, "G07"); // mon. graphics 2
|
|
}
|
|
|
|
void DreamWebEngine::viewFolder() {
|
|
_manIsOffScreen = 1;
|
|
getRidOfAll();
|
|
loadFolder();
|
|
_folderPage = 0;
|
|
showFolder();
|
|
workToScreenM();
|
|
_getBack = 0;
|
|
do {
|
|
if (_quitRequested)
|
|
break;
|
|
delPointer();
|
|
readMouse();
|
|
showPointer();
|
|
waitForVSync();
|
|
dumpPointer();
|
|
dumpTextLine();
|
|
checkFolderCoords();
|
|
} while (_getBack == 0);
|
|
_manIsOffScreen = 0;
|
|
_folderGraphics.clear();
|
|
_folderGraphics2.clear();
|
|
_folderGraphics3.clear();
|
|
_folderCharset.clear();
|
|
restoreAll();
|
|
redrawMainScrn();
|
|
workToScreenM();
|
|
}
|
|
|
|
void DreamWebEngine::nextFolder() {
|
|
if (_folderPage == 12) {
|
|
blank();
|
|
return;
|
|
}
|
|
commandOnlyCond(16, 201);
|
|
if ((_mouseButton == 1) && (_mouseButton != _oldButton)) {
|
|
++_folderPage;
|
|
folderHints();
|
|
delPointer();
|
|
showFolder();
|
|
_mouseButton = 0;
|
|
checkFolderCoords();
|
|
workToScreenM();
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::folderHints() {
|
|
if (_folderPage == 5) {
|
|
if ((_vars._aideDead != 1) && (getLocation(13) != 1)) {
|
|
setLocation(13);
|
|
showFolder();
|
|
const uint8 *string = getTextInFile1(30);
|
|
printDirect(string, 0, 86, 141, true);
|
|
workToScreenM();
|
|
hangOnP(200);
|
|
}
|
|
} else if (_folderPage == 9) {
|
|
if (getLocation(7) != 1) {
|
|
setLocation(7);
|
|
showFolder();
|
|
const uint8 *string = getTextInFile1(31);
|
|
printDirect(string, 0, 86, 141, true);
|
|
workToScreenM();
|
|
hangOnP(200);
|
|
}
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::lastFolder() {
|
|
if (_folderPage == 0) {
|
|
blank();
|
|
return;
|
|
}
|
|
commandOnlyCond(17, 202);
|
|
|
|
if ((_mouseButton == 1) && (_mouseButton != _oldButton)) {
|
|
--_folderPage;
|
|
delPointer();
|
|
showFolder();
|
|
_mouseButton = 0;
|
|
checkFolderCoords();
|
|
workToScreenM();
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::checkFolderCoords() {
|
|
RectWithCallback folderList[] = {
|
|
{ 280,320,160,200, &DreamWebEngine::quitKey },
|
|
{ 143,300,6,194, &DreamWebEngine::nextFolder },
|
|
{ 0,143,6,194, &DreamWebEngine::lastFolder },
|
|
{ 0,320,0,200, &DreamWebEngine::blank },
|
|
{ 0xFFFF,0,0,0, 0 }
|
|
};
|
|
checkCoords(folderList);
|
|
}
|
|
|
|
void DreamWebEngine::loadFolder() {
|
|
loadGraphicsFile(_folderGraphics, "G09"); // folder graphics 1
|
|
loadGraphicsFile(_folderGraphics2, "G10"); // folder graphics 2
|
|
loadGraphicsFile(_folderGraphics3, "G11"); // folder graphics 3
|
|
loadGraphicsFile(_folderCharset, "C02"); // character set 3
|
|
loadTempText("T50"); // folder text
|
|
}
|
|
|
|
void DreamWebEngine::showFolder() {
|
|
_commandType = 255;
|
|
if (_folderPage) {
|
|
useTempCharset(&_folderCharset);
|
|
createPanel2();
|
|
showFrame(_folderGraphics, 0, 0, 0, 0);
|
|
showFrame(_folderGraphics, 143, 0, 1, 0);
|
|
showFrame(_folderGraphics, 0, 92, 2, 0);
|
|
showFrame(_folderGraphics, 143, 92, 3, 0);
|
|
folderExit();
|
|
if (_folderPage != 1)
|
|
showLeftPage();
|
|
if (_folderPage != 12)
|
|
showRightPage();
|
|
useCharset1();
|
|
underTextLine();
|
|
} else {
|
|
createPanel2();
|
|
showFrame(_folderGraphics3, 143-28, 0, 0, 0);
|
|
showFrame(_folderGraphics3, 143-28, 92, 1, 0);
|
|
folderExit();
|
|
underTextLine();
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::folderExit() {
|
|
showFrame(_folderGraphics2, 296, 178, 6, 0);
|
|
}
|
|
|
|
void DreamWebEngine::showLeftPage() {
|
|
showFrame(_folderGraphics2, 0, 12, 3, 0);
|
|
uint16 y = 12+5;
|
|
for (uint i = 0; i < 9; ++i) {
|
|
showFrame(_folderGraphics2, 0, y, 4, 0);
|
|
y += 16;
|
|
}
|
|
showFrame(_folderGraphics2, 0, y, 5, 0);
|
|
_lineSpacing = 8;
|
|
_charShift = 91;
|
|
_kerning = 1;
|
|
uint8 pageIndex = _folderPage - 2;
|
|
const uint8 *string = getTextInFile1(pageIndex * 2);
|
|
y = 48;
|
|
for (uint i = 0; i < 2; ++i) {
|
|
uint8 lastChar;
|
|
do {
|
|
lastChar = printDirect(&string, 2, &y, 140, false);
|
|
y += _lineSpacing;
|
|
} while (lastChar != '\0');
|
|
}
|
|
_kerning = 0;
|
|
_charShift = 0;
|
|
_lineSpacing = 10;
|
|
uint8 *bufferToSwap = workspace() + (48*kScreenwidth)+2;
|
|
for (uint i = 0; i < 120; ++i) {
|
|
for (uint j = 0; j < 65; ++j) {
|
|
SWAP(bufferToSwap[j], bufferToSwap[130 - j]);
|
|
}
|
|
bufferToSwap += kScreenwidth;
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::showRightPage() {
|
|
showFrame(_folderGraphics2, 143, 12, 0, 0);
|
|
uint16 y = 12+37;
|
|
for (uint i = 0; i < 7; ++i) {
|
|
showFrame(_folderGraphics2, 143, y, 1, 0);
|
|
y += 16;
|
|
}
|
|
|
|
showFrame(_folderGraphics2, 143, y, 2, 0);
|
|
_lineSpacing = 8;
|
|
_kerning = 1;
|
|
uint8 pageIndex = _folderPage - 1;
|
|
const uint8 *string = getTextInFile1(pageIndex * 2);
|
|
y = 48;
|
|
for (uint i = 0; i < 2; ++i) {
|
|
uint8 lastChar;
|
|
do {
|
|
lastChar = printDirect(&string, 152, &y, 140, false);
|
|
y += _lineSpacing;
|
|
} while (lastChar != '\0');
|
|
}
|
|
_kerning = 0;
|
|
_lineSpacing = 10;
|
|
}
|
|
|
|
void DreamWebEngine::enterSymbol() {
|
|
_manIsOffScreen = 1;
|
|
getRidOfReels();
|
|
loadGraphicsFile(_symbolGraphics, "G12"); // symbol graphics
|
|
_symbolTopX = 24;
|
|
_symbolTopDir = 0;
|
|
_symbolBotX = 24;
|
|
_symbolBotDir = 0;
|
|
redrawMainScrn();
|
|
showSymbol();
|
|
underTextLine();
|
|
workToScreenM();
|
|
_getBack = 0;
|
|
do {
|
|
delPointer();
|
|
updateSymbolTop();
|
|
updateSymbolBot();
|
|
showSymbol();
|
|
readMouse();
|
|
showPointer();
|
|
waitForVSync();
|
|
dumpPointer();
|
|
dumpTextLine();
|
|
dumpSymbol();
|
|
RectWithCallback symbolList[] = {
|
|
{ kSymbolx+40,kSymbolx+64,kSymboly+2,kSymboly+16,&DreamWebEngine::quitSymbol },
|
|
{ kSymbolx,kSymbolx+52,kSymboly+20,kSymboly+50,&DreamWebEngine::setTopLeft },
|
|
{ kSymbolx+52,kSymbolx+104,kSymboly+20,kSymboly+50,&DreamWebEngine::setTopRight },
|
|
{ kSymbolx,kSymbolx+52,kSymboly+50,kSymboly+80,&DreamWebEngine::setBotLeft },
|
|
{ kSymbolx+52,kSymbolx+104,kSymboly+50,kSymboly+80,&DreamWebEngine::setBotRight },
|
|
{ 0,320,0,200,&DreamWebEngine::blank },
|
|
{ 0xFFFF,0,0,0,0 }
|
|
};
|
|
checkCoords(symbolList);
|
|
} while ((_getBack == 0) && !_quitRequested);
|
|
if ((_symbolBotNum == 3) && (_symbolTopNum == 5)) {
|
|
removeSetObject(43);
|
|
placeSetObject(46);
|
|
turnAnyPathOn(0, _roomNum + 12);
|
|
_manIsOffScreen = 0;
|
|
redrawMainScrn();
|
|
_symbolGraphics.clear();
|
|
restoreReels();
|
|
workToScreenM();
|
|
_sound->playChannel1(13);
|
|
} else {
|
|
removeSetObject(46);
|
|
placeSetObject(43);
|
|
turnAnyPathOff(0, _roomNum + 12);
|
|
_manIsOffScreen = 0;
|
|
redrawMainScrn();
|
|
_symbolGraphics.clear();
|
|
restoreReels();
|
|
workToScreenM();
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::quitSymbol() {
|
|
if (_symbolTopX != 24 || _symbolBotX != 24) {
|
|
blank();
|
|
return;
|
|
};
|
|
|
|
commandOnlyCond(18, 222);
|
|
|
|
if (_mouseButton == _oldButton)
|
|
return; // notqs
|
|
|
|
if (!(_mouseButton & 1))
|
|
return;
|
|
|
|
_getBack = 1;
|
|
}
|
|
|
|
void DreamWebEngine::setTopLeft() {
|
|
if (_symbolTopDir != 0) {
|
|
blank();
|
|
return;
|
|
}
|
|
|
|
commandOnlyCond(19, 210);
|
|
|
|
if (_mouseButton != 0)
|
|
_symbolTopDir = -1;
|
|
}
|
|
|
|
void DreamWebEngine::setTopRight() {
|
|
if (_symbolTopDir != 0) {
|
|
blank();
|
|
return;
|
|
}
|
|
|
|
commandOnlyCond(20, 211);
|
|
|
|
if (_mouseButton != 0)
|
|
_symbolTopDir = +1;
|
|
}
|
|
|
|
void DreamWebEngine::setBotLeft() {
|
|
if (_symbolBotDir != 0) {
|
|
blank();
|
|
return;
|
|
}
|
|
|
|
commandOnlyCond(21, 212);
|
|
|
|
if (_mouseButton != 0)
|
|
_symbolBotDir = -1;
|
|
}
|
|
|
|
void DreamWebEngine::setBotRight() {
|
|
if (_symbolBotDir != 0) {
|
|
blank();
|
|
return;
|
|
}
|
|
|
|
commandOnlyCond(22, 213);
|
|
|
|
if (_mouseButton != 0)
|
|
_symbolBotDir = +1;
|
|
}
|
|
|
|
void DreamWebEngine::dumpSymbol() {
|
|
_newTextLine = 0;
|
|
multiDump(kSymbolx, kSymboly + 20, 104, 60);
|
|
}
|
|
|
|
void DreamWebEngine::showSymbol() {
|
|
showFrame(_symbolGraphics, kSymbolx, kSymboly, 12, 0);
|
|
|
|
showFrame(_symbolGraphics, _symbolTopX + kSymbolx-44, kSymboly+20, _symbolTopNum, 32);
|
|
uint8 nextTopSymbol = nextSymbol(_symbolTopNum);
|
|
showFrame(_symbolGraphics, _symbolTopX + kSymbolx+5, kSymboly+20, nextTopSymbol, 32);
|
|
uint8 nextNextTopSymbol = nextSymbol(nextTopSymbol);
|
|
showFrame(_symbolGraphics, _symbolTopX + kSymbolx+54, kSymboly+20, nextNextTopSymbol, 32);
|
|
|
|
showFrame(_symbolGraphics, _symbolBotX + kSymbolx-44, kSymboly+49, 6 + _symbolBotNum, 32);
|
|
uint8 nextBotSymbol = nextSymbol(_symbolBotNum);
|
|
showFrame(_symbolGraphics, _symbolBotX + kSymbolx+5, kSymboly+49, 6 + nextBotSymbol, 32);
|
|
uint8 nextNextBotSymbol = nextSymbol(nextBotSymbol);
|
|
showFrame(_symbolGraphics, _symbolBotX + kSymbolx+54, kSymboly+49, 6 + nextNextBotSymbol, 32);
|
|
}
|
|
|
|
uint8 DreamWebEngine::nextSymbol(uint8 symbol) {
|
|
uint8 result = symbol + 1;
|
|
if (result == 6)
|
|
return 0;
|
|
if (result == 12)
|
|
return 6;
|
|
return result;
|
|
}
|
|
|
|
void DreamWebEngine::updateSymbolTop() {
|
|
if (!_symbolTopDir)
|
|
return; // topfinished
|
|
|
|
if (_symbolTopDir == -1) {
|
|
// Backward
|
|
_symbolTopX--;
|
|
if (_symbolTopX != (byte)-1) {
|
|
// Not wrapping
|
|
if (_symbolTopX != 24)
|
|
return; // topfinished
|
|
_symbolTopDir = 0;
|
|
} else {
|
|
_symbolTopX = 48;
|
|
_symbolTopNum++;
|
|
if (_symbolTopNum != 6)
|
|
return; // topfinished
|
|
_symbolTopNum = 0;
|
|
}
|
|
} else {
|
|
// Forward
|
|
_symbolTopX++;
|
|
if (_symbolTopX != 49) {
|
|
// Not wrapping
|
|
if (_symbolTopX != 24)
|
|
return; // topfinished
|
|
_symbolTopDir = 0;
|
|
} else {
|
|
_symbolTopX = 0;
|
|
_symbolTopNum--;
|
|
if (_symbolTopNum != (byte)-1)
|
|
return; // topfinished
|
|
_symbolTopNum = 5;
|
|
}
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::updateSymbolBot() {
|
|
if (!_symbolBotDir)
|
|
return; // botfinished
|
|
|
|
if (_symbolBotDir == -1) {
|
|
// Backward
|
|
_symbolBotX--;
|
|
if (_symbolBotX != (byte)-1) {
|
|
// Not wrapping
|
|
if (_symbolBotX != 24)
|
|
return; // botfinished
|
|
_symbolBotDir = 0;
|
|
} else {
|
|
_symbolBotX = 48;
|
|
_symbolBotNum++;
|
|
if (_symbolBotNum != 6)
|
|
return; // botfinished
|
|
_symbolBotNum = 0;
|
|
}
|
|
} else {
|
|
// Forward
|
|
_symbolBotX++;
|
|
if (_symbolBotX != 49) {
|
|
// Not wrapping
|
|
if (_symbolBotX != 24)
|
|
return; // botfinished
|
|
_symbolBotDir = 0;
|
|
} else {
|
|
_symbolBotX = 0;
|
|
_symbolBotNum--;
|
|
if (_symbolBotNum != (byte)-1)
|
|
return; // botfinished
|
|
_symbolBotNum = 5;
|
|
}
|
|
}
|
|
}
|
|
|
|
void DreamWebEngine::useDiary() {
|
|
getRidOfReels();
|
|
loadGraphicsFile(_diaryGraphics, "G14");
|
|
loadTempText("T51");
|
|
loadGraphicsFile(_diaryCharset, "C02");
|
|
createPanel();
|
|
showIcon();
|
|
showDiary();
|
|
underTextLine();
|
|
showDiaryPage();
|
|
readMouse();
|
|
showPointer();
|
|
workToScreen();
|
|
delPointer();
|
|
_getBack = 0;
|
|
|
|
RectWithCallback diaryList[] = {
|
|
{ kDiaryx+94,kDiaryx+110,kDiaryy+97,kDiaryy+113,&DreamWebEngine::diaryKeyN },
|
|
{ kDiaryx+151,kDiaryx+167,kDiaryy+71,kDiaryy+87,&DreamWebEngine::diaryKeyP },
|
|
{ kDiaryx+176,kDiaryx+192,kDiaryy+108,kDiaryy+124,&DreamWebEngine::quitKey },
|
|
{ 0,320,0,200,&DreamWebEngine::blank },
|
|
{ 0xFFFF,0,0,0,0 }
|
|
};
|
|
|
|
do {
|
|
delPointer();
|
|
readMouse();
|
|
showDiaryKeys();
|
|
showPointer();
|
|
waitForVSync();
|
|
dumpPointer();
|
|
dumpDiaryKeys();
|
|
dumpTextLine();
|
|
checkCoords(diaryList);
|
|
} while (!_getBack && !_quitRequested);
|
|
|
|
|
|
_diaryGraphics.clear();
|
|
getRidOfTempText();
|
|
_diaryCharset.clear();
|
|
restoreReels();
|
|
_manIsOffScreen = 0;
|
|
redrawMainScrn();
|
|
workToScreenM();
|
|
}
|
|
|
|
void DreamWebEngine::showDiary() {
|
|
showFrame(_diaryGraphics, kDiaryx, kDiaryy + 37, 1, 0);
|
|
showFrame(_diaryGraphics, kDiaryx + 176, kDiaryy + 108, 2, 0);
|
|
}
|
|
|
|
void DreamWebEngine::showDiaryKeys() {
|
|
if (!_pressCount)
|
|
return; // nokeyatall
|
|
|
|
_pressCount--;
|
|
|
|
if (!_pressCount)
|
|
return; // nokeyatall
|
|
|
|
if (_pressed == 'N') {
|
|
byte frame = (_pressCount == 1) ? 3 : 4;
|
|
showFrame(_diaryGraphics, kDiaryx + 94, kDiaryy + 97, frame, 0);
|
|
} else {
|
|
byte frame = (_pressCount == 1) ? 5 : 6;
|
|
showFrame(_diaryGraphics, kDiaryx + 151, kDiaryy + 71, frame, 0);
|
|
}
|
|
|
|
if (_pressCount == 1)
|
|
showDiaryPage();
|
|
}
|
|
|
|
void DreamWebEngine::dumpDiaryKeys() {
|
|
if (_pressCount == 1) {
|
|
if (_vars._sartainDead != 1 && _diaryPage == 5 && getLocation(6) != 1) {
|
|
// Add Sartain Industries note
|
|
setLocation(6);
|
|
delPointer();
|
|
const uint8 *string = getTextInFile1(12);
|
|
printDirect(string, 70, 106, 241, 241 & 1);
|
|
workToScreenM();
|
|
hangOnP(200);
|
|
createPanel();
|
|
showIcon();
|
|
showDiary();
|
|
showDiaryPage();
|
|
workToScreenM();
|
|
showPointer();
|
|
return;
|
|
} else {
|
|
multiDump(kDiaryx + 48, kDiaryy + 15, 200, 16);
|
|
}
|
|
}
|
|
|
|
multiDump(kDiaryx + 94, kDiaryy + 97, 16, 16);
|
|
multiDump(kDiaryx + 151, kDiaryy + 71, 16, 16);
|
|
}
|
|
|
|
void DreamWebEngine::diaryKeyP() {
|
|
commandOnlyCond(23, 214);
|
|
|
|
if (!_mouseButton ||
|
|
_oldButton == _mouseButton ||
|
|
_pressCount)
|
|
return; // notkeyp
|
|
|
|
_sound->playChannel1(16);
|
|
_pressCount = 12;
|
|
_pressed = 'P';
|
|
_diaryPage--;
|
|
|
|
if (_diaryPage == 0xFF)
|
|
_diaryPage = 11;
|
|
}
|
|
|
|
void DreamWebEngine::diaryKeyN() {
|
|
commandOnlyCond(23, 213);
|
|
|
|
if (!_mouseButton ||
|
|
_oldButton == _mouseButton ||
|
|
_pressCount)
|
|
return; // notkeyn
|
|
|
|
_sound->playChannel1(16);
|
|
_pressCount = 12;
|
|
_pressed = 'N';
|
|
_diaryPage++;
|
|
|
|
if (_diaryPage == 12)
|
|
_diaryPage = 0;
|
|
}
|
|
|
|
void DreamWebEngine::showDiaryPage() {
|
|
showFrame(_diaryGraphics, kDiaryx, kDiaryy, 0, 0);
|
|
_kerning = 1;
|
|
useTempCharset(&_diaryCharset);
|
|
_charShift = 91+91;
|
|
const uint8 *string = getTextInFile1(_diaryPage);
|
|
uint16 y = kDiaryy + 16;
|
|
printDirect(&string, kDiaryx + 48, &y, 240, 240 & 1);
|
|
y = kDiaryy + 16;
|
|
printDirect(&string, kDiaryx + 129, &y, 240, 240 & 1);
|
|
y = kDiaryy + 23;
|
|
printDirect(&string, kDiaryx + 48, &y, 240, 240 & 1);
|
|
_kerning = 0;
|
|
_charShift = 0;
|
|
useCharset1();
|
|
}
|
|
|
|
} // End of namespace DreamWeb
|