[Scummvm-git-logs] scummvm master -> 585a837fe5c6941f7430a38dde6bc16bc87735fd

mgerhardy noreply at scummvm.org
Mon Sep 7 05:22:17 UTC 2026


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

Summary:
a5e8fb28b8 MACS2: const
2e3b70fa6a MACS2: order by alphabetical order by last name
1804748342 MACS2: build by default and switched to ADGF_TESTING
585a837fe5 DOCS: add description of engine options for macs2


Commit: a5e8fb28b82ec515f7cbd514558362d087033dc6
    https://github.com/scummvm/scummvm/commit/a5e8fb28b82ec515f7cbd514558362d087033dc6
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2026-09-07T07:21:53+02:00

Commit Message:
MACS2: const

Changed paths:
    engines/macs2/macs2.cpp
    engines/macs2/midiparser_macs2.cpp
    engines/macs2/pathfinding.cpp


diff --git a/engines/macs2/macs2.cpp b/engines/macs2/macs2.cpp
index 233b0b63af4..00b054019a1 100644
--- a/engines/macs2/macs2.cpp
+++ b/engines/macs2/macs2.cpp
@@ -71,7 +71,7 @@ bool isMapModeActive() {
 	return view != nullptr && view->_currentMode == ViewMode::VM_HELP;
 }
 
