aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorathrxx2011-07-01 00:43:37 +0200
committerJohannes Schickel2011-12-26 16:18:12 +0100
commitc53589bcda2875154b2590f264838b1be728d1f3 (patch)
treec0f3b5ac43b39f6252bc9b99273e89333222afdd
parent76bfcf834d73a9578164842ed5ab8e1eff2814e8 (diff)
downloadscummvm-rg350-c53589bcda2875154b2590f264838b1be728d1f3.tar.gz
scummvm-rg350-c53589bcda2875154b2590f264838b1be728d1f3.tar.bz2
scummvm-rg350-c53589bcda2875154b2590f264838b1be728d1f3.zip
KYRA: (EOB) - implement load menu
(only 6 slots supported for now)
-rw-r--r--engines/kyra/eobcommon.cpp8
-rw-r--r--engines/kyra/eobcommon.h5
-rw-r--r--engines/kyra/gui.cpp8
-rw-r--r--engines/kyra/gui_eob.cpp248
-rw-r--r--engines/kyra/gui_eob.h10
-rw-r--r--engines/kyra/saveload_eob.cpp6
-rw-r--r--engines/kyra/sequences_eob2.cpp6
-rw-r--r--engines/kyra/staticres_eob.cpp17
8 files changed, 288 insertions, 20 deletions
diff --git a/engines/kyra/eobcommon.cpp b/engines/kyra/eobcommon.cpp
index 0cc2f5ab75..2d5c4e61c3 100644
--- a/engines/kyra/eobcommon.cpp
+++ b/engines/kyra/eobcommon.cpp
@@ -359,8 +359,11 @@ Common::Error EobCoreEngine::go() {
if (action == -1) {
// load game
- _saveLoadMode = -1;
- startupLoad();
+ repeatLoop = _gui->runLoadMenu(72, 14);
+ if (repeatLoop && !shouldQuit()) {
+ _saveLoadMode = -1;
+ startupLoad();
+ }
} else if (action == -2) {
// new game
repeatLoop = startCharacterGeneration();
@@ -368,6 +371,7 @@ Common::Error EobCoreEngine::go() {
startupNew();
} else if (action == -3) {
// transfer party
+ repeatLoop = false;
}
}
diff --git a/engines/kyra/eobcommon.h b/engines/kyra/eobcommon.h
index 0f9210ee5e..eae03ac221 100644
--- a/engines/kyra/eobcommon.h
+++ b/engines/kyra/eobcommon.h
@@ -786,7 +786,9 @@ protected:
void releaseMonsterTempData(LevelTempData *tmp);
int _saveLoadMode;
-
+
+ const char * const *_saveLoadStrings;
+
Screen_Eob *_screen;
GUI_Eob *_gui;
@@ -999,6 +1001,7 @@ protected:
const char *const *_menuStringsRest3;
const char *const *_menuStringsRest4;
const char *const *_menuStringsDefeat;
+ const char *_errorSlotEmptyString;
const char *const *_menuStringsTransfer;
const char *const *_menuStringsSpec;
diff --git a/engines/kyra/gui.cpp b/engines/kyra/gui.cpp
index 47461637b1..d03fa23d5a 100644
--- a/engines/kyra/gui.cpp
+++ b/engines/kyra/gui.cpp
@@ -109,7 +109,12 @@ void GUI::updateSavegameList() {
_savegameListSize = _saveSlots.size();
if (_savegameListSize) {
- Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater<int>());
+ if (_vm->game() == GI_EOB1 || _vm->game() == GI_EOB2) {
+ Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Less<int>());
+ _savegameListSize = _saveSlots.back() + 1;
+ } else {
+ Common::sort(_saveSlots.begin(), _saveSlots.end(), Common::Greater<int>());
+ }
KyraEngine_v1::SaveHeader header;
Common::InSaveFile *in;
@@ -125,7 +130,6 @@ void GUI::updateSavegameList() {
delete in;
} else {
_savegameList[i] = 0;
- error("GUI::updateSavegameList(): Unexpected missing save file for slot: %d.", i);
}
}
diff --git a/engines/kyra/gui_eob.cpp b/engines/kyra/gui_eob.cpp
index 6eab4a0083..4eb2497539 100644
--- a/engines/kyra/gui_eob.cpp
+++ b/engines/kyra/gui_eob.cpp
@@ -1435,6 +1435,15 @@ GUI_Eob::GUI_Eob(EobCoreEngine *vm) : GUI(vm), _vm(vm), _screen(vm->_screen) {
_menuStringsPrefsTemp = new char*[4];
memset(_menuStringsPrefsTemp, 0, 4 * sizeof(char*));
+ _saveSlotStringsTemp = new char*[6];
+ for (int i = 0; i < 6; i++) {
+ _saveSlotStringsTemp[i] = new char[20];
+ memset(_saveSlotStringsTemp[i], 0, 20);
+ }
+ _saveSlotIdTemp = new int16[6];
+ _savegameOffset = 0;
+ _saveSlotX = _saveSlotY = 0;
+
_specialProcessButton = _backupButtonList = 0;
_flagsMouseLeft = _flagsMouseRight = _flagsModifier = 0;
_backupButtonList = 0;
@@ -1469,6 +1478,14 @@ GUI_Eob::~GUI_Eob() {
delete[] _menuStringsPrefsTemp;
}
+ if (_saveSlotStringsTemp) {
+ for (int i = 0; i < 6; i++)
+ delete[] _saveSlotStringsTemp[i];
+ delete[] _saveSlotStringsTemp;
+ }
+
+ delete[] _saveSlotIdTemp;
+
delete[] _numAssignedSpellsOfType;
}
@@ -2285,11 +2302,9 @@ void GUI_Eob::runCampMenu() {
}
}
+ _screen->setFont(of);
releaseButtons(buttonList);
-
_vm->writeSettings();
-
- _screen->setFont(of);
}
bool GUI_Eob::runLoadMenu(int x, int y) {
@@ -2299,13 +2314,27 @@ bool GUI_Eob::runLoadMenu(int x, int y) {
bool result = false;
_savegameListUpdateNeeded = true;
- _screen->modifyScreenDim(11, dm->sx + (x >> 8), dm->sy + y, dm->w, dm->sy);
+ _screen->modifyScreenDim(11, dm->sx + (x >> 3), dm->sy + y, dm->w, dm->h);
updateSavegameList();
- setupSaveMenuSlots();
- _screen->modifyScreenDim(11, xo, yo, dm->w, dm->sy);
+ for (bool runLoop = true; runLoop; ) {
+ int slot = selectSaveSlotDialogue(x, y, 1);
+ if (slot > 5) {
+ runLoop = result = false;
+ } else if (slot >= 0) {
+ if (_saveSlotIdTemp[slot] == -1) {
+ messageDialogue(11, 65, 6);
+ } else {
+ if (_vm->loadGameState(_saveSlotIdTemp[slot]).getCode() != Common::kNoError)
+ messageDialogue(11, 16, 6);
+ runLoop = false;
+ result = true;
+ }
+ }
+ }
+ _screen->modifyScreenDim(11, xo, yo, dm->w, dm->h);
return result;
}
@@ -2479,7 +2508,95 @@ void GUI_Eob::simpleMenu_initMenuItemsMask(int menuId, int maxItem, int32 menuIt
}
bool GUI_Eob::runSaveMenu(int x, int y) {
- return true;
+ const ScreenDim *dm = _screen->getScreenDim(11);
+ int xo = dm->sx;
+ int yo = dm->sy;
+ bool result = false;
+ _savegameListUpdateNeeded = true;
+
+ _screen->modifyScreenDim(11, dm->sx + (x >> 3), dm->sy + y, dm->w, dm->h);
+
+ updateSavegameList();
+
+ /*for (bool runLoop = true; runLoop; ) {
+ int slot = selectSaveSlotDialogue(x, y, 1);
+ if (slot > 5) {
+ runLoop = result = false;
+ } else if (slot >= 0) {
+ if (_saveSlotIdTemp[slot] == -1) {
+ messageDialogue(11, 65, 6);
+ } else {
+ if (_vm->loadGameState(_saveSlotIdTemp[slot]).getCode() != Common::kNoError)
+ messageDialogue(11, 16, 6);
+ runLoop = false;
+ result = true;
+ }
+ }
+ }*/
+
+ _screen->modifyScreenDim(11, xo, yo, dm->w, dm->h);
+ return result;
+}
+
+int GUI_Eob::selectSaveSlotDialogue(int x, int y, int id) {
+ assert (id < 2);
+
+ _saveSlotX = _saveSlotY = 0;
+ _screen->setCurPage(2);
+
+ setupSaveMenuSlots();
+ drawMenuButtonBox(0, 0, 176, 144, false, false);
+ _screen->printShadedText(_vm->_saveLoadStrings[2 + id], 52, 5, 15, 0);
+
+ for (int i = 0; i < 7; i++)
+ drawSaveSlotButton(i, 1, 15);
+
+ _screen->copyRegion(0, 0, x, y, 176, 144, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->setCurPage(0);
+ _screen->updateScreen();
+
+ _saveSlotX = x;
+ _saveSlotY = y;
+ int lastHighlight = -1;
+ int newHighlight = 0;
+ int slot = -1;
+
+ for (bool runLoop = true; runLoop && !_vm->shouldQuit(); ) {
+ int inputFlag = _vm->checkInput(0, false, 0) & 0x8ff;
+ _vm->removeInputTop();
+
+ if (inputFlag == _vm->_keyMap[Common::KEYCODE_SPACE] || inputFlag == _vm->_keyMap[Common::KEYCODE_RETURN]) {
+ runLoop = false;
+ } else if (inputFlag == _vm->_keyMap[Common::KEYCODE_DOWN] || inputFlag == _vm->_keyMap[Common::KEYCODE_KP2]) {
+ if (++newHighlight > 6)
+ newHighlight = 0;
+ } else if (inputFlag == _vm->_keyMap[Common::KEYCODE_UP] || inputFlag == _vm->_keyMap[Common::KEYCODE_KP8]) {
+ if (--newHighlight < 0)
+ newHighlight = 6;
+ } else {
+ slot = getHighlightSlot();
+ if (slot != -1) {
+ newHighlight = slot;
+ if (inputFlag == 199)
+ runLoop = false;
+ }
+ }
+
+ if (lastHighlight != newHighlight) {
+ drawSaveSlotButton(lastHighlight, 0, 15);
+ drawSaveSlotButton(newHighlight, 0, 6);
+ _screen->updateScreen();
+ lastHighlight = newHighlight;
+ }
+ }
+
+ drawSaveSlotButton(newHighlight, 2, 6);
+ _screen->updateScreen();
+ _vm->_system->delayMillis(80);
+ drawSaveSlotButton(newHighlight, 1, 6);
+ _screen->updateScreen();
+
+ return newHighlight;
}
void GUI_Eob::runMemorizePrayMenu(int charIndex, int spellType) {
@@ -2674,7 +2791,7 @@ void GUI_Eob::runMemorizePrayMenu(int charIndex, int spellType) {
updateDesc = true;
}
- } else if (inputFlag == _vm->_keyMap[Common::KEYCODE_KP_MINUS] || inputFlag == _vm->_keyMap[Common::KEYCODE_MINUS] /*|| inputFlag == _vm->_keyMap[Common::KEYCODE_*/) {
+ } else if (inputFlag == _vm->_keyMap[Common::KEYCODE_KP_MINUS] || inputFlag == _vm->_keyMap[Common::KEYCODE_MINUS]) {
if (np[lastHighLightButton] && _numAssignedSpellsOfType[menuSpellMap[lastHighLightButton * 11 + lastHighLightText + 1] * 2 - 2]) {
_numAssignedSpellsOfType[menuSpellMap[lastHighLightButton * 11 + lastHighLightText + 1] * 2 - 2]--;
numAssignedSpellsPerBookPage[lastHighLightButton]--;
@@ -2826,6 +2943,47 @@ bool GUI_Eob::confirmDialogue(int id) {
return result;
}
+void GUI_Eob::messageDialogue(int dim, int id, int buttonTextCol) {
+ static const char buttonText[] = "OK";
+
+ int od = _screen->curDimIndex();
+ _screen->setScreenDim(dim);
+ Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
+
+ drawTextBox(dim, id);
+ const ScreenDim *dm = _screen->getScreenDim(dim);
+
+ int bx = ((dm->sx + dm->w) << 3) - ((strlen(buttonText) << 3) + 16);
+ int by = dm->sy + dm->h - 19;
+ int bw = (strlen(buttonText) << 3) + 7;
+
+ drawMenuButtonBox(bx, by, bw, 14, false, false);
+ _screen->printShadedText(buttonText, bx + 4, by + 3, buttonTextCol, 0);
+ _screen->updateScreen();
+
+ for (bool runLoop = true; runLoop && !_vm->shouldQuit(); ) {
+ int inputFlag = _vm->checkInput(0, false, 0) & 0x8ff;
+ _vm->removeInputTop();
+
+ if (inputFlag == 199 || inputFlag == 201) {
+ Common::Point p = _vm->getMousePos();
+ if (_vm->posWithinRect(p.x, p.y, bx, by, bx + bw, by + 14))
+ runLoop = false;
+ } else if (inputFlag == _vm->_keyMap[Common::KEYCODE_SPACE] || inputFlag == _vm->_keyMap[Common::KEYCODE_RETURN] || inputFlag == _vm->_keyMap[Common::KEYCODE_o]) {
+ runLoop = false;
+ }
+ }
+
+ drawMenuButtonBox(bx, by, bw, 14, true, true);
+ _screen->updateScreen();
+ _vm->_system->delayMillis(80);
+ drawMenuButtonBox(bx, by, bw, 14, false, true);
+ _screen->updateScreen();
+
+ _screen->setScreenDim(od);
+ _screen->setFont(of);
+}
+
int GUI_Eob::selectCharacterDialogue(int id) {
uint8 flags = (id == 26) ? 0x14 : 0x02;
_vm->removeInputTop();
@@ -3084,6 +3242,48 @@ void GUI_Eob::drawMenuButtonBox(int x, int y, int w, int h, bool clicked, bool n
_vm->gui_drawBox(x + 1, y + 1, w - 2, h - 2, _vm->_color1_1, _vm->_color2_1, noFill ? -1 : _vm->_bkgColor_1);
}
+void GUI_Eob::drawTextBox(int dim, int id) {
+ int od = _screen->curDimIndex();
+ _screen->setScreenDim(dim);
+ const ScreenDim *dm = _screen->getScreenDim(dim);
+ Screen::FontId of = _screen->setFont(Screen::FID_8_FNT);
+
+ if (dm->w <= 22 && dm->h <= 84)
+ _screen->copyRegion(dm->sx << 3, dm->sy, 0, dm->h, dm->w << 3, dm->h, 0, 2, Screen::CR_NO_P_CHECK);
+
+ _screen->setCurPage(2);
+
+ drawMenuButtonBox(0, 0, dm->w << 3, dm->h, false, false);
+ _screen->printShadedText(getMenuString(id), 5, 5, 15, 0);
+
+ _screen->setCurPage(0);
+ _screen->copyRegion(0, 0, dm->sx << 3, dm->sy, dm->w << 3, dm->h, 2, 0, Screen::CR_NO_P_CHECK);
+ _screen->updateScreen();
+ _screen->setScreenDim(od);
+ _screen->setFont(of);
+}
+
+void GUI_Eob::drawSaveSlotButton(int slot, int redrawBox, int textCol) {
+ if (slot < 0)
+ return;
+
+ int x = _saveSlotX + 4;
+ int y = _saveSlotY + slot * 17 + 20;
+ int w = 167;
+ const char *s = (slot < 6) ?_saveSlotStringsTemp[slot] : _vm->_saveLoadStrings[0];
+
+ if (slot >= 6 ) {
+ x = _saveSlotX + 118;
+ y = _saveSlotY + 126;
+ w = 53;
+ }
+
+ if (redrawBox)
+ drawMenuButtonBox(x, y, w, 14, (redrawBox - 1) ? true : false, false);
+
+ _screen->printShadedText(s, x + 4, y + 3, textCol, 0);
+}
+
void GUI_Eob::memorizePrayMenuPrintString(int spellId, int bookPageIndex, int spellType, bool noFill, bool highLight) {
if (bookPageIndex < 0)
return;
@@ -3121,6 +3321,10 @@ const char *GUI_Eob::getMenuString(int id) {
return _vm->_menuStringsTransfer[id - 69];
else if (id >= 67)
return _vm->_menuStringsDefeat[id - 67];
+ else if (id == 66)
+ return _vm->_errorSlotEmptyString;
+ else if (id == 65)
+ return _vm->_errorSlotEmptyString;
else if (id >= 63)
return _vm->_menuStringsSpec[id - 63];
else if (id >= 60)
@@ -3181,7 +3385,35 @@ void GUI_Eob::releaseButtons(Button *list) {
}
void GUI_Eob::setupSaveMenuSlots() {
+ for (int i = 0; i < 6; ++i) {
+ if (_savegameOffset + i < _savegameListSize) {
+ if (_savegameList[i + _savegameOffset]) {
+ Common::strlcpy(_saveSlotStringsTemp[i], _savegameList[i + _savegameOffset], 20);
+ _saveSlotIdTemp[i] = i + _savegameOffset;
+ continue;
+ }
+ }
+ Common::strlcpy(_saveSlotStringsTemp[i], _vm->_saveLoadStrings[1], 20);
+ _saveSlotIdTemp[i] = -1;
+ }
+}
+
+int GUI_Eob::getHighlightSlot() {
+ int res = -1;
+ Common::Point p = _vm->getMousePos();
+
+ for (int i = 0; i < 6; i++) {
+ int y = _saveSlotY + i * 17 + 20;
+ if (_vm->posWithinRect(p.x, p.y, _saveSlotX + 4, y, _saveSlotX + 167, y + 14)) {
+ res = i;
+ break;
+ }
+ }
+
+ if (_vm->posWithinRect(p.x, p.y, _saveSlotX + 118, _saveSlotY + 126, _saveSlotX + 171, _saveSlotY + 140))
+ res = 6;
+ return res;
}
#endif // ENABLE_EOB
diff --git a/engines/kyra/gui_eob.h b/engines/kyra/gui_eob.h
index c8e9744152..f866c9e341 100644
--- a/engines/kyra/gui_eob.h
+++ b/engines/kyra/gui_eob.h
@@ -79,16 +79,20 @@ private:
void simpleMenu_initMenuItemsMask(int menuId, int maxItem, int32 menuItemsMask, int unk);
bool runSaveMenu(int x, int y);
+ int selectSaveSlotDialogue(int x, int y, int id);
void runMemorizePrayMenu(int charIndex, int spellType);
void scribeScrollDialogue();
bool confirmDialogue(int id);
+ void messageDialogue(int dim, int id, int buttonTextCol);
int selectCharacterDialogue(int id);
void displayTextBox(int id);
Button *initMenu(int id);
void drawMenuButton(Button *b, bool clicked, bool highlight, bool noFill);
void drawMenuButtonBox(int x, int y, int w, int h, bool clicked, bool noFill);
+ void drawTextBox(int dim, int id);
+ void drawSaveSlotButton(int slot, int redrawBox, int textCol);
void memorizePrayMenuPrintString(int spellId, int bookPageIndex, int spellType, bool noFill, bool highLight);
void updateOptionsStrings();
const char *getMenuString(int id);
@@ -97,11 +101,17 @@ private:
void releaseButtons(Button *list);
void setupSaveMenuSlots();
+ int getHighlightSlot();
Button _scrollUpButton;//////////////////77
Button _scrollDownButton;
char **_menuStringsPrefsTemp;
+ char **_saveSlotStringsTemp;
+ int16 *_saveSlotIdTemp;
+ int _savegameOffset;
+ int16 _saveSlotX;
+ int16 _saveSlotY;
EobCoreEngine *_vm;
Screen_Eob *_screen;
diff --git a/engines/kyra/saveload_eob.cpp b/engines/kyra/saveload_eob.cpp
index 497be6fdce..72bebf997b 100644
--- a/engines/kyra/saveload_eob.cpp
+++ b/engines/kyra/saveload_eob.cpp
@@ -145,10 +145,8 @@ Common::Error EobCoreEngine::loadGameState(int slot) {
SaveHeader header;
Common::InSaveFile *saveFile = openSaveForReading(fileName, header);
- if (!saveFile) {
- //_txt->printMessage(2, "%s", getLangString(0x425d));
- return Common::kNoError;
- }
+ if (!saveFile)
+ return Common::Error(Common::kReadingFailed);
Common::SeekableSubReadStreamEndian in(saveFile, saveFile->pos(), saveFile->size(), !header.originalSave, DisposeAfterUse::YES);
diff --git a/engines/kyra/sequences_eob2.cpp b/engines/kyra/sequences_eob2.cpp
index 3765ee3d92..1cc4585e1c 100644
--- a/engines/kyra/sequences_eob2.cpp
+++ b/engines/kyra/sequences_eob2.cpp
@@ -131,7 +131,7 @@ int DarkMoonEngine::mainMenu() {
case 3:
// transfer party
- seq_playFinale();
+ //seq_playFinale();
menuChoice = -3;
break;
@@ -1030,7 +1030,7 @@ void DarkmoonSequenceHelper::runSequence(int index, int del) {
break;
case 1:
- // draw shape, then restore beackground
+ // draw shape, then restore background
shapeW = _shapes[s->obj][2];
shapeH = _shapes[s->obj][3];
@@ -1107,7 +1107,7 @@ void DarkmoonSequenceHelper::runSequence(int index, int del) {
break;
case 5:
- // copyregion
+ // copy region
if (_mode == DarkmoonSequenceHelper::kFinale && s->pal)
setPaletteWithoutTextColor(palIndex);
diff --git a/engines/kyra/staticres_eob.cpp b/engines/kyra/staticres_eob.cpp
index 6800a13da3..6cc7606a21 100644
--- a/engines/kyra/staticres_eob.cpp
+++ b/engines/kyra/staticres_eob.cpp
@@ -506,6 +506,23 @@ void EobCoreEngine::initStaticResource() {
_sparkEffectOfX = _staticres->loadRawData(kEobBaseSparkOfX, temp);
_sparkEffectOfY = _staticres->loadRawData(kEobBaseSparkOfY, temp);
_magicFlightObjectProperties = _staticres->loadRawData(kEobBaseMagicFlightProps, temp);
+
+ // Hard code these strings, since EOB 1 doesn't have them in the original
+ // (because there is only one single save slot)
+ static const char *saveLoadStrings[3][4] = {
+ { "Cancel", "Empty Slot", "Save Game", "Load Game" },
+ { "Abbr.", "Leerer Slot", "Speichern", " Laden" },
+ { 0, 0, 0, 0 }
+ };
+
+ static const char *errorSlotEmptyString[3] = {
+ "There is no game\rsaved in that slot!",
+ "Hier ist noch kein\rSpiel gespeichert!",
+ 0
+ };
+
+ _saveLoadStrings = saveLoadStrings[(_flags.lang == Common::EN_ANY) ? 0 : ((_flags.lang == Common::DE_DEU) ? 1 : 2)];
+ _errorSlotEmptyString = errorSlotEmptyString[(_flags.lang == Common::EN_ANY) ? 0 : ((_flags.lang == Common::DE_DEU) ? 1 : 2)];
}
void EobCoreEngine::initButtonData() {