diff --git a/engines/glk/module.mk b/engines/glk/module.mk
index 2f7054c5b87..60dd2168a61 100644
--- a/engines/glk/module.mk
+++ b/engines/glk/module.mk
@@ -252,6 +252,7 @@ MODULE_OBJS := \
scott/ring_buffer.o \
scott/saga_draw.o \
scott/scott.o \
+ scott/unp64/unp64.o \
tads/os_banners.o \
tads/os_buffer.o \
tads/os_glk.o \
diff --git a/engines/glk/scott/c64_checksums.cpp b/engines/glk/scott/c64_checksums.cpp
index 7490c13a8bd..ba4b8424a96 100644
--- a/engines/glk/scott/c64_checksums.cpp
+++ b/engines/glk/scott/c64_checksums.cpp
@@ -26,6 +26,10 @@
#include "glk/scott/c64_checksums.h"
#include "glk/scott/definitions.h"
#include "glk/scott/disk_image.h"
+#include "glk/scott/game_info.h"
+#include "glk/scott/resource.h"
+#include "glk/scott/saga_draw.h"
+#include "glk/scott/unp64/unp64_interface.h"
namespace Glk {
namespace Scott {
@@ -239,9 +243,85 @@ int detectC64(uint8_t **sf, size_t *extent) {
return decrunchC64(sf, extent, g_C64Registry[index]);
}
-int decrunchC64(uint8_t **sf, size_t *extent, C64Rec entry) {
+size_t copyData(size_t dest, size_t source, uint8_t** data, size_t dataSize, size_t bytesToMove) {
return 0;
}
+int decrunchC64(uint8_t **sf, size_t *extent, C64Rec record) {
+ uint8_t *uncompressed = nullptr;
+ _G(_fileLength) = *extent;
+
+ size_t decompressedLength = *extent;
+
+ uncompressed = new uint8_t[0xffff];
+
+ char *switches[3];
+ int numSwitches = 0;
+
+ if (record._switches != nullptr) {
+ char string[100];
+ strcpy(string, record._switches);
+ switches[numSwitches] = strtok(string, " ");
+
+ while (switches[numSwitches] != nullptr)
+ switches[++numSwitches] = strtok(nullptr, " ");
+ }
+
+ size_t result = 0;
+
+ for (int i = 1; i <= record._decompressIterations; i++) {
+ /* We only send switches on the iteration specified by parameter */
+ if (i == record._parameter && record._switches != nullptr) {
+ result = unp64(_G(_entireFile), _G(_fileLength), uncompressed, &decompressedLength, switches, numSwitches);
+ } else
+ result = unp64(_G(_entireFile), _G(_fileLength), uncompressed, &decompressedLength, nullptr, 0);
+ if (result) {
+ if (_G(_entireFile) != nullptr)
+ delete[] _G(_entireFile);
+ _G(_entireFile) = new uint8_t[decompressedLength];
+ memcpy(_G(_entireFile), uncompressed, decompressedLength);
+ _G(_fileLength) = decompressedLength;
+ } else {
+ delete[] uncompressed;
+ break;
+ }
+ }
+
+ for (int i = 0; i < NUMGAMES; i++) {
+ if (g_games[i]._gameID == record._id) {
+ delete _G(_game);
+ _G(_game) = &g_games[i];
+ break;
+ }
+ }
+
+ if (_G(_game)->_title == nullptr) {
+ error("decrunchC64: Game not found");
+ }
+
+ int offset;
+
+ DictionaryType dictype = getId(&offset);
+ if (dictype != _G(_game)->_dictionary) {
+ error("decrunchC64: Wrong game?");
+ }
+
+ if (!tryLoading(*_G(_game), offset, 0)) {
+ error("decrunchC64: Game could not be read");
+ }
+
+ if (record._copySource != 0) {
+ result = copyData(record._copyDest, record._copySource, sf, *extent, record._copySize);
+ if (result) {
+ *extent = result;
+ }
+ }
+
+ if (!(_G(_game)->_subType & MYSTERIOUS))
+ sagaSetup(record._imgOffset);
+
+ return CURRENT_GAME;
+}
+
} // End of namespace Scott
} // End of namespace Glk
diff --git a/engines/glk/scott/unp64/unp64.cpp b/engines/glk/scott/unp64/unp64.cpp
new file mode 100644
index 00000000000..d4b3563b69d
--- /dev/null
+++ b/engines/glk/scott/unp64/unp64.cpp
@@ -0,0 +1,33 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#include "glk/scott/unp64/unp64.h"
+#include "glk/scott/types.h"
+
+namespace Glk {
+namespace Scott {
+
+int unp64(uint8_t* compressed, size_t length, uint8_t* destinationBuffer, size_t* finalLength, char* settings[], int numSettings) {
+ return 0;
+}
+
+} // End of namespace Scott
+} // End of namespace Glk
diff --git a/engines/glk/scott/unp64/unp64.h b/engines/glk/scott/unp64/unp64.h
new file mode 100644
index 00000000000..5a875616f75
--- /dev/null
+++ b/engines/glk/scott/unp64/unp64.h
@@ -0,0 +1,32 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#ifndef GLK_SCOTT_UNP64_H
+#define GLK_SCOTT_UNP64_H
+
+namespace Glk {
+namespace Scott {
+
+
+} // End of namespace Scott
+} // End of namespace Glk
+
+#endif
diff --git a/engines/glk/scott/unp64/unp64_interface.h b/engines/glk/scott/unp64/unp64_interface.h
new file mode 100644
index 00000000000..6e1704bab34
--- /dev/null
+++ b/engines/glk/scott/unp64/unp64_interface.h
@@ -0,0 +1,35 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+#ifndef GLK_SCOTT_UNP64_INTERFACE_H
+#define GLK_SCOTT_UNP64_INTERFACE_H
+
+#include "glk/scott/types.h"
+
+namespace Glk {
+namespace Scott {
+
+int unp64(uint8_t *compressed, size_t length, uint8_t *destinationBuffer, size_t *finalLength, char *settings[], int numSettings);
+
+} // End of namespace Scott
+} // End of namespace Glk
+
+#endif