aboutsummaryrefslogtreecommitdiff
path: root/scumm
diff options
context:
space:
mode:
authorEugene Sandulenko2004-06-06 02:20:53 +0000
committerEugene Sandulenko2004-06-06 02:20:53 +0000
commit7b2a81a8a673493b829524c0189f4ced99cffc53 (patch)
treea56bd43a471739414d016aa83aa511c84a46f4ec /scumm
parentd39cf192db6680ebda0ed59ef4e453531006aaae (diff)
downloadscummvm-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.h1
-rw-r--r--scumm/resource.cpp31
-rw-r--r--scumm/script_v6.cpp48
-rw-r--r--scumm/script_v6he.cpp29
-rw-r--r--scumm/script_v7he.cpp20
-rw-r--r--scumm/scumm.cpp3
-rw-r--r--scumm/verbs.cpp4
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");