[Scummvm-git-logs] scummvm master -> 8d6783e0e90b660b0767154186e409152403434b

sev- sev at scummvm.org
Fri Oct 29 13:59:57 UTC 2021


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:
8d6783e0e9 GROOVIE: Complete WineRack puzzle implementation


Commit: 8d6783e0e90b660b0767154186e409152403434b
    https://github.com/scummvm/scummvm/commit/8d6783e0e90b660b0767154186e409152403434b
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2021-10-29T16:59:34+03:00

Commit Message:
GROOVIE: Complete WineRack puzzle implementation

Changed paths:
    engines/groovie/logic/winerack.cpp
    engines/groovie/logic/winerack.h


diff --git a/engines/groovie/logic/winerack.cpp b/engines/groovie/logic/winerack.cpp
index 6b42ac61b4..7fb3a03091 100644
--- a/engines/groovie/logic/winerack.cpp
+++ b/engines/groovie/logic/winerack.cpp
@@ -174,6 +174,34 @@ int8 WineRackGame::findEmptySpot() {
 }
 
 void WineRackGame::sub05(int8 player, int8 *moves) {
+	int8 moves1[23];
+	int8 moves2[23];
+	int8 to, delta, playerIndex;
+
+	if (player == 1) {
+		to = 90;
+		delta = 10;
+		playerIndex = 2;
+	} else {
+		to = 9;
+		delta = 1;
+		playerIndex = 3;
+	}
+
+	memset(moves, 0, 23);
+
+	for (int i = 0; i < to; i += delta) {
+		if (!_wineRackGrid[i] || _wineRackGrid[i] == player) {
+			memset(moves1, 0, sizeof(moves1));
+			memset(moves2, 0, sizeof(moves2));
+
+			sub13(i, playerIndex, moves1, moves2);
+
+			if (moves[0] < moves1[0]) {
+				memcpy(moves, moves1, 23);
+			}
+		}
+	}
 }
 
 int8 WineRackGame::sub06(int8 *moves1, int8 *moves2) {
@@ -263,6 +291,143 @@ uint32 WineRackGame::sub12() {
 	return 0;
 }
 
+void WineRackGame::sub13(int8 cell, int8 player, int8 *moves1, int8 *moves2) {
+	int8 candidates[4];
+
+	if (cell == -1)
+		return;
+
+	moves2[moves2[2] + 3] = cell;
+
+	if (wineRackLogicTable[12 * cell + player] < 0) {
+		++moves2[2];
+
+		moves2[0] = countEmtpy(moves2);
+
+		if (moves2[0] > moves1[0])
+			memcpy(moves1, moves2, 23);
+
+		--moves2[2];
+	} else {
+		++moves2[2];
+
+		if (player == 2)
+			sub15(cell, candidates);
+		else
+			sub16(cell, candidates);
+
+		for (int i = 0; candidates[i] != -1; i++)
+			sub13(candidates[i], player, moves1, moves2);
+
+		--moves2[2];
+	}
+}
+
+void WineRackGame::sub15(int8 cell, int8 *candidates) {
+	int8 depth = 0;
+	int8 pos2 = wineRackLogicTable[12 * cell + 2];
+	int8 pos1 = wineRackLogicTable[12 * cell + 1];
+
+	if (_wineRackGrid[pos2] == 2) {
+		if (pos1 < 0 || _wineRackGrid[pos1] == 2) {
+			if (cell >= 20) {
+				int8 val1 = _wineRackGrid[cell - 10];
+
+				if (val1 != 2) {
+					int8 val2 = _wineRackGrid[cell - 10];
+
+					if (val2 != 2 && (val1 == 1 || val2 == 1)) {
+						depth = 1;
+						candidates[0] = cell - 10;
+					}
+				}
+			}
+			if (cell < 80) {
+				int8 val1 = _wineRackGrid[cell + 10];
+
+				if (val1 != 2) {
+					int8 val2 = _wineRackGrid[cell + 11];
+
+					if (val2 != 2 && (val1 == 1 || val2 == 1)) {
+						candidates[depth] = cell + 10;
+						depth++;
+					}
+				}
+			}
+		} else if (_wineRackGrid[cell] == 1 || _wineRackGrid[pos1] == 1) {
+			depth = 1;
+			candidates[0] = pos1;
+		}
+	} else if (pos1 < 0 || _wineRackGrid[pos1] == 2) {
+		if (_wineRackGrid[cell] == 1 || _wineRackGrid[pos2] == 1) {
+			depth = 1;
+			candidates[0] = pos2;
+		}
+	} else {
+		depth = 2;
+		candidates[0] = pos2;
+		candidates[1] = pos1;
+	}
+
+	candidates[depth] = -1;
+}
+
+void WineRackGame::sub16(int8 cell, int8 *candidates) {
+	int8 depth = 0;
+	int8 pos3 = wineRackLogicTable[12 * cell + 3];
+	int8 pos4 = wineRackLogicTable[12 * cell + 4];
+
+	if (_wineRackGrid[pos3] == 1) {
+		if (pos4 < 0 || _wineRackGrid[pos4] == 1) {
+			if (cell % 10 >= 2) {
+				int8 val1 = _wineRackGrid[cell - 1];
+
+				if (val1 != 1) {
+					int8 val2 = _wineRackGrid[cell + 8];
+
+					if (val2 != 1 && (val1 == 2 || val2 == 2)) {
+						depth = 1;
+						candidates[0] = cell - 1;
+					}
+				}
+			}
+			if (cell < 80 && _wineRackGrid[cell + 1] != 1) {
+				int8 val1 = _wineRackGrid[cell + 11];
+
+				if (val1 != 1 && (_wineRackGrid[cell + 1] == 2 || val1 == 2)) {
+					candidates[depth] = cell + 1;
+					depth++;
+				}
+			}
+		} else if (_wineRackGrid[cell] == 2 || _wineRackGrid[pos4] == 2) {
+			depth = 1;
+			candidates[0] = pos4;
+		}
+	} else if (pos4 < 0 || _wineRackGrid[pos4] == 1) {
+		if (_wineRackGrid[cell] == 2 || _wineRackGrid[pos3] == 2) {
+			depth = 1;
+			candidates[0] = pos3;
+		}
+	} else {
+		depth = 2;
+		candidates[0] = pos3;
+		candidates[1] = pos4;
+	}
+
+	candidates[depth] = -1;
+}
+
+int8 WineRackGame::countEmtpy(int8 *moves) {
+	int8 cnt = 0;
+
+	for (int i = 0; i < moves[2]; i++) {
+		if (!_wineRackGrid[moves[i + 3]])
+			++cnt;
+	}
+
+	return 20 - cnt;
+}
+
 int8 WineRackGame::randomMoveStart() {
 	const int8 moves[] = { 44, 45, 54, 55 };
 
diff --git a/engines/groovie/logic/winerack.h b/engines/groovie/logic/winerack.h
index a3e7f09118..fe26e81cd5 100644
--- a/engines/groovie/logic/winerack.h
+++ b/engines/groovie/logic/winerack.h
@@ -49,6 +49,10 @@ private:
 	void sub10(int8 endPos, int8 pos, int unused, int player, int *val);
 	void sub11(int8 pos, int8 *candidates);
 	uint32 sub12();
+	void sub13(int8 cell, int8 player, int8 *moves1, int8 *moves2);
+	void sub15(int8 cell, int8 *candidates);
+	void sub16(int8 cell, int8 *candidates);
+	int8 countEmtpy(int8 *moves);
 	int8 randomMoveStart();
 	int8 randomMoveStart2();
 




More information about the Scummvm-git-logs mailing list