aboutsummaryrefslogtreecommitdiff
path: root/engines/sci
diff options
context:
space:
mode:
authorWalter van Niftrik2009-09-27 23:06:39 +0000
committerWalter van Niftrik2009-09-27 23:06:39 +0000
commit725377f090b538acd209c353c965fe93af450b56 (patch)
treef5e1b1e95055d2538858d8e93bab31aacc059d39 /engines/sci
parent76132409d69302b41d0bc7499fa0a97fdb2bf169 (diff)
downloadscummvm-rg350-725377f090b538acd209c353c965fe93af450b56.tar.gz
scummvm-rg350-725377f090b538acd209c353c965fe93af450b56.tar.bz2
scummvm-rg350-725377f090b538acd209c353c965fe93af450b56.zip
SCI: Fix scrolling in SCI1 list controls.
svn-id: r44429
Diffstat (limited to 'engines/sci')
-rw-r--r--engines/sci/engine/kgraphics.cpp11
-rw-r--r--engines/sci/engine/script.cpp1
-rw-r--r--engines/sci/engine/vm.h1
3 files changed, 12 insertions, 1 deletions
diff --git a/engines/sci/engine/kgraphics.cpp b/engines/sci/engine/kgraphics.cpp
index 3313c06779..e65f9eea5b 100644
--- a/engines/sci/engine/kgraphics.cpp
+++ b/engines/sci/engine/kgraphics.cpp
@@ -1625,12 +1625,21 @@ static void _k_draw_control(EngineState *s, reg_t obj, int inverse) {
case K_CONTROL_CONTROL:
case K_CONTROL_CONTROL_ALIAS: {
int entries_nr;
- int lsTop = GET_SEL32V(obj, lsTop) - text_pos.offset;
+ int lsTop;
int list_top = 0;
int selection = 0;
int entry_size = GET_SEL32V(obj, x);
int i;
+ if (s->_kernel->_selectorCache.topString != -1) {
+ // Games from early SCI1 onwards use topString
+ lsTop = GET_SEL32V(obj, topString);
+ } else {
+ // Earlier games use lsTop
+ lsTop = GET_SEL32V(obj, lsTop);
+ }
+ lsTop -= text_pos.offset;
+
debugC(2, kDebugLevelGraphics, "drawing list control %04x:%04x to %d,%d, diff %d\n", PRINT_REG(obj), x, y, SCI_MAX_SAVENAME_LENGTH);
cursor = GET_SEL32V(obj, cursor) - text_pos.offset;
diff --git a/engines/sci/engine/script.cpp b/engines/sci/engine/script.cpp
index a19da886b2..7a4883e15c 100644
--- a/engines/sci/engine/script.cpp
+++ b/engines/sci/engine/script.cpp
@@ -241,6 +241,7 @@ void Kernel::mapSelectors() {
FIND_SELECTOR(parseLang);
FIND_SELECTOR(motionCue);
FIND_SELECTOR(setCursor);
+ FIND_SELECTOR(topString);
}
void Kernel::dumpScriptObject(char *data, int seeker, int objsize) {
diff --git a/engines/sci/engine/vm.h b/engines/sci/engine/vm.h
index c701634bc9..530a293081 100644
--- a/engines/sci/engine/vm.h
+++ b/engines/sci/engine/vm.h
@@ -157,6 +157,7 @@ struct SelectorCache {
Selector elements; /**< Used by SetSynonyms() */
Selector lsTop, lsBottom, lsRight, lsLeft; /**< Used by Animate() subfunctions and scroll list controls */
+ Selector topString; /**< SCI1 scroll lists use this instead of lsTop */
Selector looper, mover, isBlocked, heading; /**< Used in DoAvoider */