[Scummvm-git-logs] scummvm master -> b06925d089a9313f097841820e3ac4e4edcf1c55

kelmer44 noreply at scummvm.org
Fri Oct 10 07:40:48 UTC 2025


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .

Summary:
b06925d089 TOT: adds more than 6 slots to original saveload screen


Commit: b06925d089a9313f097841820e3ac4e4edcf1c55
    https://github.com/scummvm/scummvm/commit/b06925d089a9313f097841820e3ac4e4edcf1c55
Author: kelmer (kelmer at gmail.com)
Date: 2025-10-10T09:40:34+02:00

Commit Message:
TOT: adds more than 6 slots to original saveload screen

Changed paths:
    engines/tot/engine.cpp
    engines/tot/saveload.cpp
    engines/tot/statics.h
    engines/tot/tot.h


diff --git a/engines/tot/engine.cpp b/engines/tot/engine.cpp
index ec2e93a9d3c..ffa5e3cbfbf 100644
--- a/engines/tot/engine.cpp
+++ b/engines/tot/engine.cpp
@@ -4426,6 +4426,7 @@ void TotEngine::drawInventory(byte dir, byte max) {
 		lightUpLeft();
 	else
 		turnOffLeft();
+
 	if (_inventory[_inventoryPosition + 6].code > 0)
 		lightUpRight();
 	else
@@ -4451,6 +4452,44 @@ void TotEngine::drawInventoryMask() {
 		turnOffRight();
 }
 
+byte *getArrow(uint x, uint y) {
+	Common::File menuFile;
+	if (!menuFile.open("MENUS.DAT")) {
+		showError(258);
+	}
+
+	int32 menuOffset = isLanguageSpanish() ? menuOffsets_ES[0][0] : menuOffsets_EN[0][0];
+	uint w = 20;
+	uint h = 18;
+	uint size = 4 + w * h;
+	byte *bitmap = (byte *)malloc(size);
+	WRITE_LE_UINT16(bitmap, w - 1);
+	WRITE_LE_UINT16(bitmap + 2, h - 1);
+	menuFile.seek(menuOffset);
+
+
+	uint originalW = menuFile.readUint16LE() + 1;
+	for(int i = 0; i < h; i++) {
+		menuFile.seek(menuOffset + 4 + + (y + i) * originalW + x);
+		menuFile.read(bitmap + 4 + i * w, w);
+	}
+	menuFile.close();
+	return bitmap;
+}
+
+void TotEngine::drawLeftArrow(uint x, uint y) {
+	byte *bitmap = getArrow(10, 23);
+	_graphics->putImg(x, y, bitmap);
+	free(bitmap);
+}
+
+void TotEngine::drawRightArrow(uint x, uint y) {
+	byte *bitmap = getArrow(291, 23);
+	_graphics->putImg(x, y, bitmap);
+	free(bitmap);
+}
+
+
 void TotEngine::drawMenu(byte menuNumber) {
 	byte *bitmap;
 	uint menuSize;
diff --git a/engines/tot/saveload.cpp b/engines/tot/saveload.cpp
index d3a82b38019..ff0f216f7ed 100644
--- a/engines/tot/saveload.cpp
+++ b/engines/tot/saveload.cpp
@@ -18,6 +18,7 @@
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  *
  */
+#include "common/hashmap.h"
 #include "common/savefile.h"
 #include "common/translation.h"
 #include "graphics/thumbnail.h"
@@ -571,31 +572,43 @@ void TotEngine::loadGame(SavedGame *game) {
 	_saveAllowed = true;
 }
 
-Common::String drawAndSelectSaves(SaveStateList saves, uint selectedGame) {
+const int kMaxSaveSlots = 100;
+
+Common::String drawAndSelectSaves(int pageNumber, Common::HashMap<int, SaveStateDescriptor> saveMap, uint selectedSlot) {
 	g_engine->_mouse->hide();
 	const char *availableText = getHardcodedTextsByCurrentLanguage()[11];
 	ExtendedSavegameHeader header;
+	int selectedGame = selectedSlot + pageNumber * 6;
+	Common::String selectedGameDesc = "";
 	for (uint i = 0; i < 6; i++) {
-		int color = i == selectedGame ? 255 : 253;
+		int saveSlot = i + pageNumber * 6;
+		int color = saveSlot == selectedGame ? 255 : 253;
 		bar(60, 31 + (i * 15), 259, 39 + (i * 15), 251);
-		Common::String desc = saves[i].getDescription();
+		if (saveSlot >= kMaxSaveSlots) {
+			continue;
+			;
+		}
+		Common::String desc = "";
+		if (saveMap.contains(saveSlot)) {
+			desc = saveMap[saveSlot].getDescription();
+			if (saveSlot == selectedGame) {
+				selectedGameDesc = saveMap[saveSlot].getDescription();
+			}
+		}
 		if (desc.empty() == false) {
 			euroText(65, 29 + (i * 15), desc, color);
 		} else {
-			euroText(65, 29 + (i * 15), availableText, color);
+			euroText(65, 29 + (i * 15), Common::String::format(availableText, saveSlot), color);
 		}
 	}
 
 	g_engine->_mouse->show();
-	if (selectedGame < saves.size())
-		return saves[selectedGame].getDescription();
-	else
-		return "";
+	return selectedGameDesc;
 }
 
 void TotEngine::originalSaveLoadScreen() {
 	uint oldMouseX, oldMouseY;
-	int selectedGame = 0;
+	int selectedSlot = 1;
 	bool modified = false;
 	Common::String saveName = "";
 
@@ -604,29 +617,52 @@ void TotEngine::originalSaveLoadScreen() {
 	oldMouseY = _mouse->mouseY;
 	_mouse->hide();
 
-	uint menuBgSize = imagesize(50, 10, 270, 120);
+	uint menuBgSize = imagesize(20, 10, 300, 120);
 	byte *menuBgPointer = (byte *)malloc(menuBgSize);
-	_graphics->getImg(50, 10, 270, 120, menuBgPointer);
+	_graphics->getImg(20, 10, 300, 120, menuBgPointer);
 
 	for (int i = 0; i < 6; i++) {
 		uint textY = i + 1;
 		buttonBorder((120 - (textY * 10)), (80 - (textY * 10)), (200 + (textY * 10)), (60 + (textY * 10)), 251, 251, 251, 251, 0);
 	}
-	drawMenu(2);
+	drawMenu(2); // 220 x 110	at 	xmenu = 50;ymenu = 10;
+	// 50, 10, 270, 120
+	// Arrows are 20, 18
+	drawLeftArrow(20, 65);
+	line(20, 65, 39, 65, 255);
+	line(20, 65, 20, 80, 255);
+	line(40, 66, 40, 82, 249);
+	line(40, 82, 21, 82, 249);
+	drawRightArrow(280, 65);
+	line(280, 65, 299, 65, 255);
+	line(280, 65, 280, 80, 255);
+	line(300, 66, 300, 82, 249);
+	line(300, 82, 292, 82, 249);
+
 	if (!_saveAllowed) {
 		bar(61, 15, 122, 23, 253);
 		bar(201, 15, 259, 23, 253);
 	}
 
+	int pageNumber = 0;
 	SaveStateList listSaves = getMetaEngine()->listSaves(_targetName.c_str());
-	listSaves.remove_at(0); // Remove autosave
-	saveName = drawAndSelectSaves(listSaves, selectedGame);
+
+	Common::HashMap<int, SaveStateDescriptor> saveMap;
+
+	// Iterate and populate
+	for (const SaveStateDescriptor &desc : listSaves) {
+		int slot = desc.getSaveSlot();
+		saveMap[slot] = desc;
+	}
+
+	saveName = drawAndSelectSaves(pageNumber, saveMap, selectedSlot);
+
 	if (_cpCounter2 > 17)
 		showError(274);
 	_mouse->mouseX = 150;
 	_mouse->mouseY = 60;
 	_mouse->mouseMaskIndex = 1;
-	_mouse->setMouseArea(Common::Rect(55, 13, 250, 105));
+	_mouse->setMouseArea(Common::Rect(13, 13, 293, 105));
 	_mouse->warpMouse(1, 150, 60);
 
 	do {
@@ -651,34 +687,48 @@ void TotEngine::originalSaveLoadScreen() {
 		} while (!keyPressed && !mouseClicked && !shouldQuit());
 
 		if (mouseClicked) {
-			if (_mouse->mouseY >= 13 && _mouse->mouseY <= 16) {
+			if (_mouse->mouseX > 13 && _mouse->mouseX < 33 && _mouse->mouseY >= 58 && _mouse->mouseY <= 73) { // Left arrow
+
+				if (pageNumber > 0)
+					pageNumber--;
+				else
+					_sound->beep(100, 300);
+				saveName = drawAndSelectSaves(pageNumber, saveMap, selectedSlot);
+			} else if (_mouse->mouseX > 273 && _mouse->mouseX < 293 && _mouse->mouseY >= 58 && _mouse->mouseY <= 73) { // Right arrow
+
+				if (pageNumber < kMaxSaveSlots / 6)
+					pageNumber++;
+				else
+					_sound->beep(100, 300);
+				saveName = drawAndSelectSaves(pageNumber, saveMap, selectedSlot);
+			} else if (_mouse->mouseY >= 13 && _mouse->mouseY <= 16) {
 				if (_mouse->mouseX >= 54 && _mouse->mouseX <= 124) { // Save
-					if (selectedGame >= 0 && _saveAllowed && saveName != "") {
-						saveGameState(listSaves[selectedGame].getSaveSlot(), saveName, false);
-						_graphics->putImg(50, 10, menuBgPointer);
+					if (selectedSlot > 0 && _saveAllowed && saveName != "") {
+						saveGameState(selectedSlot + pageNumber * 6, saveName, false);
+						_graphics->putImg(20, 10, menuBgPointer);
 						exitSaveLoadMenu = true;
-						selectedGame = -1;
+						selectedSlot = -1;
 					} else {
 						_sound->beep(100, 300);
 					}
 				} else if (_mouse->mouseX >= 130 && _mouse->mouseX <= 194) {
-					if (selectedGame >= 0 && !modified) { // Load
-						if (selectedGame < (int)listSaves.size()) {
+					if (selectedSlot >= 0 && !modified) { // Load
+						if (selectedSlot < (int)listSaves.size()) {
 							_mouse->hide();
-							_graphics->putImg(50, 10, menuBgPointer);
+							_graphics->putImg(20, 10, menuBgPointer);
 							free(menuBgPointer);
 							if (_saveAllowed) {
 								clearAnimation();
 								clearScreenLayers();
 							}
-							loadGameState(listSaves[selectedGame].getSaveSlot());
+							loadGameState(selectedSlot + pageNumber * 6);
 							_mouse->mouseX = oldMouseX;
 							_mouse->mouseY = oldMouseY;
 
 							_mouse->show();
 							_mouse->setMouseArea(Common::Rect(0, 0, 305, 185));
 							exitSaveLoadMenu = true;
-							selectedGame = -1;
+							selectedSlot = -1;
 
 							return;
 						} else {
@@ -686,48 +736,69 @@ void TotEngine::originalSaveLoadScreen() {
 						}
 					} else {
 						_sound->beep(100, 300);
-						saveName = drawAndSelectSaves(listSaves, selectedGame);
+						saveName = drawAndSelectSaves(pageNumber, saveMap, selectedSlot);
 						_mouse->show();
 					}
 				} else if (_mouse->mouseClickX >= 200 && _mouse->mouseClickX <= 250) { // Exit
 					if (_inGame && _saveAllowed) {
-						_graphics->putImg(50, 10, menuBgPointer);
+						_graphics->putImg(20, 10, menuBgPointer);
 						exitSaveLoadMenu = true;
-						selectedGame = -1;
+						selectedSlot = -1;
 					} else {
 						_sound->beep(100, 300);
 					}
 				}
-			} else if (_mouse->mouseClickY >= 24 && _mouse->mouseClickY <= 32) {
-				selectedGame = 0;
-				modified = false;
-				saveName = drawAndSelectSaves(listSaves, 0);
-			} else if (_mouse->mouseClickY >= 39 && _mouse->mouseClickY <= 47) {
-				selectedGame = 1;
-				modified = false;
-				saveName = drawAndSelectSaves(listSaves, 1);
-			} else if (_mouse->mouseClickY >= 54 && _mouse->mouseClickY <= 62) {
-				selectedGame = 2;
-				modified = false;
-				saveName = drawAndSelectSaves(listSaves, 2);
-			} else if (_mouse->mouseClickY >= 69 && _mouse->mouseClickY <= 77) {
-				selectedGame = 3;
-				modified = false;
-				saveName = drawAndSelectSaves(listSaves, 3);
-			} else if (_mouse->mouseClickY >= 84 && _mouse->mouseClickY <= 92) {
-				selectedGame = 4;
-				modified = false;
-				saveName = drawAndSelectSaves(listSaves, 4);
-			} else if (_mouse->mouseClickY >= 99 && _mouse->mouseClickY <= 107) {
-				selectedGame = 5;
-				modified = false;
-				saveName = drawAndSelectSaves(listSaves, 5);
+			} else {
+				if (_mouse->mouseClickY >= 24 && _mouse->mouseClickY <= 32) {
+					if (0 + pageNumber * 6 >= kMaxSaveSlots) {
+						_sound->beep(100, 300);
+					} else {
+						selectedSlot = 0;
+						modified = false;
+					}
+				} else if (_mouse->mouseClickY >= 39 && _mouse->mouseClickY <= 47) {
+					if (1 + pageNumber * 6 >= kMaxSaveSlots) {
+						_sound->beep(100, 300);
+					} else {
+						selectedSlot = 1;
+						modified = false;
+					}
+				} else if (_mouse->mouseClickY >= 54 && _mouse->mouseClickY <= 62) {
+					if (2 + pageNumber * 6 >= kMaxSaveSlots) {
+						_sound->beep(100, 300);
+					} else {
+						selectedSlot = 2;
+						modified = false;
+					}
+				} else if (_mouse->mouseClickY >= 69 && _mouse->mouseClickY <= 77) {
+					if (3 + pageNumber * 6 >= kMaxSaveSlots) {
+						_sound->beep(100, 300);
+					} else {
+						selectedSlot = 3;
+						modified = false;
+					}
+				} else if (_mouse->mouseClickY >= 84 && _mouse->mouseClickY <= 92) {
+					if (4 + pageNumber * 6 >= kMaxSaveSlots) {
+						_sound->beep(100, 300);
+					} else {
+						selectedSlot = 4;
+						modified = false;
+					}
+				} else if (_mouse->mouseClickY >= 99 && _mouse->mouseClickY <= 107) {
+					if (5 + pageNumber * 6 >= kMaxSaveSlots) {
+						_sound->beep(100, 300);
+					} else {
+						selectedSlot = 5;
+						modified = false;
+					}
+				}
+				saveName = drawAndSelectSaves(pageNumber, saveMap, selectedSlot);
 			}
 		}
 
 		if (keyPressed && _saveAllowed) {
 			_mouse->hide();
-			byte ytext = 29 + (selectedGame * 15);
+			byte ytext = 29 + (selectedSlot * 15);
 			readAlphaGraphSmall(saveName, 30, 65, ytext, 251, 254, lastKeyboardEvent);
 			modified = true;
 			_mouse->show();
diff --git a/engines/tot/statics.h b/engines/tot/statics.h
index b1ee76b54e7..1a5f8a1fba7 100644
--- a/engines/tot/statics.h
+++ b/engines/tot/statics.h
@@ -1125,7 +1125,7 @@ static const char *const hardcodedTexts_ES[] = {
     "PARED", // 8
     "TORNO", // 9
     "VACIO",
-	"DISPONIBLE",
+	"DISPONIBLE %d",
 	"Mira en la fila %d y columna %d"
 };
 
@@ -1141,7 +1141,7 @@ static const char *const hardcodedTexts_EN[] = {
     "WALL",
     "POTTER'S WHEEL",
     "FREE",
-	"AVAILABLE",
+	"AVAILABLE %d",
 	"Search in row %d and column %d"
 };
 
diff --git a/engines/tot/tot.h b/engines/tot/tot.h
index 338d68a6850..ae68217a48b 100644
--- a/engines/tot/tot.h
+++ b/engines/tot/tot.h
@@ -507,6 +507,8 @@ public:
 	void clearAnimation();
 	void buttonBorder(uint x1, uint y1, uint x2, uint y2, byte color1, byte color2, byte color3, byte color4, byte color5);
 	void drawMenu(byte menuNumber);
+	void drawLeftArrow(uint x, uint y);
+	void drawRightArrow(uint x, uint y);
 	void readTextFile();
 	void loadAnimationForDirection(Common::SeekableReadStream *stream, int direction);
 	void sayLine(uint textRef, byte textColor, byte shadowColor, uint &responseNumber, bool isWithinConversation);




More information about the Scummvm-git-logs mailing list