[Scummvm-git-logs] scummvm master -> 1bc018bf57136570570e2c63830aca304a33f79c

bluegr bluegr at gmail.com
Sat Feb 29 08:32:05 UTC 2020


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

Summary:
b5db41bbc2 WINTERMUTE: List engine forks at version enum
578dc53bae WINTERMUTE: Add detection of games by HeroCraft
91a194c29f WINTERMUTE: Add HeroCraft as optional subengine
5206fa4f3e WINTERMUTE: Add entity reordering methods from WME Kinjal Edition 1.4
5a4c607073 WINTERMUTE: Add methods required for Pole Chudes
19580bcd94 WINTERMUTE: Add method required for Papa's Daughters 1
392de2aec7 WINTERMUTE: Add methods required for Papa's Daughters 2
c3782c6f8f WINTERMUTE: Fix copypaste error at RegReadString() method
125aaff20c WINTERMUTE: Always log runtime errors
1a29cf1e48 WINTERMUTE: Add more stubs and todos for File & Directory
5474b1491a WINTERMUTE: Fix codereview issues & add some comments
1bc018bf57 WINTERMUTE: Support papasEntity for HeroCraft-targeted games only


Commit: b5db41bbc25a1d1e9b2455001748606a26897ece
    https://github.com/scummvm/scummvm/commit/b5db41bbc25a1d1e9b2455001748606a26897ece
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: List engine forks at version enum

Changed paths:
    engines/wintermute/base/base_engine.h


