[Scummvm-git-logs] scummvm master -> 406395bf382f1ef533a4a2b6f43696e7d5c3f2ca

bluegr noreply at scummvm.org
Fri Mar 27 23:02:13 UTC 2026


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:
406395bf38 NANCY: Implement font loading for Nancy10+


Commit: 406395bf382f1ef533a4a2b6f43696e7d5c3f2ca
    https://github.com/scummvm/scummvm/commit/406395bf382f1ef533a4a2b6f43696e7d5c3f2ca
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2026-03-28T00:57:57+02:00

Commit Message:
NANCY: Implement font loading for Nancy10+

Nancy10 and Nancy11 now start and boot to the menu. They still crash,
because of the new GUI, which is not implemented yet

Changed paths:
    engines/nancy/enginedata.cpp
    engines/nancy/font.cpp
    engines/nancy/font.h
    engines/nancy/graphics.cpp
    engines/nancy/graphics.h
    engines/nancy/nancy.cpp


diff --git a/engines/nancy/enginedata.cpp b/engines/nancy/enginedata.cpp
index 4cad392d97e..c67d7b014b3 100644
--- a/engines/nancy/enginedata.cpp
+++ b/engines/nancy/enginedata.cpp
@@ -42,7 +42,8 @@ BSUM::BSUM(Common::SeekableReadStream *chunkStream) : EngineData(chunkStream) {
 
 	s.skip(0x17, kGameTypeVampire, kGameTypeVampire);
 	s.skip(0x49, kGameTypeNancy1, kGameTypeNancy1);
-	s.skip(0x43, kGameTypeNancy2);
+	s.skip(0x43, kGameTypeNancy2, kGameTypeNancy9);
+	s.skip(0x41, kGameTypeNancy10);
 
 	readFilename(s, conversationTextsFilename, kGameTypeNancy6);
 	readFilename(s, autotextFilename, kGameTypeNancy6);
diff --git a/engines/nancy/font.cpp b/engines/nancy/font.cpp
index 969a4c7fd9b..13ce11d4ace 100644
--- a/engines/nancy/font.cpp
+++ b/engines/nancy/font.cpp
@@ -114,6 +114,22 @@ void Font::read(Common::SeekableReadStream &stream) {
 
 			numCharacters = 105;
 		}
+
+		if (g_nancy->getGameType() >= kGameTypeNancy10) {
+			// Nancy10 added even more characters to its fonts
+			_uppercaseAWithDotOffset        = stream.readUint16LE();
+			_aWithDotOffset                 = stream.readUint16LE();
+			_underscoreOffset               = stream.readUint16LE();
+			_hashOffset                     = stream.readUint16LE();
+			_dollarOffset                   = stream.readUint16LE();
+			_lessThanOffset                 = stream.readUint16LE();
+			_greaterThanOffset              = stream.readUint16LE();
+			_leftCurlyBracketOffset         = stream.readUint16LE();
+			_rightCurlyBracketOffset        = stream.readUint16LE();
+			_euroOffset                     = stream.readUint16LE();
+
+			numCharacters = 115;
+		}
 	}
 
 	_characterRects.resize(numCharacters);
@@ -310,6 +326,30 @@ Common::Rect Font::getCharacterSourceRect(char chr) const {
 					offset = -1;
 				}
 				break;
+			// TODO: _uppercaseAWithDotOffset
+			// TODO: _aWithDotOffset
+			case '\x5f':
+				offset = _underscoreOffset;
+				break;
+			case '\x23':
+				offset = _hashOffset;
+				break;
+			case '\x24':
+				offset = _dollarOffset;
+				break;
+			case '\x3c':
+				offset = _lessThanOffset;
+				break;
+			case '\x3e':
+				offset = _greaterThanOffset;
+				break;
+			case '\x7b':
+				offset = _leftCurlyBracketOffset;
+				break;
+			case '\x7d':
+				offset = _rightCurlyBracketOffset;
+				break;
+			// TODO: _euroOffset
 			default:
 				offset = -1;
 				break;
diff --git a/engines/nancy/font.h b/engines/nancy/font.h
index 55e526e23f2..e30c36aed67 100644
--- a/engines/nancy/font.h
+++ b/engines/nancy/font.h
@@ -117,6 +117,18 @@ private:
 	int16 _uWithAcuteOffset					= -1;
 	int16 _eszettOffset						= -1;
 
