diff options
author | Joseph-Eugene Winzer | 2017-08-18 13:40:42 +0200 |
---|---|---|
committer | Thierry Crozat | 2018-01-23 01:33:24 +0000 |
commit | c8e0f94fd14073a26bab359900854e4252efea97 (patch) | |
tree | d53e01edffd4d65aa4635a3b2bb9f4bec6877af6 /engines | |
parent | eabcca3e89d15ffb45c735919666cf1ae0ff7e18 (diff) | |
download | scummvm-rg350-c8e0f94fd14073a26bab359900854e4252efea97.tar.gz scummvm-rg350-c8e0f94fd14073a26bab359900854e4252efea97.tar.bz2 scummvm-rg350-c8e0f94fd14073a26bab359900854e4252efea97.zip |
SUPERNOVA: Fixes terminal in sleeping chamber
Instead of manipulating C-Strings edit() now takes a Common::String as a
parameter and the terminal input gets redrawn after every keystroke what
simplifies the function greatly.
Diffstat (limited to 'engines')
-rw-r--r-- | engines/supernova/rooms.cpp | 164 | ||||
-rw-r--r-- | engines/supernova/rooms.h | 1 | ||||
-rw-r--r-- | engines/supernova/state.cpp | 66 | ||||
-rw-r--r-- | engines/supernova/state.h | 2 |
4 files changed, 96 insertions, 137 deletions
diff --git a/engines/supernova/rooms.cpp b/engines/supernova/rooms.cpp index fa06075940..2904ca1015 100644 --- a/engines/supernova/rooms.cpp +++ b/engines/supernova/rooms.cpp @@ -95,11 +95,9 @@ bool ShipHall::interact(Action verb, Object &obj1, Object &obj2) { } bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) { - char input[31]; - static char codeword_DE[] = "ZWEIUNDVIERZIG"; - static char codeword_EN[] = "FORTYTWO"; - int32 l,*energy; - Room *r; + int32 *energy; + Room *room; + Common::String input; if (((verb == ACTION_LOOK) || (verb == ACTION_USE)) && (obj1._id == COMPUTER)) { _gm->_guiEnabled = false; @@ -125,68 +123,60 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) { _gm->getInput(); } else { _vm->renderText("Bitte Passwort eingeben:", 100, 85, kColorWhite99); - input[0] = 0; - do { - _gm->edit(input, 100, 105, 30); - } while ((_gm->_key.keycode != Common::KEYCODE_RETURN) && - (_gm->_key.keycode != Common::KEYCODE_ESCAPE)); - if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) { - goto escape; - } - for (int i = 0; i < 30; ++i) { - if ((input[i] >= 'a') && (input[i] <= 'z')) { - input[i] -= 'a' - 'A'; + _gm->edit(input, 100, 105, 30); + + input.toUppercase(); + if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) { + if (input == _codeword_DE) { + _gm->great(6); + g_system->fillScreen(kColorDarkBlue); + _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99); + uint daysSleep = 0; + do { + input.clear(); + _vm->renderBox(150, 85, 150, 8, kColorDarkBlue); + _gm->edit(input, 150, 85, 10); + + if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) { + break; + } else { + daysSleep = input.asUint64(); + for (uint i = 0; i < input.size(); i++) { + if (!Common::isDigit(input[i])) { + daysSleep = 0; + break; + } + } + } + if (daysSleep != 0) { + _gm->_state.timeSleep = daysSleep; + _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.", 30, 105, kColorWhite99); + _gm->wait2(18); + setSectionVisible(5, true); + } + } while (daysSleep == 0); + } else { + _vm->renderText("Falsches Passwort", 100, 125, kColorLightRed); + _gm->wait2(18); } } - if (strcmp(input,codeword_DE) != 0) { - _vm->renderText("Falsches Passwort", 100, 125, kColorLightRed); - _gm->wait2(18); - goto escape; - } - _gm->great(6); - _vm->renderBox(0, 0, 320, 200, kColorDarkBlue); - _vm->renderText("Schlafdauer in Tagen:", 30, 85, kColorWhite99); - do { - _vm->renderBox(150, 85, 150, 8, kColorDarkBlue); - input[0] = 0; - do { - _gm->edit(input, 150, 85, 10); - } while ((_gm->_key.keycode != Common::KEYCODE_RETURN) && - (_gm->_key.keycode != Common::KEYCODE_ESCAPE)); - if (_gm->_key.keycode == Common::KEYCODE_ESCAPE) { - goto escape; - } - l = atol(input); - for (uint i = 0; i < strlen(input); i++) { - if ((input[i] < '0') || (input[i] > '9')) { - l = 0; - } - } - } while (l == 0); - _gm->_state.timeSleep = l; - _vm->renderText("Bitte legen Sie sich in die angezeigte Schlafkammer.",30,105,kColorWhite99); - _gm->wait2(18); - setSectionVisible(5, true); } - escape: - _vm->renderRoom(*this); - _gm->showMenu(); - _gm->drawMapExits(); - _gm->palette(); + _gm->_guiEnabled = true; + input.clear(); } else if (((verb == ACTION_WALK) || (verb == ACTION_USE)) && ((obj1._id == CABINS) || (obj1._id == CABIN))) { - r = _gm->_rooms[AIRLOCK]; + room = _gm->_rooms[AIRLOCK]; if (!(obj1._id == CABIN) || !isSectionVisible(5)) { _vm->renderMessage("Es würde wenig bringen,|sich in eine Schlafkammer zu legen,|die nicht eingeschaltet ist."); - } else if (r->getObject(5)->hasProperty(WORN)) { + } else if (room->getObject(5)->hasProperty(WORN)) { _vm->renderMessage("Dazu mußt du erst den Raumanzug ausziehen."); } else { _vm->paletteFadeOut(); _gm->drawImage(_gm->invertSection(5)); _gm->drawImage(_gm->invertSection(4)); - r = _gm->_rooms[GENERATOR]; - if (r->isSectionVisible(9)) { + room = _gm->_rooms[GENERATOR]; + if (room->isSectionVisible(9)) { energy = &_gm->_state.landingModuleEnergy; } else { energy = &_gm->_state.shipEnergy; @@ -196,38 +186,38 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) { } if (_gm->_state.timeSleep >= *energy) { _gm->_state.timeSleep = *energy; - if (r->isSectionVisible(9)) { - r = _gm->_rooms[LANDINGMODULE]; // Monitors off - r->setSectionVisible(2, false); - r->setSectionVisible(7, false); - r->setSectionVisible(8, false); - r->setSectionVisible(9, false); - r->setSectionVisible(10, false); + if (room->isSectionVisible(9)) { + room = _gm->_rooms[LANDINGMODULE]; // Monitors off + room->setSectionVisible(2, false); + room->setSectionVisible(7, false); + room->setSectionVisible(8, false); + room->setSectionVisible(9, false); + room->setSectionVisible(10, false); } } if (_gm->_state.timeSleep == _gm->_state.time) { _gm->drawImage(3); - r = _gm->_rooms[COCKPIT]; - r->setSectionVisible(23, true); - r = _gm->_rooms[CABIN_R2]; - r->setSectionVisible(5, false); - r->setSectionVisible(6, true); - r->getObject(2)->_click = 10; - r = _gm->_rooms[HOLD]; - r->setSectionVisible(0, false); - r->setSectionVisible(1, true); - r->getObject(1)->_click = 255; - r->getObject(3)->_click = 255; - r = _gm->_rooms[GENERATOR]; - r->setSectionVisible(6, false); - r->setSectionVisible(7, true); - r->getObject(1)->_click = 14; - if (r->isSectionVisible(1)) { - r->setSectionVisible(10, true); + room = _gm->_rooms[COCKPIT]; + room->setSectionVisible(23, true); + room = _gm->_rooms[CABIN_R2]; + room->setSectionVisible(5, false); + room->setSectionVisible(6, true); + room->getObject(2)->_click = 10; + room = _gm->_rooms[HOLD]; + room->setSectionVisible(0, false); + room->setSectionVisible(1, true); + room->getObject(1)->_click = 255; + room->getObject(3)->_click = 255; + room = _gm->_rooms[GENERATOR]; + room->setSectionVisible(6, false); + room->setSectionVisible(7, true); + room->getObject(1)->_click = 14; + if (room->isSectionVisible(1)) { + room->setSectionVisible(10, true); } - if (r->isSectionVisible(12)) { - r->setSectionVisible(12, false); - r->setSectionVisible(11, true); + if (room->isSectionVisible(12)) { + room->setSectionVisible(12, false); + room->setSectionVisible(11, true); } } _gm->_state.time -= _gm->_state.timeSleep; @@ -237,8 +227,8 @@ bool ShipSleepCabin::interact(Action verb, Object &obj1, Object &obj2) { _gm->_state.alarmOn = (_gm->_state.timeAlarmSystem > _vm->getDOSTicks()); if (!*energy) { _gm->turnOff(); - r = _gm->_rooms[GENERATOR]; - r->setSectionVisible(4, r->isSectionVisible(2)); + room = _gm->_rooms[GENERATOR]; + room->setSectionVisible(4, room->isSectionVisible(2)); } if (_gm->_state.time == 0) { _gm->saveTime(); @@ -2407,8 +2397,7 @@ bool AxacussExit::interact(Action verb, Object &obj1, Object &obj2) { } bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) { - // TODO: use String for manipulation instead of raw char string? - char input[11]; + Common::String input; if ((verb == ACTION_CLOSE) && (obj1._id == DOOR) && obj1.hasProperty(OPENED)) { _gm->drawImage(_gm->invertSection(9)); @@ -2433,15 +2422,14 @@ bool AxacussOffice1::interact(Action verb, Object &obj1, Object &obj2) { !obj1.hasProperty(OPENED)) { _vm->renderMessage("Welche Zahlenkombination willst|du eingeben?"); _vm->renderBox(160, 70, 70, 10, kColorDarkBlue); - input[0] = 0; do _gm->edit(input, 161, 71, 10); while ((_gm->_key.keycode != Common::KEYCODE_ESCAPE) && (_gm->_key.keycode != Common::KEYCODE_RETURN)); _vm->removeMessage(); if (_gm->_key.keycode != Common::KEYCODE_ESCAPE) { - if (strcmp(input, "89814") != 0) { - if (strcmp(input, "41898") == 0) + if (!input.equals("89814")) { + if (input.equals("41898")) _vm->renderMessage("Hmm, das haut nicht ganz hin,|aber irgendwie muá die Zahl|mit dem Code zusammenhngen."); else _vm->renderMessage("Das war die falsche Kombination."); diff --git a/engines/supernova/rooms.h b/engines/supernova/rooms.h index 395a279c2e..ffaf605900 100644 --- a/engines/supernova/rooms.h +++ b/engines/supernova/rooms.h @@ -179,7 +179,6 @@ public: virtual void onEntrance(); private: - Common::String _input; Common::String _codeword_DE; Common::String _codeword_EN; }; diff --git a/engines/supernova/state.cpp b/engines/supernova/state.cpp index 26c9c91578..8a8a12dd67 100644 --- a/engines/supernova/state.cpp +++ b/engines/supernova/state.cpp @@ -902,98 +902,70 @@ void GameManager::animationOn() { _animationEnabled = true; } -void GameManager::edit(char *text, int x, int y, uint length) { - // TODO: DOES NOT WORK!!! -#define GET_STRING_CHAR(str, index) (index < str.size() ? str[index] : 0) - +void GameManager::edit(Common::String &input, int x, int y, uint length) { bool isEditing = true; - Common::String input(text); - int cursorPos = x + _vm->textWidth(text); - char cursorChar = 0; uint cursorIndex = input.size(); - int cursorCharWidth = 0; while (isEditing) { - cursorChar = GET_STRING_CHAR(input, cursorIndex); - _vm->_textCursorX = x; _vm->_textCursorY = y; _vm->_textColor = COL_EDIT; + _vm->renderBox(x, y - 1, 320 - x, 10, HGR_EDIT); for (uint i = 0; i < input.size(); ++i) { // Draw char highlight depending on cursor position - if (i == cursorIndex && cursorChar) { - cursorCharWidth = _vm->textWidth(cursorChar); - _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, COL_EDIT); -// _vm->renderBox(cursorPos + cursorCharWidth, y - 1, _vm->textWidth(cursor + 1) + 6, 9, HGR_EDIT); - _vm->renderText(cursorChar, cursorPos, y, HGR_EDIT); + if (i == cursorIndex) { + _vm->renderBox(_vm->_textCursorX, y - 1, _vm->textWidth(input[i]), 9, COL_EDIT); + _vm->_textColor = HGR_EDIT; + _vm->renderText(input[i]); _vm->_textColor = COL_EDIT; } else { _vm->renderText(input[i]); } } if (cursorIndex == input.size()) { - _vm->renderBox(cursorPos, y - 1, 1, 9, COL_EDIT); - _vm->renderBox(cursorPos + 1, y - 1, 6, 9, HGR_EDIT); + _vm->renderBox(_vm->_textCursorX + 1, y - 1, 6, 9, HGR_EDIT); + _vm->renderBox(_vm->_textCursorX , y - 1, 1, 9, COL_EDIT); } getKeyInput(true); switch (_key.keycode) { case Common::KEYCODE_RETURN: case Common::KEYCODE_ESCAPE: + isEditing = false; + break; case Common::KEYCODE_UP: case Common::KEYCODE_DOWN: - cursorChar = GET_STRING_CHAR(input, cursorIndex); - if (cursorChar) { - cursorCharWidth = _vm->textWidth(cursorChar); - } else { - cursorCharWidth = 1; - } - _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, HGR_EDIT); - _vm->renderText(cursorPos, y, cursorChar, COL_EDIT); - return; + cursorIndex = input.size(); + break; case Common::KEYCODE_LEFT: if (cursorIndex != 0) { --cursorIndex; - cursorChar = GET_STRING_CHAR(input, cursorIndex); - cursorPos -= _vm->textWidth(cursorChar); } - break; + break; case Common::KEYCODE_RIGHT: if (cursorIndex != input.size()) { - cursorChar = GET_STRING_CHAR(input, cursorIndex); - cursorCharWidth = _vm->textWidth(cursorChar); - _vm->renderBox(cursorPos, y - 1, cursorCharWidth, 9, HGR_EDIT); - _vm->renderText(cursorChar, cursorPos, y, COL_EDIT); ++cursorIndex; - cursorPos += cursorCharWidth; } - break; + break; case Common::KEYCODE_DELETE: if (cursorIndex != input.size()) { input.deleteChar(cursorIndex); } - break; + break; case Common::KEYCODE_BACKSPACE: if (cursorIndex != 0) { --cursorIndex; input.deleteChar(cursorIndex); } - break; + break; default: if (Common::isPrint(_key.ascii) && input.size() < length) { - int charWidth = _vm->textWidth(_key.ascii); input.insertChar(_key.ascii, cursorIndex); ++cursorIndex; - cursorPos += charWidth; } - break; + break; } } - - _vm->renderBox(x, y - 1, 320 - x, 10, HGR_EDIT); - Common::copy(input.begin(), input.end(), text); - -#undef GET_STRING_CHAR } void GameManager::loadOverlayStart() { @@ -1123,6 +1095,7 @@ bool GameManager::isHelmetOff() { bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { Room *r; char t[150]; + Common::String input; if ((verb == ACTION_USE) && (obj1._id == SCHNUCK)) { if (isHelmetOff()) { @@ -1208,10 +1181,9 @@ bool GameManager::genericInteract(Action verb, Object &obj1, Object &obj2) { _vm->renderBox(88, 87, 144, 24, kColorWhite35); _vm->renderText("Neue Alarmzeit (hh:mm) :", 91, 90, kColorWhite99); do { - t[0] = 0; _vm->renderBox(91, 99, 138, 9, kColorDarkBlue); do { - edit(t, 91, 100, 5); + edit(input, 91, 100, 5); } while ((_key.keycode != Common::KEYCODE_RETURN) && (_key.keycode != Common::KEYCODE_ESCAPE)); f = false; diff --git a/engines/supernova/state.h b/engines/supernova/state.h index 69f7d51b63..4ab3cf12b6 100644 --- a/engines/supernova/state.h +++ b/engines/supernova/state.h @@ -167,7 +167,7 @@ public: void loadOverlayStart(); void openLocker(const Room *room, Object *obj, Object *lock, int section); void closeLocker(const Room *room, Object *obj, Object *lock, int section); - void edit(char *text, int x, int y, uint length); + void edit(Common::String &input, int x, int y, uint length); int invertSection(int section); void drawMapExits(); void drawStatus(); |