diff options
author | Andrew Kurushin | 2005-05-29 15:39:35 +0000 |
---|---|---|
committer | Andrew Kurushin | 2005-05-29 15:39:35 +0000 |
commit | 99b9fc7070c6967e30cedc7df4218d3fab42862b (patch) | |
tree | d96755026b91bbb94100d16a2e84735fce4e2d5c /saga | |
parent | d4456afa444cc4aed072f15589586e11085590bd (diff) | |
download | scummvm-rg350-99b9fc7070c6967e30cedc7df4218d3fab42862b.tar.gz scummvm-rg350-99b9fc7070c6967e30cedc7df4218d3fab42862b.tar.bz2 scummvm-rg350-99b9fc7070c6967e30cedc7df4218d3fab42862b.zip |
implemented DOS version 1 pixel clipping
game options WIP3
svn-id: r18293
Diffstat (limited to 'saga')
-rw-r--r-- | saga/game.cpp | 48 | ||||
-rw-r--r-- | saga/input.cpp | 8 | ||||
-rw-r--r-- | saga/interface.cpp | 582 | ||||
-rw-r--r-- | saga/interface.h | 78 | ||||
-rw-r--r-- | saga/isomap.cpp | 6 | ||||
-rw-r--r-- | saga/render.cpp | 15 | ||||
-rw-r--r-- | saga/saga.cpp | 8 | ||||
-rw-r--r-- | saga/saga.h | 27 |
8 files changed, 670 insertions, 102 deletions
diff --git a/saga/game.cpp b/saga/game.cpp index e310f15577..c463112cb8 100644 --- a/saga/game.cpp +++ b/saga/game.cpp @@ -84,29 +84,41 @@ static PanelButton ITE_OptionPanelButtons[] = { {kPanelButtonOption, 241,98, 57,17, kTextSave,'s',0, 0,0,0}, //save {kPanelButtonOptionSaveFiles, 166,20, 112,74, 0,'-',0, 0,0,0}, //savefiles - {kPanelButtonOptionText,114,4, 0,0, kTextGameOptions,'-',0, 0,0,0}, // text: game options + {kPanelButtonOptionText,114-8,4, 0,0, kTextGameOptions,'-',0, 0,0,0}, // text: game options {kPanelButtonOptionText,10,22, 0,0, kTextReadingSpeed,'-',0, 0,0,0}, // text: read speed {kPanelButtonOptionText,73,41, 0,0, kTextMusic,'-',0, 0,0,0}, // text: music {kPanelButtonOptionText,69,60, 0,0, kTextSound,'-',0, 0,0,0}, // text: noise }; static PanelButton ITE_QuitPanelButtons[] = { - {kPanelButtonArrow, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO + {kPanelButtonQuit, 11,17, 60,16, kTextQuit,'q',0, 0,0,0}, + {kPanelButtonQuit, 121,17, 60,16, kTextCancel,'c',0, 0,0,0}, + {kPanelButtonQuitText, -1,5, 0,0, kTextQuitTheGameQuestion,'-',0, 0,0,0}, }; static PanelButton ITE_LoadPanelButtons[] = { - {kPanelButtonArrow, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO + {kPanelButtonLoad, 101,19, 60,16, kTextOK,'o',0, 0,0,0}, + {kPanelButtonLoadText, -1,5, 0,0, kTextLoadSuccessful,'-',0, 0,0,0}, }; static PanelButton ITE_SavePanelButtons[] = { - {kPanelButtonArrow, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO + {kPanelButtonSave, 11,37, 60,16, kTextSave,'s',0, 0,0,0}, + {kPanelButtonSave, 101,37, 60,16, kTextCancel,'c',0, 0,0,0}, + {kPanelButtonSaveEdit, 26,17, 119,17, 0,'-',0, 0,0,0}, + {kPanelButtonSaveText, -1,5, 0,0, kTextEnterSaveGameName,'-',0, 0,0,0}, }; +/* +static PanelButton ITE_ProtectionPanelButtons[] = { + {kPanelButtonArrow, 0,0, 0,0, 0,'-',0, 0,0,0}, //TODO +};*/ + static GameDisplayInfo ITE_DisplayInfo = { 320, 200, // logical width&height 35, // scene path y offset 137, // scene height + 137, // clipped scene height 0, // status x offset 137, // status y offset @@ -115,7 +127,7 @@ static GameDisplayInfo ITE_DisplayInfo = { 2, // status text y offset 186, // status text color 15, // status BG color - 308,138, // save reminder pos + 308,137, // save reminder pos 12,12, // save reminder w & h 6,7, // save reminder sprite numbers @@ -144,15 +156,19 @@ static GameDisplayInfo ITE_DisplayInfo = { ARRAYSIZE(ITE_OptionPanelButtons), ITE_OptionPanelButtons, - 0, 0, // quit panel offsets + 64,54, // quit panel offsets + 192,38, // quit panel width & height ARRAYSIZE(ITE_QuitPanelButtons), ITE_QuitPanelButtons, - 0, 0, // load panel offsets + 74, 53, // load panel offsets + 172, 40, // load panel width & height ARRAYSIZE(ITE_LoadPanelButtons), ITE_LoadPanelButtons, - 0, 0, // save panel offsets + 2, // save edit index + 74, 44, // save panel offsets + 172, 58, // save panel width & height ARRAYSIZE(ITE_SavePanelButtons), ITE_SavePanelButtons }; @@ -302,6 +318,7 @@ static GameDisplayInfo IHNM_DisplayInfo = { //TODO: fill it all 0, // scene path y offset 304, // scene height + 304, // clipped scene height 0, // status x offset 304, // status y offset @@ -340,15 +357,19 @@ static GameDisplayInfo IHNM_DisplayInfo = { //TODO: fill it all ARRAYSIZE(IHNM_OptionPanelButtons), IHNM_OptionPanelButtons, - 0, 0, // quit panel offsets + 0,0, // quit panel offsets + 0,0, // quit panel width & height ARRAYSIZE(IHNM_QuitPanelButtons), IHNM_QuitPanelButtons, 0, 0, // load panel offsets + 0, 0, // load panel width & height ARRAYSIZE(IHNM_LoadPanelButtons), IHNM_LoadPanelButtons, + -1, // save edit index 0, 0, // save panel offsets + 0, 0, // save panel width & height ARRAYSIZE(IHNM_SavePanelButtons), IHNM_SavePanelButtons }; @@ -1004,6 +1025,15 @@ int SagaEngine::loadGame(int gameNumber) { debug(0, "Opened resource file: %s", gameFileName); _gameFileContexts[i] = loadContext; } + + + if (_vm->getGameId() == GID_ITE_DISK_G) { + //DOS ITE version clips scene height by 1 + _gameDisplayInfo.clippedSceneHeight--; + _gameDisplayInfo.statusYOffset--; + _gameDisplayInfo.mainPanelYOffset--; + _gameDisplayInfo.conversePanelYOffset--; + } return SUCCESS; } diff --git a/saga/input.cpp b/saga/input.cpp index c28292f083..1a3ad11db0 100644 --- a/saga/input.cpp +++ b/saga/input.cpp @@ -57,18 +57,18 @@ int SagaEngine::processInput() { _interface->draw(); break; - case 269: +/* case 269: case 270: case 273: case 274: case 275: case 276: if (_vm->_scene->getFlags() & kSceneFlagISO) { -/* _vm->_isoMap->_viewDiff += (event.kbd.keycode == 270) - (event.kbd.keycode == 269); + _vm->_isoMap->_viewDiff += (event.kbd.keycode == 270) - (event.kbd.keycode == 269); _vm->_isoMap->_viewScroll.y += (_vm->_isoMap->_viewDiff * (event.kbd.keycode == 274) - _vm->_isoMap->_viewDiff * (event.kbd.keycode == 273)); - _vm->_isoMap->_viewScroll.x += (_vm->_isoMap->_viewDiff * (event.kbd.keycode == 275) - _vm->_isoMap->_viewDiff * (event.kbd.keycode == 276));*/ + _vm->_isoMap->_viewScroll.x += (_vm->_isoMap->_viewDiff * (event.kbd.keycode == 275) - _vm->_isoMap->_viewDiff * (event.kbd.keycode == 276)); } - break; + break;*/ case 282: // F1 _render->toggleFlag(RF_SHOW_FPS); _vm->_actor->_handleActionDiv = (_vm->_actor->_handleActionDiv == 15) ? 50 : 15; diff --git a/saga/interface.cpp b/saga/interface.cpp index 4bf5af9265..ee4a9a39a4 100644 --- a/saga/interface.cpp +++ b/saga/interface.cpp @@ -151,6 +151,31 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { _optionSaveFileSlider = _optionPanel.getButton(_vm->getDisplayInfo().optionSaveFileSliderIndex); _optionSaveFilePanel = _optionPanel.getButton(_vm->getDisplayInfo().optionSaveFilePanelIndex); + _quitPanel.x = _vm->getDisplayInfo().quitPanelXOffset; + _quitPanel.y = _vm->getDisplayInfo().quitPanelYOffset; + _quitPanel.imageWidth = _vm->getDisplayInfo().quitPanelWidth; + _quitPanel.imageHeight = _vm->getDisplayInfo().quitPanelHeight; + _quitPanel.buttons = _vm->getDisplayInfo().quitPanelButtons; + _quitPanel.buttonsCount = _vm->getDisplayInfo().quitPanelButtonsCount; + _quitPanel.currentButton = NULL; + + _loadPanel.x = _vm->getDisplayInfo().loadPanelXOffset; + _loadPanel.y = _vm->getDisplayInfo().loadPanelYOffset; + _loadPanel.imageWidth = _vm->getDisplayInfo().loadPanelWidth; + _loadPanel.imageHeight = _vm->getDisplayInfo().loadPanelHeight; + _loadPanel.buttons = _vm->getDisplayInfo().loadPanelButtons; + _loadPanel.buttonsCount = _vm->getDisplayInfo().loadPanelButtonsCount; + _loadPanel.currentButton = NULL; + + _savePanel.x = _vm->getDisplayInfo().savePanelXOffset; + _savePanel.y = _vm->getDisplayInfo().savePanelYOffset; + _savePanel.imageWidth = _vm->getDisplayInfo().savePanelWidth; + _savePanel.imageHeight = _vm->getDisplayInfo().savePanelHeight; + _savePanel.buttons = _vm->getDisplayInfo().savePanelButtons; + _savePanel.buttonsCount = _vm->getDisplayInfo().savePanelButtonsCount; + _saveEdit = _savePanel.getButton(_vm->getDisplayInfo().saveEditIndex); + _savePanel.currentButton = NULL; + _active = false; _panelMode = _lockedMode = kPanelNull; _savedMode = -1; @@ -167,6 +192,7 @@ Interface::Interface(SagaEngine *vm) : _vm(vm), _initialized(false) { _saveReminderState = 0; _optionSaveFileTop = 0; + _optionSaveFileTitleNumber = 0; _inventory = (uint16 *)calloc(_inventorySize, sizeof(uint16)); if (_inventory == NULL) { @@ -249,20 +275,37 @@ void Interface::setMode(int mode, bool force) { else _panelMode = mode; - if (_panelMode == kPanelMain) { - _mainPanel.currentButton = NULL; - } else { - if (_panelMode == kPanelConverse) { + switch(_panelMode) { + case(kPanelMain): + _mainPanel.currentButton = NULL; + break; + case(kPanelConverse): _conversePanel.currentButton = NULL; converseDisplayText(); - } else { - if (_panelMode == kPanelOption) { - _optionPanel.currentButton = NULL; - _vm->fillSaveList(); - calcOptionSaveSlider(); - _optionSaveFileTitleNumber = 0; + break; + case(kPanelOption): + _optionPanel.currentButton = NULL; + _vm->fillSaveList(); + calcOptionSaveSlider(); + if (_optionSaveFileTitleNumber >= _vm->getDisplayInfo().optionSaveFileVisible) { + _optionSaveFileTitleNumber = _vm->getDisplayInfo().optionSaveFileVisible - 1; } - } + break; + case(kPanelLoad): + _loadPanel.currentButton = NULL; + break; + case(kPanelQuit): + _quitPanel.currentButton = NULL; + break; + case(kPanelSave): + _savePanel.currentButton = NULL; + _textInputMaxWidth = _saveEdit->width - 9; + _textInput = true; + _textInputString[0] = 0; + strcpy(_textInputString, "test1"); + _textInputStringLength = strlen(_textInputString); + _textInputPos = _textInputStringLength + 1; + break; } draw(); @@ -297,6 +340,49 @@ bool Interface::processAscii(uint16 ascii) { } } break; + case kPanelSave: + if (_textInput) { + processTextInput(ascii); + } else { + if (ascii == 27) {// Esc + ascii = 'c'; //cancel + } + for (i = 0; i < _savePanel.buttonsCount; i++) { + panelButton = &_savePanel.buttons[i]; + if(panelButton->type == kPanelButtonSave) { + if (panelButton->ascii == ascii) { + setSave(panelButton); + return true; + } + } + } + } + break; + case kPanelQuit: + if (ascii == 27) {// Esc + ascii = 'c'; //cancel + } + for (i = 0; i < _quitPanel.buttonsCount; i++) { + panelButton = &_quitPanel.buttons[i]; + if(panelButton->type == kPanelButtonQuit) { + if (panelButton->ascii == ascii) { + setQuit(panelButton); + return true; + } + } + } + break; + case kPanelLoad: + for (i = 0; i < _loadPanel.buttonsCount; i++) { + panelButton = &_loadPanel.buttons[i]; + if(panelButton->type == kPanelButtonLoad) { + if (panelButton->ascii == ascii) { + setLoad(panelButton); + return true; + } + } + } + break; case kPanelMain: for (i = 0; i < _mainPanel.buttonsCount; i++) { panelButton = &_mainPanel.buttons[i]; @@ -412,8 +498,8 @@ void Interface::draw() { if (_panelMode == kPanelMain) { - origin.x = 0; - origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight; + origin.x = _mainPanel.x; + origin.y = _mainPanel.y; bufToSurface(backBuffer, _mainPanel.image, _mainPanel.imageWidth, _mainPanel.imageHeight, NULL, &origin); for (i = 0; i < kVerbTypesMax; i++) { @@ -424,8 +510,8 @@ void Interface::draw() { } else { if (_panelMode == kPanelConverse) { - origin.x = 0; - origin.y = _vm->getDisplayHeight() - _mainPanel.imageHeight; + origin.x = _conversePanel.x; + origin.y = _conversePanel.y; bufToSurface(backBuffer, _conversePanel.image, _conversePanel.imageWidth, _conversePanel.imageHeight, NULL, &origin); @@ -495,6 +581,22 @@ void Interface::calcOptionSaveSlider() { _optionSaveRectBottom.right--; } +void Interface::drawPanelText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) { + const char *text; + int textWidth; + Rect rect; + + text = _vm->getTextString(panelButton->id); + panel->calcPanelButtonRect(panelButton, rect); + if (panelButton->xOffset < 0) { + textWidth = _vm->_font->getStringWidth(MEDIUM_FONT_ID, text, 0, 0); + rect.left += 2 + (panel->imageWidth - 1 - textWidth) / 2; + } + + _vm->_font->draw(MEDIUM_FONT_ID, ds, text, 0, rect.left , rect.top + 1, + _vm->getDisplayInfo().verbTextColor, _vm->getDisplayInfo().verbTextShadowColor, FONT_SHADOW); +} + void Interface::drawOption() { const char *text; SURFACE *backBuffer; @@ -517,13 +619,10 @@ void Interface::drawOption() { for (i = 0; i < _optionPanel.buttonsCount; i++) { panelButton = &_optionPanel.buttons[i]; if(panelButton->type == kPanelButtonOption) { - drawOptionPanelButtonText(backBuffer, panelButton); + drawPanelButtonText(backBuffer, &_optionPanel, panelButton); } if (panelButton->type == kPanelButtonOptionText) { - text = _vm->getTextString(panelButton->id); - _optionPanel.calcPanelButtonRect(panelButton, rect); - _vm->_font->draw(MEDIUM_FONT_ID, backBuffer, text, 0, rect.left , rect.top, - _vm->getDisplayInfo().verbTextColor, _vm->getDisplayInfo().verbTextShadowColor, FONT_SHADOW); //TODO: create Option button colors constant + drawPanelText(backBuffer, &_optionPanel, panelButton); } } @@ -531,13 +630,14 @@ void Interface::drawOption() { drawRect(backBuffer, _optionSaveRectTop, kITEColorDarkGrey); } - drawButtonBox(backBuffer, _optionSaveRectSlider, true, _optionSaveFileSlider->state > 0); + drawButtonBox(backBuffer, _optionSaveRectSlider, kSlider, _optionSaveFileSlider->state > 0); if(_optionSaveRectBottom.height() > 0) { drawRect(backBuffer, _optionSaveRectBottom, kITEColorDarkGrey); } _optionPanel.calcPanelButtonRect(_optionSaveFilePanel, rect); + rect.top++; rect2 = rect; fontHeight = _vm->_font->getHeight(SMALL_FONT_ID); for (j = 0; j < _vm->getDisplayInfo().optionSaveFileVisible; j++) { @@ -560,13 +660,297 @@ void Interface::drawOption() { } -void Interface::handleOptionUpdate(const Point& mousePoint) { +void Interface::drawQuit() { + SURFACE *backBuffer; + Rect rect; int i; - int16 mouseY; + PanelButton *panelButton; + + backBuffer = _vm->_gfx->getBackBuffer(); + + _quitPanel.getRect(rect); + drawButtonBox(backBuffer, rect, kButton, false); + for (i = 0; i < _quitPanel.buttonsCount; i++) { + panelButton = &_quitPanel.buttons[i]; + if(panelButton->type == kPanelButtonQuit) { + drawPanelButtonText(backBuffer, &_quitPanel, panelButton); + } + if(panelButton->type == kPanelButtonQuitText) { + drawPanelText(backBuffer, &_quitPanel, panelButton); + } + } +} + +void Interface::handleQuitUpdate(const Point& mousePoint) { + Rect rect; + bool releasedButton; + + _quitPanel.currentButton = quitHitTest(mousePoint); + releasedButton = (_quitPanel.currentButton != NULL) && (_quitPanel.currentButton->state > 0) && (!_vm->mouseButtonPressed()); + + if (!_vm->mouseButtonPressed()) { + _quitPanel.zeroAllButtonState(); + } + + if (releasedButton) { + setQuit(_quitPanel.currentButton); + } +} + +void Interface::handleQuitClick(const Point& mousePoint) { + _quitPanel.currentButton = quitHitTest(mousePoint); + + _quitPanel.zeroAllButtonState(); + + if (_quitPanel.currentButton == NULL) { + return; + } + + _quitPanel.currentButton->state = 1; +} + +void Interface::setQuit(PanelButton *panelButton) { + _quitPanel.currentButton = NULL; + switch (panelButton->id) { + case kTextCancel: + setMode(kPanelOption); + break; + case kTextQuit: + _vm->shutDown(); + break; + } +} + +void Interface::drawLoad() { + SURFACE *backBuffer; Rect rect; + int i; + PanelButton *panelButton; + + backBuffer = _vm->_gfx->getBackBuffer(); + + _loadPanel.getRect(rect); + drawButtonBox(backBuffer, rect, kButton, false); + for (i = 0; i < _loadPanel.buttonsCount; i++) { + panelButton = &_loadPanel.buttons[i]; + if(panelButton->type == kPanelButtonLoad) { + drawPanelButtonText(backBuffer, &_loadPanel, panelButton); + } + if(panelButton->type == kPanelButtonLoadText) { + drawPanelText(backBuffer, &_loadPanel, panelButton); + } + } +} + +void Interface::handleLoadUpdate(const Point& mousePoint) { + Rect rect; + bool releasedButton; + + _loadPanel.currentButton = loadHitTest(mousePoint); + releasedButton = (_loadPanel.currentButton != NULL) && (_loadPanel.currentButton->state > 0) && (!_vm->mouseButtonPressed()); + + if (!_vm->mouseButtonPressed()) { + _loadPanel.zeroAllButtonState(); + } + + if (releasedButton) { + setLoad(_loadPanel.currentButton); + } +} + +void Interface::handleLoadClick(const Point& mousePoint) { + _loadPanel.currentButton = loadHitTest(mousePoint); + + _loadPanel.zeroAllButtonState(); + + if (_loadPanel.currentButton == NULL) { + return; + } + + _loadPanel.currentButton->state = 1; +} + +void Interface::setLoad(PanelButton *panelButton) { + _loadPanel.currentButton = NULL; + switch (panelButton->id) { + case kTextOK: + setMode(kPanelMain); + break; + } +} + +void Interface::processTextInput(uint16 ascii) { + char ch[2]; + char tempString[SAVE_TITLE_SIZE]; + uint tempWidth; + memset(tempString, 0, SAVE_TITLE_SIZE); + ch[1] = 0; + + switch (ascii) { + case(8): // backspace + if (_textInputPos <= 1) { + break; + } + _textInputPos--; + case(127): // del + if (_textInputPos <= _textInputStringLength) { + if (_textInputPos != 1) { + strncpy(tempString, _textInputString, _textInputPos - 1); + } + if (_textInputPos != _textInputStringLength) { + strncat(tempString, &_textInputString[_textInputPos], _textInputStringLength - _textInputPos); + } + strcpy(_textInputString, tempString); + _textInputStringLength = strlen(_textInputString); + } + break; + case(276): // left + if (_textInputPos > 1) { + _textInputPos--; + } + break; + case(275): // right + if (_textInputPos <= _textInputStringLength) { + _textInputPos++; + } + break; + default: + if (((ascii >= 'a') && (ascii <='z')) || + ((ascii >= '0') && (ascii <='9')) || + ((ascii >= 'A') && (ascii <='Z'))) { + if (_textInputStringLength < SAVE_TITLE_SIZE - 1) { + ch[0] = ascii; + tempWidth = _vm->_font->getStringWidth(SMALL_FONT_ID, ch, 0, 0); + tempWidth += _vm->_font->getStringWidth(SMALL_FONT_ID, _textInputString, 0, 0); + if (tempWidth > _textInputMaxWidth) { + break; + } + if (_textInputPos != 1) { + strncpy(tempString, _textInputString, _textInputPos - 1); + strcat(tempString, ch); + } + if ((_textInputStringLength == 0) || (_textInputPos == 1)) { + strcpy(tempString, ch); + } + if ((_textInputStringLength != 0) && (_textInputPos != _textInputStringLength)) { + strncat(tempString, &_textInputString[_textInputPos - 1], _textInputStringLength - _textInputPos + 1); + } + + strcpy(_textInputString, tempString); + _textInputStringLength = strlen(_textInputString); + _textInputPos++; + } + } + break; + } +} + +void Interface::drawTextInput(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) { + Rect rect; + Point drawPoint; + char ch[2]; + int fgColor; + uint i; + + ch[1] = 0; + panel->calcPanelButtonRect(panelButton, rect); + drawButtonBox(ds, rect, kEdit, _textInput); + rect.left += 4; + rect.top += 4; + rect.setHeight(_vm->_font->getHeight(SMALL_FONT_ID)); + + i = 0; + while ((ch[0] = _textInputString[i++]) != 0) { + rect.setWidth(_vm->_font->getStringWidth(SMALL_FONT_ID, ch, 0, 0)); + if ((i == _textInputPos) && _textInput) { + fgColor = kITEColorBlack; + ds->fillRect(rect, kITEColorWhite); + } else { + fgColor = kITEColorWhite; + } + _vm->_font->draw(SMALL_FONT_ID, ds, ch, 0, rect.left, + rect.top + 1, fgColor, 0, 0); + rect.left += rect.width(); + } + if (_textInput && (_textInputPos >= i)) { + ch[0] = ' '; + rect.setWidth(_vm->_font->getStringWidth(SMALL_FONT_ID, ch, 0, 0)); + ds->fillRect(rect, kITEColorWhite); + } +} + +void Interface::drawSave() { + SURFACE *backBuffer; + Rect rect; + int i; + PanelButton *panelButton; + + backBuffer = _vm->_gfx->getBackBuffer(); + + _savePanel.getRect(rect); + drawButtonBox(backBuffer, rect, kButton, false); + for (i = 0; i < _savePanel.buttonsCount; i++) { + panelButton = &_savePanel.buttons[i]; + if(panelButton->type == kPanelButtonSave) { + drawPanelButtonText(backBuffer, &_savePanel, panelButton); + } + if(panelButton->type == kPanelButtonSaveText) { + drawPanelText(backBuffer, &_savePanel, panelButton); + } + } + + drawTextInput(backBuffer, &_savePanel, _saveEdit); +} + +void Interface::handleSaveUpdate(const Point& mousePoint) { + Rect rect; + bool releasedButton; + + _savePanel.currentButton = saveHitTest(mousePoint); + releasedButton = (_savePanel.currentButton != NULL) && + (_savePanel.currentButton->state > 0) && (!_vm->mouseButtonPressed()); + + if (!_vm->mouseButtonPressed()) { + _savePanel.zeroAllButtonState(); + } + + if (releasedButton) { + setSave(_savePanel.currentButton); + } +} + +void Interface::handleSaveClick(const Point& mousePoint) { + _savePanel.currentButton = saveHitTest(mousePoint); + + _savePanel.zeroAllButtonState(); + + if (_savePanel.currentButton == NULL) { + _textInput = false; + return; + } + + _savePanel.currentButton->state = 1; + if (_savePanel.currentButton == _saveEdit) { + _textInput = true; + } +} + +void Interface::setSave(PanelButton *panelButton) { +/* _savePanel.currentButton = NULL; + switch (panelButton->id) { + case kTextOK: + setMode(kPanelMain); + break; + }*/ +} + +void Interface::handleOptionUpdate(const Point& mousePoint) { + int16 mouseY; + Rect rect; int totalFiles = _vm->getSaveFileNameCount(); int visibleFiles = _vm->getDisplayInfo().optionSaveFileVisible; - + bool releasedButton; + if (_vm->mouseButtonPressed()) { if (_optionSaveFileSlider->state > 0) { _optionPanel.calcPanelButtonRect(_optionSaveFileSlider, rect); @@ -586,29 +970,23 @@ void Interface::handleOptionUpdate(const Point& mousePoint) { } _optionPanel.currentButton = optionHitTest(mousePoint); - bool releasedButton = (_optionPanel.currentButton != NULL) && (_optionPanel.currentButton->state > 0) && (!_vm->mouseButtonPressed()); - + releasedButton = (_optionPanel.currentButton != NULL) && (_optionPanel.currentButton->state > 0) && (!_vm->mouseButtonPressed()); + if (!_vm->mouseButtonPressed()) { - for (i = 0; i < _optionPanel.buttonsCount; i++) { - _optionPanel.buttons[i].state = 0; - } + _optionPanel.zeroAllButtonState(); } if (releasedButton) { setOption(_optionPanel.currentButton); } - } void Interface::handleOptionClick(const Point& mousePoint) { - int i; Rect rect; _optionPanel.currentButton = optionHitTest(mousePoint); - for (i = 0; i < _optionPanel.buttonsCount; i++) { - _optionPanel.buttons[i].state = 0; - } + _optionPanel.zeroAllButtonState(); if (_optionPanel.currentButton == NULL) { return; @@ -634,9 +1012,7 @@ void Interface::handleOptionClick(const Point& mousePoint) { if (_optionPanel.currentButton == _optionSaveFilePanel) { _optionPanel.calcPanelButtonRect(_optionSaveFilePanel, rect); _optionSaveFileTitleNumber = (mousePoint.y - rect.top) / (_vm->_font->getHeight(SMALL_FONT_ID) + 1); - if (_optionSaveFileTitleNumber < 0) { - _optionSaveFileTitleNumber = 0; - } + if (_optionSaveFileTitleNumber >= _vm->getDisplayInfo().optionSaveFileVisible) { _optionSaveFileTitleNumber = _vm->getDisplayInfo().optionSaveFileVisible - 1; } @@ -652,13 +1028,21 @@ void Interface::handleOptionClick(const Point& mousePoint) { void Interface::setOption(PanelButton *panelButton) { + _optionPanel.currentButton = NULL; switch (panelButton->id) { case kTextContinuePlaying: setMode(kPanelMain); break; case kTextQuitGame: - _vm->shutDown(); - break; + setMode(kPanelQuit); + break; + case kTextLoad: + //todo: load + setMode(kPanelLoad); + break; + case kTextSave: + setMode(kPanelSave); + break; } } @@ -719,6 +1103,41 @@ void Interface::update(const Point& mousePoint, int updateFlag) { } } + if (_panelMode == kPanelQuit) { + if (updateFlag & UPDATE_MOUSEMOVE) { + + handleQuitUpdate(mousePoint); + + } else { + if (updateFlag & UPDATE_MOUSECLICK) { + handleQuitClick(mousePoint); + } + } + } + + if (_panelMode == kPanelLoad) { + if (updateFlag & UPDATE_MOUSEMOVE) { + + handleLoadUpdate(mousePoint); + + } else { + if (updateFlag & UPDATE_MOUSECLICK) { + handleLoadClick(mousePoint); + } + } + } + + if (_panelMode == kPanelSave) { + if (updateFlag & UPDATE_MOUSEMOVE) { + + handleSaveUpdate(mousePoint); + + } else { + if (updateFlag & UPDATE_MOUSECLICK) { + handleSaveClick(mousePoint); + } + } + } _lastMousePoint = mousePoint; } @@ -755,7 +1174,7 @@ void Interface::drawStatusBar() { else color = _statusOnceColor; - _vm->_font->draw(SMALL_FONT_ID, backBuffer, _statusText, 0, _vm->getDisplayInfo().statusXOffset + (_vm->getDisplayInfo().statusWidth / 2) - (string_w / 2), + _vm->_font->draw(SMALL_FONT_ID, backBuffer, _statusText, 0, _vm->getDisplayInfo().statusXOffset + (_vm->getDisplayInfo().statusWidth - string_w) / 2, _vm->getDisplayInfo().statusYOffset + _vm->getDisplayInfo().statusTextY, color, 0, 0); if (_saveReminderState > 0) { @@ -995,35 +1414,51 @@ void Interface::setVerbState(int verb, int state) { draw(); } -void Interface::drawButtonBox(SURFACE *ds, const Rect& rect, bool slider, bool down) { +void Interface::drawButtonBox(SURFACE *ds, const Rect& rect, ButtonKind kind, bool down) { byte cornerColor; byte frameColor; byte fillColor; byte solidColor; byte odl, our, idl, iur; - if (slider) { - cornerColor = 0x8b; - frameColor = kITEColorBlack; - fillColor = kITEColorLightBlue96; - odl = kITEColorDarkBlue8a; - our = kITEColorLightBlue92; - idl = 0x89; - iur = 0x94; - solidColor = down ? kITEColorLightBlue94 : kITEColorLightBlue96; - } else { - cornerColor = 0x8b; - frameColor = kITEColorBlack; - solidColor = fillColor = kITEColorLightBlue96; - odl = kITEColorDarkBlue8a; - our = kITEColorLightBlue94; - idl = 0x97; - iur = 0x95; - if (down) { - SWAP(odl, our); - SWAP(idl, iur); - } - + switch (kind ) { + case( kSlider): + cornerColor = 0x8b; + frameColor = kITEColorBlack; + fillColor = kITEColorLightBlue96; + odl = kITEColorDarkBlue8a; + our = kITEColorLightBlue92; + idl = 0x89; + iur = 0x94; + solidColor = down ? kITEColorLightBlue94 : kITEColorLightBlue96; + break; + case( kEdit): + cornerColor = kITEColorLightBlue96; + frameColor = kITEColorLightBlue96; + fillColor = kITEColorLightBlue96; + our = kITEColorDarkBlue8a; + odl = kITEColorLightBlue94; + iur = 0x97; + idl = 0x95; + if (down) { + solidColor = kITEColorBlue; + } else { + solidColor = kITEColorDarkGrey0C; + } + break; + default: + cornerColor = 0x8b; + frameColor = kITEColorBlack; + solidColor = fillColor = kITEColorLightBlue96; + odl = kITEColorDarkBlue8a; + our = kITEColorLightBlue94; + idl = 0x97; + iur = 0x95; + if (down) { + SWAP(odl, our); + SWAP(idl, iur); + } + break; } int x = rect.left; @@ -1073,7 +1508,7 @@ void Interface::drawButtonBox(SURFACE *ds, const Rect& rect, bool slider, bool d ds->fillRect(fill, solidColor); } -void Interface::drawOptionPanelButtonText(SURFACE *ds, PanelButton *panelButton) { +void Interface::drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) { const char *text; int textId; int textWidth; @@ -1099,19 +1534,20 @@ void Interface::drawOptionPanelButtonText(SURFACE *ds, PanelButton *panelButton) textWidth = _vm->_font->getStringWidth(MEDIUM_FONT_ID, text, 0, 0); textHeight = _vm->_font->getHeight(MEDIUM_FONT_ID); - point.x = _optionPanel.x + panelButton->xOffset + (panelButton->width / 2) - (textWidth / 2); - point.y = _optionPanel.y + panelButton->yOffset + (panelButton->height / 2) - (textHeight / 2); + point.x = panel->x + panelButton->xOffset + (panelButton->width / 2) - (textWidth / 2); + point.y = panel->y + panelButton->yOffset + (panelButton->height / 2) - (textHeight / 2); - if (panelButton == _optionPanel.currentButton) { - textColor = _vm->getDisplayInfo().verbTextActiveColor; //TODO: create Option button colors constant + if (panelButton == panel->currentButton) { + textColor = _vm->getDisplayInfo().verbTextActiveColor; } else { - textColor = _vm->getDisplayInfo().verbTextColor; //TODO: create Option button colors constant + textColor = _vm->getDisplayInfo().verbTextColor; } - _optionPanel.calcPanelButtonRect(panelButton, rect); - drawButtonBox(ds, rect, false, panelButton->state > 0); + panel->calcPanelButtonRect(panelButton, rect); + drawButtonBox(ds, rect, kButton, panelButton->state > 0); - _vm->_font->draw(MEDIUM_FONT_ID, ds, text, 0, point.x , point.y, textColor, _vm->getDisplayInfo().verbTextShadowColor, FONT_SHADOW); //TODO: create Option button colors constant + _vm->_font->draw(MEDIUM_FONT_ID, ds, text, 0, point.x , point.y, + textColor, _vm->getDisplayInfo().verbTextShadowColor, FONT_SHADOW); } void Interface::drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton) { @@ -1149,7 +1585,7 @@ void Interface::drawVerbPanelText(SURFACE *ds, PanelButton *panelButton, int tex textWidth = _vm->_font->getStringWidth(SMALL_FONT_ID, text, 0, 0); - point.x = _mainPanel.x + panelButton->xOffset + (panelButton->width / 2) - (textWidth / 2); + point.x = _mainPanel.x + panelButton->xOffset + 1 + (panelButton->width - 1 - textWidth) / 2; point.y = _mainPanel.y + panelButton->yOffset + 1; _vm->_font->draw(SMALL_FONT_ID, ds, text, 0, point.x , point.y, textColor, textShadowColor, (textShadowColor != 0) ? FONT_SHADOW : 0); diff --git a/saga/interface.h b/saga/interface.h index 72c6805a2d..d9a914df16 100644 --- a/saga/interface.h +++ b/saga/interface.h @@ -58,7 +58,7 @@ enum PanelModes { kPanelNull, kPanelMain, kPanelOption, - kPanelTextBox, + kPanelSave, //ex- kPanelTextBox, kPanelQuit, kPanelError, kPanelLoad, @@ -83,13 +83,30 @@ struct InterfacePanel { PanelButton *buttons; SpriteList sprites; + InterfacePanel() { + x = y = 0; + image = NULL; + imageLength = 0; + imageWidth = imageHeight = 0; + currentButton = NULL; + buttonsCount = 0; + buttons = NULL; + } + PanelButton *getButton(int index) { if ((index >= 0) && (index < buttonsCount)) { return &buttons[index]; } return NULL; } - + + void getRect(Rect &rect) { + rect.left = x; + rect.right = rect.left + imageWidth; + rect.top = y; + rect.bottom = rect.top + imageHeight; + } + void calcPanelButtonRect(const PanelButton* panelButton, Rect &rect) { rect.left = x + panelButton->xOffset; rect.right = rect.left + panelButton->width; @@ -115,6 +132,14 @@ struct InterfacePanel { return NULL; } + void zeroAllButtonState() { + int i; + for (i = 0; i < buttonsCount; i++) { + buttons[i].state = 0; + } + } + + }; @@ -177,6 +202,9 @@ public: } void draw(); void drawOption(); + void drawQuit(); + void drawLoad(); + void drawSave(); void update(const Point& mousePoint, int updateFlag); void drawStatusBar(); void setVerbState(int verb, int state); @@ -230,17 +258,46 @@ private: void handleOptionUpdate(const Point& mousePoint); // option panel update void handleOptionClick(const Point& mousePoint); // option panel click + PanelButton *quitHitTest(const Point& mousePoint) { + return _quitPanel.hitTest(mousePoint, kPanelAllButtons); + } + void handleQuitUpdate(const Point& mousePoint); // quit panel update + void handleQuitClick(const Point& mousePoint); // quit panel click + + PanelButton *loadHitTest(const Point& mousePoint) { + return _loadPanel.hitTest(mousePoint, kPanelAllButtons); + } + void handleLoadUpdate(const Point& mousePoint); // load panel update + void handleLoadClick(const Point& mousePoint); // load panel click + + PanelButton *saveHitTest(const Point& mousePoint) { + return _savePanel.hitTest(mousePoint, kPanelAllButtons); + } + void handleSaveUpdate(const Point& mousePoint); // save panel update + void handleSaveClick(const Point& mousePoint); // save panel click + void lockMode() { _lockedMode = _panelMode; } void unlockMode() { _panelMode = _lockedMode; } void setOption(PanelButton *panelButton); - - void drawOptionPanelButtonText(SURFACE *ds, PanelButton *panelButton); - void drawButtonBox(SURFACE *ds, const Rect &rect, bool slider, bool down); + void setQuit(PanelButton *panelButton); + void setLoad(PanelButton *panelButton); + void setSave(PanelButton *panelButton); + + void drawTextInput(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton); + void drawPanelText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton); + void drawPanelButtonText(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton); + enum ButtonKind { + kButton, + kSlider, + kEdit + }; + void drawButtonBox(SURFACE *ds, const Rect &rect, ButtonKind kind, bool down); void drawPanelButtonArrow(SURFACE *ds, InterfacePanel *panel, PanelButton *panelButton); void drawVerbPanelText(SURFACE *ds, PanelButton *panelButton, int textColor, int textShadowColor); void drawVerbPanel(SURFACE *backBuffer, PanelButton* panelButton); void calcOptionSaveSlider(); + void processTextInput(uint16 ascii); public: void converseInit(void); void converseClear(void); @@ -275,6 +332,10 @@ private: InterfacePanel _optionPanel; PanelButton * _optionSaveFileSlider; PanelButton * _optionSaveFilePanel; + InterfacePanel _quitPanel; + InterfacePanel _loadPanel; + InterfacePanel _savePanel; + PanelButton * _saveEdit; int _saveReminderState; bool _active; @@ -311,7 +372,12 @@ private: Rect _optionSaveRectTop; Rect _optionSaveRectSlider; Rect _optionSaveRectBottom; - + + bool _textInput; + char _textInputString[SAVE_TITLE_SIZE]; + uint _textInputStringLength; + uint _textInputPos; + uint _textInputMaxWidth; }; } // End of namespace Saga diff --git a/saga/isomap.cpp b/saga/isomap.cpp index 88a13a6f45..0d9400568c 100644 --- a/saga/isomap.cpp +++ b/saga/isomap.cpp @@ -379,7 +379,7 @@ int16 IsoMap::findMulti(int16 tileIndex, int16 absU, int16 absV, int16 absH) { int IsoMap::draw(SURFACE *ds) { - Rect isoRect(_vm->getDisplayWidth(), _vm->getDisplayInfo().sceneHeight); + Rect isoRect(_vm->getDisplayWidth(), _vm->getClippedSceneHeight()); drawRect(ds, isoRect, 0); _tileClip = isoRect; drawTiles(ds, NULL); @@ -399,7 +399,7 @@ void IsoMap::drawSprite(SURFACE *ds, SpriteList &spriteList, int spriteNumber, c int yAlign; const byte *spriteBuffer; Point spritePointer; - Rect clip(_vm->getDisplayWidth(),_vm->getSceneHeight()); + Rect clip(_vm->getDisplayWidth(),_vm->getClippedSceneHeight()); _vm->_sprite->getScaledSpriteBuffer(spriteList,spriteNumber,scale, width, height, xAlign, yAlign, spriteBuffer); @@ -460,7 +460,7 @@ void IsoMap::drawTiles(SURFACE *ds, const Location *location) { metaTileY.y = (view1.y * 16 - fineScroll.y) - (u0 + v0) * 64; workAreaWidth = _vm->getDisplayWidth() + 128; - workAreaHeight = _vm->getDisplayInfo().sceneHeight + 128 + 80; + workAreaHeight = _vm->getSceneHeight() + 128 + 80; for (u1 = u0, v1 = v0; metaTileY.y < workAreaHeight; u1--, v1-- ) { metaTileX = metaTileY; diff --git a/saga/render.cpp b/saga/render.cpp index 6276402694..75559ace06 100644 --- a/saga/render.cpp +++ b/saga/render.cpp @@ -136,8 +136,21 @@ int Render::drawScene() { } } - if (_vm->_interface->getMode() == kPanelOption) { + if ((_vm->_interface->getMode() == kPanelOption) || + (_vm->_interface->getMode() == kPanelQuit) || + (_vm->_interface->getMode() == kPanelLoad) || + (_vm->_interface->getMode() == kPanelSave)) { _vm->_interface->drawOption(); + + if (_vm->_interface->getMode() == kPanelQuit) { + _vm->_interface->drawQuit(); + } + if (_vm->_interface->getMode() == kPanelLoad) { + _vm->_interface->drawLoad(); + } + if (_vm->_interface->getMode() == kPanelSave) { + _vm->_interface->drawSave(); + } } // Draw queued text strings diff --git a/saga/saga.cpp b/saga/saga.cpp index 4e18c25708..07fbc9cc87 100644 --- a/saga/saga.cpp +++ b/saga/saga.cpp @@ -62,7 +62,7 @@ static const GameSettings saga_games[] = { {0, 0, 0} }; -static const char *interfaceTextStrings[][39] = { +static const char *interfaceTextStrings[][42] = { { "Walk to", "Look At", "Pick Up", "Talk to", "Open", "Close", "Use", "Give", "Options", "Test", @@ -71,7 +71,8 @@ static const char *interfaceTextStrings[][39] = { "Game Options", "Reading Speed", "Music", "Sound", "Cancel", "Quit", "OK", "Mid", "Click", "10%", "20%", "30%", "40%", "50%", - "60%", "70%", "80%", "90%", "Max" + "60%", "70%", "80%", "90%", "Max", "Quit the Game?", "Load Successful!", + "Enter Save Game Name" }, // German { @@ -82,7 +83,8 @@ static const char *interfaceTextStrings[][39] = { "Spieleoptionen", "Lesegeschw.", "Musik", "Sound", "Abbr.", "Beenden", NULL, "M", "Klick", NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL + NULL, NULL, NULL, NULL, NULL, "Quit the Game?", "Load Successful!", + "Enter Save Game Name" } }; diff --git a/saga/saga.h b/saga/saga.h index 3e219f7bbd..1fe95c1da8 100644 --- a/saga/saga.h +++ b/saga/saga.h @@ -157,7 +157,16 @@ enum PanelButtonType { kPanelButtonOptionSaveFiles = 0x40, kPanelButtonOptionText = 0x80, - kPanelButtonReserved = 0x100, + kPanelButtonQuit = 0x100, + kPanelButtonQuitText = 0x200, + + kPanelButtonLoad = 0x400, + kPanelButtonLoadText = 0x800, + + kPanelButtonSave = 0x1000, + kPanelButtonSaveText = 0x2000, + kPanelButtonSaveEdit = 0x4000, + kPanelAllButtons = 0xFFFFF }; @@ -200,7 +209,10 @@ enum TextStringIds { kText70Percent, kText80Percent, kText90Percent, - kTextMax + kTextMax, + kTextQuitTheGameQuestion, + kTextLoadSuccessful, + kTextEnterSaveGameName }; struct IMAGE_HEADER { @@ -346,6 +358,7 @@ struct GameDisplayInfo { int pathStartY; int sceneHeight; + int clippedSceneHeight; int statusXOffset; int statusYOffset; @@ -400,16 +413,23 @@ struct GameDisplayInfo { int quitPanelXOffset; int quitPanelYOffset; + int quitPanelWidth; + int quitPanelHeight; int quitPanelButtonsCount; PanelButton *quitPanelButtons; int loadPanelXOffset; int loadPanelYOffset; + int loadPanelWidth; + int loadPanelHeight; int loadPanelButtonsCount; PanelButton *loadPanelButtons; + int saveEditIndex; int savePanelXOffset; int savePanelYOffset; + int savePanelWidth; + int savePanelHeight; int savePanelButtonsCount; PanelButton *savePanelButtons; }; @@ -612,7 +632,8 @@ public: int getDisplayWidth() const { return _gameDisplayInfo.logicalWidth; } int getDisplayHeight() const { return _gameDisplayInfo.logicalHeight;} - int getSceneHeight() const { return _gameDisplayInfo.sceneHeight; } + int getSceneHeight() const { return _gameDisplayInfo.sceneHeight; } + int getClippedSceneHeight() const { return _gameDisplayInfo.clippedSceneHeight; } const GameDisplayInfo & getDisplayInfo() { return _gameDisplayInfo; } const char *getTextString(int textStringId); |