[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