[Scummvm-git-logs] scummvm master -> 4cfe310ce6b27fd4a981a6b7c74bf489963b6a9f
neuromancer
noreply at scummvm.org
Sun Jan 15 19:48:23 UTC 2023
This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
f75bcb2a60 FREESCAPE: refactored code that shows title and border screen in driller
4cfe310ce6 FREESCAPE: added deofuscation code for certain driller releases
Commit: f75bcb2a605943dfcbded1832fd5f46c83ee69b2
https://github.com/scummvm/scummvm/commit/f75bcb2a605943dfcbded1832fd5f46c83ee69b2
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-01-15T16:46:12-03:00
Commit Message:
FREESCAPE: refactored code that shows title and border screen in driller
Changed paths:
engines/freescape/freescape.cpp
engines/freescape/freescape.h
engines/freescape/games/driller.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 80054524438..bdb66beaf95 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -510,26 +510,11 @@ Common::Error FreescapeEngine::run() {
// Simple main event loop
int saveSlot = ConfMan.getInt("save_slot");
centerCrossair();
-
- if (_title && \
- !(isDemo() && isDOS() && isDriller())) { // This should be moved to a Driller specific code
- if (saveSlot == -1) {
- drawTitle();
- _gfx->flipBuffer();
- g_system->updateScreen();
- g_system->delayMillis(3000);
- }
- }
-
+ if (saveSlot == -1)
+ titleScreen();
loadBorder(); // Border is load unmodified
- if (_border && ((isDOS() && !isDemo()) || isSpectrum())) { // This should be moved to a Driller specific code
- if (saveSlot == -1) {
- drawBorder();
- _gfx->flipBuffer();
- g_system->updateScreen();
- g_system->delayMillis(3000);
- }
- }
+ if (saveSlot == -1)
+ borderScreen();
processBorder(); // Border is processed to use during the game
if (saveSlot >= 0) { // load the savegame
@@ -571,6 +556,9 @@ Common::Error FreescapeEngine::run() {
return Common::kNoError;
}
+void FreescapeEngine::titleScreen() {}
+void FreescapeEngine::borderScreen() {}
+
void FreescapeEngine::loadBorder() {
if (_border)
_borderTexture = _gfx->createTexture(_border);
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index db3226b9327..522e7d205da 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -107,6 +107,9 @@ public:
Common::Rect _fullscreenViewArea;
void centerCrossair();
+ virtual void borderScreen();
+ virtual void titleScreen();
+
virtual void loadBorder();
virtual void processBorder();
void drawBorder();
@@ -377,6 +380,9 @@ public:
void gotoArea(uint16 areaID, int entranceID) override;
+ void borderScreen() override;
+ void titleScreen() override;
+
void processBorder() override;
void loadAssets() override;
void drawUI() override;
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index 2214ec3f522..b1299a4ce06 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -144,6 +144,34 @@ DrillerEngine::~DrillerEngine() {
delete _drillBase;
}
+void DrillerEngine::titleScreen() {
+ if (isDOS() && isDemo()) // Demo will not show any title screen
+ return;
+
+ if (isAmiga() || isAtariST()) // These releases has their own screens
+ return;
+
+ if (_title) {
+ drawTitle();
+ _gfx->flipBuffer();
+ g_system->updateScreen();
+ g_system->delayMillis(3000);
+ }
+}
+void DrillerEngine::borderScreen() {
+ if (isDOS() && isDemo()) // Demo will not show the border
+ return;
+
+ if (isAmiga() || isAtariST()) // These releases has their own screens
+ return;
+
+ if (_border) {
+ drawBorder();
+ _gfx->flipBuffer();
+ g_system->updateScreen();
+ g_system->delayMillis(3000);
+ }
+}
void DrillerEngine::gotoArea(uint16 areaID, int entranceID) {
int prevAreaID = _currentArea ? _currentArea->getAreaID(): -1;
Commit: 4cfe310ce6b27fd4a981a6b7c74bf489963b6a9f
https://github.com/scummvm/scummvm/commit/4cfe310ce6b27fd4a981a6b7c74bf489963b6a9f
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-01-15T16:46:12-03:00
Commit Message:
FREESCAPE: added deofuscation code for certain driller releases
Changed paths:
engines/freescape/games/driller.cpp
diff --git a/engines/freescape/games/driller.cpp b/engines/freescape/games/driller.cpp
index b1299a4ce06..f35a7fa9378 100644
--- a/engines/freescape/games/driller.cpp
+++ b/engines/freescape/games/driller.cpp
@@ -395,28 +395,33 @@ void DrillerEngine::loadAssetsDemo() {
}
-Common::SeekableReadStream *parseEDSK(const Common::String filename) {
+byte *parseEDSK(const Common::String filename, int &size) {
debugC(1, kFreescapeDebugParser, "Trying to parse edsk file: %s", filename.c_str());
Common::File file;
file.open(filename);
if (!file.isOpen())
error("Failed to open %s", filename.c_str());
- int size = file.size();
- byte *edskBuffer = (byte *)malloc(size);
- file.read(edskBuffer, size);
+ int totalSize = file.size();
+ byte *edskBuffer = (byte *)malloc(totalSize);
+ file.read(edskBuffer, totalSize);
file.close();
// We don't know the final size, but we allocate enough
- byte *memBuffer = (byte *)malloc(size);
+ byte *memBuffer = (byte *)malloc(totalSize);
byte nsides = edskBuffer[49];
assert(nsides == 1);
int ntracks = 0;
int i = 256;
int j = 0;
- while (i + 1 < size) {
+ while (i + 1 < totalSize) {
byte ssize = edskBuffer[i + 0x14];
+ debug("i: %x ssize: %d, number: %d", i, ssize, edskBuffer[i + 0x10]);
+ assert(ssize == 3 || edskBuffer[i + 0x0] == 'T');
+ assert(ssize == 3 || edskBuffer[i + 0x1] == 'r');
+ assert(ssize == 3 || edskBuffer[i + 0x2] == 'a');
+ //assert(ssize == 3 || ntracks == edskBuffer[i + 0x10]);
int start = i + 0x100;
debugC(1, kFreescapeDebugParser, "sector size: %d", ssize);
if (ssize == 2) {
@@ -424,18 +429,19 @@ Common::SeekableReadStream *parseEDSK(const Common::String filename) {
} else if (ssize == 5) {
i = i + 8 * 512 + 256;
} else if (ssize == 0) {
- i = size - 1;
+ i = totalSize - 1;
} else if (ssize == 3) {
break; // Not sure
} else {
error("ssize: %d", ssize);
}
int osize = i - start;
- debugC(1, kFreescapeDebugParser, "copying track %d start: %x size: %x", ntracks, start, osize);
+ debugC(1, kFreescapeDebugParser, "copying track %d start: %x size: %x, dest: %x", ntracks, start, osize, j);
memcpy(memBuffer + j, edskBuffer + start, osize);
j = j + osize;
ntracks++;
}
+ size = j;
if (0) { // Useful to debug where exactly each object is located in memory once it is parsed
i = 0;
@@ -448,9 +454,8 @@ Common::SeekableReadStream *parseEDSK(const Common::String filename) {
debugN("\n");
}
}
-
free(edskBuffer);
- return (new Common::MemoryReadStream(memBuffer, size));
+ return memBuffer;
}
@@ -557,11 +562,45 @@ void DrillerEngine::loadAssetsFullGame() {
error("Unknown ZX spectrum variant");
} else if (isCPC()) {
loadBundledImages();
- Common::SeekableReadStream *stream;
- if (_variant & GF_CPC_VIRTUALWORLDS)
- stream = parseEDSK("virtualworlds.A.cpc.edsk");
- else
- stream = parseEDSK("driller.cpc.edsk");
+ byte *memBuffer;
+ int memSize = 0;
+ if (_variant & GF_CPC_VIRTUALWORLDS) {
+ memBuffer = parseEDSK("virtualworlds.A.cpc.edsk", memSize);
+
+ // Deofuscation / loader code
+ for (int j = 0; j < 0x200; j++) {
+ memBuffer[0x14000 + j] = memBuffer[0x14200 + j];
+ memBuffer[0x14200 + j] = memBuffer[0x13400 + j];
+ memBuffer[0x14400 + j] = memBuffer[0x13800 + j];
+ memBuffer[0x14600 + j] = memBuffer[0x13c00 + j];
+ }
+
+ for (int j = 0; j < 0x200; j++) {
+ memBuffer[0x13c00 + j] = memBuffer[0x13a00 + j];
+ memBuffer[0x13a00 + j] = memBuffer[0x13600 + j];
+ memBuffer[0x13800 + j] = memBuffer[0x13200 + j];
+ memBuffer[0x13600 + j] = memBuffer[0x12e00 + j];
+ memBuffer[0x12e00 + j] = memBuffer[0x13000 + j];
+ memBuffer[0x13000 + j] = memBuffer[0x12200 + j];
+ memBuffer[0x13200 + j] = memBuffer[0x12600 + j];
+ memBuffer[0x13400 + j] = memBuffer[0x12a00 + j];
+ }
+
+ for (int i = 6; i >= 0; i--) {
+ //debug("copying 0x200 bytes to %x from %x", 0x12000 + 0x200*i, 0x11400 + 0x400*i);
+ for (int j = 0; j < 0x200; j++) {
+ memBuffer[0x12000 + 0x200*i + j] = memBuffer[0x11400 + 0x400*i + j];
+ }
+ }
+
+ for (int j = 0; j < 0x200; j++) {
+ memBuffer[0x11c00 + j] = memBuffer[0x11e00 + j];
+ memBuffer[0x11e00 + j] = memBuffer[0x11000 + j];
+ }
+ } else
+ memBuffer = parseEDSK("driller.cpc.edsk", memSize);
+ assert(memSize > 0);
+ Common::SeekableReadStream *stream = new Common::MemoryReadStream((const byte*)memBuffer, memSize);
if (_variant & GF_CPC_RETAIL) {
loadMessagesFixedSize(stream, 0xb0f7, 14, 20);
@@ -574,7 +613,7 @@ void DrillerEngine::loadAssetsFullGame() {
load8bitBinary(stream, 0xaccb, 4);
loadGlobalObjects(stream, 0xacb2 - 0x3fab);
} else if (_variant & _variant & GF_CPC_VIRTUALWORLDS) {
- error("Not implemented yet");
+ load8bitBinary(stream, 0x11acb, 4);
} else if (_variant & GF_CPC_BUDGET) {
loadMessagesFixedSize(stream, 0x9ef7, 14, 20);
loadFonts(stream, 0xd914);
@@ -843,7 +882,7 @@ void DrillerEngine::drawCPCUI(Graphics::Surface *surface) {
drawStringInSurface(message, 191, 180, back, front, surface);
_temporaryMessages.push_back(message);
_temporaryMessageDeadlines.push_back(deadline);
- } else {
+ } else if (_messagesList.size() > 0) {
if (_currentArea->_gasPocketRadius == 0)
message = _messagesList[2];
else if (_drillStatusByArea[_currentArea->getAreaID()])
More information about the Scummvm-git-logs
mailing list