LAB: Move some code from fromCrumbs() into separate functions

This makes this huge function a bit easier to read and understand
This commit is contained in:
Filippos Karapetis 2015-12-14 23:59:24 +02:00 committed by Willem Jan Palenstijn
parent 69294eccb0
commit 521652e436
2 changed files with 410 additions and 369 deletions

View file

@ -603,104 +603,21 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
uint16 lastInv = kItemMap;
CloseDataPtr wrkClosePtr = nullptr;
bool doit;
bool leftButtonClick = false;
bool rightButtonClick = false;
_anim->_doBlack = false;
if ((msgClass == RAWKEY) && (!_graphics->_longWinInFront)) {
byte codeLower = tolower(code);
if (code == 13) {
// The return key
msgClass = MOUSEBUTTONS;
qualifier = IEQUALIFIER_LEFTBUTTON;
curPos = _event->getMousePos();
} else if (getPlatform() == Common::kPlatformWindows && codeLower == 'b') {
// Start bread crumbs
_breadCrumbs[0]._roomNum = 0;
_numCrumbs = 0;
_droppingCrumbs = true;
mayShowCrumbIndicator();
_graphics->screenUpdate();
} else if (codeLower == 'f' || codeLower == 'r') {
// Follow bread crumbs
if (_droppingCrumbs) {
if (_numCrumbs > 0) {
_followingCrumbs = true;
_followCrumbsFast = (codeLower == 'r');
_isCrumbTurning = false;
_isCrumbWaiting = false;
_crumbTimestamp = g_system->getMillis();
if (_alternate) {
eatMessages();
_alternate = false;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
_graphics->screenUpdate();
}
} else {
_breadCrumbs[0]._roomNum = 0;
_droppingCrumbs = false;
// Need to hide indicator!!!!
mayShowCrumbIndicatorOff();
_graphics->screenUpdate();
}
}
} else if (code == 315 || codeLower == 'x' || codeLower == 'q') {
// Quit?
_graphics->_doNotDrawMessage = false;
_graphics->drawMessage("Do you want to quit? (Y/N)");
eatMessages();
interfaceOff();
while (1) {
// Make sure we check the music at least after every message
_music->updateMusic();
curMsg = _event->getMsg();
if (!curMsg) {
// Does music load and next animation frame when you've run out of messages
_music->updateMusic();
_anim->diffNextFrame();
} else {
if (curMsg->_msgClass == RAWKEY) {
codeLower = tolower(curMsg->_code);
if (codeLower == 'y' || codeLower == 'q') {
_anim->stopDiff();
return false;
} else if (curMsg->_code < 128) {
break;
}
} else if (curMsg->_msgClass == MOUSEBUTTONS) {
break;
}
}
}
forceDraw = true;
interfaceOn();
} else if (code == 9) {
// TAB key
msgClass = DELTAMOVE;
} else if (code == 27) {
// ESC key
_closeDataPtr = nullptr;
}
eatMessages();
if (!processKey(curMsg, msgClass, qualifier, curPos, curInv, forceDraw, code))
return false;
}
leftButtonClick = (msgClass == MOUSEBUTTONS) && (IEQUALIFIER_LEFTBUTTON & qualifier);
rightButtonClick = (msgClass == MOUSEBUTTONS) && (IEQUALIFIER_RIGHTBUTTON & qualifier);
if (_graphics->_longWinInFront) {
if ((msgClass == RAWKEY) || ((msgClass == MOUSEBUTTONS) &&
((IEQUALIFIER_LEFTBUTTON & qualifier) ||
(IEQUALIFIER_RIGHTBUTTON & qualifier)))) {
if ((msgClass == RAWKEY) || (leftButtonClick || rightButtonClick)) {
_graphics->_longWinInFront = false;
_graphics->_doNotDrawMessage = false;
_graphics->drawPanel();
@ -708,275 +625,10 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
_graphics->screenUpdate();
}
} else if ((msgClass == BUTTONUP) && !_alternate) {
uint16 newDir;
switch (buttonId) {
case 0:
case 1:
case 2:
case 3:
case 4:
if ((actionMode == 4) && (buttonId == 4) && _closeDataPtr) {
doMainView(&_closeDataPtr);
_anim->_doBlack = true;
wrkClosePtr = nullptr;
_closeDataPtr = nullptr;
mayShowCrumbIndicator();
} else {
uint16 oldActionMode = actionMode;
actionMode = buttonId;
if (oldActionMode < 5)
perFlipButton(oldActionMode);
perFlipButton(actionMode);
drawStaticMessage(kTextTakeWhat + buttonId);
}
break;
case 5:
eatMessages();
_alternate = true;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
// Sets the correct button list
interfaceOn();
_mainDisplay = false;
if (lastInv && _conditions->in(lastInv)) {
curInv = lastInv;
_nextFileName = getInvName(curInv);
} else
decIncInv(&curInv, false);
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
mayShowCrumbIndicator();
break;
case 9:
doUse(kItemMap);
mayShowCrumbIndicator();
break;
case 6:
case 8:
// Arrow Buttons
_closeDataPtr = nullptr;
wrkClosePtr = nullptr;
if (buttonId == 6)
drawStaticMessage(kTextTurnLeft);
else
drawStaticMessage(kTextTurnRight);
_curFileName = " ";
oldDirection = _direction;
newDir = processArrow(_direction, buttonId - 6);
doTurn(_direction, newDir, &_closeDataPtr);
_anim->_doBlack = true;
_direction = newDir;
forceDraw = true;
mayShowCrumbIndicator();
break;
case 7:
_closeDataPtr = nullptr;
wrkClosePtr = nullptr;
uint16 oldRoomNum = _roomNum;
if (doGoForward(&_closeDataPtr)) {
if (oldRoomNum == _roomNum)
_anim->_doBlack = true;
} else {
_anim->_doBlack = true;
_direction = processArrow(_direction, buttonId - 6);
if (oldRoomNum != _roomNum) {
drawStaticMessage(kTextGoForward);
// Potentially entered a new room
_roomsFound->inclElement(_roomNum);
_curFileName = " ";
forceDraw = true;
} else {
_anim->_doBlack = true;
drawStaticMessage(kTextNoPath);
}
}
if (_followingCrumbs) {
if (_isCrumbTurning) {
if (_direction == oldDirection) {
_followingCrumbs = false;
}
} else {
if (_roomNum == oldRoomNum) { // didn't get there?
_followingCrumbs = false;
}
}
} else if (_droppingCrumbs && oldRoomNum != _roomNum) {
// If in surreal maze, turn off DroppingCrumbs.
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;
}
}
if (!intersect) {
if (_numCrumbs == MAX_CRUMBS) {
_numCrumbs = MAX_CRUMBS - 1;
memcpy(&_breadCrumbs[0], &_breadCrumbs[1], _numCrumbs * sizeof _breadCrumbs[0]);
}
_breadCrumbs[_numCrumbs]._roomNum = _roomNum;
_breadCrumbs[_numCrumbs++]._direction = _direction;
}
}
}
mayShowCrumbIndicator();
break;
}
_graphics->screenUpdate();
processMainButton(wrkClosePtr, curInv, lastInv, oldDirection, forceDraw, buttonId, actionMode);
} else if ((msgClass == BUTTONUP) && _alternate) {
_anim->_doBlack = true;
switch (buttonId) {
case 0:
eatMessages();
_alternate = false;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
break;
case 1:
interfaceOff();
_anim->stopDiff();
_curFileName = " ";
doit = !saveRestoreGame();
_closeDataPtr = nullptr;
_mainDisplay = true;
curInv = kItemMap;
lastInv = kItemMap;
_nextFileName = getInvName(curInv);
_graphics->drawPanel();
if (doit) {
_graphics->drawMessage("Disk operation failed.");
_graphics->setPalette(initcolors, 8);
g_system->delayMillis(1000);
}
break;
case 2:
if (!doUse(curInv)) {
uint16 oldActionMode = actionMode;
// Use button
actionMode = 5;
if (oldActionMode < 5)
perFlipButton(oldActionMode);
drawStaticMessage(kTextUseOnWhat);
_mainDisplay = true;
}
break;
case 3:
_mainDisplay = !_mainDisplay;
if ((curInv == 0) || (curInv > _numInv)) {
curInv = 1;
while ((curInv <= _numInv) && (!_conditions->in(curInv)))
curInv++;
}
if ((curInv <= _numInv) && _conditions->in(curInv) && _inventory[curInv]._bitmapName)
_nextFileName = getInvName(curInv);
break;
case 4:
// Left button
decIncInv(&curInv, true);
lastInv = curInv;
_graphics->_doNotDrawMessage = false;
drawRoomMessage(curInv, _closeDataPtr);
break;
case 5:
// Right button
decIncInv(&curInv, false);
lastInv = curInv;
_graphics->_doNotDrawMessage = false;
drawRoomMessage(curInv, _closeDataPtr);
break;
case 6:
// bread crumbs
_breadCrumbs[0]._roomNum = 0;
_numCrumbs = 0;
_droppingCrumbs = true;
mayShowCrumbIndicator();
break;
case 7:
// follow crumbs
if (_droppingCrumbs) {
if (_numCrumbs > 0) {
_followingCrumbs = true;
_followCrumbsFast = false;
_isCrumbTurning = false;
_isCrumbWaiting = false;
_crumbTimestamp = g_system->getMillis();
eatMessages();
_alternate = false;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
} else {
_breadCrumbs[0]._roomNum = 0;
_droppingCrumbs = false;
// Need to hide indicator!!!!
mayShowCrumbIndicatorOff();
}
}
break;
}
_graphics->screenUpdate();
} else if ((msgClass == MOUSEBUTTONS) && (IEQUALIFIER_LEFTBUTTON & qualifier) && _mainDisplay) {
processAltButton(curInv, lastInv, buttonId, actionMode);
} else if (leftButtonClick && _mainDisplay) {
interfaceOff();
_mainDisplay = true;
@ -1065,6 +717,27 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
}
}
mayShowCrumbIndicator();
_graphics->screenUpdate();
} else if (rightButtonClick) {
eatMessages();
_alternate = !_alternate;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
if (_alternate) {
if (lastInv && _conditions->in(lastInv))
curInv = lastInv;
else
decIncInv(&curInv, false);
}
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
mayShowCrumbIndicator();
_graphics->screenUpdate();
} else if (msgClass == DELTAMOVE) {
@ -1095,29 +768,394 @@ bool LabEngine::fromCrumbs(uint32 tmpClass, uint16 code, uint16 qualifier, Commo
if (wrkClosePtr)
_event->setMousePos(Common::Point(_utils->scaleX((wrkClosePtr->_x1 + wrkClosePtr->_x2) / 2), _utils->scaleY((wrkClosePtr->_y1 + wrkClosePtr->_y2) / 2)));
} else if ((msgClass == MOUSEBUTTONS) && (IEQUALIFIER_RIGHTBUTTON & qualifier)) {
}
return true;
}
bool LabEngine::processKey(IntuiMessage *curMsg, uint32 &msgClass, uint16 &qualifier, Common::Point &curPos, uint16 &curInv, bool &forceDraw, uint16 code) {
byte codeLower = tolower(code);
if (code == 13) {
// The return key
msgClass = MOUSEBUTTONS;
qualifier = IEQUALIFIER_LEFTBUTTON;
curPos = _event->getMousePos();
}
else if (getPlatform() == Common::kPlatformWindows && codeLower == 'b') {
// Start bread crumbs
_breadCrumbs[0]._roomNum = 0;
_numCrumbs = 0;
_droppingCrumbs = true;
mayShowCrumbIndicator();
_graphics->screenUpdate();
}
else if (codeLower == 'f' || codeLower == 'r') {
// Follow bread crumbs
if (_droppingCrumbs) {
if (_numCrumbs > 0) {
_followingCrumbs = true;
_followCrumbsFast = (codeLower == 'r');
_isCrumbTurning = false;
_isCrumbWaiting = false;
_crumbTimestamp = g_system->getMillis();
if (_alternate) {
eatMessages();
_alternate = false;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
_graphics->screenUpdate();
}
}
else {
_breadCrumbs[0]._roomNum = 0;
_droppingCrumbs = false;
// Need to hide indicator!!!!
mayShowCrumbIndicatorOff();
_graphics->screenUpdate();
}
}
}
else if (code == 315 || codeLower == 'x' || codeLower == 'q') {
// Quit?
_graphics->_doNotDrawMessage = false;
_graphics->drawMessage("Do you want to quit? (Y/N)");
eatMessages();
_alternate = !_alternate;
interfaceOff();
while (1) {
// Make sure we check the music at least after every message
_music->updateMusic();
curMsg = _event->getMsg();
if (!curMsg) {
// Does music load and next animation frame when you've run out of messages
_music->updateMusic();
_anim->diffNextFrame();
}
else {
if (curMsg->_msgClass == RAWKEY) {
codeLower = tolower(curMsg->_code);
if (codeLower == 'y' || codeLower == 'q') {
_anim->stopDiff();
return false;
}
else if (curMsg->_code < 128) {
break;
}
}
else if (curMsg->_msgClass == MOUSEBUTTONS) {
break;
}
}
}
forceDraw = true;
interfaceOn();
}
else if (code == 9) {
// TAB key
msgClass = DELTAMOVE;
}
else if (code == 27) {
// ESC key
_closeDataPtr = nullptr;
}
eatMessages();
return true;
}
void LabEngine::processMainButton(CloseDataPtr wrkClosePtr, uint16 &curInv, uint16 &lastInv, uint16 &oldDirection, bool &forceDraw, uint16 buttonId, uint16 &actionMode) {
uint16 newDir;
switch (buttonId) {
case 0:
case 1:
case 2:
case 3:
case 4:
if ((actionMode == 4) && (buttonId == 4) && _closeDataPtr) {
doMainView(&_closeDataPtr);
_anim->_doBlack = true;
wrkClosePtr = nullptr;
_closeDataPtr = nullptr;
mayShowCrumbIndicator();
}
else {
uint16 oldActionMode = actionMode;
actionMode = buttonId;
if (oldActionMode < 5)
perFlipButton(oldActionMode);
perFlipButton(actionMode);
drawStaticMessage(kTextTakeWhat + buttonId);
}
break;
case 5:
eatMessages();
_alternate = true;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
_mainDisplay = false;
if (_alternate) {
if (lastInv && _conditions->in(lastInv))
curInv = lastInv;
else
decIncInv(&curInv, false);
if (lastInv && _conditions->in(lastInv)) {
curInv = lastInv;
_nextFileName = getInvName(curInv);
}
else
decIncInv(&curInv, false);
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
mayShowCrumbIndicator();
_graphics->screenUpdate();
break;
case 9:
doUse(kItemMap);
mayShowCrumbIndicator();
break;
case 6:
case 8:
// Arrow Buttons
_closeDataPtr = nullptr;
wrkClosePtr = nullptr;
if (buttonId == 6)
drawStaticMessage(kTextTurnLeft);
else
drawStaticMessage(kTextTurnRight);
_curFileName = " ";
oldDirection = _direction;
newDir = processArrow(_direction, buttonId - 6);
doTurn(_direction, newDir, &_closeDataPtr);
_anim->_doBlack = true;
_direction = newDir;
forceDraw = true;
mayShowCrumbIndicator();
break;
case 7:
_closeDataPtr = nullptr;
wrkClosePtr = nullptr;
uint16 oldRoomNum = _roomNum;
if (doGoForward(&_closeDataPtr)) {
if (oldRoomNum == _roomNum)
_anim->_doBlack = true;
}
else {
_anim->_doBlack = true;
_direction = processArrow(_direction, buttonId - 6);
if (oldRoomNum != _roomNum) {
drawStaticMessage(kTextGoForward);
// Potentially entered a new room
_roomsFound->inclElement(_roomNum);
_curFileName = " ";
forceDraw = true;
}
else {
_anim->_doBlack = true;
drawStaticMessage(kTextNoPath);
}
}
if (_followingCrumbs) {
if (_isCrumbTurning) {
if (_direction == oldDirection) {
_followingCrumbs = false;
}
}
else {
if (_roomNum == oldRoomNum) { // didn't get there?
_followingCrumbs = false;
}
}
}
else if (_droppingCrumbs && oldRoomNum != _roomNum) {
// If in surreal maze, turn off DroppingCrumbs.
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;
}
}
if (!intersect) {
if (_numCrumbs == MAX_CRUMBS) {
_numCrumbs = MAX_CRUMBS - 1;
memcpy(&_breadCrumbs[0], &_breadCrumbs[1], _numCrumbs * sizeof _breadCrumbs[0]);
}
_breadCrumbs[_numCrumbs]._roomNum = _roomNum;
_breadCrumbs[_numCrumbs++]._direction = _direction;
}
}
}
mayShowCrumbIndicator();
break;
}
return true;
_graphics->screenUpdate();
}
void LabEngine::processAltButton(uint16 &curInv, uint16 &lastInv, uint16 buttonId, uint16 &actionMode) {
bool doit;
_anim->_doBlack = true;
switch (buttonId) {
case 0:
eatMessages();
_alternate = false;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
break;
case 1:
interfaceOff();
_anim->stopDiff();
_curFileName = " ";
doit = !saveRestoreGame();
_closeDataPtr = nullptr;
_mainDisplay = true;
curInv = kItemMap;
lastInv = kItemMap;
_nextFileName = getInvName(curInv);
_graphics->drawPanel();
if (doit) {
_graphics->drawMessage("Disk operation failed.");
_graphics->setPalette(initcolors, 8);
g_system->delayMillis(1000);
}
break;
case 2:
if (!doUse(curInv)) {
uint16 oldActionMode = actionMode;
// Use button
actionMode = 5;
if (oldActionMode < 5)
perFlipButton(oldActionMode);
drawStaticMessage(kTextUseOnWhat);
_mainDisplay = true;
}
break;
case 3:
_mainDisplay = !_mainDisplay;
if ((curInv == 0) || (curInv > _numInv)) {
curInv = 1;
while ((curInv <= _numInv) && (!_conditions->in(curInv)))
curInv++;
}
if ((curInv <= _numInv) && _conditions->in(curInv) && _inventory[curInv]._bitmapName)
_nextFileName = getInvName(curInv);
break;
case 4:
// Left button
decIncInv(&curInv, true);
lastInv = curInv;
_graphics->_doNotDrawMessage = false;
drawRoomMessage(curInv, _closeDataPtr);
break;
case 5:
// Right button
decIncInv(&curInv, false);
lastInv = curInv;
_graphics->_doNotDrawMessage = false;
drawRoomMessage(curInv, _closeDataPtr);
break;
case 6:
// bread crumbs
_breadCrumbs[0]._roomNum = 0;
_numCrumbs = 0;
_droppingCrumbs = true;
mayShowCrumbIndicator();
break;
case 7:
// follow crumbs
if (_droppingCrumbs) {
if (_numCrumbs > 0) {
_followingCrumbs = true;
_followCrumbsFast = false;
_isCrumbTurning = false;
_isCrumbWaiting = false;
_crumbTimestamp = g_system->getMillis();
eatMessages();
_alternate = false;
_anim->_doBlack = true;
_graphics->_doNotDrawMessage = false;
_mainDisplay = true;
// Sets the correct button list
interfaceOn();
_graphics->drawPanel();
drawRoomMessage(curInv, _closeDataPtr);
}
else {
_breadCrumbs[0]._roomNum = 0;
_droppingCrumbs = false;
// Need to hide indicator!!!!
mayShowCrumbIndicatorOff();
}
}
break;
}
_graphics->screenUpdate();
}
void LabEngine::go() {