2014-10-06 12:50:05 +00:00
|
|
|
/* 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.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2014-12-25 18:13:52 +00:00
|
|
|
#include "lab/lab.h"
|
2015-12-08 20:10:54 +00:00
|
|
|
|
2015-12-08 20:35:31 +00:00
|
|
|
#include "lab/anim.h"
|
2015-12-08 20:19:41 +00:00
|
|
|
#include "lab/dispman.h"
|
|
|
|
#include "lab/eventman.h"
|
2015-12-08 20:00:50 +00:00
|
|
|
#include "lab/image.h"
|
2015-12-08 20:28:45 +00:00
|
|
|
#include "lab/interface.h"
|
2015-11-20 19:17:30 +00:00
|
|
|
#include "lab/intro.h"
|
2015-12-08 20:00:50 +00:00
|
|
|
#include "lab/labsets.h"
|
2015-12-08 19:36:05 +00:00
|
|
|
#include "lab/music.h"
|
2015-12-08 20:47:36 +00:00
|
|
|
#include "lab/processroom.h"
|
2015-12-08 20:10:54 +00:00
|
|
|
#include "lab/resource.h"
|
2015-12-08 20:00:50 +00:00
|
|
|
#include "lab/utils.h"
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
namespace Lab {
|
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
// LAB: Labyrinth specific code for the special puzzles
|
2014-10-06 12:50:05 +00:00
|
|
|
#define SPECIALLOCK 100
|
|
|
|
#define SPECIALBRICK 101
|
|
|
|
#define SPECIALBRICKNOMOUSE 102
|
|
|
|
|
|
|
|
#define MAPNUM 28
|
|
|
|
#define JOURNALNUM 9
|
|
|
|
#define WESTPAPERNUM 18
|
|
|
|
#define NOTESNUM 12
|
|
|
|
#define WHISKEYNUM 25
|
|
|
|
#define PITHHELMETNUM 7
|
|
|
|
#define HELMETNUM 1
|
|
|
|
|
|
|
|
#define LAMPNUM 27
|
|
|
|
#define LAMPON 151
|
|
|
|
|
|
|
|
#define BELTNUM 3
|
|
|
|
#define BELTGLOW 70
|
|
|
|
|
|
|
|
#define USEDHELMET 184
|
|
|
|
|
|
|
|
#define QUARTERNUM 30
|
|
|
|
|
|
|
|
|
|
|
|
#define MUSEUMMONITOR 71
|
|
|
|
#define GRAMAPHONEMONITOR 72
|
|
|
|
#define UNICYCLEMONITOR 73
|
|
|
|
#define STATUEMONITOR 74
|
|
|
|
#define TALISMANMONITOR 75
|
|
|
|
#define LUTEMONITOR 76
|
|
|
|
#define CLOCKMONITOR 77
|
|
|
|
#define WINDOWMONITOR 78
|
|
|
|
#define BELTMONITOR 79
|
|
|
|
#define LIBRARYMONITOR 80
|
|
|
|
#define TERMINALMONITOR 81
|
|
|
|
#define LEVERSMONITOR 82
|
|
|
|
|
|
|
|
static char initcolors[] = { '\x00', '\x00', '\x00', '\x30',
|
|
|
|
'\x30', '\x30', '\x10', '\x10',
|
|
|
|
'\x10', '\x14', '\x14', '\x14',
|
|
|
|
'\x20', '\x20', '\x20', '\x24',
|
|
|
|
'\x24', '\x24', '\x2c', '\x2c',
|
2015-12-08 21:00:19 +00:00
|
|
|
'\x2c', '\x08', '\x08', '\x08' };
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Draws the message for the room.
|
|
|
|
*/
|
2015-12-03 00:06:04 +00:00
|
|
|
void LabEngine::drawRoomMessage(uint16 curInv, CloseDataPtr closePtr) {
|
2015-12-01 09:35:31 +00:00
|
|
|
if (_lastTooLong) {
|
|
|
|
_lastTooLong = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
if (_alternate) {
|
2015-12-06 20:53:57 +00:00
|
|
|
if ((curInv <= _numInv) && _conditions->in(curInv) && _inventory[curInv]._bitmapName) {
|
2015-12-08 10:27:34 +00:00
|
|
|
if ((curInv == LAMPNUM) && _conditions->in(LAMPON))
|
|
|
|
// LAB: Labyrinth specific
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextLampOn);
|
2015-12-06 20:53:57 +00:00
|
|
|
else if (_inventory[curInv]._many > 1) {
|
|
|
|
Common::String roomMessage = Common::String(_inventory[curInv]._name) + " (" + Common::String::format("%d", _inventory[curInv]._many) + ")";
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawMessage(roomMessage.c_str());
|
2014-10-06 12:50:05 +00:00
|
|
|
} else
|
2015-12-06 20:53:57 +00:00
|
|
|
_graphics->drawMessage(_inventory[curInv]._name);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
} else
|
2015-12-03 00:06:04 +00:00
|
|
|
drawDirection(closePtr);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_lastTooLong = _graphics->_lastMessageLong;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-02 19:32:06 +00:00
|
|
|
void LabEngine::freeScreens() {
|
2015-12-04 15:52:13 +00:00
|
|
|
for (uint16 i = 0; i < 20; i++) {
|
2015-12-02 19:32:06 +00:00
|
|
|
delete _moveImages[i];
|
2015-12-04 15:52:13 +00:00
|
|
|
_moveImages[i] = nullptr;
|
|
|
|
}
|
2015-12-02 19:32:06 +00:00
|
|
|
|
2015-12-04 15:52:13 +00:00
|
|
|
for (uint16 imgIdx = 0; imgIdx < 10; imgIdx++) {
|
|
|
|
delete _invImages[imgIdx];
|
2015-12-06 17:16:26 +00:00
|
|
|
delete _numberImages[imgIdx];
|
|
|
|
_invImages[imgIdx] = _numberImages[imgIdx] = nullptr;
|
2015-12-02 19:32:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Permanently flips the imagery of a gadget.
|
|
|
|
*/
|
2015-12-03 00:06:04 +00:00
|
|
|
void LabEngine::perFlipGadget(uint16 gadgetId) {
|
2015-12-06 20:50:41 +00:00
|
|
|
for (GadgetList::iterator gadget = _moveGadgetList.begin(); gadget != _moveGadgetList.end(); ++gadget) {
|
|
|
|
Gadget *topGadget = *gadget;
|
2015-12-07 06:18:16 +00:00
|
|
|
if (topGadget->_gadgetID == gadgetId) {
|
2015-12-03 00:06:04 +00:00
|
|
|
Image *tmpImage = topGadget->_image;
|
|
|
|
topGadget->_image = topGadget->_altImage;
|
|
|
|
topGadget->_altImage = tmpImage;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
if (!_alternate) {
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseHide();
|
2015-12-03 00:06:04 +00:00
|
|
|
topGadget->_image->drawImage(topGadget->x, topGadget->y);
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseShow();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-06 20:50:41 +00:00
|
|
|
break;
|
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Eats all the available messages.
|
|
|
|
*/
|
2015-11-29 17:10:06 +00:00
|
|
|
void LabEngine::eatMessages() {
|
2015-12-03 00:06:04 +00:00
|
|
|
IntuiMessage *msg;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
do {
|
2015-12-03 00:06:04 +00:00
|
|
|
msg = getMsg();
|
|
|
|
} while (msg);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Checks whether the close up is one of the special case closeups.
|
|
|
|
*/
|
2015-12-03 00:06:04 +00:00
|
|
|
bool LabEngine::doCloseUp(CloseDataPtr closePtr) {
|
|
|
|
if (closePtr == NULL)
|
2014-10-06 12:50:05 +00:00
|
|
|
return false;
|
|
|
|
|
2014-12-27 13:18:40 +00:00
|
|
|
int monltmargin, monrtmargin, montopmargin, lutertmargin;
|
|
|
|
|
2015-11-29 22:34:35 +00:00
|
|
|
if (getPlatform() != Common::kPlatformWindows) {
|
2014-12-27 13:18:40 +00:00
|
|
|
monltmargin = 0;
|
|
|
|
monrtmargin = 319;
|
|
|
|
montopmargin = 0;
|
|
|
|
lutertmargin = 124;
|
|
|
|
} else {
|
|
|
|
monltmargin = 2;
|
|
|
|
monrtmargin = 317;
|
|
|
|
montopmargin = 2;
|
|
|
|
lutertmargin = 128;
|
|
|
|
}
|
|
|
|
|
2015-12-06 20:53:57 +00:00
|
|
|
switch (closePtr->_closeUpType) {
|
2015-07-21 19:13:28 +00:00
|
|
|
case MUSEUMMONITOR:
|
|
|
|
case LIBRARYMONITOR:
|
|
|
|
case WINDOWMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, false, monltmargin, montopmargin, monrtmargin, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
case GRAMAPHONEMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, false, monltmargin, montopmargin, 171, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
case UNICYCLEMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, false, 100, montopmargin, monrtmargin, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
case STATUEMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, false, 117, montopmargin, monrtmargin, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
case TALISMANMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, false, monltmargin, montopmargin, 184, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
case LUTEMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, false, monltmargin, montopmargin, lutertmargin, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
case CLOCKMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, false, monltmargin, montopmargin, 206, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
case TERMINALMONITOR:
|
2015-12-06 20:53:57 +00:00
|
|
|
doMonitor(closePtr->_graphicName, closePtr->_message, true, monltmargin, montopmargin, monrtmargin, 165);
|
2015-07-21 19:13:28 +00:00
|
|
|
break;
|
|
|
|
default:
|
2014-10-06 12:50:05 +00:00
|
|
|
return false;
|
2015-07-21 19:13:28 +00:00
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = " ";
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Gets the current inventory name.
|
|
|
|
*/
|
2015-12-06 20:39:41 +00:00
|
|
|
const char *LabEngine::getInvName(uint16 curInv) {
|
|
|
|
if (_mainDisplay)
|
2015-12-06 20:53:57 +00:00
|
|
|
return _inventory[curInv]._bitmapName;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if ((curInv == LAMPNUM) && _conditions->in(LAMPON))
|
2014-10-06 12:50:05 +00:00
|
|
|
return "P:Mines/120";
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if ((curInv == BELTNUM) && _conditions->in(BELTGLOW))
|
2014-10-06 12:50:05 +00:00
|
|
|
return "P:Future/BeltGlow";
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if (curInv == WESTPAPERNUM) {
|
2015-12-06 20:53:57 +00:00
|
|
|
_curFileName = _inventory[curInv]._bitmapName;
|
2015-12-04 12:32:08 +00:00
|
|
|
_anim->_noPalChange = true;
|
|
|
|
_graphics->readPict(_curFileName, false);
|
|
|
|
_anim->_noPalChange = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
doWestPaper();
|
2015-12-06 20:39:41 +00:00
|
|
|
} else if (curInv == NOTESNUM) {
|
2015-12-06 20:53:57 +00:00
|
|
|
_curFileName = _inventory[curInv]._bitmapName;
|
2015-12-04 12:32:08 +00:00
|
|
|
_anim->_noPalChange = true;
|
|
|
|
_graphics->readPict(_curFileName, false);
|
|
|
|
_anim->_noPalChange = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
doNotes();
|
|
|
|
}
|
|
|
|
|
2015-12-06 20:53:57 +00:00
|
|
|
return _inventory[curInv]._bitmapName;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Turns the interface off.
|
|
|
|
*/
|
2015-11-29 17:10:06 +00:00
|
|
|
void LabEngine::interfaceOff() {
|
2015-12-03 00:06:04 +00:00
|
|
|
if (!_interfaceOff) {
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->attachGadgetList(NULL);
|
|
|
|
_event->mouseHide();
|
2015-12-03 00:06:04 +00:00
|
|
|
_interfaceOff = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Turns the interface on.
|
|
|
|
*/
|
2015-11-29 17:10:06 +00:00
|
|
|
void LabEngine::interfaceOn() {
|
2015-12-03 00:06:04 +00:00
|
|
|
if (_interfaceOff) {
|
|
|
|
_interfaceOff = false;
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseShow();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
if (_graphics->_longWinInFront)
|
2015-12-06 20:39:41 +00:00
|
|
|
_event->attachGadgetList(nullptr);
|
2015-12-03 00:06:04 +00:00
|
|
|
else if (_alternate)
|
2015-12-06 20:50:41 +00:00
|
|
|
_event->attachGadgetList(&_invGadgetList);
|
2014-10-06 12:50:05 +00:00
|
|
|
else
|
2015-12-06 20:50:41 +00:00
|
|
|
_event->attachGadgetList(&_moveGadgetList);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* If the user hits the "Use" gadget; things that can get used on themselves.
|
|
|
|
*/
|
2015-12-06 20:39:41 +00:00
|
|
|
bool LabEngine::doUse(uint16 curInv) {
|
2015-12-08 10:27:34 +00:00
|
|
|
if (curInv == MAPNUM) {
|
|
|
|
// LAB: Labyrinth specific
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextUseMap);
|
2014-10-06 12:50:05 +00:00
|
|
|
interfaceOff();
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->stopDiff();
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = " ";
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = NULL;
|
2015-11-30 00:42:12 +00:00
|
|
|
doMap(_roomNum);
|
2015-12-06 13:36:49 +00:00
|
|
|
_graphics->setPalette(initcolors, 8);
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawMessage(NULL);
|
|
|
|
_graphics->drawPanel();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (curInv == JOURNALNUM) {
|
|
|
|
// LAB: Labyrinth specific
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextUseJournal);
|
2014-10-06 12:50:05 +00:00
|
|
|
interfaceOff();
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->stopDiff();
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = " ";
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = NULL;
|
2014-12-25 18:13:52 +00:00
|
|
|
doJournal();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
|
|
|
_graphics->drawMessage(NULL);
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (curInv == LAMPNUM) {
|
|
|
|
// LAB: Labyrinth specific
|
2014-10-06 12:50:05 +00:00
|
|
|
interfaceOff();
|
|
|
|
|
2015-11-24 22:59:30 +00:00
|
|
|
if (_conditions->in(LAMPON)) {
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextTurnLampOff);
|
2015-11-24 22:59:30 +00:00
|
|
|
_conditions->exclElement(LAMPON);
|
2014-10-06 12:50:05 +00:00
|
|
|
} else {
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextTurnLampOn);
|
2015-11-24 22:59:30 +00:00
|
|
|
_conditions->inclElement(LAMPON);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = false;
|
|
|
|
_anim->_waitForEffect = true;
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->readPict("Music:Click", true);
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_waitForEffect = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = false;
|
2015-12-06 20:39:41 +00:00
|
|
|
_nextFileName = getInvName(curInv);
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (curInv == BELTNUM) {
|
|
|
|
// LAB: Labyrinth specific
|
2015-11-24 22:59:30 +00:00
|
|
|
if (!_conditions->in(BELTGLOW))
|
|
|
|
_conditions->inclElement(BELTGLOW);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = false;
|
2015-12-06 20:39:41 +00:00
|
|
|
_nextFileName = getInvName(curInv);
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (curInv == WHISKEYNUM) {
|
|
|
|
// LAB: Labyrinth specific
|
2015-11-24 22:59:30 +00:00
|
|
|
_conditions->inclElement(USEDHELMET);
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextUseWhiskey);
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (curInv == PITHHELMETNUM) {
|
|
|
|
// LAB: Labyrinth specific
|
2015-11-24 22:59:30 +00:00
|
|
|
_conditions->inclElement(USEDHELMET);
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextUsePith);
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (curInv == HELMETNUM) {
|
|
|
|
// LAB: Labyrinth specific
|
2015-11-24 22:59:30 +00:00
|
|
|
_conditions->inclElement(USEDHELMET);
|
2015-10-08 03:39:59 +00:00
|
|
|
drawStaticMessage(kTextUseHelmet);
|
2015-11-24 22:59:30 +00:00
|
|
|
} else
|
2014-10-06 12:50:05 +00:00
|
|
|
return false;
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* Decrements the current inventory number.
|
|
|
|
*/
|
2015-12-06 20:39:41 +00:00
|
|
|
void LabEngine::decIncInv(uint16 *curInv, bool decreaseFl) {
|
2014-10-06 12:50:05 +00:00
|
|
|
interfaceOff();
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if (decreaseFl)
|
|
|
|
(*curInv)--;
|
2014-10-06 12:50:05 +00:00
|
|
|
else
|
2015-12-06 20:39:41 +00:00
|
|
|
(*curInv)++;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
while (*curInv && (*curInv <= _numInv)) {
|
2015-12-06 20:53:57 +00:00
|
|
|
if (_conditions->in(*curInv) && _inventory[*curInv]._bitmapName) {
|
2015-12-06 20:39:41 +00:00
|
|
|
_nextFileName = getInvName(*curInv);
|
2014-10-06 12:50:05 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if (decreaseFl)
|
|
|
|
(*curInv)--;
|
2014-10-06 12:50:05 +00:00
|
|
|
else
|
2015-12-06 20:39:41 +00:00
|
|
|
(*curInv)++;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if ((*curInv == 0) || (*curInv > _numInv)) {
|
|
|
|
if (decreaseFl)
|
|
|
|
*curInv = _numInv;
|
2014-10-06 12:50:05 +00:00
|
|
|
else
|
2015-12-06 20:39:41 +00:00
|
|
|
*curInv = 1;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
while (*curInv && (*curInv <= _numInv)) {
|
2015-12-06 20:53:57 +00:00
|
|
|
if (_conditions->in(*curInv) && _inventory[*curInv]._bitmapName) {
|
2015-12-06 20:39:41 +00:00
|
|
|
_nextFileName = getInvName(*curInv);
|
2014-10-06 12:50:05 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if (decreaseFl)
|
|
|
|
(*curInv)--;
|
2014-10-06 12:50:05 +00:00
|
|
|
else
|
2015-12-06 20:39:41 +00:00
|
|
|
(*curInv)++;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* The main game loop.
|
|
|
|
*/
|
2015-11-24 22:59:30 +00:00
|
|
|
void LabEngine::mainGameLoop() {
|
2015-11-30 12:09:36 +00:00
|
|
|
uint16 actionMode = 4;
|
|
|
|
uint16 curInv = MAPNUM;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
bool forceDraw = false;
|
|
|
|
bool gotMessage = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 13:36:49 +00:00
|
|
|
_graphics->setPalette(initcolors, 8);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = NULL;
|
2015-11-30 00:42:12 +00:00
|
|
|
_roomNum = 1;
|
2015-12-06 16:24:25 +00:00
|
|
|
_direction = NORTH;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-29 23:34:43 +00:00
|
|
|
_resource->readRoomData("LAB:Doors");
|
2015-12-03 18:49:55 +00:00
|
|
|
if (!(_inventory = _resource->readInventory("LAB:Inventor")))
|
|
|
|
return;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if (!(_conditions = new LargeSet(_highestCondition + 1, this)))
|
2014-10-06 12:50:05 +00:00
|
|
|
return;
|
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if (!(_roomsFound = new LargeSet(_manyRooms + 1, this)))
|
2014-10-06 12:50:05 +00:00
|
|
|
return;
|
|
|
|
|
2015-11-29 22:34:35 +00:00
|
|
|
_conditions->readInitialConditions("LAB:Conditio");
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->_longWinInFront = false;
|
|
|
|
_graphics->drawPanel();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
perFlipGadget(actionMode);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
// Set up initial picture.
|
2014-10-06 12:50:05 +00:00
|
|
|
while (1) {
|
2015-12-02 00:39:58 +00:00
|
|
|
_event->processInput(true);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if (gotMessage) {
|
2015-12-06 16:24:25 +00:00
|
|
|
if (_quitLab || g_engine->shouldQuit()) {
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->stopDiff();
|
2014-10-06 12:50:05 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2015-11-30 00:17:05 +00:00
|
|
|
_music->resumeBackMusic();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
// Sees what kind of close up we're in and does the appropriate stuff, if any.
|
2015-12-03 10:10:58 +00:00
|
|
|
if (doCloseUp(_cptr)) {
|
|
|
|
_cptr = NULL;
|
2014-12-27 13:18:40 +00:00
|
|
|
|
2014-10-06 12:50:05 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
// Sets the current picture properly on the screen
|
2015-12-06 20:39:41 +00:00
|
|
|
if (_mainDisplay)
|
2015-12-03 10:10:58 +00:00
|
|
|
_nextFileName = getPictName(&_cptr);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if (_noUpdateDiff) {
|
2015-12-08 10:27:34 +00:00
|
|
|
// Potentially entered another room
|
|
|
|
_roomsFound->inclElement(_roomNum);
|
2015-12-03 00:06:04 +00:00
|
|
|
forceDraw |= (strcmp(_nextFileName, _curFileName) != 0);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
_noUpdateDiff = false;
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = _nextFileName;
|
|
|
|
} else if (strcmp(_nextFileName, _curFileName) != 0) {
|
2014-10-06 12:50:05 +00:00
|
|
|
interfaceOff();
|
2015-12-08 10:27:34 +00:00
|
|
|
// Potentially entered another room
|
|
|
|
_roomsFound->inclElement(_roomNum);
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = _nextFileName;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 10:10:58 +00:00
|
|
|
if (_cptr) {
|
2015-12-08 10:27:34 +00:00
|
|
|
if ((_cptr->_closeUpType == SPECIALLOCK) && _mainDisplay)
|
|
|
|
// LAB: Labyrinth specific code
|
2015-12-03 00:06:04 +00:00
|
|
|
showCombination(_curFileName);
|
2015-12-06 20:53:57 +00:00
|
|
|
else if (((_cptr->_closeUpType == SPECIALBRICK) ||
|
2015-12-08 08:19:00 +00:00
|
|
|
(_cptr->_closeUpType == SPECIALBRICKNOMOUSE)) &&
|
2015-12-08 10:27:34 +00:00
|
|
|
_mainDisplay)
|
|
|
|
// LAB: Labyrinth specific code
|
2015-12-06 20:53:57 +00:00
|
|
|
showTile(_curFileName, (bool)(_cptr->_closeUpType == SPECIALBRICKNOMOUSE));
|
2014-10-06 12:50:05 +00:00
|
|
|
else
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->readPict(_curFileName, false);
|
2014-10-06 12:50:05 +00:00
|
|
|
} else
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->readPict(_curFileName, false);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2015-11-30 12:09:36 +00:00
|
|
|
forceDraw = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
if (!_followingCrumbs)
|
2014-10-06 12:50:05 +00:00
|
|
|
eatMessages();
|
|
|
|
}
|
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (forceDraw) {
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2015-11-30 12:09:36 +00:00
|
|
|
forceDraw = false;
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
// Make sure we check the music at least after every message
|
|
|
|
_music->updateMusic();
|
2014-10-06 12:50:05 +00:00
|
|
|
interfaceOn();
|
2015-11-30 06:13:09 +00:00
|
|
|
IntuiMessage *curMsg = getMsg();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
if (curMsg == NULL) {
|
|
|
|
// Does music load and next animation frame when you've run out of messages
|
2015-12-06 20:39:41 +00:00
|
|
|
gotMessage = false;
|
2015-11-30 00:17:05 +00:00
|
|
|
_music->checkRoomMusic();
|
|
|
|
_music->updateMusic();
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->diffNextFrame();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
if (_followingCrumbs) {
|
2014-10-06 12:50:05 +00:00
|
|
|
int result = followCrumbs();
|
|
|
|
|
|
|
|
if (result != 0) {
|
2015-11-30 12:09:36 +00:00
|
|
|
uint16 code = 0;
|
2015-11-28 01:17:05 +00:00
|
|
|
if (result == VKEY_UPARROW)
|
2015-11-30 12:09:36 +00:00
|
|
|
code = 7;
|
2015-11-28 01:17:05 +00:00
|
|
|
else if (result == VKEY_LTARROW)
|
2015-11-30 12:09:36 +00:00
|
|
|
code = 6;
|
2015-11-28 01:17:05 +00:00
|
|
|
else if (result == VKEY_RTARROW)
|
2015-11-30 12:09:36 +00:00
|
|
|
code = 8;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
gotMessage = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-12-02 00:39:58 +00:00
|
|
|
if (!from_crumbs(GADGETUP, code, 0, _event->updateAndGetMousePos(), curInv, curMsg, forceDraw, code, actionMode))
|
2015-11-30 12:09:36 +00:00
|
|
|
break;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2014-10-06 12:50:05 +00:00
|
|
|
} else {
|
2015-12-06 20:39:41 +00:00
|
|
|
gotMessage = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
Common::Point curPos;
|
2015-12-07 06:18:16 +00:00
|
|
|
curPos.x = curMsg->_mouseX;
|
|
|
|
curPos.y = curMsg->_mouseY;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
_followingCrumbs = false;
|
2015-12-07 06:18:16 +00:00
|
|
|
if (!from_crumbs(curMsg->_msgClass, curMsg->_code, curMsg->_qualifier, curPos, curInv, curMsg, forceDraw, curMsg->_gadgetID, actionMode))
|
2015-11-30 12:09:36 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
delete _conditions;
|
|
|
|
delete _roomsFound;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (_rooms) {
|
2015-12-07 09:00:54 +00:00
|
|
|
delete[] _rooms;
|
2015-11-30 12:09:36 +00:00
|
|
|
_rooms = nullptr;
|
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 18:49:55 +00:00
|
|
|
if (_inventory) {
|
2015-12-06 16:24:25 +00:00
|
|
|
for (int i = 1; i <= _numInv; i++) {
|
2015-12-06 20:53:57 +00:00
|
|
|
if (_inventory[i]._name)
|
2015-12-07 09:00:54 +00:00
|
|
|
delete _inventory[i]._name;
|
2015-11-30 12:09:36 +00:00
|
|
|
|
2015-12-06 20:53:57 +00:00
|
|
|
if (_inventory[i]._bitmapName)
|
2015-12-07 09:00:54 +00:00
|
|
|
delete _inventory[i]._bitmapName;
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
|
|
|
|
2015-12-07 09:00:54 +00:00
|
|
|
delete[] _inventory;
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-08 20:53:42 +00:00
|
|
|
bool LabEngine::from_crumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Common::Point tmpPos,
|
|
|
|
uint16 &curInv, IntuiMessage *curMsg, bool &forceDraw, uint16 gadgetId, uint16 &actionMode) {
|
2015-11-30 12:09:36 +00:00
|
|
|
uint32 msgClass = tmpClass;
|
|
|
|
Common::Point curPos = tmpPos;
|
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
uint16 oldDirection = 0;
|
|
|
|
uint16 lastInv = MAPNUM;
|
2015-12-08 21:00:19 +00:00
|
|
|
CloseDataPtr hcptr = nullptr;
|
2015-11-30 12:09:36 +00:00
|
|
|
bool doit;
|
|
|
|
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = false;
|
2015-11-30 12:09:36 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
if ((msgClass == RAWKEY) && (!_graphics->_longWinInFront)) {
|
2015-12-08 10:27:34 +00:00
|
|
|
if (code == 13) {
|
|
|
|
// The return key
|
2015-12-08 08:19:00 +00:00
|
|
|
msgClass = MOUSEBUTTONS;
|
2015-12-08 20:53:42 +00:00
|
|
|
qualifier = IEQUALIFIER_LEFTBUTTON;
|
2015-11-30 12:09:36 +00:00
|
|
|
curPos = _event->getMousePos();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (getPlatform() == Common::kPlatformWindows && (code == 'b' || code == 'B')) {
|
|
|
|
// Start bread crumbs
|
2015-11-30 12:09:36 +00:00
|
|
|
_breadCrumbs[0]._roomNum = 0;
|
|
|
|
_numCrumbs = 0;
|
|
|
|
_droppingCrumbs = true;
|
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (code == 'f' || code == 'F' || code == 'r' || code == 'R') {
|
|
|
|
// Follow bread crumbs
|
2015-11-30 12:09:36 +00:00
|
|
|
if (_droppingCrumbs) {
|
|
|
|
if (_numCrumbs > 0) {
|
|
|
|
_followingCrumbs = true;
|
|
|
|
_followCrumbsFast = (code == 'r' || code == 'R');
|
|
|
|
_isCrumbTurning = false;
|
|
|
|
_isCrumbWaiting = false;
|
|
|
|
getTime(&_crumbSecs, &_crumbMicros);
|
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
if (_alternate) {
|
2015-11-30 12:09:36 +00:00
|
|
|
eatMessages();
|
2015-12-03 00:06:04 +00:00
|
|
|
_alternate = false;
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-06 16:24:25 +00:00
|
|
|
_graphics->_doNotDrawMessage = false;
|
2015-11-30 12:09:36 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = true;
|
2015-12-08 10:27:34 +00:00
|
|
|
// Sets the correct gadget list
|
|
|
|
interfaceOn();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
2015-11-30 12:09:36 +00:00
|
|
|
} else {
|
|
|
|
_breadCrumbs[0]._roomNum = 0;
|
|
|
|
_droppingCrumbs = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
// Need to hide indicator!!!!
|
|
|
|
mayShowCrumbIndicatorOff();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
|
|
|
}
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if ((code == 315) || (code == 'x') || (code == 'X') || (code == 'q') || (code == 'Q')) {
|
|
|
|
// Quit?
|
2015-12-06 16:24:25 +00:00
|
|
|
_graphics->_doNotDrawMessage = false;
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawMessage("Do you want to quit? (Y/N)");
|
2015-11-30 12:09:36 +00:00
|
|
|
doit = false;
|
|
|
|
eatMessages();
|
|
|
|
interfaceOff();
|
|
|
|
|
|
|
|
while (1) {
|
2015-12-08 10:27:34 +00:00
|
|
|
// Make sure we check the music at least after every message
|
|
|
|
_music->updateMusic();
|
2015-11-30 12:09:36 +00:00
|
|
|
curMsg = getMsg();
|
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
if (curMsg == NULL) {
|
|
|
|
// Does music load and next animation frame when you've run out of messages
|
2015-11-30 12:09:36 +00:00
|
|
|
_music->updateMusic();
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->diffNextFrame();
|
2015-11-30 12:09:36 +00:00
|
|
|
} else {
|
2015-12-07 06:18:16 +00:00
|
|
|
if (curMsg->_msgClass == RAWKEY) {
|
|
|
|
if ((curMsg->_code == 'Y') || (curMsg->_code == 'y') || (curMsg->_code == 'Q') || (curMsg->_code == 'q')) {
|
2015-11-30 12:09:36 +00:00
|
|
|
doit = true;
|
|
|
|
break;
|
2015-12-07 06:18:16 +00:00
|
|
|
} else if (curMsg->_code < 128) {
|
2015-11-30 12:09:36 +00:00
|
|
|
break;
|
|
|
|
}
|
2015-12-07 06:18:16 +00:00
|
|
|
} else if (curMsg->_msgClass == MOUSEBUTTONS) {
|
2014-10-06 12:50:05 +00:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (doit) {
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->stopDiff();
|
2015-11-30 12:09:36 +00:00
|
|
|
return false;
|
|
|
|
} else {
|
|
|
|
forceDraw = true;
|
|
|
|
interfaceOn();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (code == 9) {
|
|
|
|
// TAB key
|
2015-11-30 12:09:36 +00:00
|
|
|
msgClass = DELTAMOVE;
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (code == 27) {
|
|
|
|
// ESC key
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = NULL;
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
eatMessages();
|
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
if (_graphics->_longWinInFront) {
|
2015-12-08 08:19:00 +00:00
|
|
|
if ((msgClass == RAWKEY) || ((msgClass == MOUSEBUTTONS) &&
|
2015-12-08 20:53:42 +00:00
|
|
|
((IEQUALIFIER_LEFTBUTTON & qualifier) ||
|
|
|
|
(IEQUALIFIER_RBUTTON & qualifier)))) {
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->_longWinInFront = false;
|
2015-12-06 16:24:25 +00:00
|
|
|
_graphics->_doNotDrawMessage = false;
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
2015-12-03 00:06:04 +00:00
|
|
|
} else if ((msgClass == GADGETUP) && !_alternate) {
|
2015-11-30 12:09:36 +00:00
|
|
|
if (gadgetId <= 5) {
|
2015-12-03 10:10:58 +00:00
|
|
|
if ((actionMode == 4) && (gadgetId == 4) && (_cptr != NULL)) {
|
|
|
|
doMainView(&_cptr);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-03 10:02:58 +00:00
|
|
|
hcptr = NULL;
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = NULL;
|
2015-11-30 12:09:36 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
} else if (gadgetId == 5) {
|
|
|
|
eatMessages();
|
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
_alternate = true;
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-06 16:24:25 +00:00
|
|
|
_graphics->_doNotDrawMessage = false;
|
2015-12-08 10:27:34 +00:00
|
|
|
// Sets the correct gadget list
|
|
|
|
interfaceOn();
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if (lastInv && _conditions->in(lastInv)) {
|
|
|
|
curInv = lastInv;
|
2015-12-03 00:06:04 +00:00
|
|
|
_nextFileName = getInvName(curInv);
|
2015-11-30 12:09:36 +00:00
|
|
|
} else
|
|
|
|
decIncInv(&curInv, false);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2014-12-27 13:18:40 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
} else {
|
2015-12-06 16:24:25 +00:00
|
|
|
uint16 oldActionMode = actionMode;
|
2015-11-30 12:09:36 +00:00
|
|
|
actionMode = gadgetId;
|
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if (oldActionMode < 5)
|
|
|
|
perFlipGadget(oldActionMode);
|
2015-11-30 12:09:36 +00:00
|
|
|
|
|
|
|
perFlipGadget(actionMode);
|
|
|
|
|
2015-12-04 00:52:29 +00:00
|
|
|
if (gadgetId <= 4)
|
|
|
|
drawStaticMessage(kTextTakeWhat + gadgetId);
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
|
|
|
} else if (gadgetId == 9) {
|
|
|
|
doUse(MAPNUM);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (gadgetId >= 6) {
|
|
|
|
// Arrow Gadgets
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = NULL;
|
2015-12-03 10:02:58 +00:00
|
|
|
hcptr = NULL;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if ((gadgetId == 6) || (gadgetId == 8)) {
|
|
|
|
if (gadgetId == 6)
|
|
|
|
drawStaticMessage(kTextTurnLeft);
|
|
|
|
else
|
|
|
|
drawStaticMessage(kTextTurnRight);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = " ";
|
2014-12-27 13:18:40 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
oldDirection = _direction;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-08 21:00:19 +00:00
|
|
|
uint16 newDir = processArrow(_direction, gadgetId - 6);
|
2015-12-08 20:53:42 +00:00
|
|
|
doTurn(_direction, newDir, &_cptr);
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-08 20:53:42 +00:00
|
|
|
_direction = newDir;
|
2015-11-30 12:09:36 +00:00
|
|
|
forceDraw = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
} else if (gadgetId == 7) {
|
2015-12-06 16:24:25 +00:00
|
|
|
uint16 oldRoomNum = _roomNum;
|
2014-12-27 13:18:40 +00:00
|
|
|
|
2015-12-03 10:10:58 +00:00
|
|
|
if (doGoForward(&_cptr)) {
|
2015-12-06 16:24:25 +00:00
|
|
|
if (oldRoomNum == _roomNum)
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-11-30 12:09:36 +00:00
|
|
|
} else {
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-07 08:08:01 +00:00
|
|
|
_direction = processArrow(_direction, gadgetId - 6);
|
2014-12-27 13:18:40 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if (oldRoomNum != _roomNum) {
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextGoForward);
|
2015-12-08 10:27:34 +00:00
|
|
|
// Potentially entered a new room
|
|
|
|
_roomsFound->inclElement(_roomNum);
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = " ";
|
2015-11-30 12:09:36 +00:00
|
|
|
forceDraw = true;
|
|
|
|
} else {
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextNoPath);
|
|
|
|
}
|
|
|
|
}
|
2014-12-27 13:18:40 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (_followingCrumbs) {
|
|
|
|
if (_isCrumbTurning) {
|
2015-12-06 16:24:25 +00:00
|
|
|
if (_direction == oldDirection) {
|
2015-11-30 12:09:36 +00:00
|
|
|
_followingCrumbs = false;
|
|
|
|
}
|
|
|
|
} else {
|
2015-12-06 16:24:25 +00:00
|
|
|
if (_roomNum == oldRoomNum) { // didn't get there?
|
2015-11-30 12:09:36 +00:00
|
|
|
_followingCrumbs = false;
|
|
|
|
}
|
|
|
|
}
|
2015-12-06 16:24:25 +00:00
|
|
|
} else if (_droppingCrumbs && oldRoomNum != _roomNum) {
|
2015-11-30 12:09:36 +00:00
|
|
|
// If in surreal maze, turn off DroppingCrumbs.
|
|
|
|
// Note: These numbers were generated by parsing the
|
|
|
|
// "Maps" file, which is why they are hard-coded. Bleh!
|
|
|
|
if (_roomNum >= 245 && _roomNum <= 280) {
|
|
|
|
_followingCrumbs = false;
|
|
|
|
_droppingCrumbs = false;
|
|
|
|
_numCrumbs = 0;
|
|
|
|
_breadCrumbs[0]._roomNum = 0;
|
|
|
|
} else {
|
|
|
|
bool intersect = false;
|
|
|
|
for (int idx = 0; idx < _numCrumbs; idx++) {
|
|
|
|
if (_breadCrumbs[idx]._roomNum == _roomNum) {
|
|
|
|
_numCrumbs = idx + 1;
|
|
|
|
_breadCrumbs[_numCrumbs]._roomNum = 0;
|
|
|
|
intersect = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (!intersect) {
|
|
|
|
if (_numCrumbs == MAX_CRUMBS) {
|
|
|
|
_numCrumbs = MAX_CRUMBS - 1;
|
|
|
|
memcpy(&_breadCrumbs[0], &_breadCrumbs[1], _numCrumbs * sizeof _breadCrumbs[0]);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
_breadCrumbs[_numCrumbs]._roomNum = _roomNum;
|
2015-12-06 16:24:25 +00:00
|
|
|
_breadCrumbs[_numCrumbs++]._direction = _direction;
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
|
|
|
}
|
2015-12-03 00:06:04 +00:00
|
|
|
} else if ((msgClass == GADGETUP) && _alternate) {
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (gadgetId == 0) {
|
|
|
|
eatMessages();
|
2015-12-03 00:06:04 +00:00
|
|
|
_alternate = false;
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-06 16:24:25 +00:00
|
|
|
_graphics->_doNotDrawMessage = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = true;
|
2015-12-08 10:27:34 +00:00
|
|
|
// Sets the correct gadget list
|
|
|
|
interfaceOn();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
gadgetId--;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (gadgetId == 0) {
|
|
|
|
interfaceOff();
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->stopDiff();
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = " ";
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
doit = !saveRestoreGame();
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = NULL;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
curInv = MAPNUM;
|
2015-12-06 16:24:25 +00:00
|
|
|
lastInv = MAPNUM;
|
2014-12-27 13:18:40 +00:00
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
_nextFileName = getInvName(curInv);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
if (doit) {
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawMessage("Disk operation failed.");
|
2015-12-06 13:36:49 +00:00
|
|
|
_graphics->setPalette(initcolors, 8);
|
2015-11-30 12:09:36 +00:00
|
|
|
g_system->delayMillis(1000);
|
|
|
|
}
|
2015-12-06 13:36:49 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
} else if (gadgetId == 1) {
|
|
|
|
if (!doUse(curInv)) {
|
2015-12-06 16:24:25 +00:00
|
|
|
uint16 oldActionMode = actionMode;
|
2015-12-08 10:27:34 +00:00
|
|
|
// Use button
|
|
|
|
actionMode = 5;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if (oldActionMode < 5)
|
|
|
|
perFlipGadget(oldActionMode);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextUseOnWhat);
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
|
|
|
} else if (gadgetId == 2) {
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = !_mainDisplay;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
if ((curInv == 0) || (curInv > _numInv)) {
|
2015-11-30 12:09:36 +00:00
|
|
|
curInv = 1;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
while ((curInv <= _numInv) && (!_conditions->in(curInv)))
|
2015-11-30 12:09:36 +00:00
|
|
|
curInv++;
|
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-08 08:19:00 +00:00
|
|
|
if ((curInv <= _numInv) && _conditions->in(curInv) && _inventory[curInv]._bitmapName)
|
2015-12-03 00:06:04 +00:00
|
|
|
_nextFileName = getInvName(curInv);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (gadgetId == 3) {
|
|
|
|
// Left gadget
|
2015-11-30 12:09:36 +00:00
|
|
|
decIncInv(&curInv, true);
|
2015-12-06 16:24:25 +00:00
|
|
|
lastInv = curInv;
|
|
|
|
_graphics->_doNotDrawMessage = false;
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (gadgetId == 4) {
|
|
|
|
// Right gadget
|
2015-11-30 12:09:36 +00:00
|
|
|
decIncInv(&curInv, false);
|
2015-12-06 16:24:25 +00:00
|
|
|
lastInv = curInv;
|
|
|
|
_graphics->_doNotDrawMessage = false;
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (gadgetId == 5) {
|
|
|
|
// bread crumbs
|
2015-11-30 12:09:36 +00:00
|
|
|
_breadCrumbs[0]._roomNum = 0;
|
|
|
|
_numCrumbs = 0;
|
|
|
|
_droppingCrumbs = true;
|
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (gadgetId == 6) {
|
|
|
|
// follow crumbs
|
2015-11-30 12:09:36 +00:00
|
|
|
if (_droppingCrumbs) {
|
|
|
|
if (_numCrumbs > 0) {
|
|
|
|
_followingCrumbs = true;
|
|
|
|
_followCrumbsFast = false;
|
|
|
|
_isCrumbTurning = false;
|
|
|
|
_isCrumbWaiting = false;
|
|
|
|
getTime(&_crumbSecs, &_crumbMicros);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
eatMessages();
|
2015-12-03 00:06:04 +00:00
|
|
|
_alternate = false;
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-06 16:24:25 +00:00
|
|
|
_graphics->_doNotDrawMessage = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = true;
|
2015-12-08 10:27:34 +00:00
|
|
|
// Sets the correct gadget list
|
|
|
|
interfaceOn();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
} else {
|
|
|
|
_breadCrumbs[0]._roomNum = 0;
|
|
|
|
_droppingCrumbs = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
// Need to hide indicator!!!!
|
|
|
|
mayShowCrumbIndicatorOff();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
|
|
|
}
|
2015-12-08 20:53:42 +00:00
|
|
|
} else if ((msgClass == MOUSEBUTTONS) && (IEQUALIFIER_LEFTBUTTON & qualifier) && _mainDisplay) {
|
2015-11-30 12:09:36 +00:00
|
|
|
interfaceOff();
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
doit = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 10:10:58 +00:00
|
|
|
if (_cptr) {
|
2015-12-08 10:27:34 +00:00
|
|
|
if ((_cptr->_closeUpType == SPECIALLOCK) && _mainDisplay)
|
|
|
|
// LAB: Labyrinth specific code
|
2015-11-30 12:09:36 +00:00
|
|
|
mouseCombination(curPos);
|
2015-12-06 20:53:57 +00:00
|
|
|
else if ((_cptr->_closeUpType == SPECIALBRICK) && _mainDisplay)
|
2015-11-30 12:09:36 +00:00
|
|
|
mouseTile(curPos);
|
|
|
|
else
|
|
|
|
doit = true;
|
|
|
|
} else
|
|
|
|
doit = true;
|
|
|
|
|
|
|
|
|
|
|
|
if (doit) {
|
2015-12-03 10:02:58 +00:00
|
|
|
hcptr = NULL;
|
2015-11-30 12:09:36 +00:00
|
|
|
eatMessages();
|
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
if (actionMode == 0) {
|
|
|
|
// Take something.
|
2015-12-03 10:10:58 +00:00
|
|
|
if (doActionRule(Common::Point(curPos.x, curPos.y), actionMode, _roomNum, &_cptr))
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = _newFileName;
|
2015-12-03 10:10:58 +00:00
|
|
|
else if (takeItem(curPos.x, curPos.y, &_cptr))
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextTakeItem);
|
2015-12-03 10:10:58 +00:00
|
|
|
else if (doActionRule(curPos, TAKEDEF - 1, _roomNum, &_cptr))
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = _newFileName;
|
2015-12-03 10:10:58 +00:00
|
|
|
else if (doActionRule(curPos, TAKE - 1, 0, &_cptr))
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = _newFileName;
|
2015-12-07 16:46:37 +00:00
|
|
|
else if (curPos.y < (_utils->vgaScaleY(149) + _utils->svgaCord(2)))
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextNothing);
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if ((actionMode == 1) || (actionMode == 2) || (actionMode == 3)) {
|
|
|
|
// Manipulate an object, Open up a "door" or Close a "door"
|
2015-12-03 10:10:58 +00:00
|
|
|
if (doActionRule(curPos, actionMode, _roomNum, &_cptr))
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = _newFileName;
|
2015-12-03 10:10:58 +00:00
|
|
|
else if (!doActionRule(curPos, actionMode, 0, &_cptr)) {
|
2015-12-07 16:46:37 +00:00
|
|
|
if (curPos.y < (_utils->vgaScaleY(149) + _utils->svgaCord(2)))
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextNothing);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if (actionMode == 4) {
|
|
|
|
// Look at closeups
|
2015-12-08 21:00:19 +00:00
|
|
|
CloseDataPtr tempcptr = _cptr;
|
2015-12-03 10:02:58 +00:00
|
|
|
setCurClose(curPos, &tempcptr);
|
2015-11-30 12:09:36 +00:00
|
|
|
|
2015-12-03 10:10:58 +00:00
|
|
|
if (_cptr == tempcptr) {
|
2015-12-07 16:46:37 +00:00
|
|
|
if (curPos.y < (_utils->vgaScaleY(149) + _utils->svgaCord(2)))
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextNothing);
|
2015-12-06 20:53:57 +00:00
|
|
|
} else if (tempcptr->_graphicName) {
|
|
|
|
if (*(tempcptr->_graphicName)) {
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-03 10:10:58 +00:00
|
|
|
_cptr = tempcptr;
|
2015-12-07 16:46:37 +00:00
|
|
|
} else if (curPos.y < (_utils->vgaScaleY(149) + _utils->svgaCord(2)))
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextNothing);
|
2015-12-07 16:46:37 +00:00
|
|
|
} else if (curPos.y < (_utils->vgaScaleY(149) + _utils->svgaCord(2)))
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextNothing);
|
2015-12-08 10:27:34 +00:00
|
|
|
} else if ((actionMode == 5) && _conditions->in(curInv)) {
|
|
|
|
// Use an item on something else
|
2015-12-03 10:10:58 +00:00
|
|
|
if (doOperateRule(curPos.x, curPos.y, curInv, &_cptr)) {
|
2015-12-03 00:06:04 +00:00
|
|
|
_curFileName = _newFileName;
|
2015-11-30 12:09:36 +00:00
|
|
|
|
|
|
|
if (!_conditions->in(curInv))
|
|
|
|
decIncInv(&curInv, false);
|
2015-12-07 16:46:37 +00:00
|
|
|
} else if (curPos.y < (_utils->vgaScaleY(149) + _utils->svgaCord(2)))
|
2015-11-30 12:09:36 +00:00
|
|
|
drawStaticMessage(kTextNothing);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-11-30 12:09:36 +00:00
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2015-11-30 12:09:36 +00:00
|
|
|
} else if (msgClass == DELTAMOVE) {
|
2015-12-08 21:00:19 +00:00
|
|
|
ViewData *vptr = getViewData(_roomNum, _direction);
|
|
|
|
CloseDataPtr oldcptr = vptr->_closeUps;
|
2015-11-30 12:09:36 +00:00
|
|
|
|
2015-12-03 10:02:58 +00:00
|
|
|
if (hcptr == NULL) {
|
2015-12-08 21:00:19 +00:00
|
|
|
CloseDataPtr tempcptr = _cptr;
|
2015-12-03 10:02:58 +00:00
|
|
|
setCurClose(curPos, &tempcptr);
|
2015-11-30 12:09:36 +00:00
|
|
|
|
2015-12-03 10:10:58 +00:00
|
|
|
if ((tempcptr == NULL) || (tempcptr == _cptr)) {
|
|
|
|
if (_cptr == NULL)
|
2015-12-03 10:02:58 +00:00
|
|
|
hcptr = oldcptr;
|
2015-11-30 12:09:36 +00:00
|
|
|
else
|
2015-12-06 20:53:57 +00:00
|
|
|
hcptr = _cptr->_subCloseUps;
|
2015-11-30 12:09:36 +00:00
|
|
|
} else
|
2015-12-06 20:53:57 +00:00
|
|
|
hcptr = tempcptr->_nextCloseUp;
|
2015-11-30 12:09:36 +00:00
|
|
|
} else
|
2015-12-06 20:53:57 +00:00
|
|
|
hcptr = hcptr->_nextCloseUp;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
|
2015-12-03 10:02:58 +00:00
|
|
|
if (hcptr == NULL) {
|
2015-12-03 10:10:58 +00:00
|
|
|
if (_cptr == NULL)
|
2015-12-03 10:02:58 +00:00
|
|
|
hcptr = oldcptr;
|
2015-11-30 12:09:36 +00:00
|
|
|
else
|
2015-12-06 20:53:57 +00:00
|
|
|
hcptr = _cptr->_subCloseUps;
|
2015-11-30 12:09:36 +00:00
|
|
|
}
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-03 10:02:58 +00:00
|
|
|
if (hcptr)
|
2015-12-07 16:46:37 +00:00
|
|
|
_event->setMousePos(Common::Point(_utils->scaleX((hcptr->x1 + hcptr->x2) / 2), _utils->scaleY((hcptr->y1 + hcptr->y2) / 2)));
|
2015-12-08 20:53:42 +00:00
|
|
|
} else if ((msgClass == MOUSEBUTTONS) && (IEQUALIFIER_RBUTTON & qualifier)) {
|
2015-11-30 12:09:36 +00:00
|
|
|
eatMessages();
|
2015-12-03 00:06:04 +00:00
|
|
|
_alternate = !_alternate;
|
2015-12-01 23:34:51 +00:00
|
|
|
_anim->_doBlack = true;
|
2015-12-06 16:24:25 +00:00
|
|
|
_graphics->_doNotDrawMessage = false;
|
2015-12-06 20:39:41 +00:00
|
|
|
_mainDisplay = true;
|
2015-12-08 10:27:34 +00:00
|
|
|
// Sets the correct gadget list
|
|
|
|
interfaceOn();
|
2015-11-30 12:09:36 +00:00
|
|
|
|
2015-12-03 00:06:04 +00:00
|
|
|
if (_alternate) {
|
2015-12-06 16:24:25 +00:00
|
|
|
if (lastInv && _conditions->in(lastInv))
|
|
|
|
curInv = lastInv;
|
2015-11-30 12:09:36 +00:00
|
|
|
else
|
|
|
|
decIncInv(&curInv, false);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->drawPanel();
|
2015-12-03 10:10:58 +00:00
|
|
|
drawRoomMessage(curInv, _cptr);
|
2015-11-30 12:09:36 +00:00
|
|
|
|
|
|
|
mayShowCrumbIndicator();
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->screenUpdate();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
2015-11-30 12:09:36 +00:00
|
|
|
return true;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2014-12-27 13:18:40 +00:00
|
|
|
void LabEngine::go() {
|
2015-11-29 23:12:01 +00:00
|
|
|
_isHiRes = ((getFeatures() & GF_LOWRES) == 0);
|
2015-12-08 15:19:08 +00:00
|
|
|
_graphics->setUpScreens();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->initMouse();
|
2015-12-03 10:01:50 +00:00
|
|
|
_msgFont = _resource->getFont("P:AvanteG.12");
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseHide();
|
2015-02-24 22:37:07 +00:00
|
|
|
|
2015-12-04 20:10:07 +00:00
|
|
|
Intro *intro = new Intro(this);
|
|
|
|
intro->introSequence();
|
|
|
|
delete intro;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-04 19:18:41 +00:00
|
|
|
_event->mouseShow();
|
|
|
|
mainGameLoop();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-08 10:27:34 +00:00
|
|
|
if (_quitLab) {
|
|
|
|
// Won the game
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->blackAllScreen();
|
|
|
|
_graphics->readPict("P:End/L2In.1", true);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-27 22:18:15 +00:00
|
|
|
for (uint16 i = 0; i < 120; i++) {
|
2015-11-30 00:17:05 +00:00
|
|
|
_music->updateMusic();
|
2014-10-06 12:50:05 +00:00
|
|
|
waitTOF();
|
|
|
|
}
|
|
|
|
|
2015-12-04 12:32:08 +00:00
|
|
|
_graphics->readPict("P:End/L2In.9", true);
|
|
|
|
_graphics->readPict("P:End/Lost", true);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
warning("STUB: waitForPress");
|
|
|
|
while (!1) { // 1 means ignore SDL_ProcessInput calls
|
2015-11-30 00:17:05 +00:00
|
|
|
_music->updateMusic();
|
2015-12-01 19:10:42 +00:00
|
|
|
_anim->diffNextFrame();
|
2014-10-06 12:50:05 +00:00
|
|
|
waitTOF();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-07 06:48:54 +00:00
|
|
|
_graphics->closeFont(_msgFont);
|
2015-12-04 19:18:41 +00:00
|
|
|
_graphics->freePict();
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-02 19:32:06 +00:00
|
|
|
freeScreens();
|
|
|
|
|
2015-11-30 00:17:05 +00:00
|
|
|
_music->freeMusic();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-08 08:46:54 +00:00
|
|
|
/**
|
|
|
|
* New code to allow quick(er) return navigation in game.
|
|
|
|
*/
|
2015-11-30 06:13:09 +00:00
|
|
|
int LabEngine::followCrumbs() {
|
2014-10-06 12:50:05 +00:00
|
|
|
// NORTH, SOUTH, EAST, WEST
|
|
|
|
static int movement[4][4] = {
|
2014-12-27 13:18:40 +00:00
|
|
|
{ VKEY_UPARROW, VKEY_RTARROW, VKEY_RTARROW, VKEY_LTARROW },
|
|
|
|
{ VKEY_RTARROW, VKEY_UPARROW, VKEY_LTARROW, VKEY_RTARROW },
|
|
|
|
{ VKEY_LTARROW, VKEY_RTARROW, VKEY_UPARROW, VKEY_RTARROW },
|
|
|
|
{ VKEY_RTARROW, VKEY_LTARROW, VKEY_RTARROW, VKEY_UPARROW }
|
2014-10-06 12:50:05 +00:00
|
|
|
};
|
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
if (_isCrumbWaiting) {
|
2014-10-06 12:50:05 +00:00
|
|
|
uint32 Secs;
|
|
|
|
uint32 Micros;
|
|
|
|
|
2015-12-06 17:31:57 +00:00
|
|
|
timeDiff(_crumbSecs, _crumbMicros, &Secs, &Micros);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
if (Secs != 0 || Micros != 0)
|
|
|
|
return 0;
|
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
_isCrumbWaiting = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
if (!_isCrumbTurning)
|
|
|
|
_breadCrumbs[_numCrumbs--]._roomNum = 0;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
|
|
|
// Is the current crumb this room? If not, logic error.
|
2015-12-06 17:31:57 +00:00
|
|
|
if (_roomNum != _breadCrumbs[_numCrumbs]._roomNum) {
|
2015-11-30 06:13:09 +00:00
|
|
|
_numCrumbs = 0;
|
|
|
|
_breadCrumbs[0]._roomNum = 0;
|
|
|
|
_droppingCrumbs = false;
|
|
|
|
_followingCrumbs = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
int exitDir;
|
2015-11-27 22:18:15 +00:00
|
|
|
|
2014-10-06 12:50:05 +00:00
|
|
|
// which direction is last crumb
|
2015-11-30 06:13:09 +00:00
|
|
|
if (_breadCrumbs[_numCrumbs]._direction == EAST)
|
|
|
|
exitDir = WEST;
|
|
|
|
else if (_breadCrumbs[_numCrumbs]._direction == WEST)
|
|
|
|
exitDir = EAST;
|
|
|
|
else if (_breadCrumbs[_numCrumbs]._direction == NORTH)
|
|
|
|
exitDir = SOUTH;
|
2014-10-06 12:50:05 +00:00
|
|
|
else
|
2015-11-30 06:13:09 +00:00
|
|
|
exitDir = NORTH;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 16:24:25 +00:00
|
|
|
int moveDir = movement[_direction][exitDir];
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
if (_numCrumbs == 0) {
|
|
|
|
_isCrumbTurning = false;
|
|
|
|
_breadCrumbs[0]._roomNum = 0;
|
|
|
|
_droppingCrumbs = false;
|
|
|
|
_followingCrumbs = false;
|
2014-10-06 12:50:05 +00:00
|
|
|
} else {
|
2015-11-30 06:13:09 +00:00
|
|
|
int theDelay = (_followCrumbsFast ? ONESECOND / 4 : ONESECOND);
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
_isCrumbTurning = (moveDir != VKEY_UPARROW);
|
|
|
|
_isCrumbWaiting = true;
|
2014-10-06 12:50:05 +00:00
|
|
|
|
2015-12-06 17:31:57 +00:00
|
|
|
addCurTime(theDelay / ONESECOND, theDelay % ONESECOND, &_crumbSecs, &_crumbMicros);
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-11-30 06:13:09 +00:00
|
|
|
return moveDir;
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
|
2015-12-01 20:42:44 +00:00
|
|
|
byte dropCrumbs[] = { 0x00 };
|
|
|
|
Image dropCrumbsImage(24, 24, dropCrumbs);
|
|
|
|
|
2015-11-24 22:59:30 +00:00
|
|
|
void LabEngine::mayShowCrumbIndicator() {
|
|
|
|
if (getPlatform() != Common::kPlatformWindows)
|
2014-12-27 13:18:40 +00:00
|
|
|
return;
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if (_droppingCrumbs && _mainDisplay) {
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseHide();
|
2015-12-01 20:42:44 +00:00
|
|
|
dropCrumbsImage.drawMaskImage(612, 4);
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseShow();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-12-01 20:42:44 +00:00
|
|
|
byte dropCrumbsOff[] = { 0x00 };
|
|
|
|
Image dropCrumbsOffImage(24, 24, dropCrumbsOff);
|
|
|
|
|
2015-11-24 22:59:30 +00:00
|
|
|
void LabEngine::mayShowCrumbIndicatorOff() {
|
|
|
|
if (getPlatform() != Common::kPlatformWindows)
|
2014-12-27 13:18:40 +00:00
|
|
|
return;
|
|
|
|
|
2015-12-06 20:39:41 +00:00
|
|
|
if (_mainDisplay) {
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseHide();
|
2015-12-01 20:42:44 +00:00
|
|
|
dropCrumbsOffImage.drawMaskImage(612, 4);
|
2015-11-29 17:10:06 +00:00
|
|
|
_event->mouseShow();
|
2014-10-06 12:50:05 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
} // End of namespace Lab
|