aboutsummaryrefslogtreecommitdiff
path: root/sky/control.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sky/control.cpp')
-rw-r--r--sky/control.cpp58
1 files changed, 19 insertions, 39 deletions
diff --git a/sky/control.cpp b/sky/control.cpp
index b10809fda4..c5139ca35f 100644
--- a/sky/control.cpp
+++ b/sky/control.cpp
@@ -182,10 +182,9 @@ void ControlStatus::setToText(const char *newText) {
}
void ControlStatus::setToText(uint16 textNum) {
- _skyText->getText(textNum);
if (_textData)
free(_textData);
- displayText_t disText = _skyText->displayText(NULL, true, STATUS_WIDTH, 255);
+ displayText_t disText = _skyText->displayText(textNum, NULL, true, STATUS_WIDTH, 255);
_textData = (dataFileHeader *)disText.textData;
_statusText->setSprite(_textData);
_statusText->drawToScreen(WITH_MASK);
@@ -338,12 +337,10 @@ void Control::buttonControl(ConResource *pButton) {
_curButtonText = pButton->_text;
if (pButton->_text) {
displayText_t textRes;
- if (pButton->_text == 0xFFFF) { // text for autosave button
+ if (pButton->_text == 0xFFFF) // text for autosave button
textRes = _skyText->displayText(autoSave, NULL, false, PAN_LINE_WIDTH, 255);
- } else {
- _skyText->getText(pButton->_text);
- textRes = _skyText->displayText(NULL, false, PAN_LINE_WIDTH, 255);
- }
+ else
+ textRes = _skyText->displayText(pButton->_text, NULL, false, PAN_LINE_WIDTH, 255);
_textSprite = (dataFileHeader *)textRes.textData;
_text->setSprite(_textSprite);
} else
@@ -475,7 +472,7 @@ void Control::doControlPanel(void) {
_textSprite = NULL;
uint16 clickRes = 0;
- while (!quitPanel) {
+ while (!quitPanel && !SkyEngine::_systemVars.quitGame) {
_text->drawToScreen(WITH_MASK);
_system->updateScreen();
_mouseClicked = false;
@@ -501,12 +498,13 @@ void Control::doControlPanel(void) {
_mouseClicked = false;
}
}
- if (!haveButton) buttonControl(NULL);
-
+ if (!haveButton)
+ buttonControl(NULL);
}
memset(_screenBuf, 0, GAME_SCREEN_WIDTH * FULL_SCREEN_HEIGHT);
_system->copyRectToScreen(_screenBuf, GAME_SCREEN_WIDTH, 0, 0, GAME_SCREEN_WIDTH, FULL_SCREEN_HEIGHT);
- _system->updateScreen();
+ if (!SkyEngine::_systemVars.quitGame)
+ _system->updateScreen();
_skyScreen->forceRefresh();
_skyScreen->setPaletteEndian((uint8 *)_skyCompact->fetchCpt(SkyEngine::_systemVars.currentPalette));
removePanel();
@@ -583,11 +581,8 @@ uint16 Control::handleClick(ConResource *pButton) {
return 0;
case QUIT_TO_DOS:
animClick(pButton);
- if (getYesNo(quitDos)) {
- showGameQuitMsg(false);
- delay(1500);
- _system->quit();
- }
+ if (getYesNo(quitDos))
+ SkyEngine::_systemVars.quitGame = true;
return 0;
default:
error("Control::handleClick: unknown routine: %X",pButton->_onClick);
@@ -1538,8 +1533,7 @@ void Control::delay(unsigned int amount) {
case OSystem::EVENT_RBUTTONDOWN:
break;
case OSystem::EVENT_QUIT:
- if (!SkyEngine::_systemVars.quitting)
- showGameQuitMsg(false);
+ SkyEngine::_systemVars.quitGame = true;
break;
default:
break;
@@ -1559,20 +1553,17 @@ void Control::delay(unsigned int amount) {
} while (cur < start + amount);
}
-void Control::showGameQuitMsg(bool useScreen) {
+void Control::showGameQuitMsg(void) {
- SkyEngine::_systemVars.quitting = true;
_skyText->fnSetFont(0);
uint8 *textBuf1 = (uint8 *)malloc(GAME_SCREEN_WIDTH * 14 + sizeof(dataFileHeader));
uint8 *textBuf2 = (uint8 *)malloc(GAME_SCREEN_WIDTH * 14 + sizeof(dataFileHeader));
uint8 *screenData;
- if (useScreen) {
- if (_skyScreen->sequenceRunning())
- _skyScreen->stopSequence();
+ if (_skyScreen->sequenceRunning())
+ _skyScreen->stopSequence();
+
+ screenData = _skyScreen->giveCurrent();
- screenData = _skyScreen->giveCurrent();
- } else
- screenData = _screenBuf;
_skyText->displayText(_quitTexts[SkyEngine::_systemVars.language * 2 + 0], textBuf1, true, 320, 255);
_skyText->displayText(_quitTexts[SkyEngine::_systemVars.language * 2 + 1], textBuf2, true, 320, 255);
uint8 *curLine1 = textBuf1 + sizeof(dataFileHeader);
@@ -1591,19 +1582,8 @@ void Control::showGameQuitMsg(bool useScreen) {
}
_skyScreen->halvePalette();
_skyScreen->showScreen(screenData);
- free(textBuf1); free(textBuf2);
-
- // __tom (FIXME): This is a poor method of turning
- // off music. ~GmMusic, ~AdlibMusic, and ~MT32Music
- // should do it themselves so the appropriate MIDI
- // controller events (e.g. 123/'All Notes Off') can
- // be sent. However, that requires a re-write of
- // other code and for now this fixes hanging notes
- // on MT-32 + other external GMIDI synths.
- _skyMusic->stopMusic();
- delay(1500);
- ConfMan.flushToDisk();
- _system->quit();
+ free(textBuf1);
+ free(textBuf2);
}
char Control::_quitTexts[16][35] = {