aboutsummaryrefslogtreecommitdiff
path: root/engines/sci/engine
diff options
context:
space:
mode:
authorFilippos Karapetis2009-07-05 11:08:53 +0000
committerFilippos Karapetis2009-07-05 11:08:53 +0000
commit5c60d94725764c278aa463b8c206abb796406da9 (patch)
tree1fa2e07998ba70cbc380e59695594ef4dc537551 /engines/sci/engine
parent6cb5106a0b1b5f2c4d31dff321a08b134af82d1f (diff)
downloadscummvm-rg350-5c60d94725764c278aa463b8c206abb796406da9.tar.gz
scummvm-rg350-5c60d94725764c278aa463b8c206abb796406da9.tar.bz2
scummvm-rg350-5c60d94725764c278aa463b8c206abb796406da9.zip
SCI1 games with absolute parameters to lofs instructions are automatically detected now. Removed the GF_SCI1_LOFSABSOLUTE game flag
svn-id: r42118
Diffstat (limited to 'engines/sci/engine')
-rw-r--r--engines/sci/engine/game.cpp2
-rw-r--r--engines/sci/engine/kernel.cpp3
-rw-r--r--engines/sci/engine/kernel.h8
-rw-r--r--engines/sci/engine/script.cpp1
-rw-r--r--engines/sci/engine/vm.cpp4
-rw-r--r--engines/sci/engine/vm.h7
6 files changed, 19 insertions, 6 deletions
diff --git a/engines/sci/engine/game.cpp b/engines/sci/engine/game.cpp
index a1e2c24955..a1e7569967 100644
--- a/engines/sci/engine/game.cpp
+++ b/engines/sci/engine/game.cpp
@@ -377,7 +377,7 @@ int script_init_engine(EngineState *s) {
s->bp_list = NULL; // No breakpoints defined
s->have_bp = 0;
- if ((s->_flags & GF_SCI1_LOFSABSOLUTE) && s->_version < SCI_VERSION_1_1)
+ if (s->_kernel->hasLofsAbsolute())
s->seg_manager->setExportWidth(1);
else
s->seg_manager->setExportWidth(0);
diff --git a/engines/sci/engine/kernel.cpp b/engines/sci/engine/kernel.cpp
index ab6fb36085..eaa1cbcbc2 100644
--- a/engines/sci/engine/kernel.cpp
+++ b/engines/sci/engine/kernel.cpp
@@ -365,6 +365,9 @@ Kernel::Kernel(ResourceManager *resmgr, bool isOldSci0) : _resmgr(resmgr) {
// SCI0 games using old graphics functions (before version 0.000.502) did not have a
// curAngle selector
_oldGfxFunctions = (_selectorMap.curAngle == -1 && _resmgr->_sciVersion == SCI_VERSION_0);
+
+ // SCI1 games which use absolute lofs have the egoMoveSpeed selector
+ _hasLofsAbsolute = (_selectorMap.egoMoveSpeed != -1 && _resmgr->_sciVersion < SCI_VERSION_1_1);
}
Kernel::~Kernel() {
diff --git a/engines/sci/engine/kernel.h b/engines/sci/engine/kernel.h
index ad7605753b..da8ef04135 100644
--- a/engines/sci/engine/kernel.h
+++ b/engines/sci/engine/kernel.h
@@ -92,6 +92,13 @@ public:
*/
bool usesOldGfxFunctions() const { return _oldGfxFunctions; }
+ /**
+ * Applies to all SCI1 versions after 1.000.200
+ * In late SCI1 versions, the argument of lofs[as] instructions
+ * is absolute rather than relative.
+ */
+ bool hasLofsAbsolute() const { return _hasLofsAbsolute; }
+
// Script dissection/dumping functions
void dissectScript(int scriptNumber, Vocabulary *vocab);
void dumpScriptObject(char *data, int seeker, int objsize);
@@ -140,6 +147,7 @@ private:
ResourceManager *_resmgr;
bool _oldGfxFunctions;
+ bool _hasLofsAbsolute;
// Kernel-related lists
/**
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index ca5379a4c0..0b89fbc093 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -205,6 +205,7 @@ void Kernel::mapSelectors() {
FIND_SELECTOR(curAngle);
FIND_SELECTOR(sightAngle);
FIND_SELECTOR(setVol);
+ FIND_SELECTOR(egoMoveSpeed);
}
void Kernel::dumpScriptObject(char *data, int seeker, int objsize) {
diff --git a/engines/sci/engine/vm.cpp b/engines/sci/engine/vm.cpp
index 92f890512a..a31af68323 100644
--- a/engines/sci/engine/vm.cpp
+++ b/engines/sci/engine/vm.cpp
@@ -1193,7 +1193,7 @@ void run_vm(EngineState *s, int restoring) {
if (s->_version >= SCI_VERSION_1_1) {
s->r_acc.offset = opparams[0] + local_script->script_size;
} else {
- if (s->_flags & GF_SCI1_LOFSABSOLUTE)
+ if (s->_kernel->hasLofsAbsolute())
s->r_acc.offset = opparams[0];
else
s->r_acc.offset = xs->addr.pc.offset + opparams[0];
@@ -1210,7 +1210,7 @@ void run_vm(EngineState *s, int restoring) {
case 0x3a: // lofss
r_temp.segment = xs->addr.pc.segment;
- if (s->_flags & GF_SCI1_LOFSABSOLUTE)
+ if (s->_kernel->hasLofsAbsolute())
r_temp.offset = opparams[0];
else
r_temp.offset = xs->addr.pc.offset + opparams[0];
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index f1e89bba45..f20838bb4a 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -203,9 +203,10 @@ struct selector_map_t {
Selector printLang; /**< Used for i18n */
Selector subtitleLang;
Selector parseLang;
- Selector curAngle; // Used to detect newer graphics functions semantics.
- Selector sightAngle; // Used to detect some SCI0/SCI01 games which need a SCI1 table
- Selector setVol; // Used to detect newer sound semantics
+ Selector curAngle; // Used to detect newer graphics functions semantics.
+ Selector sightAngle; // Used to detect some SCI0/SCI01 games which need a SCI1 table
+ Selector setVol; // Used to detect newer sound semantics
+ Selector egoMoveSpeed; // Used to detect SCI1 games which use absolute values in lofs
};
// A reference to an object's variable.