[Scummvm-git-logs] scummvm master -> 7d1001738e86daba0c6c8df40f7cc237e9653daa
neuromancer
noreply at scummvm.org
Fri Aug 4 20:02:19 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
7d1001738e FREESCAPE: connect all the ECDs in dark
Commit: 7d1001738e86daba0c6c8df40f7cc237e9653daa
https://github.com/scummvm/scummvm/commit/7d1001738e86daba0c6c8df40f7cc237e9653daa
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-08-04T22:02:09+02:00
Commit Message:
FREESCAPE: connect all the ECDs in dark
Changed paths:
engines/freescape/freescape.h
engines/freescape/games/dark/dark.cpp
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index 15eef320e85..8af6f12cf64 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -520,6 +520,11 @@ private:
Common::SeekableReadStream *decryptFileAtari(const Common::String filename);
};
+struct ECD {
+ uint16 _area;
+ int _id;
+};
+
class DarkEngine : public FreescapeEngine {
public:
DarkEngine(OSystem *syst, const ADGameDescription *gd);
@@ -565,7 +570,9 @@ private:
void addECDs(Area *area);
void addECD(Area *area, const Math::Vector3d position, int index);
void restoreECD(Area *area, int index);
- bool checkECD(int index);
+ bool checkECD(uint16 areaID, int index);
+ bool tryDestroyECD(int index);
+ bool tryDestroyECDFullGame(int index);
void addWalls(Area *area);
Common::SeekableReadStream *decryptFile(const Common::String filename);
Common::HashMap<uint16, bool> _exploredAreas;
diff --git a/engines/freescape/games/dark/dark.cpp b/engines/freescape/games/dark/dark.cpp
index 2794ce40476..aca8431ecd1 100644
--- a/engines/freescape/games/dark/dark.cpp
+++ b/engines/freescape/games/dark/dark.cpp
@@ -138,6 +138,17 @@ void DarkEngine::restoreECD(Area *area, int index) {
}
}
+bool DarkEngine::checkECD(uint16 areaID, int index) {
+ Area *area = _areaMap[areaID];
+ assert(area != nullptr);
+ int16 id = 227 + index * 6 - 2;
+ debugC(1, kFreescapeDebugParser, "Checking object %d to from ECD %d", id, index);
+ Object *obj = (GeometricObject *)area->objectWithID(id);
+ assert(obj != nullptr);
+ debugC(1, kFreescapeDebugParser, "Result: %d", !obj->isDestroyed());
+ return !obj->isDestroyed();
+}
+
void DarkEngine::initGameState() {
_flyMode = false;
_noClipMode = false;
@@ -170,15 +181,140 @@ void DarkEngine::initGameState() {
_exploredAreas[_startArea] = true;
}
-bool DarkEngine::checkECD(int index) {
+bool DarkEngine::tryDestroyECDFullGame(int index) {
+ switch (_currentArea->getAreaID()) {
+ case 1:
+ assert(index == 0);
+ return true;
+
+ case 4:
+ assert(index == 0);
+ return !(checkECD(1, 0) && checkECD(10, 0));
+
+ case 5:
+ assert(index == 0);
+ return !(checkECD(12, 0) && checkECD(12, 1)); // Check both
+
+ case 8:
+ assert(index <= 1);
+ if (index == 0)
+ return true;
+ else if (index == 1)
+ return !(checkECD(18, 0) && checkECD(10, 0)); // Check both
+ break;
+
+ case 10:
+ assert(index <= 2);
+ if (index == 0)
+ return !(checkECD(4, 0) && checkECD(18, 1));
+ else if (index == 1) {
+ int connections = 0;
+ connections += checkECD(16, 0);
+ connections += checkECD(8, 0);
+ connections += checkECD(11, 0);
+ return connections <= 1;
+ } else if (index == 2)
+ return true;
+ break;
+
+ case 11:
+ assert(index <= 1);
+ if (index == 0)
+ return true;
+ else if (index == 1)
+ return !(checkECD(10, 0) && checkECD(12, 0)); // TODO: verify
+ break;
+
+ case 12:
+ assert(index <= 2);
+ if (index == 0)
+ return !(checkECD(5, 0) && checkECD(11, 1)); // Check last one
+ else if (index == 1)
+ return !(checkECD(5, 0) && checkECD(13, 0)); // Check both
+ else if (index == 2)
+ return true;
+ else
+ assert(false);
+
+ break;
+
+ case 13:
+ assert(index <= 1);
+ if (index == 0)
+ return !(checkECD(13, 1) && checkECD(12, 1));
+ else if (index == 1)
+ return true;
+ else
+ assert(false);
+ break;
+
+ case 14:
+ if (index == 0)
+ return true;
+ else if (index == 1)
+ return !(checkECD(14, 0) && checkECD(14, 2));
+ else if (index == 2)
+ return !(checkECD(14, 1) && checkECD(18, 0));
+ else
+ assert(false);
+ break;
+ case 16:
+ assert(index <= 1);
+ if (index == 0)
+ return !(checkECD(10, 1) && checkECD(18, 0));
+ else if (index == 1)
+ return !(checkECD(10, 2) && checkECD(18, 1));
+ else
+ assert(false);
+ break;
+
+ case 17:
+ assert(index <= 2);
+ if (index == 0)
+ return !(checkECD(12, 2) && checkECD(18, 1));
+ else if (index == 1)
+ return true;
+ else if (index == 2)
+ return !(checkECD(17, 1) && checkECD(18, 1));
+ else
+ assert(0);
+ break;
+
+ case 18:
+ assert(index <= 1);
+ if (index == 0) {
+ int connections = 0;
+ connections += checkECD(16, 0);
+ connections += checkECD(8, 1);
+ connections += checkECD(14, 2);
+ return connections <= 1;
+ } else if (index == 1) {
+ int connections = 0;
+ connections += checkECD(10, 0);
+ connections += checkECD(16, 1);
+ connections += checkECD(17, 0);
+ connections += checkECD(17, 2);
+ return connections <= 1;
+ } else
+ assert(false);
+ default:
+ break;
+
+ }
+ error("Not implemented");
+}
+
+bool DarkEngine::tryDestroyECD(int index) {
if (isDemo()) {
if (index == 1) {
- restoreECD(_currentArea, index);
return false;
}
return true;
+ } else {
+ return tryDestroyECDFullGame(index);
}
- return true;
+ return true; // Unreachable
+
}
void DarkEngine::addSkanner(Area *area) {
@@ -216,13 +352,18 @@ void DarkEngine::addSkanner(Area *area) {
bool DarkEngine::checkIfGameEnded() {
if (_gameStateVars[kVariableDarkECD] > 0) {
- bool destroyed = checkECD(_gameStateVars[kVariableDarkECD] - 1);
+ int index = _gameStateVars[kVariableDarkECD] - 1;
+ //insertTemporaryMessage(Common::String::format("%-14d", _gameStateVars[kVariableDarkECD] - 1), _countdown - 2);
+ //restoreECD(_currentArea, _gameStateVars[kVariableDarkECD] - 1);
+ bool destroyed = tryDestroyECD(index);
if (destroyed) {
_gameStateVars[kVariableActiveECDs] -= 4;
_gameStateVars[k8bitVariableScore] += 52750;
insertTemporaryMessage(_messagesList[2], _countdown - 2);
- } else
+ } else {
+ restoreECD(_currentArea, index);
insertTemporaryMessage(_messagesList[1], _countdown - 2);
+ }
_gameStateVars[kVariableDarkECD] = 0;
}
More information about the Scummvm-git-logs
mailing list