LAB: Separate the interface from the event manager
This commit is contained in:
parent
71b665b617
commit
afa75b7047
10 changed files with 322 additions and 256 deletions
|
@ -37,6 +37,7 @@
|
|||
#include "lab/eventman.h"
|
||||
#include "lab/music.h"
|
||||
#include "lab/image.h"
|
||||
#include "lab/interface.h"
|
||||
#include "lab/resource.h"
|
||||
#include "lab/utils.h"
|
||||
|
||||
|
@ -216,7 +217,7 @@ int DisplayMan::longDrawMessage(Common::String str, bool isActionMessage) {
|
|||
if (str.empty())
|
||||
return 0;
|
||||
|
||||
_vm->_event->attachButtonList(nullptr);
|
||||
_vm->_interface->attachButtonList(nullptr);
|
||||
|
||||
if (!_longWinInFront) {
|
||||
_longWinInFront = true;
|
||||
|
@ -269,7 +270,7 @@ void DisplayMan::drawPanel() {
|
|||
if (!_vm->_alternate) {
|
||||
// The horizontal lines under the black one
|
||||
drawHLine(0, _vm->_utils->vgaScaleY(170) + 1, _vm->_utils->vgaScaleX(319), 4);
|
||||
_vm->_event->drawButtonList(&_vm->_moveButtonList);
|
||||
_vm->_interface->drawButtonList(&_vm->_moveButtonList);
|
||||
} else {
|
||||
if (_vm->getPlatform() != Common::kPlatformWindows) {
|
||||
// Vertical Black lines
|
||||
|
@ -298,12 +299,12 @@ void DisplayMan::drawPanel() {
|
|||
drawVLine(_vm->_utils->vgaScaleX(232), _vm->_utils->vgaScaleY(170) + 2, _vm->_utils->vgaScaleY(198), 4);
|
||||
}
|
||||
|
||||
_vm->_event->drawButtonList(&_vm->_invButtonList);
|
||||
_vm->_interface->drawButtonList(&_vm->_invButtonList);
|
||||
}
|
||||
}
|
||||
|
||||
void DisplayMan::setUpScreens() {
|
||||
EventManager *e = _vm->_event;
|
||||
Interface *i = _vm->_interface;
|
||||
ButtonList *moveButtonList = &_vm->_moveButtonList;
|
||||
ButtonList *invButtonList = &_vm->_invButtonList;
|
||||
Image **moveImages = _vm->_moveImages;
|
||||
|
@ -313,8 +314,8 @@ void DisplayMan::setUpScreens() {
|
|||
|
||||
// TODO: The CONTROL file is not present in the Amiga version
|
||||
Common::File *controlFile = _vm->_resource->openDataFile("P:Control");
|
||||
for (int i = 0; i < 20; i++)
|
||||
_vm->_moveImages[i] = new Image(controlFile, _vm);
|
||||
for (int j = 0; j < 20; j++)
|
||||
_vm->_moveImages[j] = new Image(controlFile, _vm);
|
||||
delete controlFile;
|
||||
|
||||
// Creates the buttons for the movement control panel
|
||||
|
@ -322,16 +323,16 @@ void DisplayMan::setUpScreens() {
|
|||
// It's very convenient to have those shortcut, so I added them
|
||||
// for all versions. (Strangerke)
|
||||
uint16 y = _vm->_utils->vgaScaleY(173) - _vm->_utils->svgaCord(2);
|
||||
moveButtonList->push_back(e->createButton( 1, y, 0, Common::KEYCODE_t, moveImages[0], moveImages[1]));
|
||||
moveButtonList->push_back(e->createButton( 33, y, 1, Common::KEYCODE_m, moveImages[2], moveImages[3]));
|
||||
moveButtonList->push_back(e->createButton( 65, y, 2, Common::KEYCODE_o, moveImages[4], moveImages[5]));
|
||||
moveButtonList->push_back(e->createButton( 97, y, 3, Common::KEYCODE_c, moveImages[6], moveImages[7]));
|
||||
moveButtonList->push_back(e->createButton(129, y, 4, Common::KEYCODE_l, moveImages[8], moveImages[9]));
|
||||
moveButtonList->push_back(e->createButton(161, y, 5, Common::KEYCODE_i, moveImages[12], moveImages[13]));
|
||||
moveButtonList->push_back(e->createButton(193, y, 6, Common::KEYCODE_LEFT, moveImages[14], moveImages[15]));
|
||||
moveButtonList->push_back(e->createButton(225, y, 7, Common::KEYCODE_UP, moveImages[16], moveImages[17]));
|
||||
moveButtonList->push_back(e->createButton(257, y, 8, Common::KEYCODE_RIGHT, moveImages[18], moveImages[19]));
|
||||
moveButtonList->push_back(e->createButton(289, y, 9, Common::KEYCODE_p, moveImages[10], moveImages[11]));
|
||||
moveButtonList->push_back(i->createButton( 1, y, 0, Common::KEYCODE_t, moveImages[0], moveImages[1]));
|
||||
moveButtonList->push_back(i->createButton( 33, y, 1, Common::KEYCODE_m, moveImages[2], moveImages[3]));
|
||||
moveButtonList->push_back(i->createButton( 65, y, 2, Common::KEYCODE_o, moveImages[4], moveImages[5]));
|
||||
moveButtonList->push_back(i->createButton( 97, y, 3, Common::KEYCODE_c, moveImages[6], moveImages[7]));
|
||||
moveButtonList->push_back(i->createButton(129, y, 4, Common::KEYCODE_l, moveImages[8], moveImages[9]));
|
||||
moveButtonList->push_back(i->createButton(161, y, 5, Common::KEYCODE_i, moveImages[12], moveImages[13]));
|
||||
moveButtonList->push_back(i->createButton(193, y, 6, Common::KEYCODE_LEFT, moveImages[14], moveImages[15]));
|
||||
moveButtonList->push_back(i->createButton(225, y, 7, Common::KEYCODE_UP, moveImages[16], moveImages[17]));
|
||||
moveButtonList->push_back(i->createButton(257, y, 8, Common::KEYCODE_RIGHT, moveImages[18], moveImages[19]));
|
||||
moveButtonList->push_back(i->createButton(289, y, 9, Common::KEYCODE_p, moveImages[10], moveImages[11]));
|
||||
|
||||
// TODO: The INV file is not present in the Amiga version
|
||||
Common::File *invFile = _vm->_resource->openDataFile("P:Inv");
|
||||
|
@ -342,18 +343,18 @@ void DisplayMan::setUpScreens() {
|
|||
for (int imgIdx = 0; imgIdx < 6; imgIdx++)
|
||||
_vm->_invImages[imgIdx] = new Image(invFile, _vm);
|
||||
}
|
||||
invButtonList->push_back(e->createButton( 24, y, 0, Common::KEYCODE_ESCAPE, invImages[0], invImages[1]));
|
||||
invButtonList->push_back(e->createButton( 56, y, 1, Common::KEYCODE_g, invImages[2], invImages[3]));
|
||||
invButtonList->push_back(e->createButton( 94, y, 2, Common::KEYCODE_u, invImages[4], invImages[5]));
|
||||
invButtonList->push_back(e->createButton(126, y, 3, Common::KEYCODE_l, moveImages[8], moveImages[9]));
|
||||
invButtonList->push_back(e->createButton(164, y, 4, Common::KEYCODE_LEFT, moveImages[14], moveImages[15]));
|
||||
invButtonList->push_back(e->createButton(196, y, 5, Common::KEYCODE_RIGHT, moveImages[18], moveImages[19]));
|
||||
invButtonList->push_back(i->createButton( 24, y, 0, Common::KEYCODE_ESCAPE, invImages[0], invImages[1]));
|
||||
invButtonList->push_back(i->createButton( 56, y, 1, Common::KEYCODE_g, invImages[2], invImages[3]));
|
||||
invButtonList->push_back(i->createButton( 94, y, 2, Common::KEYCODE_u, invImages[4], invImages[5]));
|
||||
invButtonList->push_back(i->createButton(126, y, 3, Common::KEYCODE_l, moveImages[8], moveImages[9]));
|
||||
invButtonList->push_back(i->createButton(164, y, 4, Common::KEYCODE_LEFT, moveImages[14], moveImages[15]));
|
||||
invButtonList->push_back(i->createButton(196, y, 5, Common::KEYCODE_RIGHT, moveImages[18], moveImages[19]));
|
||||
|
||||
// The windows version has 2 extra buttons for breadcrumb trail
|
||||
// CHECKME: the game is really hard to play without those, maybe we could add something to enable that.
|
||||
if (_vm->getPlatform() == Common::kPlatformWindows) {
|
||||
invButtonList->push_back(e->createButton(234, y, 6, Common::KEYCODE_b, invImages[6], invImages[7]));
|
||||
invButtonList->push_back(e->createButton(266, y, 7, Common::KEYCODE_f, invImages[8], invImages[9]));
|
||||
invButtonList->push_back(i->createButton(234, y, 6, Common::KEYCODE_b, invImages[6], invImages[7]));
|
||||
invButtonList->push_back(i->createButton(266, y, 7, Common::KEYCODE_f, invImages[8], invImages[9]));
|
||||
}
|
||||
|
||||
delete invFile;
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "lab/dispman.h"
|
||||
#include "lab/eventman.h"
|
||||
#include "lab/image.h"
|
||||
#include "lab/interface.h"
|
||||
#include "lab/intro.h"
|
||||
#include "lab/labsets.h"
|
||||
#include "lab/music.h"
|
||||
|
@ -47,9 +48,6 @@
|
|||
|
||||
namespace Lab {
|
||||
|
||||
#define CRUMBSWIDTH 24
|
||||
#define CRUMBSHEIGHT 24
|
||||
|
||||
enum SpecialLock {
|
||||
kLockCombination = 100,
|
||||
kLockTiles = 101,
|
||||
|
@ -256,7 +254,7 @@ void LabEngine::handleMonitorCloseup() {
|
|||
_graphics->drawPanel();
|
||||
|
||||
_closeDataPtr = nullptr;
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
_graphics->screenUpdate();
|
||||
}
|
||||
|
||||
|
@ -289,7 +287,7 @@ Common::String LabEngine::getInvName(uint16 curInv) {
|
|||
|
||||
void LabEngine::interfaceOff() {
|
||||
if (!_interfaceOff) {
|
||||
_event->attachButtonList(nullptr);
|
||||
_interface->attachButtonList(nullptr);
|
||||
_event->mouseHide();
|
||||
_interfaceOff = true;
|
||||
}
|
||||
|
@ -302,11 +300,11 @@ void LabEngine::interfaceOn() {
|
|||
}
|
||||
|
||||
if (_graphics->_longWinInFront)
|
||||
_event->attachButtonList(nullptr);
|
||||
_interface->attachButtonList(nullptr);
|
||||
else if (_alternate)
|
||||
_event->attachButtonList(&_invButtonList);
|
||||
_interface->attachButtonList(&_invButtonList);
|
||||
else
|
||||
_event->attachButtonList(&_moveButtonList);
|
||||
_interface->attachButtonList(&_moveButtonList);
|
||||
}
|
||||
|
||||
bool LabEngine::doUse(uint16 curInv) {
|
||||
|
@ -489,7 +487,7 @@ void LabEngine::mainGameLoop() {
|
|||
drawRoomMessage(curInv, _closeDataPtr);
|
||||
forceDraw = false;
|
||||
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
_graphics->screenUpdate();
|
||||
|
||||
if (!_followingCrumbs)
|
||||
|
@ -523,14 +521,14 @@ void LabEngine::mainGameLoop() {
|
|||
|
||||
if (code == kButtonForward || code == kButtonLeft || code == kButtonRight) {
|
||||
gotMessage = true;
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
_graphics->screenUpdate();
|
||||
if (!processEvent(kMessageButtonUp, code, 0, _event->updateAndGetMousePos(), curInv, curMsg, forceDraw, code, actionMode))
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
_graphics->screenUpdate();
|
||||
} else {
|
||||
gotMessage = true;
|
||||
|
@ -604,7 +602,7 @@ bool LabEngine::processEvent(MessageClass tmpClass, uint16 code, uint16 qualifie
|
|||
else
|
||||
performAction(actionMode, curPos, curInv);
|
||||
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
_graphics->screenUpdate();
|
||||
} else if (rightButtonClick) {
|
||||
eatMessages();
|
||||
|
@ -624,7 +622,7 @@ bool LabEngine::processEvent(MessageClass tmpClass, uint16 code, uint16 qualifie
|
|||
_graphics->drawPanel();
|
||||
drawRoomMessage(curInv, _closeDataPtr);
|
||||
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
_graphics->screenUpdate();
|
||||
}
|
||||
|
||||
|
@ -637,7 +635,7 @@ bool LabEngine::processKey(IntuiMessage *curMsg, uint32 msgClass, uint16 &qualif
|
|||
_breadCrumbs[0]._crumbRoomNum = 0;
|
||||
_numCrumbs = 0;
|
||||
_droppingCrumbs = true;
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
_graphics->screenUpdate();
|
||||
} else if (getPlatform() == Common::kPlatformWindows && (code == Common::KEYCODE_f || code == Common::KEYCODE_r)) {
|
||||
// Follow bread crumbs
|
||||
|
@ -665,8 +663,7 @@ bool LabEngine::processKey(IntuiMessage *curMsg, uint32 msgClass, uint16 &qualif
|
|||
_breadCrumbs[0]._crumbRoomNum = 0;
|
||||
_droppingCrumbs = false;
|
||||
|
||||
// Need to hide indicator!!!!
|
||||
mayShowCrumbIndicatorOff();
|
||||
_interface->mayShowCrumbIndicatorOff();
|
||||
_graphics->screenUpdate();
|
||||
}
|
||||
}
|
||||
|
@ -729,7 +726,7 @@ void LabEngine::processMainButton(uint16 &curInv, uint16 &lastInv, uint16 &oldDi
|
|||
|
||||
_anim->_doBlack = true;
|
||||
_closeDataPtr = nullptr;
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
} else {
|
||||
uint16 oldActionMode = actionMode;
|
||||
actionMode = buttonId;
|
||||
|
@ -760,7 +757,7 @@ void LabEngine::processMainButton(uint16 &curInv, uint16 &lastInv, uint16 &oldDi
|
|||
_graphics->drawPanel();
|
||||
drawRoomMessage(curInv, _closeDataPtr);
|
||||
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
break;
|
||||
|
||||
case kButtonLeft:
|
||||
|
@ -779,7 +776,7 @@ void LabEngine::processMainButton(uint16 &curInv, uint16 &lastInv, uint16 &oldDi
|
|||
_anim->_doBlack = true;
|
||||
_direction = newDir;
|
||||
forceDraw = true;
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
}
|
||||
break;
|
||||
|
||||
|
@ -842,14 +839,14 @@ void LabEngine::processMainButton(uint16 &curInv, uint16 &lastInv, uint16 &oldDi
|
|||
}
|
||||
}
|
||||
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
}
|
||||
break;
|
||||
|
||||
case kButtonMap:
|
||||
doUse(kItemMap);
|
||||
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -939,7 +936,7 @@ void LabEngine::processAltButton(uint16 &curInv, uint16 &lastInv, uint16 buttonI
|
|||
_breadCrumbs[0]._crumbRoomNum = 0;
|
||||
_numCrumbs = 0;
|
||||
_droppingCrumbs = true;
|
||||
mayShowCrumbIndicator();
|
||||
_interface->mayShowCrumbIndicator();
|
||||
break;
|
||||
|
||||
case kButtonFollowCrumbs:
|
||||
|
@ -964,8 +961,7 @@ void LabEngine::processAltButton(uint16 &curInv, uint16 &lastInv, uint16 buttonI
|
|||
_breadCrumbs[0]._crumbRoomNum = 0;
|
||||
_droppingCrumbs = false;
|
||||
|
||||
// Need to hide indicator!!!!
|
||||
mayShowCrumbIndicatorOff();
|
||||
_interface->mayShowCrumbIndicatorOff();
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
@ -1130,85 +1126,4 @@ MainButton LabEngine::followCrumbs() {
|
|||
return moveDir;
|
||||
}
|
||||
|
||||
|
||||
void LabEngine::mayShowCrumbIndicator() {
|
||||
static byte dropCrumbsImageData[CRUMBSWIDTH * CRUMBSHEIGHT] = {
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0,
|
||||
0, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 0,
|
||||
4, 7, 7, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 7, 7, 4,
|
||||
4, 7, 4, 4, 0, 0, 3, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 3, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 3, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 3, 3, 3, 4, 4, 4, 4, 4, 4, 0, 0, 3, 2, 3, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 4, 7, 7, 7, 7, 7, 7, 4, 3, 2, 2, 2, 3, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 7, 7, 4, 4, 4, 4, 7, 7, 4, 3, 3, 3, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 7, 4, 4, 0, 0, 4, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 4, 4, 3, 0, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 4, 3, 2, 3, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 3, 2, 2, 2, 3, 4, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 0, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 3, 0, 0, 4, 4, 7, 4,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 4,
|
||||
0, 0, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 0,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0
|
||||
};
|
||||
|
||||
if (getPlatform() != Common::kPlatformWindows)
|
||||
return;
|
||||
|
||||
if (_droppingCrumbs && _mainDisplay) {
|
||||
static byte *imgData = new byte[CRUMBSWIDTH * CRUMBSHEIGHT];
|
||||
memcpy(imgData, dropCrumbsImageData, CRUMBSWIDTH * CRUMBSHEIGHT);
|
||||
static Image dropCrumbsImage(CRUMBSWIDTH, CRUMBSHEIGHT, imgData, this);
|
||||
|
||||
dropCrumbsImage.drawMaskImage(612, 4);
|
||||
}
|
||||
}
|
||||
|
||||
void LabEngine::mayShowCrumbIndicatorOff() {
|
||||
static byte dropCrumbsOffImageData[CRUMBSWIDTH * CRUMBSHEIGHT] = {
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0,
|
||||
0, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 0,
|
||||
4, 8, 8, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 8, 8, 4,
|
||||
4, 8, 4, 4, 0, 0, 3, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 3, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 3, 8, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 3, 3, 3, 4, 4, 4, 4, 4, 4, 0, 0, 3, 8, 3, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 4, 8, 8, 8, 8, 8, 8, 4, 3, 8, 8, 8, 3, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 8, 8, 4, 4, 4, 4, 8, 8, 4, 3, 3, 3, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 8, 4, 4, 0, 0, 4, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 4, 4, 3, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 4, 3, 8, 3, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 3, 8, 8, 8, 3, 4, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 0, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 8, 8, 3, 0, 0, 4, 4, 8, 4,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 4,
|
||||
0, 0, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 0,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0
|
||||
};
|
||||
|
||||
if (getPlatform() != Common::kPlatformWindows)
|
||||
return;
|
||||
|
||||
if (_mainDisplay) {
|
||||
static byte *imgData = new byte[CRUMBSWIDTH * CRUMBSHEIGHT];
|
||||
memcpy(imgData, dropCrumbsOffImageData, CRUMBSWIDTH * CRUMBSHEIGHT);
|
||||
static Image dropCrumbsOffImage(CRUMBSWIDTH, CRUMBSHEIGHT, imgData, this);
|
||||
|
||||
dropCrumbsOffImage.drawMaskImage(612, 4);
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace Lab
|
||||
|
|
|
@ -37,6 +37,7 @@
|
|||
#include "lab/dispman.h"
|
||||
#include "lab/eventman.h"
|
||||
#include "lab/image.h"
|
||||
#include "lab/interface.h"
|
||||
|
||||
namespace Lab {
|
||||
|
||||
|
@ -64,10 +65,7 @@ static const byte mouseData[] = {
|
|||
EventManager::EventManager(LabEngine *vm) : _vm(vm) {
|
||||
_leftClick = false;
|
||||
_rightClick = false;
|
||||
|
||||
_lastButtonHit = nullptr;
|
||||
_screenButtonList = nullptr;
|
||||
_hitButton = nullptr;
|
||||
_buttonHit = false;
|
||||
_mousePos = Common::Point(0, 0);
|
||||
_keyPressed = Common::KEYCODE_INVALID;
|
||||
}
|
||||
|
@ -87,19 +85,6 @@ void EventManager::mouseHide() {
|
|||
CursorMan.showMouse(false);
|
||||
}
|
||||
|
||||
void EventManager::updateMouse() {
|
||||
if (!_hitButton)
|
||||
return;
|
||||
|
||||
_hitButton->_altImage->drawImage(_hitButton->_x, _hitButton->_y);
|
||||
for (int i = 0; i < 3; i++)
|
||||
_vm->waitTOF();
|
||||
_hitButton->_image->drawImage(_hitButton->_x, _hitButton->_y);
|
||||
|
||||
_hitButton = nullptr;
|
||||
_vm->_graphics->screenUpdate();
|
||||
}
|
||||
|
||||
void EventManager::setMousePos(Common::Point pos) {
|
||||
if (_vm->_isHiRes)
|
||||
_vm->_system->warpMouse(pos.x, pos.y);
|
||||
|
@ -109,16 +94,12 @@ void EventManager::setMousePos(Common::Point pos) {
|
|||
|
||||
void EventManager::processInput() {
|
||||
Common::Event event;
|
||||
Button *curButton = nullptr;
|
||||
|
||||
while (_vm->_system->getEventManager()->pollEvent(event)) {
|
||||
switch (event.type) {
|
||||
case Common::EVENT_LBUTTONDOWN:
|
||||
if (_screenButtonList)
|
||||
curButton = checkButtonHit(_screenButtonList, _mousePos);
|
||||
|
||||
if (curButton)
|
||||
_lastButtonHit = curButton;
|
||||
if (_vm->_interface->checkButtonHit(_mousePos))
|
||||
_buttonHit = true;
|
||||
else
|
||||
_leftClick = true;
|
||||
break;
|
||||
|
@ -156,6 +137,51 @@ void EventManager::processInput() {
|
|||
}
|
||||
}
|
||||
|
||||
IntuiMessage *EventManager::getMsg() {
|
||||
static IntuiMessage message;
|
||||
|
||||
_vm->_interface->handlePressedButton();
|
||||
processInput();
|
||||
|
||||
if (_buttonHit) {
|
||||
Button *lastButtonHit = _vm->_interface->checkButtonHit(_mousePos);
|
||||
_buttonHit = false;
|
||||
if (lastButtonHit) {
|
||||
_vm->_interface->handlePressedButton();
|
||||
message._msgClass = kMessageButtonUp;
|
||||
message._code = lastButtonHit->_buttonId;
|
||||
message._qualifier = _keyPressed.flags;
|
||||
|
||||
return &message;
|
||||
} else
|
||||
return nullptr;
|
||||
} else if (_leftClick || _rightClick) {
|
||||
message._msgClass = (_leftClick) ? kMessageLeftClick : kMessageRightClick;
|
||||
message._qualifier = 0;
|
||||
message._mouse = _mousePos;
|
||||
_leftClick = _rightClick = false;
|
||||
return &message;
|
||||
} else if (_keyPressed.keycode != Common::KEYCODE_INVALID) {
|
||||
Button *curButton = _vm->_interface->checkNumButtonHit(_keyPressed.keycode);
|
||||
|
||||
if (curButton) {
|
||||
message._msgClass = kMessageButtonUp;
|
||||
message._code = curButton->_buttonId;
|
||||
} else {
|
||||
message._msgClass = kMessageRawKey;
|
||||
message._code = _keyPressed.keycode;
|
||||
}
|
||||
|
||||
message._qualifier = _keyPressed.flags;
|
||||
message._mouse = _mousePos;
|
||||
|
||||
_keyPressed.keycode = Common::KEYCODE_INVALID;
|
||||
|
||||
return &message;
|
||||
} else
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Common::Point EventManager::updateAndGetMousePos() {
|
||||
processInput();
|
||||
|
||||
|
|
|
@ -45,55 +45,20 @@ struct IntuiMessage {
|
|||
Common::Point _mouse;
|
||||
};
|
||||
|
||||
struct Button {
|
||||
uint16 _x, _y, _buttonId;
|
||||
Common::KeyCode _keyEquiv; // the key which activates this button
|
||||
bool _isEnabled;
|
||||
Image *_image, *_altImage;
|
||||
};
|
||||
|
||||
typedef Common::List<Button *> ButtonList;
|
||||
|
||||
class EventManager {
|
||||
private:
|
||||
LabEngine *_vm;
|
||||
|
||||
bool _leftClick;
|
||||
bool _rightClick;
|
||||
bool _buttonHit;
|
||||
|
||||
Button *_hitButton;
|
||||
Button *_lastButtonHit;
|
||||
ButtonList *_screenButtonList;
|
||||
Common::Point _mousePos;
|
||||
Common::KeyState _keyPressed;
|
||||
|
||||
private:
|
||||
/**
|
||||
* Checks whether or not the cords fall within one of the buttons in a list
|
||||
* of buttons.
|
||||
*/
|
||||
Button *checkButtonHit(ButtonList *buttonList, Common::Point pos);
|
||||
|
||||
/**
|
||||
* Checks whether or not the coords fall within one of the buttons in a list
|
||||
* of buttons.
|
||||
*/
|
||||
Button *checkNumButtonHit(ButtonList *buttonList, Common::KeyCode key);
|
||||
|
||||
public:
|
||||
EventManager (LabEngine *vm);
|
||||
|
||||
void attachButtonList(ButtonList *buttonList);
|
||||
Button *createButton(uint16 x, uint16 y, uint16 id, Common::KeyCode key, Image *image, Image *altImage);
|
||||
void toggleButton(Button *button, uint16 penColor, bool enable);
|
||||
|
||||
/**
|
||||
* Draws a button list to the screen.
|
||||
*/
|
||||
void drawButtonList(ButtonList *buttonList);
|
||||
void freeButtonList(ButtonList *buttonList);
|
||||
Button *getButton(uint16 id);
|
||||
|
||||
IntuiMessage *getMsg();
|
||||
|
||||
/**
|
||||
|
@ -116,7 +81,6 @@ public:
|
|||
* Moves the mouse to new co-ordinates.
|
||||
*/
|
||||
void setMousePos(Common::Point pos);
|
||||
void updateMouse();
|
||||
Common::Point updateAndGetMousePos();
|
||||
|
||||
/**
|
||||
|
|
|
@ -33,13 +33,21 @@
|
|||
#include "lab/lab.h"
|
||||
|
||||
#include "lab/dispman.h"
|
||||
#include "lab/eventman.h"
|
||||
#include "lab/interface.h"
|
||||
#include "lab/image.h"
|
||||
#include "lab/utils.h"
|
||||
|
||||
namespace Lab {
|
||||
|
||||
Button *EventManager::createButton(uint16 x, uint16 y, uint16 id, Common::KeyCode key, Image *image, Image *altImage) {
|
||||
#define CRUMBSWIDTH 24
|
||||
#define CRUMBSHEIGHT 24
|
||||
|
||||
Interface::Interface(LabEngine *vm) : _vm(vm) {
|
||||
_screenButtonList = nullptr;
|
||||
_hitButton = nullptr;
|
||||
}
|
||||
|
||||
Button *Interface::createButton(uint16 x, uint16 y, uint16 id, Common::KeyCode key, Image *image, Image *altImage) {
|
||||
Button *button = new Button();
|
||||
|
||||
if (button) {
|
||||
|
@ -56,7 +64,7 @@ Button *EventManager::createButton(uint16 x, uint16 y, uint16 id, Common::KeyCod
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void EventManager::freeButtonList(ButtonList *buttonList) {
|
||||
void Interface::freeButtonList(ButtonList *buttonList) {
|
||||
for (ButtonList::iterator buttonIter = buttonList->begin(); buttonIter != buttonList->end(); ++buttonIter) {
|
||||
Button *button = *buttonIter;
|
||||
delete button->_image;
|
||||
|
@ -67,7 +75,7 @@ void EventManager::freeButtonList(ButtonList *buttonList) {
|
|||
buttonList->clear();
|
||||
}
|
||||
|
||||
void EventManager::drawButtonList(ButtonList *buttonList) {
|
||||
void Interface::drawButtonList(ButtonList *buttonList) {
|
||||
for (ButtonList::iterator button = buttonList->begin(); button != buttonList->end(); ++button) {
|
||||
toggleButton((*button), 1, true);
|
||||
|
||||
|
@ -76,7 +84,7 @@ void EventManager::drawButtonList(ButtonList *buttonList) {
|
|||
}
|
||||
}
|
||||
|
||||
void EventManager::toggleButton(Button *button, uint16 disabledPenColor, bool enable) {
|
||||
void Interface::toggleButton(Button *button, uint16 disabledPenColor, bool enable) {
|
||||
if (!enable)
|
||||
_vm->_graphics->checkerBoardEffect(disabledPenColor, button->_x, button->_y, button->_x + button->_image->_width - 1, button->_y + button->_image->_height - 1);
|
||||
else
|
||||
|
@ -85,13 +93,13 @@ void EventManager::toggleButton(Button *button, uint16 disabledPenColor, bool en
|
|||
button->_isEnabled = enable;
|
||||
}
|
||||
|
||||
Button *EventManager::checkNumButtonHit(ButtonList *buttonList, Common::KeyCode key) {
|
||||
Button *Interface::checkNumButtonHit(Common::KeyCode key) {
|
||||
uint16 gkey = key - '0';
|
||||
|
||||
if (!buttonList)
|
||||
if (!_screenButtonList)
|
||||
return nullptr;
|
||||
|
||||
for (ButtonList::iterator buttonItr = buttonList->begin(); buttonItr != buttonList->end(); ++buttonItr) {
|
||||
for (ButtonList::iterator buttonItr = _screenButtonList->begin(); buttonItr != _screenButtonList->end(); ++buttonItr) {
|
||||
Button *button = *buttonItr;
|
||||
if (!button->_isEnabled)
|
||||
continue;
|
||||
|
@ -107,8 +115,11 @@ Button *EventManager::checkNumButtonHit(ButtonList *buttonList, Common::KeyCode
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
Button *EventManager::checkButtonHit(ButtonList *buttonList, Common::Point pos) {
|
||||
for (ButtonList::iterator buttonItr = buttonList->begin(); buttonItr != buttonList->end(); ++buttonItr) {
|
||||
Button *Interface::checkButtonHit(Common::Point pos) {
|
||||
if (!_screenButtonList)
|
||||
return nullptr;
|
||||
|
||||
for (ButtonList::iterator buttonItr = _screenButtonList->begin(); buttonItr != _screenButtonList->end(); ++buttonItr) {
|
||||
Button *button = *buttonItr;
|
||||
Common::Rect buttonRect(button->_x, button->_y, button->_x + button->_image->_width - 1, button->_y + button->_image->_height - 1);
|
||||
|
||||
|
@ -121,14 +132,24 @@ Button *EventManager::checkButtonHit(ButtonList *buttonList, Common::Point pos)
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
void EventManager::attachButtonList(ButtonList *buttonList) {
|
||||
if (_screenButtonList != buttonList)
|
||||
_lastButtonHit = nullptr;
|
||||
void Interface::handlePressedButton() {
|
||||
if (!_hitButton)
|
||||
return;
|
||||
|
||||
_hitButton->_altImage->drawImage(_hitButton->_x, _hitButton->_y);
|
||||
for (int i = 0; i < 3; i++)
|
||||
_vm->waitTOF();
|
||||
_hitButton->_image->drawImage(_hitButton->_x, _hitButton->_y);
|
||||
|
||||
_hitButton = nullptr;
|
||||
_vm->_graphics->screenUpdate();
|
||||
}
|
||||
|
||||
void Interface::attachButtonList(ButtonList *buttonList) {
|
||||
_screenButtonList = buttonList;
|
||||
}
|
||||
|
||||
Button *EventManager::getButton(uint16 id) {
|
||||
Button *Interface::getButton(uint16 id) {
|
||||
for (ButtonList::iterator buttonItr = _screenButtonList->begin(); buttonItr != _screenButtonList->end(); ++buttonItr) {
|
||||
Button *button = *buttonItr;
|
||||
if (button->_buttonId == id)
|
||||
|
@ -138,44 +159,84 @@ Button *EventManager::getButton(uint16 id) {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
IntuiMessage *EventManager::getMsg() {
|
||||
static IntuiMessage message;
|
||||
void Interface::mayShowCrumbIndicator() {
|
||||
static byte dropCrumbsImageData[CRUMBSWIDTH * CRUMBSHEIGHT] = {
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0,
|
||||
0, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 0,
|
||||
4, 7, 7, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 7, 7, 4,
|
||||
4, 7, 4, 4, 0, 0, 3, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 3, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 3, 2, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 3, 3, 3, 4, 4, 4, 4, 4, 4, 0, 0, 3, 2, 3, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 4, 7, 7, 7, 7, 7, 7, 4, 3, 2, 2, 2, 3, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 7, 7, 4, 4, 4, 4, 7, 7, 4, 3, 3, 3, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 7, 4, 4, 0, 0, 4, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 4, 4, 4, 3, 0, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 4, 3, 2, 3, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 0, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 4, 0, 0, 0, 0, 0, 3, 2, 2, 2, 3, 4, 4, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
4, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 4, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 0, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 3, 0, 0, 0, 0, 4, 7, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 2, 2, 2, 3, 0, 0, 4, 4, 7, 4,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 4,
|
||||
0, 0, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 0,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0
|
||||
};
|
||||
|
||||
updateMouse();
|
||||
processInput();
|
||||
if (_vm->getPlatform() != Common::kPlatformWindows)
|
||||
return;
|
||||
|
||||
if (_lastButtonHit) {
|
||||
updateMouse();
|
||||
message._msgClass = kMessageButtonUp;
|
||||
message._code = _lastButtonHit->_buttonId;
|
||||
message._qualifier = _keyPressed.flags;
|
||||
_lastButtonHit = nullptr;
|
||||
return &message;
|
||||
} else if (_leftClick || _rightClick) {
|
||||
message._msgClass = (_leftClick) ? kMessageLeftClick : kMessageRightClick;
|
||||
message._qualifier = 0;
|
||||
message._mouse = _mousePos;
|
||||
_leftClick = _rightClick = false;
|
||||
return &message;
|
||||
} else if (_keyPressed.keycode != Common::KEYCODE_INVALID) {
|
||||
Button *curButton = checkNumButtonHit(_screenButtonList, _keyPressed.keycode);
|
||||
if (_vm->_droppingCrumbs && _vm->isMainDisplay()) {
|
||||
static byte *imgData = new byte[CRUMBSWIDTH * CRUMBSHEIGHT];
|
||||
memcpy(imgData, dropCrumbsImageData, CRUMBSWIDTH * CRUMBSHEIGHT);
|
||||
static Image dropCrumbsImage(CRUMBSWIDTH, CRUMBSHEIGHT, imgData, _vm);
|
||||
|
||||
if (curButton) {
|
||||
message._msgClass = kMessageButtonUp;
|
||||
message._code = curButton->_buttonId;
|
||||
} else {
|
||||
message._msgClass = kMessageRawKey;
|
||||
message._code = _keyPressed.keycode;
|
||||
dropCrumbsImage.drawMaskImage(612, 4);
|
||||
}
|
||||
}
|
||||
|
||||
message._qualifier = _keyPressed.flags;
|
||||
message._mouse = _mousePos;
|
||||
void Interface::mayShowCrumbIndicatorOff() {
|
||||
static byte dropCrumbsOffImageData[CRUMBSWIDTH * CRUMBSHEIGHT] = {
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0,
|
||||
0, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 0,
|
||||
4, 8, 8, 3, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 8, 8, 4,
|
||||
4, 8, 4, 4, 0, 0, 3, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 3, 8, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 3, 8, 8, 8, 3, 0, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 3, 3, 3, 4, 4, 4, 4, 4, 4, 0, 0, 3, 8, 3, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 4, 8, 8, 8, 8, 8, 8, 4, 3, 8, 8, 8, 3, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 8, 8, 4, 4, 4, 4, 8, 8, 4, 3, 3, 3, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 8, 4, 4, 0, 0, 4, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 4, 4, 4, 3, 0, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 4, 3, 8, 3, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 0, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 4, 0, 0, 0, 0, 0, 3, 8, 8, 8, 3, 4, 4, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
4, 8, 8, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 4, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 0, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 3, 0, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 3, 0, 0, 0, 0, 4, 8, 4,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 8, 8, 3, 0, 0, 4, 4, 8, 4,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 4,
|
||||
0, 0, 4, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 4, 0,
|
||||
0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 0
|
||||
};
|
||||
|
||||
_keyPressed.keycode = Common::KEYCODE_INVALID;
|
||||
if (_vm->getPlatform() != Common::kPlatformWindows)
|
||||
return;
|
||||
|
||||
return &message;
|
||||
} else
|
||||
return nullptr;
|
||||
if (_vm->isMainDisplay()) {
|
||||
static byte *imgData = new byte[CRUMBSWIDTH * CRUMBSHEIGHT];
|
||||
memcpy(imgData, dropCrumbsOffImageData, CRUMBSWIDTH * CRUMBSHEIGHT);
|
||||
static Image dropCrumbsOffImage(CRUMBSWIDTH, CRUMBSHEIGHT, imgData, _vm);
|
||||
|
||||
dropCrumbsOffImage.drawMaskImage(612, 4);
|
||||
}
|
||||
}
|
||||
|
||||
} // End of namespace Lab
|
||||
|
|
91
engines/lab/interface.h
Normal file
91
engines/lab/interface.h
Normal file
|
@ -0,0 +1,91 @@
|
|||
/* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* This code is based on Labyrinth of Time code with assistance of
|
||||
*
|
||||
* Copyright (c) 1993 Terra Nova Development
|
||||
* Copyright (c) 2004 The Wyrmkeep Entertainment Co.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef LAB_INTERFACE_H
|
||||
#define LAB_INTERFACE_H
|
||||
|
||||
#include "common/events.h"
|
||||
|
||||
namespace Lab {
|
||||
|
||||
class LabEngine;
|
||||
class Image;
|
||||
|
||||
struct Button {
|
||||
uint16 _x, _y, _buttonId;
|
||||
Common::KeyCode _keyEquiv; // the key which activates this button
|
||||
bool _isEnabled;
|
||||
Image *_image, *_altImage;
|
||||
};
|
||||
|
||||
typedef Common::List<Button *> ButtonList;
|
||||
|
||||
class Interface {
|
||||
private:
|
||||
LabEngine *_vm;
|
||||
|
||||
Button *_hitButton;
|
||||
ButtonList *_screenButtonList;
|
||||
|
||||
public:
|
||||
Interface(LabEngine *vm);
|
||||
|
||||
void attachButtonList(ButtonList *buttonList);
|
||||
Button *createButton(uint16 x, uint16 y, uint16 id, Common::KeyCode key, Image *image, Image *altImage);
|
||||
void toggleButton(Button *button, uint16 penColor, bool enable);
|
||||
|
||||
/**
|
||||
* Draws a button list to the screen.
|
||||
*/
|
||||
void drawButtonList(ButtonList *buttonList);
|
||||
void freeButtonList(ButtonList *buttonList);
|
||||
Button *getButton(uint16 id);
|
||||
|
||||
/**
|
||||
* Checks whether or not the coords fall within one of the buttons in a list
|
||||
* of buttons.
|
||||
*/
|
||||
Button *checkButtonHit(Common::Point pos);
|
||||
|
||||
/**
|
||||
* Checks whether or not the coords fall within one of the buttons in a list
|
||||
* of buttons.
|
||||
*/
|
||||
Button *checkNumButtonHit(Common::KeyCode key);
|
||||
|
||||
void handlePressedButton();
|
||||
|
||||
void mayShowCrumbIndicator();
|
||||
void mayShowCrumbIndicatorOff();
|
||||
};
|
||||
|
||||
} // End of namespace Lab
|
||||
|
||||
#endif // LAB_INTERFACE_H
|
|
@ -41,6 +41,7 @@
|
|||
#include "lab/dispman.h"
|
||||
#include "lab/eventman.h"
|
||||
#include "lab/image.h"
|
||||
#include "lab/interface.h"
|
||||
#include "lab/music.h"
|
||||
#include "lab/processroom.h"
|
||||
#include "lab/resource.h"
|
||||
|
@ -77,6 +78,7 @@ LabEngine::LabEngine(OSystem *syst, const ADGameDescription *gameDesc)
|
|||
_maxRooms = 0;
|
||||
|
||||
_event = nullptr;
|
||||
_interface = nullptr;
|
||||
_resource = nullptr;
|
||||
_music = nullptr;
|
||||
_anim = nullptr;
|
||||
|
@ -145,6 +147,7 @@ LabEngine::~LabEngine() {
|
|||
delete _conditions;
|
||||
delete _roomsFound;
|
||||
delete _event;
|
||||
delete _interface;
|
||||
delete _resource;
|
||||
delete _music;
|
||||
delete _anim;
|
||||
|
@ -161,6 +164,7 @@ Common::Error LabEngine::run() {
|
|||
else
|
||||
initGraphics(640, 480, true);
|
||||
|
||||
_interface = new Interface(this);
|
||||
_event = new EventManager(this);
|
||||
_resource = new Resource(this);
|
||||
_music = new Music(this);
|
||||
|
@ -206,7 +210,7 @@ void LabEngine::waitTOF() {
|
|||
|
||||
void LabEngine::updateEvents() {
|
||||
_event->processInput();
|
||||
_event->updateMouse();
|
||||
_interface->handlePressedButton();
|
||||
}
|
||||
|
||||
Common::Error LabEngine::loadGameState(int slot) {
|
||||
|
|
|
@ -60,6 +60,7 @@ struct ViewData;
|
|||
class Anim;
|
||||
class DisplayMan;
|
||||
class EventManager;
|
||||
class Interface;
|
||||
class Image;
|
||||
class Music;
|
||||
class Resource;
|
||||
|
@ -187,6 +188,7 @@ public:
|
|||
CrumbData _breadCrumbs[MAX_CRUMBS];
|
||||
DisplayMan *_graphics;
|
||||
EventManager *_event;
|
||||
Interface *_interface;
|
||||
ButtonList _invButtonList;
|
||||
ButtonList _moveButtonList;
|
||||
Image *_invImages[10];
|
||||
|
@ -232,6 +234,8 @@ public:
|
|||
bool canLoadGameStateCurrently();
|
||||
bool canSaveGameStateCurrently();
|
||||
|
||||
bool isMainDisplay() const { return _mainDisplay; }
|
||||
|
||||
private:
|
||||
/**
|
||||
* Checks whether all the conditions in a condition list are met.
|
||||
|
@ -434,8 +438,6 @@ private:
|
|||
*/
|
||||
void mainGameLoop();
|
||||
void showLab2Teaser();
|
||||
void mayShowCrumbIndicator();
|
||||
void mayShowCrumbIndicatorOff();
|
||||
|
||||
/**
|
||||
* Permanently flips the imagery of a button.
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "lab/dispman.h"
|
||||
#include "lab/eventman.h"
|
||||
#include "lab/image.h"
|
||||
#include "lab/interface.h"
|
||||
#include "lab/labsets.h"
|
||||
#include "lab/music.h"
|
||||
#include "lab/processroom.h"
|
||||
|
@ -75,9 +76,9 @@ void LabEngine::loadMapData() {
|
|||
_imgPath = new Image(mapImages, this);
|
||||
_imgBridge = new Image(mapImages, this);
|
||||
|
||||
_mapButtonList.push_back(_event->createButton( 8, _utils->vgaScaleY(105), 0, Common::KEYCODE_ESCAPE, new Image(mapImages, this), new Image(mapImages, this))); // back
|
||||
_mapButtonList.push_back(_event->createButton( 55, _utils->vgaScaleY(105), 1, Common::KEYCODE_UP, new Image(mapImages, this), new Image(mapImages, this))); // up
|
||||
_mapButtonList.push_back(_event->createButton(101, _utils->vgaScaleY(105), 2, Common::KEYCODE_DOWN, new Image(mapImages, this), new Image(mapImages, this))); // down
|
||||
_mapButtonList.push_back(_interface->createButton( 8, _utils->vgaScaleY(105), 0, Common::KEYCODE_ESCAPE, new Image(mapImages, this), new Image(mapImages, this))); // back
|
||||
_mapButtonList.push_back(_interface->createButton( 55, _utils->vgaScaleY(105), 1, Common::KEYCODE_UP, new Image(mapImages, this), new Image(mapImages, this))); // up
|
||||
_mapButtonList.push_back(_interface->createButton(101, _utils->vgaScaleY(105), 2, Common::KEYCODE_DOWN, new Image(mapImages, this), new Image(mapImages, this))); // down
|
||||
|
||||
delete mapImages;
|
||||
|
||||
|
@ -98,7 +99,7 @@ void LabEngine::loadMapData() {
|
|||
}
|
||||
|
||||
void LabEngine::freeMapData() {
|
||||
_event->freeButtonList(&_mapButtonList);
|
||||
_interface->freeButtonList(&_mapButtonList);
|
||||
|
||||
delete _imgMap;
|
||||
delete _imgRoom;
|
||||
|
@ -330,7 +331,7 @@ uint16 LabEngine::getLowerFloor(uint16 floorNum) {
|
|||
void LabEngine::drawMap(uint16 curRoom, uint16 curMsg, uint16 floorNum, bool fadeIn) {
|
||||
_graphics->rectFill(0, 0, _graphics->_screenWidth - 1, _graphics->_screenHeight - 1, 0);
|
||||
_imgMap->drawImage(0, 0);
|
||||
_event->drawButtonList(&_mapButtonList);
|
||||
_interface->drawButtonList(&_mapButtonList);
|
||||
|
||||
for (int i = 1; i <= _maxRooms; i++) {
|
||||
if ((_maps[i]._pageNumber == floorNum) && _roomsFound->in(i) && _maps[i]._x) {
|
||||
|
@ -346,8 +347,8 @@ void LabEngine::drawMap(uint16 curRoom, uint16 curMsg, uint16 floorNum, bool fad
|
|||
if ((_maps[curRoom]._pageNumber == floorNum) && _roomsFound->in(curRoom) && _maps[curRoom]._x)
|
||||
drawRoomMap(curRoom, true);
|
||||
|
||||
_event->toggleButton(_event->getButton(1), 12, (getUpperFloor(floorNum) != kFloorNone)); // up button
|
||||
_event->toggleButton(_event->getButton(2), 12, (getLowerFloor(floorNum) != kFloorNone)); // down button
|
||||
_interface->toggleButton(_interface->getButton(1), 12, (getUpperFloor(floorNum) != kFloorNone)); // up button
|
||||
_interface->toggleButton(_interface->getButton(2), 12, (getLowerFloor(floorNum) != kFloorNone)); // down button
|
||||
|
||||
// Labyrinth specific code
|
||||
if (floorNum == kFloorLower) {
|
||||
|
@ -413,7 +414,7 @@ void LabEngine::processMap(uint16 curRoom) {
|
|||
|
||||
waitTOF();
|
||||
_graphics->writeColorRegs(newcolor, 1, 1);
|
||||
_event->updateMouse();
|
||||
_interface->handlePressedButton();
|
||||
waitTOF();
|
||||
|
||||
place++;
|
||||
|
@ -538,13 +539,13 @@ void LabEngine::doMap() {
|
|||
updateEvents();
|
||||
loadMapData();
|
||||
_graphics->blackAllScreen();
|
||||
_event->attachButtonList(&_mapButtonList);
|
||||
_interface->attachButtonList(&_mapButtonList);
|
||||
drawMap(_roomNum, _roomNum, _maps[_roomNum]._pageNumber, true);
|
||||
_event->mouseShow();
|
||||
_graphics->screenUpdate();
|
||||
processMap(_roomNum);
|
||||
_event->mouseHide();
|
||||
_event->attachButtonList(nullptr);
|
||||
_interface->attachButtonList(nullptr);
|
||||
_graphics->fade(false);
|
||||
_graphics->blackAllScreen();
|
||||
_graphics->rectFill(0, 0, _graphics->_screenWidth - 1, _graphics->_screenHeight - 1, 0);
|
||||
|
|
|
@ -34,6 +34,7 @@
|
|||
#include "lab/dispman.h"
|
||||
#include "lab/eventman.h"
|
||||
#include "lab/image.h"
|
||||
#include "lab/interface.h"
|
||||
#include "lab/labsets.h"
|
||||
#include "lab/music.h"
|
||||
#include "lab/processroom.h"
|
||||
|
@ -128,9 +129,9 @@ void LabEngine::loadJournalData() {
|
|||
_journalTextTitle = _resource->getText("Lab:Rooms/jt");
|
||||
|
||||
Common::File *journalFile = _resource->openDataFile("P:JImage");
|
||||
_journalButtonList.push_back(_event->createButton( 80, _utils->vgaScaleY(162) + _utils->svgaCord(1), 0, Common::KEYCODE_LEFT, new Image(journalFile, this), new Image(journalFile, this))); // back
|
||||
_journalButtonList.push_back(_event->createButton(194, _utils->vgaScaleY(162) + _utils->svgaCord(1), 2, Common::KEYCODE_RIGHT, new Image(journalFile, this), new Image(journalFile, this))); // forward
|
||||
_journalButtonList.push_back(_event->createButton(144, _utils->vgaScaleY(164) - _utils->svgaCord(1), 1, Common::KEYCODE_ESCAPE, new Image(journalFile, this), new Image(journalFile, this))); // cancel
|
||||
_journalButtonList.push_back(_interface->createButton( 80, _utils->vgaScaleY(162) + _utils->svgaCord(1), 0, Common::KEYCODE_LEFT, new Image(journalFile, this), new Image(journalFile, this))); // back
|
||||
_journalButtonList.push_back(_interface->createButton(194, _utils->vgaScaleY(162) + _utils->svgaCord(1), 2, Common::KEYCODE_RIGHT, new Image(journalFile, this), new Image(journalFile, this))); // forward
|
||||
_journalButtonList.push_back(_interface->createButton(144, _utils->vgaScaleY(164) - _utils->svgaCord(1), 1, Common::KEYCODE_ESCAPE, new Image(journalFile, this), new Image(journalFile, this))); // cancel
|
||||
delete journalFile;
|
||||
|
||||
_anim->_noPalChange = true;
|
||||
|
@ -206,8 +207,8 @@ void LabEngine::drawJournal(uint16 wipenum, bool needFade) {
|
|||
else
|
||||
turnPage((wipenum == 1));
|
||||
|
||||
_event->toggleButton(_event->getButton(0), 15, (_journalPage > 0)); // back button
|
||||
_event->toggleButton(_event->getButton(2), 15, (!_lastPage)); // forward button
|
||||
_interface->toggleButton(_interface->getButton(0), 15, (_journalPage > 0)); // back button
|
||||
_interface->toggleButton(_interface->getButton(2), 15, (!_lastPage)); // forward button
|
||||
|
||||
if (needFade)
|
||||
_graphics->fade(true);
|
||||
|
@ -268,11 +269,11 @@ void LabEngine::doJournal() {
|
|||
|
||||
updateEvents();
|
||||
loadJournalData();
|
||||
_event->attachButtonList(&_journalButtonList);
|
||||
_interface->attachButtonList(&_journalButtonList);
|
||||
drawJournal(0, true);
|
||||
_event->mouseShow();
|
||||
processJournal();
|
||||
_event->attachButtonList(nullptr);
|
||||
_interface->attachButtonList(nullptr);
|
||||
_graphics->fade(false);
|
||||
_event->mouseHide();
|
||||
|
||||
|
@ -280,7 +281,7 @@ void LabEngine::doJournal() {
|
|||
_blankJournal = nullptr;
|
||||
_journalBackImage->setData(nullptr, true);
|
||||
|
||||
_event->freeButtonList(&_journalButtonList);
|
||||
_interface->freeButtonList(&_journalButtonList);
|
||||
_graphics->freeFont(&_journalFont);
|
||||
|
||||
_graphics->rectFill(0, 0, _graphics->_screenWidth - 1, _graphics->_screenHeight - 1, 0);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue