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

fracturehill noreply at scummvm.org
Tue Jan 16 21:29:58 UTC 2024


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

Summary:
52dcc17de3 DEVTOOLS: Fix typo in create_nancy nancy7 data
2cef013209 NANCY: Sync missing SceneState member
ae81715b26 DEVTOOLS: Fix typos in create_nancy nancy3 data
c0e2f746ea DEVTOOLS: Update nancy.dat format
ccca59475c NANCY: Support modified nancy.dat format
a73d5d8106 NANCY: Implement win game event flag


Commit: 52dcc17de373cff65acb81f01df49f4cb02e814a
    https://github.com/scummvm/scummvm/commit/52dcc17de373cff65acb81f01df49f4cb02e814a
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2024-01-16T22:26:54+01:00

Commit Message:
DEVTOOLS: Fix typo in create_nancy nancy7 data

Changed paths:
    devtools/create_nancy/nancy7_data.h


diff --git a/devtools/create_nancy/nancy7_data.h b/devtools/create_nancy/nancy7_data.h
index f0181895e6d..049cc880060 100644
--- a/devtools/create_nancy/nancy7_data.h
+++ b/devtools/create_nancy/nancy7_data.h
@@ -264,9 +264,9 @@ const Common::Array<Common::Array<ConditionalDialogue>> _nancy7ConditionalDialog
 		{ { kEv, 217, false }, { kEv, 386, false } } },
 	{	0, 1655, "NSM55",
 		{ { kEv, 119, true }, { kEv, 373, false } } },
-	{	0, 1655, "NSM56",
+	{	0, 1656, "NSM56",
 		{ { kEv, 324, true }, { kEv, 122, false }, { kEv, 185, false }, { kEv, 378, false }, { kEv, 244, false } } },
-	{	0, 1655, "NSM56",
+	{	0, 1656, "NSM56",
 		{ { kEv, 388, true }, { kEv, 122, false }, { kEv, 185, false }, { kEv, 378, false }, { kEv, 244, false } } },
 	{	0, 1657, "NSM57",
 		{ { kEv, 187, true }, { kEv, 376, false } } },


Commit: 2cef01320984255cf548ab3b1e2486f2b505e5fa
    https://github.com/scummvm/scummvm/commit/2cef01320984255cf548ab3b1e2486f2b505e5fa
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2024-01-16T22:26:55+01:00

Commit Message:
NANCY: Sync missing SceneState member

Fixed an oversight with syncing nancy7 savefiles where
the inventory ID of an inventory scene would not get saved,
and cause a crash when attempting to exit said scene after
loading.

Changed paths:
    engines/nancy/state/scene.cpp


diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index a4e65cb8e69..54a506d4ed0 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -613,6 +613,7 @@ void Scene::synchronize(Common::Serializer &ser) {
 		ser.syncAsUint16LE(_sceneState.pushedInvScene.frameID);
 		ser.syncAsUint16LE(_sceneState.pushedInvScene.verticalOffset);
 		ser.syncAsByte(_sceneState.isInvScenePushed);
+		ser.syncAsUint16LE(_sceneState.pushedInvItemID);		
 	}
 
 	// hardcoded number of logic conditions, check if there can ever be more/less


Commit: ae81715b26e740881093baa9113e6d4d66f34a5d
    https://github.com/scummvm/scummvm/commit/ae81715b26e740881093baa9113e6d4d66f34a5d
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2024-01-16T22:26:55+01:00

Commit Message:
DEVTOOLS: Fix typos in create_nancy nancy3 data

Changed paths:
    devtools/create_nancy/nancy3_data.h


diff --git a/devtools/create_nancy/nancy3_data.h b/devtools/create_nancy/nancy3_data.h
index c95a8786fec..1512f899a3b 100644
--- a/devtools/create_nancy/nancy3_data.h
+++ b/devtools/create_nancy/nancy3_data.h
@@ -679,11 +679,11 @@ const Common::Array<const char *> _nancy3EventFlagNames = {
 	"L said scraper",
 	"L said screen",
 	"L said sellout",
-	"L said thump"
+	"L said thump",
 	"L said Valdez",
 	"Louis available",
 	"met Abby",
-	"met BG"
+	"met BG",
 	"met Charlie",
 	"met Emily",
 	"met Louis",
@@ -850,7 +850,7 @@ const Common::Array<const char *> _nancy3EventFlagNames = {
 	"empty",
 	"empty",
 	"empty",
-	"empty",
+	"empty"
 };
 
 const Common::Array<const char *> nancy3PatchSrcFiles {


Commit: c0e2f746ea1189ce30f0997e68319f07d4036cb7
    https://github.com/scummvm/scummvm/commit/c0e2f746ea1189ce30f0997e68319f07d4036cb7
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2024-01-16T22:26:55+01:00

Commit Message:
DEVTOOLS: Update nancy.dat format

Slightly changed the format of nancy.dat:
- curtain animation frames are no longer stored
- number of cursor TYPES is stored instead of number of
non-item cursors
- map access IDs were moved to a separate chunk outside
the general GameConstants
- GameConstants now stores the ID of the event flag
that gets set after the player has won the game
at least once before.

Changed paths:
    devtools/create_nancy/create_nancy.cpp
    devtools/create_nancy/nancy1_data.h
    devtools/create_nancy/nancy2_data.h
    devtools/create_nancy/nancy3_data.h
    devtools/create_nancy/nancy4_data.h
    devtools/create_nancy/nancy5_data.h
    devtools/create_nancy/nancy6_data.h
    devtools/create_nancy/nancy7_data.h
    devtools/create_nancy/tvd_data.h
    devtools/create_nancy/types.h


diff --git a/devtools/create_nancy/create_nancy.cpp b/devtools/create_nancy/create_nancy.cpp
index 754578f4349..64a3d985d48 100644
--- a/devtools/create_nancy/create_nancy.cpp
+++ b/devtools/create_nancy/create_nancy.cpp
@@ -31,7 +31,7 @@
 #include "nancy7_data.h"
 
 #define NANCYDAT_MAJOR_VERSION 1
-#define NANCYDAT_MINOR_VERSION 0
+#define NANCYDAT_MINOR_VERSION 1
 
 #define NANCYDAT_NUM_GAMES 8
 
@@ -85,15 +85,16 @@ void NORETURN_PRE error(const char *s, ...) {
 	exit(1);
 }
 
+const uint32 _mapAccessTag = MKTAG('M', 'A', 'P', 'A');
+
 void writeConstants(File &output, const GameConstants &gameConstants) {
 	output.writeUint32(MKTAG('C', 'O', 'N', 'S'));
 	output.writeUint16(gameConstants.numItems);
 	output.writeUint16(gameConstants.numEventFlags);
-	writeToFile(output, gameConstants.mapAccessSceneIDs);
 	writeToFile(output, gameConstants.genericEventFlags);
-	output.writeUint16(gameConstants.numNonItemCursors);
-	output.writeUint16(gameConstants.numCurtainAnimationFrames);
+	output.writeUint16(gameConstants.numCursorTypes);
 	output.writeUint32(gameConstants.logoEndAfter);
+	output.writeUint16(gameConstants.wonGameSceneID);
 }
 
 void writeSoundChannels(File &output, const SoundChannelInfo &soundChannelInfo) {
@@ -199,6 +200,7 @@ int main(int argc, char *argv[]) {
 	// The Vampire Diaries data
 	gameOffsets.push_back(output.pos());
 	WRAPWITHOFFSET(writeConstants(output, _tvdConstants))
+	WRAPWITHOFFSET(output.writeUint32(_mapAccessTag); writeToFile(output, _tvdMapAccessSceneIDs));
 	WRAPWITHOFFSET(writeSoundChannels(output, _tvdToNancy2SoundChannelInfo))
 	WRAPWITHOFFSET(writeLanguages(output, _tvdLanguagesOrder))
 	WRAPWITHOFFSET(writeConditionalDialogue(output, _tvdConditionalDialogue, _tvdConditionalDialogueTexts))
@@ -209,6 +211,7 @@ int main(int argc, char *argv[]) {
 	// Nancy Drew: Secrets Can Kill data
 	gameOffsets.push_back(output.pos());
 	WRAPWITHOFFSET(writeConstants(output, _nancy1Constants))
+	WRAPWITHOFFSET(output.writeUint32(_mapAccessTag); writeToFile(output, _nancy1MapAccessSceneIDs));
 	WRAPWITHOFFSET(writeSoundChannels(output, _tvdToNancy2SoundChannelInfo))
 	WRAPWITHOFFSET(writeLanguages(output, _nancy1LanguagesOrder))
 	WRAPWITHOFFSET(writeConditionalDialogue(output, _nancy1ConditionalDialogue, _nancy1ConditionalDialogueTexts))
diff --git a/devtools/create_nancy/nancy1_data.h b/devtools/create_nancy/nancy1_data.h
index a119294debd..41e62ae807a 100644
--- a/devtools/create_nancy/nancy1_data.h
+++ b/devtools/create_nancy/nancy1_data.h
@@ -25,15 +25,18 @@
 #include "types.h"
 
 const GameConstants _nancy1Constants = {
-	11,
-	168,
-	{ 9, 10, 11, 666, 888, 1200, 1250, 1666 },
-	{	44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+	11,													// numItems
+	168,												// numEventFlags
+	{	44, 45, 46, 47, 48, 49, 50, 51, 52, 53,			// genericEventFlags
 		63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73,
 		75, 76, 77, 78, 79, 80, 81, 82, 83, 84 },
-	12,
-	7,
-	7000
+	4,													// numCursorTypes
+	7000,												// logoEndAfter
+	42													// wonGameSceneID
+};
+
+const Common::Array<uint16> _nancy1MapAccessSceneIDs = {
+	9, 10, 11, 666, 888, 1200, 1250, 1666
 };
 
 const Common::Array<Common::Language> _nancy1LanguagesOrder = {
diff --git a/devtools/create_nancy/nancy2_data.h b/devtools/create_nancy/nancy2_data.h
index 48e51408bbd..8c33638ab5a 100644
--- a/devtools/create_nancy/nancy2_data.h
+++ b/devtools/create_nancy/nancy2_data.h
@@ -25,15 +25,14 @@
 #include "types.h"
 
 const GameConstants _nancy2Constants ={
-	18,
-	240,
-	{ }, // No Map state
-	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+	18,												// numItems
+	240,											// numEventFlags
+	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,			// genericEventFlags
 		11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 		21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
-	15,
-	7,
-	7000
+	5,												// numCursorTypes
+	7000,											// logoEndAfter
+	32												// wonGameSceneID
 };
 
 const Common::Array<Common::Language> _nancy2LanguagesOrder = {
diff --git a/devtools/create_nancy/nancy3_data.h b/devtools/create_nancy/nancy3_data.h
index 1512f899a3b..e0a7b2bf988 100644
--- a/devtools/create_nancy/nancy3_data.h
+++ b/devtools/create_nancy/nancy3_data.h
@@ -25,15 +25,14 @@
 #include "types.h"
 
 const GameConstants _nancy3Constants = {
-	18,
-	336,
-	{ }, // No Map state
-	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+	18,												// numItems
+	336,											// numEventFlags
+	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,			// genericEventFlags
 		11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 		21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
-	24,
-	7,
-	4000
+	8,												// numCursorTypes
+	4000,											// logoEndAfter
+	32												// wonGameSceneID
 };
 
 const SoundChannelInfo _nancy3to7SoundChannelInfo = {
diff --git a/devtools/create_nancy/nancy4_data.h b/devtools/create_nancy/nancy4_data.h
index 1a3f60bacd4..0e5535dbcad 100644
--- a/devtools/create_nancy/nancy4_data.h
+++ b/devtools/create_nancy/nancy4_data.h
@@ -25,15 +25,14 @@
 #include "types.h"
 
 const GameConstants _nancy4Constants ={
-	28,
-	504,
-	{ }, // No Map state
-	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+	28,												// numItems
+	504,											// numEventFlags
+	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,			// genericEventFlags
 		11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 		21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
-	36,
-	7,
-	4000
+	13,												// numCursorTypes
+	4000,											// logoEndAfter
+	32												// wonGameSceneID
 };
 
 const Common::Array<Common::Language> _nancy4LanguagesOrder = {
diff --git a/devtools/create_nancy/nancy5_data.h b/devtools/create_nancy/nancy5_data.h
index b875b670f4e..9ec9f188173 100644
--- a/devtools/create_nancy/nancy5_data.h
+++ b/devtools/create_nancy/nancy5_data.h
@@ -25,15 +25,14 @@
 #include "types.h"
 
 const GameConstants _nancy5Constants ={
-	33,
-	456,
-	{ }, // No Map state
-	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+	33,												// numItems
+	456,											// numEventFlags
+	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,			// genericEventFlags
 		11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 		21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
-	36,
-	7,
-	4000
+	13,												// numCursorTypes
+	4000,											// logoEndAfter
+	32												// wonGameSceneID
 };
 
 const Common::Array<Common::Language> _nancy5LanguagesOrder = {
diff --git a/devtools/create_nancy/nancy6_data.h b/devtools/create_nancy/nancy6_data.h
index af1a43b095f..7fbcb137013 100644
--- a/devtools/create_nancy/nancy6_data.h
+++ b/devtools/create_nancy/nancy6_data.h
@@ -25,15 +25,14 @@
 #include "types.h"
 
 const GameConstants _nancy6Constants ={
-	36,
-	456,
-	{ }, // No Map state
-	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+	36,												// numItems
+	456,											// numEventFlags
+	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,			// genericEventFlags
 		11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 		21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
-	48,
-	7,
-	4000
+	16,												// numCursorTypes
+	4000,											// logoEndAfter
+	32												// wonGameSceneID
 };
 
 const Common::Array<Common::Language> _nancy6LanguagesOrder = {
diff --git a/devtools/create_nancy/nancy7_data.h b/devtools/create_nancy/nancy7_data.h
index 049cc880060..175e9d59a0f 100644
--- a/devtools/create_nancy/nancy7_data.h
+++ b/devtools/create_nancy/nancy7_data.h
@@ -25,15 +25,14 @@
 #include "types.h"
 
 const GameConstants _nancy7Constants ={
-	41,
-	576,
-	{ }, // No Map state
-	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
+	41,												// numItems
+	576,											// numEventFlags
+	{	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,			// genericEventFlags
 		11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
 		21, 22, 23, 24, 25, 26, 27, 28, 29, 30 },
-	60,
-	7,
-	4000
+	20,												// numCursorTypes
+	4000,											// logoEndAfter
+	32												// wonGameSceneID
 };
 
 const Common::Array<Common::Language> _nancy7LanguagesOrder = {
diff --git a/devtools/create_nancy/tvd_data.h b/devtools/create_nancy/tvd_data.h
index 4addce63c15..6628f19a666 100644
--- a/devtools/create_nancy/tvd_data.h
+++ b/devtools/create_nancy/tvd_data.h
@@ -25,13 +25,16 @@
 #include "types.h"
 
 const GameConstants _tvdConstants = {
-	24,
-	120,
-	{ 0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 125, 219, 220 },
-	{ 110, 111, 112, 113, 114 },
-	8,
-	10,
-	167000
+	24,								// numItems
+	120,							// numEventFlags
+	{ 110, 111, 112, 113, 114 },	// genericEventFlags
+	4,								// numCursorTypes
+	167000,							// logoEndAfter
+	59								// wonGameSceneID
+};
+
+const Common::Array<uint16> _tvdMapAccessSceneIDs = {
+	0, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 125, 219, 220
 };
 
 const SoundChannelInfo _tvdToNancy2SoundChannelInfo = {
diff --git a/devtools/create_nancy/types.h b/devtools/create_nancy/types.h
index 0529ebe2d21..cd1124c5e54 100644
--- a/devtools/create_nancy/types.h
+++ b/devtools/create_nancy/types.h
@@ -34,11 +34,10 @@ enum ConditionType : byte { kEv = 0, kIn = 1, kDi = 2 };
 struct GameConstants {
 	uint16 numItems;
 	uint16 numEventFlags;
-	Common::Array<uint16> mapAccessSceneIDs;
 	Common::Array<uint16> genericEventFlags;
-	uint16 numNonItemCursors;
-	uint16 numCurtainAnimationFrames;
+	uint16 numCursorTypes;
 	uint32 logoEndAfter;
+	uint16 wonGameSceneID;
 };
 
 struct EventFlagDescription {


Commit: ccca59475cff46099743e021b676918f2b28fd16
    https://github.com/scummvm/scummvm/commit/ccca59475cff46099743e021b676918f2b28fd16
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2024-01-16T22:26:55+01:00

Commit Message:
NANCY: Support modified nancy.dat format

Added support for the freshly modified nancy.dat. The
previous version is also supported and will be kept that way
until the next time nancy.dat gets updated in master
(most likely after work on nancy8/9 is finished)

Changed paths:
    engines/nancy/commontypes.cpp
    engines/nancy/commontypes.h
    engines/nancy/cursor.cpp
    engines/nancy/enginedata.cpp
    engines/nancy/nancy.cpp
    engines/nancy/ui/inventorybox.cpp
    engines/nancy/ui/inventorybox.h


diff --git a/engines/nancy/commontypes.cpp b/engines/nancy/commontypes.cpp
index fed2915ec7c..e59cccace06 100644
--- a/engines/nancy/commontypes.cpp
+++ b/engines/nancy/commontypes.cpp
@@ -349,7 +349,7 @@ void SoundChannelInfo::readData(Common::SeekableReadStream &stream) {
 	}
 }
 
-void StaticData::readData(Common::SeekableReadStream &stream, Common::Language language, uint32 endPos) {
+void StaticData::readData(Common::SeekableReadStream &stream, Common::Language language, uint32 endPos, int8 majorVersion, int8 minorVersion) {
 	uint16 num = 0;
 	int languageID = -1;
 
@@ -368,10 +368,13 @@ void StaticData::readData(Common::SeekableReadStream &stream, Common::Language l
 			numItems = stream.readUint16LE();
 			numEventFlags = stream.readUint16LE();
 
-			num = stream.readUint16LE();
-			mapAccessSceneIDs.resize(num);
-			for (uint16 i = 0; i < num; ++i) {
-				mapAccessSceneIDs[i] = stream.readUint16LE();
+			// TODO remove once updated nancy.dat is pushed
+			if (minorVersion == 0) {
+				num = stream.readUint16LE();
+				mapAccessSceneIDs.resize(num);
+				for (uint16 i = 0; i < num; ++i) {
+					mapAccessSceneIDs[i] = stream.readUint16LE();
+				}
 			}
 
 			num = stream.readUint16LE();
@@ -380,9 +383,25 @@ void StaticData::readData(Common::SeekableReadStream &stream, Common::Language l
 				genericEventFlags[i] = stream.readUint16LE();
 			}
 
-			numNonItemCursors = stream.readUint16LE();
-			numCurtainAnimationFrames = stream.readUint16LE();
+			numCursorTypes = stream.readUint16LE();
+			if (minorVersion == 0) {
+				// TODO remove once updated nancy.dat is pushed
+				numCursorTypes /= (g_nancy->getGameType() == kGameTypeVampire ? 2 : 3);
+				stream.skip(2);
+			}
+			
 			logoEndAfter = stream.readUint32LE();
+			if (minorVersion == 1) {
+				wonGameSceneID = stream.readUint16LE();
+			}
+
+			break;
+		case MKTAG('M', 'A', 'P', 'A') :
+			num = stream.readUint16LE();
+			mapAccessSceneIDs.resize(num);
+			for (uint16 i = 0; i < num; ++i) {
+				mapAccessSceneIDs[i] = stream.readUint16LE();
+			}
 
 			break;
 		case MKTAG('S', 'C', 'H', 'N') :
diff --git a/engines/nancy/commontypes.h b/engines/nancy/commontypes.h
index 5b25fe08ab0..bab219a81d4 100644
--- a/engines/nancy/commontypes.h
+++ b/engines/nancy/commontypes.h
@@ -317,9 +317,9 @@ struct StaticData {
 	uint16 numEventFlags = 168;
 	Common::Array<uint16> mapAccessSceneIDs;
 	Common::Array<uint16> genericEventFlags;
-	uint16 numNonItemCursors = 12;
-	uint16 numCurtainAnimationFrames = 7;
+	uint16 numCursorTypes = 4;
 	uint32 logoEndAfter = 7000;
+	int16 wonGameSceneID = -1;
 
 	// Data for sound channels
 	SoundChannelInfo soundChannelInfo;
@@ -338,7 +338,7 @@ struct StaticData {
 	// Debug strings
 	Common::Array<Common::String> eventFlagNames;
 
-	void readData(Common::SeekableReadStream &stream, Common::Language language, uint32 endPos);
+	void readData(Common::SeekableReadStream &stream, Common::Language language, uint32 endPos, int8 majorVersion, int8 minorVersion);
 };
 
 } // End of namespace Nancy
diff --git a/engines/nancy/cursor.cpp b/engines/nancy/cursor.cpp
index 7b3ad5862ba..f90932684a7 100644
--- a/engines/nancy/cursor.cpp
+++ b/engines/nancy/cursor.cpp
@@ -46,13 +46,7 @@ void CursorManager::init(Common::SeekableReadStream *chunkStream) {
 	chunkStream->seek(0);
 
 	// First, we need to figure out the number of possible CursorTypes in the current game
-	// These grew as the engine got more complicated, so we use nancy.dat to store a related property
-	// TODO: Change nancy.dat so it just directly stores the number of cursor types
-	if (g_nancy->getGameType() == kGameTypeVampire) {
-		_numCursorTypes = g_nancy->getStaticData().numNonItemCursors / 2;
-	} else {
-		_numCursorTypes = g_nancy->getStaticData().numNonItemCursors / 3;
-	}
+	_numCursorTypes = g_nancy->getStaticData().numCursorTypes;
 
 	// The structure of CURS is weird:
 
@@ -79,7 +73,7 @@ void CursorManager::init(Common::SeekableReadStream *chunkStream) {
 	// however, this cannot happen until the engine is more mature and I'm more aware of what changes they made to the
 	// cursor code in later games.
 
-	uint numCursors = g_nancy->getStaticData().numNonItemCursors + g_nancy->getStaticData().numItems * _numCursorTypes;
+	uint numCursors = _numCursorTypes * (g_nancy->getGameType() == kGameTypeVampire ? 2 : 3) + g_nancy->getStaticData().numItems * _numCursorTypes;
 	_cursors.resize(numCursors);
 
 	for (uint i = 0; i < numCursors; ++i) {
@@ -256,7 +250,7 @@ void CursorManager::setCursor(CursorType type, int16 itemID) {
 		itemID = 0;
 	} else {
 		// Item held
-		itemsOffset = g_nancy->getStaticData().numNonItemCursors;
+		itemsOffset = _numCursorTypes * (g_nancy->getGameType() == kGameTypeVampire ? 2 : 3);
 		_hasItem = true;
 	}
 
diff --git a/engines/nancy/enginedata.cpp b/engines/nancy/enginedata.cpp
index 1930ac90d02..ac282738465 100644
--- a/engines/nancy/enginedata.cpp
+++ b/engines/nancy/enginedata.cpp
@@ -131,7 +131,7 @@ INV::INV(Common::SeekableReadStream *chunkStream) : EngineData(chunkStream) {
 	readRectArray(s, ornamentSrcs, 6, 6, kGameTypeVampire, kGameTypeNancy1);
 	readRectArray(s, ornamentDests, 6, 6, kGameTypeVampire, kGameTypeNancy1);
 
-	uint numFrames = g_nancy->getStaticData().numCurtainAnimationFrames;
+	uint numFrames = g_nancy->getGameType() == kGameTypeVampire ? 10 : 7;
 
 	readRectArray(s, curtainAnimationSrcs, numFrames * 2);
 
diff --git a/engines/nancy/nancy.cpp b/engines/nancy/nancy.cpp
index 2dc0e79ea07..ac936426ee6 100644
--- a/engines/nancy/nancy.cpp
+++ b/engines/nancy/nancy.cpp
@@ -597,14 +597,14 @@ void NancyEngine::readDatFile() {
 		error("nancy.dat is invalid");
 	}
 
-	byte major = datFile->readByte();
-	byte minor = datFile->readByte();
+	int8 major = datFile->readSByte();
+	int8 minor = datFile->readSByte();
 	if (major != _datFileMajorVersion) {
 		error("Incorrect nancy.dat version. Expected '%d.%d', found %d.%d",
 			_datFileMajorVersion, _datFileMinorVersion, major, minor);
 	} else {
-		if (minor != _datFileMinorVersion) {
-			warning("Incorrect nancy.dat version. Expected '%d.%d', found %d.%d. Game may still work, but expect bugs",
+		if (minor < _datFileMinorVersion) {
+			warning("Incorrect nancy.dat version. Expected at least '%d.%d', found %d.%d. Game may still work, but expect bugs",
 			_datFileMajorVersion, _datFileMinorVersion, major, minor);
 		}
 	}
@@ -624,7 +624,7 @@ void NancyEngine::readDatFile() {
 	uint32 nextGameOffset = gameType == numGames ? datFile->size() : datFile->readUint32LE();
 	datFile->seek(thisGameOffset);
 
-	_staticData.readData(*datFile, _gameDescription->desc.language, nextGameOffset);
+	_staticData.readData(*datFile, _gameDescription->desc.language, nextGameOffset, major, minor);
 }
 
 Common::Error NancyEngine::synchronize(Common::Serializer &ser) {
diff --git a/engines/nancy/ui/inventorybox.cpp b/engines/nancy/ui/inventorybox.cpp
index 162516ca54c..c12b86b1f52 100644
--- a/engines/nancy/ui/inventorybox.cpp
+++ b/engines/nancy/ui/inventorybox.cpp
@@ -250,6 +250,13 @@ void InventoryBox::onScrollbarMove() {
 	_needsRedraw = true;
 }
 
+InventoryBox::Curtains::Curtains() :
+	RenderObject(10),
+	_soundTriggered(false),
+	_areOpen(false),
+	_curFrame(0),
+	_numFrames(g_nancy->getGameType() == kGameTypeVampire ? 10 : 7) {}
+
 void InventoryBox::Curtains::init() {
 	auto *inventoryData = GetEngineData(INV);
 	assert(inventoryData);
@@ -276,7 +283,7 @@ void InventoryBox::Curtains::init() {
 void InventoryBox::Curtains::updateGraphics() {
 	Time time = g_nancy->getTotalPlayTime();
 	if (_areOpen) {
-		if (_curFrame < g_nancy->getStaticData().numCurtainAnimationFrames && time > _nextFrameTime) {
+		if (_curFrame < _numFrames && time > _nextFrameTime) {
 			auto *inventoryData = GetEngineData(INV);
 			assert(inventoryData);
 
@@ -303,7 +310,7 @@ void InventoryBox::Curtains::updateGraphics() {
 		}
 	}
 
-	if (_curFrame == 0 || _curFrame == g_nancy->getStaticData().numCurtainAnimationFrames) {
+	if (_curFrame == 0 || _curFrame == _numFrames) {
 		_soundTriggered = false;
 	}
 }
@@ -313,7 +320,7 @@ void InventoryBox::Curtains::setAnimationFrame(uint frame) {
 	Common::Rect srcRect;
 	Common::Point destPoint;
 
-	if (frame > (uint)(g_nancy->getStaticData().numCurtainAnimationFrames - 1)) {
+	if (frame > (uint)(_numFrames - 1)) {
 		// TVD keeps the last frame visible
 		if (g_nancy->getGameType() > kGameTypeVampire) {
 			setVisible(false);
diff --git a/engines/nancy/ui/inventorybox.h b/engines/nancy/ui/inventorybox.h
index d76572457d3..43107b2fdbc 100644
--- a/engines/nancy/ui/inventorybox.h
+++ b/engines/nancy/ui/inventorybox.h
@@ -70,11 +70,7 @@ private:
 
 	class Curtains : public RenderObject {
 	public:
-		Curtains() :
-			RenderObject(10),
-			_soundTriggered(false),
-			_areOpen(false),
-			_curFrame(0) {}
+		Curtains();
 		virtual ~Curtains() = default;
 
 		void init() override;
@@ -84,6 +80,7 @@ private:
 
 		void setAnimationFrame(uint frame);
 
+		uint _numFrames;
 		uint _curFrame;
 		Time _nextFrameTime;
 		bool _areOpen;


Commit: a73d5d81068069f021bd111764328652bdd10e68
    https://github.com/scummvm/scummvm/commit/a73d5d81068069f021bd111764328652bdd10e68
Author: Kaloyan Chehlarski (strahy at outlook.com)
Date: 2024-01-16T22:26:55+01:00

Commit Message:
NANCY: Implement win game event flag

Added a feature that stores whether the player has won
the game at least once, and activates a specific event flag
if so. This may or may not enable easter eggs in the
game data, but definitely affects the (still unimplemented)
quotes easter egg in the version screen.

Changed paths:
    engines/nancy/action/miscrecords.cpp
    engines/nancy/state/scene.cpp


diff --git a/engines/nancy/action/miscrecords.cpp b/engines/nancy/action/miscrecords.cpp
index 9ba54e98919..41e6588e5ef 100644
--- a/engines/nancy/action/miscrecords.cpp
+++ b/engines/nancy/action/miscrecords.cpp
@@ -376,6 +376,11 @@ void WinGame::readData(Common::SeekableReadStream &stream) {
 }
 
 void WinGame::execute() {
+	// Set ConfMan value that will stay persistent across future playthroughs.
+	// Default value in original is StillWorkingOnIt, but we just don't set it instead.
+	ConfMan.set("PlayerWonTheGame", "AcedTheGame", ConfMan.getActiveDomainName());
+	ConfMan.flushToDisk();
+
 	g_nancy->_sound->stopAndUnloadSceneSpecificSounds();
 	NancySceneState.setDestroyOnExit();
 	g_nancy->setState(NancyState::kCredits, NancyState::kMainMenu);
diff --git a/engines/nancy/state/scene.cpp b/engines/nancy/state/scene.cpp
index 54a506d4ed0..d2187e7b353 100644
--- a/engines/nancy/state/scene.cpp
+++ b/engines/nancy/state/scene.cpp
@@ -794,6 +794,11 @@ void Scene::init() {
 		_state = kLoad;
 	}
 
+	// Set relevant event flag when player has won the game at least once
+	if (ConfMan.get("PlayerWonTheGame", ConfMan.getActiveDomainName()) == "AcedTheGame") {
+		setEventFlag(g_nancy->getStaticData().wonGameSceneID, g_nancy->_true);
+	}
+
 	if (g_nancy->getGameType() == kGameTypeVampire) {
 		_lightning = new Misc::Lightning();
 	}




More information about the Scummvm-git-logs mailing list