diff --git a/engines/wintermute/base/base_engine.h b/engines/wintermute/base/base_engine.h
index 5e2f05cb9f..723bb1701f 100644
--- a/engines/wintermute/base/base_engine.h
+++ b/engines/wintermute/base/base_engine.h
@@ -80,11 +80,35 @@ enum WMETargetExecutable {
 	WME_1_8_10, // DEAD:CODE 2009
 	WME_1_8_11, // DEAD:CODE 2009
 	WME_1_9_0,  // DEAD:CODE 2009, released as "1.9.0 beta"
+
+	// fork of WME_1_9_0
+	WME_KINJAL_1_0,
+	WME_KINJAL_1_1,
+	WME_KINJAL_1_2,
+	WME_KINJAL_1_3,
+	WME_KINJAL_1_4,
+
+	// fork of WME_KINJAL_1_4
+	WME_HEROCRAFT,
+
 	WME_1_9_1,  // DEAD:CODE 2010
+
+	// fork of WME_1_9_1
+	WME_KINJAL_1_5,
+	WME_KINJAL_1_6,
+	WME_KINJAL_1_7,
+	WME_KINJAL_1_7a,
+	WME_KINJAL_1_7b,
+	WME_KINJAL_1_8,
+	WME_KINJAL_1_9,
+	WME_KINJAL_2_0,
+
 	WME_1_9_2,  // DEAD:CODE 2010
 	WME_1_9_3,  // DEAD:CODE 2012, released as "1.10.1 beta"
 	WME_LITE,
 	LATEST_VERSION,
+
+	// fork of WME_LITE
 	FOXTAIL_OLDEST_VERSION,
 	FOXTAIL_1_2_227,
 	FOXTAIL_1_2_230,


Commit: 578dc53baeef74b64a61d9a55b494158f776f5d5
    https://github.com/scummvm/scummvm/commit/578dc53baeef74b64a61d9a55b494158f776f5d5
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Add detection of games by HeroCraft

Changed paths:
    engines/wintermute/detection_tables.h


diff --git a/engines/wintermute/detection_tables.h b/engines/wintermute/detection_tables.h
index d935c01e2c..a13703bc0a 100644
--- a/engines/wintermute/detection_tables.h
+++ b/engines/wintermute/detection_tables.h
@@ -103,6 +103,8 @@ static const PlainGameDescriptor wintermuteGames[] = {
 	{"openquest",       "Open Quest"},
 	{"paintaria",       "Paintaria"},
 	{"palladion",       "Palladion"},
+	{"papasdaughters1", "Papa's Daughters"},
+	{"papasdaughters2", "Papa's Daughters Go to the Sea"},
 	{"pigeons",         "Pigeons in the Park"},
 	{"pizzamorgana",    "Pizza Morgana: Episode 1 - Monsters and Manipulations in the Magical Forest"},
 	{"polechudes",      "Pole Chudes"},
@@ -1356,6 +1358,14 @@ static const WMEGameDescription gameDescriptions[] = {
 	WME_WINENTRY("palladion", "Alpha6h",
 		WME_ENTRY1s("Palladion_Alpha6h.exe", "55aec582159410ec6221d4c3fd53db24", 95240860), Common::DE_DEU, ADGF_UNSTABLE | ADGF_DEMO, WME_1_8_6),
 
+	// Papa's Daughters
+	WME_WINENTRY("papasdaughters1", "",
+		WME_ENTRY1s("data.dcp", "5d801bc95f28e64c33918380f961f454", 80569934), Common::RU_RUS, ADGF_UNSTABLE, WME_HEROCRAFT),
+
+	// Papa's Daughters 2
+	WME_WINENTRY("papasdaughters2", "",
+		WME_ENTRY1s("data.dcp", "8f7dfc4b46c01318ba2bd8e1d79a0edb", 107690073), Common::RU_RUS, ADGF_UNSTABLE, WME_HEROCRAFT),
+
 	// Pigeons in the Park
 	WME_WINENTRY("pigeons", "",
 		WME_ENTRY1s("data.dcp", "9143a5b6ff8206aefe3c4c643add3ec7", 2611100), Common::EN_ANY, ADGF_UNSTABLE, WME_1_8_1),
@@ -1368,7 +1378,7 @@ static const WMEGameDescription gameDescriptions[] = {
 
 	// Pole Chudes
 	WME_WINENTRY("polechudes", "",
-		WME_ENTRY1s("data.dcp", "3329e9af9cb41e052de8d929ea49b594", 76297454), Common::RU_RUS, ADGF_UNSTABLE, WME_1_9_0),
+		WME_ENTRY1s("data.dcp", "3329e9af9cb41e052de8d929ea49b594", 76297454), Common::RU_RUS, ADGF_UNSTABLE, WME_HEROCRAFT),
 
 	// Project: Doom (Beta)
 	WME_WINENTRY("projectdoom", "Beta",


Commit: 91a194c29f002b408319c4675b96165ec7b4d3c8
    https://github.com/scummvm/scummvm/commit/91a194c29f002b408319c4675b96165ec7b4d3c8
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Add HeroCraft as optional subengine

Changed paths:
    engines/wintermute/configure.engine
    engines/wintermute/wintermute.cpp


diff --git a/engines/wintermute/configure.engine b/engines/wintermute/configure.engine
index c825845f50..2ddbcdefb5 100644
--- a/engines/wintermute/configure.engine
+++ b/engines/wintermute/configure.engine
@@ -1,4 +1,5 @@
 # This file is included from the main "configure" script
 # add_engine [name] [desc] [build-by-default] [subengines] [base games] [deps]
-add_engine wintermute "Wintermute" yes "foxtail" "" "zlib 16bit highres jpeg png"
+add_engine wintermute "Wintermute" yes "foxtail herocraft" "" "zlib 16bit highres jpeg png"
 add_engine foxtail "FoxTail" yes
+add_engine herocraft "HeroCraft" yes
diff --git a/engines/wintermute/wintermute.cpp b/engines/wintermute/wintermute.cpp
index f0bb147867..c41c559cc4 100644
--- a/engines/wintermute/wintermute.cpp
+++ b/engines/wintermute/wintermute.cpp
@@ -172,6 +172,17 @@ int WintermuteEngine::init() {
 		}
 	#endif
 
+	// check dependencies for games with HeroCraft subengine
+	#if not defined(ENABLE_HEROCRAFT)
+		if (_gameDescription->targetExecutable == WME_HEROCRAFT) {
+			GUI::MessageDialog dialog(_("This game requires the HeroCraft subengine, which is not compiled in."));
+			dialog.runModal();
+			delete _game;
+			_game = nullptr;
+			return false;
+		}
+	#endif
+
 	Common::ArchiveMemberList actors3d;
 	if (BaseEngine::instance().getFileManager()->listMatchingMembers(actors3d, "*.act3d")) {
 		GUI::MessageDialog dialog(


Commit: 5206fa4f3e734c607af69e3e5ef866e4b0e9847c
    https://github.com/scummvm/scummvm/commit/5206fa4f3e734c607af69e3e5ef866e4b0e9847c
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Add entity reordering methods from WME Kinjal Edition 1.4

Changed paths:
    engines/wintermute/ad/ad_entity.cpp


diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp
index ea7c46c5ac..d82f9ccf69 100644
--- a/engines/wintermute/ad/ad_entity.cpp
+++ b/engines/wintermute/ad/ad_entity.cpp
@@ -29,7 +29,9 @@
 
 #include "engines/wintermute/ad/ad_entity.h"
 #include "engines/wintermute/ad/ad_game.h"
+#include "engines/wintermute/ad/ad_layer.h"
 #include "engines/wintermute/ad/ad_scene.h"
+#include "engines/wintermute/ad/ad_scene_node.h"
 #include "engines/wintermute/ad/ad_waypoint_group.h"
 #include "engines/wintermute/ad/ad_sentence.h"
 #include "engines/wintermute/base/base_active_rect.h"
@@ -838,6 +840,78 @@ bool AdEntity::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		return STATUS_OK;
 	}
 
+#if defined(ENABLE_KINJAL) || defined(ENABLE_HEROCRAFT)
+	//////////////////////////////////////////////////////////////////////////
+	// [WME Kinjal 1.4] SetBeforeEntity / SetAfterEntity
+	// Usage at HeroCraft games: ent.SetBeforeEntity("redDuskaEntity")
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "SetBeforeEntity") == 0 || strcmp(name, "SetAfterEntity") == 0) {
+		stack->correctParams(1);
+		const char *layerName = stack->pop()->getString();
+
+		if (strcmp(getName(), layerName) == 0) {
+			warning("%s(%s): source and target has the same name", name, layerName);
+			stack->pushBool(false);
+			return STATUS_OK;
+		}
+
+		for (uint32 i = 0; i < ((AdGame *)_gameRef)->_scene->_layers.size(); i++) {
+			AdLayer *layer = ((AdGame *)_gameRef)->_scene->_layers[i];
+			for (uint32 j = 0; j < layer->_nodes.size(); j++) {
+				if (layer->_nodes[j]->_type == OBJECT_ENTITY && this == layer->_nodes[j]->_entity) {
+					for (uint32 k = 0; k < layer->_nodes.size(); k++) {
+						if (layer->_nodes[k]->_type == OBJECT_ENTITY && strcmp(layer->_nodes[k]->_entity->getName(), layerName) == 0) {
+							if (j < k && strcmp(name, "SetBeforeEntity") == 0) {
+								k--;
+							} else if (j > k && strcmp(name, "SetAfterEntity") == 0) {
+								k++;
+							}
+
+							int32 delta = j <= k ? 1 : -1;
+							AdSceneNode *tmp = layer->_nodes[j];
+							for (int32 x = j; x != (int32)k; x += delta) {
+								layer->_nodes[x] = layer->_nodes[x + delta];
+							}
+							layer->_nodes[k] = tmp;
+
+							stack->pushBool(true);
+							return STATUS_OK;
+						}
+					}
+				}
+			}
+		}
+
+		warning("%s(%s): not found", name, layerName);
+		stack->pushBool(false);
+		return STATUS_OK;
+	}
+
+	//////////////////////////////////////////////////////////////////////////
+	// [WME Kinjal 1.4] GetLayer / GetIndex
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "GetLayer") == 0 || strcmp(name, "GetIndex") == 0) {
+		stack->correctParams(0);
+
+		for (uint32 i = 0; i < ((AdGame *)_gameRef)->_scene->_layers.size(); i++) {
+			AdLayer *layer = ((AdGame *)_gameRef)->_scene->_layers[i];
+			for (uint32 j = 0; j < layer->_nodes.size(); j++) {
+				if (layer->_nodes[j]->_type == OBJECT_ENTITY && this == layer->_nodes[j]->_entity) {
+					if (strcmp(name, "GetLayer") == 0) {
+						stack->pushNative(layer, true);
+					} else {
+						stack->pushInt(j);
+					}
+					return STATUS_OK;
+				}
+			}
+		}
+
+		warning("%s(): not found", name);
+		stack->pushNULL();
+		return STATUS_OK;
+	}
+#endif
 
 	//////////////////////////////////////////////////////////////////////////
 	// CreateRegion


Commit: 5a4c607073fc58f09db69e0102a32c4376563751
    https://github.com/scummvm/scummvm/commit/5a4c607073fc58f09db69e0102a32c4376563751
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Add methods required for Pole Chudes

Changed paths:
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/base_game.h
    engines/wintermute/base/scriptables/script_ext_string.cpp


diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 3d5ae398bb..3c6d7370af 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -226,8 +226,10 @@ BaseGame::BaseGame(const Common::String &targetName) : BaseObject(this), _target
 	_constrainedMemory = false;
 
 	_settings = new BaseGameSettings(this);
-//#endif
 
+#ifdef ENABLE_HEROCRAFT
+	_rndHc = new Common::RandomSource("HeroCraft");
+#endif
 }
 
 