+	// Even more specific offsets for extended ASCII characters. Introduced in nancy10
+	int16 _uppercaseAWithDotOffset          = -1;
+	int16 _aWithDotOffset                   = -1;
+	int16 _underscoreOffset                 = -1;
+	int16 _hashOffset                       = -1;
+	int16 _dollarOffset                     = -1;
+	int16 _lessThanOffset                   = -1;
+	int16 _greaterThanOffset                = -1;
+	int16 _leftCurlyBracketOffset           = -1;
+	int16 _rightCurlyBracketOffset          = -1;
+	int16 _euroOffset                       = -1;
+
 	Common::Array<Common::Rect> _characterRects;
 
 	Graphics::ManagedSurface _image;
diff --git a/engines/nancy/graphics.cpp b/engines/nancy/graphics.cpp
index ca3e640640b..a1cd1955424 100644
--- a/engines/nancy/graphics.cpp
+++ b/engines/nancy/graphics.cpp
@@ -177,6 +177,18 @@ void GraphicsManager::loadFonts(Common::SeekableReadStream *chunkStream) {
 	delete chunkStream;
 }
 
+void GraphicsManager::loadFontsNew(Common::SeekableReadStream *chunkStream, uint16 fontCount) {
+	assert(chunkStream);
+
+	chunkStream->seek(0);
+	_fonts.resize(fontCount);
+	for (uint i = 0; i < _fonts.size(); ++i) {
+		_fonts[i].read(*chunkStream);
+	}
+
+	delete chunkStream;
+}
+
 void GraphicsManager::addObject(RenderObject *object) {
 	for (auto &r : _objects) {
 		if (r == object) {
diff --git a/engines/nancy/graphics.h b/engines/nancy/graphics.h
index bde9a4cc283..2fe08fe0775 100644
--- a/engines/nancy/graphics.h
+++ b/engines/nancy/graphics.h
@@ -43,6 +43,7 @@ public:
 	void draw(bool updateScreen = true);
 
 	void loadFonts(Common::SeekableReadStream *chunkStream);
+	void loadFontsNew(Common::SeekableReadStream *chunkStream, uint16 fontCount);
 
 	void addObject(RenderObject *object);
 	void removeObject(RenderObject *object);
diff --git a/engines/nancy/nancy.cpp b/engines/nancy/nancy.cpp
index f4ab8e2f4e7..d151126861f 100644
--- a/engines/nancy/nancy.cpp
+++ b/engines/nancy/nancy.cpp
@@ -428,10 +428,6 @@ void NancyEngine::bootGameEngine() {
 	// Setup mixer
 	syncSoundSettings();
 
-	if (getGameType() >= kGameTypeNancy10) {
-		error("Game not supported; Use console to inspect game data");
-	}
-
 	IFF *iff = _resource->loadIFF("boot");
 	if (!iff)
 		error("Failed to load boot script");
@@ -477,10 +473,30 @@ void NancyEngine::bootGameEngine() {
 	LOAD_BOOT(TABL)
 	LOAD_BOOT(MARK)
 
+	// New boot chunks for Nancy 10+
+	// TODO
+	//LOAD_BOOT(SHUI)
+	//LOAD_BOOT(TASK)
+	//LOAD_BOOT(UIIV)
+	//LOAD_BOOT(UICO)
+	//LOAD_BOOT(UICL)
+	//LOAD_BOOT(UIBW)
+	//LOAD_BOOT(UINB)
+
 	_cursor->init(iff->getChunkStream("CURS"));
 
 	_graphics->init();
-	_graphics->loadFonts(iff->getChunkStream("FONT"));
+
+	if (getGameType() <= kGameTypeNancy9) {
+		_graphics->loadFonts(iff->getChunkStream("FONT"));
+	} else {
+		IFF *fontIFF = _resource->loadIFF("font");
+		if (!fontIFF)
+			error("Failed to load font IFF");
+		// TODO: font count is hardcoded to 18 for now
+		_graphics->loadFontsNew(fontIFF->getChunkStream("FONT"), 18);
+		delete fontIFF;
+	}
 
 	preloadCals();
 




More information about the Scummvm-git-logs mailing list