aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--scumm/intern.h5
-rw-r--r--scumm/script_v72he.cpp121
2 files changed, 122 insertions, 4 deletions
diff --git a/scumm/intern.h b/scumm/intern.h
index 649b5325e9..e70b82f0c7 100644
--- a/scumm/intern.h
+++ b/scumm/intern.h
@@ -675,6 +675,8 @@ protected:
void redimArray(int arrayId, int newDim2start, int newDim2end,
int newDim1start, int newDim1end, int type);
void shuffleArray(int num, int minIdx, int maxIdx);
+ int readFileToArray(int slot, int32 size);
+ void writeFileFromArray(int slot, int resID);
void copyScriptString(byte *dst);
@@ -700,6 +702,9 @@ protected:
void o72_dim2dimArray();
void o72_shuffle();
void o72_jumpToScript();
+ void o72_openFile();
+ void o72_readFile();
+ void o72_writeFile();
void o72_findAllObjects();
void o72_getPixel();
void o72_pickVarRandom();
diff --git a/scumm/script_v72he.cpp b/scumm/script_v72he.cpp
index b952fbd87d..ab9d5d3a8f 100644
--- a/scumm/script_v72he.cpp
+++ b/scumm/script_v72he.cpp
@@ -318,10 +318,10 @@ void ScummEngine_v72he::setupOpcodes() {
/* D8 */
OPCODE(o6_isRoomScriptRunning),
OPCODE(o6_closeFile),
- OPCODE(o6_openFile),
- OPCODE(o6_readFile),
+ OPCODE(o72_openFile),
+ OPCODE(o72_readFile),
/* DC */
- OPCODE(o6_writeFile),
+ OPCODE(o72_writeFile),
OPCODE(o72_findAllObjects),
OPCODE(o6_deleteFile),
OPCODE(o6_rename),
@@ -516,7 +516,8 @@ void ScummEngine_v72he::readArrayFromIndexFile() {
void ScummEngine_v72he::copyScriptString(byte *dst) {
int a = pop();
int b = 0;
- if (a == -1) {
+ // FIXME Should only be -1
+ if (a == 1 || a == -1) {
int len = resStrLen(_stringBuffer) + 1;
while (len--)
*dst++ = _stringBuffer[b++];
@@ -855,6 +856,118 @@ void ScummEngine_v72he::o72_jumpToScript() {
runScript(script, (flags == 199 || flags == 200), (flags == 195 || flags == 200), args);
}
+void ScummEngine_v72he::o72_openFile() {
+ int mode, slot, l, r;
+ byte filename[100];
+
+ copyScriptString(filename);
+ printf("File %s\n", filename);
+
+ for (r = strlen((char*)filename); r != 0; r--) {
+ if (filename[r - 1] == '\\')
+ break;
+ }
+
+ mode = pop();
+ slot = -1;
+ for (l = 0; l < 17; l++) {
+ if (_hFileTable[l].isOpen() == false) {
+ slot = l;
+ break;
+ }
+ }
+
+ if (slot != -1) {
+ if (mode == -1)
+ _hFileTable[slot].open((char*)filename + r, File::kFileReadMode);
+ else if (mode == -2)
+ _hFileTable[slot].open((char*)filename + r, File::kFileWriteMode);
+ else
+ error("o6_openFile(): wrong open file mode %d", mode);
+
+ if (_hFileTable[slot].isOpen() == false)
+ slot = -1;
+
+ }
+ push(slot);
+}
+
+int ScummEngine_v72he::readFileToArray(int slot, int32 size) {
+ if (size == 0)
+ size = _hFileTable[slot].size() - _hFileTable[slot].pos();
+
+ writeVar(0, 0);
+
+ ArrayHeader *ah = defineArray(0, kByteArray, 0, 0, 0, size);
+ _hFileTable[slot].read(ah->data, size);
+
+ return readVar(0);
+}
+
+void ScummEngine_v72he::o72_readFile() {
+ int slot, val;
+ int32 size;
+ int subOp = fetchScriptByte();
+
+ switch (subOp) {
+ case 4:
+ slot = pop();
+ val = _hFileTable[slot].readByte();
+ push(val);
+ break;
+ case 5:
+ slot = pop();
+ val = _hFileTable[slot].readUint16LE();
+ push(val);
+ break;
+ case 6:
+ slot = pop();
+ val = _hFileTable[slot].readUint32LE();
+ push(val);
+ break;
+ case 8:
+ fetchScriptByte();
+ size = pop();
+ slot = pop();
+ val = readFileToArray(slot, size);
+ push(val);
+ break;
+ default:
+ error("default case %d", subOp);
+ }
+}
+
+void ScummEngine_v72he::writeFileFromArray(int slot, int resID) {
+ ArrayHeader *ah = (ArrayHeader *)getResourceAddress(rtString, resID);
+ int32 size = (FROM_LE_32(ah->dim1end) - FROM_LE_32(ah->dim1start) + 1) *
+ (FROM_LE_32(ah->dim2end) - FROM_LE_32(ah->dim2start) + 1);
+
+ _hFileTable[slot].write(ah->data, size);
+}
+
+void ScummEngine_v72he::o72_writeFile() {
+ int16 resID = pop();
+ int slot = pop();
+ int subOp = fetchScriptByte();
+
+ switch (subOp) {
+ case 4:
+ _hFileTable[slot].writeByte(resID);
+ break;
+ case 5:
+ _hFileTable[slot].writeUint16LE(resID);
+ break;
+ case 6:
+ _hFileTable[slot].writeUint32LE(resID);
+ break;
+ case 8:
+ writeFileFromArray(slot, resID);
+ break;
+ default:
+ error("default case %d", subOp);
+ }
+}
+
void ScummEngine_v72he::o72_findAllObjects() {
int room = pop();
int i = 1;