@@ -278,6 +280,11 @@ BaseGame::~BaseGame() {
 	_musicSystem = nullptr;
 	_settings = nullptr;
 
+#ifdef ENABLE_HEROCRAFT
+	delete _rndHc;
+	_rndHc = nullptr;
+#endif
+
 	DEBUG_DebugDisable();
 	debugC(kWintermuteDebugLog, "--- shutting down normally ---\n");
 }
@@ -1976,6 +1983,54 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		return STATUS_OK;
 	}
 
+#ifdef ENABLE_HEROCRAFT
+	//////////////////////////////////////////////////////////////////////////
+	// [HeroCraft] GetSpriteControl
+	// Returns some internal state
+	// Known return values are:
+	// * 44332211: MUST be returned at "game.script" to allow game start
+	// * 77885566: may be returned at "mainMenu.script" to force open registration window
+	// * 90123679: may be returned at "mainMenu.script" to make "Buy Game" button visible
+	// Used at "Pole Chudes" only
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "GetSpriteControl") == 0) {
+		stack->correctParams(0);
+		stack->pushInt(44332211L);
+		return STATUS_OK;
+	}
+
+	//////////////////////////////////////////////////////////////////////////
+	// [HeroCraft] RandomInitSeed
+	// Additional method to be called before RandomSeed()
+	// Used at "Pole Chudes" only
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "RandomInitSeed") == 0) {
+		stack->correctParams(1);
+		int seed = stack->pop()->getInt();
+
+		_rndHc->setSeed(seed);
+
+		stack->pushNULL();
+		return STATUS_OK;
+	}
+
+	//////////////////////////////////////////////////////////////////////////
+	// [HeroCraft] RandomSeed
+	// Similar to usual Random() function, but using seed provided earlier
+	// Used at "Pole Chudes" only
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "RandomSeed") == 0) {
+		stack->correctParams(2);
+
+		int from = stack->pop()->getInt();
+		int to   = stack->pop()->getInt();
+		int rnd  = _rndHc->getRandomNumberRng(from, to);
+
+		stack->pushInt(rnd);
+		return STATUS_OK;
+	}
+#endif
+
 	//////////////////////////////////////////////////////////////////////////
 	// EnableScriptProfiling
 	//////////////////////////////////////////////////////////////////////////
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index 026656af4f..cff3d9aeff 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -36,6 +36,7 @@
 #include "engines/wintermute/math/rect32.h"
 #include "engines/wintermute/debugger.h"
 #include "common/events.h"
