aboutsummaryrefslogtreecommitdiff
path: root/engines/agi
diff options
context:
space:
mode:
authorFilippos Karapetis2007-09-21 19:12:53 +0000
committerFilippos Karapetis2007-09-21 19:12:53 +0000
commitdc4c06e954ee0d09f8227e6cf3bf4f083a43eedf (patch)
tree5244f7b1c5e0dfa4022b5d6f16a2ee035818a629 /engines/agi
parentfd1dbd86680bf37cb7c285ecb131511a6c67dd15 (diff)
downloadscummvm-rg350-dc4c06e954ee0d09f8227e6cf3bf4f083a43eedf.tar.gz
scummvm-rg350-dc4c06e954ee0d09f8227e6cf3bf4f083a43eedf.tar.bz2
scummvm-rg350-dc4c06e954ee0d09f8227e6cf3bf4f083a43eedf.zip
Several bug fixes for Mickey's Space Adventure:
- Fixed a logic bug, where it was possible that the planets were not initialized properly when flipping XL30's switch without holding any crystal. Note that this breaks older Mickey saved games - Fixed a bug with the initialization of the planet data, where the random number assigned to each planet could go out of logical bounds - Save games are saved with the correct extension now (e.g. mickey.s01 instead of mickey.s 1) - Some save game messages which were not shown are shown now - Disabled two problematic objects (the scale in Mickey's house and the rock in Jupiter) so they are not shown for now, as our current picture showing algorithm crashes when trying to display them svn-id: r29007
Diffstat (limited to 'engines/agi')
-rw-r--r--engines/agi/preagi_mickey.cpp32
-rw-r--r--engines/agi/preagi_mickey.h1
2 files changed, 20 insertions, 13 deletions
diff --git a/engines/agi/preagi_mickey.cpp b/engines/agi/preagi_mickey.cpp
index edd1b12406..264c0ac8b0 100644
--- a/engines/agi/preagi_mickey.cpp
+++ b/engines/agi/preagi_mickey.cpp
@@ -216,8 +216,8 @@ void Mickey::printExeStr(int ofs) {
readExe(ofs, buffer, sizeof(buffer));
printStr((char *)buffer);
- //_vm->_gfx->doUpdate();
- //_vm->_system->updateScreen(); // TODO: this should go in the game's main loop
+ _vm->_gfx->doUpdate();
+ _vm->_system->updateScreen(); // TODO: this should go in the game's main loop
}
void Mickey::printExeMsg(int ofs) {
@@ -693,6 +693,14 @@ void Mickey::drawObj(ENUM_MSA_OBJECT iObj, int x0, int y0) {
if (iObj == IDI_MSA_OBJECT_CRYSTAL)
_vm->_picture->setPictureFlags(kPicFStep);
+ // HACK: attempting to draw the scale in Mickey's house causes a crash, so we don't draw it
+ if (iObj == IDI_MSA_OBJECT_SCALE)
+ return;
+
+ // HACK: attempting to draw the rock in Jupiter causes a crash, so we don't draw it
+ if (iObj == IDI_MSA_OBJECT_ROCK_1 || iObj == IDI_MSA_OBJECT_ROCK_2 || iObj == IDI_MSA_OBJECT_ROCK_3)
+ return;
+
_vm->_picture->setOffset(x0, y0);
_vm->_picture->decodePicture(buffer, size, false, IDI_MSA_PIC_WIDTH, IDI_MSA_PIC_HEIGHT);
_vm->_picture->setOffset(0, 0);
@@ -958,7 +966,7 @@ bool Mickey::loadGame() {
return false;
// load game
- sprintf(szFile, "%s.s%2d", _vm->getTargetName().c_str(), sel);
+ sprintf(szFile, "%s.s%02d", _vm->getTargetName().c_str(), sel);
if (!(infile = _vm->getSaveFileMan()->openForLoading(szFile))) {
printExeStr(IDO_MSA_CHECK_DISK_DRIVE);
if (_vm->getSelection(kSelAnyKey) == 0)
@@ -1004,7 +1012,7 @@ void Mickey::saveGame() {
return;
// save game
- sprintf(szFile, "%s.s%2d", _vm->getTargetName().c_str(), sel);
+ sprintf(szFile, "%s.s%02d", _vm->getTargetName().c_str(), sel);
if (!(outfile = _vm->getSaveFileMan()->openForSaving(szFile))) {
printExeStr(IDO_MSA_CHECK_DISK_DRIVE);
if (_vm->getSelection(kSelAnyKey) == 0)
@@ -1166,10 +1174,11 @@ void Mickey::gameOver() {
void Mickey::flipSwitch() {
if (game.fHasXtal || game.nXtals) {
- if (!game.fStoryShown) {
+ if (!game.fStoryShown)
printStory();
+
+ if (!game.fPlanetsInitialized)
randomize();
- }
// activate screen animation
game.fAnimXL30 = true;
@@ -1260,7 +1269,7 @@ void Mickey::randomize() {
} else {
done = false;
while (!done) {
- iPlanet = _vm->rnd(IDI_MSA_MAX_PLANET);
+ iPlanet = _vm->rnd(IDI_MSA_MAX_PLANET - 2); // Earth (planet 0) is excluded
done = true;
for (int j = 0; j < IDI_MSA_MAX_PLANET; j++) {
if (game.iPlanetXtal[j] == iPlanet) {
@@ -1273,14 +1282,11 @@ void Mickey::randomize() {
game.iPlanetXtal[i] = iPlanet;
- done = false;
- while (!done) {
- iHint = _vm->rnd(5);
- done = true;
- }
-
+ iHint = _vm->rnd(5) - 1; // clues are 0-4
game.iClue[i] = IDO_MSA_NEXT_PIECE[iPlanet][iHint];
}
+
+ game.fPlanetsInitialized = true;
}
void Mickey::flashScreen() {
diff --git a/engines/agi/preagi_mickey.h b/engines/agi/preagi_mickey.h
index 3b45fb8630..24a07d376e 100644
--- a/engines/agi/preagi_mickey.h
+++ b/engines/agi/preagi_mickey.h
@@ -708,6 +708,7 @@ struct MSA_GAME {
bool fShipDoorOpen;
bool fFlying;
bool fStoryShown;
+ bool fPlanetsInitialized;
bool fTempleDoorOpen;
bool fItem[IDI_MSA_MAX_ITEM];