Fix load/save interface in Elvira 1.

svn-id: r27191
This commit is contained in:
Travis Howell 2007-06-08 07:50:28 +00:00
parent 067f43a212
commit fff80bc489
5 changed files with 319 additions and 138 deletions

View file

@ -1054,9 +1054,10 @@ public:
int16 levelOf(Item *item);
int16 moreText(Item *i);
void lobjFunc(Item *i, const char *f);
uint confirmQuit();
uint confirmYesOrNo(uint16 x, uint16 y);
uint continueOrQuit();
void printScroll();
virtual void printStats();
void synchChain(Item *i);
protected:
@ -1211,10 +1212,10 @@ protected:
virtual void vcStopAnimation(uint zone, uint sprite);
bool confirmOverWrite(WindowBlock *window);
int16 matchSaveGame(const char *name, uint16 max);
void disableFileBoxes();
virtual void listSaveGames(char *dst);
virtual void userGame(bool load);
virtual int userGameGetKey(bool *b, char *buf, uint maxChar);
void userGameBackSpace(WindowBlock *window, int x, byte b = 0);
void fileError(WindowBlock *window, bool save_error);
@ -1282,8 +1283,6 @@ public:
void oe1_bitSet();
void oe1_bitTest();
void oe1_zoneDisk();
void oe1_saveUserGame();
void oe1_loadUserGame();
void oe1_printStats();
void oe1_stopTune();
void oe1_printPlayerDamage();
@ -1355,6 +1354,7 @@ public:
void oe2_b2Zero();
void oe2_b2NotZero();
virtual void printStats();
protected:
typedef void (AGOSEngine_Elvira2::*OpcodeProcElvira2) ();
struct OpcodeEntryElvira2 {
@ -1378,6 +1378,10 @@ protected:
uint16 getExitState(Item *item, uint16 x, uint16 d);
void setExitState(Item *i, uint16 n, uint16 d, uint16 s);
void setSRExit(Item *i, int n, int d, uint16 s);
virtual void listSaveGames(char *dst);
virtual void userGame(bool load);
virtual int userGameGetKey(bool *b, char *buf, uint maxChar);
};
class AGOSEngine_Waxworks : public AGOSEngine_Elvira2 {

View file

@ -465,6 +465,7 @@ void AGOSEngine::delay(uint amount) {
if (_saveLoadSlot == 0)
_saveLoadSlot = 10;
memset(_saveLoadName, 0, sizeof(_saveLoadName));
sprintf(_saveLoadName, "Quick %d", _saveLoadSlot);
_saveLoadType = (event.kbd.flags == Common::KBD_ALT) ? 1 : 2;

View file

@ -109,7 +109,7 @@ void AGOSEngine::quickLoadOrSave() {
setBitFlag(7, false);
sub = getSubroutineByID(19);
startSubroutine(sub);
//oe2_printStats();
printStats();
sub = getSubroutineByID(28);
startSubroutine(sub);
setBitFlag(17, false);
@ -146,7 +146,168 @@ void AGOSEngine::quickLoadOrSave() {
_saveLoadType = 0;
}
void AGOSEngine::listSaveGames(char *dst) {
bool AGOSEngine::confirmOverWrite(WindowBlock *window) {
if (getGameType() == GType_WW) {
Subroutine *sub = getSubroutineByID(80);
if (sub != NULL)
startSubroutineEx(sub);
if (_variableArray[253] == 0)
return true;
} else if (getGameType() == GType_ELVIRA2) {
// Original verison never confirmed
return true;
} else if (getGameType() == GType_ELVIRA1) {
const char *message1, *message2, *message3;
switch (_language) {
case Common::FR_FRA:
message1 = "\rFichier d/j; existant.\r\r";
message2 = " Ecrire pardessus ?\r\r";
message3 = " Oui Non";
break;
case Common::DE_DEU:
message1 = "\rDatei existiert bereits.\r\r";
message2 = " berschreiben ?\r\r";
message3 = " Ja Nein";
break;
default:
message1 = "\r File already exists.\r\r";
message2 = " Overwrite it ?\r\r";
message3 = " Yes No";
break;
}
printScroll();
window->textColumn = 0;
window->textRow = 0;
window->textColumnOffset = 0;
window->textLength = 0; // Difference
for (; *message1; message1++)
windowPutChar(window, *message1);
for (; *message2; message2++)
windowPutChar(window, *message2);
for (; *message3; message3++)
windowPutChar(window, *message3);
if (confirmYesOrNo(120, 78) == 0x7FFF)
return true;
}
return false;
}
int16 AGOSEngine::matchSaveGame(const char *name, uint16 max) {
Common::InSaveFile *in;
char dst[8];
uint16 slot;
for (slot = 0; slot < max; slot++) {
if ((in = _saveFileMan->openForLoading(genSaveName(slot)))) {
in->read(dst, 8);
delete in;
if (!scumm_stricmp(name, dst)) {
return slot;
}
}
}
return -1;
}
void AGOSEngine::userGame(bool load) {
WindowBlock *window = _windowArray[4];
const char *message1;
int i, numSaveGames;
char *name;
char buf[8];
numSaveGames = countSaveGames();
time_t saveTime = time(NULL);
haltAnimation();
restart:
printScroll();
window->textColumn = 0;
window->textRow = 0;
window->textColumnOffset = 0;
window->textLength = 0; // Difference
switch (_language) {
case Common::FR_FRA:
message1 = "\rIns/rez disquette de\rsauvegarde de jeux &\rentrez nom de fichier:\r\r ";
break;
case Common::DE_DEU:
message1 = "\rLege Spielstandsdiskette ein. Dateinamen eingeben:\r\r ";
break;
default:
message1 = "\r Insert savegame data disk & enter filename:\r\r ";
break;
}
for (; *message1; message1++)
windowPutChar(window, *message1);
memset(buf, 0, 8);
name = buf;
_saveGameNameLen = 0;
for (;;) {
windowPutChar(window, 128);
_keyPressed = 0;
for (;;) {
delay(10);
if (_keyPressed && _keyPressed < 128) {
i = _keyPressed;
break;
}
}
userGameBackSpace(_windowArray[4], 8);
if (i == 10 || i == 13) {
break;
} else if (i == 8) {
// do_backspace
if (_saveGameNameLen) {
_saveGameNameLen--;
name[_saveGameNameLen] = 0;
userGameBackSpace(_windowArray[4], 8);
}
} else if (i >= 32 && _saveGameNameLen != 8) {
name[_saveGameNameLen++] = i;
windowPutChar(_windowArray[4], i);
}
}
int16 slot = matchSaveGame(name, numSaveGames);
if (!load) {
if (slot >= 0 && !confirmOverWrite(window))
goto restart;
if (slot < 0)
slot = numSaveGames;
if (!saveGame(slot, name))
fileError(_windowArray[4], true);
} else {
if (slot < 0) {
fileError(_windowArray[4], false);
} else {
if (!loadGame(genSaveName(slot)))
fileError(_windowArray[4], false);
}
}
printStats();
restartAnimation();
_gameStoppedClock = time(NULL) - saveTime + _gameStoppedClock;
}
void AGOSEngine_Elvira2::listSaveGames(char *dst) {
Common::InSaveFile *in;
uint y, slot;
@ -226,7 +387,7 @@ void AGOSEngine::listSaveGames(char *dst) {
_saveGameNameLen = 0;
}
void AGOSEngine::userGame(bool load) {
void AGOSEngine_Elvira2::userGame(bool load) {
time_t saveTime;
int i, numSaveGames;
char *name;
@ -251,6 +412,8 @@ void AGOSEngine::userGame(bool load) {
if (!load) {
WindowBlock *window = _windowArray[num];
int16 slot = -1;
name = buf + 192;
for (;;) {
@ -261,16 +424,10 @@ void AGOSEngine::userGame(bool load) {
i = userGameGetKey(&b, buf, 128);
if (b) {
if (i <= 223) {
if (getGameType() == GType_WW) {
Subroutine *sub = getSubroutineByID(80);
if (sub != NULL)
startSubroutineEx(sub);
if (_variableArray[253] != 0) {
if (!confirmOverWrite(window)) {
listSaveGames(buf);
continue;
}
}
if (!saveGame(_saveLoadRowCurPos + i, buf + i * 8))
fileError(_windowArray[num], true);
@ -280,9 +437,16 @@ void AGOSEngine::userGame(bool load) {
}
userGameBackSpace(_windowArray[num], 8);
if (i == 10 || i == 13)
if (i == 10 || i == 13) {
slot = matchSaveGame(name, numSaveGames);
if (slot >= 0) {
if (!confirmOverWrite(window)) {
listSaveGames(buf);
continue;
}
}
break;
if (i == 8) {
} else if (i == 8) {
// do_backspace
if (_saveGameNameLen) {
_saveGameNameLen--;
@ -295,7 +459,10 @@ void AGOSEngine::userGame(bool load) {
}
}
if (!saveGame(numSaveGames, buf + 192))
if (slot < 0)
slot = numSaveGames;
if (!saveGame(slot, buf + 192))
fileError(_windowArray[num], true);
} else {
i = userGameGetKey(&b, buf, 128);
@ -314,7 +481,7 @@ get_out:;
restartAnimation();
}
int AGOSEngine::userGameGetKey(bool *b, char *buf, uint maxChar) {
int AGOSEngine_Elvira2::userGameGetKey(bool *b, char *buf, uint maxChar) {
HitArea *ha;
*b = true;
@ -537,9 +704,9 @@ restart:;
}
userGameBackSpace(_windowArray[5], 8);
if (i == 10 || i == 13)
if (i == 10 || i == 13) {
break;
if (i == 8) {
} else if (i == 8) {
// do_backspace
if (_saveGameNameLen) {
byte m, x;
@ -737,7 +904,16 @@ void AGOSEngine::fileError(WindowBlock *window, bool save_error) {
}
}
windowPutChar(window, 0xC);
if (getGameType() == GType_ELVIRA1) {
printScroll();
window->textColumn = 0;
window->textRow = 0;
window->textColumnOffset = 0;
window->textLength = 0; // Difference
} else {
windowPutChar(window, 12);
}
for (; *message1; message1++)
windowPutChar(window, *message1);
for (; *message2; message2++)

View file

@ -370,8 +370,8 @@ void AGOSEngine_Elvira1::setupOpcodes() {
OPCODE(o_setAdjNoun),
OPCODE(oe1_zoneDisk),
/* 268 */
OPCODE(oe1_saveUserGame),
OPCODE(oe1_loadUserGame),
OPCODE(o_saveUserGame),
OPCODE(o_loadUserGame),
OPCODE(oe1_printStats),
OPCODE(oe1_stopTune),
/* 272 */
@ -863,72 +863,9 @@ void AGOSEngine_Elvira1::oe1_zoneDisk() {
getVarOrWord();
}
void AGOSEngine_Elvira1::oe1_saveUserGame() {
// TODO
}
void AGOSEngine_Elvira1::oe1_loadUserGame() {
// TODO
}
void AGOSEngine_Elvira1::oe1_printStats() {
// 270: print stats
WindowBlock *window = _dummyWindow;
int val;
window->flags = 1;
mouseOff();
// Strength
val = _variableArray[0];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 5, 133, 6, val);
// Resolution
val = _variableArray[1];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 11, 133, 6, val);
// Dexterity
val = _variableArray[2];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 18, 133, 0, val);
// Skill
val = _variableArray[3];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 24, 133, 0, val);
// Life
val = _variableArray[5];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 30, 133, 2, val);
// Experience
val = _variableArray[6];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 36, 133, 4, val);
mouseOn();
printStats();
}
void AGOSEngine_Elvira1::oe1_stopTune() {
@ -1017,7 +954,7 @@ restart:
for (; *message2; message2++)
windowPutChar(window, *message2);
if (confirmQuit() == 0x7FFF) {
if (confirmYesOrNo(120, 62) == 0x7FFF) {
shutdown();
} else {
goto restart;
@ -1104,12 +1041,12 @@ l1: i = derefItem(i->next);
}
}
uint AGOSEngine::confirmQuit() {
uint AGOSEngine::confirmYesOrNo(uint16 x, uint16 y) {
HitArea *ha;
ha = findEmptyHitArea();
ha->x = 120;
ha->y = 62;
ha->x = x;
ha->y = y;
ha->width = 30;
ha->height = 12;
ha->flags = kBFBoxInUse;
@ -1118,8 +1055,8 @@ uint AGOSEngine::confirmQuit() {
ha->window = 0;
ha = findEmptyHitArea();
ha->x = 180;
ha->y = 62;
ha->x = x + 60;
ha->y = y;
ha->width = 24;
ha->height = 12;
ha->flags = kBFBoxInUse;
@ -1213,4 +1150,63 @@ void AGOSEngine::printScroll() {
_curVgaFile2 = curVgaFile2Orig;
}
void AGOSEngine::printStats() {
WindowBlock *window = _dummyWindow;
int val;
window->flags = 1;
mouseOff();
// Strength
val = _variableArray[0];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 5, 133, 6, val);
// Resolution
val = _variableArray[1];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 11, 133, 6, val);
// Dexterity
val = _variableArray[2];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 18, 133, 0, val);
// Skill
val = _variableArray[3];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 24, 133, 0, val);
// Life
val = _variableArray[5];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 30, 133, 2, val);
// Experience
val = _variableArray[6];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 36, 133, 4, val);
mouseOn();
}
} // End of namespace AGOS

View file

@ -509,48 +509,7 @@ void AGOSEngine_Elvira2::oe2_ink() {
void AGOSEngine_Elvira2::oe2_printStats() {
// 161: print stats
WindowBlock *window = _dummyWindow;
int val;
const uint8 y = (getPlatform() == Common::kPlatformAtariST) ? 131 : 134;
window->flags = 1;
mouseOff();
// Level
val = _variableArray[20];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 10, y, 0, val);
// PP
val = _variableArray[22];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 16, y, 6, val);
// HP
val = _variableArray[23];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 23, y, 4, val);
// Experience
val = _variableArray[21];
if (val < -99)
val = -99;
if (val > 9999)
val = 9999;
writeChar(window, 30, y, 6, val / 100);
writeChar(window, 32, y, 2, val / 10);
mouseOn();
printStats();
}
void AGOSEngine_Elvira2::oe2_setSuperRoom() {
@ -708,4 +667,49 @@ void AGOSEngine_Elvira2::oe2_b2NotZero() {
setScriptCondition((_bitArrayTwo[bit / 16] & (1 << (bit & 15))) != 0);
}
void AGOSEngine_Elvira2::printStats() {
WindowBlock *window = _dummyWindow;
int val;
const uint8 y = (getPlatform() == Common::kPlatformAtariST) ? 131 : 134;
window->flags = 1;
mouseOff();
// Level
val = _variableArray[20];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 10, y, 0, val);
// PP
val = _variableArray[22];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 16, y, 6, val);
// HP
val = _variableArray[23];
if (val < -99)
val = -99;
if (val > 99)
val = 99;
writeChar(window, 23, y, 4, val);
// Experience
val = _variableArray[21];
if (val < -99)
val = -99;
if (val > 9999)
val = 9999;
writeChar(window, 30, y, 6, val / 100);
writeChar(window, 32, y, 2, val / 10);
mouseOn();
}
} // End of namespace AGOS