+#include "common/random.h"
 #if EXTENDED_DEBUGGER_ENABLED
 #include "engines/wintermute/base/scriptables/debuggable/debuggable_script_engine.h"
 #endif
@@ -370,6 +371,12 @@ protected:
 public:
 	void autoSaveOnExit();
 
+#ifdef ENABLE_HEROCRAFT
+private:
+	// HeroCraft games specific random source with ability a in-script function to set the seed
+	Common::RandomSource *_rndHc;
+#endif
+
 };
 
 } // End of namespace Wintermute
diff --git a/engines/wintermute/base/scriptables/script_ext_string.cpp b/engines/wintermute/base/scriptables/script_ext_string.cpp
index 3b6fbf24b9..a4f05dc4e5 100644
--- a/engines/wintermute/base/scriptables/script_ext_string.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_string.cpp
@@ -262,6 +262,26 @@ bool SXString::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		return STATUS_OK;
 	}
 
+#ifdef ENABLE_HEROCRAFT
+	//////////////////////////////////////////////////////////////////////////
+	// [HeroCraft] GetCharCode
+	// Returns integer value of char at given position
+	// Used at "Pole Chudes" only
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "GetCharCode") == 0) {
+		stack->correctParams(1);
+
+		int index = stack->pop()->getInt();
+		int result = 0;
+		if (strlen(_string) > (uint32)index) {
+			result = _string[index];
+		}
+		stack->pushInt(result);
+		
+		return STATUS_OK;
+	}
+#endif
+
 	//////////////////////////////////////////////////////////////////////////
 	// Split
 	//////////////////////////////////////////////////////////////////////////


Commit: 19580bcd9417aa9becd333d289acefe959c34754
    https://github.com/scummvm/scummvm/commit/19580bcd9417aa9becd333d289acefe959c34754
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Add method required for Papa's Daughters 1

Changed paths:
    engines/wintermute/base/base_game.cpp


diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 3c6d7370af..ed4e36c408 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -2029,6 +2029,20 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		stack->pushInt(rnd);
 		return STATUS_OK;
 	}
+
+	//////////////////////////////////////////////////////////////////////////
+	// [HeroCraft] GetImageInfo
+	// Returns image size in "<width>;<height>" format, e.g. "800;600"
+	// Known params: "fsdata\\splash1.jpg"
+	// Game script turn off scaling if returned value is "1024;768"
+	// Used at "Papa's Daughters 1" only
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "GetImageInfo") == 0) {
+		stack->correctParams(1);
+		/*const char *filename =*/ stack->pop()->getString();
+		stack->pushString("1024;768");
+		return STATUS_OK;
+	}
 #endif
 
 	//////////////////////////////////////////////////////////////////////////


Commit: 392de2aec7a8f94c0bcc38c0e8a4744319a83317
    https://github.com/scummvm/scummvm/commit/392de2aec7a8f94c0bcc38c0e8a4744319a83317
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Add methods required for Papa's Daughters 2

Changed paths:
    engines/wintermute/ad/ad_scene.cpp
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/base_game.h


diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp
index ca901f6dcc..144df55a87 100644
--- a/engines/wintermute/ad/ad_scene.cpp
+++ b/engines/wintermute/ad/ad_scene.cpp
@@ -1493,7 +1493,19 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 		BaseObject *node = getNodeByName(nodeName);
 		if (node) {
 			stack->pushNative((BaseScriptable *)node, true);
-		} else {
+		}
+
+#ifdef ENABLE_HEROCRAFT
+		//////////////////////////////////////////////////////////////////////////
+		// [HeroCraft] papasEntity
+		// Used in some self-check at "Papa's Daughters 2"
+		//////////////////////////////////////////////////////////////////////////
+		else if (strcmp(nodeName,"papasEntity") == 0) {
+			stack->pushInt(777);
+		}
+#endif
+
+		else {
 			stack->pushNULL();
 		}
 
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index ed4e36c408..b28175d26f 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -2043,6 +2043,32 @@ bool BaseGame::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 		stack->pushString("1024;768");
 		return STATUS_OK;
 	}
+
+	//////////////////////////////////////////////////////////////////////////
+	// [HeroCraft] A lot of functions used for self-check
+	// Used at "Papa's Daughters 2" only
+	//////////////////////////////////////////////////////////////////////////
+	else if (strcmp(name, "DeleteItems") == 0 || strcmp(name, "CreateActorItems") == 0 || strcmp(name, "DeleteActorItems") == 0 || strcmp(name, "PrepareItems") == 0 || strcmp(name, "CreateEntityItems") == 0 || strcmp(name, "DeleteEntityItems") == 0 || strcmp(name, "PrepareItemsWin") == 0 || strcmp(name, "CreateItems") == 0) {
+		stack->correctParams(3);
+		uint32 a = (uint32)stack->pop()->getInt();
+		uint32 b = (uint32)stack->pop()->getInt();
+		uint32 c = (uint32)stack->pop()->getInt();
+
+		uint32 result = 0;
+		const char* fname = "PapasDaughters2.wrp.exe";
+		if (strcmp(name, "PrepareItems") == 0 || strcmp(name, "CreateEntityItems") == 0 || strcmp(name, "DeleteEntityItems") == 0) {
+			result = getFilePartChecksumHc(fname, b, a);
+		} else if (strcmp(name, "PrepareItemsWin") == 0) {
+			result = getFilePartChecksumHc(fname, b, c);
+		} else if (strcmp(name, "CreateItems") == 0) {
+			result = getFilePartChecksumHc(fname, a, c);
+		} else {
+			result = getFilePartChecksumHc(fname, a, b);
+		}
+
+		stack->pushInt(result);
+		return STATUS_OK;
+	}
 #endif
 
 	//////////////////////////////////////////////////////////////////////////
@@ -4318,6 +4344,40 @@ char *BaseGame::getKeyFromStringTable(const char *str) const {
 	return _settings->getKeyFromStringTable(str);
 }
 
+#ifdef ENABLE_HEROCRAFT
+uint8 BaseGame::getFilePartChecksumHc(const char *filename, size_t begin, size_t end) {
+	if (begin >= end) {
+		warning("Wrong limits for checksum check");
+		return 0;
+	}
+
+	uint32 size;
+	char *buffer = (char *)BaseFileManager::getEngineInstance()->readWholeFile(filename, &size);
+	if (buffer == nullptr) {
+		warning("Failed to open '%s' for checksum check", filename);
+		return 0;
+	}
+
+	if (size < end) {
+		warning("File '%s' is too small for checksum check", filename);
+		delete[] buffer;
+		return 0;
+	}
+
+	uint8 result = 0;
+	for (size_t i = begin; i < end; i++) {
+		uint8 tmp = buffer[i];
+		result += tmp;
+		if (result < tmp) {
+			result ++;
+		}
+	}
+
+	delete[] buffer;
+	return result;
+}
+#endif
+
 Common::String BaseGame::readRegistryString(const Common::String &key, const Common::String &initValue) const {
 	// Game specific hacks:
 	Common::String result = initValue;
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index cff3d9aeff..cff179ec42 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -375,6 +375,9 @@ public:
 private:
 	// HeroCraft games specific random source with ability a in-script function to set the seed
 	Common::RandomSource *_rndHc;
+
+	// HeroCraft games specific checksum function, used in Papa's Daughters 2 selfcheck
+	uint8 getFilePartChecksumHc(const char *filename, size_t begin, size_t end);	
 #endif
 
 };


Commit: c3782c6f8fb0637fd1249d54966f711320f7e965
    https://github.com/scummvm/scummvm/commit/c3782c6f8fb0637fd1249d54966f711320f7e965
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Fix copypaste error at RegReadString() method

Changed paths:
    engines/wintermute/base/base_game.cpp


diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index b28175d26f..9d15e840cd 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -4394,7 +4394,7 @@ Common::String BaseGame::readRegistryString(const Common::String &key, const Com
 	} else { // Just fallback to using ConfMan for now
 		Common::String privKey = "wme_" + StringUtil::encodeSetting(key);
 		if (ConfMan.hasKey(privKey)) {
-			result = StringUtil::decodeSetting(ConfMan.get(key));
+			result = StringUtil::decodeSetting(ConfMan.get(privKey));
 		}
 	}
 	return result;