-Common::Point getSceneObjectHotspotPosition(View1 *view, GameObject *obj) {
+const Common::Point &getSceneObjectHotspotPosition(const View1 *view, const GameObject *obj) {
 	if (view != nullptr) {
 		const Character *character = view->getCharacterByIndex(obj->_index);
 		if (character != nullptr && !character->_markedForDeletion)
@@ -1625,7 +1625,7 @@ bool Macs2Engine::readMegaPicImage(Common::SeekableReadStream *stream, int width
 	rowBuf.resize(3000);
 
 	for (int y = 0; y < height; y++) {
-		uint16 packedLen = stream->readUint16LE();
+		const uint16 packedLen = stream->readUint16LE();
 		if (packedLen == 0 || packedLen > 2999) {
 			return false;
 		}
@@ -1979,7 +1979,6 @@ void Macs2Engine::updateBackgroundAnimationDepthMap(size_t animIndex) {
 		return;
 	}
 
-	BackgroundAnimation &anim = _backgroundAnimations[animIndex];
 	BackgroundAnimationBlob &blobEntry = _backgroundAnimationsBlobs[animIndex];
 	Common::Array<uint8> &blob = blobEntry.activeBlob();
 	if (blob.empty()) {
@@ -2000,6 +1999,7 @@ void Macs2Engine::updateBackgroundAnimationDepthMap(size_t animIndex) {
 		return;
 	}
 
+	const BackgroundAnimation &anim = _backgroundAnimations[animIndex];
 	const int16 baseX = (int16)anim._x + 1 + frameOffsetX;
 	const int16 baseY = (int16)anim._y + frameOffsetY;
 	const byte *pixels = &blob[frameStart + 10];
@@ -2162,22 +2162,18 @@ uint16 Macs2Engine::getHotspotAtPoint(const Common::Point &p) const {
 		return 0;
 	}
 
-	uint8 firstLookup = _hotspotMap.getPixel(p.x, p.y);
-	uint16 numHotspots = _numHotspots;
-
 	uint8 i = 1;
-	if (i > numHotspots) {
+	if (i > _numHotspots) {
 		return 0;
 	}
-
-	Common::Array<uint16> a = _hotspotColorTable;
+	const uint8 firstLookup = _hotspotMap.getPixel(p.x, p.y);
 
 	do {
-		if ((uint)(i - 1) >= a.size()) {
+		if ((uint)(i - 1) >= _hotspotColorTable.size()) {
 			break;
 		}
 		// Binary compares only the low byte: *(char*)(scene + i*2 + 0x50D3)
-		uint8 lookup = (uint8)a[i - 1];
+		const uint8 lookup = (uint8)_hotspotColorTable[i - 1];
 		if (lookup == firstLookup) {
 			if (_hotspotOverrides[i] != 0xFFFF) {
 				return 0x800 + _hotspotOverrides[i];
@@ -2185,7 +2181,7 @@ uint16 Macs2Engine::getHotspotAtPoint(const Common::Point &p) const {
 			return 0x800 + i;
 		}
 		i++;
-	} while (i <= numHotspots);
+	} while (i <= _numHotspots);
 	return 0;
 }
 
@@ -2246,10 +2242,10 @@ void Macs2Engine::rebuildHotspotSnapshot() const {
 		}
 	}
 
-	View1 *view = g_events ? (View1 *)g_events->findView("View1") : nullptr;
+	const View1 *view = g_events ? (View1 *)g_events->findView("View1") : nullptr;
 	const uint16 sceneIndex = (uint16)Scenes::instance()._currentSceneIndex;
 	for (uint16 objectIndex = 1; objectIndex <= kMaxSceneObjects; ++objectIndex) {
-		GameObject *obj = GameObjects::getObjectByIndex(objectIndex);
+		const GameObject *obj = GameObjects::getObjectByIndex(objectIndex);
 		if (obj == nullptr || obj->_dataOffset == 0) {
 			continue;
 		}
@@ -2281,11 +2277,11 @@ bool Macs2Engine::hotspotDirty() const {
 		return false;
 	}
 
-	View1 *view = g_events ? (View1 *)g_events->findView("View1") : nullptr;
+	const View1 *view = g_events ? (View1 *)g_events->findView("View1") : nullptr;
 	const uint16 sceneIndex = (uint16)Scenes::instance()._currentSceneIndex;
 	uint snapshotIdx = 0;
 	for (uint16 objectIndex = 1; objectIndex <= kMaxSceneObjects; ++objectIndex) {
-		GameObject *obj = GameObjects::getObjectByIndex(objectIndex);
+		const GameObject *obj = GameObjects::getObjectByIndex(objectIndex);
 		if (obj == nullptr || obj->_dataOffset == 0) {
 			continue;
 		}
@@ -2293,7 +2289,7 @@ bool Macs2Engine::hotspotDirty() const {
 			continue;
 		}
 
-		const Common::Point pos = getSceneObjectHotspotPosition(view, obj);
+		const Common::Point &pos = getSceneObjectHotspotPosition(view, obj);
 		if (snapshotIdx >= _hotspotSnapshot.sceneObjects.size()) {
 			rebuildHotspotSnapshot();
 			return true;
@@ -2336,7 +2332,7 @@ void Macs2Engine::getHotspotPositions(Common::Array<Graphics::HotspotInfo> &hots
 		hotspots.emplace_back(Graphics::HotspotInfo(center, hotspotLabelToU32(name), type));
 	}
 
-	View1 *view = g_events ? (View1 *)g_events->findView("View1") : nullptr;
+	const View1 *view = g_events ? (View1 *)g_events->findView("View1") : nullptr;
 	const uint16 currentActorIndex = (uint16)Scenes::instance()._currentActorIndex;
 	for (const HotspotSnapshot::SceneObjectEntry &entry : _hotspotSnapshot.sceneObjects) {
 		if (entry.index == currentActorIndex) {
@@ -2348,7 +2344,7 @@ void Macs2Engine::getHotspotPositions(Common::Array<Graphics::HotspotInfo> &hots
 			continue;
 		}
 
-		Character *character = view ? view->getCharacterByIndex(entry.index) : nullptr;
+		const Character *character = view ? view->getCharacterByIndex(entry.index) : nullptr;
 		const bool isCharacter = character != nullptr && !character->_markedForDeletion;
 		Graphics::HotspotType hotspotType = Graphics::kHotspotObject;
 		if (isCharacter && GameObjects::isNpcIndex(entry.index)) {
@@ -2471,17 +2467,17 @@ void Macs2Engine::loadTranslation() {
 		return;
 	}
 
-	uint16 version = f->readUint16LE();
+	const uint16 version = f->readUint16LE();
 	if (version != 1) {
 		warning("Unsupported macs2_translation.dat version %u", version);
 		delete f;
 		return;
 	}
 
-	uint16 numScenes = f->readUint16LE();
-	uint16 numObjects = f->readUint16LE();
-	uint16 numHotspotLabels = f->readUint16LE();
-	uint16 numUiLabels = f->readUint16LE();
+	const uint16 numScenes = f->readUint16LE();
+	const uint16 numObjects = f->readUint16LE();
+	const uint16 numHotspotLabels = f->readUint16LE();
+	const uint16 numUiLabels = f->readUint16LE();
 
 	// Read index tables
 	struct IndexEntry {
@@ -2527,7 +2523,7 @@ void Macs2Engine::loadTranslation() {
 		f->seek(objectIndex[i].dataOffset);
 		TranslationEntry entry;
 		for (uint16 j = 0; j < objectIndex[i].numStrings; j++) {
-			uint16 len = f->readUint16LE();
+			const uint16 len = f->readUint16LE();
 			Common::String s;
 			for (uint16 k = 0; k < len; k++) {
 				s += (char)f->readByte();
@@ -2540,12 +2536,12 @@ void Macs2Engine::loadTranslation() {
 
 	auto readLabelMap = [f](uint16 count, Common::HashMap<Common::String, Common::String> &out) {
 		for (uint16 i = 0; i < count; i++) {
-			uint16 keyLen = f->readUint16LE();
+			const uint16 keyLen = f->readUint16LE();
 			Common::String key;
 			for (uint16 k = 0; k < keyLen; k++) {
 				key += (char)f->readByte();
 			}
-			uint16 valLen = f->readUint16LE();
+			const uint16 valLen = f->readUint16LE();
 			Common::String val;
 			for (uint16 k = 0; k < valLen; k++) {
 				val += (char)f->readByte();
@@ -2607,8 +2603,8 @@ Common::StringArray Macs2Engine::decodeStrings(Common::MemoryReadStream *stream,
 		}
 	} else {
 		for (int i = 0; i < numStrings; i++) {
+			const uint16 length = stream->readUint16LE();
 			Common::String currentLine;
-			uint16 length = stream->readUint16LE();
 			for (int index = 1; index < length + 1; index++) {
 				const byte currentByte = stream->readByte();
 				const byte x = (byte)(index * index * 0x0c);
@@ -2622,7 +2618,7 @@ Common::StringArray Macs2Engine::decodeStrings(Common::MemoryReadStream *stream,
 
 	// Apply translation if available
 	if (getFeatures() & GF_TRANSLATED) {
-		int baseIndex = computeStringIndex(stream, offset);
+		const int baseIndex = computeStringIndex(stream, offset);
 		const TranslationEntry *entry = nullptr;
 		if (objectId != 0 && _objectTranslations.contains(objectId)) {
 			entry = &_objectTranslations[objectId];
@@ -2631,7 +2627,7 @@ Common::StringArray Macs2Engine::decodeStrings(Common::MemoryReadStream *stream,
 		}
 		if (entry) {
 			for (int i = 0; i < numStrings; i++) {
-				int idx = baseIndex + i;
+				const int idx = baseIndex + i;
 				if (idx >= 0 && idx < (int)entry->strings.size() && !entry->strings[idx].empty()) {
 					result[i] = entry->strings[idx];
 				}
@@ -2661,7 +2657,7 @@ bool Macs2Engine::loadAnimationFromSceneData(uint16 objectIndex, uint16 slotInde
 		}
 		address = _sceneResourceOffsets[arrayIndex - 1];
 	} else {
-		GameObject *execObj = GameObjects::getObjectByIndex(executingScriptObjectId);
+		const GameObject *execObj = GameObjects::getObjectByIndex(executingScriptObjectId);
 		if (execObj == nullptr || arrayIndex == 0 || arrayIndex > maxObjectResources()) {
 			_scriptExecutor->setScriptError(1);
 			return false;
@@ -2674,7 +2670,7 @@ bool Macs2Engine::loadAnimationFromSceneData(uint16 objectIndex, uint16 slotInde
 	}
 
 	_fileStream->seek(address);
-	uint32 size = _fileStream->readUint32LE();
+	const uint32 size = _fileStream->readUint32LE();
 	_fileStream->seek(address + 0x10);
 	Common::Array<uint8> data;
 	data.resize(size);
@@ -2810,8 +2806,8 @@ bool Macs2Engine::loadObjectData(GameObject *obj) {
 	}
 	for (int j = 0; j < (int)animSlotCount; j++) {
 		_fileStream->readUint16LE(); // animID (editor metadata, unused at runtime)
-		uint16 blobSourceKey = _fileStream->readUint16LE();
-		uint32 dataSize = _fileStream->readUint32LE();
+		const uint16 blobSourceKey = _fileStream->readUint16LE();
+		const uint32 dataSize = _fileStream->readUint32LE();
 
 		if (_fileStream->eos() && dataSize != 0) {
 			rollbackPartialLoad();
@@ -2846,14 +2842,14 @@ bool Macs2Engine::loadObjectData(GameObject *obj) {
 			obj->_blobSourceKeys.push_back(blobSourceKey);
 		}
 
-		uint16 blobSpeed = _fileStream->readUint16LE();
+		const uint16 blobSpeed = _fileStream->readUint16LE();
 		if (j < (int)obj->_blobWalkSpeeds.size()) {
 			obj->_blobWalkSpeeds[j] = blobSpeed;
 		} else {
 			obj->_blobWalkSpeeds.push_back(blobSpeed);
 		}
 
-		uint16 blobMirrorFlag = _fileStream->readByte();
+		const uint16 blobMirrorFlag = _fileStream->readByte();
 		_fileStream->readByte(); // discarded byte
 		if (j < (int)obj->_blobMirrorFlags.size()) {
 			obj->_blobMirrorFlags[j] = blobMirrorFlag != 0;
diff --git a/engines/macs2/midiparser_macs2.cpp b/engines/macs2/midiparser_macs2.cpp
index 3cbefbac0e8..0143797ba80 100644
--- a/engines/macs2/midiparser_macs2.cpp
+++ b/engines/macs2/midiparser_macs2.cpp
@@ -38,7 +38,7 @@ bool MidiParser_Macs2::loadMusic(const byte *data, uint32 size) {
 	// Offset 0x06: instrument data offset (relative to file start)
 	// Offset 0x08: song data offset (relative to file start)
 	// Offset 0x0C: timer frequency
-	uint16 dataOffset = READ_LE_UINT16(data + 0x08);
+	const uint16 dataOffset = READ_LE_UINT16(data + 0x08);
 	_timerFrequency = READ_LE_UINT16(data + 0x0C);
 
 	if (dataOffset >= size)
diff --git a/engines/macs2/pathfinding.cpp b/engines/macs2/pathfinding.cpp
index 7a7b4c27b18..467b0599dd5 100644
--- a/engines/macs2/pathfinding.cpp
+++ b/engines/macs2/pathfinding.cpp
@@ -42,7 +42,7 @@ uint16 Pathfinding::walkabilityAt(int16 y, int16 x) const {
 	if (x < 0 || x >= _map.w || y < 0 || y >= _map.h) {
 		return 0;
 	}
-	uint16 value = _map.getPixel(x, y);
+	const uint16 value = _map.getPixel(x, y);
 	if (value >= 0xC8 && value <= 0xEF) {
 		uint16 overrideResult;
 		if (getWalkOverride(value, overrideResult)) {
@@ -99,7 +99,7 @@ uint16 Pathfinding::areaOverrideAt(uint16 index) const {
 
 void Pathfinding::removeWalkOverride(uint16 index) {
 	for (uint i = 0; i < _walkOverrides.size(); i++) {
-		PathfindingAreaOverride &current = _walkOverrides[i];
+		const PathfindingAreaOverride &current = _walkOverrides[i];
 		if (current._index == index) {
 			_walkOverrides.remove_at(i);
 			return;
@@ -112,8 +112,8 @@ void Pathfinding::snapToWalkable(int16 *pTargetY, int16 *pTargetX, int16 charY,
 		return;
 	}
 
-	int16 savedX = *pTargetX;
-	int16 savedY = *pTargetY;
+	const int16 savedX = *pTargetX;
+	const int16 savedY = *pTargetY;
 	const int16 maxY = (int16)(_map.h - 1);
 	const int16 maxX = (int16)(_map.w - 1);
 
@@ -133,7 +133,7 @@ void Pathfinding::snapToWalkable(int16 *pTargetY, int16 *pTargetX, int16 charY,
 	// Phase 2: Continue scanning to bottom for best depth match
 	int16 scanY = *pTargetY;
 	while (scanY <= maxY) {
-		uint16 w = walkabilityAt(scanY, *pTargetX);
+		const uint16 w = walkabilityAt(scanY, *pTargetX);
 		if (scanY - (int16)w == savedY) {
 			*pTargetY = scanY;
 		}
@@ -155,12 +155,12 @@ void Pathfinding::snapToWalkable(int16 *pTargetY, int16 *pTargetX, int16 charY,
 	}
 
 	// Phase 4: If still non-walkable, scan X toward character
-	uint16 w = walkabilityAt(*pTargetY, *pTargetX);
+	const uint16 w = walkabilityAt(*pTargetY, *pTargetX);
 	if (isWalkabilityBlocking(w)) {
 		*pTargetY = savedY;
 		if (charX < *pTargetX) {
 			while (true) {
-				uint16 w2 = walkabilityAt(*pTargetY, *pTargetX);
+				const uint16 w2 = walkabilityAt(*pTargetY, *pTargetX);
 				if (isWalkabilityWalkable(w2)) {
 					break;
 				}
@@ -171,7 +171,7 @@ void Pathfinding::snapToWalkable(int16 *pTargetY, int16 *pTargetX, int16 charY,
 			}
 		} else {
 			while (true) {
-				uint16 w2 = walkabilityAt(*pTargetY, *pTargetX);
+				const uint16 w2 = walkabilityAt(*pTargetY, *pTargetX);
 				if (isWalkabilityWalkable(w2)) {
 					break;
 				}
@@ -182,7 +182,7 @@ void Pathfinding::snapToWalkable(int16 *pTargetY, int16 *pTargetX, int16 charY,
 			}
 		}
 		// Phase 5: If all failed, fall back to character position
-		uint16 w2 = walkabilityAt(*pTargetY, *pTargetX);
+		const uint16 w2 = walkabilityAt(*pTargetY, *pTargetX);
 		if (isWalkabilityBlocking(w2)) {
 			*pTargetX = charX;
 			*pTargetY = charY;
@@ -249,8 +249,8 @@ bool Pathfinding::isLineWalkable(int16 y1, int16 x1, int16 y2, int16 x2) const {
 	uint16 error = 0;
 	int16 curX = x2;
 	int16 curY = y2;
-	uint16 absDx = (uint16)ABS((int)(x2 - x1));
-	uint16 absDy = (uint16)ABS((int)(y2 - y1));
+	const uint16 absDx = (uint16)ABS((int)(x2 - x1));
+	const uint16 absDy = (uint16)ABS((int)(y2 - y1));
 	bool result = true;
 
 	do {
@@ -291,9 +291,9 @@ bool Pathfinding::isLineWalkable(int16 y1, int16 x1, int16 y2, int16 x2) const {
 }
 
 int Pathfinding::euclideanDistance(const Common::Point &a, const Common::Point &b) const {
-	int32 dx = ABS((int)(b.x - a.x));
-	int32 dy = ABS((int)(b.y - a.y));
-	int32 distSq = dx * dx + dy * dy;
+	const int32 dx = ABS((int)(b.x - a.x));
+	const int32 dy = ABS((int)(b.y - a.y));
+	const int32 distSq = dx * dx + dy * dy;
 	int i = 0;
 	while (i < 0x500 && (int32)i * i < distSq) {
 		i++;
@@ -307,9 +307,9 @@ int Pathfinding::walkableDistance(int nodeA, int nodeB) const {
 	if (!isLineWalkable(a.y, a.x, b.y, b.x)) {
 		return 0x500;
 	}
-	int32 dx = ABS((int)(b.x - a.x));
-	int32 dy = ABS((int)(b.y - a.y));
-	int32 distSq = dx * dx + dy * dy;
+	const int32 dx = ABS((int)(b.x - a.x));
+	const int32 dy = ABS((int)(b.y - a.y));
+	const int32 distSq = dx * dx + dy * dy;
 	int result = 0x280;
 	int step = 0x280;
 	do {
@@ -334,9 +334,9 @@ int Pathfinding::computeMinCostToReachable(int nodeIndex, int prevNode, const bo
 		if (!isLineWalkable(nodePos.y, nodePos.x, finalDest.y, finalDest.x)) {
 			result = 0x500;
 		} else {
-			int32 dx = ABS((int)(finalDest.x - nodePos.x));
-			int32 dy = ABS((int)(finalDest.y - nodePos.y));
-			int32 distSq = dx * dx + dy * dy;
+			const int32 dx = ABS((int)(finalDest.x - nodePos.x));
+			const int32 dy = ABS((int)(finalDest.y - nodePos.y));
+			const int32 distSq = dx * dx + dy * dy;
 			int dist = 640;
 			int step = 320;
 			do {


Commit: 2e3b70fa6aa5de29498a2d332a72e2078de5bdcf
    https://github.com/scummvm/scummvm/commit/2e3b70fa6aa5de29498a2d332a72e2078de5bdcf
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2026-09-07T07:21:53+02:00

Commit Message:
MACS2: order by alphabetical order by last name

as given in the HOWTO-Engine Release wiki article

Changed paths:
    engines/macs2/credits.pl


diff --git a/engines/macs2/credits.pl b/engines/macs2/credits.pl
index 6de37a12977..5c243571a53 100644
--- a/engines/macs2/credits.pl
+++ b/engines/macs2/credits.pl
@@ -1,4 +1,4 @@
 begin_section("Macs2");
-	add_person("Florian Mehm", "", "");
 	add_person("Martin Gerhardy", "mgerhardy", "");
+	add_person("Florian Mehm", "", "");
 end_section();


Commit: 1804748342d44486cbc316ad955a9d5f0af29d6d
    https://github.com/scummvm/scummvm/commit/1804748342d44486cbc316ad955a9d5f0af29d6d
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2026-09-07T07:21:53+02:00

Commit Message:
MACS2: build by default and switched to ADGF_TESTING

Changed paths:
    engines/macs2/configure.engine
    engines/macs2/detection_tables.h


diff --git a/engines/macs2/configure.engine b/engines/macs2/configure.engine
index 2d53f5b348f..bc21c15546c 100644
--- a/engines/macs2/configure.engine
+++ b/engines/macs2/configure.engine
@@ -1,3 +1,3 @@
 # This file is included from the main "configure" script
 # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
-add_engine macs2 "Macs2" no "" "" "imgui midi"
+add_engine macs2 "Macs2" yes "" "" "imgui midi"
diff --git a/engines/macs2/detection_tables.h b/engines/macs2/detection_tables.h
index d6dd9f062d9..4c4ddedf3c1 100644
--- a/engines/macs2/detection_tables.h
+++ b/engines/macs2/detection_tables.h
@@ -35,7 +35,7 @@ const ADGameDescription gameDescriptions[] = {
 	 AD_ENTRY1s("RESOURCE.MCS", "b8646d5cc2e45442a414220b1a65ba73", 8621636),
 	 Common::DE_DEU,
 	 Common::kPlatformDOS,
-	 ADGF_UNSTABLE,
+	 ADGF_TESTING,
 	 GUIO3(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_TTS, GAMEOPTION_ENHANCEMENTS)},
 
 	// GMACS II Interpreter V1.00 - Written & Copyright (C) 1993 by Arndt Hasch - Copyright by LINEL
@@ -44,7 +44,7 @@ const ADGameDescription gameDescriptions[] = {
 	 AD_ENTRY1s("RESOURCE.MCS", "779c5f7d11ac61b7b941ec0f1778d837", 2376278),
 	 Common::DE_DEU,
 	 Common::kPlatformDOS,
-	 ADGF_DEMO | ADGF_UNSTABLE,
+	 ADGF_DEMO | ADGF_TESTING,
 	 GUIO3(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_TTS, GAMEOPTION_ENHANCEMENTS)},
 
 	// English fan translation (original + macs2_translation.dat)
@@ -54,7 +54,7 @@ const ADGameDescription gameDescriptions[] = {
 	            "macs2_translation.dat", nullptr, AD_NO_SIZE),
 	 Common::EN_ANY,
 	 Common::kPlatformDOS,
-	 GF_TRANSLATED | ADGF_UNSTABLE,
+	 GF_TRANSLATED | ADGF_TESTING,
 	 GUIO3(GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_TTS, GAMEOPTION_ENHANCEMENTS)},
 
 	// Amiga demo - DataA (MXMF) + Mdir (MXDR). GMACS II / LINEL.


Commit: 585a837fe5c6941f7430a38dde6bc16bc87735fd
    https://github.com/scummvm/scummvm/commit/585a837fe5c6941f7430a38dde6bc16bc87735fd
Author: Martin Gerhardy (martin.gerhardy at gmail.com)
Date: 2026-09-07T07:21:53+02:00

Commit Message:
DOCS: add description of engine options for macs2

Changed paths:
    doc/docportal/settings/game.rst


diff --git a/doc/docportal/settings/game.rst b/doc/docportal/settings/game.rst
index a04b0a59874..f3c004ca71a 100644
--- a/doc/docportal/settings/game.rst
+++ b/doc/docportal/settings/game.rst
@@ -50,7 +50,7 @@ The Game tab also shows settings unique to the game engine for the selected game
 To find out which engine powers your game, have a look at the ScummVM Supported Games `wiki page
 <https://wiki.scummvm.org/index.php?title=Category:Supported_Games>`_ or :ref:`group <group>` games by Engine in the Launcher.
 
-Engines: ADL_ | AGI_ | AGOS_ | Bladerunner_ | Buried_ | CGE_ | CGE2_ | Chewy_ | Cine_ | Drascula_ | Dreamweb_ | Freescape_ | Griffon_ | GrimE_ | HDB_ | Hopkins_ | Hypno_ | Kyra_ | Lure_ | MADE_ | MADS_ | mTropolis_ | Myst3_ | Nancy_ | Neverhood_ | SCI_ | SCUMM_ | Sherlock_ | Sky_ | Stark_ | Supernova_ | Sword2_ | Sword25_ | Toltecs_ | Trecision_ | Ultima_ | V-Cruise_ | Wintermute_ | Xeen_ | ZVision_
+Engines: ADL_ | AGI_ | AGOS_ | Bladerunner_ | Buried_ | CGE_ | CGE2_ | Chewy_ | Cine_ | Drascula_ | Dreamweb_ | Freescape_ | Griffon_ | GrimE_ | HDB_ | Hopkins_ | Hypno_ | Kyra_ | Lure_ | Macs2_ | MADE_ | MADS_ | mTropolis_ | Myst3_ | Nancy_ | Neverhood_ | SCI_ | SCUMM_ | Sherlock_ | Sky_ | Stark_ | Supernova_ | Sword2_ | Sword25_ | Toltecs_ | Trecision_ | Ultima_ | V-Cruise_ | Wintermute_ | Xeen_ | ZVision_
 
 
 
@@ -849,6 +849,42 @@ TTS Narrator
 
 ,,,,,,,,,,
 
+.. _Macs2:
+
+Macs2
+******
+
+Use original save/load screens
+	Uses the original save/load screens instead of the ScummVM screens.
+	When enabled, the in-game Save/Load button and a right-click during a script wait open the original DOS menu.
+	The ScummVM options menu (F5) is always available.
+
+	*original_menus*
+
+Enable Text to Speech
+	Uses TTS to read the dialogue (if TTS is available).
+	Chooses a male or female voice from the speaking character, and skips TTS when a recorded voice file is already playing.
+
+	*tts_enabled*
+
+.. _macs2_av:
+
+Audio-visual improvements
+	Plays optional generated dialogue speech from ``SPEECH/*.wav`` files when they are present.
+	Missing files are ignored. If no voice plays, TTS can still read the line when Text to Speech is enabled.
+
+	*enhancements*
+
+.. _macs2_uiux:
+
+Modern UI/UX adjustments
+	Adds modern interface conveniences: a persistent verb/inventory bar, hover labels on the original menus, a highlight on dialogue choices, and a shared walk cursor for gameplay verbs (the sentence line shows the active verb).
+	Games that already have a native bottom HUD keep that HUD.
+
+	*enhancements*
+
+,,,,,,,,,,
+
 .. _MADE:
 
 MADE




More information about the Scummvm-git-logs mailing list