aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine/kernel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/sci/engine/kernel.cpp')
-rw-r--r--engines/sci/engine/kernel.cpp43
1 files changed, 34 insertions, 9 deletions
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index dd2d0dc61a..4133f4cb3b 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -384,10 +384,15 @@ Kernel::~Kernel() {
void Kernel::detectSciFeatures() {
Resource *r = _resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0);
- if (!r) // No such resource?
- error("Kernel: Could not retrieve selector names");
+ Common::StringList staticSelectorTable;
+
+ if (!r) { // No such resource?
+ staticSelectorTable = checkStaticSelectorNames();
+ if (staticSelectorTable.empty())
+ error("Kernel: Could not retrieve selector names");
+ }
- int count = READ_LE_UINT16(r->data) + 1; // Counter is slightly off
+ int count = staticSelectorTable.empty() ? READ_LE_UINT16(r->data) + 1 : staticSelectorTable.size(); // Counter is slightly off
features = 0;
// Initialize features based on SCI version
@@ -397,10 +402,16 @@ void Kernel::detectSciFeatures() {
}
for (int i = 0; i < count; i++) {
- int offset = READ_LE_UINT16(r->data + 2 + i * 2);
- int len = READ_LE_UINT16(r->data + offset);
-
- Common::String tmp((const char *)r->data + offset + 2, len);
+ Common::String tmp;
+
+ if (staticSelectorTable.empty()) {
+ int offset = READ_LE_UINT16(r->data + 2 + i * 2);
+ int len = READ_LE_UINT16(r->data + offset);
+
+ tmp = Common::String((const char *)r->data + offset + 2, len);
+ } else {
+ tmp = staticSelectorTable[i];
+ }
if (tmp == "setTarget") // "motionInited" can also be used
features &= ~kFeatureOldScriptHeader;
@@ -459,8 +470,22 @@ void Kernel::detectSciFeatures() {
void Kernel::loadSelectorNames() {
Resource *r = _resmgr->findResource(ResourceId(kResourceTypeVocab, VOCAB_RESOURCE_SNAMES), 0);
- if (!r) // No such resource?
- error("Kernel: Could not retrieve selector names");
+ if (!r) { // No such resource?
+ // Check if we have a table for this game
+ // Some demos do not have a selector table
+ Common::StringList staticSelectorTable = checkStaticSelectorNames();
+
+ if (staticSelectorTable.empty())
+ error("Kernel: Could not retrieve selector names");
+
+ for (uint32 i = 0; i < staticSelectorTable.size(); i++) {
+ _selectorNames.push_back(staticSelectorTable[i]);
+ if (features & kFeatureOldScriptHeader)
+ _selectorNames.push_back(staticSelectorTable[i]);
+ }
+
+ return;
+ }
int count = READ_LE_UINT16(r->data) + 1; // Counter is slightly off