Commit: 125aaff20c3d836c4c35a4a3ec14c7497d9ce123
    https://github.com/scummvm/scummvm/commit/125aaff20c3d836c4c35a4a3ec14c7497d9ce123
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Always log runtime errors

Changed paths:
    engines/wintermute/base/scriptables/script.cpp


diff --git a/engines/wintermute/base/scriptables/script.cpp b/engines/wintermute/base/scriptables/script.cpp
index dbc80bc8a2..b45d77b0a5 100644
--- a/engines/wintermute/base/scriptables/script.cpp
+++ b/engines/wintermute/base/scriptables/script.cpp
@@ -1244,11 +1244,11 @@ void ScScript::runtimeError(const char *fmt, ...) {
 	va_list va;
 
 	va_start(va, fmt);
-	vsprintf(buff, fmt, va);
+	vsnprintf(buff, 256, fmt, va);
 	va_end(va);
 
-	_gameRef->LOG(0, "Runtime error. Script '%s', line %d", _filename, _currentLine);
-	_gameRef->LOG(0, "  %s", buff);
+	warning("Runtime error. Script '%s', line %d", _filename, _currentLine);
+	warning("  %s", buff);
 
 	if (!_gameRef->_suppressScriptErrors) {
 		_gameRef->quickMessage("Script runtime error. View log for details.");


Commit: 1a29cf1e480e91e0786857ce37f7cefb605aeaa5
    https://github.com/scummvm/scummvm/commit/1a29cf1e480e91e0786857ce37f7cefb605aeaa5
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Add more stubs and todos for File & Directory

Changed paths:
    engines/wintermute/base/scriptables/script_ext_directory.cpp
    engines/wintermute/base/scriptables/script_ext_file.cpp


diff --git a/engines/wintermute/base/scriptables/script_ext_directory.cpp b/engines/wintermute/base/scriptables/script_ext_directory.cpp
index 6ea067a0fc..1d6c105e80 100644
--- a/engines/wintermute/base/scriptables/script_ext_directory.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_directory.cpp
@@ -64,12 +64,14 @@ bool SXDirectory::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSt
 	//////////////////////////////////////////////////////////////////////////
 	if (strcmp(name, "Create") == 0) {
 		stack->correctParams(1);
-		stack->pop()->getString();
+		const char *dirName = stack->pop()->getString();
 
-		if (BaseEngine::instance().getGameId() == "hamlet") {
-			// No need to actually create anything since "gamelet.save" is stored at SavefileManager
+		if (strcmp(dirName, "saves") == 0) {
+			// Known games that do this: alphapolaris, hamlet, papasdaughters1, papasdaughters2, polechudes
+			// No need to actually create anything, files will be stored at SavefileManager
 			stack->pushBool(true);
 		} else {
+			// No currently known games need this
 			warning("Directory.Create is not implemented! Returning false...");
 			stack->pushBool(false);
 		}
@@ -84,6 +86,7 @@ bool SXDirectory::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSt
 		stack->correctParams(1);
 		stack->pop()->getString();
 
+		// No currently known games need this
 		warning("Directory.Delete is not implemented! Returning false...");
 
 		stack->pushBool(false);
@@ -95,13 +98,20 @@ bool SXDirectory::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSt
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "GetFiles") == 0 || strcmp(name, "GetDirectories") == 0) {
 		stack->correctParams(2);
-		stack->pop()->getString();
+		const char *dirName = stack->pop()->getString();
 		stack->pop()->getString();
 
 		stack->pushInt(0);
 		BaseScriptable *array = makeSXArray(_gameRef, stack);
 
-		warning("Directory.%s is not implemented! Returning empty array...", name);
+		// used in secret scene of "Art of Murder 1: FBI Confidential"
+		if (strcmp(dirName, "X:\\FBI\\data\\scenes\\17-magic\\") == 0 && strcmp(name, "GetDirectories") == 0) {
+			//TODO: return list of "scenes\17-magic" subfolders from data.dcp
+			warning("Directory.%s is not implemented! Returning empty array...", name);
+		} else {
+			// No currently known games need this
+			warning("Directory.%s is not implemented! Returning empty array...", name);
+		}
 
  		stack->pushNative(array, false);
  		return STATUS_OK;
@@ -113,6 +123,7 @@ bool SXDirectory::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisSt
 	else if (strcmp(name, "GetDrives") == 0) {
 		stack->correctParams(0);
 
+		// No currently known games do this
 		warning("Directory.GetDrives is not implemented! Returning empty array...");
 
 		stack->pushInt(0);
@@ -148,8 +159,7 @@ ScValue *SXDirectory::scGetProperty(const Common::String &name) {
 	// CurrentDirectory
 	//////////////////////////////////////////////////////////////////////////
 	else if (name == "CurrentDirectory") {
-		warning("Directory.CurrentDirectory is not implemented! Returning 'saves'...");
-		_scValue->setString(""); // See also: BaseGame::scGetProperty("SaveDirectory")
+		_scValue->setString("."); // See also: BaseGame::scGetProperty("SaveDirectory")
 		return _scValue;
 	}
 
@@ -157,7 +167,6 @@ ScValue *SXDirectory::scGetProperty(const Common::String &name) {
 	// TempDirectory
 	//////////////////////////////////////////////////////////////////////////
 	else if (name == "TempDirectory") {
-		warning("Directory.TempDirectory is not implemented! Returning 'saves'...");
 		_scValue->setString("temp"); // See also: BaseGame::scGetProperty("SaveDirectory")
 		return _scValue;
 	} else {
diff --git a/engines/wintermute/base/scriptables/script_ext_file.cpp b/engines/wintermute/base/scriptables/script_ext_file.cpp
index a9e2c8ccdd..25919aad09 100644
--- a/engines/wintermute/base/scriptables/script_ext_file.cpp
+++ b/engines/wintermute/base/scriptables/script_ext_file.cpp
@@ -199,7 +199,7 @@ bool SXFile::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 	else if (strcmp(name, "Delete") == 0) {
 		stack->correctParams(0);
 		close();
-		error("SXFile-Method: \"Delete\" not supported");
+		warning("SXFile-Method: \"Delete\" not supported");
 		//stack->pushBool(BasePlatform::deleteFile(_filename) != false);
 		stack->pushBool(false);
 		return STATUS_OK;
@@ -213,9 +213,11 @@ bool SXFile::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 		/* const char *dest = */ stack->pop()->getString();
 		/* bool overwrite = */ stack->pop()->getBool(true);
 
-		close();
-		error("SXFile-Method: Copy not supported");
-		//stack->pushBool(BasePlatform::copyFile(_filename, Dest, !Overwrite) != false);
+		// Known game that need this: 
+		// * Space Madness (to copy bonus wallpapers from data.dcp to /saves/ folder)
+		// * games by Rootfix intertainment (to save temporary screenshot as savegame screenshot)
+		warning("SXFile-Method: Copy not supported");
+
 		stack->pushBool(false);
 		return STATUS_OK;
 	}


Commit: 5474b1491a06371a7e01437efdba0a6c9a9d5d09
    https://github.com/scummvm/scummvm/commit/5474b1491a06371a7e01437efdba0a6c9a9d5d09
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Fix codereview issues & add some comments

Changed paths:
    engines/wintermute/ad/ad_entity.cpp
    engines/wintermute/base/base_game.cpp
    engines/wintermute/base/base_game.h


diff --git a/engines/wintermute/ad/ad_entity.cpp b/engines/wintermute/ad/ad_entity.cpp
index d82f9ccf69..f07f9044ba 100644
--- a/engines/wintermute/ad/ad_entity.cpp
+++ b/engines/wintermute/ad/ad_entity.cpp
@@ -844,13 +844,16 @@ bool AdEntity::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 	//////////////////////////////////////////////////////////////////////////
 	// [WME Kinjal 1.4] SetBeforeEntity / SetAfterEntity
 	// Usage at HeroCraft games: ent.SetBeforeEntity("redDuskaEntity")
+	// Look for target entity (entity with given name, on the same layer as source entity)
+	// If target entity is not found, do nothing  
+	// Else shift nodes of the layer to put current entity behind/after target entity
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "SetBeforeEntity") == 0 || strcmp(name, "SetAfterEntity") == 0) {
 		stack->correctParams(1);
-		const char *layerName = stack->pop()->getString();
+		const char *nodeName = stack->pop()->getString();
 
-		if (strcmp(getName(), layerName) == 0) {
-			warning("%s(%s): source and target has the same name", name, layerName);
+		if (strcmp(getName(), nodeName) == 0) {
+			warning("%s(%s): source and target have the same name", name, nodeName);
 			stack->pushBool(false);
 			return STATUS_OK;
 		}
@@ -859,14 +862,17 @@ bool AdEntity::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 			AdLayer *layer = ((AdGame *)_gameRef)->_scene->_layers[i];
 			for (uint32 j = 0; j < layer->_nodes.size(); j++) {
 				if (layer->_nodes[j]->_type == OBJECT_ENTITY && this == layer->_nodes[j]->_entity) {
+					// found source layer and index, looking for target node
 					for (uint32 k = 0; k < layer->_nodes.size(); k++) {
-						if (layer->_nodes[k]->_type == OBJECT_ENTITY && strcmp(layer->_nodes[k]->_entity->getName(), layerName) == 0) {
+						if (layer->_nodes[k]->_type == OBJECT_ENTITY && strcmp(layer->_nodes[k]->_entity->getName(), nodeName) == 0) {
+							// update target index, depending on method name and comparison of index values
 							if (j < k && strcmp(name, "SetBeforeEntity") == 0) {
 								k--;
 							} else if (j > k && strcmp(name, "SetAfterEntity") == 0) {
 								k++;
 							}
 
+							// shift layer nodes array between source and target 
 							int32 delta = j <= k ? 1 : -1;
 							AdSceneNode *tmp = layer->_nodes[j];
 							for (int32 x = j; x != (int32)k; x += delta) {
@@ -874,6 +880,7 @@ bool AdEntity::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 							}
 							layer->_nodes[k] = tmp;
 
+							// done
 							stack->pushBool(true);
 							return STATUS_OK;
 						}
@@ -882,13 +889,14 @@ bool AdEntity::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack
 			}
 		}
 
-		warning("%s(%s): not found", name, layerName);
+		warning("%s(%s): not found", name, nodeName);
 		stack->pushBool(false);
 		return STATUS_OK;
 	}
 
 	//////////////////////////////////////////////////////////////////////////
 	// [WME Kinjal 1.4] GetLayer / GetIndex
+	// Find current entity's layer and node index
 	//////////////////////////////////////////////////////////////////////////
 	else if (strcmp(name, "GetLayer") == 0 || strcmp(name, "GetIndex") == 0) {
 		stack->correctParams(0);
diff --git a/engines/wintermute/base/base_game.cpp b/engines/wintermute/base/base_game.cpp
index 9d15e840cd..c69356fb3b 100644
--- a/engines/wintermute/base/base_game.cpp
+++ b/engines/wintermute/base/base_game.cpp
@@ -4345,7 +4345,7 @@ char *BaseGame::getKeyFromStringTable(const char *str) const {
 }
 
 #ifdef ENABLE_HEROCRAFT
-uint8 BaseGame::getFilePartChecksumHc(const char *filename, size_t begin, size_t end) {
+uint8 BaseGame::getFilePartChecksumHc(const char *filename, uint32 begin, uint32 end) {
 	if (begin >= end) {
 		warning("Wrong limits for checksum check");
 		return 0;
@@ -4365,11 +4365,11 @@ uint8 BaseGame::getFilePartChecksumHc(const char *filename, size_t begin, size_t
 	}
 
 	uint8 result = 0;
-	for (size_t i = begin; i < end; i++) {
+	for (uint32 i = begin; i < end; i++) {
 		uint8 tmp = buffer[i];
 		result += tmp;
 		if (result < tmp) {
-			result ++;
+			result++;
 		}
 	}
 
diff --git a/engines/wintermute/base/base_game.h b/engines/wintermute/base/base_game.h
index cff179ec42..7e3c230a21 100644
--- a/engines/wintermute/base/base_game.h
+++ b/engines/wintermute/base/base_game.h
@@ -377,7 +377,7 @@ private:
 	Common::RandomSource *_rndHc;
 
 	// HeroCraft games specific checksum function, used in Papa's Daughters 2 selfcheck
-	uint8 getFilePartChecksumHc(const char *filename, size_t begin, size_t end);	
+	uint8 getFilePartChecksumHc(const char *filename, uint32 begin, uint32 end);	
 #endif
 
 };


Commit: 1bc018bf57136570570e2c63830aca304a33f79c
    https://github.com/scummvm/scummvm/commit/1bc018bf57136570570e2c63830aca304a33f79c
Author: lolbot-iichan (lolbot_iichan at mail.ru)
Date: 2020-02-29T10:31:55+02:00

Commit Message:
WINTERMUTE: Support papasEntity for HeroCraft-targeted games only

Changed paths:
    engines/wintermute/ad/ad_scene.cpp


diff --git a/engines/wintermute/ad/ad_scene.cpp b/engines/wintermute/ad/ad_scene.cpp
index 144df55a87..ac84496cce 100644
--- a/engines/wintermute/ad/ad_scene.cpp
+++ b/engines/wintermute/ad/ad_scene.cpp
@@ -41,6 +41,7 @@
 #include "engines/wintermute/ad/ad_scene_state.h"
 #include "engines/wintermute/ad/ad_sentence.h"
 #include "engines/wintermute/ad/ad_waypoint_group.h"
+#include "engines/wintermute/base/base_engine.h"
 #include "engines/wintermute/base/base_dynamic_buffer.h"
 #include "engines/wintermute/base/base_file_manager.h"
 #include "engines/wintermute/base/font/base_font.h"
@@ -1500,7 +1501,7 @@ bool AdScene::scCallMethod(ScScript *script, ScStack *stack, ScStack *thisStack,
 		// [HeroCraft] papasEntity
 		// Used in some self-check at "Papa's Daughters 2"
 		//////////////////////////////////////////////////////////////////////////
-		else if (strcmp(nodeName,"papasEntity") == 0) {
+		else if (BaseEngine::instance().getTargetExecutable() == WME_HEROCRAFT && strcmp(nodeName,"papasEntity") == 0) {
 			stack->pushInt(777);
 		}
 #endif




More information about the Scummvm-git-logs mailing list