[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