From 9f7a9a4493fa83974ca2fb61ba725445d5eba89d Mon Sep 17 00:00:00 2001 From: Avijeet Date: Tue, 14 Jun 2022 14:03:01 +0530 Subject: [PATCH] GLK: SCOTT: Implement decrunchC64 --- engines/glk/module.mk | 1 + engines/glk/scott/c64_checksums.cpp | 82 ++++++++++++++++++++++- engines/glk/scott/unp64/unp64.cpp | 33 +++++++++ engines/glk/scott/unp64/unp64.h | 32 +++++++++ engines/glk/scott/unp64/unp64_interface.h | 35 ++++++++++ 5 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 engines/glk/scott/unp64/unp64.cpp create mode 100644 engines/glk/scott/unp64/unp64.h create mode 100644 engines/glk/scott/unp64/unp64_interface.h 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