aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Brown2002-04-07 04:29:15 +0000
committerJames Brown2002-04-07 04:29:15 +0000
commitd2d498d08c2848051feb85b12ff6460d5c7c5d84 (patch)
tree9354ed594bec11738bae4d439c33184906071712
parent6f2da5c673017132248ccd2f1604bf8868605226 (diff)
downloadscummvm-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.cpp14
-rw-r--r--gameDetector.h1
-rw-r--r--object.cpp13
-rw-r--r--script.cpp6
-rw-r--r--script_v1.cpp66
-rw-r--r--script_v2.cpp17
-rw-r--r--scummvm.cpp6
-rw-r--r--sdl.cpp7
-rw-r--r--vars.cpp11
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();
diff --git a/sdl.cpp b/sdl.cpp
index 3118631397..1465e32d41 100644
--- a/sdl.cpp
+++ b/sdl.cpp
@@ -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);
diff --git a/vars.cpp b/vars.cpp
index 9d2745989c..366c52ead4 100644
--- a/vars.cpp
+++ b/vars.cpp
@@ -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;