diff options
author | Eugene Sandulenko | 2004-06-06 02:20:53 +0000 |
---|---|---|
committer | Eugene Sandulenko | 2004-06-06 02:20:53 +0000 |
commit | 7b2a81a8a673493b829524c0189f4ced99cffc53 (patch) | |
tree | a56bd43a471739414d016aa83aa511c84a46f4ec /scumm | |
parent | d39cf192db6680ebda0ed59ef4e453531006aaae (diff) | |
download | scummvm-rg350-7b2a81a8a673493b829524c0189f4ced99cffc53.tar.gz scummvm-rg350-7b2a81a8a673493b829524c0189f4ced99cffc53.tar.bz2 scummvm-rg350-7b2a81a8a673493b829524c0189f4ced99cffc53.zip |
o more _heversion usage
o hack to ensure 1x scaler is selected for 640x480 games. Begs for better
implementation
o 7.0+-specific extendions to
* resource loading
* o6_resourceRoutines
* o6_actorOps
* o7_pickupObject
* ScummEngine::setVerbObject
Now puttputt.w32 script execution advances little more.
svn-id: r13938
Diffstat (limited to 'scumm')
-rw-r--r-- | scumm/intern.h | 1 | ||||
-rw-r--r-- | scumm/resource.cpp | 31 | ||||
-rw-r--r-- | scumm/script_v6.cpp | 48 | ||||
-rw-r--r-- | scumm/script_v6he.cpp | 29 | ||||
-rw-r--r-- | scumm/script_v7he.cpp | 20 | ||||
-rw-r--r-- | scumm/scumm.cpp | 3 | ||||
-rw-r--r-- | scumm/verbs.cpp | 4 |
7 files changed, 115 insertions, 21 deletions
diff --git a/scumm/intern.h b/scumm/intern.h index 4e1930a432..9680bdd784 100644 --- a/scumm/intern.h +++ b/scumm/intern.h @@ -637,6 +637,7 @@ protected: void o7_unknownFA(); void o7_unknownFB(); void o7_quitPauseRestart(); + void o7_pickupObject(); }; class ScummEngine_v7 : public ScummEngine_v6 { diff --git a/scumm/resource.cpp b/scumm/resource.cpp index 44a8b4e629..faba9245d2 100644 --- a/scumm/resource.cpp +++ b/scumm/resource.cpp @@ -80,7 +80,7 @@ void ScummEngine::openRoom(int room) { } if (!(_features & GF_SMALL_HEADER)) { - if ((_features & GF_HUMONGOUS) && (_features & GF_WINDOWS)) { + if (_heversion >= 70) { // Windows titles sprintf(buf, "%s.he%.1d", _gameName.c_str(), room == 0 ? 0 : 1); } else if (_version >= 7) { if (room > 0 && (_version == 8)) @@ -185,7 +185,7 @@ void ScummEngine::readRoomsOffsets() { if (_features & GF_SMALL_NAMES) return; - if ((_features & GF_HUMONGOUS) && (_features & GF_WINDOWS)) { + if (_heversion >= 70) { // Windows titles num = READ_LE_UINT16(_HEV7RoomOffsets); ptr = _HEV7RoomOffsets + 2; for (i = 0; i < num; i++) { @@ -350,17 +350,16 @@ void ScummEngine::readIndexFile() { _fileHandle.read(_objectStateTable, num); _fileHandle.read(_objectRoomTable, num); memset(_objectOwnerTable, 0xFF, num); + } else if (_heversion >= 70) { // Windows titles + _fileHandle.read(_objectStateTable, num); + _fileHandle.read(_objectOwnerTable, num); + _fileHandle.read(_objectRoomTable, num); } else { _fileHandle.read(_objectOwnerTable, num); for (i = 0; i < num; i++) { _objectStateTable[i] = _objectOwnerTable[i] >> OF_STATE_SHL; _objectOwnerTable[i] &= OF_OWNER_MASK; } - if ((_features & GF_HUMONGOUS) && (_features & GF_WINDOWS)) { - // _objectRoomTable - _fileHandle.seek(num * 4, SEEK_CUR); - //_fileHandle.read(_objectRoomTable, num * 4); - } } if (_version != 8) { @@ -506,9 +505,10 @@ void ScummEngine::readResTypeList(int id, uint32 tag, const char *name) { for (i = 0; i < num; i++) { res.roomoffs[id][i] = _fileHandle.readUint32LE(); } - if ((_features & GF_HUMONGOUS) && (_features & GF_WINDOWS)) { - _fileHandle.seek(4 * num, SEEK_CUR); // FIXME what are these additional offsets - } + // FIXME: these are related to globs + + //_fileHandle.read(_globSize, num); + _fileHandle.seek(4 * num, SEEK_CUR); } } @@ -2057,7 +2057,7 @@ void ScummEngine::readMAXS() { _numGlobalScripts = 2000; _shadowPaletteSize = NUM_SHADOW_PALETTE * 256; - } else if (_heversion >= 72) { + } else if (_heversion >= 72) { // sputm7.2 _fileHandle.readUint16LE(); _numVariables = _fileHandle.readUint16LE(); _numBitVariables = _fileHandle.readUint16LE(); @@ -2073,13 +2073,16 @@ void ScummEngine::readMAXS() { _numCharsets = _fileHandle.readUint16LE(); _numCostumes = _fileHandle.readUint16LE(); _numGlobalObjects = _fileHandle.readUint16LE(); - _fileHandle.readUint16LE(); + _fileHandle.readUint16LE(); + + _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); // FIXME: Is this correct??? A V6+ game which doesn't use object name // resources seems odd... _numNewNames = 0; _objectRoomTable = (byte *)calloc(_numGlobalObjects * 4, 1); + _numGlobalScripts = 200; _shadowPaletteSize = 256; } else if (_version == 6) { @@ -2104,6 +2107,10 @@ void ScummEngine::readMAXS() { _numGlobalScripts = 200; _shadowPaletteSize = 256; + + if (_heversion >= 70) { + _objectRoomTable = (byte *)calloc(_numGlobalObjects, 1); + } } else { _numVariables = _fileHandle.readUint16LE(); // 800 _fileHandle.readUint16LE(); // 16 diff --git a/scumm/script_v6.cpp b/scumm/script_v6.cpp index 062e7f25fb..4199117852 100644 --- a/scumm/script_v6.cpp +++ b/scumm/script_v6.cpp @@ -394,6 +394,7 @@ int ScummEngine_v6::popRoomAndObj(int *room) { obj = pop(); } + return obj; } @@ -930,8 +931,9 @@ void ScummEngine_v6::o6_cursorCommand() { case 0x97: // SO_USERPUT_SOFT_OFF _userPut--; break; - case 0x99:{ // SO_CURSOR_IMAGE Set cursor image - if ((_features & GF_HUMONGOUS) && (_features & GF_WINDOWS)) { + case 0x99: // SO_CURSOR_IMAGE Set cursor image + { + if (_heversion >= 70) { // Windows titles warning("cursorCommand 0x99 PC_SetCursorToID(%d) stub", pop()); break; } @@ -1557,11 +1559,43 @@ void ScummEngine_v6::o6_resourceRoutines() { loadFlObject(obj, room); break; } - case 120:{ /* queue ? for load */ - warning("stub queueload resource %d", pop()); - // QL_QueGlobForLoad(2, pop(), 1); - break; - + case 120: /* queue ? for load */ + { + if (_heversion < 70) + error("o6_resourceRoutines: default case %d", op); + + warning("stub queueload resource 2, %d", pop()); + // QL_QueGlobForLoad(2, pop(), 1); + break; + } + case 121: + { + if (_heversion < 70) + error("o6_resourceRoutines: default case %d", op); + + warning("stub queueload resource 4, %d", pop()); + // QL_QueGlobForLoad(4, pop(), 1); + break; + } + case 122: + { + if (_heversion < 70) + error("o6_resourceRoutines: default case %d", op); + + warning("stub queueload resource 3, %d", pop()); + // QL_QueGlobForLoad(3, pop(), 1); + break; + } + case 123: + { + if (_heversion < 70) + error("o6_resourceRoutines: default case %d", op); + + resid = pop(); + warning("stub queueload resource 18, %d", resid); + // QL_QueGlobForLoad(18, resid, 1); + // QL_QueGlobForLoad(1, resid, 1); + break; } default: error("o6_resourceRoutines: default case %d", op); diff --git a/scumm/script_v6he.cpp b/scumm/script_v6he.cpp index b77601563c..f50e38bff7 100644 --- a/scumm/script_v6he.cpp +++ b/scumm/script_v6he.cpp @@ -560,6 +560,16 @@ void ScummEngine_v6he::o6_actorOps() { return; switch (b) { + case 30: + if (_heversion <= 70) { + error("o6_actorOps: default case %d", b); + } + + k = pop(); + j = pop(); + i = pop(); + warning("o6_actorOps: stub case %d", b); + break; case 76: // SO_COSTUME a->setActorCostume(pop()); break; @@ -630,7 +640,6 @@ void ScummEngine_v6he::o6_actorOps() { case 93: // SO_NEVER_ZCLIP a->forceClip = 0; break; - case 225: // SO_ALWAYS_ZCLIP case 94: // SO_ALWAYS_ZCLIP a->forceClip = pop(); break; @@ -693,6 +702,23 @@ void ScummEngine_v6he::o6_actorOps() { a->bottom = top_actor; } break; + case 219: + if (_heversion <= 70) { + error("o6_actorOps: default case %d", b); + } + + a->forceClip = false; + a->needRedraw = true; + a->needBgReset = true; + break; + case 225: // SO_ALWAYS_ZCLIP + if (_heversion < 70) { + a->forceClip = pop(); // FIXME: where does this come from? + } else { + i = pop(); // talkie slot + warning("o6_actorOps: stub case %d", b); + } + break; default: error("o6_actorOps: default case %d", b); } @@ -704,6 +730,7 @@ void ScummEngine_v6he::o6_verbOps() { byte op; op = fetchScriptByte(); + if (op == 196) { _curVerb = pop(); _curVerbSlot = getVerbSlot(_curVerb, 0); diff --git a/scumm/script_v7he.cpp b/scumm/script_v7he.cpp index 705b0df951..6cd844c9b8 100644 --- a/scumm/script_v7he.cpp +++ b/scumm/script_v7he.cpp @@ -216,7 +216,7 @@ void ScummEngine_v7he::setupOpcodes() { OPCODE(o6_animateActor), OPCODE(o6_doSentence), /* 84 */ - OPCODE(o6_pickupObject), + OPCODE(o7_pickupObject), OPCODE(o6_loadRoomWithEgo), OPCODE(o6_invalid), OPCODE(o6_getRandomNumber), @@ -626,4 +626,22 @@ void ScummEngine_v7he::o7_quitPauseRestart() { } } +void ScummEngine_v7he::o7_pickupObject() { + int obj, room; + + room = pop(); + obj = pop(); + if (room == 0) + room = getObjectRoom(obj); + + addObjectToInventory(obj, room); + putOwner(obj, VAR(VAR_EGO)); + putClass(obj, kObjectClassUntouchable, 1); + putState(obj, 1); + markObjectRectAsDirty(obj); + clearDrawObjectQueue(); + runInventoryScript(obj); /* Difference */ +} + + } // End of namespace Scumm diff --git a/scumm/scumm.cpp b/scumm/scumm.cpp index 179a668f60..4cc52e255b 100644 --- a/scumm/scumm.cpp +++ b/scumm/scumm.cpp @@ -674,6 +674,9 @@ ScummEngine::ScummEngine(GameDetector *detector, OSystem *syst, const ScummGameS _screenWidth = 320; _screenHeight = 240; } else if (_features & GF_DEFAULT_TO_1X_SCALER) { + // FIXME: a dirty hack. Currently this is checked before engine + // creation. + _system->setGraphicsMode("1x"); _screenWidth = 640; _screenHeight = 480; } else if (_features & GF_NES) { diff --git a/scumm/verbs.cpp b/scumm/verbs.cpp index 6cb2823570..20604d450e 100644 --- a/scumm/verbs.cpp +++ b/scumm/verbs.cpp @@ -527,6 +527,10 @@ void ScummEngine::setVerbObject(uint room, uint object, uint verb) { FindObjectInRoom foir; int i; + if (_heversion >= 70) { // Windows titles. Here we always ignore room + room = getObjectRoom(object); + } + if (whereIsObject(object) == WIO_FLOBJECT) error("Can't grab verb image from flobject"); |