diff options
| author | James Brown | 2002-04-07 04:29:15 +0000 |
|---|---|---|
| committer | James Brown | 2002-04-07 04:29:15 +0000 |
| commit | d2d498d08c2848051feb85b12ff6460d5c7c5d84 (patch) | |
| tree | 9354ed594bec11738bae4d439c33184906071712 | |
| parent | 6f2da5c673017132248ccd2f1604bf8868605226 (diff) | |
| download | scummvm-rg350-d2d498d08c2848051feb85b12ff6460d5c7c5d84.tar.gz scummvm-rg350-d2d498d08c2848051feb85b12ff6460d5c7c5d84.tar.bz2 scummvm-rg350-d2d498d08c2848051feb85b12ff6460d5c7c5d84.zip | |
Fix Indy4 bootparam, some more Zak256 work, and a few minor things.
svn-id: r3887
| -rw-r--r-- | gameDetector.cpp | 14 | ||||
| -rw-r--r-- | gameDetector.h | 1 | ||||
| -rw-r--r-- | object.cpp | 13 | ||||
| -rw-r--r-- | script.cpp | 6 | ||||
| -rw-r--r-- | script_v1.cpp | 66 | ||||
| -rw-r--r-- | script_v2.cpp | 17 | ||||
| -rw-r--r-- | scummvm.cpp | 6 | ||||
| -rw-r--r-- | sdl.cpp | 7 | ||||
| -rw-r--r-- | vars.cpp | 11 |
9 files changed, 106 insertions, 35 deletions
diff --git a/gameDetector.cpp b/gameDetector.cpp index 1a0150aeb6..2e2d062235 100644 --- a/gameDetector.cpp +++ b/gameDetector.cpp @@ -41,7 +41,8 @@ "\te<num> - set music engine. see readme.txt for details\n" \ "\tr - emulate roland mt32 instruments\n" \ "\tf - fullscreen mode\n" \ - "\tg - graphics mode. 1 for 2xSai anti-aliasing\n" + "\tg - graphics mode. 1 for 2xSai anti-aliasing\n" \ + "\ta - load autosave game (for recovering from crashes)\n" void GameDetector::parseCommandLine(int argc, char **argv) { #if !defined(__APPLE__CW) @@ -63,11 +64,14 @@ void GameDetector::parseCommandLine(int argc, char **argv) { s++; while (*s) { switch(tolower(*s)) { + case 'a': + _restore = true; + break; case 'b': - if (*(s+1) == '\0') - goto ShowHelpAndExit; - _bootParam = atoi(s+1); - goto NextArg; + if (*(s+1) == '\0') + goto ShowHelpAndExit; + _bootParam = atoi(s+1); + goto NextArg; case 'f': _fullScreen = true; break; diff --git a/gameDetector.h b/gameDetector.h index 2566848048..6288054bc0 100644 --- a/gameDetector.h +++ b/gameDetector.h @@ -44,5 +44,6 @@ public: uint16 _soundCardType; int _scummVersion; + bool _restore; }; diff --git a/object.cpp b/object.cpp index 7e11c83993..3c32a5bd5e 100644 --- a/object.cpp +++ b/object.cpp @@ -130,14 +130,17 @@ int Scumm::whereIsObject(int object) { } int Scumm::getObjectOrActorXY(int object) { - if (object < NUM_ACTORS) { + if (object < NUM_ACTORS) return getActorXYPos(derefActorSafe(object, "getObjectOrActorXY")); - } + switch(whereIsObject(object)) { case WIO_NOT_FOUND: return -1; - case WIO_INVENTORY: - return getActorXYPos(derefActorSafe(_objectOwnerTable[object],"getObjectOrActorXY(2)")); + case WIO_INVENTORY: + if (_objectOwnerTable[object] < NUM_ACTORS) + return getActorXYPos(derefActorSafe(_objectOwnerTable[object],"getObjectOrActorXY(2)")); + else + return 0xFF; } getObjectXYPos(object); return 0; @@ -205,7 +208,7 @@ int Scumm::getObjActToObjActDist(int a, int b) { if (acta && actb && acta->room==actb->room && acta->room && acta->room != _currentRoom) - return 0xFF; + return 0; if (getObjectOrActorXY(a)==-1) return 0xFF; diff --git a/script.cpp b/script.cpp index e8d03903cb..349faaa920 100644 --- a/script.cpp +++ b/script.cpp @@ -261,8 +261,8 @@ void Scumm::executeScript() { while (_currentScript != 0xFF) { _opcode = fetchScriptByte(); _scriptPointerStart = _scriptPointer; - vm.slot[_currentScript].didexec = 1; - //debug(1, "[%X] %s()", _opcode, _opcodes_lookup[_opcode]); + vm.slot[_currentScript].didexec = 1; + //debug(1, "Script %d: [%X] %s()", vm.slot[_currentScript].number, _opcode, _opcodes_lookup[_opcode]); op = getOpcode(_opcode); (this->*op)(); } @@ -678,7 +678,7 @@ void Scumm::runVerbCode(int object, int entry, int a, int b, int16 *vars) { slot = getScriptSlot(); offs = getVerbEntrypoint(object, entry); - if (offs==0) + if (offs==0) return; vm.slot[slot].number = object; diff --git a/script_v1.cpp b/script_v1.cpp index b3b4289302..5cde3ce9a0 100644 --- a/script_v1.cpp +++ b/script_v1.cpp @@ -692,13 +692,20 @@ void Scumm::o5_actorFromPos() { void Scumm::o5_actorSet() { byte convertTable[20] = {1,0,0,2,0,4,5,6,7,8,9,10,11,12,13,14,15,16,17,20}; int act = getVarOrDirectByte(0x80); - Actor *a = derefActorSafe(act, "actorSet"); + Actor *a; int i,j; + if (act == 0) + act = 1; + + a = derefActorSafe(act, "actorSet"); + while ( (_opcode = fetchScriptByte()) != 0xFF) { - if(_features & GF_SMALL_HEADER) - _opcode = (_opcode&0xE0) | convertTable[(_opcode&0x1F)-1]; + if(_features & GF_SMALL_HEADER) + _opcode = (_opcode&0xE0) | convertTable[(_opcode&0x1F)-1]; + if (!a) return; + switch(_opcode&0x1F) { case 0: /* dummy case */ getVarOrDirectByte(0x80); @@ -1242,8 +1249,10 @@ void Scumm::o5_getActorWidth() { } void Scumm::o5_getActorX() { + int actor; getResultPos(); - setResult(getObjX(getVarOrDirectWord(0x80))); + actor = getVarOrDirectWord(0x80); + setResult(getObjX(actor)); } void Scumm::o5_getActorY() { @@ -1259,23 +1268,23 @@ void Scumm::o5_getAnimCounter() { void Scumm::o5_getClosestObjActor() { int obj; int act; - int closobj=-1, closnum=-1; + int closest_obj=0xFF, closest_dist=0xFF; int dist; getResultPos(); act = getVarOrDirectWord(0x80); obj = _vars[VAR_V5_OBJECT_HI]; - - do { - dist = getObjActToObjActDist(obj,act); - if (dist < closnum) { - closnum = dist; - closobj = obj; + + do { + dist = getObjActToObjActDist(act,obj); + if (dist < closest_dist) { + closest_dist = dist; + closest_obj = obj; } } while (--obj >= _vars[VAR_V5_OBJECT_LO]); - - setResult(closnum); + + setResult(closest_dist); } void Scumm::o5_getDist() { @@ -1305,10 +1314,13 @@ void Scumm::o5_getObjectOwner() { void Scumm::o5_getObjectState() { if(_features & GF_SMALL_HEADER) { - if((getState(getVarOrDirectWord(0x80)) &0xF0 >>4) != (int)getVarOrDirectByte(0x40)) + int a = getVarOrDirectWord(0x80); + int b = getVarOrDirectByte(0x40); + + if((getState(a) &0xF0 >>4) != b) o5_jumpRelative(); else - ignoreScriptWord(); + ignoreScriptWord(); } else { getResultPos(); setResult(getState(getVarOrDirectWord(0x80))); @@ -1402,6 +1414,7 @@ void Scumm::o5_isGreaterEqual() { void Scumm::o5_isLess() { int16 a = readVar(fetchScriptWord()); int16 b = getVarOrDirectWord(0x80); + if (b < a) ignoreScriptWord(); else o5_jumpRelative(); } @@ -1461,7 +1474,16 @@ void Scumm::o5_lights() { } void Scumm::o5_loadRoom() { - int room = getVarOrDirectByte(0x80); + int room; + + /* Begin: Autosave + _saveLoadSlot = 0; + sprintf(_saveLoadName, "Autosave", _saveLoadSlot); + _saveLoadFlag = 1; + _saveLoadCompatible = false; + End: Autosave */ + + room = getVarOrDirectByte(0x80); startScene(room, 0, 0); _fullRedraw = 1; } @@ -1470,6 +1492,13 @@ void Scumm::o5_loadRoomWithEgo() { int obj, room, x,y; Actor *a; + /* Begin: Autosave + _saveLoadSlot = 0; + sprintf(_saveLoadName, "Autosave", _saveLoadSlot); + _saveLoadFlag = 1; + _saveLoadCompatible = false; + End: Autosave */ + obj = getVarOrDirectWord(0x80); room = getVarOrDirectByte(0x40); @@ -2394,7 +2423,7 @@ void Scumm::o5_walkActorToObject() { int obj; Actor *a; - warning("walk object to object"); + // warning("walk object to object"); a = derefActorSafe(getVarOrDirectByte(0x80), "o5_walkActorToObject"); obj = getVarOrDirectWord(0x40); @@ -2535,6 +2564,9 @@ void Scumm::o5_pickupObjectOld() { if(getObjectIndex(obj) == -1) return; + if(whereIsObject(obj) == WIO_INVENTORY) /* Don't take an */ + return; /* object twice */ + // warning("adding %d from %d to inventoryOld", obj, _currentRoom); addObjectToInventory(obj,_currentRoom); // warning("added to inventoryOld"); diff --git a/script_v2.cpp b/script_v2.cpp index 058dabd7c5..f675ff9d09 100644 --- a/script_v2.cpp +++ b/script_v2.cpp @@ -1224,7 +1224,15 @@ void Scumm::o6_setCameraAt() { } void Scumm::o6_loadRoom() { - int room = pop(); + int room; + /* Begin: Autosave + _saveLoadSlot = 0; + sprintf(_saveLoadName, "Autosave", _saveLoadSlot); + _saveLoadFlag = 1; + _saveLoadCompatible = false; + End: Autosave */ + + room = pop(); startScene(room, 0, 0); _fullRedraw = 1; } @@ -1381,6 +1389,13 @@ void Scumm::o6_loadRoomWithEgo() { Actor *a; int room,obj,x,y; + /* Begin: Autosave + _saveLoadSlot = 0; + sprintf(_saveLoadName, "Autosave", _saveLoadSlot); + _saveLoadFlag = 1; + _saveLoadCompatible = false; + End: Autosave */ + y = pop(); x = pop(); diff --git a/scummvm.cpp b/scummvm.cpp index c7fe040dc5..1ffe921e99 100644 --- a/scummvm.cpp +++ b/scummvm.cpp @@ -863,7 +863,7 @@ void Scumm::convertKeysToClicks() { Actor *Scumm::derefActorSafe(int id, const char *errmsg) { if (id<1 || id>=NUM_ACTORS) { - warning("Invalid actor %d in %s (script %d) - This is potentially a BIG problem.", id, errmsg, vm.slot[_curExecScript].number); + warning("Invalid actor %d in %s (script %d, opcode 0x%x) - This is potentially a BIG problem.", id, errmsg, vm.slot[_curExecScript].number, _opcode); return NULL; } return derefActor(id); @@ -1064,6 +1064,10 @@ void Scumm::launch() // if (_gameId==GID_MONKEY2 && _bootParam == 0) // _bootParam = 10001; + + if (_gameId==GID_INDY4 && _bootParam==0) { + _bootParam = -7873; + } readIndexFile(); @@ -965,7 +965,12 @@ int main(int argc, char* argv[]) { scumm->_noSubtitles = detector._noSubtitles; scumm->delta=6; - + if (detector._restore) { + scumm->_saveLoadSlot = 0; + scumm->_saveLoadFlag = 2; + scumm->_saveLoadCompatible = false; + } + scumm->_gui = &gui; // gui.init(scumm); sound.initialize(scumm, &snd_driv); @@ -95,8 +95,15 @@ void Scumm::setupScummVarsOld(){ VAR_V5_DRAWFLAGS = 9; VAR_MI1_TIMER = 14; - VAR_V5_OBJECT_LO = 15; - VAR_V5_OBJECT_HI = 16; + + //if (_features & GF_OLD256) { + VAR_V5_OBJECT_LO = 15; + VAR_V5_OBJECT_HI = 16; + /*} else { + VAR_V5_OBJECT_LO = 16; + VAR_V5_OBJECT_HI = 15; + } */ + VAR_V5_TALK_STRING_Y = 54; VAR_V5_CHARFLAG = 60; |
